Message ID | 20230505113123.28404-1-jeebjp@gmail.com |
---|---|
State | New |
Headers | show |
Series | [FFmpeg-devel] avformat/demux: in case of no timestamps, calculate dts based on previous dts and duration | expand |
Context | Check | Description |
---|---|---|
yinshiyou/make_loongarch64 | success | Make finished |
yinshiyou/make_fate_loongarch64 | success | Make fate finished |
andriy/make_x86 | success | Make finished |
andriy/make_fate_x86 | success | Make fate finished |
> On May 5, 2023, at 19:31, Jan Ekström <jeebjp@gmail.com> wrote: > > From: Martin Machalek <martin.machalek@24i.com> > > 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 <jan.ekstrom@24i.com> > > Signed-off-by: Jan Ekström <jan.ekstrom@24i.com> > --- > 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; > + It’s possible that the next dts < pkt->dts, how to prevent non-monotonic increasing? > if (pkt->dts > sti->cur_dts) > sti->cur_dts = pkt->dts; > > -- > 2.40.1 > > _______________________________________________ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel > > To unsubscribe, visit link above, or email > ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
Quoting Jan Ekström (2023-05-05 13:31:23) > From: Martin Machalek <martin.machalek@24i.com> > > 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 <jan.ekstrom@24i.com> > > Signed-off-by: Jan Ekström <jan.ekstrom@24i.com> > --- > 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; This function really does not need more arbitrary guesses.
On Fri, May 05, 2023 at 02:31:23PM +0300, Jan Ekström wrote: > From: Martin Machalek <martin.machalek@24i.com> > > 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 <jan.ekstrom@24i.com> > > Signed-off-by: Jan Ekström <jan.ekstrom@24i.com> > --- > 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 [...]
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;