[FFmpeg-devel] [PATCH 13/18] h264_sei: parse the picture timing SEIs correctly
Anton Khirnov
anton at khirnov.net
Mon Mar 16 16:59:53 EET 2020
Quoting James Almer (2020-03-13 16:56:12)
> On 3/13/2020 7:28 AM, Anton Khirnov wrote:
> > Those SEIs refer to the currently active SPS. However, since the SEI
> > NALUs precede the coded picture data in the bitstream, the active SPS is
> > in general not known when we are decoding the SEI.
> >
> > Therefore, store the content of the picture timing SEIs and actually
> > parse it when the active SPS is known.
> > ---
> > libavcodec/h264_parser.c | 9 +++++
> > libavcodec/h264_sei.c | 86 ++++++++++++++++++++++++----------------
> > libavcodec/h264_sei.h | 11 +++++
> > libavcodec/h264_slice.c | 10 +++++
> > 4 files changed, 82 insertions(+), 34 deletions(-)
> >
>
> [...]
>
> > +static int decode_picture_timing(H264SEIPictureTiming *h, GetBitContext *gb,
> > + void *logctx)
> > +{
> > + PutBitContext pb;
> > + int n;
> > +
> > + if (get_bits_left(gb) > sizeof(h->payload) * 8) {
> > + av_log(logctx, AV_LOG_ERROR, "Picture timing SEI payload too large\n");
> > + return AVERROR_INVALIDDATA;
> > + }
> > +
> > + init_put_bits(&pb, h->payload, sizeof(h->payload));
> > +
> > + while (get_bits_left(gb) >= 32)
> > + put_bits(&pb, 32, get_bits_long(gb, 32));
> > +
> > + n = get_bits_left(gb);
> > + if (n)
> > + put_bits(&pb, n, get_bits_long(gb, n));
>
> I think you can do something like avpriv_copy_bits(&pb, gb->buffer,
> get_bits_left(gb)) instead.
Right, I wasn't sure if we want to depend on payload start being
byte-aligned. I suppose it has to be true in valid streams so it should
be ok.
> No need to skip the bits in gb afterwards since the GetBitContext struct
> is exclusive for this SEI starting with the previous patch.
Not sure which skip you mean here.
--
Anton Khirnov
More information about the ffmpeg-devel
mailing list