170 lines
5.3 KiB
ReStructuredText
170 lines
5.3 KiB
ReStructuredText
.. 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.
|