On 24/03/14 03:01, Luca Barbato wrote:
> From: Anton Khirnov <[email protected]>
> 
> ---
>  libavcodec/vda.h      |  6 +++---
>  libavcodec/vda_h264.c | 50 +++++++++++++++++++++++++++++++++++---------------
>  2 files changed, 38 insertions(+), 18 deletions(-)
> 
> diff --git a/libavcodec/vda.h b/libavcodec/vda.h
> index 987b94f..1189e41 100644
> --- a/libavcodec/vda.h
> +++ b/libavcodec/vda.h
> @@ -112,17 +112,17 @@ struct vda_context {
>      OSType              cv_pix_fmt_type;
>  
>      /**
> -     * The current bitstream buffer.
> +     * unused
>       */
>      uint8_t             *priv_bitstream;
>  
>      /**
> -     * The current size of the bitstream.
> +     * unused
>       */
>      int                 priv_bitstream_size;
>  
>      /**
> -     * The reference size used for fast reallocation.
> +     * unused
>       */
>      int                 priv_allocated_size;
>  };
> diff --git a/libavcodec/vda_h264.c b/libavcodec/vda_h264.c
> index 6c1845a..72b0c78 100644
> --- a/libavcodec/vda_h264.c
> +++ b/libavcodec/vda_h264.c
> @@ -28,6 +28,17 @@
>  #include "h264.h"
>  #include "vda.h"
>  
> +typedef struct VDAContext {
> +    // The current bitstream buffer.
> +    uint8_t             *bitstream;
> +
> +    // The current size of the bitstream.
> +    int                  bitstream_size;
> +
> +    // The reference size used for fast reallocation.
> +    int                  allocated_size;
> +} VDAContext;
> +
>  /* Decoder callback that adds the VDA frame to the queue in display order. */
>  static void vda_decoder_callback(void *vda_hw_ctx,
>                                   CFDictionaryRef user_info,
> @@ -46,15 +57,15 @@ static void vda_decoder_callback(void *vda_hw_ctx,
>      vda_ctx->cv_buffer = CVPixelBufferRetain(image_buffer);
>  }
>  
> -static int vda_sync_decode(struct vda_context *vda_ctx)
> +static int vda_sync_decode(VDAContext *ctx, struct vda_context *vda_ctx)
>  {
>      OSStatus status;
>      CFDataRef coded_frame;
>      uint32_t flush_flags = 1 << 0; ///< kVDADecoderFlush_emitFrames
>  
>      coded_frame = CFDataCreate(kCFAllocatorDefault,
> -                               vda_ctx->priv_bitstream,
> -                               vda_ctx->priv_bitstream_size);
> +                               ctx->bitstream,
> +                               ctx->bitstream_size);
>  
>      status = VDADecoderDecode(vda_ctx->decoder, 0, coded_frame, NULL);
>  
> @@ -71,12 +82,13 @@ static int vda_h264_start_frame(AVCodecContext *avctx,
>                                  av_unused const uint8_t *buffer,
>                                  av_unused uint32_t size)
>  {
> +    VDAContext *vda = avctx->internal->hwaccel_priv_data;
>      struct vda_context *vda_ctx         = avctx->hwaccel_context;
>  
>      if (!vda_ctx->decoder)
>          return -1;
>  
> -    vda_ctx->priv_bitstream_size = 0;
> +    vda->bitstream_size = 0;
>  
>      return 0;
>  }
> @@ -85,24 +97,25 @@ static int vda_h264_decode_slice(AVCodecContext *avctx,
>                                   const uint8_t *buffer,
>                                   uint32_t size)
>  {
> +    VDAContext *vda                     = avctx->internal->hwaccel_priv_data;
>      struct vda_context *vda_ctx         = avctx->hwaccel_context;
>      void *tmp;
>  
>      if (!vda_ctx->decoder)
>          return -1;
>  
> -    tmp = av_fast_realloc(vda_ctx->priv_bitstream,
> -                          &vda_ctx->priv_allocated_size,
> -                          vda_ctx->priv_bitstream_size + size + 4);
> +    tmp = av_fast_realloc(vda->bitstream,
> +                          &vda->allocated_size,
> +                          vda->bitstream_size + size + 4);
>      if (!tmp)
>          return AVERROR(ENOMEM);
>  
> -    vda_ctx->priv_bitstream = tmp;
> +    vda->bitstream = tmp;
>  
> -    AV_WB32(vda_ctx->priv_bitstream + vda_ctx->priv_bitstream_size, size);
> -    memcpy(vda_ctx->priv_bitstream + vda_ctx->priv_bitstream_size + 4, 
> buffer, size);
> +    AV_WB32(vda->bitstream + vda->bitstream_size, size);
> +    memcpy(vda->bitstream + vda->bitstream_size + 4, buffer, size);
>  
> -    vda_ctx->priv_bitstream_size += size + 4;
> +    vda->bitstream_size += size + 4;
>  
>      return 0;
>  }
> @@ -110,14 +123,15 @@ static int vda_h264_decode_slice(AVCodecContext *avctx,
>  static int vda_h264_end_frame(AVCodecContext *avctx)
>  {
>      H264Context *h                      = avctx->priv_data;
> +    VDAContext *vda                     = avctx->internal->hwaccel_priv_data;
>      struct vda_context *vda_ctx         = avctx->hwaccel_context;
>      AVFrame *frame                      = &h->cur_pic_ptr->f;
>      int status;
>  
> -    if (!vda_ctx->decoder || !vda_ctx->priv_bitstream)
> +    if (!vda_ctx->decoder || !vda->bitstream)
>          return -1;
>  
> -    status = vda_sync_decode(vda_ctx);
> +    status = vda_sync_decode(vda, vda_ctx);
>      frame->data[3] = (void*)vda_ctx->cv_buffer;
>  
>      if (status)
> @@ -217,11 +231,15 @@ int ff_vda_destroy_decoder(struct vda_context *vda_ctx)
>      if (vda_ctx->decoder)
>          status = VDADecoderDestroy(vda_ctx->decoder);
>  
> -    av_freep(&vda_ctx->priv_bitstream);
> -
>      return status;
>  }
>  
> +static void vda_h264_uninit(AVCodecContext *avctx)
> +{
> +    VDAContext *vda = avctx->internal->priv_data;
> +    av_freep(&vda->bitstream);
> +}
> +
>  AVHWAccel ff_h264_vda_hwaccel = {
>      .name           = "h264_vda",
>      .type           = AVMEDIA_TYPE_VIDEO,
> @@ -230,4 +248,6 @@ AVHWAccel ff_h264_vda_hwaccel = {
>      .start_frame    = vda_h264_start_frame,
>      .decode_slice   = vda_h264_decode_slice,
>      .end_frame      = vda_h264_end_frame,
> +    .uninit         = vda_h264_uninit,
> +    .priv_data_size = sizeof(VDAContext),
>  };
> 

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

Reply via email to