[FFmpeg-devel] [RFC] Non monotonically increasing timestamps
Stefano Sabatini
stefano.sabatini-lala at poste.it
Fri Mar 25 19:45:56 CET 2011
On date Monday 2011-03-21 18:26:36 +0100, Stefano Sabatini encoded:
> Hi all,
>
> I'm dealing with files with non-monotonically increasing timestamps,
> e.g.:
> https://roundup.ffmpeg.org/issue1551
>
> precisely with these files (tipically DVB TS captures), there is are
> duplicated DTS values in consecutive video packets.
>
> Follows an example:
>
> $ ffprobe -show_packets non_monotone_timestamps20091117.ts
> ...
> [PACKET]
> codec_type=video
> stream_index=0
> ***pts=6583750012
> pts_time=73152.777911
> dts=6583739212
> dts_time=73152.657911
> duration=3600
> duration_time=0.040000
> size=75597.000000
> pos=11172903
> flags=_
> [/PACKET]
> [PACKET]
> codec_type=video
> stream_index=0
> pts=6583742812
> pts_time=73152.697911
> dts=6583742812
> dts_time=73152.697911
> duration=3600
> duration_time=0.040000
> size=3106.000000
> pos=11257127
> flags=_
> [/PACKET]
> [PACKET]
> codec_type=video
> stream_index=0
> pts=6583746412
> pts_time=73152.737911
> dts=6583746412
> dts_time=73152.737911
> duration=3600
> duration_time=0.040000
> size=3102.000000
> pos=11260699
> flags=_
> [/PACKET]
> [PACKET]
> codec_type=audio
> stream_index=1
> pts=6583716091
> pts_time=73152.401011
> dts=6583716091
> dts_time=73152.401011
> duration=0
> duration_time=0.000000
> size=5872.000000
> pos=11237199
> flags=K
> [/PACKET]
> [PACKET]
> codec_type=video
> stream_index=0
> ***pts=6583750012
> pts_time=73152.777911
> ***dts=6583750012
> dts_time=73152.777911
> duration=1800
> duration_time=0.020000
> size=4.000000
> pos=-1
> flags=_
> [/PACKET]
> [PACKET]
> codec_type=video
> stream_index=0
> pts=6583760812
> pts_time=73152.897911
> ***dts=6583750012
> dts_time=73152.777911
> duration=3600
> duration_time=0.040000
> size=58301.000000
> pos=11264083
> flags=K
> [/PACKET]
> ...
>
> The problem shows up tipically when copying with -vcodec copy, when
> transcoding I suppose DTS is recomputed and so it never results in
> duplicated DTSs.
>
> So I'm asking if someone can suggest which is a good / the best way to
> fix the DTS duplication problem.
>
> A simple solution may consists of simply dropping the packets with the
> duplicated DTS, which may result in video corruption (e.g. in the
> abovementioned case, where the packet is a key packet), or fix the
> dts somehow.
>
> A full-fledged solution may involve the implementation of a
> packet-level filtering API (which would be useful also for ffprobe,
> e.g. for selecting only particular packets,
> e.g. type=A|V|S/stream=X/PTS>X etc.).
Well, I investigated more with the issues. A possible fix may require
adding a check in ffmpeg (see attached), which issues a warning and
fixes the DTS/PTS accordingly (BUT: maybe this should be moved into
the library, and enable the check according to some flag).
But then I discover that there is a problem while reading, in certain
cases ffmpeg generates incorrect DTSes.
Precisely when we have this situation:
pkt1: PTS1=DTS1
pkt2: DTS=AV_NOPTS_VALUE
in this case FFmpeg (libavformat/utils.c:compute_pkt_fields) sets:
DTS2 = pkt.dts = st->last_IP_pts
which corresponds to PTS1=DTS1, so we have DTS2 == DTS1 and ffmpeg
fails when remuxing the file.
Note that the attached code doesn't prevent the error for remuxed
MPEG-PS streams (with -*codec copy), indeed the MPEG-PS demuxer
sometimes doesn't read the DTS written to the output, DTS is set to
AV_NOPTS_VALUE and we're back to the abovementioned situation.
A possible solution:
add an AVStream.last_IP_dts, and replace the above instruction with:
DTS2 = pkt.dts = st->last_IP_dts+1;
and/or add sanitizing code:
dts = FFMAX(st->last_IP_dts+1, dts);
Comments?
--
FFmpeg = Free Fiendish Martial Portable Ecumenical Gorilla
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0005-ffmpeg-sanitize-DTS-values-before-to-pass-them-to-av.patch
Type: text/x-diff
Size: 2013 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20110325/165fe414/attachment.bin>
More information about the ffmpeg-devel
mailing list