[FFmpeg-devel] [PATCH] mov: Remove ancient heuristic hack

Derek Buitenhuis derek.buitenhuis at gmail.com
Wed Aug 24 17:55:24 EEST 2016

This breaks files with legitimate single-entry edit lists,
and the hack, introduced in f03a081df09f9c4798a17d7e24446ed47924b11b,
has no link to any known sample in its commit message, nor
does it actually fix the problem properly, but instead has
a one-off heuristic to try and "fix" them at the expense
of breaking legitimate files.

Signed-off-by: Derek Buitenhuis <derek.buitenhuis at gmail.com>
Let's get this out of the way first: I'm not 'returning to FFmpeg'.

I do not intend to be involved in the community again, nor its
overall direction and discussions, short of a miracle occurring
at VideoLAN Dev Days.

Let's please keep this to technical repleis only. I will ignore
anything else.

I am sending this patch in a professional context, as it is
a problem I have run into at work, with legitimate files,
produced by x264 and L-SMASH.

Example file:

Having the DTS delay output on the first packet itself
is important for things like cutting files.

The behavioral change can be seen with:
    $ ffprobe -show_packets delay_problem.mp4

Lastly, I would appreciate it if any replies to this patch set
use 'Reply All', to CC me directly, because I am not currently
subscribed to this mailing list, and getting proper IDs to use
in the In-Reply-To field isn't easy now that Gmane is dead.

- Derek
 libavformat/mov.c | 8 +-------
 1 file changed, 1 insertion(+), 7 deletions(-)

diff --git a/libavformat/mov.c b/libavformat/mov.c
index 1bc3800..54c63ad 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -2802,12 +2802,8 @@ static void mov_build_index(MOVContext *mov, AVStream *st)
             sc->time_offset = start_time - empty_duration;
             current_dts = -sc->time_offset;
             if (sc->ctts_count>0 && sc->stts_count>0 &&
-                sc->ctts_data[0].duration / FFMAX(sc->stts_data[0].duration, 1) > 16) {
-                /* more than 16 frames delay, dts are likely wrong
-                   this happens with files created by iMovie */
-                sc->wrong_dts = 1;
+                sc->ctts_data[0].duration / FFMAX(sc->stts_data[0].duration, 1) > 16)
                 st->codecpar->video_delay = 1;
-            }
         if (!unsupported && st->codecpar->codec_id == AV_CODEC_ID_AAC && start_time > 0)
@@ -5352,8 +5348,6 @@ static int mov_read_packet(AVFormatContext *s, AVPacket *pkt)
             sc->ctts_sample = 0;
-        if (sc->wrong_dts)
-            pkt->dts = AV_NOPTS_VALUE;
     } else {
         int64_t next_dts = (sc->current_sample < st->nb_index_entries) ?
             st->index_entries[sc->current_sample].timestamp : st->duration;

More information about the ffmpeg-devel mailing list