[Ffmpeg-devel] Possible bug in reading PTS/DTS
Michel Bardiaux
mbardiaux
Mon Apr 23 11:26:34 CEST 2007
Luca Abeni wrote:
> Hi all,
>
> I found a "strange feature" in ffmpeg. Basically, in some cases video
> PTSs and DTSs read from a stream have a strange offset respect to audio
> timestamps (I noticed this problem when trying to debug a strange
> ffserver behaviour, but the problem appears in ffmpeg.c too).
>
> How to reproduce the problem:
> 1) Get ffmpeg from svn
> 2) Configure and compile; compile output_example
> 3) ./output_example test.mpg
> 4) ./ffmpeg -v 10 -dump -i test.mpg -f avi /dev/null
> (the "-f avi /dev/null" part is not relevant; the problem is in reading
> test.mpg)
> 5) look at the output:
> FFmpeg version SVN-r8792, Copyright (c) 2000-2007 Fabrice Bellard, et al.
> configuration:
> libavutil version: 49.4.0
> libavcodec version: 51.40.4
> libavformat version: 51.12.1
> built on Apr 23 2007 09:26:45, gcc: 4.1.2 20060928 (prerelease)
> (Ubuntu 4.1.1-13ubuntu5)
> Input #0, mpeg, from 'test.mpg':
> Duration: 00:00:01.8, start: 0.000000, bitrate: 1802 kb/s
> Stream #0.0[0x1e0], 1/90000: Video: mpeg1video, yuv420p, 352x288,
> 1/25, 104857 kb/s, 25.00 fps(r)
> Stream #0.1[0x1c0], 1/90000: Audio: mp2, 44100 Hz, stereo, 64 kb/s
> File '/dev/null' already exists. Overwrite ? [y/N] Output #0, avi, to
> '/dev/null':
> Stream #0.0, 1/90000: Video: mpeg4, yuv420p, 352x288, 1/25, q=2-31,
> 200 kb/s, 25.00 fps(c)
> Stream #0.1, 1/90000: Audio: mp2, 44100 Hz, stereo, 64 kb/s
> Stream mapping:
> Stream #0.0 -> #0.0
> Stream #0.1 -> #0.1
> Press [q] to stop encoding
> stream #1:
> keyframe=1
> duration=0.002
> dts=0.000 pts=0.000
> size=208
> stream #1:
> keyframe=1
> duration=0.002
> dts=0.002 pts=0.002
> size=209
> [...]
> stream #1:
> keyframe=1
> duration=0.002
> dts=0.019 pts=0.019
> size=209
> stream #0:
> keyframe=1
> duration=0.004
> dts=8589.931 pts=0.000
> size=6731
> timestamp discontinuity 95443677689, new offset= -95443677689
> stream #0:
> keyframe=0
> duration=0.004
> dts=8589.935 pts=8589.938
> size=3135
>
> See? There is a big jump between audio and video PTSs (audio and video
> are supposed to be synchronized, so the PTSs should be comparable, no?).
> The "timestamp discontinuity..." message appears every time there is a
> switch between audio and video packets.
>
> My understanding of the problem:
> I think the problem is due to the fact that only 33 bits of the ts are
> valid, while someone (ffmpeg.c or libavformat/utils.c) gets confused and
> considers 64 bits... The problem happens every time the ts cross the
> 2^33 value. output_example makes it more visible because it generates a
> first DTS equal to -3600, so the first DTS seen by ffmpeg.c is
> 8589930992 (= 2^33 - 3600). ffmpeg is wrong in thinking it is a big
> value (ffmpeg.c seems to think it is a 64bit value), because it
> represents a negative value (it really is a 33bit value). Then, things
> become even more messy... The second PTS/DTS pair should be 3600/0, but
> ffmpeg.c sees 8589938192/8589934592 (note that this is 3600/0 + 2^33).
> This happens because libavformat/utils.c:compute_pkt_fields() changes
> the timestamps from 3600/0 to those values by calling lsb2full().
>
> This bug (if it is a bug) can be easily fixed by adding a "&
> st->pts_wrap_bits" in all the places where ffmpeg.c uses pkt.pts and
> pkt.dts.
>
> My question:
> where is the bug?
> In ffmpeg.c (and ffserver.c), that should use only 33 bits of the ts (as
> suggested above), or in libavformat, that should present timestamps so
> that user programs do not have to care about st->pts_wrap_bits?
> I would tend to say the problem is in ffmpeg.c, but I'd like to have a
> confirmation...
> (If the problem really is in the user application, I can prepare and
> send a patch fixing ffmpeg.c and ffserver.c)
>
> Or maybe the problem is in my (mis)understanding of this issue?
I'm not sure the problem is in decoding. I find it rather strange that
the first frame, which is a keyframe, does not have PTS=DTS.
That said, given a file with timestamps crossing the 33-bits boundary, I
dont think the solution should be to reproduce internally the deficiency
of the container. Instead, the sequence of TS should always be
increasing, in this case 2^33 should be added to *every* PTS and DTS.
Greetings,
--
Michel Bardiaux
R&D Director
T +32 [0] 2 790 29 41
F +32 [0] 2 790 29 02
E mailto:mbardiaux at mediaxim.be
Mediaxim NV/SA
Vorstlaan 191 Boulevard du Souverain
Brussel 1160 Bruxelles
http://www.mediaxim.com/
More information about the ffmpeg-devel
mailing list