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
