| .. -*- coding: utf-8; mode: rst -*- |
| |
| .. _VIDIOC_DECODER_CMD: |
| |
| ************************************************ |
| ioctl VIDIOC_DECODER_CMD, VIDIOC_TRY_DECODER_CMD |
| ************************************************ |
| |
| Name |
| ==== |
| |
| VIDIOC_DECODER_CMD - VIDIOC_TRY_DECODER_CMD - Execute an decoder command |
| |
| |
| Synopsis |
| ======== |
| |
| .. c:function:: int ioctl( int fd, VIDIOC_DECODER_CMD, struct v4l2_decoder_cmd *argp ) |
| :name: VIDIOC_DECODER_CMD |
| |
| |
| .. c:function:: int ioctl( int fd, VIDIOC_TRY_DECODER_CMD, struct v4l2_decoder_cmd *argp ) |
| :name: VIDIOC_TRY_DECODER_CMD |
| |
| |
| Arguments |
| ========= |
| |
| ``fd`` |
| File descriptor returned by :ref:`open() <func-open>`. |
| |
| ``argp`` |
| pointer to struct :c:type:`v4l2_decoder_cmd`. |
| |
| |
| Description |
| =========== |
| |
| These ioctls control an audio/video (usually MPEG-) decoder. |
| ``VIDIOC_DECODER_CMD`` sends a command to the decoder, |
| ``VIDIOC_TRY_DECODER_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_decoder_cmd` and call |
| ``VIDIOC_DECODER_CMD`` or ``VIDIOC_TRY_DECODER_CMD`` with a pointer to |
| this structure. |
| |
| The ``cmd`` field must contain the command code. Some commands use the |
| ``flags`` field for additional information. |
| |
| A :ref:`write() <func-write>` or :ref:`VIDIOC_STREAMON` |
| call sends an implicit START command to the decoder if it has not been |
| started yet. |
| |
| A :ref:`close() <func-close>` or :ref:`VIDIOC_STREAMOFF <VIDIOC_STREAMON>` |
| call of a streaming file descriptor sends an implicit immediate STOP |
| command to the decoder, and all buffered data is discarded. |
| |
| These ioctls are optional, not all drivers may support them. They were |
| introduced in Linux 3.3. |
| |
| |
| .. tabularcolumns:: |p{1.1cm}|p{2.4cm}|p{1.2cm}|p{1.6cm}|p{10.6cm}| |
| |
| .. c:type:: v4l2_decoder_cmd |
| |
| .. cssclass:: longtable |
| |
| .. flat-table:: struct v4l2_decoder_cmd |
| :header-rows: 0 |
| :stub-columns: 0 |
| :widths: 11 24 12 16 106 |
| |
| * - __u32 |
| - ``cmd`` |
| - |
| - |
| - The decoder command, see :ref:`decoder-cmds`. |
| * - __u32 |
| - ``flags`` |
| - |
| - |
| - Flags to go with the command. If no flags are defined for this |
| command, drivers and applications must set this field to zero. |
| * - union |
| - (anonymous) |
| - |
| - |
| - |
| * - |
| - struct |
| - ``start`` |
| - |
| - Structure containing additional data for the |
| ``V4L2_DEC_CMD_START`` command. |
| * - |
| - |
| - __s32 |
| - ``speed`` |
| - Playback speed and direction. The playback speed is defined as |
| ``speed``/1000 of the normal speed. So 1000 is normal playback. |
| Negative numbers denote reverse playback, so -1000 does reverse |
| playback at normal speed. Speeds -1, 0 and 1 have special |
| meanings: speed 0 is shorthand for 1000 (normal playback). A speed |
| of 1 steps just one frame forward, a speed of -1 steps just one |
| frame back. |
| * - |
| - |
| - __u32 |
| - ``format`` |
| - Format restrictions. This field is set by the driver, not the |
| application. Possible values are ``V4L2_DEC_START_FMT_NONE`` if |
| there are no format restrictions or ``V4L2_DEC_START_FMT_GOP`` if |
| the decoder operates on full GOPs (*Group Of Pictures*). This is |
| usually the case for reverse playback: the decoder needs full |
| GOPs, which it can then play in reverse order. So to implement |
| reverse playback the application must feed the decoder the last |
| GOP in the video file, then the GOP before that, etc. etc. |
| * - |
| - struct |
| - ``stop`` |
| - |
| - Structure containing additional data for the ``V4L2_DEC_CMD_STOP`` |
| command. |
| * - |
| - |
| - __u64 |
| - ``pts`` |
| - Stop playback at this ``pts`` or immediately if the playback is |
| already past that timestamp. Leave to 0 if you want to stop after |
| the last frame was decoded. |
| * - |
| - struct |
| - ``raw`` |
| - |
| - |
| * - |
| - |
| - __u32 |
| - ``data``\ [16] |
| - Reserved for future extensions. Drivers and applications must set |
| the array to zero. |
| |
| |
| |
| .. tabularcolumns:: |p{5.6cm}|p{0.6cm}|p{11.3cm}| |
| |
| .. _decoder-cmds: |
| |
| .. flat-table:: Decoder Commands |
| :header-rows: 0 |
| :stub-columns: 0 |
| :widths: 56 6 113 |
| |
| * - ``V4L2_DEC_CMD_START`` |
| - 0 |
| - Start the decoder. When the decoder is already running or paused, |
| this command will just change the playback speed. That means that |
| calling ``V4L2_DEC_CMD_START`` when the decoder was paused will |
| *not* resume the decoder. You have to explicitly call |
| ``V4L2_DEC_CMD_RESUME`` for that. This command has one flag: |
| ``V4L2_DEC_CMD_START_MUTE_AUDIO``. If set, then audio will be |
| muted when playing back at a non-standard speed. |
| * - ``V4L2_DEC_CMD_STOP`` |
| - 1 |
| - Stop the decoder. When the decoder is already stopped, this |
| command does nothing. This command has two flags: if |
| ``V4L2_DEC_CMD_STOP_TO_BLACK`` is set, then the decoder will set |
| the picture to black after it stopped decoding. Otherwise the last |
| image will repeat. mem2mem decoders will stop producing new frames |
| altogether. They will send a ``V4L2_EVENT_EOS`` event when the |
| last frame has been decoded and all frames are ready to be |
| dequeued and will set the ``V4L2_BUF_FLAG_LAST`` buffer flag on |
| the last buffer of the capture queue to indicate there will be no |
| new buffers produced to dequeue. This buffer may be empty, |
| indicated by the driver setting the ``bytesused`` field to 0. Once |
| the ``V4L2_BUF_FLAG_LAST`` flag was set, the |
| :ref:`VIDIOC_DQBUF <VIDIOC_QBUF>` ioctl will not block anymore, |
| but return an ``EPIPE`` error code. If |
| ``V4L2_DEC_CMD_STOP_IMMEDIATELY`` is set, then the decoder stops |
| immediately (ignoring the ``pts`` value), otherwise it will keep |
| decoding until timestamp >= pts or until the last of the pending |
| data from its internal buffers was decoded. |
| * - ``V4L2_DEC_CMD_PAUSE`` |
| - 2 |
| - Pause the decoder. When the decoder has not been started yet, the |
| driver will return an ``EPERM`` error code. When the decoder is |
| already paused, this command does nothing. This command has one |
| flag: if ``V4L2_DEC_CMD_PAUSE_TO_BLACK`` is set, then set the |
| decoder output to black when paused. |
| * - ``V4L2_DEC_CMD_RESUME`` |
| - 3 |
| - Resume decoding after a PAUSE command. When the decoder has not |
| been started yet, the driver will return an ``EPERM`` error code. When |
| the decoder is already running, this command does nothing. No |
| flags are defined for this command. |
| |
| |
| 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. |
| |
| EINVAL |
| The ``cmd`` field is invalid. |
| |
| EPERM |
| The application sent a PAUSE or RESUME command when the decoder was |
| not running. |