On Fri, May 05, 2023 at 02:31:23PM +0300, Jan Ekström wrote: > From: Martin Machalek > > Adds DTS to packets which would otherwise break tbr calculation > within libavformat, as well as packet rate calculation in ffmpeg. > > An example of such input would be an MPEG-TS stream where a whole > GOP is put into a single PES packet. > > Co-authored-by: Jan Ekström > > Signed-off-by: Jan Ekström > --- > libavformat/demux.c | 5 +++++ > 1 file changed, 5 insertions(+) > > diff --git a/libavformat/demux.c b/libavformat/demux.c > index 06de71cd6e..9a4ab28679 100644 > --- a/libavformat/demux.c > +++ b/libavformat/demux.c > @@ -1098,6 +1098,11 @@ static void compute_pkt_fields(AVFormatContext *s, AVStream *st, > if (!onein_oneout) > // This should happen on the first packet > update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts, pkt); > + > + if (pkt->dts == AV_NOPTS_VALUE && !is_relative(sti->cur_dts) && > + sti->cur_dts != AV_NOPTS_VALUE && pkt->duration > 0) > + pkt->dts = sti->cur_dts + pkt->duration; > + > if (pkt->dts > sti->cur_dts) > sti->cur_dts = pkt->dts; This produces invalid timestamps example: [mpegts read_frame_internal stream=2, pts=310689000, dts=310687200, size=11356, duration=1800, flags=0 [mpegts read_frame_internal stream=2, pts=310719600, dts=310689000, size=74100, duration=1800, flags=0 [mpegts read_frame_internal stream=2, pts=310721400, dts=310690800, size=36957, duration=1800, flags=0 -[mpegts read_frame_internal stream=2, pts=310332330, dts=NOPTS, size=49072, duration=3600, flags=0 -[mpegts read_frame_internal stream=2, pts=310348800, dts=NOPTS, size=16516, duration=3600, flags=0 -[mpegts read_frame_internal stream=2, pts=310356000, dts=NOPTS, size=16876, duration=3600, flags=0 +[mpegts read_frame_internal stream=2, pts=310332330, dts=310335930, size=49072, duration=3600, flags=0 +[mpegts read_frame_internal stream=2, pts=310348800, dts=310339530, size=16516, duration=3600, flags=0 +[mpegts read_frame_internal stream=2, pts=310356000, dts=310343130, size=16876, duration=3600, flags=0 [mpegts read_frame_internal stream=2, pts=310366800, dts=310332330, size=51652, duration=3600, flags=0 [mpegts read_frame_internal stream=2, pts=310363200, dts=310348800, size=15588, duration=3600, flags=0 [mpegts read_frame_internal stream=2, pts=310370400, dts=310356000, size=21476, duration=3600, flags=0 Its not possible for a decode timestamp to be after its presentation timestamp [...] -- Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB Everything should be made as simple as possible, but not simpler. -- Albert Einstein