[FFmpeg-devel] [RFC] Non monotonically increasing timestamps
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,
> 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
> 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:
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);
FFmpeg = Free Fiendish Martial Portable Ecumenical Gorilla
-------------- next part --------------
A non-text attachment was scrubbed...
Size: 2013 bytes
Desc: not available
More information about the ffmpeg-devel