Re: [RFC] media: uapi: Move HEVC stateless controls out of staging

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, 14 Feb 2022 20:26:34 +0100, you wrote:

>Dne ponedeljek, 14. februar 2022 ob 18:25:01 CET je Benjamin Gaignard 
>napisal(a):
>> 
>> Le 13/02/2022 à 12:33, Jernej Škrabec a écrit :
>> > Hi Benjamin,
>> >
>> > CC: Alex, John
>> >
>> > Sorry for late response, but I've been very busy last week.
>> >
>> > First of all, thank you for doing this! It's about time that HEVC moves
>> > forward.
>> >
>> > Dne torek, 01. februar 2022 ob 13:34:39 CET je Benjamin Gaignard 
>napisal(a):
>> >> The HEVC stateless 'uAPI' was staging and marked explicitly in the
>> >> V4L2 specification that it will change and is unstable.
>> >>
>> >> Note that these control IDs were never exported as a public API,
>> >> they were only defined in kernel-local headers (hevc-ctrls.h).
>> >>
>> >> While moving the controls out of staging they are renamed and
>> >> control IDs get new numbers.
>> >> Drivers (Hantro, Cedrus) and Documentation are updated accordaly.
>> > accordaly -> accordingly
>> >
>> >> Additional structures fields has been added for RKVDEC driver usage.
>> > You should do separate patch for that, preceding this one. One patch 
>should
>> > only do one thing.
>> 
>> I will do that in v2
>> 
>> >
>> > I also suggest that you add additional patch for removing bit_size field in
>> > struct v4l2_ctrl_hevc_slice_params. Similar fields were already removed 
>from
>> > MPEG2 and H264 structures. Bit size can be deduced from output buffer size 
>and
>> > it doesn't hurt if bit size in Cedrus is set to bigger value than actual 
>slice
>> > bit size.
>> 
>> ok
>> 
>> >
>> >> Hantro dedicated control is moving to hantro-media.h
>> >> Since hevc-ctrls.h content has been dispatched in others file, remove it.
>> >>
>> >> fluster tests results on IMX8MQ is 77/147 for HEVC codec.
>> >>
>> >> Signed-off-by: Benjamin Gaignard <benjamin.gaignard@xxxxxxxxxxxxx>
>> > Note that Cedrus still needs additional information in order to decode 
>some
>> > HEVC videos. Missing info is num_entry_point_offsets and list of all
>> > entry_point_offset_minus1 (obviously, num_entry_point_offsets in size).
>> >
>> > I suggest that this is represented in a new control, which would use 
>dynamic
>> > array feature, written by Hans. While Cedrus supports max. 256 entries, it 
>can
>> > be much bigger in theory, but in reality, it's much smaller (like 4-8
>> > entries).
>> 
>> I haven't seen yet any user for these fields but I will create a new control 
>like
>> #define V4L2_CID_STATELESS_HEVC_ENTRY_POINT	(V4L2_CID_CODEC_STATELESS_BASE + 
>407)
>> 
>> struct v4l2_ctrl_hevc_entry_point_offset {
>> 	__u32	entry_point_offset_minus1;
>> };

Can we tell if this control is needed from userland? There's no great
point in filling it in if the driver isn't going to use it.

>Yeah, Cedrus is currently the only mainline driver that needs that in order to 
>fully work. I think John used num_entry_point_offsets in his (out of tree) RPi 
>HEVC decoding driver too.

num_entry_points is a useful field  (in the slice header preferably) for
the RPi hardware as whilst it doesn't need to know the offsets it does
need to construct a table with one entry per offset (for cabac state
purposes) so it needs to know how many there are. It is possible to
infer the number from the slice_segment address in the next slice header
but that involves keeping around more state from one request to the
next.

>Wouldn't be easier to just use u32 directly? This is just array of numbers, so 
>nothing else will be added in that struct...
>
>Anyway, once you add this, I'll quickly update driver to take advantage of it.
>
>> 
>> and add it in the documentation:
>> ``V4L2_CID_STATELESS_HEVC_ENTRY_POINT (struct)``
>>      Specifies the i-th entry point offset in bytes and is represented by
>>      offset_len_minus1 plus 1 bits.
>>      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.
>> 
>> >
>> > Last but not least, data_bit_offset should be better defined. Currently it
>> > points right after last header bit, just like Cedrus needs it. However, 
>there
>> > is padding after that, at least 1 bit and 8 bits at most, so slice data 
>always
>> > starts from byte aligned address. It probably make sense to rework that 
>field
>> > to be byte offset, not bit, just like in VA-API. Note that RPi HEVC driver 
>also
>> > uses byte aligned address directly. Cedrus would need some kind of 
>workaround
>> > and only one that works is this one:
>> > https://github.com/bootlin/libva-v4l2-request/blob/master/src/h265.c#L191-L209
>> 
>> If Cedrus driver is happy with this definition I will keep it like that.
>> When providing offset in bit is more accurate and any driver can align the 
>value
>> if needed, the reverse (byte -> bit) isn't possible.
>
>If I'm not mistaken, HEVC standard actually requires that slice data starts at 
>byte aligned address, so nothing would be lost for correctness of uAPI.
>
>I already had this discussion with John and IIRC conclusion was to have byte 
>aligned value here. John, can you please confirm if my interpretation is 
>correct?

Yes slice_segment_data only occurs afer slice_segment_header (7.3.6.1)
and that ends with byte_alignment().

Regards

John Cox

>Best regards,
>Jernej
>
>> 
>> Regards,
>> Benjamin
>> 
>> >
>> > Best regards,
>> > Jernej
>> >
>> >
>> 
>





[Index of Archives]     [Linux Driver Development]     [Linux Driver Backports]     [DMA Engine]     [Linux GPIO]     [Linux SPI]     [Video for Linux]     [Linux USB Devel]     [Linux Coverity]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux