diff options
Diffstat (limited to 'libavcodec/vaapi_encode.h')
-rw-r--r-- | libavcodec/vaapi_encode.h | 96 |
1 files changed, 66 insertions, 30 deletions
diff --git a/libavcodec/vaapi_encode.h b/libavcodec/vaapi_encode.h index eede73ca97..71f608751b 100644 --- a/libavcodec/vaapi_encode.h +++ b/libavcodec/vaapi_encode.h @@ -48,15 +48,6 @@ enum { PICTURE_TYPE_B = 3, }; -enum { - // All encode operations are done independently. - ISSUE_MODE_SERIALISE_EVERYTHING = 0, - // Overlap as many operations as possible. - ISSUE_MODE_MAXIMISE_THROUGHPUT, - // Overlap operations only when satisfying parallel dependencies. - ISSUE_MODE_MINIMISE_LATENCY, -}; - typedef struct VAAPIEncodeSlice { void *priv_data; void *codec_slice_params; @@ -102,43 +93,65 @@ typedef struct VAAPIEncodeContext { // Codec-specific hooks. const struct VAAPIEncodeType *codec; + // Encoding profile (VAProfileXXX). + VAProfile va_profile; + // Encoding entrypoint (usually VAEntryointEncSlice). + VAEntrypoint va_entrypoint; + // Surface colour/sampling format (usually VA_RT_FORMAT_YUV420). + unsigned int va_rt_format; + // Rate control mode. + unsigned int va_rc_mode; + + // The required size of surfaces. This is probably the input + // size (AVCodecContext.width|height) aligned up to whatever + // block size is required by the codec. + int surface_width; + int surface_height; + + // Everything above this point must be set before calling + // ff_vaapi_encode_init(). + // Codec-specific state. void *priv_data; - VAProfile va_profile; - VAEntrypoint va_entrypoint; + // Configuration attributes to use when creating va_config. + VAConfigAttrib config_attributes[MAX_CONFIG_ATTRIBUTES]; + int nb_config_attributes; + VAConfigID va_config; VAContextID va_context; - int va_rc_mode; - AVBufferRef *device_ref; AVHWDeviceContext *device; AVVAAPIDeviceContext *hwctx; + // The hardware frame context containing the input frames. AVBufferRef *input_frames_ref; AVHWFramesContext *input_frames; - // Input size, set from input frames. - int input_width; - int input_height; - // Aligned size, set by codec init, becomes hwframe size. - int aligned_width; - int aligned_height; - - int nb_recon_frames; + // The hardware frame context containing the reconstructed frames. AVBufferRef *recon_frames_ref; AVHWFramesContext *recon_frames; + // Pool of (reusable) bitstream output buffers. AVBufferPool *output_buffer_pool; - VAConfigAttrib config_attributes[MAX_CONFIG_ATTRIBUTES]; - int nb_config_attributes; - + // Global parameters which will be applied at the start of the + // sequence (includes rate control parameters below). VAEncMiscParameterBuffer *global_params[MAX_GLOBAL_PARAMS]; size_t global_params_size[MAX_GLOBAL_PARAMS]; int nb_global_params; + // Rate control parameters. + struct { + VAEncMiscParameterBuffer misc; + VAEncMiscParameterRateControl rc; + } rc_params; + struct { + VAEncMiscParameterBuffer misc; + VAEncMiscParameterHRD hrd; + } hrd_params; + // Per-sequence parameter structure (VAEncSequenceParameterBuffer*). void *codec_sequence_params; @@ -158,7 +171,15 @@ typedef struct VAAPIEncodeContext { // Next output order index (encode order). int64_t output_order; - int issue_mode; + enum { + // All encode operations are done independently (synchronise + // immediately after every operation). + ISSUE_MODE_SERIALISE_EVERYTHING = 0, + // Overlap as many operations as possible. + ISSUE_MODE_MAXIMISE_THROUGHPUT, + // Overlap operations only when satisfying parallel dependencies. + ISSUE_MODE_MINIMISE_LATENCY, + } issue_mode; // Timestamp handling. int64_t first_pts; @@ -183,15 +204,20 @@ typedef struct VAAPIEncodeContext { typedef struct VAAPIEncodeType { - size_t priv_data_size; + size_t priv_data_size; - int (*init)(AVCodecContext *avctx); - int (*close)(AVCodecContext *avctx); + // Perform any extra codec-specific configuration after the + // codec context is initialised (set up the private data and + // add any necessary global parameters). + int (*configure)(AVCodecContext *avctx); + // The size of the parameter structures: + // sizeof(VAEnc{type}ParameterBuffer{codec}). size_t sequence_params_size; size_t picture_params_size; size_t slice_params_size; + // Fill the parameter structures. int (*init_sequence_params)(AVCodecContext *avctx); int (*init_picture_params)(AVCodecContext *avctx, VAAPIEncodePicture *pic); @@ -199,10 +225,13 @@ typedef struct VAAPIEncodeType { VAAPIEncodePicture *pic, VAAPIEncodeSlice *slice); + // The type used by the packed header: this should look like + // VAEncPackedHeader{something}. int sequence_header_type; int picture_header_type; int slice_header_type; + // Write the packed header data to the provided buffer. int (*write_sequence_header)(AVCodecContext *avctx, char *data, size_t *data_len); int (*write_picture_header)(AVCodecContext *avctx, @@ -213,10 +242,18 @@ typedef struct VAAPIEncodeType { VAAPIEncodeSlice *slice, char *data, size_t *data_len); + // Fill an extra parameter structure, which will then be + // passed to vaRenderPicture(). Will be called repeatedly + // with increasing index argument until AVERROR_EOF is + // returned. int (*write_extra_buffer)(AVCodecContext *avctx, VAAPIEncodePicture *pic, int index, int *type, char *data, size_t *data_len); + + // Write an extra packed header. Will be called repeatedly + // with increasing index argument until AVERROR_EOF is + // returned. int (*write_extra_header)(AVCodecContext *avctx, VAAPIEncodePicture *pic, int index, int *type, @@ -227,8 +264,7 @@ typedef struct VAAPIEncodeType { int ff_vaapi_encode2(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *input_image, int *got_packet); -int ff_vaapi_encode_init(AVCodecContext *avctx, - const VAAPIEncodeType *type); +int ff_vaapi_encode_init(AVCodecContext *avctx); int ff_vaapi_encode_close(AVCodecContext *avctx); #endif /* AVCODEC_VAAPI_ENCODE_H */ |