Re: [PATCH v5 02/10] media: uapi: mpeg2: rework quantisation matrices semantics
On 03/04/2021 20:07, Ezequiel Garcia wrote: > As stated in the MPEG-2 specification, section 6.3.7 "Quant matrix > extension": > > Each quantisation matrix has a default set of values. When a > sequence_header_code is decoded all matrices shall be reset to > their default values. User defined matrices may be downloaded > and this can occur in a sequence_header() or in a > quant_matrix_extension(). > > The load_intra_quantiser_matrix syntax elements are transmitted > in the bistream headers, signalling that a quantisation matrix bistream -> bitstream > needs to be loaded and used for pictures transmitted afterwards > (until the matrices are reset). > > This "load" semantics are implemented in the V4L2 interface > without the need of any "load" flags: passing the control > is effectively a load. > > Therefore, rework the V4L2_CID_MPEG_VIDEO_MPEG2_QUANTISATION > semantics to match the MPEG-2 semantics. Quantisation matrices > values are now initialized by the V4L2 control core to their > reset default value, and applications are expected to reset > their values as specified. > > The quantisation control is therefore optional, and used to > load bitstream-defined values in the quantisation matrices. > > Signed-off-by: Ezequiel Garcia > Co-developed-by: Nicolas Dufresne > Signed-off-by: Nicolas Dufresne > --- > .../media/v4l/ext-ctrls-codec.rst | 17 - > drivers/media/v4l2-core/v4l2-ctrls.c | 21 ++ > .../staging/media/sunxi/cedrus/cedrus_mpeg2.c | 38 +-- > include/media/mpeg2-ctrls.h | 5 --- > 4 files changed, 23 insertions(+), 58 deletions(-) > > diff --git a/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst > b/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst > index 151d1c676b6e..d9546f0aa2e8 100644 > --- a/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst > +++ b/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst > @@ -1746,23 +1746,6 @@ enum v4l2_mpeg_video_h264_hierarchical_coding_type - > :stub-columns: 0 > :widths: 1 1 2 > > -* - __u8 > - - ``load_intra_quantiser_matrix`` > - - One bit to indicate whether to load the ``intra_quantiser_matrix`` > data. > -* - __u8 > - - ``load_non_intra_quantiser_matrix`` > - - One bit to indicate whether to load the > ``non_intra_quantiser_matrix`` > - data. > -* - __u8 > - - ``load_chroma_intra_quantiser_matrix`` > - - One bit to indicate whether to load the > - ``chroma_intra_quantiser_matrix`` data, only relevant for non-4:2:0 YUV > - formats. > -* - __u8 > - - ``load_chroma_non_intra_quantiser_matrix`` > - - One bit to indicate whether to load the > - ``chroma_non_intra_quantiser_matrix`` data, only relevant for non-4:2:0 > - YUV formats. > * - __u8 >- ``intra_quantiser_matrix[64]`` >- The quantisation matrix coefficients for intra-coded frames, in > zigzag > diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c > b/drivers/media/v4l2-core/v4l2-ctrls.c > index 74f5ca1a5f6c..5d92a2b33a6e 100644 > --- a/drivers/media/v4l2-core/v4l2-ctrls.c > +++ b/drivers/media/v4l2-core/v4l2-ctrls.c > @@ -57,6 +57,18 @@ static bool is_new_manual(const struct v4l2_ctrl *master) > return master->is_auto && master->val == master->manual_mode_value; > } > > +/* Default MPEG-2 quantisation coefficients, from the specification. */ Default -> Default intra > +static const u8 mpeg2_intra_quant_matrix[64] = { > + 8, 16, 16, 19, 16, 19, 22, 22, > + 22, 22, 22, 22, 26, 24, 26, 27, > + 27, 27, 26, 26, 26, 26, 27, 27, > + 27, 29, 29, 29, 34, 34, 34, 29, > + 29, 29, 27, 27, 29, 29, 32, 32, > + 34, 34, 37, 38, 37, 35, 35, 34, > + 35, 38, 38, 40, 40, 40, 48, 48, > + 46, 46, 56, 56, 58, 69, 69, 83 > +}; > + > /* Returns NULL or a character pointer array containing the menu for > the given control ID. The pointer array ends with a NULL pointer. > An empty string signifies a menu entry that is invalid. This allows > @@ -1656,6 +1668,7 @@ static void std_init_compound(const struct v4l2_ctrl > *ctrl, u32 idx, > union v4l2_ctrl_ptr ptr) > { > struct v4l2_ctrl_mpeg2_slice_params *p_mpeg2_slice_params; > + struct v4l2_ctrl_mpeg2_quantisation *p_mpeg2_quant; > struct v4l2_ctrl_vp8_frame *p_vp8_frame; > struct v4l2_ctrl_fwht_params *p_fwht_params; > void *p = ptr.p + idx * ctrl->elem_size; > @@ -1680,6 +1693,14 @@ static void std_init_compound(const struct v4l2_ctrl > *ctrl, u32 idx, > p_mpeg2_slice_params->picture.picture_coding_type = > V4L2_MPEG2_PICTURE_CODING_TYPE_I; > break; > + case V4L2_CTRL_TYPE_MPEG2_QUANTISATION: > + p_mpeg2_quant = p; > + > + memcpy(p_mpeg2_quant->intra_quantiser_matrix, > +mpeg2_intra_quant_matrix, > +
[PATCH v5 02/10] media: uapi: mpeg2: rework quantisation matrices semantics
As stated in the MPEG-2 specification, section 6.3.7 "Quant matrix extension": Each quantisation matrix has a default set of values. When a sequence_header_code is decoded all matrices shall be reset to their default values. User defined matrices may be downloaded and this can occur in a sequence_header() or in a quant_matrix_extension(). The load_intra_quantiser_matrix syntax elements are transmitted in the bistream headers, signalling that a quantisation matrix needs to be loaded and used for pictures transmitted afterwards (until the matrices are reset). This "load" semantics are implemented in the V4L2 interface without the need of any "load" flags: passing the control is effectively a load. Therefore, rework the V4L2_CID_MPEG_VIDEO_MPEG2_QUANTISATION semantics to match the MPEG-2 semantics. Quantisation matrices values are now initialized by the V4L2 control core to their reset default value, and applications are expected to reset their values as specified. The quantisation control is therefore optional, and used to load bitstream-defined values in the quantisation matrices. Signed-off-by: Ezequiel Garcia Co-developed-by: Nicolas Dufresne Signed-off-by: Nicolas Dufresne --- .../media/v4l/ext-ctrls-codec.rst | 17 - drivers/media/v4l2-core/v4l2-ctrls.c | 21 ++ .../staging/media/sunxi/cedrus/cedrus_mpeg2.c | 38 +-- include/media/mpeg2-ctrls.h | 5 --- 4 files changed, 23 insertions(+), 58 deletions(-) diff --git a/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst b/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst index 151d1c676b6e..d9546f0aa2e8 100644 --- a/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst +++ b/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst @@ -1746,23 +1746,6 @@ enum v4l2_mpeg_video_h264_hierarchical_coding_type - :stub-columns: 0 :widths: 1 1 2 -* - __u8 - - ``load_intra_quantiser_matrix`` - - One bit to indicate whether to load the ``intra_quantiser_matrix`` data. -* - __u8 - - ``load_non_intra_quantiser_matrix`` - - One bit to indicate whether to load the ``non_intra_quantiser_matrix`` - data. -* - __u8 - - ``load_chroma_intra_quantiser_matrix`` - - One bit to indicate whether to load the - ``chroma_intra_quantiser_matrix`` data, only relevant for non-4:2:0 YUV - formats. -* - __u8 - - ``load_chroma_non_intra_quantiser_matrix`` - - One bit to indicate whether to load the - ``chroma_non_intra_quantiser_matrix`` data, only relevant for non-4:2:0 - YUV formats. * - __u8 - ``intra_quantiser_matrix[64]`` - The quantisation matrix coefficients for intra-coded frames, in zigzag diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c index 74f5ca1a5f6c..5d92a2b33a6e 100644 --- a/drivers/media/v4l2-core/v4l2-ctrls.c +++ b/drivers/media/v4l2-core/v4l2-ctrls.c @@ -57,6 +57,18 @@ static bool is_new_manual(const struct v4l2_ctrl *master) return master->is_auto && master->val == master->manual_mode_value; } +/* Default MPEG-2 quantisation coefficients, from the specification. */ +static const u8 mpeg2_intra_quant_matrix[64] = { + 8, 16, 16, 19, 16, 19, 22, 22, + 22, 22, 22, 22, 26, 24, 26, 27, + 27, 27, 26, 26, 26, 26, 27, 27, + 27, 29, 29, 29, 34, 34, 34, 29, + 29, 29, 27, 27, 29, 29, 32, 32, + 34, 34, 37, 38, 37, 35, 35, 34, + 35, 38, 38, 40, 40, 40, 48, 48, + 46, 46, 56, 56, 58, 69, 69, 83 +}; + /* Returns NULL or a character pointer array containing the menu for the given control ID. The pointer array ends with a NULL pointer. An empty string signifies a menu entry that is invalid. This allows @@ -1656,6 +1668,7 @@ static void std_init_compound(const struct v4l2_ctrl *ctrl, u32 idx, union v4l2_ctrl_ptr ptr) { struct v4l2_ctrl_mpeg2_slice_params *p_mpeg2_slice_params; + struct v4l2_ctrl_mpeg2_quantisation *p_mpeg2_quant; struct v4l2_ctrl_vp8_frame *p_vp8_frame; struct v4l2_ctrl_fwht_params *p_fwht_params; void *p = ptr.p + idx * ctrl->elem_size; @@ -1680,6 +1693,14 @@ static void std_init_compound(const struct v4l2_ctrl *ctrl, u32 idx, p_mpeg2_slice_params->picture.picture_coding_type = V4L2_MPEG2_PICTURE_CODING_TYPE_I; break; + case V4L2_CTRL_TYPE_MPEG2_QUANTISATION: + p_mpeg2_quant = p; + + memcpy(p_mpeg2_quant->intra_quantiser_matrix, + mpeg2_intra_quant_matrix, + ARRAY_SIZE(mpeg2_intra_quant_matrix)); + memset(p_mpeg2_quant->non_intra_quantiser_matrix, 16, 64); + break; case V4L2_CTRL_TYPE_VP8_FRAME: p_vp8_frame = p; p_vp8_frame->num_dct_parts = 1; diff