media: uapi: h264: Add the concept of decoding mode

Some stateless decoders don't support per-slice decoding granularity
(or at least not in a way that would make them efficient or easy to use).

Expose a menu to control the supported decoding modes. Drivers are
allowed to support only one decoding but they can support both too.

To fully specify the decoding operation, we need to introduce
a start_byte_offset, to indicate where slices start.

Signed-off-by: Boris Brezillon <[email protected]>
Reviewed-by: Paul Kocialkowski <[email protected]>
Tested-by: Philipp Zabel <[email protected]>
Signed-off-by: Hans Verkuil <[email protected]>
Signed-off-by: Mauro Carvalho Chehab <[email protected]>
This commit is contained in:
Boris Brezillon 2019-08-16 13:01:24 -03:00 • committed by Mauro Carvalho Chehab
commit 5604be66a5
4 changed files with 79 additions and 3 deletions

View file

@ -1747,6 +1747,14 @@ enum v4l2_mpeg_video_h264_hierarchical_coding_type -
* - __u32
- ``size``
-
* - __u32
- ``start_byte_offset``
Offset (in bytes) from the beginning of the OUTPUT buffer to the start
of the slice. If the slice starts with a start code, then this is the
offset to such start code. When operating in slice-based decoding mode
(see :c:type:`v4l2_mpeg_video_h264_decode_mode`), this field should
be set to 0. When operating in frame-based decoding mode, this field
should be 0 for the first slice.
* - __u32
- ``header_bit_size``
-
@ -1930,7 +1938,10 @@ enum v4l2_mpeg_video_h264_hierarchical_coding_type -
-
* - __u16
- ``num_slices``
- Number of slices needed to decode the current frame
- Number of slices needed to decode the current frame/field. When
operating in slice-based decoding mode (see
:c:type:`v4l2_mpeg_video_h264_decode_mode`), this field
should always be set to one.
* - __u16
- ``nal_ref_idc``
- NAL reference ID value coming from the NAL Unit header
@ -2021,6 +2032,50 @@ enum v4l2_mpeg_video_h264_hierarchical_coding_type -
- 0x00000004
- The DPB entry is a long term reference frame
``V4L2_CID_MPEG_VIDEO_H264_DECODE_MODE (enum)``
Specifies the decoding mode to use. Currently exposes slice-based and
frame-based decoding but new modes might be added later on.
This control is used as a modifier for V4L2_PIX_FMT_H264_SLICE
pixel format. Applications that support V4L2_PIX_FMT_H264_SLICE
are required to set this control in order to specify the decoding mode
that is expected for the buffer.
Drivers may expose a single or multiple decoding modes, depending
on what they can support.
.. note::
This menu control is not yet part of the public kernel API and
it is expected to change.
.. c:type:: v4l2_mpeg_video_h264_decode_mode
.. cssclass:: longtable
.. flat-table::
:header-rows: 0
:stub-columns: 0
:widths: 1 1 2
* - ``V4L2_MPEG_VIDEO_H264_DECODE_MODE_SLICE_BASED``
- 0
- Decoding is done at the slice granularity.
In this mode, ``num_slices`` field in struct
:c:type:`v4l2_ctrl_h264_decode_params` should be set to 1,
and ``start_byte_offset`` in struct
:c:type:`v4l2_ctrl_h264_slice_params` should be set to 0.
The OUTPUT buffer must contain a single slice.
* - ``V4L2_MPEG_VIDEO_H264_DECODE_MODE_FRAME_BASED``
- 1
- Decoding is done at the frame granularity.
In this mode, ``num_slices`` field in struct
:c:type:`v4l2_ctrl_h264_decode_params` should be set to the number
of slices in the frame, and ``start_byte_offset`` in struct
:c:type:`v4l2_ctrl_h264_slice_params` should be set accordingly
for each slice. For the first slice, ``start_byte_offset`` should
be zero.
The OUTPUT buffer must contain all slices needed to decode the
frame. The OUTPUT buffer must also contain both fields.
.. _v4l2-mpeg-mpeg2:
``V4L2_CID_MPEG_VIDEO_MPEG2_SLICE_PARAMS (struct)``

View file

@ -60,8 +60,10 @@ Compressed Formats
extracted from the H264 bitstream. This format is adapted for
stateless video decoders that implement an H264 pipeline
(using the :ref:`mem2mem` and :ref:`media-request-api`).
Metadata associated with the frame to decode are required to
be passed through the ``V4L2_CID_MPEG_VIDEO_H264_SPS``,
This pixelformat has a modifier that must be set at least once
through the ``V4L2_CID_MPEG_VIDEO_H264_DECODE_MODE`` control.
In addition, metadata associated with the frame to decode are
required to be passed through the ``V4L2_CID_MPEG_VIDEO_H264_SPS``,
``V4L2_CID_MPEG_VIDEO_H264_PPS``,
``V4L2_CID_MPEG_VIDEO_H264_SCALING_MATRIX``,
``V4L2_CID_MPEG_VIDEO_H264_SLICE_PARAMS`` and