[FFmpeg-devel] [PATCH] libavformat/utils: Interpolate missing timestamps in H264 and HEVC when no b-frames observed.
Andriy Gelman
andriy.gelman at gmail.com
Mon May 13 22:37:24 EEST 2019
Hello,
On Mon, 13. May 12:04, Michael Niedermayer wrote:
> On Sat, May 11, 2019 at 11:20:51PM -0400, Andriy Gelman wrote:
> > From: Andriy Gelman <andriy.gelman at gmail.com>
> >
> > Fixes Ticket #7895.
> >
> > Currently, timestamp interpolation is disabled by default in H264 and
> > HEVC. This creates playback issues when the demuxer does not output a
> > valid timestamp. This patch allows interpolation when no b-frames have
> > been observed during decoding, which fixes playback issues for some
> > missing timestamp cases.
> > ---
> > libavformat/utils.c | 11 +++++++++--
> > 1 file changed, 9 insertions(+), 2 deletions(-)
> >
> > diff --git a/libavformat/utils.c b/libavformat/utils.c
> > index a63d71b0f4..0668ae3ad1 100644
> > --- a/libavformat/utils.c
> > +++ b/libavformat/utils.c
> > @@ -1233,7 +1233,9 @@ static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
> > int64_t offset;
> > AVRational duration;
> > int onein_oneout = st->codecpar->codec_id != AV_CODEC_ID_H264 &&
> > - st->codecpar->codec_id != AV_CODEC_ID_HEVC;
> > + st->codecpar->codec_id != AV_CODEC_ID_HEVC ||
> > + (!st->internal->avctx->max_b_frames &&
>
> > + st->cur_dts != RELATIVE_TS_BASE);
>
> This needs a comment explaining what it does. Assuming it is what i think it is
> then its not completely obvious and could confuse someone working on the code
> in the future.
I added this condition so that pts/dts interpolation is skipped when the demuxer
provides no timing information. I will add the comment in the updated patch.
> >
> > if (s->flags & AVFMT_FLAG_NOFILLIN)
> > return;
> > @@ -1272,6 +1274,10 @@ static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
> > delay = st->internal->avctx->has_b_frames;
> > presentation_delayed = 0;
> >
> > + /*update max_b_frames if delay is larger */
> > + if (delay > st->internal->avctx->max_b_frames)
> > + st->internal->avctx->max_b_frames = delay;
>
> do we have a testcase for this ?
>
I can add a testcase similar to the attachment in ticket #7895, where the pts/dts is interpolated
on a HEVC stream encoded with the zerolatency option. Will this be ok?
Thanks,
Andriy
More information about the ffmpeg-devel
mailing list