media: Add AV1 uAPI

This patch adds the  AOMedia Video 1 (AV1) kernel uAPI.

This design is based on currently available AV1 API implementations and
aims to support the development of AV1 stateless video codecs
on Linux.

Signed-off-by: Daniel Almeida <daniel.almeida@collabora.com>
Co-developed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>
Signed-off-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
This commit is contained in:
Daniel Almeida 2023-03-06 16:18:50 +00:00 committed by Mauro Carvalho Chehab
parent 2104793233
commit 9de30f5799
12 changed files with 2335 additions and 2 deletions

View File

@ -427,3 +427,12 @@ VP9
:title: VP9 Bitstream & Decoding Process Specification
:author: Adrian Grange (Google), Peter de Rivaz (Argon Design), Jonathan Hunt (Argon Design)
.. _av1:
AV1
===
:title: AV1 Bitstream & Decoding Process Specification
:author: Peter de Rivaz, Argon Design Ltd, Jack Haughton, Argon Design Ltd

View File

@ -258,6 +258,22 @@ Compressed Formats
RV9 players - the format and decoder did not change, only
the encoder did. As a result, it uses the same FourCC.
* .. _V4L2-PIX-FMT-AV1-FRAME:
- ``V4L2_PIX_FMT_AV1_FRAME``
- 'AV1F'
- AV1 parsed frame, including the frame header, as extracted from the container.
This format is adapted for stateless video decoders that implement a AV1
pipeline with the :ref:`stateless_decoder`. Metadata associated with the
frame to decode is required to be passed through the
``V4L2_CID_STATELESS_AV1_SEQUENCE``, ``V4L2_CID_STATELESS_AV1_FRAME``,
and ``V4L2_CID_STATELESS_AV1_TILE_GROUP_ENTRY`` controls.
See the :ref:`associated Codec Control IDs <v4l2-codec-stateless-av1>`.
Exactly one output and one capture buffer must be provided for use with
this pixel format. The output buffer must contain the appropriate number
of macroblocks to decode a full corresponding frame to the matching
capture buffer.
.. raw:: latex
\normalsize

View File

@ -279,6 +279,22 @@ still cause this situation.
- ``p_hevc_decode_params``
- A pointer to a struct :c:type:`v4l2_ctrl_hevc_decode_params`. Valid if this
control is of type ``V4L2_CTRL_TYPE_HEVC_DECODE_PARAMS``.
* - struct :c:type:`v4l2_ctrl_av1_sequence` *
- ``p_av1_sequence``
- A pointer to a struct :c:type:`v4l2_ctrl_av1_sequence`. Valid if this control is
of type ``V4L2_CTRL_TYPE_AV1_SEQUENCE``.
* - struct :c:type:`v4l2_ctrl_av1_tile_group_entry` *
- ``p_av1_tile_group_entry``
- A pointer to a struct :c:type:`v4l2_ctrl_av1_tile_group_entry`. Valid if this control is
of type ``V4L2_CTRL_TYPE_AV1_TILE_GROUP_ENTRY``.
* - struct :c:type:`v4l2_ctrl_av1_frame` *
- ``p_av1_frame``
- A pointer to a struct :c:type:`v4l2_ctrl_av1_frame`. Valid if this control is
of type ``V4L2_CTRL_TYPE_AV1_FRAME``.
* - struct :c:type:`v4l2_ctrl_av1_film_grain` *
- ``p_av1_film_grain``
- A pointer to a struct :c:type:`v4l2_ctrl_av1_film_grain`. Valid if this control is
of type ``V4L2_CTRL_TYPE_AV1_FILM_GRAIN``.
* - void *
- ``ptr``
- A pointer to a compound type which can be an N-dimensional array

View File

@ -525,6 +525,30 @@ See also the examples in :ref:`control`.
- n/a
- A struct :c:type:`v4l2_ctrl_vp9_frame`, containing VP9
frame decode parameters for stateless video decoders.
* - ``V4L2_CTRL_TYPE_AV1_SEQUENCE``
- n/a
- n/a
- n/a
- A struct :c:type:`v4l2_ctrl_av1_sequence`, containing AV1 Sequence OBU
decoding parameters for stateless video decoders.
* - ``V4L2_CTRL_TYPE_AV1_TILE_GROUP_ENTRY``
- n/a
- n/a
- n/a
- A struct :c:type:`v4l2_ctrl_av1_tile_group_entry`, containing AV1 Tile Group
OBU decoding parameters for stateless video decoders.
* - ``V4L2_CTRL_TYPE_AV1_FRAME``
- n/a
- n/a
- n/a
- A struct :c:type:`v4l2_ctrl_av1_frame`, containing AV1 Frame/Frame
Header OBU decoding parameters for stateless video decoders.
* - ``V4L2_CTRL_TYPE_AV1_FILM_GRAIN``
- n/a
- n/a
- n/a
- A struct :c:type:`v4l2_ctrl_av1_film_grain`, containing AV1 Film Grain
parameters for stateless video decoders.
.. raw:: latex

View File

@ -161,6 +161,10 @@ replace symbol V4L2_CTRL_TYPE_HEVC_PPS :c:type:`v4l2_ctrl_type`
replace symbol V4L2_CTRL_TYPE_HEVC_SLICE_PARAMS :c:type:`v4l2_ctrl_type`
replace symbol V4L2_CTRL_TYPE_HEVC_SCALING_MATRIX :c:type:`v4l2_ctrl_type`
replace symbol V4L2_CTRL_TYPE_HEVC_DECODE_PARAMS :c:type:`v4l2_ctrl_type`
replace symbol V4L2_CTRL_TYPE_AV1_SEQUENCE :c:type:`v4l2_ctrl_type`
replace symbol V4L2_CTRL_TYPE_AV1_TILE_GROUP_ENTRY :c:type:`v4l2_ctrl_type`
replace symbol V4L2_CTRL_TYPE_AV1_FRAME :c:type:`v4l2_ctrl_type`
replace symbol V4L2_CTRL_TYPE_AV1_FILM_GRAIN :c:type:`v4l2_ctrl_type`
# V4L2 capability defines
replace define V4L2_CAP_VIDEO_CAPTURE device-capabilities

View File

