Le mardi 31 mai 2022 à 20:20 +0200, Jernej Škrabec a écrit : > Dne torek, 31. maj 2022 ob 08:58:46 CEST je Benjamin Gaignard napisal(a): > > > > Le 30/05/2022 à 23:24, Jernej Škrabec a écrit : > > > Dne ponedeljek, 30. maj 2022 ob 15:49:57 CEST je Hans Verkuil napisal(a): > > > > On 30/05/2022 11:18, Hans Verkuil wrote: > > > > > On 29/05/2022 08:40, Jernej Škrabec wrote: > > > > > > Hi! > > > > > > > > > > > > This series looks very good and I plan to test it shortly on Cedrus, > but > > > I > > > > > > have one major concern below. > > > > > > > > > > > > Dne petek, 27. maj 2022 ob 16:31:28 CEST je Benjamin Gaignard > napisal(a): > > > > > > > The number of 'entry point offset' can be very variable. > > > > > > > Instead of using a large static array define a v4l2 dynamic array > > > > > > > of U32 (V4L2_CTRL_TYPE_U32). > > > > > > > The number of entry point offsets is reported by the elems field > > > > > > > and in struct v4l2_ctrl_hevc_slice_params.num_entry_point_offsets > > > > > > > field. > > > > > > Slice control by itself is variable length array, so you would actually > > > need > > > > > > 2D variable array for entry points which is not supported. However, > easy > > > > > > workaround for that is to flatten 2D array to 1D and either have another > > > slice > > > > > > control field which would tell first entry point index for convenience or > > > let > > > > > > driver calculate it by adding up all num_entry_point_offsets of previous > > > > > > slices. > > > > > > > > > > > > Hans, what do you think? > > > > > If I would support 2D variable array sizes, wouldn't that be more > elegant? > > > > > > > > > > The current implementation doesn't support that, but as the commit log > for > > > > > patch 1/17 says: > > > > > > > > > > "Currently dynamically sized arrays are limited to one dimensional > arrays, > > > > > but that might change in the future if there is a need for it." > > > > > > > > > > Let me know if you agree, and I'll try to implement this. It's been a > > > while > > > > > since I last looked at this, so I'm not sure how much work it is, but it > > > is > > > > > probably worth a shot. > > > > Digging more into this made me realize that this doesn't actually help > for > > > this > > > > particular case. > > > > > > > > I would lean towards your second suggestion of adding up all > > > num_entry_point_offsets > > > > of previous slices. > > > Just one question/clarification about dynamic arrays - does driver need to > > > reserve maximum amount of memory for dynamic array control at > initialization > > > time? If so, this would still be problematic, since there cound be a huge > > > amount of entry points in theory. > > > > When adding the control the driver could set .dims field to specify > > the max number of accepted slices. > > I have added '#define V4L2_HEVC_SLICE_MAX_COUNT 600' that you could use > > for this field. It is the value we have found when using slices with RKVDEC > > driver. > > Is this maximum value applicable only to RKVDEC or is universal? Anyway, this > means maximum offset points control for Cedrus would be 600 * 1024 (max. offset > points supported per slice) * 4 ~= 2.4 MB, which is a lot for one control, but > I can live with that... I believe its defined following "Table A.8 – General tier and level limits". With the assumption there will never be a level 7 (which I think is fair). If anyone saw other reasons for this limit, let me know. This is a worse case scenario, this is quite unlikely in practice, so while performance might be a disaster if your craft a stream for that case, I don't think it will ever happen in real life. > > Best regards, > Jernej > > > > > Regards, > > Benjamin > > > > > > > > Best regards, > > > Jernej > > > > > > > Regards, > > > > > > > > Hans > > > > > > > > > Regards, > > > > > > > > > > Hans > > > > > > > > > > > Note, it seems that H265 decoding on Cedrus still works without entry > > > points, > > > > > > so this problem can be solved later. I'm not sure what we lose with > that > > > but > > > > > > it was suggested that this could influence speed or error resilience or > > > both. > > > > > > However, I think we're close to solve it, so I'd like to do that now. > > > > > > > > > > > > Best regards, > > > > > > Jernej > > > > > > > > > > > > > Signed-off-by: Benjamin Gaignard <benjamin.gaignard@xxxxxxxxxxxxx> > > > > > > > --- > > > > > > > .../userspace-api/media/v4l/ext-ctrls-codec.rst | 11 +++++++++ > ++ > > > > > > > drivers/media/v4l2-core/v4l2-ctrls-defs.c | 5 +++++ > > > > > > > include/media/hevc-ctrls.h | 5 ++++- > > > > > > > 3 files changed, 20 insertions(+), 1 deletion(-) > > > > > > > > > > > > > > diff --git a/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst > b/ > > > > > > Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst > > > > > > > index 0796b1563daa..05228e280f66 100644 > > > > > > > --- a/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst > > > > > > > +++ b/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst > > > > > > > @@ -3010,6 +3010,9 @@ enum v4l2_mpeg_video_hevc_size_of_length_field - > > > > > > > * - __u32 > > > > > > > - ``data_bit_offset`` > > > > > > > - Offset (in bits) to the video data in the current slice data. > > > > > > > + * - __u32 > > > > > > > + - ``num_entry_point_offsets`` > > > > > > > + - Specifies the number of entry point offset syntax elements in > the > > > > > > slice header. > > > > > > > * - __u8 > > > > > > > - ``nal_unit_type`` > > > > > > > - Specifies the coding type of the slice (B, P or I). > > > > > > > @@ -3150,6 +3153,14 @@ enum v4l2_mpeg_video_hevc_size_of_length_field - > > > > > > > > > > > > > > \normalsize > > > > > > > > > > > > > > +``V4L2_CID_STATELESS_HEVC_ENTRY_POINT_OFFSETS (integer)`` > > > > > > > + Specifies entry point offsets in bytes. > > > > > > > + This control is a dynamically sized array. The number of entry > > > point > > > > > > > + offsets is reported by the ``elems`` field. > > > > > > > + This bitstream parameter is defined according to :ref:`hevc`. > > > > > > > + They are described in section 7.4.7.1 "General slice segment > header > > > > > > > + semantics" of the specification. > > > > > > > + > > > > > > > ``V4L2_CID_STATELESS_HEVC_SCALING_MATRIX (struct)`` > > > > > > > Specifies the HEVC scaling matrix parameters used for the scaling > > > > > > process > > > > > > > for transform coefficients. > > > > > > > diff --git a/drivers/media/v4l2-core/v4l2-ctrls-defs.c b/drivers/media/ > > > v4l2- > > > > > > core/v4l2-ctrls-defs.c > > > > > > > index d594efbcbb93..e22921e7ea61 100644 > > > > > > > --- a/drivers/media/v4l2-core/v4l2-ctrls-defs.c > > > > > > > +++ b/drivers/media/v4l2-core/v4l2-ctrls-defs.c > > > > > > > @@ -1188,6 +1188,7 @@ const char *v4l2_ctrl_get_name(u32 id) > > > > > > > case V4L2_CID_STATELESS_HEVC_DECODE_PARAMS: return > > > > > > "HEVC Decode Parameters"; > > > > > > > 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"; > > > > > > > > > > > > > > /* Colorimetry controls */ > > > > > > > /* Keep the order of the 'case's the same as in v4l2-controls.h! > > > > > > */ > > > > > > > @@ -1518,6 +1519,10 @@ void v4l2_ctrl_fill(u32 id, const char **name, > > > enum > > > > > > v4l2_ctrl_type *type, > > > > > > > case V4L2_CID_STATELESS_HEVC_DECODE_PARAMS: > > > > > > > *type = V4L2_CTRL_TYPE_HEVC_DECODE_PARAMS; > > > > > > > break; > > > > > > > + case V4L2_CID_STATELESS_HEVC_ENTRY_POINT_OFFSETS: > > > > > > > + *type = V4L2_CTRL_TYPE_U32; > > > > > > > + *flags |= V4L2_CTRL_FLAG_DYNAMIC_ARRAY; > > > > > > > + break; > > > > > > > case V4L2_CID_STATELESS_VP9_COMPRESSED_HDR: > > > > > > > *type = V4L2_CTRL_TYPE_VP9_COMPRESSED_HDR; > > > > > > > break; > > > > > > > diff --git a/include/media/hevc-ctrls.h b/include/media/hevc-ctrls.h > > > > > > > index a3c829ef531a..1319cb99ae3f 100644 > > > > > > > --- a/include/media/hevc-ctrls.h > > > > > > > +++ b/include/media/hevc-ctrls.h > > > > > > > @@ -20,6 +20,7 @@ > > > > > > > #define V4L2_CID_STATELESS_HEVC_DECODE_PARAMS > (V4L2_CID_CODEC_BASE > > > > > > + 1012) > > > > > > > #define V4L2_CID_STATELESS_HEVC_DECODE_MODE > (V4L2_CID_CODEC_BASE > > > + 1015) > > > > > > > #define V4L2_CID_STATELESS_HEVC_START_CODE > (V4L2_CID_CODEC_BASE + 1016) > > > > > > > +#define V4L2_CID_STATELESS_HEVC_ENTRY_POINT_OFFSETS > (V4L2_CID_CODEC_BASE > > > + > > > > > > 1017) > > > > > > > > > > > > > > /* enum v4l2_ctrl_type type values */ > > > > > > > #define V4L2_CTRL_TYPE_HEVC_SPS 0x0120 > > > > > > > @@ -318,6 +319,8 @@ struct v4l2_hevc_pred_weight_table { > > > > > > > * > > > > > > > * @bit_size: size (in bits) of the current slice data > > > > > > > * @data_bit_offset: offset (in bits) to the video data in the current > > > slice > > > > > > data > > > > > > > + * @num_entry_point_offsets: specifies the number of entry point offset > > > syntax > > > > > > > + * elements in the slice header. > > > > > > > * @nal_unit_type: specifies the coding type of the slice (B, P or I) > > > > > > > * @nuh_temporal_id_plus1: minus 1 specifies a temporal identifier for > > > the > > > > > > NAL unit > > > > > > > * @slice_type: see V4L2_HEVC_SLICE_TYPE_{} > > > > > > > @@ -360,7 +363,7 @@ struct v4l2_hevc_pred_weight_table { > > > > > > > struct v4l2_ctrl_hevc_slice_params { > > > > > > > __u32 bit_size; > > > > > > > __u32 data_bit_offset; > > > > > > > - > > > > > > > + __u32 num_entry_point_offsets; > > > > > > > /* ISO/IEC 23008-2, ITU-T Rec. H.265: NAL unit header */ > > > > > > > __u8 nal_unit_type; > > > > > > > __u8 nuh_temporal_id_plus1; > > > > > > > -- > > > > > > > 2.32.0 > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >