[FFmpeg-devel] [RFC] Non monotonically increasing timestamps
Mike Scheutzow
mjs973 at optonline.net
Sun Mar 27 19:04:11 CEST 2011
Stefano Sabatini wrote:
> On date Monday 2011-03-21 18:26:36 +0100, Stefano Sabatini encoded:
> > 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?
Stefano,
I added some preliminary investigation to the roundup page. I'm not sure
that this particular sample is worth the effort to fix.
I have no specific comment on your patch right now.
Mike Scheutzow
More information about the ffmpeg-devel
mailing list