diff options
Diffstat (limited to 'Documentation/media/uapi/v4l/dev-decoder.rst')
-rw-r--r-- | Documentation/media/uapi/v4l/dev-decoder.rst | 1101 |
1 files changed, 0 insertions, 1101 deletions
diff --git a/Documentation/media/uapi/v4l/dev-decoder.rst b/Documentation/media/uapi/v4l/dev-decoder.rst deleted file mode 100644 index 606b54947e10..000000000000 --- a/Documentation/media/uapi/v4l/dev-decoder.rst +++ /dev/null @@ -1,1101 +0,0 @@ -.. SPDX-License-Identifier: GPL-2.0 - -.. _decoder: - -************************************************* -Memory-to-Memory Stateful Video Decoder Interface -************************************************* - -A stateful video decoder takes complete chunks of the bytestream (e.g. Annex-B -H.264/HEVC stream, raw VP8/9 stream) and decodes them into raw video frames in -display order. The decoder is expected not to require any additional information -from the client to process these buffers. - -Performing software parsing, processing etc. of the stream in the driver in -order to support this interface is strongly discouraged. In case such -operations are needed, use of the Stateless Video Decoder Interface (in -development) is strongly advised. - -Conventions and Notations Used in This Document -=============================================== - -1. The general V4L2 API rules apply if not specified in this document - otherwise. - -2. The meaning of words "must", "may", "should", etc. is as per `RFC - 2119 <https://tools.ietf.org/html/rfc2119>`_. - -3. All steps not marked "optional" are required. - -4. :c:func:`VIDIOC_G_EXT_CTRLS` and :c:func:`VIDIOC_S_EXT_CTRLS` may be used - interchangeably with :c:func:`VIDIOC_G_CTRL` and :c:func:`VIDIOC_S_CTRL`, - unless specified otherwise. - -5. Single-planar API (see :ref:`planar-apis`) and applicable structures may be - used interchangeably with multi-planar API, unless specified otherwise, - depending on decoder capabilities and following the general V4L2 guidelines. - -6. i = [a..b]: sequence of integers from a to b, inclusive, i.e. i = - [0..2]: i = 0, 1, 2. - -7. Given an ``OUTPUT`` buffer A, then A’ represents a buffer on the ``CAPTURE`` - queue containing data that resulted from processing buffer A. - -.. _decoder-glossary: - -Glossary -======== - -CAPTURE - the destination buffer queue; for decoders, the queue of buffers containing - decoded frames; for encoders, the queue of buffers containing an encoded - bytestream; ``V4L2_BUF_TYPE_VIDEO_CAPTURE`` or - ``V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE``; data is captured from the hardware - into ``CAPTURE`` buffers. - -client - the application communicating with the decoder or encoder implementing - this interface. - -coded format - encoded/compressed video bytestream format (e.g. H.264, VP8, etc.); see - also: raw format. - -coded height - height for given coded resolution. - -coded resolution - stream resolution in pixels aligned to codec and hardware requirements; - typically visible resolution rounded up to full macroblocks; - see also: visible resolution. - -coded width - width for given coded resolution. - -decode order - the order in which frames are decoded; may differ from display order if the - coded format includes a feature of frame reordering; for decoders, - ``OUTPUT`` buffers must be queued by the client in decode order; for - encoders ``CAPTURE`` buffers must be returned by the encoder in decode order. - -destination - data resulting from the decode process; see ``CAPTURE``. - -display order - the order in which frames must be displayed; for encoders, ``OUTPUT`` - buffers must be queued by the client in display order; for decoders, - ``CAPTURE`` buffers must be returned by the decoder in display order. - -DPB - Decoded Picture Buffer; an H.264/HEVC term for a buffer that stores a decoded - raw frame available for reference in further decoding steps. - -EOS - end of stream. - -IDR - Instantaneous Decoder Refresh; a type of a keyframe in an H.264/HEVC-encoded - stream, which clears the list of earlier reference frames (DPBs). - -keyframe - an encoded frame that does not reference frames decoded earlier, i.e. - can be decoded fully on its own. - -macroblock - a processing unit in image and video compression formats based on linear - block transforms (e.g. H.264, VP8, VP9); codec-specific, but for most of - popular codecs the size is 16x16 samples (pixels). - -OUTPUT - the source buffer queue; for decoders, the queue of buffers containing - an encoded bytestream; for encoders, the queue of buffers containing raw - frames; ``V4L2_BUF_TYPE_VIDEO_OUTPUT`` or - ``V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE``; the hardware is fed with data - from ``OUTPUT`` buffers. - -PPS - Picture Parameter Set; a type of metadata entity in an H.264/HEVC bytestream. - -raw format - uncompressed format containing raw pixel data (e.g. YUV, RGB formats). - -resume point - a point in the bytestream from which decoding may start/continue, without - any previous state/data present, e.g.: a keyframe (VP8/VP9) or - SPS/PPS/IDR sequence (H.264/HEVC); a resume point is required to start decode - of a new stream, or to resume decoding after a seek. - -source - data fed to the decoder or encoder; see ``OUTPUT``. - -source height - height in pixels for given source resolution; relevant to encoders only. - -source resolution - resolution in pixels of source frames being source to the encoder and - subject to further cropping to the bounds of visible resolution; relevant to - encoders only. - -source width - width in pixels for given source resolution; relevant to encoders only. - -SPS - Sequence Parameter Set; a type of metadata entity in an H.264/HEVC bytestream. - -stream metadata - additional (non-visual) information contained inside encoded bytestream; - for example: coded resolution, visible resolution, codec profile. - -visible height - height for given visible resolution; display height. - -visible resolution - stream resolution of the visible picture, in pixels, to be used for - display purposes; must be smaller or equal to coded resolution; - display resolution. - -visible width - width for given visible resolution; display width. - -State Machine -============= - -.. kernel-render:: DOT - :alt: DOT digraph of decoder state machine - :caption: Decoder State Machine - - digraph decoder_state_machine { - node [shape = doublecircle, label="Decoding"] Decoding; - - node [shape = circle, label="Initialization"] Initialization; - node [shape = circle, label="Capture\nsetup"] CaptureSetup; - node [shape = circle, label="Dynamic\nResolution\nChange"] ResChange; - node [shape = circle, label="Stopped"] Stopped; - node [shape = circle, label="Drain"] Drain; - node [shape = circle, label="Seek"] Seek; - node [shape = circle, label="End of Stream"] EoS; - - node [shape = point]; qi - qi -> Initialization [ label = "open()" ]; - - Initialization -> CaptureSetup [ label = "CAPTURE\nformat\nestablished" ]; - - CaptureSetup -> Stopped [ label = "CAPTURE\nbuffers\nready" ]; - - Decoding -> ResChange [ label = "Stream\nresolution\nchange" ]; - Decoding -> Drain [ label = "V4L2_DEC_CMD_STOP" ]; - Decoding -> EoS [ label = "EoS mark\nin the stream" ]; - Decoding -> Seek [ label = "VIDIOC_STREAMOFF(OUTPUT)" ]; - Decoding -> Stopped [ label = "VIDIOC_STREAMOFF(CAPTURE)" ]; - Decoding -> Decoding; - - ResChange -> CaptureSetup [ label = "CAPTURE\nformat\nestablished" ]; - ResChange -> Seek [ label = "VIDIOC_STREAMOFF(OUTPUT)" ]; - - EoS -> Drain [ label = "Implicit\ndrain" ]; - - Drain -> Stopped [ label = "All CAPTURE\nbuffers dequeued\nor\nVIDIOC_STREAMOFF(CAPTURE)" ]; - Drain -> Seek [ label = "VIDIOC_STREAMOFF(OUTPUT)" ]; - - Seek -> Decoding [ label = "VIDIOC_STREAMON(OUTPUT)" ]; - Seek -> Initialization [ label = "VIDIOC_REQBUFS(OUTPUT, 0)" ]; - - Stopped -> Decoding [ label = "V4L2_DEC_CMD_START\nor\nVIDIOC_STREAMON(CAPTURE)" ]; - Stopped -> Seek [ label = "VIDIOC_STREAMOFF(OUTPUT)" ]; - } - -Querying Capabilities -===================== - -1. To enumerate the set of coded formats supported by the decoder, the - client may call :c:func:`VIDIOC_ENUM_FMT` on ``OUTPUT``. - - * The full set of supported formats will be returned, regardless of the - format set on ``CAPTURE``. - * Check the flags field of :c:type:`v4l2_fmtdesc` for more information - about the decoder's capabilities with respect to each coded format. - In particular whether or not the decoder has a full-fledged bytestream - parser and if the decoder supports dynamic resolution changes. - -2. To enumerate the set of supported raw formats, the client may call - :c:func:`VIDIOC_ENUM_FMT` on ``CAPTURE``. - - * Only the formats supported for the format currently active on ``OUTPUT`` - will be returned. - - * In order to enumerate raw formats supported by a given coded format, - the client must first set that coded format on ``OUTPUT`` and then - enumerate formats on ``CAPTURE``. - -3. The client may use :c:func:`VIDIOC_ENUM_FRAMESIZES` to detect supported - resolutions for a given format, passing desired pixel format in - :c:type:`v4l2_frmsizeenum` ``pixel_format``. - - * Values returned by :c:func:`VIDIOC_ENUM_FRAMESIZES` for a coded pixel - format will include all possible coded resolutions supported by the - decoder for given coded pixel format. - - * Values returned by :c:func:`VIDIOC_ENUM_FRAMESIZES` for a raw pixel format - will include all possible frame buffer resolutions supported by the - decoder for given raw pixel format and the coded format currently set on - ``OUTPUT``. - -4. Supported profiles and levels for the coded format currently set on - ``OUTPUT``, if applicable, may be queried using their respective controls - via :c:func:`VIDIOC_QUERYCTRL`. - -Initialization -============== - -1. Set the coded format on ``OUTPUT`` via :c:func:`VIDIOC_S_FMT` - - * **Required fields:** - - ``type`` - a ``V4L2_BUF_TYPE_*`` enum appropriate for ``OUTPUT``. - - ``pixelformat`` - a coded pixel format. - - ``width``, ``height`` - coded resolution of the stream; required only if it cannot be parsed - from the stream for the given coded format; otherwise the decoder will - use this resolution as a placeholder resolution that will likely change - as soon as it can parse the actual coded resolution from the stream. - - ``sizeimage`` - desired size of ``OUTPUT`` buffers; the decoder may adjust it to - match hardware requirements. - - other fields - follow standard semantics. - - * **Return fields:** - - ``sizeimage`` - adjusted size of ``OUTPUT`` buffers. - - * The ``CAPTURE`` format will be updated with an appropriate frame buffer - resolution instantly based on the width and height returned by - :c:func:`VIDIOC_S_FMT`. - However, for coded formats that include stream resolution information, - after the decoder is done parsing the information from the stream, it will - update the ``CAPTURE`` format with new values and signal a source change - event, regardless of whether they match the values set by the client or - not. - - .. important:: - - Changing the ``OUTPUT`` format may change the currently set ``CAPTURE`` - format. How the new ``CAPTURE`` format is determined is up to the decoder - and the client must ensure it matches its needs afterwards. - -2. Allocate source (bytestream) buffers via :c:func:`VIDIOC_REQBUFS` on - ``OUTPUT``. - - * **Required fields:** - - ``count`` - requested number of buffers to allocate; greater than zero. - - ``type`` - a ``V4L2_BUF_TYPE_*`` enum appropriate for ``OUTPUT``. - - ``memory`` - follows standard semantics. - - * **Return fields:** - - ``count`` - the actual number of buffers allocated. - - .. warning:: - - The actual number of allocated buffers may differ from the ``count`` - given. The client must check the updated value of ``count`` after the - call returns. - - Alternatively, :c:func:`VIDIOC_CREATE_BUFS` on the ``OUTPUT`` queue can be - used to have more control over buffer allocation. - - * **Required fields:** - - ``count`` - requested number of buffers to allocate; greater than zero. - - ``type`` - a ``V4L2_BUF_TYPE_*`` enum appropriate for ``OUTPUT``. - - ``memory`` - follows standard semantics. - - ``format`` - follows standard semantics. - - * **Return fields:** - - ``count`` - adjusted to the number of allocated buffers. - - .. warning:: - - The actual number of allocated buffers may differ from the ``count`` - given. The client must check the updated value of ``count`` after the - call returns. - -3. Start streaming on the ``OUTPUT`` queue via :c:func:`VIDIOC_STREAMON`. - -4. **This step only applies to coded formats that contain resolution information - in the stream.** Continue queuing/dequeuing bytestream buffers to/from the - ``OUTPUT`` queue via :c:func:`VIDIOC_QBUF` and :c:func:`VIDIOC_DQBUF`. The - buffers will be processed and returned to the client in order, until - required metadata to configure the ``CAPTURE`` queue are found. This is - indicated by the decoder sending a ``V4L2_EVENT_SOURCE_CHANGE`` event with - ``changes`` set to ``V4L2_EVENT_SRC_CH_RESOLUTION``. - - * It is not an error if the first buffer does not contain enough data for - this to occur. Processing of the buffers will continue as long as more - data is needed. - - * If data in a buffer that triggers the event is required to decode the - first frame, it will not be returned to the client, until the - initialization sequence completes and the frame is decoded. - - * If the client has not set the coded resolution of the stream on its own, - calling :c:func:`VIDIOC_G_FMT`, :c:func:`VIDIOC_S_FMT`, - :c:func:`VIDIOC_TRY_FMT` or :c:func:`VIDIOC_REQBUFS` on the ``CAPTURE`` - queue will not return the real values for the stream until a - ``V4L2_EVENT_SOURCE_CHANGE`` event with ``changes`` set to - ``V4L2_EVENT_SRC_CH_RESOLUTION`` is signaled. - - .. important:: - - Any client query issued after the decoder queues the event will return - values applying to the just parsed stream, including queue formats, - selection rectangles and controls. - - .. note:: - - A client capable of acquiring stream parameters from the bytestream on - its own may attempt to set the width and height of the ``OUTPUT`` format - to non-zero values matching the coded size of the stream, skip this step - and continue with the `Capture Setup` sequence. However, it must not - rely on any driver queries regarding stream parameters, such as - selection rectangles and controls, since the decoder has not parsed them - from the stream yet. If the values configured by the client do not match - those parsed by the decoder, a `Dynamic Resolution Change` will be - triggered to reconfigure them. - - .. note:: - - No decoded frames are produced during this phase. - -5. Continue with the `Capture Setup` sequence. - -Capture Setup -============= - -1. Call :c:func:`VIDIOC_G_FMT` on the ``CAPTURE`` queue to get format for the - destination buffers parsed/decoded from the bytestream. - - * **Required fields:** - - ``type`` - a ``V4L2_BUF_TYPE_*`` enum appropriate for ``CAPTURE``. - - * **Return fields:** - - ``width``, ``height`` - frame buffer resolution for the decoded frames. - - ``pixelformat`` - pixel format for decoded frames. - - ``num_planes`` (for _MPLANE ``type`` only) - number of planes for pixelformat. - - ``sizeimage``, ``bytesperline`` - as per standard semantics; matching frame buffer format. - - .. note:: - - The value of ``pixelformat`` may be any pixel format supported by the - decoder for the current stream. The decoder should choose a - preferred/optimal format for the default configuration. For example, a - YUV format may be preferred over an RGB format if an additional - conversion step would be required for the latter. - -2. **Optional.** Acquire the visible resolution via - :c:func:`VIDIOC_G_SELECTION`. - - * **Required fields:** - - ``type`` - a ``V4L2_BUF_TYPE_*`` enum appropriate for ``CAPTURE``. - - ``target`` - set to ``V4L2_SEL_TGT_COMPOSE``. - - * **Return fields:** - - ``r.left``, ``r.top``, ``r.width``, ``r.height`` - the visible rectangle; it must fit within the frame buffer resolution - returned by :c:func:`VIDIOC_G_FMT` on ``CAPTURE``. - - * The following selection targets are supported on ``CAPTURE``: - - ``V4L2_SEL_TGT_CROP_BOUNDS`` - corresponds to the coded resolution of the stream. - - ``V4L2_SEL_TGT_CROP_DEFAULT`` - the rectangle covering the part of the ``CAPTURE`` buffer that - contains meaningful picture data (visible area); width and height - will be equal to the visible resolution of the stream. - - ``V4L2_SEL_TGT_CROP`` - the rectangle within the coded resolution to be output to - ``CAPTURE``; defaults to ``V4L2_SEL_TGT_CROP_DEFAULT``; read-only on - hardware without additional compose/scaling capabilities. - - ``V4L2_SEL_TGT_COMPOSE_BOUNDS`` - the maximum rectangle within a ``CAPTURE`` buffer, which the cropped - frame can be composed into; equal to ``V4L2_SEL_TGT_CROP`` if the - hardware does not support compose/scaling. - - ``V4L2_SEL_TGT_COMPOSE_DEFAULT`` - equal to ``V4L2_SEL_TGT_CROP``. - - ``V4L2_SEL_TGT_COMPOSE`` - the rectangle inside a ``CAPTURE`` buffer into which the cropped - frame is written; defaults to ``V4L2_SEL_TGT_COMPOSE_DEFAULT``; - read-only on hardware without additional compose/scaling capabilities. - - ``V4L2_SEL_TGT_COMPOSE_PADDED`` - the rectangle inside a ``CAPTURE`` buffer which is overwritten by the - hardware; equal to ``V4L2_SEL_TGT_COMPOSE`` if the hardware does not - write padding pixels. - - .. warning:: - - The values are guaranteed to be meaningful only after the decoder - successfully parses the stream metadata. The client must not rely on the - query before that happens. - -3. **Optional.** Enumerate ``CAPTURE`` formats via :c:func:`VIDIOC_ENUM_FMT` on - the ``CAPTURE`` queue. Once the stream information is parsed and known, the - client may use this ioctl to discover which raw formats are supported for - given stream and select one of them via :c:func:`VIDIOC_S_FMT`. - - .. important:: - - The decoder will return only formats supported for the currently - established coded format, as per the ``OUTPUT`` format and/or stream - metadata parsed in this initialization sequence, even if more formats - may be supported by the decoder in general. In other words, the set - returned will be a subset of the initial query mentioned in the - `Querying Capabilities` section. - - For example, a decoder may support YUV and RGB formats for resolutions - 1920x1088 and lower, but only YUV for higher resolutions (due to - hardware limitations). After parsing a resolution of 1920x1088 or lower, - :c:func:`VIDIOC_ENUM_FMT` may return a set of YUV and RGB pixel formats, - but after parsing resolution higher than 1920x1088, the decoder will not - return RGB, unsupported for this resolution. - - However, subsequent resolution change event triggered after - discovering a resolution change within the same stream may switch - the stream into a lower resolution and :c:func:`VIDIOC_ENUM_FMT` - would return RGB formats again in that case. - -4. **Optional.** Set the ``CAPTURE`` format via :c:func:`VIDIOC_S_FMT` on the - ``CAPTURE`` queue. The client may choose a different format than - selected/suggested by the decoder in :c:func:`VIDIOC_G_FMT`. - - * **Required fields:** - - ``type`` - a ``V4L2_BUF_TYPE_*`` enum appropriate for ``CAPTURE``. - - ``pixelformat`` - a raw pixel format. - - ``width``, ``height`` - frame buffer resolution of the decoded stream; typically unchanged from - what was returned with :c:func:`VIDIOC_G_FMT`, but it may be different - if the hardware supports composition and/or scaling. - - * Setting the ``CAPTURE`` format will reset the compose selection rectangles - to their default values, based on the new resolution, as described in the - previous step. - -5. **Optional.** Set the compose rectangle via :c:func:`VIDIOC_S_SELECTION` on - the ``CAPTURE`` queue if it is desired and if the decoder has compose and/or - scaling capabilities. - - * **Required fields:** - - ``type`` - a ``V4L2_BUF_TYPE_*`` enum appropriate for ``CAPTURE``. - - ``target`` - set to ``V4L2_SEL_TGT_COMPOSE``. - - ``r.left``, ``r.top``, ``r.width``, ``r.height`` - the rectangle inside a ``CAPTURE`` buffer into which the cropped - frame is written; defaults to ``V4L2_SEL_TGT_COMPOSE_DEFAULT``; - read-only on hardware without additional compose/scaling capabilities. - - * **Return fields:** - - ``r.left``, ``r.top``, ``r.width``, ``r.height`` - the visible rectangle; it must fit within the frame buffer resolution - returned by :c:func:`VIDIOC_G_FMT` on ``CAPTURE``. - - .. warning:: - - The decoder may adjust the compose rectangle to the nearest - supported one to meet codec and hardware requirements. The client needs - to check the adjusted rectangle returned by :c:func:`VIDIOC_S_SELECTION`. - -6. If all the following conditions are met, the client may resume the decoding - instantly: - - * ``sizeimage`` of the new format (determined in previous steps) is less - than or equal to the size of currently allocated buffers, - - * the number of buffers currently allocated is greater than or equal to the - minimum number of buffers acquired in previous steps. To fulfill this - requirement, the client may use :c:func:`VIDIOC_CREATE_BUFS` to add new - buffers. - - In that case, the remaining steps do not apply and the client may resume - the decoding by one of the following actions: - - * if the ``CAPTURE`` queue is streaming, call :c:func:`VIDIOC_DECODER_CMD` - with the ``V4L2_DEC_CMD_START`` command, - - * if the ``CAPTURE`` queue is not streaming, call :c:func:`VIDIOC_STREAMON` - on the ``CAPTURE`` queue. - - However, if the client intends to change the buffer set, to lower - memory usage or for any other reasons, it may be achieved by following - the steps below. - -7. **If the** ``CAPTURE`` **queue is streaming,** keep queuing and dequeuing - buffers on the ``CAPTURE`` queue until a buffer marked with the - ``V4L2_BUF_FLAG_LAST`` flag is dequeued. - -8. **If the** ``CAPTURE`` **queue is streaming,** call :c:func:`VIDIOC_STREAMOFF` - on the ``CAPTURE`` queue to stop streaming. - - .. warning:: - - The ``OUTPUT`` queue must remain streaming. Calling - :c:func:`VIDIOC_STREAMOFF` on it would abort the sequence and trigger a - seek. - -9. **If the** ``CAPTURE`` **queue has buffers allocated,** free the ``CAPTURE`` - buffers using :c:func:`VIDIOC_REQBUFS`. - - * **Required fields:** - - ``count`` - set to 0. - - ``type`` - a ``V4L2_BUF_TYPE_*`` enum appropriate for ``CAPTURE``. - - ``memory`` - follows standard semantics. - -10. Allocate ``CAPTURE`` buffers via :c:func:`VIDIOC_REQBUFS` on the - ``CAPTURE`` queue. - - * **Required fields:** - - ``count`` - requested number of buffers to allocate; greater than zero. - - ``type`` - a ``V4L2_BUF_TYPE_*`` enum appropriate for ``CAPTURE``. - - ``memory`` - follows standard semantics. - - * **Return fields:** - - ``count`` - actual number of buffers allocated. - - .. warning:: - - The actual number of allocated buffers may differ from the ``count`` - given. The client must check the updated value of ``count`` after the - call returns. - - .. note:: - - To allocate more than the minimum number of buffers (for pipeline - depth), the client may query the ``V4L2_CID_MIN_BUFFERS_FOR_CAPTURE`` - control to get the minimum number of buffers required, and pass the - obtained value plus the number of additional buffers needed in the - ``count`` field to :c:func:`VIDIOC_REQBUFS`. - - Alternatively, :c:func:`VIDIOC_CREATE_BUFS` on the ``CAPTURE`` queue can be - used to have more control over buffer allocation. For example, by - allocating buffers larger than the current ``CAPTURE`` format, future - resolution changes can be accommodated. - - * **Required fields:** - - ``count`` - requested number of buffers to allocate; greater than zero. - - ``type`` - a ``V4L2_BUF_TYPE_*`` enum appropriate for ``CAPTURE``. - - ``memory`` - follows standard semantics. - - ``format`` - a format representing the maximum framebuffer resolution to be - accommodated by newly allocated buffers. - - * **Return fields:** - - ``count`` - adjusted to the number of allocated buffers. - - .. warning:: - - The actual number of allocated buffers may differ from the ``count`` - given. The client must check the updated value of ``count`` after the - call returns. - - .. note:: - - To allocate buffers for a format different than parsed from the stream - metadata, the client must proceed as follows, before the metadata - parsing is initiated: - - * set width and height of the ``OUTPUT`` format to desired coded resolution to - let the decoder configure the ``CAPTURE`` format appropriately, - - * query the ``CAPTURE`` format using :c:func:`VIDIOC_G_FMT` and save it - until this step. - - The format obtained in the query may be then used with - :c:func:`VIDIOC_CREATE_BUFS` in this step to allocate the buffers. - -11. Call :c:func:`VIDIOC_STREAMON` on the ``CAPTURE`` queue to start decoding - frames. - -Decoding -======== - -This state is reached after the `Capture Setup` sequence finishes successfully. -In this state, the client queues and dequeues buffers to both queues via -:c:func:`VIDIOC_QBUF` and :c:func:`VIDIOC_DQBUF`, following the standard -semantics. - -The content of the source ``OUTPUT`` buffers depends on the active coded pixel -format and may be affected by codec-specific extended controls, as stated in -the documentation of each format. - -Both queues operate independently, following the standard behavior of V4L2 -buffer queues and memory-to-memory devices. In addition, the order of decoded -frames dequeued from the ``CAPTURE`` queue may differ from the order of queuing -coded frames to the ``OUTPUT`` queue, due to properties of the selected coded -format, e.g. frame reordering. - -The client must not assume any direct relationship between ``CAPTURE`` -and ``OUTPUT`` buffers and any specific timing of buffers becoming -available to dequeue. Specifically: - -* a buffer queued to ``OUTPUT`` may result in no buffers being produced - on ``CAPTURE`` (e.g. if it does not contain encoded data, or if only - metadata syntax structures are present in it), - -* a buffer queued to ``OUTPUT`` may result in more than one buffer produced - on ``CAPTURE`` (if the encoded data contained more than one frame, or if - returning a decoded frame allowed the decoder to return a frame that - preceded it in decode, but succeeded it in the display order), - -* a buffer queued to ``OUTPUT`` may result in a buffer being produced on - ``CAPTURE`` later into decode process, and/or after processing further - ``OUTPUT`` buffers, or be returned out of order, e.g. if display - reordering is used, - -* buffers may become available on the ``CAPTURE`` queue without additional - buffers queued to ``OUTPUT`` (e.g. during drain or ``EOS``), because of the - ``OUTPUT`` buffers queued in the past whose decoding results are only - available at later time, due to specifics of the decoding process. - -.. note:: - - To allow matching decoded ``CAPTURE`` buffers with ``OUTPUT`` buffers they - originated from, the client can set the ``timestamp`` field of the - :c:type:`v4l2_buffer` struct when queuing an ``OUTPUT`` buffer. The - ``CAPTURE`` buffer(s), which resulted from decoding that ``OUTPUT`` buffer - will have their ``timestamp`` field set to the same value when dequeued. - - In addition to the straightforward case of one ``OUTPUT`` buffer producing - one ``CAPTURE`` buffer, the following cases are defined: - - * one ``OUTPUT`` buffer generates multiple ``CAPTURE`` buffers: the same - ``OUTPUT`` timestamp will be copied to multiple ``CAPTURE`` buffers. - - * multiple ``OUTPUT`` buffers generate one ``CAPTURE`` buffer: timestamp of - the ``OUTPUT`` buffer queued first will be copied. - - * the decoding order differs from the display order (i.e. the ``CAPTURE`` - buffers are out-of-order compared to the ``OUTPUT`` buffers): ``CAPTURE`` - timestamps will not retain the order of ``OUTPUT`` timestamps. - -During the decoding, the decoder may initiate one of the special sequences, as -listed below. The sequences will result in the decoder returning all the -``CAPTURE`` buffers that originated from all the ``OUTPUT`` buffers processed -before the sequence started. Last of the buffers will have the -``V4L2_BUF_FLAG_LAST`` flag set. To determine the sequence to follow, the client -must check if there is any pending event and: - -* if a ``V4L2_EVENT_SOURCE_CHANGE`` event with ``changes`` set to - ``V4L2_EVENT_SRC_CH_RESOLUTION`` is pending, the `Dynamic Resolution - Change` sequence needs to be followed, - -* if a ``V4L2_EVENT_EOS`` event is pending, the `End of Stream` sequence needs - to be followed. - -Some of the sequences can be intermixed with each other and need to be handled -as they happen. The exact operation is documented for each sequence. - -Should a decoding error occur, it will be reported to the client with the level -of details depending on the decoder capabilities. Specifically: - -* the CAPTURE buffer that contains the results of the failed decode operation - will be returned with the V4L2_BUF_FLAG_ERROR flag set, - -* if the decoder is able to precisely report the OUTPUT buffer that triggered - the error, such buffer will be returned with the V4L2_BUF_FLAG_ERROR flag - set. - -In case of a fatal failure that does not allow the decoding to continue, any -further operations on corresponding decoder file handle will return the -EIO -error code. The client may close the file handle and open a new one, or -alternatively reinitialize the instance by stopping streaming on both queues, -releasing all buffers and performing the Initialization sequence again. - -Seek -==== - -Seek is controlled by the ``OUTPUT`` queue, as it is the source of coded data. -The seek does not require any specific operation on the ``CAPTURE`` queue, but -it may be affected as per normal decoder operation. - -1. Stop the ``OUTPUT`` queue to begin the seek sequence via - :c:func:`VIDIOC_STREAMOFF`. - - * **Required fields:** - - ``type`` - a ``V4L2_BUF_TYPE_*`` enum appropriate for ``OUTPUT``. - - * The decoder will drop all the pending ``OUTPUT`` buffers and they must be - treated as returned to the client (following standard semantics). - -2. Restart the ``OUTPUT`` queue via :c:func:`VIDIOC_STREAMON` - - * **Required fields:** - - ``type`` - a ``V4L2_BUF_TYPE_*`` enum appropriate for ``OUTPUT``. - - * The decoder will start accepting new source bytestream buffers after the - call returns. - -3. Start queuing buffers containing coded data after the seek to the ``OUTPUT`` - queue until a suitable resume point is found. - - .. note:: - - There is no requirement to begin queuing coded data starting exactly - from a resume point (e.g. SPS or a keyframe). Any queued ``OUTPUT`` - buffers will be processed and returned to the client until a suitable - resume point is found. While looking for a resume point, the decoder - should not produce any decoded frames into ``CAPTURE`` buffers. - - Some hardware is known to mishandle seeks to a non-resume point. Such an - operation may result in an unspecified number of corrupted decoded frames - being made available on the ``CAPTURE`` queue. Drivers must ensure that - no fatal decoding errors or crashes occur, and implement any necessary - handling and workarounds for hardware issues related to seek operations. - - .. warning:: - - In case of the H.264/HEVC codec, the client must take care not to seek - over a change of SPS/PPS. Even though the target frame could be a - keyframe, the stale SPS/PPS inside decoder state would lead to undefined - results when decoding. Although the decoder must handle that case without - a crash or a fatal decode error, the client must not expect a sensible - decode output. - - If the hardware can detect such corrupted decoded frames, then - corresponding buffers will be returned to the client with the - V4L2_BUF_FLAG_ERROR set. See the `Decoding` section for further - description of decode error reporting. - -4. After a resume point is found, the decoder will start returning ``CAPTURE`` - buffers containing decoded frames. - -.. important:: - - A seek may result in the `Dynamic Resolution Change` sequence being - initiated, due to the seek target having decoding parameters different from - the part of the stream decoded before the seek. The sequence must be handled - as per normal decoder operation. - -.. warning:: - - It is not specified when the ``CAPTURE`` queue starts producing buffers - containing decoded data from the ``OUTPUT`` buffers queued after the seek, - as it operates independently from the ``OUTPUT`` queue. - - The decoder may return a number of remaining ``CAPTURE`` buffers containing - decoded frames originating from the ``OUTPUT`` buffers queued before the - seek sequence is performed. - - The ``VIDIOC_STREAMOFF`` operation discards any remaining queued - ``OUTPUT`` buffers, which means that not all of the ``OUTPUT`` buffers - queued before the seek sequence may have matching ``CAPTURE`` buffers - produced. For example, given the sequence of operations on the - ``OUTPUT`` queue: - - QBUF(A), QBUF(B), STREAMOFF(), STREAMON(), QBUF(G), QBUF(H), - - any of the following results on the ``CAPTURE`` queue is allowed: - - {A’, B’, G’, H’}, {A’, G’, H’}, {G’, H’}. - - To determine the CAPTURE buffer containing the first decoded frame after the - seek, the client may observe the timestamps to match the CAPTURE and OUTPUT - buffers or use V4L2_DEC_CMD_STOP and V4L2_DEC_CMD_START to drain the - decoder. - -.. note:: - - To achieve instantaneous seek, the client may restart streaming on the - ``CAPTURE`` queue too to discard decoded, but not yet dequeued buffers. - -Dynamic Resolution Change -========================= - -Streams that include resolution metadata in the bytestream may require switching -to a different resolution during the decoding. - -.. note:: - - Not all decoders can detect resolution changes. Those that do set the - ``V4L2_FMT_FLAG_DYN_RESOLUTION`` flag for the coded format when - :c:func:`VIDIOC_ENUM_FMT` is called. - -The sequence starts when the decoder detects a coded frame with one or more of -the following parameters different from those previously established (and -reflected by corresponding queries): - -* coded resolution (``OUTPUT`` width and height), - -* visible resolution (selection rectangles), - -* the minimum number of buffers needed for decoding. - -Whenever that happens, the decoder must proceed as follows: - -1. After encountering a resolution change in the stream, the decoder sends a - ``V4L2_EVENT_SOURCE_CHANGE`` event with ``changes`` set to - ``V4L2_EVENT_SRC_CH_RESOLUTION``. - - .. important:: - - Any client query issued after the decoder queues the event will return - values applying to the stream after the resolution change, including - queue formats, selection rectangles and controls. - -2. The decoder will then process and decode all remaining buffers from before - the resolution change point. - - * The last buffer from before the change must be marked with the - ``V4L2_BUF_FLAG_LAST`` flag, similarly to the `Drain` sequence above. - - .. warning:: - - The last buffer may be empty (with :c:type:`v4l2_buffer` ``bytesused`` - = 0) and in that case it must be ignored by the client, as it does not - contain a decoded frame. - - .. note:: - - Any attempt to dequeue more ``CAPTURE`` buffers beyond the buffer marked - with ``V4L2_BUF_FLAG_LAST`` will result in a -EPIPE error from - :c:func:`VIDIOC_DQBUF`. - -The client must continue the sequence as described below to continue the -decoding process. - -1. Dequeue the source change event. - - .. important:: - - A source change triggers an implicit decoder drain, similar to the - explicit `Drain` sequence. The decoder is stopped after it completes. - The decoding process must be resumed with either a pair of calls to - :c:func:`VIDIOC_STREAMOFF` and :c:func:`VIDIOC_STREAMON` on the - ``CAPTURE`` queue, or a call to :c:func:`VIDIOC_DECODER_CMD` with the - ``V4L2_DEC_CMD_START`` command. - -2. Continue with the `Capture Setup` sequence. - -.. note:: - - During the resolution change sequence, the ``OUTPUT`` queue must remain - streaming. Calling :c:func:`VIDIOC_STREAMOFF` on the ``OUTPUT`` queue would - abort the sequence and initiate a seek. - - In principle, the ``OUTPUT`` queue operates separately from the ``CAPTURE`` - queue and this remains true for the duration of the entire resolution change - sequence as well. - - The client should, for best performance and simplicity, keep queuing/dequeuing - buffers to/from the ``OUTPUT`` queue even while processing this sequence. - -Drain -===== - -To ensure that all queued ``OUTPUT`` buffers have been processed and related -``CAPTURE`` buffers are given to the client, the client must follow the drain -sequence described below. After the drain sequence ends, the client has -received all decoded frames for all ``OUTPUT`` buffers queued before the -sequence was started. - -1. Begin drain by issuing :c:func:`VIDIOC_DECODER_CMD`. - - * **Required fields:** - - ``cmd`` - set to ``V4L2_DEC_CMD_STOP``. - - ``flags`` - set to 0. - - ``pts`` - set to 0. - - .. warning:: - - The sequence can be only initiated if both ``OUTPUT`` and ``CAPTURE`` - queues are streaming. For compatibility reasons, the call to - :c:func:`VIDIOC_DECODER_CMD` will not fail even if any of the queues is - not streaming, but at the same time it will not initiate the `Drain` - sequence and so the steps described below would not be applicable. - -2. Any ``OUTPUT`` buffers queued by the client before the - :c:func:`VIDIOC_DECODER_CMD` was issued will be processed and decoded as - normal. The client must continue to handle both queues independently, - similarly to normal decode operation. This includes: - - * handling any operations triggered as a result of processing those buffers, - such as the `Dynamic Resolution Change` sequence, before continuing with - the drain sequence, - - * queuing and dequeuing ``CAPTURE`` buffers, until a buffer marked with the - ``V4L2_BUF_FLAG_LAST`` flag is dequeued, - - .. warning:: - - The last buffer may be empty (with :c:type:`v4l2_buffer` - ``bytesused`` = 0) and in that case it must be ignored by the client, - as it does not contain a decoded frame. - - .. note:: - - Any attempt to dequeue more ``CAPTURE`` buffers beyond the buffer - marked with ``V4L2_BUF_FLAG_LAST`` will result in a -EPIPE error from - :c:func:`VIDIOC_DQBUF`. - - * dequeuing processed ``OUTPUT`` buffers, until all the buffers queued - before the ``V4L2_DEC_CMD_STOP`` command are dequeued, - - * dequeuing the ``V4L2_EVENT_EOS`` event, if the client subscribed to it. - - .. note:: - - For backwards compatibility, the decoder will signal a ``V4L2_EVENT_EOS`` - event when the last frame has been decoded and all frames are ready to be - dequeued. It is a deprecated behavior and the client must not rely on it. - The ``V4L2_BUF_FLAG_LAST`` buffer flag should be used instead. - -3. Once all the ``OUTPUT`` buffers queued before the ``V4L2_DEC_CMD_STOP`` call - are dequeued and the last ``CAPTURE`` buffer is dequeued, the decoder is - stopped and it will accept, but not process, any newly queued ``OUTPUT`` - buffers until the client issues any of the following operations: - - * ``V4L2_DEC_CMD_START`` - the decoder will not be reset and will resume - operation normally, with all the state from before the drain, - - * a pair of :c:func:`VIDIOC_STREAMOFF` and :c:func:`VIDIOC_STREAMON` on the - ``CAPTURE`` queue - the decoder will resume the operation normally, - however any ``CAPTURE`` buffers still in the queue will be returned to the - client, - - * a pair of :c:func:`VIDIOC_STREAMOFF` and :c:func:`VIDIOC_STREAMON` on the - ``OUTPUT`` queue - any pending source buffers will be returned to the - client and the `Seek` sequence will be triggered. - -.. note:: - - Once the drain sequence is initiated, the client needs to drive it to - completion, as described by the steps above, unless it aborts the process by - issuing :c:func:`VIDIOC_STREAMOFF` on any of the ``OUTPUT`` or ``CAPTURE`` - queues. The client is not allowed to issue ``V4L2_DEC_CMD_START`` or - ``V4L2_DEC_CMD_STOP`` again while the drain sequence is in progress and they - will fail with -EBUSY error code if attempted. - - Although mandatory, the availability of decoder commands may be queried - using :c:func:`VIDIOC_TRY_DECODER_CMD`. - -End of Stream -============= - -If the decoder encounters an end of stream marking in the stream, the decoder -will initiate the `Drain` sequence, which the client must handle as described -above, skipping the initial :c:func:`VIDIOC_DECODER_CMD`. - -Commit Points -============= - -Setting formats and allocating buffers trigger changes in the behavior of the -decoder. - -1. Setting the format on the ``OUTPUT`` queue may change the set of formats - supported/advertised on the ``CAPTURE`` queue. In particular, it also means - that the ``CAPTURE`` format may be reset and the client must not rely on the - previously set format being preserved. - -2. Enumerating formats on the ``CAPTURE`` queue always returns only formats - supported for the current ``OUTPUT`` format. - -3. Setting the format on the ``CAPTURE`` queue does not change the list of - formats available on the ``OUTPUT`` queue. An attempt to set a ``CAPTURE`` - format that is not supported for the currently selected ``OUTPUT`` format - will result in the decoder adjusting the requested ``CAPTURE`` format to a - supported one. - -4. Enumerating formats on the ``OUTPUT`` queue always returns the full set of - supported coded formats, irrespectively of the current ``CAPTURE`` format. - -5. While buffers are allocated on any of the ``OUTPUT`` or ``CAPTURE`` queues, - the client must not change the format on the ``OUTPUT`` queue. Drivers will - return the -EBUSY error code for any such format change attempt. - -To summarize, setting formats and allocation must always start with the -``OUTPUT`` queue and the ``OUTPUT`` queue is the master that governs the -set of supported formats for the ``CAPTURE`` queue. |