diff options
author | Gwenole Beauchesne <gwenole.beauchesne@intel.com> | 2015-07-28 12:16:12 +0300 |
---|---|---|
committer | Gwenole Beauchesne <gwenole.beauchesne@intel.com> | 2015-08-19 15:03:24 +0300 |
commit | babd340f584988446ef578e7dbc7064b19804f81 (patch) | |
tree | dd45b394217e4e6e741035447a86c71125dc4112 | |
parent | 9f8e57efe4400ca86352277873792792279c3b15 (diff) |
vaapi: streamline public context structure.
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@intel.com>
-rw-r--r-- | doc/APIchanges | 4 | ||||
-rw-r--r-- | libavcodec/vaapi.c | 40 | ||||
-rw-r--r-- | libavcodec/vaapi.h | 16 | ||||
-rw-r--r-- | libavcodec/vaapi_h264.c | 10 | ||||
-rw-r--r-- | libavcodec/vaapi_internal.h | 42 | ||||
-rw-r--r-- | libavcodec/vaapi_mpeg2.c | 8 | ||||
-rw-r--r-- | libavcodec/vaapi_mpeg4.c | 11 | ||||
-rw-r--r-- | libavcodec/vaapi_vc1.c | 11 | ||||
-rw-r--r-- | libavcodec/version.h | 7 |
9 files changed, 123 insertions, 26 deletions
diff --git a/doc/APIchanges b/doc/APIchanges index 1b6891108d..aa92b69f79 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -15,6 +15,10 @@ libavutil: 2014-08-09 API changes, most recent first: +2015-xx-xx - lavc 56.58.100 - vaapi.h + Deprecate old VA-API context (vaapi_context) fields that were only + set and used by libavcodec. They are all managed internally now. + 2015-xx-xx - lavu 54.31.100 - pixfmt.h Add a unique pixel format for VA-API (AV_PIX_FMT_VAAPI) that indicates the nature of the underlying storage: a VA surface. This diff --git a/libavcodec/vaapi.c b/libavcodec/vaapi.c index 6ac22e64fa..5dc43e1d14 100644 --- a/libavcodec/vaapi.c +++ b/libavcodec/vaapi.c @@ -21,6 +21,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include "libavutil/log.h" #include "h264.h" #include "vaapi_internal.h" @@ -41,7 +42,28 @@ 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; + + if (!user_vactx) { + av_log(avctx, AV_LOG_ERROR, "Hardware acceleration context (hwaccel_context) does not exist.\n"); + return AVERROR(ENOSYS); + } + + 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 +103,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 +143,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 +155,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 +203,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 +224,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 815a27e226..4448a2ec2f 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 55ee2fc233..ded2cb3d49 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 918c718d14..29f46ab430 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 27c69cde14..a3deab124b 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 5b2e9d4446..426bef2646 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 63d514d54e..5ded5dba89 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 2e7cf40961..a118d5b223 100644 --- a/libavcodec/version.h +++ b/libavcodec/version.h @@ -29,8 +29,8 @@ #include "libavutil/version.h" #define LIBAVCODEC_VERSION_MAJOR 56 -#define LIBAVCODEC_VERSION_MINOR 57 -#define LIBAVCODEC_VERSION_MICRO 101 +#define LIBAVCODEC_VERSION_MINOR 58 +#define LIBAVCODEC_VERSION_MICRO 100 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ LIBAVCODEC_VERSION_MINOR, \ @@ -181,6 +181,9 @@ #ifndef FF_API_AUDIOENC_DELAY #define FF_API_AUDIOENC_DELAY (LIBAVCODEC_VERSION_MAJOR < 58) #endif +#ifndef FF_API_VAAPI_CONTEXT +#define FF_API_VAAPI_CONTEXT (LIBAVCODEC_VERSION_MAJOR < 58) +#endif #ifndef FF_API_AVCTX_TIMEBASE #define FF_API_AVCTX_TIMEBASE (LIBAVCODEC_VERSION_MAJOR < 59) #endif |