[FFmpeg-devel] [PATCH] avcodec/h264_ps: use the AVBufferPool API to allocate parameter set buffers

Michael Niedermayer michael at niedermayer.cc
Mon Jan 22 00:06:23 EET 2018


On Sat, Jan 20, 2018 at 11:53:25PM -0300, James Almer wrote:
> On 1/20/2018 11:33 PM, Michael Niedermayer wrote:
> > On Sat, Jan 20, 2018 at 06:49:29PM -0300, James Almer wrote:
> >> Signed-off-by: James Almer <jamrial at gmail.com>
> >> ---
> >> Similar rationale as hevc. With up to 32 sps and 256 pps, this may
> >> come in handy when parsing raw streams.
> >>
> >>  libavcodec/h264_parser.c   |  3 ++-
> >>  libavcodec/h264_ps.c       | 22 ++++++++++++++++++++--
> >>  libavcodec/h264_ps.h       |  5 +++++
> >>  libavcodec/h264dec.c       |  3 +++
> >>  libavcodec/mediacodecdec.c |  4 ++++
> >>  5 files changed, 34 insertions(+), 3 deletions(-)
> >>
> >> diff --git a/libavcodec/h264_parser.c b/libavcodec/h264_parser.c
> >> index 65d9d44b50..fa6777fc05 100644
> >> --- a/libavcodec/h264_parser.c
> >> +++ b/libavcodec/h264_parser.c
> >> @@ -697,7 +697,8 @@ static av_cold int init(AVCodecParserContext *s)
> >>      p->reference_dts = AV_NOPTS_VALUE;
> >>      p->last_frame_num = INT_MAX;
> >>      ff_h264dsp_init(&p->h264dsp, 8, 1);
> >> -    return 0;
> >> +
> >> +    return ff_h264_ps_init(&p->ps);
> >>  }
> >>  
> >>  AVCodecParser ff_h264_parser = {
> >> diff --git a/libavcodec/h264_ps.c b/libavcodec/h264_ps.c
> >> index 8d1ef831fa..50dbabdb8b 100644
> >> --- a/libavcodec/h264_ps.c
> >> +++ b/libavcodec/h264_ps.c
> >> @@ -314,6 +314,21 @@ static int decode_scaling_matrices(GetBitContext *gb, const SPS *sps,
> >>      return ret;
> >>  }
> >>  
> >> +int ff_h264_ps_init(H264ParamSets *ps)
> >> +{
> >> +    ps->sps_pool = av_buffer_pool_init(sizeof(*ps->sps), av_buffer_allocz);
> >> +    ps->pps_pool = av_buffer_pool_init(sizeof(*ps->pps), av_buffer_allocz);
> >> +
> >> +    if (!ps->sps_pool || !ps->pps_pool) {
> >> +        av_buffer_pool_uninit(&ps->sps_pool);
> >> +        av_buffer_pool_uninit(&ps->pps_pool);
> >> +
> >> +        return AVERROR(ENOMEM);
> >> +    }
> >> +
> >> +    return 0;
> >> +}
> >> +
> >>  void ff_h264_ps_uninit(H264ParamSets *ps)
> >>  {
> >>      int i;
> >> @@ -327,6 +342,9 @@ void ff_h264_ps_uninit(H264ParamSets *ps)
> >>      av_buffer_unref(&ps->sps_ref);
> >>      av_buffer_unref(&ps->pps_ref);
> >>  
> >> +    av_buffer_pool_uninit(&ps->sps_pool);
> >> +    av_buffer_pool_uninit(&ps->pps_pool);
> >> +
> >>      ps->pps = NULL;
> >>      ps->sps = NULL;
> >>  }
> >> @@ -341,7 +359,7 @@ int ff_h264_decode_seq_parameter_set(GetBitContext *gb, AVCodecContext *avctx,
> >>      SPS *sps;
> >>      int ret;
> >>  
> >> -    sps_buf = av_buffer_allocz(sizeof(*sps));
> >> +    sps_buf = av_buffer_pool_get(ps->sps_pool);
> >>      if (!sps_buf)
> >>          return AVERROR(ENOMEM);
> >>      sps = (SPS*)sps_buf->data;
> >> @@ -738,7 +756,7 @@ int ff_h264_decode_picture_parameter_set(GetBitContext *gb, AVCodecContext *avct
> >>          return AVERROR_INVALIDDATA;
> >>      }
> >>  
> >> -    pps_buf = av_buffer_allocz(sizeof(*pps));
> >> +    pps_buf = av_buffer_pool_get(ps->pps_pool);
> > 
> > this seems to remove the memset(0) unless iam missing something
> 
> Isn't it enough using av_buffer_allocz() as the alloc function when
> initializing the pool?
> If the buffers are not cleared when returned to the pool to be reused
> then I could change the alloc function to av_buffer_alloc() and call
> memset(0) here.

Iam not sure but i dont see what would clear them


> 
> > is this intended?
> 
> Not really. My intention is to still get a zeroed buffer as it always did.
> 

[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

There will always be a question for which you do not know the correct answer.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20180121/d7e1b2f2/attachment.sig>


More information about the ffmpeg-devel mailing list