.. -*- 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
========

.. cpp:function:: int ioctl( int fd, int request, struct v4l2_decoder_cmd *argp )


Arguments
=========

``fd``
    File descriptor returned by :ref:`open() <func-open>`.

``request``
    VIDIOC_DECODER_CMD, VIDIOC_TRY_DECODER_CMD

``argp``


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 :ref:`v4l2_decoder_cmd <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.


.. _v4l2-decoder-cmd:

.. flat-table:: struct v4l2_decoder_cmd
    :header-rows:  0
    :stub-columns: 0
    :widths:       1 1 2 1 1


    -  .. row 1

       -  __u32

       -  ``cmd``

       -
       -
       -  The decoder command, see :ref:`decoder-cmds`.

    -  .. row 2

       -  __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.

    -  .. row 3

       -  union

       -  (anonymous)

       -
       -
       -

    -  .. row 4

       -
       -  struct

       -  ``start``

       -
       -  Structure containing additional data for the
	  ``V4L2_DEC_CMD_START`` command.

    -  .. row 5

       -
       -
       -  __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.

    -  .. row 6

       -
       -
       -  __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.

    -  .. row 7

       -
       -  struct

       -  ``stop``

       -
       -  Structure containing additional data for the ``V4L2_DEC_CMD_STOP``
	  command.

    -  .. row 8

       -
       -
       -  __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.

    -  .. row 9

       -
       -  struct

       -  ``raw``

       -
       -

    -  .. row 10

       -
       -
       -  __u32

       -  ``data``\ [16]

       -  Reserved for future extensions. Drivers and applications must set
	  the array to zero.



.. _decoder-cmds:

.. flat-table:: Decoder Commands
    :header-rows:  0
    :stub-columns: 0
    :widths:       3 1 4


    -  .. row 1

       -  ``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.

    -  .. row 2

       -  ``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.

    -  .. row 3

       -  ``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.

    -  .. row 4

       -  ``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.