@ -350,6 +350,19 @@ void v4l2_ctrl_type_op_log(const struct v4l2_ctrl *ctrl)
case V4L2_CTRL_TYPE_HEVC_DECODE_PARAMS:
pr_cont("HEVC_DECODE_PARAMS");
break;
case V4L2_CTRL_TYPE_AV1_SEQUENCE:
pr_cont("AV1_SEQUENCE");
break;
case V4L2_CTRL_TYPE_AV1_TILE_GROUP_ENTRY:
pr_cont("AV1_TILE_GROUP_ENTRY");
break;
case V4L2_CTRL_TYPE_AV1_FRAME:
pr_cont("AV1_FRAME");
break;
case V4L2_CTRL_TYPE_AV1_FILM_GRAIN:
pr_cont("AV1_FILM_GRAIN");
break;
default:
pr_cont("unknown type %d", ctrl->type);
break;
@ -547,6 +560,231 @@ validate_vp9_frame(struct v4l2_ctrl_vp9_frame *frame)
return 0;
}
static int validate_av1_quantization(struct v4l2_av1_quantization *q)
{
if (q->flags > GENMASK(2, 0))
return -EINVAL;
if (q->delta_q_y_dc < -64 || q->delta_q_y_dc > 63 ||
q->delta_q_u_dc < -64 || q->delta_q_u_dc > 63 ||
q->delta_q_v_dc < -64 || q->delta_q_v_dc > 63 ||
q->delta_q_u_ac < -64 || q->delta_q_u_ac > 63 ||
q->delta_q_v_ac < -64 || q->delta_q_v_ac > 63 ||
q->delta_q_res > GENMASK(1, 0))
return -EINVAL;
if (q->qm_y > GENMASK(3, 0) ||
q->qm_u > GENMASK(3, 0) ||
q->qm_v > GENMASK(3, 0))
return -EINVAL;
return 0;
}
static int validate_av1_segmentation(struct v4l2_av1_segmentation *s)
{
u32 i;
u32 j;
if (s->flags > GENMASK(4, 0))
return -EINVAL;
for (i = 0; i < ARRAY_SIZE(s->feature_data); i++) {
static const int segmentation_feature_signed[] = { 1, 1, 1, 1, 1, 0, 0, 0 };
static const int segmentation_feature_max[] = { 255, 63, 63, 63, 63, 7, 0, 0};
for (j = 0; j < ARRAY_SIZE(s->feature_data[j]); j++) {
s32 limit = segmentation_feature_max[j];
if (segmentation_feature_signed[j]) {
if (s->feature_data[i][j] < -limit ||
s->feature_data[i][j] > limit)
return -EINVAL;
} else {
if (s->feature_data[i][j] < 0 || s->feature_data[i][j] > limit)
return -EINVAL;
}
}
}
return 0;
}
static int validate_av1_loop_filter(struct v4l2_av1_loop_filter *lf)
{
u32 i;
if (lf->flags > GENMASK(3, 0))
return -EINVAL;
for (i = 0; i < ARRAY_SIZE(lf->level); i++) {
if (lf->level[i] > GENMASK(5, 0))
return -EINVAL;
}
if (lf->sharpness > GENMASK(2, 0))
return -EINVAL;
for (i = 0; i < ARRAY_SIZE(lf->ref_deltas); i++) {
if (lf->ref_deltas[i] < -64 || lf->ref_deltas[i] > 63)
return -EINVAL;
}
for (i = 0; i < ARRAY_SIZE(lf->mode_deltas); i++) {
if (lf->mode_deltas[i] < -64 || lf->mode_deltas[i] > 63)
return -EINVAL;
}
return 0;
}
static int validate_av1_cdef(struct v4l2_av1_cdef *cdef)
{
u32 i;
if (cdef->damping_minus_3 > GENMASK(1, 0) ||
cdef->bits > GENMASK(1, 0))
return -EINVAL;
for (i = 0; i < 1 << cdef->bits; i++) {
if (cdef->y_pri_strength[i] > GENMASK(3, 0) ||
cdef->y_sec_strength[i] > 4 ||
cdef->uv_pri_strength[i] > GENMASK(3, 0) ||
cdef->uv_sec_strength[i] > 4)
return -EINVAL;
}
return 0;
}
static int validate_av1_loop_restauration(struct v4l2_av1_loop_restoration *lr)
{
if (lr->lr_unit_shift > 3 || lr->lr_uv_shift > 1)
return -EINVAL;
return 0;
}
static int validate_av1_film_grain(struct v4l2_ctrl_av1_film_grain *fg)
{
u32 i;
if (fg->flags > GENMASK(4, 0))
return -EINVAL;
if (fg->film_grain_params_ref_idx > GENMASK(2, 0) ||
fg->num_y_points > 14 ||
fg->num_cb_points > 10 ||
fg->num_cr_points > GENMASK(3, 0) ||
fg->grain_scaling_minus_8 > GENMASK(1, 0) ||
fg->ar_coeff_lag > GENMASK(1, 0) ||
fg->ar_coeff_shift_minus_6 > GENMASK(1, 0) ||
fg->grain_scale_shift > GENMASK(1, 0))
return -EINVAL;
if (!(fg->flags & V4L2_AV1_FILM_GRAIN_FLAG_APPLY_GRAIN))
return 0;
for (i = 1; i < fg->num_y_points; i++)
if (fg->point_y_value[i] <= fg->point_y_value[i - 1])
return -EINVAL;
for (i = 1; i < fg->num_cb_points; i++)
if (fg->point_cb_value[i] <= fg->point_cb_value[i - 1])
return -EINVAL;
for (i = 1; i < fg->num_cr_points; i++)
if (fg->point_cr_value[i] <= fg->point_cr_value[i - 1])
return -EINVAL;
return 0;
}
static int validate_av1_frame(struct v4l2_ctrl_av1_frame *f)
{
int ret = 0;
ret = validate_av1_quantization(&f->quantization);
if (ret)
return ret;
ret = validate_av1_segmentation(&f->segmentation);
if (ret)
return ret;
ret = validate_av1_loop_filter(&f->loop_filter);
if (ret)
return ret;
ret = validate_av1_cdef(&f->cdef);
if (ret)
return ret;
ret = validate_av1_loop_restauration(&f->loop_restoration);
if (ret)
return ret;
if (f->flags &
~(V4L2_AV1_FRAME_FLAG_SHOW_FRAME |
V4L2_AV1_FRAME_FLAG_SHOWABLE_FRAME |
V4L2_AV1_FRAME_FLAG_ERROR_RESILIENT_MODE |
V4L2_AV1_FRAME_FLAG_DISABLE_CDF_UPDATE |
V4L2_AV1_FRAME_FLAG_ALLOW_SCREEN_CONTENT_TOOLS |
V4L2_AV1_FRAME_FLAG_FORCE_INTEGER_MV |
V4L2_AV1_FRAME_FLAG_ALLOW_INTRABC |
V4L2_AV1_FRAME_FLAG_USE_SUPERRES |
V4L2_AV1_FRAME_FLAG_ALLOW_HIGH_PRECISION_MV |
V4L2_AV1_FRAME_FLAG_IS_MOTION_MODE_SWITCHABLE |
V4L2_AV1_FRAME_FLAG_USE_REF_FRAME_MVS |
V4L2_AV1_FRAME_FLAG_DISABLE_FRAME_END_UPDATE_CDF |
V4L2_AV1_FRAME_FLAG_ALLOW_WARPED_MOTION |
V4L2_AV1_FRAME_FLAG_REFERENCE_SELECT |
V4L2_AV1_FRAME_FLAG_REDUCED_TX_SET |
V4L2_AV1_FRAME_FLAG_SKIP_MODE_ALLOWED |
V4L2_AV1_FRAME_FLAG_SKIP_MODE_PRESENT |
V4L2_AV1_FRAME_FLAG_FRAME_SIZE_OVERRIDE |
V4L2_AV1_FRAME_FLAG_BUFFER_REMOVAL_TIME_PRESENT |
V4L2_AV1_FRAME_FLAG_FRAME_REFS_SHORT_SIGNALING))
return -EINVAL;
if (f->superres_denom > GENMASK(2, 0) + 9)
return -EINVAL;
return 0;
}
static int validate_av1_sequence(struct v4l2_ctrl_av1_sequence *s)
{
if (s->flags &
~(V4L2_AV1_SEQUENCE_FLAG_STILL_PICTURE |
V4L2_AV1_SEQUENCE_FLAG_USE_128X128_SUPERBLOCK |
V4L2_AV1_SEQUENCE_FLAG_ENABLE_FILTER_INTRA |
V4L2_AV1_SEQUENCE_FLAG_ENABLE_INTRA_EDGE_FILTER |
V4L2_AV1_SEQUENCE_FLAG_ENABLE_INTERINTRA_COMPOUND |
V4L2_AV1_SEQUENCE_FLAG_ENABLE_MASKED_COMPOUND |
V4L2_AV1_SEQUENCE_FLAG_ENABLE_WARPED_MOTION |
V4L2_AV1_SEQUENCE_FLAG_ENABLE_DUAL_FILTER |
V4L2_AV1_SEQUENCE_FLAG_ENABLE_ORDER_HINT |
V4L2_AV1_SEQUENCE_FLAG_ENABLE_JNT_COMP |
V4L2_AV1_SEQUENCE_FLAG_ENABLE_REF_FRAME_MVS |
V4L2_AV1_SEQUENCE_FLAG_ENABLE_SUPERRES |
V4L2_AV1_SEQUENCE_FLAG_ENABLE_CDEF |
V4L2_AV1_SEQUENCE_FLAG_ENABLE_RESTORATION |
V4L2_AV1_SEQUENCE_FLAG_MONO_CHROME |
V4L2_AV1_SEQUENCE_FLAG_COLOR_RANGE |
V4L2_AV1_SEQUENCE_FLAG_SUBSAMPLING_X |
V4L2_AV1_SEQUENCE_FLAG_SUBSAMPLING_Y |
V4L2_AV1_SEQUENCE_FLAG_FILM_GRAIN_PARAMS_PRESENT |
V4L2_AV1_SEQUENCE_FLAG_SEPARATE_UV_DELTA_Q))
return -EINVAL;
if (s->seq_profile == 1 && s->flags & V4L2_AV1_SEQUENCE_FLAG_MONO_CHROME)
return -EINVAL;
/* reserved */
if (s->seq_profile > 2)
return -EINVAL;
/* TODO: PROFILES */
return 0;
}
/*
* Compound controls validation requires setting unused fields/flags to zero
* in order to properly detect unchanged controls with v4l2_ctrl_type_op_equal's
@ -911,6 +1149,14 @@ static int std_validate_compound(const struct v4l2_ctrl *ctrl, u32 idx,
case V4L2_CTRL_TYPE_VP9_FRAME:
return validate_vp9_frame(p);
case V4L2_CTRL_TYPE_AV1_FRAME:
return validate_av1_frame(p);
case V4L2_CTRL_TYPE_AV1_SEQUENCE:
return validate_av1_sequence(p);
case V4L2_CTRL_TYPE_AV1_TILE_GROUP_ENTRY:
break;
case V4L2_CTRL_TYPE_AV1_FILM_GRAIN:
return validate_av1_film_grain(p);
case V4L2_CTRL_TYPE_AREA:
area = p;
@ -1602,6 +1848,18 @@ static struct v4l2_ctrl *v4l2_ctrl_new(struct v4l2_ctrl_handler *hdl,
case V4L2_CTRL_TYPE_VP9_FRAME:
elem_size = sizeof(struct v4l2_ctrl_vp9_frame);
break;
case V4L2_CTRL_TYPE_AV1_SEQUENCE:
elem_size = sizeof(struct v4l2_ctrl_av1_sequence);
break;
case V4L2_CTRL_TYPE_AV1_TILE_GROUP_ENTRY:
elem_size = sizeof(struct v4l2_ctrl_av1_tile_group_entry);
break;
case V4L2_CTRL_TYPE_AV1_FRAME:
elem_size = sizeof(struct v4l2_ctrl_av1_frame);
break;
case V4L2_CTRL_TYPE_AV1_FILM_GRAIN:
elem_size = sizeof(struct v4l2_ctrl_av1_film_grain);
break;
case V4L2_CTRL_TYPE_AREA:
elem_size = sizeof(struct v4l2_area);
break;

View File

@ -499,6 +499,40 @@ const char * const *v4l2_ctrl_get_menu(u32 id)
NULL,
};
static const char * const av1_profile[] = {
"Main",
"High",
"Professional",
NULL,
};
static const char * const av1_level[] = {
"2.0",
"2.1",
"2.2",
"2.3",
"3.0",
"3.1",
"3.2",
"3.3",
"4.0",
"4.1",
"4.2",
"4.3",
"5.0",
"5.1",
"5.2",
"5.3",
"6.0",
"6.1",
"6.2",
"6.3",
"7.0",
"7.1",
"7.2",
"7.3",
NULL,
};
static const char * const hevc_profile[] = {
"Main",
"Main Still Picture",
@ -704,6 +738,10 @@ const char * const *v4l2_ctrl_get_menu(u32 id)
return hevc_tier;
case V4L2_CID_MPEG_VIDEO_HEVC_LOOP_FILTER_MODE:
return hevc_loop_filter_mode;
case V4L2_CID_MPEG_VIDEO_AV1_PROFILE:
return av1_profile;
case V4L2_CID_MPEG_VIDEO_AV1_LEVEL:
return av1_level;
case V4L2_CID_STATELESS_HEVC_DECODE_MODE:
return hevc_decode_mode;
case V4L2_CID_STATELESS_HEVC_START_CODE:
@ -1004,6 +1042,10 @@ const char *v4l2_ctrl_get_name(u32 id)
case V4L2_CID_MPEG_VIDEO_REF_NUMBER_FOR_PFRAMES: return "Reference Frames for a P-Frame";
case V4L2_CID_MPEG_VIDEO_PREPEND_SPSPPS_TO_IDR: return "Prepend SPS and PPS to IDR";
/* AV1 controls */
case V4L2_CID_MPEG_VIDEO_AV1_PROFILE: return "AV1 Profile";
case V4L2_CID_MPEG_VIDEO_AV1_LEVEL: return "AV1 Level";
/* CAMERA controls */
/* Keep the order of the 'case's the same as in v4l2-controls.h! */
case V4L2_CID_CAMERA_CLASS: return "Camera Controls";
@ -1190,6 +1232,10 @@ const char *v4l2_ctrl_get_name(u32 id)
case V4L2_CID_STATELESS_HEVC_DECODE_MODE: return "HEVC Decode Mode";
case V4L2_CID_STATELESS_HEVC_START_CODE: return "HEVC Start Code";
case V4L2_CID_STATELESS_HEVC_ENTRY_POINT_OFFSETS: return "HEVC Entry Point Offsets";
case V4L2_CID_STATELESS_AV1_SEQUENCE: return "AV1 Sequence Parameters";
case V4L2_CID_STATELESS_AV1_TILE_GROUP_ENTRY: return "AV1 Tile Group Entry";
case V4L2_CID_STATELESS_AV1_FRAME: return "AV1 Frame Parameters";
case V4L2_CID_STATELESS_AV1_FILM_GRAIN: return "AV1 Film Grain";
/* Colorimetry controls */
/* Keep the order of the 'case's the same as in v4l2-controls.h! */
@ -1365,6 +1411,8 @@ void v4l2_ctrl_fill(u32 id, const char **name, enum v4l2_ctrl_type *type,
case V4L2_CID_MPEG_VIDEO_HEVC_SIZE_OF_LENGTH_FIELD:
case V4L2_CID_MPEG_VIDEO_HEVC_TIER:
case V4L2_CID_MPEG_VIDEO_HEVC_LOOP_FILTER_MODE:
case V4L2_CID_MPEG_VIDEO_AV1_PROFILE:
case V4L2_CID_MPEG_VIDEO_AV1_LEVEL:
case V4L2_CID_STATELESS_HEVC_DECODE_MODE:
case V4L2_CID_STATELESS_HEVC_START_CODE:
case V4L2_CID_STATELESS_H264_DECODE_MODE:
@ -1531,6 +1579,19 @@ void v4l2_ctrl_fill(u32 id, const char **name, enum v4l2_ctrl_type *type,
case V4L2_CID_STATELESS_VP9_FRAME:
*type = V4L2_CTRL_TYPE_VP9_FRAME;
break;
case V4L2_CID_STATELESS_AV1_SEQUENCE:
*type = V4L2_CTRL_TYPE_AV1_SEQUENCE;
break;
case V4L2_CID_STATELESS_AV1_TILE_GROUP_ENTRY:
*type = V4L2_CTRL_TYPE_AV1_TILE_GROUP_ENTRY;
*flags |= V4L2_CTRL_FLAG_DYNAMIC_ARRAY;
break;
case V4L2_CID_STATELESS_AV1_FRAME:
*type = V4L2_CTRL_TYPE_AV1_FRAME;
break;
case V4L2_CID_STATELESS_AV1_FILM_GRAIN:
*type = V4L2_CTRL_TYPE_AV1_FILM_GRAIN;
break;
case V4L2_CID_UNIT_CELL_SIZE:
*type = V4L2_CTRL_TYPE_AREA;
*flags |= V4L2_CTRL_FLAG_READ_ONLY;

View File

@ -1506,6 +1506,7 @@ static void v4l_fill_fmtdesc(struct v4l2_fmtdesc *fmt)
case V4L2_PIX_FMT_QC08C: descr = "QCOM Compressed 8-bit Format"; break;
case V4L2_PIX_FMT_QC10C: descr = "QCOM Compressed 10-bit Format"; break;
case V4L2_PIX_FMT_AJPG: descr = "Aspeed JPEG"; break;
case V4L2_PIX_FMT_AV1_FRAME: descr = "AV1 Frame"; break;
default:
if (fmt->description[0])
return;

View File

@ -52,6 +52,10 @@ struct video_device;
* @p_hdr10_cll: Pointer to an HDR10 Content Light Level structure.
* @p_hdr10_mastering: Pointer to an HDR10 Mastering Display structure.
* @p_area: Pointer to an area.
* @p_av1_sequence: Pointer to an AV1 sequence structure.
* @p_av1_tile_group_entry: Pointer to an AV1 tile group entry structure.
* @p_av1_frame: Pointer to an AV1 frame structure.
* @p_av1_film_grain: Pointer to an AV1 film grain structure.
* @p: Pointer to a compound value.
* @p_const: Pointer to a constant compound value.
*/
@ -81,6 +85,10 @@ union v4l2_ctrl_ptr {
struct v4l2_ctrl_hdr10_cll_info *p_hdr10_cll;
struct v4l2_ctrl_hdr10_mastering_display *p_hdr10_mastering;
struct v4l2_area *p_area;
struct v4l2_ctrl_av1_sequence *p_av1_sequence;
struct v4l2_ctrl_av1_tile_group_entry *p_av1_tile_group_entry;
struct v4l2_ctrl_av1_frame *p_av1_frame;
struct v4l2_ctrl_av1_film_grain *p_av1_film_grain;
void *p;
const void *p_const;
};

View File

@ -804,6 +804,88 @@ enum v4l2_mpeg_video_frame_skip_mode {
#define V4L2_CID_MPEG_VIDEO_DEC_DISPLAY_DELAY (V4L2_CID_CODEC_BASE + 653)
#define V4L2_CID_MPEG_VIDEO_DEC_DISPLAY_DELAY_ENABLE (V4L2_CID_CODEC_BASE + 654)
#define V4L2_CID_MPEG_VIDEO_AV1_PROFILE (V4L2_CID_CODEC_BASE + 655)
/**
* enum v4l2_mpeg_video_av1_profile - AV1 profiles
*
* @V4L2_MPEG_VIDEO_AV1_PROFILE_MAIN: compliant decoders must be able to decode
* streams with seq_profile equal to 0.
* @V4L2_MPEG_VIDEO_AV1_PROFILE_HIGH: compliant decoders must be able to decode
* streams with seq_profile equal less than or equal to 1.
* @V4L2_MPEG_VIDEO_AV1_PROFILE_PROFESSIONAL: compliant decoders must be able to
* decode streams with seq_profile less than or equal to 2.
*
* Conveys the highest profile a decoder can work with.
*/
enum v4l2_mpeg_video_av1_profile {
V4L2_MPEG_VIDEO_AV1_PROFILE_MAIN = 0,
V4L2_MPEG_VIDEO_AV1_PROFILE_HIGH = 1,
V4L2_MPEG_VIDEO_AV1_PROFILE_PROFESSIONAL = 2,
};
#define V4L2_CID_MPEG_VIDEO_AV1_LEVEL (V4L2_CID_CODEC_BASE + 656)
/**
* enum v4l2_mpeg_video_av1_level - AV1 levels
*
* @V4L2_MPEG_VIDEO_AV1_LEVEL_2_0: Level 2.0.
* @V4L2_MPEG_VIDEO_AV1_LEVEL_2_1: Level 2.1.
* @V4L2_MPEG_VIDEO_AV1_LEVEL_2_2: Level 2.2.
* @V4L2_MPEG_VIDEO_AV1_LEVEL_2_3: Level 2.3.
* @V4L2_MPEG_VIDEO_AV1_LEVEL_3_0: Level 3.0.
* @V4L2_MPEG_VIDEO_AV1_LEVEL_3_1: Level 3.1.
* @V4L2_MPEG_VIDEO_AV1_LEVEL_3_2: Level 3.2.
* @V4L2_MPEG_VIDEO_AV1_LEVEL_3_3: Level 3.3.
* @V4L2_MPEG_VIDEO_AV1_LEVEL_4_0: Level 4.0.
* @V4L2_MPEG_VIDEO_AV1_LEVEL_4_1: Level 4.1.
* @V4L2_MPEG_VIDEO_AV1_LEVEL_4_2: Level 4.2.
* @V4L2_MPEG_VIDEO_AV1_LEVEL_4_3: Level 4.3.
* @V4L2_MPEG_VIDEO_AV1_LEVEL_5_0: Level 5.0.
* @V4L2_MPEG_VIDEO_AV1_LEVEL_5_1: Level 5.1.
* @V4L2_MPEG_VIDEO_AV1_LEVEL_5_2: Level 5.2.
* @V4L2_MPEG_VIDEO_AV1_LEVEL_5_3: Level 5.3.
* @V4L2_MPEG_VIDEO_AV1_LEVEL_6_0: Level 6.0.
* @V4L2_MPEG_VIDEO_AV1_LEVEL_6_1: Level 6.1.
* @V4L2_MPEG_VIDEO_AV1_LEVEL_6_2: Level 6.2.
* @V4L2_MPEG_VIDEO_AV1_LEVEL_6_3: Level 6.3.
* @V4L2_MPEG_VIDEO_AV1_LEVEL_7_0: Level 7.0.
* @V4L2_MPEG_VIDEO_AV1_LEVEL_7_1: Level 7.1.
* @V4L2_MPEG_VIDEO_AV1_LEVEL_7_2: Level 7.2.
* @V4L2_MPEG_VIDEO_AV1_LEVEL_7_3: Level 7.3.
*
* Conveys the highest level a decoder can work with.
*/
enum v4l2_mpeg_video_av1_level {
V4L2_MPEG_VIDEO_AV1_LEVEL_2_0 = 0,
V4L2_MPEG_VIDEO_AV1_LEVEL_2_1 = 1,
V4L2_MPEG_VIDEO_AV1_LEVEL_2_2 = 2,
V4L2_MPEG_VIDEO_AV1_LEVEL_2_3 = 3,
V4L2_MPEG_VIDEO_AV1_LEVEL_3_0 = 4,
V4L2_MPEG_VIDEO_AV1_LEVEL_3_1 = 5,
V4L2_MPEG_VIDEO_AV1_LEVEL_3_2 = 6,
V4L2_MPEG_VIDEO_AV1_LEVEL_3_3 = 7,
V4L2_MPEG_VIDEO_AV1_LEVEL_4_0 = 8,
V4L2_MPEG_VIDEO_AV1_LEVEL_4_1 = 9,
V4L2_MPEG_VIDEO_AV1_LEVEL_4_2 = 10,
V4L2_MPEG_VIDEO_AV1_LEVEL_4_3 = 11,
V4L2_MPEG_VIDEO_AV1_LEVEL_5_0 = 12,
V4L2_MPEG_VIDEO_AV1_LEVEL_5_1 = 13,
V4L2_MPEG_VIDEO_AV1_LEVEL_5_2 = 14,
V4L2_MPEG_VIDEO_AV1_LEVEL_5_3 = 15,
V4L2_MPEG_VIDEO_AV1_LEVEL_6_0 = 16,
V4L2_MPEG_VIDEO_AV1_LEVEL_6_1 = 17,
V4L2_MPEG_VIDEO_AV1_LEVEL_6_2 = 18,
V4L2_MPEG_VIDEO_AV1_LEVEL_6_3 = 19,
V4L2_MPEG_VIDEO_AV1_LEVEL_7_0 = 20,
V4L2_MPEG_VIDEO_AV1_LEVEL_7_1 = 21,
V4L2_MPEG_VIDEO_AV1_LEVEL_7_2 = 22,
V4L2_MPEG_VIDEO_AV1_LEVEL_7_3 = 23
};
/* MPEG-class control IDs specific to the CX2341x driver as defined by V4L2 */
#define V4L2_CID_CODEC_CX2341X_BASE (V4L2_CTRL_CLASS_CODEC | 0x1000)
#define V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE (V4L2_CID_CODEC_CX2341X_BASE+0)
@ -2758,6 +2840,645 @@ struct v4l2_ctrl_vp9_compressed_hdr {
struct v4l2_vp9_mv_probs mv;
};
/* Stateless AV1 controls */
#define V4L2_AV1_TOTAL_REFS_PER_FRAME 8
#define V4L2_AV1_CDEF_MAX 8
#define V4L2_AV1_NUM_PLANES_MAX 3 /* 1 if monochrome, 3 otherwise */
#define V4L2_AV1_MAX_SEGMENTS 8
#define V4L2_AV1_MAX_OPERATING_POINTS (1 << 5) /* 5 bits to encode */
#define V4L2_AV1_REFS_PER_FRAME 7
#define V4L2_AV1_MAX_NUM_Y_POINTS (1 << 4) /* 4 bits to encode */
#define V4L2_AV1_MAX_NUM_CB_POINTS (1 << 4) /* 4 bits to encode */
#define V4L2_AV1_MAX_NUM_CR_POINTS (1 << 4) /* 4 bits to encode */
#define V4L2_AV1_AR_COEFFS_SIZE 25 /* (2 * 3 * (3 + 1)) + 1 */
#define V4L2_AV1_MAX_NUM_PLANES 3
#define V4L2_AV1_MAX_TILE_COLS 64
#define V4L2_AV1_MAX_TILE_ROWS 64
#define V4L2_AV1_MAX_TILE_COUNT 512
#define V4L2_AV1_SEQUENCE_FLAG_STILL_PICTURE 0x00000001
#define V4L2_AV1_SEQUENCE_FLAG_USE_128X128_SUPERBLOCK 0x00000002
#define V4L2_AV1_SEQUENCE_FLAG_ENABLE_FILTER_INTRA 0x00000004
#define V4L2_AV1_SEQUENCE_FLAG_ENABLE_INTRA_EDGE_FILTER 0x00000008
#define V4L2_AV1_SEQUENCE_FLAG_ENABLE_INTERINTRA_COMPOUND 0x00000010
#define V4L2_AV1_SEQUENCE_FLAG_ENABLE_MASKED_COMPOUND 0x00000020
#define V4L2_AV1_SEQUENCE_FLAG_ENABLE_WARPED_MOTION 0x00000040
#define V4L2_AV1_SEQUENCE_FLAG_ENABLE_DUAL_FILTER 0x00000080
#define V4L2_AV1_SEQUENCE_FLAG_ENABLE_ORDER_HINT 0x00000100
#define V4L2_AV1_SEQUENCE_FLAG_ENABLE_JNT_COMP 0x00000200
#define V4L2_AV1_SEQUENCE_FLAG_ENABLE_REF_FRAME_MVS 0x00000400
#define V4L2_AV1_SEQUENCE_FLAG_ENABLE_SUPERRES 0x00000800
#define V4L2_AV1_SEQUENCE_FLAG_ENABLE_CDEF 0x00001000
#define V4L2_AV1_SEQUENCE_FLAG_ENABLE_RESTORATION 0x00002000
#define V4L2_AV1_SEQUENCE_FLAG_MONO_CHROME 0x00004000
#define V4L2_AV1_SEQUENCE_FLAG_COLOR_RANGE 0x00008000
#define V4L2_AV1_SEQUENCE_FLAG_SUBSAMPLING_X 0x00010000
#define V4L2_AV1_SEQUENCE_FLAG_SUBSAMPLING_Y 0x00020000
#define V4L2_AV1_SEQUENCE_FLAG_FILM_GRAIN_PARAMS_PRESENT 0x00040000
#define V4L2_AV1_SEQUENCE_FLAG_SEPARATE_UV_DELTA_Q 0x00080000
#define V4L2_CID_STATELESS_AV1_SEQUENCE (V4L2_CID_CODEC_STATELESS_BASE + 500)
/**
* struct v4l2_ctrl_av1_sequence - AV1 Sequence
*
* Represents an AV1 Sequence OBU. See section 5.5 "Sequence header OBU syntax"
* for more details.
*
* @flags: See V4L2_AV1_SEQUENCE_FLAG_{}.
* @seq_profile: specifies the features that can be used in the coded video
* sequence.
* @order_hint_bits: specifies the number of bits used for the order_hint field
* at each frame.
* @bit_depth: the bitdepth to use for the sequence as described in section
* 5.5.2 "Color config syntax".
* @reserved: padding field. Should be zeroed by applications.
* @max_frame_width_minus_1: specifies the maximum frame width minus 1 for the
* frames represented by this sequence header.
* @max_frame_height_minus_1: specifies the maximum frame height minus 1 for the
* frames represented by this sequence header.
*/
struct v4l2_ctrl_av1_sequence {
__u32 flags;
__u8 seq_profile;
__u8 order_hint_bits;
__u8 bit_depth;
__u8 reserved;
__u16 max_frame_width_minus_1;
__u16 max_frame_height_minus_1;
};
#define V4L2_CID_STATELESS_AV1_TILE_GROUP_ENTRY (V4L2_CID_CODEC_STATELESS_BASE + 501)
/**
* struct v4l2_ctrl_av1_tile_group_entry - AV1 Tile Group entry
*
* Represents a single AV1 tile inside an AV1 Tile Group. Note that MiRowStart,
* MiRowEnd, MiColStart and MiColEnd can be retrieved from struct
* v4l2_av1_tile_info in struct v4l2_ctrl_av1_frame using tile_row and
* tile_col. See section 6.10.1 "General tile group OBU semantics" for more
* details.
*
* @tile_offset: offset from the OBU data, i.e. where the coded tile data
* actually starts.
* @tile_size: specifies the size in bytes of the coded tile. Equivalent to
* "TileSize" in the AV1 Specification.
* @tile_row: specifies the row of the current tile. Equivalent to "TileRow" in
* the AV1 Specification.
* @tile_col: specifies the col of the current tile. Equivalent to "TileCol" in
* the AV1 Specification.
*/
struct v4l2_ctrl_av1_tile_group_entry {
__u32 tile_offset;
__u32 tile_size;
__u32 tile_row;
__u32 tile_col;
};
/**
* enum v4l2_av1_warp_model - AV1 Warp Model as described in section 3
* "Symbols and abbreviated terms" of the AV1 Specification.
*
* @V4L2_AV1_WARP_MODEL_IDENTITY: Warp model is just an identity transform.
* @V4L2_AV1_WARP_MODEL_TRANSLATION: Warp model is a pure translation.
* @V4L2_AV1_WARP_MODEL_ROTZOOM: Warp model is a rotation + symmetric zoom +
* translation.
* @V4L2_AV1_WARP_MODEL_AFFINE: Warp model is a general affine transform.
*/
enum v4l2_av1_warp_model {
V4L2_AV1_WARP_MODEL_IDENTITY = 0,
V4L2_AV1_WARP_MODEL_TRANSLATION = 1,
V4L2_AV1_WARP_MODEL_ROTZOOM = 2,
V4L2_AV1_WARP_MODEL_AFFINE = 3,
};
/**
* enum v4l2_av1_reference_frame - AV1 reference frames
*
* @V4L2_AV1_REF_INTRA_FRAME: Intra Frame Reference
* @V4L2_AV1_REF_LAST_FRAME: Last Reference Frame
* @V4L2_AV1_REF_LAST2_FRAME: Last2 Reference Frame
* @V4L2_AV1_REF_LAST3_FRAME: Last3 Reference Frame
* @V4L2_AV1_REF_GOLDEN_FRAME: Golden Reference Frame
* @V4L2_AV1_REF_BWDREF_FRAME: BWD Reference Frame
* @V4L2_AV1_REF_ALTREF2_FRAME: Alternative2 Reference Frame
* @V4L2_AV1_REF_ALTREF_FRAME: Alternative Reference Frame
*/
enum v4l2_av1_reference_frame {
V4L2_AV1_REF_INTRA_FRAME = 0,
V4L2_AV1_REF_LAST_FRAME = 1,
V4L2_AV1_REF_LAST2_FRAME = 2,
V4L2_AV1_REF_LAST3_FRAME = 3,
V4L2_AV1_REF_GOLDEN_FRAME = 4,
V4L2_AV1_REF_BWDREF_FRAME = 5,
V4L2_AV1_REF_ALTREF2_FRAME = 6,
V4L2_AV1_REF_ALTREF_FRAME = 7,
};
#define V4L2_AV1_GLOBAL_MOTION_IS_INVALID(ref) (1 << (ref))
#define V4L2_AV1_GLOBAL_MOTION_FLAG_IS_GLOBAL 0x1
#define V4L2_AV1_GLOBAL_MOTION_FLAG_IS_ROT_ZOOM 0x2
#define V4L2_AV1_GLOBAL_MOTION_FLAG_IS_TRANSLATION 0x4
/**
* struct v4l2_av1_global_motion - AV1 Global Motion parameters as described in
* section 6.8.17 "Global motion params semantics" of the AV1 specification.
*
* @flags: A bitfield containing the flags per reference frame. See
* V4L2_AV1_GLOBAL_MOTION_FLAG_{}
* @type: The type of global motion transform used.
* @params: this field has the same meaning as "gm_params" in the AV1
* specification.
* @invalid: bitfield indicating whether the global motion params are invalid
* for a given reference frame. See section 7.11.3.6 Setup shear process and
* the variable "warpValid". Use V4L2_AV1_GLOBAL_MOTION_IS_INVALID(ref) to
* create a suitable mask.
* @reserved: padding field. Should be zeroed by applications.
*/
struct v4l2_av1_global_motion {
__u8 flags[V4L2_AV1_TOTAL_REFS_PER_FRAME];
enum v4l2_av1_warp_model type[V4L2_AV1_TOTAL_REFS_PER_FRAME];
__s32 params[V4L2_AV1_TOTAL_REFS_PER_FRAME][6];
__u8 invalid;
__u8 reserved[3];
};
/**
* enum v4l2_av1_frame_restoration_type - AV1 Frame Restoration Type
* @V4L2_AV1_FRAME_RESTORE_NONE: no filtering is applied.
* @V4L2_AV1_FRAME_RESTORE_WIENER: Wiener filter process is invoked.
* @V4L2_AV1_FRAME_RESTORE_SGRPROJ: self guided filter process is invoked.
* @V4L2_AV1_FRAME_RESTORE_SWITCHABLE: restoration filter is swichtable.
*/
enum v4l2_av1_frame_restoration_type {
V4L2_AV1_FRAME_RESTORE_NONE = 0,
V4L2_AV1_FRAME_RESTORE_WIENER = 1,
V4L2_AV1_FRAME_RESTORE_SGRPROJ = 2,
V4L2_AV1_FRAME_RESTORE_SWITCHABLE = 3,
};
#define V4L2_AV1_LOOP_RESTORATION_FLAG_USES_LR 0x1
#define V4L2_AV1_LOOP_RESTORATION_FLAG_USES_CHROMA_LR 0x2
/**
* struct v4l2_av1_loop_restoration - AV1 Loop Restauration as described in
* section 6.10.15 "Loop restoration params semantics" of the AV1 specification.
*
* @flags: See V4L2_AV1_LOOP_RESTORATION_FLAG_{}.
* @lr_unit_shift: specifies if the luma restoration size should be halved.
* @lr_uv_shift: specifies if the chroma size should be half the luma size.
* @reserved: padding field. Should be zeroed by applications.
* @frame_restoration_type: specifies the type of restoration used for each
* plane. See enum v4l2_av1_frame_restoration_type.
* @loop_restoration_size: specifies the size of loop restoration units in units
* of samples in the current plane.
*/
struct v4l2_av1_loop_restoration {
__u8 flags;
__u8 lr_unit_shift;
__u8 lr_uv_shift;
__u8 reserved;
enum v4l2_av1_frame_restoration_type frame_restoration_type[V4L2_AV1_NUM_PLANES_MAX];
__u32 loop_restoration_size[V4L2_AV1_MAX_NUM_PLANES];
};
/**
* struct v4l2_av1_cdef - AV1 CDEF params semantics as described in section
* 6.10.14 "CDEF params semantics" of the AV1 specification
*
* @damping_minus_3: controls the amount of damping in the deringing filter.
* @bits: specifies the number of bits needed to specify which CDEF filter to
* apply.
* @y_pri_strength: specifies the strength of the primary filter.
* @y_sec_strength: specifies the strength of the secondary filter.
* @uv_pri_strength: specifies the strength of the primary filter.
* @uv_sec_strength: specifies the strength of the secondary filter.
*/
struct v4l2_av1_cdef {
__u8 damping_minus_3;
__u8 bits;
__u8 y_pri_strength[V4L2_AV1_CDEF_MAX];
__u8 y_sec_strength[V4L2_AV1_CDEF_MAX];
__u8 uv_pri_strength[V4L2_AV1_CDEF_MAX];
__u8 uv_sec_strength[V4L2_AV1_CDEF_MAX];
};
#define V4L2_AV1_SEGMENTATION_FLAG_ENABLED 0x1
#define V4L2_AV1_SEGMENTATION_FLAG_UPDATE_MAP 0x2
#define V4L2_AV1_SEGMENTATION_FLAG_TEMPORAL_UPDATE 0x4
#define V4L2_AV1_SEGMENTATION_FLAG_UPDATE_DATA 0x8
#define V4L2_AV1_SEGMENTATION_FLAG_SEG_ID_PRE_SKIP 0x10
/**
* enum v4l2_av1_segment_feature - AV1 segment features as described in section
* 3 "Symbols and abbreviated terms" of the AV1 specification.
*
* @V4L2_AV1_SEG_LVL_ALT_Q: Index for quantizer segment feature.
* @V4L2_AV1_SEG_LVL_ALT_LF_Y_V: Index for vertical luma loop filter segment
* feature.
* @V4L2_AV1_SEG_LVL_REF_FRAME: Index for reference frame segment feature.
* @V4L2_AV1_SEG_LVL_REF_SKIP: Index for skip segment feature.
* @V4L2_AV1_SEG_LVL_REF_GLOBALMV: Index for global mv feature.
* @V4L2_AV1_SEG_LVL_MAX: Number of segment features.
*/
enum v4l2_av1_segment_feature {
V4L2_AV1_SEG_LVL_ALT_Q = 0,
V4L2_AV1_SEG_LVL_ALT_LF_Y_V = 1,
V4L2_AV1_SEG_LVL_REF_FRAME = 5,
V4L2_AV1_SEG_LVL_REF_SKIP = 6,
V4L2_AV1_SEG_LVL_REF_GLOBALMV = 7,
V4L2_AV1_SEG_LVL_MAX = 8
};
#define V4L2_AV1_SEGMENT_FEATURE_ENABLED(id) (1 << (id))
/**
* struct v4l2_av1_segmentation - AV1 Segmentation params as defined in section
* 6.8.13 "Segmentation params semantics" of the AV1 specification.
*
* @flags: see V4L2_AV1_SEGMENTATION_FLAG_{}.
* @last_active_seg_id: indicates the highest numbered segment id that has some
* enabled feature. This is used when decoding the segment id to only decode
* choices corresponding to used segments.
* @feature_enabled: bitmask defining which features are enabled in each
* segment. Use V4L2_AV1_SEGMENT_FEATURE_ENABLED to build a suitable mask.
* @feature_data: data attached to each feature. Data entry is only valid if the
* feature is enabled
*/
struct v4l2_av1_segmentation {
__u8 flags;
__u8 last_active_seg_id;
__u8 feature_enabled[V4L2_AV1_MAX_SEGMENTS];
__s16 feature_data[V4L2_AV1_MAX_SEGMENTS][V4L2_AV1_SEG_LVL_MAX];
};
#define V4L2_AV1_LOOP_FILTER_FLAG_DELTA_ENABLED 0x1
#define V4L2_AV1_LOOP_FILTER_FLAG_DELTA_UPDATE 0x2
#define V4L2_AV1_LOOP_FILTER_FLAG_DELTA_LF_PRESENT 0x4
#define V4L2_AV1_LOOP_FILTER_FLAG_DELTA_LF_MULTI 0x8
/**
* struct v4l2_av1_loop_filter - AV1 Loop filter params as defined in section
* 6.8.10 "Loop filter semantics" and 6.8.16 "Loop filter delta parameters
* semantics" of the AV1 specification.
*
* @flags: see V4L2_AV1_LOOP_FILTER_FLAG_{}
* @level: an array containing loop filter strength values. Different loop
* filter strength values from the array are used depending on the image plane
* being filtered, and the edge direction (vertical or horizontal) being
* filtered.
* @sharpness: indicates the sharpness level. The loop_filter_level and
* loop_filter_sharpness together determine when a block edge is filtered, and
* by how much the filtering can change the sample values. The loop filter
* process is described in section 7.14 of the AV1 specification.
* @ref_deltas: contains the adjustment needed for the filter level based on the
* chosen reference frame. If this syntax element is not present, it maintains
* its previous value.
* @mode_deltas: contains the adjustment needed for the filter level based on
* the chosen mode. If this syntax element is not present, it maintains its
* previous value.
* @delta_lf_res: specifies the left shift which should be applied to decoded
* loop filter delta values.
*/
struct v4l2_av1_loop_filter {
__u8 flags;
__u8 level[4];
__u8 sharpness;
__s8 ref_deltas[V4L2_AV1_TOTAL_REFS_PER_FRAME];
__s8 mode_deltas[2];
__u8 delta_lf_res;
};
#define V4L2_AV1_QUANTIZATION_FLAG_DIFF_UV_DELTA 0x1
#define V4L2_AV1_QUANTIZATION_FLAG_USING_QMATRIX 0x2
#define V4L2_AV1_QUANTIZATION_FLAG_DELTA_Q_PRESENT 0x4
/**
* struct v4l2_av1_quantization - AV1 Quantization params as defined in section
* 6.8.11 "Quantization params semantics" of the AV1 specification.
*
* @flags: see V4L2_AV1_QUANTIZATION_FLAG_{}
* @base_q_idx: indicates the base frame qindex. This is used for Y AC
* coefficients and as the base value for the other quantizers.
* @delta_q_y_dc: indicates the Y DC quantizer relative to base_q_idx.
* @delta_q_u_dc: indicates the U DC quantizer relative to base_q_idx.
* @delta_q_u_ac: indicates the U AC quantizer relative to base_q_idx.
* @delta_q_v_dc: indicates the V DC quantizer relative to base_q_idx.
* @delta_q_v_ac: indicates the V AC quantizer relative to base_q_idx.
* @qm_y: specifies the level in the quantizer matrix that should be used for
* luma plane decoding.
* @qm_u: specifies the level in the quantizer matrix that should be used for
* chroma U plane decoding.
* @qm_v: specifies the level in the quantizer matrix that should be used for
* chroma V plane decoding.
* @delta_q_res: specifies the left shift which should be applied to decoded
* quantizer index delta values.
*/
struct v4l2_av1_quantization {
__u8 flags;
__u8 base_q_idx;
__s8 delta_q_y_dc;
__s8 delta_q_u_dc;
__s8 delta_q_u_ac;
__s8 delta_q_v_dc;
__s8 delta_q_v_ac;
__u8 qm_y;
__u8 qm_u;
__u8 qm_v;
__u8 delta_q_res;
};
#define V4L2_AV1_TILE_INFO_FLAG_UNIFORM_TILE_SPACING 0x1
/**
* struct v4l2_av1_tile_info - AV1 Tile info as defined in section 6.8.14 "Tile
* info semantics" of the AV1 specification.
*
* @flags: see V4L2_AV1_TILE_INFO_FLAG_{}
* @context_update_tile_id: specifies which tile to use for the CDF update.
* @tile_rows: specifies the number of tiles down the frame.
* @tile_cols: specifies the number of tiles across the frame.
* @mi_col_starts: an array specifying the start column (in units of 4x4 luma
* samples) for each tile across the image.
* @mi_row_starts: an array specifying the start row (in units of 4x4 luma
* samples) for each tile down the image.
* @width_in_sbs_minus_1: specifies the width of a tile minus 1 in units of
* superblocks.
* @height_in_sbs_minus_1: specifies the height of a tile minus 1 in units of
* superblocks.
* @tile_size_bytes: specifies the number of bytes needed to code each tile
* size.
* @reserved: padding field. Should be zeroed by applications.
*/
struct v4l2_av1_tile_info {
__u8 flags;
__u8 context_update_tile_id;
__u8 tile_cols;
__u8 tile_rows;
__u32 mi_col_starts[V4L2_AV1_MAX_TILE_COLS + 1];
__u32 mi_row_starts[V4L2_AV1_MAX_TILE_ROWS + 1];
__u32 width_in_sbs_minus_1[V4L2_AV1_MAX_TILE_COLS];
__u32 height_in_sbs_minus_1[V4L2_AV1_MAX_TILE_ROWS];
__u8 tile_size_bytes;
__u8 reserved[3];
};
/**
* enum v4l2_av1_frame_type - AV1 Frame Type
*
* @V4L2_AV1_KEY_FRAME: Key frame
* @V4L2_AV1_INTER_FRAME: Inter frame
* @V4L2_AV1_INTRA_ONLY_FRAME: Intra-only frame
* @V4L2_AV1_SWITCH_FRAME: Switch frame
*/
enum v4l2_av1_frame_type {
V4L2_AV1_KEY_FRAME = 0,
V4L2_AV1_INTER_FRAME = 1,
V4L2_AV1_INTRA_ONLY_FRAME = 2,
V4L2_AV1_SWITCH_FRAME = 3
};
/**
* enum v4l2_av1_interpolation_filter - AV1 interpolation filter types
*
* @V4L2_AV1_INTERPOLATION_FILTER_EIGHTTAP: eight tap filter
* @V4L2_AV1_INTERPOLATION_FILTER_EIGHTTAP_SMOOTH: eight tap smooth filter
* @V4L2_AV1_INTERPOLATION_FILTER_EIGHTTAP_SHARP: eight tap sharp filter
* @V4L2_AV1_INTERPOLATION_FILTER_BILINEAR: bilinear filter
* @V4L2_AV1_INTERPOLATION_FILTER_SWITCHABLE: filter selection is signaled at
* the block level
*
* See section 6.8.9 "Interpolation filter semantics" of the AV1 specification
* for more details.
*/
enum v4l2_av1_interpolation_filter {
V4L2_AV1_INTERPOLATION_FILTER_EIGHTTAP = 0,
V4L2_AV1_INTERPOLATION_FILTER_EIGHTTAP_SMOOTH = 1,
V4L2_AV1_INTERPOLATION_FILTER_EIGHTTAP_SHARP = 2,
V4L2_AV1_INTERPOLATION_FILTER_BILINEAR = 3,
V4L2_AV1_INTERPOLATION_FILTER_SWITCHABLE = 4,
};
/**
* enum v4l2_av1_tx_mode - AV1 Tx mode as described in section 6.8.21 "TX mode
* semantics" of the AV1 specification.
* @V4L2_AV1_TX_MODE_ONLY_4X4: the inverse transform will use only 4x4
* transforms
* @V4L2_AV1_TX_MODE_LARGEST: the inverse transform will use the largest
* transform size that fits inside the block
* @V4L2_AV1_TX_MODE_SELECT: the choice of transform size is specified
* explicitly for each block.
*/
enum v4l2_av1_tx_mode {
V4L2_AV1_TX_MODE_ONLY_4X4 = 0,
V4L2_AV1_TX_MODE_LARGEST = 1,
V4L2_AV1_TX_MODE_SELECT = 2
};
#define V4L2_AV1_FRAME_FLAG_SHOW_FRAME 0x00000001
#define V4L2_AV1_FRAME_FLAG_SHOWABLE_FRAME 0x00000002
#define V4L2_AV1_FRAME_FLAG_ERROR_RESILIENT_MODE 0x00000004
#define V4L2_AV1_FRAME_FLAG_DISABLE_CDF_UPDATE 0x00000008
#define V4L2_AV1_FRAME_FLAG_ALLOW_SCREEN_CONTENT_TOOLS 0x00000010
#define V4L2_AV1_FRAME_FLAG_FORCE_INTEGER_MV 0x00000020
#define V4L2_AV1_FRAME_FLAG_ALLOW_INTRABC 0x00000040
#define V4L2_AV1_FRAME_FLAG_USE_SUPERRES 0x00000080
#define V4L2_AV1_FRAME_FLAG_ALLOW_HIGH_PRECISION_MV 0x00000100
#define V4L2_AV1_FRAME_FLAG_IS_MOTION_MODE_SWITCHABLE 0x00000200
#define V4L2_AV1_FRAME_FLAG_USE_REF_FRAME_MVS 0x00000400
#define V4L2_AV1_FRAME_FLAG_DISABLE_FRAME_END_UPDATE_CDF 0x00000800
#define V4L2_AV1_FRAME_FLAG_ALLOW_WARPED_MOTION 0x00001000
#define V4L2_AV1_FRAME_FLAG_REFERENCE_SELECT 0x00002000
#define V4L2_AV1_FRAME_FLAG_REDUCED_TX_SET 0x00004000
#define V4L2_AV1_FRAME_FLAG_SKIP_MODE_ALLOWED 0x00008000
#define V4L2_AV1_FRAME_FLAG_SKIP_MODE_PRESENT 0x00010000
#define V4L2_AV1_FRAME_FLAG_FRAME_SIZE_OVERRIDE 0x00020000
#define V4L2_AV1_FRAME_FLAG_BUFFER_REMOVAL_TIME_PRESENT 0x00040000
#define V4L2_AV1_FRAME_FLAG_FRAME_REFS_SHORT_SIGNALING 0x00080000
#define V4L2_CID_STATELESS_AV1_FRAME (V4L2_CID_CODEC_STATELESS_BASE + 502)
/**
* struct v4l2_ctrl_av1_frame - Represents an AV1 Frame Header OBU.
*
* @tile_info: tile info
* @quantization: quantization params
* @segmentation: segmentation params
* @superres_denom: the denominator for the upscaling ratio.
* @loop_filter: loop filter params
* @cdef: cdef params
* @skip_mode_frame: specifies the frames to use for compound prediction when
* skip_mode is equal to 1.
* @primary_ref_frame: specifies which reference frame contains the CDF values
* and other state that should be loaded at the start of the frame.
* @loop_restoration: loop restoration params
* @global_motion: global motion params
* @flags: see V4L2_AV1_FRAME_FLAG_{}
* @frame_type: specifies the AV1 frame type
* @order_hint: specifies OrderHintBits least significant bits of the expected
* output order for this frame.
* @upscaled_width: the upscaled width.
* @interpolation_filter: specifies the filter selection used for performing
* inter prediction.
* @tx_mode: specifies how the transform size is determined.
* @frame_width_minus_1: add 1 to get the frame's width.
* @frame_height_minus_1: add 1 to get the frame's height
* @render_width_minus_1: add 1 to get the render width of the frame in luma
* samples.
* @render_height_minus_1: add 1 to get the render height of the frame in luma
* samples.
* @current_frame_id: specifies the frame id number for the current frame. Frame
* id numbers are additional information that do not affect the decoding
* process, but provide decoders with a way of detecting missing reference
* frames so that appropriate action can be taken.
* @buffer_removal_time: specifies the frame removal time in units of DecCT clock
* ticks counted from the removal time of the last random access point for
* operating point opNum.
* @reserved: padding field. Should be zeroed by applications.
* @order_hints: specifies the expected output order hint for each reference
* frame. This field corresponds to the OrderHints variable from the
* specification (section 5.9.2 "Uncompressed header syntax"). As such, this is
* only used for non-intra frames and ignored otherwise. order_hints[0] is
* always ignored.
* @reference_frame_ts: the V4L2 timestamp of the reference frame slots.
* @ref_frame_idx: used to index into @reference_frame_ts when decoding
* inter-frames. The meaning of this array is the same as in the specification.
* The timestamp refers to the timestamp field in struct v4l2_buffer. Use
* v4l2_timeval_to_ns() to convert the struct timeval to a __u64.
* @refresh_frame_flags: contains a bitmask that specifies which reference frame
* slots will be updated with the current frame after it is decoded.
*/
struct v4l2_ctrl_av1_frame {
struct v4l2_av1_tile_info tile_info;
struct v4l2_av1_quantization quantization;
__u8 superres_denom;
struct v4l2_av1_segmentation segmentation;
struct v4l2_av1_loop_filter loop_filter;
struct v4l2_av1_cdef cdef;
__u8 skip_mode_frame[2];
__u8 primary_ref_frame;
struct v4l2_av1_loop_restoration loop_restoration;
struct v4l2_av1_global_motion global_motion;
__u32 flags;
enum v4l2_av1_frame_type frame_type;
__u32 order_hint;
__u32 upscaled_width;
enum v4l2_av1_interpolation_filter interpolation_filter;
enum v4l2_av1_tx_mode tx_mode;
__u32 frame_width_minus_1;
__u32 frame_height_minus_1;
__u16 render_width_minus_1;
__u16 render_height_minus_1;
__u32 current_frame_id;
__u32 buffer_removal_time[V4L2_AV1_MAX_OPERATING_POINTS];
__u8 reserved[4];
__u32 order_hints[V4L2_AV1_TOTAL_REFS_PER_FRAME];
__u64 reference_frame_ts[V4L2_AV1_TOTAL_REFS_PER_FRAME];
__s8 ref_frame_idx[V4L2_AV1_REFS_PER_FRAME];
__u8 refresh_frame_flags;
};
#define V4L2_AV1_FILM_GRAIN_FLAG_APPLY_GRAIN 0x1
#define V4L2_AV1_FILM_GRAIN_FLAG_UPDATE_GRAIN 0x2
#define V4L2_AV1_FILM_GRAIN_FLAG_CHROMA_SCALING_FROM_LUMA 0x4
#define V4L2_AV1_FILM_GRAIN_FLAG_OVERLAP 0x8
#define V4L2_AV1_FILM_GRAIN_FLAG_CLIP_TO_RESTRICTED_RANGE 0x10
#define V4L2_CID_STATELESS_AV1_FILM_GRAIN (V4L2_CID_CODEC_STATELESS_BASE + 505)
/**
* struct v4l2_ctrl_av1_film_grain - AV1 Film Grain parameters.
*
* Film grain parameters as specified by section 6.8.20 of the AV1 Specification.
*
* @flags: see V4L2_AV1_FILM_GRAIN_{}.
* @cr_mult: represents a multiplier for the cr component used in derivation of
* the input index to the cr component scaling function.
* @grain_seed: specifies the starting value for the pseudo-random numbers used
* during film grain synthesis.
* @film_grain_params_ref_idx: indicates which reference frame contains the
* film grain parameters to be used for this frame.
* @num_y_points: specifies the number of points for the piece-wise linear
* scaling function of the luma component.
* @point_y_value: represents the x (luma value) coordinate for the i-th point
* of the piecewise linear scaling function for luma component. The values are
* signaled on the scale of 0..255. In case of 10 bit video, these values
* correspond to luma values divided by 4. In case of 12 bit video, these values
* correspond to luma values divided by 16.
* @point_y_scaling: represents the scaling (output) value for the i-th point
* of the piecewise linear scaling function for luma component.
* @num_cb_points: specifies the number of points for the piece-wise linear
* scaling function of the cb component.
* @point_cb_value: represents the x coordinate for the i-th point of the
* piece-wise linear scaling function for cb component. The values are signaled
* on the scale of 0..255.
* @point_cb_scaling: represents the scaling (output) value for the i-th point
* of the piecewise linear scaling function for cb component.
* @num_cr_points: specifies represents the number of points for the piece-wise
* linear scaling function of the cr component.
* @point_cr_value: represents the x coordinate for the i-th point of the
* piece-wise linear scaling function for cr component. The values are signaled
* on the scale of 0..255.
* @point_cr_scaling: represents the scaling (output) value for the i-th point
* of the piecewise linear scaling function for cr component.
* @grain_scaling_minus_8: represents the shift 8 applied to the values of the
* chroma component. The grain_scaling_minus_8 can take values of 0..3 and
* determines the range and quantization step of the standard deviation of film
* grain.
* @ar_coeff_lag: specifies the number of auto-regressive coefficients for luma
* and chroma.
* @ar_coeffs_y_plus_128: specifies auto-regressive coefficients used for the Y
* plane.
* @ar_coeffs_cb_plus_128: specifies auto-regressive coefficients used for the U
* plane.
* @ar_coeffs_cr_plus_128: specifies auto-regressive coefficients used for the V
* plane.
* @ar_coeff_shift_minus_6: specifies the range of the auto-regressive
* coefficients. Values of 0, 1, 2, and 3 correspond to the ranges for
* auto-regressive coefficients of [-2, 2), [-1, 1), [-0.5, 0.5) and [-0.25,
* 0.25) respectively.
* @grain_scale_shift: specifies how much the Gaussian random numbers should be
* scaled down during the grain synthesis process.
* @cb_mult: represents a multiplier for the cb component used in derivation of
* the input index to the cb component scaling function.
* @cb_luma_mult: represents a multiplier for the average luma component used in
* derivation of the input index to the cb component scaling function.
* @cr_luma_mult: represents a multiplier for the average luma component used in
* derivation of the input index to the cr component scaling function.
* @cb_offset: represents an offset used in derivation of the input index to the
* cb component scaling function.
* @cr_offset: represents an offset used in derivation of the input index to the
* cr component scaling function.
* @reserved: padding field. Should be zeroed by applications.
*/
struct v4l2_ctrl_av1_film_grain {
__u8 flags;
__u8 cr_mult;
__u16 grain_seed;
__u8 film_grain_params_ref_idx;
__u8 num_y_points;
__u8 point_y_value[V4L2_AV1_MAX_NUM_Y_POINTS];
__u8 point_y_scaling[V4L2_AV1_MAX_NUM_Y_POINTS];
__u8 num_cb_points;
__u8 point_cb_value[V4L2_AV1_MAX_NUM_CB_POINTS];
__u8 point_cb_scaling[V4L2_AV1_MAX_NUM_CB_POINTS];
__u8 num_cr_points;
__u8 point_cr_value[V4L2_AV1_MAX_NUM_CR_POINTS];
__u8 point_cr_scaling[V4L2_AV1_MAX_NUM_CR_POINTS];
__u8 grain_scaling_minus_8;
__u8 ar_coeff_lag;
__u8 ar_coeffs_y_plus_128[V4L2_AV1_AR_COEFFS_SIZE];
__u8 ar_coeffs_cb_plus_128[V4L2_AV1_AR_COEFFS_SIZE];
__u8 ar_coeffs_cr_plus_128[V4L2_AV1_AR_COEFFS_SIZE];
__u8 ar_coeff_shift_minus_6;
__u8 grain_scale_shift;
__u8 cb_mult;
__u8 cb_luma_mult;
__u8 cr_luma_mult;
__u16 cb_offset;
__u16 cr_offset;
__u8 reserved[4];
};
/* MPEG-compression definitions kept for backwards compatibility */
#ifndef __KERNEL__
#define V4L2_CTRL_CLASS_MPEG V4L2_CTRL_CLASS_CODEC

View File

@ -758,6 +758,7 @@ struct v4l2_pix_format {
#define V4L2_PIX_FMT_FWHT_STATELESS v4l2_fourcc('S', 'F', 'W', 'H') /* Stateless FWHT (vicodec) */
#define V4L2_PIX_FMT_H264_SLICE v4l2_fourcc('S', '2', '6', '4') /* H264 parsed slices */
#define V4L2_PIX_FMT_HEVC_SLICE v4l2_fourcc('S', '2', '6', '5') /* HEVC parsed slices */
#define V4L2_PIX_FMT_AV1_FRAME v4l2_fourcc('A', 'V', '1', 'F') /* AV1 parsed frame */
#define V4L2_PIX_FMT_SPK v4l2_fourcc('S', 'P', 'K', '0') /* Sorenson Spark */
#define V4L2_PIX_FMT_RV30 v4l2_fourcc('R', 'V', '3', '0') /* RealVideo 8 */
#define V4L2_PIX_FMT_RV40 v4l2_fourcc('R', 'V', '4', '0') /* RealVideo 9 & 10 */
@ -1828,6 +1829,10 @@ struct v4l2_ext_control {
struct v4l2_ctrl_hevc_slice_params __user *p_hevc_slice_params;
struct v4l2_ctrl_hevc_scaling_matrix __user *p_hevc_scaling_matrix;
struct v4l2_ctrl_hevc_decode_params __user *p_hevc_decode_params;
struct v4l2_ctrl_av1_sequence __user *p_av1_sequence;
struct v4l2_ctrl_av1_tile_group_entry __user *p_av1_tile_group_entry;
struct v4l2_ctrl_av1_frame __user *p_av1_frame;
struct v4l2_ctrl_av1_film_grain __user *p_av1_film_grain;
void __user *ptr;
};
} __attribute__ ((packed));
@ -1901,6 +1906,11 @@ enum v4l2_ctrl_type {
V4L2_CTRL_TYPE_HEVC_SLICE_PARAMS = 0x0272,
V4L2_CTRL_TYPE_HEVC_SCALING_MATRIX = 0x0273,
V4L2_CTRL_TYPE_HEVC_DECODE_PARAMS = 0x0274,
V4L2_CTRL_TYPE_AV1_SEQUENCE = 0x280,
V4L2_CTRL_TYPE_AV1_TILE_GROUP_ENTRY = 0x281,
V4L2_CTRL_TYPE_AV1_FRAME = 0x282,
V4L2_CTRL_TYPE_AV1_FILM_GRAIN = 0x283,
};
/* Used in the VIDIOC_QUERYCTRL ioctl for querying controls */