v4l2codecs: update to the new uAPI
authorDaniel Almeida <daniel.almeida@collabora.com>
Wed, 14 Jul 2021 19:21:59 +0000 (16:21 -0300)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Mon, 29 Nov 2021 17:41:19 +0000 (17:41 +0000)
The new VP9 stateless API is in its way to be destaged. Update our
headers to match.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1012>

subprojects/gst-plugins-bad/sys/v4l2codecs/linux/v4l2-controls.h
subprojects/gst-plugins-bad/sys/v4l2codecs/linux/videodev2.h

index 0b6e7cf..091b933 100644 (file)
@@ -2007,6 +2007,292 @@ struct v4l2_ctrl_hdr10_mastering_display {
        __u32 min_display_mastering_luminance;
 };
 
+/* Stateless VP9 controls */
+
+/**
+ */
+#define V4L2_VP9_LOOP_FILTER_FLAG_DELTA_ENABLED        0x1
+#define        V4L2_VP9_LOOP_FILTER_FLAG_DELTA_UPDATE  0x2
+
+/**
+ * struct v4l2_vp9_loop_filter - VP9 loop filter parameters
+ *
+ * @ref_deltas: contains the adjustment needed for the filter level based on the chosen
+ *     reference frame. If this syntax element is not present in the bitstream, users
+ *     should pass its last value.
+ * @mode_deltas: contains the adjustment needed for the filter level based on the chosen mode.
+ *     If this syntax element is not present in the bitstream, users
+ *     should pass its last value.
+ * @level: indicates the loop filter strength
+ * @sharpness: indicates the sharpness level
+ * @flags: combination of V4L2_VP9_LOOP_FILTER_FLAG_* flags
+ * @reserved: padding field. Should be zeroed by applications.
+ *
+ * This structure contains all loop filter related parameters. See sections
+ * '7.2.8 Loop filter semantics' of the VP9 specification for more details.
+ */
+struct v4l2_vp9_loop_filter {
+       __s8 ref_deltas[4];
+       __s8 mode_deltas[2];
+       __u8 level;
+       __u8 sharpness;
+       __u8 flags;
+       __u8 reserved[7];
+};
+
+/**
+ * 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
+ * @reserved: padding field. Should be zeroed by applications.
+ *
+ * Encodes the quantization parameters. See section '7.2.9 Quantization params
+ * syntax' of the VP9 specification for more details.
+ */
+struct v4l2_vp9_quantization {
+       __u8 base_q_idx;
+       __s8 delta_q_y_dc;
+       __s8 delta_q_uv_dc;
+       __s8 delta_q_uv_ac;
+       __u8 reserved[4];
+};
+
+#define V4L2_VP9_SEGMENTATION_FLAG_ENABLED             0x01
+#define V4L2_VP9_SEGMENTATION_FLAG_UPDATE_MAP          0x02
+#define V4L2_VP9_SEGMENTATION_FLAG_TEMPORAL_UPDATE     0x04
+#define V4L2_VP9_SEGMENTATION_FLAG_UPDATE_DATA         0x08
+#define V4L2_VP9_SEGMENTATION_FLAG_ABS_OR_DELTA_UPDATE 0x10
+
+#define V4L2_VP9_SEG_LVL_ALT_Q                         0
+#define V4L2_VP9_SEG_LVL_ALT_L                         1
+#define V4L2_VP9_SEG_LVL_REF_FRAME                     2
+#define V4L2_VP9_SEG_LVL_SKIP                          3
+#define V4L2_VP9_SEG_LVL_MAX                           4
+
+#define V4L2_VP9_SEGMENT_FEATURE_ENABLED(id)   (1 << (id))
+#define V4L2_VP9_SEGMENT_FEATURE_ENABLED_MASK  0xf
+
+/**
+ * struct v4l2_vp9_segmentation - VP9 segmentation parameters
+ *
+ * @feature_data: data attached to each feature. Data entry is only valid if the feature is enabled.
+ * The array shall be indexed with segment number as the first dimension (0..7) and one of
+ * V4L2_VP9_SEG_* as the second dimension.
+ * @feature_enabled: bitmask defining which features are enabled in each segment. The value for
+ * each segment is a combination of V4L2_VP9_SEGMENT_FEATURE_ENABLED(id) values where id is one
+ * of V4L2_VP9_SEG_*
+ * @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_probs: 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.
+ * @flags: combination of V4L2_VP9_SEGMENTATION_FLAG_* flags
+ * @reserved: padding field. Should be zeroed by applications.
+ *
+ * Encodes the quantization parameters. See section '7.2.10 Segmentation params syntax' of
+ * the VP9 specification for more details.
+ */
+struct v4l2_vp9_segmentation {
+       __s16 feature_data[8][4];
+       __u8 feature_enabled[8];
+       __u8 tree_probs[7];
+       __u8 pred_probs[3];
+       __u8 flags;
+       __u8 reserved[5];
+};
+
+#define V4L2_VP9_FRAME_FLAG_KEY_FRAME                  0x001
+#define V4L2_VP9_FRAME_FLAG_SHOW_FRAME                 0x002
+#define V4L2_VP9_FRAME_FLAG_ERROR_RESILIENT            0x004
+#define V4L2_VP9_FRAME_FLAG_INTRA_ONLY                 0x008
+#define V4L2_VP9_FRAME_FLAG_ALLOW_HIGH_PREC_MV         0x010
+#define V4L2_VP9_FRAME_FLAG_REFRESH_FRAME_CTX          0x020
+#define V4L2_VP9_FRAME_FLAG_PARALLEL_DEC_MODE          0x040
+#define V4L2_VP9_FRAME_FLAG_X_SUBSAMPLING              0x080
+#define V4L2_VP9_FRAME_FLAG_Y_SUBSAMPLING              0x100
+#define V4L2_VP9_FRAME_FLAG_COLOR_RANGE_FULL_SWING     0x200
+
+#define V4L2_VP9_SIGN_BIAS_LAST                                0x1
+#define V4L2_VP9_SIGN_BIAS_GOLDEN                      0x2
+#define V4L2_VP9_SIGN_BIAS_ALT                         0x4
+
+#define V4L2_VP9_RESET_FRAME_CTX_NONE                  0
+#define V4L2_VP9_RESET_FRAME_CTX_SPEC                  1
+#define V4L2_VP9_RESET_FRAME_CTX_ALL                   2
+
+#define V4L2_VP9_INTERP_FILTER_EIGHTTAP                        0
+#define V4L2_VP9_INTERP_FILTER_EIGHTTAP_SMOOTH         1
+#define V4L2_VP9_INTERP_FILTER_EIGHTTAP_SHARP          2
+#define V4L2_VP9_INTERP_FILTER_BILINEAR                        3
+#define V4L2_VP9_INTERP_FILTER_SWITCHABLE              4
+
+#define V4L2_VP9_REFERENCE_MODE_SINGLE_REFERENCE       0
+#define V4L2_VP9_REFERENCE_MODE_COMPOUND_REFERENCE     1
+#define V4L2_VP9_REFERENCE_MODE_SELECT                 2
+
+#define V4L2_VP9_PROFILE_MAX                           3
+
+#define V4L2_CID_STATELESS_VP9_FRAME   (V4L2_CID_CODEC_STATELESS_BASE + 300)
+/**
+ * struct v4l2_ctrl_vp9_frame - VP9 frame decoding control
+ *
+ * @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
+ * @flags: combination of V4L2_VP9_FRAME_FLAG_* flags
+ * @compressed_header_size: compressed header size in bytes
+ * @uncompressed_header_size: uncompressed header size in bytes
+ * @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
+ * @render_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
+ * @render_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
+ * @last_frame_ts: "last" reference buffer timestamp.
+ * The timestamp refers to the timestamp field in struct v4l2_buffer.
+ * Use v4l2_timeval_to_ns() to convert the struct timeval to a __u64.
+ * @golden_frame_ts: "golden" reference buffer timestamp.
+ * The timestamp refers to the timestamp field in struct v4l2_buffer.
+ * Use v4l2_timeval_to_ns() to convert the struct timeval to a __u64.
+ * @alt_frame_ts: "alt" reference buffer timestamp.
+ * The timestamp refers to the timestamp field in struct v4l2_buffer.
+ * Use v4l2_timeval_to_ns() to convert the struct timeval to a __u64.
+ * @ref_frame_sign_bias: a bitfield specifying whether the sign bias is set for a given
+ *     reference frame. Either of V4L2_VP9_SIGN_BIAS_*.
+ * @reset_frame_context: specifies whether the frame context should be reset to default values.
+ *     Either of V4L2_VP9_RESET_FRAME_CTX_*.
+ * @frame_context_idx: frame context that should be used/updated
+ * @profile: VP9 profile. Can be 0, 1, 2 or 3
+ * @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.
+ *     Either of V4L2_VP9_INTERP_FILTER_*
+ * @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)
+ * @reference_mode: specifies the type of inter prediction to be used. See
+ *     Either of V4L2_VP9_REFERENCE_MODE_*
+ * @reserved: padding field. Should be zeroed by applications.
+ */
+struct v4l2_ctrl_vp9_frame {
+       struct v4l2_vp9_loop_filter lf;
+       struct v4l2_vp9_quantization quant;
+       struct v4l2_vp9_segmentation seg;
+       __u32 flags;
+       __u16 compressed_header_size;
+       __u16 uncompressed_header_size;
+       __u16 frame_width_minus_1;
+       __u16 frame_height_minus_1;
+       __u16 render_width_minus_1;
+       __u16 render_height_minus_1;
+       __u64 last_frame_ts;
+       __u64 golden_frame_ts;
+       __u64 alt_frame_ts;
+       __u8 ref_frame_sign_bias;
+       __u8 reset_frame_context;
+       __u8 frame_context_idx;
+       __u8 profile;
+       __u8 bit_depth;
+       __u8 interpolation_filter;
+       __u8 tile_cols_log2;
+       __u8 tile_rows_log2;
+       __u8 reference_mode;
+       __u8 reserved[7];
+};
+
+#define V4L2_VP9_NUM_FRAME_CTX 4
+
+/**
+ * struct v4l2_vp9_mv_probs - VP9 Motion vector probability updates
+ * @joint: motion vector joint probability updates
+ * @sign: motion vector sign probability updates
+ * @classes: motion vector class probability updates
+ * @class0_bit: motion vector class0 bit probability updates
+ * @bits: motion vector bits probability updates
+ * @class0_fr: motion vector class0 fractional bit probability updates
+ * @fr: motion vector fractional bit probability updates
+ * @class0_hp: motion vector class0 high precision fractional bit probability updates
+ * @hp: motion vector high precision fractional bit probability updates
+ *
+ * This structure contains new values of motion vector probabilities.
+ * A value of zero in an array element means there is no update of the relevant probability.
+ * See `struct v4l2_vp9_prob_updates` for details.
+ */
+struct v4l2_vp9_mv_probs {
+       __u8 joint[3];
+       __u8 sign[2];
+       __u8 classes[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];
+};
+
+#define V4L2_CID_STATELESS_VP9_COMPRESSED_HDR  (V4L2_CID_CODEC_STATELESS_BASE + 301)
+
+#define V4L2_VP9_TX_MODE_ONLY_4X4                      0
+#define V4L2_VP9_TX_MODE_ALLOW_8X8                     1
+#define V4L2_VP9_TX_MODE_ALLOW_16X16                   2
+#define V4L2_VP9_TX_MODE_ALLOW_32X32                   3
+#define V4L2_VP9_TX_MODE_SELECT                                4
+
+/**
+ * struct v4l2_ctrl_vp9_compressed_hdr - VP9 probability updates control
+ * @tx_mode: specifies the TX mode. Either of V4L2_VP9_TX_MODE_*.
+ * @tx8: TX 8x8 probability updates
+ * @tx16: TX 16x16 probability updates
+ * @tx32: TX 32x32 probability updates
+ * @coef: coefficient probability updates
+ * @skip: skip probability updates
+ * @inter_mode: inter mode probability updates
+ * @interp_filter: interpolation filter probability updates
+ * @is_inter: is inter-block probability updates
+ * @comp_mode: compound prediction mode probability updates
+ * @single_ref: single ref probability updates
+ * @comp_ref: compound ref probability updates
+ * @y_mode: Y prediction mode probability updates
+ * @uv_mode: UV prediction mode probability updates
+ * @partition: partition probability updates
+ * @mv: motion vector probability updates
+ *
+ * This structure holds the probabilities update as parsed in the compressed
+ * header (Spec 6.3). These values represent the value of probability update after
+ * being translated with inv_map_table[] (see 6.3.5). A value of zero in an array element
+ * means that there is no update of the relevant probability.
+ *
+ * This control is optional and needs to be used when dealing with the hardware which is
+ * not capable of parsing the compressed header itself. Only drivers which need it will
+ * implement it.
+ */
+struct v4l2_ctrl_vp9_compressed_hdr {
+       __u8 tx_mode;
+       __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_probs mv;
+};
+
 /* MPEG-compression definitions kept for backwards compatibility */
 #define V4L2_CTRL_CLASS_MPEG            V4L2_CTRL_CLASS_CODEC
 #define V4L2_CID_MPEG_CLASS             V4L2_CID_CODEC_CLASS
index d49536a..7b9a038 100644 (file)
@@ -694,6 +694,7 @@ struct v4l2_pix_format {
 #define V4L2_PIX_FMT_VP8      v4l2_fourcc('V', 'P', '8', '0') /* VP8 */
 #define V4L2_PIX_FMT_VP8_FRAME v4l2_fourcc('V', 'P', '8', 'F') /* VP8 parsed frame */
 #define V4L2_PIX_FMT_VP9      v4l2_fourcc('V', 'P', '9', '0') /* VP9 */
+#define V4L2_PIX_FMT_VP9_FRAME v4l2_fourcc('V', 'P', '9', 'F') /* VP9 parsed frame */
 #define V4L2_PIX_FMT_HEVC     v4l2_fourcc('H', 'E', 'V', 'C') /* HEVC aka H.265 */
 #define V4L2_PIX_FMT_FWHT     v4l2_fourcc('F', 'W', 'H', 'T') /* Fast Walsh Hadamard Transform (vicodec) */
 #define V4L2_PIX_FMT_FWHT_STATELESS     v4l2_fourcc('S', 'F', 'W', 'H') /* Stateless FWHT (vicodec) */
@@ -1716,6 +1717,8 @@ struct v4l2_ext_control {
                struct v4l2_ctrl_mpeg2_sequence *p_mpeg2_sequence;
                struct v4l2_ctrl_mpeg2_picture *p_mpeg2_picture;
                struct v4l2_ctrl_mpeg2_quantisation *p_mpeg2_quantisation;
+               struct v4l2_ctrl_vp9_compressed_hdr *p_vp9_compressed_hdr_probs;
+               struct v4l2_ctrl_vp9_frame *p_vp9_frame;
                void *ptr;
        };
 } __attribute__ ((packed));
@@ -1769,6 +1772,9 @@ enum v4l2_ctrl_type {
        V4L2_CTRL_TYPE_FWHT_PARAMS          = 0x0220,
 
        V4L2_CTRL_TYPE_VP8_FRAME            = 0x0240,
+
+       V4L2_CTRL_TYPE_VP9_COMPRESSED_HDR       = 0x0260,
+       V4L2_CTRL_TYPE_VP9_FRAME                = 0x0261,
 };
 
 /*  Used in the VIDIOC_QUERYCTRL ioctl for querying controls */