184d33341SMauro Carvalho Chehab.. SPDX-License-Identifier: GPL-2.0 OR GFDL-1.1-no-invariants-or-later
29ec656cfSTomasz Figa
39ec656cfSTomasz Figa.. _encoder:
49ec656cfSTomasz Figa
59ec656cfSTomasz Figa*************************************************
69ec656cfSTomasz FigaMemory-to-Memory Stateful Video Encoder Interface
79ec656cfSTomasz Figa*************************************************
89ec656cfSTomasz Figa
99ec656cfSTomasz FigaA stateful video encoder takes raw video frames in display order and encodes
109ec656cfSTomasz Figathem into a bytestream. It generates complete chunks of the bytestream, including
119ec656cfSTomasz Figaall metadata, headers, etc. The resulting bytestream does not require any
129ec656cfSTomasz Figafurther post-processing by the client.
139ec656cfSTomasz Figa
149ec656cfSTomasz FigaPerforming software stream processing, header generation etc. in the driver
159ec656cfSTomasz Figain order to support this interface is strongly discouraged. In case such
169ec656cfSTomasz Figaoperations are needed, use of the Stateless Video Encoder Interface (in
179ec656cfSTomasz Figadevelopment) is strongly advised.
189ec656cfSTomasz Figa
199ec656cfSTomasz FigaConventions and Notations Used in This Document
209ec656cfSTomasz Figa===============================================
219ec656cfSTomasz Figa
229ec656cfSTomasz Figa1. The general V4L2 API rules apply if not specified in this document
239ec656cfSTomasz Figa   otherwise.
249ec656cfSTomasz Figa
259ec656cfSTomasz Figa2. The meaning of words "must", "may", "should", etc. is as per `RFC
269ec656cfSTomasz Figa   2119 <https://tools.ietf.org/html/rfc2119>`_.
279ec656cfSTomasz Figa
289ec656cfSTomasz Figa3. All steps not marked "optional" are required.
299ec656cfSTomasz Figa
309ec656cfSTomasz Figa4. :c:func:`VIDIOC_G_EXT_CTRLS` and :c:func:`VIDIOC_S_EXT_CTRLS` may be used
319ec656cfSTomasz Figa   interchangeably with :c:func:`VIDIOC_G_CTRL` and :c:func:`VIDIOC_S_CTRL`,
329ec656cfSTomasz Figa   unless specified otherwise.
339ec656cfSTomasz Figa
349ec656cfSTomasz Figa5. Single-planar API (see :ref:`planar-apis`) and applicable structures may be
359ec656cfSTomasz Figa   used interchangeably with multi-planar API, unless specified otherwise,
369ec656cfSTomasz Figa   depending on encoder capabilities and following the general V4L2 guidelines.
379ec656cfSTomasz Figa
389ec656cfSTomasz Figa6. i = [a..b]: sequence of integers from a to b, inclusive, i.e. i =
399ec656cfSTomasz Figa   [0..2]: i = 0, 1, 2.
409ec656cfSTomasz Figa
419ec656cfSTomasz Figa7. Given an ``OUTPUT`` buffer A, then A' represents a buffer on the ``CAPTURE``
429ec656cfSTomasz Figa   queue containing data that resulted from processing buffer A.
439ec656cfSTomasz Figa
449ec656cfSTomasz FigaGlossary
459ec656cfSTomasz Figa========
469ec656cfSTomasz Figa
479ec656cfSTomasz FigaRefer to :ref:`decoder-glossary`.
489ec656cfSTomasz Figa
499ec656cfSTomasz FigaState Machine
509ec656cfSTomasz Figa=============
519ec656cfSTomasz Figa
529ec656cfSTomasz Figa.. kernel-render:: DOT
539ec656cfSTomasz Figa   :alt: DOT digraph of encoder state machine
549ec656cfSTomasz Figa   :caption: Encoder State Machine
559ec656cfSTomasz Figa
569ec656cfSTomasz Figa   digraph encoder_state_machine {
579ec656cfSTomasz Figa       node [shape = doublecircle, label="Encoding"] Encoding;
589ec656cfSTomasz Figa
599ec656cfSTomasz Figa       node [shape = circle, label="Initialization"] Initialization;
609ec656cfSTomasz Figa       node [shape = circle, label="Stopped"] Stopped;
619ec656cfSTomasz Figa       node [shape = circle, label="Drain"] Drain;
629ec656cfSTomasz Figa       node [shape = circle, label="Reset"] Reset;
639ec656cfSTomasz Figa
649ec656cfSTomasz Figa       node [shape = point]; qi
659ec656cfSTomasz Figa       qi -> Initialization [ label = "open()" ];
669ec656cfSTomasz Figa
679ec656cfSTomasz Figa       Initialization -> Encoding [ label = "Both queues streaming" ];
689ec656cfSTomasz Figa
699ec656cfSTomasz Figa       Encoding -> Drain [ label = "V4L2_ENC_CMD_STOP" ];
709ec656cfSTomasz Figa       Encoding -> Reset [ label = "VIDIOC_STREAMOFF(CAPTURE)" ];
719ec656cfSTomasz Figa       Encoding -> Stopped [ label = "VIDIOC_STREAMOFF(OUTPUT)" ];
729ec656cfSTomasz Figa       Encoding -> Encoding;
739ec656cfSTomasz Figa
749ec656cfSTomasz Figa       Drain -> Stopped [ label = "All CAPTURE\nbuffers dequeued\nor\nVIDIOC_STREAMOFF(OUTPUT)" ];
759ec656cfSTomasz Figa       Drain -> Reset [ label = "VIDIOC_STREAMOFF(CAPTURE)" ];
769ec656cfSTomasz Figa
779ec656cfSTomasz Figa       Reset -> Encoding [ label = "VIDIOC_STREAMON(CAPTURE)" ];
789ec656cfSTomasz Figa       Reset -> Initialization [ label = "VIDIOC_REQBUFS(OUTPUT, 0)" ];
799ec656cfSTomasz Figa
809ec656cfSTomasz Figa       Stopped -> Encoding [ label = "V4L2_ENC_CMD_START\nor\nVIDIOC_STREAMON(OUTPUT)" ];
819ec656cfSTomasz Figa       Stopped -> Reset [ label = "VIDIOC_STREAMOFF(CAPTURE)" ];
829ec656cfSTomasz Figa   }
839ec656cfSTomasz Figa
849ec656cfSTomasz FigaQuerying Capabilities
859ec656cfSTomasz Figa=====================
869ec656cfSTomasz Figa
879ec656cfSTomasz Figa1. To enumerate the set of coded formats supported by the encoder, the
889ec656cfSTomasz Figa   client may call :c:func:`VIDIOC_ENUM_FMT` on ``CAPTURE``.
899ec656cfSTomasz Figa
909ec656cfSTomasz Figa   * The full set of supported formats will be returned, regardless of the
919ec656cfSTomasz Figa     format set on ``OUTPUT``.
929ec656cfSTomasz Figa
939ec656cfSTomasz Figa2. To enumerate the set of supported raw formats, the client may call
949ec656cfSTomasz Figa   :c:func:`VIDIOC_ENUM_FMT` on ``OUTPUT``.
959ec656cfSTomasz Figa
969ec656cfSTomasz Figa   * Only the formats supported for the format currently active on ``CAPTURE``
979ec656cfSTomasz Figa     will be returned.
989ec656cfSTomasz Figa
999ec656cfSTomasz Figa   * In order to enumerate raw formats supported by a given coded format,
1009ec656cfSTomasz Figa     the client must first set that coded format on ``CAPTURE`` and then
1019ec656cfSTomasz Figa     enumerate the formats on ``OUTPUT``.
1029ec656cfSTomasz Figa
1039ec656cfSTomasz Figa3. The client may use :c:func:`VIDIOC_ENUM_FRAMESIZES` to detect supported
1049ec656cfSTomasz Figa   resolutions for a given format, passing the desired pixel format in
1059ec656cfSTomasz Figa   :c:type:`v4l2_frmsizeenum` ``pixel_format``.
1069ec656cfSTomasz Figa
1079ec656cfSTomasz Figa   * Values returned by :c:func:`VIDIOC_ENUM_FRAMESIZES` for a coded pixel
1089ec656cfSTomasz Figa     format will include all possible coded resolutions supported by the
1099ec656cfSTomasz Figa     encoder for the given coded pixel format.
1109ec656cfSTomasz Figa
1119ec656cfSTomasz Figa   * Values returned by :c:func:`VIDIOC_ENUM_FRAMESIZES` for a raw pixel format
1129ec656cfSTomasz Figa     will include all possible frame buffer resolutions supported by the
1139ec656cfSTomasz Figa     encoder for the given raw pixel format and coded format currently set on
1149ec656cfSTomasz Figa     ``CAPTURE``.
1159ec656cfSTomasz Figa
1169ec656cfSTomasz Figa4. The client may use :c:func:`VIDIOC_ENUM_FRAMEINTERVALS` to detect supported
1179ec656cfSTomasz Figa   frame intervals for a given format and resolution, passing the desired pixel
118*992ba89dSPaul Kocialkowski   format in :c:type:`v4l2_frmivalenum` ``pixel_format`` and the resolution
119*992ba89dSPaul Kocialkowski   in :c:type:`v4l2_frmivalenum` ``width`` and :c:type:`v4l2_frmivalenum`
1209ec656cfSTomasz Figa   ``height``.
1219ec656cfSTomasz Figa
1229ec656cfSTomasz Figa   * Values returned by :c:func:`VIDIOC_ENUM_FRAMEINTERVALS` for a coded pixel
1239ec656cfSTomasz Figa     format and coded resolution will include all possible frame intervals
1249ec656cfSTomasz Figa     supported by the encoder for the given coded pixel format and resolution.
1259ec656cfSTomasz Figa
1269ec656cfSTomasz Figa   * Values returned by :c:func:`VIDIOC_ENUM_FRAMEINTERVALS` for a raw pixel
1279ec656cfSTomasz Figa     format and resolution will include all possible frame intervals supported
1289ec656cfSTomasz Figa     by the encoder for the given raw pixel format and resolution and for the
1299ec656cfSTomasz Figa     coded format, coded resolution and coded frame interval currently set on
1309ec656cfSTomasz Figa     ``CAPTURE``.
1319ec656cfSTomasz Figa
1329ec656cfSTomasz Figa   * Support for :c:func:`VIDIOC_ENUM_FRAMEINTERVALS` is optional. If it is
1339ec656cfSTomasz Figa     not implemented, then there are no special restrictions other than the
1349ec656cfSTomasz Figa     limits of the codec itself.
1359ec656cfSTomasz Figa
1369ec656cfSTomasz Figa5. Supported profiles and levels for the coded format currently set on
1379ec656cfSTomasz Figa   ``CAPTURE``, if applicable, may be queried using their respective controls
1389ec656cfSTomasz Figa   via :c:func:`VIDIOC_QUERYCTRL`.
1399ec656cfSTomasz Figa
1409ec656cfSTomasz Figa6. Any additional encoder capabilities may be discovered by querying
1419ec656cfSTomasz Figa   their respective controls.
1429ec656cfSTomasz Figa
1439ec656cfSTomasz FigaInitialization
1449ec656cfSTomasz Figa==============
1459ec656cfSTomasz Figa
1469ec656cfSTomasz Figa1. Set the coded format on the ``CAPTURE`` queue via :c:func:`VIDIOC_S_FMT`.
1479ec656cfSTomasz Figa
1489ec656cfSTomasz Figa   * **Required fields:**
1499ec656cfSTomasz Figa
1509ec656cfSTomasz Figa     ``type``
1519ec656cfSTomasz Figa         a ``V4L2_BUF_TYPE_*`` enum appropriate for ``CAPTURE``.
1529ec656cfSTomasz Figa
1539ec656cfSTomasz Figa     ``pixelformat``
1549ec656cfSTomasz Figa         the coded format to be produced.
1559ec656cfSTomasz Figa
1569ec656cfSTomasz Figa     ``sizeimage``
1579ec656cfSTomasz Figa         desired size of ``CAPTURE`` buffers; the encoder may adjust it to
1589ec656cfSTomasz Figa         match hardware requirements.
1599ec656cfSTomasz Figa
1609ec656cfSTomasz Figa     ``width``, ``height``
1619ec656cfSTomasz Figa         ignored (read-only).
1629ec656cfSTomasz Figa
1639ec656cfSTomasz Figa     other fields
1649ec656cfSTomasz Figa         follow standard semantics.
1659ec656cfSTomasz Figa
1661073f441SPaul Kocialkowski   * **Returned fields:**
1679ec656cfSTomasz Figa
1689ec656cfSTomasz Figa     ``sizeimage``
1699ec656cfSTomasz Figa         adjusted size of ``CAPTURE`` buffers.
1709ec656cfSTomasz Figa
1719ec656cfSTomasz Figa     ``width``, ``height``
1729ec656cfSTomasz Figa         the coded size selected by the encoder based on current state, e.g.
1739ec656cfSTomasz Figa         ``OUTPUT`` format, selection rectangles, etc. (read-only).
1749ec656cfSTomasz Figa
1759ec656cfSTomasz Figa   .. important::
1769ec656cfSTomasz Figa
1779ec656cfSTomasz Figa      Changing the ``CAPTURE`` format may change the currently set ``OUTPUT``
1789ec656cfSTomasz Figa      format. How the new ``OUTPUT`` format is determined is up to the encoder
1799ec656cfSTomasz Figa      and the client must ensure it matches its needs afterwards.
1809ec656cfSTomasz Figa
1819ec656cfSTomasz Figa2. **Optional.** Enumerate supported ``OUTPUT`` formats (raw formats for
1829ec656cfSTomasz Figa   source) for the selected coded format via :c:func:`VIDIOC_ENUM_FMT`.
1839ec656cfSTomasz Figa
1849ec656cfSTomasz Figa   * **Required fields:**
1859ec656cfSTomasz Figa
1869ec656cfSTomasz Figa     ``type``
1879ec656cfSTomasz Figa         a ``V4L2_BUF_TYPE_*`` enum appropriate for ``OUTPUT``.
1889ec656cfSTomasz Figa
1899ec656cfSTomasz Figa     other fields
1909ec656cfSTomasz Figa         follow standard semantics.
1919ec656cfSTomasz Figa
1921073f441SPaul Kocialkowski   * **Returned fields:**
1939ec656cfSTomasz Figa
1949ec656cfSTomasz Figa     ``pixelformat``
1959ec656cfSTomasz Figa         raw format supported for the coded format currently selected on
1969ec656cfSTomasz Figa         the ``CAPTURE`` queue.
1979ec656cfSTomasz Figa
1989ec656cfSTomasz Figa     other fields
1999ec656cfSTomasz Figa         follow standard semantics.
2009ec656cfSTomasz Figa
2019ec656cfSTomasz Figa3. Set the raw source format on the ``OUTPUT`` queue via
2029ec656cfSTomasz Figa   :c:func:`VIDIOC_S_FMT`.
2039ec656cfSTomasz Figa
2049ec656cfSTomasz Figa   * **Required fields:**
2059ec656cfSTomasz Figa
2069ec656cfSTomasz Figa     ``type``
2079ec656cfSTomasz Figa         a ``V4L2_BUF_TYPE_*`` enum appropriate for ``OUTPUT``.
2089ec656cfSTomasz Figa
2099ec656cfSTomasz Figa     ``pixelformat``
2109ec656cfSTomasz Figa         raw format of the source.
2119ec656cfSTomasz Figa
2129ec656cfSTomasz Figa     ``width``, ``height``
2139ec656cfSTomasz Figa         source resolution.
2149ec656cfSTomasz Figa
2159ec656cfSTomasz Figa     other fields
2169ec656cfSTomasz Figa         follow standard semantics.
2179ec656cfSTomasz Figa
2181073f441SPaul Kocialkowski   * **Returned fields:**
2199ec656cfSTomasz Figa
2209ec656cfSTomasz Figa     ``width``, ``height``
2219ec656cfSTomasz Figa         may be adjusted to match encoder minimums, maximums and alignment
2229ec656cfSTomasz Figa         requirements, as required by the currently selected formats, as
2239ec656cfSTomasz Figa         reported by :c:func:`VIDIOC_ENUM_FRAMESIZES`.
2249ec656cfSTomasz Figa
2259ec656cfSTomasz Figa     other fields
2269ec656cfSTomasz Figa         follow standard semantics.
2279ec656cfSTomasz Figa
2289ec656cfSTomasz Figa   * Setting the ``OUTPUT`` format will reset the selection rectangles to their
2299ec656cfSTomasz Figa     default values, based on the new resolution, as described in the next
2309ec656cfSTomasz Figa     step.
2319ec656cfSTomasz Figa
2329ec656cfSTomasz Figa4. Set the raw frame interval on the ``OUTPUT`` queue via
2339ec656cfSTomasz Figa   :c:func:`VIDIOC_S_PARM`. This also sets the coded frame interval on the
2349ec656cfSTomasz Figa   ``CAPTURE`` queue to the same value.
2359ec656cfSTomasz Figa
2369ec656cfSTomasz Figa   * **Required fields:**
2379ec656cfSTomasz Figa
2389ec656cfSTomasz Figa     ``type``
2399ec656cfSTomasz Figa	 a ``V4L2_BUF_TYPE_*`` enum appropriate for ``OUTPUT``.
2409ec656cfSTomasz Figa
2419ec656cfSTomasz Figa     ``parm.output``
2429ec656cfSTomasz Figa	 set all fields except ``parm.output.timeperframe`` to 0.
2439ec656cfSTomasz Figa
2449ec656cfSTomasz Figa     ``parm.output.timeperframe``
2459ec656cfSTomasz Figa	 the desired frame interval; the encoder may adjust it to
2469ec656cfSTomasz Figa	 match hardware requirements.
2479ec656cfSTomasz Figa
2481073f441SPaul Kocialkowski   * **Returned fields:**
2499ec656cfSTomasz Figa
2509ec656cfSTomasz Figa     ``parm.output.timeperframe``
2519ec656cfSTomasz Figa	 the adjusted frame interval.
2529ec656cfSTomasz Figa
2539ec656cfSTomasz Figa   .. important::
2549ec656cfSTomasz Figa
2559ec656cfSTomasz Figa      Changing the ``OUTPUT`` frame interval *also* sets the framerate that
2569ec656cfSTomasz Figa      the encoder uses to encode the video. So setting the frame interval
2579ec656cfSTomasz Figa      to 1/24 (or 24 frames per second) will produce a coded video stream
2589ec656cfSTomasz Figa      that can be played back at that speed. The frame interval for the
2599ec656cfSTomasz Figa      ``OUTPUT`` queue is just a hint, the application may provide raw
2609ec656cfSTomasz Figa      frames at a different rate. It can be used by the driver to help
2619ec656cfSTomasz Figa      schedule multiple encoders running in parallel.
2629ec656cfSTomasz Figa
2639ec656cfSTomasz Figa      In the next step the ``CAPTURE`` frame interval can optionally be
2649ec656cfSTomasz Figa      changed to a different value. This is useful for off-line encoding
2659ec656cfSTomasz Figa      were the coded frame interval can be different from the rate at
2669ec656cfSTomasz Figa      which raw frames are supplied.
2679ec656cfSTomasz Figa
2689ec656cfSTomasz Figa   .. important::
2699ec656cfSTomasz Figa
2709ec656cfSTomasz Figa      ``timeperframe`` deals with *frames*, not fields. So for interlaced
2719ec656cfSTomasz Figa      formats this is the time per two fields, since a frame consists of
2729ec656cfSTomasz Figa      a top and a bottom field.
2739ec656cfSTomasz Figa
2749ec656cfSTomasz Figa   .. note::
2759ec656cfSTomasz Figa
2769ec656cfSTomasz Figa      It is due to historical reasons that changing the ``OUTPUT`` frame
2779ec656cfSTomasz Figa      interval also changes the coded frame interval on the ``CAPTURE``
2789ec656cfSTomasz Figa      queue. Ideally these would be independent settings, but that would
2799ec656cfSTomasz Figa      break the existing API.
2809ec656cfSTomasz Figa
2819ec656cfSTomasz Figa5. **Optional** Set the coded frame interval on the ``CAPTURE`` queue via
2829ec656cfSTomasz Figa   :c:func:`VIDIOC_S_PARM`. This is only necessary if the coded frame
2839ec656cfSTomasz Figa   interval is different from the raw frame interval, which is typically
284d0938277SHans Verkuil   the case for off-line encoding. Support for this feature is signalled
285d0938277SHans Verkuil   by the :ref:`V4L2_FMT_FLAG_ENC_CAP_FRAME_INTERVAL <fmtdesc-flags>` format flag.
2869ec656cfSTomasz Figa
2879ec656cfSTomasz Figa   * **Required fields:**
2889ec656cfSTomasz Figa
2899ec656cfSTomasz Figa     ``type``
2909ec656cfSTomasz Figa	 a ``V4L2_BUF_TYPE_*`` enum appropriate for ``CAPTURE``.
2919ec656cfSTomasz Figa
2929ec656cfSTomasz Figa     ``parm.capture``
2939ec656cfSTomasz Figa	 set all fields except ``parm.capture.timeperframe`` to 0.
2949ec656cfSTomasz Figa
2959ec656cfSTomasz Figa     ``parm.capture.timeperframe``
2969ec656cfSTomasz Figa	 the desired coded frame interval; the encoder may adjust it to
2979ec656cfSTomasz Figa	 match hardware requirements.
2989ec656cfSTomasz Figa
2991073f441SPaul Kocialkowski   * **Returned fields:**
3009ec656cfSTomasz Figa
3019ec656cfSTomasz Figa     ``parm.capture.timeperframe``
3029ec656cfSTomasz Figa	 the adjusted frame interval.
3039ec656cfSTomasz Figa
3049ec656cfSTomasz Figa   .. important::
3059ec656cfSTomasz Figa
3069ec656cfSTomasz Figa      Changing the ``CAPTURE`` frame interval sets the framerate for the
3079ec656cfSTomasz Figa      coded video. It does *not* set the rate at which buffers arrive on the
3089ec656cfSTomasz Figa      ``CAPTURE`` queue, that depends on how fast the encoder is and how
3099ec656cfSTomasz Figa      fast raw frames are queued on the ``OUTPUT`` queue.
3109ec656cfSTomasz Figa
3119ec656cfSTomasz Figa   .. important::
3129ec656cfSTomasz Figa
3139ec656cfSTomasz Figa      ``timeperframe`` deals with *frames*, not fields. So for interlaced
3149ec656cfSTomasz Figa      formats this is the time per two fields, since a frame consists of
3159ec656cfSTomasz Figa      a top and a bottom field.
3169ec656cfSTomasz Figa
3179ec656cfSTomasz Figa   .. note::
3189ec656cfSTomasz Figa
3199ec656cfSTomasz Figa      Not all drivers support this functionality, in that case just set
3209ec656cfSTomasz Figa      the desired coded frame interval for the ``OUTPUT`` queue.
3219ec656cfSTomasz Figa
3229ec656cfSTomasz Figa      However, drivers that can schedule multiple encoders based on the
3239ec656cfSTomasz Figa      ``OUTPUT`` frame interval must support this optional feature.
3249ec656cfSTomasz Figa
3259ec656cfSTomasz Figa6. **Optional.** Set the visible resolution for the stream metadata via
3269ec656cfSTomasz Figa   :c:func:`VIDIOC_S_SELECTION` on the ``OUTPUT`` queue if it is desired
3279ec656cfSTomasz Figa   to be different than the full OUTPUT resolution.
3289ec656cfSTomasz Figa
3299ec656cfSTomasz Figa   * **Required fields:**
3309ec656cfSTomasz Figa
3319ec656cfSTomasz Figa     ``type``
3329ec656cfSTomasz Figa         a ``V4L2_BUF_TYPE_*`` enum appropriate for ``OUTPUT``.
3339ec656cfSTomasz Figa
3349ec656cfSTomasz Figa     ``target``
3359ec656cfSTomasz Figa         set to ``V4L2_SEL_TGT_CROP``.
3369ec656cfSTomasz Figa
3379ec656cfSTomasz Figa     ``r.left``, ``r.top``, ``r.width``, ``r.height``
3389ec656cfSTomasz Figa         visible rectangle; this must fit within the `V4L2_SEL_TGT_CROP_BOUNDS`
3399ec656cfSTomasz Figa         rectangle and may be subject to adjustment to match codec and
3409ec656cfSTomasz Figa         hardware constraints.
3419ec656cfSTomasz Figa
3421073f441SPaul Kocialkowski   * **Returned fields:**
3439ec656cfSTomasz Figa
3449ec656cfSTomasz Figa     ``r.left``, ``r.top``, ``r.width``, ``r.height``
3459ec656cfSTomasz Figa         visible rectangle adjusted by the encoder.
3469ec656cfSTomasz Figa
3479ec656cfSTomasz Figa   * The following selection targets are supported on ``OUTPUT``:
3489ec656cfSTomasz Figa
3499ec656cfSTomasz Figa     ``V4L2_SEL_TGT_CROP_BOUNDS``
3509ec656cfSTomasz Figa         equal to the full source frame, matching the active ``OUTPUT``
3519ec656cfSTomasz Figa         format.
3529ec656cfSTomasz Figa
3539ec656cfSTomasz Figa     ``V4L2_SEL_TGT_CROP_DEFAULT``
3549ec656cfSTomasz Figa         equal to ``V4L2_SEL_TGT_CROP_BOUNDS``.
3559ec656cfSTomasz Figa
3569ec656cfSTomasz Figa     ``V4L2_SEL_TGT_CROP``
3579ec656cfSTomasz Figa         rectangle within the source buffer to be encoded into the
3589ec656cfSTomasz Figa         ``CAPTURE`` stream; defaults to ``V4L2_SEL_TGT_CROP_DEFAULT``.
3599ec656cfSTomasz Figa
3609ec656cfSTomasz Figa         .. note::
3619ec656cfSTomasz Figa
3629ec656cfSTomasz Figa            A common use case for this selection target is encoding a source
3639ec656cfSTomasz Figa            video with a resolution that is not a multiple of a macroblock,
3649ec656cfSTomasz Figa            e.g.  the common 1920x1080 resolution may require the source
3659ec656cfSTomasz Figa            buffers to be aligned to 1920x1088 for codecs with 16x16 macroblock
3669ec656cfSTomasz Figa            size. To avoid encoding the padding, the client needs to explicitly
3679ec656cfSTomasz Figa            configure this selection target to 1920x1080.
3689ec656cfSTomasz Figa
3699ec656cfSTomasz Figa   .. warning::
3709ec656cfSTomasz Figa
3719ec656cfSTomasz Figa      The encoder may adjust the crop/compose rectangles to the nearest
3729ec656cfSTomasz Figa      supported ones to meet codec and hardware requirements. The client needs
3739ec656cfSTomasz Figa      to check the adjusted rectangle returned by :c:func:`VIDIOC_S_SELECTION`.
3749ec656cfSTomasz Figa
3759ec656cfSTomasz Figa7. Allocate buffers for both ``OUTPUT`` and ``CAPTURE`` via
3769ec656cfSTomasz Figa   :c:func:`VIDIOC_REQBUFS`. This may be performed in any order.
3779ec656cfSTomasz Figa
3789ec656cfSTomasz Figa   * **Required fields:**
3799ec656cfSTomasz Figa
3809ec656cfSTomasz Figa     ``count``
3819ec656cfSTomasz Figa         requested number of buffers to allocate; greater than zero.
3829ec656cfSTomasz Figa
3839ec656cfSTomasz Figa     ``type``
3849ec656cfSTomasz Figa         a ``V4L2_BUF_TYPE_*`` enum appropriate for ``OUTPUT`` or
3859ec656cfSTomasz Figa         ``CAPTURE``.
3869ec656cfSTomasz Figa
3879ec656cfSTomasz Figa     other fields
3889ec656cfSTomasz Figa         follow standard semantics.
3899ec656cfSTomasz Figa
3901073f441SPaul Kocialkowski   * **Returned fields:**
3919ec656cfSTomasz Figa
3929ec656cfSTomasz Figa     ``count``
3939ec656cfSTomasz Figa          actual number of buffers allocated.
3949ec656cfSTomasz Figa
3959ec656cfSTomasz Figa   .. warning::
3969ec656cfSTomasz Figa
3979ec656cfSTomasz Figa      The actual number of allocated buffers may differ from the ``count``
3989ec656cfSTomasz Figa      given. The client must check the updated value of ``count`` after the
3999ec656cfSTomasz Figa      call returns.
4009ec656cfSTomasz Figa
4019ec656cfSTomasz Figa   .. note::
4029ec656cfSTomasz Figa
4039ec656cfSTomasz Figa      To allocate more than the minimum number of OUTPUT buffers (for pipeline
4049ec656cfSTomasz Figa      depth), the client may query the ``V4L2_CID_MIN_BUFFERS_FOR_OUTPUT``
4059ec656cfSTomasz Figa      control to get the minimum number of buffers required, and pass the
4069ec656cfSTomasz Figa      obtained value plus the number of additional buffers needed in the
4079ec656cfSTomasz Figa      ``count`` field to :c:func:`VIDIOC_REQBUFS`.
4089ec656cfSTomasz Figa
4099ec656cfSTomasz Figa   Alternatively, :c:func:`VIDIOC_CREATE_BUFS` can be used to have more
4109ec656cfSTomasz Figa   control over buffer allocation.
4119ec656cfSTomasz Figa
4129ec656cfSTomasz Figa   * **Required fields:**
4139ec656cfSTomasz Figa
4149ec656cfSTomasz Figa     ``count``
4159ec656cfSTomasz Figa         requested number of buffers to allocate; greater than zero.
4169ec656cfSTomasz Figa
4179ec656cfSTomasz Figa     ``type``
4189ec656cfSTomasz Figa         a ``V4L2_BUF_TYPE_*`` enum appropriate for ``OUTPUT``.
4199ec656cfSTomasz Figa
4209ec656cfSTomasz Figa     other fields
4219ec656cfSTomasz Figa         follow standard semantics.
4229ec656cfSTomasz Figa
4231073f441SPaul Kocialkowski   * **Returned fields:**
4249ec656cfSTomasz Figa
4259ec656cfSTomasz Figa     ``count``
4269ec656cfSTomasz Figa         adjusted to the number of allocated buffers.
4279ec656cfSTomasz Figa
4289ec656cfSTomasz Figa8. Begin streaming on both ``OUTPUT`` and ``CAPTURE`` queues via
4299ec656cfSTomasz Figa   :c:func:`VIDIOC_STREAMON`. This may be performed in any order. The actual
4309ec656cfSTomasz Figa   encoding process starts when both queues start streaming.
4319ec656cfSTomasz Figa
4329ec656cfSTomasz Figa.. note::
4339ec656cfSTomasz Figa
4349ec656cfSTomasz Figa   If the client stops the ``CAPTURE`` queue during the encode process and then
4359ec656cfSTomasz Figa   restarts it again, the encoder will begin generating a stream independent
4369ec656cfSTomasz Figa   from the stream generated before the stop. The exact constraints depend
4379ec656cfSTomasz Figa   on the coded format, but may include the following implications:
4389ec656cfSTomasz Figa
4399ec656cfSTomasz Figa   * encoded frames produced after the restart must not reference any
4409ec656cfSTomasz Figa     frames produced before the stop, e.g. no long term references for
4419ec656cfSTomasz Figa     H.264/HEVC,
4429ec656cfSTomasz Figa
4439ec656cfSTomasz Figa   * any headers that must be included in a standalone stream must be
4449ec656cfSTomasz Figa     produced again, e.g. SPS and PPS for H.264/HEVC.
4459ec656cfSTomasz Figa
4469ec656cfSTomasz FigaEncoding
4479ec656cfSTomasz Figa========
4489ec656cfSTomasz Figa
4499ec656cfSTomasz FigaThis state is reached after the `Initialization` sequence finishes
4509ec656cfSTomasz Figasuccessfully.  In this state, the client queues and dequeues buffers to both
4519ec656cfSTomasz Figaqueues via :c:func:`VIDIOC_QBUF` and :c:func:`VIDIOC_DQBUF`, following the
4529ec656cfSTomasz Figastandard semantics.
4539ec656cfSTomasz Figa
4549ec656cfSTomasz FigaThe content of encoded ``CAPTURE`` buffers depends on the active coded pixel
4559ec656cfSTomasz Figaformat and may be affected by codec-specific extended controls, as stated
4569ec656cfSTomasz Figain the documentation of each format.
4579ec656cfSTomasz Figa
4589ec656cfSTomasz FigaBoth queues operate independently, following standard behavior of V4L2 buffer
4599ec656cfSTomasz Figaqueues and memory-to-memory devices. In addition, the order of encoded frames
4609ec656cfSTomasz Figadequeued from the ``CAPTURE`` queue may differ from the order of queuing raw
4619ec656cfSTomasz Figaframes to the ``OUTPUT`` queue, due to properties of the selected coded format,
4629ec656cfSTomasz Figae.g. frame reordering.
4639ec656cfSTomasz Figa
4649ec656cfSTomasz FigaThe client must not assume any direct relationship between ``CAPTURE`` and
4659ec656cfSTomasz Figa``OUTPUT`` buffers and any specific timing of buffers becoming
4669ec656cfSTomasz Figaavailable to dequeue. Specifically:
4679ec656cfSTomasz Figa
4689ec656cfSTomasz Figa* a buffer queued to ``OUTPUT`` may result in more than one buffer produced on
4699ec656cfSTomasz Figa  ``CAPTURE`` (for example, if returning an encoded frame allowed the encoder
4709ec656cfSTomasz Figa  to return a frame that preceded it in display, but succeeded it in the decode
4719ec656cfSTomasz Figa  order; however, there may be other reasons for this as well),
4729ec656cfSTomasz Figa
4739ec656cfSTomasz Figa* a buffer queued to ``OUTPUT`` may result in a buffer being produced on
4749ec656cfSTomasz Figa  ``CAPTURE`` later into encode process, and/or after processing further
4759ec656cfSTomasz Figa  ``OUTPUT`` buffers, or be returned out of order, e.g. if display
4769ec656cfSTomasz Figa  reordering is used,
4779ec656cfSTomasz Figa
4789ec656cfSTomasz Figa* buffers may become available on the ``CAPTURE`` queue without additional
4799ec656cfSTomasz Figa  buffers queued to ``OUTPUT`` (e.g. during drain or ``EOS``), because of the
4809ec656cfSTomasz Figa  ``OUTPUT`` buffers queued in the past whose encoding results are only
4819ec656cfSTomasz Figa  available at later time, due to specifics of the encoding process,
4829ec656cfSTomasz Figa
4839ec656cfSTomasz Figa* buffers queued to ``OUTPUT`` may not become available to dequeue instantly
4849ec656cfSTomasz Figa  after being encoded into a corresponding ``CAPTURE`` buffer, e.g. if the
4859ec656cfSTomasz Figa  encoder needs to use the frame as a reference for encoding further frames.
4869ec656cfSTomasz Figa
4879ec656cfSTomasz Figa.. note::
4889ec656cfSTomasz Figa
4899ec656cfSTomasz Figa   To allow matching encoded ``CAPTURE`` buffers with ``OUTPUT`` buffers they
4909ec656cfSTomasz Figa   originated from, the client can set the ``timestamp`` field of the
4919ec656cfSTomasz Figa   :c:type:`v4l2_buffer` struct when queuing an ``OUTPUT`` buffer. The
4929ec656cfSTomasz Figa   ``CAPTURE`` buffer(s), which resulted from encoding that ``OUTPUT`` buffer
4939ec656cfSTomasz Figa   will have their ``timestamp`` field set to the same value when dequeued.
4949ec656cfSTomasz Figa
4959ec656cfSTomasz Figa   In addition to the straightforward case of one ``OUTPUT`` buffer producing
4969ec656cfSTomasz Figa   one ``CAPTURE`` buffer, the following cases are defined:
4979ec656cfSTomasz Figa
4989ec656cfSTomasz Figa   * one ``OUTPUT`` buffer generates multiple ``CAPTURE`` buffers: the same
4999ec656cfSTomasz Figa     ``OUTPUT`` timestamp will be copied to multiple ``CAPTURE`` buffers,
5009ec656cfSTomasz Figa
5019ec656cfSTomasz Figa   * the encoding order differs from the presentation order (i.e. the
5029ec656cfSTomasz Figa     ``CAPTURE`` buffers are out-of-order compared to the ``OUTPUT`` buffers):
5039ec656cfSTomasz Figa     ``CAPTURE`` timestamps will not retain the order of ``OUTPUT`` timestamps.
5049ec656cfSTomasz Figa
5059ec656cfSTomasz Figa.. note::
5069ec656cfSTomasz Figa
5079ec656cfSTomasz Figa   To let the client distinguish between frame types (keyframes, intermediate
5089ec656cfSTomasz Figa   frames; the exact list of types depends on the coded format), the
5099ec656cfSTomasz Figa   ``CAPTURE`` buffers will have corresponding flag bits set in their
5109ec656cfSTomasz Figa   :c:type:`v4l2_buffer` struct when dequeued. See the documentation of
5119ec656cfSTomasz Figa   :c:type:`v4l2_buffer` and each coded pixel format for exact list of flags
5129ec656cfSTomasz Figa   and their meanings.
5139ec656cfSTomasz Figa
5149ec656cfSTomasz FigaShould an encoding error occur, it will be reported to the client with the level
5159ec656cfSTomasz Figaof details depending on the encoder capabilities. Specifically:
5169ec656cfSTomasz Figa
5179ec656cfSTomasz Figa* the ``CAPTURE`` buffer (if any) that contains the results of the failed encode
5189ec656cfSTomasz Figa  operation will be returned with the ``V4L2_BUF_FLAG_ERROR`` flag set,
5199ec656cfSTomasz Figa
5209ec656cfSTomasz Figa* if the encoder is able to precisely report the ``OUTPUT`` buffer(s) that triggered
5219ec656cfSTomasz Figa  the error, such buffer(s) will be returned with the ``V4L2_BUF_FLAG_ERROR`` flag
5229ec656cfSTomasz Figa  set.
5239ec656cfSTomasz Figa
5249ec656cfSTomasz Figa.. note::
5259ec656cfSTomasz Figa
5269ec656cfSTomasz Figa   If a ``CAPTURE`` buffer is too small then it is just returned with the
5279ec656cfSTomasz Figa   ``V4L2_BUF_FLAG_ERROR`` flag set. More work is needed to detect that this
5289ec656cfSTomasz Figa   error occurred because the buffer was too small, and to provide support to
5299ec656cfSTomasz Figa   free existing buffers that were too small.
5309ec656cfSTomasz Figa
5319ec656cfSTomasz FigaIn case of a fatal failure that does not allow the encoding to continue, any
5329ec656cfSTomasz Figafurther operations on corresponding encoder file handle will return the -EIO
5339ec656cfSTomasz Figaerror code. The client may close the file handle and open a new one, or
5349ec656cfSTomasz Figaalternatively reinitialize the instance by stopping streaming on both queues,
5359ec656cfSTomasz Figareleasing all buffers and performing the Initialization sequence again.
5369ec656cfSTomasz Figa
5379ec656cfSTomasz FigaEncoding Parameter Changes
5389ec656cfSTomasz Figa==========================
5399ec656cfSTomasz Figa
5409ec656cfSTomasz FigaThe client is allowed to use :c:func:`VIDIOC_S_CTRL` to change encoder
5419ec656cfSTomasz Figaparameters at any time. The availability of parameters is encoder-specific
5429ec656cfSTomasz Figaand the client must query the encoder to find the set of available controls.
5439ec656cfSTomasz Figa
5449ec656cfSTomasz FigaThe ability to change each parameter during encoding is encoder-specific, as
5459ec656cfSTomasz Figaper the standard semantics of the V4L2 control interface. The client may
5469ec656cfSTomasz Figaattempt to set a control during encoding and if the operation fails with the
5479ec656cfSTomasz Figa-EBUSY error code, the ``CAPTURE`` queue needs to be stopped for the
5489ec656cfSTomasz Figaconfiguration change to be allowed. To do this, it may follow the `Drain`
5499ec656cfSTomasz Figasequence to avoid losing the already queued/encoded frames.
5509ec656cfSTomasz Figa
5519ec656cfSTomasz FigaThe timing of parameter updates is encoder-specific, as per the standard
5529ec656cfSTomasz Figasemantics of the V4L2 control interface. If the client needs to apply the
5539ec656cfSTomasz Figaparameters exactly at specific frame, using the Request API
5549ec656cfSTomasz Figa(:ref:`media-request-api`) should be considered, if supported by the encoder.
5559ec656cfSTomasz Figa
5569ec656cfSTomasz FigaDrain
5579ec656cfSTomasz Figa=====
5589ec656cfSTomasz Figa
5599ec656cfSTomasz FigaTo ensure that all the queued ``OUTPUT`` buffers have been processed and the
5609ec656cfSTomasz Figarelated ``CAPTURE`` buffers are given to the client, the client must follow the
5619ec656cfSTomasz Figadrain sequence described below. After the drain sequence ends, the client has
5629ec656cfSTomasz Figareceived all encoded frames for all ``OUTPUT`` buffers queued before the
5639ec656cfSTomasz Figasequence was started.
5649ec656cfSTomasz Figa
5659ec656cfSTomasz Figa1. Begin the drain sequence by issuing :c:func:`VIDIOC_ENCODER_CMD`.
5669ec656cfSTomasz Figa
5679ec656cfSTomasz Figa   * **Required fields:**
5689ec656cfSTomasz Figa
5699ec656cfSTomasz Figa     ``cmd``
5709ec656cfSTomasz Figa         set to ``V4L2_ENC_CMD_STOP``.
5719ec656cfSTomasz Figa
5729ec656cfSTomasz Figa     ``flags``
5739ec656cfSTomasz Figa         set to 0.
5749ec656cfSTomasz Figa
5759ec656cfSTomasz Figa     ``pts``
5769ec656cfSTomasz Figa         set to 0.
5779ec656cfSTomasz Figa
5789ec656cfSTomasz Figa   .. warning::
5799ec656cfSTomasz Figa
5809ec656cfSTomasz Figa      The sequence can be only initiated if both ``OUTPUT`` and ``CAPTURE``
5819ec656cfSTomasz Figa      queues are streaming. For compatibility reasons, the call to
5829ec656cfSTomasz Figa      :c:func:`VIDIOC_ENCODER_CMD` will not fail even if any of the queues is
5839ec656cfSTomasz Figa      not streaming, but at the same time it will not initiate the `Drain`
5849ec656cfSTomasz Figa      sequence and so the steps described below would not be applicable.
5859ec656cfSTomasz Figa
5869ec656cfSTomasz Figa2. Any ``OUTPUT`` buffers queued by the client before the
5879ec656cfSTomasz Figa   :c:func:`VIDIOC_ENCODER_CMD` was issued will be processed and encoded as
5889ec656cfSTomasz Figa   normal. The client must continue to handle both queues independently,
5899ec656cfSTomasz Figa   similarly to normal encode operation. This includes:
5909ec656cfSTomasz Figa
5919ec656cfSTomasz Figa   * queuing and dequeuing ``CAPTURE`` buffers, until a buffer marked with the
5929ec656cfSTomasz Figa     ``V4L2_BUF_FLAG_LAST`` flag is dequeued,
5939ec656cfSTomasz Figa
5949ec656cfSTomasz Figa     .. warning::
5959ec656cfSTomasz Figa
5969ec656cfSTomasz Figa        The last buffer may be empty (with :c:type:`v4l2_buffer`
5979ec656cfSTomasz Figa        ``bytesused`` = 0) and in that case it must be ignored by the client,
5989ec656cfSTomasz Figa        as it does not contain an encoded frame.
5999ec656cfSTomasz Figa
6009ec656cfSTomasz Figa     .. note::
6019ec656cfSTomasz Figa
6029ec656cfSTomasz Figa        Any attempt to dequeue more ``CAPTURE`` buffers beyond the buffer
6039ec656cfSTomasz Figa        marked with ``V4L2_BUF_FLAG_LAST`` will result in a -EPIPE error from
6049ec656cfSTomasz Figa        :c:func:`VIDIOC_DQBUF`.
6059ec656cfSTomasz Figa
6069ec656cfSTomasz Figa   * dequeuing processed ``OUTPUT`` buffers, until all the buffers queued
6079ec656cfSTomasz Figa     before the ``V4L2_ENC_CMD_STOP`` command are dequeued,
6089ec656cfSTomasz Figa
6099ec656cfSTomasz Figa   * dequeuing the ``V4L2_EVENT_EOS`` event, if the client subscribes to it.
6109ec656cfSTomasz Figa
6119ec656cfSTomasz Figa   .. note::
6129ec656cfSTomasz Figa
6139ec656cfSTomasz Figa      For backwards compatibility, the encoder will signal a ``V4L2_EVENT_EOS``
6149ec656cfSTomasz Figa      event when the last frame has been encoded and all frames are ready to be
6159ec656cfSTomasz Figa      dequeued. It is deprecated behavior and the client must not rely on it.
6169ec656cfSTomasz Figa      The ``V4L2_BUF_FLAG_LAST`` buffer flag should be used instead.
6179ec656cfSTomasz Figa
6189ec656cfSTomasz Figa3. Once all ``OUTPUT`` buffers queued before the ``V4L2_ENC_CMD_STOP`` call are
6199ec656cfSTomasz Figa   dequeued and the last ``CAPTURE`` buffer is dequeued, the encoder is stopped
6209ec656cfSTomasz Figa   and it will accept, but not process any newly queued ``OUTPUT`` buffers
6219ec656cfSTomasz Figa   until the client issues any of the following operations:
6229ec656cfSTomasz Figa
6239ec656cfSTomasz Figa   * ``V4L2_ENC_CMD_START`` - the encoder will not be reset and will resume
6249ec656cfSTomasz Figa     operation normally, with all the state from before the drain,
6259ec656cfSTomasz Figa
6269ec656cfSTomasz Figa   * a pair of :c:func:`VIDIOC_STREAMOFF` and :c:func:`VIDIOC_STREAMON` on the
6279ec656cfSTomasz Figa     ``CAPTURE`` queue - the encoder will be reset (see the `Reset` sequence)
6289ec656cfSTomasz Figa     and then resume encoding,
6299ec656cfSTomasz Figa
6309ec656cfSTomasz Figa   * a pair of :c:func:`VIDIOC_STREAMOFF` and :c:func:`VIDIOC_STREAMON` on the
6319ec656cfSTomasz Figa     ``OUTPUT`` queue - the encoder will resume operation normally, however any
6329ec656cfSTomasz Figa     source frames queued to the ``OUTPUT`` queue between ``V4L2_ENC_CMD_STOP``
6339ec656cfSTomasz Figa     and :c:func:`VIDIOC_STREAMOFF` will be discarded.
6349ec656cfSTomasz Figa
6359ec656cfSTomasz Figa.. note::
6369ec656cfSTomasz Figa
6379ec656cfSTomasz Figa   Once the drain sequence is initiated, the client needs to drive it to
6389ec656cfSTomasz Figa   completion, as described by the steps above, unless it aborts the process by
6399ec656cfSTomasz Figa   issuing :c:func:`VIDIOC_STREAMOFF` on any of the ``OUTPUT`` or ``CAPTURE``
6409ec656cfSTomasz Figa   queues.  The client is not allowed to issue ``V4L2_ENC_CMD_START`` or
6419ec656cfSTomasz Figa   ``V4L2_ENC_CMD_STOP`` again while the drain sequence is in progress and they
6429ec656cfSTomasz Figa   will fail with -EBUSY error code if attempted.
6439ec656cfSTomasz Figa
6449ec656cfSTomasz Figa   For reference, handling of various corner cases is described below:
6459ec656cfSTomasz Figa
6469ec656cfSTomasz Figa   * In case of no buffer in the ``OUTPUT`` queue at the time the
6479ec656cfSTomasz Figa     ``V4L2_ENC_CMD_STOP`` command was issued, the drain sequence completes
6489ec656cfSTomasz Figa     immediately and the encoder returns an empty ``CAPTURE`` buffer with the
6499ec656cfSTomasz Figa     ``V4L2_BUF_FLAG_LAST`` flag set.
6509ec656cfSTomasz Figa
6519ec656cfSTomasz Figa   * In case of no buffer in the ``CAPTURE`` queue at the time the drain
6529ec656cfSTomasz Figa     sequence completes, the next time the client queues a ``CAPTURE`` buffer
6539ec656cfSTomasz Figa     it is returned at once as an empty buffer with the ``V4L2_BUF_FLAG_LAST``
6549ec656cfSTomasz Figa     flag set.
6559ec656cfSTomasz Figa
6569ec656cfSTomasz Figa   * If :c:func:`VIDIOC_STREAMOFF` is called on the ``CAPTURE`` queue in the
6579ec656cfSTomasz Figa     middle of the drain sequence, the drain sequence is canceled and all
6589ec656cfSTomasz Figa     ``CAPTURE`` buffers are implicitly returned to the client.
6599ec656cfSTomasz Figa
6609ec656cfSTomasz Figa   * If :c:func:`VIDIOC_STREAMOFF` is called on the ``OUTPUT`` queue in the
6619ec656cfSTomasz Figa     middle of the drain sequence, the drain sequence completes immediately and
6629ec656cfSTomasz Figa     next ``CAPTURE`` buffer will be returned empty with the
6639ec656cfSTomasz Figa     ``V4L2_BUF_FLAG_LAST`` flag set.
6649ec656cfSTomasz Figa
6659ec656cfSTomasz Figa   Although not mandatory, the availability of encoder commands may be queried
6669ec656cfSTomasz Figa   using :c:func:`VIDIOC_TRY_ENCODER_CMD`.
6679ec656cfSTomasz Figa
6689ec656cfSTomasz FigaReset
6699ec656cfSTomasz Figa=====
6709ec656cfSTomasz Figa
6719ec656cfSTomasz FigaThe client may want to request the encoder to reinitialize the encoding, so
6729ec656cfSTomasz Figathat the following stream data becomes independent from the stream data
6739ec656cfSTomasz Figagenerated before. Depending on the coded format, that may imply that:
6749ec656cfSTomasz Figa
6759ec656cfSTomasz Figa* encoded frames produced after the restart must not reference any frames
6769ec656cfSTomasz Figa  produced before the stop, e.g. no long term references for H.264/HEVC,
6779ec656cfSTomasz Figa
6789ec656cfSTomasz Figa* any headers that must be included in a standalone stream must be produced
6799ec656cfSTomasz Figa  again, e.g. SPS and PPS for H.264/HEVC.
6809ec656cfSTomasz Figa
6819ec656cfSTomasz FigaThis can be achieved by performing the reset sequence.
6829ec656cfSTomasz Figa
6839ec656cfSTomasz Figa1. Perform the `Drain` sequence to ensure all the in-flight encoding finishes
6849ec656cfSTomasz Figa   and respective buffers are dequeued.
6859ec656cfSTomasz Figa
6869ec656cfSTomasz Figa2. Stop streaming on the ``CAPTURE`` queue via :c:func:`VIDIOC_STREAMOFF`. This
6879ec656cfSTomasz Figa   will return all currently queued ``CAPTURE`` buffers to the client, without
6889ec656cfSTomasz Figa   valid frame data.
6899ec656cfSTomasz Figa
6909ec656cfSTomasz Figa3. Start streaming on the ``CAPTURE`` queue via :c:func:`VIDIOC_STREAMON` and
6919ec656cfSTomasz Figa   continue with regular encoding sequence. The encoded frames produced into
6929ec656cfSTomasz Figa   ``CAPTURE`` buffers from now on will contain a standalone stream that can be
6939ec656cfSTomasz Figa   decoded without the need for frames encoded before the reset sequence,
6949ec656cfSTomasz Figa   starting at the first ``OUTPUT`` buffer queued after issuing the
6959ec656cfSTomasz Figa   `V4L2_ENC_CMD_STOP` of the `Drain` sequence.
6969ec656cfSTomasz Figa
6979ec656cfSTomasz FigaThis sequence may be also used to change encoding parameters for encoders
6989ec656cfSTomasz Figawithout the ability to change the parameters on the fly.
6999ec656cfSTomasz Figa
7009ec656cfSTomasz FigaCommit Points
7019ec656cfSTomasz Figa=============
7029ec656cfSTomasz Figa
7039ec656cfSTomasz FigaSetting formats and allocating buffers triggers changes in the behavior of the
7049ec656cfSTomasz Figaencoder.
7059ec656cfSTomasz Figa
7069ec656cfSTomasz Figa1. Setting the format on the ``CAPTURE`` queue may change the set of formats
7079ec656cfSTomasz Figa   supported/advertised on the ``OUTPUT`` queue. In particular, it also means
7089ec656cfSTomasz Figa   that the ``OUTPUT`` format may be reset and the client must not rely on the
7099ec656cfSTomasz Figa   previously set format being preserved.
7109ec656cfSTomasz Figa
7119ec656cfSTomasz Figa2. Enumerating formats on the ``OUTPUT`` queue always returns only formats
7129ec656cfSTomasz Figa   supported for the current ``CAPTURE`` format.
7139ec656cfSTomasz Figa
7149ec656cfSTomasz Figa3. Setting the format on the ``OUTPUT`` queue does not change the list of
7159ec656cfSTomasz Figa   formats available on the ``CAPTURE`` queue. An attempt to set the ``OUTPUT``
7169ec656cfSTomasz Figa   format that is not supported for the currently selected ``CAPTURE`` format
7179ec656cfSTomasz Figa   will result in the encoder adjusting the requested ``OUTPUT`` format to a
7189ec656cfSTomasz Figa   supported one.
7199ec656cfSTomasz Figa
7209ec656cfSTomasz Figa4. Enumerating formats on the ``CAPTURE`` queue always returns the full set of
7219ec656cfSTomasz Figa   supported coded formats, irrespective of the current ``OUTPUT`` format.
7229ec656cfSTomasz Figa
7239ec656cfSTomasz Figa5. While buffers are allocated on any of the ``OUTPUT`` or ``CAPTURE`` queues,
7249ec656cfSTomasz Figa   the client must not change the format on the ``CAPTURE`` queue. Drivers will
7259ec656cfSTomasz Figa   return the -EBUSY error code for any such format change attempt.
7269ec656cfSTomasz Figa
7279ec656cfSTomasz FigaTo summarize, setting formats and allocation must always start with the
7289ec656cfSTomasz Figa``CAPTURE`` queue and the ``CAPTURE`` queue is the master that governs the
7299ec656cfSTomasz Figaset of supported formats for the ``OUTPUT`` queue.
730