Re: [RFC/WIP 0/4] HEIC image encoder

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

 



Hi Nicolas,

Thanks for comments!

On 5/18/21 8:07 PM, Nicolas Dufresne wrote:
> Le jeudi 29 avril 2021 à 16:28 +0300, Stanimir Varbanov a écrit :
>> Hi,
>>
>> HEIC (High-Efficiency Image Container) is a variant of HEIF (High
>> Efficiency Image File Format) where HEVC/h265 codec is used to encode
>> images.  For more info see [1].
>>
>> In this RFC we propose a new compressed pixel format V4L2_PIX_FMT_HEIC.
>> The name is debatable and could be changed (V4L2_PIX_FMT_HEVC_HEIF is
>> also an option).
>>
>> There are two encoding modes which should be selectable by clients:
>>     1. Regular image encoding
>>     2. Grid image encoding
>>
>> 1. Regular image encoding
>>
>> Propose to reuse stateful video encoder spec [2].
>>
>> - queuing one OUTPUT buffer will produce one CAPTURE buffer.  The
>> client could trigger Drain sequence at any point of time.
> 
> Do you know the rationale why the normal HEVC encoder isn't used and then muxed
> into the HEIF container ? It is these days quite atypical for HW to handle the
> container part. Perhaps they hacked the header, I am not so familiar with these
> new ISOMBF based image format (AV1 got something very similar, though less
> convoluted).

Maybe I did not explain well, but the Venus (and all the knowledge I
have is based on it) does not implement the container part. The
container part is implemented in client. For example I used libheif to
create .heic image file from Venus encoded hevc bitstream.

>>
>> 2. Grid image encoding
>>
>> Propose to reuse stateful video encoder spec [2].
>>
>> - queuing one OUTPUT buffer will produce a number of grids CAPTURE
>> buffers.  The client could trigger Drain sequence at any point of time.
>>
>> This image encoding mode is used when the input image resolution is
>> bigger then the hardware can support and/or for compatibility reasons
>> (for exmaple, the HEIC decoding hardware is not capable to decode higher
>> than VGA resolutions).
>>
>> In this mode the input image is divided on square blocks (we call them grids)
>> and every block is encoded separately (the Venus driver presently supports 
>> grid size of 512x512 but that could be changed in the future).
> 
> Are the blocks always power of two ? Or multiple of 16 ? How do you expose this

I guess the blocks will definitely be a power of two. As far as for
multiple of 16, I guess grid size should be multiple of CTUs (32x32 or
64x64) in case of HEVC. It might be different for the other codecs.

> information to application ? It sounds like an HW decoder would also need to
> expose these restrictions. Userspace will need to be able to check without
> trying if the HW decoder handles the grid side to be able to fallback to
> software decoding.

Depending on what we will decide :
 - use v4l2 control for setting the grid size then we can use
VIDIOC_QUERYCTRL
 - if we decide to set the grid size on the CAPTURE queue SFMT the we
can use VIDIOC_ENUM_FMT

> 
>>
>> To set the grid size we use a new v4l2 control.
>>
>> The side effect of this mode is that the client have to set the v4l2
>> control and thus enable grid encoding before setting the formats on
>> CAPTURE and OUTPUT queues, because the grid size reflects on the
>> selected resolutions. Also the horizontal and vertical strides will
>> also be affected because thеy have to be aligned to the grid size
>> in order to satisfy DMA alignment restrictions.
>>
>> Using of v4l2 control to set up Grid mode and Grid size above looks
>> inpractical and somehow breaks the v4l2 and v4l2 control rules, so
>> I'd give one more option. 
> 
> The stasteless decoders uses a control that must be set after the OUTPUT format,
> but before enumerating capture formats. Not exactly the same, but there is a
> control that interact with the format negotiation.

I'd try to avoid such control if possible.

> 
>>
>> Encoding the Grid mode/size in the new proposed HEIC pixel format:
>>
>>    V4L2_PIX_FMT_HEIC - Regular HEIC image encoding
>>    V4L2_PIX_FMT_HEIC_GRID_512x512 - Grid HEIC image encoding, grid size of 512x512 
>>    and so on ...
> 
> I would be worry of the about of formats that may generates.
> 
>>
>> Comments and suggestions are welcome!
>>
>> regards,
>> Stan
>>
>> [1] https://en.wikipedia.org/wiki/High_Efficiency_Image_File_Format
>> [2] https://linuxtv.org/downloads/v4l-dvb-apis-new/userspace-api/v4l/dev-encoder.html
>>
>>
>> Stanimir Varbanov (4):
>>   media: Add HEIC compressed pixel format
>>   v4l2-ctrls: Add HEIC grid size control
>>   venus: helpers: Add a new helper for buffer processing
>>   venus: Add HEIC image encoder
>>
>>  .../media/v4l/pixfmt-compressed.rst           |   12 +
>>  drivers/media/platform/qcom/venus/Makefile    |    2 +
>>  drivers/media/platform/qcom/venus/core.h      |   10 +
>>  drivers/media/platform/qcom/venus/helpers.c   |   20 +
>>  drivers/media/platform/qcom/venus/helpers.h   |    1 +
>>  drivers/media/platform/qcom/venus/hfi_cmds.c  |   10 +-
>>  .../media/platform/qcom/venus/hfi_helper.h    |    5 +
>>  drivers/media/platform/qcom/venus/ienc.c      | 1348 +++++++++++++++++
>>  drivers/media/platform/qcom/venus/ienc.h      |   14 +
>>  .../media/platform/qcom/venus/ienc_ctrls.c    |   83 +
>>  drivers/media/v4l2-core/v4l2-ctrls.c          |    3 +
>>  drivers/media/v4l2-core/v4l2-ioctl.c          |    1 +
>>  include/uapi/linux/v4l2-controls.h            |    1 +
>>  include/uapi/linux/videodev2.h                |    1 +
>>  14 files changed, 1510 insertions(+), 1 deletion(-)
>>  create mode 100644 drivers/media/platform/qcom/venus/ienc.c
>>  create mode 100644 drivers/media/platform/qcom/venus/ienc.h
>>  create mode 100644 drivers/media/platform/qcom/venus/ienc_ctrls.c
>>
> 
> 

-- 
regards,
Stan



[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux