On Tue, Nov 22, 2011 at 12:22:36AM +0100, Sebastien Zwickert wrote:
> 
> On Nov 22, 2011, at 12:14 AM, Sebastien Zwickert wrote:
> 
> > Hi,
> > 
> > The patch in attachment takes benefits of fast reallocation to manage the 
> > bitstream buffer.
> 
> I missed a file in the commit :) Complete patch in attachment.
> 
> Best regards,
> Sebastien
> 

> From 02aa2d16c13a9edcf52da9b5ea3112919e885af3 Mon Sep 17 00:00:00 2001
> From: Sebastien Zwickert <[email protected]>
> Date: Tue, 22 Nov 2011 00:05:09 +0100
> Subject: [PATCH] vda: use fast reallocation.

the commit message is too short and doesn't really describe the change

> ---
>  libavcodec/vda.c      |    3 +++
>  libavcodec/vda.h      |   24 ++++++++++++++++++++++++
>  libavcodec/vda_h264.c |   36 ++++++++++--------------------------
>  3 files changed, 37 insertions(+), 26 deletions(-)
> 
> diff --git a/libavcodec/vda.c b/libavcodec/vda.c
> index 34739f8..cca0cb2 100644
> --- a/libavcodec/vda.c
> +++ b/libavcodec/vda.c
> @@ -207,6 +207,9 @@ int ff_vda_destroy_decoder(struct vda_context *vda_ctx)
>  
>      pthread_mutex_destroy(&vda_ctx->queue_mutex);
>  
> +    if (vda_ctx->bitstream)
> +        av_freep(&vda_ctx->bitstream);
> +
>      if (kVDADecoderNoErr != status)
>          return status;
>  
> diff --git a/libavcodec/vda.h b/libavcodec/vda.h
> index 2cb51c5..ef88750 100644
> --- a/libavcodec/vda.h
> +++ b/libavcodec/vda.h
> @@ -125,6 +125,30 @@ struct vda_context {
>      * - decoding: Set/Unset by user.
>      */
>      OSType              cv_pix_fmt_type;
> +
> +    /**
> +    * The current bitstream buffer.
> +    *
> +    * - encoding: unused
> +    * - decoding: Set/Unset by libavcodec.
> +    */
> +    uint8_t             *bitstream;
> +
> +    /**
> +    * The current size of the bitstream.
> +    *
> +    * - encoding: unused
> +    * - decoding: Set/Unset by libavcodec.
> +    */
> +    int                 bitstream_size;
> +
> +    /**
> +    * The reference size used for fast reallocation.
> +    *
> +    * - encoding: unused
> +    * - decoding: Set/Unset by libavcodec.
> +    */
> +    int                 ref_size;

please mark all three variables as internal/private, no need
for the encoding/decoding annotation

allocated_size is a more descriptive name than ref_size

>  };
>  
>  /** Create the video decoder. */
> diff --git a/libavcodec/vda_h264.c b/libavcodec/vda_h264.c
> index c902267..68908fb 100644
> --- a/libavcodec/vda_h264.c
> +++ b/libavcodec/vda_h264.c
> @@ -21,29 +21,18 @@
>   */
>  
>  #include "h264.h"
> -#include "h264data.h"
> -
>  #include "vda_internal.h"
>  
> -/* This structure is used to store the bitstream of the current frame. */
> -struct vda_picture_context {
> -    uint8_t *bitstream;
> -    int      bitstream_size;
> -};
> -
>  static int start_frame(AVCodecContext *avctx,
>                         av_unused const uint8_t *buffer,
>                         av_unused uint32_t size)
>  {
> -    const H264Context *h                = avctx->priv_data;
>      struct vda_context *vda_ctx         = avctx->hwaccel_context;
> -    struct vda_picture_context *pic_ctx = 
> h->s.current_picture_ptr->f.hwaccel_picture_private;
>  
>      if (!vda_ctx->decoder)
>          return -1;
>  
> -    pic_ctx->bitstream      = NULL;
> -    pic_ctx->bitstream_size = 0;
> +    vda_ctx->bitstream_size = 0;
>  
>      return 0;
>  }
> @@ -52,24 +41,22 @@ static int decode_slice(AVCodecContext *avctx,
>                          const uint8_t *buffer,
>                          uint32_t size)
>  {
> -    H264Context *h                      = avctx->priv_data;
>      struct vda_context *vda_ctx         = avctx->hwaccel_context;
> -    struct vda_picture_context *pic_ctx = 
> h->s.current_picture_ptr->f.hwaccel_picture_private;
>      void *tmp;
>  
>      if (!vda_ctx->decoder)
>          return -1;
>  
> -    tmp = av_realloc(pic_ctx->bitstream, pic_ctx->bitstream_size+size+4);
> +    tmp = av_fast_realloc(vda_ctx->bitstream, &vda_ctx->ref_size, 
> vda_ctx->bitstream_size+size+4);
>      if (!tmp)
>          return AVERROR(ENOMEM);
>  
> -    pic_ctx->bitstream = tmp;
> +    vda_ctx->bitstream = tmp;
>  
> -    AV_WB32(pic_ctx->bitstream + pic_ctx->bitstream_size, size);
> -    memcpy(pic_ctx->bitstream + pic_ctx->bitstream_size + 4, buffer, size);
> +    AV_WB32(vda_ctx->bitstream + vda_ctx->bitstream_size, size);
> +    memcpy(vda_ctx->bitstream + vda_ctx->bitstream_size + 4, buffer, size);
>  
> -    pic_ctx->bitstream_size += size + 4;
> +    vda_ctx->bitstream_size += size + 4;
>  
>      return 0;
>  }
> @@ -78,22 +65,19 @@ static int end_frame(AVCodecContext *avctx)
>  {
>      H264Context *h                      = avctx->priv_data;
>      struct vda_context *vda_ctx         = avctx->hwaccel_context;
> -    struct vda_picture_context *pic_ctx = 
> h->s.current_picture_ptr->f.hwaccel_picture_private;
>      AVFrame *frame                      = &h->s.current_picture_ptr->f;
>      int status;
>  
> -    if (!vda_ctx->decoder || !pic_ctx->bitstream)
> +    if (!vda_ctx->decoder || !vda_ctx->bitstream)
>          return -1;
>  
> -    status = ff_vda_decoder_decode(vda_ctx, pic_ctx->bitstream,
> -                                   pic_ctx->bitstream_size,
> +    status = ff_vda_decoder_decode(vda_ctx, vda_ctx->bitstream,
> +                                   vda_ctx->bitstream_size,
>                                     frame->reordered_opaque);
>  
>      if (status)
>          av_log(avctx, AV_LOG_ERROR, "Failed to decode frame (%d)\n", status);
>  
> -    av_freep(&pic_ctx->bitstream);
> -
>      return status;
>  }
>  
> @@ -106,5 +90,5 @@ AVHWAccel ff_h264_vda_hwaccel = {
>      .start_frame    = start_frame,
>      .decode_slice   = decode_slice,
>      .end_frame      = end_frame,
> -    .priv_data_size = sizeof(struct vda_picture_context),
> +    .priv_data_size = 0,

you can just ommit .priv_data_size if it's 0

Janne
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to