This reverts commit 4093220029a4d77f272c491e9299680480a08c00.

Signed-off-by: Derek Buitenhuis <derek.buitenh...@gmail.com>
---
I have CC'd Michael here, as he is the original author here and the "soltuion" 
is nor clear.

To explain this RFC:

We (Vimeo) have started seeing an uptick in broken MP4 files (what creates them 
is under
investigation; we have reached out to some users in hopes that we can identify 
the broken
muxer and contact its authors). They are broken in a very specific way: The 
CTTS box starts
off normal, but then at some point, the duration field of the CTTS entries 
starts to increment
on each entry, and this continues until the end of the file, resulting in 
incorrect and insane
PTS/DTS differences (like PTS/DTS differing by 15 minutes / 10,000 frames). I 
have linked both
a text dump of the boxes and a trimmed moov box as an example in [1] and [2]. I 
can only provide
a full file (~12 GiB) privately.

Thes files *happen* to decode linearly just fine, of course, because FFmpeg 
doesn't care about the
CTTS info in that case, but if you seek, everything will explode, as you would 
expect.

So, anyway, in the meanwhile, I was writing a simple detection filter for these 
sorts of files,
and I noticed it only detected some of them, and this lead me to 
1fb9efbda0149c3491529ea5fa92cfdcb8cebfaa.
What happens is that if the file is long enough, the incrementing CTTS entry 
durations eventually
trigger this, as far as I can tell, totally arbitrary check for 1<<28, and that 
results in the
entire CTTS being thrown away, and libavformat setting PTS==DTS for all 
packets, which both
makes detection impossible, and breaks seeking in a completely different way.

So the options are:
    * Revert 1fb9efbda0149c3491529ea5fa92cfdcb8cebfaa and detect them as I was 
already.
    * Change the check to something else or some other value, which would still 
be totally
      arbitrary - but maybe something like >16 frames. This would still leave 
seeking totally
      broken, of course, since it will still set PTS==DTS for all packets. This 
is still maybe
      detectable for API users by checking b_frames and has_b_frames of 
video_delay, but
      PTS==DTS? Seems kind gross, but... eh.
    * (Possibly in addition to other changes) Make the check an error, or make 
seeking return an
      error when this sort of file is detected.
    * Something I haven't listed here.

So, basically, all options suck, and I thought some people may have opinions on 
the least bad
option, here - specifically Michael, as the author of the original patch.

People: Please comment if you feel strongly about one solution or another.

[1] http://chromashift.org/ctts_sadness/broken_cut.mp4.xz
[2] http://chromashift.org/ctts_sadness/broken.boxes.txt.xz

---
 libavformat/mov.c | 7 -------
 1 file changed, 7 deletions(-)

diff --git a/libavformat/mov.c b/libavformat/mov.c
index 1c07cff6b5..256e7d376f 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -3079,13 +3079,6 @@ static int mov_read_ctts(MOVContext *c, AVIOContext *pb, 
MOVAtom atom)
         av_log(c->fc, AV_LOG_TRACE, "count=%d, duration=%d\n",
                 count, duration);
 
-        if (FFNABS(duration) < -(1<<28) && i+2<entries) {
-            av_log(c->fc, AV_LOG_WARNING, "CTTS invalid\n");
-            av_freep(&sc->ctts_data);
-            sc->ctts_count = 0;
-            return 0;
-        }
-
         if (i+2<entries)
             mov_update_dts_shift(sc, duration, c->fc);
     }
-- 
2.30.0

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to