[FFmpeg-devel] [PATCH 2/4] vaapi: streamline public context structure.
wm4
nfxjfg at googlemail.com
Mon Aug 17 22:06:37 CEST 2015
On Mon, 17 Aug 2015 19:17:51 +0200
Gwenole Beauchesne <gb.devel at gmail.com> wrote:
> Move libavcodec managed objects from the public struct vaapi_context
> to a new privately owned FFVAContext. This is done so that to clean up
> and streamline the public structure, but also to prepare for new codec
> support, thus requiring new internal data to be added in there.
>
> The AVCodecContext.hwaccel_context, that holds the public vaapi_context,
> shall no longer be accessed from within vaapi_*.c codec support files.
>
> Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne at intel.com>
> ---
> libavcodec/vaapi.c | 34 +++++++++++++++++++++++++---------
> libavcodec/vaapi.h | 16 ++++++++++++++++
> libavcodec/vaapi_h264.c | 10 +++++++---
> libavcodec/vaapi_internal.h | 42 ++++++++++++++++++++++++++++++++++++------
> libavcodec/vaapi_mpeg2.c | 8 ++++++--
> libavcodec/vaapi_mpeg4.c | 11 +++++++++--
> libavcodec/vaapi_vc1.c | 11 +++++++++--
> libavcodec/version.h | 3 +++
> 8 files changed, 111 insertions(+), 24 deletions(-)
>
> diff --git a/libavcodec/vaapi.c b/libavcodec/vaapi.c
> index 6ac22e6..880e3d6 100644
> --- a/libavcodec/vaapi.c
> +++ b/libavcodec/vaapi.c
> @@ -41,7 +41,23 @@ static void destroy_buffers(VADisplay display, VABufferID *buffers, unsigned int
> }
> }
>
> -int ff_vaapi_render_picture(struct vaapi_context *vactx, VASurfaceID surface)
> +int ff_vaapi_context_init(AVCodecContext *avctx)
> +{
> + FFVAContext * const vactx = ff_vaapi_get_context(avctx);
> + const struct vaapi_context * const user_vactx = avctx->hwaccel_context;
> +
> + vactx->display = user_vactx->display;
> + vactx->config_id = user_vactx->config_id;
> + vactx->context_id = user_vactx->context_id;
> + return 0;
> +}
> +
> +int ff_vaapi_context_fini(AVCodecContext *avctx)
> +{
> + return 0;
> +}
> +
> +int ff_vaapi_render_picture(FFVAContext *vactx, VASurfaceID surface)
> {
> VABufferID va_buffers[3];
> unsigned int n_va_buffers = 0;
> @@ -81,7 +97,7 @@ int ff_vaapi_render_picture(struct vaapi_context *vactx, VASurfaceID surface)
> return 0;
> }
>
> -int ff_vaapi_commit_slices(struct vaapi_context *vactx)
> +int ff_vaapi_commit_slices(FFVAContext *vactx)
> {
> VABufferID *slice_buf_ids;
> VABufferID slice_param_buf_id, slice_data_buf_id;
> @@ -121,7 +137,7 @@ int ff_vaapi_commit_slices(struct vaapi_context *vactx)
> return 0;
> }
>
> -static void *alloc_buffer(struct vaapi_context *vactx, int type, unsigned int size, uint32_t *buf_id)
> +static void *alloc_buffer(FFVAContext *vactx, int type, unsigned int size, uint32_t *buf_id)
> {
> void *data = NULL;
>
> @@ -133,22 +149,22 @@ static void *alloc_buffer(struct vaapi_context *vactx, int type, unsigned int si
> return data;
> }
>
> -void *ff_vaapi_alloc_pic_param(struct vaapi_context *vactx, unsigned int size)
> +void *ff_vaapi_alloc_pic_param(FFVAContext *vactx, unsigned int size)
> {
> return alloc_buffer(vactx, VAPictureParameterBufferType, size, &vactx->pic_param_buf_id);
> }
>
> -void *ff_vaapi_alloc_iq_matrix(struct vaapi_context *vactx, unsigned int size)
> +void *ff_vaapi_alloc_iq_matrix(FFVAContext *vactx, unsigned int size)
> {
> return alloc_buffer(vactx, VAIQMatrixBufferType, size, &vactx->iq_matrix_buf_id);
> }
>
> -uint8_t *ff_vaapi_alloc_bitplane(struct vaapi_context *vactx, uint32_t size)
> +uint8_t *ff_vaapi_alloc_bitplane(FFVAContext *vactx, uint32_t size)
> {
> return alloc_buffer(vactx, VABitPlaneBufferType, size, &vactx->bitplane_buf_id);
> }
>
> -VASliceParameterBufferBase *ff_vaapi_alloc_slice(struct vaapi_context *vactx, const uint8_t *buffer, uint32_t size)
> +VASliceParameterBufferBase *ff_vaapi_alloc_slice(FFVAContext *vactx, const uint8_t *buffer, uint32_t size)
> {
> uint8_t *slice_params;
> VASliceParameterBufferBase *slice_param;
> @@ -181,7 +197,7 @@ VASliceParameterBufferBase *ff_vaapi_alloc_slice(struct vaapi_context *vactx, co
>
> void ff_vaapi_common_end_frame(AVCodecContext *avctx)
> {
> - struct vaapi_context * const vactx = avctx->hwaccel_context;
> + FFVAContext * const vactx = ff_vaapi_get_context(avctx);
>
> ff_dlog(avctx, "ff_vaapi_common_end_frame()\n");
>
> @@ -202,7 +218,7 @@ void ff_vaapi_common_end_frame(AVCodecContext *avctx)
> CONFIG_VC1_VAAPI_HWACCEL || CONFIG_WMV3_VAAPI_HWACCEL
> int ff_vaapi_mpeg_end_frame(AVCodecContext *avctx)
> {
> - struct vaapi_context * const vactx = avctx->hwaccel_context;
> + FFVAContext * const vactx = ff_vaapi_get_context(avctx);
> MpegEncContext *s = avctx->priv_data;
> int ret;
>
> diff --git a/libavcodec/vaapi.h b/libavcodec/vaapi.h
> index 815a27e..4448a2e 100644
> --- a/libavcodec/vaapi.h
> +++ b/libavcodec/vaapi.h
> @@ -31,6 +31,8 @@
> */
>
> #include <stdint.h>
> +#include <libavutil/attributes.h>
> +#include "version.h"
>
> /**
> * @defgroup lavc_codec_hwaccel_vaapi VA API Decoding
> @@ -72,12 +74,14 @@ struct vaapi_context {
> */
> uint32_t context_id;
>
> +#if FF_API_VAAPI_CONTEXT
> /**
> * VAPictureParameterBuffer ID
> *
> * - encoding: unused
> * - decoding: Set by libavcodec
> */
> + attribute_deprecated
> uint32_t pic_param_buf_id;
>
> /**
> @@ -86,6 +90,7 @@ struct vaapi_context {
> * - encoding: unused
> * - decoding: Set by libavcodec
> */
> + attribute_deprecated
> uint32_t iq_matrix_buf_id;
>
> /**
> @@ -94,6 +99,7 @@ struct vaapi_context {
> * - encoding: unused
> * - decoding: Set by libavcodec
> */
> + attribute_deprecated
> uint32_t bitplane_buf_id;
>
> /**
> @@ -102,6 +108,7 @@ struct vaapi_context {
> * - encoding: unused
> * - decoding: Set by libavcodec
> */
> + attribute_deprecated
> uint32_t *slice_buf_ids;
>
> /**
> @@ -110,6 +117,7 @@ struct vaapi_context {
> * - encoding: unused
> * - decoding: Set by libavcodec
> */
> + attribute_deprecated
> unsigned int n_slice_buf_ids;
>
> /**
> @@ -118,6 +126,7 @@ struct vaapi_context {
> * - encoding: unused
> * - decoding: Set by libavcodec
> */
> + attribute_deprecated
> unsigned int slice_buf_ids_alloc;
>
> /**
> @@ -126,6 +135,7 @@ struct vaapi_context {
> * - encoding: unused
> * - decoding: Set by libavcodec
> */
> + attribute_deprecated
> void *slice_params;
>
> /**
> @@ -134,6 +144,7 @@ struct vaapi_context {
> * - encoding: unused
> * - decoding: Set by libavcodec
> */
> + attribute_deprecated
> unsigned int slice_param_size;
>
> /**
> @@ -142,6 +153,7 @@ struct vaapi_context {
> * - encoding: unused
> * - decoding: Set by libavcodec
> */
> + attribute_deprecated
> unsigned int slice_params_alloc;
>
> /**
> @@ -150,6 +162,7 @@ struct vaapi_context {
> * - encoding: unused
> * - decoding: Set by libavcodec
> */
> + attribute_deprecated
> unsigned int slice_count;
>
> /**
> @@ -157,6 +170,7 @@ struct vaapi_context {
> * - encoding: unused
> * - decoding: Set by libavcodec
> */
> + attribute_deprecated
> const uint8_t *slice_data;
>
> /**
> @@ -165,7 +179,9 @@ struct vaapi_context {
> * - encoding: unused
> * - decoding: Set by libavcodec
> */
> + attribute_deprecated
> uint32_t slice_data_size;
> +#endif
> };
>
> /* @} */
> diff --git a/libavcodec/vaapi_h264.c b/libavcodec/vaapi_h264.c
> index 55ee2fc..ded2cb3 100644
> --- a/libavcodec/vaapi_h264.c
> +++ b/libavcodec/vaapi_h264.c
> @@ -227,7 +227,7 @@ static int vaapi_h264_start_frame(AVCodecContext *avctx,
> av_unused uint32_t size)
> {
> H264Context * const h = avctx->priv_data;
> - struct vaapi_context * const vactx = avctx->hwaccel_context;
> + FFVAContext * const vactx = ff_vaapi_get_context(avctx);
> VAPictureParameterBufferH264 *pic_param;
> VAIQMatrixBufferH264 *iq_matrix;
>
> @@ -292,7 +292,7 @@ static int vaapi_h264_start_frame(AVCodecContext *avctx,
> /** End a hardware decoding based frame. */
> static int vaapi_h264_end_frame(AVCodecContext *avctx)
> {
> - struct vaapi_context * const vactx = avctx->hwaccel_context;
> + FFVAContext * const vactx = ff_vaapi_get_context(avctx);
> H264Context * const h = avctx->priv_data;
> H264SliceContext *sl = &h->slice_ctx[0];
> int ret;
> @@ -318,6 +318,7 @@ static int vaapi_h264_decode_slice(AVCodecContext *avctx,
> const uint8_t *buffer,
> uint32_t size)
> {
> + FFVAContext * const vactx = ff_vaapi_get_context(avctx);
> H264Context * const h = avctx->priv_data;
> H264SliceContext *sl = &h->slice_ctx[0];
> VASliceParameterBufferH264 *slice_param;
> @@ -326,7 +327,7 @@ static int vaapi_h264_decode_slice(AVCodecContext *avctx,
> buffer, size);
>
> /* Fill in VASliceParameterBufferH264. */
> - slice_param = (VASliceParameterBufferH264 *)ff_vaapi_alloc_slice(avctx->hwaccel_context, buffer, size);
> + slice_param = (VASliceParameterBufferH264 *)ff_vaapi_alloc_slice(vactx, buffer, size);
> if (!slice_param)
> return -1;
> slice_param->slice_data_bit_offset = get_bits_count(&sl->gb) + 8; /* bit buffer started beyond nal_unit_type */
> @@ -363,4 +364,7 @@ AVHWAccel ff_h264_vaapi_hwaccel = {
> .start_frame = vaapi_h264_start_frame,
> .end_frame = vaapi_h264_end_frame,
> .decode_slice = vaapi_h264_decode_slice,
> + .init = ff_vaapi_context_init,
> + .uninit = ff_vaapi_context_fini,
> + .priv_data_size = sizeof(FFVAContext),
> };
> diff --git a/libavcodec/vaapi_internal.h b/libavcodec/vaapi_internal.h
> index 918c718..29f46ab 100644
> --- a/libavcodec/vaapi_internal.h
> +++ b/libavcodec/vaapi_internal.h
> @@ -35,23 +35,53 @@
> * @{
> */
>
> +typedef struct {
> + VADisplay display; ///< Windowing system dependent handle
> + VAConfigID config_id; ///< Configuration ID
> + VAContextID context_id; ///< Context ID (video decode pipeline)
> + VABufferID pic_param_buf_id; ///< Picture parameter buffer
> + VABufferID iq_matrix_buf_id; ///< Inverse quantiser matrix buffer
> + VABufferID bitplane_buf_id; ///< Bitplane buffer (for VC-1 decoding)
> + VABufferID *slice_buf_ids; ///< Slice parameter/data buffers
> + unsigned int n_slice_buf_ids; ///< Number of effective slice buffers
> + unsigned int slice_buf_ids_alloc; ///< Number of allocated slice buffers
> + void *slice_params; ///< Pointer to slice parameter buffers
> + unsigned int slice_param_size; ///< Size of a slice parameter element
> + unsigned int slice_params_alloc; ///< Number of allocated slice parameters
> + unsigned int slice_count; ///< Number of slices currently filled in
> + const uint8_t *slice_data; ///< Pointer to slice data buffer base
> + unsigned int slice_data_size; ///< Current size of slice data
> +} FFVAContext;
> +
> +/** Extract vaapi_context from an AVCodecContext */
> +static inline FFVAContext *ff_vaapi_get_context(AVCodecContext *avctx)
> +{
> + return avctx->internal->hwaccel_priv_data;
> +}
> +
> /** Extract VASurfaceID from an AVFrame */
> static inline VASurfaceID ff_vaapi_get_surface_id(AVFrame *pic)
> {
> return (uintptr_t)pic->data[3];
> }
>
> +/** Common AVHWAccel.init() implementation */
> +int ff_vaapi_context_init(AVCodecContext *avctx);
> +
> +/** Common AVHWAccel.uninit() implementation */
> +int ff_vaapi_context_fini(AVCodecContext *avctx);
> +
> /** Common AVHWAccel.end_frame() implementation */
> void ff_vaapi_common_end_frame(AVCodecContext *avctx);
>
> /** Allocate a new picture parameter buffer */
> -void *ff_vaapi_alloc_pic_param(struct vaapi_context *vactx, unsigned int size);
> +void *ff_vaapi_alloc_pic_param(FFVAContext *vactx, unsigned int size);
>
> /** Allocate a new IQ matrix buffer */
> -void *ff_vaapi_alloc_iq_matrix(struct vaapi_context *vactx, unsigned int size);
> +void *ff_vaapi_alloc_iq_matrix(FFVAContext *vactx, unsigned int size);
>
> /** Allocate a new bit-plane buffer */
> -uint8_t *ff_vaapi_alloc_bitplane(struct vaapi_context *vactx, uint32_t size);
> +uint8_t *ff_vaapi_alloc_bitplane(FFVAContext *vactx, uint32_t size);
>
> /**
> * Allocate a new slice descriptor for the input slice.
> @@ -61,11 +91,11 @@ uint8_t *ff_vaapi_alloc_bitplane(struct vaapi_context *vactx, uint32_t size);
> * @param size the size of the slice in bytes
> * @return the newly allocated slice parameter
> */
> -VASliceParameterBufferBase *ff_vaapi_alloc_slice(struct vaapi_context *vactx, const uint8_t *buffer, uint32_t size);
> +VASliceParameterBufferBase *ff_vaapi_alloc_slice(FFVAContext *vactx, const uint8_t *buffer, uint32_t size);
>
> int ff_vaapi_mpeg_end_frame(AVCodecContext *avctx);
> -int ff_vaapi_commit_slices(struct vaapi_context *vactx);
> -int ff_vaapi_render_picture(struct vaapi_context *vactx, VASurfaceID surface);
> +int ff_vaapi_commit_slices(FFVAContext *vactx);
> +int ff_vaapi_render_picture(FFVAContext *vactx, VASurfaceID surface);
>
> /* @} */
>
> diff --git a/libavcodec/vaapi_mpeg2.c b/libavcodec/vaapi_mpeg2.c
> index 27c69cd..a3deab1 100644
> --- a/libavcodec/vaapi_mpeg2.c
> +++ b/libavcodec/vaapi_mpeg2.c
> @@ -40,7 +40,7 @@ static inline int mpeg2_get_is_frame_start(MpegEncContext *s)
> static int vaapi_mpeg2_start_frame(AVCodecContext *avctx, av_unused const uint8_t *buffer, av_unused uint32_t size)
> {
> struct MpegEncContext * const s = avctx->priv_data;
> - struct vaapi_context * const vactx = avctx->hwaccel_context;
> + FFVAContext * const vactx = ff_vaapi_get_context(avctx);
> VAPictureParameterBufferMPEG2 *pic_param;
> VAIQMatrixBufferMPEG2 *iq_matrix;
> int i;
> @@ -103,6 +103,7 @@ static int vaapi_mpeg2_start_frame(AVCodecContext *avctx, av_unused const uint8_
> static int vaapi_mpeg2_decode_slice(AVCodecContext *avctx, const uint8_t *buffer, uint32_t size)
> {
> MpegEncContext * const s = avctx->priv_data;
> + FFVAContext * const vactx = ff_vaapi_get_context(avctx);
> VASliceParameterBufferMPEG2 *slice_param;
> GetBitContext gb;
> uint32_t quantiser_scale_code, intra_slice_flag, macroblock_offset;
> @@ -123,7 +124,7 @@ static int vaapi_mpeg2_decode_slice(AVCodecContext *avctx, const uint8_t *buffer
> macroblock_offset = get_bits_count(&gb);
>
> /* Fill in VASliceParameterBufferMPEG2 */
> - slice_param = (VASliceParameterBufferMPEG2 *)ff_vaapi_alloc_slice(avctx->hwaccel_context, buffer, size);
> + slice_param = (VASliceParameterBufferMPEG2 *)ff_vaapi_alloc_slice(vactx, buffer, size);
> if (!slice_param)
> return -1;
> slice_param->macroblock_offset = macroblock_offset;
> @@ -142,4 +143,7 @@ AVHWAccel ff_mpeg2_vaapi_hwaccel = {
> .start_frame = vaapi_mpeg2_start_frame,
> .end_frame = ff_vaapi_mpeg_end_frame,
> .decode_slice = vaapi_mpeg2_decode_slice,
> + .init = ff_vaapi_context_init,
> + .uninit = ff_vaapi_context_fini,
> + .priv_data_size = sizeof(FFVAContext),
> };
> diff --git a/libavcodec/vaapi_mpeg4.c b/libavcodec/vaapi_mpeg4.c
> index 5b2e9d4..426bef2 100644
> --- a/libavcodec/vaapi_mpeg4.c
> +++ b/libavcodec/vaapi_mpeg4.c
> @@ -45,7 +45,7 @@ static int vaapi_mpeg4_start_frame(AVCodecContext *avctx, av_unused const uint8_
> {
> Mpeg4DecContext *ctx = avctx->priv_data;
> MpegEncContext * const s = &ctx->m;
> - struct vaapi_context * const vactx = avctx->hwaccel_context;
> + FFVAContext * const vactx = ff_vaapi_get_context(avctx);
> VAPictureParameterBufferMPEG4 *pic_param;
> VAIQMatrixBufferMPEG4 *iq_matrix;
> int i;
> @@ -121,12 +121,13 @@ static int vaapi_mpeg4_start_frame(AVCodecContext *avctx, av_unused const uint8_
> static int vaapi_mpeg4_decode_slice(AVCodecContext *avctx, const uint8_t *buffer, uint32_t size)
> {
> MpegEncContext * const s = avctx->priv_data;
> + FFVAContext * const vactx = ff_vaapi_get_context(avctx);
> VASliceParameterBufferMPEG4 *slice_param;
>
> ff_dlog(avctx, "vaapi_mpeg4_decode_slice(): buffer %p, size %d\n", buffer, size);
>
> /* Fill in VASliceParameterBufferMPEG4 */
> - slice_param = (VASliceParameterBufferMPEG4 *)ff_vaapi_alloc_slice(avctx->hwaccel_context, buffer, size);
> + slice_param = (VASliceParameterBufferMPEG4 *)ff_vaapi_alloc_slice(vactx, buffer, size);
> if (!slice_param)
> return -1;
> slice_param->macroblock_offset = get_bits_count(&s->gb) % 8;
> @@ -145,6 +146,9 @@ AVHWAccel ff_mpeg4_vaapi_hwaccel = {
> .start_frame = vaapi_mpeg4_start_frame,
> .end_frame = ff_vaapi_mpeg_end_frame,
> .decode_slice = vaapi_mpeg4_decode_slice,
> + .init = ff_vaapi_context_init,
> + .uninit = ff_vaapi_context_fini,
> + .priv_data_size = sizeof(FFVAContext),
> };
> #endif
>
> @@ -157,5 +161,8 @@ AVHWAccel ff_h263_vaapi_hwaccel = {
> .start_frame = vaapi_mpeg4_start_frame,
> .end_frame = ff_vaapi_mpeg_end_frame,
> .decode_slice = vaapi_mpeg4_decode_slice,
> + .init = ff_vaapi_context_init,
> + .uninit = ff_vaapi_context_fini,
> + .priv_data_size = sizeof(FFVAContext),
> };
> #endif
> diff --git a/libavcodec/vaapi_vc1.c b/libavcodec/vaapi_vc1.c
> index 63d514d..5ded5db 100644
> --- a/libavcodec/vaapi_vc1.c
> +++ b/libavcodec/vaapi_vc1.c
> @@ -148,7 +148,7 @@ static int vaapi_vc1_start_frame(AVCodecContext *avctx, av_unused const uint8_t
> {
> VC1Context * const v = avctx->priv_data;
> MpegEncContext * const s = &v->s;
> - struct vaapi_context * const vactx = avctx->hwaccel_context;
> + FFVAContext * const vactx = ff_vaapi_get_context(avctx);
> VAPictureParameterBufferVC1 *pic_param;
>
> ff_dlog(avctx, "vaapi_vc1_start_frame()\n");
> @@ -315,6 +315,7 @@ static int vaapi_vc1_decode_slice(AVCodecContext *avctx, const uint8_t *buffer,
> {
> VC1Context * const v = avctx->priv_data;
> MpegEncContext * const s = &v->s;
> + FFVAContext * const vactx = ff_vaapi_get_context(avctx);
> VASliceParameterBufferVC1 *slice_param;
>
> ff_dlog(avctx, "vaapi_vc1_decode_slice(): buffer %p, size %d\n", buffer, size);
> @@ -326,7 +327,7 @@ static int vaapi_vc1_decode_slice(AVCodecContext *avctx, const uint8_t *buffer,
> }
>
> /* Fill in VASliceParameterBufferVC1 */
> - slice_param = (VASliceParameterBufferVC1 *)ff_vaapi_alloc_slice(avctx->hwaccel_context, buffer, size);
> + slice_param = (VASliceParameterBufferVC1 *)ff_vaapi_alloc_slice(vactx, buffer, size);
> if (!slice_param)
> return -1;
> slice_param->macroblock_offset = get_bits_count(&s->gb);
> @@ -343,6 +344,9 @@ AVHWAccel ff_wmv3_vaapi_hwaccel = {
> .start_frame = vaapi_vc1_start_frame,
> .end_frame = ff_vaapi_mpeg_end_frame,
> .decode_slice = vaapi_vc1_decode_slice,
> + .init = ff_vaapi_context_init,
> + .uninit = ff_vaapi_context_fini,
> + .priv_data_size = sizeof(FFVAContext),
> };
> #endif
>
> @@ -354,4 +358,7 @@ AVHWAccel ff_vc1_vaapi_hwaccel = {
> .start_frame = vaapi_vc1_start_frame,
> .end_frame = ff_vaapi_mpeg_end_frame,
> .decode_slice = vaapi_vc1_decode_slice,
> + .init = ff_vaapi_context_init,
> + .uninit = ff_vaapi_context_fini,
> + .priv_data_size = sizeof(FFVAContext),
> };
> diff --git a/libavcodec/version.h b/libavcodec/version.h
> index 1b37a9e..37102b7 100644
> --- a/libavcodec/version.h
> +++ b/libavcodec/version.h
> @@ -178,6 +178,9 @@
> #ifndef FF_API_DV_FRAME_PROFILE
> #define FF_API_DV_FRAME_PROFILE (LIBAVCODEC_VERSION_MAJOR < 57)
> #endif
> +#ifndef FF_API_VAAPI_CONTEXT
> +#define FF_API_VAAPI_CONTEXT (LIBAVCODEC_VERSION_MAJOR < 57)
> +#endif
> #ifndef FF_API_AUDIOENC_DELAY
> #define FF_API_AUDIOENC_DELAY (LIBAVCODEC_VERSION_MAJOR < 58)
> #endif
LGTM
More information about the ffmpeg-devel
mailing list