.. -*- coding: utf-8; mode: rst -*-

.. _VIDIOC_ENUMINPUT:

**********************
ioctl VIDIOC_ENUMINPUT
**********************

*man VIDIOC_ENUMINPUT(2)*

Enumerate video inputs


Synopsis
========

.. c:function:: int ioctl( int fd, int request, struct v4l2_input *argp )

Arguments
=========

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

``request``
    VIDIOC_ENUMINPUT

``argp``


Description
===========

To query the attributes of a video input applications initialize the
``index`` field of struct :ref:`v4l2_input <v4l2-input>` and call the
``VIDIOC_ENUMINPUT`` ioctl with a pointer to this structure. Drivers
fill the rest of the structure or return an EINVAL error code when the
index is out of bounds. To enumerate all inputs applications shall begin
at index zero, incrementing by one until the driver returns EINVAL.


.. _v4l2-input:

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


    -  .. row 1

       -  __u32

       -  ``index``

       -  Identifies the input, set by the application.

    -  .. row 2

       -  __u8

       -  ``name``\ [32]

       -  Name of the video input, a NUL-terminated ASCII string, for
          example: "Vin (Composite 2)". This information is intended for the
          user, preferably the connector label on the device itself.

    -  .. row 3

       -  __u32

       -  ``type``

       -  Type of the input, see :ref:`input-type`.

    -  .. row 4

       -  __u32

       -  ``audioset``

       -  Drivers can enumerate up to 32 video and audio inputs. This field
          shows which audio inputs were selectable as audio source if this
          was the currently selected video input. It is a bit mask. The LSB
          corresponds to audio input 0, the MSB to input 31. Any number of
          bits can be set, or none.

          When the driver does not enumerate audio inputs no bits must be
          set. Applications shall not interpret this as lack of audio
          support. Some drivers automatically select audio sources and do
          not enumerate them since there is no choice anyway.

          For details on audio inputs and how to select the current input
          see :ref:`audio`.

    -  .. row 5

       -  __u32

       -  ``tuner``

       -  Capture devices can have zero or more tuners (RF demodulators).
          When the ``type`` is set to ``V4L2_INPUT_TYPE_TUNER`` this is an
          RF connector and this field identifies the tuner. It corresponds
          to struct :ref:`v4l2_tuner <v4l2-tuner>` field ``index``. For
          details on tuners see :ref:`tuner`.

    -  .. row 6

       -  :ref:`v4l2_std_id <v4l2-std-id>`

       -  ``std``

       -  Every video input supports one or more different video standards.
          This field is a set of all supported standards. For details on
          video standards and how to switch see :ref:`standard`.

    -  .. row 7

       -  __u32

       -  ``status``

       -  This field provides status information about the input. See
          :ref:`input-status` for flags. With the exception of the sensor
          orientation bits ``status`` is only valid when this is the current
          input.

    -  .. row 8

       -  __u32

       -  ``capabilities``

       -  This field provides capabilities for the input. See
          :ref:`input-capabilities` for flags.

    -  .. row 9

       -  __u32

       -  ``reserved``\ [3]

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



.. _input-type:

.. flat-table:: Input Types
    :header-rows:  0
    :stub-columns: 0
    :widths:       3 1 4


    -  .. row 1

       -  ``V4L2_INPUT_TYPE_TUNER``

       -  1

       -  This input uses a tuner (RF demodulator).

    -  .. row 2

       -  ``V4L2_INPUT_TYPE_CAMERA``

       -  2

       -  Analog baseband input, for example CVBS / Composite Video,
          S-Video, RGB.



.. _input-status:

.. flat-table:: Input Status Flags
    :header-rows:  0
    :stub-columns: 0


    -  .. row 1

       -  :cspan:`2` General

    -  .. row 2

       -  ``V4L2_IN_ST_NO_POWER``

       -  0x00000001

       -  Attached device is off.

    -  .. row 3

       -  ``V4L2_IN_ST_NO_SIGNAL``

       -  0x00000002

       -  

    -  .. row 4

       -  ``V4L2_IN_ST_NO_COLOR``

       -  0x00000004

       -  The hardware supports color decoding, but does not detect color
          modulation in the signal.

    -  .. row 5

       -  :cspan:`2` Sensor Orientation

    -  .. row 6

       -  ``V4L2_IN_ST_HFLIP``

       -  0x00000010

       -  The input is connected to a device that produces a signal that is
          flipped horizontally and does not correct this before passing the
          signal to userspace.

    -  .. row 7

       -  ``V4L2_IN_ST_VFLIP``

       -  0x00000020

       -  The input is connected to a device that produces a signal that is
          flipped vertically and does not correct this before passing the
          signal to userspace. Note that a 180 degree rotation is the same
          as HFLIP | VFLIP

    -  .. row 8

       -  :cspan:`2` Analog Video

    -  .. row 9

       -  ``V4L2_IN_ST_NO_H_LOCK``

       -  0x00000100

       -  No horizontal sync lock.

    -  .. row 10

       -  ``V4L2_IN_ST_COLOR_KILL``

       -  0x00000200

       -  A color killer circuit automatically disables color decoding when
          it detects no color modulation. When this flag is set the color
          killer is enabled *and* has shut off color decoding.

    -  .. row 11

       -  :cspan:`2` Digital Video

    -  .. row 12

       -  ``V4L2_IN_ST_NO_SYNC``

       -  0x00010000

       -  No synchronization lock.

    -  .. row 13

       -  ``V4L2_IN_ST_NO_EQU``

       -  0x00020000

       -  No equalizer lock.

    -  .. row 14

       -  ``V4L2_IN_ST_NO_CARRIER``

       -  0x00040000

       -  Carrier recovery failed.

    -  .. row 15

       -  :cspan:`2` VCR and Set-Top Box

    -  .. row 16

       -  ``V4L2_IN_ST_MACROVISION``

       -  0x01000000

       -  Macrovision is an analog copy prevention system mangling the video
          signal to confuse video recorders. When this flag is set
          Macrovision has been detected.

    -  .. row 17

       -  ``V4L2_IN_ST_NO_ACCESS``

       -  0x02000000

       -  Conditional access denied.

    -  .. row 18

       -  ``V4L2_IN_ST_VTR``

       -  0x04000000

       -  VTR time constant. [?]



.. _input-capabilities:

.. flat-table:: Input capabilities
    :header-rows:  0
    :stub-columns: 0
    :widths:       3 1 4


    -  .. row 1

       -  ``V4L2_IN_CAP_DV_TIMINGS``

       -  0x00000002

       -  This input supports setting video timings by using
          VIDIOC_S_DV_TIMINGS.

    -  .. row 2

       -  ``V4L2_IN_CAP_STD``

       -  0x00000004

       -  This input supports setting the TV standard by using
          VIDIOC_S_STD.

    -  .. row 3

       -  ``V4L2_IN_CAP_NATIVE_SIZE``

       -  0x00000008

       -  This input supports setting the native size using the
          ``V4L2_SEL_TGT_NATIVE_SIZE`` selection target, see
          :ref:`v4l2-selections-common`.



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 struct :ref:`v4l2_input <v4l2-input>` ``index`` is out of
    bounds.


.. ------------------------------------------------------------------------------
.. This file was automatically converted from DocBook-XML with the dbxml
.. library (https://github.com/return42/sphkerneldoc). The origin XML comes
.. from the linux kernel, refer to:
..
.. * https://github.com/torvalds/linux/tree/master/Documentation/DocBook
.. ------------------------------------------------------------------------------
