| From 516109a6e3a4533346718a94061aa4ff172a5ec2 Mon Sep 17 00:00:00 2001 |
| From: Alexandre Courbot <acourbot@chromium.org> |
| Date: Thu, 25 Mar 2021 22:02:03 +0900 |
| Subject: [PATCH] CHROMIUM: v4l: add request-based VP9 stateless controls |
| |
| Add the VP9 controls that Chromium is currently using along with the |
| request API. |
| |
| Signed-off-by: Alexandre Courbot <acourbot@chromium.org> |
| Change-Id: Iad4a25aaa076a6e6e159add501d256f8e0bd6af3 |
| --- |
| include/uapi/linux/media/vp9-ctrls.h | 492 +++++++++++++++++++++++++++ |
| 1 file changed, 492 insertions(+) |
| create mode 100644 include/uapi/linux/media/vp9-ctrls.h |
| |
| diff --git a/include/uapi/linux/media/vp9-ctrls.h b/include/uapi/linux/media/vp9-ctrls.h |
| new file mode 100644 |
| index 000000000000..c71e36e121e3 |
| --- /dev/null |
| +++ b/include/uapi/linux/media/vp9-ctrls.h |
| @@ -0,0 +1,492 @@ |
| +/* SPDX-License-Identifier: GPL-2.0 */ |
| +/* |
| + * These are the VP9 state controls for use with stateless VP9 |
| + * codec drivers. |
| + * |
| + * It turns out that these structs are not stable yet and will undergo |
| + * more changes. So keep them private until they are stable and ready to |
| + * become part of the official public API. |
| + */ |
| + |
| +#ifndef _VP9_CTRLS_H_ |
| +#define _VP9_CTRLS_H_ |
| + |
| +#include <linux/types.h> |
| + |
| +#define V4L2_PIX_FMT_VP9_FRAME v4l2_fourcc('V', 'P', '9', 'F') |
| + |
| +#define V4L2_CID_MPEG_VIDEO_VP9_FRAME_CONTEXT(i) (V4L2_CID_MPEG_BASE + 4000 + (i)) |
| +#define V4L2_CID_MPEG_VIDEO_VP9_FRAME_DECODE_PARAMS (V4L2_CID_MPEG_BASE + 4004) |
| +#define V4L2_CTRL_TYPE_VP9_FRAME_CONTEXT 0x400 |
| +#define V4L2_CTRL_TYPE_VP9_FRAME_DECODE_PARAMS 0x404 |
| + |
| +/** |
| + * enum v4l2_vp9_loop_filter_flags - VP9 loop filter flags |
| + * |
| + * @V4L2_VP9_LOOP_FILTER_FLAG_DELTA_ENABLED: the filter level depends on |
| + * the mode and reference frame used |
| + * to predict a block |
| + * @V4L2_VP9_LOOP_FILTER_FLAG_DELTA_UPDATE: the bitstream contains additional |
| + * syntax elements that specify which |
| + * mode and reference frame deltas |
| + * are to be updated |
| + * |
| + * Those are the flags you should pass to &v4l2_vp9_loop_filter.flags. See |
| + * section '7.2.8 Loop filter semantics' of the VP9 specification for more |
| + * details. |
| + */ |
| +enum v4l2_vp9_loop_filter_flags { |
| + V4L2_VP9_LOOP_FILTER_FLAG_DELTA_ENABLED = 1 << 0, |
| + V4L2_VP9_LOOP_FILTER_FLAG_DELTA_UPDATE = 1 << 1, |
| +}; |
| + |
| +/** |
| + * struct v4l2_vp9_loop_filter - VP9 loop filter parameters |
| + * |
| + * @flags: combination of V4L2_VP9_LOOP_FILTER_FLAG_* flags |
| + * @level: indicates the loop filter strength |
| + * @sharpness: indicates the sharpness level |
| + * @ref_deltas: contains the adjustment needed for the filter level based on |
| + * the chosen reference frame |
| + * @mode_deltas: contains the adjustment needed for the filter level based on |
| + * the chosen mode |
| + * @level_lookup: level lookup table |
| + * |
| + * This structure contains all loop filter related parameters. See sections |
| + * '7.2.8 Loop filter semantics' and '8.8.1 Loop filter frame init process' |
| + * of the VP9 specification for more details. |
| + */ |
| +struct v4l2_vp9_loop_filter { |
| + __u8 flags; |
| + __u8 level; |
| + __u8 sharpness; |
| + __s8 ref_deltas[4]; |
| + __s8 mode_deltas[2]; |
| + __u8 level_lookup[8][4][2]; |
| +}; |
| + |
| +/** |
| + * struct v4l2_vp9_quantization - VP9 quantization parameters |
| + * |
| + * @base_q_idx: indicates the base frame qindex |
| + * @delta_q_y_dc: indicates the Y DC quantizer relative to base_q_idx |
| + * @delta_q_uv_dc: indicates the UV DC quantizer relative to base_q_idx |
| + * @delta_q_uv_ac indicates the UV AC quantizer relative to base_q_idx |
| + * @padding: padding bytes to align things on 64 bits. Must be set to 0 |
| + * |
| + * Encodes the quantization parameters. See section '7.2.9 Quantization params |
| + * syntax' of the VP9 specification for more details. |
| + */ |
| +struct v4l2_vp9_quantization { |
| + /* TODO LOSSLESS flag missing? */ |
| + __u8 base_q_idx; |
| + __s8 delta_q_y_dc; |
| + __s8 delta_q_uv_dc; |
| + __s8 delta_q_uv_ac; |
| + __u8 padding[4]; |
| +}; |
| + |
| +/** |
| + * enum v4l2_vp9_segmentation_flags - VP9 segmentation flags |
| + * |
| + * @V4L2_VP9_SEGMENTATION_FLAG_ENABLED: indicates that this frame makes use of |
| + * the segmentation tool |
| + * @V4L2_VP9_SEGMENTATION_FLAG_UPDATE_MAP: indicates that the segmentation map |
| + * should be updated during the |
| + * decoding of this frame |
| + * @V4L2_VP9_SEGMENTATION_FLAG_TEMPORAL_UPDATE: indicates that the updates to |
| + * the segmentation map are coded |
| + * relative to the existing |
| + * segmentation map |
| + * @V4L2_VP9_SEGMENTATION_FLAG_UPDATE_DATA: indicates that new parameters are |
| + * about to be specified for each |
| + * segment |
| + * @V4L2_VP9_SEGMENTATION_FLAG_ABS_OR_DELTA_UPDATE: indicates that the |
| + * segmentation parameters |
| + * represent the actual values |
| + * to be used |
| + * |
| + * Those are the flags you should pass to &v4l2_vp9_segmentation.flags. See |
| + * section '7.2.10 Segmentation params syntax' of the VP9 specification for |
| + * more details. |
| + */ |
| +enum v4l2_vp9_segmentation_flags { |
| + V4L2_VP9_SEGMENTATION_FLAG_ENABLED = 1 << 0, |
| + V4L2_VP9_SEGMENTATION_FLAG_UPDATE_MAP = 1 << 1, |
| + V4L2_VP9_SEGMENTATION_FLAG_TEMPORAL_UPDATE = 1 << 2, |
| + V4L2_VP9_SEGMENTATION_FLAG_UPDATE_DATA = 1 << 3, |
| + V4L2_VP9_SEGMENTATION_FLAG_ABS_OR_DELTA_UPDATE = 1 << 4, |
| +}; |
| + |
| +#define V4L2_VP9_SEGMENT_FEATURE_ENABLED(id) (1 << (id)) |
| +#define V4L2_VP9_SEGMENT_FEATURE_ENABLED_MASK 0xf |
| + |
| +/** |
| + * enum v4l2_vp9_segment_feature - VP9 segment feature IDs |
| + * |
| + * @V4L2_VP9_SEGMENT_FEATURE_QP_DELTA: QP delta segment feature |
| + * @V4L2_VP9_SEGMENT_FEATURE_LF: loop filter segment feature |
| + * @V4L2_VP9_SEGMENT_FEATURE_REF_FRAME: reference frame segment feature |
| + * @V4L2_VP9_SEGMENT_FEATURE_SKIP: skip segment feature |
| + * @V4L2_VP9_SEGMENT_FEATURE_CNT: number of segment features |
| + * |
| + * Segment feature IDs. See section '7.2.10 Segmentation params syntax' of the |
| + * VP9 specification for more details. |
| + */ |
| +enum v4l2_vp9_segment_feature { |
| + V4L2_VP9_SEGMENT_FEATURE_QP_DELTA, |
| + V4L2_VP9_SEGMENT_FEATURE_LF, |
| + V4L2_VP9_SEGMENT_FEATURE_REF_FRAME, |
| + V4L2_VP9_SEGMENT_FEATURE_SKIP, |
| + V4L2_VP9_SEGMENT_FEATURE_CNT, |
| +}; |
| + |
| +/** |
| + * struct v4l2_vp9_segmentation - VP9 segmentation parameters |
| + * |
| + * @flags: combination of V4L2_VP9_SEGMENTATION_FLAG_* flags |
| + * @tree_probs: specifies the probability values to be used when |
| + * decoding a Segment-ID. See '5.15. Segmentation map' |
| + * section of the VP9 specification for more details. |
| + * @pred_prob: specifies the probability values to be used when decoding a |
| + * Predicted-Segment-ID. See '6.4.14. Get segment id syntax' |
| + * section of :ref:`vp9` for more details.. |
| + * @padding: padding used to make things aligned on 64 bits. Shall be zero |
| + * filled |
| + * @feature_enabled: bitmask defining which features are enabled in each |
| + * segment |
| + * @feature_data: data attached to each feature. Data entry is only valid if |
| + * the feature is enabled |
| + * |
| + * Encodes the quantization parameters. See section '7.2.10 Segmentation |
| + * params syntax' of the VP9 specification for more details. |
| + */ |
| +struct v4l2_vp9_segmentation { |
| + __u8 flags; |
| + __u8 tree_probs[7]; |
| + __u8 pred_probs[3]; |
| + __u8 padding[5]; |
| + __u8 feature_enabled[8]; |
| + __s16 feature_data[8][4]; |
| +}; |
| + |
| +/** |
| + * enum v4l2_vp9_intra_prediction_mode - VP9 Intra prediction modes |
| + * |
| + * @V4L2_VP9_INTRA_PRED_DC: DC intra prediction |
| + * @V4L2_VP9_INTRA_PRED_MODE_V: vertical intra prediction |
| + * @V4L2_VP9_INTRA_PRED_MODE_H: horizontal intra prediction |
| + * @V4L2_VP9_INTRA_PRED_MODE_D45: D45 intra prediction |
| + * @V4L2_VP9_INTRA_PRED_MODE_D135: D135 intra prediction |
| + * @V4L2_VP9_INTRA_PRED_MODE_D117: D117 intra prediction |
| + * @V4L2_VP9_INTRA_PRED_MODE_D153: D153 intra prediction |
| + * @V4L2_VP9_INTRA_PRED_MODE_D207: D207 intra prediction |
| + * @V4L2_VP9_INTRA_PRED_MODE_D63: D63 intra prediction |
| + * @V4L2_VP9_INTRA_PRED_MODE_TM: True Motion intra prediction |
| + * |
| + * See section '7.4.5 Intra frame mode info semantics' for more details. |
| + */ |
| +// TODO where is this used?? |
| +enum v4l2_vp9_intra_prediction_mode { |
| + V4L2_VP9_INTRA_PRED_MODE_DC, |
| + V4L2_VP9_INTRA_PRED_MODE_V, |
| + V4L2_VP9_INTRA_PRED_MODE_H, |
| + V4L2_VP9_INTRA_PRED_MODE_D45, |
| + V4L2_VP9_INTRA_PRED_MODE_D135, |
| + V4L2_VP9_INTRA_PRED_MODE_D117, |
| + V4L2_VP9_INTRA_PRED_MODE_D153, |
| + V4L2_VP9_INTRA_PRED_MODE_D207, |
| + V4L2_VP9_INTRA_PRED_MODE_D63, |
| + V4L2_VP9_INTRA_PRED_MODE_TM, |
| +}; |
| + |
| +/** |
| + * struct v4l2_vp9_mv_probabilities - VP9 Motion vector probabilities |
| + * @joint: motion vector joint probabilities |
| + * @sign: motion vector sign probabilities |
| + * @class_: motion vector class probabilities |
| + * @class0_bit: motion vector class0 bit probabilities |
| + * @bits: motion vector bits probabilities |
| + * @class0_fr: motion vector class0 fractional bit probabilities |
| + * @fr: motion vector fractional bit probabilities |
| + * @class0_hp: motion vector class0 high precision fractional bit probabilities |
| + * @hp: motion vector high precision fractional bit probabilities |
| + */ |
| +struct v4l2_vp9_mv_probabilities { |
| + __u8 joint[3]; |
| + __u8 sign[2]; |
| + __u8 class_[2][10]; |
| + __u8 class0_bit[2]; |
| + __u8 bits[2][10]; |
| + __u8 class0_fr[2][2][3]; |
| + __u8 fr[2][3]; |
| + __u8 class0_hp[2]; |
| + __u8 hp[2]; |
| +}; |
| + |
| +/** |
| + * struct v4l2_vp9_probabilities - VP9 Probabilities |
| + * |
| + * @tx8: TX 8x8 probabilities |
| + * @tx16: TX 16x16 probabilities |
| + * @tx32: TX 32x32 probabilities |
| + * @coef: coefficient probabilities |
| + * @skip: skip probabilities |
| + * @inter_mode: inter mode probabilities |
| + * @interp_filter: interpolation filter probabilities |
| + * @is_inter: is inter-block probabilities |
| + * @comp_mode: compound prediction mode probabilities |
| + * @single_ref: single ref probabilities |
| + * @comp_ref: compound ref probabilities |
| + * @y_mode: Y prediction mode probabilities |
| + * @uv_mode: UV prediction mode probabilities |
| + * @partition: partition probabilities |
| + * @mv: motion vector probabilities |
| + * |
| + * Structure containing most VP9 probabilities. See the VP9 specification |
| + * for more details. |
| + */ |
| +struct v4l2_vp9_probabilities { |
| + __u8 tx8[2][1]; |
| + __u8 tx16[2][2]; |
| + __u8 tx32[2][3]; |
| + __u8 coef[4][2][2][6][6][3]; |
| + __u8 skip[3]; |
| + __u8 inter_mode[7][3]; |
| + __u8 interp_filter[4][2]; |
| + __u8 is_inter[4]; |
| + __u8 comp_mode[5]; |
| + __u8 single_ref[5][2]; |
| + __u8 comp_ref[5]; |
| + __u8 y_mode[4][9]; |
| + __u8 uv_mode[10][9]; |
| + __u8 partition[16][3]; |
| + |
| + struct v4l2_vp9_mv_probabilities mv; |
| +}; |
| + |
| +/** |
| + * enum v4l2_vp9_reset_frame_context - Valid values for |
| + * &v4l2_ctrl_vp9_frame_decode_params->reset_frame_context |
| + * |
| + * @V4L2_VP9_RESET_FRAME_CTX_NONE: don't reset any frame context |
| + * @V4L2_VP9_RESET_FRAME_CTX_SPEC: reset the frame context pointed by |
| + * &v4l2_ctrl_vp9_frame_decode_params.frame_context_idx |
| + * @V4L2_VP9_RESET_FRAME_CTX_ALL: reset all frame contexts |
| + * |
| + * See section '7.2 Uncompressed header semantics' of the VP9 specification |
| + * for more details. |
| + */ |
| +enum v4l2_vp9_reset_frame_context { |
| + V4L2_VP9_RESET_FRAME_CTX_NONE, |
| + V4L2_VP9_RESET_FRAME_CTX_SPEC, |
| + V4L2_VP9_RESET_FRAME_CTX_ALL, |
| +}; |
| + |
| +/** |
| + * enum v4l2_vp9_interpolation_filter - VP9 interpolation filter types |
| + * |
| + * @V4L2_VP9_INTERP_FILTER_8TAP: height tap filter |
| + * @V4L2_VP9_INTERP_FILTER_8TAP_SMOOTH: height tap smooth filter |
| + * @V4L2_VP9_INTERP_FILTER_8TAP_SHARP: height tap sharp filter |
| + * @V4L2_VP9_INTERP_FILTER_BILINEAR: bilinear filter |
| + * @V4L2_VP9_INTERP_FILTER_SWITCHABLE: filter selection is signaled at the |
| + * block level |
| + * |
| + * See section '7.2.7 Interpolation filter semantics' of the VP9 specification |
| + * for more details. |
| + */ |
| +enum v4l2_vp9_interpolation_filter { |
| + V4L2_VP9_INTERP_FILTER_8TAP, |
| + V4L2_VP9_INTERP_FILTER_8TAP_SMOOTH, |
| + V4L2_VP9_INTERP_FILTER_8TAP_SHARP, |
| + V4L2_VP9_INTERP_FILTER_BILINEAR, |
| + V4L2_VP9_INTERP_FILTER_SWITCHABLE, |
| +}; |
| + |
| +/** |
| + * enum v4l2_vp9_reference_mode - VP9 reference modes |
| + * |
| + * @V4L2_VP9_REF_MODE_SINGLE: indicates that all the inter blocks use only a |
| + * single reference frame to generate motion |
| + * compensated prediction |
| + * @V4L2_VP9_REF_MODE_COMPOUND: requires all the inter blocks to use compound |
| + * mode. Single reference frame prediction is not |
| + * allowed |
| + * @V4L2_VP9_REF_MODE_SELECT: allows each individual inter block to select |
| + * between single and compound prediction modes |
| + * |
| + * See section '7.3.6 Frame reference mode semantics' of the VP9 specification |
| + * for more details. |
| + */ |
| +enum v4l2_vp9_reference_mode { |
| + V4L2_VP9_REF_MODE_SINGLE, |
| + V4L2_VP9_REF_MODE_COMPOUND, |
| + V4L2_VP9_REF_MODE_SELECT, |
| +}; |
| + |
| +/** |
| + * enum v4l2_vp9_tx_mode - VP9 TX modes |
| + * |
| + * @V4L2_VP9_TX_MODE_ONLY_4X4: transform size is 4x4 |
| + * @V4L2_VP9_TX_MODE_ALLOW_8X8: transform size can be up to 8x8 |
| + * @V4L2_VP9_TX_MODE_ALLOW_16X16: transform size can be up to 16x16 |
| + * @V4L2_VP9_TX_MODE_ALLOW_32X32: transform size can be up to 32x32 |
| + * @V4L2_VP9_TX_MODE_SELECT: bitstream contains transform size for each block |
| + * |
| + * See section '7.3.1 Tx mode semantics' of the VP9 specification for more |
| + * details. |
| + */ |
| +enum v4l2_vp9_tx_mode { |
| + V4L2_VP9_TX_MODE_ONLY_4X4, |
| + V4L2_VP9_TX_MODE_ALLOW_8X8, |
| + V4L2_VP9_TX_MODE_ALLOW_16X16, |
| + V4L2_VP9_TX_MODE_ALLOW_32X32, |
| + V4L2_VP9_TX_MODE_SELECT, |
| +}; |
| + |
| +/** |
| + * enum v4l2_vp9_ref_id - VP9 Reference frame IDs |
| + * |
| + * @V4L2_REF_ID_LAST: last reference frame |
| + * @V4L2_REF_ID_GOLDEN: golden reference frame |
| + * @V4L2_REF_ID_ALTREF: alternative reference frame |
| + * @V4L2_REF_ID_CNT: number of reference frames |
| + * |
| + * See section '7.4.12 Ref frames semantics' of the VP9 specification for more |
| + * details. |
| + */ |
| +enum v4l2_vp9_ref_id { |
| + V4L2_REF_ID_LAST, |
| + V4L2_REF_ID_GOLDEN, |
| + V4L2_REF_ID_ALTREF, |
| + V4L2_REF_ID_CNT, |
| +}; |
| + |
| +/** |
| + * enum v4l2_vp9_frame_flags - VP9 frame flags |
| + * @V4L2_VP9_FRAME_FLAG_KEY_FRAME: the frame is a key frame |
| + * @V4L2_VP9_FRAME_FLAG_SHOW_FRAME: the frame should be displayed |
| + * @V4L2_VP9_FRAME_FLAG_ERROR_RESILIENT: the decoding should be error resilient |
| + * @V4L2_VP9_FRAME_FLAG_INTRA_ONLY: the frame does not reference other frames |
| + * @V4L2_VP9_FRAME_FLAG_ALLOW_HIGH_PREC_MV: the frame might can high precision |
| + * motion vectors |
| + * @V4L2_VP9_FRAME_FLAG_REFRESH_FRAME_CTX: frame context should be updated |
| + * after decoding |
| + * @V4L2_VP9_FRAME_FLAG_PARALLEL_DEC_MODE: parallel decoding is used |
| + * @V4L2_VP9_FRAME_FLAG_X_SUBSAMPLING: vertical subsampling is enabled |
| + * @V4L2_VP9_FRAME_FLAG_Y_SUBSAMPLING: horizontal subsampling is enabled |
| + * @V4L2_VP9_FRAME_FLAG_COLOR_RANGE_FULL_SWING: full UV range is used |
| + * |
| + * Check the VP9 specification for more details. |
| + */ |
| +enum v4l2_vp9_frame_flags { |
| + V4L2_VP9_FRAME_FLAG_KEY_FRAME = 1 << 0, |
| + V4L2_VP9_FRAME_FLAG_SHOW_FRAME = 1 << 1, |
| + V4L2_VP9_FRAME_FLAG_ERROR_RESILIENT = 1 << 2, |
| + V4L2_VP9_FRAME_FLAG_INTRA_ONLY = 1 << 3, |
| + V4L2_VP9_FRAME_FLAG_ALLOW_HIGH_PREC_MV = 1 << 4, |
| + V4L2_VP9_FRAME_FLAG_REFRESH_FRAME_CTX = 1 << 5, |
| + V4L2_VP9_FRAME_FLAG_PARALLEL_DEC_MODE = 1 << 6, |
| + V4L2_VP9_FRAME_FLAG_X_SUBSAMPLING = 1 << 7, |
| + V4L2_VP9_FRAME_FLAG_Y_SUBSAMPLING = 1 << 8, |
| + V4L2_VP9_FRAME_FLAG_COLOR_RANGE_FULL_SWING = 1 << 9, |
| +}; |
| + |
| +#define V4L2_VP9_PROFILE_MAX 3 |
| + |
| +/** |
| + * struct v4l2_ctrl_vp9_frame_decode_params - VP9 frame decoding control |
| + * |
| + * @flags: combination of V4L2_VP9_FRAME_FLAG_* flags |
| + * @compressed_header_size: compressed header size in bytes |
| + * @uncompressed_header_size: uncompressed header size in bytes |
| + * @profile: VP9 profile. Can be 0, 1, 2 or 3 |
| + * @reset_frame_context: specifies whether the frame context should be reset |
| + * to default values. See &v4l2_vp9_reset_frame_context |
| + * for more details |
| + * @frame_context_idx: frame context that should be used/updated |
| + * @bit_depth: bits per components. Can be 8, 10 or 12. Note that not all |
| + * profiles support 10 and/or 12 bits depths |
| + * @interpolation_filter: specifies the filter selection used for performing |
| + * inter prediction. See &v4l2_vp9_interpolation_filter |
| + * for more details |
| + * @tile_cols_log2: specifies the base 2 logarithm of the width of each tile |
| + * (where the width is measured in units of 8x8 blocks). |
| + * Shall be less than or equal to 6 |
| + * @tile_rows_log2: specifies the base 2 logarithm of the height of each tile |
| + * (where the height is measured in units of 8x8 blocks) |
| + * @tx_mode: specifies the TX mode. See &v4l2_vp9_tx_mode for more details |
| + * @reference_mode: specifies the type of inter prediction to be used. See |
| + * &v4l2_vp9_reference_mode for more details |
| + * @ref_frame_sign_biases: intended direction in time of the motion vector for |
| + * each reference frame (0: backward, 1: forward). |
| + * Only the first V4L2_REF_ID_CNT are used. |
| + * @padding: needed to make this struct 64 bit aligned. Shall be filled with |
| + * zeros |
| + * @frame_width_minus_1: add 1 to it and you'll get the frame width expressed |
| + * in pixels |
| + * @frame_height_minus_1: add 1 to it and you'll get the frame height expressed |
| + * in pixels |
| + * @frame_width_minus_1: add 1 to it and you'll get the expected render width |
| + * expressed in pixels. This is not used during the |
| + * decoding process but might be used by HW scalers to |
| + * prepare a frame that's ready for scanout |
| + * @frame_height_minus_1: add 1 to it and you'll get the expected render height |
| + * expressed in pixels. This is not used during the |
| + * decoding process but might be used by HW scalers to |
| + * prepare a frame that's ready for scanout |
| + * @refs: array of reference frames, identified by timestamp. See |
| + &v4l2_vp9_ref_id for more details |
| + * @lf: loop filter parameters. See &v4l2_vp9_loop_filter for more details |
| + * @quant: quantization parameters. See &v4l2_vp9_quantization for more details |
| + * @seg: segmentation parameters. See &v4l2_vp9_segmentation for more details |
| + * @probs: probabilities. See &v4l2_vp9_probabilities for more details |
| + */ |
| +struct v4l2_ctrl_vp9_frame_decode_params { |
| + __u32 flags; |
| + __u16 compressed_header_size; |
| + __u16 uncompressed_header_size; |
| + __u8 profile; |
| + __u8 reset_frame_context; |
| + __u8 frame_context_idx; |
| + __u8 bit_depth; |
| + __u8 interpolation_filter; |
| + __u8 tile_cols_log2; |
| + __u8 tile_rows_log2; |
| + __u8 tx_mode; |
| + __u8 reference_mode; |
| + __u8 ref_frame_sign_biases; |
| + __u8 padding[5]; |
| + __u16 frame_width_minus_1; |
| + __u16 frame_height_minus_1; |
| + __u16 render_width_minus_1; |
| + __u16 render_height_minus_1; |
| + __u64 refs[V4L2_REF_ID_CNT]; |
| + struct v4l2_vp9_loop_filter lf; |
| + struct v4l2_vp9_quantization quant; |
| + struct v4l2_vp9_segmentation seg; |
| + struct v4l2_vp9_probabilities probs; |
| +}; |
| + |
| +#define V4L2_VP9_NUM_FRAME_CTX 4 |
| + |
| +/** |
| + * struct v4l2_ctrl_vp9_frame_ctx - VP9 frame context control |
| + * |
| + * @probs: VP9 probabilities |
| + * |
| + * This control is accessed in both direction. The user should initialize the |
| + * 4 contexts with default values just after starting the stream. Then before |
| + * decoding a frame it should query the current frame context (the one passed |
| + * through &v4l2_ctrl_vp9_frame_decode_params.frame_context_idx) to initialize |
| + * &v4l2_ctrl_vp9_frame_decode_params.probs. The probs are then adjusted based |
| + * on the bitstream info and passed to the kernel. The codec should update |
| + * the frame context after the frame has been decoded, so that next time |
| + * userspace query this context it contains the updated probabilities. |
| + */ |
| +struct v4l2_ctrl_vp9_frame_ctx { |
| + struct v4l2_vp9_probabilities probs; |
| +}; |
| + |
| +#endif /* _VP9_CTRLS_H_ */ |
| -- |
| 2.31.0.291.g576ba9dcdaf-goog |
| |