| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 |
- .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later
- .. c:namespace:: V4L
- .. _VIDIOC_ENCODER_CMD:
- ************************************************
- ioctl VIDIOC_ENCODER_CMD, VIDIOC_TRY_ENCODER_CMD
- ************************************************
- Name
- ====
- VIDIOC_ENCODER_CMD - VIDIOC_TRY_ENCODER_CMD - Execute an encoder command
- Synopsis
- ========
- .. c:macro:: VIDIOC_ENCODER_CMD
- ``int ioctl(int fd, VIDIOC_ENCODER_CMD, struct v4l2_encoder_cmd *argp)``
- .. c:macro:: VIDIOC_TRY_ENCODER_CMD
- ``int ioctl(int fd, VIDIOC_TRY_ENCODER_CMD, struct v4l2_encoder_cmd *argp)``
- Arguments
- =========
- ``fd``
- File descriptor returned by :c:func:`open()`.
- ``argp``
- Pointer to struct :c:type:`v4l2_encoder_cmd`.
- Description
- ===========
- These ioctls control an audio/video (usually MPEG-) encoder.
- ``VIDIOC_ENCODER_CMD`` sends a command to the encoder,
- ``VIDIOC_TRY_ENCODER_CMD`` can be used to try a command without actually
- executing it.
- To send a command applications must initialize all fields of a struct
- :c:type:`v4l2_encoder_cmd` and call
- ``VIDIOC_ENCODER_CMD`` or ``VIDIOC_TRY_ENCODER_CMD`` with a pointer to
- this structure.
- The ``cmd`` field must contain the command code. Some commands use the
- ``flags`` field for additional information.
- After a STOP command, :c:func:`read()` calls will read
- the remaining data buffered by the driver. When the buffer is empty,
- :c:func:`read()` will return zero and the next :c:func:`read()`
- call will restart the encoder.
- A :c:func:`read()` or :ref:`VIDIOC_STREAMON <VIDIOC_STREAMON>`
- call sends an implicit START command to the encoder if it has not been
- started yet. Applies to both queues of mem2mem encoders.
- A :c:func:`close()` or :ref:`VIDIOC_STREAMOFF <VIDIOC_STREAMON>`
- call of a streaming file descriptor sends an implicit immediate STOP to
- the encoder, and all buffered data is discarded. Applies to both queues of
- mem2mem encoders.
- These ioctls are optional, not all drivers may support them. They were
- introduced in Linux 2.6.21. They are, however, mandatory for stateful mem2mem
- encoders (as further documented in :ref:`encoder`).
- .. tabularcolumns:: |p{4.4cm}|p{4.4cm}|p{8.5cm}|
- .. c:type:: v4l2_encoder_cmd
- .. flat-table:: struct v4l2_encoder_cmd
- :header-rows: 0
- :stub-columns: 0
- :widths: 1 1 2
- * - __u32
- - ``cmd``
- - The encoder command, see :ref:`encoder-cmds`.
- * - __u32
- - ``flags``
- - Flags to go with the command, see :ref:`encoder-flags`. If no
- flags are defined for this command, drivers and applications must
- set this field to zero.
- * - __u32
- - ``data``\ [8]
- - Reserved for future extensions. Drivers and applications must set
- the array to zero.
- .. tabularcolumns:: |p{6.6cm}|p{2.2cm}|p{8.5cm}|
- .. _encoder-cmds:
- .. flat-table:: Encoder Commands
- :header-rows: 0
- :stub-columns: 0
- :widths: 3 1 4
- * - ``V4L2_ENC_CMD_START``
- - 0
- - Start the encoder. When the encoder is already running or paused,
- this command does nothing. No flags are defined for this command.
- For a device implementing the :ref:`encoder`, once the drain sequence
- is initiated with the ``V4L2_ENC_CMD_STOP`` command, it must be driven
- to completion before this command can be invoked. Any attempt to
- invoke the command while the drain sequence is in progress will trigger
- an ``EBUSY`` error code. See :ref:`encoder` for more details.
- * - ``V4L2_ENC_CMD_STOP``
- - 1
- - Stop the encoder. When the ``V4L2_ENC_CMD_STOP_AT_GOP_END`` flag
- is set, encoding will continue until the end of the current *Group
- Of Pictures*, otherwise encoding will stop immediately. When the
- encoder is already stopped, this command does nothing.
- For a device implementing the :ref:`encoder`, the command will initiate
- the drain sequence as documented in :ref:`encoder`. No flags or other
- arguments are accepted in this case. Any attempt to invoke the command
- again before the sequence completes will trigger an ``EBUSY`` error
- code.
- * - ``V4L2_ENC_CMD_PAUSE``
- - 2
- - Pause the encoder. When the encoder has not been started yet, the
- driver will return an ``EPERM`` error code. When the encoder is
- already paused, this command does nothing. No flags are defined
- for this command.
- * - ``V4L2_ENC_CMD_RESUME``
- - 3
- - Resume encoding after a PAUSE command. When the encoder has not
- been started yet, the driver will return an ``EPERM`` error code. When
- the encoder is already running, this command does nothing. No
- flags are defined for this command.
- .. tabularcolumns:: |p{6.6cm}|p{2.2cm}|p{8.5cm}|
- .. _encoder-flags:
- .. flat-table:: Encoder Command Flags
- :header-rows: 0
- :stub-columns: 0
- :widths: 3 1 4
- * - ``V4L2_ENC_CMD_STOP_AT_GOP_END``
- - 0x0001
- - Stop encoding at the end of the current *Group Of Pictures*,
- rather than immediately.
- Does not apply to :ref:`encoder`.
- Return Value
- ============
- On success 0 is returned, on error -1 and the ``errno`` variable is set
- appropriately. The generic error codes are described at the
- :ref:`Generic Error Codes <gen-errors>` chapter.
- EBUSY
- A drain sequence of a device implementing the :ref:`encoder` is still in
- progress. It is not allowed to issue another encoder command until it
- completes.
- EINVAL
- The ``cmd`` field is invalid.
- EPERM
- The application sent a PAUSE or RESUME command when the encoder was
- not running.
|