On Tue, 12 Jan 2016 10:26:20 +0100
Anton Khirnov <[email protected]> wrote:
> Store them in private data instead.
> ---
> libavcodec/vaapi.c | 125
> ++++++++++++++++++++++++--------------------
> libavcodec/vaapi.h | 17 ++++++
> libavcodec/vaapi_h264.c | 14 ++---
> libavcodec/vaapi_internal.h | 76 ++++++++++++++++++++++++---
> libavcodec/vaapi_mpeg2.c | 10 ++--
> libavcodec/vaapi_mpeg4.c | 11 ++--
> libavcodec/vaapi_vc1.c | 11 ++--
> libavcodec/version.h | 3 ++
> 8 files changed, 185 insertions(+), 82 deletions(-)
>
> diff --git a/libavcodec/vaapi.c b/libavcodec/vaapi.c
> index d00be2f..befc681 100644
> --- a/libavcodec/vaapi.c
> +++ b/libavcodec/vaapi.c
> @@ -42,22 +42,24 @@ static void destroy_buffers(VADisplay display, VABufferID
> *buffers, unsigned int
> }
> }
>
> -int ff_vaapi_render_picture(struct vaapi_context *vactx, VASurfaceID surface)
> +int ff_vaapi_render_picture(AVCodecContext *avctx, struct vaapi_context
> *vactx,
> + VASurfaceID surface)
> {
> + VAAPIContext *s = avctx->internal->hwaccel_priv_data;
> VABufferID va_buffers[3];
> unsigned int n_va_buffers = 0;
>
> - vaUnmapBuffer(vactx->display, vactx->pic_param_buf_id);
> - va_buffers[n_va_buffers++] = vactx->pic_param_buf_id;
> + vaUnmapBuffer(vactx->display, s->pic_param_buf_id);
> + va_buffers[n_va_buffers++] = s->pic_param_buf_id;
>
> - if (vactx->iq_matrix_buf_id) {
> - vaUnmapBuffer(vactx->display, vactx->iq_matrix_buf_id);
> - va_buffers[n_va_buffers++] = vactx->iq_matrix_buf_id;
> + if (s->iq_matrix_buf_id) {
> + vaUnmapBuffer(vactx->display, s->iq_matrix_buf_id);
> + va_buffers[n_va_buffers++] = s->iq_matrix_buf_id;
> }
>
> - if (vactx->bitplane_buf_id) {
> - vaUnmapBuffer(vactx->display, vactx->bitplane_buf_id);
> - va_buffers[n_va_buffers++] = vactx->bitplane_buf_id;
> + if (s->bitplane_buf_id) {
> + vaUnmapBuffer(vactx->display, s->bitplane_buf_id);
> + va_buffers[n_va_buffers++] = s->bitplane_buf_id;
> }
>
> if (vaBeginPicture(vactx->display, vactx->context_id,
> @@ -69,8 +71,8 @@ int ff_vaapi_render_picture(struct vaapi_context *vactx,
> VASurfaceID surface)
> return -1;
>
> if (vaRenderPicture(vactx->display, vactx->context_id,
> - vactx->slice_buf_ids,
> - vactx->n_slice_buf_ids) != VA_STATUS_SUCCESS)
> + s->slice_buf_ids,
> + s->n_slice_buf_ids) != VA_STATUS_SUCCESS)
> return -1;
>
> if (vaEndPicture(vactx->display, vactx->context_id) != VA_STATUS_SUCCESS)
> @@ -79,43 +81,44 @@ 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(AVCodecContext *avctx, struct vaapi_context
> *vactx)
> {
> + VAAPIContext *s = avctx->internal->hwaccel_priv_data;
> VABufferID *slice_buf_ids;
> VABufferID slice_param_buf_id, slice_data_buf_id;
>
> - if (vactx->slice_count == 0)
> + if (s->slice_count == 0)
> return 0;
>
> slice_buf_ids =
> - av_fast_realloc(vactx->slice_buf_ids,
> - &vactx->slice_buf_ids_alloc,
> - (vactx->n_slice_buf_ids + 2) *
> sizeof(slice_buf_ids[0]));
> + av_fast_realloc(s->slice_buf_ids,
> + &s->slice_buf_ids_alloc,
> + (s->n_slice_buf_ids + 2) * sizeof(slice_buf_ids[0]));
> if (!slice_buf_ids)
> return -1;
> - vactx->slice_buf_ids = slice_buf_ids;
> + s->slice_buf_ids = slice_buf_ids;
>
> slice_param_buf_id = 0;
> if (vaCreateBuffer(vactx->display, vactx->context_id,
> VASliceParameterBufferType,
> - vactx->slice_param_size,
> - vactx->slice_count, vactx->slice_params,
> + s->slice_param_size,
> + s->slice_count, s->slice_params,
> &slice_param_buf_id) != VA_STATUS_SUCCESS)
> return -1;
> - vactx->slice_count = 0;
> + s->slice_count = 0;
>
> slice_data_buf_id = 0;
> if (vaCreateBuffer(vactx->display, vactx->context_id,
> VASliceDataBufferType,
> - vactx->slice_data_size,
> - 1, (void *)vactx->slice_data,
> + s->slice_data_size,
> + 1, (void *)s->slice_data,
> &slice_data_buf_id) != VA_STATUS_SUCCESS)
> return -1;
> - vactx->slice_data = NULL;
> - vactx->slice_data_size = 0;
> + s->slice_data = NULL;
> + s->slice_data_size = 0;
>
> - slice_buf_ids[vactx->n_slice_buf_ids++] = slice_param_buf_id;
> - slice_buf_ids[vactx->n_slice_buf_ids++] = slice_data_buf_id;
> + slice_buf_ids[s->n_slice_buf_ids++] = slice_param_buf_id;
> + slice_buf_ids[s->n_slice_buf_ids++] = slice_data_buf_id;
> return 0;
> }
>
> @@ -131,68 +134,74 @@ 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(AVCodecContext *avctx, struct vaapi_context
> *vactx, unsigned int size)
> {
> - return alloc_buffer(vactx, VAPictureParameterBufferType, size,
> &vactx->pic_param_buf_id);
> + VAAPIContext *s = avctx->internal->hwaccel_priv_data;
> + return alloc_buffer(vactx, VAPictureParameterBufferType, size,
> &s->pic_param_buf_id);
> }
>
> -void *ff_vaapi_alloc_iq_matrix(struct vaapi_context *vactx, unsigned int
> size)
> +void *ff_vaapi_alloc_iq_matrix(AVCodecContext *avctx, struct vaapi_context
> *vactx, unsigned int size)
> {
> - return alloc_buffer(vactx, VAIQMatrixBufferType, size,
> &vactx->iq_matrix_buf_id);
> + VAAPIContext *s = avctx->internal->hwaccel_priv_data;
> + return alloc_buffer(vactx, VAIQMatrixBufferType, size,
> &s->iq_matrix_buf_id);
> }
>
> -uint8_t *ff_vaapi_alloc_bitplane(struct vaapi_context *vactx, uint32_t size)
> +uint8_t *ff_vaapi_alloc_bitplane(AVCodecContext *avctx, struct vaapi_context
> *vactx, uint32_t size)
> {
> - return alloc_buffer(vactx, VABitPlaneBufferType, size,
> &vactx->bitplane_buf_id);
> + VAAPIContext *s = avctx->internal->hwaccel_priv_data;
> + return alloc_buffer(vactx, VABitPlaneBufferType, size,
> &s->bitplane_buf_id);
> }
>
> -VASliceParameterBufferBase *ff_vaapi_alloc_slice(struct vaapi_context
> *vactx, const uint8_t *buffer, uint32_t size)
> +VASliceParameterBufferBase *ff_vaapi_alloc_slice(AVCodecContext *avctx,
> struct vaapi_context *vactx,
> + const uint8_t *buffer,
> uint32_t size)
> {
> + VAAPIContext *s = avctx->internal->hwaccel_priv_data;
> uint8_t *slice_params;
> VASliceParameterBufferBase *slice_param;
>
> - if (!vactx->slice_data)
> - vactx->slice_data = buffer;
> - if (vactx->slice_data + vactx->slice_data_size != buffer) {
> - if (ff_vaapi_commit_slices(vactx) < 0)
> + if (!s->slice_data)
> + s->slice_data = buffer;
> + if (s->slice_data + s->slice_data_size != buffer) {
> + if (ff_vaapi_commit_slices(avctx, vactx) < 0)
> return NULL;
> - vactx->slice_data = buffer;
> + s->slice_data = buffer;
> }
>
> slice_params =
> - av_fast_realloc(vactx->slice_params,
> - &vactx->slice_params_alloc,
> - (vactx->slice_count + 1) * vactx->slice_param_size);
> + av_fast_realloc(s->slice_params,
> + &s->slice_params_alloc,
> + (s->slice_count + 1) * s->slice_param_size);
> if (!slice_params)
> return NULL;
> - vactx->slice_params = slice_params;
> + s->slice_params = slice_params;
>
> - slice_param = (VASliceParameterBufferBase *)(slice_params +
> vactx->slice_count * vactx->slice_param_size);
> + slice_param = (VASliceParameterBufferBase *)(slice_params +
> s->slice_count * s->slice_param_size);
> slice_param->slice_data_size = size;
> - slice_param->slice_data_offset = vactx->slice_data_size;
> + slice_param->slice_data_offset = s->slice_data_size;
> slice_param->slice_data_flag = VA_SLICE_DATA_FLAG_ALL;
>
> - vactx->slice_count++;
> - vactx->slice_data_size += size;
> + s->slice_count++;
> + s->slice_data_size += size;
> return slice_param;
> }
>
> void ff_vaapi_common_end_frame(AVCodecContext *avctx)
> {
> + VAAPIContext *s = avctx->internal->hwaccel_priv_data;
> struct vaapi_context * const vactx = avctx->hwaccel_context;
>
> ff_dlog(avctx, "ff_vaapi_common_end_frame()\n");
>
> - destroy_buffers(vactx->display, &vactx->pic_param_buf_id, 1);
> - destroy_buffers(vactx->display, &vactx->iq_matrix_buf_id, 1);
> - destroy_buffers(vactx->display, &vactx->bitplane_buf_id, 1);
> - destroy_buffers(vactx->display, vactx->slice_buf_ids,
> vactx->n_slice_buf_ids);
> - av_freep(&vactx->slice_buf_ids);
> - av_freep(&vactx->slice_params);
> - vactx->n_slice_buf_ids = 0;
> - vactx->slice_buf_ids_alloc = 0;
> - vactx->slice_count = 0;
> - vactx->slice_params_alloc = 0;
> + destroy_buffers(vactx->display, &s->pic_param_buf_id, 1);
> + destroy_buffers(vactx->display, &s->iq_matrix_buf_id, 1);
> + destroy_buffers(vactx->display, &s->bitplane_buf_id, 1);
> + destroy_buffers(vactx->display, s->slice_buf_ids, s->n_slice_buf_ids);
> + av_freep(&s->slice_buf_ids);
> + av_freep(&s->slice_params);
> + s->n_slice_buf_ids = 0;
> + s->slice_buf_ids_alloc = 0;
> + s->slice_count = 0;
> + s->slice_params_alloc = 0;
> }
>
> #if CONFIG_H263_VAAPI_HWACCEL || CONFIG_MPEG1_VAAPI_HWACCEL || \
> @@ -204,11 +213,11 @@ int ff_vaapi_mpeg_end_frame(AVCodecContext *avctx)
> MpegEncContext *s = avctx->priv_data;
> int ret;
>
> - ret = ff_vaapi_commit_slices(vactx);
> + ret = ff_vaapi_commit_slices(avctx, vactx);
> if (ret < 0)
> goto finish;
>
> - ret = ff_vaapi_render_picture(vactx,
> + ret = ff_vaapi_render_picture(avctx, vactx,
>
> ff_vaapi_get_surface_id(s->current_picture_ptr->f));
> if (ret < 0)
> goto finish;
> diff --git a/libavcodec/vaapi.h b/libavcodec/vaapi.h
> index 39e8825..ea206a5 100644
> --- a/libavcodec/vaapi.h
> +++ b/libavcodec/vaapi.h
> @@ -32,6 +32,9 @@
>
> #include <stdint.h>
>
> +#include "version.h"
> +#include "libavutil/attributes.h"
> +
> /**
> * @defgroup lavc_codec_hwaccel_vaapi VA API Decoding
> * @ingroup lavc_codec_hwaccel
> @@ -72,12 +75,14 @@ struct vaapi_context {
> */
> uint32_t context_id;
>
> +#if FF_API_VAAPI_PRIVATE
> /**
> * VAPictureParameterBuffer ID
> *
> * - encoding: unused
> * - decoding: Set by libavcodec
> */
> + attribute_deprecated
> uint32_t pic_param_buf_id;
>
> /**
> @@ -86,6 +91,7 @@ struct vaapi_context {
> * - encoding: unused
> * - decoding: Set by libavcodec
> */
> + attribute_deprecated
> uint32_t iq_matrix_buf_id;
>
> /**
> @@ -94,6 +100,7 @@ struct vaapi_context {
> * - encoding: unused
> * - decoding: Set by libavcodec
> */
> + attribute_deprecated
> uint32_t bitplane_buf_id;
>
> /**
> @@ -102,6 +109,7 @@ struct vaapi_context {
> * - encoding: unused
> * - decoding: Set by libavcodec
> */
> + attribute_deprecated
> uint32_t *slice_buf_ids;
>
> /**
> @@ -110,6 +118,7 @@ struct vaapi_context {
> * - encoding: unused
> * - decoding: Set by libavcodec
> */
> + attribute_deprecated
> unsigned int n_slice_buf_ids;
>
> /**
> @@ -118,6 +127,7 @@ struct vaapi_context {
> * - encoding: unused
> * - decoding: Set by libavcodec
> */
> + attribute_deprecated
> unsigned int slice_buf_ids_alloc;
>
> /**
> @@ -126,6 +136,7 @@ struct vaapi_context {
> * - encoding: unused
> * - decoding: Set by libavcodec
> */
> + attribute_deprecated
> void *slice_params;
>
> /**
> @@ -134,6 +145,7 @@ struct vaapi_context {
> * - encoding: unused
> * - decoding: Set by libavcodec
> */
> + attribute_deprecated
> unsigned int slice_param_size;
>
> /**
> @@ -142,6 +154,7 @@ struct vaapi_context {
> * - encoding: unused
> * - decoding: Set by libavcodec
> */
> + attribute_deprecated
> unsigned int slice_params_alloc;
>
> /**
> @@ -150,6 +163,7 @@ struct vaapi_context {
> * - encoding: unused
> * - decoding: Set by libavcodec
> */
> + attribute_deprecated
> unsigned int slice_count;
>
> /**
> @@ -157,6 +171,7 @@ struct vaapi_context {
> * - encoding: unused
> * - decoding: Set by libavcodec
> */
> + attribute_deprecated
> const uint8_t *slice_data;
>
> /**
> @@ -165,7 +180,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 82a49f6..ec1c677 100644
> --- a/libavcodec/vaapi_h264.c
> +++ b/libavcodec/vaapi_h264.c
> @@ -225,6 +225,7 @@ static int vaapi_h264_start_frame(AVCodecContext
> *avctx,
> av_unused const uint8_t *buffer,
> av_unused uint32_t size)
> {
> + VAAPIContext *s = avctx->internal->hwaccel_priv_data;
> H264Context * const h = avctx->priv_data;
> struct vaapi_context * const vactx = avctx->hwaccel_context;
> VAPictureParameterBufferH264 *pic_param;
> @@ -232,10 +233,10 @@ static int vaapi_h264_start_frame(AVCodecContext
> *avctx,
>
> ff_dlog(avctx, "vaapi_h264_start_frame()\n");
>
> - vactx->slice_param_size = sizeof(VASliceParameterBufferH264);
> + s->slice_param_size = sizeof(VASliceParameterBufferH264);
>
> /* Fill in VAPictureParameterBufferH264. */
> - pic_param = ff_vaapi_alloc_pic_param(vactx,
> sizeof(VAPictureParameterBufferH264));
> + pic_param = ff_vaapi_alloc_pic_param(avctx, vactx,
> sizeof(VAPictureParameterBufferH264));
> if (!pic_param)
> return -1;
> fill_vaapi_pic(&pic_param->CurrPic, h->cur_pic_ptr,
> h->picture_structure);
> @@ -279,7 +280,7 @@ static int vaapi_h264_start_frame(AVCodecContext
> *avctx,
> pic_param->frame_num =
> h->frame_num;
>
> /* Fill in VAIQMatrixBufferH264. */
> - iq_matrix = ff_vaapi_alloc_iq_matrix(vactx,
> sizeof(VAIQMatrixBufferH264));
> + iq_matrix = ff_vaapi_alloc_iq_matrix(avctx, vactx,
> sizeof(VAIQMatrixBufferH264));
> if (!iq_matrix)
> return -1;
> memcpy(iq_matrix->ScalingList4x4, h->pps.scaling_matrix4,
> sizeof(iq_matrix->ScalingList4x4));
> @@ -297,11 +298,11 @@ static int vaapi_h264_end_frame(AVCodecContext *avctx)
> int ret;
>
> ff_dlog(avctx, "vaapi_h264_end_frame()\n");
> - ret = ff_vaapi_commit_slices(vactx);
> + ret = ff_vaapi_commit_slices(avctx, vactx);
> if (ret < 0)
> goto finish;
>
> - ret = ff_vaapi_render_picture(vactx,
> ff_vaapi_get_surface_id(h->cur_pic_ptr->f));
> + ret = ff_vaapi_render_picture(avctx, vactx,
> ff_vaapi_get_surface_id(h->cur_pic_ptr->f));
> if (ret < 0)
> goto finish;
>
> @@ -325,7 +326,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(avctx,
> avctx->hwaccel_context, 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 */
> @@ -362,4 +363,5 @@ AVHWAccel ff_h264_vaapi_hwaccel = {
> .start_frame = vaapi_h264_start_frame,
> .end_frame = vaapi_h264_end_frame,
> .decode_slice = vaapi_h264_decode_slice,
> + .priv_data_size = sizeof(VAAPIContext),
> };
> diff --git a/libavcodec/vaapi_internal.h b/libavcodec/vaapi_internal.h
> index 5e2a6ca..953b1c2 100644
> --- a/libavcodec/vaapi_internal.h
> +++ b/libavcodec/vaapi_internal.h
> @@ -34,6 +34,68 @@
> * @{
> */
>
> +typedef struct VAAPIContext {
> + /**
> + * VAPictureParameterBuffer ID
> + */
> + uint32_t pic_param_buf_id;
> +
> + /**
> + * VAIQMatrixBuffer ID
> + */
> + uint32_t iq_matrix_buf_id;
> +
> + /**
> + * VABitPlaneBuffer ID (for VC-1 decoding)
> + */
> + uint32_t bitplane_buf_id;
> +
> + /**
> + * Slice parameter/data buffer IDs
> + */
> + uint32_t *slice_buf_ids;
> +
> + /**
> + * Number of effective slice buffer IDs to send to the HW
> + */
> + unsigned int n_slice_buf_ids;
> +
> + /**
> + * Size of pre-allocated slice_buf_ids
> + */
> + unsigned int slice_buf_ids_alloc;
> +
> + /**
> + * Pointer to VASliceParameterBuffers
> + */
> + void *slice_params;
> +
> + /**
> + * Size of a VASliceParameterBuffer element
> + */
> + unsigned int slice_param_size;
> +
> + /**
> + * Size of pre-allocated slice_params
> + */
> + unsigned int slice_params_alloc;
> +
> + /**
> + * Number of slices currently filled in
> + */
> + unsigned int slice_count;
> +
> + /**
> + * Pointer to slice data buffer base
> + */
> + const uint8_t *slice_data;
> +
> + /**
> + * Current size of slice data
> + */
> + uint32_t slice_data_size;
> +} VAAPIContext;
> +
> /** Extract VASurfaceID from an AVFrame */
> static inline VASurfaceID ff_vaapi_get_surface_id(AVFrame *pic)
> {
> @@ -44,13 +106,14 @@ static inline VASurfaceID
> ff_vaapi_get_surface_id(AVFrame *pic)
> 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(AVCodecContext *avctx, struct vaapi_context
> *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(AVCodecContext *avctx, struct vaapi_context
> *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(AVCodecContext *avctx, struct vaapi_context
> *vactx, uint32_t size);
>
> /**
> * Allocate a new slice descriptor for the input slice.
> @@ -60,11 +123,12 @@ 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(AVCodecContext *avctx,
> struct vaapi_context *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(AVCodecContext *avctx, struct vaapi_context
> *vactx);
> +int ff_vaapi_render_picture(AVCodecContext *avctx, struct vaapi_context
> *vactx, VASurfaceID surface);
>
> /* @} */
>
> diff --git a/libavcodec/vaapi_mpeg2.c b/libavcodec/vaapi_mpeg2.c
> index 7d0e205..b5da9ba 100644
> --- a/libavcodec/vaapi_mpeg2.c
> +++ b/libavcodec/vaapi_mpeg2.c
> @@ -40,6 +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)
> {
> + VAAPIContext *ctx = avctx->internal->hwaccel_priv_data;
> struct MpegEncContext * const s = avctx->priv_data;
> struct vaapi_context * const vactx = avctx->hwaccel_context;
> VAPictureParameterBufferMPEG2 *pic_param;
> @@ -48,10 +49,10 @@ static int vaapi_mpeg2_start_frame(AVCodecContext *avctx,
> av_unused const uint8_
>
> ff_dlog(avctx, "vaapi_mpeg2_start_frame()\n");
>
> - vactx->slice_param_size = sizeof(VASliceParameterBufferMPEG2);
> + ctx->slice_param_size = sizeof(VASliceParameterBufferMPEG2);
>
> /* Fill in VAPictureParameterBufferMPEG2 */
> - pic_param = ff_vaapi_alloc_pic_param(vactx,
> sizeof(VAPictureParameterBufferMPEG2));
> + pic_param = ff_vaapi_alloc_pic_param(avctx, vactx,
> sizeof(VAPictureParameterBufferMPEG2));
> if (!pic_param)
> return -1;
> pic_param->horizontal_size = s->width;
> @@ -83,7 +84,7 @@ static int vaapi_mpeg2_start_frame(AVCodecContext *avctx,
> av_unused const uint8_
> }
>
> /* Fill in VAIQMatrixBufferMPEG2 */
> - iq_matrix = ff_vaapi_alloc_iq_matrix(vactx,
> sizeof(VAIQMatrixBufferMPEG2));
> + iq_matrix = ff_vaapi_alloc_iq_matrix(avctx, vactx,
> sizeof(VAIQMatrixBufferMPEG2));
> if (!iq_matrix)
> return -1;
> iq_matrix->load_intra_quantiser_matrix = 1;
> @@ -124,7 +125,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(avctx,
> avctx->hwaccel_context, buffer, size);
> if (!slice_param)
> return -1;
> slice_param->macroblock_offset = macroblock_offset;
> @@ -143,4 +144,5 @@ AVHWAccel ff_mpeg2_vaapi_hwaccel = {
> .start_frame = vaapi_mpeg2_start_frame,
> .end_frame = ff_vaapi_mpeg_end_frame,
> .decode_slice = vaapi_mpeg2_decode_slice,
> + .priv_data_size = sizeof(VAAPIContext),
> };
> diff --git a/libavcodec/vaapi_mpeg4.c b/libavcodec/vaapi_mpeg4.c
> index 1b9053c..b0e86c9 100644
> --- a/libavcodec/vaapi_mpeg4.c
> +++ b/libavcodec/vaapi_mpeg4.c
> @@ -44,6 +44,7 @@ static int mpeg4_get_intra_dc_vlc_thr(Mpeg4DecContext *s)
>
> static int vaapi_mpeg4_start_frame(AVCodecContext *avctx, av_unused const
> uint8_t *buffer, av_unused uint32_t size)
> {
> + VAAPIContext *va = avctx->internal->hwaccel_priv_data;
> Mpeg4DecContext *ctx = avctx->priv_data;
> MpegEncContext * const s = &ctx->m;
> struct vaapi_context * const vactx = avctx->hwaccel_context;
> @@ -53,10 +54,10 @@ static int vaapi_mpeg4_start_frame(AVCodecContext *avctx,
> av_unused const uint8_
>
> ff_dlog(avctx, "vaapi_mpeg4_start_frame()\n");
>
> - vactx->slice_param_size = sizeof(VASliceParameterBufferMPEG4);
> + va->slice_param_size = sizeof(VASliceParameterBufferMPEG4);
>
> /* Fill in VAPictureParameterBufferMPEG4 */
> - pic_param = ff_vaapi_alloc_pic_param(vactx,
> sizeof(VAPictureParameterBufferMPEG4));
> + pic_param = ff_vaapi_alloc_pic_param(avctx, vactx,
> sizeof(VAPictureParameterBufferMPEG4));
> if (!pic_param)
> return -1;
> pic_param->vop_width = s->width;
> @@ -104,7 +105,7 @@ static int vaapi_mpeg4_start_frame(AVCodecContext *avctx,
> av_unused const uint8_
> /* Fill in VAIQMatrixBufferMPEG4 */
> /* Only the first inverse quantisation method uses the weighting
> matrices */
> if (pic_param->vol_fields.bits.quant_type) {
> - iq_matrix = ff_vaapi_alloc_iq_matrix(vactx,
> sizeof(VAIQMatrixBufferMPEG4));
> + iq_matrix = ff_vaapi_alloc_iq_matrix(avctx, vactx,
> sizeof(VAIQMatrixBufferMPEG4));
> if (!iq_matrix)
> return -1;
> iq_matrix->load_intra_quant_mat = 1;
> @@ -135,7 +136,7 @@ static int vaapi_mpeg4_decode_slice(AVCodecContext
> *avctx, const uint8_t *buffer
> size = s->gb.buffer_end - buffer;
>
> /* Fill in VASliceParameterBufferMPEG4 */
> - slice_param = (VASliceParameterBufferMPEG4
> *)ff_vaapi_alloc_slice(avctx->hwaccel_context, buffer, size);
> + slice_param = (VASliceParameterBufferMPEG4 *)ff_vaapi_alloc_slice(avctx,
> avctx->hwaccel_context, buffer, size);
> if (!slice_param)
> return -1;
> slice_param->macroblock_offset = get_bits_count(&s->gb) % 8;
> @@ -157,6 +158,7 @@ AVHWAccel ff_mpeg4_vaapi_hwaccel = {
> .start_frame = vaapi_mpeg4_start_frame,
> .end_frame = ff_vaapi_mpeg_end_frame,
> .decode_slice = vaapi_mpeg4_decode_slice,
> + .priv_data_size = sizeof(VAAPIContext),
> };
> #endif
>
> @@ -169,5 +171,6 @@ AVHWAccel ff_h263_vaapi_hwaccel = {
> .start_frame = vaapi_mpeg4_start_frame,
> .end_frame = ff_vaapi_mpeg_end_frame,
> .decode_slice = vaapi_mpeg4_decode_slice,
> + .priv_data_size = sizeof(VAAPIContext),
> };
> #endif
> diff --git a/libavcodec/vaapi_vc1.c b/libavcodec/vaapi_vc1.c
> index fe01c52..bca928b 100644
> --- a/libavcodec/vaapi_vc1.c
> +++ b/libavcodec/vaapi_vc1.c
> @@ -146,6 +146,7 @@ static inline void vc1_pack_bitplanes(uint8_t *bitplane,
> int n, const uint8_t *f
>
> static int vaapi_vc1_start_frame(AVCodecContext *avctx, av_unused const
> uint8_t *buffer, av_unused uint32_t size)
> {
> + VAAPIContext *ctx = avctx->internal->hwaccel_priv_data;
> VC1Context * const v = avctx->priv_data;
> MpegEncContext * const s = &v->s;
> struct vaapi_context * const vactx = avctx->hwaccel_context;
> @@ -153,10 +154,10 @@ static int vaapi_vc1_start_frame(AVCodecContext *avctx,
> av_unused const uint8_t
>
> ff_dlog(avctx, "vaapi_vc1_start_frame()\n");
>
> - vactx->slice_param_size = sizeof(VASliceParameterBufferVC1);
> + ctx->slice_param_size = sizeof(VASliceParameterBufferVC1);
>
> /* Fill in VAPictureParameterBufferVC1 */
> - pic_param = ff_vaapi_alloc_pic_param(vactx,
> sizeof(VAPictureParameterBufferVC1));
> + pic_param = ff_vaapi_alloc_pic_param(avctx, vactx,
> sizeof(VAPictureParameterBufferVC1));
> if (!pic_param)
> return -1;
> pic_param->forward_reference_picture =
> VA_INVALID_ID;
> @@ -297,7 +298,7 @@ static int vaapi_vc1_start_frame(AVCodecContext *avctx,
> av_unused const uint8_t
> break;
> }
>
> - bitplane = ff_vaapi_alloc_bitplane(vactx, (s->mb_width *
> s->mb_height + 1) / 2);
> + bitplane = ff_vaapi_alloc_bitplane(avctx, vactx, (s->mb_width *
> s->mb_height + 1) / 2);
> if (!bitplane)
> return -1;
>
> @@ -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(avctx,
> avctx->hwaccel_context, buffer, size);
> if (!slice_param)
> return -1;
> slice_param->macroblock_offset = get_bits_count(&s->gb);
> @@ -343,6 +344,7 @@ AVHWAccel ff_wmv3_vaapi_hwaccel = {
> .start_frame = vaapi_vc1_start_frame,
> .end_frame = ff_vaapi_mpeg_end_frame,
> .decode_slice = vaapi_vc1_decode_slice,
> + .priv_data_size = sizeof(VAAPIContext),
> };
> #endif
>
> @@ -354,4 +356,5 @@ AVHWAccel ff_vc1_vaapi_hwaccel = {
> .start_frame = vaapi_vc1_start_frame,
> .end_frame = ff_vaapi_mpeg_end_frame,
> .decode_slice = vaapi_vc1_decode_slice,
> + .priv_data_size = sizeof(VAAPIContext),
> };
> diff --git a/libavcodec/version.h b/libavcodec/version.h
> index 303c112..4b092f7 100644
> --- a/libavcodec/version.h
> +++ b/libavcodec/version.h
> @@ -192,5 +192,8 @@
> #ifndef FF_API_NVENC_OLD_NAME
> #define FF_API_NVENC_OLD_NAME (LIBAVCODEC_VERSION_MAJOR < 59)
> #endif
> +#ifndef FF_API_VAAPI_PRIVATE
> +#define FF_API_VAAPI_PRIVATE (LIBAVCODEC_VERSION_MAJOR < 59)
> +#endif
>
> #endif /* AVCODEC_VERSION_H */
Seems ok. I suppose nobody actually accesses these fields.
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel