Linux Media Subsystem Documentation

Linux Media Subsystem Documentation

Linux Media Subsystem

Documentation

Release 4.11.0-rc4-00191-g7de6e5d

The kernel development community

April 03, 2017

CONTENTS

i

ii

Contents:

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

CONTENTS 1

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

2 CONTENTS

CHAPTER

ONE

LINUX MEDIA INFRASTRUCTURE USERSPACE API

Copyright © 2009-2016 : LinuxTV Developers

Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free

Documentation License, Version 1.1 or any later version published by the Free Software Foundation. A copy of the license is included in the chapter entitled ``GNU Free Documentation License''.

Table of Contents

1.1 Introduction

This document covers the Linux Kernel to Userspace API's used by video and radio streaming devices, including video cameras, analog and digital TV receiver cards, AM/FM receiver cards, Software Defined

Radio (SDR), streaming capture and output devices, codec devices and remote controllers.

A typical media device hardware is shown at

Typical Media Device

.

Figure 1.1: Typical Media Device

The media infrastructure API was designed to control such devices. It is divided into five parts.

1. The

first part

covers radio, video capture and output, cameras, analog TV devices and codecs.

2. The second part covers the API used for digital TV and Internet reception via one of the several digital tv standards. While it is called as DVB API, in fact it covers several different video standards including DVB-T/T2, DVB-S/S2, DVB-C, ATSC, ISDB-T, ISDB-S, DTMB, etc. The complete list of supported standards can be found at fe_delivery_system.

3. The third part covers the Remote Controller API.

4. The fourth part covers the Media Controller API.

5. The fifth part covers the CEC (Consumer Electronics Control) API.

It should also be noted that a media device may also have audio components, like mixers, PCM capture,

PCM playback, etc, which are controlled via ALSA API. For additional information and for the latest development code, see: https://linuxtv.org

. For discussing improvements, reporting troubles, sending new drivers, etc, please mail to: Linux Media Mailing List (LMML) .

1.2 Part I - Video for Linux API

This part describes the Video for Linux API version 2 (V4L2 API) specification.

Revision 4.5

Table of Contents

3

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

1.2.1 Common API Elements

Programming a V4L2 device consists of these steps:

• Opening the device

• Changing device properties, selecting a video and audio input, video standard, picture brightness a.

o.

• Negotiating a data format

• Negotiating an input/output method

• The actual input/output loop

• Closing the device

In practice most steps are optional and can be executed out of order. It depends on the V4L2 device type, you can read about the details in

Interfaces

. In this chapter we will discuss the basic concepts applicable

to all devices.

Opening and Closing Devices

Device Naming

V4L2 drivers are implemented as kernel modules, loaded manually by the system administrator or automatically when a device is first discovered. The driver modules plug into the ``videodev'' kernel module.

It provides helper functions and a common application interface specified in this document.

Each driver thus loaded registers one or more device nodes with major number 81 and a minor number between 0 and 255. Minor numbers are allocated dynamically unless the kernel is compiled with the kernel option CONFIG_VIDEO_FIXED_MINOR_RANGES. In that case minor numbers are allocated in ranges depending on the device node type (video, radio, etc.).

Many drivers support ``video_nr'', ``radio_nr'' or ``vbi_nr'' module options to select specific video/radio/vbi node numbers.

This allows the user to request that the device node is named e.g.

/dev/video5 instead of leaving it to chance. When the driver supports multiple devices of the same type more than one device node number can be assigned, separated by commas:

# modprobe mydriver video_nr=0,1 radio_nr=0,1

In /etc/modules.conf this may be written as: options mydriver video_nr=0,1 radio_nr=0,1

When no device node number is given as module option the driver supplies a default.

Normally udev will create the device nodes in /dev automatically for you. If udev is not installed, then you need to enable the CONFIG_VIDEO_FIXED_MINOR_RANGES kernel option in order to be able to correctly relate a minor number to a device node number. I.e., you need to be certain that minor number 5 maps to device node name video5. With this kernel option different device types have different minor number ranges. These ranges are listed in

Interfaces

.

The creation of character special files (with mknod) is a privileged operation and devices cannot be opened by major and minor number. That means applications cannot reliable scan for loaded or installed drivers.

The user must enter a device name, or the application can try the conventional device names.

Related Devices

Devices can support several functions. For example video capturing, VBI capturing and radio support.

The V4L2 API creates different nodes for each of these functions.

4 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

The V4L2 API was designed with the idea that one device node could support all functions. However, in practice this never worked: this `feature' was never used by applications and many drivers did not support it and if they did it was certainly never tested. In addition, switching a device node between different functions only works when using the streaming I/O API, not with the read()/write() API.

Today each device node supports just one function.

Besides video input or output the hardware may also support audio sampling or playback. If so, these functions are implemented as ALSA PCM devices with optional ALSA audio mixer devices.

One problem with all these devices is that the V4L2 API makes no provisions to find these related devices.

Some really complex devices use the Media Controller (see Part IV - Media Controller API) which can be used for this purpose. But most drivers do not use it, and while some code exists that uses sysfs to discover related devices (see libmedia_dev in the v4l-utils git repository), there is no library yet that can provide a single API towards both Media Controller-based devices and devices that do not use the Media Controller.

If you want to work on this please write to the linux-media mailing list: https://linuxtv.org/lists.php

.

Multiple Opens

V4L2 devices can be opened more than once.

1

When this is supported by the driver, users can for example start a ``panel'' application to change controls like brightness or audio volume, while another application captures video and audio. In other words, panel applications are comparable to an ALSA audio mixer application. Just opening a V4L2 device should not change the state of the device.

2

Once an application has allocated the memory buffers needed for streaming data (by calling the ioctl VID-

IOC_REQBUFS or ioctl VIDIOC_CREATE_BUFS ioctls, or implicitly by calling the read() or write() functions) that application (filehandle) becomes the owner of the device. It is no longer allowed to make changes that would affect the buffer sizes (e.g. by calling the VIDIOC_S_FMT ioctl) and other applications are no longer allowed to allocate buffers or start or stop streaming. The EBUSY error code will be returned instead.

Merely opening a V4L2 device does not grant exclusive access.

3

Initiating data exchange however assigns the right to read or write the requested type of data, and to change related properties, to this file descriptor. Applications can request additional access privileges using the priority mechanism described in

Application Priority

.

Shared Data Streams

V4L2 drivers should not support multiple applications reading or writing the same data stream on a device by copying buffers, time multiplexing or similar means. This is better handled by a proxy application in user space.

Functions

To open and close V4L2 devices applications use the open() and close() function, respectively. Devices are programmed using the ioctl() function as explained in the following sections.

Querying Capabilities

Because V4L2 covers a wide variety of devices not all aspects of the API are equally applicable to all types of devices. Furthermore devices of the same type have different capabilities and this specification permits the omission of a few complicated and less important parts of the API.

1

There are still some old and obscure drivers that have not been updated to allow for multiple opens. This implies that for such drivers open() can return an EBUSY error code when the device is already in use.

2

Unfortunately, opening a radio device often switches the state of the device to radio mode in many drivers. This behavior should be fixed eventually as it violates the V4L2 specification.

3

Drivers could recognize the O_EXCL open flag. Presently this is not required, so applications cannot know if it really works.

1.2. Part I - Video for Linux API 5

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

The ioctl VIDIOC_QUERYCAP ioctl is available to check if the kernel device is compatible with this specification, and to query the

functions

and

I/O methods

supported by the device.

Starting with kernel version 3.1, ioctl VIDIOC_QUERYCAP will return the V4L2 API version used by the driver, with generally matches the Kernel version. There's no need of using ioctl VIDIOC_QUERYCAP to check if a specific ioctl is supported, the V4L2 core now returns ENOTTY if a driver doesn't provide support for an ioctl.

Other features can be queried by calling the respective ioctl, for example ioctl VIDIOC_ENUMINPUT to learn about the number, types and names of video connectors on the device. Although abstraction is a major objective of this API, the ioctl VIDIOC_QUERYCAP ioctl also allows driver specific applications to reliably identify the driver.

All V4L2 drivers must support ioctl VIDIOC_QUERYCAP. Applications should always call this ioctl after opening the device.

Application Priority

When multiple applications share a device it may be desirable to assign them different priorities. Contrary to the traditional ``rm -rf /'' school of thought a video recording application could for example block other applications from changing video controls or switching the current TV channel. Another objective is to permit low priority applications working in background, which can be preempted by user controlled applications and automatically regain control of the device at a later time.

Since these features cannot be implemented entirely in user space V4L2 defines the VIDIOC_G_PRIORITY and VIDIOC_S_PRIORITY ioctls to request and query the access priority associate with a file descriptor.

Opening a device assigns a medium priority, compatible with earlier versions of V4L2 and drivers not supporting these ioctls. Applications requiring a different priority will usually call VIDIOC_S_PRIORITY after verifying the device with the ioctl VIDIOC_QUERYCAP ioctl.

Ioctls changing driver properties, such as VIDIOC_S_INPUT, return an EBUSY error code after another application obtained higher priority.

Video Inputs and Outputs

Video inputs and outputs are physical connectors of a device. These can be for example RF connectors

(antenna/cable), CVBS a.k.a. Composite Video, S-Video or RGB connectors. Video and VBI capture devices have inputs. Video and VBI output devices have outputs, at least one each. Radio devices have no video inputs or outputs.

To learn about the number and attributes of the available inputs and outputs applications can enumerate them with the ioctl VIDIOC_ENUMINPUT and ioctl VIDIOC_ENUMOUTPUT ioctl, respectively. The struct v4l2_input returned by the ioctl VIDIOC_ENUMINPUT ioctl also contains signal :status information applicable when the current video input is queried.

The VIDIOC_G_INPUT and VIDIOC_G_OUTPUT ioctls return the index of the current video input or output.

To select a different input or output applications call the VIDIOC_S_INPUT and VIDIOC_S_OUTPUT ioctls.

Drivers must implement all the input ioctls when the device has one or more inputs, all the output ioctls when the device has one or more outputs.

Example: Information about the current video input struct

v4l2_input input;

int

index;

if

( 1 == ioctl(fd, VIDIOC_G_INPUT, & index)) { perror( "VIDIOC_G_INPUT" ); exit(EXIT_FAILURE);

}

6 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

memset( & input, 0 ,

sizeof

(input)); input.index

= index;

if

( 1 == ioctl(fd, VIDIOC_ENUMINPUT, & input)) { perror( "VIDIOC_ENUMINPUT" ); exit(EXIT_FAILURE);

} printf( "Current input: %s\\n" , input.name);

Example: Switching to the first video input int

index; index = 0 ;

if

( 1 == ioctl(fd, VIDIOC_S_INPUT, & index)) { perror( "VIDIOC_S_INPUT" ); exit(EXIT_FAILURE);

}

Audio Inputs and Outputs

Audio inputs and outputs are physical connectors of a device. Video capture devices have inputs, output devices have outputs, zero or more each. Radio devices have no audio inputs or outputs. They have exactly one tuner which in fact is an audio source, but this API associates tuners with video inputs or outputs only, and radio devices have none of these.

4

A connector on a TV card to loop back the received audio signal to a sound card is not considered an audio output.

Audio and video inputs and outputs are associated. Selecting a video source also selects an audio source.

This is most evident when the video and audio source is a tuner. Further audio connectors can combine with more than one video input or output. Assumed two composite video inputs and two audio inputs exist, there may be up to four valid combinations. The relation of video and audio connectors is defined in the audioset field of the respective struct v4l2_input or struct v4l2_output, where each bit represents the index number, starting at zero, of one audio input or output.

To learn about the number and attributes of the available inputs and outputs applications can enumerate them with the ioctl VIDIOC_ENUMAUDIO and VIDIOC_ENUMAUDOUT ioctl, respectively. The struct v4l2_audio returned by the ioctl VIDIOC_ENUMAUDIO ioctl also contains signal :status information applicable when the current audio input is queried.

The VIDIOC_G_AUDIO and VIDIOC_G_AUDOUT ioctls report the current audio input and output, respectively.

Note:

Note that, unlike VIDIOC_G_INPUT and VIDIOC_G_OUTPUT these ioctls return a structure as ioctl VID-

IOC_ENUMAUDIO and VIDIOC_ENUMAUDOUT do, not just an index.

To select an audio input and change its properties applications call the VIDIOC_S_AUDIO ioctl. To select an audio output (which presently has no changeable properties) applications call the VIDIOC_S_AUDOUT ioctl.

Drivers must implement all audio input ioctls when the device has multiple selectable audio inputs, all audio output ioctls when the device has multiple selectable audio outputs. When the device has any audio

4

Actually struct v4l2_audio ought to have a tuner field like struct v4l2_input, not only making the API more consistent but also permitting radio devices with multiple tuners.

1.2. Part I - Video for Linux API 7

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

inputs or outputs the driver must set the V4L2_CAP_AUDIO flag in the struct v4l2_capability returned by the ioctl VIDIOC_QUERYCAP ioctl.

Example: Information about the current audio input struct

v4l2_audio audio; memset( & audio, 0 ,

sizeof

(audio));

if

( 1 == ioctl(fd, VIDIOC_G_AUDIO, & audio)) { perror( "VIDIOC_G_AUDIO" ); exit(EXIT_FAILURE);

} printf( "Current input: %s\\n" , audio.name);

Example: Switching to the first audio input struct

v4l2_audio audio; memset( & audio, 0 ,

sizeof

(audio));

/* clear audio.mode, audio.reserved */

audio.index

= 0 ;

if

( 1 == ioctl(fd, VIDIOC_S_AUDIO, & audio)) { perror( "VIDIOC_S_AUDIO" ); exit(EXIT_FAILURE);

}

Tuners and Modulators

Tuners

Video input devices can have one or more tuners demodulating a RF signal.

Each tuner is associated with one or more video inputs, depending on the number of RF connectors on the tuner. The type field of the respective struct v4l2_input returned by the ioctl VIDIOC_ENUMINPUT ioctl is set to

V4L2_INPUT_TYPE_TUNER and its tuner field contains the index number of the tuner.

Radio input devices have exactly one tuner with index zero, no video inputs.

To query and change tuner properties applications use the VIDIOC_G_TUNER and VIDIOC_S_TUNER ioctls, respectively. The struct v4l2_tuner returned by VIDIOC_G_TUNER also contains signal status information applicable when the tuner of the current video or radio input is queried.

Note:

VIDIOC_S_TUNER does not switch the current tuner, when there is more than one at all.

The tuner is solely determined by the current video input. Drivers must support both ioctls and set the

V4L2_CAP_TUNER flag in the struct v4l2_capability returned by the ioctl VIDIOC_QUERYCAP ioctl when

the device has one or more tuners.

Modulators

Video output devices can have one or more modulators, uh, modulating a video signal for radiation or connection to the antenna input of a TV set or video recorder. Each modulator is associated with

8 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

one or more video outputs, depending on the number of RF connectors on the modulator. The type field of the respective struct v4l2_output returned by the ioctl VIDIOC_ENUMOUTPUT ioctl is set to

V4L2_OUTPUT_TYPE_MODULATOR and its modulator field contains the index number of the modulator.

Radio output devices have exactly one modulator with index zero, no video outputs.

A video or radio device cannot support both a tuner and a modulator. Two separate device nodes will have to be used for such hardware, one that supports the tuner functionality and one that supports the modulator functionality. The reason is a limitation with the VIDIOC_S_FREQUENCY ioctl where you cannot specify whether the frequency is for a tuner or a modulator.

To query and change modulator properties applications use the VIDIOC_G_MODULATOR and VID-

IOC_S_MODULATOR ioctl. Note that VIDIOC_S_MODULATOR does not switch the current modulator, when there is more than one at all. The modulator is solely determined by the current video output. Drivers must support both ioctls and set the V4L2_CAP_MODULATOR flag in the struct v4l2_capability returned by the ioctl VIDIOC_QUERYCAP ioctl when the device has one or more modulators.

Radio Frequency

To get and set the tuner or modulator radio frequency applications use the VIDIOC_G_FREQUENCY and

VIDIOC_S_FREQUENCY ioctl which both take a pointer to a struct v4l2_frequency. These ioctls are used for TV and radio devices alike. Drivers must support both ioctls when the tuner or modulator ioctls are supported, or when the device is a radio device.

Video Standards

Video devices typically support one or more different video standards or variations of standards. Each video input and output may support another set of standards. This set is reported by the std field of struct v4l2_input and struct v4l2_output returned by the ioctl VIDIOC_ENUMINPUT and ioctl VID-

IOC_ENUMOUTPUT ioctls, respectively.

V4L2 defines one bit for each analog video standard currently in use worldwide, and sets aside bits for driver defined standards, e. g. hybrid standards to watch NTSC video tapes on PAL TVs and vice versa.

Applications can use the predefined bits to select a particular standard, although presenting the user a menu of supported standards is preferred. To enumerate and query the attributes of the supported standards applications use the ioctl VIDIOC_ENUMSTD ioctl.

Many of the defined standards are actually just variations of a few major standards. The hardware may in fact not distinguish between them, or do so internal and switch automatically. Therefore enumerated standards also contain sets of one or more standard bits.

Assume a hypothetic tuner capable of demodulating B/PAL, G/PAL and I/PAL signals. The first enumerated standard is a set of B and G/PAL, switched automatically depending on the selected radio frequency in

UHF or VHF band. Enumeration gives a ``PAL-B/G'' or ``PAL-I'' choice. Similar a Composite input may collapse standards, enumerating ``PAL-B/G/H/I'', ``NTSC-M'' and ``SECAM-D/K''.

5

To query and select the standard used by the current video input or output applications call the VID-

IOC_G_STD and VIDIOC_S_STD ioctl, respectively. The received standard can be sensed with the ioctl

VIDIOC_QUERYSTD ioctl.

Note:

The parameter of all these ioctls is a pointer to a v4l2_std_id type (a standard set), not an index into

the standard enumeration. Drivers must implement all video standard ioctls when the device has one or more video inputs or outputs.

5

Some users are already confused by technical terms PAL, NTSC and SECAM. There is no point asking them to distinguish between

B, G, D, or K when the software or hardware can do that automatically.

1.2. Part I - Video for Linux API 9

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Special rules apply to devices such as USB cameras where the notion of video standards makes little sense. More generally for any capture or output device which is:

• incapable of capturing fields or frames at the nominal rate of the video standard, or

• that does not support the video standard formats at all.

Here the driver shall set the std field of struct v4l2_input and struct v4l2_output to zero and the

VIDIOC_G_STD, VIDIOC_S_STD, ioctl VIDIOC_QUERYSTD and ioctl VIDIOC_ENUMSTD ioctls shall return the

ENOTTY error code or the EINVAL error code.

Applications can make use of the Input capabilities and Output capabilities flags to determine whether the video standard ioctls can be used with the given input or output.

Example: Information about the current video standard

v4l2_std_id std_id;

struct

v4l2_standard standard;

if

( 1 == ioctl(fd, VIDIOC_G_STD, & std_id)) {

/* Note when VIDIOC_ENUMSTD always returns ENOTTY this is no video device or it falls under the USB exception, and VIDIOC_G_STD returning ENOTTY is no error. */

perror( "VIDIOC_G_STD" ); exit(EXIT_FAILURE);

} memset( & standard, 0 ,

sizeof

(standard)); standard.index

= 0 ;

while

( 0 == ioctl(fd, VIDIOC_ENUMSTD, & standard)) {

if

(standard.id

& std_id) { printf( "Current video standard: %s\\n" , standard.name); exit(EXIT_SUCCESS);

} standard.index

++ ;

}

/* EINVAL indicates the end of the enumeration, which cannot be empty unless this device falls under the USB exception. */

if

(errno == EINVAL || standard.index

== 0 ) { perror( "VIDIOC_ENUMSTD" ); exit(EXIT_FAILURE);

}

Example: Listing the video standards supported by the current input struct

v4l2_input input;

struct

v4l2_standard standard; memset( & input, 0 ,

sizeof

(input));

if

( 1 == ioctl(fd, VIDIOC_G_INPUT, & input.index)) { perror( "VIDIOC_G_INPUT" ); exit(EXIT_FAILURE);

}

if

( 1 == ioctl(fd, VIDIOC_ENUMINPUT, & input)) {

10 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

perror( "VIDIOC_ENUM_INPUT" ); exit(EXIT_FAILURE);

} printf( "Current input %s supports:\\n" , input.name); memset( & standard, 0 ,

sizeof

(standard)); standard.index

= 0 ;

while

( 0 == ioctl(fd, VIDIOC_ENUMSTD, & standard)) {

if

(standard.id

& input.std) printf( "%s\\n" , standard.name); standard.index

++ ;

}

/* EINVAL indicates the end of the enumeration, which cannot be empty unless this device falls under the USB exception. */

if

(errno != EINVAL || standard.index

== 0 ) { perror( "VIDIOC_ENUMSTD" ); exit(EXIT_FAILURE);

}

Example: Selecting a new video standard struct

v4l2_input input; v4l2_std_id std_id; memset( & input, 0 ,

sizeof

(input));

if

( 1 == ioctl(fd, VIDIOC_G_INPUT, & input.index)) { perror( "VIDIOC_G_INPUT" ); exit(EXIT_FAILURE);

}

if

( 1 == ioctl(fd, VIDIOC_ENUMINPUT, & input)) { perror( "VIDIOC_ENUM_INPUT" ); exit(EXIT_FAILURE);

}

if

( 0 == (input.std

& V4L2_STD_PAL_BG)) { fprintf(stderr, "Oops. B/G PAL is not supported.\\n" ); exit(EXIT_FAILURE);

}

/* Note this is also supposed to work when only B or G/PAL is supported. */

std_id = V4L2_STD_PAL_BG;

if

( 1 == ioctl(fd, VIDIOC_S_STD, & std_id)) { perror( "VIDIOC_S_STD" ); exit(EXIT_FAILURE);

}

Digital Video (DV) Timings

The video standards discussed so far have been dealing with Analog TV and the corresponding video timings. Today there are many more different hardware interfaces such as High Definition TV interfaces

1.2. Part I - Video for Linux API 11

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

(HDMI), VGA, DVI connectors etc., that carry video signals and there is a need to extend the API to select the video timings for these interfaces. Since it is not possible to extend the v4l2_std_id due to the limited bits available, a new set of ioctls was added to set/get video timings at the input and output.

These ioctls deal with the detailed digital video timings that define each video format. This includes parameters such as the active video width and height, signal polarities, frontporches, backporches, sync widths etc. The linux/v4l2-dv-timings.h header can be used to get the timings of the formats in the

CEA-861-E and VESA DMT standards.

To enumerate and query the attributes of the DV timings supported by a device applications use the

ioctl VIDIOC_ENUM_DV_TIMINGS, VIDIOC_SUBDEV_ENUM_DV_TIMINGS and ioctl VIDIOC_DV_TIMINGS_CAP,

VIDIOC_SUBDEV_DV_TIMINGS_CAP ioctls.

To set DV timings for the device applications use the VID-

IOC_S_DV_TIMINGS ioctl and to get current DV timings they use the VIDIOC_G_DV_TIMINGS ioctl. To detect the DV timings as seen by the video receiver applications use the ioctl VIDIOC_QUERY_DV_TIMINGS ioctl.

Applications can make use of the Input capabilities and Output capabilities flags to determine whether the digital video ioctls can be used with the given input or output.

User Controls

Devices typically have a number of user-settable controls such as brightness, saturation and so on, which would be presented to the user on a graphical user interface. But, different devices will have different controls available, and furthermore, the range of possible values, and the default value will vary from device to device. The control ioctls provide the information and a mechanism to create a nice user interface for these controls that will work correctly with any device.

All controls are accessed using an ID value. V4L2 defines several IDs for specific purposes. Drivers can also implement their own custom controls using V4L2_CID_PRIVATE_BASE

6

and higher values. The predefined control IDs have the prefix V4L2_CID_, and are listed in

Control IDs

. The ID is used when querying the attributes of a control, and when getting or setting the current value.

Generally applications should present controls to the user without assumptions about their purpose. Each control comes with a name string the user is supposed to understand. When the purpose is non-intuitive the driver writer should provide a user manual, a user interface plug-in or a driver specific panel application. Predefined IDs were introduced to change a few controls programmatically, for example to mute a device during a channel switch.

Drivers may enumerate different controls after switching the current video input or output, tuner or modulator, or audio input or output. Different in the sense of other bounds, another default and current value, step size or other menu items. A control with a certain custom ID can also change name and type.

If a control is not applicable to the current configuration of the device (for example, it doesn't apply to the current video input) drivers set the V4L2_CTRL_FLAG_INACTIVE flag.

Control values are stored globally, they do not change when switching except to stay within the reported bounds. They also do not change e. g. when the device is opened or closed, when the tuner radio frequency is changed or generally never without application request.

V4L2 specifies an event mechanism to notify applications when controls change value (see ioctl

VIDIOC_SUBSCRIBE_EVENT, VIDIOC_UNSUBSCRIBE_EVENT, event V4L2_EVENT_CTRL), panel applications might want to make use of that in order to always reflect the correct control value.

All controls use machine endianness.

6

The use of V4L2_CID_PRIVATE_BASE is problematic because different drivers may use the same V4L2_CID_PRIVATE_BASE ID for different controls. This makes it hard to programatically set such controls since the meaning of the control with that ID is driver dependent. In order to resolve this drivers use unique IDs and the V4L2_CID_PRIVATE_BASE IDs are mapped to those unique IDs by the kernel. Consider these V4L2_CID_PRIVATE_BASE IDs as aliases to the real IDs.

Many applications today still use the V4L2_CID_PRIVATE_BASE IDs instead of using ioctls VIDIOC_QUERYCTRL, VID-

IOC_QUERY_EXT_CTRL and VIDIOC_QUERYMENU with the V4L2_CTRL_FLAG_NEXT_CTRL flag to enumerate all IDs, so support for

V4L2_CID_PRIVATE_BASE is still around.

12 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Control IDs

V4L2_CID_BASE First predefined ID, equal to V4L2_CID_BRIGHTNESS.

V4L2_CID_USER_BASE Synonym of V4L2_CID_BASE.

V4L2_CID_BRIGHTNESS (integer) Picture brightness, or more precisely, the black level.

V4L2_CID_CONTRAST (integer) Picture contrast or luma gain.

V4L2_CID_SATURATION (integer) Picture color saturation or chroma gain.

V4L2_CID_HUE (integer) Hue or color balance.

V4L2_CID_AUDIO_VOLUME (integer) Overall audio volume. Note some drivers also provide an OSS or

ALSA mixer interface.

V4L2_CID_AUDIO_BALANCE (integer) Audio stereo balance. Minimum corresponds to all the way left, maximum to right.

V4L2_CID_AUDIO_BASS (integer) Audio bass adjustment.

V4L2_CID_AUDIO_TREBLE (integer) Audio treble adjustment.

V4L2_CID_AUDIO_MUTE (boolean) Mute audio, i. e. set the volume to zero, however without affecting

V4L2_CID_AUDIO_VOLUME. Like ALSA drivers, V4L2 drivers must mute at load time to avoid excessive noise. Actually the entire device should be reset to a low power consumption state.

V4L2_CID_AUDIO_LOUDNESS (boolean) Loudness mode (bass boost).

V4L2_CID_BLACK_LEVEL (integer) Another name for brightness (not a synonym of

V4L2_CID_BRIGHTNESS). This control is deprecated and should not be used in new drivers and applications.

V4L2_CID_AUTO_WHITE_BALANCE (boolean) Automatic white balance (cameras).

V4L2_CID_DO_WHITE_BALANCE (button) This is an action control. When set (the value is ignored), the device will do a white balance and then hold the current setting. Contrast this with the boolean

V4L2_CID_AUTO_WHITE_BALANCE, which, when activated, keeps adjusting the white balance.

V4L2_CID_RED_BALANCE (integer) Red chroma balance.

V4L2_CID_BLUE_BALANCE (integer) Blue chroma balance.

V4L2_CID_GAMMA (integer) Gamma adjust.

V4L2_CID_WHITENESS (integer) Whiteness for grey-scale devices.

This is a synonym for

V4L2_CID_GAMMA. This control is deprecated and should not be used in new drivers and applications.

V4L2_CID_EXPOSURE (integer) Exposure (cameras). [Unit?]

V4L2_CID_AUTOGAIN (boolean) Automatic gain/exposure control.

V4L2_CID_GAIN (integer) Gain control.

V4L2_CID_HFLIP (boolean) Mirror the picture horizontally.

V4L2_CID_VFLIP (boolean) Mirror the picture vertically.

V4L2_CID_POWER_LINE_FREQUENCY (enum) Enables a power line frequency filter to avoid flicker. Possible values for enum v4l2_power_line_frequency are: V4L2_CID_POWER_LINE_FREQUENCY_DISABLED

(0), V4L2_CID_POWER_LINE_FREQUENCY_50HZ (1), V4L2_CID_POWER_LINE_FREQUENCY_60HZ (2) and

V4L2_CID_POWER_LINE_FREQUENCY_AUTO (3).

V4L2_CID_HUE_AUTO (boolean) Enables automatic hue control by the device.

The effect of setting

V4L2_CID_HUE while automatic hue control is enabled is undefined, drivers should ignore such request.

1.2. Part I - Video for Linux API 13

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2_CID_WHITE_BALANCE_TEMPERATURE (integer) This control specifies the white balance settings as a color temperature in Kelvin. A driver should have a minimum of 2800 (incandescent) to 6500

(daylight). For more information about color temperature see Wikipedia .

V4L2_CID_SHARPNESS (integer) Adjusts the sharpness filters in a camera. The minimum value disables the filters, higher values give a sharper picture.

V4L2_CID_BACKLIGHT_COMPENSATION (integer) Adjusts the backlight compensation in a camera. The minimum value disables backlight compensation.

V4L2_CID_CHROMA_AGC (boolean) Chroma automatic gain control.

V4L2_CID_CHROMA_GAIN (integer) Adjusts the Chroma gain control (for use when chroma AGC is disabled).

V4L2_CID_COLOR_KILLER (boolean) Enable the color killer (i. e. force a black & white image in case of a weak video signal).

V4L2_CID_COLORFX (enum) Selects a color effect. The following values are defined:

V4L2_COLORFX_NONE

V4L2_COLORFX_ANTIQUE

V4L2_COLORFX_ART_FREEZE

V4L2_COLORFX_AQUA

V4L2_COLORFX_BW

V4L2_COLORFX_EMBOSS

V4L2_COLORFX_GRASS_GREEN

V4L2_COLORFX_NEGATIVE

V4L2_COLORFX_SEPIA

V4L2_COLORFX_SKETCH

V4L2_COLORFX_SKIN_WHITEN

V4L2_COLORFX_SKY_BLUE

V4L2_COLORFX_SOLARIZATION

V4L2_COLORFX_SILHOUETTE

V4L2_COLORFX_VIVID

V4L2_COLORFX_SET_CBCR

Color effect is disabled.

An aging (old photo) effect.

Frost color effect.

Water color, cool tone.

Black and white.

Emboss, the highlights and shadows replace light/dark boundaries and low contrast areas are set to a gray background.

Grass green.

Negative.

Sepia tone.

Sketch.

Skin whiten.

Sky blue.

Solarization, the image is partially reversed in tone, only color values above or below a certain threshold are inverted.

Silhouette (outline).

Vivid colors.

The Cb and Cr chroma components are replaced by fixed coefficients determined by V4L2_CID_COLORFX_CBCR control.

V4L2_CID_COLORFX_CBCR (integer) Determines the Cb and Cr coefficients for V4L2_COLORFX_SET_CBCR color effect. Bits [7:0] of the supplied 32 bit value are interpreted as Cr component, bits [15:8] as Cb component and bits [31:16] must be zero.

V4L2_CID_AUTOBRIGHTNESS (boolean) Enable Automatic Brightness.

V4L2_CID_ROTATE (integer) Rotates the image by specified angle. Common angles are 90, 270 and

180. Rotating the image to 90 and 270 will reverse the height and width of the display window. It is necessary to set the new height and width of the picture using the VIDIOC_S_FMT ioctl according to the rotation angle selected.

V4L2_CID_BG_COLOR (integer) Sets the background color on the current output device. Background color needs to be specified in the RGB24 format. The supplied 32 bit value is interpreted as bits 0-7

Red color information, bits 8-15 Green color information, bits 16-23 Blue color information and bits

24-31 must be zero.

V4L2_CID_ILLUMINATORS_1 V4L2_CID_ILLUMINATORS_2 (boolean) Switch on or off the illuminator 1 or

2 of the device (usually a microscope).

V4L2_CID_MIN_BUFFERS_FOR_CAPTURE (integer) This is a read-only control that can be read by the application and used as a hint to determine the number of CAPTURE buffers to pass to REQBUFS. The value is the minimum number of CAPTURE buffers that is necessary for hardware to work.

14 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2_CID_MIN_BUFFERS_FOR_OUTPUT (integer) This is a read-only control that can be read by the application and used as a hint to determine the number of OUTPUT buffers to pass to REQBUFS. The value is the minimum number of OUTPUT buffers that is necessary for hardware to work.

V4L2_CID_ALPHA_COMPONENT (integer) Sets the alpha color component. When a capture device (or capture queue of a mem-to-mem device) produces a frame format that includes an alpha component

(e.g.

packed RGB image formats

) and the alpha value is not defined by the device or the mem-tomem input data this control lets you select the alpha component value of all pixels. When an output device (or output queue of a mem-to-mem device) consumes a frame format that doesn't include an alpha component and the device supports alpha channel processing this control lets you set the alpha component value of all pixels for further processing in the device.

V4L2_CID_LASTP1 End of the predefined control IDs (currently V4L2_CID_ALPHA_COMPONENT + 1).

V4L2_CID_PRIVATE_BASE ID of the first custom (driver specific) control. Applications depending on particular custom controls should check the driver name and version, see

Querying Capabilities

.

Applications can enumerate the available controls with the

ioctls VIDIOC_QUERYCTRL, VID-

IOC_QUERY_EXT_CTRL and VIDIOC_QUERYMENU and VIDIOC_QUERYMENU ioctls, get and set a control value with the VIDIOC_G_CTRL and VIDIOC_S_CTRL ioctls. Drivers must implement VIDIOC_QUERYCTRL,

VIDIOC_G_CTRL and VIDIOC_S_CTRL when the device has one or more controls, VIDIOC_QUERYMENU when it has one or more menu type controls.

Example: Enumerating all controls struct

v4l2_queryctrl queryctrl;

struct

v4l2_querymenu querymenu;

static void

enumerate_menu (__u32 id)

{ printf( " Menu items:\\n" ); memset( & querymenu, 0 ,

sizeof

(querymenu)); querymenu.id

= id;

for

(querymenu.index

= queryctrl.minimum; querymenu.index

<= queryctrl.maximum; querymenu.index

++ ) {

if

( 0 == ioctl(fd, VIDIOC_QUERYMENU, & querymenu)) { printf( " %s\\n" , querymenu.name);

}

}

} memset( & queryctrl, 0 ,

sizeof

(queryctrl)); queryctrl.id

= V4L2_CTRL_FLAG_NEXT_CTRL;

while

( 0 == ioctl(fd, VIDIOC_QUERYCTRL, & queryctrl)) {

if

( !

(queryctrl.flags

& V4L2_CTRL_FLAG_DISABLED)) { printf( "Control %s\\n" , queryctrl.name);

if

(queryctrl.type

== V4L2_CTRL_TYPE_MENU) enumerate_menu(queryctrl.id);

} queryctrl.id

|= V4L2_CTRL_FLAG_NEXT_CTRL;

}

if

(errno != EINVAL) { perror( "VIDIOC_QUERYCTRL" ); exit(EXIT_FAILURE);

}

1.2. Part I - Video for Linux API 15

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Example: Enumerating all controls including compound controls struct

v4l2_query_ext_ctrl query_ext_ctrl; memset( & query_ext_ctrl, 0 ,

sizeof

(query_ext_ctrl)); query_ext_ctrl.id

= V4L2_CTRL_FLAG_NEXT_CTRL | V4L2_CTRL_FLAG_NEXT_COMPOUND;

while

( 0 == ioctl(fd, VIDIOC_QUERY_EXT_CTRL, & query_ext_ctrl)) {

if

( !

(query_ext_ctrl.flags

& V4L2_CTRL_FLAG_DISABLED)) { printf( "Control %s\\n" , query_ext_ctrl.name);

if

(query_ext_ctrl.type

== V4L2_CTRL_TYPE_MENU) enumerate_menu(query_ext_ctrl.id);

} query_ext_ctrl.id

|= V4L2_CTRL_FLAG_NEXT_CTRL | V4L2_CTRL_FLAG_NEXT_COMPOUND;

}

if

(errno != EINVAL) { perror( "VIDIOC_QUERY_EXT_CTRL" ); exit(EXIT_FAILURE);

}

Example: Enumerating all user controls (old style)

memset( & queryctrl, 0 ,

sizeof

(queryctrl));

for

(queryctrl.id

= V4L2_CID_BASE; queryctrl.id

< V4L2_CID_LASTP1; queryctrl.id

++ ) {

if

( 0 == ioctl(fd, VIDIOC_QUERYCTRL, & queryctrl)) {

if

(queryctrl.flags

& V4L2_CTRL_FLAG_DISABLED)

continue

; printf( "Control %s\\n" , queryctrl.name);

if

(queryctrl.type

== V4L2_CTRL_TYPE_MENU) enumerate_menu(queryctrl.id);

}

else

{

if

(errno == EINVAL)

continue

; perror( "VIDIOC_QUERYCTRL" ); exit(EXIT_FAILURE);

}

}

for

(queryctrl.id

= V4L2_CID_PRIVATE_BASE;; queryctrl.id

++ ) {

if

( 0 == ioctl(fd, VIDIOC_QUERYCTRL, & queryctrl)) {

if

(queryctrl.flags

& V4L2_CTRL_FLAG_DISABLED)

continue

; printf( "Control %s\\n" , queryctrl.name);

if

(queryctrl.type

== V4L2_CTRL_TYPE_MENU)

}

else

{ enumerate_menu(queryctrl.id);

if

(errno == EINVAL)

break

; perror( "VIDIOC_QUERYCTRL" );

16 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

}

} exit(EXIT_FAILURE);

Example: Changing controls struct

v4l2_queryctrl queryctrl;

struct

v4l2_control control; memset( & queryctrl, 0 ,

sizeof

(queryctrl)); queryctrl.id

= V4L2_CID_BRIGHTNESS;

if

( 1 == ioctl(fd, VIDIOC_QUERYCTRL, & queryctrl)) {

if

(errno != EINVAL) { perror( "VIDIOC_QUERYCTRL" ); exit(EXIT_FAILURE);

}

else

{ printf( "V4L2_CID_BRIGHTNESS is not supportedn" );

}

}

else if

(queryctrl.flags

& V4L2_CTRL_FLAG_DISABLED) { printf( "V4L2_CID_BRIGHTNESS is not supportedn" );

}

else

{ memset( & control, 0 ,

sizeof

(control)); control.id

= V4L2_CID_BRIGHTNESS; control.value

= queryctrl.default_value;

if

( 1 == ioctl(fd, VIDIOC_S_CTRL, & control)) { perror( "VIDIOC_S_CTRL" ); exit(EXIT_FAILURE);

}

} memset( & control, 0 ,

sizeof

(control)); control.id

= V4L2_CID_CONTRAST;

if

( 0 == ioctl(fd, VIDIOC_G_CTRL, & control)) { control.value

+= 1 ;

/* The driver may clamp the value or return ERANGE, ignored here */

if

( 1 == ioctl(fd, VIDIOC_S_CTRL, & control)

&& errno != ERANGE) { perror( "VIDIOC_S_CTRL" ); exit(EXIT_FAILURE);

}

/* Ignore if V4L2_CID_CONTRAST is unsupported */

}

else if

(errno != EINVAL) { perror( "VIDIOC_G_CTRL" ); exit(EXIT_FAILURE);

} control.id

= V4L2_CID_AUDIO_MUTE; control.value

= 1 ;

/* silence */

/* Errors ignored */

ioctl(fd, VIDIOC_S_CTRL, & control);

1.2. Part I - Video for Linux API 17

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Extended Controls

Introduction

The control mechanism as originally designed was meant to be used for user settings (brightness, saturation, etc). However, it turned out to be a very useful model for implementing more complicated driver

APIs where each driver implements only a subset of a larger API.

The MPEG encoding API was the driving force behind designing and implementing this extended control mechanism: the MPEG standard is quite large and the currently supported hardware MPEG encoders each only implement a subset of this standard. Further more, many parameters relating to how the video is encoded into an MPEG stream are specific to the MPEG encoding chip since the MPEG standard only defines the format of the resulting MPEG stream, not how the video is actually encoded into that format.

Unfortunately, the original control API lacked some features needed for these new uses and so it was extended into the (not terribly originally named) extended control API.

Even though the MPEG encoding API was the first effort to use the Extended Control API, nowadays there are also other classes of Extended Controls, such as Camera Controls and FM Transmitter Controls. The

Extended Controls API as well as all Extended Controls classes are described in the following text.

The Extended Control API

Three new ioctls are available: VIDIOC_G_EXT_CTRLS, VIDIOC_S_EXT_CTRLS and VIDIOC_TRY_EXT_CTRLS.

These ioctls act on arrays of controls (as opposed to the VIDIOC_G_CTRL and VIDIOC_S_CTRL ioctls that act on a single control). This is needed since it is often required to atomically change several controls at once.

Each of the new ioctls expects a pointer to a struct v4l2_ext_controls. This structure contains a pointer to the control array, a count of the number of controls in that array and a control class. Control classes are used to group similar controls into a single class. For example, control class V4L2_CTRL_CLASS_USER contains all user controls (i. e. all controls that can also be set using the old VIDIOC_S_CTRL ioctl). Control class V4L2_CTRL_CLASS_MPEG contains all controls relating to MPEG encoding, etc.

All controls in the control array must belong to the specified control class. An error is returned if this is not the case.

It is also possible to use an empty control array (count == 0) to check whether the specified control class is supported.

The control array is a struct v4l2_ext_control array. The struct v4l2_ext_control is very similar to struct v4l2_control, except for the fact that it also allows for 64-bit values and pointers to be passed.

Since the struct v4l2_ext_control supports pointers it is now also possible to have controls with compound types such as N-dimensional arrays and/or structures.

You need to specify the

V4L2_CTRL_FLAG_NEXT_COMPOUND when enumerating controls to actually be able to see such compound controls. In other words, these controls with compound types should only be used programmatically.

Since such compound controls need to expose more information about themselves than is possible with ioctls VIDIOC_QUERYCTRL, VIDIOC_QUERY_EXT_CTRL and VIDIOC_QUERYMENU the VID-

IOC_QUERY_EXT_CTRL ioctl was added. In particular, this ioctl gives the dimensions of the N-dimensional array if this control consists of more than one element.

18 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Note:

1. It is important to realize that due to the flexibility of controls it is necessary to check whether the control you want to set actually is supported in the driver and what the valid range of values

is. So use the ioctls VIDIOC_QUERYCTRL, VIDIOC_QUERY_EXT_CTRL and VIDIOC_QUERYMENU (or

VIDIOC_QUERY_EXT_CTRL) and VIDIOC_QUERYMENU ioctls to check this.

2. It is possible that some of the menu indices in a control of type V4L2_CTRL_TYPE_MENU may not be supported (VIDIOC_QUERYMENU will return an error). A good example is the list of supported MPEG audio bitrates. Some drivers only support one or two bitrates, others support a wider range.

All controls use machine endianness.

Enumerating Extended Controls

The recommended way to enumerate over the extended controls is by using ioctls VIDIOC_QUERYCTRL,

VIDIOC_QUERY_EXT_CTRL and VIDIOC_QUERYMENU in combination with the V4L2_CTRL_FLAG_NEXT_CTRL flag:

struct

v4l2_queryctrl qctrl; qctrl.id

= V4L2_CTRL_FLAG_NEXT_CTRL;

while

( 0 == ioctl (fd, VIDIOC_QUERYCTRL, & qctrl)) {

/* ... */

qctrl.id

|= V4L2_CTRL_FLAG_NEXT_CTRL;

}

The initial control ID is set to 0 ORed with the V4L2_CTRL_FLAG_NEXT_CTRL flag. The VIDIOC_QUERYCTRL ioctl will return the first control with a higher ID than the specified one. When no such controls are found an error is returned.

If you want to get all controls within a specific control class, then you can set the initial qctrl.id value to the control class and add an extra check to break out of the loop when a control of another control class is found: qctrl.id

= V4L2_CTRL_CLASS_MPEG | V4L2_CTRL_FLAG_NEXT_CTRL;

while

( 0 == ioctl(fd, VIDIOC_QUERYCTRL, & qctrl)) {

if

(V4L2_CTRL_ID2CLASS(qctrl.id) != V4L2_CTRL_CLASS_MPEG)

break

;

/* ... */

qctrl.id

|= V4L2_CTRL_FLAG_NEXT_CTRL;

}

The 32-bit qctrl.id value is subdivided into three bit ranges: the top 4 bits are reserved for flags (e.

g. V4L2_CTRL_FLAG_NEXT_CTRL) and are not actually part of the ID. The remaining 28 bits form the control ID, of which the most significant 12 bits define the control class and the least significant 16 bits identify the control within the control class. It is guaranteed that these last 16 bits are always nonzero for controls. The range of 0x1000 and up are reserved for driver-specific controls. The macro

V4L2_CTRL_ID2CLASS(id) returns the control class ID based on a control ID.

If the driver does not support extended controls, then VIDIOC_QUERYCTRL will fail when used in combination with V4L2_CTRL_FLAG_NEXT_CTRL. In that case the old method of enumerating control should be used (see

Example: Enumerating all controls

). But if it is supported, then it is guaranteed to enumerate

over all controls, including driver-private controls.

1.2. Part I - Video for Linux API 19

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Creating Control Panels

It is possible to create control panels for a graphical user interface where the user can select the various controls. Basically you will have to iterate over all controls using the method described above. Each control class starts with a control of type V4L2_CTRL_TYPE_CTRL_CLASS. VIDIOC_QUERYCTRL will return the name of this control class which can be used as the title of a tab page within a control panel.

The flags field of struct v4l2_queryctrl also contains hints on the behavior of the control. See the ioctls

VIDIOC_QUERYCTRL, VIDIOC_QUERY_EXT_CTRL and VIDIOC_QUERYMENU documentation for more details.

Codec Control Reference

Below all controls within the Codec control class are described. First the generic controls, then controls specific for certain hardware.

Note:

These controls are applicable to all codecs and not just MPEG. The defines are prefixed with

V4L2_CID_MPEG/V4L2_MPEG as the controls were originally made for MPEG codecs and later extended to cover all encoding formats.

Generic Codec Controls

Codec Control IDs

V4L2_CID_MPEG_CLASS (class) The Codec class descriptor.

Calling ioctls VIDIOC_QUERYCTRL, VID-

IOC_QUERY_EXT_CTRL and VIDIOC_QUERYMENU for this control will return a description of this control class. This description can be used as the caption of a Tab page in a GUI, for example.

V4L2_CID_MPEG_STREAM_TYPE (enum)

enum v4l2_mpeg_stream_type - The MPEG-1, -2 or -4 output stream type. One cannot assume anything here. Each hardware MPEG encoder tends to support different subsets of the available MPEG stream types. This control is specific to multiplexed MPEG streams. The currently defined stream types are:

V4L2_MPEG_STREAM_TYPE_MPEG2_PS

V4L2_MPEG_STREAM_TYPE_MPEG2_TS

V4L2_MPEG_STREAM_TYPE_MPEG1_SS

MPEG-2 program stream

MPEG-2 transport stream

MPEG-1 system stream

V4L2_MPEG_STREAM_TYPE_MPEG2_DVD

V4L2_MPEG_STREAM_TYPE_MPEG1_VCD

MPEG-2 DVD-compatible stream

MPEG-1 VCD-compatible stream

V4L2_MPEG_STREAM_TYPE_MPEG2_SVCD MPEG-2 SVCD-compatible stream

V4L2_CID_MPEG_STREAM_PID_PMT (integer) Program Map Table Packet ID for the MPEG transport stream (default 16)

V4L2_CID_MPEG_STREAM_PID_AUDIO (integer) Audio Packet ID for the MPEG transport stream (default

256)

V4L2_CID_MPEG_STREAM_PID_VIDEO (integer) Video Packet ID for the MPEG transport stream (default

260)

V4L2_CID_MPEG_STREAM_PID_PCR (integer) Packet ID for the MPEG transport stream carrying PCR fields

(default 259)

V4L2_CID_MPEG_STREAM_PES_ID_AUDIO (integer) Audio ID for MPEG PES

V4L2_CID_MPEG_STREAM_PES_ID_VIDEO (integer) Video ID for MPEG PES

V4L2_CID_MPEG_STREAM_VBI_FMT (enum)

20 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

enum v4l2_mpeg_stream_vbi_fmt - Some cards can embed VBI data (e. g. Closed Caption, Teletext) into the MPEG stream. This control selects whether VBI data should be embedded, and if so, what embedding method should be used. The list of possible VBI formats depends on the driver. The currently defined VBI format types are:

V4L2_MPEG_STREAM_VBI_FMT_NONE No VBI in the MPEG stream

V4L2_MPEG_STREAM_VBI_FMT_IVTV VBI in private packets, in the kernel sources

IVTV in format the tion/video4linux/cx2341x/README.vbi) file

(documented

Documenta-

V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ (enum)

enum v4l2_mpeg_audio_sampling_freq - MPEG Audio sampling frequency. Possible values are:

V4L2_MPEG_AUDIO_SAMPLING_FREQ_44100 44.1 kHz

V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000 48 kHz

V4L2_MPEG_AUDIO_SAMPLING_FREQ_32000 32 kHz

V4L2_CID_MPEG_AUDIO_ENCODING (enum)

enum v4l2_mpeg_audio_encoding - MPEG Audio encoding.

This control is specific to multiplexed

MPEG streams. Possible values are:

V4L2_MPEG_AUDIO_ENCODING_LAYER_1 MPEG-1/2 Layer I encoding

V4L2_MPEG_AUDIO_ENCODING_LAYER_2 MPEG-1/2 Layer II encoding

V4L2_MPEG_AUDIO_ENCODING_LAYER_3 MPEG-1/2 Layer III encoding

V4L2_MPEG_AUDIO_ENCODING_AAC MPEG-2/4 AAC (Advanced Audio Coding)

V4L2_MPEG_AUDIO_ENCODING_AC3 AC-3 aka ATSC A/52 encoding

V4L2_CID_MPEG_AUDIO_L1_BITRATE (enum)

enum v4l2_mpeg_audio_l1_bitrate - MPEG-1/2 Layer I bitrate. Possible values are:

V4L2_MPEG_AUDIO_L1_BITRATE_32K

V4L2_MPEG_AUDIO_L1_BITRATE_64K

32 kbit/s

64 kbit/s

V4L2_MPEG_AUDIO_L1_BITRATE_96K 96 kbit/s

V4L2_MPEG_AUDIO_L1_BITRATE_128K 128 kbit/s

V4L2_MPEG_AUDIO_L1_BITRATE_160K 160 kbit/s

V4L2_MPEG_AUDIO_L1_BITRATE_192K 192 kbit/s

V4L2_MPEG_AUDIO_L1_BITRATE_224K 224 kbit/s

V4L2_MPEG_AUDIO_L1_BITRATE_256K 256 kbit/s

V4L2_MPEG_AUDIO_L1_BITRATE_288K 288 kbit/s

V4L2_MPEG_AUDIO_L1_BITRATE_320K 320 kbit/s

V4L2_MPEG_AUDIO_L1_BITRATE_352K 352 kbit/s

V4L2_MPEG_AUDIO_L1_BITRATE_384K 384 kbit/s

V4L2_MPEG_AUDIO_L1_BITRATE_416K 416 kbit/s

V4L2_MPEG_AUDIO_L1_BITRATE_448K 448 kbit/s

V4L2_CID_MPEG_AUDIO_L2_BITRATE (enum)

enum v4l2_mpeg_audio_l2_bitrate - MPEG-1/2 Layer II bitrate. Possible values are:

1.2. Part I - Video for Linux API 21

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2_MPEG_AUDIO_L2_BITRATE_32K

V4L2_MPEG_AUDIO_L2_BITRATE_48K

V4L2_MPEG_AUDIO_L2_BITRATE_56K

V4L2_MPEG_AUDIO_L2_BITRATE_64K

32 kbit/s

48 kbit/s

56 kbit/s

64 kbit/s

V4L2_MPEG_AUDIO_L2_BITRATE_80K

V4L2_MPEG_AUDIO_L2_BITRATE_96K

80 kbit/s

96 kbit/s

V4L2_MPEG_AUDIO_L2_BITRATE_112K 112 kbit/s

V4L2_MPEG_AUDIO_L2_BITRATE_128K 128 kbit/s

V4L2_MPEG_AUDIO_L2_BITRATE_160K 160 kbit/s

V4L2_MPEG_AUDIO_L2_BITRATE_192K 192 kbit/s

V4L2_MPEG_AUDIO_L2_BITRATE_224K 224 kbit/s

V4L2_MPEG_AUDIO_L2_BITRATE_256K 256 kbit/s

V4L2_MPEG_AUDIO_L2_BITRATE_320K 320 kbit/s

V4L2_MPEG_AUDIO_L2_BITRATE_384K 384 kbit/s

V4L2_CID_MPEG_AUDIO_L3_BITRATE (enum)

enum v4l2_mpeg_audio_l3_bitrate - MPEG-1/2 Layer III bitrate. Possible values are:

V4L2_MPEG_AUDIO_L3_BITRATE_32K

V4L2_MPEG_AUDIO_L3_BITRATE_40K

V4L2_MPEG_AUDIO_L3_BITRATE_48K

V4L2_MPEG_AUDIO_L3_BITRATE_56K

32 kbit/s

40 kbit/s

48 kbit/s

56 kbit/s

V4L2_MPEG_AUDIO_L3_BITRATE_64K

V4L2_MPEG_AUDIO_L3_BITRATE_80K

64 kbit/s

80 kbit/s

V4L2_MPEG_AUDIO_L3_BITRATE_96K 96 kbit/s

V4L2_MPEG_AUDIO_L3_BITRATE_112K 112 kbit/s

V4L2_MPEG_AUDIO_L3_BITRATE_128K 128 kbit/s

V4L2_MPEG_AUDIO_L3_BITRATE_160K 160 kbit/s

V4L2_MPEG_AUDIO_L3_BITRATE_192K 192 kbit/s

V4L2_MPEG_AUDIO_L3_BITRATE_224K 224 kbit/s

V4L2_MPEG_AUDIO_L3_BITRATE_256K 256 kbit/s

V4L2_MPEG_AUDIO_L3_BITRATE_320K 320 kbit/s

V4L2_CID_MPEG_AUDIO_AAC_BITRATE (integer) AAC bitrate in bits per second.

V4L2_CID_MPEG_AUDIO_AC3_BITRATE (enum)

enum v4l2_mpeg_audio_ac3_bitrate - AC-3 bitrate. Possible values are:

V4L2_MPEG_AUDIO_AC3_BITRATE_32K

V4L2_MPEG_AUDIO_AC3_BITRATE_40K

V4L2_MPEG_AUDIO_AC3_BITRATE_48K

V4L2_MPEG_AUDIO_AC3_BITRATE_56K

V4L2_MPEG_AUDIO_AC3_BITRATE_64K

V4L2_MPEG_AUDIO_AC3_BITRATE_80K

V4L2_MPEG_AUDIO_AC3_BITRATE_96K

32 kbit/s

40 kbit/s

48 kbit/s

56 kbit/s

64 kbit/s

80 kbit/s

96 kbit/s

V4L2_MPEG_AUDIO_AC3_BITRATE_112K 112 kbit/s

V4L2_MPEG_AUDIO_AC3_BITRATE_128K 128 kbit/s

V4L2_MPEG_AUDIO_AC3_BITRATE_160K 160 kbit/s

V4L2_MPEG_AUDIO_AC3_BITRATE_192K 192 kbit/s

V4L2_MPEG_AUDIO_AC3_BITRATE_224K 224 kbit/s

V4L2_MPEG_AUDIO_AC3_BITRATE_256K 256 kbit/s

V4L2_MPEG_AUDIO_AC3_BITRATE_320K 320 kbit/s

V4L2_MPEG_AUDIO_AC3_BITRATE_384K 384 kbit/s

V4L2_MPEG_AUDIO_AC3_BITRATE_448K 448 kbit/s

V4L2_MPEG_AUDIO_AC3_BITRATE_512K 512 kbit/s

V4L2_MPEG_AUDIO_AC3_BITRATE_576K 576 kbit/s

V4L2_MPEG_AUDIO_AC3_BITRATE_640K 640 kbit/s

22 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2_CID_MPEG_AUDIO_MODE (enum)

enum v4l2_mpeg_audio_mode - MPEG Audio mode. Possible values are:

V4L2_MPEG_AUDIO_MODE_STEREO Stereo

V4L2_MPEG_AUDIO_MODE_JOINT_STEREO Joint Stereo

V4L2_MPEG_AUDIO_MODE_DUAL

V4L2_MPEG_AUDIO_MODE_MONO

Bilingual

Mono

V4L2_CID_MPEG_AUDIO_MODE_EXTENSION (enum)

enum v4l2_mpeg_audio_mode_extension - Joint Stereo audio mode extension. In Layer I and II they indicate which subbands are in intensity stereo. All other subbands are coded in stereo. Layer III is not (yet) supported. Possible values are:

V4L2_MPEG_AUDIO_MODE_EXTENSION_BOUND_4

V4L2_MPEG_AUDIO_MODE_EXTENSION_BOUND_8

Subbands 4-31 in intensity stereo

Subbands 8-31 in intensity stereo

V4L2_MPEG_AUDIO_MODE_EXTENSION_BOUND_12 Subbands 12-31 in intensity stereo

V4L2_MPEG_AUDIO_MODE_EXTENSION_BOUND_16 Subbands 16-31 in intensity stereo

V4L2_CID_MPEG_AUDIO_EMPHASIS (enum)

enum v4l2_mpeg_audio_emphasis - Audio Emphasis. Possible values are:

V4L2_MPEG_AUDIO_EMPHASIS_NONE None

V4L2_MPEG_AUDIO_EMPHASIS_50_DIV_15_uS 50/15 microsecond emphasis

V4L2_MPEG_AUDIO_EMPHASIS_CCITT_J17 CCITT J.17

V4L2_CID_MPEG_AUDIO_CRC (enum)

enum v4l2_mpeg_audio_crc - CRC method. Possible values are:

V4L2_MPEG_AUDIO_CRC_NONE None

V4L2_MPEG_AUDIO_CRC_CRC16 16 bit parity check

V4L2_CID_MPEG_AUDIO_MUTE (boolean) Mutes the audio when capturing. This is not done by muting audio hardware, which can still produce a slight hiss, but in the encoder itself, guaranteeing a fixed and reproducible audio bitstream. 0 = unmuted, 1 = muted.

V4L2_CID_MPEG_AUDIO_DEC_PLAYBACK (enum)

enum v4l2_mpeg_audio_dec_playback - Determines how monolingual audio should be played back.

Possible values are:

V4L2_MPEG_AUDIO_DEC_PLAYBACK_AUTO

V4L2_MPEG_AUDIO_DEC_PLAYBACK_STEREO

V4L2_MPEG_AUDIO_DEC_PLAYBACK_LEFT

V4L2_MPEG_AUDIO_DEC_PLAYBACK_RIGHT

Automatically determines the best playback mode.

Stereo playback.

Left channel playback.

Right channel playback.

V4L2_MPEG_AUDIO_DEC_PLAYBACK_MONO Mono playback.

V4L2_MPEG_AUDIO_DEC_PLAYBACK_SWAPPED_STEREO Stereo playback with swapped left and right channels.

V4L2_CID_MPEG_AUDIO_DEC_MULTILINGUAL_PLAYBACK (enum)

enum v4l2_mpeg_audio_dec_playback - Determines how multilingual audio should be played back.

V4L2_CID_MPEG_VIDEO_ENCODING (enum)

enum v4l2_mpeg_video_encoding - MPEG Video encoding method. This control is specific to multiplexed MPEG streams. Possible values are:

V4L2_MPEG_VIDEO_ENCODING_MPEG_1 MPEG-1 Video encoding

V4L2_MPEG_VIDEO_ENCODING_MPEG_2 MPEG-2 Video encoding

V4L2_MPEG_VIDEO_ENCODING_MPEG_4_AVC MPEG-4 AVC (H.264) Video encoding

V4L2_CID_MPEG_VIDEO_ASPECT (enum)

1.2. Part I - Video for Linux API 23

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

enum v4l2_mpeg_video_aspect - Video aspect. Possible values are:

V4L2_MPEG_VIDEO_ASPECT_1x1

V4L2_MPEG_VIDEO_ASPECT_4x3

V4L2_MPEG_VIDEO_ASPECT_16x9

V4L2_MPEG_VIDEO_ASPECT_221x100

V4L2_CID_MPEG_VIDEO_B_FRAMES (integer) Number of B-Frames (default 2)

V4L2_CID_MPEG_VIDEO_GOP_SIZE (integer) GOP size (default 12)

V4L2_CID_MPEG_VIDEO_GOP_CLOSURE (boolean) GOP closure (default 1)

V4L2_CID_MPEG_VIDEO_PULLDOWN (boolean) Enable 3:2 pulldown (default 0)

V4L2_CID_MPEG_VIDEO_BITRATE_MODE (enum)

enum v4l2_mpeg_video_bitrate_mode - Video bitrate mode. Possible values are:

V4L2_MPEG_VIDEO_BITRATE_MODE_VBR Variable bitrate

V4L2_MPEG_VIDEO_BITRATE_MODE_CBR Constant bitrate

V4L2_CID_MPEG_VIDEO_BITRATE (integer) Video bitrate in bits per second.

V4L2_CID_MPEG_VIDEO_BITRATE_PEAK (integer) Peak video bitrate in bits per second. Must be larger or equal to the average video bitrate. It is ignored if the video bitrate mode is set to constant bitrate.

V4L2_CID_MPEG_VIDEO_TEMPORAL_DECIMATION (integer) For every captured frame, skip this many subsequent frames (default 0).

V4L2_CID_MPEG_VIDEO_MUTE (boolean) ``Mutes'' the video to a fixed color when capturing. This is useful for testing, to produce a fixed video bitstream. 0 = unmuted, 1 = muted.

V4L2_CID_MPEG_VIDEO_MUTE_YUV (integer) Sets the ``mute'' color of the video. The supplied 32-bit integer is interpreted as follows (bit 0 = least significant bit):

Bit 0:7

Bit 8:15

V chrominance information

U chrominance information

Bit 16:23 Y luminance information

Bit 24:31 Must be zero.

V4L2_CID_MPEG_VIDEO_DEC_PTS (integer64) This read-only control returns the 33-bit video Presentation Time Stamp as defined in ITU T-REC-H.222.0 and ISO/IEC 13818-1 of the currently displayed frame. This is the same PTS as is used in ioctl VIDIOC_DECODER_CMD, VIDIOC_TRY_DECODER_CMD.

V4L2_CID_MPEG_VIDEO_DEC_FRAME (integer64) This read-only control returns the frame counter of the frame that is currently displayed (decoded). This value is reset to 0 whenever the decoder is started.

V4L2_CID_MPEG_VIDEO_DECODER_SLICE_INTERFACE (boolean) If enabled the decoder expects to receive a single slice per buffer, otherwise the decoder expects a single frame in per buffer. Applicable to the decoder, all codecs.

V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_ENABLE (boolean) Enable writing sample aspect ratio in the

Video Usability Information. Applicable to the H264 encoder.

V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_IDC (enum)

enum v4l2_mpeg_video_h264_vui_sar_idc - VUI sample aspect ratio indicator for H.264 encoding.

The value is defined in the table E-1 in the standard. Applicable to the H264 encoder.

24 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_UNSPECIFIED Unspecified

V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_1x1 1x1

V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_12x11

V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_10x11

12x11

10x11

V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_16x11

V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_40x33

V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_24x11

16x11

40x33

24x11

V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_20x11

V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_32x11

V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_80x33

V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_18x11

V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_15x11

V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_64x33

V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_160x99

V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_4x3

V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_3x2

V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_2x1

V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_EXTENDED

20x11

32x11

80x33

18x11

15x11

64x33

160x99

4x3

3x2

2x1

Extended SAR

V4L2_CID_MPEG_VIDEO_H264_VUI_EXT_SAR_WIDTH (integer) Extended sample aspect ratio width for

H.264 VUI encoding. Applicable to the H264 encoder.

V4L2_CID_MPEG_VIDEO_H264_VUI_EXT_SAR_HEIGHT (integer) Extended sample aspect ratio height for

H.264 VUI encoding. Applicable to the H264 encoder.

V4L2_CID_MPEG_VIDEO_H264_LEVEL (enum)

enum v4l2_mpeg_video_h264_level - The level information for the H264 video elementary stream.

Applicable to the H264 encoder. Possible values are:

V4L2_MPEG_VIDEO_H264_LEVEL_1_0 Level 1.0

V4L2_MPEG_VIDEO_H264_LEVEL_1B Level 1B

V4L2_MPEG_VIDEO_H264_LEVEL_1_1 Level 1.1

V4L2_MPEG_VIDEO_H264_LEVEL_1_2 Level 1.2

V4L2_MPEG_VIDEO_H264_LEVEL_1_3 Level 1.3

V4L2_MPEG_VIDEO_H264_LEVEL_2_0 Level 2.0

V4L2_MPEG_VIDEO_H264_LEVEL_2_1 Level 2.1

V4L2_MPEG_VIDEO_H264_LEVEL_2_2 Level 2.2

V4L2_MPEG_VIDEO_H264_LEVEL_3_0 Level 3.0

V4L2_MPEG_VIDEO_H264_LEVEL_3_1 Level 3.1

V4L2_MPEG_VIDEO_H264_LEVEL_3_2 Level 3.2

V4L2_MPEG_VIDEO_H264_LEVEL_4_0 Level 4.0

V4L2_MPEG_VIDEO_H264_LEVEL_4_1 Level 4.1

V4L2_MPEG_VIDEO_H264_LEVEL_4_2 Level 4.2

V4L2_MPEG_VIDEO_H264_LEVEL_5_0 Level 5.0

V4L2_MPEG_VIDEO_H264_LEVEL_5_1 Level 5.1

V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL (enum)

enum v4l2_mpeg_video_mpeg4_level - The level information for the MPEG4 elementary stream. Applicable to the MPEG4 encoder. Possible values are:

V4L2_MPEG_VIDEO_LEVEL_0 Level 0

V4L2_MPEG_VIDEO_LEVEL_0B Level 0b

V4L2_MPEG_VIDEO_LEVEL_1

V4L2_MPEG_VIDEO_LEVEL_2

V4L2_MPEG_VIDEO_LEVEL_3

Level 1

Level 2

Level 3

V4L2_MPEG_VIDEO_LEVEL_3B Level 3b

V4L2_MPEG_VIDEO_LEVEL_4 Level 4

V4L2_MPEG_VIDEO_LEVEL_5 Level 5

1.2. Part I - Video for Linux API 25

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2_CID_MPEG_VIDEO_H264_PROFILE (enum)

enum v4l2_mpeg_video_h264_profile - The profile information for H264. Applicable to the H264 encoder. Possible values are:

V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE Baseline profile

V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE Constrained Baseline profile

V4L2_MPEG_VIDEO_H264_PROFILE_MAIN Main profile

V4L2_MPEG_VIDEO_H264_PROFILE_EXTENDED

V4L2_MPEG_VIDEO_H264_PROFILE_HIGH

V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10

V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422

Extended profile

High profile

High 10 profile

High 422 profile

V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_PREDICTIVE

V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10_INTRA

V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422_INTRA

V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_INTRA

V4L2_MPEG_VIDEO_H264_PROFILE_CAVLC_444_INTRA

V4L2_MPEG_VIDEO_H264_PROFILE_SCALABLE_BASELINE

V4L2_MPEG_VIDEO_H264_PROFILE_SCALABLE_HIGH

V4L2_MPEG_VIDEO_H264_PROFILE_SCALABLE_HIGH_INTRA

V4L2_MPEG_VIDEO_H264_PROFILE_STEREO_HIGH

V4L2_MPEG_VIDEO_H264_PROFILE_MULTIVIEW_HIGH

High 444 Predictive profile

High 10 Intra profile

High 422 Intra profile

High 444 Intra profile

CAVLC 444 Intra profile

Scalable Baseline profile

Scalable High profile

Scalable High Intra profile

Stereo High profile

Multiview High profile

V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE (enum)

enum v4l2_mpeg_video_mpeg4_profile - The profile information for MPEG4. Applicable to the MPEG4 encoder. Possible values are:

V4L2_MPEG_VIDEO_PROFILE_SIMPLE

V4L2_MPEG_VIDEO_PROFILE_ADVANCED_SIMPLE

V4L2_MPEG_VIDEO_PROFILE_CORE

V4L2_MPEG_VIDEO_PROFILE_SIMPLE_SCALABLE

V4L2_MPEG_VIDEO_PROFILE_ADVANCED_CODING_EFFICIENCY

Simple profile

Advanced Simple profile

Core profile

Simple Scalable profile

V4L2_CID_MPEG_VIDEO_MAX_REF_PIC (integer) The maximum number of reference pictures used for encoding. Applicable to the encoder.

V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE (enum)

enum v4l2_mpeg_video_multi_slice_mode - Determines how the encoder should handle division of frame into slices. Applicable to the encoder. Possible values are:

V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE Single slice per frame.

V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_MAX_MB Multiple slices with set maximum number of macroblocks per slice.

V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_MAX_BYTES Multiple slice with set maximum size in bytes per slice.

V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MB (integer) The roblocks in a slice.

Used when maximum number

V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE of is macset to

V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_MAX_MB. Applicable to the encoder.

V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_BYTES (integer) The slice in bytes.

Used when maximum size

V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE is of set a to

V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_MAX_BYTES. Applicable to the encoder.

V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE (enum)

enum v4l2_mpeg_video_h264_loop_filter_mode - Loop filter mode for H264 encoder. Possible values are:

26 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_ENABLED

V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_DISABLED

V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_DISABLED_AT_SLICE_BOUNDARY

Loop filter is enabled.

Loop filter is disabled.

Loop filter is disabled at the slice boundary.

V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_ALPHA (integer) Loop filter alpha coefficient, defined in the

H264 standard. Applicable to the H264 encoder.

V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_BETA (integer) Loop filter beta coefficient, defined in the

H264 standard. Applicable to the H264 encoder.

V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE (enum)

enum v4l2_mpeg_video_h264_entropy_mode - Entropy coding mode for H264 - CABAC/CAVALC. Applicable to the H264 encoder. Possible values are:

V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CAVLC Use CAVLC entropy coding.

V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC Use CABAC entropy coding.

V4L2_CID_MPEG_VIDEO_H264_8X8_TRANSFORM (boolean) Enable 8X8 transform for H264. Applicable to the H264 encoder.

V4L2_CID_MPEG_VIDEO_CYCLIC_INTRA_REFRESH_MB (integer) Cyclic intra macroblock refresh. This is the number of continuous macroblocks refreshed every frame. Each frame a successive set of macroblocks is refreshed until the cycle completes and starts from the top of the frame. Applicable to

H264, H263 and MPEG4 encoder.

V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE (boolean) Frame level rate control enable.

If this control is disabled then the quantization parameter for each frame type is constant and set with appropriate controls (e.g.

V4L2_CID_MPEG_VIDEO_H263_I_FRAME_QP). If frame rate control is enabled then quantization parameter is adjusted to meet the chosen bitrate.

Minimum and maximum value for the quantization parameter can be set with appropriate controls (e.g.

V4L2_CID_MPEG_VIDEO_H263_MIN_QP). Applicable to encoders.

V4L2_CID_MPEG_VIDEO_MB_RC_ENABLE (boolean) Macroblock level rate control enable. Applicable to the MPEG4 and H264 encoders.

V4L2_CID_MPEG_VIDEO_MPEG4_QPEL (boolean) Quarter pixel motion estimation for MPEG4. Applicable to the MPEG4 encoder.

V4L2_CID_MPEG_VIDEO_H263_I_FRAME_QP (integer) Quantization parameter for an I frame for H263.

Valid range: from 1 to 31.

V4L2_CID_MPEG_VIDEO_H263_MIN_QP (integer) Minimum quantization parameter for H263.

Valid range: from 1 to 31.

V4L2_CID_MPEG_VIDEO_H263_MAX_QP (integer) Maximum quantization parameter for H263.

Valid range: from 1 to 31.

V4L2_CID_MPEG_VIDEO_H263_P_FRAME_QP (integer) Quantization parameter for an P frame for H263.

Valid range: from 1 to 31.

V4L2_CID_MPEG_VIDEO_H263_B_FRAME_QP (integer) Quantization parameter for an B frame for H263.

Valid range: from 1 to 31.

V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP (integer) Quantization parameter for an I frame for H264.

Valid range: from 0 to 51.

V4L2_CID_MPEG_VIDEO_H264_MIN_QP (integer) Minimum quantization parameter for H264.

Valid range: from 0 to 51.

V4L2_CID_MPEG_VIDEO_H264_MAX_QP (integer) Maximum quantization parameter for H264.

Valid range: from 0 to 51.

1.2. Part I - Video for Linux API 27

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP (integer) Quantization parameter for an P frame for H264.

Valid range: from 0 to 51.

V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP (integer) Quantization parameter for an B frame for H264.

Valid range: from 0 to 51.

V4L2_CID_MPEG_VIDEO_MPEG4_I_FRAME_QP (integer) Quantization parameter for an I frame for MPEG4.

Valid range: from 1 to 31.

V4L2_CID_MPEG_VIDEO_MPEG4_MIN_QP (integer) Minimum quantization parameter for MPEG4. Valid range: from 1 to 31.

V4L2_CID_MPEG_VIDEO_MPEG4_MAX_QP (integer) Maximum quantization parameter for MPEG4. Valid range: from 1 to 31.

V4L2_CID_MPEG_VIDEO_MPEG4_P_FRAME_QP (integer) Quantization parameter for an P frame for

MPEG4. Valid range: from 1 to 31.

V4L2_CID_MPEG_VIDEO_MPEG4_B_FRAME_QP (integer) Quantization parameter for an B frame for

MPEG4. Valid range: from 1 to 31.

V4L2_CID_MPEG_VIDEO_VBV_SIZE (integer) The Video Buffer Verifier size in kilobytes, it is used as a limitation of frame skip. The VBV is defined in the standard as a mean to verify that the produced stream will be successfully decoded. The standard describes it as ``Part of a hypothetical decoder that is conceptually connected to the output of the encoder. Its purpose is to provide a constraint on the variability of the data rate that an encoder or editing process may produce.''. Applicable to the

MPEG1, MPEG2, MPEG4 encoders.

V4L2_CID_MPEG_VIDEO_VBV_DELAY (integer) Sets the initial delay in milliseconds for VBV buffer control.

V4L2_CID_MPEG_VIDEO_MV_H_SEARCH_RANGE (integer) Horizontal search range defines maximum horizontal search area in pixels to search and match for the present Macroblock (MB) in the reference picture. This V4L2 control macro is used to set horizontal search range for motion estimation module in video encoder.

V4L2_CID_MPEG_VIDEO_MV_V_SEARCH_RANGE (integer) Vertical search range defines maximum vertical search area in pixels to search and match for the present Macroblock (MB) in the reference picture.

This V4L2 control macro is used to set vertical search range for motion estimation module in video encoder.

V4L2_CID_MPEG_VIDEO_FORCE_KEY_FRAME (button) Force a key frame for the next queued buffer. Applicable to encoders. This is a general, codec-agnostic keyframe control.

V4L2_CID_MPEG_VIDEO_H264_CPB_SIZE (integer) The Coded Picture Buffer size in kilobytes, it is used as a limitation of frame skip. The CPB is defined in the H264 standard as a mean to verify that the produced stream will be successfully decoded. Applicable to the H264 encoder.

V4L2_CID_MPEG_VIDEO_H264_I_PERIOD (integer) Period between I-frames in the open GOP for H264.

In case of an open GOP this is the period between two I-frames. The period between IDR (Instantaneous Decoding Refresh) frames is taken from the GOP_SIZE control. An IDR frame, which stands for Instantaneous Decoding Refresh is an I-frame after which no prior frames are referenced. This means that a stream can be restarted from an IDR frame without the need to store or decode any previous frames. Applicable to the H264 encoder.

V4L2_CID_MPEG_VIDEO_HEADER_MODE (enum)

enum v4l2_mpeg_video_header_mode - Determines whether the header is returned as the first buffer or is it returned together with the first frame. Applicable to encoders. Possible values are:

V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE The stream header is returned separately in the first buffer.

V4L2_MPEG_VIDEO_HEADER_MODE_JOINED_WITH_1ST_FRAME The stream header is returned together with the first encoded frame.

V4L2_CID_MPEG_VIDEO_REPEAT_SEQ_HEADER (boolean) Repeat the video sequence headers. Repeating these headers makes random access to the video stream easier. Applicable to the MPEG1, 2 and 4

28 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

encoder.

V4L2_CID_MPEG_VIDEO_DECODER_MPEG4_DEBLOCK_FILTER (boolean) Enabled the deblocking post processing filter for MPEG4 decoder. Applicable to the MPEG4 decoder.

V4L2_CID_MPEG_VIDEO_MPEG4_VOP_TIME_RES (integer) vop_time_increment_resolution value for

MPEG4. Applicable to the MPEG4 encoder.

V4L2_CID_MPEG_VIDEO_MPEG4_VOP_TIME_INC (integer) vop_time_increment value for MPEG4. Applicable to the MPEG4 encoder.

V4L2_CID_MPEG_VIDEO_H264_SEI_FRAME_PACKING (boolean) Enable generation of frame packing supplemental enhancement information in the encoded bitstream. The frame packing SEI message contains the arrangement of L and R planes for 3D viewing. Applicable to the H264 encoder.

V4L2_CID_MPEG_VIDEO_H264_SEI_FP_CURRENT_FRAME_0 (boolean) Sets current frame as frame0 in frame packing SEI. Applicable to the H264 encoder.

V4L2_CID_MPEG_VIDEO_H264_SEI_FP_ARRANGEMENT_TYPE (enum)

enum v4l2_mpeg_video_h264_sei_fp_arrangement_type - Frame packing arrangement type for

H264 SEI. Applicable to the H264 encoder. Possible values are:

V4L2_MPEG_VIDEO_H264_SEI_FP_ARRANGEMENT_TYPE_CHEKERBOARD Pixels are alternatively from L and R.

V4L2_MPEG_VIDEO_H264_SEI_FP_ARRANGEMENT_TYPE_COLUMN

V4L2_MPEG_VIDEO_H264_SEI_FP_ARRANGEMENT_TYPE_ROW

L and R are interlaced by column.

L and R are interlaced by row.

V4L2_MPEG_VIDEO_H264_SEI_FP_ARRANGEMENT_TYPE_SIDE_BY_SIDE L is on the left, R on the right.

V4L2_MPEG_VIDEO_H264_SEI_FP_ARRANGEMENT_TYPE_TOP_BOTTOM L is on top, R on bottom.

V4L2_MPEG_VIDEO_H264_SEI_FP_ARRANGEMENT_TYPE_TEMPORAL One view per frame.

V4L2_CID_MPEG_VIDEO_H264_FMO (boolean) Enables flexible macroblock ordering in the encoded bitstream. It is a technique used for restructuring the ordering of macroblocks in pictures. Applicable to the H264 encoder.

V4L2_CID_MPEG_VIDEO_H264_FMO_MAP_TYPE (enum)

enum v4l2_mpeg_video_h264_fmo_map_type - When using FMO, the map type divides the image in different scan patterns of macroblocks. Applicable to the H264 encoder. Possible values are:

V4L2_MPEG_VIDEO_H264_FMO_MAP_TYPE_INTERLEAVED_SLICES

V4L2_MPEG_VIDEO_H264_FMO_MAP_TYPE_SCATTERED_SLICES

Slices are interleaved one after other with macroblocks in run length order.

Scatters the macroblocks based on a mathematical function known to both encoder and decoder.

V4L2_MPEG_VIDEO_H264_FMO_MAP_TYPE_FOREGROUND_WITH_LEFT_OVER Macroblocks arranged in rectangular areas or regions of interest.

V4L2_MPEG_VIDEO_H264_FMO_MAP_TYPE_BOX_OUT

V4L2_MPEG_VIDEO_H264_FMO_MAP_TYPE_RASTER_SCAN

Slice groups grow in a cyclic way from centre to outwards.

Slice groups grow in raster scan pattern from left to right.

V4L2_MPEG_VIDEO_H264_FMO_MAP_TYPE_WIPE_SCAN

V4L2_MPEG_VIDEO_H264_FMO_MAP_TYPE_EXPLICIT

Slice groups grow in wipe scan pattern from top to bottom.

User defined map type.

V4L2_CID_MPEG_VIDEO_H264_FMO_SLICE_GROUP (integer) Number of slice groups in FMO. Applicable to the H264 encoder.

1.2. Part I - Video for Linux API 29

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2_CID_MPEG_VIDEO_H264_FMO_CHANGE_DIRECTION (enum)

enum v4l2_mpeg_video_h264_fmo_change_dir - Specifies a direction of the slice group change for raster and wipe maps. Applicable to the H264 encoder. Possible values are:

V4L2_MPEG_VIDEO_H264_FMO_CHANGE_DIR_RIGHT Raster scan or wipe right.

V4L2_MPEG_VIDEO_H264_FMO_CHANGE_DIR_LEFT Reverse raster scan or wipe left.

V4L2_CID_MPEG_VIDEO_H264_FMO_CHANGE_RATE (integer) Specifies the size of the first slice group for raster and wipe map. Applicable to the H264 encoder.

V4L2_CID_MPEG_VIDEO_H264_FMO_RUN_LENGTH (integer) Specifies the number of consecutive macroblocks for the interleaved map. Applicable to the H264 encoder.

V4L2_CID_MPEG_VIDEO_H264_ASO (boolean) Enables arbitrary slice ordering in encoded bitstream. Applicable to the H264 encoder.

V4L2_CID_MPEG_VIDEO_H264_ASO_SLICE_ORDER (integer) Specifies the slice order in ASO. Applicable to the H264 encoder. The supplied 32-bit integer is interpreted as follows (bit 0 = least significant bit):

Bit 0:15 Slice ID

Bit 16:32 Slice position or order

V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING (boolean) Enables H264 hierarchical coding. Applicable to the H264 encoder.

V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_TYPE (enum)

enum v4l2_mpeg_video_h264_hierarchical_coding_type - Specifies the hierarchical coding type.

Applicable to the H264 encoder. Possible values are:

V4L2_MPEG_VIDEO_H264_HIERARCHICAL_CODING_B Hierarchical B coding.

V4L2_MPEG_VIDEO_H264_HIERARCHICAL_CODING_P Hierarchical P coding.

V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_LAYER (integer) Specifies the number of hierarchical coding layers. Applicable to the H264 encoder.

V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_LAYER_QP (integer) Specifies a user defined QP for each layer. Applicable to the H264 encoder. The supplied 32-bit integer is interpreted as follows

(bit 0 = least significant bit):

Bit 0:15 QP value

Bit 16:32 Layer number

MFC 5.1 MPEG Controls The following MPEG class controls deal with MPEG decoding and encoding settings that are specific to the Multi Format Codec 5.1 device present in the S5P family of SoCs by

Samsung.

MFC 5.1 Control IDs

V4L2_CID_MPEG_MFC51_VIDEO_DECODER_H264_DISPLAY_DELAY_ENABLE (boolean) If the display delay is enabled then the decoder is forced to return a CAPTURE buffer (decoded frame) after processing a certain number of OUTPUT buffers.

The delay can be set through

V4L2_CID_MPEG_MFC51_VIDEO_DECODER_H264_DISPLAY_DELAY. This feature can be used for example for generating thumbnails of videos. Applicable to the H264 decoder.

V4L2_CID_MPEG_MFC51_VIDEO_DECODER_H264_DISPLAY_DELAY (integer) Display delay value for H264 decoder. The decoder is forced to return a decoded frame after the set `display delay' number of frames. If this number is low it may result in frames returned out of dispaly order, in addition the hardware may still be using the returned buffer as a reference picture for subsequent frames.

V4L2_CID_MPEG_MFC51_VIDEO_H264_NUM_REF_PIC_FOR_P (integer) The number of reference pictures used for encoding a P picture. Applicable to the H264 encoder.

30 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2_CID_MPEG_MFC51_VIDEO_PADDING (boolean) Padding enable in the encoder - use a color instead of repeating border pixels. Applicable to encoders.

V4L2_CID_MPEG_MFC51_VIDEO_PADDING_YUV (integer) Padding color in the encoder. Applicable to encoders. The supplied 32-bit integer is interpreted as follows (bit 0 = least significant bit):

Bit 0:7 V chrominance information

Bit 8:15 U chrominance information

Bit 16:23 Y luminance information

Bit 24:31 Must be zero.

V4L2_CID_MPEG_MFC51_VIDEO_RC_REACTION_COEFF (integer) Reaction coefficient for MFC rate control.

Applicable to encoders.

Note:

1. Valid only when the frame level RC is enabled.

2. For tight CBR, this field must be small (ex. 2 ~ 10). For VBR, this field must be large (ex.

100 ~ 1000).

3. It is not recommended to use the greater number than FRAME_RATE * (10^9 / BIT_RATE).

V4L2_CID_MPEG_MFC51_VIDEO_H264_ADAPTIVE_RC_DARK (boolean) Adaptive for dark region.

Valid only when H.264

and macroblock level rate

RC is control enabled

(V4L2_CID_MPEG_VIDEO_MB_RC_ENABLE). Applicable to the H264 encoder.

V4L2_CID_MPEG_MFC51_VIDEO_H264_ADAPTIVE_RC_SMOOTH (boolean) Adaptive for smooth region.

Valid only when H.264

and macroblock level rate

RC is control enabled

(V4L2_CID_MPEG_VIDEO_MB_RC_ENABLE). Applicable to the H264 encoder.

V4L2_CID_MPEG_MFC51_VIDEO_H264_ADAPTIVE_RC_STATIC (boolean) Adaptive trol for static region.

rate con-

Valid only when H.264 and macroblock level RC is enabled

(V4L2_CID_MPEG_VIDEO_MB_RC_ENABLE). Applicable to the H264 encoder.

V4L2_CID_MPEG_MFC51_VIDEO_H264_ADAPTIVE_RC_ACTIVITY (boolean) Adaptive rate control for activity region.

Valid only when H.264 and macroblock level RC is enabled

(V4L2_CID_MPEG_VIDEO_MB_RC_ENABLE). Applicable to the H264 encoder.

V4L2_CID_MPEG_MFC51_VIDEO_FRAME_SKIP_MODE (enum)

enum v4l2_mpeg_mfc51_video_frame_skip_mode - Indicates in what conditions the encoder should skip frames. If encoding a frame would cause the encoded stream to be larger then a chosen data limit then the frame will be skipped. Possible values are:

V4L2_MPEG_MFC51_FRAME_SKIP_MODE_DISABLED Frame skip mode is disabled.

V4L2_MPEG_MFC51_FRAME_SKIP_MODE_LEVEL_LIMIT Frame skip mode enabled and buffer limit is set by the chosen level and is defined by the standard.

V4L2_MPEG_MFC51_FRAME_SKIP_MODE_BUF_LIMIT Frame skip mode enabled and buffer limit is set by the VBV (MPEG1/2/4) or CPB (H264) buffer size control.

V4L2_CID_MPEG_MFC51_VIDEO_RC_FIXED_TARGET_BIT (integer) Enable rate-control with fixed target bit. If this setting is enabled, then the rate control logic of the encoder will calculate the average bitrate for a GOP and keep it below or equal the set bitrate target. Otherwise the rate control logic calculates the overall average bitrate for the stream and keeps it below or equal to the set bitrate.

In the first case the average bitrate for the whole stream will be smaller then the set bitrate. This is caused because the average is calculated for smaller number of frames, on the other hand enabling this setting will ensure that the stream will meet tight bandwidth constraints. Applicable to encoders.

V4L2_CID_MPEG_MFC51_VIDEO_FORCE_FRAME_TYPE (enum)

1.2. Part I - Video for Linux API 31

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

enum v4l2_mpeg_mfc51_video_force_frame_type - Force a frame type for the next queued buffer.

Applicable to encoders. Possible values are:

V4L2_MPEG_MFC51_FORCE_FRAME_TYPE_DISABLED Forcing a specific frame type disabled.

V4L2_MPEG_MFC51_FORCE_FRAME_TYPE_I_FRAME Force an I-frame.

V4L2_MPEG_MFC51_FORCE_FRAME_TYPE_NOT_CODED Force a non-coded frame.

CX2341x MPEG Controls The following MPEG class controls deal with MPEG encoding settings that are specific to the Conexant CX23415 and CX23416 MPEG encoding chips.

CX2341x Control IDs

V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE (enum)

enum v4l2_mpeg_cx2341x_video_spatial_filter_mode - Sets the Spatial Filter mode (default MAN-

UAL). Possible values are:

V4L2_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE_MANUAL Choose the filter manually

V4L2_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE_AUTO Choose the filter automatically

V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER (integer (0-15)) The setting for the Spatial Filter.

0 = off, 15 = maximum. (Default is 0.)

V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE (enum)

enum v4l2_mpeg_cx2341x_video_luma_spatial_filter_type - Select the algorithm to use for the

Luma Spatial Filter (default 1D_HOR). Possible values:

V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_OFF

V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_1D_HOR

No filter

One-dimensional horizontal

V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_1D_VERT

V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_2D_HV_SEPARABLE

One-dimensional vertical

Two-dimensional separable

V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_2D_SYM_NON_SEPARABLE Two-dimensional symmetrical non-separable

V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE (enum)

enum v4l2_mpeg_cx2341x_video_chroma_spatial_filter_type - Select the algorithm for the Chroma

Spatial Filter (default 1D_HOR). Possible values are:

V4L2_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE_OFF No filter

V4L2_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE_1D_HOR One-dimensional horizontal

V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE (enum)

enum v4l2_mpeg_cx2341x_video_temporal_filter_mode - Sets the Temporal Filter mode (default

MANUAL). Possible values are:

V4L2_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE_MANUAL Choose the filter manually

V4L2_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE_AUTO Choose the filter automatically

V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER (integer (0-31)) The setting for the Temporal Filter. 0 = off, 31 = maximum. (Default is 8 for full-scale capturing and 0 for scaled capturing.)

V4L2_CID_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE (enum)

enum v4l2_mpeg_cx2341x_video_median_filter_type - Median Filter Type (default OFF). Possible values are:

32 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_OFF

V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_HOR

No filter

Horizontal filter

V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_VERT Vertical filter

V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_HOR_VERT Horizontal and vertical filter

V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_DIAG Diagonal filter

V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_MEDIAN_FILTER_BOTTOM (integer (0-255)) Threshold above which the luminance median filter is enabled (default 0)

V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_MEDIAN_FILTER_TOP (integer (0-255)) Threshold which the luminance median filter is enabled (default 255) below

V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_BOTTOM (integer (0-255)) Threshold above which the chroma median filter is enabled (default 0)

V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_TOP (integer (0-255)) Threshold which the chroma median filter is enabled (default 255) below

V4L2_CID_MPEG_CX2341X_STREAM_INSERT_NAV_PACKETS (boolean) The CX2341X MPEG encoder can insert one empty MPEG-2 PES packet into the stream between every four video frames. The packet size is 2048 bytes, including the packet_start_code_prefix and stream_id fields. The stream_id is

0xBF (private stream 2). The payload consists of 0x00 bytes, to be filled in by the application. 0 = do not insert, 1 = insert packets.

VPX Control Reference

The VPX controls include controls for encoding parameters of VPx video codec.

VPX Control IDs

V4L2_CID_MPEG_VIDEO_VPX_NUM_PARTITIONS (enum)

enum v4l2_vp8_num_partitions - The number of token partitions to use in VP8 encoder. Possible values are:

V4L2_CID_MPEG_VIDEO_VPX_1_PARTITION 1 coefficient partition

V4L2_CID_MPEG_VIDEO_VPX_2_PARTITIONS 2 coefficient partitions

V4L2_CID_MPEG_VIDEO_VPX_4_PARTITIONS 4 coefficient partitions

V4L2_CID_MPEG_VIDEO_VPX_8_PARTITIONS 8 coefficient partitions

V4L2_CID_MPEG_VIDEO_VPX_IMD_DISABLE_4X4 (boolean) Setting this prevents intra 4x4 mode in the intra mode decision.

V4L2_CID_MPEG_VIDEO_VPX_NUM_REF_FRAMES (enum)

enum v4l2_vp8_num_ref_frames - The number of reference pictures for encoding P frames. Possible values are:

V4L2_CID_MPEG_VIDEO_VPX_1_REF_FRAME

V4L2_CID_MPEG_VIDEO_VPX_2_REF_FRAME

V4L2_CID_MPEG_VIDEO_VPX_3_REF_FRAME

Last encoded frame will be searched

Two frames will be searched among the last encoded frame, the golden frame and the alternate reference

(altref) frame. The encoder implementation will decide which two are chosen.

The last encoded frame, the golden frame and the altref frame will be searched.

V4L2_CID_MPEG_VIDEO_VPX_FILTER_LEVEL (integer) Indicates the loop filter level. The adjustment of the loop filter level is done via a delta value against a baseline loop filter value.

V4L2_CID_MPEG_VIDEO_VPX_FILTER_SHARPNESS (integer) This parameter affects the loop filter. Anything above zero weakens the deblocking effect on the loop filter.

V4L2_CID_MPEG_VIDEO_VPX_GOLDEN_FRAME_REF_PERIOD (integer) Sets the refresh period for the golden frame. The period is defined in number of frames. For a value of `n', every nth frame starting from the first key frame will be taken as a golden frame. For eg. for encoding sequence of 0, 1, 2, 3,

1.2. Part I - Video for Linux API 33

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

4, 5, 6, 7 where the golden frame refresh period is set as 4, the frames 0, 4, 8 etc will be taken as the golden frames as frame 0 is always a key frame.

V4L2_CID_MPEG_VIDEO_VPX_GOLDEN_FRAME_SEL (enum)

enum v4l2_vp8_golden_frame_sel - Selects the golden frame for encoding. Possible values are:

V4L2_CID_MPEG_VIDEO_VPX_GOLDEN_FRAME_USE_PREV

V4L2_CID_MPEG_VIDEO_VPX_GOLDEN_FRAME_USE_REF_PERIOD

Use the (n-2)th frame as a golden frame, current frame index being `n'.

Use the previous specific frame indicated by

V4L2_CID_MPEG_VIDEO_VPX_GOLDEN_FRAME_REF_PERIOD as a golden frame.

V4L2_CID_MPEG_VIDEO_VPX_MIN_QP (integer) Minimum quantization parameter for VP8.

V4L2_CID_MPEG_VIDEO_VPX_MAX_QP (integer) Maximum quantization parameter for VP8.

V4L2_CID_MPEG_VIDEO_VPX_I_FRAME_QP (integer) Quantization parameter for an I frame for VP8.

V4L2_CID_MPEG_VIDEO_VPX_P_FRAME_QP (integer) Quantization parameter for a P frame for VP8.

V4L2_CID_MPEG_VIDEO_VPX_PROFILE (integer) Select the desired profile for VPx encoder. Acceptable values are 0, 1, 2 and 3 corresponding to encoder profiles 0, 1, 2 and 3.

Camera Control Reference

The Camera class includes controls for mechanical (or equivalent digital) features of a device such as controllable lenses or sensors.

Camera Control IDs

V4L2_CID_CAMERA_CLASS (class) The Camera class descriptor. Calling ioctls VIDIOC_QUERYCTRL, VID-

IOC_QUERY_EXT_CTRL and VIDIOC_QUERYMENU for this control will return a description of this control class.

V4L2_CID_EXPOSURE_AUTO (enum)

enum v4l2_exposure_auto_type - Enables automatic adjustments of the exposure time and/or iris aperture. The effect of manual changes of the exposure time or iris aperture while these features are enabled is undefined, drivers should ignore such requests. Possible values are:

V4L2_EXPOSURE_AUTO

V4L2_EXPOSURE_MANUAL

Automatic exposure time, automatic iris aperture.

Manual exposure time, manual iris.

V4L2_EXPOSURE_SHUTTER_PRIORITY Manual exposure time, auto iris.

V4L2_EXPOSURE_APERTURE_PRIORITY Auto exposure time, manual iris.

V4L2_CID_EXPOSURE_ABSOLUTE (integer) Determines the exposure time of the camera sensor. The exposure time is limited by the frame interval. Drivers should interpret the values as 100 µs units, where the value 1 stands for 1/10000th of a second, 10000 for 1 second and 100000 for 10 seconds.

V4L2_CID_EXPOSURE_AUTO_PRIORITY (boolean) When V4L2_CID_EXPOSURE_AUTO is set to AUTO or

APERTURE_PRIORITY, this control determines if the device may dynamically vary the frame rate.

By default this feature is disabled (0) and the frame rate must remain constant.

V4L2_CID_EXPOSURE_BIAS (integer menu) Determines the automatic exposure compensation, it is effective only when V4L2_CID_EXPOSURE_AUTO control is set to AUTO, SHUTTER_PRIORITY or APER-

TURE_PRIORITY. It is expressed in terms of EV, drivers should interpret the values as 0.001 EV units, where the value 1000 stands for +1 EV.

Increasing the exposure compensation value is equivalent to decreasing the exposure value (EV) and will increase the amount of light at the image sensor. The camera performs the exposure compensation by adjusting absolute exposure time and/or aperture.

V4L2_CID_EXPOSURE_METERING (enum)

34 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

enum v4l2_exposure_metering - Determines how the camera measures the amount of light available for the frame exposure. Possible values are:

V4L2_EXPOSURE_METERING_AVERAGE

V4L2_EXPOSURE_METERING_CENTER_WEIGHTED

V4L2_EXPOSURE_METERING_SPOT

V4L2_EXPOSURE_METERING_MATRIX

Use the light information coming from the entire frame and average giving no weighting to any particular portion of the metered area.

Average the light information coming from the entire frame giving priority to the center of the metered area.

Measure only very small area at the center of the frame.

A multi-zone metering. The light intensity is measured in several points of the frame and the results are combined. The algorithm of the zones selection and their significance in calculating the final value is device dependent.

V4L2_CID_PAN_RELATIVE (integer) This control turns the camera horizontally by the specified amount.

The unit is undefined. A positive value moves the camera to the right (clockwise when viewed from above), a negative value to the left. A value of zero does not cause motion. This is a write-only control.

V4L2_CID_TILT_RELATIVE (integer) This control turns the camera vertically by the specified amount.

The unit is undefined. A positive value moves the camera up, a negative value down. A value of zero does not cause motion. This is a write-only control.

V4L2_CID_PAN_RESET (button) When this control is set, the camera moves horizontally to the default position.

V4L2_CID_TILT_RESET (button) When this control is set, the camera moves vertically to the default position.

V4L2_CID_PAN_ABSOLUTE (integer) This control turns the camera horizontally to the specified position.

Positive values move the camera to the right (clockwise when viewed from above), negative values to the left. Drivers should interpret the values as arc seconds, with valid values between -180 * 3600 and +180 * 3600 inclusive.

V4L2_CID_TILT_ABSOLUTE (integer) This control turns the camera vertically to the specified position.

Positive values move the camera up, negative values down. Drivers should interpret the values as arc seconds, with valid values between -180 * 3600 and +180 * 3600 inclusive.

V4L2_CID_FOCUS_ABSOLUTE (integer) This control sets the focal point of the camera to the specified position. The unit is undefined. Positive values set the focus closer to the camera, negative values towards infinity.

V4L2_CID_FOCUS_RELATIVE (integer) This control moves the focal point of the camera by the specified amount. The unit is undefined. Positive values move the focus closer to the camera, negative values towards infinity. This is a write-only control.

V4L2_CID_FOCUS_AUTO (boolean) Enables continuous automatic focus adjustments. The effect of manual focus adjustments while this feature is enabled is undefined, drivers should ignore such requests.

V4L2_CID_AUTO_FOCUS_START (button) Starts single auto focus process. The effect of setting this control when V4L2_CID_FOCUS_AUTO is set to TRUE (1) is undefined, drivers should ignore such requests.

V4L2_CID_AUTO_FOCUS_STOP (button) Aborts automatic focusing started with

V4L2_CID_AUTO_FOCUS_START control.

It is effective only when the continuous autofocus is disabled, that is when V4L2_CID_FOCUS_AUTO control is set to FALSE (0).

V4L2_CID_AUTO_FOCUS_STATUS (bitmask) The automatic focus status. This is a read-only control.

Setting V4L2_LOCK_FOCUS lock bit of the V4L2_CID_3A_LOCK control may stop updates of the

V4L2_CID_AUTO_FOCUS_STATUS control value.

1.2. Part I - Video for Linux API 35

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2_AUTO_FOCUS_STATUS_IDLE

V4L2_AUTO_FOCUS_STATUS_BUSY

Automatic focus is not active.

Automatic focusing is in progress.

V4L2_AUTO_FOCUS_STATUS_REACHED Focus has been reached.

V4L2_AUTO_FOCUS_STATUS_FAILED Automatic focus has failed, the driver will not transition from this state until another action is performed by an application.

V4L2_CID_AUTO_FOCUS_RANGE (enum)

enum v4l2_auto_focus_range - Determines auto focus distance range for which lens may be adjusted.

V4L2_AUTO_FOCUS_RANGE_AUTO

V4L2_AUTO_FOCUS_RANGE_NORMAL

V4L2_AUTO_FOCUS_RANGE_MACRO

The camera automatically selects the focus range.

Normal distance range, limited for best automatic focus performance.

Macro (close-up) auto focus. The camera will use its minimum possible distance for auto focus.

V4L2_AUTO_FOCUS_RANGE_INFINITY The lens is set to focus on an object at infinite distance.

V4L2_CID_ZOOM_ABSOLUTE (integer) Specify the objective lens focal length as an absolute value. The zoom unit is driver-specific and its value should be a positive integer.

V4L2_CID_ZOOM_RELATIVE (integer) Specify the objective lens focal length relatively to the current value. Positive values move the zoom lens group towards the telephoto direction, negative values towards the wide-angle direction. The zoom unit is driver-specific. This is a write-only control.

V4L2_CID_ZOOM_CONTINUOUS (integer) Move the objective lens group at the specified speed until it reaches physical device limits or until an explicit request to stop the movement. A positive value moves the zoom lens group towards the telephoto direction. A value of zero stops the zoom lens group movement. A negative value moves the zoom lens group towards the wide-angle direction.

The zoom speed unit is driver-specific.

V4L2_CID_IRIS_ABSOLUTE (integer) This control sets the camera's aperture to the specified value. The unit is undefined. Larger values open the iris wider, smaller values close it.

V4L2_CID_IRIS_RELATIVE (integer) This control modifies the camera's aperture by the specified amount. The unit is undefined. Positive values open the iris one step further, negative values close it one step further. This is a write-only control.

V4L2_CID_PRIVACY (boolean) Prevent video from being acquired by the camera. When this control is set to TRUE (1), no image can be captured by the camera. Common means to enforce privacy are mechanical obturation of the sensor and firmware image processing, but the device is not restricted to these methods. Devices that implement the privacy control must support read access and may support write access.

V4L2_CID_BAND_STOP_FILTER (integer) Switch the band-stop filter of a camera sensor on or off, or specify its strength. Such band-stop filters can be used, for example, to filter out the fluorescent light component.

V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE (enum)

enum v4l2_auto_n_preset_white_balance - Sets white balance to automatic, manual or a preset. The presets determine color temperature of the light as a hint to the camera for white balance adjustments resulting in most accurate color representation. The following white balance presets are listed in order of increasing color temperature.

36 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2_WHITE_BALANCE_MANUAL

V4L2_WHITE_BALANCE_AUTO

V4L2_WHITE_BALANCE_INCANDESCENT

V4L2_WHITE_BALANCE_FLUORESCENT

V4L2_WHITE_BALANCE_FLUORESCENT_H

V4L2_WHITE_BALANCE_HORIZON

V4L2_WHITE_BALANCE_DAYLIGHT

V4L2_WHITE_BALANCE_FLASH

V4L2_WHITE_BALANCE_CLOUDY

V4L2_WHITE_BALANCE_SHADE

Manual white balance.

Automatic white balance adjustments.

White balance setting for incandescent (tungsten) lighting.

It generally cools down the colors and corresponds approximately to 2500...3500 K color temperature range.

White balance preset for fluorescent lighting. It corresponds approximately to 4000...5000 K color temperature.

With this setting the camera will compensate for fluorescent

H lighting.

White balance setting for horizon daylight. It corresponds approximately to 5000 K color temperature.

White balance preset for daylight (with clear sky). It corresponds approximately to 5000...6500 K color temperature.

With this setting the camera will compensate for the flash light.

It slightly warms up the colors and corresponds roughly to 5000...5500 K color temperature.

White balance preset for moderately overcast sky. This option corresponds approximately to 6500...8000 K color temperature range.

White balance preset for shade or heavily overcast sky. It corresponds approximately to 9000...10000 K color temperature.

V4L2_CID_WIDE_DYNAMIC_RANGE (boolean) Enables or disables the camera's wide dynamic range feature. This feature allows to obtain clear images in situations where intensity of the illumination varies significantly throughout the scene, i.e. there are simultaneously very dark and very bright areas. It is most commonly realized in cameras by combining two subsequent frames with different exposure times.

7

V4L2_CID_IMAGE_STABILIZATION (boolean) Enables or disables image stabilization.

V4L2_CID_ISO_SENSITIVITY (integer menu) Determines ISO equivalent of an image sensor indicating the sensor's sensitivity to light. The numbers are expressed in arithmetic scale, as per ISO

12232:2006 standard, where doubling the sensor sensitivity is represented by doubling the numerical ISO value. Applications should interpret the values as standard ISO values multiplied by 1000, e.g. control value 800 stands for ISO 0.8. Drivers will usually support only a subset of standard ISO values. The effect of setting this control while the V4L2_CID_ISO_SENSITIVITY_AUTO control is set to a value other than V4L2_CID_ISO_SENSITIVITY_MANUAL is undefined, drivers should ignore such requests.

V4L2_CID_ISO_SENSITIVITY_AUTO (enum)

enum v4l2_iso_sensitivity_type - Enables or disables automatic ISO sensitivity adjustments.

V4L2_CID_ISO_SENSITIVITY_MANUAL Manual ISO sensitivity.

V4L2_CID_ISO_SENSITIVITY_AUTO Automatic ISO sensitivity adjustments.

V4L2_CID_SCENE_MODE (enum)

enum v4l2_scene_mode - This control allows to select scene programs as the camera automatic modes optimized for common shooting scenes. Within these modes the camera determines best exposure, aperture, focusing, light metering, white balance and equivalent sensitivity. The controls of those parameters are influenced by the scene mode control. An exact behavior in each mode is subject to the camera specification.

When the scene mode feature is not used, this control should be set to V4L2_SCENE_MODE_NONE to make sure the other possibly related controls are accessible. The following scene programs are defined:

7

This control may be changed to a menu control in the future, if more options are required.

1.2. Part I - Video for Linux API 37

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2_SCENE_MODE_NONE

V4L2_SCENE_MODE_BACKLIGHT

V4L2_SCENE_MODE_BEACH_SNOW

V4L2_SCENE_MODE_CANDLELIGHT

V4L2_SCENE_MODE_DAWN_DUSK

V4L2_SCENE_MODE_FALL_COLORS

V4L2_SCENE_MODE_FIREWORKS

V4L2_SCENE_MODE_LANDSCAPE

V4L2_SCENE_MODE_NIGHT

The scene mode feature is disabled.

Backlight. Compensates for dark shadows when light is coming from behind a subject, also by automatically turning on the flash.

Beach and snow. This mode compensates for all-white or bright scenes, which tend to look gray and low contrast, when camera's automatic exposure is based on an average scene brightness.

To compensate, this mode automatically slightly overexposes the frames. The white balance may also be adjusted to compensate for the fact that reflected snow looks bluish rather than white.

Candle light. The camera generally raises the ISO sensitivity and lowers the shutter speed. This mode compensates for relatively close subject in the scene. The flash is disabled in order to preserve the ambiance of the light.

Dawn and dusk. Preserves the colors seen in low natural light before dusk and after down. The camera may turn off the flash, and automatically focus at infinity. It will usually boost saturation and lower the shutter speed.

Fall colors. Increases saturation and adjusts white balance for color enhancement. Pictures of autumn leaves get saturated reds and yellows.

Fireworks. Long exposure times are used to capture the expanding burst of light from a firework. The camera may invoke image stabilization.

Landscape. The camera may choose a small aperture to provide deep depth of field and long exposure duration to help capture detail in dim light conditions. The focus is fixed at infinity. Suitable for distant and wide scenery.

Night, also known as Night Landscape. Designed for low light conditions, it preserves detail in the dark areas without blowing out bright objects. The camera generally sets itself to a medium-tohigh ISO sensitivity, with a relatively long exposure time, and turns flash off. As such, there will be increased image noise and the possibility of blurred image.

V4L2_SCENE_MODE_PARTY_INDOOR Party and indoor. Designed to capture indoor scenes that are lit by indoor background lighting as well as the flash. The camera usually increases ISO sensitivity, and adjusts exposure for the low light conditions.

V4L2_SCENE_MODE_PORTRAIT Portrait. The camera adjusts the aperture so that the depth of field is reduced, which helps to isolate the subject against a smooth background. Most cameras recognize the presence of faces in the scene and focus on them. The color hue is adjusted to enhance skin tones. The intensity of the flash is often reduced.

V4L2_SCENE_MODE_SPORTS Sports. Significantly increases ISO and uses a fast shutter speed to freeze motion of rapidly-moving subjects. Increased image noise may be seen in this mode.

V4L2_SCENE_MODE_SUNSET

V4L2_SCENE_MODE_TEXT

Sunset. Preserves deep hues seen in sunsets and sunrises. It bumps up the saturation.

Text. It applies extra contrast and sharpness, it is typically a blackand-white mode optimized for readability. Automatic focus may be switched to close-up mode and this setting may also involve some lens-distortion correction.

V4L2_CID_3A_LOCK (bitmask) This control locks or unlocks the automatic focus, exposure and white balance. The automatic adjustments can be paused independently by setting the corresponding lock bit to 1. The camera then retains the settings until the lock bit is cleared. The following lock bits are defined:

When a given algorithm is not enabled, drivers should ignore requests to lock it and should return no error. An example might be an application setting bit V4L2_LOCK_WHITE_BALANCE when the

38 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2_CID_AUTO_WHITE_BALANCE control is set to FALSE. The value of this control may be changed by exposure, white balance or focus controls.

V4L2_LOCK_EXPOSURE Automatic exposure adjustments lock.

V4L2_LOCK_WHITE_BALANCE Automatic white balance adjustments lock.

V4L2_LOCK_FOCUS Automatic focus lock.

V4L2_CID_PAN_SPEED (integer) This control turns the camera horizontally at the specific speed. The unit is undefined. A positive value moves the camera to the right (clockwise when viewed from above), a negative value to the left. A value of zero stops the motion if one is in progress and has no effect otherwise.

V4L2_CID_TILT_SPEED (integer) This control turns the camera vertically at the specified speed. The unit is undefined. A positive value moves the camera up, a negative value down. A value of zero stops the motion if one is in progress and has no effect otherwise.

FM Transmitter Control Reference

The FM Transmitter (FM_TX) class includes controls for common features of FM transmissions capable devices. Currently this class includes parameters for audio compression, pilot tone generation, audio deviation limiter, RDS transmission and tuning power features.

FM_TX Control IDs

V4L2_CID_FM_TX_CLASS (class) The FM_TX class descriptor. Calling ioctls VIDIOC_QUERYCTRL, VID-

IOC_QUERY_EXT_CTRL and VIDIOC_QUERYMENU for this control will return a description of this control class.

V4L2_CID_RDS_TX_DEVIATION (integer) Configures RDS signal frequency deviation level in Hz. The range and step are driver-specific.

V4L2_CID_RDS_TX_PI (integer) Sets the RDS Programme Identification field for transmission.

V4L2_CID_RDS_TX_PTY (integer) Sets the RDS Programme Type field for transmission. This encodes up to 31 pre-defined programme types.

V4L2_CID_RDS_TX_PS_NAME (string) Sets the Programme Service name (PS_NAME) for transmission. It is intended for static display on a receiver. It is the primary aid to listeners in programme service identification and selection. In Annex E of IEC 62106, the RDS specification, there is a full description of the correct character encoding for Programme Service name strings. Also from RDS specification,

PS is usually a single eight character text. However, it is also possible to find receivers which can scroll strings sized as 8 x N characters. So, this control must be configured with steps of 8 characters.

The result is it must always contain a string with size multiple of 8.

V4L2_CID_RDS_TX_RADIO_TEXT (string) Sets the Radio Text info for transmission. It is a textual description of what is being broadcasted. RDS Radio Text can be applied when broadcaster wishes to transmit longer PS names, programme-related information or any other text. In these cases, Radio-

Text should be used in addition to V4L2_CID_RDS_TX_PS_NAME. The encoding for Radio Text strings is also fully described in Annex E of IEC 62106. The length of Radio Text strings depends on which RDS

Block is being used to transmit it, either 32 (2A block) or 64 (2B block). However, it is also possible to find receivers which can scroll strings sized as 32 x N or 64 x N characters. So, this control must be configured with steps of 32 or 64 characters. The result is it must always contain a string with size multiple of 32 or 64.

V4L2_CID_RDS_TX_MONO_STEREO (boolean) Sets the Mono/Stereo bit of the Decoder Identification code.

If set, then the audio was recorded as stereo.

V4L2_CID_RDS_TX_ARTIFICIAL_HEAD (boolean) Sets the Artificial Head bit of the Decoder Identification code. If set, then the audio was recorded using an artificial head.

V4L2_CID_RDS_TX_COMPRESSED (boolean) Sets the Compressed bit of the Decoder Identification code.

If set, then the audio is compressed.

1.2. Part I - Video for Linux API 39

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2_CID_RDS_TX_DYNAMIC_PTY (boolean) Sets the Dynamic PTY bit of the Decoder Identification code.

If set, then the PTY code is dynamically switched.

V4L2_CID_RDS_TX_TRAFFIC_ANNOUNCEMENT (boolean) If set, then a traffic announcement is in progress.

V4L2_CID_RDS_TX_TRAFFIC_PROGRAM (boolean) If set, then the tuned programme carries traffic announcements.

V4L2_CID_RDS_TX_MUSIC_SPEECH (boolean) If set, then this channel broadcasts music. If cleared, then it broadcasts speech. If the transmitter doesn't make this distinction, then it should be set.

V4L2_CID_RDS_TX_ALT_FREQS_ENABLE (boolean) If set, then transmit alternate frequencies.

V4L2_CID_RDS_TX_ALT_FREQS (__u32 array) The alternate frequencies in kHz units. The RDS standard allows for up to 25 frequencies to be defined. Drivers may support fewer frequencies so check the array size.

V4L2_CID_AUDIO_LIMITER_ENABLED (boolean) Enables or disables the audio deviation limiter feature.

The limiter is useful when trying to maximize the audio volume, minimize receiver-generated distortion and prevent overmodulation.

V4L2_CID_AUDIO_LIMITER_RELEASE_TIME (integer) Sets the audio deviation limiter feature release time. Unit is in useconds. Step and range are driver-specific.

V4L2_CID_AUDIO_LIMITER_DEVIATION (integer) Configures audio frequency deviation level in Hz. The range and step are driver-specific.

V4L2_CID_AUDIO_COMPRESSION_ENABLED (boolean) Enables or disables the audio compression feature.

This feature amplifies signals below the threshold by a fixed gain and compresses audio signals above the threshold by the ratio of Threshold/(Gain + Threshold).

V4L2_CID_AUDIO_COMPRESSION_GAIN (integer) Sets the gain for audio compression feature. It is a dB value. The range and step are driver-specific.

V4L2_CID_AUDIO_COMPRESSION_THRESHOLD (integer) Sets the threshold level for audio compression freature. It is a dB value. The range and step are driver-specific.

V4L2_CID_AUDIO_COMPRESSION_ATTACK_TIME (integer) Sets the attack time for audio compression feature. It is a useconds value. The range and step are driver-specific.

V4L2_CID_AUDIO_COMPRESSION_RELEASE_TIME (integer) Sets the release time for audio compression feature. It is a useconds value. The range and step are driver-specific.

V4L2_CID_PILOT_TONE_ENABLED (boolean) Enables or disables the pilot tone generation feature.

V4L2_CID_PILOT_TONE_DEVIATION (integer) Configures pilot tone frequency deviation level. Unit is in

Hz. The range and step are driver-specific.

V4L2_CID_PILOT_TONE_FREQUENCY (integer) Configures pilot tone frequency value. Unit is in Hz. The range and step are driver-specific.

V4L2_CID_TUNE_PREEMPHASIS (enum)

enum v4l2_preemphasis - Configures the pre-emphasis value for broadcasting. A pre-emphasis filter is applied to the broadcast to accentuate the high audio frequencies. Depending on the region, a time constant of either 50 or 75 useconds is used. The enum v4l2_preemphasis defines possible values for pre-emphasis. Here they are:

V4L2_PREEMPHASIS_DISABLED No pre-emphasis is applied.

V4L2_PREEMPHASIS_50_uS

V4L2_PREEMPHASIS_75_uS

A pre-emphasis of 50 uS is used.

A pre-emphasis of 75 uS is used.

V4L2_CID_TUNE_POWER_LEVEL (integer) Sets the output power level for signal transmission. Unit is in dBuV. Range and step are driver-specific.

V4L2_CID_TUNE_ANTENNA_CAPACITOR (integer) This selects the value of antenna tuning capacitor manually or automatically if set to zero. Unit, range and step are driver-specific.

For more details about RDS specification, refer to IEC 62106 document, from CENELEC.

40 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Flash Control Reference

The V4L2 flash controls are intended to provide generic access to flash controller devices. Flash controller devices are typically used in digital cameras.

The interface can support both LED and xenon flash devices. As of writing this, there is no xenon flash driver using this interface.

Supported use cases

Unsynchronised LED flash (software strobe)

Unsynchronised LED flash is controlled directly by the host as the sensor. The flash must be enabled by the host before the exposure of the image starts and disabled once it ends. The host is fully responsible for the timing of the flash.

Example of such device: Nokia N900.

Synchronised LED flash (hardware strobe) The synchronised LED flash is pre-programmed by the host (power and timeout) but controlled by the sensor through a strobe signal from the sensor to the flash.

The sensor controls the flash duration and timing. This information typically must be made available to the sensor.

LED flash as torch

LED flash may be used as torch in conjunction with another use case involving camera or individually.

Flash Control IDs

V4L2_CID_FLASH_CLASS (class) The FLASH class descriptor.

V4L2_CID_FLASH_LED_MODE (menu) Defines the mode of the flash LED, the high-power white LED attached to the flash controller. Setting this control may not be possible in presence of some faults.

See V4L2_CID_FLASH_FAULT.

V4L2_FLASH_LED_MODE_NONE Off.

V4L2_FLASH_LED_MODE_FLASH Flash mode.

V4L2_FLASH_LED_MODE_TORCH Torch mode. See V4L2_CID_FLASH_TORCH_INTENSITY.

V4L2_CID_FLASH_STROBE_SOURCE (menu) Defines the source of the flash LED strobe.

V4L2_FLASH_STROBE_SOURCE_SOFTWARE The flash strobe is triggered by using the

V4L2_CID_FLASH_STROBE control.

V4L2_FLASH_STROBE_SOURCE_EXTERNAL The flash strobe is triggered by an external source. Typically this is a sensor, which makes it possible to synchronises the flash strobe start to exposure start.

V4L2_CID_FLASH_STROBE (button) Strobe flash.

Valid when V4L2_CID_FLASH_LED_MODE is set to V4L2_FLASH_LED_MODE_FLASH and V4L2_CID_FLASH_STROBE_SOURCE is set to

V4L2_FLASH_STROBE_SOURCE_SOFTWARE. Setting this control may not be possible in presence of some faults. See V4L2_CID_FLASH_FAULT.

V4L2_CID_FLASH_STROBE_STOP (button) Stop flash strobe immediately.

V4L2_CID_FLASH_STROBE_STATUS (boolean) Strobe status: whether the flash is strobing at the moment or not. This is a read-only control.

V4L2_CID_FLASH_TIMEOUT (integer) Hardware timeout for flash. The flash strobe is stopped after this period of time has passed from the start of the strobe.

V4L2_CID_FLASH_INTENSITY (integer) Intensity of the flash strobe when the flash LED is in flash mode

(V4L2_FLASH_LED_MODE_FLASH). The unit should be milliamps (mA) if possible.

1.2. Part I - Video for Linux API 41

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2_CID_FLASH_TORCH_INTENSITY (integer) Intensity of the flash LED in torch mode

(V4L2_FLASH_LED_MODE_TORCH). The unit should be milliamps (mA) if possible.

Setting this control may not be possible in presence of some faults. See V4L2_CID_FLASH_FAULT.

V4L2_CID_FLASH_INDICATOR_INTENSITY (integer) Intensity of the indicator LED. The indicator LED may be fully independent of the flash LED. The unit should be microamps (uA) if possible.

V4L2_CID_FLASH_FAULT (bitmask) Faults related to the flash. The faults tell about specific problems in the flash chip itself or the LEDs attached to it. Faults may prevent further use of some of the flash controls. In particular, V4L2_CID_FLASH_LED_MODE is set to V4L2_FLASH_LED_MODE_NONE if the fault affects the flash LED. Exactly which faults have such an effect is chip dependent. Reading the faults resets the control and returns the chip to a usable state if possible.

V4L2_FLASH_FAULT_OVER_VOLTAGE

V4L2_FLASH_FAULT_TIMEOUT

V4L2_FLASH_FAULT_OVER_TEMPERATURE

V4L2_FLASH_FAULT_SHORT_CIRCUIT

V4L2_FLASH_FAULT_OVER_CURRENT

V4L2_FLASH_FAULT_INDICATOR

V4L2_FLASH_FAULT_UNDER_VOLTAGE

Flash controller voltage to the flash LED has exceeded the limit specific to the flash controller.

The flash strobe was still on when the timeout set by the user --- V4L2_CID_FLASH_TIMEOUT control --- has expired. Not all flash controllers may set this in all such conditions.

The flash controller has overheated.

The short circuit protection of the flash controller has been triggered.

Current in the LED power supply has exceeded the limit specific to the flash controller.

The flash controller has detected a short or open circuit condition on the indicator LED.

Flash controller voltage to the flash LED has been below the minimum limit specific to the flash controller.

V4L2_FLASH_FAULT_INPUT_VOLTAGE The input voltage of the flash controller is below the limit under which strobing the flash at full current will not be possible.The condition persists until this flag is no longer set.

V4L2_FLASH_FAULT_LED_OVER_TEMPERATURE The temperature of the LED has exceeded its allowed upper limit.

V4L2_CID_FLASH_CHARGE (boolean) Enable or disable charging of the xenon flash capacitor.

V4L2_CID_FLASH_READY (boolean) Is the flash ready to strobe? Xenon flashes require their capacitors charged before strobing. LED flashes often require a cooldown period after strobe during which another strobe will not be possible. This is a read-only control.

JPEG Control Reference

The JPEG class includes controls for common features of JPEG encoders and decoders. Currently it includes features for codecs implementing progressive baseline DCT compression process with Huffman entrophy coding.

JPEG Control IDs

V4L2_CID_JPEG_CLASS (class) The JPEG class descriptor.

Calling ioctls VIDIOC_QUERYCTRL, VID-

IOC_QUERY_EXT_CTRL and VIDIOC_QUERYMENU for this control will return a description of this control class.

V4L2_CID_JPEG_CHROMA_SUBSAMPLING (menu) The chroma subsampling factors describe how each component of an input image is sampled, in respect to maximum sample rate in each spatial dimension.

See ITU-T.81, clause A.1.1. for more details. The V4L2_CID_JPEG_CHROMA_SUBSAMPLING control determines how Cb and Cr components are downsampled after converting an input image from RGB to

Y'CbCr color space.

42 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2_JPEG_CHROMA_SUBSAMPLING_444

V4L2_JPEG_CHROMA_SUBSAMPLING_422

V4L2_JPEG_CHROMA_SUBSAMPLING_420

No chroma subsampling, each pixel has Y, Cr and Cb values.

Horizontally subsample Cr, Cb components by a factor of 2.

Subsample Cr, Cb components horizontally and vertically by

2.

Horizontally subsample Cr, Cb components by a factor of 4.

V4L2_JPEG_CHROMA_SUBSAMPLING_411

V4L2_JPEG_CHROMA_SUBSAMPLING_410 Subsample Cr, Cb components horizontally by 4 and vertically by 2.

V4L2_JPEG_CHROMA_SUBSAMPLING_GRAY Use only luminance component.

V4L2_CID_JPEG_RESTART_INTERVAL (integer) The restart interval determines an interval of inserting

RSTm markers (m = 0..7). The purpose of these markers is to additionally reinitialize the encoder process, in order to process blocks of an image independently. For the lossy compression processes the restart interval unit is MCU (Minimum Coded Unit) and its value is contained in DRI (Define Restart

Interval) marker. If V4L2_CID_JPEG_RESTART_INTERVAL control is set to 0, DRI and RSTm markers will not be inserted.

V4L2_CID_JPEG_COMPRESSION_QUALITY (integer) V4L2_CID_JPEG_COMPRESSION_QUALITY control determines trade-off between image quality and size. It provides simpler method for applications to control image quality, without a need for direct reconfiguration of luminance and chrominance quantization tables. In cases where a driver uses quantization tables configured directly by an application, using interfaces defined elsewhere, V4L2_CID_JPEG_COMPRESSION_QUALITY control should be set by driver to 0.

The value range of this control is driver-specific. Only positive, non-zero values are meaningful. The recommended range is 1 - 100, where larger values correspond to better image quality.

V4L2_CID_JPEG_ACTIVE_MARKER (bitmask) Specify which JPEG markers are included in compressed stream. This control is valid only for encoders.

V4L2_JPEG_ACTIVE_MARKER_APP0 Application data segment APP

0

.

V4L2_JPEG_ACTIVE_MARKER_APP1 Application data segment APP

1

.

V4L2_JPEG_ACTIVE_MARKER_COM

V4L2_JPEG_ACTIVE_MARKER_DQT

Comment segment.

Quantization tables segment.

V4L2_JPEG_ACTIVE_MARKER_DHT Huffman tables segment.

For more details about JPEG specification, refer to ITU-T.81, JFIF, W3C JPEG JFIF.

Image Source Control Reference

The Image Source control class is intended for low-level control of image source devices such as image sensors. The devices feature an analogue to digital converter and a bus transmitter to transmit the image data out of the device.

Image Source Control IDs

V4L2_CID_IMAGE_SOURCE_CLASS (class) The IMAGE_SOURCE class descriptor.

V4L2_CID_VBLANK (integer) Vertical blanking. The idle period after every frame during which no image data is produced. The unit of vertical blanking is a line. Every line has length of the image width plus horizontal blanking at the pixel rate defined by V4L2_CID_PIXEL_RATE control in the same subdevice.

V4L2_CID_HBLANK (integer) Horizontal blanking. The idle period after every line of image data during which no image data is produced. The unit of horizontal blanking is pixels.

V4L2_CID_ANALOGUE_GAIN (integer) Analogue gain is gain affecting all colour components in the pixel matrix. The gain operation is performed in the analogue domain before A/D conversion.

V4L2_CID_TEST_PATTERN_RED (integer) Test pattern red colour component.

V4L2_CID_TEST_PATTERN_GREENR (integer) Test pattern green (next to red) colour component.

V4L2_CID_TEST_PATTERN_BLUE (integer) Test pattern blue colour component.

1.2. Part I - Video for Linux API 43

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2_CID_TEST_PATTERN_GREENB (integer) Test pattern green (next to blue) colour component.

Image Process Control Reference

The Image Process control class is intended for low-level control of image processing functions. Unlike

V4L2_CID_IMAGE_SOURCE_CLASS, the controls in this class affect processing the image, and do not control capturing of it.

Image Process Control IDs

V4L2_CID_IMAGE_PROC_CLASS (class) The IMAGE_PROC class descriptor.

V4L2_CID_LINK_FREQ (integer menu) Data bus frequency. Together with the media bus pixel code, bus type (clock cycles per sample), the data bus frequency defines the pixel rate (V4L2_CID_PIXEL_RATE) in the pixel array (or possibly elsewhere, if the device is not an image sensor). The frame rate can be calculated from the pixel clock, image width and height and horizontal and vertical blanking. While the pixel rate control may be defined elsewhere than in the subdev containing the pixel array, the frame rate cannot be obtained from that information. This is because only on the pixel array it can be assumed that the vertical and horizontal blanking information is exact: no other blanking is allowed in the pixel array. The selection of frame rate is performed by selecting the desired horizontal and vertical blanking. The unit of this control is Hz.

V4L2_CID_PIXEL_RATE (64-bit integer) Pixel rate in the source pads of the subdev. This control is read-only and its unit is pixels / second.

V4L2_CID_TEST_PATTERN (menu) Some capture/display/sensor devices have the capability to generate test pattern images. These hardware specific test patterns can be used to test if a device is working properly.

V4L2_CID_DEINTERLACING_MODE (menu) The video deinterlacing mode (such as Bob, Weave, ...). The menu items are driver specific and are documented in Video4Linux (V4L) driver-specific documenta-

tion.

Digital Video Control Reference

The Digital Video control class is intended to control receivers and transmitters for VGA , DVI (Digital Visual

Interface), HDMI (HDMI) and DisplayPort (DP). These controls are generally expected to be private to the receiver or transmitter subdevice that implements them, so they are only exposed on the /dev/v4lsubdev* device node.

Note:

Note that these devices can have multiple input or output pads which are hooked up to e.g. HDMI connectors. Even though the subdevice will receive or transmit video from/to only one of those pads, the

other pads can still be active when it comes to EDID (Extended Display Identification Data, EDID) and

HDCP (High-bandwidth Digital Content Protection System, HDCP) processing, allowing the device to do

the fairly slow EDID/HDCP handling in advance. This allows for quick switching between connectors.

These pads appear in several of the controls in this section as bitmasks, one bit for each pad. Bit 0 corresponds to pad 0, bit 1 to pad 1, etc. The maximum value of the control is the set of valid pads.

Digital Video Control IDs

V4L2_CID_DV_CLASS (class) The Digital Video class descriptor.

V4L2_CID_DV_TX_HOTPLUG (bitmask) Many connectors have a hotplug pin which is high if EDID information is available from the source. This control shows the state of the hotplug pin as seen by the transmitter. Each bit corresponds to an output pad on the transmitter. If an output pad does not

44 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

have an associated hotplug pin, then the bit for that pad will be 0. This read-only control is applicable to DVI-D, HDMI and DisplayPort connectors.

V4L2_CID_DV_TX_RXSENSE (bitmask) Rx Sense is the detection of pull-ups on the TMDS clock lines. This normally means that the sink has left/entered standby (i.e. the transmitter can sense that the receiver is ready to receive video). Each bit corresponds to an output pad on the transmitter. If an output pad does not have an associated Rx Sense, then the bit for that pad will be 0. This read-only control is applicable to DVI-D and HDMI devices.

V4L2_CID_DV_TX_EDID_PRESENT (bitmask) When the transmitter sees the hotplug signal from the receiver it will attempt to read the EDID. If set, then the transmitter has read at least the first block

(= 128 bytes). Each bit corresponds to an output pad on the transmitter. If an output pad does not support EDIDs, then the bit for that pad will be 0. This read-only control is applicable to VGA, DVI-A/D,

HDMI and DisplayPort connectors.

V4L2_CID_DV_TX_MODE (enum)

enum v4l2_dv_tx_mode - HDMI transmitters can transmit in DVI-D mode (just video) or in HDMI mode

(video + audio + auxiliary data). This control selects which mode to use: V4L2_DV_TX_MODE_DVI_D or V4L2_DV_TX_MODE_HDMI. This control is applicable to HDMI connectors.

V4L2_CID_DV_TX_RGB_RANGE (enum)

enum v4l2_dv_rgb_range - Select the quantization range for RGB output. V4L2_DV_RANGE_AUTO follows the RGB quantization range specified in the standard for the video interface (ie. CEA-861-E for

HDMI). V4L2_DV_RANGE_LIMITED and V4L2_DV_RANGE_FULL override the standard to be compatible with sinks that have not implemented the standard correctly (unfortunately quite common for HDMI and DVI-D). Full range allows all possible values to be used whereas limited range sets the range to (16 << (N-8)) - (235 << (N-8)) where N is the number of bits per component. This control is applicable to VGA, DVI-A/D, HDMI and DisplayPort connectors.

V4L2_CID_DV_TX_IT_CONTENT_TYPE (enum)

enum v4l2_dv_it_content_type - Configures the IT Content Type of the transmitted video. This information is sent over HDMI and DisplayPort connectors as part of the AVI InfoFrame. The term `IT Content' is used for content that originates from a computer as opposed to content from a TV broadcast or an analog source. The enum v4l2_dv_it_content_type defines the possible content types:

V4L2_DV_IT_CONTENT_TYPE_GRAPHICS

V4L2_DV_IT_CONTENT_TYPE_PHOTO

V4L2_DV_IT_CONTENT_TYPE_CINEMA

V4L2_DV_IT_CONTENT_TYPE_GAME

V4L2_DV_IT_CONTENT_TYPE_NO_ITC

Graphics content. Pixel data should be passed unfiltered and without analog reconstruction.

Photo content. The content is derived from digital still pictures. The content should be passed through with minimal scaling and picture enhancements.

Cinema content.

Game content. Audio and video latency should be minimized.

No IT Content information is available and the ITC bit in the

AVI InfoFrame is set to 0.

V4L2_CID_DV_RX_POWER_PRESENT (bitmask) Detects whether the receiver receives power from the source (e.g. HDMI carries 5V on one of the pins). This is often used to power an eeprom which contains EDID information, such that the source can read the EDID even if the sink is in standby/power off. Each bit corresponds to an input pad on the transmitter. If an input pad cannot detect whether power is present, then the bit for that pad will be 0. This read-only control is applicable to DVI-D,

HDMI and DisplayPort connectors.

V4L2_CID_DV_RX_RGB_RANGE (enum)

enum v4l2_dv_rgb_range - Select the quantization range for RGB input. V4L2_DV_RANGE_AUTO follows the RGB quantization range specified in the standard for the video interface (ie. CEA-861-E for

HDMI). V4L2_DV_RANGE_LIMITED and V4L2_DV_RANGE_FULL override the standard to be compatible with sources that have not implemented the standard correctly (unfortunately quite common for

HDMI and DVI-D). Full range allows all possible values to be used whereas limited range sets the

1.2. Part I - Video for Linux API 45

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

range to (16 << (N-8)) - (235 << (N-8)) where N is the number of bits per component. This control is applicable to VGA, DVI-A/D, HDMI and DisplayPort connectors.

V4L2_CID_DV_RX_IT_CONTENT_TYPE (enum)

enum v4l2_dv_it_content_type - Reads the IT Content Type of the received video. This information is sent over HDMI and DisplayPort connectors as part of the AVI InfoFrame. The term `IT Content' is used for content that originates from a computer as opposed to content from a TV broadcast or an analog source. See V4L2_CID_DV_TX_IT_CONTENT_TYPE for the available content types.

FM Receiver Control Reference

The FM Receiver (FM_RX) class includes controls for common features of FM Reception capable devices.

FM_RX Control IDs

V4L2_CID_FM_RX_CLASS (class) The FM_RX class descriptor. Calling ioctls VIDIOC_QUERYCTRL, VID-

IOC_QUERY_EXT_CTRL and VIDIOC_QUERYMENU for this control will return a description of this control class.

V4L2_CID_RDS_RECEPTION (boolean) Enables/disables RDS reception by the radio tuner

V4L2_CID_RDS_RX_PTY (integer) Gets RDS Programme Type field. This encodes up to 31 pre-defined programme types.

V4L2_CID_RDS_RX_PS_NAME (string) Gets the Programme Service name (PS_NAME). It is intended for static display on a receiver. It is the primary aid to listeners in programme service identification and selection. In Annex E of IEC 62106, the RDS specification, there is a full description of the correct character encoding for Programme Service name strings. Also from RDS specification, PS is usually a single eight character text. However, it is also possible to find receivers which can scroll strings sized as 8 x N characters. So, this control must be configured with steps of 8 characters. The result is it must always contain a string with size multiple of 8.

V4L2_CID_RDS_RX_RADIO_TEXT (string) Gets the Radio Text info. It is a textual description of what is being broadcasted. RDS Radio Text can be applied when broadcaster wishes to transmit longer PS names, programme-related information or any other text. In these cases, RadioText can be used in addition to V4L2_CID_RDS_RX_PS_NAME. The encoding for Radio Text strings is also fully described in

Annex E of IEC 62106. The length of Radio Text strings depends on which RDS Block is being used to transmit it, either 32 (2A block) or 64 (2B block). However, it is also possible to find receivers which can scroll strings sized as 32 x N or 64 x N characters. So, this control must be configured with steps of 32 or 64 characters. The result is it must always contain a string with size multiple of 32 or 64.

V4L2_CID_RDS_RX_TRAFFIC_ANNOUNCEMENT (boolean) If set, then a traffic announcement is in progress.

V4L2_CID_RDS_RX_TRAFFIC_PROGRAM (boolean) If set, then the tuned programme carries traffic announcements.

V4L2_CID_RDS_RX_MUSIC_SPEECH (boolean) If set, then this channel broadcasts music. If cleared, then it broadcasts speech. If the transmitter doesn't make this distinction, then it will be set.

V4L2_CID_TUNE_DEEMPHASIS (enum)

enum v4l2_deemphasis - Configures the de-emphasis value for reception. A de-emphasis filter is applied to the broadcast to accentuate the high audio frequencies. Depending on the region, a time constant of either 50 or 75 useconds is used. The enum v4l2_deemphasis defines possible values for de-emphasis. Here they are:

V4L2_DEEMPHASIS_DISABLED No de-emphasis is applied.

V4L2_DEEMPHASIS_50_uS

V4L2_DEEMPHASIS_75_uS

A de-emphasis of 50 uS is used.

A de-emphasis of 75 uS is used.

46 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Detect Control Reference

The Detect class includes controls for common features of various motion or object detection capable devices.

Detect Control IDs

V4L2_CID_DETECT_CLASS (class) The Detect class descriptor. Calling ioctls VIDIOC_QUERYCTRL, VID-

IOC_QUERY_EXT_CTRL and VIDIOC_QUERYMENU for this control will return a description of this control class.

V4L2_CID_DETECT_MD_MODE (menu) Sets the motion detection mode.

V4L2_DETECT_MD_MODE_DISABLED

V4L2_DETECT_MD_MODE_GLOBAL

V4L2_DETECT_MD_MODE_THRESHOLD_GRID

V4L2_DETECT_MD_MODE_REGION_GRID

Disable motion detection.

Use a single motion detection threshold.

The image is divided into a grid, each cell with its own motion detection threshold.

These thresholds are set through the V4L2_CID_DETECT_MD_THRESHOLD_GRID matrix control.

The image is divided into a grid, each cell with its own region value that specifies which per-region motion detection thresholds should be used. Each region has its own thresholds. How these per-region thresholds are set up is driver-specific. The region values for the grid are set through the V4L2_CID_DETECT_MD_REGION_GRID matrix control.

V4L2_CID_DETECT_MD_GLOBAL_THRESHOLD (integer) Sets the global motion detection threshold to be used with the V4L2_DETECT_MD_MODE_GLOBAL motion detection mode.

V4L2_CID_DETECT_MD_THRESHOLD_GRID (__u16 matrix) Sets the motion detection thresholds for each cell in the grid. To be used with the V4L2_DETECT_MD_MODE_THRESHOLD_GRID motion detection mode.

Matrix element (0, 0) represents the cell at the top-left of the grid.

V4L2_CID_DETECT_MD_REGION_GRID (__u8 matrix) Sets the motion detection region value for each cell in the grid. To be used with the V4L2_DETECT_MD_MODE_REGION_GRID motion detection mode. Matrix element (0, 0) represents the cell at the top-left of the grid.

RF Tuner Control Reference

The RF Tuner (RF_TUNER) class includes controls for common features of devices having RF tuner.

In this context, RF tuner is radio receiver circuit between antenna and demodulator. It receives radio frequency (RF) from the antenna and converts that received signal to lower intermediate frequency (IF) or baseband frequency (BB). Tuners that could do baseband output are often called Zero-IF tuners. Older tuners were typically simple PLL tuners inside a metal box, whilst newer ones are highly integrated chips without a metal box ``silicon tuners''. These controls are mostly applicable for new feature rich silicon tuners, just because older tuners does not have much adjustable features.

For more information about RF tuners see Tuner (radio) and RF front end from Wikipedia.

RF_TUNER Control IDs

V4L2_CID_RF_TUNER_CLASS (class) The RF_TUNER class descriptor. Calling ioctls VIDIOC_QUERYCTRL,

VIDIOC_QUERY_EXT_CTRL and VIDIOC_QUERYMENU for this control will return a description of this control class.

V4L2_CID_RF_TUNER_BANDWIDTH_AUTO (boolean) Enables/disables tuner radio channel bandwidth configuration. In automatic mode bandwidth configuration is performed by the driver.

1.2. Part I - Video for Linux API 47

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2_CID_RF_TUNER_BANDWIDTH (integer) Filter(s) on tuner signal path are used to filter signal according to receiving party needs. Driver configures filters to fulfill desired bandwidth requirement. Used when V4L2_CID_RF_TUNER_BANDWIDTH_AUTO is not set. Unit is in Hz. The range and step are driver-specific.

V4L2_CID_RF_TUNER_LNA_GAIN_AUTO (boolean) Enables/disables LNA automatic gain control (AGC)

V4L2_CID_RF_TUNER_MIXER_GAIN_AUTO (boolean) Enables/disables mixer automatic gain control (AGC)

V4L2_CID_RF_TUNER_IF_GAIN_AUTO (boolean) Enables/disables IF automatic gain control (AGC)

V4L2_CID_RF_TUNER_RF_GAIN (integer) The RF amplifier is the very first amplifier on the receiver signal path, just right after the antenna input. The difference between the LNA gain and the RF gain in this document is that the LNA gain is integrated in the tuner chip while the RF gain is a separate chip.

There may be both RF and LNA gain controls in the same device. The range and step are driverspecific.

V4L2_CID_RF_TUNER_LNA_GAIN (integer) LNA (low noise amplifier) gain is first gain stage on the

RF tuner signal path.

It is located very close to tuner antenna input.

Used when

V4L2_CID_RF_TUNER_LNA_GAIN_AUTO is not set. See V4L2_CID_RF_TUNER_RF_GAIN to understand how RF gain and LNA gain differs from the each others. The range and step are driver-specific.

V4L2_CID_RF_TUNER_MIXER_GAIN (integer) Mixer gain is second gain stage on the RF tuner signal path. It is located inside mixer block, where RF signal is down-converted by the mixer. Used when

V4L2_CID_RF_TUNER_MIXER_GAIN_AUTO is not set. The range and step are driver-specific.

V4L2_CID_RF_TUNER_IF_GAIN (integer) IF gain is last gain stage on the RF tuner signal path. It is located on output of RF tuner. It controls signal level of intermediate frequency output or baseband output. Used when V4L2_CID_RF_TUNER_IF_GAIN_AUTO is not set. The range and step are driverspecific.

V4L2_CID_RF_TUNER_PLL_LOCK (boolean) Is synthesizer PLL locked? RF tuner is receiving given frequency when that control is set. This is a read-only control.

Data Formats

Data Format Negotiation

Different devices exchange different kinds of data with applications, for example video images, raw or sliced VBI data, RDS datagrams. Even within one kind many different formats are possible, in particular an abundance of image formats. Although drivers must provide a default and the selection persists across closing and reopening a device, applications should always negotiate a data format before engaging in data exchange. Negotiation means the application asks for a particular format and the driver selects and reports the best the hardware can do to satisfy the request. Of course applications can also just query the current selection.

A single mechanism exists to negotiate all data formats using the aggregate struct v4l2_format and the

VIDIOC_G_FMT and VIDIOC_S_FMT ioctls. Additionally the VIDIOC_TRY_FMT ioctl can be used to examine what the hardware could do, without actually selecting a new data format. The data formats supported by the V4L2 API are covered in the respective device section in

Interfaces

. For a closer look at image formats see

Image Formats

.

The VIDIOC_S_FMT ioctl is a major turning-point in the initialization sequence. Prior to this point multiple panel applications can access the same device concurrently to select the current input, change controls or modify other properties. The first VIDIOC_S_FMT assigns a logical stream (video data, VBI data etc.) exclusively to one file descriptor.

Exclusive means no other application, more precisely no other file descriptor, can grab this stream or change device properties inconsistent with the negotiated parameters. A video standard change for example, when the new standard uses a different number of scan lines, can invalidate the selected image format. Therefore only the file descriptor owning the stream can make invalidating changes. Accordingly multiple file descriptors which grabbed different logical streams prevent each other from interfering with

48 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

their settings. When for example video overlay is about to start or already in progress, simultaneous video capturing may be restricted to the same cropping and image size.

When applications omit the VIDIOC_S_FMT ioctl its locking side effects are implied by the next step, the selection of an I/O method with the ioctl VIDIOC_REQBUFS ioctl or implicit with the first read() or write() call.

Generally only one logical stream can be assigned to a file descriptor, the exception being drivers permitting simultaneous video capturing and overlay using the same file descriptor for compatibility with V4L and earlier versions of V4L2. Switching the logical stream or returning into ``panel mode'' is possible by closing and reopening the device. Drivers may support a switch using VIDIOC_S_FMT.

All drivers exchanging data with applications must support the VIDIOC_G_FMT and VIDIOC_S_FMT ioctl.

Implementation of the VIDIOC_TRY_FMT is highly recommended but optional.

Image Format Enumeration

Apart of the generic format negotiation functions a special ioctl to enumerate all image formats supported by video capture, overlay or output devices is available.

8

The ioctl VIDIOC_ENUM_FMT ioctl must be supported by all drivers exchanging image data with applications.

Important

Drivers are not supposed to convert image formats in kernel space. They must enumerate only formats directly supported by the hardware. If necessary driver writers should publish an example conversion routine or library for integration into applications.

Single- and multi-planar APIs

Some devices require data for each input or output video frame to be placed in discontiguous memory buffers. In such cases, one video frame has to be addressed using more than one memory address, i.e.

one pointer per ``plane''. A plane is a sub-buffer of the current frame. For examples of such formats see

Image Formats

.

Initially, V4L2 API did not support multi-planar buffers and a set of extensions has been introduced to handle them. Those extensions constitute what is being referred to as the ``multi-planar API''.

Some of the V4L2 API calls and structures are interpreted differently, depending on whether single- or multi-planar API is being used. An application can choose whether to use one or the other by passing a corresponding buffer type to its ioctl calls. Multi-planar versions of buffer types are suffixed with an

_MPLANE string. For a list of available multi-planar buffer types see enum

v4l2_buf_type

.

Multi-planar formats

Multi-planar API introduces new multi-planar formats. Those formats use a separate set of FourCC codes.

It is important to distinguish between the multi-planar API and a multi-planar format. Multi-planar API calls can handle all single-planar formats as well (as long as they are passed in multi-planar API structures), while the single-planar API cannot handle multi-planar formats.

Calls that distinguish between single and multi-planar APIs

VIDIOC_QUERYCAP Two additional multi-planar capabilities are added. They can be set together with non-multi-planar ones for devices that handle both single- and multi-planar formats.

8

Enumerating formats an application has no a-priori knowledge of (otherwise it could explicitly ask for them and need not enumerate) seems useless, but there are applications serving as proxy between drivers and the actual video applications for which this is useful.

1.2. Part I - Video for Linux API 49

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

VIDIOC_G_FMT, VIDIOC_S_FMT, VIDIOC_TRY_FMT New structures for describing multi-planar formats are added: struct

v4l2_pix_format_mplane

and struct

v4l2_plane_pix_format

. Drivers may define new multi-planar formats, which have distinct FourCC codes from the existing single-planar ones.

VIDIOC_QBUF, VIDIOC_DQBUF, VIDIOC_QUERYBUF A new struct

v4l2_plane

structure for describing planes is added. Arrays of this structure are passed in the new m.planes field of struct

v4l2_buffer

.

VIDIOC_REQBUFS Will allocate multi-planar buffers as requested.

Image Cropping, Insertion and Scaling

Some video capture devices can sample a subsection of the picture and shrink or enlarge it to an image of arbitrary size. We call these abilities cropping and scaling. Some video output devices can scale an image up or down and insert it at an arbitrary scan line and horizontal offset into a video signal.

Applications can use the following API to select an area in the video signal, query the default area and the hardware limits.

Note:

Despite their name, the VIDIOC_CROPCAP, VIDIOC_G_CROP and VIDIOC_S_CROP ioctls apply to input

as well as output devices.

Scaling requires a source and a target. On a video capture or overlay device the source is the video signal, and the cropping ioctls determine the area actually sampled. The target are images read by the application or overlaid onto the graphics screen. Their size (and position for an overlay) is negotiated with the VIDIOC_G_FMT and VIDIOC_S_FMT ioctls.

On a video output device the source are the images passed in by the application, and their size is again negotiated with the VIDIOC_G_FMT and VIDIOC_S_FMT ioctls, or may be encoded in a compressed video stream. The target is the video signal, and the cropping ioctls determine the area where the images are inserted.

Source and target rectangles are defined even if the device does not support scaling or the VIDIOC_G_CROP and VIDIOC_S_CROP ioctls. Their size (and position where applicable) will be fixed in this case.

Note:

All capture and output devices must support the VIDIOC_CROPCAP ioctl such that applications can

determine if scaling takes place.

Cropping Structures

Figure 1.2: Image Cropping, Insertion and Scaling

The cropping, insertion and scaling process

For capture devices the coordinates of the top left corner, width and height of the area which can be sampled is given by the bounds substructure of the struct v4l2_cropcap returned by the VIDIOC_CROPCAP ioctl. To support a wide range of hardware this specification does not define an origin or units. However by convention drivers should horizontally count unscaled samples relative to 0H (the leading edge of the horizontal sync pulse, see

Figure 4.1. Line synchronization

). Vertically ITU-R line numbers of the first field

(see ITU R-525 line numbering for

525 lines

and for

625 lines

), multiplied by two if the driver can capture both fields.

The top left corner, width and height of the source rectangle, that is the area actually sampled, is given by struct v4l2_crop using the same coordinate system as struct v4l2_cropcap. Applications can use

50 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

the VIDIOC_G_CROP and VIDIOC_S_CROP ioctls to get and set this rectangle. It must lie completely within the capture boundaries and the driver may further adjust the requested size and/or position according to hardware limitations.

Each capture device has a default source rectangle, given by the defrect substructure of struct v4l2_cropcap. The center of this rectangle shall align with the center of the active picture area of the video signal, and cover what the driver writer considers the complete picture. Drivers shall reset the source rectangle to the default when the driver is first loaded, but not later.

For output devices these structures and ioctls are used accordingly, defining the target rectangle where the images will be inserted into the video signal.

Scaling Adjustments

Video hardware can have various cropping, insertion and scaling limitations. It may only scale up or down, support only discrete scaling factors, or have different scaling abilities in horizontal and vertical direction. Also it may not support scaling at all. At the same time the struct v4l2_crop rectangle may have to be aligned, and both the source and target rectangles may have arbitrary upper and lower size limits. In particular the maximum width and height in struct v4l2_crop may be smaller than the struct v4l2_cropcap. bounds area. Therefore, as usual, drivers are expected to adjust the requested parameters and return the actual values selected.

Applications can change the source or the target rectangle first, as they may prefer a particular image size or a certain area in the video signal. If the driver has to adjust both to satisfy hardware limitations, the last requested rectangle shall take priority, and the driver should preferably adjust the opposite one. The

VIDIOC_TRY_FMT ioctl however shall not change the driver state and therefore only adjust the requested rectangle.

Suppose scaling on a video capture device is restricted to a factor 1:1 or 2:1 in either direction and the target image size must be a multiple of 16 × 16 pixels. The source cropping rectangle is set to defaults, which are also the upper limit in this example, of 640 × 400 pixels at offset 0, 0. An application requests an image size of 300 × 225 pixels, assuming video will be scaled down from the ``full picture'' accordingly. The driver sets the image size to the closest possible values 304 × 224, then chooses the cropping rectangle closest to the requested size, that is 608 × 224 (224 × 2:1 would exceed the limit

400). The offset 0, 0 is still valid, thus unmodified. Given the default cropping rectangle reported by

VIDIOC_CROPCAP the application can easily propose another offset to center the cropping rectangle.

Now the application may insist on covering an area using a picture aspect ratio closer to the original request, so it asks for a cropping rectangle of 608 × 456 pixels. The present scaling factors limit cropping to 640 × 384, so the driver returns the cropping size 608 × 384 and adjusts the image size to closest possible 304 × 192.

Examples

Source and target rectangles shall remain unchanged across closing and reopening a device, such that piping data into or out of a device will work without special preparations. More advanced applications should ensure the parameters are suitable before starting I/O.

Note:

On the next two examples, a video capture device is assumed;

V4L2_BUF_TYPE_VIDEO_CAPTURE for other types of device.

change

1.2. Part I - Video for Linux API 51

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Example: Resetting the cropping parameters struct

v4l2_cropcap cropcap;

struct

v4l2_crop crop; memset ( & cropcap, 0 ,

sizeof

(cropcap)); cropcap.type

= V4L2_BUF_TYPE_VIDEO_CAPTURE;

if

( 1 == ioctl (fd, VIDIOC_CROPCAP, & cropcap)) { perror ( "VIDIOC_CROPCAP" ); exit (EXIT_FAILURE);

} memset ( & crop, 0 ,

sizeof

(crop)); crop.type

= V4L2_BUF_TYPE_VIDEO_CAPTURE; crop.c

= cropcap.defrect;

/* Ignore if cropping is not supported (EINVAL). */

if

( 1 == ioctl (fd, VIDIOC_S_CROP, & crop)

&& errno != EINVAL) { perror ( "VIDIOC_S_CROP" ); exit (EXIT_FAILURE);

}

Example: Simple downscaling struct

v4l2_cropcap cropcap;

struct

v4l2_format format; reset_cropping_parameters ();

/* Scale down to 1/4 size of full picture. */

memset ( & format, 0 ,

sizeof

(format));

/* defaults */

format.type

= V4L2_BUF_TYPE_VIDEO_CAPTURE; format.fmt.pix.width

= cropcap.defrect.width

>> 1 ; format.fmt.pix.height

= cropcap.defrect.height

>> 1 ; format.fmt.pix.pixelformat

= V4L2_PIX_FMT_YUYV;

if

( 1 == ioctl (fd, VIDIOC_S_FMT, & format)) { perror ( "VIDIOC_S_FORMAT" ); exit (EXIT_FAILURE);

}

/* We could check the actual image size now, the actual scaling factor or if the driver can scale at all. */

Example: Selecting an output area

Note:

This example assumes an output device.

52 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d struct

v4l2_cropcap cropcap;

struct

v4l2_crop crop; memset ( & cropcap, 0 ,

sizeof

(cropcap)); cropcap.type

= V4L2_BUF_TYPE_VIDEO_OUTPUT;

if

( 1 == ioctl (fd, VIDIOC_CROPCAP;, & cropcap)) { perror ( "VIDIOC_CROPCAP" ); exit (EXIT_FAILURE);

} memset ( & crop, 0 ,

sizeof

(crop)); crop.type

= V4L2_BUF_TYPE_VIDEO_OUTPUT; crop.c

= cropcap.defrect;

/* Scale the width and height to 50 % of their original size and center the output. */

crop.c.width

/= 2 ; crop.c.height

/= 2 ; crop.c.left

+= crop.c.width

/ 2 ; crop.c.top

+= crop.c.height

/ 2 ;

/* Ignore if cropping is not supported (EINVAL). */

if

( 1 == ioctl (fd, VIDIOC_S_CROP, & crop)

&& errno != EINVAL) { perror ( "VIDIOC_S_CROP" ); exit (EXIT_FAILURE);

}

Example: Current scaling factor and pixel aspect

Note:

This example assumes a video capture device.

struct

v4l2_cropcap cropcap;

struct

v4l2_crop crop;

struct

v4l2_format format;

double

hscale, vscale;

double

aspect;

int

dwidth, dheight; memset ( & cropcap, 0 ,

sizeof

(cropcap)); cropcap.type

= V4L2_BUF_TYPE_VIDEO_CAPTURE;

if

( 1 == ioctl (fd, VIDIOC_CROPCAP, & cropcap)) { perror ( "VIDIOC_CROPCAP" ); exit (EXIT_FAILURE);

} memset ( & crop, 0 ,

sizeof

(crop)); crop.type

= V4L2_BUF_TYPE_VIDEO_CAPTURE;

if

( 1 == ioctl (fd, VIDIOC_G_CROP, & crop)) {

if

(errno != EINVAL) { perror ( "VIDIOC_G_CROP" );

1.2. Part I - Video for Linux API 53

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

exit (EXIT_FAILURE);

}

/* Cropping not supported. */

crop.c

= cropcap.defrect;

} memset ( & format, 0 ,

sizeof

(format)); format.fmt.type

= V4L2_BUF_TYPE_VIDEO_CAPTURE;

if

( 1 == ioctl (fd, VIDIOC_G_FMT, & format)) { perror ( "VIDIOC_G_FMT" ); exit (EXIT_FAILURE);

}

/* The scaling applied by the driver. */

hscale = format.fmt.pix.width

/ (

double

) crop.c.width; vscale = format.fmt.pix.height

/ (

double

) crop.c.height; aspect = cropcap.pixelaspect.numerator

/

(

double

) cropcap.pixelaspect.denominator; aspect = aspect * hscale / vscale;

/* Devices following ITU-R BT.601 do not capture square pixels. For playback on a computer monitor we should scale the images to this size. */

dwidth = format.fmt.pix.width

/ aspect; dheight = format.fmt.pix.height;

API for cropping, composing and scaling

Introduction

Some video capture devices can sample a subsection of a picture and shrink or enlarge it to an image of arbitrary size. Next, the devices can insert the image into larger one. Some video output devices can crop part of an input image, scale it up or down and insert it at an arbitrary scan line and horizontal offset into a video signal. We call these abilities cropping, scaling and composing.

On a video capture device the source is a video signal, and the cropping target determine the area actually sampled. The sink is an image stored in a memory buffer. The composing area specifies which part of the buffer is actually written to by the hardware.

On a video output device the source is an image in a memory buffer, and the cropping target is a part of an image to be shown on a display. The sink is the display or the graphics screen. The application may select the part of display where the image should be displayed. The size and position of such a window is controlled by the compose target.

Rectangles for all cropping and composing targets are defined even if the device does supports neither cropping nor composing. Their size and position will be fixed in such a case. If the device does not support scaling then the cropping and composing rectangles have the same size.

Selection targets

54

Figure 1.3: Cropping and composing targets

Targets used by a cropping, composing and scaling process

Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

See Selection targets for more information.

Configuration

Applications can use the selection API to select an area in a video signal or a buffer, and to query for default settings and hardware limits.

Video hardware can have various cropping, composing and scaling limitations. It may only scale up or down, support only discrete scaling factors, or have different scaling abilities in the horizontal and vertical directions. Also it may not support scaling at all. At the same time the cropping/composing rectangles may have to be aligned, and both the source and the sink may have arbitrary upper and lower size limits.

Therefore, as usual, drivers are expected to adjust the requested parameters and return the actual values selected. An application can control the rounding behaviour using constraint flags.

Configuration of video capture See figure

Cropping and composing targets

for examples of the selection targets available for a video capture device. It is recommended to configure the cropping targets before to the composing targets.

The range of coordinates of the top left corner, width and height of areas that can be sampled is given by the V4L2_SEL_TGT_CROP_BOUNDS target. It is recommended for the driver developers to put the top/left corner at position (0,0). The rectangle's coordinates are expressed in pixels.

The top left corner, width and height of the source rectangle, that is the area actually sampled, is given by the V4L2_SEL_TGT_CROP target. It uses the same coordinate system as V4L2_SEL_TGT_CROP_BOUNDS. The active cropping area must lie completely inside the capture boundaries. The driver may further adjust the requested size and/or position according to hardware limitations.

Each capture device has a default source rectangle, given by the V4L2_SEL_TGT_CROP_DEFAULT target.

This rectangle shall over what the driver writer considers the complete picture. Drivers shall set the active crop rectangle to the default when the driver is first loaded, but not later.

The composing targets refer to a memory buffer. The limits of composing coordinates are obtained using

V4L2_SEL_TGT_COMPOSE_BOUNDS. All coordinates are expressed in pixels. The rectangle's top/left corner must be located at position (0,0). The width and height are equal to the image size set by VIDIOC_S_FMT.

The part of a buffer into which the image is inserted by the hardware is controlled by the

V4L2_SEL_TGT_COMPOSE target. The rectangle's coordinates are also expressed in the same coordinate system as the bounds rectangle. The composing rectangle must lie completely inside bounds rectangle. The driver must adjust the composing rectangle to fit to the bounding limits. Moreover, the driver can perform other adjustments according to hardware limitations. The application can control rounding behaviour using constraint flags.

For capture devices the default composing rectangle is queried using V4L2_SEL_TGT_COMPOSE_DEFAULT.

It is usually equal to the bounding rectangle.

The part of a buffer that is modified by the hardware is given by V4L2_SEL_TGT_COMPOSE_PADDED. It contains all pixels defined using V4L2_SEL_TGT_COMPOSE plus all padding data modified by hardware during insertion process. All pixels outside this rectangle must not be changed by the hardware. The content of pixels that lie inside the padded area but outside active area is undefined. The application can use the padded and active rectangles to detect where the rubbish pixels are located and remove them if needed.

Configuration of video output For output devices targets and ioctls are used similarly to the video capture case. The composing rectangle refers to the insertion of an image into a video signal. The cropping rectangles refer to a memory buffer. It is recommended to configure the composing targets before to the cropping targets.

The cropping targets refer to the memory buffer that contains an image to be inserted into a video signal or graphical screen. The limits of cropping coordinates are obtained using V4L2_SEL_TGT_CROP_BOUNDS.

All coordinates are expressed in pixels. The top/left corner is always point (0,0). The width and height is equal to the image size specified using VIDIOC_S_FMT ioctl.

1.2. Part I - Video for Linux API 55

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

The top left corner, width and height of the source rectangle, that is the area from which image date are processed by the hardware, is given by the V4L2_SEL_TGT_CROP. Its coordinates are expressed in in the same coordinate system as the bounds rectangle. The active cropping area must lie completely inside the crop boundaries and the driver may further adjust the requested size and/or position according to hardware limitations.

For output devices the default cropping rectangle is queried using V4L2_SEL_TGT_CROP_DEFAULT. It is usually equal to the bounding rectangle.

The part of a video signal or graphics display where the image is inserted by the hardware is controlled by V4L2_SEL_TGT_COMPOSE target. The rectangle's coordinates are expressed in pixels. The composing rectangle must lie completely inside the bounds rectangle. The driver must adjust the area to fit to the bounding limits. Moreover, the driver can perform other adjustments according to hardware limitations.

The device has a default composing rectangle, given by the V4L2_SEL_TGT_COMPOSE_DEFAULT target. This rectangle shall cover what the driver writer considers the complete picture. It is recommended for the driver developers to put the top/left corner at position (0,0). Drivers shall set the active composing rectangle to the default one when the driver is first loaded.

The devices may introduce additional content to video signal other than an image from memory buffers. It includes borders around an image. However, such a padded area is driver-dependent feature not covered by this document. Driver developers are encouraged to keep padded rectangle equal to active one. The padded target is accessed by the V4L2_SEL_TGT_COMPOSE_PADDED identifier. It must contain all pixels from the V4L2_SEL_TGT_COMPOSE target.

Scaling control An application can detect if scaling is performed by comparing the width and the height of rectangles obtained using V4L2_SEL_TGT_CROP and V4L2_SEL_TGT_COMPOSE targets. If these are not equal then the scaling is applied. The application can compute the scaling ratios using these values.

Comparison with old cropping API

The selection API was introduced to cope with deficiencies of previous

API

, that was designed to control simple capture devices. Later the cropping API was adopted by video output drivers. The ioctls are used to select a part of the display were the video signal is inserted. It should be considered as an API abuse because the described operation is actually the composing. The selection API makes a clear distinction between composing and cropping operations by setting the appropriate targets. The V4L2 API lacks any support for composing to and cropping from an image inside a memory buffer. The application could configure a capture device to fill only a part of an image by abusing V4L2 API. Cropping a smaller image from a larger one is achieved by setting the field bytesperline at struct

v4l2_pix_format . Introduc-

ing an image offsets could be done by modifying field m_userptr at struct

v4l2_buffer

before calling

ioctl VIDIOC_QBUF, VIDIOC_DQBUF. Those operations should be avoided because they are not portable

(endianness), and do not work for macroblock and Bayer formats and mmap buffers. The selection API deals with configuration of buffer cropping/composing in a clear, intuitive and portable way. Next, with the selection API the concepts of the padded target and constraints flags are introduced. Finally, struct v4l2_crop and struct v4l2_cropcap have no reserved fields. Therefore there is no way to extend their functionality. The new struct v4l2_selection provides a lot of place for future extensions. Driver developers are encouraged to implement only selection API. The former cropping API would be simulated using the new one.

Examples

(A video capture device is assumed; change V4L2_BUF_TYPE_VIDEO_CAPTURE for other devices; change target to V4L2_SEL_TGT_COMPOSE_* family to configure composing area)

Example: Resetting the cropping parameters

56 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d struct

v4l2_selection sel = {

.type

= V4L2_BUF_TYPE_VIDEO_CAPTURE,

.target

= V4L2_SEL_TGT_CROP_DEFAULT,

}; ret = ioctl(fd, VIDIOC_G_SELECTION, & sel);

if

(ret) exit( 1 ); sel.target

= V4L2_SEL_TGT_CROP; ret = ioctl(fd, VIDIOC_S_SELECTION, & sel);

if

(ret) exit( 1 );

Setting a composing area on output of size of at most half of limit placed at a center of a display.

Example: Simple downscaling struct

v4l2_selection sel = {

.type

= V4L2_BUF_TYPE_VIDEO_OUTPUT,

.target

= V4L2_SEL_TGT_COMPOSE_BOUNDS,

};

struct

v4l2_rect r; ret = ioctl(fd, VIDIOC_G_SELECTION, & sel);

if

(ret) exit( 1 );

/* setting smaller compose rectangle */

r.width

= sel.r.width

/ 2 ; r.height

= sel.r.height

/ 2 ; r.left

= sel.r.width

/ 4 ; r.top

= sel.r.height

/ 4 ; sel.r

= r; sel.target

= V4L2_SEL_TGT_COMPOSE; sel.flags

= V4L2_SEL_FLAG_LE; ret = ioctl(fd, VIDIOC_S_SELECTION, & sel);

if

(ret) exit( 1 );

A video output device is assumed; change V4L2_BUF_TYPE_VIDEO_OUTPUT for other devices

Example: Querying for scaling factors struct

v4l2_selection compose = {

.type

= V4L2_BUF_TYPE_VIDEO_OUTPUT,

.target

= V4L2_SEL_TGT_COMPOSE,

};

struct

v4l2_selection crop = {

.type

= V4L2_BUF_TYPE_VIDEO_OUTPUT,

.target

= V4L2_SEL_TGT_CROP,

};

double

hscale, vscale; ret = ioctl(fd, VIDIOC_G_SELECTION, & compose);

if

(ret) exit( 1 ); ret = ioctl(fd, VIDIOC_G_SELECTION, & crop);

if

(ret) exit( 1 );

/* computing scaling factors */

hscale = (

double

)compose.r.width

/ crop.r.width; vscale = (

double

)compose.r.height

/ crop.r.height;

1.2. Part I - Video for Linux API 57

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Streaming Parameters

Streaming parameters are intended to optimize the video capture process as well as I/O. Presently applications can request a high quality capture mode with the VIDIOC_S_PARM ioctl.

The current video standard determines a nominal number of frames per second. If less than this number of frames is to be captured or output, applications can request frame skipping or duplicating on the driver side. This is especially useful when using the read() or write(), which are not augmented by timestamps or sequence counters, and to avoid unnecessary data copying.

Finally these ioctls can be used to determine the number of buffers used internally by a driver in read/write mode. For implications see the section discussing the read() function.

To get and set the streaming parameters applications call the VIDIOC_G_PARM and VIDIOC_S_PARM ioctl, respectively. They take a pointer to a struct v4l2_streamparm, which contains a union holding separate parameters for input and output devices.

These ioctls are optional, drivers need not implement them. If so, they return the EINVAL error code.

1.2.2 Image Formats

The V4L2 API was primarily designed for devices exchanging image data with applications. The struct

v4l2_pix_format

and struct

v4l2_pix_format_mplane

structures define the format and layout of an image in memory. The former is used with the single-planar API, while the latter is used with the multiplanar version (see

Single- and multi-planar APIs

). Image formats are negotiated with the VIDIOC_S_FMT ioctl. (The explanations here focus on video capturing and output, for overlay frame buffer formats see also VIDIOC_G_FBUF.)

Single-planar format structure v4l2_pix_format

Table 1.1: struct v4l2_pix_format

__u32

__u32 width height

Image width in pixels.

Image height in pixels. If field is one of V4L2_FIELD_TOP,

V4L2_FIELD_BOTTOM or V4L2_FIELD_ALTERNATE then height refers to the number of lines in the field, otherwise it refers to the number of lines in the frame (which is twice the field height for interlaced formats).

Applications set these fields to request an image size, drivers return the closest possible values. In case of planar formats the width and height applies to the largest plane. To avoid ambiguities drivers must return values rounded up to a multiple of the scale factor of any smaller planes. For example when the image format is YUV 4:2:0, width and height must be multiples of two.

__u32 pixelformat The pixel format or type of compression, set by the application. This is a little endian four character code. V4L2 defines standard RGB formats in

Packed RGB Image Formats

, YUV for-

mats in

YUV Formats

, and reserved codes in

Reserved Image

Formats

enum

:c:type::v4l2_field

__u32 field Video images are typically interlaced. Applications can request to capture or output only the top or bottom field, or both fields interlaced or sequentially stored in one buffer or alternating in separate buffers. Drivers return the actual field order selected.

For more details on fields see

Field Order

.

bytesperline Distance in bytes between the leftmost pixels in two adjacent lines.

Both applications and drivers can set this field to request padding bytes at the end of each line. Drivers however may ignore the value requested by the application, returning width times bytes per pixel or a larger value required by the hardware. That implies applications can just set this field to zero to get a reasonable default. Video hardware may access padding bytes, therefore they must reside in accessible memory. Consider cases where padding bytes after the last line of an image cross a system page boundary. Input devices may write padding bytes, the value is undefined. Output devices ignore the contents of padding bytes. When the image format is planar the bytesperline value applies to the first plane and is divided by the same factor as the width field for the other planes. For example the Cb and Cr planes of a YUV 4:2:0 image have half as many padding bytes following each line as the Y plane. To avoid ambiguities drivers must return a bytesperline value rounded up to a multiple of the scale factor. For compressed formats the bytesperline value makes no sense. Applications and drivers must set this to 0 in that case.

Continued on next page

58 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

__u32 enum

v4l2_colorspace

__u32

__u32 enum

v4l2_ycbcr_encoding

enum

v4l2_hsv_encoding

enum

v4l2_quantization

enum

v4l2_xfer_func

sizeimage colorspace priv flags ycbcr_enc hsv_enc

Size in bytes of the buffer to hold a complete image, set by the driver. Usually this is bytesperline times height. When the image consists of variable length compressed data this is the maximum number of bytes required to hold an image.

This information supplements the pixelformat and must be set by the driver for capture streams and by the application for output streams, see

Colorspaces

.

This field indicates whether the remaining fields of the struct

v4l2_pix_format , also called the extended fields, are valid.

When set to V4L2_PIX_FMT_PRIV_MAGIC, it indicates that the extended fields have been correctly initialized. When set to any other value it indicates that the extended fields contain undefined values.

Applications that wish to use the pixel format extended fields must first ensure that the feature is supported by querying the device for the

V4L2_CAP_EXT_PIX_FORMAT

capability. If the capability isn't set the pixel format extended fields are not supported and using the extended fields will lead to undefined results.

To use the extended fields, applications must set the priv field to V4L2_PIX_FMT_PRIV_MAGIC, initialize all the extended fields and zero the unused bytes of the struct v4l2_format raw_data field.

When the priv field isn't set to V4L2_PIX_FMT_PRIV_MAGIC drivers must act as if all the extended fields were set to zero.

On return drivers must set the priv field to

V4L2_PIX_FMT_PRIV_MAGIC and all the extended fields to applicable values.

Flags set by the application or driver, see

Format Flags

.

This information supplements the colorspace and must be set by the driver for capture streams and by the application for output streams, see

Colorspaces

.

This information supplements the colorspace and must be set by the driver for capture streams and by the application for output streams, see

Colorspaces

.

quantization This information supplements the colorspace and must be set by the driver for capture streams and by the application for xfer_func output streams, see

Colorspaces

.

This information supplements the colorspace and must be set by the driver for capture streams and by the application for output streams, see

Colorspaces

.

Multi-planar format structures

The struct

v4l2_plane_pix_format

structures define size and layout for each of the planes in a multiplanar format. The struct

v4l2_pix_format_mplane

structure contains information common to all planes

(such as image width and height) and an array of struct

v4l2_plane_pix_format

structures, describing all planes of that format.

v4l2_plane_pix_format

1.2. Part I - Video for Linux API 59

Table 1.1 -- continued from previous page

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

__u32

__u32

__u16

Table 1.2: struct v4l2_plane_pix_format sizeimage bytesperline reserved[6]

Maximum size in bytes required for image data in this plane.

Distance in bytes between the leftmost pixels in two adjacent lines. See struct

v4l2_pix_format .

Reserved for future extensions. Should be zeroed by drivers and applications.

v4l2_pix_format_mplane

Table 1.3: struct v4l2_pix_format_mplane

__u32

__u32

__u32

__u8 width height pixelformat reserved[7]

Image width in pixels.

v4l2_pix_format .

See struct

Image height in pixels.

v4l2_pix_format .

See struct

The pixel format. Both single- and multiplanar four character codes can be used.

enum

v4l2_field

field enum

v4l2_colorspace

colorspace struct

v4l2_plane_pix_format

__u8

__u8

See struct

See struct

v4l2_pix_format v4l2_pix_format

.

.

plane_fmt[VIDEO_MAX_PLANES] An array of structures describing format of num_planes flags each plane this pixel format consists of.

The number of valid entries in this array has to be put in the num_planes field.

Number of planes (i.e. separate memory buffers) for this format and the number of valid entries in the plane_fmt array.

Flags set by the application or driver, see

Format Flags

.

enum

v4l2_ycbcr_encoding

ycbcr_enc enum

v4l2_hsv_encoding

enum

v4l2_quantization

hsv_enc quantization

This information supplements the colorspace and must be set by the driver for capture streams and by the application for output streams, see

Colorspaces

.

This information supplements the colorspace and must be set by the driver for capture streams and by the application for output streams, see

Colorspaces

.

This information supplements the colorspace and must be set by the driver for capture streams and by the application for output streams, see

Colorspaces

.

enum

v4l2_xfer_func

xfer_func This information supplements the colorspace and must be set by the driver for capture streams and by the application for output streams, see

Colorspaces

.

Reserved for future extensions. Should be zeroed by drivers and applications.

Standard Image Formats

In order to exchange images between drivers and applications, it is necessary to have standard image data formats which both sides will interpret the same way. V4L2 includes several such formats, and this section is intended to be an unambiguous specification of the standard image data formats in V4L2.

V4L2 drivers are not limited to these formats, however. Driver-specific formats are possible. In that case the application may depend on a codec to convert images to one of the standard formats when needed.

But the data can still be stored and retrieved in the proprietary format. For example, a device may support

60 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

a proprietary compressed format. Applications can still capture and save the data in the compressed format, saving much disk space, and later use a codec to convert the images to the X Windows screen format when the video is to be displayed.

Even so, ultimately, some standard formats are needed, so the V4L2 specification would not be complete without well-defined standard formats.

The V4L2 standard formats are mainly uncompressed formats. The pixels are always arranged in memory from left to right, and from top to bottom. The first byte of data in the image buffer is always for the leftmost pixel of the topmost row. Following that is the pixel immediately to its right, and so on until the end of the top row of pixels. Following the rightmost pixel of the row there may be zero or more bytes of padding to guarantee that each row of pixel data has a certain alignment. Following the pad bytes, if any, is data for the leftmost pixel of the second row from the top, and so on. The last row has just as many pad bytes after it as the other rows.

In V4L2 each format has an identifier which looks like PIX_FMT_XXX, defined in the videodev2.h header file. These identifiers represent four character (FourCC) codes which are also listed below, however they are not the same as those used in the Windows world.

For some formats, data is stored in separate, discontiguous memory buffers. Those formats are identified by a separate set of FourCC codes and are referred to as ``multi-planar formats''. For example, a

YUV422

frame is normally stored in one memory buffer, but it can also be placed in two or three separate buffers, with Y component in one buffer and CbCr components in another in the 2-planar version or with each component in its own buffer in the 3-planar case. Those sub-buffers are referred to as ``planes''.

Colorspaces

`Color' is a very complex concept and depends on physics, chemistry and biology. Just because you have three numbers that describe the `red', `green' and `blue' components of the color of a pixel does not mean that you can accurately display that color. A colorspace defines what it actually means to have an RGB value of e.g. (255, 0, 0). That is, which color should be reproduced on the screen in a perfectly calibrated environment.

In order to do that we first need to have a good definition of color, i.e. some way to uniquely and unambiguously define a color so that someone else can reproduce it. Human color vision is trichromatic since the human eye has color receptors that are sensitive to three different wavelengths of light. Hence the need to use three numbers to describe color. Be glad you are not a mantis shrimp as those are sensitive to 12 different wavelengths, so instead of RGB we would be using the ABCDEFGHIJKL colorspace...

Color exists only in the eye and brain and is the result of how strongly color receptors are stimulated. This is based on the Spectral Power Distribution (SPD) which is a graph showing the intensity (radiant power) of the light at wavelengths covering the visible spectrum as it enters the eye. The science of colorimetry is about the relationship between the SPD and color as perceived by the human brain.

Since the human eye has only three color receptors it is perfectly possible that different SPDs will result in the same stimulation of those receptors and are perceived as the same color, even though the SPD of the light is different.

In the 1920s experiments were devised to determine the relationship between SPDs and the perceived color and that resulted in the CIE 1931 standard that defines spectral weighting functions that model the perception of color. Specifically that standard defines functions that can take an SPD and calculate the stimulus for each color receptor. After some further mathematical transforms these stimuli are known as the CIE XYZ tristimulus values and these X, Y and Z values describe a color as perceived by a human unambiguously. These X, Y and Z values are all in the range [0…1].

The Y value in the CIE XYZ colorspace corresponds to luminance. Often the CIE XYZ colorspace is transformed to the normalized CIE xyY colorspace: x = X / (X + Y + Z) y = Y / (X + Y + Z)

1.2. Part I - Video for Linux API 61

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

The x and y values are the chromaticity coordinates and can be used to define a color without the luminance component Y. It is very confusing to have such similar names for these colorspaces. Just be aware that if colors are specified with lower case `x' and `y', then the CIE xyY colorspace is used. Upper case

`X' and `Y' refer to the CIE XYZ colorspace. Also, y has nothing to do with luminance. Together x and y specify a color, and Y the luminance. That is really all you need to remember from a practical point of view. At the end of this section you will find reading resources that go into much more detail if you are interested.

A monitor or TV will reproduce colors by emitting light at three different wavelengths, the combination of which will stimulate the color receptors in the eye and thus cause the perception of color. Historically these wavelengths were defined by the red, green and blue phosphors used in the displays. These color

primaries are part of what defines a colorspace.

Different display devices will have different primaries and some primaries are more suitable for some display technologies than others. This has resulted in a variety of colorspaces that are used for different display technologies or uses. To define a colorspace you need to define the three color primaries (these are typically defined as x, y chromaticity coordinates from the CIE xyY colorspace) but also the white reference: that is the color obtained when all three primaries are at maximum power. This determines the relative power or energy of the primaries. This is usually chosen to be close to daylight which has been defined as the CIE D65 Illuminant.

To recapitulate: the CIE XYZ colorspace uniquely identifies colors. Other colorspaces are defined by three chromaticity coordinates defined in the CIE xyY colorspace. Based on those a 3x3 matrix can be constructed that transforms CIE XYZ colors to colors in the new colorspace.

Both the CIE XYZ and the RGB colorspace that are derived from the specific chromaticity primaries are linear colorspaces. But neither the eye, nor display technology is linear. Doubling the values of all components in the linear colorspace will not be perceived as twice the intensity of the color. So each colorspace also defines a transfer function that takes a linear color component value and transforms it to the non-linear component value, which is a closer match to the non-linear performance of both the eye and displays. Linear component values are denoted RGB, non-linear are denoted as R'G'B'. In general colors used in graphics are all R'G'B', except in openGL which uses linear RGB. Special care should be taken when dealing with openGL to provide linear RGB colors or to use the built-in openGL support to apply the inverse transfer function.

The final piece that defines a colorspace is a function that transforms non-linear R'G'B' to non-linear

Y'CbCr. This function is determined by the so-called luma coefficients. There may be multiple possible

Y'CbCr encodings allowed for the same colorspace. Many encodings of color prefer to use luma (Y') and chroma (CbCr) instead of R'G'B'. Since the human eye is more sensitive to differences in luminance than in color this encoding allows one to reduce the amount of color information compared to the luma data.

Note that the luma (Y') is unrelated to the Y in the CIE XYZ colorspace. Also note that Y'CbCr is often called

YCbCr or YUV even though these are strictly speaking wrong.

Sometimes people confuse Y'CbCr as being a colorspace. This is not correct, it is just an encoding of an

R'G'B' color into luma and chroma values. The underlying colorspace that is associated with the R'G'B' color is also associated with the Y'CbCr color.

The final step is how the RGB, R'G'B' or Y'CbCr values are quantized. The CIE XYZ colorspace where

X, Y and Z are in the range [0…1] describes all colors that humans can perceive, but the transform to another colorspace will produce colors that are outside the [0…1] range. Once clamped to the [0…1] range those colors can no longer be reproduced in that colorspace. This clamping is what reduces the extent or gamut of the colorspace. How the range of [0…1] is translated to integer values in the range of [0…255] (or higher, depending on the color depth) is called the quantization. This is not part of the colorspace definition. In practice RGB or R'G'B' values are full range, i.e. they use the full [0…255] range.

Y'CbCr values on the other hand are limited range with Y' using [16…235] and Cb and Cr using [16…240].

Unfortunately, in some cases limited range RGB is also used where the components use the range

[16…235]. And full range Y'CbCr also exists using the [0…255] range.

In order to correctly interpret a color you need to know the quantization range, whether it is R'G'B' or

Y'CbCr, the used Y'CbCr encoding and the colorspace. From that information you can calculate the corresponding CIE XYZ color and map that again to whatever colorspace your display device uses.

62 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

The colorspace definition itself consists of the three chromaticity primaries, the white reference chromaticity, a transfer function and the luma coefficients needed to transform R'G'B' to Y'CbCr. While some colorspace standards correctly define all four, quite often the colorspace standard only defines some, and you have to rely on other standards for the missing pieces. The fact that colorspaces are often a mix of different standards also led to very confusing naming conventions where the name of a standard was used to name a colorspace when in fact that standard was part of various other colorspaces as well.

If you want to read more about colors and colorspaces, then the following resources are useful: poynton is a good practical book for video engineers, colimg has a much broader scope and describes many more aspects of color (physics, chemistry, biology, etc.). The http://www.brucelindbloom.com

website is an excellent resource, especially with respect to the mathematics behind colorspace conversions. The wikipedia CIE 1931 colorspace article is also very useful.

Defining Colorspaces in V4L2

In V4L2 colorspaces are defined by four values.

The first is the colorspace identifier (enum

v4l2_colorspace ) which defines the chromaticities, the default transfer function, the default Y'CbCr

encoding and the default quantization method. The second is the transfer function identifier (enum

v4l2_xfer_func ) to specify non-standard transfer functions. The third is the Y'CbCr encoding identifier

(enum

v4l2_ycbcr_encoding ) to specify non-standard Y'CbCr encodings and the fourth is the quantiza-

tion identifier (enum

v4l2_quantization ) to specify non-standard quantization methods. Most of the

time only the colorspace field of struct

v4l2_pix_format

or struct

v4l2_pix_format_mplane

needs to be filled in. On

HSV formats

the Hue is defined as the angle on the cylindrical color representation. Usually this angle is measured in degrees, i.e. 0-360. When we map this angle value into 8 bits, there are two basic ways to do it: Divide the angular value by 2 (0-179), or use the whole range, 0-255, dividing the angular value by 1.41. The enum

v4l2_hsv_encoding

specifies which encoding is used.

Note:

The default R'G'B' quantization is full range for all colorspaces except for BT.2020 which uses limited range R'G'B' quantization.

v4l2_colorspace

Table 1.4: V4L2 Colorspaces

Identifier

V4L2_COLORSPACE_DEFAULT

Details

The default colorspace. This can be used by applications to let the driver fill in the colorspace.

See

Colorspace SMPTE 170M (V4L2_COLORSPACE_SMPTE170M)

.

V4L2_COLORSPACE_SMPTE170M

V4L2_COLORSPACE_REC709

V4L2_COLORSPACE_SRGB

V4L2_COLORSPACE_ADOBERGB

V4L2_COLORSPACE_BT2020

V4L2_COLORSPACE_DCI_P3

See

Colorspace Rec. 709 (V4L2_COLORSPACE_REC709)

.

See

Colorspace sRGB (V4L2_COLORSPACE_SRGB)

.

See

Colorspace Adobe RGB (V4L2_COLORSPACE_ADOBERGB)

.

See

Colorspace BT.2020 (V4L2_COLORSPACE_BT2020)

.

See

Colorspace DCI-P3 (V4L2_COLORSPACE_DCI_P3)

.

V4L2_COLORSPACE_SMPTE240M See

Colorspace SMPTE 240M (V4L2_COLORSPACE_SMPTE240M)

.

V4L2_COLORSPACE_470_SYSTEM_M See

Colorspace NTSC 1953 (V4L2_COLORSPACE_470_SYSTEM_M)

.

3213

V4L2_COLORSPACE_470_SYSTEM_BG See

Colorspace EBU Tech.

(V4L2_COLORSPACE_470_SYSTEM_BG)

.

V4L2_COLORSPACE_JPEG See

Colorspace JPEG (V4L2_COLORSPACE_JPEG)

.

V4L2_COLORSPACE_RAW The raw colorspace. This is used for raw image capture where the image is minimally processed and is using the internal colorspace of the device. The software that processes an image using this

`colorspace' will have to know the internals of the capture device.

v4l2_xfer_func

1.2. Part I - Video for Linux API 63

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Table 1.5: V4L2 Transfer Function

Identifier

V4L2_XFER_FUNC_DEFAULT

V4L2_XFER_FUNC_709

V4L2_XFER_FUNC_SRGB

Details

Use the default transfer function as defined by the colorspace.

Use the Rec. 709 transfer function.

Use the sRGB transfer function.

V4L2_XFER_FUNC_ADOBERGB Use the AdobeRGB transfer function.

V4L2_XFER_FUNC_SMPTE240M Use the SMPTE 240M transfer function.

V4L2_XFER_FUNC_NONE

V4L2_XFER_FUNC_DCI_P3

Do not use a transfer function (i.e. use linear RGB values).

Use the DCI-P3 transfer function.

V4L2_XFER_FUNC_SMPTE2084 Use the SMPTE 2084 transfer function.

v4l2_ycbcr_encoding

Table 1.6: V4L2 Y'CbCr Encodings

Identifier

V4L2_YCBCR_ENC_DEFAULT

V4L2_YCBCR_ENC_601

V4L2_YCBCR_ENC_709

Details

Use the default Y'CbCr encoding as defined by the colorspace.

Use the BT.601 Y'CbCr encoding.

Use the Rec. 709 Y'CbCr encoding.

V4L2_YCBCR_ENC_XV601

V4L2_YCBCR_ENC_XV709

Use the extended gamut xvYCC BT.601 encoding.

Use the extended gamut xvYCC Rec. 709 encoding.

V4L2_YCBCR_ENC_BT2020 Use the default non-constant luminance BT.2020 Y'CbCr encoding.

V4L2_YCBCR_ENC_BT2020_CONST_LUM Use the constant luminance BT.2020 Yc'CbcCrc encoding.

V4L2_YCBCR_ENC_SMPTE_240M Use the SMPTE 240M Y'CbCr encoding.

v4l2_hsv_encoding

Identifier

V4L2_HSV_ENC_180

V4L2_HSV_ENC_256

Table 1.7: V4L2 HSV Encodings

Details

For the Hue, each LSB is two degrees.

For the Hue, the 360 degrees are mapped into 8 bits, i.e. each

LSB is roughly 1.41 degrees.

v4l2_quantization

Identifier

V4L2_QUANTIZATION_DEFAULT

Table 1.8: V4L2 Quantization Methods

V4L2_QUANTIZATION_FULL_RANGE

V4L2_QUANTIZATION_LIM_RANGE

Details

Use the default quantization encoding as defined by the colorspace. This is always full range for R'G'B' (except for the

BT.2020 colorspace) and HSV. It is usually limited range for

Y'CbCr.

Use the full range quantization encoding. I.e. the range [0…1] is mapped to [0…255] (with possible clipping to [1…254] to avoid the 0x00 and 0xff values). Cb and Cr are mapped from

[-0.5…0.5] to [0…255] (with possible clipping to [1…254] to avoid the 0x00 and 0xff values).

Use the limited range quantization encoding. I.e. the range

[0…1] is mapped to [16…235]. Cb and Cr are mapped from

[-0.5…0.5] to [16…240].

64 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Detailed Colorspace Descriptions

Colorspace SMPTE 170M (V4L2_COLORSPACE_SMPTE170M)

The SMPTE 170M standard defines the colorspace used by NTSC and PAL and by SDTV in general. The default transfer function is V4L2_XFER_FUNC_709. The default Y'CbCr encoding is V4L2_YCBCR_ENC_601.

The default Y'CbCr quantization is limited range. The chromaticities of the primary colors and the white reference are:

Color

Red

Green

Blue

White Reference (D65)

Table 1.9: SMPTE 170M Chromaticities x

0.630

0.310

0.155

0.3127

y

0.340

0.595

0.070

0.3290

The red, green and blue chromaticities are also often referred to as the SMPTE C set, so this colorspace is sometimes called SMPTE C as well.

The transfer function defined for SMPTE 170M is the same as the one defined in Rec. 709.

L

=

1.099(−L)

0.45

L

= 4.5L

, for

+ 0.099

, for L

≤ −0.018

0.018 < L < 0.018

L

= 1.099L

0.45

0.099, for L ≥ 0.018

Inverse Transfer function:

L =

L =

L =

(

(

L

0.099

1.099

)

1

0.45

, for L

≤ −0.081

L

L

, for

0.081 < L

4.5

+ 0.099

)

1

0.45

, for L

< 0.081

1.099

0.081

The luminance (Y') and color difference (Cb and Cr) are obtained with the following V4L2_YCBCR_ENC_601 encoding:

Y

= 0.2990R

+ 0.5870G

+ 0.1140B

Cb =

0.1687R

Cr = 0.5R

0.3313G

0.4187G

+ 0.5B

0.0813B

Y' is clamped to the range [0…1] and Cb and Cr are clamped to the range [-0.5…0.5]. This conversion to

Y'CbCr is identical to the one defined in the ITU BT.601 standard and this colorspace is sometimes called

BT.601 as well, even though BT.601 does not mention any color primaries.

The default quantization is limited range, but full range is possible although rarely seen.

Colorspace Rec. 709 (V4L2_COLORSPACE_REC709)

The ITU BT.709 standard defines the colorspace used by HDTV in general. The default transfer function is V4L2_XFER_FUNC_709. The default Y'CbCr encoding is V4L2_YCBCR_ENC_709. The default Y'CbCr quantization is limited range. The chromaticities of the primary colors and the white reference are:

1.2. Part I - Video for Linux API 65

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Color

Red

Green

Blue

White Reference (D65)

The full name of this standard is Rec. ITU-R BT.709-5.

Transfer function. Normally L is in the range [0…1], but for the extended gamut xvYCC encoding values outside that range are allowed.

L

=

1.099(−L)

0.45

L

= 4.5L

, for

+ 0.099

, for L

≤ −0.018

0.018 < L < 0.018

L

= 1.099L

0.45 0.099, for L ≥ 0.018

Inverse Transfer function: x

0.640

0.300

0.150

0.3127

Table 1.10: Rec. 709 Chromaticities y

0.330

0.600

0.060

0.3290

L =

L =

L =

(

(

L

L

1.099

4.5

L

0.099

, for

+ 0.099

1.099

)

1

0.45

, for L

0.081 < L

)

1

0.45

, for L

≤ −0.081

< 0.081

0.081

The luminance (Y') and color difference (Cb and Cr) are obtained with the following V4L2_YCBCR_ENC_709 encoding:

Y

= 0.2126R

+ 0.7152G

+ 0.0722B

Cb =

0.1146R

Cr = 0.5R

0.3854G

0.4542G

+ 0.5B

0.0458B

Y' is clamped to the range [0…1] and Cb and Cr are clamped to the range [-0.5…0.5].

The default quantization is limited range, but full range is possible although rarely seen.

The V4L2_YCBCR_ENC_709 encoding described above is the default for this colorspace, but it can be overridden with V4L2_YCBCR_ENC_601, in which case the BT.601 Y'CbCr encoding is used.

Two additional extended gamut Y'CbCr encodings are also possible with this colorspace:

The xvYCC 709 encoding (V4L2_YCBCR_ENC_XV709, xvYCC) is similar to the Rec. 709 encoding, but it allows for R', G' and B' values that are outside the range [0…1]. The resulting Y', Cb and Cr values are scaled and offset:

Y

=

219

(0.2126R

+ 0.7152G

+ 0.0722B

) +

256

Cb =

Cr =

224

256

224

256

(0.1146R

(0.5R

0.3854G

0.4542G

+ 0.5B

0.0458B

)

)

16

256

The xvYCC 601 encoding (V4L2_YCBCR_ENC_XV601, xvYCC) is similar to the BT.601 encoding, but it allows for R', G' and B' values that are outside the range [0…1]. The resulting Y', Cb and Cr values are scaled and offset:

Y

=

219

(0.2990R

+ 0.5870G

+ 0.1140B

) +

256

Cb =

Cr =

224

256

224

256

(0.1687R

(0.5R

0.3313G

0.4187G

+ 0.5B

0.0813B

)

)

16

256

66 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Y' is clamped to the range [0…1] and Cb and Cr are clamped to the range [-0.5…0.5].

The nonstandard xvYCC 709 or xvYCC 601 encodings can be used by selecting V4L2_YCBCR_ENC_XV709 or

V4L2_YCBCR_ENC_XV601. The xvYCC encodings always use full range quantization.

Colorspace sRGB (V4L2_COLORSPACE_SRGB)

The sRGB standard defines the colorspace used by most webcams and computer graphics. The default transfer function is V4L2_XFER_FUNC_SRGB. The default Y'CbCr encoding is V4L2_YCBCR_ENC_601. The default Y'CbCr quantization is limited range.

Note that the sYCC standard specifies full range quantization, however all current capture hardware supported by the kernel convert R'G'B' to limited range Y'CbCr. So choosing full range as the default would break how applications interpret the quantization range.

The chromaticities of the primary colors and the white reference are:

Color

Red

Green

Blue

White Reference (D65) x

0.640

0.300

0.150

0.3127

Table 1.11: sRGB Chromaticities y

0.330

0.600

0.060

0.3290

These chromaticities are identical to the Rec. 709 colorspace.

Transfer function. Note that negative values for L are only used by the Y'CbCr conversion.

L

L

=

1.055(−L)

1

2.4

= 12.92L

, for

+ 0.055

, for L <

0.0031308

0.0031308 ≤ L ≤ 0.0031308

L

= 1.055L

1

2.4

0.055, for 0.0031308 < L ≤ 1

Inverse Transfer function:

L =

((−L

+ 0.055)/1.055)

2.4

, for L

L = L

/12.92

, for

0.04045 ≤ L

<

0.04045

0.04045

L = ((L

+ 0.055)/1.055)

2.4

, for L

> 0.04045

The luminance (Y') and color difference (Cb and Cr) are obtained with the following V4L2_YCBCR_ENC_601 encoding as defined by sYCC:

Y

= 0.2990R

+ 0.5870G

+ 0.1140B

Cb =

0.1687R

Cr = 0.5R

0.3313G

0.4187G

+ 0.5B

0.0813B

Y' is clamped to the range [0…1] and Cb and Cr are clamped to the range [-0.5…0.5]. This transform is identical to one defined in SMPTE 170M/BT.601. The Y'CbCr quantization is limited range.

Colorspace Adobe RGB (V4L2_COLORSPACE_ADOBERGB)

The AdobeRGB standard defines the colorspace used by computer graphics that use the AdobeRGB colorspace.

This is also known as the opRGB standard.

The default transfer function is

V4L2_XFER_FUNC_ADOBERGB. The default Y'CbCr encoding is V4L2_YCBCR_ENC_601. The default Y'CbCr quantization is limited range.

Note that the opRGB standard specifies full range quantization, however all current capture hardware supported by the kernel convert R'G'B' to limited range Y'CbCr. So choosing full range as the default would break how applications interpret the quantization range.

1.2. Part I - Video for Linux API 67

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

The chromaticities of the primary colors and the white reference are:

Color

Red

Green

Blue

White Reference (D65)

Transfer function:

Table 1.12: Adobe RGB Chromaticities x

0.6400

0.2100

0.1500

0.3127

y

0.3300

0.7100

0.0600

0.3290

L

= L

1

2.19921875

Inverse Transfer function:

L = L

(2.19921875)

The luminance (Y') and color difference (Cb and Cr) are obtained with the following V4L2_YCBCR_ENC_601 encoding:

Y

= 0.2990R

+ 0.5870G

+ 0.1140B

Cb =

0.1687R

Cr = 0.5R

0.3313G

0.4187G

+ 0.5B

0.0813B

Y' is clamped to the range [0…1] and Cb and Cr are clamped to the range [-0.5…0.5]. This transform is identical to one defined in SMPTE 170M/BT.601. The Y'CbCr quantization is limited range.

Colorspace BT.2020 (V4L2_COLORSPACE_BT2020)

The ITU BT.2020 standard defines the colorspace used by Ultra-high definition television (UHDTV). The default transfer function is V4L2_XFER_FUNC_709. The default Y'CbCr encoding is V4L2_YCBCR_ENC_BT2020.

The default R'G'B' quantization is limited range (!), and so is the default Y'CbCr quantization. The chromaticities of the primary colors and the white reference are:

Color

Red

Green

Blue

White Reference (D65) x

0.708

0.170

0.131

0.3127

Table 1.13: BT.2020 Chromaticities y

0.292

0.797

0.046

0.3290

Transfer function (same as Rec. 709):

L

= 4.5L

, for 0

≤ L < 0.018

L

= 1.099L

0.45 0.099, for 0.018 ≤ L ≤ 1

Inverse Transfer function:

L =

(

L = L

L

/4.5

, for L

+ 0.099

1.099

)

1

0.45

< 0.081

, for L

0.081

The luminance (Y') and color difference (Cb and Cr) are obtained with the following

V4L2_YCBCR_ENC_BT2020 encoding:

Y

= 0.2627R

+ 0.6780G

+ 0.0593B

Cb =

0.1396R

Cr = 0.5R

0.3604G

0.4598G

+ 0.5B

0.0402B

68 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Y' is clamped to the range [0…1] and Cb and Cr are clamped to the range [-0.5…0.5]. The Y'CbCr quantization is limited range.

There is also an alternate constant luminance R'G'B' to Yc'CbcCrc (V4L2_YCBCR_ENC_BT2020_CONST_LUM) encoding:

Luma:

Y c

= (0.2627R + 0.6780G + 0.0593B)

B

− Y c

0 :

Cbc = (B

B

− Y c

> 0 :

Cbc = (B

R

− Y c

0 :

Crc = (R

R

− Y c

> 0 :

Crc = (R

− Y c

)/1.9404

− Y c

)/1.5816

− Y

)/1.7184

− Y

)/0.9936

Yc' is clamped to the range [0…1] and Cbc and Crc are clamped to the range [-0.5…0.5]. The Yc'CbcCrc quantization is limited range.

Colorspace DCI-P3 (V4L2_COLORSPACE_DCI_P3)

The SMPTE RP 431-2 standard defines the colorspace used by cinema projectors that use the DCI-P3 colorspace. The default transfer function is V4L2_XFER_FUNC_DCI_P3. The default Y'CbCr encoding is

V4L2_YCBCR_ENC_709. The default Y'CbCr quantization is limited range.

Note:

Note that this colorspace standard does not specify a Y'CbCr encoding since it is not meant to be encoded to Y'CbCr. So this default Y'CbCr encoding was picked because it is the HDTV encoding.

The chromaticities of the primary colors and the white reference are:

Color

Red

Green

Blue

White Reference

Transfer function: x

0.6800

0.2650

0.1500

0.3140

Table 1.14: DCI-P3 Chromaticities y

0.3200

0.6900

0.0600

0.3510

L

= L

1

2.6

Inverse Transfer function:

L = L

(2.6)

Y'CbCr encoding is not specified. V4L2 defaults to Rec. 709.

Colorspace SMPTE 240M (V4L2_COLORSPACE_SMPTE240M)

The SMPTE 240M standard was an interim standard used during the early days of HDTV (1988-1998).

It has been superseded by Rec. 709. The default transfer function is V4L2_XFER_FUNC_SMPTE240M. The

1.2. Part I - Video for Linux API 69

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

default Y'CbCr encoding is V4L2_YCBCR_ENC_SMPTE240M. The default Y'CbCr quantization is limited range.

The chromaticities of the primary colors and the white reference are:

Color

Red

Green

Blue

White Reference (D65)

Table 1.15: SMPTE 240M Chromaticities x

0.630

0.310

0.155

0.3127

y

0.340

0.595

0.070

0.3290

These chromaticities are identical to the SMPTE 170M colorspace.

Transfer function:

L

= 4L

, for 0

≤ L < 0.0228

L

= 1.1115L

0.45 0.1115, for 0.0228 ≤ L ≤ 1

Inverse Transfer function:

L =

(

L =

L

L

, for 0

≤ L

4

+ 0.1115

)

1

0.45

1.1115

< 0.0913

, for L

0.0913

The luminance (Y') and color difference (Cb and Cr) are obtained with the following

V4L2_YCBCR_ENC_SMPTE240M encoding:

Y

= 0.2122R

+ 0.7013G

+ 0.0865B

Cb =

0.1161R

Cr = 0.5R

0.3839G

0.4451G

+ 0.5B

0.0549B

Y' is clamped to the range [0…1] and Cb and Cr are clamped to the range [-0.5…0.5]. The Y'CbCr quantization is limited range.

Colorspace NTSC 1953 (V4L2_COLORSPACE_470_SYSTEM_M)

This standard defines the colorspace used by NTSC in 1953. In practice this colorspace is obsolete and

SMPTE 170M should be used instead. The default transfer function is V4L2_XFER_FUNC_709. The default

Y'CbCr encoding is V4L2_YCBCR_ENC_601. The default Y'CbCr quantization is limited range. The chromaticities of the primary colors and the white reference are:

Color

Red

Green

Blue

White Reference (C) x

0.67

0.21

0.14

0.310

Table 1.16: NTSC 1953 Chromaticities y

0.33

0.71

0.08

0.316

Note:

This colorspace uses Illuminant C instead of D65 as the white reference. To correctly convert an image in this colorspace to another that uses D65 you need to apply a chromatic adaptation algorithm such as the Bradford method.

70 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

The transfer function was never properly defined for NTSC 1953. The Rec. 709 transfer function is recommended in the literature:

L

= 4.5L

, for 0

≤ L < 0.018

L

= 1.099L

0.45

0.099, for 0.018 ≤ L ≤ 1

Inverse Transfer function:

L =

(

L

L

L =

, for L

4.5

+ 0.099

)

1

0.45

< 0.081

, for L

1.099

0.081

The luminance (Y') and color difference (Cb and Cr) are obtained with the following V4L2_YCBCR_ENC_601 encoding:

Y

= 0.2990R

+ 0.5870G

+ 0.1140B

Cb =

0.1687R

Cr = 0.5R

0.3313G

0.4187G

+ 0.5B

0.0813B

Y' is clamped to the range [0…1] and Cb and Cr are clamped to the range [-0.5…0.5]. The Y'CbCr quantization is limited range. This transform is identical to one defined in SMPTE 170M/BT.601.

Colorspace EBU Tech. 3213 (V4L2_COLORSPACE_470_SYSTEM_BG)

The EBU Tech 3213 standard defines the colorspace used by PAL/SECAM in 1975.

In practice this colorspace is obsolete and SMPTE 170M should be used instead.

The default transfer function is

V4L2_XFER_FUNC_709. The default Y'CbCr encoding is V4L2_YCBCR_ENC_601. The default Y'CbCr quantization is limited range. The chromaticities of the primary colors and the white reference are:

Color

Red

Green

Blue

White Reference (D65)

Table 1.17: EBU Tech. 3213 Chromaticities x

0.64

0.29

0.15

0.3127

y

0.33

0.60

0.06

0.3290

The transfer function was never properly defined for this colorspace. The Rec. 709 transfer function is recommended in the literature:

L

L

= 4.5L

, for 0

≤ L < 0.018

= 1.099L

0.45

0.099, for 0.018 ≤ L ≤ 1

Inverse Transfer function:

L =

(

L =

L

L

, for L

4.5

+ 0.099

)

1

0.45

< 0.081

, for L

1.099

0.081

The luminance (Y') and color difference (Cb and Cr) are obtained with the following V4L2_YCBCR_ENC_601 encoding:

Y

= 0.2990R

+ 0.5870G

+ 0.1140B

Cb =

0.1687R

Cr = 0.5R

0.3313G

0.4187G

+ 0.5B

0.0813B

Y' is clamped to the range [0…1] and Cb and Cr are clamped to the range [-0.5…0.5]. The Y'CbCr quantization is limited range. This transform is identical to one defined in SMPTE 170M/BT.601.

1.2. Part I - Video for Linux API 71

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Colorspace JPEG (V4L2_COLORSPACE_JPEG)

This colorspace defines the colorspace used by most (Motion-)JPEG formats.

The chromaticities of the primary colors and the white reference are identical to sRGB. The transfer function use is

V4L2_XFER_FUNC_SRGB. The Y'CbCr encoding is V4L2_YCBCR_ENC_601 with full range quantization where

Y' is scaled to [0…255] and Cb/Cr are scaled to [-128…128] and then clipped to [-128…127].

Note:

The JPEG standard does not actually store colorspace information. So if something other than sRGB is used, then the driver will have to set that information explicitly. Effectively V4L2_COLORSPACE_JPEG can be considered to be an abbreviation for V4L2_COLORSPACE_SRGB, V4L2_YCBCR_ENC_601 and

V4L2_QUANTIZATION_FULL_RANGE.

Detailed Transfer Function Descriptions

Transfer Function SMPTE 2084 (V4L2_XFER_FUNC_SMPTE2084)

The SMPTE ST 2084 standard defines the transfer function used by High Dynamic Range content.

Constants: m1 = (2610 / 4096) / 4 m2 = (2523 / 4096) * 128 c1 = 3424 / 4096 c2 = (2413 / 4096) * 32 c3 = (2392 / 4096) * 32

Transfer function: L' = ((c1 + c2 * L m1

) / (1 + c3 * L m1

)) m2

Inverse Transfer function: L = (max(L'

1/m2

- c1, 0) / (c2 - c3 * L'

1/m2

))

1/m1

Indexed Format

In this format each pixel is represented by an 8 bit index into a 256 entry ARGB palette. It is intended for

Video Output Overlays

only. There are no ioctls to access the palette, this must be done with ioctls of the

Linux framebuffer API.

Identifier

Table 1.18: Indexed Image Format

Code Byte 0

Bit 7 6 5 4 3 2 1 0

V4L2_PIX_FMT_PAL8

`PAL8' i

7 i

6 i

5 i

4 i

3 i

2 i

1 i

0

RGB Formats

Packed RGB formats

Description These formats are designed to match the pixel formats of typical PC graphics frame buffers.

They occupy 8, 16, 24 or 32 bits per pixel.

These are all packedpixel formats, meaning all the data for a pixel lie next to each other in memory.

72 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Identifier Code

V4L2_PIX_FMT_RGB332

V4L2_PIX_FMT_ARGB444

V4L2_PIX_FMT_XRGB444

V4L2_PIX_FMT_ARGB555

V4L2_PIX_FMT_XRGB555

V4L2_PIX_FMT_RGB565

V4L2_PIX_FMT_ARGB555X

V4L2_PIX_FMT_XRGB555X

V4L2_PIX_FMT_RGB565X

V4L2_PIX_FMT_BGR24

V4L2_PIX_FMT_RGB24

V4L2_PIX_FMT_BGR666

V4L2_PIX_FMT_ABGR32

V4L2_PIX_FMT_XBGR32

V4L2_PIX_FMT_ARGB32

V4L2_PIX_FMT_XRGB32

`RGB1'

`AR12'

`XR12'

`AR15'

`XR15'

`RGBP'

`AR15' | (1 << 31)

`XR15' | (1 << 31)

`RGBR'

`BGR3'

`RGB3'

`BGRH'

`AR24'

`XR24'

`BA24'

`BX24'

Bit b

7 b

7 a

7 r

4 b

7 r

7 b

5 g

2 g

2 a

Byte 0 in memory

7 6 5 4 3 r

2 g g

3 g

3

2 r

1 g g g

2

2

1 r

0 g

1 g

1 g

0 g

2 g g b

0

0

4 g

1 b b b

3

3

3 g g

1

1 r

4 g g r

3

0

0 b b r

4

4

2 b

3 b

3 r r

4

3 b

6 r

6 b

4 r r b r

3

2

5 b

5

3 r r b r b

2

1

4

4

2 r

1 r

1 r

0 b

3 r

3 b

1 b

6 b

6 a

6 b

5 b

5 a

5 b

4 b

4 a

4 b

3 b

3 a

3 r

0 g

5 b

2 r

2 b

0 b

2 b

2 r

0 b

2 b

2 a

2

2 g

0 b

2 b

2 b

2 g

4 g

4 b

1 r

1 g

5 b

1 b

1 b

1 g

4 b

1 b

1 a

1

1 b

1 b

1 b

1 b

0 b

0 a

0 b

0 r

0 g

4 b

0 b

0 b

0

0 b

0

Table 1.19: Packed RGB Image Formats

Byte 1

7 6 5 4 3 2 1 0 b

0 b

0 g

3 a a r

3

4 g

2 a r r r g

2

4

4

3

1 a r r r

3

3

2 g

1

0 a r r r b

0

2

2

1

4 r r r

1 r r b

3

3

1

0

3 r r r r g b

2

2

0

0

5

2 r g g g b

1 r

1

4

4

4

1 r

0 r

0 g

3 g

3 g

3 b

0 b

0 g

3 g

3 g

2 g

2 g

1 g

1 g

0 g

0 b

4 b

4 b

3 b

3 b

2 b

2 b

1 b

1 b

0 g g g

7

7

3 g g g

6

6

2 g g g

5

5

1 g g g

4

4

0 g g r

5

3

3 g g r

2

2

4 g g r

3

1

1 g

0 g

0 r

2 r

7 r

7 g

7 g

7 r

6 r

6 g

6 g

6 r

5 r

5 g

5 g

5 r

4 r

4 g

4 g

4 r

3 r

3 g

3 g

3 r

2 r

2 g

2 g

2 r

1 r

1 g

1 g

1 r

0 r

0 g

0 g

0

Note:

Byte 2

7 6 5 4 3 2 1 0

Byte 3

7 6 5 4 3 2 1 0 r

7 r

7 g

7 g

7 r

7 b

7 r

1 r

0 r

6 r

6 r

6 b

6 g

6 g

6 r

5 b

5 r

4 b

4 r r g g

5

5

5

5 r

4 r

4 g

4 g

4 r

3 b

3 r b

2

2 r

3 r

3 g

3 g

3 r

2 r

2 g

2 g

2 r

1 b

1 r

1 r

1 g

1 g

1 r

0 r

0 g

0 g

0 r

0 b

0 a

7 a

6 a

5 a

4 a

3 a

2 a

1 a

0 b

7 b

7 b

6 b

6 b

5 b

5 b

4 b

4 b

3 b

3 b

2 b

2 b

1 b

1 b

0 b

0

Bit 7 is the most significant bit.

The usage and value of the alpha bits (a) in the ARGB and ABGR formats (collectively referred to as alpha formats) depend on the device type and hardware operation.

Capture

devices (including capture queues of mem-to-mem devices) fill the alpha component in memory. When the device outputs an alpha channel the alpha component will have a meaningful value. Otherwise, when the device doesn't output an alpha channel but can set the alpha bit to a user-configurable value, the

V4L2_CID_ALPHA_COMPONENT

control is used to specify that alpha value, and the alpha component of all pixels will be set to the value specified by that control. Otherwise a corresponding format without an alpha component (XRGB or XBGR) must be used instead of an alpha format.

Output

devices (including output queues of mem-to-mem devices and

video output overlay

devices) read the alpha component from memory. When the device processes the alpha channel the alpha component must be filled with meaningful values by applications. Otherwise a corresponding format without an alpha component (XRGB or XBGR) must be used instead of an alpha format.

The XRGB and XBGR formats contain undefined bits (-). Applications, devices and drivers must ignore those bits, for both

Video Capture Interface

and

Video Output Interface

devices.

Byte Order. Each cell is one byte.

start + 0: start + 12: start + 24: start + 36:

B

00

B

10

B

20

B

30

G

00

G

10

G

20

G

30

R

00

R

10

R

20

R

30

Table 1.20: RGB byte order

B

01

B

11

B

21

B

31

G

G

G

G

01

11

21

31

R

R

R

R

01

11

21

31

B

02

B

12

B

22

B

32

G

02

G

12

G

22

G

32

R

02

R

12

R

22

R

32

B

03

B

13

B

23

B

33

G

03

G

13

G

23

G

33

R

03

R

13

R

23

R

33

Formats defined in

Deprecated Packed RGB Image Formats

are deprecated and must not be used by new drivers.

They are documented here for reference.

The meaning of their alpha bits (a) is ill-defined and interpreted as in either the corresponding ARGB or XRGB format, depending on the driver.

Identifier Code

V4L2_PIX_FMT_RGB444

V4L2_PIX_FMT_RGB555

`R444'

`RGBO'

V4L2_PIX_FMT_RGB555X `RGBQ'

V4L2_PIX_FMT_BGR32 `BGR4'

V4L2_PIX_FMT_RGB32 `RGB4'

Bit

Byte 0 in memory

7 6 5 4 3 g

3 g

2 a b

7 a

7 g g r b a

4

2

1

6

6 g

1 g

0 r

3 b

5 a

5 g b r

2

0

4 b

4 a

4 b

3 b

3 r

1 b

3 a

3

2 b

2 b

2 r

0 b

2 a

2

1 0 b

1 b

1 b

0 b

0 g

4 g

3 b

1 b

0 a

1 a

0

Table 1.21: Deprecated Packed RGB Image Formats

Byte 1

7 6 5 4 3 2 1 0 r

0

Byte 2

7 6 a

3 a

2 a

1 a

0 r

3 r

2 r

1 g

3 a r

4 r

3 r

2 r

1 r

0 g

4 b

0 g

2 g

1 g

0 b

4 b

3 b

2 b

1 g

7 r

7 g r

6

6 g r

5

5 g r

4

4 g r

3

3 g r

2

2 g r

1

1 g r

0

0 r g

7

7 r

6 g

6

5 r

5 g

5

4 3 r

4 g

4 r

3 g

3

2 r

2 g

2

1 r

1 g

1

0 r

0 g

0

Byte 3

7 6 a

7 b

7

5 a

6 b

6 a

5 b

5

4 a

4 b

4

3 a

3 b

3

2 a

2 b

2

1 0 a

1 b

1 a

0 b

0

A test utility to determine which RGB formats a driver actually supports is available from the LinuxTV v4l-dvb repository. See https://linuxtv.org/repo/ for access instructions.

1.2. Part I - Video for Linux API 73

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2_PIX_FMT_SRGGB8 (`RGGB'), V4L2_PIX_FMT_SGRBG8 (`GRBG'), V4L2_PIX_FMT_SGBRG8

(`GBRG'), V4L2_PIX_FMT_SBGGR8 (`BA81'),

8-bit Bayer formats

Description These four pixel formats are raw sRGB / Bayer formats with 8 bits per sample. Each sample is stored in a byte. Each n-pixel row contains n/2 green samples and n/2 blue or red samples, with alternating red and blue rows. They are conventionally described as GRGR... BGBG..., RGRG... GBGB..., etc. Below is an example of a small V4L2_PIX_FMT_SBGGR8 image:

Byte Order. Each cell is one byte.

start + 0: start + 4: start + 8:

B

00

G

10

B

20 start + 12: G

30

G

R

01

R

11

G

21

31

B

02

G

12

B

22

G

32

G

03

R

13

G

23

R

33

V4L2_PIX_FMT_SRGGB10 (`RG10'), V4L2_PIX_FMT_SGRBG10 (`BA10'), V4L2_PIX_FMT_SGBRG10

(`GB10'), V4L2_PIX_FMT_SBGGR10 (`BG10'),

V4L2_PIX_FMT_SGRBG10 V4L2_PIX_FMT_SGBRG10 V4L2_PIX_FMT_SBGGR10 10-bit Bayer formats expanded to 16 bits

Description These four pixel formats are raw sRGB / Bayer formats with 10 bits per sample. Each sample is stored in a 16-bit word, with 6 unused high bits filled with zeros. Each n-pixel row contains n/2 green samples and n/2 blue or red samples, with alternating red and blue rows. Bytes are stored in memory in little endian order. They are conventionally described as GRGR... BGBG..., RGRG... GBGB..., etc. Below is an example of one of these formats:

Byte Order. Each cell is one byte, the 6 most significant bits in the high bytes are 0.

start + 0: B

00low start + 8: G

10low start + 16: B

20low start + 24: G

30low

B

00high

G

10high

B

20high

G

30high

G

R

11low

G

21low

R

01low

31low

G

R

01high

R

11high

G

21high

31high

B

02low

G

12low

B

22low

G

32low

B

G

12high

B

22high

G

02high

32high

G

R

03low

R

13low

G

23low

33low

G

03high

R

13high

G

23high

R

33high

V4L2_PIX_FMT_SRGGB10P (`pRAA'), V4L2_PIX_FMT_SGRBG10P (`pgAA'), V4L2_PIX_FMT_SGBRG10P

(`pGAA'), V4L2_PIX_FMT_SBGGR10P (`pBAA'),

V4L2_PIX_FMT_SGRBG10P V4L2_PIX_FMT_SGBRG10P V4L2_PIX_FMT_SBGGR10P 10-bit packed Bayer formats

Description These four pixel formats are packed raw sRGB / Bayer formats with 10 bits per sample.

Every four consecutive samples are packed into 5 bytes. Each of the first 4 bytes contain the 8 high order bits of the pixels, and the 5th byte contains the 2 least significants bits of each pixel, in the same order.

Each n-pixel row contains n/2 green samples and n/2 blue or red samples, with alternating green-red and green-blue rows. They are conventionally described as GRGR... BGBG..., RGRG... GBGB..., etc. Below is an example of a small V4L2_PIX_FMT_SBGGR10P image:

Byte Order. Each cell is one byte.

74 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

start + 0: start + 5:

B

00high

G

10high start + 10: B

20high start + 15: G

30high

G

01high

R

11high

G

21high

R

31high

B

02high

G

12high

B

22high

G

32high

G

03high

R

13high

G

23high

R

33high

G

03low

(bits 7--6) B

02low

(bits 5--4) G

01low

(bits 3--2) B

00low

(bits 1--

0)

R

13low

(bits 7--6) G

12low

0)

(bits 5--4) R

11low

(bits 3--2) G

10low

(bits 1--

G

23low

(bits 7--6) B

22low

(bits 5--4) G

21low

(bits 3--2) B

20low

(bits 1--

0)

R

33low

(bits 7--6) G

32low

0)

(bits 5--4) R

31low

(bits 3--2) G

30low

(bits 1--

V4L2_PIX_FMT_SBGGR10ALAW8 (`aBA8'), V4L2_PIX_FMT_SGBRG10ALAW8

V4L2_PIX_FMT_SGRBG10ALAW8 (`agA8'), V4L2_PIX_FMT_SRGGB10ALAW8 (`aRA8'),

(`aGA8'),

V4L2_PIX_FMT_SGBRG10ALAW8 V4L2_PIX_FMT_SGRBG10ALAW8 V4L2_PIX_FMT_SRGGB10ALAW8 10-bit

Bayer formats compressed to 8 bits

Description These four pixel formats are raw sRGB / Bayer formats with 10 bits per color compressed to 8 bits each, using the A-LAW algorithm. Each color component consumes 8 bits of memory. In other respects this format is similar to

V4L2_PIX_FMT_SRGGB8 (`RGGB'), V4L2_PIX_FMT_SGRBG8 (`GRBG'),

V4L2_PIX_FMT_SGBRG8 (`GBRG'), V4L2_PIX_FMT_SBGGR8 (`BA81'),

.

V4L2_PIX_FMT_SBGGR10DPCM8 (`bBA8'), V4L2_PIX_FMT_SGBRG10DPCM8

V4L2_PIX_FMT_SGRBG10DPCM8 (`BD10'), V4L2_PIX_FMT_SRGGB10DPCM8 (`bRA8'),

(`bGA8'),

man V4L2_PIX_FMT_SBGGR10DPCM8(2)

V4L2_PIX_FMT_SGBRG10DPCM8 V4L2_PIX_FMT_SGRBG10DPCM8 V4L2_PIX_FMT_SRGGB10DPCM8 10-bit

Bayer formats compressed to 8 bits

Description These four pixel formats are raw sRGB / Bayer formats with 10 bits per colour compressed to 8 bits each, using DPCM compression. DPCM, differential pulse-code modulation, is lossy. Each colour component consumes 8 bits of memory. In other respects this format is similar to

V4L2_PIX_FMT_SRGGB10

(`RG10'), V4L2_PIX_FMT_SGRBG10 (`BA10'), V4L2_PIX_FMT_SGBRG10 (`GB10'), V4L2_PIX_FMT_SBGGR10

(`BG10'),

.

V4L2_PIX_FMT_SRGGB12 (`RG12'), V4L2_PIX_FMT_SGRBG12 (`BA12'), V4L2_PIX_FMT_SGBRG12

(`GB12'), V4L2_PIX_FMT_SBGGR12 (`BG12'),

V4L2_PIX_FMT_SGRBG12 V4L2_PIX_FMT_SGBRG12 V4L2_PIX_FMT_SBGGR12 12-bit Bayer formats expanded to 16 bits

Description These four pixel formats are raw sRGB / Bayer formats with 12 bits per colour. Each colour component is stored in a 16-bit word, with 4 unused high bits filled with zeros. Each n-pixel row contains n/2 green samples and n/2 blue or red samples, with alternating red and blue rows. Bytes are stored in memory in little endian order. They are conventionally described as GRGR... BGBG..., RGRG... GBGB..., etc. Below is an example of a small V4L2_PIX_FMT_SBGGR12 image:

Byte Order. Each cell is one byte, the 4 most significant bits in the high bytes are 0.

start + 0: start + 8:

B

00low

G

10low start + 16: B

20low start + 24: G

30low

B

G

B

G

00high

10high

20high

30high

G

R

G

R

01low

11low

21low

31low

G

R

G

R

01high

11high

21high

31high

B

G

B

G

02low

12low

22low

32low

B

G

B

G

02high

12high

22high

32high

G

R

G

R

03low

13low

23low

33low

G

R

G

R

03high

13high

23high

33high

1.2. Part I - Video for Linux API 75

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2_PIX_FMT_SRGGB16 (`RG16'), V4L2_PIX_FMT_SGRBG16 (`GR16'), V4L2_PIX_FMT_SGBRG16

(`GB16'), V4L2_PIX_FMT_SBGGR16 (`BYR2'),

16-bit Bayer formats

Description These four pixel formats are raw sRGB / Bayer formats with 16 bits per sample. Each sample is stored in a 16-bit word. Each n-pixel row contains n/2 green samples and n/2 blue or red samples, with alternating red and blue rows. Bytes are stored in memory in little endian order. They are conventionally described as GRGR... BGBG..., RGRG... GBGB..., etc. Below is an example of a small

V4L2_PIX_FMT_SBGGR16 image:

Byte Order. Each cell is one byte.

start + 0: B

00low start + 8: G

10low start + 16: B

20low start + 24: G

30low

B

G

00high

G

10high

B

20high

30high

G

01low

R

11low

G

21low

R

31low

G

R

01high

R

11high

G

21high

31high

B

02low

G

12low

B

22low

G

32low

B

G

12high

B

22high

G

02high

32high

G

R

03low

R

13low

G

23low

33low

G

03high

R

13high

G

23high

R

33high

YUV Formats

YUV is the format native to TV broadcast and composite video signals. It separates the brightness information (Y) from the color information (U and V or Cb and Cr). The color information consists of red and blue color difference signals, this way the green component can be reconstructed by subtracting from the brightness component. See

Colorspaces

for conversion examples. YUV was chosen because early television would only transmit brightness information. To add color in a way compatible with existing receivers a new signal carrier was added to transmit the color difference signals. Secondary in the YUV format the U and V components usually have lower resolution than the Y component. This is an analog video compression technique taking advantage of a property of the human visual system, being more sensitive to brightness information.

Packed YUV formats

Description Similar to the packed RGB formats these formats store the Y, Cb and Cr component of each pixel in one 16 or 32 bit word.

Identifier

V4L2_PIX_FMT_YUV444

V4L2_PIX_FMT_YUV555

V4L2_PIX_FMT_YUV565

V4L2_PIX_FMT_YUV32

Note:

Code

`Y444'

`YUVO'

`YUVP'

`YUV4'

Bit

Byte 0 in memory

7

Cb

3

Cb

2

Cb

1

Cb

0

Cr

3

Cb

2

Cb

2

6

Cb

1

Cb

1

5

Cb

0

Cb

0

4

Cr

4

Cr

4

3

Cr

Cr

3

3

2 1

Cr

2

Cr

1

Cr

Cr

2

2

Cr

Cr

1

1

0

Cr

0

Table 1.22: Packed YUV Image Formats

Byte 1

7 6 5 4 3 2 1 0

Y'

0 a

3 a

2 a

1 a

0

Y'

3

Y'

2

Y'

1

Cb

3

Cr

0 a Y'

4

Y'

3

Y'

2

Y'

1

Y'

0

Cb

4

Cb

3

Cr

0

Y'

4

Y'

3

Y'

2

Y'

1

Y'

0

Cb

5

Cb

4 a

7 a

6 a

5 a

4 a

3 a

2 a

1 a

0

Y'

7

Y'

6

Y'

5

Y'

4

Y'

3

Y'

2

Y'

1

Y'

0

Byte 2

7 6 5 4 3 2 1 0

Cb

7

Cb

6

Cb

5

Cb

4

Cb

3

Cb

2

Cb

1

Cb

0

Byte 3

7 6 5 4 3 2 1 0

Cr

7

Cr

6

Cr

5

Cr

4

Cr

3

Cr

2

Cr

1

Cr

0

1. Bit 7 is the most significant bit;

2. The value of a = alpha bits is undefined when reading from the driver, ignored when writing to the driver, except when alpha blending has been negotiated for a

Video Overlay

or

Video Output

Overlay

.

V4L2_PIX_FMT_GREY (`GREY')

Grey-scale image

76 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Description This is a grey-scale image. It is really a degenerate Y'CbCr format which simply contains no Cb or Cr data.

Byte Order. Each cell is one byte.

start + 0: start + 4: start + 8:

Y'

00

Y'

10

Y'

20 start + 12: Y'

30

Y'

01

Y'

11

Y'

21

Y'

31

Y'

02

Y'

12

Y'

22

Y'

32

Y'

03

Y'

13

Y'

23

Y'

33

V4L2_PIX_FMT_Y10 (`Y10 `)

Grey-scale image

Description This is a grey-scale image with a depth of 10 bits per pixel. Pixels are stored in 16-bit words with unused high bits padded with 0. The least significant byte is stored at lower memory addresses (littleendian).

Byte Order. Each cell is one byte.

start + 0: start + 8:

Y'

00low

Y'

10low start + 16: Y'

20low start + 24: Y'

30low

Y'

00high

Y'

10high

Y'

Y'

20high

30high

Y'

01low

Y'

11low

Y'

21low

Y'

31low

Y'

01high

Y'

11high

Y'

Y'

21high

31high

Y'

02low

Y'

12low

Y'

Y'

22low

32low

Y'

02high

Y'

12high

Y'

Y'

22high

32high

Y'

03low

Y'

13low

Y'

Y'

23low

33low

Y'

03high

Y'

13high

Y'

Y'

23high

33high

V4L2_PIX_FMT_Y12 (`Y12 `)

Grey-scale image

Description This is a grey-scale image with a depth of 12 bits per pixel. Pixels are stored in 16-bit words with unused high bits padded with 0. The least significant byte is stored at lower memory addresses (littleendian).

Byte Order. Each cell is one byte.

start + 0: start + 8:

Y'

00low

Y'

10low start + 16: Y'

20low start + 24: Y'

30low

Y'

Y'

Y'

Y'

00high

10high

20high

30high

Y'

01low

Y'

11low

Y'

21low

Y'

31low

Y'

Y'

Y'

Y'

01high

11high

21high

31high

Y'

Y'

Y'

Y'

02low

12low

22low

32low

Y'

Y'

Y'

Y'

02high

12high

22high

32high

Y'

Y'

Y'

Y'

03low

13low

23low

33low

Y'

Y'

Y'

Y'

03high

13high

23high

33high

V4L2_PIX_FMT_Y10BPACK (`Y10B')

Grey-scale image as a bit-packed array

Description This is a packed grey-scale image format with a depth of 10 bits per pixel. Pixels are stored in a bit-packed array of 10bit bits per pixel, with no padding between them and with the most significant bits coming first from the left.

Bit-packed representation.

pixels cross the byte boundary and have a ratio of 5 bytes for each 4 pixels.

Y'

00[9:2]

Y'

00[1:0]

Y'

01[9:4]

Y'

01[3:0]

Y'

02[9:6]

Y'

02[5:0]

Y'

03[9:8]

Y'

03[7:0]

1.2. Part I - Video for Linux API 77

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2_PIX_FMT_Y16 (`Y16 `)

Grey-scale image

Description This is a grey-scale image with a depth of 16 bits per pixel. The least significant byte is stored at lower memory addresses (little-endian).

Note:

The actual sampling precision may be lower than 16 bits, for example 10 bits per pixel with values in range 0 to 1023.

Byte Order. Each cell is one byte.

start + 0: start + 8:

Y'

00low

Y'

10low start + 16: Y'

20low start + 24: Y'

30low

Y'

Y'

Y'

Y'

00high

10high

20high

30high

Y'

01low

Y'

11low

Y'

21low

Y'

31low

Y'

01high

Y'

11high

Y'

21high

Y'

31high

Y'

02low

Y'

12low

Y'

22low

Y'

32low

Y'

02high

Y'

12high

Y'

22high

Y'

32high

Y'

03low

Y'

13low

Y'

23low

Y'

33low

Y'

03high

Y'

13high

Y'

23high

Y'

33high

V4L2_PIX_FMT_Y16_BE (`Y16 ` | (1 << 31))

Grey-scale image

Description This is a grey-scale image with a depth of 16 bits per pixel. The most significant byte is stored at lower memory addresses (big-endian).

Note:

The actual sampling precision may be lower than 16 bits, for example 10 bits per pixel with values in range 0 to 1023.

Byte Order. Each cell is one byte.

start + 0: start + 8:

Y'

00high

Y'

10high start + 16: Y'

20high start + 24: Y'

30high

Y'

Y'

Y'

Y'

00low

10low

20low

30low

Y'

01high

Y'

11high

Y'

21high

Y'

31high

Y'

01low

Y'

11low

Y'

21low

Y'

31low

Y'

02high

Y'

12high

Y'

22high

Y'

32high

Y'

02low

Y'

12low

Y'

22low

Y'

32low

Y'

03high

Y'

13high

Y'

23high

Y'

33high

Y'

03low

Y'

13low

Y'

23low

Y'

33low

V4L2_PIX_FMT_Y8I (`Y8I `)

Interleaved grey-scale image, e.g. from a stereo-pair

Description This is a grey-scale image with a depth of 8 bits per pixel, but with pixels from 2 sources interleaved. Each pixel is stored in a 16-bit word. E.g. the R200 RealSense camera stores pixel from the left sensor in lower and from the right sensor in the higher 8 bits.

Byte Order. Each cell is one byte.

start + 0: Y'

00left start + 8: Y'

10left start + 16: Y'

20left start + 24: Y'

30left

Y'

00right

Y'

10right

Y'

20right

Y'

30right

Y'

01left

Y'

11left

Y'

21left

Y'

31left

Y'

01right

Y'

11right

Y'

21right

Y'

31right

Y'

02left

Y'

12left

Y'

22left

Y'

32left

Y'

02right

Y'

12right

Y'

22right

Y'

32right

Y'

03left

Y'

13left

Y'

23left

Y'

33left

Y'

03right

Y'

13right

Y'

23right

Y'

33right

78 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2_PIX_FMT_Y12I (`Y12I')

Interleaved grey-scale image, e.g. from a stereo-pair

Description This is a grey-scale image with a depth of 12 bits per pixel, but with pixels from 2 sources interleaved and bit-packed. Each pixel is stored in a 24-bit word in the little-endian order. On a little-endian machine these pixels can be deinterlaced using

__u8 * buf; left0 = 0xfff & * (__u16 * )buf; right0 = * (__u16 * )(buf + 1 ) >> 4 ;

Bit-packed representation. pixels cross the byte boundary and have a ratio of 3 bytes for each interleaved pixel.

Y'

0left[7:0]

Y'

0right[3:0]

Y'

0left[11:8]

Y'

0right[11:4]

V4L2_PIX_FMT_UV8 (`UV8')

UV plane interleaved

Description In this format there is no Y plane, Only CbCr plane. ie (UV interleaved)

Byte Order. Each cell is one byte.

start + 0: start + 4:

Cb

00

Cb

10 start + 8: Cb

20 start + 12: Cb

30

Cr

00

Cr

10

Cr

20

Cr

30

Cb

01

Cb

11

Cb

21

Cb

31

Cr

01

Cr

11

Cr

21

Cr

31

V4L2_PIX_FMT_YUYV (`YUYV')

Packed format with ½ horizontal chroma resolution, also known as YUV 4:2:2

Description In this format each four bytes is two pixels. Each four bytes is two Y's, a Cb and a Cr. Each

Y goes to one of the pixels, and the Cb and Cr belong to both pixels. As you can see, the Cr and Cb components have half the horizontal resolution of the Y component. V4L2_PIX_FMT_YUYV is known in the

Windows environment as YUY2.

Byte Order. Each cell is one byte.

start + 0: Y'

00 start + 8: Y'

10 start + 16: Y'

20 start + 24: Y'

30

Cb

Color Sample Location..

0 1

0 Y C Y

1 Y C Y

2 Y C Y

3 Y C Y

Cb

00

Cb

10

Cb

20

30

2 3

Y C Y

Y C Y

Y C Y

Y C Y

Y'

01

Y'

11

Y'

21

Y'

31

Cr

00

Cr

10

Cr

20

Cr

30

Y'

02

Y'

12

Y'

22

Y'

32

Cb

01

Cb

11

Cb

21

Cb

31

Y'

03

Y'

13

Y'

23

Y'

33

Cr

01

Cr

11

Cr

21

Cr

31

V4L2_PIX_FMT_UYVY (`UYVY')

Variation of V4L2_PIX_FMT_YUYV with different order of samples in memory

1.2. Part I - Video for Linux API 79

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Description In this format each four bytes is two pixels. Each four bytes is two Y's, a Cb and a Cr. Each

Y goes to one of the pixels, and the Cb and Cr belong to both pixels. As you can see, the Cr and Cb components have half the horizontal resolution of the Y component.

Byte Order. Each cell is one byte.

start + 0: Cb

00 start + 8: Cb

10 start + 16: Cb

20 start + 24: Cb

30

Y'

00

Y'

10

Y'

20

Y'

30

Color Sample Location..

0 1 2 3

0 Y C Y Y C Y

1 Y C Y Y C Y

2 Y C Y Y C Y

3 Y C Y Y C Y

Cr

00

Cr

10

Cr

20

Cr

30

Y'

01

Y'

11

Y'

21

Y'

31

Cb

01

Cb

11

Cb

21

Cb

31

Y'

02

Y'

12

Y'

22

Y'

32

Cr

01

Cr

11

Cr

21

Cr

31

Y'

03

Y'

13

Y'

23

Y'

33

V4L2_PIX_FMT_YVYU (`YVYU')

Variation of V4L2_PIX_FMT_YUYV with different order of samples in memory

Description In this format each four bytes is two pixels. Each four bytes is two Y's, a Cb and a Cr. Each

Y goes to one of the pixels, and the Cb and Cr belong to both pixels. As you can see, the Cr and Cb components have half the horizontal resolution of the Y component.

Byte Order. Each cell is one byte.

start + 0: start + 8:

Y'

00

Y'

10 start + 16: Y'

20 start + 24: Y'

30

Cr

Cr

Cr

Cr

00

10

20

30

Color Sample Location..

Y'

Y'

Y'

Y'

01

11

21

31

Cb

00

Cb

10

Cb

20

Cb

30

0 1 2 3

0 Y C Y Y C Y

1 Y C Y Y C Y

2 Y C Y Y C Y

3 Y C Y Y C Y

Y'

Y'

Y'

Y'

02

12

22

32

Cr

Cr

Cr

Cr

01

11

21

31

Y'

Y'

Y'

Y'

03

13

23

33

Cb

Cb

Cb

Cb

01

11

21

31

V4L2_PIX_FMT_VYUY (`VYUY')

Variation of V4L2_PIX_FMT_YUYV with different order of samples in memory

Description In this format each four bytes is two pixels. Each four bytes is two Y's, a Cb and a Cr. Each

Y goes to one of the pixels, and the Cb and Cr belong to both pixels. As you can see, the Cr and Cb components have half the horizontal resolution of the Y component.

Byte Order. Each cell is one byte.

start + 0: start + 8:

Cr

00

Cr

10 start + 16: Cr

20 start + 24: Cr

30

Y'

Y'

Y'

Y'

00

10

20

30

Color Sample Location..

Cb

Cb

Cb

Cb

00

10

20

30

Y'

01

Y'

11

Y'

21

Y'

31

Cr

Cr

Cr

Cr

01

11

21

31

Y'

Y'

Y'

Y'

02

12

22

32

Cb

Cb

Cb

Cb

01

11

21

31

Y'

Y'

Y'

Y'

03

13

23

33

80 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

0 1 2 3

0 Y C Y Y C Y

1 Y C Y Y C Y

2 Y C Y Y C Y

3 Y C Y Y C Y

V4L2_PIX_FMT_Y41P (`Y41P')

Format with ¼ horizontal chroma resolution, also known as YUV 4:1:1

Description In this format each 12 bytes is eight pixels. In the twelve bytes are two CbCr pairs and eight Y's. The first CbCr pair goes with the first four Y's, and the second CbCr pair goes with the other four

Y's. The Cb and Cr components have one fourth the horizontal resolution of the Y component.

Do not confuse this format with

V4L2_PIX_FMT_YUV411P

. Y41P is derived from ``YUV 4:1:1 packed'', while

YUV411P stands for ``YUV 4:1:1 planar''.

Byte Order. Each cell is one byte.

start + 0: Cb

00 start + 12: Cb

10 start + 24: Cb

20 start + 36: Cb

30

Y'

Y'

Y'

Y'

00

10

20

30

Color Sample Location..

Cr

00

Cr

10

Cr

20

Cr

30

Y'

01

Y'

11

Y'

21

Y'

31

Cb

01

Cb

11

Cb

21

Cb

31

Y'

02

Y'

12

Y'

22

Y'

32

Cr

01

Cr

11

Cr

21

Cr

31

Y'

03

Y'

13

Y'

23

Y'

33

Y'

04

Y'

14

Y'

24

Y'

34

Y'

05

Y'

15

Y'

25

Y'

35

Y'

06

Y'

16

Y'

26

Y'

36

Y'

07

Y'

17

Y'

27

Y'

37

0 1 2 3 4 5 6 7

0 Y Y C Y Y Y Y C Y Y

1 Y Y C Y Y Y Y C Y Y

2 Y Y C Y Y Y Y C Y Y

3 Y Y C Y Y Y Y C Y Y

V4L2_PIX_FMT_YVU420 (`YV12'), V4L2_PIX_FMT_YUV420 (`YU12')

V4L2_PIX_FMT_YUV420 Planar formats with ½ horizontal and vertical chroma resolution, also known as

YUV 4:2:0

Description These are planar formats, as opposed to a packed format. The three components are separated into three sub- images or planes. The Y plane is first. The Y plane has one byte per pixel. For

V4L2_PIX_FMT_YVU420, the Cr plane immediately follows the Y plane in memory. The Cr plane is half the width and half the height of the Y plane (and of the image). Each Cr belongs to four pixels, a two-by-two square of the image. For example, Cr

0 belongs to Y'

00

, Y'

01

, Y'

10

, and Y'

11

. Following the Cr plane is the

Cb plane, just like the Cr plane. V4L2_PIX_FMT_YUV420 is the same except the Cb plane comes first, then the Cr plane.

If the Y plane has pad bytes after each row, then the Cr and Cb planes have half as many pad bytes after their rows. In other words, two Cx rows (including padding) is exactly as long as one Y row (including padding).

Byte Order. Each cell is one byte.

1.2. Part I - Video for Linux API 81

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

start + 0: start + 4:

Y'

00

Y'

10 start + 8: Y'

20 start + 12: Y'

30 start + 16: Cr

00 start + 18: Cr

10 start + 20: Cb

00 start + 22: Cb

10

Color Sample Location..

Y'

01

Y'

11

Y'

21

Y'

31

Cr

01

Cr

11

Cb

01

Cb

11

Y'

02

Y'

12

Y'

22

Y'

32

0

0 Y

1

Y

2

Y

3

Y

C C

1 Y Y Y Y

Y'

03

Y'

13

Y'

23

Y'

33

2 Y

C

Y

3 Y Y

Y

Y

C

Y

Y

V4L2_PIX_FMT_YUV420M (`YM12'), V4L2_PIX_FMT_YVU420M (`YM21')

V4L2_PIX_FMT_YVU420M Variation of V4L2_PIX_FMT_YUV420 and V4L2_PIX_FMT_YVU420 with planes non contiguous in memory.

Description This is a multi-planar format, as opposed to a packed format. The three components are separated into three sub-images or planes.

The Y plane is first. The Y plane has one byte per pixel. For V4L2_PIX_FMT_YUV420M the Cb data constitutes the second plane which is half the width and half the height of the Y plane (and of the image). Each Cb belongs to four pixels, a two-by-two square of the image. For example, Cb

0

Y'

11

. The Cr data, just like the Cb plane, is in the third plane.

belongs to Y'

00

, Y'

01

, Y'

10

, and

V4L2_PIX_FMT_YVU420M is the same except the Cr data is stored in the second plane and the Cb data in the third plane.

If the Y plane has pad bytes after each row, then the Cb and Cr planes have half as many pad bytes after their rows. In other words, two Cx rows (including padding) is exactly as long as one Y row (including padding).

V4L2_PIX_FMT_YUV420M and V4L2_PIX_FMT_YVU420M are intended to be used only in drivers and applications that support the multi-planar API, described in

Single- and multi-planar APIs

.

Byte Order. Each cell is one byte.

start0 + 0: start0 + 4: start0 + 8:

Y'

00

Y'

10

Y'

20 start0 + 12: Y'

30

Y'

01

Y'

11

Y'

21

Y'

31

Y'

02

Y'

12

Y'

22

Y'

32

Y'

03

Y'

13

Y'

23

Y'

33 start1 + 0: start1 + 2:

Cb

Cb

00

10

Cb

Cb

01

11 start2 + 0: start2 + 2:

Cr

00

Cr

10

Cr

Cr

01

11

Color Sample Location..

82 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

0

0 Y

1 Y

C

1

Y

Y

2 Y Y

C

3 Y Y

2

Y

Y

C

3

Y

Y

Y Y

C

Y Y

V4L2_PIX_FMT_YUV422M (`YM16'), V4L2_PIX_FMT_YVU422M (`YM61')

V4L2_PIX_FMT_YVU422M Planar formats with ½ horizontal resolution, also known as YUV and YVU 4:2:2

Description This is a multi-planar format, as opposed to a packed format. The three components are separated into three sub-images or planes.

The Y plane is first. The Y plane has one byte per pixel. For V4L2_PIX_FMT_YUV422M the Cb data constitutes the second plane which is half the width of the Y plane (and of the image). Each Cb belongs to two pixels.

For example, Cb

0 belongs to Y'

00

, Y'

01

. The Cr data, just like the Cb plane, is in the third plane.

V4L2_PIX_FMT_YVU422M is the same except the Cr data is stored in the second plane and the Cb data in the third plane.

If the Y plane has pad bytes after each row, then the Cb and Cr planes have half as many pad bytes after their rows. In other words, two Cx rows (including padding) is exactly as long as one Y row (including padding).

V4L2_PIX_FMT_YUV422M and V4L2_PIX_FMT_YVU422M are intended to be used only in drivers and applications that support the multi-planar API, described in

Single- and multi-planar APIs

.

Byte Order. Each cell is one byte.

start0 + 0: start0 + 4:

Y'

00

Y'

10 start0 + 8: Y'

20 start0 + 12: Y'

30

Y'

01

Y'

11

Y'

21

Y'

31

Y'

02

Y'

12

Y'

22

Y'

32

Y'

03

Y'

13

Y'

23

Y'

33 start1 + 0: start1 + 2: start1 + 4: start1 + 6:

Cb

00

Cb

10

Cb

20

Cb

30

Cb

01

Cb

11

Cb

21

Cb

31 start2 + 0: start2 + 2: start2 + 4: start2 + 6:

Cr

00

Cr

10

Cr

20

Cr

30

Cr

01

Cr

11

Cr

21

Cr

31

Color Sample Location..

0 1 2 3

0 Y C Y Y C Y

1 Y C Y Y C Y

2 Y C Y Y C Y

3 Y C Y Y C Y

V4L2_PIX_FMT_YUV444M (`YM24'), V4L2_PIX_FMT_YVU444M (`YM42')

V4L2_PIX_FMT_YVU444M Planar formats with full horizontal resolution, also known as YUV and YVU 4:4:4

1.2. Part I - Video for Linux API 83

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Description This is a multi-planar format, as opposed to a packed format. The three components are separated into three sub-images or planes.

The Y plane is first. The Y plane has one byte per pixel. For V4L2_PIX_FMT_YUV444M the Cb data constitutes the second plane which is the same width and height as the Y plane (and as the image). The Cr data, just like the Cb plane, is in the third plane.

V4L2_PIX_FMT_YVU444M is the same except the Cr data is stored in the second plane and the Cb data in the third plane.

If the Y plane has pad bytes after each row, then the Cb and Cr planes have the same number of pad bytes after their rows.

V4L2_PIX_FMT_YUV444M and V4L2_PIX_FMT_YUV444M are intended to be used only in drivers and applications that support the multi-planar API, described in

Single- and multi-planar APIs

.

Byte Order. Each cell is one byte.

start0 + 0: start0 + 4:

Y'

00

Y'

10 start0 + 8: Y'

20 start0 + 12: Y'

30

Y'

01

Y'

11

Y'

21

Y'

31

Y'

02

Y'

12

Y'

22

Y'

32

Y'

03

Y'

13

Y'

23

Y'

33 start1 + 0: start1 + 4: start1 + 8:

Cb

00

Cb

10

Cb

20 start1 + 12: Cb

20

Cb

01

Cb

11

Cb

21

Cb

21

Cb

02

Cb

12

Cb

22

Cb

32

Cb

03

Cb

13

Cb

23

Cb

33 start2 + 0: start2 + 4:

Cr

00

Cr

10 start2 + 8: Cr

20 start2 + 12: Cr

30

Cr

Cr

Cr

Cr

01

11

21

31

Color Sample Location..

0 1 2 3

0 YC YC YC YC

1 YC YC YC YC

2 YC YC YC YC

3 YC YC YC YC

Cr

02

Cr

12

Cr

22

Cr

32

Cr

03

Cr

13

Cr

23

Cr

33

V4L2_PIX_FMT_YVU410 (`YVU9'), V4L2_PIX_FMT_YUV410 (`YUV9')

V4L2_PIX_FMT_YUV410 Planar formats with ¼ horizontal and vertical chroma resolution, also known as

YUV 4:1:0

Description These are planar formats, as opposed to a packed format. The three components are separated into three sub-images or planes. The Y plane is first. The Y plane has one byte per pixel. For

V4L2_PIX_FMT_YVU410, the Cr plane immediately follows the Y plane in memory. The Cr plane is ¼ the width and ¼ the height of the Y plane (and of the image). Each Cr belongs to 16 pixels, a four-by-four square of the image. Following the Cr plane is the Cb plane, just like the Cr plane. V4L2_PIX_FMT_YUV410 is the same, except the Cb plane comes first, then the Cr plane.

If the Y plane has pad bytes after each row, then the Cr and Cb planes have ¼ as many pad bytes after their rows. In other words, four Cx rows (including padding) are exactly as long as one Y row (including padding).

Byte Order. Each cell is one byte.

84 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

start + 0: start + 4:

Y'

00

Y'

10 start + 8: Y'

20 start + 12: Y'

30 start + 16: Cr

00 start + 17: Cb

00

Y'

Y'

Y'

Y'

01

11

21

31

Color Sample Location..

0

0 Y

1

Y

2

Y

3

Y

Y'

02

Y'

12

Y'

22

Y'

32

Y'

03

Y'

13

Y'

23

Y'

33

1

2

3

Y

Y

Y

Y

C

Y

Y Y

Y Y

Y

Y

Y

V4L2_PIX_FMT_YUV422P (`422P')

Format with ½ horizontal chroma resolution, also known as YUV 4:2:2. Planar layout as opposed to

V4L2_PIX_FMT_YUYV

Description This format is not commonly used. This is a planar version of the YUYV format. The three components are separated into three sub-images or planes. The Y plane is first. The Y plane has one byte per pixel. The Cb plane immediately follows the Y plane in memory. The Cb plane is half the width of the Y plane (and of the image). Each Cb belongs to two pixels. For example, Cb the Cb plane is the Cr plane, just like the Cb plane.

0 belongs to Y'

00

, Y'

01

. Following

If the Y plane has pad bytes after each row, then the Cr and Cb planes have half as many pad bytes after their rows. In other words, two Cx rows (including padding) is exactly as long as one Y row (including padding).

Byte Order. Each cell is one byte.

Y'

03

Y'

13

Y'

23

Y'

33 start + 0: start + 4: start + 8:

Y'

00

Y'

10

Y'

20 start + 12: Y'

30 start + 16: Cb

00 start + 18: Cb

10 start + 20: Cb

20 start + 22: Cb

30 start + 24: Cr

00 start + 26: Cr

10 start + 28: Cr

20 start + 30: Cr

30

Color Sample Location..

Y'

01

Y'

11

Y'

21

Y'

31

Cb

01

Cb

11

Cb

21

Cb

31

Cr

01

Cr

11

Cr

21

Cr

31

Y'

02

Y'

12

Y'

22

Y'

32

0 1 2 3

0 Y C Y Y C Y

1 Y C Y Y C Y

2 Y C Y Y C Y

3 Y C Y Y C Y

1.2. Part I - Video for Linux API 85

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2_PIX_FMT_YUV411P (`411P')

Format with ¼ horizontal chroma resolution, also known as YUV 4:1:1. Planar layout as opposed to

V4L2_PIX_FMT_Y41P

Description This format is not commonly used. This is a planar format similar to the 4:2:2 planar format except with half as many chroma. The three components are separated into three sub-images or planes.

The Y plane is first. The Y plane has one byte per pixel. The Cb plane immediately follows the Y plane in memory. The Cb plane is ¼ the width of the Y plane (and of the image). Each Cb belongs to 4 pixels all on the same row. For example, Cb

0 plane, just like the Cb plane.

belongs to Y'

00

, Y'

01

, Y'

02 and Y'

03

. Following the Cb plane is the Cr

If the Y plane has pad bytes after each row, then the Cr and Cb planes have ¼ as many pad bytes after their rows. In other words, four C x rows (including padding) is exactly as long as one Y row (including padding).

Byte Order. Each cell is one byte.

Y'

03

Y'

13

Y'

23

Y'

33 start + 0: start + 4: start + 8:

Y'

00

Y'

10

Y'

20 start + 12: Y'

30 start + 16: Cb

00 start + 17: Cb

10 start + 18: Cb

20 start + 19: Cb

30 start + 20: Cr

00 start + 21: Cr

10 start + 22: Cr

20 start + 23: Cr

30

Y'

01

Y'

11

Y'

21

Y'

31

Color Sample Location..

Y'

02

Y'

12

Y'

22

Y'

32

0 1 2 3

0 Y Y C Y Y

1 Y Y C Y Y

2 Y Y C Y Y

3 Y Y C Y Y

V4L2_PIX_FMT_NV12 (`NV12'), V4L2_PIX_FMT_NV21 (`NV21')

V4L2_PIX_FMT_NV21 Formats with ½ horizontal and vertical chroma resolution, also known as YUV

4:2:0.

One luminance and one chrominance plane with alternating chroma samples as opposed to

V4L2_PIX_FMT_YVU420

Description These are two-plane versions of the YUV 4:2:0 format. The three components are separated into two sub-images or planes. The Y plane is first. The Y plane has one byte per pixel. For

V4L2_PIX_FMT_NV12, a combined CbCr plane immediately follows the Y plane in memory. The CbCr plane is the same width, in bytes, as the Y plane (and of the image), but is half as tall in pixels. Each CbCr pair belongs to four pixels. For example, Cb

0

/Cr

0 belongs to Y'

00

, Y'

01

, Y'

10

, Y'

11

. V4L2_PIX_FMT_NV21 is the same except the Cb and Cr bytes are swapped, the CrCb plane starts with a Cr byte.

If the Y plane has pad bytes after each row, then the CbCr plane has as many pad bytes after its rows.

Byte Order. Each cell is one byte.

86 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

start + 0: start + 4:

Y'

00

Y'

10 start + 8: Y'

20 start + 12: Y'

30 start + 16: Cb

00 start + 20: Cb

10

Y'

01

Y'

11

Y'

21

Y'

31

Cr

00

Cr

10

Color Sample Location..

0

0 Y

1

Y

2

Y

3

Y

C C

1 Y Y Y Y

Y'

02

Y'

12

Y'

22

Y'

32

Cb

01

Cb

11

Y'

03

Y'

13

Y'

23

Y'

33

Cr

01

Cr

11

2 Y

C

Y Y

3 Y Y Y

C

Y

Y

V4L2_PIX_FMT_NV12M (`NM12'), V4L2_PIX_FMT_NV21M (`NM21'), V4L2_PIX_FMT_NV12MT_16X16

V4L2_PIX_FMT_NV21M V4L2_PIX_FMT_NV12MT_16X16 Variation of V4L2_PIX_FMT_NV12 and

V4L2_PIX_FMT_NV21 with planes non contiguous in memory.

Description This is a multi-planar, two-plane version of the YUV 4:2:0 format. The three components are separated into two sub-images or planes. V4L2_PIX_FMT_NV12M differs from V4L2_PIX_FMT_NV12 in that the two planes are non-contiguous in memory, i.e. the chroma plane do not necessarily immediately follows the luma plane. The luminance data occupies the first plane. The Y plane has one byte per pixel.

In the second plane there is a chrominance data with alternating chroma samples. The CbCr plane is the same width, in bytes, as the Y plane (and of the image), but is half as tall in pixels. Each CbCr pair belongs to four pixels. For example, Cb

0

/Cr

0 belongs to Y'

00

, Y'

01

, Y'

10

, Y'

11

. V4L2_PIX_FMT_NV12MT_16X16 is the tiled version of V4L2_PIX_FMT_NV12M with 16x16 macroblock tiles. Here pixels are arranged in

16x16 2D tiles and tiles are arranged in linear order in memory. V4L2_PIX_FMT_NV21M is the same as

V4L2_PIX_FMT_NV12M except the Cb and Cr bytes are swapped, the CrCb plane starts with a Cr byte.

V4L2_PIX_FMT_NV12M is intended to be used only in drivers and applications that support the multi-planar

API, described in

Single- and multi-planar APIs

.

If the Y plane has pad bytes after each row, then the CbCr plane has as many pad bytes after its rows.

Byte Order. Each cell is one byte.

start0 + 0: start0 + 4: start0 + 8:

Y'

00

Y'

10

Y'

20 start0 + 12: Y'

30

Y'

01

Y'

11

Y'

21

Y'

31

Y'

02

Y'

12

Y'

22

Y'

32

Y'

03

Y'

13

Y'

23

Y'

33 start1 + 0: start1 + 4:

Cb

00

Cb

10

Cr

Cr

00

10

Color Sample Location..

0

0 Y

1 2

Y Y

3

Y

C C

1 Y Y Y Y

Cb

01

Cb

11

Cr

01

Cr

11

2

3

Y

Y

C

Y

Y

Y

Y

Y

C

Y

1.2. Part I - Video for Linux API 87

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2_PIX_FMT_NV12MT (`TM12')

Formats with ½ horizontal and vertical chroma resolution. This format has two planes - one for luminance and one for chrominance. Chroma samples are interleaved. The difference to V4L2_PIX_FMT_NV12 is the memory layout. Pixels are grouped in macroblocks of 64x32 size. The order of macroblocks in memory is also not standard.

Description This is the two-plane versions of the YUV 4:2:0 format where data is grouped into 64x32 macroblocks. The three components are separated into two sub-images or planes. The Y plane has one byte per pixel and pixels are grouped into 64x32 macroblocks. The CbCr plane has the same width, in bytes, as the Y plane (and the image), but is half as tall in pixels. The chroma plane is also grouped into

64x32 macroblocks.

Width of the buffer has to be aligned to the multiple of 128, and height alignment is 32. Every four adjacent buffers - two horizontally and two vertically are grouped together and are located in memory in

Z or flipped Z order.

Layout of macroblocks in memory is presented in the following figure.

Figure 1.4: V4L2_PIX_FMT_NV12MT macroblock Z shape memory layout

The requirement that width is multiple of 128 is implemented because, the Z shape cannot be cut in half horizontally. In case the vertical resolution of macroblocks is odd then the last row of macroblocks is arranged in a linear order.

In case of chroma the layout is identical. Cb and Cr samples are interleaved. Height of the buffer is aligned to 32.

Figure 1.5: Example V4L2_PIX_FMT_NV12MT memory layout of macroblocks

Memory layout of macroblocks of V4L2_PIX_FMT_NV12MT format in most extreme case.

V4L2_PIX_FMT_NV16 (`NV16'), V4L2_PIX_FMT_NV61 (`NV61')

V4L2_PIX_FMT_NV61 Formats with ½ horizontal chroma resolution, also known as YUV 4:2:2. One luminance and one chrominance plane with alternating chroma samples as opposed to V4L2_PIX_FMT_YVU420

Description These are two-plane versions of the YUV 4:2:2 format. The three components are separated into two sub-images or planes. The Y plane is first. The Y plane has one byte per pixel. For

V4L2_PIX_FMT_NV16, a combined CbCr plane immediately follows the Y plane in memory. The CbCr plane is the same width and height, in bytes, as the Y plane (and of the image). Each CbCr pair belongs to two pixels. For example, Cb

0

/Cr

0 belongs to Y'

00

, Y'

01

. V4L2_PIX_FMT_NV61 is the same except the Cb and Cr bytes are swapped, the CrCb plane starts with a Cr byte.

If the Y plane has pad bytes after each row, then the CbCr plane has as many pad bytes after its rows.

Byte Order. Each cell is one byte.

start + 0: start + 4: start + 8:

Y'

00

Y'

10

Y'

20 start + 12: Y'

30 start + 16: Cb

00 start + 20: Cb

10 start + 24: Cb

20 start + 28: Cb

30

Y'

01

Y'

11

Y'

21

Y'

31

Cr

00

Cr

10

Cr

20

Cr

30

Y'

02

Y'

12

Y'

22

Y'

32

Cb

01

Cb

11

Cb

21

Cb

31

Y'

03

Y'

13

Y'

23

Y'

33

Cr

01

Cr

11

Cr

21

Cr

31

88 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Color Sample Location..

0

0 Y

1

Y

2

Y

3

Y

C C

1 Y Y Y Y

C C

2 Y Y Y

3 Y

C

C

Y Y

C

C

Y

Y

V4L2_PIX_FMT_NV16M (`NM16'), V4L2_PIX_FMT_NV61M (`NM61')

V4L2_PIX_FMT_NV61M Variation of V4L2_PIX_FMT_NV16 and V4L2_PIX_FMT_NV61 with planes non contiguous in memory.

Description This is a multi-planar, two-plane version of the YUV 4:2:2 format. The three components are separated into two sub-images or planes. V4L2_PIX_FMT_NV16M differs from V4L2_PIX_FMT_NV16 in that the two planes are non-contiguous in memory, i.e. the chroma plane does not necessarily immediately follow the luma plane. The luminance data occupies the first plane. The Y plane has one byte per pixel.

In the second plane there is chrominance data with alternating chroma samples. The CbCr plane is the same width and height, in bytes, as the Y plane. Each CbCr pair belongs to two pixels. For example,

Cb

0

/Cr

0 belongs to Y'

00

, Y'

01

. V4L2_PIX_FMT_NV61M is the same as V4L2_PIX_FMT_NV16M except the Cb and Cr bytes are swapped, the CrCb plane starts with a Cr byte.

V4L2_PIX_FMT_NV16M and V4L2_PIX_FMT_NV61M are intended to be used only in drivers and applications that support the multi-planar API, described in

Single- and multi-planar APIs

.

Byte Order. Each cell is one byte.

start0 + 0: start0 + 4:

Y'

00

Y'

10 start0 + 8: Y'

20 start0 + 12: Y'

30

Y'

01

Y'

11

Y'

21

Y'

31

Y'

02

Y'

12

Y'

22

Y'

32

Y'

03

Y'

13

Y'

23

Y'

33 start1 + 0: start1 + 4: start1 + 8:

Cb

00

Cb

10

Cb

20 start1 + 12: Cb

30

Cr

00

Cr

10

Cr

20

Cr

30

Color Sample Location..

0

0 Y

1

Y

2

Y

3

Y

C C

1 Y Y Y Y

C C

Cb

02

Cb

12

Cb

22

Cb

32

Cr

02

Cr

12

Cr

22

Cr

32

2 Y

C

Y Y

3 Y Y Y

C

C

C

Y

Y

1.2. Part I - Video for Linux API 89

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2_PIX_FMT_NV24 (`NV24'), V4L2_PIX_FMT_NV42 (`NV42')

V4L2_PIX_FMT_NV42 Formats with full horizontal and vertical chroma resolutions, also known as YUV

4:4:4.

One luminance and one chrominance plane with alternating chroma samples as opposed to

V4L2_PIX_FMT_YVU420

Description These are two-plane versions of the YUV 4:4:4 format. The three components are separated into two sub-images or planes. The Y plane is first, with each Y sample stored in one byte per pixel. For

V4L2_PIX_FMT_NV24, a combined CbCr plane immediately follows the Y plane in memory. The CbCr plane has the same width and height, in pixels, as the Y plane (and the image). Each line contains one CbCr pair per pixel, with each Cb and Cr sample stored in one byte. V4L2_PIX_FMT_NV42 is the same except that the Cb and Cr samples are swapped, the CrCb plane starts with a Cr sample.

If the Y plane has pad bytes after each row, then the CbCr plane has twice as many pad bytes after its rows.

Byte Order. Each cell is one byte.

start + 0: start + 4: start + 8:

Y'

00

Y'

10

Y'

20 start + 12: Y'

30 start + 16: Cb

00 start + 24: Cb

10 start + 32: Cb

20 start + 40: Cb

30

Y'

01

Y'

11

Y'

21

Y'

31

Cr

00

Cr

10

Cr

20

Cr

30

Y'

02

Y'

12

Y'

22

Y'

32

Cb

01

Cb

11

Cb

21

Cb

31

Y'

03

Y'

13

Y'

23

Y'

33

Cr

01

Cr

11

Cr

21

Cr

31

Cb

Cb

Cb

Cb

02

12

22

32

Cr

Cr

Cr

Cr

02

12

22

32

Cb

Cb

Cb

Cb

03

13

23

33

Cr

Cr

Cr

Cr

03

13

23

33

V4L2_PIX_FMT_M420 (`M420')

Format with ½ horizontal and vertical chroma resolution, also known as YUV 4:2:0. Hybrid plane lineinterleaved layout.

Description M420 is a YUV format with ½ horizontal and vertical chroma subsampling (YUV 4:2:0).

Pixels are organized as interleaved luma and chroma planes. Two lines of luma data are followed by one line of chroma data.

The luma plane has one byte per pixel. The chroma plane contains interleaved CbCr pixels subsampled by ½ in the horizontal and vertical directions. Each CbCr pair belongs to four pixels. For example, Cb

0

/Cr

0 belongs to Y'

00

, Y'

01

, Y'

10

, Y'

11

.

All line lengths are identical: if the Y lines include pad bytes so do the CbCr lines.

Byte Order. Each cell is one byte.

start + 0: start + 4:

Y'

00

Y'

10 start + 8: Cb

00 start + 16: Y'

20 start + 20: Y'

30 start + 24: Cb

10

Y'

Y'

Cr

Y'

Y'

Cr

01

11

00

21

31

10

Color Sample Location..

Y'

Y'

Y'

Y'

02

12

Cb

22

32

Cb

01

11

Y'

03

Y'

13

Cr

01

Y'

23

Y'

33

Cr

11

90 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

0

0 Y

1 Y

C

1 2

Y Y

Y Y

C

3

Y

Y

2 Y Y Y Y

C C

3 Y Y Y Y

HSV Formats

These formats store the color information of the image in a geometrical representation. The colors are mapped into a cylinder, where the angle is the HUE, the height is the VALUE and the distance to the center is the SATURATION. This is a very useful format for image segmentation algorithms.

Packed HSV formats

Description The hue (h) is measured in degrees, the equivalence between degrees and LSBs depends on the hsv-encoding used, see

Colorspaces

. The saturation (s) and the value (v) are measured in percent-

age of the cylinder: 0 being the smallest value and 255 the maximum.

The values are packed in 24 or 32 bit formats.

Identifier Code

Bit

Byte 0 in memory

7 6 5 4 3

V4L2_PIX_FMT_HSV32

V4L2_PIX_FMT_HSV24

`HSV4'

`HSV3' h

7 h

6 h

5 h

4 h

3

Bit 7 is the most significant bit.

2 1 0 h

2 h

1 h

0

Table 1.23: Packed HSV Image Formats

Byte 1

7 6 5 4 3 2 1 0

Byte 2

7 6 h

7 s

7 h s

6

6 h s

5

5 h s

4

4 h s

3

3 h s

2

2 h s

1

1 h s

0

0 s v

7

7 s

6 v

6

5 s

5 v

5

4 s

4 v

4

3 s

3 v

3

2 s

2 v

2

1 s

1 v

1

0 s

0 v

0

Byte 3

7 6 v

7 v

6

5 v

5

4 v

4

3 v

3

2 v

2

1 v

1

0 v

0

Depth Formats

Depth data provides distance to points, mapped onto the image plane

V4L2_PIX_FMT_Z16 (`Z16 `)

16-bit depth data with distance values at each pixel

Description This is a 16-bit format, representing depth data. Each pixel is a distance to the respective point in the image coordinates. Distance unit can vary and has to be negotiated with the device separately.

Each pixel is stored in a 16-bit word in the little endian byte order.

Byte Order. Each cell is one byte.

start + 0: start + 8:

Z

00low

Z

10low start + 16: Z

20low start + 24: Z

30low

Z

Z

Z

Z

00high

10high

20high

30high

Z

Z

Z

Z

01low

11low

21low

31low

Z

Z

Z

Z

01high

11high

21high

31high

Z

Z

Z

Z

02low

12low

22low

32low

Z

Z

Z

Z

02high

12high

22high

32high

Z

Z

Z

Z

03low

13low

23low

33low

Z

Z

Z

Z

03high

13high

23high

33high

1.2. Part I - Video for Linux API 91

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Compressed Formats

Identifier

V4L2_PIX_FMT_JPEG

V4L2_PIX_FMT_MPEG

V4L2_PIX_FMT_H264

V4L2_PIX_FMT_H264_NO_SC

V4L2_PIX_FMT_H264_MVC

V4L2_PIX_FMT_H263

V4L2_PIX_FMT_MPEG1

V4L2_PIX_FMT_MPEG2

V4L2_PIX_FMT_MPEG4

V4L2_PIX_FMT_XVID

V4L2_PIX_FMT_VC1_ANNEX_G

V4L2_PIX_FMT_VC1_ANNEX_L

V4L2_PIX_FMT_VP8

V4L2_PIX_FMT_VP9

Table 1.24: Compressed Image Formats

Code Details

`JPEG'

`MPEG'

TBD.

See also VIDIOC_G_JPEGCOMP,

VID-

IOC_S_JPEGCOMP.

MPEG multiplexed stream.

The actual format is determined by extended control

V4L2_CID_MPEG_STREAM_TYPE, see

Codec Control

IDs

.

`H264'

`AVC1'

`M264'

`H263'

H264 video elementary stream with start codes.

H264 video elementary stream without start codes.

H264 MVC video elementary stream.

H263 video elementary stream.

`MPG1'

`MPG2'

`MPG4'

`XVID'

`VC1G'

`VC1L'

`VP80'

`VP90'

MPEG1 video elementary stream.

MPEG2 video elementary stream.

MPEG4 video elementary stream.

Xvid video elementary stream.

VC1, SMPTE 421M Annex G compliant stream.

VC1, SMPTE 421M Annex L compliant stream.

VP8 video elementary stream.

VP9 video elementary stream.

SDR Formats

These formats are used for

SDR

interface only.

V4L2_SDR_FMT_CU8 (`CU08')

Complex unsigned 8-bit IQ sample

Description This format contains sequence of complex number samples. Each complex number consist two parts, called In-phase and Quadrature (IQ). Both I and Q are represented as a 8 bit unsigned number.

I value comes first and Q value after that.

Byte Order. Each cell is one byte.

start + 0: I'

0 start + 1: Q'

0

V4L2_SDR_FMT_CU16LE (`CU16')

Complex unsigned 16-bit little endian IQ sample

92 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Description This format contains sequence of complex number samples. Each complex number consist two parts, called In-phase and Quadrature (IQ). Both I and Q are represented as a 16 bit unsigned little endian number. I value comes first and Q value after that.

Byte Order. Each cell is one byte.

start + 0: I'

0[7:0] start + 2: Q'

0[7:0]

I'

0[15:8]

Q'

0[15:8]

V4L2_SDR_FMT_CS8 (`CS08')

Complex signed 8-bit IQ sample

Description This format contains sequence of complex number samples. Each complex number consist two parts, called In-phase and Quadrature (IQ). Both I and Q are represented as a 8 bit signed number. I value comes first and Q value after that.

Byte Order. Each cell is one byte.

start + 0: I'

0 start + 1: Q'

0

V4L2_SDR_FMT_CS14LE (`CS14')

Complex signed 14-bit little endian IQ sample

Description This format contains sequence of complex number samples. Each complex number consist two parts, called In-phase and Quadrature (IQ). Both I and Q are represented as a 14 bit signed little endian number. I value comes first and Q value after that. 14 bit value is stored in 16 bit space with unused high bits padded with 0.

Byte Order. Each cell is one byte.

start + 0: I'

0[7:0] start + 2: Q'

0[7:0]

I'

0[13:8]

Q'

0[13:8]

V4L2_SDR_FMT_RU12LE (`RU12')

Real unsigned 12-bit little endian sample

Description This format contains sequence of real number samples. Each sample is represented as a

12 bit unsigned little endian number. Sample is stored in 16 bit space with unused high bits padded with

0.

Byte Order. Each cell is one byte.

start + 0: I'

0[7:0]

I'

0[11:8]

Touch Formats

These formats are used for

Touch Devices

interface only.

1.2. Part I - Video for Linux API 93

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2_TCH_FMT_DELTA_TD16 (`TD16')

man V4L2_TCH_FMT_DELTA_TD16(2)

16-bit signed Touch Delta

Description This format represents delta data from a touch controller.

Delta values may range from -32768 to 32767. Typically the values will vary through a small range depending on whether the sensor is touched or not. The full value may be seen if one of the touchscreen nodes has a fault or the line is not connected.

Byte Order. Each cell is one byte.

start + 0: start + 8:

D'

00high

D'

10high start + 16: D'

20high start + 24: D'

30high

D'

D'

D'

D'

00low

10low

20low

30low

D'

01high

D'

11high

D'

21high

D'

31high

D'

D'

D'

D'

01low

11low

21low

31low

D'

D'

D'

D'

02high

12high

22high

32high

D'

D'

D'

D'

02low

12low

22low

32low

D'

D'

D'

D'

03high

13high

23high

33high

D'

D'

D'

D'

03low

13low

23low

33low

V4L2_TCH_FMT_DELTA_TD08 (`TD08')

man V4L2_TCH_FMT_DELTA_TD08(2)

8-bit signed Touch Delta

Description This format represents delta data from a touch controller.

Delta values may range from -128 to 127. Typically the values will vary through a small range depending on whether the sensor is touched or not. The full value may be seen if one of the touchscreen nodes has a fault or the line is not connected.

Byte Order. Each cell is one byte.

start + 0: start + 4: start + 8:

D'

00

D'

10

D'

20 start + 12: D'

30

D'

01

D'

11

D'

21

D'

31

D'

02

D'

12

D'

22

D'

32

D'

03

D'

13

D'

23

D'

33

V4L2_TCH_FMT_TU16 (`TU16')

man V4L2_TCH_FMT_TU16(2)

16-bit unsigned raw touch data

Description This format represents unsigned 16-bit data from a touch controller.

This may be used for output for raw and reference data. Values may range from 0 to 65535.

Byte Order. Each cell is one byte.

start + 0: start + 8:

R'

00high

R'

10high start + 16: R'

20high start + 24: R'

30high

R'

R'

R'

R'

00low

10low

20low

30low

R'

01high

R'

11high

R'

21high

R'

31high

R'

R'

R'

R'

01low

11low

21low

31low

R'

R'

R'

R'

02high

12high

22high

32high

R'

R'

R'

R'

02low

12low

22low

32low

R'

R'

R'

R'

03high

13high

23high

33high

R'

R'

R'

R'

03low

13low

23low

33low

94 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2_TCH_FMT_TU08 (`TU08')

man V4L2_TCH_FMT_TU08(2)

8-bit unsigned raw touch data

Description This format represents unsigned 8-bit data from a touch controller.

This may be used for output for raw and reference data. Values may range from 0 to 255.

Byte Order. Each cell is one byte.

start + 0: start + 4:

R'

00

R'

10 start + 8: R'

20 start + 12: R'

30

R'

R'

R'

R'

01

11

21

31

R'

R'

R'

R'

02

12

22

32

R'

03

R'

13

R'

23

R'

33

Reserved Format Identifiers

These formats are not defined by this specification, they are just listed for reference and to avoid naming conflicts. If you want to register your own format, send an e-mail to the linux-media mailing list https://linuxtv.org/lists.php

for inclusion in the videodev2.h file. If you want to share your format with other developers add a link to your documentation and send a copy to the linux-media mailing list for inclusion in this section. If you think your format should be listed in a standard format section please make a proposal on the linux-media mailing list.

Table 1.25: Reserved Image Formats

Identifier

V4L2_PIX_FMT_DV

V4L2_PIX_FMT_ET61X251

V4L2_PIX_FMT_HI240

V4L2_PIX_FMT_HM12

V4L2_PIX_FMT_CPIA1

V4L2_PIX_FMT_JPGL

V4L2_PIX_FMT_SPCA501

V4L2_PIX_FMT_SPCA505

V4L2_PIX_FMT_SPCA508

V4L2_PIX_FMT_SPCA561

V4L2_PIX_FMT_PAC207

V4L2_PIX_FMT_MR97310A

V4L2_PIX_FMT_JL2005BCD

V4L2_PIX_FMT_OV511

V4L2_PIX_FMT_OV518

V4L2_PIX_FMT_PJPG

V4L2_PIX_FMT_SE401

Code

`dvsd'

`E625'

`HI24'

`HM12'

`CPIA'

`JPGL'

`S501'

`S505'

`S508'

`S561'

`P207'

`M310'

`JL20'

`O511'

`O518'

`PJPG'

`S401'

Details unknown

Compressed format of the ET61X251 driver.

8 bit RGB format used by the BTTV driver.

YUV 4:2:0 format used by the IVTV driver, http://www.ivtvdriver.org/

The format is documented in the kernel sources in the file Documentation/video4linux/cx2341x/README.hm12

YUV format used by the gspca cpia1 driver.

JPEG-Light format (Pegasus Lossless JPEG) used in Divio webcams NW 80x.

YUYV per line used by the gspca driver.

YYUV per line used by the gspca driver.

YUVY per line used by the gspca driver.

Compressed GBRG Bayer format used by the gspca driver.

Compressed BGGR Bayer format used by the gspca driver.

Compressed BGGR Bayer format used by the gspca driver.

JPEG compressed RGGB Bayer format used by the gspca driver.

OV511 JPEG format used by the gspca driver.

OV518 JPEG format used by the gspca driver.

Pixart 73xx JPEG format used by the gspca driver.

Compressed RGB format used by the gspca se401 driver

Continued on next page

1.2. Part I - Video for Linux API 95

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Identifier

V4L2_PIX_FMT_SQ905C

V4L2_PIX_FMT_MJPEG

V4L2_PIX_FMT_PWC1

V4L2_PIX_FMT_PWC2

V4L2_PIX_FMT_SN9C10X

V4L2_PIX_FMT_SN9C20X_I420

V4L2_PIX_FMT_SN9C2028

V4L2_PIX_FMT_STV0680

V4L2_PIX_FMT_WNVA

Table 1.25 -- continued from previous page

Code

`905C'

Details

Compressed RGGB bayer format used by the gspca driver.

`MJPG'

`PWC1'

`PWC2'

`S910'

`S920'

`SONX'

`S680'

`WNVA'

Compressed format used by the Zoran driver

Compressed format of the PWC driver.

Compressed format of the PWC driver.

Compressed format of the SN9C102 driver.

YUV 4:2:0 format of the gspca sn9c20x driver.

Compressed GBRG bayer format of the gspca sn9c2028 driver.

Bayer format of the gspca stv0680 driver.

Used by the Winnov Videum driver, http://www.thedirks.org/winnov/

V4L2_PIX_FMT_TM6000

V4L2_PIX_FMT_CIT_YYVYUY

`TM60'

`CITV'

V4L2_PIX_FMT_KONICA420

V4L2_PIX_FMT_YYUV

V4L2_PIX_FMT_Y4

V4L2_PIX_FMT_Y6

`KONI'

`YYUV'

`Y04 `

`Y06 `

Used by Trident tm6000

Used by xirlink CIT, found at IBM webcams.

Uses one line of Y then 1 line of VYUY

Used by Konica webcams.

YUV420 planar in blocks of 256 pixels.

unknown

Old 4-bit greyscale format. Only the most significant 4 bits of each byte are used, the other bits are set to 0.

Old 6-bit greyscale format. Only the most significant 6 bits of each byte are used, the other bits are set to 0.

Continued on next page

96 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Identifier

V4L2_PIX_FMT_S5C_UYVY_JPG

Table 1.25 -- continued from previous page

Code

`S5CI'

Details

Two-planar format used by Samsung S5C73MX cameras.

The first plane contains interleaved

JPEG and UYVY image data, followed by meta data in form of an array of offsets to the UYVY data blocks. The actual pointer array follows immediately the interleaved JPEG/UYVY data, the number of entries in this array equals the height of the

UYVY image. Each entry is a 4-byte unsigned integer in big endian order and it's an offset to a single pixel line of the UYVY image. The first plane can start either with JPEG or UYVY data chunk. The size of a single UYVY block equals the UYVY image's width multiplied by 2. The size of a JPEG chunk depends on the image and can vary with each line.

The second plane, at an offset of 4084 bytes, contains a 4-byte offset to the pointer array in the first plane. This offset is followed by a 4-byte value indicating size of the pointer array. All numbers in the second plane are also in big endian order.

Remaining data in the second plane is undefined.

The information in the second plane allows to easily find location of the pointer array, which can be different for each frame. The size of the pointer array is constant for given UYVY image height.

In order to extract UYVY and JPEG frames an application can initially set a data pointer to the start of first plane and then add an offset from the first entry of the pointers table. Such a pointer indicates start of an UYVY image pixel line. Whole UYVY line can be copied to a separate buffer. These steps should be repeated for each line, i.e. the number of entries in the pointer array. Anything what's in between the UYVY lines is JPEG data and should be concatenated to form the JPEG stream.

V4L2_PIX_FMT_MT21C `MT21' Compressed two-planar YVU420 format used by Mediatek MT8173.

The compression is lossless.

It is an opaque intermediate format and the MDP hardware must be used to convert V4L2_PIX_FMT_MT21C to

V4L2_PIX_FMT_NV12M, V4L2_PIX_FMT_YUV420M or V4L2_PIX_FMT_YVU420.

V4L2_PIX_FMT_FLAG_PREMUL_ALPHA

Table 1.26: Format Flags

0x00000001 The color values are premultiplied by the alpha channel value. For example, if a light blue pixel with 50% transparency was described by RGBA values (128, 192, 255, 128), the same pixel described with premultiplied colors would be described by RGBA values (64, 96, 128, 128)

1.2. Part I - Video for Linux API 97

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

1.2.3 Input/Output

The V4L2 API defines several different methods to read from or write to a device. All drivers exchanging data with applications must support at least one of them.

The classic I/O method using the read() and write() function is automatically selected after opening a V4L2 device. When the driver does not support this method attempts to read or write will fail at any time.

Other methods must be negotiated. To select the streaming I/O method with memory mapped or user buffers applications call the ioctl VIDIOC_REQBUFS ioctl. The asynchronous I/O method is not defined yet.

Video overlay can be considered another I/O method, although the application does not directly receive the image data. It is selected by initiating video overlay with the VIDIOC_S_FMT ioctl. For more information see

Video Overlay Interface

.

Generally exactly one I/O method, including overlay, is associated with each file descriptor. The only exceptions are applications not exchanging data with a driver (``panel applications'', see

Opening and

Closing Devices

) and drivers permitting simultaneous video capturing and overlay using the same file

descriptor, for compatibility with V4L and earlier versions of V4L2.

VIDIOC_S_FMT and ioctl VIDIOC_REQBUFS would permit this to some degree, but for simplicity drivers need not support switching the I/O method (after first switching away from read/write) other than by closing and reopening the device.

The following sections describe the various I/O methods in more detail.

Read/Write

Input and output devices support the read() and write() function, respectively, when the

V4L2_CAP_READWRITE flag in the capabilities field of struct v4l2_capability returned by the ioctl

VIDIOC_QUERYCAP ioctl is set.

Drivers may need the CPU to copy the data, but they may also support DMA to or from user memory, so this I/O method is not necessarily less efficient than other methods merely exchanging buffer pointers. It is considered inferior though because no meta-information like frame counters or timestamps are passed.

This information is necessary to recognize frame dropping and to synchronize with other data streams.

However this is also the simplest I/O method, requiring little or no setup to exchange data. It permits command line stunts like this (the vidctrl tool is fictitious):

$ vidctrl /dev/video --input=0 --format=YUYV --size=352x288

$ dd if=/dev/video of=myimage.422 bs=202752 count=1

To read from the device applications use the read() function, to write the write() function. Drivers must implement one I/O method if they exchange data with applications, but it need not be this.

9

When reading or writing is supported, the driver must also support the select() and poll() function.

10

Streaming I/O (Memory Mapping)

Input and output devices support this I/O method when the V4L2_CAP_STREAMING flag in the capabilities field of struct v4l2_capability returned by the ioctl VIDIOC_QUERYCAP ioctl is set. There are two streaming methods, to determine if the memory mapping flavor is supported applications must call the

ioctl VIDIOC_REQBUFS ioctl with the memory type set to V4L2_MEMORY_MMAP.

Streaming is an I/O method where only pointers to buffers are exchanged between application and driver, the data itself is not copied. Memory mapping is primarily intended to map buffers in device memory into the application's address space. Device memory can be for example the video memory on a graphics

9

It would be desirable if applications could depend on drivers supporting all I/O interfaces, but as much as the complex memory mapping I/O can be inadequate for some devices we have no reason to require this interface, which is most useful for simple applications capturing still images.

10

At the driver level select() and poll() are the same, and select() is too important to be optional.

98 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

card with a video capture add-on. However, being the most efficient I/O method available for a long time, many other drivers support streaming as well, allocating buffers in DMA-able main memory.

A driver can support many sets of buffers. Each set is identified by a unique buffer type value. The sets are independent and each set can hold a different type of data. To access different sets at the same time different file descriptors must be used.

11

To allocate device buffers applications call the ioctl VIDIOC_REQBUFS ioctl with the desired number of buffers and buffer type, for example V4L2_BUF_TYPE_VIDEO_CAPTURE. This ioctl can also be used to change the number of buffers or to free the allocated memory, provided none of the buffers are still mapped.

Before applications can access the buffers they must map them into their address space with the mmap() function. The location of the buffers in device memory can be determined with the ioctl VIDIOC_QUERYBUF ioctl. In the single-planar API case, the m.offset and length returned in a struct

v4l2_buffer

are passed as sixth and second parameter to the mmap() function. When using the multi-planar API, struct

v4l2_buffer

contains an array of struct

v4l2_plane

structures, each containing its own m.offset and length. When using the multi-planar API, every plane of every buffer has to be mapped separately, so the number of calls to mmap() should be equal to number of buffers times number of planes in each buffer.

The offset and length values must not be modified. Remember, the buffers are allocated in physical memory, as opposed to virtual memory, which can be swapped out to disk. Applications should free the buffers as soon as possible with the munmap() function.

Example: Mapping buffers in the single-planar API struct

v4l2_requestbuffers reqbuf;

struct

{

void

* start;

size_t

length;

} * buffers;

unsigned int

i; memset( & reqbuf, 0 ,

sizeof

(reqbuf)); reqbuf.type

= V4L2_BUF_TYPE_VIDEO_CAPTURE; reqbuf.memory

= V4L2_MEMORY_MMAP; reqbuf.count

= 20 ;

if

( 1 == ioctl (fd, VIDIOC_REQBUFS, & reqbuf)) {

if

(errno == EINVAL)

else

printf( "Video capturing or mmap-streaming is not supported\\n" ); perror ( "VIDIOC_REQBUFS" ); exit(EXIT_FAILURE);

}

/* We want at least five buffers. */

if

(reqbuf.count

< 5 ) {

/* You may need to free the buffers here. */

printf( "Not enough buffer memory\\n" ); exit(EXIT_FAILURE);

} buffers = calloc(reqbuf.count,

sizeof

( * buffers)); assert(buffers != NULL );

for

(i = 0 ; i < reqbuf.count; i ++ ) {

struct

v4l2_buffer buffer;

11

One could use one file descriptor and set the buffer type field accordingly when calling ioctl VIDIOC_QBUF, VIDIOC_DQBUF etc., but it makes the select() function ambiguous. We also like the clean approach of one file descriptor per logical stream. Video overlay for example is also a logical stream, although the CPU is not needed for continuous operation.

1.2. Part I - Video for Linux API 99

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

memset( & buffer, 0 ,

sizeof

(buffer)); buffer.type

= reqbuf.type; buffer.memory

= V4L2_MEMORY_MMAP; buffer.index

= i;

if

( 1 == ioctl (fd, VIDIOC_QUERYBUF, & buffer)) { perror( "VIDIOC_QUERYBUF" ); exit(EXIT_FAILURE);

} buffers[i].length

= buffer.length;

/* remember for munmap() */

buffers[i].start

= mmap( NULL , buffer.length,

PROT_READ | PROT_WRITE,

/* recommended */

MAP_SHARED,

/* recommended */

fd, buffer.m.offset);

if

(MAP_FAILED == buffers[i].start) {

/* If you do not exit here you should unmap() and free() the buffers mapped so far. */

perror( "mmap" ); exit(EXIT_FAILURE);

}

}

/* Cleanup. */

for

(i = 0 ; i < reqbuf.count; i ++ ) munmap(buffers[i].start, buffers[i].length);

Example: Mapping buffers in the multi-planar API struct

v4l2_requestbuffers reqbuf;

/* Our current format uses 3 planes per buffer */

#define FMT_NUM_PLANES = 3

struct

{

void

* start[FMT_NUM_PLANES];

size_t

length[FMT_NUM_PLANES];

} * buffers;

unsigned int

i, j; memset( & reqbuf, 0 ,

sizeof

(reqbuf)); reqbuf.type

= V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; reqbuf.memory

= V4L2_MEMORY_MMAP; reqbuf.count

= 20 ;

if

(ioctl(fd, VIDIOC_REQBUFS, & reqbuf) < 0 ) {

if

(errno == EINVAL) printf( "Video capturing or mmap-streaming is not supported\\n" );

else

perror ( "VIDIOC_REQBUFS" ); exit(EXIT_FAILURE);

}

/* We want at least five buffers. */

if

(reqbuf.count

< 5 ) {

/* You may need to free the buffers here. */

100 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

printf( "Not enough buffer memory\\n" ); exit(EXIT_FAILURE);

} buffers = calloc(reqbuf.count,

sizeof

( * buffers)); assert(buffers != NULL );

for

(i = 0 ; i < reqbuf.count; i ++ ) {

struct

v4l2_buffer buffer;

struct

v4l2_plane planes[FMT_NUM_PLANES]; memset( & buffer, 0 ,

sizeof

(buffer)); buffer.type

= reqbuf.type; buffer.memory

= V4L2_MEMORY_MMAP; buffer.index

= i;

/* length in struct v4l2_buffer in multi-planar API stores the size

* of planes array. */

buffer.length

= FMT_NUM_PLANES; buffer.m.planes

= planes;

if

(ioctl(fd, VIDIOC_QUERYBUF, & buffer) < 0 ) { perror( "VIDIOC_QUERYBUF" ); exit(EXIT_FAILURE);

}

/* Every plane has to be mapped separately */

for

(j = 0 ; j < FMT_NUM_PLANES; j ++ ) { buffers[i].length[j] = buffer.m.planes[j].length;

/* remember for munmap() */

buffers[i].start[j] = mmap( NULL , buffer.m.planes[j].length,

PROT_READ | PROT_WRITE,

/* recommended */

MAP_SHARED,

/* recommended */

fd, buffer.m.planes[j].m.offset);

if

(MAP_FAILED == buffers[i].start[j]) {

/* If you do not exit here you should unmap() and free() the buffers and planes mapped so far. */

perror( "mmap" ); exit(EXIT_FAILURE);

}

}

}

/* Cleanup. */

for

(i = 0 ; i < reqbuf.count; i ++ )

for

(j = 0 ; j < FMT_NUM_PLANES; j ++ ) munmap(buffers[i].start[j], buffers[i].length[j]);

Conceptually streaming drivers maintain two buffer queues, an incoming and an outgoing queue. They separate the synchronous capture or output operation locked to a video clock from the application which is subject to random disk or network delays and preemption by other processes, thereby reducing the probability of data loss. The queues are organized as FIFOs, buffers will be output in the order enqueued in the incoming FIFO, and were captured in the order dequeued from the outgoing FIFO.

The driver may require a minimum number of buffers enqueued at all times to function, apart of this no limit exists on the number of buffers applications can enqueue in advance, or dequeue and process. They can also enqueue in a different order than buffers have been dequeued, and the driver can fill enqueued

empty buffers in any order.

12

The index number of a buffer (struct

v4l2_buffer

index) plays no role

12

Random enqueue order permits applications processing images out of order (such as video codecs) to return buffers earlier, reducing the probability of data loss. Random fill order allows drivers to reuse buffers on a LIFO-basis, taking advantage of caches holding scatter-gather lists and the like.

1.2. Part I - Video for Linux API 101

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

here, it only identifies the buffer.

Initially all mapped buffers are in dequeued state, inaccessible by the driver. For capturing applications it is customary to first enqueue all mapped buffers, then to start capturing and enter the read loop. Here the application waits until a filled buffer can be dequeued, and re-enqueues the buffer when the data is no longer needed. Output applications fill and enqueue buffers, when enough buffers are stacked up the output is started with VIDIOC_STREAMON. In the write loop, when the application runs out of free buffers, it must wait until an empty buffer can be dequeued and reused.

To enqueue and dequeue a buffer applications use the ioctl VIDIOC_QBUF, VIDIOC_DQBUF and VID-

IOC_DQBUF ioctl. The status of a buffer being mapped, enqueued, full or empty can be determined at any time using the ioctl VIDIOC_QUERYBUF ioctl. Two methods exist to suspend execution of the application until one or more buffers can be dequeued. By default VIDIOC_DQBUF blocks when no buffer is in the outgoing queue. When the O_NONBLOCK flag was given to the open() function, VIDIOC_DQBUF returns immediately with an EAGAIN error code when no buffer is available. The select() or poll() functions are always available.

To start and stop capturing or output applications call the VIDIOC_STREAMON and VIDIOC_STREAMOFF ioctl.

Drivers implementing memory mapping I/O must support the VIDIOC_REQBUFS, VIDIOC_QUERYBUF, VID-

IOC_QBUF, VIDIOC_DQBUF, VIDIOC_STREAMON and VIDIOC_STREAMOFF ioctls, the mmap(), munmap(),

select() and poll() function.

13

[capture example]

Streaming I/O (User Pointers)

Input and output devices support this I/O method when the V4L2_CAP_STREAMING flag in the capabilities field of struct v4l2_capability returned by the ioctl VIDIOC_QUERYCAP ioctl is set. If the particular user pointer method (not only memory mapping) is supported must be determined by calling the ioctl

VIDIOC_REQBUFS ioctl with the memory type set to V4L2_MEMORY_USERPTR.

This I/O method combines advantages of the read/write and memory mapping methods. Buffers (planes) are allocated by the application itself, and can reside for example in virtual or shared memory. Only pointers to data are exchanged, these pointers and meta-information are passed in struct

v4l2_buffer

(or in struct

v4l2_plane

in the multi-planar API case). The driver must be switched into user pointer

I/O mode by calling the ioctl VIDIOC_REQBUFS with the desired buffer type. No buffers (planes) are allocated beforehand, consequently they are not indexed and cannot be queried like mapped buffers with the VIDIOC_QUERYBUF ioctl.

Example: Initiating streaming I/O with user pointers struct

v4l2_requestbuffers reqbuf; memset ( & reqbuf, 0 ,

sizeof

(reqbuf)); reqbuf.type

= V4L2_BUF_TYPE_VIDEO_CAPTURE; reqbuf.memory

= V4L2_MEMORY_USERPTR;

if

(ioctl (fd, VIDIOC_REQBUFS, & reqbuf) == 1 ) {

if

(errno == EINVAL) printf ( "Video capturing or user pointer streaming is not supported\\n" );

else

perror ( "VIDIOC_REQBUFS" ); exit (EXIT_FAILURE);

}

13

At the driver level select() and poll() are the same, and select() is too important to be optional. The rest should be evident.

102 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Buffer (plane) addresses and sizes are passed on the fly with the VIDIOC_QBUF ioctl. Although buffers are commonly cycled, applications can pass different addresses and sizes at each VIDIOC_QBUF call. If required by the hardware the driver swaps memory pages within physical memory to create a continuous area of memory. This happens transparently to the application in the virtual memory subsystem of the kernel. When buffer pages have been swapped out to disk they are brought back and finally locked in physical memory for DMA.

14

Filled or displayed buffers are dequeued with the VIDIOC_DQBUF ioctl. The driver can unlock the memory pages at any time between the completion of the DMA and this ioctl. The memory is also unlocked when VIDIOC_STREAMOFF is called, ioctl VIDIOC_REQBUFS, or when the device is closed. Applications must take care not to free buffers without dequeuing. For once, the buffers remain locked until further, wasting physical memory. Second the driver will not be notified when the memory is returned to the application's free list and subsequently reused for other purposes, possibly completing the requested

DMA and overwriting valuable data.

For capturing applications it is customary to enqueue a number of empty buffers, to start capturing and enter the read loop. Here the application waits until a filled buffer can be dequeued, and re-enqueues the buffer when the data is no longer needed. Output applications fill and enqueue buffers, when enough buffers are stacked up output is started. In the write loop, when the application runs out of free buffers it must wait until an empty buffer can be dequeued and reused. Two methods exist to suspend execution of the application until one or more buffers can be dequeued. By default VIDIOC_DQBUF blocks when no buffer is in the outgoing queue. When the O_NONBLOCK flag was given to the open() function, VID-

IOC_DQBUF returns immediately with an EAGAIN error code when no buffer is available. The select() or

poll() function are always available.

To start and stop capturing or output applications call the VIDIOC_STREAMON and VIDIOC_STREAMOFF ioctl.

Note:

ref:VIDIOC_STREAMOFF <VIDIOC_STREAMON> removes all buffers from both queues and unlocks all

buffers as a side effect. Since there is no notion of doing anything ``now'' on a multitasking system, if an application needs to synchronize with another event it should examine the struct

v4l2_buffer

timestamp of captured or outputted buffers.

Drivers implementing user pointer I/O must support the VIDIOC_REQBUFS, VIDIOC_QBUF, VIDIOC_DQBUF,

VIDIOC_STREAMON and VIDIOC_STREAMOFF ioctls, the select() and poll() function.

15

Streaming I/O (DMA buffer importing)

The DMABUF framework provides a generic method for sharing buffers between multiple devices. Device drivers that support DMABUF can export a DMA buffer to userspace as a file descriptor (known as the exporter role), import a DMA buffer from userspace using a file descriptor previously exported for a different or the same device (known as the importer role), or both. This section describes the DMABUF importer role API in V4L2.

Refer to DMABUF exporting for details about exporting V4L2 buffers as DMABUF file descriptors.

Input and output devices support the streaming I/O method when the V4L2_CAP_STREAMING flag in the capabilities field of struct v4l2_capability returned by the VIDIOC_QUERYCAP ioctl is set. Whether importing DMA buffers through DMABUF file descriptors is supported is determined by calling the VID-

IOC_REQBUFS ioctl with the memory type set to V4L2_MEMORY_DMABUF.

14

We expect that frequently used buffers are typically not swapped out. Anyway, the process of swapping, locking or generating scatter-gather lists may be time consuming. The delay can be masked by the depth of the incoming buffer queue, and perhaps by maintaining caches assuming a buffer will be soon enqueued again. On the other hand, to optimize memory usage drivers can limit the number of buffers locked in advance and recycle the most recently used buffers first. Of course, the pages of empty buffers in the incoming queue need not be saved to disk. Output buffers must be saved on the incoming and outgoing queue because an application may share them with other processes.

15

At the driver level select() and poll() are the same, and select() is too important to be optional. The rest should be evident.

1.2. Part I - Video for Linux API 103

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

This I/O method is dedicated to sharing DMA buffers between different devices, which may be V4L devices or other video-related devices (e.g. DRM). Buffers (planes) are allocated by a driver on behalf of an application. Next, these buffers are exported to the application as file descriptors using an API which is specific for an allocator driver. Only such file descriptor are exchanged. The descriptors and metainformation are passed in struct

v4l2_buffer

(or in struct

v4l2_plane

in the multi-planar API case). The driver must be switched into DMABUF I/O mode by calling the VIDIOC_REQBUFS with the desired buffer type.

Example: Initiating streaming I/O with DMABUF file descriptors struct

v4l2_requestbuffers reqbuf; memset( & reqbuf, 0 ,

sizeof

(reqbuf)); reqbuf.type

= V4L2_BUF_TYPE_VIDEO_CAPTURE; reqbuf.memory

= V4L2_MEMORY_DMABUF; reqbuf.count

= 1 ;

if

(ioctl(fd, VIDIOC_REQBUFS, & reqbuf) == 1 ) {

if

(errno == EINVAL) printf( "Video capturing or DMABUF streaming is not supported\\n" );

else

perror ( "VIDIOC_REQBUFS" ); exit(EXIT_FAILURE);

}

The buffer (plane) file descriptor is passed on the fly with the VIDIOC_QBUF ioctl. In case of multiplanar buffers, every plane can be associated with a different DMABUF descriptor. Although buffers are commonly cycled, applications can pass a different DMABUF descriptor at each VIDIOC_QBUF call.

Example: Queueing DMABUF using single plane API int

buffer_queue (

int

v4lfd,

int

index,

int

dmafd)

{

struct

v4l2_buffer buf; memset( & buf, 0 ,

sizeof

buf); buf.type

= V4L2_BUF_TYPE_VIDEO_CAPTURE; buf.memory

= V4L2_MEMORY_DMABUF; buf.index

= index; buf.m.fd

= dmafd;

if

(ioctl(v4lfd, VIDIOC_QBUF, & buf) == 1 ) { perror( "VIDIOC_QBUF" );

return

1 ;

}

return

0 ;

}

Example 3.6. Queueing DMABUF using multi plane API int

buffer_queue_mp (

int

v4lfd,

int

index,

int

dmafd[],

int

n_planes)

{

struct

v4l2_buffer buf;

struct

v4l2_plane planes[VIDEO_MAX_PLANES];

int

i;

104 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

memset( & buf, 0 ,

sizeof

buf); buf.type

= V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; buf.memory

= V4L2_MEMORY_DMABUF; buf.index

= index; buf.m.planes

= planes; buf.length

= n_planes; memset( & planes, 0 ,

sizeof

planes);

for

(i = 0 ; i < n_planes; ++ i) buf.m.planes[i].m.fd

= dmafd[i];

if

(ioctl(v4lfd, VIDIOC_QBUF, & buf) == 1 ) { perror( "VIDIOC_QBUF" );

return

1 ;

}

return

0 ;

}

Captured or displayed buffers are dequeued with the VIDIOC_DQBUF ioctl. The driver can unlock the buffer at any time between the completion of the DMA and this ioctl. The memory is also unlocked when

VIDIOC_STREAMOFF is called, VIDIOC_REQBUFS, or when the device is closed.

For capturing applications it is customary to enqueue a number of empty buffers, to start capturing and enter the read loop. Here the application waits until a filled buffer can be dequeued, and re-enqueues the buffer when the data is no longer needed. Output applications fill and enqueue buffers, when enough buffers are stacked up output is started. In the write loop, when the application runs out of free buffers it must wait until an empty buffer can be dequeued and reused. Two methods exist to suspend execution of the application until one or more buffers can be dequeued. By default VIDIOC_DQBUF blocks when no buffer is in the outgoing queue. When the O_NONBLOCK flag was given to the open() function, VID-

IOC_DQBUF returns immediately with an EAGAIN error code when no buffer is available. The select() and

poll() functions are always available.

To start and stop capturing or displaying applications call the VIDIOC_STREAMON and VIDIOC_STREAMOFF ioctls.

Note:

VIDIOC_STREAMOFF removes all buffers from both queues and unlocks all buffers as a side effect.

Since there is no notion of doing anything ``now'' on a multitasking system, if an application needs to synchronize with another event it should examine the struct

v4l2_buffer

timestamp of captured or outputted buffers.

Drivers implementing DMABUF importing I/O must support the VIDIOC_REQBUFS, VIDIOC_QBUF, VID-

IOC_DQBUF, VIDIOC_STREAMON and VIDIOC_STREAMOFF ioctls, and the select() and poll() functions.

Asynchronous I/O

This method is not defined yet.

Buffers

A buffer contains data exchanged by application and driver using one of the Streaming I/O methods. In the multi-planar API, the data is held in planes, while the buffer structure acts as a container for the planes.

Only pointers to buffers (planes) are exchanged, the data itself is not copied. These pointers, together with meta-information like timestamps or field parity, are stored in a struct

v4l2_buffer , argument to the

ioctl VIDIOC_QUERYBUF, ioctl VIDIOC_QBUF, VIDIOC_DQBUF and VIDIOC_DQBUF ioctl. In the multi-planar

1.2. Part I - Video for Linux API 105

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

API, some plane-specific members of struct

v4l2_buffer

, such as pointers and sizes for each plane, are stored in struct struct

v4l2_plane

instead. In that case, struct struct

v4l2_buffer

contains an array of plane structures.

Dequeued video buffers come with timestamps. The driver decides at which part of the frame and with which clock the timestamp is taken. Please see flags in the masks V4L2_BUF_FLAG_TIMESTAMP_MASK and V4L2_BUF_FLAG_TSTAMP_SRC_MASK in

Buffer Flags

. These flags are always valid and constant across

all buffers during the whole video stream. Changes in these flags may take place as a side effect of

VIDIOC_S_INPUT or VIDIOC_S_OUTPUT however. The V4L2_BUF_FLAG_TIMESTAMP_COPY timestamp type which is used by e.g. on mem-to-mem devices is an exception to the rule: the timestamp source flags are copied from the OUTPUT video buffer to the CAPTURE video buffer.

v4l2_buffer struct v4l2_buffer

__u32

__u32

__u32

__u32

__u32 struct timeval index type bytesused flags field timestamp

Number of the buffer, set by the application except when calling VIDIOC_DQBUF, then it is set by the driver.

This field can range from zero to the number of buffers allocated with the ioctl VIDIOC_REQBUFS ioctl (struct v4l2_requestbuffers count), plus any buffers allocated with ioctl VIDIOC_CREATE_BUFS minus one.

Type of the buffer, same as struct v4l2_format type or struct v4l2_requestbuffers type, set by the application.

See

v4l2_buf_type

The number of bytes occupied by the data in the buffer.

It depends on the negotiated data format and may change with each buffer for compressed variable size data like JPEG images.

Drivers must set this field when type refers to a capture stream, applications when it refers to an output stream. If the application sets this to 0 for an output stream, then bytesused will be set to the size of the buffer (see the length field of this struct) by the driver. For multiplanar formats this field is ignored and the planes pointer is used instead.

Flags set by the application or driver, see

Buffer Flags

.

Indicates the field order of the image in the buffer, see

v4l2_field . This field is not used when the buffer contains

VBI data. Drivers must set it when type refers to a capture stream, applications when it refers to an output stream.

For capture streams this is time when the first data byte was captured, as returned by the clock_gettime() function for the relevant clock id; see V4L2_BUF_FLAG_TIMESTAMP_* in

Buffer Flags

. For output streams the driver stores the time at which the last data byte was actually sent out in the timestamp field. This permits applications to monitor the drift between the video and system clock. For output streams that use V4L2_BUF_FLAG_TIMESTAMP_COPY the application has to fill in the timestamp which will be copied by the driver to the capture stream.

106 Chapter 1. Linux Media Infrastructure userspace API

Table 1.27: struct v4l2_buffer

Continued on next page

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Table 1.27 -- continued from previous page struct

v4l2_timecode

__u32 timecode sequence

When type is V4L2_BUF_TYPE_VIDEO_CAPTURE and the

V4L2_BUF_FLAG_TIMECODE flag is set in flags, this structure contains a frame timecode. In

V4L2_FIELD_ALTERNATE

mode the top and bottom field contain the same timecode.

Timecodes are intended to help video editing and are typically recorded on video tapes, but also embedded in compressed formats like MPEG. This field is independent of the timestamp and sequence fields.

Set by the driver, counting the frames (not fields!) in sequence. This field is set for both input and output devices.

In

V4L2_FIELD_ALTERNATE

mode the top and bottom field have the same sequence number. The count starts at zero and includes dropped or repeated frames. A dropped frame was received by an input device but could not be stored due to lack of free buffer space. A repeated frame was displayed again by an output device because the application did not pass new data in time.

__u32 union

__u32

__u32

__u32 memory This field must be set by applications and/or drivers in accordance with the selected I/O method. See

v4l2_memory

m

__u32 offset For the single-planar API and when memory is

V4L2_MEMORY_MMAP this is the offset of the buffer from the start of the device memory. The value is returned by the driver and apart of serving as parameter to the mmap() function not useful for applications.

See

Streaming I/O

(Memory Mapping)

for details unsigned long userptr For the single-planar API and when memory is

V4L2_MEMORY_USERPTR this is a pointer to the buffer

(casted to unsigned long type) in virtual memory, set by the application. See

Streaming I/O (User Pointers)

for details.

struct v4l2_plane int length

*planes When using the multi-planar API, contains a userspace pointer to an array of struct

v4l2_plane .

The size of the array should be put in the length field of this struct

v4l2_buffer

structure.

fd For the single-plane API and when memory is

V4L2_MEMORY_DMABUF this is the file descriptor associated with a DMABUF buffer.

Size of the buffer (not the payload) in bytes for the singleplanar API. This is set by the driver based on the calls to ioctl

VIDIOC_REQBUFS and/or ioctl VIDIOC_CREATE_BUFS. For the multi-planar API the application sets this to the number of elements in the planes array. The driver will fill in the actual number of valid elements in that array.

reserved2 reserved

A place holder for future extensions. Drivers and applications must set this to 0.

A place holder for future extensions. Drivers and applications must set this to 0.

v4l2_plane struct v4l2_plane

Note:

This may count the frames received e.g. over USB, without taking into account the frames dropped by the remote hardware due to limited compression throughput or bus bandwidth. These devices identify by not enumerating any video standards, see

Video Standards

.

1.2. Part I - Video for Linux API 107

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

__u32 bytesused

__u32 union

__u32

__u32

v4l2_buf_type

length m

__u32 unsigned long int data_offset reserved[11] mem_offset userptr fd

The number of bytes occupied by data in the plane (its payload). Drivers must set this field when type refers to a capture stream, applications when it refers to an output stream. If the application sets this to 0 for an output stream, then bytesused will be set to the size of the plane (see the length field of this struct) by the driver.

Note:

Note that the actual image data starts at data_offset which may not be 0.

Size in bytes of the plane (not its payload). This is set by the driver based on the calls to ioctl VIDIOC_REQBUFS and/or ioctl VIDIOC_CREATE_BUFS.

When the memory type in the containing struct

v4l2_buffer

is

V4L2_MEMORY_MMAP, this is the value that should be passed to mmap(), similar to the offset field in struct

v4l2_buffer .

When the memory type in the containing struct

v4l2_buffer

is

V4L2_MEMORY_USERPTR, this is a userspace pointer to the memory allocated for this plane by an application.

When the memory type in the containing struct

v4l2_buffer

is

V4L2_MEMORY_DMABUF, this is a file descriptor associated with a DMABUF buffer, similar to the fd field in struct

v4l2_buffer .

Offset in bytes to video data in the plane. Drivers must set this field when type refers to a capture stream, applications when it refers to an output stream.

Note:

That data_offset is included in bytesused. So the size of the image in the plane is bytesused-data_offset at offset data_offset from the start of the plane.

Reserved for future use. Should be zeroed by drivers and applications.

108 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d enum v4l2_buf_type

V4L2_BUF_TYPE_VIDEO_CAPTURE

V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE

V4L2_BUF_TYPE_VIDEO_OUTPUT

V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE

V4L2_BUF_TYPE_VIDEO_OVERLAY

V4L2_BUF_TYPE_VBI_CAPTURE

V4L2_BUF_TYPE_VBI_OUTPUT

1

9

2 Buffer of a single-planar video output stream, see

Video

Output Interface

.

10 Buffer of a multi-planar video output stream, see

Video

Output Interface

.

3

4

Buffer for video overlay, see

Buffer of a raw VBI capture stream, see

Interface

.

Video Overlay Interface

.

Raw VBI Data

5

Buffer of a single-planar video capture stream, see

Video Capture Interface

.

Buffer of a multi-planar video capture stream, see

Video

Capture Interface

.

V4L2_BUF_TYPE_SLICED_VBI_CAPTURE

V4L2_BUF_TYPE_SLICED_VBI_OUTPUT

V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY

6

7

8

Buffer of a raw VBI output stream, see

Raw VBI Data

Interface

.

Buffer of a sliced VBI capture stream, see

Sliced VBI

Data Interface

.

Buffer of a sliced VBI output stream, see

Sliced VBI Data

Interface

.

Buffer for video output overlay (OSD), see

Video Output

Overlay Interface

.

V4L2_BUF_TYPE_SDR_CAPTURE

V4L2_BUF_TYPE_SDR_OUTPUT

11 Buffer for Software Defined Radio (SDR) capture stream, see

Software Defined Radio Interface (SDR)

.

12 Buffer for Software Defined Radio (SDR) output stream, see

Software Defined Radio Interface (SDR)

.

Buffer Flags

V4L2_BUF_FLAG_MAPPED

V4L2_BUF_FLAG_QUEUED

0x00000001

0x00000002

The buffer resides in device memory and has been mapped into the application's address space, see

Streaming I/O (Memory Mapping)

for details. Drivers set or clear this flag when the ioctl VIDIOC_QUERYBUF, ioctl VIDIOC_QBUF,

VIDIOC_DQBUF or VIDIOC_DQBUF ioctl is called.

Set by the driver.

Internally drivers maintain two buffer queues, an incoming and outgoing queue. When this flag is set, the buffer is currently on the incoming queue. It automatically moves to the outgoing queue after the buffer has been filled

(capture devices) or displayed (output devices).

Drivers set or clear this flag when the VID-

IOC_QUERYBUF ioctl is called. After (successful) calling the VIDIOC_QBUFioctl it is always set and after VIDIOC_DQBUF always cleared.

Continued on next page

1.2. Part I - Video for Linux API 109

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2_BUF_FLAG_DONE

V4L2_BUF_FLAG_ERROR

V4L2_BUF_FLAG_KEYFRAME

V4L2_BUF_FLAG_PFRAME

V4L2_BUF_FLAG_BFRAME

V4L2_BUF_FLAG_TIMECODE

V4L2_BUF_FLAG_PREPARED

Table 1.29 -- continued from previous page

0x00000004

When this flag is set, the buffer is currently on the outgoing queue, ready to be dequeued from the driver.

Drivers set or clear this flag when the VIDIOC_QUERYBUF ioctl is called. After calling the VIDIOC_QBUF or VID-

IOC_DQBUF it is always cleared.

Of course a buffer cannot be on both queues at the same time, the V4L2_BUF_FLAG_QUEUED and

V4L2_BUF_FLAG_DONE flag are mutually exclusive. They can be both cleared however, then the buffer is in ``dequeued'' state, in the application domain so to say.

0x00000040

0x00000008

When this flag is set, the buffer has been dequeued successfully, although the data might have been corrupted.

This is recoverable, streaming may continue as normal and the buffer may be reused normally. Drivers set this flag when the VIDIOC_DQBUF ioctl is called.

Drivers set or clear this flag when calling the

VIDIOC_DQBUF ioctl. It may be set by video capture devices when the buffer contains a compressed image which is a key frame (or field), i. e. can be decompressed on its own. Also known as an I-frame. Applications can set this bit when type refers to an output stream.

V4L2_BUF_FLAG_NO_CACHE_INVALIDATE

0x00000010

0x00000020

0x00000100

0x00000400

0x00000800

Similar to V4L2_BUF_FLAG_KEYFRAME this flags predicted frames or fields which contain only differences to a previous key frame. Applications can set this bit when type refers to an output stream.

Similar to V4L2_BUF_FLAG_KEYFRAME this flags a bi-directional predicted frame or field which contains only the differences between the current frame and both the preceding and following key frames to specify its content. Applications can set this bit when type refers to an output stream.

The timecode field is valid. Drivers set or clear this flag when the VIDIOC_DQBUF ioctl is called.

Applications can set this bit and the corresponding timecode structure when type refers to an output stream.

The buffer has been prepared for I/O and can be queued by the application. Drivers set or clear this flag when the ioctl VIDIOC_QUERYBUF,

VIDIOC_PREPARE_BUF, ioctl VIDIOC_QBUF, VID-

IOC_DQBUF or VIDIOC_DQBUF ioctl is called.

Caches do not have to be invalidated for this buffer. Typically applications shall use this flag if the data captured in the buffer is not going to be touched by the CPU, instead the buffer will, probably, be passed on to a DMA-capable hardware unit for further processing or output.

Continued on next page

110 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Table 1.29 -- continued from previous page

V4L2_BUF_FLAG_NO_CACHE_CLEAN

0x00001000

Caches do not have to be cleaned for this buffer. Typically applications shall use this flag for output buffers if the data in this buffer has not been created by the CPU but by some DMAcapable unit, in which case caches have not been used.

V4L2_BUF_FLAG_LAST

V4L2_BUF_FLAG_TIMESTAMP_MASK

V4L2_BUF_FLAG_TIMESTAMP_UNKNOWN

V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC

0x00100000

0x0000e000

0x00000000

0x00002000

Last buffer produced by the hardware.

mem2mem codec drivers set this flag on the capture queue for the last buffer when the

ioctl VIDIOC_QUERYBUF or VIDIOC_DQBUF ioctl is called. Due to hardware limitations, the last buffer may be empty. In this case the driver will set the bytesused field to 0, regardless of the format. Any Any subsequent call to the VID-

IOC_DQBUF ioctl will not block anymore, but return an EPIPE error code.

Mask for timestamp types below. To test the timestamp type, mask out bits not belonging to timestamp type by performing a logical and operation with buffer flags and timestamp mask.

Unknown timestamp type.

This type is used by drivers before Linux 3.9 and may be either monotonic (see below) or realtime (wall clock).

Monotonic clock has been favoured in embedded systems whereas most of the drivers use the realtime clock.

Either kinds of timestamps are available in user space via clock_gettime() using clock

IDs CLOCK_MONOTONIC and CLOCK_REALTIME, respectively.

The buffer timestamp has been taken from the

CLOCK_MONOTONIC clock. To access the same clock outside V4L2, use clock_gettime().

V4L2_BUF_FLAG_TIMESTAMP_COPY

V4L2_BUF_FLAG_TSTAMP_SRC_MASK

V4L2_BUF_FLAG_TSTAMP_SRC_EOF

0x00004000

0x00070000

0x00000000

The CAPTURE buffer timestamp has been taken from the corresponding OUTPUT buffer.

This flag applies only to mem2mem devices.

Mask for timestamp sources below.

The timestamp source defines the point of time the timestamp is taken in relation to the frame.

Logical `and' operation between the flags field and V4L2_BUF_FLAG_TSTAMP_SRC_MASK produces the value of the timestamp source.

Applications must set the timestamp source when type refers to an output stream and

V4L2_BUF_FLAG_TIMESTAMP_COPY is set.

End Of Frame. The buffer timestamp has been taken when the last pixel of the frame has been received or the last pixel of the frame has been transmitted.

In practice, software generated timestamps will typically be read from the clock a small amount of time after the last pixel has been received or transmitten, depending on the system and other activity in it.

Continued on next page

1.2. Part I - Video for Linux API 111

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Table 1.29 -- continued from previous page

V4L2_BUF_FLAG_TSTAMP_SRC_SOE

0x00010000

Start Of Exposure.

The buffer timestamp has been taken when the exposure of the frame has begun.

This is only valid for the

V4L2_BUF_TYPE_VIDEO_CAPTURE buffer type.

v4l2_memory enum v4l2_memory

V4L2_MEMORY_MMAP

V4L2_MEMORY_USERPTR

V4L2_MEMORY_OVERLAY

V4L2_MEMORY_DMABUF

1

2

3

4

The buffer is used for

memory mapping

I/O.

The buffer is used for

user pointer

I/O.

[to do]

The buffer is used for

DMA shared buffer

I/O.

Timecodes

The struct

v4l2_timecode

structure is designed to hold a SMPTE 12M or similar timecode. (struct struct timeval timestamps are stored in struct

v4l2_buffer

field timestamp.)

v4l2_timecode struct v4l2_timecode

__u32

__u32

__u8

__u8

__u8

__u8

__u8 type flags frames seconds minutes hours userbits[4]

Frame rate the timecodes are based on, see

Timecode Types

.

Timecode flags, see

Timecode Flags

.

Frame count, 0 ... 23/24/29/49/59, depending on the type of timecode.

Seconds count, 0 ... 59. This is a binary, not BCD number.

Minutes count, 0 ... 59. This is a binary, not BCD number.

Hours count, 0 ... 29. This is a binary, not BCD number.

The ``user group'' bits from the timecode.

Timecode Types

V4L2_TC_TYPE_24FPS

V4L2_TC_TYPE_25FPS

V4L2_TC_TYPE_30FPS

V4L2_TC_TYPE_50FPS

V4L2_TC_TYPE_60FPS

V4L2_TC_FLAG_DROPFRAME

Timecode Flags

V4L2_TC_FLAG_COLORFRAME

V4L2_TC_USERBITS_field

V4L2_TC_USERBITS_USERDEFINED

V4L2_TC_USERBITS_8BITCHARS

1

2

3

4

5

24 frames per second, i. e. film.

25 frames per second, i. e. PAL or SECAM video.

30 frames per second, i. e. NTSC video.

0x0001 Indicates ``drop frame'' semantics for counting frames in 29.97 fps material. When set, frame numbers 0 and

1 at the start of each minute, except minutes 0, 10,

20, 30, 40, 50 are omitted from the count.

0x0002 The ``color frame'' flag.

0x000C Field mask for the ``binary group flags''.

0x0000 Unspecified format.

0x0008 8-bit ISO characters.

112 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Field Order

We have to distinguish between progressive and interlaced video. Progressive video transmits all lines of a video image sequentially. Interlaced video divides an image into two fields, containing only the odd and even lines of the image, respectively. Alternating the so called odd and even field are transmitted, and due to a small delay between fields a cathode ray TV displays the lines interleaved, yielding the original frame. This curious technique was invented because at refresh rates similar to film the image would fade out too quickly. Transmitting fields reduces the flicker without the necessity of doubling the frame rate and with it the bandwidth required for each channel.

It is important to understand a video camera does not expose one frame at a time, merely transmitting the frames separated into fields. The fields are in fact captured at two different instances in time. An object on screen may well move between one field and the next. For applications analysing motion it is of paramount importance to recognize which field of a frame is older, the temporal order.

When the driver provides or accepts images field by field rather than interleaved, it is also important applications understand how the fields combine to frames. We distinguish between top (aka odd) and bottom (aka even) fields, the spatial order: The first line of the top field is the first line of an interlaced frame, the first line of the bottom field is the second line of that frame.

However because fields were captured one after the other, arguing whether a frame commences with the top or bottom field is pointless. Any two successive top and bottom, or bottom and top fields yield a valid frame. Only when the source was progressive to begin with, e. g. when transferring film to video, two fields may come from the same frame, creating a natural order.

Counter to intuition the top field is not necessarily the older field. Whether the older field contains the top or bottom lines is a convention determined by the video standard. Hence the distinction between temporal and spatial order of fields. The diagrams below should make this clearer.

All video capture and output devices must report the current field order. Some drivers may permit the selection of a different order, to this end applications initialize the field field of struct

v4l2_pix_format

before calling the VIDIOC_S_FMT ioctl. If this is not desired it should have the value V4L2_FIELD_ANY (0).

enum v4l2_field v4l2_field

1.2. Part I - Video for Linux API 113

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2_FIELD_ANY

V4L2_FIELD_NONE

V4L2_FIELD_TOP

V4L2_FIELD_BOTTOM

V4L2_FIELD_INTERLACED

V4L2_FIELD_SEQ_TB

V4L2_FIELD_SEQ_BT

V4L2_FIELD_ALTERNATE

V4L2_FIELD_INTERLACED_TB

V4L2_FIELD_INTERLACED_BT

114

0

1

2

3

4

5

6

7

8

9

Applications request this field order when any one of the V4L2_FIELD_NONE, V4L2_FIELD_TOP,

V4L2_FIELD_BOTTOM, or V4L2_FIELD_INTERLACED formats is acceptable.

Drivers choose depending on hardware capabilities or e.

g.

the requested image size, and return the actual field order.

Drivers must never return

V4L2_FIELD_ANY. If multiple field orders are possible the driver must choose one of the possible field orders during VIDIOC_S_FMT or VID-

IOC_TRY_FMT. struct

v4l2_buffer

field can never be V4L2_FIELD_ANY.

Images are in progressive format, not interlaced.

The driver may also indicate this order when it cannot distinguish between V4L2_FIELD_TOP and

V4L2_FIELD_BOTTOM.

Images consist of the top (aka odd) field only.

Images consist of the bottom (aka even) field only.

Applications may wish to prevent a device from capturing interlaced images because they will have ``comb'' or ``feathering'' artefacts around moving objects.

Images contain both fields, interleaved line by line. The temporal order of the fields (whether the top or bottom field is first transmitted) depends on the current video standard. M/NTSC transmits the bottom field first, all other standards the top field first.

Images contain both fields, the top field lines are stored first in memory, immediately followed by the bottom field lines. Fields are always stored in temporal order, the older one first in memory.

Image sizes refer to the frame, not fields.

Images contain both fields, the bottom field lines are stored first in memory, immediately followed by the top field lines. Fields are always stored in temporal order, the older one first in memory. Image sizes refer to the frame, not fields.

The two fields of a frame are passed in separate buffers, in temporal order, i. e. the older one first. To indicate the field parity (whether the current field is a top or bottom field) the driver or application, depending on data direction, must set struct

v4l2_buffer

field to V4L2_FIELD_TOP or V4L2_FIELD_BOTTOM. Any two successive fields pair to build a frame. If fields are successive, without any dropped fields between them (fields can drop individually), can be determined from the struct

v4l2_buffer

sequence field. This format cannot be selected when using the read/write I/O method since there is no way to communicate if a field was a top or bottom field.

Images contain both fields, interleaved line by line, top field first. The top field is transmitted first.

Images contain both fields, interleaved line by line, top field first. The bottom field is transmitted first.

Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Field Order, Top Field First Transmitted

Field Order, Bottom Field First Transmitted

1.2.4 Interfaces

Video Capture Interface

Video capture devices sample an analog video signal and store the digitized images in memory. Today nearly all devices can capture at full 25 or 30 frames/second. With this interface applications can control the capture process and move images from the driver into user space.

Conventionally V4L2 video capture devices are accessed through character device special files named

/dev/video and /dev/video0 to /dev/video63 with major number 81 and minor numbers 0 to 63.

/dev/video is typically a symbolic link to the preferred video device.

Note:

The same device file names are used for video output devices.

Querying Capabilities

Devices supporting the video capture interface set the V4L2_CAP_VIDEO_CAPTURE or

V4L2_CAP_VIDEO_CAPTURE_MPLANE flag in the capabilities field of struct v4l2_capability returned by the ioctl VIDIOC_QUERYCAP ioctl. As secondary device functions they may also support the

video overlay

(V4L2_CAP_VIDEO_OVERLAY) and the

raw VBI capture

(V4L2_CAP_VBI_CAPTURE) interface. At least one of the read/write or streaming I/O methods must be supported. Tuners and audio inputs are optional.

Supplemental Functions

Video capture devices shall support

audio input

,

Tuners and Modulators

,

controls

,

cropping and scaling

and

streaming parameter

ioctls as needed. The

video input

and

video standard

ioctls must be supported by all video capture devices.

Image Format Negotiation

The result of a capture operation is determined by cropping and image format parameters. The former select an area of the video picture to capture, the latter how images are stored in memory, i. e. in RGB or

YUV format, the number of bits per pixel or width and height. Together they also define how images are scaled in the process.

As usual these parameters are not reset at open() time to permit Unix tool chains, programming a device and then reading from it as if it was a plain file. Well written V4L2 applications ensure they really get what they want, including cropping and scaling.

Cropping initialization at minimum requires to reset the parameters to defaults. An example is given in

Image Cropping, Insertion and Scaling

.

To query the current image format applications set the type field of a struct v4l2_format to

V4L2_BUF_TYPE_VIDEO_CAPTURE or V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE and call the VIDIOC_G_FMT

1.2. Part I - Video for Linux API 115

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

ioctl with a pointer to this structure.

Drivers fill the struct

v4l2_pix_format

pix or the struct

v4l2_pix_format_mplane

pix_mp member of the fmt union.

To request different parameters applications set the type field of a struct v4l2_format as above and initialize all fields of the struct

v4l2_pix_format

vbi member of the fmt union, or better just modify the results of VIDIOC_G_FMT, and call the VIDIOC_S_FMT ioctl with a pointer to this structure. Drivers may adjust the parameters and finally return the actual parameters as VIDIOC_G_FMT does.

Like VIDIOC_S_FMT the VIDIOC_TRY_FMT ioctl can be used to learn about hardware limitations without disabling I/O or possibly time consuming hardware preparations.

The contents of struct

v4l2_pix_format

and struct

v4l2_pix_format_mplane

are discussed in

Image

Formats

. See also the specification of the VIDIOC_G_FMT, VIDIOC_S_FMT and VIDIOC_TRY_FMT ioctls for details. Video capture devices must implement both the VIDIOC_G_FMT and VIDIOC_S_FMT ioctl, even if

VIDIOC_S_FMT ignores all requests and always returns default parameters as VIDIOC_G_FMT does. VID-

IOC_TRY_FMT is optional.

Reading Images

A video capture device may support the :read() function and/or streaming (memory mapping or

user pointer

) I/O. See

Input/Output

for details.

Video Overlay Interface

Also known as Framebuffer Overlay or Previewing.

Video overlay devices have the ability to genlock (TV-)video into the (VGA-)video signal of a graphics card, or to store captured images directly in video memory of a graphics card, typically with clipping. This can be considerable more efficient than capturing images and displaying them by other means. In the old days when only nuclear power plants needed cooling towers this used to be the only way to put live video into a window.

Video overlay devices are accessed through the same character special files as

video capture

devices.

Note:

The default function of a /dev/video device is video capturing. The overlay function is only available

after calling the VIDIOC_S_FMT ioctl.

The driver may support simultaneous overlay and capturing using the read/write and streaming I/O methods. If so, operation at the nominal frame rate of the video standard is not guaranteed. Frames may be directed away from overlay to capture, or one field may be used for overlay and the other for capture if the capture parameters permit this.

Applications should use different file descriptors for capturing and overlay. This must be supported by all drivers capable of simultaneous capturing and overlay. Optionally these drivers may also permit capturing and overlay with a single file descriptor for compatibility with V4L and earlier versions of V4L2.

16

Querying Capabilities

Devices supporting the video overlay interface set the V4L2_CAP_VIDEO_OVERLAY flag in the capabilities field of struct v4l2_capability returned by the ioctl VIDIOC_QUERYCAP ioctl. The overlay I/O method

16

A common application of two file descriptors is the XFree86 Xv/V4L interface driver and a V4L2 application. While the X server controls video overlay, the application can take advantage of memory mapping and DMA.

In the opinion of the designers of this API, no driver writer taking the efforts to support simultaneous capturing and overlay will restrict this ability by requiring a single file descriptor, as in V4L and earlier versions of V4L2. Making this optional means applications depending on two file descriptors need backup routines to be compatible with all drivers, which is considerable more work than using two fds in applications which do not. Also two fd's fit the general concept of one file descriptor for each logical stream. Hence as a complexity trade-off drivers must support two file descriptors and may support single fd operation.

116 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

specified below must be supported. Tuners and audio inputs are optional.

Supplemental Functions

Video overlay devices shall support

audio input

,

Tuners and Modulators

,

controls

,

cropping and scaling

and

streaming parameter

ioctls as needed. The

video input

and

video standard

ioctls must be supported by all video overlay devices.

Setup

Before overlay can commence applications must program the driver with frame buffer parameters, namely the address and size of the frame buffer and the image format, for example RGB 5:6:5. The VIDIOC_G_FBUF and VIDIOC_S_FBUF ioctls are available to get and set these parameters, respectively. The VIDIOC_S_FBUF ioctl is privileged because it allows to set up DMA into physical memory, bypassing the memory protection mechanisms of the kernel. Only the superuser can change the frame buffer address and size. Users are not supposed to run TV applications as root or with SUID bit set. A small helper application with suitable privileges should query the graphics system and program the V4L2 driver at the appropriate time.

Some devices add the video overlay to the output signal of the graphics card. In this case the frame buffer is not modified by the video device, and the frame buffer address and pixel format are not needed by the driver. The VIDIOC_S_FBUF ioctl is not privileged. An application can check for this type of device by calling the VIDIOC_G_FBUF ioctl.

A driver may support any (or none) of five clipping/blending methods:

1. Chroma-keying displays the overlaid image only where pixels in the primary graphics surface assume a certain color.

2. A bitmap can be specified where each bit corresponds to a pixel in the overlaid image. When the bit is set, the corresponding video pixel is displayed, otherwise a pixel of the graphics surface.

3. A list of clipping rectangles can be specified. In these regions no video is displayed, so the graphics surface can be seen here.

4. The framebuffer has an alpha channel that can be used to clip or blend the framebuffer with the video.

5. A global alpha value can be specified to blend the framebuffer contents with video images.

When simultaneous capturing and overlay is supported and the hardware prohibits different image and frame buffer formats, the format requested first takes precedence. The attempt to capture (VID-

IOC_S_FMT) or overlay (VIDIOC_S_FBUF) may fail with an EBUSY error code or return accordingly modified parameters..

Overlay Window

The overlaid image is determined by cropping and overlay window parameters. The former select an area of the video picture to capture, the latter how images are overlaid and clipped. Cropping initialization at minimum requires to reset the parameters to defaults. An example is given in

Image Cropping, Insertion and Scaling

.

The overlay window is described by a struct

v4l2_window

. It defines the size of the image, its position over the graphics surface and the clipping to be applied. To get the current parameters applications set the type field of a struct v4l2_format to V4L2_BUF_TYPE_VIDEO_OVERLAY and call the VIDIOC_G_FMT ioctl.

The driver fills the struct

v4l2_window

substructure named win. It is not possible to retrieve a previously programmed clipping list or bitmap.

To program the overlay window applications set the type field of a struct v4l2_format to

V4L2_BUF_TYPE_VIDEO_OVERLAY, initialize the win substructure and call the VIDIOC_S_FMT ioctl. The driver adjusts the parameters against hardware limits and returns the actual parameters as VIDIOC_G_FMT

1.2. Part I - Video for Linux API 117

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

does. Like VIDIOC_S_FMT, the VIDIOC_TRY_FMT ioctl can be used to learn about driver capabilities without actually changing driver state. Unlike VIDIOC_S_FMT this also works after the overlay has been enabled.

The scaling factor of the overlaid image is implied by the width and height given in struct

v4l2_window

and the size of the cropping rectangle. For more information see

Image Cropping, Insertion and Scaling

.

When simultaneous capturing and overlay is supported and the hardware prohibits different image and window sizes, the size requested first takes precedence. The attempt to capture or overlay as well (VID-

IOC_S_FMT) may fail with an EBUSY error code or return accordingly modified parameters.

v4l2_window struct v4l2_window

struct v4l2_rect w Size and position of the window relative to the top, left corner of the frame buffer defined with VIDIOC_S_FBUF. The window can extend the frame buffer width and height, the x and y coordinates can be negative, and it can lie completely outside the frame buffer. The driver clips the window accordingly, or if that is not possible, modifies its size and/or position.

enum v4l2_field field Applications set this field to determine which video field shall be overlaid, typically one of V4L2_FIELD_ANY (0), V4L2_FIELD_TOP, V4L2_FIELD_BOTTOM or V4L2_FIELD_INTERLACED.

Drivers may have to choose a different field order and return the actual setting here.

__u32 chromakey When chroma-keying has been negotiated with VIDIOC_S_FBUF applications set this field to the desired pixel value for the chroma key. The format is the same as the pixel format of the framebuffer (struct v4l2_framebuffer fmt.pixelformat field), with bytes in host order. E. g. for

V4L2_PIX_FMT_BGR24

the value should be 0xRRGGBB on a little endian, 0xBBGGRR on a big endian host.

struct v4l2_clip * clips When chroma-keying has not been negotiated and VIDIOC_G_FBUF indicated this capability, applications can set this field to point to an array of clipping rectangles.

Like the window coordinates w, clipping rectangles are defined relative to the top, left corner of the frame buffer. However clipping rectangles must not extend the frame buffer width and height, and they must not overlap. If possible applications should merge adjacent rectangles. Whether this must create x-y or y-x bands, or the order of rectangles, is not defined. When clip lists are not supported the driver ignores this field. Its contents after calling VIDIOC_S_FMT are undefined.

__u32 clipcount When the application set the clips field, this field must contain the number of clipping rectangles in the list. When clip lists are not supported the driver ignores this field, its contents after calling VIDIOC_S_FMT are undefined. When clip lists are supported but no clipping is desired this field must be set to zero.

void * bitmap When chroma-keying has not been negotiated and VIDIOC_G_FBUF indicated this capability, applications can set this field to point to a clipping bit mask.

It must be of the same size as the window, w.width and w.height. Each bit corresponds to a pixel in the overlaid image, which is displayed only when the bit is set. Pixel coordinates translate to bits like:

((__u8 * ) bitmap)[w.width

* y + x / 8 ] & ( 1 << (x & 7 )) where 0 ≤ x < w.width and 0 ≤ y <w.height.

17

When a clipping bit mask is not supported the driver ignores this field, its contents after calling VID-

IOC_S_FMT are undefined. When a bit mask is supported but no clipping is desired this field must be set to NULL.

Applications need not create a clip list or bit mask. When they pass both, or despite negotiating chromakeying, the results are undefined. Regardless of the chosen method, the clipping abilities of the hardware may be limited in quantity or quality. The results when these limits are exceeded are undefined.

18

17

Should we require w.width to be a multiple of eight?

18

When the image is written into frame buffer memory it will be undesirable if the driver clips out less pixels than expected, because the application and graphics system are not aware these regions need to be refreshed. The driver should clip out more pixels or not write the image at all.

118 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

__u8 global_alpha The global alpha value used to blend the framebuffer with video images, if global alpha blending has been negotiated (V4L2_FBUF_FLAG_GLOBAL_ALPHA, see VIDIOC_S_FBUF, Frame

Buffer Flags).

Note:

This field was added in Linux 2.6.23, extending the structure. However the VIDIOC_[G|S|TRY]_FMT

ioctls, which take a pointer to a v4l2_format parent structure with padding bytes at the end, are not affected.

v4l2_clip struct v4l2_clip

19

struct v4l2_rect c Coordinates of the clipping rectangle, relative to the top, left corner of the frame buffer. Only window pixels outside all clipping rectangles are displayed.

struct v4l2_clip * next Pointer to the next clipping rectangle, NULL when this is the last rectangle.

Drivers ignore this field, it cannot be used to pass a linked list of clipping rectangles.

v4l2_rect struct v4l2_rect

__s32 left Horizontal offset of the top, left corner of the rectangle, in pixels.

__s32 top Vertical offset of the top, left corner of the rectangle, in pixels. Offsets increase to the right and down.

__u32 width Width of the rectangle, in pixels.

__u32 height Height of the rectangle, in pixels.

Enabling Overlay

To start or stop the frame buffer overlay applications call the ioctl VIDIOC_OVERLAY ioctl.

Video Output Interface

Video output devices encode stills or image sequences as analog video signal. With this interface applications can control the encoding process and move images from user space to the driver.

Conventionally V4L2 video output devices are accessed through character device special files named

/dev/video and /dev/video0 to /dev/video63 with major number 81 and minor numbers 0 to 63.

/dev/video is typically a symbolic link to the preferred video device.

Note:

The same device file names are used also for video capture devices.

19

The X Window system defines ``regions'' which are vectors of struct BoxRec { short x1, y1, x2, y2; } with width = x2

- x1 and height = y2 - y1, so one cannot pass X11 clip lists directly.

1.2. Part I - Video for Linux API 119

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Querying Capabilities

Devices supporting the video output interface set the V4L2_CAP_VIDEO_OUTPUT or

V4L2_CAP_VIDEO_OUTPUT_MPLANE flag in the capabilities field of struct v4l2_capability returned by the ioctl VIDIOC_QUERYCAP ioctl. As secondary device functions they may also support the

raw VBI output

(V4L2_CAP_VBI_OUTPUT) interface. At least one of the read/write or streaming I/O methods must be supported. Modulators and audio outputs are optional.

Supplemental Functions

Video output devices shall support

audio output

,

modulator

,

controls

,

cropping and scaling

and

streaming parameter

ioctls as needed. The

video output

and

video standard

ioctls must be supported by all video output devices.

Image Format Negotiation

The output is determined by cropping and image format parameters. The former select an area of the video picture where the image will appear, the latter how images are stored in memory, i. e. in RGB or

YUV format, the number of bits per pixel or width and height. Together they also define how images are scaled in the process.

As usual these parameters are not reset at open() time to permit Unix tool chains, programming a device and then writing to it as if it was a plain file. Well written V4L2 applications ensure they really get what they want, including cropping and scaling.

Cropping initialization at minimum requires to reset the parameters to defaults. An example is given in

Image Cropping, Insertion and Scaling

.

To query the current image format applications set the type field of a struct v4l2_format to

V4L2_BUF_TYPE_VIDEO_OUTPUT or V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE and call the VIDIOC_G_FMT ioctl with a pointer to this structure.

Drivers fill the struct

v4l2_pix_format

pix or the struct

v4l2_pix_format_mplane

pix_mp member of the fmt union.

To request different parameters applications set the type field of a struct v4l2_format as above and initialize all fields of the struct

v4l2_pix_format

vbi member of the fmt union, or better just modify the results of VIDIOC_G_FMT, and call the VIDIOC_S_FMT ioctl with a pointer to this structure. Drivers may adjust the parameters and finally return the actual parameters as VIDIOC_G_FMT does.

Like VIDIOC_S_FMT the VIDIOC_TRY_FMT ioctl can be used to learn about hardware limitations without disabling I/O or possibly time consuming hardware preparations.

The contents of struct

v4l2_pix_format

and struct

v4l2_pix_format_mplane

are discussed in

Image

Formats

. See also the specification of the VIDIOC_G_FMT, VIDIOC_S_FMT and VIDIOC_TRY_FMT ioctls for details. Video output devices must implement both the VIDIOC_G_FMT and VIDIOC_S_FMT ioctl, even if

VIDIOC_S_FMT ignores all requests and always returns default parameters as VIDIOC_G_FMT does. VID-

IOC_TRY_FMT is optional.

Writing Images

A video output device may support the

write() function

and/or streaming (

memory mapping

or

user pointer

) I/O. See

Input/Output

for details.

Video Output Overlay Interface

Also known as On-Screen Display (OSD)

120 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Some video output devices can overlay a framebuffer image onto the outgoing video signal. Applications can set up such an overlay using this interface, which borrows structures and ioctls of the

Video Overlay

interface.

The OSD function is accessible through the same character special file as the

Video Output

function.

Note:

The default function of such a /dev/video device is video capturing or output. The OSD function is

only available after calling the VIDIOC_S_FMT ioctl.

Querying Capabilities

Devices supporting the Video Output Overlay interface set the V4L2_CAP_VIDEO_OUTPUT_OVERLAY flag in the capabilities field of struct v4l2_capability returned by the ioctl VIDIOC_QUERYCAP ioctl.

Framebuffer

Contrary to the Video Overlay interface the framebuffer is normally implemented on the TV card and not the graphics card. On Linux it is accessible as a framebuffer device (/dev/fbN). Given a V4L2 device, applications can find the corresponding framebuffer device by calling the VIDIOC_G_FBUF ioctl. It returns, amongst other information, the physical address of the framebuffer in the base field of struct v4l2_framebuffer. The framebuffer device ioctl FBIOGET_FSCREENINFO returns the same address in the smem_start field of struct struct fb_fix_screeninfo. The FBIOGET_FSCREENINFO ioctl and struct fb_fix_screeninfo are defined in the linux/fb.h header file.

The width and height of the framebuffer depends on the current video standard. A V4L2 driver may reject attempts to change the video standard (or any other ioctl which would imply a framebuffer size change) with an EBUSY error code until all applications closed the framebuffer device.

Example: Finding a framebuffer device for OSD

#include <linux/fb.h>

struct

v4l2_framebuffer fbuf;

unsigned int

i;

int

fb_fd;

if

( 1 == ioctl(fd, VIDIOC_G_FBUF, & fbuf)) { perror( "VIDIOC_G_FBUF" ); exit(EXIT_FAILURE);

}

for

(i = 0 ; i < 30 ; i ++ ) {

char

dev_name[ 16 ];

struct

fb_fix_screeninfo si; snprintf(dev_name,

sizeof

(dev_name), "/dev/fb%u" , i); fb_fd = open(dev_name, O_RDWR);

if

( 1 == fb_fd) {

switch

(errno) {

case

ENOENT:

/* no such file */

case

ENXIO:

/* no driver */

continue

;

default:

perror( "open" );

1.2. Part I - Video for Linux API 121

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

exit(EXIT_FAILURE);

}

}

if

( 0 == ioctl(fb_fd, FBIOGET_FSCREENINFO, & si)) {

if

(si.smem_start

== (

unsigned long

)fbuf.base)

}

else

{

break

;

/* Apparently not a framebuffer device. */

} close(fb_fd); fb_fd = 1 ;

}

/* fb_fd is the file descriptor of the framebuffer device for the video output overlay, or -1 if no device was found. */

Overlay Window and Scaling

The overlay is controlled by source and target rectangles. The source rectangle selects a subsection of the framebuffer image to be overlaid, the target rectangle an area in the outgoing video signal where the image will appear. Drivers may or may not support scaling, and arbitrary sizes and positions of these rectangles. Further drivers may support any (or none) of the clipping/blending methods defined for the

Video Overlay

interface.

A struct

v4l2_window

defines the size of the source rectangle, its position in the framebuffer and the clipping/blending method to be used for the overlay. To get the current parameters applications set the type field of a struct v4l2_format to V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY and call the VIDIOC_G_FMT ioctl. The driver fills the struct

v4l2_window

substructure named win. It is not possible to retrieve a previously programmed clipping list or bitmap.

To program the source rectangle applications set the type field of a struct v4l2_format to

V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY, initialize the win substructure and call the VIDIOC_S_FMT ioctl.

The driver adjusts the parameters against hardware limits and returns the actual parameters as VID-

IOC_G_FMT does. Like VIDIOC_S_FMT, the VIDIOC_TRY_FMT ioctl can be used to learn about driver capabilities without actually changing driver state. Unlike VIDIOC_S_FMT this also works after the overlay has been enabled.

A struct v4l2_crop defines the size and position of the target rectangle. The scaling factor of the overlay is implied by the width and height given in struct

v4l2_window

and struct v4l2_crop. The cropping API applies to Video Output and Video Output Overlay devices in the same way as to Video Capture and

Video Overlay devices, merely reversing the direction of the data flow. For more information see

Image

Cropping, Insertion and Scaling

.

Enabling Overlay

There is no V4L2 ioctl to enable or disable the overlay, however the framebuffer interface of the driver may support the FBIOBLANK ioctl.

Codec Interface

A V4L2 codec can compress, decompress, transform, or otherwise convert video data from one format into another format, in memory. Typically such devices are memory-to-memory devices (i.e. devices with the V4L2_CAP_VIDEO_M2M or V4L2_CAP_VIDEO_M2M_MPLANE capability set).

A memory-to-memory video node acts just like a normal video node, but it supports both output (sending frames from memory to the codec hardware) and capture (receiving the processed frames from the codec

122 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

hardware into memory) stream I/O. An application will have to setup the stream I/O for both sides and finally call VIDIOC_STREAMON for both capture and output to start the codec.

Video compression codecs use the MPEG controls to setup their codec parameters

Note:

The MPEG controls actually support many more codecs than just MPEG. See

Codec Control Reference

.

Memory-to-memory devices function as a shared resource: you can open the video node multiple times, each application setting up their own codec properties that are local to the file handle, and each can use it independently from the others. The driver will arbitrate access to the codec and reprogram it whenever another file handler gets access. This is different from the usual video node behavior where the video properties are global to the device (i.e. changing something through one file handle is visible through another file handle).

Effect Devices Interface

Note:

This interface has been be suspended from the V4L2 API. The implementation for such effects should be done via mem2mem devices.

A V4L2 video effect device can do image effects, filtering, or combine two or more images or image streams. For example video transitions or wipes. Applications send data to be processed and receive the result data either with read() and write() functions, or through the streaming I/O mechanism.

[to do]

Raw VBI Data Interface

VBI is an abbreviation of Vertical Blanking Interval, a gap in the sequence of lines of an analog video signal. During VBI no picture information is transmitted, allowing some time while the electron beam of a cathode ray tube TV returns to the top of the screen. Using an oscilloscope you will find here the vertical synchronization pulses and short data packages ASK modulated

20

onto the video signal. These are transmissions of services such as Teletext or Closed Caption.

Subject of this interface type is raw VBI data, as sampled off a video signal, or to be added to a signal for output. The data format is similar to uncompressed video images, a number of lines times a number of samples per line, we call this a VBI image.

Conventionally V4L2 VBI devices are accessed through character device special files named /dev/vbi and

/dev/vbi0 to /dev/vbi31 with major number 81 and minor numbers 224 to 255. /dev/vbi is typically a symbolic link to the preferred VBI device. This convention applies to both input and output devices.

To address the problems of finding related video and VBI devices VBI capturing and output is also available as device function under /dev/video. To capture or output raw VBI data with these devices applications must call the VIDIOC_S_FMT ioctl. Accessed as /dev/vbi, raw VBI capturing or output is the default device function.

Querying Capabilities

Devices supporting the raw VBI capturing or output API set the V4L2_CAP_VBI_CAPTURE or

V4L2_CAP_VBI_OUTPUT flags, respectively, in the capabilities field of struct v4l2_capability returned

20

ASK: Amplitude-Shift Keying. A high signal level represents a `1' bit, a low level a `0' bit.

1.2. Part I - Video for Linux API 123

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

by the ioctl VIDIOC_QUERYCAP ioctl. At least one of the read/write, streaming or asynchronous I/O methods must be supported. VBI devices may or may not have a tuner or modulator.

Supplemental Functions

VBI devices shall support

video input or output

,

tuner or modulator

, and

controls

ioctls as needed. The

video standard

ioctls provide information vital to program a VBI device, therefore must be supported.

Raw VBI Format Negotiation

Raw VBI sampling abilities can vary, in particular the sampling frequency. To properly interpret the data

V4L2 specifies an ioctl to query the sampling parameters. Moreover, to allow for some flexibility applications can also suggest different parameters.

As usual these parameters are not reset at open() time to permit Unix tool chains, programming a device and then reading from it as if it was a plain file. Well written V4L2 applications should always ensure they really get what they want, requesting reasonable parameters and then checking if the actual parameters are suitable.

To query the current raw VBI capture parameters applications set the type field of a struct v4l2_format to V4L2_BUF_TYPE_VBI_CAPTURE or V4L2_BUF_TYPE_VBI_OUTPUT, and call the VIDIOC_G_FMT ioctl with a pointer to this structure. Drivers fill the struct

v4l2_vbi_format

vbi member of the fmt union.

To request different parameters applications set the type field of a struct v4l2_format as above and initialize all fields of the struct

v4l2_vbi_format

vbi member of the fmt union, or better just modify the results of VIDIOC_G_FMT, and call the VIDIOC_S_FMT ioctl with a pointer to this structure. Drivers return an EINVAL error code only when the given parameters are ambiguous, otherwise they modify the parameters according to the hardware capabilities and return the actual parameters. When the driver allocates resources at this point, it may return an EBUSY error code to indicate the returned parameters are valid but the required resources are currently not available. That may happen for instance when the video and VBI areas to capture would overlap, or when the driver supports multiple opens and another process already requested VBI capturing or output. Anyway, applications must expect other resource allocation points which may return EBUSY, at the ioctl VIDIOC_STREAMON, VIDIOC_STREAMOFF ioctl and the first read() , write() and select() calls.

VBI devices must implement both the VIDIOC_G_FMT and VIDIOC_S_FMT ioctl, even if VIDIOC_S_FMT ignores all requests and always returns default parameters as VIDIOC_G_FMT does. VIDIOC_TRY_FMT is optional.

v4l2_vbi_format

__u32

__u32 sampling_rate offset

Samples per second, i. e. unit 1 Hz.

Horizontal offset of the VBI image, relative to the leading edge of the line synchronization pulse and counted in samples: The first sample in the VBI image will be located offset / sampling_rate seconds following the leading edge. See also

Figure 4.1. Line synchronization

.

__u32 samples_per_line

124 Chapter 1. Linux Media Infrastructure userspace API

Table 1.30: struct v4l2_vbi_format

Continued on next page

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Table 1.30 -- continued from previous page

__u32 sample_format Defines the sample format as in

Image Formats

, a fourcharacter-code.

21

Usually this is V4L2_PIX_FMT_GREY, i. e.

each sample consists of 8 bits with lower values oriented towards the black level. Do not assume any other correlation of values with the signal level. For example, the MSB does not necessarily indicate if the signal is `high' or `low' because

128 may not be the mean value of the signal. Drivers shall not convert the sample format by software.

__u32 start

2

This is the scanning system line number associated with the first line of the VBI image, of the first and the second field respectively. See

Figure 4.2. ITU-R 525 line numbering

(M/NTSC and M/PAL)

and

Figure 4.3. ITU-R 625 line numbering

for valid values. The V4L2_VBI_ITU_525_F1_START,

V4L2_VBI_ITU_525_F2_START, V4L2_VBI_ITU_625_F1_START and V4L2_VBI_ITU_625_F2_START defines give the start line numbers for each field for each 525 or 625 line format as a convenience. Don't forget that ITU line numbering starts at 1, not 0. VBI input drivers can return start values 0 if the hardware cannot reliable identify scanning lines, VBI acquisition may not require this information.

__u32

__u32 count

2 flags

The number of lines in the first and second field image, respectively.

Drivers should be as flexibility as possible. For example, it may be possible to extend or move the VBI capture window down to the picture area, implementing a `full field mode' to capture data service transmissions embedded in the picture. An application can set the first or second count value to zero if no data is required from the respective field; count[1] if the scanning system is progressive, i. e. not interlaced. The corresponding start value shall be ignored by the application and driver. Anyway, drivers may not support single field capturing and return both count values non-zero. Both count values set to zero, or line numbers are outside the bounds depicted

22

, or a field image covering lines of two fields, are invalid and shall not be returned by the driver. To initialize the start and count fields, applications must first determine the current video standard selection. The v4l2_std_id or the framelines field of struct v4l2_standard can be evaluated for this purpose.

See

Raw VBI Format Flags

below. Currently only drivers set flags, applications must set this field to zero.

__u32 reserved

2

This array is reserved for future extensions. Drivers and applications must set it to zero.

Table 1.31: Raw VBI Format Flags

V4L2_VBI_UNSYNC 0x0001 This flag indicates hardware which does not properly distinguish between fields. Normally the VBI image stores the first field (lower scanning line numbers) first in memory. This may be a top or bottom field depending on the video standard. When this flag is set the first or second field may be stored first, however the fields are still in correct temporal order with the older field first in memory.

24

V4L2_VBI_INTERLACED 0x0002 By default the two field images will be passed sequentially; all lines of the first field followed by all lines of the second field (compare

Field Order

V4L2_FIELD_SEQ_TB and V4L2_FIELD_SEQ_BT, whether the top or bottom field is first in memory depends on the video standard). When this flag is set, the two fields are interlaced (cf.

V4L2_FIELD_INTERLACED). The first line of the first field followed by the first line of the second field, then the two second lines, and so on. Such a layout may be necessary when the hardware has been programmed to capture or output interlaced video images and is unable to separate the fields for VBI capturing at the same time. For simplicity setting this flag implies that both count values are equal and non-zero.

Figure 1.6: Figure 4.1. Line synchronization

Remember the VBI image format depends on the selected video standard, therefore the application must choose a new standard or query the current standard first. Attempts to read or write data ahead of format

21

22

A few devices may be unable to sample VBI data at all but can extend the video capture window to the VBI region.

The valid values ar shown at

Figure 4.2. ITU-R 525 line numbering (M/NTSC and M/PAL)

and

Figure 4.3. ITU-R 625 line numbering

.

1.2. Part I - Video for Linux API 125

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Figure 1.7: Figure 4.2. ITU-R 525 line numbering (M/NTSC and M/PAL)

Figure 1.8: Figure 4.3. ITU-R 625 line numbering negotiation, or after switching the video standard which may invalidate the negotiated VBI parameters, should be refused by the driver. A format change during active I/O is not permitted.

Reading and writing VBI images

To assure synchronization with the field number and easier implementation, the smallest unit of data passed at a time is one frame, consisting of two fields of VBI images immediately following in memory.

The total size of a frame computes as follows:

(count[ 0 ] + count[ 1 ]) * samples_per_line * sample size in bytes

The sample size is most likely always one byte, applications must check the sample_format field though, to function properly with other drivers.

A VBI device may support

read/write

and/or streaming (

memory mapping

or

user pointer

) I/O. The latter bears the possibility of synchronizing video and VBI data by using buffer timestamps.

Remember the VIDIOC_STREAMON ioctl and the first read(), write() and select() call can be resource allocation points returning an EBUSY error code if the required hardware resources are temporarily unavailable, for example the device is already in use by another process.

Sliced VBI Data Interface

VBI stands for Vertical Blanking Interval, a gap in the sequence of lines of an analog video signal. During

VBI no picture information is transmitted, allowing some time while the electron beam of a cathode ray tube TV returns to the top of the screen.

Sliced VBI devices use hardware to demodulate data transmitted in the VBI. V4L2 drivers shall not do this by software, see also the

raw VBI interface

. The data is passed as short packets of fixed size, covering

one scan line each. The number of packets per video frame is variable.

Sliced VBI capture and output devices are accessed through the same character special files as raw VBI devices. When a driver supports both interfaces, the default function of a /dev/vbi device is raw VBI capturing or output, and the sliced VBI function is only available after calling the VIDIOC_S_FMT ioctl as defined below. Likewise a /dev/video device may support the sliced VBI API, however the default function here is video capturing or output. Different file descriptors must be used to pass raw and sliced VBI data simultaneously, if this is supported by the driver.

Querying Capabilities

Devices supporting the sliced VBI capturing or output API set the V4L2_CAP_SLICED_VBI_CAPTURE or

V4L2_CAP_SLICED_VBI_OUTPUT flag respectively, in the capabilities field of struct v4l2_capability returned by the ioctl VIDIOC_QUERYCAP ioctl. At least one of the read/write, streaming or asynchronous

I/O methods

must be supported. Sliced VBI devices may have a tuner or modulator.

Supplemental Functions

Sliced VBI devices shall support

video input or output

and

tuner or modulator

ioctls if they have these capabilities, and they may support

User Controls

ioctls. The

video standard

ioctls provide information vital to program a sliced VBI device, therefore must be supported.

126 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Sliced VBI Format Negotiation

To find out which data services are supported by the hardware applications can call the VID-

IOC_G_SLICED_VBI_CAP ioctl. All drivers implementing the sliced VBI interface must support this ioctl.

The results may differ from those of the VIDIOC_S_FMT ioctl when the number of VBI lines the hardware can capture or output per frame, or the number of services it can identify on a given line are limited. For example on PAL line 16 the hardware may be able to look for a VPS or Teletext signal, but not both at the same time.

To determine the currently selected services applications set the type field of struct v4l2_format to

V4L2_BUF_TYPE_SLICED_VBI_CAPTURE or V4L2_BUF_TYPE_SLICED_VBI_OUTPUT, and the VIDIOC_G_FMT ioctl fills the fmt.sliced member, a struct

v4l2_sliced_vbi_format

.

Applications can request different parameters by initializing or modifying the fmt.sliced member and calling the VIDIOC_S_FMT ioctl with a pointer to the struct v4l2_format structure.

The sliced VBI API is more complicated than the raw VBI API because the hardware must be told which

VBI service to expect on each scan line. Not all services may be supported by the hardware on all lines

(this is especially true for VBI output where Teletext is often unsupported and other services can only be inserted in one specific line). In many cases, however, it is sufficient to just set the service_set field to the required services and let the driver fill the service_lines array according to hardware capabilities.

Only if more precise control is needed should the programmer set the service_lines array explicitly.

The VIDIOC_S_FMT ioctl modifies the parameters according to hardware capabilities. When the driver allocates resources at this point, it may return an EBUSY error code if the required resources are temporarily unavailable. Other resource allocation points which may return EBUSY can be the ioctl VIDIOC_STREAMON,

VIDIOC_STREAMOFF ioctl and the first read(), write() and select() call.

v4l2_sliced_vbi_format

__u32

__u16 service_set service_lines[2][24]

__u32 io_size

__u32 reserved[2]

If service_set is non-zero when passed with VIDIOC_S_FMT or VIDIOC_TRY_FMT, the service_lines array will be filled by the driver according to the services specified in this field. For example, if service_set is initialized with V4L2_SLICED_TELETEXT_B | V4L2_SLICED_WSS_625, a driver for the cx25840 video decoder sets lines 7-22 of both fields

25

to V4L2_SLICED_TELETEXT_B and line 23 of the first field to V4L2_SLICED_WSS_625. If service_set is set to zero, then the values of service_lines will be used instead. On return the driver sets this field to the union of all elements of the returned service_lines array. It may contain less services than requested, perhaps just one, if the hardware cannot handle more services simultaneously. It may be empty (zero) if none of the requested services are supported by the hardware.

Applications initialize this array with sets of data services the driver shall look for or insert on the respective scan line. Subject to hardware capabilities drivers return the requested set, a subset, which may be just a single service, or an empty set. When the hardware cannot handle multiple services on the same line the driver shall choose one. No assumptions can be made on which service the driver chooses. Data services are defined in

Sliced VBI services

. Array indices map to ITU-R line numbers

26

as follows:

Element service_lines[0][1]

525 line systems

1

625 line systems

1 service_lines[0][23] 23 service_lines[1][1] 264

23

314 service_lines[1][23] 286 336

Drivers must set service_lines [0][0] and service_lines[1][0] to zero. The V4L2_VBI_ITU_525_F1_START, V4L2_VBI_ITU_525_F2_START, V4L2_VBI_ITU_625_F1_START and V4L2_VBI_ITU_625_F2_START defines give the start line numbers for each field for each 525 or 625 line format as a convenience. Don't forget that ITU line numbering starts at 1, not 0.

Maximum number of bytes passed by one read() or write() call, and the buffer size in bytes for the ioctl VIDIOC_QBUF, VIDIOC_DQBUF and VIDIOC_DQBUF ioctl. Drivers set this field to the size of struct

v4l2_sliced_vbi_data

times the number of non-zero elements in the returned service_lines array (that is the number of lines potentially carrying data).

This array is reserved for future extensions. Applications and drivers must set it to zero.

struct v4l2_sliced_vbi_format

25

26

According to ETS 300 706 lines 6-22 of the first field and lines 5-22 of the second field may carry Teletext data.

See also

Figure 4.2. ITU-R 525 line numbering (M/NTSC and M/PAL)

and

Figure 4.3. ITU-R 625 line numbering

.

1.2. Part I - Video for Linux API 127

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Sliced VBI services

Symbol

V4L2_SLICED_TELETEXT_B

(Teletext System B)

V4L2_SLICED_VPS

Value Reference

0x0001 ETS 300 706,

ITU BT.653

V4L2_SLICED_CAPTION_525 0x1000

CEA 608-E

V4L2_SLICED_WSS_625

0x0400

ETS 300 231

0x4000 ITU BT.1119,

EN 300 294

Lines, usually Payload

PAL/SECAM Last 42 of the 45 byte Teletext packet, that is withline 7-22,

320-335 (second field

7-22)

PAL line 16 out clock run-in and framing code, lsb first transmitted.

Byte number 3 to 15 according to Figure 9 of ETS

300 231, lsb first transmitted.

NTSC line 21,

284 (second field 21)

PAL/SECAM line 23

Two bytes in transmission order, including parity bit, lsb first transmitted.

Byte 0 1 msb lsb msb lsb

Bit 7 6 5 4 3 2 1 0 x x 13 12 11 10 9

V4L2_SLICED_VBI_525

V4L2_SLICED_VBI_625

0x1000 Set of services applicable to 525 line systems.

0x4401 Set of services applicable to 625 line systems.

Drivers may return an EINVAL error code when applications attempt to read or write data without prior format negotiation, after switching the video standard (which may invalidate the negotiated VBI parameters) and after switching the video input (which may change the video standard as a side effect).

The VIDIOC_S_FMT ioctl may return an EBUSY error code when applications attempt to change the format while i/o is in progress (between a ioctl VIDIOC_STREAMON, VIDIOC_STREAMOFF and VIDIOC_STREAMOFF call, and after the first read() or write() call).

Reading and writing sliced VBI data

A single read() or write() call must pass all data belonging to one video frame. That is an array of struct

v4l2_sliced_vbi_data

structures with one or more elements and a total size not exceeding io_size bytes. Likewise in streaming I/O mode one buffer of io_size bytes must contain data of one video frame.

The id of unused struct

v4l2_sliced_vbi_data

elements must be zero.

v4l2_sliced_vbi_data

128 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d struct v4l2_sliced_vbi_data

__u32

__u32

__u32

__u32

__u8 id field line reserved data[48]

A flag from Sliced VBI services identifying the type of data in this packet. Only a single bit must be set. When the id of a captured packet is zero, the packet is empty and the contents of other fields are undefined. Applications shall ignore empty packets. When the id of a packet for output is zero the contents of the data field are undefined and the driver must no longer insert data on the requested field and line.

The video field number this data has been captured from, or shall be inserted at. 0 for the first field, 1 for the second field.

The field (as opposed to frame) line number this data has been captured from, or shall be inserted at.

See

Figure 4.2.

ITU-R 525 line numbering

(M/NTSC and M/PAL)

and

Figure 4.3. ITU-R 625 line numbering

for valid values. Sliced VBI capture devices can set the line number of all packets to 0 if the hardware cannot reliably identify scan lines. The field number must always be valid.

This field is reserved for future extensions. Applications and drivers must set it to zero.

The packet payload. See Sliced VBI services for the contents and number of bytes passed for each data type. The contents of padding bytes at the end of this array are undefined, drivers and applications shall ignore them.

Packets are always passed in ascending line number order, without duplicate line numbers. The write() function and the ioctl VIDIOC_QBUF, VIDIOC_DQBUF ioctl must return an EINVAL error code when applications violate this rule. They must also return an EINVAL error code when applications pass an incorrect field or line number, or a combination of field, line and id which has not been negotiated with the VID-

IOC_G_FMT or VIDIOC_S_FMT ioctl. When the line numbers are unknown the driver must pass the packets in transmitted order. The driver can insert empty packets with id set to zero anywhere in the packet array.

To assure synchronization and to distinguish from frame dropping, when a captured frame does not carry any of the requested data services drivers must pass one or more empty packets. When an application fails to pass VBI data in time for output, the driver must output the last VPS and WSS packet again, and disable the output of Closed Caption and Teletext data, or output data which is ignored by Closed Caption and Teletext decoders.

A sliced VBI device may support

read/write

and/or streaming (

memory mapping

and/or

user pointer

) I/O.

The latter bears the possibility of synchronizing video and VBI data by using buffer timestamps.

Sliced VBI Data in MPEG Streams

If a device can produce an MPEG output stream, it may be capable of providing

negotiated sliced VBI services

as data embedded in the MPEG stream. Users or applications control this sliced VBI data insertion with the

V4L2_CID_MPEG_STREAM_VBI_FMT

control.

If the driver does not provide the

V4L2_CID_MPEG_STREAM_VBI_FMT

control, or only allows that control to be set to

V4L2_MPEG_STREAM_VBI_FMT_NONE

, then the device cannot embed sliced VBI data in the

MPEG stream.

The

V4L2_CID_MPEG_STREAM_VBI_FMT

control does not implicitly set the device driver to capture nor cease capturing sliced VBI data. The control only indicates to embed sliced VBI data in the MPEG stream, if an application has negotiated sliced VBI service be captured.

It may also be the case that a device can embed sliced VBI data in only certain types of MPEG streams: for

1.2. Part I - Video for Linux API 129

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

example in an MPEG-2 PS but not an MPEG-2 TS. In this situation, if sliced VBI data insertion is requested, the sliced VBI data will be embedded in MPEG stream types when supported, and silently omitted from

MPEG stream types where sliced VBI data insertion is not supported by the device.

The following subsections specify the format of the embedded sliced VBI data.

MPEG Stream Embedded, Sliced VBI Data Format:

NONE The

V4L2_MPEG_STREAM_VBI_FMT_NONE

embedded sliced VBI format shall be interpreted by drivers as a control to cease embedding sliced VBI data in MPEG streams. Neither the device nor driver shall insert

``empty'' embedded sliced VBI data packets in the MPEG stream when this format is set. No MPEG stream data structures are specified for this format.

MPEG Stream Embedded, Sliced VBI Data Format: IVTV The

V4L2_MPEG_STREAM_VBI_FMT_IVTV

embedded sliced VBI format, when supported, indicates to the driver to embed up to 36 lines of sliced

VBI data per frame in an MPEG-2 Private Stream 1 PES packet encapsulated in an MPEG-2 Program Pack in the MPEG stream.

Historical context: This format specification originates from a custom, embedded, sliced VBI data format used by the ivtv driver. This format has already been informally specified in the kernel sources in the file Documentation/video4linux/cx2341x/README.vbi . The maximum size of the payload and other aspects of this format are driven by the CX23415 MPEG decoder's capabilities and limitations with respect to extracting, decoding, and displaying sliced VBI data embedded within an MPEG stream.

This format's use is not exclusive to the ivtv driver nor exclusive to CX2341x devices, as the sliced VBI data packet insertion into the MPEG stream is implemented in driver software. At least the cx18 driver provides sliced VBI data insertion into an MPEG-2 PS in this format as well.

The following definitions specify the payload of the MPEG-2 Private Stream 1 PES packets that contain sliced VBI data when

V4L2_MPEG_STREAM_VBI_FMT_IVTV

is set. (The MPEG-2 Private Stream 1 PES packet header and encapsulating MPEG-2 Program Pack header are not detailed here. Please refer to the MPEG-2 specifications for details on those packet headers.)

The payload of the MPEG-2 Private Stream 1 PES packets that contain sliced VBI data is specified by struct

v4l2_mpeg_vbi_fmt_ivtv . The payload is variable length, depending on the actual number of lines of

sliced VBI data present in a video frame. The payload may be padded at the end with unspecified fill bytes to align the end of the payload to a 4-byte boundary. The payload shall never exceed 1552 bytes (2 fields with 18 lines/field with 43 bytes of data/line and a 4 byte magic number).

v4l2_mpeg_vbi_fmt_ivtv struct v4l2_mpeg_vbi_fmt_ivtv

__u8 magic[4] A ``magic'' constant from

Magic Constants for struct v4l2_mpeg_vbi_fmt_ivtv magic field

that indicates this is a valid sliced VBI data payload and also indicates which member of the anonymous union, itv0 or ITV0, to use for the payload data.

union (anonymous) struct

v4l2_mpeg_vbi_itv0

struct

v4l2_mpeg_vbi_ITV0

itv0 The primary form of the sliced VBI data payload that contains anywhere from 1 to 35 lines of sliced VBI data. Line masks are provided in this form of the payload indicating which VBI lines are provided.

ITV0 An alternate form of the sliced VBI data payload used when 36 lines of sliced VBI data are present. No line masks are provided in this form of the payload; all valid line mask bits are implcitly set.

Magic Constants for struct v4l2_mpeg_vbi_fmt_ivtv magic field

130 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Defined Symbol

V4L2_MPEG_VBI_IVTV_MAGIC0

V4L2_MPEG_VBI_IVTV_MAGIC1

Value

``itv0''

``ITV0''

Description

Indicates the itv0 member of the union in struct

v4l2_mpeg_vbi_fmt_ivtv

is valid.

Indicates the ITV0 member of the union in struct

v4l2_mpeg_vbi_fmt_ivtv

is valid and that 36 lines of sliced VBI data are present.

v4l2_mpeg_vbi_itv0 v4l2_mpeg_vbi_ITV0 structs v4l2_mpeg_vbi_itv0 and v4l2_mpeg_vbi_ITV0

__le32 struct

v4l2_mpeg_vbi_itv0_line

linemask[2] line[35]

Bitmasks indicating the VBI service lines present.

These linemask values are stored in little endian byte order in the

MPEG stream. Some reference linemask bit positions with their corresponding VBI line number and video field are given below. b

0 value: indicates the least significant bit of a linemask linemask[0] b0: linemask[0] b17: linemask[0] b18: linemask[0] b31: line line

6 line 23

6 line 19 first field first field second field second field linemask[1] b0: linemask[1] b3: line 20 line 23 second field second field linemask[1] b4-b31: unused and set to 0

This is a variable length array that holds from 1 to 35 lines of sliced VBI data. The sliced VBI data lines present correspond to the bits set in the linemask array, starting from b

0 of linemask[0] up through b

31 of linemask[1] up through b

3 of linemask[0], and from b

0 of linemask[1]. line[0] corresponds to the first bit found set in the linemask array, line[1] corresponds to the second bit found set in the linemask array, etc. If no linemask array bits are set, then line[0] may contain one line of unspecified data that should be ignored by applications.

struct v4l2_mpeg_vbi_ITV0

struct

v4l2_mpeg_vbi_itv0_line

line[36] A fixed length array of 36 lines of sliced VBI data.

line[0] through line[17] correspond to lines 6 through 23 of the first field.

line[18] through line[35] corresponds to lines 6 through 23 of the second field.

v4l2_mpeg_vbi_itv0_line struct v4l2_mpeg_vbi_itv0_line

__u8

__u8 id data[42]

A line identifier value from

Line Identifiers for struct v4l2_mpeg_vbi_itv0_line id field

that indicates the type of sliced VBI data stored on this line.

The sliced VBI data for the line.

1.2. Part I - Video for Linux API 131

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Line Identifiers for struct v4l2_mpeg_vbi_itv0_line id field

Defined Symbol

V4L2_MPEG_VBI_IVTV_TELETEXT_B

V4L2_MPEG_VBI_IVTV_CAPTION_525

V4L2_MPEG_VBI_IVTV_WSS_625

V4L2_MPEG_VBI_IVTV_VPS

Value

1

4

5

7

Teletext Interface

This interface was aimed at devices receiving and demodulating Teletext data [ETS 300 706, ITU BT.653], evaluating the Teletext packages and storing formatted pages in cache memory. Such devices are usually implemented as microcontrollers with serial interface (I:sup:2C) and could be found on old TV cards, dedicated Teletext decoding cards and home-brew devices connected to the PC parallel port.

The Teletext API was designed by Martin Buck. It was defined in the kernel header file linux/videotext.h, the specification is available from ftp://ftp.gwdg.de/pub/linux/misc/videotext/ . (Videotext is the name of the German public television Teletext service.)

Eventually the Teletext API was integrated into the V4L API with character device file names /dev/vtx0 to /dev/vtx31, device major number 81, minor numbers 192 to 223.

However, teletext decoders were quickly replaced by more generic VBI demodulators and those dedicated teletext decoders no longer exist. For many years the vtx devices were still around, even though nobody used them. So the decision was made to finally remove support for the Teletext API in kernel 2.6.37.

Modern devices all use the

raw

or

Sliced VBI Data Interface

VBI API.

Radio Interface

This interface is intended for AM and FM (analog) radio receivers and transmitters.

Conventionally V4L2 radio devices are accessed through character device special files named /dev/radio and /dev/radio0 to /dev/radio63 with major number 81 and minor numbers 64 to 127.

Querying Capabilities

Devices supporting the radio interface set the V4L2_CAP_RADIO and V4L2_CAP_TUNER or

V4L2_CAP_MODULATOR flag in the capabilities field of struct v4l2_capability returned by the

ioctl VIDIOC_QUERYCAP ioctl. Other combinations of capability flags are reserved for future extensions.

Supplemental Functions

Radio devices can support

controls

, and must support the

tuner or modulator

ioctls.

They do not support the video input or output, audio input or output, video standard, cropping and scaling, compression and streaming parameter, or overlay ioctls. All other ioctls and I/O methods are reserved for future extensions.

Programming

Radio devices may have a couple audio controls (as discussed in

User Controls

) such as a volume control,

possibly custom controls. Further all radio devices have one tuner or modulator (these are discussed in

Tuners and Modulators

) with index number zero to select the radio frequency and to determine if a monaural or FM stereo program is received/emitted. Drivers switch automatically between AM and FM

132 Chapter 1. Linux Media Infrastructure userspace API

Description

Refer to

Sliced VBI services

for a description of the line payload.

Refer to

Sliced VBI services

for a description of the line payload.

Refer to

Sliced VBI services

for a description of the line payload.

Refer to

Sliced VBI services

for a description of the line payload.

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

depending on the selected frequency. The VIDIOC_G_TUNER or VIDIOC_G_MODULATOR ioctl reports the supported frequency range.

RDS Interface

The Radio Data System transmits supplementary information in binary format, for example the station name or travel information, on an inaudible audio subcarrier of a radio program. This interface is aimed at devices capable of receiving and/or transmitting RDS information.

For more information see the core RDS standard IEC 62106 and the RBDS standard NRSC-4-B.

Note:

Note that the RBDS standard as is used in the USA is almost identical to the RDS standard. Any RDS decoder/encoder can also handle RBDS. Only some of the fields have slightly different meanings. See the RBDS standard for more information.

The RBDS standard also specifies support for MMBS (Modified Mobile Search). This is a proprietary format which seems to be discontinued. The RDS interface does not support this format. Should support for

MMBS (or the so-called `E blocks' in general) be needed, then please contact the linux-media mailing list: https://linuxtv.org/lists.php

.

Querying Capabilities

Devices supporting the RDS capturing API set the V4L2_CAP_RDS_CAPTURE flag in the capabilities field of struct v4l2_capability returned by the ioctl VIDIOC_QUERYCAP ioctl. Any tuner that supports RDS will set the V4L2_TUNER_CAP_RDS flag in the capability field of struct v4l2_tuner. If the driver only passes RDS blocks without interpreting the data the V4L2_TUNER_CAP_RDS_BLOCK_IO flag has to be set, see

Reading RDS data

. For future use the flag V4L2_TUNER_CAP_RDS_CONTROLS has also been defined.

However, a driver for a radio tuner with this capability does not yet exist, so if you are planning to write such a driver you should discuss this on the linux-media mailing list: https://linuxtv.org/lists.php

.

Whether an RDS signal is present can be detected by looking at the rxsubchans field of struct v4l2_tuner: the V4L2_TUNER_SUB_RDS will be set if RDS data was detected.

Devices supporting the RDS output API set the V4L2_CAP_RDS_OUTPUT flag in the capabilities field of struct v4l2_capability returned by the ioctl VIDIOC_QUERYCAP ioctl.

Any modulator that supports RDS will set the V4L2_TUNER_CAP_RDS flag in the capability field of struct v4l2_modulator. In order to enable the RDS transmission one must set the V4L2_TUNER_SUB_RDS bit in the txsubchans field of struct v4l2_modulator. If the driver only passes RDS blocks without interpreting the data the

V4L2_TUNER_CAP_RDS_BLOCK_IO flag has to be set. If the tuner is capable of handling RDS entities like program identification codes and radio text, the flag V4L2_TUNER_CAP_RDS_CONTROLS should be set, see

Writing RDS data

and

FM Transmitter Control Reference

.

Reading RDS data

RDS data can be read from the radio device with the read() function. The data is packed in groups of three bytes.

Writing RDS data

RDS data can be written to the radio device with the write() function. The data is packed in groups of three bytes, as follows:

1.2. Part I - Video for Linux API 133

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

RDS datastructures v4l2_rds_data

__u8

__u8

__u8

Bits 0-2

Bits 3-5

Bit 6

Bit 7 lsb msb block

Table 1.33: struct v4l2_rds_data

Least Significant Byte of RDS Block

Most Significant Byte of RDS Block

Block description

Table 1.34: Block description

Block (aka offset) of the received data.

Deprecated. Currently identical to bits 0-2. Do not use these bits.

Corrected bit. Indicates that an error was corrected for this data block.

Error bit. Indicates that an uncorrectable error occurred during reception of this block.

V4L2_RDS_BLOCK_MSK

V4L2_RDS_BLOCK_A

V4L2_RDS_BLOCK_B

V4L2_RDS_BLOCK_C

V4L2_RDS_BLOCK_D

V4L2_RDS_BLOCK_C_ALT

V4L2_RDS_BLOCK_INVALID

Table 1.35: Block defines read-only

V4L2_RDS_BLOCK_CORRECTED read-only

V4L2_RDS_BLOCK_ERROR read-only

2

3

4

7

7

0

1

0x40

0x80

Mask for bits 0-2 to get the block ID.

Block A.

Block B.

Block C.

Block D.

Block C'.

An invalid block.

A bit error was detected but corrected.

An uncorrectable error occurred.

Software Defined Radio Interface (SDR)

SDR is an abbreviation of Software Defined Radio, the radio device which uses application software for modulation or demodulation. This interface is intended for controlling and data streaming of such devices.

SDR devices are accessed through character device special files named /dev/swradio0 to

/dev/swradio255 with major number 81 and dynamically allocated minor numbers 0 to 255.

Querying Capabilities

Devices supporting the SDR receiver interface set the V4L2_CAP_SDR_CAPTURE and V4L2_CAP_TUNER flag in the capabilities field of struct v4l2_capability returned by the ioctl VIDIOC_QUERYCAP ioctl. That flag means the device has an Analog to Digital Converter (ADC), which is a mandatory element for the

SDR receiver.

Devices supporting the SDR transmitter interface set the V4L2_CAP_SDR_OUTPUT and

V4L2_CAP_MODULATOR flag in the capabilities field of struct v4l2_capability returned by the

ioctl VIDIOC_QUERYCAP ioctl. That flag means the device has an Digital to Analog Converter (DAC), which is a mandatory element for the SDR transmitter.

At least one of the read/write, streaming or asynchronous I/O methods must be supported.

Supplemental Functions

SDR devices can support

controls

, and must support the

Tuners and Modulators

ioctls. Tuner ioctls are used for setting the ADC/DAC sampling rate (sampling frequency) and the possible radio frequency (RF).

134 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

The V4L2_TUNER_SDR tuner type is used for setting SDR device ADC/DAC frequency, and the

V4L2_TUNER_RF tuner type is used for setting radio frequency. The tuner index of the RF tuner (if any) must always follow the SDR tuner index. Normally the SDR tuner is #0 and the RF tuner is #1.

The ioctl VIDIOC_S_HW_FREQ_SEEK ioctl is not supported.

Data Format Negotiation

The SDR device uses the

Data Formats

ioctls to select the capture and output format. Both the sampling resolution and the data streaming format are bound to that selectable format. In addition to the basic

Data Formats

ioctls, the ioctl VIDIOC_ENUM_FMT ioctl must be supported as well.

To use the

Data Formats

ioctls applications set the type field of a struct v4l2_format to

V4L2_BUF_TYPE_SDR_CAPTURE or V4L2_BUF_TYPE_SDR_OUTPUT and use the struct

v4l2_sdr_format

sdr member of the fmt union as needed per the desired operation. Currently there is two fields, pixelformat and buffersize, of struct struct

v4l2_sdr_format

which are used. Content of the pixelformat is V4L2

FourCC code of the data format. The buffersize field is maximum buffer size in bytes required for data transfer, set by the driver in order to inform application.

v4l2_sdr_format

__u32

__u32

__u8

Table 1.36: struct v4l2_sdr_format pixelformat buffersize reserved[24]

The data format or type of compression, set by the application. This is a little endian four character

code. V4L2 defines SDR formats in

SDR Formats

.

Maximum size in bytes required for data. Value is set by the driver.

This array is reserved for future extensions.

Drivers and applications must set it to zero.

An SDR device may support

read/write

and/or streaming (

memory mapping

or

user pointer

) I/O.

Touch Devices

Touch devices are accessed through character device special files named /dev/v4l-touch0 to /dev/v4ltouch255 with major number 81 and dynamically allocated minor numbers 0 to 255.

Overview

Sensors may be Optical, or Projected Capacitive touch (PCT).

Processing is required to analyse the raw data and produce input events. In some systems, this may be performed on the ASIC and the raw data is purely a side-channel for diagnostics or tuning. In other systems, the ASIC is a simple analogue front end device which delivers touch data at high rate, and any touch processing must be done on the host.

For capacitive touch sensing, the touchscreen is composed of an array of horizontal and vertical conductors (alternatively called rows/columns, X/Y lines, or tx/rx). Mutual Capacitance measured is at the nodes where the conductors cross. Alternatively, Self Capacitance measures the signal from each column and row independently.

A touch input may be determined by comparing the raw capacitance measurement to a no-touch reference

(or ``baseline'') measurement:

Delta = Raw - Reference

The reference measurement takes account of variations in the capacitance across the touch sensor matrix, for example manufacturing irregularities, environmental or edge effects.

1.2. Part I - Video for Linux API 135

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Querying Capabilities

Devices supporting the touch interface set the V4L2_CAP_VIDEO_CAPTURE flag and the V4L2_CAP_TOUCH flag in the capabilities field of v4l2_capability returned by the ioctl VIDIOC_QUERYCAP ioctl.

At least one of the read/write or streaming I/O methods must be supported.

The formats supported by touch devices are documented in

Touch Formats

.

Data Format Negotiation

A touch device may support any I/O method.

Event Interface

The V4L2 event interface provides a means for a user to get immediately notified on certain conditions taking place on a device. This might include start of frame or loss of signal events, for example. Changes in the value or state of a V4L2 control can also be reported through events.

To receive events, the events the user is interested in first must be subscribed using the ioctl VID-

IOC_SUBSCRIBE_EVENT, VIDIOC_UNSUBSCRIBE_EVENT ioctl. Once an event is subscribed, the events of subscribed types are dequeueable using the ioctl VIDIOC_DQEVENT ioctl. Events may be unsubscribed using VIDIOC_UNSUBSCRIBE_EVENT ioctl. The special event type V4L2_EVENT_ALL may be used to unsubscribe all the events the driver supports.

The event subscriptions and event queues are specific to file handles. Subscribing an event on one file handle does not affect other file handles.

The information on dequeueable events is obtained by using select or poll system calls on video devices.

The V4L2 events use POLLPRI events on poll system call and exceptions on select system call.

Starting with kernel 3.1 certain guarantees can be given with regards to events:

1. Each subscribed event has its own internal dedicated event queue. This means that flooding of one event type will not interfere with other event types.

2. If the internal event queue for a particular subscribed event becomes full, then the oldest event in that queue will be dropped.

3. Where applicable, certain event types can ensure that the payload of the oldest event that is about to be dropped will be merged with the payload of the next oldest event. Thus ensuring that no information is lost, but only an intermediate step leading up to that information. See the documentation for the event you want to subscribe to whether this is applicable for that event or not.

Sub-device Interface

The complex nature of V4L2 devices, where hardware is often made of several integrated circuits that need to interact with each other in a controlled way, leads to complex V4L2 drivers. The drivers usually reflect the hardware model in software, and model the different hardware components as software blocks called sub-devices.

V4L2 sub-devices are usually kernel-only objects. If the V4L2 driver implements the media device API, they will automatically inherit from media entities. Applications will be able to enumerate the sub-devices and discover the hardware topology using the media entities, pads and links enumeration API.

In addition to make sub-devices discoverable, drivers can also choose to make them directly configurable by applications. When both the sub-device driver and the V4L2 device driver support this, sub-devices will feature a character device node on which ioctls can be called to

• query, read and write sub-devices controls

• subscribe and unsubscribe to events and retrieve them

136 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

• negotiate image formats on individual pads

Sub-device character device nodes, conventionally named /dev/v4l-subdev*, use major number 81.

Controls

Most V4L2 controls are implemented by sub-device hardware. Drivers usually merge all controls and expose them through video device nodes. Applications can control all sub-devices through a single interface.

Complex devices sometimes implement the same control in different pieces of hardware. This situation is common in embedded platforms, where both sensors and image processing hardware implement identical functions, such as contrast adjustment, white balance or faulty pixels correction. As the V4L2 controls

API doesn't support several identical controls in a single device, all but one of the identical controls are hidden.

Applications can access those hidden controls through the sub-device node with the V4L2 control API described in

User Controls

. The ioctls behave identically as when issued on V4L2 device nodes, with the

exception that they deal only with controls implemented in the sub-device.

Depending on the driver, those controls might also be exposed through one (or several) V4L2 device nodes.

Events

V4L2 sub-devices can notify applications of events as described in

Event Interface

. The API behaves identically as when used on V4L2 device nodes, with the exception that it only deals with events generated by the sub-device. Depending on the driver, those events might also be reported on one (or several) V4L2 device nodes.

Pad-level Formats

Warning:

Pad-level formats are only applicable to very complex devices that need to expose low-level format

configuration to user space. Generic V4L2 applications do not need to use the API described in this

section.

Note:

For the purpose of this section, the term format means the combination of media bus data format,

frame width and frame height.

Image formats are typically negotiated on video capture and output devices using the format and selection ioctls. The driver is responsible for configuring every block in the video pipeline according to the requested format at the pipeline input and/or output.

For complex devices, such as often found in embedded systems, identical image sizes at the output of a pipeline can be achieved using different hardware configurations. One such example is shown on

Image

Format Negotiation on Pipelines

, where image scaling can be performed on both the video sensor and the

host image processing hardware.

Figure 1.9: Image Format Negotiation on Pipelines

High quality and high speed pipeline configuration

1.2. Part I - Video for Linux API 137

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

The sensor scaler is usually of less quality than the host scaler, but scaling on the sensor is required to achieve higher frame rates. Depending on the use case (quality vs. speed), the pipeline must be configured differently. Applications need to configure the formats at every point in the pipeline explicitly.

Drivers that implement the media API can expose pad-level image format configuration to applications.

When they do, applications can use the VIDIOC_SUBDEV_G_FMT and VIDIOC_SUBDEV_S_FMT ioctls. to negotiate formats on a per-pad basis.

Applications are responsible for configuring coherent parameters on the whole pipeline and making sure that connected pads have compatible formats. The pipeline is checked for formats mismatch at VID-

IOC_STREAMON time, and an EPIPE error code is then returned if the configuration is invalid.

Pad-level image format configuration support can be tested by calling the ioctl VIDIOC_SUBDEV_G_FMT,

VIDIOC_SUBDEV_S_FMT ioctl on pad 0. If the driver returns an EINVAL error code pad-level format configuration is not supported by the sub-device.

Format Negotiation Acceptable formats on pads can (and usually do) depend on a number of external parameters, such as formats on other pads, active links, or even controls. Finding a combination of formats on all pads in a video pipeline, acceptable to both application and driver, can't rely on formats enumeration only. A format negotiation mechanism is required.

Central to the format negotiation mechanism are the get/set format operations.

When called with the which argument set to V4L2_SUBDEV_FORMAT_TRY, the VIDIOC_SUBDEV_G_FMT and VID-

IOC_SUBDEV_S_FMT ioctls operate on a set of formats parameters that are not connected to the hardware configuration. Modifying those `try' formats leaves the device state untouched (this applies to both the software state stored in the driver and the hardware state stored in the device itself).

While not kept as part of the device state, try formats are stored in the sub-device file handles. A VID-

IOC_SUBDEV_G_FMT call will return the last try format set on the same sub-device file handle. Several applications querying the same sub-device at the same time will thus not interact with each other.

To find out whether a particular format is supported by the device, applications use the VID-

IOC_SUBDEV_S_FMT ioctl. Drivers verify and, if needed, change the requested format based on device requirements and return the possibly modified value. Applications can then choose to try a different format or accept the returned value and continue.

Formats returned by the driver during a negotiation iteration are guaranteed to be supported by the device. In particular, drivers guarantee that a returned format will not be further changed if passed to an

VIDIOC_SUBDEV_S_FMT call as-is (as long as external parameters, such as formats on other pads or links' configuration are not changed).

Drivers automatically propagate formats inside sub-devices. When a try or active format is set on a pad, corresponding formats on other pads of the same sub-device can be modified by the driver. Drivers are free to modify formats as required by the device. However, they should comply with the following rules when possible:

• Formats should be propagated from sink pads to source pads. Modifying a format on a source pad should not modify the format on any sink pad.

• Sub-devices that scale frames using variable scaling factors should reset the scale factors to default values when sink pads formats are modified. If the 1:1 scaling ratio is supported, this means that source pads formats should be reset to the sink pads formats.

Formats are not propagated across links, as that would involve propagating them from one sub-device file handle to another. Applications must then take care to configure both ends of every link explicitly with compatible formats. Identical formats on the two ends of a link are guaranteed to be compatible. Drivers are free to accept different formats matching device requirements as being compatible.

Sample Pipeline Configuration

shows a sample configuration sequence for the pipeline described in

Image Format Negotiation on Pipelines

(table columns list entity names and pad numbers).

138 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Initial state

Configure frontend sink format

Configure scaler sink format

Configure scaler sink compose selection

Sensor/0 format Frontend/0 format

Table 1.37: Sample Pipeline Configuration

Frontend/1 format Scaler/0 format

2048x1536/SGRBG8_1X8 (default) (default) (default)

2048x1536/SGRBG8_1X8

2048x1536/SGRBG8_1X8 2046x1534/SGRBG8_1X8

(default)

Scaler/0 compose selection rectangle

(default)

(default)

2048x1536/SGRBG8_1X8 2048x1536/SGRBG8_1X8 2046x1534/SGRBG8_1X8

2046x1534/SGRBG8_1X8 0,0/2046x1534

2048x1536/SGRBG8_1X8 2048x1536/SGRBG8_1X8 2046x1534/SGRBG8_1X8 2046x1534/SGRBG8_1X8

0,0/1280x960

Scaler/1 format

(default)

(default)

2046x1534/SGRBG8_1X8

1280x960/SGRBG8_1X8

1. Initial state.

The sensor source pad format is set to its native 3MP size and

V4L2_MBUS_FMT_SGRBG8_1X8 media bus code.

Formats on the host frontend and scaler sink and source pads have the default values, as well as the compose rectangle on the scaler's sink pad.

2. The application configures the frontend sink pad format's size to 2048x1536 and its media bus code to V4L2_MBUS_FMT_SGRBG_1X8. The driver propagates the format to the frontend source pad.

3. The application configures the scaler sink pad format's size to 2046x1534 and the media bus code to V4L2_MBUS_FMT_SGRBG_1X8 to match the frontend source size and media bus code. The media bus code on the sink pad is set to V4L2_MBUS_FMT_SGRBG_1X8. The driver propagates the size to the compose selection rectangle on the scaler's sink pad, and the format to the scaler source pad.

4. The application configures the size of the compose selection rectangle of the scaler's sink pad

1280x960. The driver propagates the size to the scaler's source pad format.

When satisfied with the try results, applications can set the active formats by setting the which argument to V4L2_SUBDEV_FORMAT_ACTIVE. Active formats are changed exactly as try formats by drivers. To avoid modifying the hardware state during format negotiation, applications should negotiate try formats first and then modify the active settings using the try formats returned during the last negotiation iteration.

This guarantees that the active format will be applied as-is by the driver without being modified.

Selections: cropping, scaling and composition Many sub-devices support cropping frames on their input or output pads (or possible even on both). Cropping is used to select the area of interest in an image, typically on an image sensor or a video decoder. It can also be used as part of digital zoom implementations to select the area of the image that will be scaled up.

Crop settings are defined by a crop rectangle and represented in a struct

v4l2_rect

by the coordinates of the top left corner and the rectangle size. Both the coordinates and sizes are expressed in pixels.

As for pad formats, drivers store try and active rectangles for the selection targets Common selection

definitions.

On sink pads, cropping is applied relative to the current pad format. The pad format represents the image size as received by the sub-device from the previous block in the pipeline, and the crop rectangle represents the sub-image that will be transmitted further inside the sub-device for processing.

The scaling operation changes the size of the image by scaling it to new dimensions. The scaling ratio isn't specified explicitly, but is implied from the original and scaled image sizes. Both sizes are represented by struct

v4l2_rect

.

Scaling support is optional.

When supported by a subdev, the crop rectangle on the subdev's sink pad is scaled to the size configured using the VIDIOC_SUBDEV_S_SELECTION IOCTL using

V4L2_SEL_TGT_COMPOSE selection target on the same pad. If the subdev supports scaling but not composing, the top and left values are not used and must always be set to zero.

On source pads, cropping is similar to sink pads, with the exception that the source size from which the cropping is performed, is the COMPOSE rectangle on the sink pad. In both sink and source pads, the crop rectangle must be entirely contained inside the source image size for the crop operation.

The drivers should always use the closest possible rectangle the user requests on all selection targets, unless specifically told otherwise. V4L2_SEL_FLAG_GE and V4L2_SEL_FLAG_LE flags may be used to round the image size either up or down. Selection flags

Types of selection targets

1.2. Part I - Video for Linux API 139

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Actual targets Actual targets (without a postfix) reflect the actual hardware configuration at any point of time. There is a BOUNDS target corresponding to every actual target.

BOUNDS targets

BOUNDS targets is the smallest rectangle that contains all valid actual rectangles. It may not be possible to set the actual rectangle as large as the BOUNDS rectangle, however. This may be because e.g. a sensor's pixel array is not rectangular but cross-shaped or round. The maximum size may also be smaller than the BOUNDS rectangle.

Order of configuration and format propagation Inside subdevs, the order of image processing steps will always be from the sink pad towards the source pad. This is also reflected in the order in which the configuration must be performed by the user: the changes made will be propagated to any subsequent stages. If this behaviour is not desired, the user must set V4L2_SEL_FLAG_KEEP_CONFIG flag. This flag causes no propagation of the changes are allowed in any circumstances. This may also cause the accessed rectangle to be adjusted by the driver, depending on the properties of the underlying hardware.

The coordinates to a step always refer to the actual size of the previous step. The exception to this rule is the source compose rectangle, which refers to the sink compose bounds rectangle --- if it is supported by the hardware.

1. Sink pad format. The user configures the sink pad format. This format defines the parameters of the image the entity receives through the pad for further processing.

2. Sink pad actual crop selection. The sink pad crop defines the crop performed to the sink pad format.

3. Sink pad actual compose selection. The size of the sink pad compose rectangle defines the scaling ratio compared to the size of the sink pad crop rectangle. The location of the compose rectangle specifies the location of the actual sink compose rectangle in the sink compose bounds rectangle.

4. Source pad actual crop selection. Crop on the source pad defines crop performed to the image in the sink compose bounds rectangle.

5. Source pad format. The source pad format defines the output pixel format of the subdev, as well as the other parameters with the exception of the image width and height. Width and height are defined by the size of the source pad actual crop selection.

Accessing any of the above rectangles not supported by the subdev will return EINVAL. Any rectangle referring to a previous unsupported rectangle coordinates will instead refer to the previous supported rectangle. For example, if sink crop is not supported, the compose selection will refer to the sink pad format dimensions instead.

Figure 1.10: Figure 4.5. Image processing in subdevs: simple crop example

In the above example, the subdev supports cropping on its sink pad. To configure it, the user sets the media bus format on the subdev's sink pad. Now the actual crop rectangle can be set on the sink pad --the location and size of this rectangle reflect the location and size of a rectangle to be cropped from the sink format. The size of the sink crop rectangle will also be the size of the format of the subdev's source pad.

Figure 1.11: Figure 4.6. Image processing in subdevs: scaling with multiple sources

In this example, the subdev is capable of first cropping, then scaling and finally cropping for two source pads individually from the resulting scaled image. The location of the scaled image in the cropped image is ignored in sink compose target. Both of the locations of the source crop rectangles refer to the sink scaling rectangle, independently cropping an area at location specified by the source crop rectangle from it.

140 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Figure 1.12: Figure 4.7. Image processing in subdevs: scaling and composition with multiple

sinks and sources

The subdev driver supports two sink pads and two source pads. The images from both of the sink pads are individually cropped, then scaled and further composed on the composition bounds rectangle. From that, two independent streams are cropped and sent out of the subdev from the source pads.

Media Bus Formats v4l2_mbus_framefmt

__u32

__u32

__u32

__u32

__u32 enum

v4l2_ycbcr_encoding

enum

v4l2_quantization

enum

v4l2_xfer_func

__u16

Table 1.38: struct v4l2_mbus_framefmt width height code field colorspace ycbcr_enc quantization xfer_func reserved[11]

Image width, in pixels.

Image height, in pixels.

Format code, from enum

v4l2_mbus_pixelcode

.

Field order, from enum

v4l2_field

. See

Field Order

for details.

Image colorspace, from enum

v4l2_colorspace .

See

Colorspaces

for details.

This information supplements the colorspace and must be set by the driver for capture streams and by the application for output streams, see

Colorspaces

.

This information supplements the colorspace and must be set by the driver for capture streams and by the application for output streams, see

Colorspaces

.

This information supplements the colorspace and must be set by the driver for capture streams and by the application for output streams, see

Colorspaces

.

Reserved for future extensions. Applications and drivers must set the array to zero.

Media Bus Pixel Codes The media bus pixel codes describe image formats as flowing over physical busses (both between separate physical components and inside SoC devices). This should not be confused with the V4L2 pixel formats that describe, using four character codes, image formats as stored in memory.

While there is a relationship between image formats on busses and image formats in memory (a raw

Bayer image won't be magically converted to JPEG just by storing it to memory), there is no one-to-one correspondance between them.

Packed RGB Formats Those formats transfer pixel data as red, green and blue components. The format code is made of the following information.

• The red, green and blue components order code, as encoded in a pixel sample. Possible values are

RGB and BGR.

• The number of bits per component, for each component. The values can be different for all components. Common values are 555 and 565.

• The number of bus samples per pixel. Pixels that are wider than the bus width must be transferred in multiple samples. Common values are 1 and 2.

• The bus width.

• For formats where the total number of bits per pixel is smaller than the number of bus samples per pixel times the bus width, a padding value stating if the bytes are padded in their most high order

1.2. Part I - Video for Linux API 141

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

bits (PADHI) or low order bits (PADLO). A ``C'' prefix is used for component-wise padding in the most high order bits (CPADHI) or low order bits (CPADLO) of each separate component.

• For formats where the number of bus samples per pixel is larger than 1, an endianness value stating if the pixel is transferred MSB first (BE) or LSB first (LE).

For instance, a format where pixels are encoded as 5-bits red, 5-bits green and 5-bit blue values padded on the high bit, transferred as 2 8-bit samples per pixel with the most significant bits (padding, red and half of the green value) transferred first will be named MEDIA_BUS_FMT_RGB555_2X8_PADHI_BE.

The following tables list existing packed RGB formats.

Identifier

MEDIA_BUS_FMT_RGB444_1X12

MEDIA_BUS_FMT_RGB444_2X8_PADHI_BE

MEDIA_BUS_FMT_RGB444_2X8_PADHI_LE

MEDIA_BUS_FMT_RGB555_2X8_PADHI_BE

MEDIA_BUS_FMT_RGB555_2X8_PADHI_LE

MEDIA_BUS_FMT_RGB565_1X16

MEDIA_BUS_FMT_BGR565_2X8_BE

MEDIA_BUS_FMT_BGR565_2X8_LE

MEDIA_BUS_FMT_RGB565_2X8_BE

MEDIA_BUS_FMT_RGB565_2X8_LE

MEDIA_BUS_FMT_RGB666_1X18

MEDIA_BUS_FMT_RBG888_1X24

MEDIA_BUS_FMT_RGB666_1X24_CPADHI

MEDIA_BUS_FMT_BGR888_1X24

MEDIA_BUS_FMT_GBR888_1X24

MEDIA_BUS_FMT_RGB888_1X24

MEDIA_BUS_FMT_RGB888_2X12_BE

MEDIA_BUS_FMT_RGB888_2X12_LE

MEDIA_BUS_FMT_ARGB888_1X32

MEDIA_BUS_FMT_RGB888_1X32_PADHI

MEDIA_BUS_FMT_RGB101010_1X30

Code

0x1016

0x1001

0x1002

0x1003

0x1004

0x1017

0x1005

0x1006

0x1007

0x1008

0x1009

0x100e

0x1015

0x1013

0x1014

0x100a

0x100b

0x100c

0x100d

0x100f

0x1018

Table 1.39: RGB formats

Data organization

Bit 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 r3 r2 r1 r0 g3 g2 g1 g0 b3 b2 b1 b0

0 0 0 0 r3 r2 r1 r0 g3 g2 g1 g0 b3 b2 b1 b0 g3 g2 g1 g0 b3 b2 b1 b0

0 0 0 0 r3 r2 r1 r0

0 r4 r3 r2 r1 r0 g4 g3 g2 g1 g0 b4 b3 b2 b1 b0 g2 g1 g0 b4 b3 b2 b1 b0

0 r4 r3 r2 r1 r0 g4 g3 r4 r3 r2 r1 r0 g5 g4 g3 g2 g1 g0 b4 b3 b2 b1 b0 b4 b3 b2 b1 b0 g5 g4 g3 g2 g1 g0 r4 r3 r2 r1 r0 g2 g1 g0 r4 r3 r2 r1 r0 b4 b3 b2 b1 b0 g5 g4 g3 r4 r3 r2 r1 r0 g5 g4 g3 g2 g1 g0 b4 b3 b2 b1 b0 g2 g1 g0 b4 b3 b2 b1 b0 r4 r3 r2 r1 r0 g5 g4 g3 r5 r4 r3 r2 r1 r0 g5 g4 g3 g2 g1 g0 b5 b4 b3 b2 b1 b0 r7 r6 r5 r4 r3 r2 r1 r0 b7 b6 b5 b4 b3 b2 b1 b0 g7 g6 g5 g4 g3 g2 g1 g0

0 0 0 0 0 0 r5 r4 r3 r2 r1 r0 g5 g4 g3 g2 g1 g0 b5 b4 b3 b2 b1 b0 b7 b6 b5 b4 b3 b2 b1 b0 g7 g6 g5 g4 g3 g2 g1 g0 r7 r6 r5 r4 r3 r2 r1 r0 g7 g6 g5 g4 g3 g2 g1 g0 b7 b6 b5 b4 b3 b2 b1 b0 r7 r6 r5 r4 r3 r2 r1 r0 r7 r6 r5 r4 r3 r2 r1 r0 g7 g6 g5 g4 g3 g2 g1 g0 b7 b6 b5 b4 b3 b2 b1 b0 r7 r6 r5 r4 r3 r2 r1 r0 g7 g6 g5 g4 g3 g2 g1 g0 b7 b6 b5 b4 b3 b2 b1 b0 g3 g2 g1 g0 b7 b6 b5 b4 b3 b2 b1 b0 r7 r6 r5 r4 r3 r2 r1 r0 g7 g6 g5 g4 a7 a6 a5 a4 a3 a2 a1 a0 r7 r6 r5 r4 r3 r2 r1 r0 g7 g6 g5 g4 g3 g2 g1 g0 b7 b6 b5 b4 b3 b2 b1 b0

0 0 0 0 0 0 0 0 r7 r6 r5 r4 r3 r2 r1 r0 g7 g6 g5 g4 g3 g2 g1 g0 b7 b6 b5 b4 b3 b2 b1 b0

0 0 r9 r8 r7 r6 r5 r4 r3 r2 r1 r0 g9 g8 g7 g6 g5 g4 g3 g2 g1 g0 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0

The following table list existing packed 36bit wide RGB formats.

Identifier

MEDIA_BUS_FMT_RGB121212_1X36

Code

0x1019

Table 1.40: 36bit RGB formats

Data organization

Bit 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 r11 r10 r9 r8 r7 r6 r5 r4 r3 r2 r1 r0 g11 g10 g9 g8 g7 g6 g5 g4 g3 g2 g1 g0 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0

The following table list existing packed 48bit wide RGB formats.

Identifier

MEDIA_BUS_FMT_RGB161616_1X48

Code

0x101a

Table 1.41: 48bit RGB formats

Data organization

Bit 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32

Bit 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 r15 r14 r13 r12 r11 r10 r9 r8 r7 r6 r5 r4 r3 r2 r1 r0 g15 g14 g13 g12 g11 g10 g9 g8 g7 g6 g5 g4 g3 g2 g1 g0 b15 b14 b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0

On LVDS buses, usually each sample is transferred serialized in seven time slots per pixel clock, on three (18-bit) or four (24-bit) differential data pairs at the same time.

The remaining bits are used for control signals as defined by SPWG/PSWG/VESA or JEIDA standards.

The 24-bit RGB format serialized in seven time slots on four lanes using JEIDA defined bit mapping will be named MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA, for example.

142 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Identifier

Table 1.42: LVDS RGB formats

Code Data organization

Timeslot Lane 3 2 1 0

MEDIA_BUS_FMT_RGB666_1X7X3_SPWG

MEDIA_BUS_FMT_RGB888_1X7X4_SPWG

MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA

0x1010

0x1011

0x1012

0

1

2

3

4

5

6

0

1

2

3

4

5

6

0

1

2

3

4

5

6 g

7 g

6 r

7 r

6 d b

1 d b

0 d g

5 b

5 g

4 b b b b b

4

3

2 d d b

1 b

7 b

6 d b

0 d g

5 b

5 b

4

3

2 g

3 g

2 g

1 d d b

3 b

1 b r

0

0 g

1 g

0 r

1 d d g

7 b

7 b

6 b

5 b

4 b

2 g

6 g

5 g

4 g

3 g

4 g

3 g

2 g

1 g

0 r

5 r

4 r

3 r

2 r

1 r

0 g

0 r

5 r

4 r

3 r

2 r

1 r

0 g

2 r

7 r

6 r

5 r

4 r

3 r

2

Bayer Formats Those formats transfer pixel data as red, green and blue components. The format code is made of the following information.

• The red, green and blue components order code, as encoded in a pixel sample. The possible values are shown in Figure 4.8 Bayer Patterns.

• The number of bits per pixel component. All components are transferred on the same number of bits. Common values are 8, 10 and 12.

• The compression (optional). If the pixel components are ALAW- or DPCM-compressed, a mention of the compression scheme and the number of bits per compressed pixel component.

• The number of bus samples per pixel. Pixels that are wider than the bus width must be transferred in multiple samples. Common values are 1 and 2.

• The bus width.

• For formats where the total number of bits per pixel is smaller than the number of bus samples per pixel times the bus width, a padding value stating if the bytes are padded in their most high order bits (PADHI) or low order bits (PADLO).

• For formats where the number of bus samples per pixel is larger than 1, an endianness value stating if the pixel is transferred MSB first (BE) or LSB first (LE).

For instance, a format with uncompressed 10-bit Bayer components arranged in a red, green, green, blue pattern transferred as 2 8-bit samples per pixel with the least significant bits transferred first will be named

MEDIA_BUS_FMT_SRGGB10_2X8_PADHI_LE.

1.2. Part I - Video for Linux API 143

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Figure 1.13: Figure 4.8 Bayer Patterns

The following table lists existing packed Bayer formats. The data organization is given as an example for the first pixel only.

Identifier

MEDIA_BUS_FMT_SBGGR8_1X8

Table 1.43: Bayer Formats

Code Data organization

Bit 15 14 13 12 11 10 9

0x3001 • •

8 7 6 5 4 3 2 1 0

• •

MEDIA_BUS_FMT_SGBRG8_1X8

0x3013 • • • •

MEDIA_BUS_FMT_SGRBG8_1X8

0x3002 • • • •

MEDIA_BUS_FMT_SRGGB8_1X8

0x3014 • • • •

MEDIA_BUS_FMT_SBGGR10_ALAW8_1X8

0x3015 • • • •

MEDIA_BUS_FMT_SGBRG10_ALAW8_1X8

0x3016 • • • •

MEDIA_BUS_FMT_SGRBG10_ALAW8_1X8

0x3017 • • • •

MEDIA_BUS_FMT_SRGGB10_ALAW8_1X8

0x3018 • • • •

MEDIA_BUS_FMT_SBGGR10_DPCM8_1X8

0x300b • • • •

MEDIA_BUS_FMT_SGBRG10_DPCM8_1X8 0x300c

• • • •

MEDIA_BUS_FMT_SGRBG10_DPCM8_1X8

0x3009 • • • •

MEDIA_BUS_FMT_SRGGB10_DPCM8_1X8

0x300d

MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_BE

0x3003

• • • •

• •

0 0 0 0 0 0

• • b9 b8

• • b7 b6 b5 b4 b3 b2 b1 b0

• •

MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_LE

0x3004 • • • •

• •

0 0 0 0 0 0

• • b9 b8

MEDIA_BUS_FMT_SBGGR10_2X8_PADLO_BE

0x3005

MEDIA_BUS_FMT_SBGGR10_2X8_PADLO_LE

0x3006

• • • •

• • b1 b0 0

• •

0 0 0 0 0

• • • •

0 0 0 0 0 0

• • b9 b8 b7 b6 b5 b4 b3 b2

• •

MEDIA_BUS_FMT_SBGGR10_1X10

MEDIA_BUS_FMT_SGBRG10_1X10

0x3007

0x300e

• • •

• • •

MEDIA_BUS_FMT_SGRBG10_1X10 0x300a

• • •

MEDIA_BUS_FMT_SRGGB10_1X10 0x300f

• • •

Continued on next page

144 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Identifier

MEDIA_BUS_FMT_SBGGR12_1X12

MEDIA_BUS_FMT_SGBRG12_1X12

MEDIA_BUS_FMT_SGRBG12_1X12

MEDIA_BUS_FMT_SRGGB12_1X12

MEDIA_BUS_FMT_SBGGR14_1X14

MEDIA_BUS_FMT_SGBRG14_1X14

MEDIA_BUS_FMT_SGRBG14_1X14

MEDIA_BUS_FMT_SRGGB14_1X14

MEDIA_BUS_FMT_SBGGR16_1X16

MEDIA_BUS_FMT_SGBRG16_1X16

MEDIA_BUS_FMT_SGRBG16_1X16

MEDIA_BUS_FMT_SRGGB16_1X16

Table 1.43 -- continued from previous page

Code Data organization

Bit 15 14 13 12 11 10 9

0x3008 • • •

8 7 6 5 4 3 2 1 0

0x3010

0x3011

0x3012

0x3019

0x301a

0x301b

0x301c

• • •

0x301d

0x301e

0x301f

0x3020 b15 b14 b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0 g15 g14 g13 g12 g11 g10 g9 g8 g7 g6 g5 g4 g3 g2 g1 g0 g15 g14 g13 g12 g11 g10 g9 g8 g7 g6 g5 g4 g3 g2 g1 g0 r15 r14 r13 r12 r11 r10 r9 r8 r7 r6 r5 r4 r3 r2 r1 r0

Packed YUV Formats Those data formats transfer pixel data as (possibly downsampled) Y, U and V components. Some formats include dummy bits in some of their samples and are collectively referred to as ``YDYC'' (Y-Dummy-Y-Chroma) formats. One cannot rely on the values of these dummy bits as those are undefined.

The format code is made of the following information.

• The Y, U and V components order code, as transferred on the bus. Possible values are YUYV, UYVY,

YVYU and VYUY for formats with no dummy bit, and YDYUYDYV, YDYVYDYU, YUYDYVYD and YVYDYUYD for YDYC formats.

• The number of bits per pixel component. All components are transferred on the same number of bits. Common values are 8, 10 and 12.

• The number of bus samples per pixel. Pixels that are wider than the bus width must be transferred in multiple samples. Common values are 0.5 (encoded as 0_5; in this case two pixels are transferred per bus sample), 1, 1.5 (encoded as 1_5) and 2.

• The bus width. When the bus width is larger than the number of bits per pixel component, several components are packed in a single bus sample. The components are ordered as specified by the order code, with components on the left of the code transferred in the high order bits. Common values are 8 and 16.

For instance, a format where pixels are encoded as 8-bit YUV values downsampled to 4:2:2 and transferred as 2 8-bit bus samples per pixel in the U, Y, V, Y order will be named MEDIA_BUS_FMT_UYVY8_2X8.

YUV Formats lists existing packed YUV formats and describes the organization of each pixel data in each sample. When a format pattern is split across multiple samples each of the samples in the pattern is described.

The role of each bit transferred over the bus is identified by one of the following codes.

• y x for luma component bit number x

• u x for blue chroma component bit number x

• v x for red chroma component bit number x

• a x for alpha component bit number x

• for non-available bits (for positions higher than the bus width)

1.2. Part I - Video for Linux API 145

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

• d for dummy bits

Identifier

MEDIA_BUS_FMT_Y8_1X8

MEDIA_BUS_FMT_UV8_1X8

MEDIA_BUS_FMT_UYVY8_1_5X8

146

MEDIA_BUS_FMT_VYUY8_1_5X8

MEDIA_BUS_FMT_YUYV8_1_5X8

MEDIA_BUS_FMT_YVYU8_1_5X8

MEDIA_BUS_FMT_UYVY8_2X8

MEDIA_BUS_FMT_VYUY8_2X8

MEDIA_BUS_FMT_YUYV8_2X8

MEDIA_BUS_FMT_YVYU8_2X8

MEDIA_BUS_FMT_Y10_1X10

MEDIA_BUS_FMT_UYVY10_2X10

MEDIA_BUS_FMT_VYUY10_2X10

MEDIA_BUS_FMT_YUYV10_2X10

MEDIA_BUS_FMT_YVYU10_2X10

MEDIA_BUS_FMT_Y12_1X12

MEDIA_BUS_FMT_UYVY12_2X12

MEDIA_BUS_FMT_VYUY12_2X12

MEDIA_BUS_FMT_YUYV12_2X12

MEDIA_BUS_FMT_YVYU12_2X12

MEDIA_BUS_FMT_UYVY8_1X16

Code

0x2001

0x2015

0x2002

0x2003

0x2004

0x2005

0x2006

0x2007

0x2008

0x2009

0x200a

0x2018

0x2019

0x200b

0x200c

0x2013

0x201c

0x201d

0x201e

0x201f

0x200f

Table 1.44: YUV Formats

Data organization

Bit 31 30 29 28 27 26 25 24 23 22 21 10 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 y9 y8 y7 y6 y5 y4 y3 y2 y1 y0 u9 u8 u7 u6 u5 u4 u3 u2 u1 u0 y9 y8 y7 y6 y5 y4 y3 y2 y1 y0 v9 v8 v7 v6 v5 v4 v3 v2 v1 v0 y9 y8 y7 y6 y5 y4 y3 y2 y1 y0 v9 v8 v7 v6 v5 v4 v3 v2 v1 v0 y9 y8 y7 y6 y5 y4 y3 y2 y1 y0 u9 u8 u7 u6 u5 u4 u3 u2 u1 u0 y9 y8 y7 y6 y5 y4 y3 y2 y1 y0 y9 y8 y7 y6 y5 y4 y3 y2 y1 y0 u9 u8 u7 u6 u5 u4 u3 u2 u1 u0 y9 y8 y7 y6 y5 y4 y3 y2 y1 y0 v9 v8 v7 v6 v5 v4 v3 v2 v1 v0 y9 y8 y7 y6 y5 y4 y3 y2 y1 y0 v9 v8 v7 v6 v5 v4 v3 v2 v1 v0 y9 y8 y7 y6 y5 y4 y3 y2 y1 y0 u9 u8 u7 u6 u5 u4 u3 u2 u1 u0 y11 y10 y9 y8 y7 y6 y5 y4 y3 y2 y1 y0 u11 u10 u9 u8 u7 u6 u5 u4 u3 u2 u1 u0 y11 y10 y9 y8 y7 y6 y5 y4 y3 y2 y1 y0 v11 v10 v9 v8 v7 v6 v5 v4 v3 v2 v1 v0 y11 y10 y9 y8 y7 y6 y5 y4 y3 y2 y1 y0 v11 v10 v9 v8 v7 v6 v5 v4 v3 v2 v1 v0 y11 y10 y9 y8 y7 y6 y5 y4 y3 y2 y1 y0 u11 u10 u9 u8 u7 u6 u5 u4 u3 u2 u1 u0 y11 y10 y9 y8 y7 y6 y5 y4 y3 y2 y1 y0 y11 y10 y9 y8 y7 y6 y5 y4 y3 y2 y1 y0 u11 u10 u9 u8 u7 u6 u5 u4 u3 u2 u1 u0 y11 y10 y9 y8 y7 y6 y5 y4 y3 y2 y1 y0 v11 v10 v9 v8 v7 v6 v5 v4 v3 v2 v1 v0 y11 y10 y9 y8 y7 y6 y5 y4 y3 y2 y1 y0 v11 v10 v9 v8 v7 v6 v5 v4 v3 v2 v1 v0 y11 y10 y9 y8 y7 y6 y5 y4 y3 y2 y1 y0 u11 u10 u9 u8 u7 u6 u5 u4 u3 u2 u1 u0 u7 u6 u5 u4 u3 u2 u1 u0 y7 y6 y5 y4 y3 y2 y1 y0

Continued on next page y7 y6 y5 y4 y3 y2 y1 y0 u7 u6 u5 u4 u3 u2 u1 u0 v7 v6 v5 v4 v3 v2 v1 v0 u7 u6 u5 u4 u3 u2 u1 u0 y7 y6 y5 y4 y3 y2 y1 y0 y7 y6 y5 y4 y3 y2 y1 y0 v7 v6 v5 v4 v3 v2 v1 v0 y7 y6 y5 y4 y3 y2 y1 y0 y7 y6 y5 y4 y3 y2 y1 y0 v7 v6 v5 v4 v3 v2 v1 v0 y7 y6 y5 y4 y3 y2 y1 y0 y7 y6 y5 y4 y3 y2 y1 y0 u7 u6 u5 u4 u3 u2 u1 u0 y7 y6 y5 y4 y3 y2 y1 y0 y7 y6 y5 y4 y3 y2 y1 y0 y7 y6 y5 y4 y3 y2 y1 y0 y7 y6 y5 y4 y3 y2 y1 y0 u7 u6 u5 u4 u3 u2 u1 u0 y7 y6 y5 y4 y3 y2 y1 y0 y7 y6 y5 y4 y3 y2 y1 y0 v7 v6 v5 v4 v3 v2 v1 v0 y7 y6 y5 y4 y3 y2 y1 y0 y7 y6 y5 y4 y3 y2 y1 y0 v7 v6 v5 v4 v3 v2 v1 v0 y7 y6 y5 y4 y3 y2 y1 y0 y7 y6 y5 y4 y3 y2 y1 y0 u7 u6 u5 u4 u3 u2 u1 u0 u7 u6 u5 u4 u3 u2 u1 u0 y7 y6 y5 y4 y3 y2 y1 y0 v7 v6 v5 v4 v3 v2 v1 v0 y7 y6 y5 y4 y3 y2 y1 y0 v7 v6 v5 v4 v3 v2 v1 v0 y7 y6 y5 y4 y3 y2 y1 y0 u7 u6 u5 u4 u3 u2 u1 u0 y7 y6 y5 y4 y3 y2 y1 y0 y7 y6 y5 y4 y3 y2 y1 y0 u7 u6 u5 u4 u3 u2 u1 u0 y7 y6 y5 y4 y3 y2 y1 y0 v7 v6 v5 v4 v3 v2 v1 v0 y7 y6 y5 y4 y3 y2 y1 y0 v7 v6 v5 v4 v3 v2 v1 v0 y7 y6 y5 y4 y3 y2 y1 y0 u7 u6 u5 u4 u3 u2 u1 u0

Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Identifier

MEDIA_BUS_FMT_VYUY8_1X16

MEDIA_BUS_FMT_YUYV8_1X16

MEDIA_BUS_FMT_YVYU8_1X16

MEDIA_BUS_FMT_YDYUYDYV8_1X16

MEDIA_BUS_FMT_UYVY10_1X20

MEDIA_BUS_FMT_VYUY10_1X20

MEDIA_BUS_FMT_YUYV10_1X20

MEDIA_BUS_FMT_YVYU10_1X20

MEDIA_BUS_FMT_VUY8_1X24

MEDIA_BUS_FMT_YUV8_1X24

MEDIA_BUS_FMT_UYYVYY8_0_5X24

MEDIA_BUS_FMT_UYVY12_1X24

MEDIA_BUS_FMT_VYUY12_1X24

MEDIA_BUS_FMT_YUYV12_1X24

MEDIA_BUS_FMT_YVYU12_1X24

MEDIA_BUS_FMT_YUV10_1X30

MEDIA_BUS_FMT_UYYVYY10_0_5X30

MEDIA_BUS_FMT_AYUV8_1X32

Code

0x2010

0x2011

Table 1.44 -- continued from previous page

Data organization

Bit 31 30 29 28 27 26 25 24 23 22 21 10 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 v7 v6 v5 v4 v3 v2 v1 v0 y7 y6 y5 y4 y3 y2 y1 y0 v7 v6 v5 v4 v3 v2 v1 v0 y7 y6 y5 y4 y3 y2 y1 y0 u7 u6 u5 u4 u3 u2 u1 u0 y7 y6 y5 y4 y3 y2 y1 y0 y7 y6 y5 y4 y3 y2 y1 y0 u7 u6 u5 u4 u3 u2 u1 u0 y7 y6 y5 y4 y3 y2 y1 y0 v7 v6 v5 v4 v3 v2 v1 v0

0x2012

0x2014

0x201a

0x201b y7 y6 y5 y4 y3 y2 y1 y0 v7 v6 v5 v4 v3 v2 v1 v0 y7 y6 y5 y4 y3 y2 y1 y0 u7 u6 u5 u4 u3 u2 u1 u0 d d d d d d d d y7 y6 y5 y4 y3 y2 y1 y0 y7 y6 y5 y4 y3 y2 y1 y0 u7 u6 u5 u4 u3 u2 u1 u0 y7 y6 y5 y4 y3 y2 y1 y0 d d d d d d d d y7 y6 y5 y4 y3 y2 y1 y0 v7 v6 v5 v4 v3 v2 v1 v0 u9 u8 u7 u6 u5 u4 u3 u2 u1 u0 y9 y8 y7 y6 y5 y4 y3 y2 y1 y0 v9 v8 v7 v6 v5 v4 v3 v2 v1 v0 y9 y8 y7 y6 y5 y4 y3 y2 y1 y0 v9 v8 v7 v6 v5 v4 v3 v2 v1 v0 y9 y8 y7 y6 y5 y4 y3 y2 y1 y0 u9 u8 u7 u6 u5 u4 u3 u2 u1 u0 y9 y8 y7 y6 y5 y4 y3 y2 y1 y0

0x200d

0x200e

0x201a

0x2025

0x2026

0x2020

0x2021

0x2022 y9 y8 y7 y6 y5 y4 y3 y2 y1 y0 u9 u8 u7 u6 u5 u4 u3 u2 u1 u0 y9 y8 y7 y6 y5 y4 y3 y2 y1 y0 v9 v8 v7 v6 v5 v4 v3 v2 v1 v0 y9 y8 y7 y6 y5 y4 y3 y2 y1 y0 v9 v8 v7 v6 v5 v4 v3 v2 v1 v0 y9 y8 y7 y6 y5 y4 y3 y2 y1 y0 u9 u8 u7 u6 u5 u4 u3 u2 u1 u0 v7 v6 v5 v4 v3 v2 v1 v0 u7 u6 u5 u4 u3 u2 u1 u0 y7 y6 y5 y4 y3 y2 y1 y0 y7 y6 y5 y4 y3 y2 y1 y0 u7 u6 u5 u4 u3 u2 u1 u0 v7 v6 v5 v4 v3 v2 v1 v0 u7 u6 u5 u4 u3 u2 u1 u0 y7 y6 y5 y4 y3 y2 y1 y0 y7 y6 y5 y4 y3 y2 y1 y0 v7 v6 v5 v4 v3 v2 v1 v0 y7 y6 y5 y4 y3 y2 y1 y0 y7 y6 y5 y4 y3 y2 y1 y0 u11 u10 u9 u8 u7 u6 u5 u4 u3 u2 u1 u0 y11 y10 y9 y8 y7 y6 y5 y4 y3 y2 y1 y0 v11 v10 v9 v8 v7 v6 v5 v4 v3 v2 v1 v0 y11 y10 y9 y8 y7 y6 y5 y4 y3 y2 y1 y0 v11 v10 v9 v8 v7 v6 v5 v4 v3 v2 v1 v0 y11 y10 y9 y8 y7 y6 y5 y4 y3 y2 y1 y0 u11 u10 u9 u8 u7 u6 u5 u4 u3 u2 u1 u0 y11 y10 y9 y8 y7 y6 y5 y4 y3 y2 y1 y0 y11 y10 y9 y8 y7 y6 y5 y4 y3 y2 y1 y0 u11 u10 u9 u8 u7 u6 u5 u4 u3 u2 u1 u0 y11 y10 y9 y8 y7 y6 y5 y4 y3 y2 y1 y0 v11 v10 v9 v8 v7 v6 v5 v4 v3 v2 v1 v0

0x2023

0x2016

0x2027

0x2017 y11 y10 y9 y8 y7 y6 y5 y4 y3 y2 y1 y0 v11 v10 v9 v8 v7 v6 v5 v4 v3 v2 v1 v0 y11 y10 y9 y8 y7 y6 y5 y4 y3 y2 y1 y0 u11 u10 u9 u8 u7 u6 u5 u4 u3 u2 u1 u0 y9 y8 y7 y6 y5 y4 y3 y2 y1 y0 u9 u8 u7 u6 u5 u4 u3 u2 u1 u0 v9 v8 v7 v6 v5 v4 v3 v2 v1 v0 u9 u8 u7 u6 u5 u4 u3 u2 u1 u0 y9 y8 y7 y6 y5 y4 y3 y2 y1 y0 y9 y8 y7 y6 y5 y4 y3 y2 y1 y0 v9 v8 v7 v6 v5 v4 v3 v2 v1 v0 y9 y8 y7 y6 y5 y4 y3 y2 y1 y0 y9 y8 y7 y6 y5 y4 y3 y2 y1 y0 a7 a6 a5 a4 a3 a2 a1 a0 y7 y6 y5 y4 y3 y2 y1 y0 u7 u6 u5 u4 u3 u2 u1 u0 v7 v6 v5 v4 v3 v2 v1 v0

The following table list existing packed 36bit wide YUV formats.

Identifier

MEDIA_BUS_FMT_UYYVYY12_0_5X36

MEDIA_BUS_FMT_YUV12_1X36

Code

0x2028

0x2029

Table 1.45: 36bit YUV Formats

Data organization

Bit 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 10 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 u11 u10 u9 u8 u7 u6 u5 u4 u3 u2 u1 u0 y11 y10 y9 y8 y7 y6 y5 y4 y3 y2 y1 y0 y11 y10 y9 y8 y7 y6 y5 y4 y3 y2 y1 y0 v11 v10 v9 v8 v7 v6 v5 v4 v3 v2 v1 v0 y11 y10 y9 y8 y7 y6 y5 y4 y3 y2 y1 y0 y11 y10 y9 y8 y7 y6 y5 y4 y3 y2 y1 y0 y11 y10 y9 y8 y7 y6 y5 y4 y3 y2 y1 y0 u11 u10 u9 u8 u7 u6 u5 u4 u3 u2 u1 u0 v11 v10 v9 v8 v7 v6 v5 v4 v3 v2 v1 v0

The following table list existing packed 48bit wide YUV formats.

Identifier

MEDIA_BUS_FMT_YUV16_1X48

MEDIA_BUS_FMT_UYYVYY16_0_5X48

Code

0x202a

0x202b

Table 1.46: 48bit YUV Formats

Bit

Data organization

47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32

31 30 29 28 27 26 25 24 23 22 21 10 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 y15 y14 y13 y12 y11 y10 y8 y8 y7 y6 y5 y4 y3 y2 y1 y0 u15 u14 u13 u12 u11 u10 u9 u8 u7 u6 u5 u4 u3 u2 u1 u0 v15 v14 v13 v12 v11 v10 v9 v8 v7 v6 v5 v4 v3 v2 v1 v0 u15 u14 u13 u12 u11 u10 u9 u8 u7 u6 u5 u4 u3 u2 u1 u0 y15 y14 y13 y12 y11 y10 y9 y8 y7 y6 y5 y4 y3 y2 y1 y0 y15 y14 y13 y12 y11 y10 y8 y8 y7 y6 y5 y4 y3 y2 y1 y0 v15 v14 v13 v12 v11 v10 v9 v8 v7 v6 v5 v4 v3 v2 v1 v0 y15 y14 y13 y12 y11 y10 y9 y8 y7 y6 y5 y4 y3 y2 y1 y0 y15 y14 y13 y12 y11 y10 y8 y8 y7 y6 y5 y4 y3 y2 y1 y0

HSV/HSL Formats

Those formats transfer pixel data as RGB values in a cylindrical-coordinate system using Hue-Saturation-Value or Hue-Saturation-Lightness components. The format code is made of the following information.

• The hue, saturation, value or lightness and optional alpha components order code, as encoded in a pixel sample. The only currently supported value is AHSV.

• The number of bits per component, for each component. The values can be different for all components. The only currently supported value is 8888.

1.2. Part I - Video for Linux API 147

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

• The number of bus samples per pixel. Pixels that are wider than the bus width must be transferred in multiple samples. The only currently supported value is 1.

• The bus width.

• For formats where the total number of bits per pixel is smaller than the number of bus samples per pixel times the bus width, a padding value stating if the bytes are padded in their most high order bits (PADHI) or low order bits (PADLO).

• For formats where the number of bus samples per pixel is larger than 1, an endianness value stating if the pixel is transferred MSB first (BE) or LSB first (LE).

The following table lists existing HSV/HSL formats.

Identifier Code

MEDIA_BUS_FMT_AHSV8888_1X32 0x6001

Bit

Table 1.47: HSV/HSL formats

Data organization

31 30 29 28 a

7 a

6 a

5 a

4

27 a

3

26 a

2

25 a

1

24 a

0

23 h

7

22 h

6

21 h

5

20 h

4

19 h

3

18 h

2

17 h

1

16 h

0

15 s

7

14 s

6

13 s

5

12 s

4

11 s

3

10 s

2

9 s

1

8 s

0

7 v

7

6 v

6

5 v

5

4 v

4

3 v

3

2 v

2

1 v

1

0 v

0

JPEG Compressed Formats Those data formats consist of an ordered sequence of 8-bit bytes obtained from JPEG compression process. Additionally to the _JPEG postfix the format code is made of the following information.

• The number of bus samples per entropy encoded byte.

• The bus width.

For instance, for a JPEG baseline process and an 8-bit bus width the format will be named ME-

DIA_BUS_FMT_JPEG_1X8.

The following table lists existing JPEG compressed formats.

Identifier

MEDIA_BUS_FMT_JPEG_1X8

Code

Table 1.48: JPEG Formats

Remarks

0x4001 Besides of its usage for the parallel bus this format is recommended for transmission of JPEG data over MIPI CSI bus using the User Defined 8-bit Data types.

Vendor and Device Specific Formats This section lists complex data formats that are either vendor or device specific.

The following table lists the existing vendor and device specific formats.

Identifier

Table 1.49: Vendor and device specific formats

Code Comments

MEDIA_BUS_FMT_S5C_UYVY_JPEG_1X8 0x5001 Interleaved raw UYVY and JPEG image format with embedded meta-data used by Samsung S3C73MX camera sensors.

1.2.5 V4L2 Driver Programming

to do

148 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

1.2.6 Libv4l Userspace Library

Introduction

libv4l is a collection of libraries which adds a thin abstraction layer on top of video4linux2 devices. The purpose of this (thin) layer is to make it easy for application writers to support a wide variety of devices without having to write separate code for different devices in the same class.

An example of using libv4l is provided by v4l2grab.

libv4l consists of 3 different libraries:

libv4lconvert

libv4lconvert is a library that converts several different pixelformats found in V4L2 drivers into a few common RGB and YUY formats.

It currently accepts the following V4L2 driver formats:

V4L2_PIX_FMT_BGR24

,

V4L2_PIX_FMT_HM12

,

V4L2_PIX_FMT_JPEG

,

V4L2_PIX_FMT_MJPEG

,

V4L2_PIX_FMT_MR97310A

,

V4L2_PIX_FMT_OV511

,

V4L2_PIX_FMT_OV518

,

V4L2_PIX_FMT_PAC207

,

V4L2_PIX_FMT_PJPG

,

V4L2_PIX_FMT_RGB24

,

V4L2_PIX_FMT_SBGGR8

,

V4L2_PIX_FMT_SGBRG8

,

V4L2_PIX_FMT_SGRBG8

,

V4L2_PIX_FMT_SN9C10X

,

V4L2_PIX_FMT_SN9C20X_I420

,

V4L2_PIX_FMT_SPCA501

,

V4L2_PIX_FMT_SPCA505

,

V4L2_PIX_FMT_SPCA508

,

V4L2_PIX_FMT_SPCA561

,

V4L2_PIX_FMT_SQ905C

,

V4L2_PIX_FMT_SRGGB8

,

V4L2_PIX_FMT_UYVY

,

V4L2_PIX_FMT_YUV420

,

V4L2_PIX_FMT_YUYV

,

V4L2_PIX_FMT_YVU420

,

and

V4L2_PIX_FMT_YVYU

.

Later on libv4lconvert was expanded to also be able to do various video processing functions to improve webcam video quality.

The video processing is split in to 2 parts: libv4lconvert/control and libv4lconvert/processing.

The control part is used to offer video controls which can be used to control the video processing functions made available by libv4lconvert/processing. These controls are stored application wide (until reboot) by using a persistent shared memory object.

libv4lconvert/processing offers the actual video processing functionality.

libv4l1

This library offers functions that can be used to quickly make v4l1 applications work with v4l2 devices.

These functions work exactly like the normal open/close/etc, except that libv4l1 does full emulation of the v4l1 api on top of v4l2 drivers, in case of v4l1 drivers it will just pass calls through.

Since those functions are emulations of the old V4L1 API, it shouldn't be used for new applications.

libv4l2

This library should be used for all modern V4L2 applications.

It provides handles to call V4L2 open/ioctl/close/poll methods. Instead of just providing the raw output of the device, it enhances the calls in the sense that it will use libv4lconvert to provide more video formats and to enhance the image quality.

In most cases, libv4l2 just passes the calls directly through to the v4l2 driver, intercepting the calls to VIDIOC_TRY_FMT, VIDIOC_G_FMT, VIDIOC_S_FMT,

VIDIOC_ENUM_FRAMESIZES

and

VIDIOC_ENUM_FRAMEINTERVALS

in order to emulate the formats

V4L2_PIX_FMT_BGR24

,

V4L2_PIX_FMT_RGB24

,

V4L2_PIX_FMT_YUV420

, and

V4L2_PIX_FMT_YVU420

, if they aren't available in the driver. VIDIOC_ENUM_FMT keeps enumerating the hardware supported formats, plus the emulated formats offered by libv4l at the end.

1.2. Part I - Video for Linux API 149

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Libv4l device control functions The common file operation methods are provided by libv4l.

Those functions operate just like the gcc function dup() and V4L2 functions open(), close(), ioctl(), read(), mmap() and munmap(): int v4l2_open(const char *file, int oflag, ...) operates like the open() function.

int v4l2_close(int fd) operates like the close() function.

int v4l2_dup(int fd) operates like the libc dup() function, duplicating a file handler.

int v4l2_ioctl(int fd, unsigned long int request, ...) operates like the ioctl() function.

int v4l2_read(int fd, void* buffer, size_t n) operates like the read() function.

void v4l2_mmap(void *start, size_t length, int prot, int flags, int fd, int64_t offset);

operates like the munmap() function.

int v4l2_munmap(void *_start, size_t length);

operates like the munmap() function.

Those functions provide additional control: int v4l2_fd_open(int fd, int v4l2_flags) opens an already opened fd for further use through v4l2lib and possibly modify libv4l2's default behavior through the v4l2_flags argument.

V4L2_DISABLE_CONVERSION, to disable format conversion.

Currently, v4l2_flags can be int v4l2_set_control(int fd, int cid, int value)

This function takes a value of 0 - 65535, and then scales that range to the actual range of the given v4l control id, and then if the cid exists and is not locked sets the cid to the scaled value.

int v4l2_get_control(int fd, int cid)

This function returns a value of 0 - 65535, scaled to from the actual range of the given v4l control id. when the cid does not exist, could not be accessed for some reason, or some error occurred 0 is returned.

v4l1compat.so wrapper library

This library intercepts calls to open(), close(), ioctl(), mmap() and munmap() operations and redirects them to the libv4l counterparts, by using LD_PRELOAD=/usr/lib/v4l1compat.so. It also emulates V4L1 calls via V4L2 API.

It allows usage of binary legacy applications that still don't use libv4l.

1.2.7 Changes

The following chapters document the evolution of the V4L2 API, errata or extensions. They are also intended to help application and driver writers to port or update their code.

Differences between V4L and V4L2

The Video For Linux API was first introduced in Linux 2.1 to unify and replace various TV and radio device related interfaces, developed independently by driver writers in prior years. Starting with Linux 2.5 the much improved V4L2 API replaces the V4L API. The support for the old V4L calls were removed from Kernel, but the library Libv4l Userspace Library supports the conversion of a V4L API system call into a V4L2 one.

150 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Opening and Closing Devices

For compatibility reasons the character device file names recommended for V4L2 video capture, overlay, radio and raw vbi capture devices did not change from those used by V4L. They are listed in

Interfaces

and below in V4L Device Types, Names and Numbers.

The teletext devices (minor range 192-223) have been removed in V4L2 and no longer exist. There is no hardware available anymore for handling pure teletext. Instead raw or sliced VBI is used.

The V4L videodev module automatically assigns minor numbers to drivers in load order, depending on the registered device type. We recommend that V4L2 drivers by default register devices with the same numbers, but the system administrator can assign arbitrary minor numbers using driver module options.

The major device number remains 81.

Device Type

Video capture and overlay

Radio receiver

Raw VBI capture

Table 1.50: V4L Device Types, Names and Numbers

File Name

/dev/video and /dev/bttv0

29

, /dev/video0 to

/dev/video63

/dev/radio

30

, /dev/radio0 to /dev/radio63

/dev/vbi, /dev/vbi0 to /dev/vbi31

Minor

Numbers

0-63

64-127

224-255

V4L prohibits (or used to prohibit) multiple opens of a device file. V4L2 drivers may support multiple opens, see

Opening and Closing Devices

for details and consequences.

V4L drivers respond to V4L2 ioctls with an EINVAL error code.

Querying Capabilities

The V4L VIDIOCGCAP ioctl is equivalent to V4L2's ioctl VIDIOC_QUERYCAP.

The name field in struct video_capability became card in struct v4l2_capability, type was replaced by capabilities. Note V4L2 does not distinguish between device types like this, better think of basic video input, video output and radio devices supporting a set of related functions like video capturing, video overlay and VBI capturing. See

Opening and Closing Devices

for an introduction.

struct type video_capability

VID_TYPE_CAPTURE struct v4l2_capability capabilities flags

V4L2_CAP_VIDEO_CAPTURE

Purpose

VID_TYPE_TUNER

VID_TYPE_TELETEXT

VID_TYPE_OVERLAY

VID_TYPE_CHROMAKEY

VID_TYPE_CLIPPING

VID_TYPE_FRAMERAM

V4L2_CAP_TUNER

V4L2_CAP_VBI_CAPTURE

V4L2_CAP_VIDEO_OVERLAY

V4L2_FBUF_CAP_CHROMAKEY in field capability of struct v4l2_framebuffer

V4L2_FBUF_CAP_LIST_CLIPPING and

V4L2_FBUF_CAP_BITMAP_CLIPPING in field capability v4l2_framebuffer of struct

V4L2_FBUF_CAP_EXTERNOVERLAY not

set in field capability of struct v4l2_framebuffer

The

video capture

interface is supported.

The device has a

tuner or modulator

.

The

raw VBI capture

interface is supported.

The

video overlay

interface is supported.

Whether chromakey overlay is supported. For more information on overlay see

Video Overlay Interface

.

Whether clipping the overlaid image is supported, see

Video

Overlay Interface

.

Whether frame overlay buffer overwrites memory,

Video Overlay Interface

.

see

Continued on next page

1.2. Part I - Video for Linux API 151

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Table 1.51 -- continued from previous page struct type video_capability

VID_TYPE_SCALES struct v4l2_capability capabilities flags

-

Purpose

This flag indicates if the hardware can scale images.

The

V4L2 API implies the scale factor by setting the cropping dimensions and image size with the VIDIOC_S_CROP and VID-

IOC_S_FMT ioctl, respectively.

The driver returns the closest sizes possible. For more information on cropping and scaling see

Image Cropping, Insertion and Scaling

.

VID_TYPE_MONOCHROME

VID_TYPE_SUBCAPTURE

-

-

Applications can enumerate the supported image formats with the ioctl VID-

IOC_ENUM_FMT ioctl to determine if the device supports grey scale capturing only. For more information on image formats see

Image Formats

.

Applications can call the VID-

IOC_G_CROP ioctl to determine if the device supports capturing a subsection of the full picture (``cropping'' in V4L2).

If not, the ioctl returns the EIN-

VAL error code. For more information on cropping and scaling see

Image Cropping, Insertion and Scaling

.

VID_TYPE_MPEG_DECODER

VID_TYPE_MPEG_ENCODER

VID_TYPE_MJPEG_DECODER

VID_TYPE_MJPEG_ENCODER

-

-

-

-

Applications can enumerate the supported image formats with the ioctl VID-

IOC_ENUM_FMT ioctl to determine if the device supports

MPEG streams.

See above.

See above.

See above.

The audios field was replaced by capabilities flag V4L2_CAP_AUDIO, indicating if the device has any audio inputs or outputs. To determine their number applications can enumerate audio inputs with the

VIDIOC_G_AUDIO ioctl. The audio ioctls are described in

Audio Inputs and Outputs

.

The maxwidth, maxheight, minwidth and minheight fields were removed. Calling the VIDIOC_S_FMT or

VIDIOC_TRY_FMT ioctl with the desired dimensions returns the closest size possible, taking into account the current video standard, cropping and scaling limitations.

Video Sources

V4L provides the VIDIOCGCHAN and VIDIOCSCHAN ioctl using struct video_channel to enumerate the video inputs of a V4L device. The equivalent V4L2 ioctls are ioctl VIDIOC_ENUMINPUT, VIDIOC_G_INPUT and

VIDIOC_S_INPUT using struct v4l2_input as discussed in

Video Inputs and Outputs

.

The channel field counting inputs was renamed to index, the video input types were renamed as follows:

152 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

struct video_channel type struct v4l2_input type

VIDEO_TYPE_TV V4L2_INPUT_TYPE_TUNER

VIDEO_TYPE_CAMERA V4L2_INPUT_TYPE_CAMERA

Unlike the tuners field expressing the number of tuners of this input, V4L2 assumes each video input is connected to at most one tuner. However a tuner can have more than one input, i. e. RF connectors, and a device can have multiple tuners. The index number of the tuner associated with the input, if any, is stored in field tuner of struct v4l2_input. Enumeration of tuners is discussed in

Tuners and Modulators

.

The redundant VIDEO_VC_TUNER flag was dropped. Video inputs associated with a tuner are of type

V4L2_INPUT_TYPE_TUNER. The VIDEO_VC_AUDIO flag was replaced by the audioset field. V4L2 considers devices with up to 32 audio inputs. Each set bit in the audioset field represents one audio input this video input combines with. For information about audio inputs and how to switch between them see

Audio

Inputs and Outputs

.

The norm field describing the supported video standards was replaced by std. The V4L specification mentions a flag VIDEO_VC_NORM indicating whether the standard can be changed. This flag was a later addition together with the norm field and has been removed in the meantime. V4L2 has a similar, albeit more comprehensive approach to video standards, see

Video Standards

for more information.

Tuning

The V4L VIDIOCGTUNER and VIDIOCSTUNER ioctl and struct video_tuner can be used to enumerate the tuners of a V4L TV or radio device. The equivalent V4L2 ioctls are VIDIOC_G_TUNER and VIDIOC_S_TUNER using struct v4l2_tuner. Tuners are covered in

Tuners and Modulators

.

The tuner field counting tuners was renamed to index. The fields name, rangelow and rangehigh remained unchanged.

The VIDEO_TUNER_PAL, VIDEO_TUNER_NTSC and VIDEO_TUNER_SECAM flags indicating the supported video standards were dropped. This information is now contained in the associated struct v4l2_input. No replacement exists for the VIDEO_TUNER_NORM flag indicating whether the video standard can be switched.

The mode field to select a different video standard was replaced by a whole new set of ioctls and structures described in

Video Standards

. Due to its ubiquity it should be mentioned the BTTV driver supports several standards in addition to the regular VIDEO_MODE_PAL (0), VIDEO_MODE_NTSC, VIDEO_MODE_SECAM and

VIDEO_MODE_AUTO (3). Namely N/PAL Argentina, M/PAL, N/PAL, and NTSC Japan with numbers 3-6 (sic).

The VIDEO_TUNER_STEREO_ON flag indicating stereo reception became V4L2_TUNER_SUB_STEREO in field rxsubchans. This field also permits the detection of monaural and bilingual audio, see the definition of struct v4l2_tuner for details.

Presently no replacement exists for the VIDEO_TUNER_RDS_ON and

VIDEO_TUNER_MBS_ON flags.

The VIDEO_TUNER_LOW flag was renamed to V4L2_TUNER_CAP_LOW in the struct v4l2_tuner capability field.

The VIDIOCGFREQ and VIDIOCSFREQ ioctl to change the tuner frequency where renamed to VID-

IOC_G_FREQUENCY and VIDIOC_S_FREQUENCY. They take a pointer to a struct v4l2_frequency instead of an unsigned long integer.

Image Properties

V4L2 has no equivalent of the VIDIOCGPICT and VIDIOCSPICT ioctl and struct video_picture. The following fields where replaced by V4L2 controls accessible with the ioctls VIDIOC_QUERYCTRL, VID-

IOC_QUERY_EXT_CTRL and VIDIOC_QUERYMENU, VIDIOC_G_CTRL and VIDIOC_S_CTRL ioctls: struct video_picture V4L2 Control ID brightness V4L2_CID_BRIGHTNESS hue colour

V4L2_CID_HUE

V4L2_CID_SATURATION contrast whiteness

V4L2_CID_CONTRAST

V4L2_CID_WHITENESS

1.2. Part I - Video for Linux API 153

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

The V4L picture controls are assumed to range from 0 to 65535 with no particular reset value. The

V4L2 API permits arbitrary limits and defaults which can be queried with the ioctls VIDIOC_QUERYCTRL,

VIDIOC_QUERY_EXT_CTRL and VIDIOC_QUERYMENU ioctl. For general information about controls see

User

Controls

.

The depth (average number of bits per pixel) of a video image is implied by the selected image format.

V4L2 does not explicitly provide such information assuming applications recognizing the format are aware of the image depth and others need not know. The palette field moved into the struct

v4l2_pix_format :

struct video_picture palette struct

v4l2_pix_format

pixfmt

VIDEO_PALETTE_GREY

V4L2_PIX_FMT_GREY

VIDEO_PALETTE_HI240

V4L2_PIX_FMT_HI240

37

VIDEO_PALETTE_RGB565

VIDEO_PALETTE_RGB555

VIDEO_PALETTE_RGB24

VIDEO_PALETTE_RGB32

VIDEO_PALETTE_YUV422

VIDEO_PALETTE_YUYV

VIDEO_PALETTE_RAW

39

VIDEO_PALETTE_UYVY

VIDEO_PALETTE_YUV420

VIDEO_PALETTE_YUV411

VIDEO_PALETTE_YUV422P

VIDEO_PALETTE_YUV411P

V4L2_PIX_FMT_RGB565

V4L2_PIX_FMT_RGB555

V4L2_PIX_FMT_BGR24

V4L2_PIX_FMT_BGR32

V4L2_PIX_FMT_YUYV

V4L2_PIX_FMT_YUYV

V4L2_PIX_FMT_UYVY

None

38

V4L2_PIX_FMT_Y41P

None

41

40

V4L2_PIX_FMT_YUV422P

42

VIDEO_PALETTE_YUV420P

VIDEO_PALETTE_YUV410P

V4L2_PIX_FMT_YUV411P

V4L2_PIX_FMT_YVU420

V4L2_PIX_FMT_YVU410

V4L2 image formats are defined in

Image Formats

. The image format can be selected with the VID-

IOC_S_FMT ioctl.

Audio

The VIDIOCGAUDIO and VIDIOCSAUDIO ioctl and struct video_audio are used to enumerate the audio inputs of a V4L device. The equivalent V4L2 ioctls are VIDIOC_G_AUDIO and VIDIOC_S_AUDIO using struct v4l2_audio as discussed in

Audio Inputs and Outputs

.

The audio ``channel number'' field counting audio inputs was renamed to index.

On VIDIOCSAUDIO the mode field selects one of the VIDEO_SOUND_MONO, VIDEO_SOUND_STEREO,

VIDEO_SOUND_LANG1 or VIDEO_SOUND_LANG2 audio demodulation modes. When the current audio standard is BTSC VIDEO_SOUND_LANG2 refers to SAP and VIDEO_SOUND_LANG1 is meaningless. Also undocumented in the V4L specification, there is no way to query the selected mode. On VIDIOCGAUDIO the driver returns the actually received audio programmes in this field. In the V4L2 API this information is stored in the struct v4l2_tuner rxsubchans and audmode fields, respectively. See

Tuners and Modulators

for more information on tuners. Related to audio modes struct v4l2_audio also reports if this is a mono or stereo input, regardless if the source is a tuner.

31

This is a custom format used by the BTTV driver, not one of the V4L2 standard formats.

32

Presumably all V4L RGB formats are little-endian, although some drivers might interpret them according to machine endianness.

V4L2 defines little-endian, big-endian and red/blue swapped variants. For details see

RGB Formats

.

33

VIDEO_PALETTE_YUV422 and VIDEO_PALETTE_YUYV are the same formats. Some V4L drivers respond to one, some to the other.

34

Not to be confused with V4L2_PIX_FMT_YUV411P, which is a planar format.

35

V4L explains this as: ``RAW capture (BT848)''

36

Not to be confused with V4L2_PIX_FMT_Y41P, which is a packed format.

37

This is a custom format used by the BTTV driver, not one of the V4L2 standard formats.

38

Presumably all V4L RGB formats are little-endian, although some drivers might interpret them according to machine endianness.

V4L2 defines little-endian, big-endian and red/blue swapped variants. For details see

RGB Formats

.

39

VIDEO_PALETTE_YUV422 and VIDEO_PALETTE_YUYV are the same formats. Some V4L drivers respond to one, some to the other.

40

Not to be confused with V4L2_PIX_FMT_YUV411P, which is a planar format.

41

V4L explains this as: ``RAW capture (BT848)''

42

Not to be confused with V4L2_PIX_FMT_Y41P, which is a packed format.

154 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

The following fields where replaced by V4L2 controls accessible with the ioctls VIDIOC_QUERYCTRL, VID-

IOC_QUERY_EXT_CTRL and VIDIOC_QUERYMENU, VIDIOC_G_CTRL and VIDIOC_S_CTRL ioctls: struct video_audio V4L2 Control ID volume V4L2_CID_AUDIO_VOLUME bass treble balance

V4L2_CID_AUDIO_BASS

V4L2_CID_AUDIO_TREBLE

V4L2_CID_AUDIO_BALANCE

To determine which of these controls are supported by a driver V4L provides the flags

VIDEO_AUDIO_VOLUME, VIDEO_AUDIO_BASS, VIDEO_AUDIO_TREBLE and VIDEO_AUDIO_BALANCE. In the V4L2

API the ioctls VIDIOC_QUERYCTRL, VIDIOC_QUERY_EXT_CTRL and VIDIOC_QUERYMENU ioctl reports if the respective control is supported. Accordingly the VIDEO_AUDIO_MUTABLE and VIDEO_AUDIO_MUTE flags where replaced by the boolean V4L2_CID_AUDIO_MUTE control.

All V4L2 controls have a step attribute replacing the struct video_audio step field. The V4L audio controls are assumed to range from 0 to 65535 with no particular reset value. The V4L2 API permits arbitrary limits and defaults which can be queried with the ioctls VIDIOC_QUERYCTRL, VIDIOC_QUERY_EXT_CTRL

and VIDIOC_QUERYMENU ioctl. For general information about controls see

User Controls

.

Frame Buffer Overlay

The V4L2 ioctls equivalent to VIDIOCGFBUF and VIDIOCSFBUF are VIDIOC_G_FBUF and VIDIOC_S_FBUF.

The base field of struct video_buffer remained unchanged, except V4L2 defines a flag to indicate nondestructive overlays instead of a NULL pointer. All other fields moved into the struct

v4l2_pix_format

fmt substructure of struct v4l2_framebuffer. The depth field was replaced by pixelformat. See

RGB

Formats

for a list of RGB formats and their respective color depths.

Instead of the special ioctls VIDIOCGWIN and VIDIOCSWIN V4L2 uses the general-purpose data format negotiation ioctls VIDIOC_G_FMT and VIDIOC_S_FMT. They take a pointer to a struct v4l2_format as argument. Here the win member of the fmt union is used, a struct

v4l2_window .

The x, y, width and height fields of struct video_window moved into struct

v4l2_rect

substructure w of struct

v4l2_window . The chromakey, clips, and clipcount fields remained unchanged. Struct

video_clip was renamed to struct

v4l2_clip , also containing a struct v4l2_rect , but the semantics are

still the same.

The VIDEO_WINDOW_INTERLACE flag was dropped.

Instead applications must set the field field to

V4L2_FIELD_ANY or V4L2_FIELD_INTERLACED. The VIDEO_WINDOW_CHROMAKEY flag moved into struct v4l2_framebuffer, under the new name V4L2_FBUF_FLAG_CHROMAKEY.

In V4L, storing a bitmap pointer in clips and setting clipcount to VIDEO_CLIP_BITMAP (-1) requests bitmap clipping, using a fixed size bitmap of 1024 × 625 bits. Struct

v4l2_window

has a separate bitmap pointer field for this purpose and the bitmap size is determined by w.width and w.height.

The VIDIOCCAPTURE ioctl to enable or disable overlay was renamed to ioctl VIDIOC_OVERLAY.

Cropping

To capture only a subsection of the full picture V4L defines the VIDIOCGCAPTURE and VIDIOCSCAPTURE ioctls using struct video_capture. The equivalent V4L2 ioctls are VIDIOC_G_CROP and VIDIOC_S_CROP using struct v4l2_crop, and the related ioctl VIDIOC_CROPCAP ioctl. This is a rather complex matter, see

Image Cropping, Insertion and Scaling

for details.

The x, y, width and height fields moved into struct

v4l2_rect

substructure c of struct v4l2_crop. The decimation field was dropped. In the V4L2 API the scaling factor is implied by the size of the cropping rectangle and the size of the captured or overlaid image.

The VIDEO_CAPTURE_ODD and VIDEO_CAPTURE_EVEN flags to capture only the odd or even field, respectively, were replaced by V4L2_FIELD_TOP and V4L2_FIELD_BOTTOM in the field named field of struct

1.2. Part I - Video for Linux API 155

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

v4l2_pix_format

and struct

v4l2_window . These structures are used to select a capture or overlay for-

mat with the VIDIOC_S_FMT ioctl.

Reading Images, Memory Mapping

Capturing using the read method There is no essential difference between reading images from a

V4L or V4L2 device using the read() function, however V4L2 drivers are not required to support this I/O method. Applications can determine if the function is available with the ioctl VIDIOC_QUERYCAP ioctl. All

V4L2 devices exchanging data with applications must support the select() and poll() functions.

To select an image format and size, V4L provides the VIDIOCSPICT and VIDIOCSWIN ioctls. V4L2 uses the general-purpose data format negotiation ioctls VIDIOC_G_FMT and VIDIOC_S_FMT. They take a pointer to a struct v4l2_format as argument, here the struct

v4l2_pix_format

named pix of its fmt union is used.

For more information about the V4L2 read interface see

Read/Write

.

Capturing using memory mapping Applications can read from V4L devices by mapping buffers in device memory, or more often just buffers allocated in DMA-able system memory, into their address space. This avoids the data copying overhead of the read method. V4L2 supports memory mapping as well, with a few differences.

V4L V4L2

The image format must be selected before buffers are allocated, with the VIDIOC_S_FMT ioctl. When no format is selected the driver may use the last, possibly by another application requested format.

The ioctl VIDIOC_REQBUFS ioctl allocates the desired number of buffers, this is a required step in the initialization sequence.

Applications cannot change the number of buffers. The it is built into the driver, unless it has a module option to change the number when the driver module is loaded.

Drivers map all buffers as one contiguous range of memory. The VIDIOCGMBUF ioctl is available to query the number of buffers, the offset of each buffer from the start of the virtual file, and the overall amount of memory used, which can be used as arguments for the mmap() function.

The VIDIOCMCAPTURE ioctl prepares a buffer for capturing. It also determines the image format for this buffer. The ioctl returns immediately, eventually with an EAGAIN error code if no video signal had been detected. When the driver supports more than one buffer applications can call the ioctl multiple times and thus have multiple outstanding capture requests.

The VIDIOCSYNC ioctl suspends execution until a particular buffer has been filled.

Buffers are individually mapped. The offset and size of each buffer can be determined with the

ioctl VIDIOC_QUERYBUF ioctl.

Drivers maintain an incoming and outgoing queue. ioctl VIDIOC_QBUF, VIDIOC_DQBUF enqueues any empty buffer into the incoming queue. Filled buffers are dequeued from the outgoing queue with the VIDIOC_DQBUF ioctl. To wait until filled buffers become available this function, select() or poll() can be used. The ioctl

VIDIOC_STREAMON, VIDIOC_STREAMOFF ioctl must be called once after enqueuing one or more buffers to start capturing. Its counterpart

VIDIOC_STREAMOFF stops capturing and dequeues all buffers from both queues.

Applications can query the signal status, if known, with the ioctl VIDIOC_ENUMINPUT ioctl.

For a more in-depth discussion of memory mapping and examples, see

Streaming I/O (Memory Mapping)

.

Reading Raw VBI Data

Originally the V4L API did not specify a raw VBI capture interface, only the device file /dev/vbi was reserved for this purpose. The only driver supporting this interface was the BTTV driver, de-facto defining the V4L VBI interface. Reading from the device yields a raw VBI image with the following parameters:

156 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

struct

v4l2_vbi_format

sampling_rate offset samples_per_line sample_format start[] count[] flags

V4L, BTTV driver

28636363 Hz NTSC (or any other 525-line standard); 35468950 Hz PAL and

SECAM (625-line standards)

?

2048

V4L2_PIX_FMT_GREY. The last four bytes (a machine endianness integer) contain a frame counter.

10, 273 NTSC; 22, 335 PAL and SECAM

16, 16

44

0

Undocumented in the V4L specification, in Linux 2.3 the VIDIOCGVBIFMT and VIDIOCSVBIFMT ioctls using struct vbi_format were added to determine the VBI image parameters. These ioctls are only partially compatible with the V4L2 VBI interface specified in

Raw VBI Data Interface

.

An offset field does not exist, sample_format is supposed to be VIDEO_PALETTE_RAW, equivalent to

V4L2_PIX_FMT_GREY. The remaining fields are probably equivalent to struct

v4l2_vbi_format .

Apparently only the Zoran (ZR 36120) driver implements these ioctls. The semantics differ from those specified for V4L2 in two ways. The parameters are reset on open() and VIDIOCSVBIFMT always returns an EINVAL error code if the parameters are invalid.

Miscellaneous

V4L2 has no equivalent of the VIDIOCGUNIT ioctl. Applications can find the VBI device associated with a video capture device (or vice versa) by reopening the device and requesting VBI data. For details see

Opening and Closing Devices

.

No replacement exists for VIDIOCKEY, and the V4L functions for microcode programming. A new interface for MPEG compression and playback devices is documented in

Extended Controls

.

Changes of the V4L2 API

Soon after the V4L API was added to the kernel it was criticised as too inflexible. In August 1998 Bill

Dirks proposed a number of improvements and began to work on documentation, example drivers and applications. With the help of other volunteers this eventually became the V4L2 API, not just an extension but a replacement for the V4L API. However it took another four years and two stable kernel releases until the new API was finally accepted for inclusion into the kernel in its present form.

Early Versions

1998-08-20: First version.

1998-08-27: The select() function was introduced.

1998-09-10: New video standard interface.

1998-09-18: The VIDIOC_NONCAP ioctl was replaced by the otherwise meaningless O_TRUNC open() flag, and the aliases O_NONCAP and O_NOIO were defined. Applications can set this flag if they intend to access controls only, as opposed to capture applications which need exclusive access. The VIDEO_STD_XXX identifiers are now ordinals instead of flags, and the video_std_construct() helper function takes id and transmission arguments.

1998-09-28: Revamped video standard. Made video controls individually enumerable.

43

Old driver versions used different values, eventually the custom BTTV_VBISIZE ioctl was added to query the correct values.

44

Old driver versions used different values, eventually the custom BTTV_VBISIZE ioctl was added to query the correct values.

1.2. Part I - Video for Linux API 157

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

1998-10-02: The id field was removed from struct struct video_standard and the color subcarrier fields were renamed. The ioctl VIDIOC_QUERYSTD ioctl was renamed to ioctl VIDIOC_ENUMSTD, VIDIOC_G_INPUT to ioctl VIDIOC_ENUMINPUT. A first draft of the Codec API was released.

1998-11-08: Many minor changes. Most symbols have been renamed. Some material changes to struct v4l2_capability.

1998-11-12: The read/write directon of some ioctls was misdefined.

1998-11-14: V4L2_PIX_FMT_RGB24 changed to V4L2_PIX_FMT_BGR24, and V4L2_PIX_FMT_RGB32 changed to V4L2_PIX_FMT_BGR32. Audio controls are now accessible with the VIDIOC_G_CTRL and VIDIOC_S_CTRL ioctls under names starting with V4L2_CID_AUDIO. The V4L2_MAJOR define was removed from videodev.h

since it was only used once in the videodev kernel module. The YUV422 and YUV411 planar image formats were added.

1998-11-28: A few ioctl symbols changed. Interfaces for codecs and video output devices were added.

1999-01-14: A raw VBI capture interface was added.

1999-01-19: The VIDIOC_NEXTBUF ioctl was removed.

V4L2 Version 0.16 1999-01-31

1999-01-27: There is now one QBUF ioctl, VIDIOC_QWBUF and VIDIOC_QRBUF are gone. VIDIOC_QBUF takes a v4l2_buffer as a parameter. Added digital zoom (cropping) controls.

V4L2 Version 0.18 1999-03-16

Added a v4l to V4L2 ioctl compatibility layer to videodev.c. Driver writers, this changes how you implement your ioctl handler. See the Driver Writer's Guide. Added some more control id codes.

V4L2 Version 0.19 1999-06-05

1999-03-18: Fill in the category and catname fields of v4l2_queryctrl objects before passing them to the driver. Required a minor change to the VIDIOC_QUERYCTRL handlers in the sample drivers.

1999-03-31: Better compatibility for v4l memory capture ioctls. Requires changes to drivers to fully support new compatibility features, see Driver Writer's Guide and v4l2cap.c. Added new control IDs:

V4L2_CID_HFLIP, _VFLIP. Changed V4L2_PIX_FMT_YUV422P to _YUV422P, and _YUV411P to _YUV411P.

1999-04-04: Added a few more control IDs.

1999-04-07: Added the button control type.

1999-05-02: Fixed a typo in videodev.h, and added the V4L2_CTRL_FLAG_GRAYED (later

V4L2_CTRL_FLAG_GRABBED) flag.

1999-05-20: Definition of VIDIOC_G_CTRL was wrong causing a malfunction of this ioctl.

1999-06-05: Changed the value of V4L2_CID_WHITENESS.

V4L2 Version 0.20 (1999-09-10)

Version 0.20 introduced a number of changes which were not backward compatible with 0.19 and earlier versions. Purpose of these changes was to simplify the API, while making it more extensible and following common Linux driver API conventions.

1. Some typos in V4L2_FMT_FLAG symbols were fixed. struct

v4l2_clip

was changed for compatibility with v4l. (1999-08-30)

2. V4L2_TUNER_SUB_LANG1 was added. (1999-09-05)

158 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

3. All ioctl() commands that used an integer argument now take a pointer to an integer. Where it makes sense, ioctls will return the actual new value in the integer pointed to by the argument, a common convention in the V4L2 API. The affected ioctls are: VIDIOC_PREVIEW, VIDIOC_STREAMON, VID-

IOC_STREAMOFF, VIDIOC_S_FREQ, VIDIOC_S_INPUT, VIDIOC_S_OUTPUT, VIDIOC_S_EFFECT. For example err = ioctl (fd, VIDIOC_XXX, V4L2_XXX); becomes

int

a = V4L2_XXX; err = ioctl(fd, VIDIOC_XXX, & a);

4. All the different get- and set-format commands were swept into one VIDIOC_G_FMT and VID-

IOC_S_FMT ioctl taking a union and a type field selecting the union member as parameter. Purpose is to simplify the API by eliminating several ioctls and to allow new and driver private data streams without adding new ioctls.

This change obsoletes the following ioctls: VIDIOC_S_INFMT, VIDIOC_G_INFMT, VIDIOC_S_OUTFMT,

VIDIOC_G_OUTFMT, VIDIOC_S_VBIFMT and VIDIOC_G_VBIFMT. The image format structure struct v4l2_format was renamed to struct

v4l2_pix_format

, while struct v4l2_format is now the envelopping structure for all format negotiations.

5. Similar to the changes above, the VIDIOC_G_PARM and VIDIOC_S_PARM ioctls were merged with VID-

IOC_G_OUTPARM and VIDIOC_S_OUTPARM. A type field in the new struct v4l2_streamparm selects the respective union member.

This change obsoletes the VIDIOC_G_OUTPARM and VIDIOC_S_OUTPARM ioctls.

6. Control enumeration was simplified, and two new control flags were introduced and one dropped.

The catname field was replaced by a group field.

Drivers can now flag unsupported and temporarily unavailable controls with

V4L2_CTRL_FLAG_DISABLED and V4L2_CTRL_FLAG_GRABBED respectively.

The group name indicates a possibly narrower classification than the category. In other words, there may be multiple groups within a category. Controls within a group would typically be drawn within a group box.

Controls in different categories might have a greater separation, or may even appear in separate windows.

7. The struct

v4l2_buffer

timestamp was changed to a 64 bit integer, containing the sampling or output time of the frame in nanoseconds.

Additionally timestamps will be in absolute system time, not starting from zero at the beginning of a stream.

The data type name for timestamps is stamp_t, defined as a signed 64-bit integer.

Output devices should not send a buffer out until the time in the timestamp field has arrived.

I would like to follow SGI's lead, and adopt a multimedia timestamping system like their UST (Unadjusted System Time).

See http://web.archive.org/web/*/http://reality.sgi.com

/cpirazzi_engr/lg/time/intro.html. UST uses timestamps that are 64-bit signed integers (not struct timeval's) and given in nanosecond units. The UST clock starts at zero when the system is booted and runs continuously and uniformly. It takes a little over 292 years for UST to overflow. There is no way to set the UST clock. The regular Linux time-of-day clock can be changed periodically, which would cause errors if it were being used for timestamping a multimedia stream. A real UST style clock will require some support in the kernel that is not there yet. But in anticipation, I will change the timestamp field to a 64-bit integer, and I will change the v4l2_masterclock_gettime() function (used only by drivers) to return a 64-bit integer.

8. A sequence field was added to struct

v4l2_buffer

. The sequence field counts captured frames, it is ignored by output devices. When a capture driver drops a frame, the sequence number of that frame is skipped.

V4L2 Version 0.20 incremental changes

1999-12-23: In struct

v4l2_vbi_format

the reserved1 field became offset. Previously drivers were required to clear the reserved1 field.

1.2. Part I - Video for Linux API 159

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

2000-01-13: The V4L2_FMT_FLAG_NOT_INTERLACED flag was added.

2000-07-31: The linux/poll.h header is now included by videodev.h for compatibility with the original videodev.h file.

2000-11-20: V4L2_TYPE_VBI_OUTPUT and V4L2_PIX_FMT_Y41P were added.

2000-11-25: V4L2_TYPE_VBI_INPUT was added.

2000-12-04: A couple typos in symbol names were fixed.

2001-01-18: To avoid namespace conflicts the fourcc macro defined in the videodev.h header file was renamed to v4l2_fourcc.

2001-01-25: A possible driver-level compatibility problem between the videodev.h file in Linux 2.4.0 and the videodev.h file included in the videodevX patch was fixed. Users of an earlier version of videodevX on Linux 2.4.0 should recompile their V4L and V4L2 drivers.

2001-01-26: A possible kernel-level incompatibility between the videodev.h file in the videodevX patch and the videodev.h file in Linux 2.2.x with devfs patches applied was fixed.

2001-03-02: Certain V4L ioctls which pass data in both direction although they are defined with read-only parameter, did not work correctly through the backward compatibility layer. [Solution?]

2001-04-13: Big endian 16-bit RGB formats were added.

2001-09-17: New YUV formats and the VIDIOC_G_FREQUENCY and VIDIOC_S_FREQUENCY ioctls were added. (The old VIDIOC_G_FREQ and VIDIOC_S_FREQ ioctls did not take multiple tuners into account.)

2000-09-18: V4L2_BUF_TYPE_VBI was added.

This may break compatibility as the VIDIOC_G_FMT and VIDIOC_S_FMT ioctls may fail now if the struct struct v4l2_fmt type field does not contain

V4L2_BUF_TYPE_VBI. In the documentation of the struct

v4l2_vbi_format

offset field the ambiguous phrase ``rising edge'' was changed to ``leading edge''.

V4L2 Version 0.20 2000-11-23

A number of changes were made to the raw VBI interface.

1. Figures clarifying the line numbering scheme were added to the V4L2 API specification. The start[0] and start[1] fields no longer count line numbers beginning at zero. Rationale: a) The previous definition was unclear. b) The start[] values are ordinal numbers. c) There is no point in inventing a new line numbering scheme. We now use line number as defined by ITU-R, period. Compatibility:

Add one to the start values. Applications depending on the previous semantics may not function correctly.

2. The restriction ``count[0] > 0 and count[1] > 0'' has been relaxed to ``(count[0] + count[1]) > 0''.

Rationale: Drivers may allocate resources at scan line granularity and some data services are transmitted only on the first field. The comment that both count values will usually be equal is misleading and pointless and has been removed. This change breaks compatibility with earlier versions: Drivers may return EINVAL, applications may not function correctly.

3. Drivers are again permitted to return negative (unknown) start values as proposed earlier. Why this feature was dropped is unclear. This change may break compatibility with applications depending on the start values being positive. The use of EBUSY and EINVAL error codes with the VIDIOC_S_FMT ioctl was clarified. The EBUSY error code was finally documented, and the reserved2 field which was previously mentioned only in the videodev.h header file.

4. New buffer types V4L2_TYPE_VBI_INPUT and V4L2_TYPE_VBI_OUTPUT were added. The former is an alias for the old V4L2_TYPE_VBI, the latter was missing in the videodev.h file.

V4L2 Version 0.20 2002-07-25

Added sliced VBI interface proposal.

160 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2 in Linux 2.5.46, 2002-10

Around October-November 2002, prior to an announced feature freeze of Linux 2.5, the API was revised, drawing from experience with V4L2 0.20. This unnamed version was finally merged into Linux 2.5.46.

1. As specified in

Related Devices

, drivers must make related device functions available under all minor

device numbers.

2. The open() function requires access mode O_RDWR regardless of the device type. All V4L2 drivers exchanging data with applications must support the O_NONBLOCK flag. The O_NOIO flag, a V4L2 symbol which aliased the meaningless O_TRUNC to indicate accesses without data exchange (panel applications) was dropped. Drivers must stay in ``panel mode'' until the application attempts to initiate a data exchange, see

Opening and Closing Devices

.

3. The struct v4l2_capability changed dramatically. Note that also the size of the structure changed, which is encoded in the ioctl request code, thus older V4L2 devices will respond with an EINVAL error code to the new ioctl VIDIOC_QUERYCAP ioctl.

There are new fields to identify the driver, a new RDS device function V4L2_CAP_RDS_CAPTURE, the V4L2_CAP_AUDIO flag indicates if the device has any audio connectors, another I/O capability

V4L2_CAP_ASYNCIO can be flagged.

In response to these changes the type field became a bit set and was merged into the flags field. V4L2_FLAG_TUNER was renamed to V4L2_CAP_TUNER,

V4L2_CAP_VIDEO_OVERLAY replaced V4L2_FLAG_PREVIEW and V4L2_CAP_VBI_CAPTURE and

V4L2_CAP_VBI_OUTPUT replaced V4L2_FLAG_DATA_SERVICE. V4L2_FLAG_READ and V4L2_FLAG_WRITE were merged into V4L2_CAP_READWRITE.

The redundant fields inputs, outputs and audios were removed. These properties can be determined as described in

Video Inputs and Outputs

and

Audio Inputs and Outputs

.

The somewhat volatile and therefore barely useful fields maxwidth, maxheight, minwidth, minheight, maxframerate were removed. This information is available as described in

Data Formats

and

Video Standards

.

V4L2_FLAG_SELECT was removed.

We believe the select() function is important enough to require support of it in all V4L2 drivers exchanging data with applications.

The redundant

V4L2_FLAG_MONOCHROME flag was removed, this information is available as described in

Data Formats

.

4. In struct v4l2_input the assoc_audio field and the capability field and its only flag

V4L2_INPUT_CAP_AUDIO was replaced by the new audioset field. Instead of linking one video input to one audio input this field reports all audio inputs this video input combines with.

New fields are tuner (reversing the former link from tuners to video inputs), std and status.

Accordingly struct v4l2_output lost its capability and assoc_audio fields. audioset, modulator and std where added instead.

5. The struct v4l2_audio field audio was renamed to index, for consistency with other structures.

A new capability flag V4L2_AUDCAP_STEREO was added to indicated if the audio input in question supports stereo sound. V4L2_AUDCAP_EFFECTS and the corresponding V4L2_AUDMODE flags where removed. This can be easily implemented using controls. (However the same applies to AVL which is still there.)

Again for consistency the struct v4l2_audioout field audio was renamed to index.

6. The struct v4l2_tuner input field was replaced by an index field, permitting devices with multiple tuners. The link between video inputs and tuners is now reversed, inputs point to their tuner. The std substructure became a simple set (more about this below) and moved into struct v4l2_input.

A type field was added.

Accordingly in struct v4l2_modulator the output was replaced by an index field.

In struct v4l2_frequency the port field was replaced by a tuner field containing the respective tuner or modulator index number. A tuner type field was added and the reserved field became larger for future extensions (satellite tuners in particular).

1.2. Part I - Video for Linux API 161

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

7. The idea of completely transparent video standards was dropped. Experience showed that applications must be able to work with video standards beyond presenting the user a menu. Instead of enumerating supported standards with an ioctl applications can now refer to standards by v4l2_std_id and symbols defined in the videodev2.h header file. For details see

Video Standards

. The VIDIOC_G_STD and VIDIOC_S_STD now take a pointer to this type as argument. ioctl VIDIOC_QUERYSTD was added to autodetect the received standard, if the hardware has this capability. In struct v4l2_standard an index field was added for ioctl VIDIOC_ENUMSTD. A v4l2_std_id field named id was added as machine readable identifier, also replacing the transmission field. The misleading framerate field was renamed to frameperiod. The now obsolete colorstandard information, originally needed to distguish between variations of standards, were removed.

Struct v4l2_enumstd ceased to be.

ioctl VIDIOC_ENUMSTD now takes a pointer to a struct v4l2_standard directly. The information which standards are supported by a particular video input or output moved into struct v4l2_input and struct v4l2_output fields named std, respectively.

8. The struct v4l2_queryctrl fields category and group did not catch on and/or were not implemented as expected and therefore removed.

9. The VIDIOC_TRY_FMT ioctl was added to negotiate data formats as with VIDIOC_S_FMT, but without the overhead of programming the hardware and regardless of I/O in progress.

In struct v4l2_format the fmt union was extended to contain struct

v4l2_window . All image format

negotiations are now possible with VIDIOC_G_FMT, VIDIOC_S_FMT and VIDIOC_TRY_FMT; ioctl. The

VIDIOC_G_WIN and VIDIOC_S_WIN ioctls to prepare for a video overlay were removed. The type field changed to type enum

v4l2_buf_type

and the buffer type names changed as follows.

Old defines

V4L2_BUF_TYPE_CAPTURE

V4L2_BUF_TYPE_CODECIN

V4L2_BUF_TYPE_CODECOUT

V4L2_BUF_TYPE_EFFECTSIN

V4L2_BUF_TYPE_EFFECTSIN2

V4L2_BUF_TYPE_EFFECTSOUT enum

v4l2_buf_type

V4L2_BUF_TYPE_VIDEO_CAPTURE

Omitted for now

Omitted for now

Omitted for now

Omitted for now

Omitted for now

V4L2_BUF_TYPE_VIDEOOUT

-

-

V4L2_BUF_TYPE_VIDEO_OUTPUT

V4L2_BUF_TYPE_VIDEO_OVERLAY

V4L2_BUF_TYPE_VBI_CAPTURE

-

-

V4L2_BUF_TYPE_VBI_OUTPUT

V4L2_BUF_TYPE_SLICED_VBI_CAPTURE

V4L2_BUF_TYPE_SLICED_VBI_OUTPUT

V4L2_BUF_TYPE_PRIVATE_BASE V4L2_BUF_TYPE_PRIVATE (but this is deprecated)

10. In struct v4l2_fmtdesc a enum

v4l2_buf_type

field named type was added as in struct v4l2_format. The VIDIOC_ENUM_FBUFFMT ioctl is no longer needed and was removed. These calls can be replaced by ioctl VIDIOC_ENUM_FMT with type V4L2_BUF_TYPE_VIDEO_OVERLAY.

11. In struct

v4l2_pix_format

the depth field was removed, assuming applications which recognize the format by its four-character-code already know the color depth, and others do not care about it. The same rationale lead to the removal of the V4L2_FMT_FLAG_COMPRESSED flag. The

V4L2_FMT_FLAG_SWCONVECOMPRESSED flag was removed because drivers are not supposed to convert images in kernel space. A user library of conversion functions should be provided instead. The

V4L2_FMT_FLAG_BYTESPERLINE flag was redundant. Applications can set the bytesperline field to zero to get a reasonable default. Since the remaining flags were replaced as well, the flags field itself was removed.

The interlace flags were replaced by a enum

v4l2_field

value in a newly added field field.

162 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Old flag

V4L2_FMT_FLAG_NOT_INTERLACED enum

v4l2_field

?

V4L2_FMT_FLAG_INTERLACED = V4L2_FMT_FLAG_COMBINED V4L2_FIELD_INTERLACED

V4L2_FMT_FLAG_TOPFIELD = V4L2_FMT_FLAG_ODDFIELD V4L2_FIELD_TOP

-

-

V4L2_FMT_FLAG_BOTFIELD = V4L2_FMT_FLAG_EVENFIELD

-

V4L2_FIELD_BOTTOM

V4L2_FIELD_SEQ_TB

V4L2_FIELD_SEQ_BT

V4L2_FIELD_ALTERNATE

The color space flags were replaced by a enum

v4l2_colorspace

value in a newly added colorspace field, where one of V4L2_COLORSPACE_SMPTE170M, V4L2_COLORSPACE_BT878,

V4L2_COLORSPACE_470_SYSTEM_M

V4L2_FMT_CS_601YUV.

or V4L2_COLORSPACE_470_SYSTEM_BG replaces

12. In struct v4l2_requestbuffers the type field was properly defined as enum

v4l2_buf_type . Buffer

types changed as mentioned above. A new memory field of type enum

v4l2_memory

was added to distinguish between I/O methods using buffers allocated by the driver or the application. See

Input/Output

for details.

13. In struct

v4l2_buffer

the type field was properly defined as enum

v4l2_buf_type

. Buffer types changed as mentioned above. A field field of type enum

v4l2_field

was added to indicate if a buffer contains a top or bottom field. The old field flags were removed. Since no unadjusted system time clock was added to the kernel as planned, the timestamp field changed back from type stamp_t, an unsigned 64 bit integer expressing the sample time in nanoseconds, to struct timeval. With the addition of a second memory mapping method the offset field moved into union m, and a new memory field of type enum

v4l2_memory

was added to distinguish between I/O methods. See

Input/Output

for details.

The V4L2_BUF_REQ_CONTIG flag was used by the V4L compatibility layer, after changes to this code it was no longer needed. The V4L2_BUF_ATTR_DEVICEMEM flag would indicate if the buffer was indeed allocated in device memory rather than DMA-able system memory. It was barely useful and so was removed.

14. In struct v4l2_framebuffer the base[3] array anticipating double- and triple-buffering in off-screen video memory, however without defining a synchronization mechanism, was replaced by a single pointer. The V4L2_FBUF_CAP_SCALEUP and V4L2_FBUF_CAP_SCALEDOWN flags were removed. Applications can determine this capability more accurately using the new cropping and scaling interface. The V4L2_FBUF_CAP_CLIPPING flag was replaced by V4L2_FBUF_CAP_LIST_CLIPPING and

V4L2_FBUF_CAP_BITMAP_CLIPPING.

15. In struct

v4l2_clip

the x, y, width and height field moved into a c substructure of type struct

v4l2_rect

. The x and y fields were renamed to left and top, i. e. offsets to a context dependent origin.

16. In struct

v4l2_window

the x, y, width and height field moved into a w substructure as above. A field field of type

v4l2_field

was added to distinguish between field and frame (interlaced) overlay.

17. The digital zoom interface, including struct struct v4l2_zoomcap, struct struct v4l2_zoom,

V4L2_ZOOM_NONCAP and V4L2_ZOOM_WHILESTREAMING was replaced by a new cropping and scaling interface. The previously unused struct struct v4l2_cropcap and struct v4l2_crop where redefined for this purpose. See

Image Cropping, Insertion and Scaling

for details.

18. In struct

v4l2_vbi_format

the SAMPLE_FORMAT field now contains a four-character-code as used to identify video image formats and V4L2_PIX_FMT_GREY replaces the V4L2_VBI_SF_UBYTE define. The reserved field was extended.

19. In struct v4l2_captureparm the type of the timeperframe field changed from unsigned long to struct v4l2_fract. This allows the accurate expression of multiples of the NTSC-M frame rate 30000 / 1001.

A new field readbuffers was added to control the driver behaviour in read I/O mode.

Similar changes were made to struct v4l2_outputparm.

20. The struct v4l2_performance and VIDIOC_G_PERF ioctl were dropped.

Except when using the

read/write I/O method

, which is limited anyway, this information is already available to applications.

1.2. Part I - Video for Linux API 163

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

21. The example transformation from RGB to YCbCr color space in the old V4L2 documentation was inaccurate, this has been corrected in

Image Formats

.

V4L2 2003-06-19

1. A new capability flag V4L2_CAP_RADIO was added for radio devices. Prior to this change radio devices would identify solely by having exactly one tuner whose type field reads V4L2_TUNER_RADIO.

2. An optional driver access priority mechanism was added, see

Application Priority

for details.

3. The audio input and output interface was found to be incomplete.

Previously the VIDIOC_G_AUDIO ioctl would enumerate the available audio inputs. An ioctl to determine the current audio input, if more than one combines with the current video input, did not exist.

So VIDIOC_G_AUDIO was renamed to VIDIOC_G_AUDIO_OLD, this ioctl was removed on Kernel 2.6.39.

The ioctl VIDIOC_ENUMAUDIO ioctl was added to enumerate audio inputs, while VIDIOC_G_AUDIO now reports the current audio input.

The same changes were made to VIDIOC_G_AUDOUT and VIDIOC_ENUMAUDOUT.

Until further the ``videodev'' module will automatically translate between the old and new ioctls, but drivers and applications must be updated to successfully compile again.

4. The ioctl VIDIOC_OVERLAY ioctl was incorrectly defined with write-read parameter. It was changed to write-only, while the write-read version was renamed to VIDIOC_OVERLAY_OLD. The old ioctl was removed on Kernel 2.6.39. Until further the ``videodev'' kernel module will automatically translate to the new version, so drivers must be recompiled, but not applications.

5.

Video Overlay Interface

incorrectly stated that clipping rectangles define regions where the video can be seen. Correct is that clipping rectangles define regions where no video shall be displayed and so the graphics surface can be seen.

6. The VIDIOC_S_PARM and VIDIOC_S_CTRL ioctls were defined with write-only parameter, inconsistent with other ioctls modifying their argument. They were changed to write-read, while a _OLD suffix was added to the write-only versions. The old ioctls were removed on Kernel 2.6.39. Drivers and applications assuming a constant parameter need an update.

V4L2 2003-11-05

1. In

RGB Formats

the following pixel formats were incorrectly transferred from Bill Dirks' V4L2 specification. Descriptions below refer to bytes in memory, in ascending address order.

Symbol In this document prior to revision 0.5

Corrected

V4L2_PIX_FMT_RGB24 B, G, R R, G, B

V4L2_PIX_FMT_BGR24 R, G, B

V4L2_PIX_FMT_RGB32 B, G, R, X

V4L2_PIX_FMT_BGR32 R, G, B, X

B, G, R

R, G, B, X

B, G, R, X

The V4L2_PIX_FMT_BGR24 example was always correct.

In Image Properties the mapping of the V4L VIDEO_PALETTE_RGB24 and VIDEO_PALETTE_RGB32 formats to V4L2 pixel formats was accordingly corrected.

2. Unrelated to the fixes above, drivers may still interpret some V4L2 RGB pixel formats differently.

These issues have yet to be addressed, for details see

RGB Formats

.

V4L2 in Linux 2.6.6, 2004-05-09

1. The ioctl VIDIOC_CROPCAP ioctl was incorrectly defined with read-only parameter. It is now defined as write-read ioctl, while the read-only version was renamed to VIDIOC_CROPCAP_OLD. The old ioctl was removed on Kernel 2.6.39.

164 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2 in Linux 2.6.8

1. A new field input (former reserved[0]) was added to the struct

v4l2_buffer

structure. Purpose of this field is to alternate between video inputs (e. g. cameras) in step with the video capturing process. This function must be enabled with the new V4L2_BUF_FLAG_INPUT flag. The flags field is no longer read-only.

V4L2 spec erratum 2004-08-01

1. The return value of the V4L2 open() function was incorrectly documented.

2. Audio output ioctls end in -AUDOUT, not -AUDIOOUT.

3. In the Current Audio Input example the VIDIOC_G_AUDIO ioctl took the wrong argument.

4. The documentation of the ioctl VIDIOC_QBUF, VIDIOC_DQBUF and VIDIOC_DQBUF ioctls did not mention the struct

v4l2_buffer

memory field. It was also missing from examples. Also on the VID-

IOC_DQBUF page the EIO error code was not documented.

V4L2 in Linux 2.6.14

1. A new sliced VBI interface was added. It is documented in

Sliced VBI Data Interface

and replaces the interface first proposed in V4L2 specification 0.8.

V4L2 in Linux 2.6.15

1. The ioctl VIDIOC_LOG_STATUS ioctl was added.

2. New video standards V4L2_STD_NTSC_443, V4L2_STD_SECAM_LC, V4L2_STD_SECAM_DK (a set of SE-

CAM D, K and K1), and V4L2_STD_ATSC (a set of V4L2_STD_ATSC_8_VSB and V4L2_STD_ATSC_16_VSB) were defined. Note the V4L2_STD_525_60 set now includes V4L2_STD_NTSC_443. See also typedef

v4l2_std_id.

3. The VIDIOC_G_COMP and VIDIOC_S_COMP ioctl were renamed to VIDIOC_G_MPEGCOMP and VID-

IOC_S_MPEGCOMP respectively. Their argument was replaced by a struct v4l2_mpeg_compression pointer. (The VIDIOC_G_MPEGCOMP and VIDIOC_S_MPEGCOMP ioctls where removed in Linux 2.6.25.)

V4L2 spec erratum 2005-11-27

The capture example in Video Capture Example called the VIDIOC_S_CROP ioctl without checking if cropping is supported. In the video standard selection example in

Video Standards

the VIDIOC_S_STD call used the wrong argument type.

V4L2 spec erratum 2006-01-10

1. The V4L2_IN_ST_COLOR_KILL flag in struct v4l2_input not only indicates if the color killer is enabled, but also if it is active. (The color killer disables color decoding when it detects no color in the video signal to improve the image quality.)

2. VIDIOC_S_PARM is a write-read ioctl, not write-only as stated on its reference page. The ioctl changed in 2003 as noted above.

V4L2 spec erratum 2006-02-03

1. In struct v4l2_captureparm and struct v4l2_outputparm the timeperframe field gives the time in seconds, not microseconds.

1.2. Part I - Video for Linux API 165

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2 spec erratum 2006-02-04

1. The clips field in struct

v4l2_window

must point to an array of struct

v4l2_clip

, not a linked list, because drivers ignore the struct struct

v4l2_clip . next pointer.

V4L2 in Linux 2.6.17

1. New video standard macros were added: V4L2_STD_NTSC_M_KR (NTSC M South Korea), and the sets V4L2_STD_MN, V4L2_STD_B, V4L2_STD_GH and V4L2_STD_DK. The V4L2_STD_NTSC and

V4L2_STD_SECAM sets now include V4L2_STD_NTSC_M_KR and V4L2_STD_SECAM_LC respectively.

2. A new V4L2_TUNER_MODE_LANG1_LANG2 was defined to record both languages of a bilingual program.

The use of V4L2_TUNER_MODE_STEREO for this purpose is deprecated now. See the VIDIOC_G_TUNER section for details.

V4L2 spec erratum 2006-09-23 (Draft 0.15)

1. In various places V4L2_BUF_TYPE_SLICED_VBI_CAPTURE and V4L2_BUF_TYPE_SLICED_VBI_OUTPUT of the sliced VBI interface were not mentioned along with other buffer types.

2. In VIDIOC_G_AUDIO it was clarified that the struct v4l2_audio mode field is a flags field.

3. ioctl VIDIOC_QUERYCAP did not mention the sliced VBI and radio capability flags.

4. In VIDIOC_G_FREQUENCY it was clarified that applications must initialize the tuner type field of struct v4l2_frequency before calling VIDIOC_S_FREQUENCY.

5. The reserved array in struct v4l2_requestbuffers has 2 elements, not 32.

6. In

Video Output Interface

and

Raw VBI Data Interface

the device file names /dev/vout which never caught on were replaced by /dev/video.

7. With Linux 2.6.15 the possible range for VBI device minor numbers was extended from 224-239 to

224-255. Accordingly device file names /dev/vbi0 to /dev/vbi31 are possible now.

V4L2 in Linux 2.6.18

1. New ioctls VIDIOC_G_EXT_CTRLS, VIDIOC_S_EXT_CTRLS and VIDIOC_TRY_EXT_CTRLS were added, a flag to skip unsupported controls with ioctls VIDIOC_QUERYCTRL, VIDIOC_QUERY_EXT_CTRL and VID-

IOC_QUERYMENU, new control types V4L2_CTRL_TYPE_INTEGER64 and V4L2_CTRL_TYPE_CTRL_CLASS

(v4l2_ctrl_type), and new control flags V4L2_CTRL_FLAG_READ_ONLY, V4L2_CTRL_FLAG_UPDATE,

V4L2_CTRL_FLAG_INACTIVE and V4L2_CTRL_FLAG_SLIDER (Control Flags). See

Extended Controls

for details.

V4L2 in Linux 2.6.19

1. In struct v4l2_sliced_vbi_cap a buffer type field was added replacing a reserved field. Note on architectures where the size of enum types differs from int types the size of the structure changed. The

VIDIOC_G_SLICED_VBI_CAP ioctl was redefined from being read-only to write-read. Applications must initialize the type field and clear the reserved fields now. These changes may break the compatibility with older drivers and applications.

2. The ioctls ioctl VIDIOC_ENUM_FRAMESIZES and ioctl VIDIOC_ENUM_FRAMEINTERVALS were added.

3. A new pixel format V4L2_PIX_FMT_RGB444 (

Packed RGB Image Formats

) was added.

166 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2 spec erratum 2006-10-12 (Draft 0.17)

1. V4L2_PIX_FMT_HM12 (

Reserved Image Formats

) is a YUV 4:2:0, not 4:2:2 format.

V4L2 in Linux 2.6.21

1. The videodev2.h header file is now dual licensed under GNU General Public License version two or later, and under a 3-clause BSD-style license.

V4L2 in Linux 2.6.22

1. Two new field orders V4L2_FIELD_INTERLACED_TB and V4L2_FIELD_INTERLACED_BT were added. See

v4l2_field

for details.

2. Three new clipping/blending methods with a global or straight or inverted local alpha value were added to the video overlay interface. See the description of the VIDIOC_G_FBUF and VIDIOC_S_FBUF ioctls for details.

A new global_alpha field was added to

v4l2_window , extending the structure. This may break

compatibility with applications using a struct struct

v4l2_window

directly.

However the VID-

IOC_G/S/TRY_FMT ioctls, which take a pointer to a v4l2_format parent structure with padding bytes at the end, are not affected.

3. The format of the chromakey field in struct

v4l2_window

changed from ``host order RGB32'' to a pixel value in the same format as the framebuffer. This may break compatibility with existing applications.

Drivers supporting the ``host order RGB32'' format are not known.

V4L2 in Linux 2.6.24

1. The pixel formats V4L2_PIX_FMT_PAL8, V4L2_PIX_FMT_YUV444, V4L2_PIX_FMT_YUV555,

V4L2_PIX_FMT_YUV565 and V4L2_PIX_FMT_YUV32 were added.

V4L2 in Linux 2.6.25

1. The pixel formats

V4L2_PIX_FMT_Y16

and

V4L2_PIX_FMT_SBGGR16

were added.

2. New

controls

V4L2_CID_POWER_LINE_FREQUENCY, V4L2_CID_HUE_AUTO,

V4L2_CID_WHITE_BALANCE_TEMPERATURE, V4L2_CID_SHARPNESS and V4L2_CID_BACKLIGHT_COMPENSATION were added. The controls V4L2_CID_BLACK_LEVEL, V4L2_CID_WHITENESS, V4L2_CID_HCENTER and

V4L2_CID_VCENTER were deprecated.

3. A

Camera controls class

was added, with the new controls V4L2_CID_EXPOSURE_AUTO,

V4L2_CID_EXPOSURE_ABSOLUTE, V4L2_CID_EXPOSURE_AUTO_PRIORITY, V4L2_CID_PAN_RELATIVE,

V4L2_CID_TILT_RELATIVE,

V4L2_CID_PAN_ABSOLUTE,

V4L2_CID_PAN_RESET,

V4L2_CID_TILT_ABSOLUTE,

V4L2_CID_FOCUS_RELATIVE and V4L2_CID_FOCUS_AUTO.

V4L2_CID_TILT_RESET,

V4L2_CID_FOCUS_ABSOLUTE,

4. The VIDIOC_G_MPEGCOMP and VIDIOC_S_MPEGCOMP ioctls, which were superseded by the

extended controls

interface in Linux 2.6.18, where finally removed from the videodev2.h header file.

V4L2 in Linux 2.6.26

1. The pixel formats V4L2_PIX_FMT_Y16 and V4L2_PIX_FMT_SBGGR16 were added.

2. Added user controls V4L2_CID_CHROMA_AGC and V4L2_CID_COLOR_KILLER.

1.2. Part I - Video for Linux API 167

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2 in Linux 2.6.27

1. The ioctl VIDIOC_S_HW_FREQ_SEEK ioctl and the V4L2_CAP_HW_FREQ_SEEK capability were added.

2. The pixel formats V4L2_PIX_FMT_YVYU, V4L2_PIX_FMT_PCA501, V4L2_PIX_FMT_PCA505,

V4L2_PIX_FMT_PCA508, V4L2_PIX_FMT_PCA561, V4L2_PIX_FMT_SGBRG8, V4L2_PIX_FMT_PAC207 and V4L2_PIX_FMT_PJPG were added.

V4L2 in Linux 2.6.28

1. Added V4L2_MPEG_AUDIO_ENCODING_AAC and V4L2_MPEG_AUDIO_ENCODING_AC3 MPEG audio encodings.

2. Added V4L2_MPEG_VIDEO_ENCODING_MPEG_4_AVC MPEG video encoding.

3. The pixel formats V4L2_PIX_FMT_SGRBG10 and V4L2_PIX_FMT_SGRBG10DPCM8 were added.

V4L2 in Linux 2.6.29

1. The VIDIOC_G_CHIP_IDENT ioctl was renamed to VIDIOC_G_CHIP_IDENT_OLD and VID-

IOC_DBG_G_CHIP_IDENT was introduced in its place.

The old struct struct v4l2_chip_ident was renamed to struct v4l2_chip_ident_old.

2. The pixel formats V4L2_PIX_FMT_VYUY, V4L2_PIX_FMT_NV16 and V4L2_PIX_FMT_NV61 were added.

3. Added camera controls V4L2_CID_ZOOM_ABSOLUTE,

V4L2_CID_ZOOM_CONTINUOUS and V4L2_CID_PRIVACY.

V4L2_CID_ZOOM_RELATIVE,

V4L2 in Linux 2.6.30

1. New control flag V4L2_CTRL_FLAG_WRITE_ONLY was added.

2. New control V4L2_CID_COLORFX was added.

V4L2 in Linux 2.6.32

1. In order to be easier to compare a V4L2 API and a kernel version, now V4L2 API is numbered using the Linux Kernel version numeration.

2. Finalized the RDS capture API. See

RDS Interface

for more information.

3. Added new capabilities for modulators and RDS encoders.

4. Add description for libv4l API.

5. Added support for string controls via new type V4L2_CTRL_TYPE_STRING.

6. Added V4L2_CID_BAND_STOP_FILTER documentation.

7. Added FM Modulator (FM TX) Extended Control Class: V4L2_CTRL_CLASS_FM_TX and their Control IDs.

8. Added FM Receiver (FM RX) Extended Control Class: V4L2_CTRL_CLASS_FM_RX and their Control IDs.

9. Added Remote Controller chapter, describing the default Remote Controller mapping for media devices.

V4L2 in Linux 2.6.33

1. Added support for Digital Video timings in order to support HDTV receivers and transmitters.

168 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2 in Linux 2.6.34

1. Added V4L2_CID_IRIS_ABSOLUTE and V4L2_CID_IRIS_RELATIVE controls to the

Camera controls class

.

V4L2 in Linux 2.6.37

1. Remove the vtx (videotext/teletext) API. This API was no longer used and no hardware exists to verify the API. Nor were any userspace applications found that used it. It was originally scheduled for removal in 2.6.35.

V4L2 in Linux 2.6.39

1. The old VIDIOC_*_OLD symbols and V4L1 support were removed.

2. Multi-planar API added. Does not affect the compatibility of current drivers and applications. See

multi-planar API

for details.

V4L2 in Linux 3.1

1. VIDIOC_QUERYCAP now returns a per-subsystem version instead of a per-driver one.

Standardize an error code for invalid ioctl.

Added V4L2_CTRL_TYPE_BITMASK.

V4L2 in Linux 3.2

1. V4L2_CTRL_FLAG_VOLATILE was added to signal volatile controls to userspace.

2. Add selection API for extended control over cropping and composing. Does not affect the compatibility of current drivers and applications. See

selection API

for details.

V4L2 in Linux 3.3

1. Added V4L2_CID_ALPHA_COMPONENT control to the

User controls class

.

2. Added the device_caps field to struct v4l2_capabilities and added the new V4L2_CAP_DEVICE_CAPS capability.

V4L2 in Linux 3.4

1. Added

JPEG compression control class

.

2. Extended the DV Timings API: ioctl VIDIOC_ENUM_DV_TIMINGS, VIDIOC_SUBDEV_ENUM_DV_TIMINGS,

ioctl VIDIOC_QUERY_DV_TIMINGS

and

ioctl VIDIOC_DV_TIMINGS_CAP, VID-

IOC_SUBDEV_DV_TIMINGS_CAP.

V4L2 in Linux 3.5

1. Added integer menus, the new type will be V4L2_CTRL_TYPE_INTEGER_MENU.

2. Added selection API for V4L2 subdev interface:

ioctl VIDIOC_SUBDEV_G_SELECTION, VID-

IOC_SUBDEV_S_SELECTION and VIDIOC_SUBDEV_S_SELECTION.

1.2. Part I - Video for Linux API 169

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

3. Added V4L2_COLORFX_ANTIQUE,

V4L2_COLORFX_SILHOUETTE,

V4L2_COLORFX_ART_FREEZE,

V4L2_COLORFX_SOLARIZATION,

V4L2_COLORFX_AQUA,

V4L2_COLORFX_VIVID

V4L2_COLORFX_ARBITRARY_CBCR menu items to the V4L2_CID_COLORFX control.

and

4. Added V4L2_CID_COLORFX_CBCR control.

5. Added camera controls V4L2_CID_AUTO_EXPOSURE_BIAS, V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE,

V4L2_CID_IMAGE_STABILIZATION, V4L2_CID_ISO_SENSITIVITY, V4L2_CID_ISO_SENSITIVITY_AUTO,

V4L2_CID_EXPOSURE_METERING, V4L2_CID_SCENE_MODE, V4L2_CID_3A_LOCK,

V4L2_CID_AUTO_FOCUS_START, V4L2_CID_AUTO_FOCUS_STOP, V4L2_CID_AUTO_FOCUS_STATUS and

V4L2_CID_AUTO_FOCUS_RANGE.

V4L2 in Linux 3.6

1. Replaced input in struct

v4l2_buffer

by reserved2 and removed V4L2_BUF_FLAG_INPUT.

2. Added V4L2_CAP_VIDEO_M2M and V4L2_CAP_VIDEO_M2M_MPLANE capabilities.

3. Added support for frequency band enumerations: ioctl VIDIOC_ENUM_FREQ_BANDS.

V4L2 in Linux 3.9

1. Added timestamp types to flags field in struct

v4l2_buffer . See

Buffer Flags

.

2. Added V4L2_EVENT_CTRL_CH_RANGE control event changes flag. See Control Changes.

V4L2 in Linux 3.10

1. Removed obsolete and unused DV_PRESET ioctls VIDIOC_G_DV_PRESET, VIDIOC_S_DV_PRESET, VID-

IOC_QUERY_DV_PRESET and VIDIOC_ENUM_DV_PRESET. Remove the related v4l2_input/output capability flags V4L2_IN_CAP_PRESETS and V4L2_OUT_CAP_PRESETS.

2. Added new debugging ioctl ioctl VIDIOC_DBG_G_CHIP_INFO.

V4L2 in Linux 3.11

1. Remove obsolete VIDIOC_DBG_G_CHIP_IDENT ioctl.

V4L2 in Linux 3.14

1. In struct

v4l2_rect

, the type of width and height fields changed from _s32 to _u32.

V4L2 in Linux 3.15

1. Added Software Defined Radio (SDR) Interface.

V4L2 in Linux 3.16

1. Added event V4L2_EVENT_SOURCE_CHANGE.

V4L2 in Linux 3.17

1. Extended struct

v4l2_pix_format

. Added format flags.

2. Added compound control types and VIDIOC_QUERY_EXT_CTRL.

170 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2 in Linux 3.18

1. Added V4L2_CID_PAN_SPEED and V4L2_CID_TILT_SPEED camera controls.

V4L2 in Linux 3.19

1. Rewrote Colorspace chapter, added new enum

v4l2_ycbcr_encoding

and enum

v4l2_quantization

fields to struct

v4l2_pix_format

, struct

v4l2_pix_format_mplane

and struct

v4l2_mbus_framefmt

.

V4L2 in Linux 4.4

1. Renamed V4L2_TUNER_ADC to V4L2_TUNER_SDR. The use of V4L2_TUNER_ADC is deprecated now.

2. Added V4L2_CID_RF_TUNER_RF_GAIN RF Tuner control.

3. Added transmitter support for Software Defined Radio (SDR) Interface.

Relation of V4L2 to other Linux multimedia APIs

X Video Extension The X Video Extension (abbreviated XVideo or just Xv) is an extension of the X

Window system, implemented for example by the XFree86 project. Its scope is similar to V4L2, an API to video capture and output devices for X clients. Xv allows applications to display live video in a window, send window contents to a TV output, and capture or output still images in XPixmaps

45

. With their implementation XFree86 makes the extension available across many operating systems and architectures.

Because the driver is embedded into the X server Xv has a number of advantages over the V4L2

video overlay interface

. The driver can easily determine the overlay target, i. e. visible graphics memory

or off-screen buffers for a destructive overlay. It can program the RAMDAC for a non-destructive overlay, scaling or color-keying, or the clipping functions of the video capture hardware, always in sync with drawing operations or windows moving or changing their stacking order.

To combine the advantages of Xv and V4L a special Xv driver exists in XFree86 and XOrg, just programming any overlay capable Video4Linux device it finds. To enable it /etc/X11/XF86Config must contain these lines:

Section "Module"

Load "v4l"

EndSection

As of XFree86 4.2 this driver still supports only V4L ioctls, however it should work just fine with all V4L2 devices through the V4L2 backward-compatibility layer. Since V4L2 permits multiple opens it is possible

(if supported by the V4L2 driver) to capture video while an X client requested video overlay. Restrictions of simultaneous capturing and overlay are discussed in

Video Overlay Interface

apply.

Only marginally related to V4L2, XFree86 extended Xv to support hardware YUV to RGB conversion and scaling for faster video playback, and added an interface to MPEG-2 decoding hardware. This API is useful to display images captured with V4L2 devices.

Digital Video V4L2 does not support digital terrestrial, cable or satellite broadcast. A separate project aiming at digital receivers exists. You can find its homepage at https://linuxtv.org

. The Linux DVB API has no connection to the V4L2 API except that drivers for hybrid hardware may support both.

Audio Interfaces [to do - OSS/ALSA]

45

This is not implemented in XFree86.

1.2. Part I - Video for Linux API 171

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Experimental API Elements

The following V4L2 API elements are currently experimental and may change in the future.

ioctl VIDIOC_DBG_G_REGISTER, VIDIOC_DBG_S_REGISTER and VIDIOC_DBG_S_REGISTER ioctls.

ioctl VIDIOC_DBG_G_CHIP_INFO ioctl.

Obsolete API Elements

The following V4L2 API elements were superseded by new interfaces and should not be implemented in new drivers.

• VIDIOC_G_MPEGCOMP and VIDIOC_S_MPEGCOMP ioctls. Use Extended Controls,

Extended Controls

.

• VIDIOC_G_DV_PRESET, VIDIOC_S_DV_PRESET, VIDIOC_ENUM_DV_PRESETS

IOC_QUERY_DV_PRESET ioctls. Use the DV Timings API (

Digital Video (DV) Timings

).

and VID-

• VIDIOC_SUBDEV_G_CROP and VIDIOC_SUBDEV_S_CROP ioctls. Use VIDIOC_SUBDEV_G_SELECTION and

VIDIOC_SUBDEV_S_SELECTION, ioctl VIDIOC_SUBDEV_G_SELECTION, VIDIOC_SUBDEV_S_SELECTION.

1.2.8 Function Reference

V4L2 close()

Name

v4l2-close - Close a V4L2 device

Synopsis

#include <unistd.h>

int close(int fd)

Arguments

fd File descriptor returned by open().

Description

Closes the device. Any I/O in progress is terminated and resources associated with the file descriptor are freed. However data format parameters, current input or output, control values or other properties remain unchanged.

Return Value

The function returns 0 on success, -1 on failure and the errno is set appropriately. Possible error codes:

EBADF fd is not a valid open file descriptor.

172 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2 ioctl()

Name

v4l2-ioctl - Program a V4L2 device

Synopsis

#include <sys/ioctl.h>

int ioctl(int fd, int request, void *argp)

Arguments

fd File descriptor returned by open().

request V4L2 ioctl request code as defined in the videodev2.h header file, for example VID-

IOC_QUERYCAP.

argp Pointer to a function parameter, usually a structure.

Description

The ioctl() function is used to program V4L2 devices. The argument fd must be an open file descriptor.

An ioctl request has encoded in it whether the argument is an input, output or read/write parameter, and the size of the argument argp in bytes. Macros and defines specifying V4L2 ioctl requests are located in the videodev2.h header file. Applications should use their own copy, not include the version in the kernel sources on the system they compile on. All V4L2 ioctl requests, their respective function and parameters are specified in Function Reference.

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 Generic Error Codes chapter.

When an ioctl that takes an output or read/write parameter fails, the parameter remains unmodified.

ioctl VIDIOC_CREATE_BUFS

Name

VIDIOC_CREATE_BUFS - Create buffers for Memory Mapped or User Pointer or DMA Buffer I/O

Synopsis

int ioctl(int fd, VIDIOC_CREATE_BUFS, struct v4l2_create_buffers *argp)

Arguments

fd File descriptor returned by open().

argp

1.2. Part I - Video for Linux API 173

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Description

This ioctl is used to create buffers for

memory mapped

or

user pointer

or

DMA buffer

I/O. It can be used as an alternative or in addition to the ioctl VIDIOC_REQBUFS ioctl, when a tighter control over buffers is required. This ioctl can be called multiple times to create buffers of different sizes.

To allocate the device buffers applications must initialize the relevant fields of the struct v4l2_create_buffers structure. The count field must be set to the number of requested buffers, the memory field specifies the requested I/O method and the reserved array must be zeroed.

The format field specifies the image format that the buffers must be able to handle. The application has to fill in this struct v4l2_format. Usually this will be done using the VIDIOC_TRY_FMT or VIDIOC_G_FMT ioctls to ensure that the requested format is supported by the driver. Based on the format's type field the requested buffer size (for single-planar) or plane sizes (for multi-planar formats) will be used for the allocated buffers. The driver may return an error if the size(s) are not supported by the hardware (usually because they are too small).

The buffers created by this ioctl will have as minimum size the size defined by the format.pix.sizeimage

field (or the corresponding fields for other format types). Usually if the format.pix.sizeimage field is less than the minimum required for the given format, then an error will be returned since drivers will typically not allow this. If it is larger, then the value will be used as-is. In other words, the driver may reject the requested size, but if it is accepted the driver will use it unchanged.

When the ioctl is called with a pointer to this structure the driver will attempt to allocate up to the requested number of buffers and store the actual number allocated and the starting index in the count and the index fields respectively. On return count can be smaller than the number requested.

v4l2_create_buffers

__u32

__u32

__u32 struct v4l2_format

__u32 index count

Table 1.52: struct v4l2_create_buffers memory format reserved[8]

The starting buffer index, returned by the driver.

The number of buffers requested or granted.

If count == 0, then ioctl VIDIOC_CREATE_BUFS will set index to the current number of created buffers, and it will check the validity of memory and format.type. If those are invalid -1 is returned and errno is set to EINVAL error code, otherwise ioctl VIDIOC_CREATE_BUFS returns 0. It will never set errno to EBUSY error code in this particular case.

Applications set this field to V4L2_MEMORY_MMAP,

V4L2_MEMORY_DMABUF or V4L2_MEMORY_USERPTR.

See

v4l2_memory

Filled in by the application, preserved by the driver.

A place holder for future extensions. Drivers and applications must set the array to zero.

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 Generic Error Codes chapter.

ENOMEM No memory to allocate buffers for

memory mapped

I/O.

EINVAL The buffer type (format.type field), requested I/O method (memory) or format (format field) is not valid.

174 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d ioctl VIDIOC_CROPCAP

Name

VIDIOC_CROPCAP - Information about the video cropping and scaling abilities

Synopsis

int ioctl(int fd, VIDIOC_CROPCAP, struct v4l2_cropcap *argp)

Arguments

fd File descriptor returned by open().

argp

Description

Applications use this function to query the cropping limits, the pixel aspect of images and to calculate scale factors. They set the type field of a v4l2_cropcap structure to the respective buffer (stream) type and call the ioctl VIDIOC_CROPCAP ioctl with a pointer to this structure. Drivers fill the rest of the structure. The results are constant except when switching the video standard. Remember this switch can occur implicit when switching the video input or output.

Do not use the multiplanar buffer types.

Use V4L2_BUF_TYPE_VIDEO_CAPTURE instead of

V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE and use V4L2_BUF_TYPE_VIDEO_OUTPUT instead of

V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE.

This ioctl must be implemented for video capture or output devices that support cropping and/or scaling and/or have non-square pixels, and for overlay devices.

v4l2_cropcap

1.2. Part I - Video for Linux API 175

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

__u32 struct v4l2_rect struct v4l2_rect struct v4l2_fract

__s32

__s32

__u32

__u32 type bounds defrect

Table 1.53: struct v4l2_cropcap pixelaspect

Type of the data stream, set by the application.

Only these types are valid here:

v4l2_buf_type .

V4L2_BUF_TYPE_VIDEO_CAPTURE,

V4L2_BUF_TYPE_VIDEO_OUTPUT

V4L2_BUF_TYPE_VIDEO_OVERLAY.

and

See

Defines the window within capturing or output is possible, this may exclude for example the horizontal and vertical blanking areas. The cropping rectangle cannot exceed these limits. Width and height are defined in pixels, the driver writer is free to choose origin and units of the coordinate system in the analog domain.

Default cropping rectangle, it shall cover the

``whole picture''. Assuming pixel aspect 1/1 this could be for example a 640 × 480 rectangle for

NTSC, a 768 × 576 rectangle for PAL and SECAM centered over the active picture area. The same co-ordinate system as for bounds is used.

This is the pixel aspect (y / x) when no scaling is applied, the ratio of the actual sampling frequency and the frequency required to get square pixels.

When cropping coordinates refer to square pixels, the driver sets pixelaspect to 1/1. Other common values are 54/59 for PAL and SECAM, 11/10 for NTSC sampled according to [ITU BT.601].

left top width height

Table 1.54: struct v4l2_rect

Horizontal offset of the top, left corner of the rectangle, in pixels.

Vertical offset of the top, left corner of the rectangle, in pixels.

Width of the rectangle, in pixels.

Height of the rectangle, in pixels.

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 Generic Error Codes chapter.

EINVAL The struct v4l2_cropcap type is invalid.

ENODATA Cropping is not supported for this input or output.

ioctl VIDIOC_DBG_G_CHIP_INFO

Name

VIDIOC_DBG_G_CHIP_INFO - Identify the chips on a TV card

Synopsis

int ioctl(int fd, VIDIOC_DBG_G_CHIP_INFO, struct v4l2_dbg_chip_info *argp)

176 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Arguments

fd File descriptor returned by open().

argp

Description

Note:

This is an Experimental API Elements interface and may change in the future.

For driver debugging purposes this ioctl allows test applications to query the driver about the chips present on the TV card. Regular applications must not use it. When you found a chip specific bug, please contact the linux-media mailing list ( https://linuxtv.org/lists.php

) so it can be fixed.

Additionally the Linux kernel must be compiled with the CONFIG_VIDEO_ADV_DEBUG option to enable this ioctl.

To query the driver applications must initialize the match.type and match.addr or match.name fields of a struct v4l2_dbg_chip_info and call ioctl VIDIOC_DBG_G_CHIP_INFO with a pointer to this structure. On success the driver stores information about the selected chip in the name and flags fields.

When match.type is V4L2_CHIP_MATCH_BRIDGE, match.addr selects the nth bridge `chip' on the TV card.

You can enumerate all chips by starting at zero and incrementing match.addr by one until ioctl VID-

IOC_DBG_G_CHIP_INFO fails with an EINVAL error code. The number zero always selects the bridge chip itself, e. g. the chip connected to the PCI or USB bus. Non-zero numbers identify specific parts of the bridge chip such as an AC97 register block.

When match.type is V4L2_CHIP_MATCH_SUBDEV, match.addr selects the nth sub-device. This allows you to enumerate over all sub-devices.

On success, the name field will contain a chip name and the flags field will contain V4L2_CHIP_FL_READABLE if the driver supports reading registers from the device or

V4L2_CHIP_FL_WRITABLE if the driver supports writing registers to the device.

We recommended the v4l2-dbg utility over calling this ioctl directly. It is available from the LinuxTV v4l-dvb repository; see https://linuxtv.org/repo/ for access instructions.

__u32 union type

(anonymous)

__u32

Table 1.55: struct v4l2_dbg_match

See Chip Match Types for a list of possible types.

addr char name[32]

Match a chip by this number, interpreted according to the type field.

Match a chip by this name, interpreted according to the type field. Currently unused.

v4l2_dbg_chip_info

1.2. Part I - Video for Linux API 177

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

struct v4l2_dbg_match char

__u32

__u32

V4L2_CHIP_MATCH_BRIDGE

V4L2_CHIP_MATCH_SUBDEV match name[32] flags

Table 1.56: struct v4l2_dbg_chip_info reserved[8]

How to match the chip,

v4l2_dbg_match.

The name of the chip.

see

struct

Set by the driver. If V4L2_CHIP_FL_READABLE is set, then the driver supports reading registers from the device.

If V4L2_CHIP_FL_WRITABLE is set, then it supports writing registers.

Reserved fields, both application and driver must set these to 0.

Table 1.57: Chip Match Types

0

4

Match the nth chip on the card, zero for the bridge chip. Does not match sub-devices.

Match the nth sub-device.

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 Generic Error Codes chapter.

EINVAL The match_type is invalid or no device could be matched.

ioctl VIDIOC_DBG_G_REGISTER, VIDIOC_DBG_S_REGISTER

Name

VIDIOC_DBG_G_REGISTER - VIDIOC_DBG_S_REGISTER - Read or write hardware registers

Synopsis

int ioctl(int fd, VIDIOC_DBG_G_REGISTER, struct v4l2_dbg_register *argp) int ioctl(int fd, VIDIOC_DBG_S_REGISTER, const struct v4l2_dbg_register *argp)

Arguments

fd File descriptor returned by open().

argp

Description

Note:

This is an Experimental API Elements interface and may change in the future.

For driver debugging purposes these ioctls allow test applications to access hardware registers directly.

Regular applications must not use them.

Since writing or even reading registers can jeopardize the system security, its stability and damage the hardware, both ioctls require superuser privileges. Additionally the Linux kernel must be compiled with the CONFIG_VIDEO_ADV_DEBUG option to enable these ioctls.

178 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

To write a register applications must initialize all fields of a struct v4l2_dbg_register except for size and call VIDIOC_DBG_S_REGISTER with a pointer to this structure. The match.type and match.addr or match.name fields select a chip on the TV card, the reg field specifies a register number and the val field the value to be written into the register.

To read a register applications must initialize the match.type, match.addr or match.name and reg fields, and call VIDIOC_DBG_G_REGISTER with a pointer to this structure. On success the driver stores the register value in the val field and the size (in bytes) of the value in size.

When match.type is V4L2_CHIP_MATCH_BRIDGE, match.addr selects the nth non-sub-device chip on the

TV card. The number zero always selects the host chip, e. g. the chip connected to the PCI or USB bus.

You can find out which chips are present with the ioctl VIDIOC_DBG_G_CHIP_INFO ioctl.

When match.type is V4L2_CHIP_MATCH_SUBDEV, match.addr selects the nth sub-device.

These ioctls are optional, not all drivers may support them. However when a driver supports these ioctls it must also support ioctl VIDIOC_DBG_G_CHIP_INFO. Conversely it may support VIDIOC_DBG_G_CHIP_INFO but not these ioctls.

VIDIOC_DBG_G_REGISTER and VIDIOC_DBG_S_REGISTER were introduced in Linux 2.6.21, but their API was changed to the one described here in kernel 2.6.29.

We recommended the v4l2-dbg utility over calling these ioctls directly. It is available from the LinuxTV v4l-dvb repository; see https://linuxtv.org/repo/ for access instructions.

v4l2_dbg_match

__u32 union type

(anonymous)

__u32

Table 1.58: struct v4l2_dbg_match

See Chip Match Types for a list of possible types.

addr char name[32]

Match a chip by this number, interpreted according to the type field.

Match a chip by this name, interpreted according to the type field. Currently unused.

v4l2_dbg_register

Table 1.59: struct v4l2_dbg_register struct v4l2_dbg_match match How to match the chip, see v4l2_dbg_match.

__u32

__u64

__u64 size reg val

The register size in bytes.

A register number.

The value read from, or to be written into the register.

V4L2_CHIP_MATCH_BRIDGE

V4L2_CHIP_MATCH_SUBDEV

Table 1.60: Chip Match Types

0

4

Match the nth chip on the card, zero for the bridge chip. Does not match sub-devices.

Match the nth sub-device.

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 Generic Error Codes chapter.

EPERM Insufficient permissions. Root privileges are required to execute these ioctls.

1.2. Part I - Video for Linux API 179

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d ioctl VIDIOC_DECODER_CMD, VIDIOC_TRY_DECODER_CMD

Name

VIDIOC_DECODER_CMD - VIDIOC_TRY_DECODER_CMD - Execute an decoder command

Synopsis

int ioctl(int fd, VIDIOC_DECODER_CMD, struct v4l2_decoder_cmd *argp) int ioctl(int fd, VIDIOC_TRY_DECODER_CMD, struct v4l2_decoder_cmd *argp)

Arguments

fd File descriptor returned by open().

argp pointer to struct 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 v4l2_decoder_cmd and call VID-

IOC_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 write() or ioctl VIDIOC_STREAMON, VIDIOC_STREAMOFF call sends an implicit START command to the decoder if it has not been started yet.

A close() or VIDIOC_STREAMOFF 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

__u32

__u32 cmd flags

Table 1.61: struct v4l2_decoder_cmd

The decoder command, see Decoder Commands.

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

__s32 speed

Structure containing additional

V4L2_DEC_CMD_START command.

data for the

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.

Continued on next page

180 Chapter 1. Linux Media Infrastructure userspace API

struct struct

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Table 1.61 -- continued from previous page

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

stop

__u64 pts

Structure containing additional

V4L2_DEC_CMD_STOP command.

data for the

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.

raw

__u32 data[16] Reserved for future extensions.

must set the array to zero.

Drivers and applications

V4L2_DEC_CMD_START

V4L2_DEC_CMD_STOP

V4L2_DEC_CMD_PAUSE

V4L2_DEC_CMD_RESUME

0

1

2

3

Table 1.62: Decoder Commands

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.

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

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.

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.

1.2. Part I - Video for Linux API 181

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

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 Generic Error Codes chapter.

EINVAL The cmd field is invalid.

EPERM The application sent a PAUSE or RESUME command when the decoder was not running.

ioctl VIDIOC_DQEVENT

Name

VIDIOC_DQEVENT - Dequeue event

Synopsis

int ioctl(int fd, VIDIOC_DQEVENT, struct v4l2_event *argp)

Arguments

fd File descriptor returned by open().

argp

Description

Dequeue an event from a video device. No input is required for this ioctl. All the fields of the struct v4l2_event structure are filled by the driver. The file handle will also receive exceptions which the application may get by e.g. using the select system call.

v4l2_event

182 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

__u32 union

__u32

__u32 struct timespec u32

__u32

V4L2_EVENT_ALL

V4L2_EVENT_VSYNC

V4L2_EVENT_EOS type u pending sequence timestamp id reserved[8]

Table 1.63: struct v4l2_event

Type of the event, see Event Types.

struct v4l2_event_vsync vsync struct v4l2_event_ctrl ctrl struct v4l2_event_frame_sync struct v4l2_event_motion_det struct v4l2_event_src_change

__u8 frame_sync motion_det src_change data[64]

Event data for event V4L2_EVENT_VSYNC.

Event data for event V4L2_EVENT_CTRL.

Event data

V4L2_EVENT_FRAME_SYNC.

for

Event data

V4L2_EVENT_MOTION_DET.

for event event

Event data for

V4L2_EVENT_SOURCE_CHANGE.

event

Event data. Defined by the event type. The union should be used to define easily accessible type for events.

Number of pending events excluding this one.

Event sequence number.

The sequence number is incremented for every subscribed event that takes place. If sequence numbers are not contiguous it means that events have been lost.

Event timestamp. The timestamp has been taken from the CLOCK_MONOTONIC clock. To access the same clock outside V4L2, use clock_gettime().

The ID associated with the event source. If the event does not have an associated ID

(this depends on the event type), then this is 0.

Reserved for future extensions.

Drivers must set the array to zero.

Table 1.64: Event Types

0

1

2

All events. V4L2_EVENT_ALL is valid only for VID-

IOC_UNSUBSCRIBE_EVENT for unsubscribing all events at once.

This event is triggered on the vertical sync. This event has a struct v4l2_event_vsync associated with it.

This event is triggered when the end of a stream is reached. This is typically used with MPEG decoders to report to the application when the last of the MPEG stream has been decoded.

Continued on next page

1.2. Part I - Video for Linux API 183

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2_EVENT_CTRL

V4L2_EVENT_FRAME_SYNC

V4L2_EVENT_SOURCE_CHANGE

V4L2_EVENT_MOTION_DET

V4L2_EVENT_PRIVATE_START

Table 1.64 -- continued from previous page

3 This event requires that the id matches the control ID from which you want to receive events. This event is triggered if the control's value changes, if a button control is pressed or if the control's flags change. This event has a struct v4l2_event_ctrl associated with it. This struct contains much of the same information as struct v4l2_queryctrl and struct v4l2_control.

If the event is generated due to a call to VID-

IOC_S_CTRL or VIDIOC_S_EXT_CTRLS, then the event will not be sent to the file handle that called the ioctl function. This prevents nasty feedback loops. If you do want to get the event, then set the V4L2_EVENT_SUB_FL_ALLOW_FEEDBACK flag.

This event type will ensure that no information is lost when more events are raised than there is room internally. In that case the struct v4l2_event_ctrl of the second-oldest event is kept, but the changes field of the second-oldest event is ORed with the changes field of the oldest event.

4

5

6

Triggered immediately when the reception of a frame has begun.

This event has a struct v4l2_event_frame_sync associated with it.

If the hardware needs to be stopped in the case of a buffer underrun it might not be able to generate this event. In such cases the frame_sequence field in struct v4l2_event_frame_sync will not be incremented. This causes two consecutive frame sequence numbers to have n times frame interval in between them.

This event is triggered when a source parameter change is detected during runtime by the video device. It can be a runtime resolution change triggered by a video decoder or the format change happening on an input connector. This event requires that the id matches the input index (when used with a video device node) or the pad index

(when used with a subdevice node) from which you want to receive events.

This event has a struct v4l2_event_src_change associated with it. The changes bitfield denotes what has changed for the subscribed pad. If multiple events occurred before application could dequeue them, then the changes will have the ORed value of all the events generated.

Triggered whenever the motion detection state for one or more of the regions changes. This event has a struct v4l2_event_motion_det associated with it.

0x08000000 Base event number for driver-private events.

v4l2_event_vsync

__u8

184

field

Table 1.65: struct v4l2_event_vsync

The upcoming field. See enum

v4l2_field

.

Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d v4l2_event_ctrl

__u32

__u32 union (anonymous)

__u32

__s32

__s32

__s32

__s32 changes type

__s32

__s64 flags minimum maximum step

Table 1.66: struct v4l2_event_ctrl

A bitmask that tells what has changed. See Con-

trol Changes.

The type of v4l2_ctrl_type.

the control.

See enum default_value value value64

The 32-bit value of the control for 32-bit control types. This is 0 for string controls since the value of a string cannot be passed using ioctl

VIDIOC_DQEVENT.

The 64-bit value of the control for 64-bit control types.

The control flags. See Control Flags.

The minimum value of the control. See struct

v4l2_queryctrl.

The maximum value of the control. See struct

v4l2_queryctrl.

The step value of the control.

See struct

v4l2_queryctrl.

The default value value of the control. See struct

v4l2_queryctrl.

v4l2_event_frame_sync

__u32

Table 1.67: struct v4l2_event_frame_sync frame_sequence The sequence number of the frame being received.

v4l2_event_src_change

__u32

Table 1.68: struct v4l2_event_src_change changes A bitmask that tells what has changed.

Source Changes.

See

v4l2_event_motion_det

__u32

__u32

__u32

Table 1.69: struct v4l2_event_motion_det flags frame_sequence region_mask

Currently only one flag is available: if

V4L2_EVENT_MD_FL_HAVE_FRAME_SEQ is set, then the frame_sequence field is valid, otherwise that field should be ignored.

The sequence number of the frame being received.

Only valid if the

V4L2_EVENT_MD_FL_HAVE_FRAME_SEQ flag was set.

The bitmask of the regions that reported motion.

There is at least one region.

If this field is 0, then no motion was detected at all. If there is no

V4L2_CID_DETECT_MD_REGION_GRID control (see

Detect Control Reference

) to assign a different region to each cell in the motion detection grid, then that all cells are automatically assigned to the default region 0.

1.2. Part I - Video for Linux API 185

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2_EVENT_CTRL_CH_VALUE

V4L2_EVENT_CTRL_CH_FLAGS

V4L2_EVENT_CTRL_CH_RANGE

V4L2_EVENT_SRC_CH_RESOLUTION

Table 1.70: Control Changes

0x0001

0x0002

0x0004

This control event was triggered the value of the control changed.

because

Special cases: Volatile controls do no generate this event; If a control has the

V4L2_CTRL_FLAG_EXECUTE_ON_WRITE flag set, then this event is sent as well, regardless its value.

This control event was triggered because the control flags changed.

This control event was triggered because the minimum, maximum, step or the default value of the control changed.

Table 1.71: Source Changes

0x0001 This event gets triggered when a resolution change is detected at an input. This can come from an input connector or from a video decoder.

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 Generic Error Codes chapter.

ioctl VIDIOC_DV_TIMINGS_CAP, VIDIOC_SUBDEV_DV_TIMINGS_CAP

Name

VIDIOC_DV_TIMINGS_CAP - VIDIOC_SUBDEV_DV_TIMINGS_CAP - The capabilities of the Digital Video receiver/transmitter

Synopsis

int ioctl(int fd, VIDIOC_DV_TIMINGS_CAP, struct v4l2_dv_timings_cap *argp) int ioctl(int fd, VIDIOC_SUBDEV_DV_TIMINGS_CAP, struct v4l2_dv_timings_cap *argp)

Arguments

fd File descriptor returned by open().

argp

Description

To query the capabilities of the DV receiver/transmitter applications initialize the pad field to 0, zero the reserved array of struct v4l2_dv_timings_cap and call the VIDIOC_DV_TIMINGS_CAP ioctl on a video node and the driver will fill in the structure.

Note:

Drivers may return different values after switching the video input or output.

186 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

When implemented by the driver DV capabilities of subdevices can be queried by calling the VID-

IOC_SUBDEV_DV_TIMINGS_CAP ioctl directly on a subdevice node. The capabilities are specific to inputs

(for DV receivers) or outputs (for DV transmitters), applications must specify the desired pad number in the struct v4l2_dv_timings_cap pad field and zero the reserved array. Attempts to query capabilities on a pad that doesn't support them will return an EINVAL error code.

v4l2_bt_timings_cap

Table 1.72: struct v4l2_bt_timings_cap

__u32 min_width

__u32 max_width

__u32 min_height

Minimum width of the active video in pixels.

Maximum width of the active video in pixels.

Minimum height of the active video in lines.

__u32 max_height Maximum height of the active video in lines.

__u64 min_pixelclock Minimum pixelclock frequency in Hz.

__u64 max_pixelclock Maximum pixelclock frequency in Hz.

__u32 standards The video standard(s) supported by the hardware. See DV BT Timing stan-

dards for a list of standards.

__u32 capabilities

__u32 reserved[16]

Several flags giving more information about the capabilities. See DV BT

Timing capabilities for a description of the flags.

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

v4l2_dv_timings_cap

Table 1.73: struct v4l2_dv_timings_cap

__u32 type

__u32 pad

__u32 reserved[2] union

Type of DV timings as listed in DV Timing types.

Pad number as reported by the media controller API. This field is only used when operating on a subdevice node. When operating on a video node applications must set this field to zero.

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

struct v4l2_bt_timings_cap bt BT.656/1120 timings capabilities of the hardware.

__u32 raw_data[32]

Flag

Table 1.74: DV BT Timing capabilities

Description

V4L2_DV_BT_CAP_INTERLACED

V4L2_DV_BT_CAP_PROGRESSIVE

V4L2_DV_BT_CAP_REDUCED_BLANKING

V4L2_DV_BT_CAP_CUSTOM

Interlaced formats are supported.

Progressive formats are supported.

CVT/GTF specific: the timings can make use of reduced blanking (CVT) or the `Secondary GTF' curve (GTF).

Can support non-standard timings, i.e. timings not belonging to the standards set in the standards field.

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 Generic Error Codes chapter.

ioctl VIDIOC_ENCODER_CMD, VIDIOC_TRY_ENCODER_CMD

Name

VIDIOC_ENCODER_CMD - VIDIOC_TRY_ENCODER_CMD - Execute an encoder command

1.2. Part I - Video for Linux API 187

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Synopsis

int ioctl(int fd, VIDIOC_ENCODER_CMD, struct v4l2_encoder_cmd *argp) int ioctl(int fd, VIDIOC_TRY_ENCODER_CMD, struct v4l2_encoder_cmd *argp)

Arguments

fd File descriptor returned by open().

argp

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 v4l2_encoder_cmd and call VID-

IOC_ENCODER_CMD or VIDIOC_TRY_ENCODER_CMD with a pointer to this structure.

The cmd field must contain the command code. The flags field is currently only used by the STOP command and contains one bit: If the V4L2_ENC_CMD_STOP_AT_GOP_END flag is set, encoding will continue until the end of the current Group Of Pictures, otherwise it will stop immediately.

A read() or VIDIOC_STREAMON call sends an implicit START command to the encoder if it has not been started yet. After a STOP command, read() calls will read the remaining data buffered by the driver. When the buffer is empty, read() will return zero and the next read() call will restart the encoder.

A close() or VIDIOC_STREAMOFF call of a streaming file descriptor sends an implicit immediate STOP to the encoder, and all buffered data is discarded.

These ioctls are optional, not all drivers may support them. They were introduced in Linux 2.6.21.

v4l2_encoder_cmd

__u32

__u32

__u32 cmd flags

Table 1.75: struct v4l2_encoder_cmd data[8]

The encoder command, see Encoder Commands.

Flags to go with the command, see Encoder Com-

mand Flags. If no flags are defined for this command, drivers and applications must set this field to zero.

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

188 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2_ENC_CMD_START

V4L2_ENC_CMD_STOP

V4L2_ENC_CMD_PAUSE

V4L2_ENC_CMD_RESUME

Table 1.76: Encoder Commands

0

1

2

3

Start the encoder. When the encoder is already running or paused, this command does nothing.

No flags are defined for this command.

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.

mem2mem encoders will send a V4L2_EVENT_EOS event when the last frame has been encoded 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

VIDIOC_DQBUF ioctl will not block anymore, but return an EPIPE error code.

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.

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.

V4L2_ENC_CMD_STOP_AT_GOP_END

Table 1.77: Encoder Command Flags

0x0001 Stop encoding at the end of the current Group Of

Pictures, rather than immediately.

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 Generic Error Codes chapter.

EINVAL The cmd field is invalid.

EPERM The application sent a PAUSE or RESUME command when the encoder was not running.

ioctl VIDIOC_ENUMAUDIO

Name

VIDIOC_ENUMAUDIO - Enumerate audio inputs

Synopsis

int ioctl(int fd, VIDIOC_ENUMAUDIO, struct v4l2_audio *argp)

1.2. Part I - Video for Linux API 189

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Arguments

fd File descriptor returned by open().

argp

Description

To query the attributes of an audio input applications initialize the index field and zero out the reserved array of a struct v4l2_audio and call the ioctl VIDIOC_ENUMAUDIO 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 audio inputs applications shall begin at index zero, incrementing by one until the driver returns EINVAL.

See VIDIOC_G_AUDIO for a description of struct v4l2_audio.

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 Generic Error Codes chapter.

EINVAL The number of the audio input is out of bounds.

ioctl VIDIOC_ENUMAUDOUT

Name

VIDIOC_ENUMAUDOUT - Enumerate audio outputs

Synopsis

int ioctl(int fd, VIDIOC_ENUMAUDOUT, struct v4l2_audioout *argp)

Arguments

fd File descriptor returned by open().

argp

Description

To query the attributes of an audio output applications initialize the index field and zero out the reserved array of a struct v4l2_audioout and call the VIDIOC_G_AUDOUT 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 audio outputs applications shall begin at index zero, incrementing by one until the driver returns EINVAL.

Note:

Connectors on a TV card to loop back the received audio signal to a sound card are not audio outputs in this sense.

See VIDIOC_G_AUDIOout for a description of struct v4l2_audioout.

190 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

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 Generic Error Codes chapter.

EINVAL The number of the audio output is out of bounds.

ioctl VIDIOC_ENUM_DV_TIMINGS, VIDIOC_SUBDEV_ENUM_DV_TIMINGS

Name

VIDIOC_ENUM_DV_TIMINGS - VIDIOC_SUBDEV_ENUM_DV_TIMINGS - Enumerate supported Digital Video timings

Synopsis

int ioctl(int fd, VIDIOC_ENUM_DV_TIMINGS, struct v4l2_enum_dv_timings *argp) int ioctl(int fd, VIDIOC_SUBDEV_ENUM_DV_TIMINGS, struct v4l2_enum_dv_timings *argp)

Arguments

fd File descriptor returned by open().

argp

Description

While some DV receivers or transmitters support a wide range of timings, others support only a limited number of timings. With this ioctl applications can enumerate a list of known supported timings. Call ioctl

VIDIOC_DV_TIMINGS_CAP, VIDIOC_SUBDEV_DV_TIMINGS_CAP to check if it also supports other standards or even custom timings that are not in this list.

To query the available timings, applications initialize the index field, set the pad field to 0, zero the reserved array of struct v4l2_enum_dv_timings and call the VIDIOC_ENUM_DV_TIMINGS ioctl on a video node 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 supported DV timings, applications shall begin at index zero, incrementing by one until the driver returns EINVAL.

Note:

Drivers may enumerate a different set of DV timings after switching the video input or output.

When implemented by the driver DV timings of subdevices can be queried by calling the VID-

IOC_SUBDEV_ENUM_DV_TIMINGS ioctl directly on a subdevice node. The DV timings are specific to inputs

(for DV receivers) or outputs (for DV transmitters), applications must specify the desired pad number in the struct v4l2_enum_dv_timings pad field. Attempts to enumerate timings on a pad that doesn't support them will return an EINVAL error code.

v4l2_enum_dv_timings

1.2. Part I - Video for Linux API 191

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

__u32

__u32

__u32 struct v4l2_dv_timings

Table 1.78: struct v4l2_enum_dv_timings index pad reserved[2] timings

Number of the DV timings, set by the application.

Pad number as reported by the media controller

API. This field is only used when operating on a subdevice node. When operating on a video node applications must set this field to zero.

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

The timings.

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 Generic Error Codes chapter.

EINVAL The struct v4l2_enum_dv_timings index is out of bounds or the pad number is invalid.

ENODATA Digital video presets are not supported for this input or output.

ioctl VIDIOC_ENUM_FMT

Name

VIDIOC_ENUM_FMT - Enumerate image formats

Synopsis

int ioctl(int fd, VIDIOC_ENUM_FMT, struct v4l2_fmtdesc *argp)

Arguments

fd File descriptor returned by open().

argp

Description

To enumerate image formats applications initialize the type and index field of struct v4l2_fmtdesc and call the ioctl VIDIOC_ENUM_FMT ioctl with a pointer to this structure. Drivers fill the rest of the structure or return an EINVAL error code. All formats are enumerable by beginning at index zero and incrementing by one until EINVAL is returned.

Note:

After switching input or output the list of enumerated image formats may be different.

v4l2_fmtdesc

192 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Table 1.79: struct v4l2_fmtdesc

__u32

__u32

__u32

__u8

__u32 index type flags description[32] pixelformat

Number of the format in the enumeration, set by the application. This is in no way related to the pixelformat field.

Type of the data stream, set by the application.

here:

Only these types are valid

V4L2_BUF_TYPE_VIDEO_CAPTURE,

V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE,

V4L2_BUF_TYPE_VIDEO_OUTPUT,

V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE and V4L2_BUF_TYPE_VIDEO_OVERLAY.

v4l2_buf_type .

See Image Format Description Flags

See

Description of the format, a NUL-terminated ASCII string. This information is intended for the user, for example: ``YUV 4:2:2''.

The image format identifier. This is a four character code as computed by the v4l2_fourcc() macro:

#define v4l2_fourcc(a,b,c,d) (((__u32)(a)<<0)|((__u32)(b)<<8)|((__u32)(c)<<16)|((__u32)(d)<<24)) Several image formats are already defined by this specification in

Image Formats

.

__u32 reserved[4] Reserved for future extensions. Drivers must set the array to zero.

V4L2_FMT_FLAG_COMPRESSED

V4L2_FMT_FLAG_EMULATED

Table 1.80: Image Format Description Flags

0x0001

0x0002

This is a compressed format.

This format is not native to the device but emulated through software (usually libv4l2), where possible try to use a native format instead for better performance.

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 Generic Error Codes chapter.

EINVAL The struct v4l2_fmtdesc type is not supported or the index is out of bounds.

ioctl VIDIOC_ENUM_FRAMESIZES

Name

VIDIOC_ENUM_FRAMESIZES - Enumerate frame sizes

Synopsis

int ioctl(int fd, VIDIOC_ENUM_FRAMESIZES, struct v4l2_frmsizeenum *argp)

Arguments

fd File descriptor returned by open().

argp Pointer to a struct v4l2_frmsizeenum that contains an index and pixel format and receives a frame width and height.

1.2. Part I - Video for Linux API 193

Attention:

These codes are not the same as those used in the Windows world.

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Description

This ioctl allows applications to enumerate all frame sizes (i. e. width and height in pixels) that the device supports for the given pixel format.

The supported pixel formats can be obtained by using the ioctl VIDIOC_ENUM_FMT function.

The return value and the content of the v4l2_frmsizeenum.type field depend on the type of frame sizes the device supports. Here are the semantics of the function for the different cases:

Discrete: The function returns success if the given index value (zero-based) is valid. The application should increase the index by one for each call until EINVAL is returned. The v4l2_frmsizeenum.type

field is set to V4L2_FRMSIZE_TYPE_DISCRETE by the driver. Of the union only the discrete member is valid.

Step-wise: The function returns success if the given index value is zero and EINVAL for any other index value. The v4l2_frmsizeenum.type field is set to V4L2_FRMSIZE_TYPE_STEPWISE by the driver.

Of the union only the stepwise member is valid.

Continuous: This is a special case of the step-wise type above. The function returns success if the given index value is zero and EINVAL for any other index value. The v4l2_frmsizeenum.type field is set to V4L2_FRMSIZE_TYPE_CONTINUOUS by the driver. Of the union only the stepwise member is valid and the step_width and step_height values are set to 1.

When the application calls the function with index zero, it must check the type field to determine the type of frame size enumeration the device supports. Only for the V4L2_FRMSIZE_TYPE_DISCRETE type does it make sense to increase the index value to receive more frame sizes.

Note:

The order in which the frame sizes are returned has no special meaning. In particular does it not say anything about potential default format sizes.

Applications can assume that the enumeration data does not change without any interaction from the application itself. This means that the enumeration data is consistent if the application does not perform any other ioctl calls while it runs the frame size enumeration.

Structs

In the structs below, IN denotes a value that has to be filled in by the application, OUT denotes values that the driver fills in. The application should zero out all members except for the IN fields.

v4l2_frmsize_discrete

__u32

__u32

v4l2_frmsize_stepwise

Table 1.81: struct v4l2_frmsize_discrete width height

Width of the frame [pixel].

Height of the frame [pixel].

__u32

__u32

__u32

__u32

__u32

__u32

v4l2_frmsizeenum

Table 1.82: struct v4l2_frmsize_stepwise min_width max_width step_width min_height max_height step_height

Minimum frame width [pixel].

Maximum frame width [pixel].

Frame width step size [pixel].

Minimum frame height [pixel].

Maximum frame height [pixel].

Frame height step size [pixel].

194 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

__u32 index

__u32 pixel_format

__u32 type union struct v4l2_frmsize_discrete struct v4l2_frmsize_stepwise

__u32 reserved[2]

Table 1.83: struct v4l2_frmsizeenum

IN: Index of the given frame size in the enumeration.

IN: Pixel format for which the frame sizes are enumerated.

OUT: Frame size type the device supports.

OUT: Frame size with the given index.

discrete stepwise

Reserved space for future use. Must be zeroed by drivers and applications.

Enums v4l2_frmsizetypes

V4L2_FRMSIZE_TYPE_DISCRETE

V4L2_FRMSIZE_TYPE_CONTINUOUS

V4L2_FRMSIZE_TYPE_STEPWISE

Table 1.84: enum v4l2_frmsizetypes

1

2

3

Discrete frame size.

Continuous frame size.

Step-wise defined frame size.

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 Generic Error Codes chapter.

ioctl VIDIOC_ENUM_FRAMEINTERVALS

Name

VIDIOC_ENUM_FRAMEINTERVALS - Enumerate frame intervals

Synopsis

int ioctl(int fd, VIDIOC_ENUM_FRAMEINTERVALS, struct v4l2_frmivalenum *argp)

Arguments

fd File descriptor returned by open().

argp Pointer to a struct v4l2_frmivalenum structure that contains a pixel format and size and receives a frame interval.

Description

This ioctl allows applications to enumerate all frame intervals that the device supports for the given pixel format and frame size.

The supported pixel formats and frame sizes can be obtained by using the ioctl VIDIOC_ENUM_FMT and

ioctl VIDIOC_ENUM_FRAMESIZES functions.

1.2. Part I - Video for Linux API 195

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

The return value and the content of the v4l2_frmivalenum.type field depend on the type of frame intervals the device supports. Here are the semantics of the function for the different cases:

Discrete: The function returns success if the given index value (zero-based) is valid. The application should increase the index by one for each call until EINVAL is returned. The v4l2_frmivalenum.type field is set to V4L2_FRMIVAL_TYPE_DISCRETE by the driver. Of the union only the discrete member is valid.

Step-wise: The function returns success if the given index value is zero and EINVAL for any other index value. The v4l2_frmivalenum.type field is set to V4L2_FRMIVAL_TYPE_STEPWISE by the driver.

Of the union only the stepwise member is valid.

Continuous: This is a special case of the step-wise type above. The function returns success if the given index value is zero and EINVAL for any other index value. The v4l2_frmivalenum.type field is set to V4L2_FRMIVAL_TYPE_CONTINUOUS by the driver. Of the union only the stepwise member is valid and the step value is set to 1.

When the application calls the function with index zero, it must check the type field to determine the type of frame interval enumeration the device supports. Only for the V4L2_FRMIVAL_TYPE_DISCRETE type does it make sense to increase the index value to receive more frame intervals.

Note:

The order in which the frame intervals are returned has no special meaning. In particular does it not say anything about potential default frame intervals.

Applications can assume that the enumeration data does not change without any interaction from the application itself. This means that the enumeration data is consistent if the application does not perform any other ioctl calls while it runs the frame interval enumeration.

Note:

Frame intervals and frame rates: The V4L2 API uses frame intervals instead of frame rates. Given the frame interval the frame rate can be computed as follows: frame_rate = 1 / frame_interval

Structs

In the structs below, IN denotes a value that has to be filled in by the application, OUT denotes values that the driver fills in. The application should zero out all members except for the IN fields.

v4l2_frmival_stepwise

struct v4l2_fract struct v4l2_fract struct v4l2_fract

v4l2_frmivalenum

min max step

Table 1.85: struct v4l2_frmival_stepwise

Minimum frame interval [s].

Maximum frame interval [s].

Frame interval step size [s].

196 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

__u32 index

__u32 pixel_format

__u32 width

__u32 height

__u32 type union struct v4l2_fract struct v4l2_frmival_stepwise

__u32 reserved[2]

Table 1.86: struct v4l2_frmivalenum

IN: Index of the given frame interval in the enumeration.

IN: Pixel format for which the frame intervals are enumerated.

IN: Frame width for which the frame intervals are enumerated.

IN: Frame height for which the frame intervals are enumerated.

OUT: Frame interval type the device supports.

OUT: Frame interval with the given index.

Frame interval [s].

discrete stepwise

Reserved space for future use. Must be zeroed by drivers and applications.

Enums v4l2_frmivaltypes

V4L2_FRMIVAL_TYPE_DISCRETE

V4L2_FRMIVAL_TYPE_CONTINUOUS

V4L2_FRMIVAL_TYPE_STEPWISE

Table 1.87: enum v4l2_frmivaltypes

1

2

3

Discrete frame interval.

Continuous frame interval.

Step-wise defined frame interval.

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 Generic Error Codes chapter.

ioctl VIDIOC_ENUM_FREQ_BANDS

Name

VIDIOC_ENUM_FREQ_BANDS - Enumerate supported frequency bands

Synopsis

int ioctl(int fd, VIDIOC_ENUM_FREQ_BANDS, struct v4l2_frequency_band *argp)

Arguments

fd File descriptor returned by open().

argp

1.2. Part I - Video for Linux API 197

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Description

Enumerates the frequency bands that a tuner or modulator supports. To do this applications initialize the tuner, type and index fields, and zero out the reserved array of a struct v4l2_frequency_band and call the ioctl VIDIOC_ENUM_FREQ_BANDS ioctl with a pointer to this structure.

This ioctl is supported if the V4L2_TUNER_CAP_FREQ_BANDS capability of the corresponding tuner/modulator is set.

v4l2_frequency_band

__u32

__u32

__u32

__u32

__u32

__u32

__u32 tuner type index capability rangelow rangehigh modulation

Table 1.88: struct v4l2_frequency_band

The tuner or modulator index number. This is the same value as in the struct v4l2_input tuner field and the struct v4l2_tuner index field, or the struct v4l2_output modulator field and the struct v4l2_modulator index field.

The tuner type. This is the same value as in the struct v4l2_tuner type field. The type must be set to V4L2_TUNER_RADIO for /dev/radioX device nodes, and to V4L2_TUNER_ANALOG_TV for all others. Set this field to V4L2_TUNER_RADIO for modulators (currently only radio modulators are supported). See v4l2_tuner_type

Identifies the frequency band, set by the application.

The tuner/modulator capability flags for this frequency band, see Tuner and Modulator Capability Flags. The V4L2_TUNER_CAP_LOW or V4L2_TUNER_CAP_1HZ capability must be the same for all frequency bands of the selected tuner/modulator. So either all bands have that capability set, or none of them have that capability.

The lowest tunable frequency in units of 62.5 kHz, or if the capability flag V4L2_TUNER_CAP_LOW is set, in units of 62.5 Hz, for this frequency band. A 1 Hz unit is used when the capability flag V4L2_TUNER_CAP_1HZ is set.

The highest tunable frequency in units of 62.5 kHz, or if the capability flag V4L2_TUNER_CAP_LOW is set, in units of 62.5 Hz, for this frequency band. A 1 Hz unit is used when the capability flag V4L2_TUNER_CAP_1HZ is set.

Note:

The supported modulation systems of this frequency band. See Band Modulation Systems.

Currently only one modulation system per frequency band is supported.

More work will need to be done if multiple modulation systems are possible.

Contact the linux-media mailing list

( https://linuxtv.org/lists.php

) if you need such functionality.

__u32 reserved[9]

V4L2_BAND_MODULATION_VSB

V4L2_BAND_MODULATION_FM

V4L2_BAND_MODULATION_AM

Reserved for future extensions. Applications and drivers must set the array to zero.

Table 1.89: Band Modulation Systems

0x02

0x04

0x08

Vestigial Sideband modulation, used for analog

TV.

Frequency Modulation, commonly used for analog radio.

Amplitude Modulation, commonly used for analog radio.

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 Generic Error Codes chapter.

EINVAL The tuner or index is out of bounds or the type field is wrong.

ioctl VIDIOC_ENUMINPUT

Name

VIDIOC_ENUMINPUT - Enumerate video inputs

Synopsis

int ioctl(int fd, VIDIOC_ENUMINPUT, struct v4l2_input *argp)

Arguments

fd File descriptor returned by open().

198 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

argp

Description

To query the attributes of a video input applications initialize the index field of struct v4l2_input and call the ioctl 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

__u32

__u8

__u32

__u32

__u32

v4l2_std_id

__u32

__u32

__u32

V4L2_INPUT_TYPE_TUNER

V4L2_INPUT_TYPE_CAMERA

V4L2_INPUT_TYPE_TOUCH index name[32] type audioset tuner std status

Table 1.90: struct v4l2_input capabilities reserved[3]

Identifies the input, set by the application.

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.

Type of the input, see Input Types.

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

Audio Inputs and Outputs

.

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 v4l2_tuner field index. For details on tuners see

Tuners and Modulators

.

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

Video Standards

.

This field provides status information about the input. See Input Status Flags for flags. With the exception of the sensor orientation bits status is only valid when this is the current input.

This field provides capabilities for the input. See

Input capabilities for flags.

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

Table 1.91: Input Types

1

2

3

This input uses a tuner (RF demodulator).

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

This input is a touch device for capturing raw touch data.

1.2. Part I - Video for Linux API 199

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Table 1.92: Input Status Flags

General

V4L2_IN_ST_NO_POWER

V4L2_IN_ST_NO_SIGNAL

V4L2_IN_ST_NO_COLOR

0x00000001

0x00000002

0x00000004

Attached device is off.

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

Sensor Orientation

V4L2_IN_ST_HFLIP

V4L2_IN_ST_VFLIP

0x00000010

0x00000020

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.

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:: A 180 degree rotation is the same as HFLIP | VFLIP

Analog Video

V4L2_IN_ST_NO_H_LOCK

V4L2_IN_ST_COLOR_KILL

V4L2_IN_ST_NO_V_LOCK

V4L2_IN_ST_NO_STD_LOCK

0x00000100

0x00000200

0x00000400

0x00000800

No horizontal sync lock.

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.

No vertical sync lock.

No standard format lock in case of auto-detection format by the component.

Digital Video

V4L2_IN_ST_NO_SYNC

V4L2_IN_ST_NO_EQU

V4L2_IN_ST_NO_CARRIER

0x00010000

0x00020000

0x00040000

VCR and Set-Top Box

V4L2_IN_ST_MACROVISION 0x01000000

V4L2_IN_ST_NO_ACCESS

V4L2_IN_ST_VTR

V4L2_IN_CAP_DV_TIMINGS

V4L2_IN_CAP_STD

V4L2_IN_CAP_NATIVE_SIZE

No synchronization lock.

No equalizer lock.

Carrier recovery failed.

0x02000000

0x04000000

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

Conditional access denied.

VTR time constant. [?]

Table 1.93: Input capabilities

0x00000002 This input supports setting video timings by using

VIDIOC_S_DV_TIMINGS.

0x00000004 This input supports setting the TV standard by using VIDIOC_S_STD.

0x00000008 This input supports setting the native size using the V4L2_SEL_TGT_NATIVE_SIZE selection target, see Common selection definitions.

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 Generic Error Codes chapter.

EINVAL The struct v4l2_input index is out of bounds.

ioctl VIDIOC_ENUMOUTPUT

Name

VIDIOC_ENUMOUTPUT - Enumerate video outputs

200 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Synopsis

int ioctl(int fd, VIDIOC_ENUMOUTPUT, struct v4l2_output *argp)

Arguments

fd File descriptor returned by open().

argp

Description

To query the attributes of a video outputs applications initialize the index field of struct v4l2_output and call the ioctl VIDIOC_ENUMOUTPUT 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 outputs applications shall begin at index zero, incrementing by one until the driver returns EINVAL.

v4l2_output

__u32

__u8

__u32

__u32

__u32

v4l2_std_id

__u32

__u32 index name[32] type audioset

Table 1.94: struct v4l2_output modulator std capabilities reserved[3]

Identifies the output, set by the application.

Name of the video output, a NUL-terminated ASCII string, for example: ``Vout''. This information is intended for the user, preferably the connector label on the device itself.

Type of the output, see Output Type.

Drivers can enumerate up to 32 video and audio outputs.

This field shows which audio outputs were selectable as the current output if this was the currently selected video output. It is a bit mask. The LSB corresponds to audio output 0, the

MSB to output 31. Any number of bits can be set, or none.

When the driver does not enumerate audio outputs no bits must be set. Applications shall not interpret this as lack of audio support. Drivers may automatically select audio outputs without enumerating them.

For details on audio outputs and how to select the current output see

Audio Inputs and Outputs

.

Output devices can have zero or more

RF modulators.

When the type is

V4L2_OUTPUT_TYPE_MODULATOR this is an RF connector and this field identifies the modulator.

It corresponds to struct v4l2_modulator field index. For details on modulators see

Tuners and

Modulators

.

Every video output 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

Video Standards

.

This field provides capabilities for the output. See

Output capabilities for flags.

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

1.2. Part I - Video for Linux API 201

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2_OUTPUT_TYPE_MODULATOR

V4L2_OUTPUT_TYPE_ANALOG

V4L2_OUTPUT_TYPE_ANALOGVGAOVERLAY

Table 1.95: Output Type

1

2

3

This output is an analog TV modulator.

Analog baseband output, for example Composite

/ CVBS, S-Video, RGB.

[?]

V4L2_OUT_CAP_DV_TIMINGS

V4L2_OUT_CAP_STD

V4L2_OUT_CAP_NATIVE_SIZE

Table 1.96: Output capabilities

0x00000002 This output supports setting video timings by using VIDIOC_S_DV_TIMINGS.

0x00000004 This output supports setting the TV standard by using VIDIOC_S_STD.

0x00000008 This output supports setting the native size using the V4L2_SEL_TGT_NATIVE_SIZE selection target, see Common selection definitions.

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 Generic Error Codes chapter.

EINVAL The struct v4l2_output index is out of bounds.

ioctl VIDIOC_ENUMSTD

Name

VIDIOC_ENUMSTD - Enumerate supported video standards

Synopsis

int ioctl(int fd, VIDIOC_ENUMSTD, struct v4l2_standard *argp)

Arguments

fd File descriptor returned by open().

argp

Description

To query the attributes of a video standard, especially a custom (driver defined) one, applications initialize the index field of struct v4l2_standard and call the ioctl VIDIOC_ENUMSTD 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 standards applications shall begin at index zero, incrementing by one until the driver returns EINVAL. Drivers may enumerate a different set of standards after switching the video input or output.

46

v4l2_standard

46

The supported standards may overlap and we need an unambiguous set to find the current standard returned by VIDIOC_G_STD.

202 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

__u32

v4l2_std_id

__u8 struct v4l2_fract

__u32

__u32 index id name[24]

Table 1.97: struct v4l2_standard frameperiod framelines reserved[4]

Number of the video standard, set by the application.

The bits in this field identify the standard as one of the common standards listed in typedef

v4l2_std_id, or if bits 32 to 63 are set as custom standards. Multiple bits can be set if the hardware does not distinguish between these standards, however separate indices do not indicate the opposite. The id must be unique. No other enumerated struct v4l2_standard structure, for this input or output anyway, can contain the same set of bits.

Name of the standard, a NUL-terminated ASCII string, for example: ``PAL-B/G'', ``NTSC Japan''.

This information is intended for the user.

The frame period (not field period) is numerator

/ denominator. For example M/NTSC has a frame period of 1001 / 30000 seconds.

Total lines per frame including blanking, e. g. 625 for B/PAL.

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

v4l2_fract

__u32

__u32

__u64

#define V4L2_STD_PAL_B

#define V4L2_STD_PAL_B1

#define V4L2_STD_PAL_G

#define V4L2_STD_PAL_H

#define V4L2_STD_PAL_I

#define V4L2_STD_PAL_D

#define V4L2_STD_PAL_D1

#define V4L2_STD_PAL_K

#define V4L2_STD_PAL_M

#define V4L2_STD_PAL_N

#define V4L2_STD_PAL_Nc

#define V4L2_STD_PAL_60

Table 1.98: struct v4l2_fract numerator denominator

Table 1.99: typedef v4l2_std_id v4l2_std_id This type is a set, each bit representing another video standard as listed below and in Video Stan-

dards (based on itu470). The 32 most significant bits are reserved for custom (driver defined) video standards.

((v4l2_std_id)0x00000001)

((v4l2_std_id)0x00000002)

((v4l2_std_id)0x00000004)

((v4l2_std_id)0x00000008)

((v4l2_std_id)0x00000010)

((v4l2_std_id)0x00000020)

((v4l2_std_id)0x00000040)

((v4l2_std_id)0x00000080)

((v4l2_std_id)0x00000100)

((v4l2_std_id)0x00000200)

((v4l2_std_id)0x00000400)

((v4l2_std_id)0x00000800)

V4L2_STD_PAL_60 is a hybrid standard with 525 lines, 60 Hz refresh rate, and PAL color modulation with a 4.43 MHz color subcarrier. Some PAL video recorders can play back NTSC tapes in this mode for display on a 50/60 Hz agnostic PAL TV.

#define V4L2_STD_NTSC_M

#define V4L2_STD_NTSC_M_JP

#define V4L2_STD_NTSC_443

((v4l2_std_id)0x00001000)

((v4l2_std_id)0x00002000)

((v4l2_std_id)0x00004000)

1.2. Part I - Video for Linux API 203

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2_STD_NTSC_443 is a hybrid standard with 525 lines, 60 Hz refresh rate, and NTSC color modulation with a 4.43 MHz color subcarrier.

#define V4L2_STD_NTSC_M_KR ((v4l2_std_id)0x00008000)

#define V4L2_STD_SECAM_B

#define V4L2_STD_SECAM_D

#define V4L2_STD_SECAM_G

#define V4L2_STD_SECAM_H

#define V4L2_STD_SECAM_K

#define V4L2_STD_SECAM_K1

#define V4L2_STD_SECAM_L

#define V4L2_STD_SECAM_LC

/* ATSC/HDTV */

#define V4L2_STD_ATSC_8_VSB

#define V4L2_STD_ATSC_16_VSB

((v4l2_std_id)0x00010000)

((v4l2_std_id)0x00020000)

((v4l2_std_id)0x00040000)

((v4l2_std_id)0x00080000)

((v4l2_std_id)0x00100000)

((v4l2_std_id)0x00200000)

((v4l2_std_id)0x00400000)

((v4l2_std_id)0x00800000)

((v4l2_std_id)0x01000000)

((v4l2_std_id)0x02000000)

V4L2_STD_ATSC_8_VSB and V4L2_STD_ATSC_16_VSB are U.S. terrestrial digital TV standards. Presently the

V4L2 API does not support digital TV. See also the Linux DVB API at https://linuxtv.org

.

| #define V4L2_STD_PAL_BG (V4L2_STD_PAL_B

V4L2_STD_PAL_B1

V4L2_STD_PAL_G)

#define V4L2_STD_B

|

(V4L2_STD_PAL_B

V4L2_STD_PAL_B1

V4L2_STD_SECAM_B)

#define V4L2_STD_GH

V4L2_STD_PAL_H

|

(V4L2_STD_PAL_G

|

V4L2_STD_SECAM_G

V4L2_STD_SECAM_H)

#define V4L2_STD_PAL_DK

|

(V4L2_STD_PAL_D

V4L2_STD_PAL_D1

V4L2_STD_PAL_K)

V4L2_STD_PAL_H

V4L2_STD_PAL_I)

|

#define V4L2_STD_PAL

V4L2_STD_PAL_DK

(V4L2_STD_PAL_BG

|

|

#define V4L2_STD_NTSC (V4L2_STD_NTSC_M

V4L2_STD_NTSC_M_JP |

V4L2_STD_NTSC_M_KR)

#define V4L2_STD_MN

V4L2_STD_PAL_N

V4L2_STD_PAL_Nc

V4L2_STD_NTSC)

(V4L2_STD_PAL_M

|

|

#define V4L2_STD_SECAM_DK (V4L2_STD_SECAM_D

V4L2_STD_SECAM_K |

V4L2_STD_SECAM_K1)

#define V4L2_STD_DK (V4L2_STD_PAL_DK

V4L2_STD_SECAM_DK)

|

|

|

|

|

|

|

|

| #define V4L2_STD_SECAM (V4L2_STD_SECAM_B

V4L2_STD_SECAM_G

V4L2_STD_SECAM_H

|

|

V4L2_STD_SECAM_DK

V4L2_STD_SECAM_L

V4L2_STD_SECAM_LC)

|

|

#define V4L2_STD_525_60

V4L2_STD_PAL_60

V4L2_STD_NTSC

(V4L2_STD_PAL_M

|

|

V4L2_STD_NTSC_443)

#define V4L2_STD_625_50 (V4L2_STD_PAL

|

|

204 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2_STD_PAL_N

V4L2_STD_PAL_Nc

V4L2_STD_SECAM)

|

|

#define V4L2_STD_UNKNOWN

#define V4L2_STD_ALL

0

(V4L2_STD_525_60

V4L2_STD_625_50)

|

Characteristics M/NTSC

54

M/PAL N/PAL

55

Table 1.100: Video Standards (based on ITU BT.470)

B, B1, G/PAL D,

K/PAL

D1, H/PAL I/PAL

Frame lines

Frame period

(s)

Chrominance sub-carrier frequency (Hz)

Nominal radiofrequency channel bandwidth (MHz)

Sound carrier relative to vision

(MHz) carrier

525

1001/30000

625

1/25

3579545

± 10

3579611.49

± 10 4433618.75 ± 5

(3582056.25

± 5)

6

4.5

6

4.5

6

4.5

4433618.75

± 5

B: 7; B1, G: 8

5.5

± 0.001

58 59

56 57

8

6.5

± 0.001

8

5.5

8

5.9996

± 0.0005

B, G/SECAM

4433618.75

8

5.5

± 0.001

± 1

D,

K/SECAM

8

6.5

K1/SECAM L/SECAM f

OR

= 4406250

± 2000, f

OB

= 4250000

± 2000

8

± 0.001 6.5

8

6.5

60

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 Generic Error Codes chapter.

EINVAL The struct v4l2_standard index is out of bounds.

ENODATA Standard video timings are not supported for this input or output.

ioctl VIDIOC_EXPBUF

Name

VIDIOC_EXPBUF - Export a buffer as a DMABUF file descriptor.

Synopsis

int ioctl(int fd, VIDIOC_EXPBUF, struct v4l2_exportbuffer *argp)

Arguments

fd File descriptor returned by open().

argp

Description

This ioctl is an extension to the

memory mapping

I/O method, therefore it is available only for

V4L2_MEMORY_MMAP buffers. It can be used to export a buffer as a DMABUF file at any time after buffers have been allocated with the ioctl VIDIOC_REQBUFS ioctl.

To export a buffer, applications fill struct v4l2_exportbuffer. The type field is set to the same buffer type as was previously used with struct v4l2_requestbuffers type. Applications must also set the index field. Valid index numbers range from zero to the number of buffers allocated with ioctl VIDIOC_REQBUFS

(struct v4l2_requestbuffers count) minus one. For the multi-planar API, applications set the plane field to the index of the plane to be exported. Valid planes range from zero to the maximal number of valid

1.2. Part I - Video for Linux API 205

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

planes for the currently active format. For the single-planar API, applications must set plane to zero.

Additional flags may be posted in the flags field. Refer to a manual for open() for details. Currently only

O_CLOEXEC, O_RDONLY, O_WRONLY, and O_RDWR are supported. All other fields must be set to zero. In the case of multi-planar API, every plane is exported separately using multiple ioctl VIDIOC_EXPBUF calls.

After calling ioctl VIDIOC_EXPBUF the fd field will be set by a driver. This is a DMABUF file descriptor. The application may pass it to other DMABUF-aware devices. Refer to

DMABUF importing

for details about importing DMABUF files into V4L2 nodes. It is recommended to close a DMABUF file when it is no longer used to allow the associated memory to be reclaimed.

Examples int

buffer_export (

int

v4lfd,

enum

v4l2_buf_type bt,

int

index,

int

* dmafd)

{

struct

v4l2_exportbuffer expbuf; memset( & expbuf, 0 ,

sizeof

(expbuf)); expbuf.type

= bt; expbuf.index

= index;

if

(ioctl(v4lfd, VIDIOC_EXPBUF, & expbuf) == 1 ) { perror( "VIDIOC_EXPBUF" );

return

1 ;

}

* dmafd = expbuf.fd;

return

0 ;

}

int

buffer_export_mp (

int

v4lfd,

enum

v4l2_buf_type bt,

int

index,

int

dmafd[],

int

n_planes)

{

int

i;

for

(i = 0 ; i < n_planes; ++ i) {

struct

v4l2_exportbuffer expbuf; memset( & expbuf, 0 ,

sizeof

(expbuf)); expbuf.type

= bt; expbuf.index

= index; expbuf.plane

= i;

if

(ioctl(v4lfd, VIDIOC_EXPBUF, & expbuf) == 1 ) { perror( "VIDIOC_EXPBUF" );

while

(i) close(dmafd[ -i]);

return

1 ;

} dmafd[i] = expbuf.fd;

}

return

0 ;

}

v4l2_exportbuffer

206 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

__u32

__u32

__u32

__u32

__s32

__u32 type index plane flags fd

Table 1.101: struct v4l2_exportbuffer reserved[11]

Type of the buffer, same as struct v4l2_format type or struct v4l2_requestbuffers type, set by the application. See

v4l2_buf_type

Number of the buffer, set by the application. This field is only used for

memory mapping

I/O and can range from zero to the number of buffers allocated with the ioctl VIDIOC_REQBUFS and/or ioctl VID-

IOC_CREATE_BUFS ioctls.

Index of the plane to be exported when using the multi-planar API. Otherwise this value must be set to zero.

Flags for the newly created file, currently only

O_CLOEXEC, O_RDONLY, O_WRONLY, and O_RDWR are supported, refer to the manual of open() for more details.

The DMABUF file descriptor associated with a buffer. Set by the driver.

Reserved field for future use. Drivers and applications must set the array to zero.

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 Generic Error Codes chapter.

EINVAL A queue is not in MMAP mode or DMABUF exporting is not supported or flags or type or index or plane fields are invalid.

ioctl VIDIOC_G_AUDIO, VIDIOC_S_AUDIO

Name

VIDIOC_G_AUDIO - VIDIOC_S_AUDIO - Query or select the current audio input and its attributes

Synopsis

int ioctl(int fd, VIDIOC_G_AUDIO, struct v4l2_audio *argp) int ioctl(int fd, VIDIOC_S_AUDIO, const struct v4l2_audio *argp)

Arguments

fd File descriptor returned by open().

argp

Description

To query the current audio input applications zero out the reserved array of a struct v4l2_audio and call the VIDIOC_G_AUDIO ioctl with a pointer to this structure. Drivers fill the rest of the structure or return an

EINVAL error code when the device has no audio inputs, or none which combine with the current video input.

1.2. Part I - Video for Linux API 207

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Audio inputs have one writable property, the audio mode. To select the current audio input and change the audio mode, applications initialize the index and mode fields, and the reserved array of a struct v4l2_audio structure and call the VIDIOC_S_AUDIO ioctl. Drivers may switch to a different audio mode if the request cannot be satisfied. However, this is a write-only ioctl, it does not return the actual new audio mode.

v4l2_audio

__u32

__u8

__u32

__u32

__u32

V4L2_AUDCAP_STEREO

V4L2_AUDCAP_AVL

V4L2_AUDMODE_AVL index name[32] capability mode

Table 1.102: struct v4l2_audio reserved[2]

Identifies the audio input, set by the driver or application.

Name of the audio input, a NUL-terminated ASCII string, for example: ``Line In''. This information is intended for the user, preferably the connector label on the device itself.

Audio capability flags, see Audio Capability Flags.

Audio mode flags set by drivers and applications

(on VIDIOC_S_AUDIO ioctl), see Audio Mode Flags.

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

Table 1.103: Audio Capability Flags

0x00001

0x00002

This is a stereo input. The flag is intended to automatically disable stereo recording etc. when the signal is always monaural. The API provides no means to detect if stereo is received, unless the audio input belongs to a tuner.

Automatic Volume Level mode is supported.

Table 1.104: Audio Mode Flags

0x00001 AVL mode is on.

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 Generic Error Codes chapter.

EINVAL No audio inputs combine with the current video input, or the number of the selected audio input is out of bounds or it does not combine.

ioctl VIDIOC_G_AUDOUT, VIDIOC_S_AUDOUT

Name

VIDIOC_G_AUDOUT - VIDIOC_S_AUDOUT - Query or select the current audio output

Synopsis

int ioctl(int fd, VIDIOC_G_AUDOUT, struct v4l2_audioout *argp) int ioctl(int fd, VIDIOC_S_AUDOUT, const struct v4l2_audioout *argp)

Arguments

fd File descriptor returned by open().

208 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

argp

Description

To query the current audio output applications zero out the reserved array of a struct v4l2_audioout and call the VIDIOC_G_AUDOUT ioctl with a pointer to this structure. Drivers fill the rest of the structure or return an EINVAL error code when the device has no audio inputs, or none which combine with the current video output.

Audio outputs have no writable properties. Nevertheless, to select the current audio output applications can initialize the index field and reserved array (which in the future may contain writable properties) of a struct v4l2_audioout structure and call the VIDIOC_S_AUDOUT ioctl. Drivers switch to the requested output or return the EINVAL error code when the index is out of bounds. This is a write-only ioctl, it does not return the current audio output attributes as VIDIOC_G_AUDOUT does.

Note:

Connectors on a TV card to loop back the received audio signal to a sound card are not audio outputs in this sense.

v4l2_audioout

__u32

__u8

__u32

__u32

__u32 index name[32] capability mode

Table 1.105: struct v4l2_audioout reserved[2]

Identifies the audio output, set by the driver or application.

Name of the audio output, a NUL-terminated ASCII string, for example: ``Line Out''. This information is intended for the user, preferably the connector label on the device itself.

Audio capability flags, none defined yet. Drivers must set this field to zero.

Audio mode, none defined yet. Drivers and applications (on VIDIOC_S_AUDOUT) must set this field to zero.

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

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 Generic Error Codes chapter.

EINVAL No audio outputs combine with the current video output, or the number of the selected audio output is out of bounds or it does not combine.

ioctl VIDIOC_G_CROP, VIDIOC_S_CROP

Name

VIDIOC_G_CROP - VIDIOC_S_CROP - Get or set the current cropping rectangle

Synopsis

int ioctl(int fd, VIDIOC_G_CROP, struct v4l2_crop *argp)

1.2. Part I - Video for Linux API 209

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

int ioctl(int fd, VIDIOC_S_CROP, const struct v4l2_crop *argp)

Arguments

fd File descriptor returned by open().

argp

Description

To query the cropping rectangle size and position applications set the type field of a struct v4l2_crop structure to the respective buffer (stream) type and call the VIDIOC_G_CROP ioctl with a pointer to this structure. The driver fills the rest of the structure or returns the EINVAL error code if cropping is not supported.

To change the cropping rectangle applications initialize the type and struct

v4l2_rect

substructure named c of a v4l2_crop structure and call the VIDIOC_S_CROP ioctl with a pointer to this structure.

Do not use the multiplanar buffer types.

Use V4L2_BUF_TYPE_VIDEO_CAPTURE instead of

V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE and use V4L2_BUF_TYPE_VIDEO_OUTPUT instead of

V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE.

The driver first adjusts the requested dimensions against hardware limits, i. e. the bounds given by the capture/output window, and it rounds to the closest possible values of horizontal and vertical offset, width and height. In particular the driver must round the vertical offset of the cropping rectangle to frame lines modulo two, such that the field order cannot be confused.

Second the driver adjusts the image size (the opposite rectangle of the scaling process, source or target depending on the data direction) to the closest size possible while maintaining the current horizontal and vertical scaling factor.

Finally the driver programs the hardware with the actual cropping and image parameters. VIDIOC_S_CROP is a write-only ioctl, it does not return the actual parameters. To query them applications must call VID-

IOC_G_CROP and ioctl VIDIOC_G_FMT, VIDIOC_S_FMT, VIDIOC_TRY_FMT. When the parameters are unsuitable the application may modify the cropping or image parameters and repeat the cycle until satisfactory parameters have been negotiated.

When cropping is not supported then no parameters are changed and VIDIOC_S_CROP returns the EINVAL error code.

v4l2_crop

__u32 struct

v4l2_rect

type c

Table 1.106: struct v4l2_crop

Type of the data stream, set by the application.

Only these types are valid here: V4L2_BUF_TYPE_VIDEO_CAPTURE,

V4L2_BUF_TYPE_VIDEO_OUTPUT and

V4L2_BUF_TYPE_VIDEO_OVERLAY.

v4l2_buf_type .

See

Cropping rectangle. The same co-ordinate system as for struct v4l2_cropcap bounds is used.

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 Generic Error Codes chapter.

ENODATA Cropping is not supported for this input or output.

210 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d ioctl VIDIOC_G_CTRL, VIDIOC_S_CTRL

Name

VIDIOC_G_CTRL - VIDIOC_S_CTRL - Get or set the value of a control

Synopsis

int ioctl(int fd, VIDIOC_G_CTRL, struct v4l2_control *argp) int ioctl(int fd, VIDIOC_S_CTRL, struct v4l2_control *argp)

Arguments

fd File descriptor returned by open().

argp

Description

To get the current value of a control applications initialize the id field of a struct v4l2_control and call the VIDIOC_G_CTRL ioctl with a pointer to this structure. To change the value of a control applications initialize the id and value fields of a struct v4l2_control and call the VIDIOC_S_CTRL ioctl.

When the id is invalid drivers return an EINVAL error code. When the value is out of bounds drivers can choose to take the closest valid value or return an ERANGE error code, whatever seems more appropriate.

However, VIDIOC_S_CTRL is a write-only ioctl, it does not return the actual new value. If the value is inappropriate for the control (e.g. if it refers to an unsupported menu index of a menu control), then

EINVAL error code is returned as well.

These ioctls work only with user controls.

For other control classes the VIDIOC_G_EXT_CTRLS, VID-

IOC_S_EXT_CTRLS or VIDIOC_TRY_EXT_CTRLS must be used.

v4l2_control

__u32

__s32 id value

Table 1.107: struct v4l2_control

Identifies the control, set by the application.

New value or current value.

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 Generic Error Codes chapter.

EINVAL The struct v4l2_control id is invalid or the value is inappropriate for the given control (i.e. if a menu item is selected that is not supported by the driver according to VIDIOC_QUERYMENU).

ERANGE The struct v4l2_control value is out of bounds.

EBUSY The control is temporarily not changeable, possibly because another applications took over control of the device function this control belongs to.

EACCES Attempt to set a read-only control or to get a write-only control.

1.2. Part I - Video for Linux API 211

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d ioctl VIDIOC_G_DV_TIMINGS, VIDIOC_S_DV_TIMINGS

Name

VIDIOC_G_DV_TIMINGS VIDIOC_S_DV_TIMINGS VIDIOC_SUBDEV_G_DV_TIMINGS VID-

IOC_SUBDEV_S_DV_TIMINGS - Get or set DV timings for input or output

Synopsis

int ioctl(int fd, VIDIOC_G_DV_TIMINGS, struct v4l2_dv_timings *argp) int ioctl(int fd, VIDIOC_S_DV_TIMINGS, struct v4l2_dv_timings *argp) int ioctl(int fd, VIDIOC_SUBDEV_G_DV_TIMINGS, struct v4l2_dv_timings *argp) int ioctl(int fd, VIDIOC_SUBDEV_S_DV_TIMINGS, struct v4l2_dv_timings *argp)

Arguments

fd File descriptor returned by open().

argp

Description

To set DV timings for the input or output, applications use the VIDIOC_S_DV_TIMINGS ioctl and to get the current timings, applications use the VIDIOC_G_DV_TIMINGS ioctl. The detailed timing information is filled in using the structure struct v4l2_dv_timings. These ioctls take a pointer to the struct v4l2_dv_timings structure as argument. If the ioctl is not supported or the timing values are not correct, the driver returns

EINVAL error code.

The linux/v4l2-dv-timings.h header can be used to get the timings of the formats in the CEA-861-

E and VESA DMT standards. If the current input or output does not support DV timings (e.g. if ioctl

VIDIOC_ENUMINPUT does not set the V4L2_IN_CAP_DV_TIMINGS flag), then ENODATA error code is returned.

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 Generic Error Codes chapter.

EINVAL This ioctl is not supported, or the VIDIOC_S_DV_TIMINGS parameter was unsuitable.

ENODATA Digital video timings are not supported for this input or output.

EBUSY The device is busy and therefore can not change the timings.

v4l2_bt_timings

212 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

__u64

__u32

__u32

__u32

__u32

__u32

__u32

__u32

__u32

__u32

__u32

__u32

__u32

__u32

__u32

__u32

__u32

v4l2_dv_timings

__u32 union type width height interlaced polarities pixelclock hfrontporch hsync hbackporch vfrontporch vsync vbackporch il_vfrontporch il_vsync il_vbackporch standards flags

Table 1.108: struct v4l2_bt_timings reserved[14]

Width of the active video in pixels.

Height of the active video frame in lines. So for interlaced formats the height of the active video in each field is height/2.

Progressive (V4L2_DV_PROGRESSIVE) or interlaced

(V4L2_DV_INTERLACED).

This is a bit mask that defines polarities of sync signals.

bit 0 (V4L2_DV_VSYNC_POS_POL) is for vertical sync polarity and bit 1

(V4L2_DV_HSYNC_POS_POL) is for horizontal sync polarity.

If the bit is set (1) it is positive polarity and if is cleared (0), it is negative polarity.

Pixel clock in Hz. Ex. 74.25MHz->74250000

Horizontal front porch in pixels

Horizontal sync length in pixels

Horizontal back porch in pixels

Vertical front porch in lines. For interlaced formats this refers to the odd field (aka field 1).

Vertical sync length in lines. For interlaced formats this refers to the odd field (aka field 1).

Vertical back porch in lines. For interlaced formats this refers to the odd field (aka field 1).

Vertical front porch in lines for the even field (aka field 2) of interlaced field formats. Must be 0 for progressive formats.

Vertical sync length in lines for the even field (aka field 2) of interlaced field formats. Must be 0 for progressive formats.

Vertical back porch in lines for the even field (aka field 2) of interlaced field formats. Must be 0 for progressive formats.

The video standard(s) this format belongs to. This will be filled in by the driver. Applications must set this to 0. See DV BT Timing standards for a list of standards.

Several flags giving more information about the format. See DV BT Timing flags for a description of the flags.

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

struct

Table 1.109: struct v4l2_dv_timings v4l2_bt_timings

__u32 bt reserved[32]

Type of DV timings as listed in DV Tim-

ing types.

Timings defined by

BT.656/1120 specifications

1.2. Part I - Video for Linux API 213

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Timing type

V4L2_DV_BT_656_1120

Timing standard value

0

Table 1.110: DV Timing types

Description

BT.656/1120 timings

Table 1.111: DV BT Timing standards

Description at all in this format. Total blanking timings must be set in hsync or vsync fields only.

214 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Flag

V4L2_DV_FL_REDUCED_BLANKING

V4L2_DV_FL_CAN_REDUCE_FPS

V4L2_DV_FL_REDUCED_FPS

V4L2_DV_FL_HALF_LINE

V4L2_DV_FL_IS_CE_VIDEO

Table 1.112: DV BT Timing flags

Description

CVT/GTF specific: the timings use reduced blanking (CVT) or the

`Secondary GTF' curve (GTF). In both cases the horizontal and/or vertical blanking intervals are reduced, allowing a higher resolution over the same bandwidth. This is a read-only flag, applications must not set this.

CEA-861 specific: set for CEA-861 formats with a framerate that is a multiple of six. These formats can be optionally played at 1 /

1.001 speed to be compatible with 60 Hz based standards such as

NTSC and PAL-M that use a framerate of 29.97 frames per second.

If the transmitter can't generate such frequencies, then the flag will also be cleared. This is a read-only flag, applications must not set this.

CEA-861 specific: only valid for video transmitters, the flag is cleared by receivers. It is also only valid for formats with the

V4L2_DV_FL_CAN_REDUCE_FPS flag set, for other formats the flag will be cleared by the driver. If the application sets this flag, then the pixelclock used to set up the transmitter is divided by 1.001 to make it compatible with NTSC framerates. If the transmitter can't generate such frequencies, then the flag will also be cleared.

Specific to interlaced formats: if set, then the vertical frontporch of field 1 (aka the odd field) is really one half-line longer and the vertical backporch of field 2 (aka the even field) is really one halfline shorter, so each field has exactly the same number of halflines. Whether half-lines can be detected or used depends on the hardware.

If set, then this is a Consumer Electronics (CE) video format. Such formats differ from other formats (commonly called IT formats) in that if R'G'B' encoding is used then by default the R'G'B' values use limited range (i.e. 16-235) as opposed to full range (i.e. 0-255). All formats defined in CEA-861 except for the 640x480p59.94 format are CE formats.

V4L2_DV_FL_HAS_PICTURE_ASPECT If set, then the picture_aspect field is valid. Otherwise assume that the pixels are square, so the picture aspect ratio is the same as the width to height ratio.

V4L2_DV_FL_HAS_CEA861_VIC odd total height. For these formats, if this flag is set, the first field has the extra line. Else, it is the second field.

V4L2_DV_FL_HAS_HDMI_VIC

If set, then the cea861_vic field is valid and contains the Video

Identification Code as per the CEA-861 standard.

If set, then the hdmi_vic field is valid and contains the Video Identification Code as per the HDMI standard (HDMI Vendor Specific

InfoFrame).

ioctl VIDIOC_G_EDID, VIDIOC_S_EDID, VIDIOC_SUBDEV_G_EDID, VIDIOC_SUBDEV_S_EDID

Name

VIDIOC_G_EDID - VIDIOC_S_EDID - VIDIOC_SUBDEV_G_EDID - VIDIOC_SUBDEV_S_EDID - Get or set the

EDID of a video receiver/transmitter

Synopsis

int ioctl(int fd, VIDIOC_G_EDID, struct v4l2_edid *argp)

1.2. Part I - Video for Linux API 215

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

int ioctl(int fd, VIDIOC_S_EDID, struct v4l2_edid *argp) int ioctl(int fd, VIDIOC_SUBDEV_G_EDID, struct v4l2_edid *argp) int ioctl(int fd, VIDIOC_SUBDEV_S_EDID, struct v4l2_edid *argp)

Arguments

fd File descriptor returned by open().

argp

Description

These ioctls can be used to get or set an EDID associated with an input from a receiver or an output of a transmitter device. They can be used with subdevice nodes (/dev/v4l-subdevX) or with video nodes

(/dev/videoX).

When used with video nodes the pad field represents the input (for video capture devices) or output (for video output devices) index as is returned by ioctl VIDIOC_ENUMINPUT and ioctl VIDIOC_ENUMOUTPUT respectively. When used with subdevice nodes the pad field represents the input or output pad of the subdevice. If there is no EDID support for the given pad value, then the EINVAL error code will be returned.

To get the EDID data the application has to fill in the pad, start_block, blocks and edid fields, zero the reserved array and call VIDIOC_G_EDID. The current EDID from block start_block and of size blocks will be placed in the memory edid points to. The edid pointer must point to memory at least blocks *

128 bytes large (the size of one block is 128 bytes).

If there are fewer blocks than specified, then the driver will set blocks to the actual number of blocks. If there are no EDID blocks available at all, then the error code ENODATA is set.

If blocks have to be retrieved from the sink, then this call will block until they have been read.

If start_block and blocks are both set to 0 when VIDIOC_G_EDID is called, then the driver will set blocks to the total number of available EDID blocks and it will return 0 without copying any data. This is an easy way to discover how many EDID blocks there are.

Note:

If there are no EDID blocks available at all, then the driver will set blocks to 0 and it returns 0.

To set the EDID blocks of a receiver the application has to fill in the pad, blocks and edid fields, set start_block to 0 and zero the reserved array. It is not possible to set part of an EDID, it is always all or nothing. Setting the EDID data is only valid for receivers as it makes no sense for a transmitter.

The driver assumes that the full EDID is passed in. If there are more EDID blocks than the hardware can handle then the EDID is not written, but instead the error code E2BIG is set and blocks is set to the maximum that the hardware supports. If start_block is any value other than 0 then the error code

EINVAL is set.

To disable an EDID you set blocks to 0. Depending on the hardware this will drive the hotplug pin low and/or block the source from reading the EDID data in some way. In any case, the end result is the same: the EDID is no longer available.

v4l2_edid

216 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

__u32

__u32

__u32

__u32

__u8 * pad start_block blocks edid

Table 1.113: struct v4l2_edid reserved[5]

Pad for which to get/set the EDID blocks. When used with a video device node the pad represents the input or output index as returned by ioctl VID-

IOC_ENUMINPUT and ioctl VIDIOC_ENUMOUTPUT respectively.

Read the EDID from starting with this block. Must be 0 when setting the EDID.

The number of blocks to get or set. Must be less or equal to 256 (the maximum number of blocks as defined by the standard). When you set the

EDID and blocks is 0, then the EDID is disabled or erased.

Reserved for future extensions. Applications and drivers must set the array to zero.

Pointer to memory that contains the EDID. The minimum size is blocks * 128.

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 Generic Error Codes chapter.

ENODATA The EDID data is not available.

E2BIG The EDID data you provided is more than the hardware can handle.

ioctl VIDIOC_G_ENC_INDEX

Name

VIDIOC_G_ENC_INDEX - Get meta data about a compressed video stream

Synopsis

int ioctl(int fd, VIDIOC_G_ENC_INDEX, struct v4l2_enc_idx *argp)

Arguments

fd File descriptor returned by open().

argp

Description

The VIDIOC_G_ENC_INDEX ioctl provides meta data about a compressed video stream the same or another application currently reads from the driver, which is useful for random access into the stream without decoding it.

To read the data applications must call VIDIOC_G_ENC_INDEX with a pointer to a struct v4l2_enc_idx. On success the driver fills the entry array, stores the number of elements written in the entries field, and initializes the entries_cap field.

1.2. Part I - Video for Linux API 217

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Each element of the entry array contains meta data about one picture. A VIDIOC_G_ENC_INDEX call reads up to V4L2_ENC_IDX_ENTRIES entries from a driver buffer, which can hold up to entries_cap entries. This number can be lower or higher than V4L2_ENC_IDX_ENTRIES, but not zero. When the application fails to read the meta data in time the oldest entries will be lost. When the buffer is empty or no capturing/encoding is in progress, entries will be zero.

Currently this ioctl is only defined for MPEG-2 program streams and video elementary streams.

v4l2_enc_idx

Table 1.114: struct v4l2_enc_idx

__u32

__u32

__u32 struct v4l2_enc_idx_entry entries entries_cap reserved[4]

The number of entries the driver stored in the entry array.

The number of entries the driver can buffer.

Must be greater than zero.

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

entry[V4L2_ENC_IDX_ENTRIES] Meta data about a compressed video stream.

Each element of the array corresponds to one picture, sorted in ascending order by their offset.

v4l2_enc_idx_entry

__u64

__u64

__u32

__u32

__u32

V4L2_ENC_IDX_FRAME_I

V4L2_ENC_IDX_FRAME_P

V4L2_ENC_IDX_FRAME_B

V4L2_ENC_IDX_FRAME_MASK offset pts length flags

Table 1.115: struct v4l2_enc_idx_entry reserved[2]

The offset in bytes from the beginning of the compressed video stream to the beginning of this picture, that is a PES packet header as defined in

ISO 13818-1 or a picture header as defined in ISO

13818-2. When the encoder is stopped, the driver resets the offset to zero.

The 33 bit Presentation Time Stamp of this picture as defined in ISO 13818-1.

The length of this picture in bytes.

Flags containing the coding type of this picture, see Index Entry Flags.

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

Table 1.116: Index Entry Flags

0x00

0x01

0x02

0x0F

This is an Intra-coded picture.

This is a Predictive-coded picture.

This is a Bidirectionally predictive-coded picture.

AND the flags field with this mask to obtain the picture coding type.

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 Generic Error Codes chapter.

218 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d ioctl VIDIOC_G_EXT_CTRLS, VIDIOC_S_EXT_CTRLS, VIDIOC_TRY_EXT_CTRLS

Name

VIDIOC_G_EXT_CTRLS - VIDIOC_S_EXT_CTRLS - VIDIOC_TRY_EXT_CTRLS - Get or set the value of several controls, try control values

Synopsis

int ioctl(int fd, VIDIOC_G_EXT_CTRLS, struct v4l2_ext_controls *argp) int ioctl(int fd, VIDIOC_S_EXT_CTRLS, struct v4l2_ext_controls *argp) int ioctl(int fd, VIDIOC_TRY_EXT_CTRLS, struct v4l2_ext_controls *argp)

Arguments

fd File descriptor returned by open().

argp

Description

These ioctls allow the caller to get or set multiple controls atomically. Control IDs are grouped into control classes (see Control classes) and all controls in the control array must belong to the same control class.

Applications must always fill in the count, which, controls and reserved fields of struct v4l2_ext_controls, and initialize the struct v4l2_ext_control array pointed to by the controls fields.

To get the current value of a set of controls applications initialize the id, size and reserved2 fields of each struct v4l2_ext_control and call the VIDIOC_G_EXT_CTRLS ioctl. String controls controls must also set the string field. Controls of compound types (V4L2_CTRL_FLAG_HAS_PAYLOAD is set) must set the ptr field.

If the size is too small to receive the control result (only relevant for pointer-type controls like strings), then the driver will set size to a valid value and return an ENOSPC error code. You should re-allocate the memory to this new size and try again. For the string type it is possible that the same issue occurs again if the string has grown in the meantime. It is recommended to call ioctls VIDIOC_QUERYCTRL,

VIDIOC_QUERY_EXT_CTRL and VIDIOC_QUERYMENU first and use maximum+1 as the new size value. It is guaranteed that that is sufficient memory.

N-dimensional arrays are set and retrieved row-by-row. You cannot set a partial array, all elements have to be set or retrieved. The total size is calculated as elems * elem_size. These values can be obtained by calling VIDIOC_QUERY_EXT_CTRL.

To change the value of a set of controls applications initialize the id, size, reserved2 and value/value64/string/ptr fields of each struct v4l2_ext_control and call the VIDIOC_S_EXT_CTRLS ioctl. The controls will only be set if all control values are valid.

To check if a set of controls have correct values applications initialize the id, size, reserved2 and value/value64/string/ptr fields of each struct v4l2_ext_control and call the VIDIOC_TRY_EXT_CTRLS ioctl. It is up to the driver whether wrong values are automatically adjusted to a valid value or if an error is returned.

When the id or which is invalid drivers return an EINVAL error code. When the value is out of bounds drivers can choose to take the closest valid value or return an ERANGE error code, whatever seems more appropriate. In the first case the new value is set in struct v4l2_ext_control. If the new control value is inappropriate (e.g. the given menu index is not supported by the menu control), then this will also result in an EINVAL error code error.

1.2. Part I - Video for Linux API 219

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

The driver will only set/get these controls if all control values are correct. This prevents the situation where only some of the controls were set/get. Only low-level errors (e. g. a failed i2c command) can still cause this situation.

v4l2_ext_control

__u32

__u32

__u32 union id size reserved2[1]

(anonymous)

__s32

__s64 char *

__u8 *

__u16 *

__u32 * void *

Table 1.117: struct v4l2_ext_control

Identifies the control, set by the application.

The total size in bytes of the payload of this control. This is normally 0, but for pointer controls this should be set to the size of the memory containing the payload, or that will receive the payload. If

VIDIOC_G_EXT_CTRLS finds that this value is less than is required to store the payload result, then it is set to a value large enough to store the payload result and ENOSPC is returned.

Note:

For string controls, this size field should not be confused with the length of the string. This field refers to the size of the mem-

ory that contains the string. The actual length of the string may

well be much smaller.

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

value value64 New value or current value.

Valid if this control is of type

V4L2_CTRL_TYPE_INTEGER64 and V4L2_CTRL_FLAG_HAS_PAYLOAD is string not set.

A pointer to a string.

V4L2_CTRL_TYPE_STRING.

Valid if this control is of type p_u8

New value or current value.

Valid if this control is not of type

V4L2_CTRL_TYPE_INTEGER64 and V4L2_CTRL_FLAG_HAS_PAYLOAD is not set.

p_u16

A pointer to a matrix control of unsigned 8-bit values. Valid if this control is of type V4L2_CTRL_TYPE_U8.

A pointer to a matrix control of unsigned 16-bit values. Valid if this control is of type V4L2_CTRL_TYPE_U16.

p_u32 ptr

A pointer to a matrix control of unsigned 32-bit values. Valid if this control is of type V4L2_CTRL_TYPE_U32.

A pointer to a compound type which can be an Ndimensional array and/or a compound type (the control's type is >= V4L2_CTRL_COMPOUND_TYPES).

Valid if

V4L2_CTRL_FLAG_HAS_PAYLOAD is set for this control.

v4l2_ext_controls

union

Table 1.118: struct v4l2_ext_controls

(anonymous)

__u32 ctrl_class The control class to which all controls belong, see Control classes. Drivers that use a kernel framework for handling controls will also accept a value of 0 here, meaning that the controls can belong to any control class. Whether drivers support this can be tested by setting ctrl_class to 0 and calling VIDIOC_TRY_EXT_CTRLS with a count of 0. If that succeeds, then the driver supports this feature.

Continued on next page

220 Chapter 1. Linux Media Infrastructure userspace API

__u32

__u32

__u32 struct v4l2_ext_control

*

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Table 1.118 -- continued from previous page

__u32 which Which value of the control to get/set/try.

V4L2_CTRL_WHICH_CUR_VAL will return the current value of the control and

V4L2_CTRL_WHICH_DEF_VAL will return the default value of the control.

Note:

You can only get the default value of the control, you cannot set or try it.

For backwards compatibility you can also use a control class here (see Control classes).

In that case all controls have to belong to that control class.

This usage is deprecated, instead just use V4L2_CTRL_WHICH_CUR_VAL.

There are some very old drivers that do not yet support V4L2_CTRL_WHICH_CUR_VAL and that require a control class here.

You can test for such drivers by setting ctrl_class to V4L2_CTRL_WHICH_CUR_VAL and calling VID-

IOC_TRY_EXT_CTRLS with a count of 0.

If that fails, then the driver does not support

V4L2_CTRL_WHICH_CUR_VAL.

count The number of controls in the controls array. May also be zero.

error_idx Set by the driver in case of an error. If the error is associated with a particular control, then error_idx is set to the index of that control. If the error is not related to a specific control, or the validation step failed (see below), then error_idx is set to count. The value is undefined if the ioctl returned 0 (success). Before controls are read from/written to hardware a validation step takes place: this checks if all controls in the list are valid controls, if no attempt is made to write to a read-only control or read from a write-only control, and any other up-front checks that can be done without accessing the hardware. The exact validations done during this step are driver dependent since some checks might require hardware access for some devices, thus making it impossible to do those checks up-front. However, drivers should make a best-effort to do as many up-front checks as possible. This check is done to avoid leaving the hardware in an inconsistent state due to easy-to-avoid problems. But it leads to another problem: the application needs to know whether an error came from the validation step (meaning that the hardware was not touched) or from an error during the actual reading from/writing to hardware. The, in hindsight quite poor, solution for that is to set error_idx to count if the validation failed. This has the unfortunate side-effect that it is not possible to see which control failed the validation. If the validation was successful and the error happened while accessing the hardware, then error_idx is less than count and only the controls up to error_idx-1 were read or written correctly, and the state of the remaining controls is undefined. Since VIDIOC_TRY_EXT_CTRLS does not access hardware there is also no need to handle the validation step in this special way, so error_idx will just be set to the control that failed the validation step instead of to count. This means that if VIDIOC_S_EXT_CTRLS fails with error_idx set to count, then you can call VIDIOC_TRY_EXT_CTRLS to try to discover the actual control that failed the validation step. Unfortunately, there is no TRY equivalent for VIDIOC_G_EXT_CTRLS.

reserved[2] Reserved for future extensions. Drivers and applications must set the array to zero.

controls Pointer to an array of count v4l2_ext_control structures. Ignored if count equals zero.

1.2. Part I - Video for Linux API 221

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2_CTRL_CLASS_USER

V4L2_CTRL_CLASS_MPEG

V4L2_CTRL_CLASS_CAMERA

V4L2_CTRL_CLASS_FM_TX

V4L2_CTRL_CLASS_FLASH

V4L2_CTRL_CLASS_JPEG

V4L2_CTRL_CLASS_IMAGE_SOURCE

V4L2_CTRL_CLASS_IMAGE_PROC

V4L2_CTRL_CLASS_FM_RX

V4L2_CTRL_CLASS_RF_TUNER

Table 1.119: Control classes

0x980000

0x990000

0x9a0000

0x9b0000

0x9c0000

0x9d0000

0x9e0000

0x9f0000

0xa10000

0xa20000

The class containing user controls. These controls are described in

User Controls

. All controls that can be set using the VIDIOC_S_CTRL and VID-

IOC_G_CTRL ioctl belong to this class.

The class containing MPEG compression controls.

These controls are described in

Codec Control Reference

.

The class containing camera controls. These controls are described in

Camera Control Reference

.

The class containing FM Transmitter (FM TX) controls. These controls are described in

FM Transmitter Control Reference

.

The class containing flash device controls. These controls are described in

Flash Control Reference

.

The class containing JPEG compression controls.

These controls are described in

JPEG Control Reference

.

The class containing image source controls.

These controls are described in

Image Source

Control Reference

.

The class containing image processing controls.

These controls are described in

Image Process

Control Reference

.

The class containing FM Receiver (FM RX) controls.

These controls are described in

FM Receiver Control Reference

.

The class containing RF tuner controls. These controls are described in

RF Tuner Control Reference

.

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 Generic Error Codes chapter.

EINVAL The struct v4l2_ext_control id is invalid, the struct v4l2_ext_controls which is invalid, or the struct v4l2_ext_control value was inappropriate (e.g. the given menu index is not supported by the driver). This error code is also returned by the VIDIOC_S_EXT_CTRLS and VIDIOC_TRY_EXT_CTRLS ioctls if two or more control values are in conflict.

ERANGE The struct v4l2_ext_control value is out of bounds.

EBUSY The control is temporarily not changeable, possibly because another applications took over control of the device function this control belongs to.

ENOSPC The space reserved for the control's payload is insufficient. The field size is set to a value that is enough to store the payload and this error code is returned.

EACCES Attempt to try or set a read-only control or to get a write-only control.

ioctl VIDIOC_G_FBUF, VIDIOC_S_FBUF

Name

VIDIOC_G_FBUF - VIDIOC_S_FBUF - Get or set frame buffer overlay parameters

222 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Synopsis

int ioctl(int fd, VIDIOC_G_FBUF, struct v4l2_framebuffer *argp) int ioctl(int fd, VIDIOC_S_FBUF, const struct v4l2_framebuffer *argp)

Arguments

fd File descriptor returned by open().

argp

Description

Applications can use the VIDIOC_G_FBUF and VIDIOC_S_FBUF ioctl to get and set the framebuffer parameters for a

Video Overlay

or

Video Output Overlay

(OSD). The type of overlay is implied by the device type

(capture or output device) and can be determined with the ioctl VIDIOC_QUERYCAP ioctl. One /dev/videoN device must not support both kinds of overlay.

The V4L2 API distinguishes destructive and non-destructive overlays. A destructive overlay copies captured video images into the video memory of a graphics card. A non-destructive overlay blends video images into a VGA signal or graphics into a video signal. Video Output Overlays are always non-destructive.

To get the current parameters applications call the VIDIOC_G_FBUF ioctl with a pointer to a struct v4l2_framebuffer structure. The driver fills all fields of the structure or returns an EINVAL error code when overlays are not supported.

To set the parameters for a Video Output Overlay, applications must initialize the flags field of a struct struct v4l2_framebuffer. Since the framebuffer is implemented on the TV card all other parameters are determined by the driver. When an application calls VIDIOC_S_FBUF with a pointer to this structure, the driver prepares for the overlay and returns the framebuffer parameters as VIDIOC_G_FBUF does, or it returns an error code.

To set the parameters for a non-destructive Video Overlay, applications must initialize the flags field, the fmt substructure, and call VIDIOC_S_FBUF. Again the driver prepares for the overlay and returns the framebuffer parameters as VIDIOC_G_FBUF does, or it returns an error code.

For a destructive Video Overlay applications must additionally provide a base address. Setting up a DMA to a random memory location can jeopardize the system security, its stability or even damage the hardware, therefore only the superuser can set the parameters for a destructive video overlay.

v4l2_framebuffer

Table 1.120: struct v4l2_framebuffer

__u32

__u32 void * capability flags base

Overlay capability flags set by the driver, see Frame Buffer Capability

Flags.

Overlay control flags set by application and driver, see Frame Buffer Flags

Physical base address of the framebuffer, that is the address of the pixel in the top left corner of the framebuffer.

61

Continued on next page

61

A physical base address may not suit all platforms. GK notes in theory we should pass something like PCI device + memory region + offset instead. If you encounter problems please discuss on the linux-media mailing list: https://linuxtv.org/lists.php

.

1.2. Part I - Video for Linux API 223

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

struct fmt

__u32

__u32

__u32 enum

__u32

Table 1.120 -- continued from previous page

This field is irrelevant to non-destructive

Video Overlays. For destructive Video

Overlays applications must provide a base address. The driver may accept only base addresses which are a multiple of two, four or eight bytes.

For

Video Output Overlays the driver must return a valid base address, so applications can find the corresponding Linux framebuffer device (see

Video Output

Overlay Interface

).

v4l2_field

width height pixelformat field bytesperline

Layout of the frame buffer.

Width of the frame buffer in pixels.

Height of the frame buffer in pixels.

The pixel format of the framebuffer.

For non-destructive Video Overlays this field only defines a format for the struct

v4l2_window

chromakey field.

For destructive Video Overlays applications must initialize this field. For Video

Output Overlays the driver must return a valid format.

Usually this is an RGB format (for example

V4L2_PIX_FMT_RGB565

) but

YUV formats (only packed YUV formats when chroma keying is used, not including V4L2_PIX_FMT_YUYV and V4L2_PIX_FMT_UYVY) and the

V4L2_PIX_FMT_PAL8 format are also permitted. The behavior of the driver when an application requests a compressed format is undefined.

See

Image Formats

for information on pixel formats.

Drivers and applications shall ignore this field.

If applicable, the field order is selected with the VIDIOC_S_FMT ioctl, using the field field of struct

v4l2_window .

Distance in bytes between the leftmost pixels in two adjacent lines.

This field is irrelevant to non-destructive Video Overlays. For destructive Video Overlays both applications and drivers can set this field to request padding bytes at the end of each line. Drivers however may ignore the requested value, returning width times bytes-per-pixel or a larger value required by the hardware. That implies applications can just set this field to zero to get a reasonable default. For Video Output Overlays the driver must return a valid value. Video hardware may access padding bytes, therefore they must reside in accessible memory. Consider for example the case where padding bytes after the last line of an image cross a system page boundary. Capture devices may write padding bytes, the value is undefined. Output devices ignore the contents of padding bytes. When the image format is planar the bytesperline value applies to the first plane and is divided by the same factor as the width field for the other planes. For example the Cb and Cr planes of a YUV 4:2:0 image have half as many padding bytes following each line as the Y plane. To avoid ambiguities drivers must return a bytesperline value rounded up to a multiple of the scale factor.

__u32 sizeimage This field is irrelevant to non-destructive

Video Overlays. For destructive Video

Overlays applications must initialize this field.

For Video Output Overlays the driver must return a valid format.

Together with base it defines the framebuffer memory accessible by the driver.

enum

v4l2_colorspace

__u32 colorspace priv

This information supplements the pixelformat and must be set by the driver, see

Colorspaces

.

Reserved.

Drivers and applications must set this field to zero.

224 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2_FBUF_CAP_CHROMAKEY

V4L2_FBUF_CAP_GLOBAL_ALPHA

Table 1.121: Frame Buffer Capability Flags

V4L2_FBUF_CAP_EXTERNOVERLAY

V4L2_FBUF_CAP_LIST_CLIPPING

V4L2_FBUF_CAP_BITMAP_CLIPPING

V4L2_FBUF_CAP_LOCAL_ALPHA

V4L2_FBUF_CAP_LOCAL_INV_ALPHA

V4L2_FBUF_CAP_SRC_CHROMAKEY

0x0001

0x0002

0x0004

0x0008

0x0010

0x0020

0x0040

0x0080

The device is capable of non-destructive overlays. When the driver clears this flag, only destructive overlays are supported. There are no drivers yet which support both destructive and non-destructive overlays. Video Output Overlays are in practice always non-destructive.

The device supports clipping by chroma-keying the images. That is, image pixels replace pixels in the VGA or video signal only where the latter assume a certain color. Chroma-keying makes no sense for destructive overlays.

The device supports clipping using a list of clip rectangles.

The device supports clipping using a bit mask.

The device supports clipping/blending using the alpha channel of the framebuffer or VGA signal.

Alpha blending makes no sense for destructive overlays.

The device supports alpha blending using a global alpha value. Alpha blending makes no sense for destructive overlays.

The device supports clipping/blending using the inverted alpha channel of the framebuffer or VGA signal. Alpha blending makes no sense for destructive overlays.

The device supports Source Chroma-keying.

Video pixels with the chroma-key colors are replaced by framebuffer pixels, which is exactly opposite of V4L2_FBUF_CAP_CHROMAKEY

V4L2_FBUF_FLAG_PRIMARY

V4L2_FBUF_FLAG_OVERLAY

Table 1.122: Frame Buffer Flags

0x0001

0x0002

The framebuffer is the primary graphics surface.

In other words, the overlay is destructive. This flag is typically set by any driver that doesn't have the V4L2_FBUF_CAP_EXTERNOVERLAY capability and it is cleared otherwise.

If this flag is set for a video capture device, then the driver will set the initial overlay size to cover the full framebuffer size, otherwise the existing overlay size (as set by VIDIOC_S_FMT) will be used. Only one video capture driver (bttv) supports this flag. The use of this flag for capture devices is deprecated. There is no way to detect which drivers support this flag, so the only reliable method of setting the overlay size is through

VIDIOC_S_FMT. If this flag is set for a video output device, then the video output overlay window is relative to the top-left corner of the framebuffer and restricted to the size of the framebuffer. If it is cleared, then the video output overlay window is relative to the video output display.

Continued on next page

1.2. Part I - Video for Linux API 225

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2_FBUF_FLAG_CHROMAKEY

Table 1.122 -- continued from previous page

0x0004 Use chroma-keying.

The chroma-key color is determined by the chromakey field of struct

v4l2_window

and negotiated with the VID-

IOC_S_FMT ioctl, see

Video Overlay Interface

and

Video Output Overlay Interface

.

There are no flags to enable clipping using a list of clip rectangles or a bitmap. These methods are negotiated with the VIDIOC_S_FMT ioctl, see

Video Overlay Interface

and

Video Output Overlay Interface

.

V4L2_FBUF_FLAG_LOCAL_ALPHA 0x0008 Use the alpha channel of the framebuffer to clip or blend framebuffer pixels with video images. The blend function is: output = framebuffer pixel * alpha + video pixel * (1 - alpha). The actual alpha depth depends on the framebuffer pixel format.

V4L2_FBUF_FLAG_GLOBAL_ALPHA 0x0010

V4L2_FBUF_FLAG_LOCAL_INV_ALPHA 0x0020

Use a global alpha value to blend the framebuffer with video images. The blend function is: output

= (framebuffer pixel * alpha + video pixel * (255

- alpha)) / 255. The alpha value is determined by the global_alpha field of struct

v4l2_window

and negotiated with the VIDIOC_S_FMT ioctl, see

Video Overlay Interface

and

Video Output Overlay

Interface

.

Like V4L2_FBUF_FLAG_LOCAL_ALPHA, use the alpha channel of the framebuffer to clip or blend framebuffer pixels with video images, but with an inverted alpha value. The blend function is: output = framebuffer pixel * (1 - alpha) + video pixel

* alpha. The actual alpha depth depends on the framebuffer pixel format.

V4L2_FBUF_FLAG_SRC_CHROMAKEY 0x0040 Use source chroma-keying. The source chromakey color is determined by the chromakey field of struct

v4l2_window

and negotiated with the VID-

IOC_S_FMT ioctl, see

Video Overlay Interface

and

Video Output Overlay Interface

.

Both chromakeying are mutual exclusive to each other, so same chromakey field of struct

v4l2_window

is being used.

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 Generic Error Codes chapter.

EPERM VIDIOC_S_FBUF can only be called by a privileged user to negotiate the parameters for a destructive overlay.

EINVAL The VIDIOC_S_FBUF parameters are unsuitable.

ioctl VIDIOC_G_FMT, VIDIOC_S_FMT, VIDIOC_TRY_FMT

Name

VIDIOC_G_FMT - VIDIOC_S_FMT - VIDIOC_TRY_FMT - Get or set the data format, try a format

Synopsis

int ioctl(int fd, VIDIOC_G_FMT, struct v4l2_format *argp)

226 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

int ioctl(int fd, VIDIOC_S_FMT, struct v4l2_format *argp) int ioctl(int fd, VIDIOC_TRY_FMT, struct v4l2_format *argp)

Arguments

fd File descriptor returned by open().

argp

Description

These ioctls are used to negotiate the format of data (typically image format) exchanged between driver and application.

To query the current parameters applications set the type field of a struct v4l2_format to the respective buffer (stream) type. For example video capture devices use V4L2_BUF_TYPE_VIDEO_CAPTURE or V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE. When the application calls the VIDIOC_G_FMT ioctl with a pointer to this structure the driver fills the respective member of the fmt union. In case of video capture devices that is either the struct

v4l2_pix_format

pix or the struct

v4l2_pix_format_mplane

pix_mp member. When the requested buffer type is not supported drivers return an EINVAL error code.

To change the current format parameters applications initialize the type field and all fields of the respective fmt union member. For details see the documentation of the various devices types in

Interfaces

. Good practice is to query the current parameters first, and to modify only those parameters not suitable for the application. When the application calls the VIDIOC_S_FMT ioctl with a pointer to a struct v4l2_format structure the driver checks and adjusts the parameters against hardware abilities. Drivers should not return an error code unless the type field is invalid, this is a mechanism to fathom device capabilities and to approach parameters acceptable for both the application and driver. On success the driver may program the hardware, allocate resources and generally prepare for data exchange. Finally the VIDIOC_S_FMT ioctl returns the current format parameters as VIDIOC_G_FMT does. Very simple, inflexible devices may even ignore all input and always return the default parameters. However all V4L2 devices exchanging data with the application must implement the VIDIOC_G_FMT and VIDIOC_S_FMT ioctl. When the requested buffer type is not supported drivers return an EINVAL error code on a VIDIOC_S_FMT attempt. When I/O is already in progress or the resource is not available for other reasons drivers return the EBUSY error code.

The VIDIOC_TRY_FMT ioctl is equivalent to VIDIOC_S_FMT with one exception: it does not change driver state. It can also be called at any time, never returning EBUSY. This function is provided to negotiate parameters, to learn about hardware limitations, without disabling I/O or possibly time consuming hardware preparations. Although strongly recommended drivers are not required to implement this ioctl.

The format as returned by VIDIOC_TRY_FMT must be identical to what VIDIOC_S_FMT returns for the same input or output.

v4l2_format

1.2. Part I - Video for Linux API 227

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

__u32 type union fmt

Table 1.123: struct v4l2_format

Type of the data stream, see

v4l2_buf_type

.

struct

v4l2_pix_format

pix struct

v4l2_pix_format_mplane

struct struct struct struct

__u8

v4l2_window

v4l2_vbi_format

v4l2_sliced_vbi_format

v4l2_sdr_format

pix_mp win vbi sliced sdr raw_data[200]

Definition of an image format, see

Image Formats

, used by video capture and output devices.

Definition of an image format, see

Image Formats

, used by video capture and output devices that support the

multi-planar version of the API

.

Definition of an overlaid image, see

Video Overlay

Interface

, used by video overlay devices.

Raw VBI capture or output parameters. This is discussed in more detail in

Raw VBI Data Interface

.

Used by raw VBI capture and output devices.

Sliced VBI capture or output parameters. See

Sliced

VBI Data Interface

for details. Used by sliced VBI capture and output devices.

Definition of a data format, see

Image Formats

, used by SDR capture and output devices.

Place holder for future extensions.

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 Generic Error Codes chapter.

EINVAL The struct v4l2_format type field is invalid or the requested buffer type not supported.

ioctl VIDIOC_G_FREQUENCY, VIDIOC_S_FREQUENCY

Name

VIDIOC_G_FREQUENCY - VIDIOC_S_FREQUENCY - Get or set tuner or modulator radio frequency

Synopsis

int ioctl(int fd, VIDIOC_G_FREQUENCY, struct v4l2_frequency *argp) int ioctl(int fd, VIDIOC_S_FREQUENCY, const struct v4l2_frequency *argp)

Arguments

fd File descriptor returned by open().

argp

Description

To get the current tuner or modulator radio frequency applications set the tuner field of a struct v4l2_frequency to the respective tuner or modulator number (only input devices have tuners, only output devices have modulators), zero out the reserved array and call the VIDIOC_G_FREQUENCY ioctl with a pointer to this structure. The driver stores the current frequency in the frequency field.

To change the current tuner or modulator radio frequency applications initialize the tuner, type and frequency fields, and the reserved array of a struct v4l2_frequency and call the VIDIOC_S_FREQUENCY

228 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

ioctl with a pointer to this structure. When the requested frequency is not possible the driver assumes the closest possible value. However VIDIOC_S_FREQUENCY is a write-only ioctl, it does not return the actual new frequency.

v4l2_frequency

__u32

__u32

__u32

__u32 tuner type

Table 1.124: struct v4l2_frequency frequency reserved[8]

The tuner or modulator index number. This is the same value as in the struct v4l2_input tuner field and the struct v4l2_tuner index field, or the struct v4l2_output modulator field and the struct v4l2_modulator index field.

The tuner type. This is the same value as in the struct v4l2_tuner type field. The type must be set to V4L2_TUNER_RADIO for /dev/radioX device nodes, and to V4L2_TUNER_ANALOG_TV for all others. Set this field to V4L2_TUNER_RADIO for modulators (currently only radio modulators are supported). See v4l2_tuner_type

Tuning frequency in units of 62.5 kHz, or if the struct v4l2_tuner or struct v4l2_modulator capability flag V4L2_TUNER_CAP_LOW is set, in units of 62.5 Hz. A 1 Hz unit is used when the capability flag V4L2_TUNER_CAP_1HZ is set.

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

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 Generic Error Codes chapter.

EINVAL The tuner index is out of bounds or the value in the type field is wrong.

EBUSY A hardware seek is in progress.

ioctl VIDIOC_G_INPUT, VIDIOC_S_INPUT

Name

VIDIOC_G_INPUT - VIDIOC_S_INPUT - Query or select the current video input

Synopsis

int ioctl(int fd, VIDIOC_G_INPUT, int *argp) int ioctl(int fd, VIDIOC_S_INPUT, int *argp)

Arguments

fd File descriptor returned by open().

argp

1.2. Part I - Video for Linux API 229

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Description

To query the current video input applications call the VIDIOC_G_INPUT ioctl with a pointer to an integer where the driver stores the number of the input, as in the struct v4l2_input index field. This ioctl will fail only when there are no video inputs, returning EINVAL.

To select a video input applications store the number of the desired input in an integer and call the VID-

IOC_S_INPUT ioctl with a pointer to this integer. Side effects are possible. For example inputs may support different video standards, so the driver may implicitly switch the current standard. Because of these possible side effects applications must select an input before querying or negotiating any other parameters.

Information about video inputs is available using the ioctl VIDIOC_ENUMINPUT ioctl.

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 Generic Error Codes chapter.

EINVAL The number of the video input is out of bounds.

ioctl VIDIOC_G_JPEGCOMP, VIDIOC_S_JPEGCOMP

Name

VIDIOC_G_JPEGCOMP - VIDIOC_S_JPEGCOMP

Synopsis

int ioctl(int fd, VIDIOC_G_JPEGCOMP, v4l2_jpegcompression *argp) int ioctl(int fd, VIDIOC_S_JPEGCOMP, const v4l2_jpegcompression *argp)

Arguments

fd File descriptor returned by open().

argp

Description

These ioctls are deprecated. New drivers and applications should use

JPEG class controls

for image quality and JPEG markers control.

[to do]

Ronald Bultje elaborates:

APP is some application-specific information. The application can set it itself, and it'll be stored in the

JPEG-encoded fields (eg; interlacing information for in an AVI or so). COM is the same, but it's comments, like `encoded by me' or so.

jpeg_markers describes whether the huffman tables, quantization tables and the restart interval information (all JPEG-specific stuff) should be stored in the JPEG-encoded fields. These define how the JPEG field is encoded. If you omit them, applications assume you've used standard encoding. You usually do want to add them.

v4l2_jpegcompression

230 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

int quality int int char

APPn

APP_len

APP_data[60] int char

COM_len

COM_data[60]

__u32 jpeg_markers

Table 1.125: struct v4l2_jpegcompression

Deprecated. If

V4L2_CID_JPEG_COMPRESSION_QUALITY

control is exposed by a driver applications should use it instead and ignore this field.

V4L2_JPEG_MARKER_DHT

V4L2_JPEG_MARKER_DQT

V4L2_JPEG_MARKER_DRI

V4L2_JPEG_MARKER_COM

V4L2_JPEG_MARKER_APP

See JPEG Markers Flags. Deprecated. If

V4L2_CID_JPEG_ACTIVE_MARKER

control is exposed by a driver applications should use it instead and ignore this field.

Table 1.126: JPEG Markers Flags

(1<<3)

(1<<4)

(1<<5)

(1<<6)

(1<<7)

Define Huffman Tables

Define Quantization Tables

Define Restart Interval

Comment segment

App segment, driver will always use APP0

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 Generic Error Codes chapter.

ioctl VIDIOC_G_MODULATOR, VIDIOC_S_MODULATOR

Name

VIDIOC_G_MODULATOR - VIDIOC_S_MODULATOR - Get or set modulator attributes

Synopsis

int ioctl(int fd, VIDIOC_G_MODULATOR, struct v4l2_modulator *argp) int ioctl(int fd, VIDIOC_S_MODULATOR, const struct v4l2_modulator *argp)

Arguments

fd File descriptor returned by open().

argp

Description

To query the attributes of a modulator applications initialize the index field and zero out the reserved array of a struct v4l2_modulator and call the VIDIOC_G_MODULATOR 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 modulators applications shall begin at index zero, incrementing by one until the driver returns EINVAL.

Modulators have two writable properties, an audio modulation set and the radio frequency. To change the modulated audio subprograms, applications initialize the index and txsubchans fields and the reserved array and call the VIDIOC_S_MODULATOR ioctl. Drivers may choose a different audio modulation

1.2. Part I - Video for Linux API 231

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

if the request cannot be satisfied. However this is a write-only ioctl, it does not return the actual audio modulation selected.

SDR

specific modulator types are V4L2_TUNER_SDR and V4L2_TUNER_RF. For SDR devices txsubchans field must be initialized to zero. The term `modulator' means SDR transmitter in this context.

To change the radio frequency the VIDIOC_S_FREQUENCY ioctl is available.

v4l2_modulator

__u32

__u8

__u32

__u32

__u32

__u32

__u32

__u32 index name[32] capability rangelow rangehigh txsubchans type reserved[3]

Table 1.127: struct v4l2_modulator

Identifies the modulator, set by the application.

Name of the modulator, a NUL-terminated ASCII string. This information is intended for the user.

Modulator capability flags. No flags are defined for this field, the tuner flags in struct v4l2_tuner are used accordingly. The audio flags indicate the ability to encode audio subprograms. They will not change for example with the current video standard.

The lowest tunable frequency in units of 62.5 KHz, or if the capability flag V4L2_TUNER_CAP_LOW is set, in units of 62.5 Hz, or if the capability flag V4L2_TUNER_CAP_1HZ is set, in units of 1 Hz.

The highest tunable frequency in units of 62.5 KHz, or if the capability flag V4L2_TUNER_CAP_LOW is set, in units of 62.5 Hz, or if the capability flag V4L2_TUNER_CAP_1HZ is set, in units of 1 Hz.

Note:

With this field applications can determine how audio sub-carriers shall be modulated. It contains a set of flags as defined in Modulator Audio Transmission Flags.

The tuner rxsubchans flags are reused, but the semantics are different. Video output devices are assumed to have an analog or PCM audio input with 1-3 channels. The txsubchans flags select one or more channels for modulation, together with some audio subprogram indicator, for example, a stereo pilot tone.

Type of the modulator, see v4l2_tuner_type.

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

232 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2_TUNER_SUB_MONO

V4L2_TUNER_SUB_STEREO

V4L2_TUNER_SUB_LANG1

V4L2_TUNER_SUB_LANG2

V4L2_TUNER_SUB_SAP

V4L2_TUNER_SUB_RDS

Table 1.128: Modulator Audio Transmission Flags

0x0001

0x0002

0x0008

0x0004

0x0004

0x0010

Modulate channel 1 as mono audio, when the input has more channels, a down-mix of channel 1 and 2.

This flag does not combine with V4L2_TUNER_SUB_STEREO or

V4L2_TUNER_SUB_LANG1.

Modulate channel 1 and 2 as left and right channel of a stereo audio signal.

When the input has only one channel or two channels and

V4L2_TUNER_SUB_SAP is also set, channel 1 is encoded as left and right channel.

This flag does not combine with V4L2_TUNER_SUB_MONO or

V4L2_TUNER_SUB_LANG1.

When the driver does not support stereo audio it shall fall back to mono.

Modulate channel 1 and 2 as primary and secondary language of a bilingual audio signal.

When the input has only one channel it is used for both languages.

It is not possible to encode the primary or secondary language only.

This flag does not combine with

V4L2_TUNER_SUB_MONO, V4L2_TUNER_SUB_STEREO or V4L2_TUNER_SUB_SAP. If the hardware does not support the respective audio matrix, or the current video standard does not permit bilingual audio the VIDIOC_S_MODULATOR ioctl shall return an

EINVAL error code and the driver shall fall back to mono or stereo mode.

Same effect as V4L2_TUNER_SUB_SAP.

When combined with V4L2_TUNER_SUB_MONO the first channel is encoded as mono audio, the last channel as Second Audio Program. When the input has only one channel it is used for both audio tracks. When the input has three channels the mono track is a down-mix of channel 1 and

2. When combined with V4L2_TUNER_SUB_STEREO channel 1 and 2 are encoded as left and right stereo audio, channel 3 as Second Audio Program.

When the input has only two channels, the first is encoded as left and right channel and the second as SAP. When the input has only one channel it is used for all audio tracks. It is not possible to encode a Second Audio Program only. This flag must combine with V4L2_TUNER_SUB_MONO or

V4L2_TUNER_SUB_STEREO. If the hardware does not support the respective audio matrix, or the current video standard does not permit SAP the

VIDIOC_S_MODULATOR ioctl shall return an EIN-

VAL error code and driver shall fall back to mono or stereo mode.

Enable the RDS encoder for a radio FM transmitter.

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 Generic Error Codes chapter.

1.2. Part I - Video for Linux API 233

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

EINVAL The struct v4l2_modulator index is out of bounds.

ioctl VIDIOC_G_OUTPUT, VIDIOC_S_OUTPUT

Name

VIDIOC_G_OUTPUT - VIDIOC_S_OUTPUT - Query or select the current video output

Synopsis

int ioctl(int fd, VIDIOC_G_OUTPUT, int *argp) int ioctl(int fd, VIDIOC_S_OUTPUT, int *argp)

Arguments

fd File descriptor returned by open().

argp

Description

To query the current video output applications call the VIDIOC_G_OUTPUT ioctl with a pointer to an integer where the driver stores the number of the output, as in the struct v4l2_output index field. This ioctl will fail only when there are no video outputs, returning the EINVAL error code.

To select a video output applications store the number of the desired output in an integer and call the

VIDIOC_S_OUTPUT ioctl with a pointer to this integer. Side effects are possible. For example outputs may support different video standards, so the driver may implicitly switch the current standard. standard.

Because of these possible side effects applications must select an output before querying or negotiating any other parameters.

Information about video outputs is available using the ioctl VIDIOC_ENUMOUTPUT ioctl.

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 Generic Error Codes chapter.

EINVAL The number of the video output is out of bounds, or there are no video outputs at all.

ioctl VIDIOC_G_PARM, VIDIOC_S_PARM

Name

VIDIOC_G_PARM - VIDIOC_S_PARM - Get or set streaming parameters

Synopsis

int ioctl(int fd, VIDIOC_G_PARM, v4l2_streamparm *argp) int ioctl(int fd, VIDIOC_S_PARM, v4l2_streamparm *argp)

234 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Arguments

fd File descriptor returned by open().

argp

Description

The current video standard determines a nominal number of frames per second. If less than this number of frames is to be captured or output, applications can request frame skipping or duplicating on the driver side. This is especially useful when using the read() or write(), which are not augmented by timestamps or sequence counters, and to avoid unnecessary data copying.

Further these ioctls can be used to determine the number of buffers used internally by a driver in read/write mode. For implications see the section discussing the read() function.

To get and set the streaming parameters applications call the VIDIOC_G_PARM and VIDIOC_S_PARM ioctl, respectively. They take a pointer to a struct v4l2_streamparm which contains a union holding separate parameters for input and output devices.

v4l2_streamparm

__u32 union type

Table 1.129: struct v4l2_streamparm

The buffer (stream) type, same as struct v4l2_format type, set by the application. See

v4l2_buf_type

parm struct v4l2_captureparm capture struct v4l2_outputparm

__u8 output raw_data[200]

Parameters vices, used for capture when type

V4L2_BUF_TYPE_VIDEO_CAPTURE.

Parameters for output vices, used when type

V4L2_BUF_TYPE_VIDEO_OUTPUT.

A place holder for future extensions.

deis deis

v4l2_captureparm

1.2. Part I - Video for Linux API 235

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

__u32

__u32 struct v4l2_fract

__u32

__u32

__u32

v4l2_outputparm

Table 1.130: struct v4l2_captureparm capability capturemode timeperframe extendedmode readbuffers reserved[4]

See Streaming Parameters Capabilites.

Set by drivers and applications, see Capture Pa-

rameters Flags.

This is the desired period between successive frames captured by the driver, in seconds. The field is intended to skip frames on the driver side, saving I/O bandwidth.

Applications store here the desired frame period, drivers return the actual frame period, which must be greater or equal to the nominal frame period determined by the current video standard (struct v4l2_standard frameperiod field). Changing the video standard (also implicitly by switching the video input) may reset this parameter to the nominal frame period. To reset manually applications can just set this field to zero.

Drivers support this function only when they set the V4L2_CAP_TIMEPERFRAME flag in the capability field.

Custom (driver specific) streaming parameters.

When unused, applications and drivers must set this field to zero.

Applications using this field should check the driver name and version, see

Querying Capabilities

.

Applications set this field to the desired number of buffers used internally by the driver in

read() mode. Drivers return the actual number of buffers.

When an application requests zero buffers, drivers should just return the current setting rather than the minimum or an error code.

For details see

Read/Write

.

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

236 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Table 1.131: struct v4l2_outputparm

__u32

__u32 capability outputmode struct v4l2_fract timeperframe This is the desired period between successive frames output by the driver, in seconds.

The field is intended to repeat frames on the driver side in write() mode (in streaming mode timestamps can be used to throttle the output), saving I/O bandwidth. Applications store here the desired frame period, drivers return the actual frame period, which must be greater or equal to the nominal frame period determined by the current video standard (struct v4l2_standard frameperiod field). Changing the video standard (also implicitly by switching the video output) may reset this parameter to the nominal frame period. To reset manually applications can just set this field to zero. Drivers support this function only when they set the V4L2_CAP_TIMEPERFRAME flag in the capability field.

__u32 extendedmode

See Streaming Parameters Capabilites.

Set by drivers and applications, see Capture Pa-

rameters Flags.

Custom (driver specific) streaming parameters.

When unused, applications and drivers must set this field to zero.

Applications using this field should check the driver name and version, see

Querying Capabilities

.

__u32

__u32 writebuffers reserved[4]

Applications set this field to the desired number of buffers used internally by the driver in

write() mode. Drivers return the actual number of buffers.

When an application requests zero buffers, drivers should just return the current setting rather than the minimum or an error code.

For details see

Read/Write

.

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

V4L2_CAP_TIMEPERFRAME

V4L2_MODE_HIGHQUALITY

Table 1.132: Streaming Parameters Capabilites

0x1000 The frame skipping/repeating controlled by the timeperframe field is supported.

Table 1.133: Capture Parameters Flags

0x0001 High quality imaging mode. High quality mode is intended for still imaging applications.

The idea is to get the best possible image quality that the hardware can deliver. It is not defined how the driver writer may achieve that; it will depend on the hardware and the ingenuity of the driver writer. High quality mode is a different mode from the regular motion video capture modes. In high quality mode:

• The driver may be able to capture higher resolutions than for motion capture.

• The driver may support fewer pixel formats than motion capture (eg; true color).

• The driver may capture and arithmetically combine multiple successive fields or frames to remove color edge artifacts and reduce the noise in the video data.

• The driver may capture images in slices like a scanner in order to handle larger format images than would otherwise be possible.

• An image capture operation may be significantly slower than motion capture.

• Moving objects in the image might have excessive motion blur.

• Capture might only work through the read() call.

1.2. Part I - Video for Linux API 237

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

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 Generic Error Codes chapter.

ioctl VIDIOC_G_PRIORITY, VIDIOC_S_PRIORITY

Name

VIDIOC_G_PRIORITY - VIDIOC_S_PRIORITY - Query or request the access priority associated with a file descriptor

Synopsis

int ioctl(int fd, VIDIOC_G_PRIORITY, enum v4l2_priority *argp) int ioctl(int fd, VIDIOC_S_PRIORITY, const enum v4l2_priority *argp)

Arguments

fd File descriptor returned by open().

argp Pointer to an enum v4l2_priority type.

Description

To query the current access priority applications call the VIDIOC_G_PRIORITY ioctl with a pointer to an enum v4l2_priority variable where the driver stores the current priority.

To request an access priority applications store the desired priority in an enum v4l2_priority variable and call VIDIOC_S_PRIORITY ioctl with a pointer to this variable.

v4l2_priority

V4L2_PRIORITY_UNSET

V4L2_PRIORITY_BACKGROUND

V4L2_PRIORITY_INTERACTIVE

V4L2_PRIORITY_DEFAULT

V4L2_PRIORITY_RECORD

Table 1.134: enum v4l2_priority

0

1 Lowest priority, usually applications running in background, for example monitoring VBI transmissions.

A proxy application running in user space will be necessary if multiple applications want to read from a device at this priority.

2

2

3

Medium priority, usually applications started and interactively controlled by the user. For example

TV viewers, Teletext browsers, or just ``panel'' applications to change the channel or video controls.

This is the default priority unless an application requests another.

Highest priority. Only one file descriptor can have this priority, it blocks any other fd from changing device properties. Usually applications which must not be interrupted, like video recording.

238 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

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 Generic Error Codes chapter.

EINVAL The requested priority value is invalid.

EBUSY Another application already requested higher priority.

ioctl VIDIOC_G_SELECTION, VIDIOC_S_SELECTION

Name

VIDIOC_G_SELECTION - VIDIOC_S_SELECTION - Get or set one of the selection rectangles

Synopsis

int ioctl(int fd, VIDIOC_G_SELECTION, struct v4l2_selection *argp) int ioctl(int fd, VIDIOC_S_SELECTION, struct v4l2_selection *argp)

Arguments

fd File descriptor returned by open().

request VIDIOC_G_SELECTION, VIDIOC_S_SELECTION argp

Description

The ioctls are used to query and configure selection rectangles.

To query the cropping (composing) rectangle set struct v4l2_selection type field to the respective buffer type.

Do not use the multiplanar buffer types.

Use V4L2_BUF_TYPE_VIDEO_CAPTURE instead of V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE and use V4L2_BUF_TYPE_VIDEO_OUTPUT instead of

V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE. The next step is setting the value of struct v4l2_selection target field to V4L2_SEL_TGT_CROP (V4L2_SEL_TGT_COMPOSE). Please refer to table Common selection defi-

nitions or

API for cropping, composing and scaling

for additional targets. The flags and reserved fields of struct v4l2_selection are ignored and they must be filled with zeros. The driver fills the rest of the structure or returns EINVAL error code if incorrect buffer type or target was used. If cropping (composing) is not supported then the active rectangle is not mutable and it is always equal to the bounds rectangle.

Finally, the struct

v4l2_rect

r rectangle is filled with the current cropping (composing) coordinates. The coordinates are expressed in driver-dependent units. The only exception are rectangles for images in raw formats, whose coordinates are always expressed in pixels.

To change the cropping (composing) rectangle set the struct v4l2_selection type field to the respective buffer type.

Do not use multiplanar buffers.

Use V4L2_BUF_TYPE_VIDEO_CAPTURE instead of V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE. Use V4L2_BUF_TYPE_VIDEO_OUTPUT instead of

V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE. The next step is setting the value of struct v4l2_selection target to V4L2_SEL_TGT_CROP (V4L2_SEL_TGT_COMPOSE). Please refer to table Common selection definitions or

API for cropping, composing and scaling

for additional targets. The struct

v4l2_rect

r rectangle need to be set to the desired active area. Field struct v4l2_selection reserved is ignored and must be filled with zeros. The driver may adjust coordinates of the requested rectangle. An application may introduce constraints to control rounding behaviour. The struct v4l2_selection flags field must be set to one of the following:

1.2. Part I - Video for Linux API 239

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

• 0 - The driver can adjust the rectangle size freely and shall choose a crop/compose rectangle as close as possible to the requested one.

• V4L2_SEL_FLAG_GE - The driver is not allowed to shrink the rectangle. The original rectangle must lay inside the adjusted one.

• V4L2_SEL_FLAG_LE - The driver is not allowed to enlarge the rectangle. The adjusted rectangle must lay inside the original one.

• V4L2_SEL_FLAG_GE | V4L2_SEL_FLAG_LE - The driver must choose the size exactly the same as in the requested rectangle.

Please refer to Size adjustments with constraint flags..

The driver may have to adjusts the requested dimensions against hardware limits and other parts as the pipeline, i.e. the bounds given by the capture/output window or TV display. The closest possible values of horizontal and vertical offset and sizes are chosen according to following priority:

1. Satisfy constraints from struct v4l2_selection flags.

2. Adjust width, height, left, and top to hardware limits and alignments.

3. Keep center of adjusted rectangle as close as possible to the original one.

4. Keep width and height as close as possible to original ones.

5. Keep horizontal and vertical offset as close as possible to original ones.

On success the struct

v4l2_rect

r field contains the adjusted rectangle. When the parameters are unsuitable the application may modify the cropping (composing) or image parameters and repeat the cycle until satisfactory parameters have been negotiated. If constraints flags have to be violated at then ERANGE is returned. The error indicates that there exist no rectangle that satisfies the constraints.

Selection targets and flags are documented in Common selection definitions.

Figure 1.14: Size adjustments with constraint flags.

Behaviour of rectangle adjustment for different constraint flags.

v4l2_selection

__u32

__u32

__u32 struct

__u32

v4l2_rect

type target flags r

Table 1.135: struct v4l2_selection reserved[9]

Type of the buffer (from enum

v4l2_buf_type

).

Used to select between cropping and composing

rectangles.

Flags controlling the selection rectangle adjustments, refer to selection flags.

The selection rectangle.

Reserved fields for future use. Drivers and applications must zero this array.

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 Generic Error Codes chapter.

EINVAL Given buffer type type or the selection target target is not supported, or the flags argument is not valid.

ERANGE It is not possible to adjust struct

v4l2_rect

r rectangle to satisfy all constraints given in the flags argument.

ENODATA Selection is not supported for this input or output.

240 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

EBUSY It is not possible to apply change of the selection rectangle at the moment. Usually because streaming is in progress.

ioctl VIDIOC_G_SLICED_VBI_CAP

Name

VIDIOC_G_SLICED_VBI_CAP - Query sliced VBI capabilities

Synopsis

int ioctl(int fd, VIDIOC_G_SLICED_VBI_CAP, struct v4l2_sliced_vbi_cap *argp)

Arguments

fd File descriptor returned by open().

argp

Description

To find out which data services are supported by a sliced VBI capture or output device, applications initialize the type field of a struct v4l2_sliced_vbi_cap, clear the reserved array and call the VID-

IOC_G_SLICED_VBI_CAP ioctl. The driver fills in the remaining fields or returns an EINVAL error code if the sliced VBI API is unsupported or type is invalid.

Note:

The type field was added, and the ioctl changed from read-only to write-read, in Linux 2.6.19.

v4l2_sliced_vbi_cap

__u16 service_set

__u16 service_lines[2][24]

__u32

__u32 type reserved[3]

Table 1.136: struct v4l2_sliced_vbi_cap

A set of all data services supported by the driver. Equal to the union of all elements of the service_lines array.

Each element of this array contains a set of data services the hardware can look for or insert into a particular scan line. Data services are defined in Sliced VBI services. Array indices map to ITU-R line numbers

62

Element 525 line systems 625 line systems service_lines[0][1] 1 service_lines[0][23] 23 service_lines[1][1] 264 service_lines[1][23] 286

1

23

314

336 as follows:

The number of VBI lines the hardware can capture or output per frame, or the number of services it can identify on a given line may be limited. For example on PAL line 16 the hardware may be able to look for a VPS or Teletext signal, but not both at the same time. Applications can learn about these limits using the VIDIOC_S_FMT ioctl as described in

Sliced VBI Data Interface

.

Drivers must set service_lines [0][0] and service_lines[1][0] to zero.

Type of the data stream, see

v4l2_buf_type . Should be V4L2_BUF_TYPE_SLICED_VBI_CAPTURE or V4L2_BUF_TYPE_SLICED_VBI_OUTPUT.

This array is reserved for future extensions. Applications and drivers must set it to zero.

1.2. Part I - Video for Linux API 241

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Symbol

V4L2_SLICED_TELETEXT_B

(Teletext System B)

V4L2_SLICED_VPS

V4L2_SLICED_CAPTION_525

V4L2_SLICED_WSS_625

Value Reference

0x0001 ETS 300 706,

ITU BT.653

0x0400

0x1000

0x4000

Table 1.137: Sliced VBI services

ETS 300 231

CEA 608-E

EN 300 294,

ITU BT.1119

Lines, usually Payload

PAL/SECAM line 7-22,

320-335 (second field

7-22)

PAL line 16

NTSC line 21,

284 (second field 21)

PAL/SECAM line 23

Last 42 of the 45 byte Teletext packet, that is without clock run-in and framing code, lsb first transmitted.

Byte number 3 to 15 according to Figure 9 of ETS

300 231, lsb first transmitted.

Two bytes in transmission order, including parity bit, lsb first transmitted.

Byte 0 1 msb lsb msb lsb

Bit 7 6 5 4 3 2 1 0 x x 13 12 11 10 9

V4L2_SLICED_VBI_525

V4L2_SLICED_VBI_625

0x1000 Set of services applicable to 525 line systems.

0x4401 Set of services applicable to 625 line systems.

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 Generic Error Codes chapter.

EINVAL The value in the type field is wrong.

ioctl VIDIOC_G_STD, VIDIOC_S_STD

Name

VIDIOC_G_STD - VIDIOC_S_STD - Query or select the video standard of the current input

Synopsis

int ioctl(int fd, VIDIOC_G_STD, v4l2_std_id *argp) int ioctl(int fd, VIDIOC_S_STD, const v4l2_std_id *argp)

Arguments

fd File descriptor returned by open().

argp

Description

To query and select the current video standard applications use the VIDIOC_G_STD and VIDIOC_S_STD ioctls which take a pointer to a v4l2_std_id type as argument. VIDIOC_G_STD can return a single flag or a set of flags as in struct v4l2_standard field id. The flags must be unambiguous such that they appear in only one enumerated struct v4l2_standard structure.

VIDIOC_S_STD accepts one or more flags, being a write-only ioctl it does not return the actual new standard as VIDIOC_G_STD does. When no flags are given or the current input does not support the requested standard the driver returns an EINVAL error code. When the standard set is ambiguous drivers may return

EINVAL or choose any of the requested standards. If the current input or output does not support standard

242 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

video timings (e.g. if ioctl VIDIOC_ENUMINPUT does not set the V4L2_IN_CAP_STD flag), then ENODATA error code is returned.

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 Generic Error Codes chapter.

EINVAL The VIDIOC_S_STD parameter was unsuitable.

ENODATA Standard video timings are not supported for this input or output.

ioctl VIDIOC_G_TUNER, VIDIOC_S_TUNER

Name

VIDIOC_G_TUNER - VIDIOC_S_TUNER - Get or set tuner attributes

Synopsis

int ioctl(int fd, VIDIOC_G_TUNER, struct v4l2_tuner *argp) int ioctl(int fd, VIDIOC_S_TUNER, const struct v4l2_tuner *argp)

Arguments

fd File descriptor returned by open().

argp

Description

To query the attributes of a tuner applications initialize the index field and zero out the reserved array of a struct v4l2_tuner and call the VIDIOC_G_TUNER 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 tuners applications shall begin at index zero, incrementing by one until the driver returns EINVAL.

Tuners have two writable properties, the audio mode and the radio frequency. To change the audio mode, applications initialize the index, audmode and reserved fields and call the VIDIOC_S_TUNER ioctl. This will not change the current tuner, which is determined by the current video input. Drivers may choose a different audio mode if the requested mode is invalid or unsupported. Since this is a write-only ioctl, it does not return the actually selected audio mode.

SDR

specific tuner types are V4L2_TUNER_SDR and V4L2_TUNER_RF. For SDR devices audmode field must be initialized to zero. The term `tuner' means SDR receiver in this context.

To change the radio frequency the VIDIOC_S_FREQUENCY ioctl is available.

v4l2_tuner

__u32

__u8

__u32 index name[32] type

Table 1.138: struct v4l2_tuner

Identifies the tuner, set by the application.

Name of the tuner, a NUL-terminated ASCII string. This information is intended for the user.

Type of the tuner, see v4l2_tuner_type.

Continued on next page

1.2. Part I - Video for Linux API 243

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

__u32

__u32

__u32

__u32

__u32

__u32

__s32

__u32 capability rangelow rangehigh rxsubchans audmode signal afc reserved[4]

Table 1.138 -- continued from previous page

Tuner capability flags, see Tuner and Modulator Capability Flags. Audio flags indicate the ability to decode audio subprograms. They will not change, for example with the current video standard. When the structure refers to a radio tuner the V4L2_TUNER_CAP_LANG1, V4L2_TUNER_CAP_LANG2 and V4L2_TUNER_CAP_NORM flags can't be used. If multiple frequency bands are supported, then capability is the union of all capability fields of each struct v4l2_frequency_band.

The lowest tunable frequency in units of 62.5 kHz, or if the capability flag V4L2_TUNER_CAP_LOW is set, in units of 62.5 Hz, or if the capability flag V4L2_TUNER_CAP_1HZ is set, in units of 1 Hz. If multiple frequency bands are supported, then rangelow is the lowest frequency of all the frequency bands.

The highest tunable frequency in units of 62.5 kHz, or if the capability flag V4L2_TUNER_CAP_LOW is set, in units of 62.5 Hz, or if the capability flag V4L2_TUNER_CAP_1HZ is set, in units of 1 Hz. If multiple frequency bands are supported, then rangehigh is the highest frequency of all the frequency bands.

Some tuners or audio decoders can determine the received audio subprograms by analyzing audio carriers, pilot tones or other indicators. To pass this information drivers set flags defined in Tuner Audio Reception Flags in this field. For example:

V4L2_TUNER_SUB_MONO

STEREO | SAP receiving mono audio receiving stereo audio and a secondary audio program

MONO | STEREO

LANG1 | LANG2 receiving mono or stereo audio, the hardware cannot distinguish receiving bilingual audio

MONO | STEREO | LANG1 | LANG2 receiving mono, stereo or bilingual audio

When the V4L2_TUNER_CAP_STEREO, _LANG1, _LANG2 or _SAP flag is cleared in the capability field, the corresponding V4L2_TUNER_SUB_ flag must not be set here. This field is valid only if this is the tuner of the current video input, or when the structure refers to a radio tuner.

The selected audio mode, see Tuner Audio Modes for valid values. The audio mode does not affect audio subprogram detection, and like a

User Controls

it does not automatically change unless the requested mode is invalid or unsupported. See Tuner Audio Matrix for possible results when the selected and received audio programs do not match. Currently this is the only field of struct struct v4l2_tuner applications can change.

The signal strength if known. Ranging from 0 to 65535. Higher values indicate a better signal.

Automatic frequency control. When the afc value is negative, the frequency is too low, when positive too high.

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

v4l2_tuner_type

V4L2_TUNER_RADIO

V4L2_TUNER_ANALOG_TV

V4L2_TUNER_SDR

V4L2_TUNER_RF

Table 1.139: enum v4l2_tuner_type

1

2

4

5

Tuner supports radio

Tuner supports analog TV

Tuner controls the A/D and/or D/A block of a Software Digital Radio (SDR)

Tuner controls the RF part of a Software Digital Radio (SDR)

V4L2_TUNER_CAP_LOW

V4L2_TUNER_CAP_NORM

V4L2_TUNER_CAP_STEREO

Table 1.140: Tuner and Modulator Capability Flags

V4L2_TUNER_CAP_HWSEEK_BOUNDED

V4L2_TUNER_CAP_HWSEEK_WRAP

0x0001

0x0002

0x0004

0x0008

0x0010

When set, tuning frequencies are expressed in units of 62.5 Hz instead of 62.5 kHz.

This is a multi-standard tuner; the video standard can or must be switched. (B/G PAL tuners for example are typically not considered multi-standard because the video standard is automatically determined from the frequency band.) The set of supported video standards is available from the struct v4l2_input pointing to this tuner, see the description of ioctl ioctl VIDIOC_ENUMINPUT for details. Only V4L2_TUNER_ANALOG_TV tuners can have this capability.

If set, then this tuner supports the hardware seek functionality where the seek stops when it reaches the end of the frequency range.

If set, then this tuner supports the hardware seek functionality where the seek wraps around when it reaches the end of the frequency range.

Stereo audio reception is supported.

Continued on next page

244 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2_TUNER_CAP_LANG1

V4L2_TUNER_CAP_LANG2

V4L2_TUNER_CAP_SAP

V4L2_TUNER_CAP_RDS

V4L2_TUNER_CAP_RDS_BLOCK_IO

V4L2_TUNER_CAP_RDS_CONTROLS

V4L2_TUNER_CAP_FREQ_BANDS

V4L2_TUNER_CAP_HWSEEK_PROG_LIM

V4L2_TUNER_CAP_1HZ

Table 1.140 -- continued from previous page

0x0040 Reception of the primary language of a bilingual audio program is supported.

Bilingual audio is a feature of two-channel systems, transmitting the primary language monaural on the main audio carrier and a secondary language monaural on a second carrier. Only V4L2_TUNER_ANALOG_TV tuners can have this capability.

0x0020

0x0020

Reception of the secondary language of a bilingual audio program is supported.

Only

V4L2_TUNER_ANALOG_TV tuners can have this capability.

Reception of a secondary audio program is supported. This is a feature of the BTSC system which accompanies the NTSC video standard. Two audio carriers are available for mono or stereo transmissions of a primary language, and an independent third carrier for a monaural secondary language.

Only V4L2_TUNER_ANALOG_TV tuners can have this capability.

Note:

The V4L2_TUNER_CAP_LANG2 and

V4L2_TUNER_CAP_SAP flags are synonyms.

V4L2_TUNER_CAP_SAP applies when the tuner supports the V4L2_STD_NTSC_M video standard.

0x0080

0x0100

0x0200

0x0400

0x0800

0x1000

RDS capture is supported. This capability is only valid for radio tuners.

The RDS data is passed as unparsed RDS blocks.

The RDS data is parsed by the hardware and set via controls.

The ioctl VIDIOC_ENUM_FREQ_BANDS ioctl can be used to enumerate the available frequency bands.

The range to search when using the hardware seek functionality is programmable, see ioctl VID-

IOC_S_HW_FREQ_SEEK for details.

When set, tuning frequencies are expressed in units of 1 Hz instead of 62.5 kHz.

1.2. Part I - Video for Linux API 245

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2_TUNER_SUB_MONO

V4L2_TUNER_SUB_STEREO

V4L2_TUNER_SUB_LANG1

V4L2_TUNER_SUB_LANG2

V4L2_TUNER_SUB_SAP

V4L2_TUNER_SUB_RDS

Table 1.141: Tuner Audio Reception Flags

0x0001

0x0002

0x0008

0x0004

0x0004

The tuner receives a mono audio signal.

The tuner receives a stereo audio signal.

The tuner receives the primary language of a bilingual audio signal.

Drivers must clear this flag when the current video standard is

V4L2_STD_NTSC_M.

The tuner receives the secondary language of a bilingual audio signal (or a second audio program).

The tuner receives a Second Audio Program.

Note:

The V4L2_TUNER_SUB_LANG2

V4L2_TUNER_SUB_SAP flags are onyms.

The V4L2_TUNER_SUB_SAP flag applies when the current video standard is V4L2_STD_NTSC_M.

and syn-

0x0010 The tuner receives an RDS channel.

246 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2_TUNER_MODE_MONO

V4L2_TUNER_MODE_STEREO

V4L2_TUNER_MODE_LANG1

V4L2_TUNER_MODE_LANG2

V4L2_TUNER_MODE_SAP

Table 1.142: Tuner Audio Modes

0

1

3

2

2

Play mono audio.

stereo signal this a down-mix of the left and right channel.

When the tuner receives a bilingual or SAP signal this mode selects the primary language.

Play stereo audio. When the tuner receives bilingual audio it may play different languages on the left and right channel or the primary language is played on both channels.

Playing different languages in this mode is deprecated.

New drivers should do this only in

MODE_LANG1_LANG2.

When the tuner receives no stereo signal or does not support stereo reception the driver shall fall back to MODE_MONO.

Play the primary language, mono or stereo.

Only V4L2_TUNER_ANALOG_TV tuners support this mode.

Play the secondary language, mono.

When the tuner receives no bilingual audio or SAP, or their reception is not supported the driver shall fall back to mono or stereo mode.

Only

V4L2_TUNER_ANALOG_TV tuners support this mode.

Play the Second Audio Program.

When the tuner receives no bilingual audio or SAP, or their reception is not supported the driver shall fall back to mono or stereo mode.

Only

V4L2_TUNER_ANALOG_TV tuners support this mode.

Note:

When the tuner receives a

The V4L2_TUNER_MODE_LANG2

V4L2_TUNER_MODE_SAP are synonyms.

and

V4L2_TUNER_MODE_LANG1_LANG2

Received

V4L2_TUNER_SUB_

MONO

MONO | SAP

STEREO

Selected V4L2_TUNER_MODE_

MONO

Mono

Mono

L+R

STEREO

Mono/Mono

Mono/Mono

L/R

STEREO | SAP

LANG1 | LANG2

L+R L/R

Language

1

Lang1/Lang2 (deprecated

65

) or Lang1/Lang1

4 Play the primary language on the left channel, the secondary language on the right channel.

When the tuner receives no bilingual audio or

SAP, it shall fall back to MODE_LANG1 or MODE_MONO.

Only V4L2_TUNER_ANALOG_TV tuners support this mode.

Table 1.143: Tuner Audio Matrix

LANG1

Mono

Mono

Stereo L/R

(preferred) or Mono

L+R

Stereo L/R

(preferred) or Mono

L+R

Language 1

LANG2 = SAP

Mono

SAP

Stereo L/R

(preferred) or Mono

L+R

SAP

Language 2

LANG1_LANG2

64

Mono/Mono

Mono/SAP (preferred) or Mono/Mono

L/R (preferred) or L+R/L+R

L+R/SAP (preferred) or L/R or L+R/L+R

Lang1/Lang2 (preferred) or Lang1/Lang1

1.2. Part I - Video for Linux API 247

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

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 Generic Error Codes chapter.

EINVAL The struct v4l2_tuner index is out of bounds.

ioctl VIDIOC_LOG_STATUS

Name

VIDIOC_LOG_STATUS - Log driver status information

Synopsis

int ioctl(int fd, VIDIOC_LOG_STATUS)

Arguments

fd File descriptor returned by open().

Description

As the video/audio devices become more complicated it becomes harder to debug problems. When this ioctl is called the driver will output the current device status to the kernel log. This is particular useful when dealing with problems like no sound, no video and incorrectly tuned channels. Also many modern devices autodetect video and audio standards and this ioctl will report what the device thinks what the standard is. Mismatches may give an indication where the problem is.

This ioctl is optional and not all drivers support it. It was introduced in Linux 2.6.15.

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 Generic Error Codes chapter.

ioctl VIDIOC_OVERLAY

Name

VIDIOC_OVERLAY - Start or stop video overlay

Synopsis

int ioctl(int fd, VIDIOC_OVERLAY, const int *argp)

Arguments

fd File descriptor returned by open().

argp

248 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Description

This ioctl is part of the

video overlay

I/O method. Applications call ioctl VIDIOC_OVERLAY to start or stop the overlay. It takes a pointer to an integer which must be set to zero by the application to stop overlay, to one to start.

Drivers do not support ioctl VIDIOC_STREAMON, VIDIOC_STREAMOFF or VIDIOC_STREAMOFF with

V4L2_BUF_TYPE_VIDEO_OVERLAY.

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 Generic Error Codes chapter.

EINVAL The overlay parameters have not been set up. See

Video Overlay Interface

for the necessary steps.

ioctl VIDIOC_PREPARE_BUF

Name

VIDIOC_PREPARE_BUF - Prepare a buffer for I/O

Synopsis

int ioctl(int fd, VIDIOC_PREPARE_BUF, struct

v4l2_buffer  *argp)

Arguments

fd File descriptor returned by open().

argp

Description

Applications can optionally call the ioctl VIDIOC_PREPARE_BUF ioctl to pass ownership of the buffer to the driver before actually enqueuing it, using the ioctl VIDIOC_QBUF, VIDIOC_DQBUF ioctl, and to prepare it for future I/O. Such preparations may include cache invalidation or cleaning. Performing them in advance saves time during the actual I/O. In case such cache operations are not required, the application can use one of V4L2_BUF_FLAG_NO_CACHE_INVALIDATE and V4L2_BUF_FLAG_NO_CACHE_CLEAN flags to skip the respective step.

The struct

v4l2_buffer

structure is specified in

Buffers

.

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 Generic Error Codes chapter.

EBUSY File I/O is in progress.

EINVAL The buffer type is not supported, or the index is out of bounds, or no buffers have been allocated yet, or the userptr or length are invalid.

1.2. Part I - Video for Linux API 249

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d ioctl VIDIOC_QBUF, VIDIOC_DQBUF

Name

VIDIOC_QBUF - VIDIOC_DQBUF - Exchange a buffer with the driver

Synopsis

int ioctl(int fd, VIDIOC_QBUF, struct

v4l2_buffer

 *argp) int ioctl(int fd, VIDIOC_DQBUF, struct

v4l2_buffer  *argp)

Arguments

fd File descriptor returned by open().

argp

Description

Applications call the VIDIOC_QBUF ioctl to enqueue an empty (capturing) or filled (output) buffer in the driver's incoming queue. The semantics depend on the selected I/O method.

To enqueue a buffer applications set the type field of a struct

v4l2_buffer

to the same buffer type as was previously used with struct v4l2_format type and struct v4l2_requestbuffers type. Applications must also set the index field. Valid index numbers range from zero to the number of buffers allocated with ioctl VIDIOC_REQBUFS (struct v4l2_requestbuffers count) minus one. The contents of the struct

v4l2_buffer

returned by a ioctl VIDIOC_QUERYBUF ioctl will do as well. When the buffer is intended for output (type is V4L2_BUF_TYPE_VIDEO_OUTPUT, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE, or

V4L2_BUF_TYPE_VBI_OUTPUT) applications must also initialize the bytesused, field and timestamp fields, see

Buffers

for details. Applications must also set flags to 0. The reserved2 and reserved fields must be set to 0. When using the

multi-planar API

, the m.planes field must contain a userspace pointer to a filled-in array of struct

v4l2_plane

and the length field must be set to the number of elements in that array.

To enqueue a

memory mapped

buffer applications set the memory field to V4L2_MEMORY_MMAP. When

VIDIOC_QBUF is called with a pointer to this structure the driver sets the V4L2_BUF_FLAG_MAPPED and

V4L2_BUF_FLAG_QUEUED flags and clears the V4L2_BUF_FLAG_DONE flag in the flags field, or it returns an

EINVAL error code.

To enqueue a

user pointer

buffer applications set the memory field to V4L2_MEMORY_USERPTR, the m.userptr field to the address of the buffer and length to its size. When the multi-planar API is used, m.userptr and length members of the passed array of struct

v4l2_plane

have to be used instead. When

VIDIOC_QBUF is called with a pointer to this structure the driver sets the V4L2_BUF_FLAG_QUEUED flag and clears the V4L2_BUF_FLAG_MAPPED and V4L2_BUF_FLAG_DONE flags in the flags field, or it returns an error code. This ioctl locks the memory pages of the buffer in physical memory, they cannot be swapped out to disk. Buffers remain locked until dequeued, until the VIDIOC_STREAMOFF or ioctl VIDIOC_REQBUFS ioctl is called, or until the device is closed.

To enqueue a

DMABUF

buffer applications set the memory field to V4L2_MEMORY_DMABUF and the m.fd field to a file descriptor associated with a DMABUF buffer. When the multi-planar API is used the m.fd fields of the passed array of struct

v4l2_plane

have to be used instead. When VIDIOC_QBUF is called with a pointer to this structure the driver sets the V4L2_BUF_FLAG_QUEUED flag and clears the V4L2_BUF_FLAG_MAPPED and V4L2_BUF_FLAG_DONE flags in the flags field, or it returns an error code. This ioctl locks the buffer.

Locking a buffer means passing it to a driver for a hardware access (usually DMA). If an application accesses (reads/writes) a locked buffer then the result is undefined. Buffers remain locked until dequeued, until the VIDIOC_STREAMOFF or ioctl VIDIOC_REQBUFS ioctl is called, or until the device is closed.

250 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Applications call the VIDIOC_DQBUF ioctl to dequeue a filled (capturing) or displayed (output) buffer from the driver's outgoing queue. They just set the type, memory and reserved fields of a struct

v4l2_buffer

as above, when VIDIOC_DQBUF is called with a pointer to this structure the driver fills the remaining fields or returns an error code. The driver may also set V4L2_BUF_FLAG_ERROR in the flags field. It indicates a non-critical (recoverable) streaming error. In such case the application may continue as normal, but should be aware that data in the dequeued buffer might be corrupted. When using the multi-planar API, the planes array must be passed in as well.

By default VIDIOC_DQBUF blocks when no buffer is in the outgoing queue. When the O_NONBLOCK flag was given to the open() function, VIDIOC_DQBUF returns immediately with an EAGAIN error code when no buffer is available.

The struct

v4l2_buffer

structure is specified in

Buffers

.

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 Generic Error Codes chapter.

EAGAIN Non-blocking I/O has been selected using O_NONBLOCK and no buffer was in the outgoing queue.

EINVAL The buffer type is not supported, or the index is out of bounds, or no buffers have been allocated yet, or the userptr or length are invalid.

EIO VIDIOC_DQBUF failed due to an internal error. Can also indicate temporary problems like signal loss.

Note:

The driver might dequeue an (empty) buffer despite returning an error, or even stop capturing.

Reusing such buffer may be unsafe though and its details (e.g. index) may not be returned either.

It is recommended that drivers indicate recoverable errors by setting the V4L2_BUF_FLAG_ERROR and returning 0 instead. In that case the application should be able to safely reuse the buffer and continue streaming.

EPIPE VIDIOC_DQBUF returns this on an empty capture queue for mem2mem codecs if a buffer with the

V4L2_BUF_FLAG_LAST was already dequeued and no new buffers are expected to become available.

ioctl VIDIOC_QUERYBUF

Name

VIDIOC_QUERYBUF - Query the status of a buffer

Synopsis

int ioctl(int fd, VIDIOC_QUERYBUF, struct

v4l2_buffer

 *argp)

Arguments

fd File descriptor returned by open().

argp

1.2. Part I - Video for Linux API 251

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Description

This ioctl is part of the

streaming

I/O method. It can be used to query the status of a buffer at any time after buffers have been allocated with the ioctl VIDIOC_REQBUFS ioctl.

Applications set the type field of a struct

v4l2_buffer

to the same buffer type as was previously used with struct v4l2_format type and struct v4l2_requestbuffers type, and the index field. Valid index numbers range from zero to the number of buffers allocated with ioctl VIDIOC_REQBUFS (struct v4l2_requestbuffers count) minus one. The reserved and reserved2 fields must be set to 0. When using the

multi-planar API

, the m.planes field must contain a userspace pointer to an array of struct

v4l2_plane

and the length field has to be set to the number of elements in that array. After calling

ioctl VIDIOC_QUERYBUF with a pointer to this structure drivers return an error code or fill the rest of the structure.

In the flags field the V4L2_BUF_FLAG_MAPPED, V4L2_BUF_FLAG_PREPARED, V4L2_BUF_FLAG_QUEUED and

V4L2_BUF_FLAG_DONE flags will be valid. The memory field will be set to the current I/O method. For the single-planar API, the m.offset contains the offset of the buffer from the start of the device memory, the length field its size. For the multi-planar API, fields m.mem_offset and length in the m.planes array elements will be used instead and the length field of struct

v4l2_buffer

is set to the number of filled-in array elements. The driver may or may not set the remaining fields and flags, they are meaningless in this context.

The struct

v4l2_buffer

structure is specified in

Buffers

.

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 Generic Error Codes chapter.

EINVAL The buffer type is not supported, or the index is out of bounds.

ioctl VIDIOC_QUERYCAP

Name

VIDIOC_QUERYCAP - Query device capabilities

Synopsis

int ioctl(int fd, VIDIOC_QUERYCAP, struct v4l2_capability *argp)

Arguments

fd File descriptor returned by open().

argp

Description

All V4L2 devices support the VIDIOC_QUERYCAP ioctl. It is used to identify kernel devices compatible with this specification and to obtain information about driver and hardware capabilities. The ioctl takes a pointer to a struct v4l2_capability which is filled by the driver. When the driver is not compatible with this specification the ioctl returns an EINVAL error code.

v4l2_capability

252 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Table 1.144: struct v4l2_capability

__u8

__u8

__u8 driver[16] Name of the driver, a unique NUL-terminated ASCII string. For example:

``bttv''. Driver specific applications can use this information to verify the driver identity. It is also useful to work around known bugs, or to identify drivers in error reports.

Storing strings in fixed sized arrays is bad practice but unavoidable here.

Drivers and applications should take precautions to never read or write beyond the end of the array and to make sure the strings are properly

NUL-terminated.

card[32] Name of the device, a NUL-terminated UTF-8 string. For example: ``Yoyodyne TV/FM''. One driver may support different brands or models of video hardware. This information is intended for users, for example in a menu of available devices. Since multiple TV cards of the same brand may be installed which are supported by the same driver, this name should be combined with the character device file name (e. g. /dev/video2) or the bus_info string to avoid ambiguities.

bus_info[32] Location of the device in the system, a NUL-terminated ASCII string. For example: ``PCI:0000:05:06.0''.

This information is intended for users, to distinguish multiple identical devices. If no such information is available the field must simply count the devices controlled by the driver

(``platform:vivi-000''). The bus_info must start with ``PCI:'' for PCI boards,

``PCIe:'' for PCI Express boards, ``usb-'' for USB devices, ``I2C:'' for i2c devices, ``ISA:'' for ISA devices, ``parport'' for parallel port devices and

``platform:'' for platform devices.

__u32 version Version number of the driver.

Starting with kernel 3.1, the version reported is provided by the V4L2 subsystem following the kernel numbering scheme. However, it may not always return the same version as the kernel if, for example, a stable or distribution-modified kernel uses the V4L2 stack from a newer kernel.

The version number is formatted using the KERNEL_VERSION() macro:

#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c)) __u32 version = KERNEL_VERSION(0, 8, 1); printf ("Version: %u.%u.%u\\n", (version >> 16) & 0xFF, (version >> 8) & 0xFF, version & 0xFF);

__u32 capabilities Available capabilities of the physical device as a whole, see Device Ca-

pabilities Flags. The same physical device can export multiple devices in

/dev (e.g. /dev/videoX, /dev/vbiY and /dev/radioZ). The capabilities field should contain a union of all capabilities available around the several V4L2 devices exported to userspace. For all those devices the capabilities field returns the same set of capabilities. This allows applications to open just one of the devices (typically the video device) and discover whether video, vbi and/or radio are also supported.

__u32

__u32 device_caps Device capabilities of the opened device, see Device Capabilities Flags.

Should contain the available capabilities of that specific device node. So, for example, device_caps of a radio device will only contain radio related capabilities and no video or vbi capabilities. This field is only set if the capabilities field contains the V4L2_CAP_DEVICE_CAPS capability. Only the capabilities field can have the V4L2_CAP_DEVICE_CAPS capability, device_caps will never set V4L2_CAP_DEVICE_CAPS.

reserved[3] Reserved for future extensions. Drivers must set this array to zero.

Table 1.145: Device Capabilities Flags

V4L2_CAP_VIDEO_CAPTURE 0x00000001 The device supports the single-planar API through the

Video Capture

interface.

V4L2_CAP_VIDEO_CAPTURE_MPLANE 0x00001000 The device supports the

multi-planar API

through the

Video Capture

interface.

V4L2_CAP_VIDEO_OUTPUT 0x00000002 The device supports the single-planar API through the

Video Output

interface.

Continued on next page

1.2. Part I - Video for Linux API 253

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Table 1.145 -- continued from previous page

V4L2_CAP_VIDEO_OUTPUT_MPLANE 0x00002000 The device supports the

multi-planar API

through the

Video Output

interface.

V4L2_CAP_VIDEO_M2M 0x00004000 The device supports the single-planar API through the Video Memory-To-Memory interface.

V4L2_CAP_VIDEO_M2M_MPLANE

V4L2_CAP_VIDEO_OVERLAY

V4L2_CAP_VBI_CAPTURE

0x00008000 The device supports the

multi-planar API

through the Video Memory-To-Memory interface.

0x00000004 The device supports the

Video Overlay

interface. A video overlay device typically stores captured images directly in the video memory of a graphics card, with hardware clipping and scaling.

0x00000010 The device supports the

Raw VBI Capture

interface, providing Teletext and Closed Caption data.

V4L2_CAP_VBI_OUTPUT

V4L2_CAP_SLICED_VBI_CAPTURE

V4L2_CAP_SLICED_VBI_OUTPUT

V4L2_CAP_AUDIO

V4L2_CAP_RADIO

V4L2_CAP_MODULATOR

0x00000020 The device supports the

Raw VBI Output

interface.

0x00000040 The device supports the

Sliced VBI Capture

interface.

0x00000080 The device supports the

Sliced VBI Output

interface.

0x00000100 The device supports the

RDS

capture interface.

V4L2_CAP_RDS_CAPTURE

V4L2_CAP_VIDEO_OUTPUT_OVERLAY 0x00000200 The device supports the

Video Output Overlay

(OSD) interface. Unlike the Video Overlay interface, this is a secondary function of video output devices and overlays an image onto an outgoing video signal. When the driver sets this flag, it must clear the V4L2_CAP_VIDEO_OVERLAY flag and vice versa.

66

V4L2_CAP_HW_FREQ_SEEK

V4L2_CAP_RDS_OUTPUT

V4L2_CAP_TUNER

0x00000400 The device supports the

ioctl VID-

IOC_S_HW_FREQ_SEEK ioctl for hardware frequency seeking.

0x00000800 The device supports the

RDS

output interface.

0x00010000 The device has some sort of tuner to receive RFmodulated video signals.

For more information about tuner programming see

Tuners and Modulators

.

0x00020000 The device has audio inputs or outputs. It may or may not support audio recording or playback, in

PCM or compressed formats. PCM audio support must be implemented as ALSA or OSS interface.

For more information on audio inputs and outputs see

Audio Inputs and Outputs

.

0x00040000 This is a radio receiver.

V4L2_CAP_SDR_CAPTURE

V4L2_CAP_EXT_PIX_FORMAT

V4L2_CAP_SDR_OUTPUT

V4L2_CAP_READWRITE

0x00080000 The device has some sort of modulator to emit RFmodulated video/audio signals. For more information about modulator programming see

Tuners and

Modulators

.

0x00100000 The device supports the

SDR Capture

interface.

0x00200000 The device supports the struct

v4l2_pix_format

extended fields.

0x00400000 The device supports the

SDR Output

interface.

V4L2_CAP_ASYNCIO

0x01000000 The device supports the

read()

and/or

write()

I/O methods.

0x02000000 The device supports the

asynchronous

I/O methods.

V4L2_CAP_STREAMING 0x04000000 The device supports the

streaming

I/O method.

Continued on next page

66

The struct v4l2_framebuffer lacks an enum

v4l2_buf_type

field, therefore the type of overlay is implied by the driver capabilities.

254 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2_CAP_TOUCH

V4L2_CAP_DEVICE_CAPS

Table 1.145 -- continued from previous page

0x10000000 This is a touch device.

0x80000000 The driver fills the device_caps field. This capability can only appear in the capabilities field and never in the device_caps field.

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 Generic Error Codes chapter.

ioctls VIDIOC_QUERYCTRL, VIDIOC_QUERY_EXT_CTRL and VIDIOC_QUERYMENU

Name

VIDIOC_QUERYCTRL - VIDIOC_QUERY_EXT_CTRL - VIDIOC_QUERYMENU - Enumerate controls and menu control items

Synopsis

int ioctl(int fd, int VIDIOC_QUERYCTRL, struct v4l2_queryctrl *argp) int ioctl(int fd, VIDIOC_QUERY_EXT_CTRL, struct v4l2_query_ext_ctrl *argp) int ioctl(int fd, VIDIOC_QUERYMENU, struct v4l2_querymenu *argp)

Arguments

fd File descriptor returned by open().

argp

Description

To query the attributes of a control applications set the id field of a struct v4l2_queryctrl and call the

VIDIOC_QUERYCTRL ioctl with a pointer to this structure. The driver fills the rest of the structure or returns an EINVAL error code when the id is invalid.

It is possible to enumerate controls by calling VIDIOC_QUERYCTRL with successive id values starting from

V4L2_CID_BASE up to and exclusive V4L2_CID_LASTP1. Drivers may return EINVAL if a control in this range is not supported. Further applications can enumerate private controls, which are not defined in this specification, by starting at V4L2_CID_PRIVATE_BASE and incrementing id until the driver returns EINVAL.

In both cases, when the driver sets the V4L2_CTRL_FLAG_DISABLED flag in the flags field this control is permanently disabled and should be ignored by the application.

67

When the application ORs id with V4L2_CTRL_FLAG_NEXT_CTRL the driver returns the next supported noncompound control, or EINVAL if there is none. In addition, the V4L2_CTRL_FLAG_NEXT_COMPOUND flag can be specified to enumerate all compound controls (i.e. controls with type ≥ V4L2_CTRL_COMPOUND_TYPES and/or array control, in other words controls that contain more than one value).

Specify both

V4L2_CTRL_FLAG_NEXT_CTRL and V4L2_CTRL_FLAG_NEXT_COMPOUND in order to enumerate all controls, compound or not. Drivers which do not support these flags yet always return EINVAL.

67

V4L2_CTRL_FLAG_DISABLED was intended for two purposes: Drivers can skip predefined controls not supported by the hardware

(although returning EINVAL would do as well), or disable predefined and private controls after hardware detection without the trouble of reordering control arrays and indices (EINVAL cannot be used to skip private controls because it would prematurely end the enumeration).

1.2. Part I - Video for Linux API 255

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

The VIDIOC_QUERY_EXT_CTRL ioctl was introduced in order to better support controls that can use compound types, and to expose additional control information that cannot be returned in struct v4l2_queryctrl since that structure is full.

VIDIOC_QUERY_EXT_CTRL is used in the same way as VIDIOC_QUERYCTRL, except that the reserved array must be zeroed as well.

Additional information is required for menu controls: the names of the menu items. To query them applications set the id and index fields of struct v4l2_querymenu and call the VIDIOC_QUERYMENU ioctl with a pointer to this structure. The driver fills the rest of the structure or returns an EINVAL error code when the id or index is invalid. Menu items are enumerated by calling VIDIOC_QUERYMENU with successive index values from struct v4l2_queryctrl minimum to maximum, inclusive.

Note:

It is possible for VIDIOC_QUERYMENU to return an EINVAL error code for some indices between minimum and maximum. In that case that particular menu item is not supported by this driver. Also note that the minimum value is not necessarily 0.

See also the examples in

User Controls

.

Table 1.146: struct v4l2_queryctrl

__u32 id

__u32

__u8

__s32

__s32

__s32 type name[32] minimum maximum step

Identifies the control, set by the application. See

Control IDs

for predefined IDs. When the ID is ORed with V4L2_CTRL_FLAG_NEXT_CTRL the driver clears the flag and returns the first control with a higher ID. Drivers which do not support this flag yet always return an EINVAL error code.

Type of control, see v4l2_ctrl_type.

Name of the control, a NUL-terminated ASCII string. This information is intended for the user.

Minimum value, inclusive. This field gives a lower bound for the control.

See enum v4l2_ctrl_type how the minimum value is to be used for each possible control type. Note that this a signed 32-bit value.

Maximum value, inclusive. This field gives an upper bound for the control. See enum v4l2_ctrl_type how the maximum value is to be used for each possible control type. Note that this a signed 32-bit value.

This field gives a step size for the control. See enum v4l2_ctrl_type how the step value is to be used for each possible control type. Note that this an unsigned 32-bit value.

Generally drivers should not scale hardware control values. It may be necessary for example when the name or id imply a particular unit and the hardware actually accepts only multiples of said unit. If so, drivers must take care values are properly rounded when scaling, such that errors will not accumulate on repeated read-write cycles.

This field gives the smallest change of an integer control actually affecting hardware. Often the information is needed when the user can change controls by keyboard or GUI buttons, rather than a slider. When for example a hardware register accepts values 0-511 and the driver reports

0-65535, step should be 128.

Note that although signed, the step value is supposed to be always positive.

Continued on next page

256 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

__s32 default_value

__u32

__u32 flags reserved[2]

Table 1.146 -- continued from previous page

The default value of a V4L2_CTRL_TYPE_INTEGER, _BOOLEAN, _BITMASK,

_MENU or _INTEGER_MENU control. Not valid for other types of controls.

Note:

Drivers reset controls to their default value only when the driver is first loaded, never afterwards.

Control flags, see Control Flags.

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

__u32

__u32 char

__s64

__s64

__u64

__s64

__u32 id type name[32] minimum maximum step default_value flags

Table 1.147: struct v4l2_query_ext_ctrl

Identifies the control, set by the application.

trol IDs

for predefined IDs.

See

Con-

When the ID is ORed with

V4L2_CTRL_FLAG_NEXT_CTRL the driver clears the flag and returns the first non-compound control with a higher ID. When the ID is ORed with V4L2_CTRL_FLAG_NEXT_COMPOUND the driver clears the flag and returns the first compound control with a higher ID. Set both to get the first control (compound or not) with a higher ID.

Type of control, see v4l2_ctrl_type.

Name of the control, a NUL-terminated ASCII string. This information is intended for the user.

Minimum value, inclusive. This field gives a lower bound for the control. See enum v4l2_ctrl_type how the minimum value is to be used for each possible control type. Note that this a signed

64-bit value.

Maximum value, inclusive. This field gives an upper bound for the control. See enum v4l2_ctrl_type how the maximum value is to be used for each possible control type. Note that this a signed 64-bit value.

This field gives a step size for the control.

See enum v4l2_ctrl_type how the step value is to be used for each possible control type. Note that this an unsigned 64-bit value.

Generally drivers should not scale hardware control values. It may be necessary for example when the name or id imply a particular unit and the hardware actually accepts only multiples of said unit. If so, drivers must take care values are properly rounded when scaling, such that errors will not accumulate on repeated read-write cycles.

This field gives the smallest change of an integer control actually affecting hardware. Often the information is needed when the user can change controls by keyboard or GUI buttons, rather than a slider. When for example a hardware register accepts values

0-511 and the driver reports 0-65535, step should be 128.

The default value of a V4L2_CTRL_TYPE_INTEGER, _INTEGER64,

_BOOLEAN, _BITMASK, _MENU, _INTEGER_MENU, _U8 or _U16 control. Not valid for other types of controls.

Note:

Drivers reset controls to their default value only when the driver is first loaded, never afterwards.

Control flags, see Control Flags.

Continued on next page

1.2. Part I - Video for Linux API 257

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

__u32 elem_size

Table 1.147 -- continued from previous page

The size in bytes of a single element of the array. Given a char pointer p to a 3-dimensional array you can find the position of cell (z, y, x) as follows: p + ((z * dims[1] + y) * dims[0]

+ x) * elem_size. elem_size is always valid, also when the control isn't an array. For string controls elem_size is equal to maximum + 1.

__u32

__u32 elems nr_of_dims

The number of elements in the N-dimensional array. If this control is not an array, then elems is 1. The elems field can never be 0.

The number of dimension in the N-dimensional array. If this control is not an array, then this field is 0.

__u32 dims[V4L2_CTRL_MAX_DIMS] The size of each dimension. The first nr_of_dims elements of this array must be non-zero, all remaining elements must be zero.

__u32 reserved[32] Reserved for future extensions. Applications and drivers must set the array to zero.

__u32 id

Table 1.148: struct v4l2_querymenu

Identifies the control, set by the application from the respective struct

v4l2_queryctrl id.

Index of the menu item, starting at zero, set by the application.

__u32 union index

__u8 name[32] Name of the menu item, a NUL-terminated ASCII string. This information is intended for the user. This field is valid for V4L2_CTRL_FLAG_MENU type con-

__s64 value trols.

Value of the integer menu item.

V4L2_CTRL_FLAG_INTEGER_MENU type controls.

This field is valid for

__u32

v4l2_ctrl_type

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

Table 1.149: enum v4l2_ctrl_type

Type

V4L2_CTRL_TYPE_INTEGER

V4L2_CTRL_TYPE_BOOLEAN

V4L2_CTRL_TYPE_MENU

V4L2_CTRL_TYPE_INTEGER_MENU

V4L2_CTRL_TYPE_BITMASK minimum step maximum Description any any any An integer-valued control ranging from minimum to maximum inclusive. The step value indicates the increment between values.

0 1 1

≥ 0

≥ 0

0

1

1 n/a

N-1

N-1 any

A boolean-valued control. Zero corresponds to ``disabled'', and one means

``enabled''.

The control has a menu of N choices.

The names of the menu items can be enumerated with the VID-

IOC_QUERYMENU ioctl.

The control has a menu of N choices.

The values of the menu items can be enumerated with the VID-

IOC_QUERYMENU ioctl.

This is similar to V4L2_CTRL_TYPE_MENU except that instead of strings, the menu items are signed 64-bit integers.

A bitmask field. The maximum value is the set of bits that can be used, all other bits are to be 0. The maximum value is interpreted as a __u32, allowing the use of bit 31 in the bitmask.

Continued on next page

258 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Type

V4L2_CTRL_TYPE_BUTTON

V4L2_CTRL_TYPE_INTEGER64

V4L2_CTRL_TYPE_STRING

Table 1.149 -- continued from previous page minimum step maximum Description

0 0 0 A control which performs an action when set.

Drivers must ignore the value passed with VIDIOC_S_CTRL and return an EINVAL error code on a VID-

IOC_G_CTRL attempt.

any any any A 64-bit integer valued control. Minimum, maximum and step size cannot be queried using VIDIOC_QUERYCTRL.

Only VIDIOC_QUERY_EXT_CTRL can retrieve the 64-bit min/max/step values, they should be interpreted as n/a when using VIDIOC_QUERYCTRL.

≥ 0 ≥ 1 ≥ 0

V4L2_CTRL_TYPE_CTRL_CLASS

V4L2_CTRL_TYPE_U8

V4L2_CTRL_TYPE_U16

V4L2_CTRL_TYPE_U32 n/a any any any n/a any any any n/a any any any

The minimum and maximum string lengths.

The step size means that the string must be (minimum + N * step) characters long for N ≥ 0. These lengths do not include the terminating zero, so in order to pass a string of length 8 to VIDIOC_S_EXT_CTRLS you need to set the size field of struct v4l2_ext_control to 9.

For VID-

IOC_G_EXT_CTRLS you can set the size field to maximum + 1.

Which character encoding is used will depend on the string control itself and should be part of the control documentation.

This is not a control.

When VID-

IOC_QUERYCTRL is called with a control

ID equal to a control class code (see

Control classes) + 1, the ioctl returns the name of the control class and this control type. Older drivers which do not support this feature return an EINVAL error code.

An unsigned 8-bit valued control ranging from minimum to maximum inclusive. The step value indicates the increment between values.

An unsigned 16-bit valued control ranging from minimum to maximum inclusive. The step value indicates the increment between values.

An unsigned 32-bit valued control ranging from minimum to maximum inclusive. The step value indicates the increment between values.

V4L2_CTRL_FLAG_DISABLED

Table 1.150: Control Flags

0x0001 This control is permanently disabled and should be ignored by the application.

Any attempt to change the control will result in an EINVAL error code.

Continued on next page

1.2. Part I - Video for Linux API 259

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2_CTRL_FLAG_GRABBED

V4L2_CTRL_FLAG_READ_ONLY

Table 1.150 -- continued from previous page

0x0002 This control is temporarily unchangeable, for example because another application took over control of the respective resource. Such controls may be displayed specially in a user interface.

Attempts to change the control may result in an

EBUSY error code.

0x0004

V4L2_CTRL_FLAG_UPDATE

V4L2_CTRL_FLAG_INACTIVE

0x0008

0x0010

This control is permanently readable only. Any attempt to change the control will result in an EIN-

VAL error code.

A hint that changing this control may affect the value of other controls within the same control class. Applications should update their user interface accordingly.

This control is not applicable to the current configuration and should be displayed accordingly in a user interface. For example the flag may be set on a MPEG audio level 2 bitrate control when MPEG audio encoding level 1 was selected with another control.

V4L2_CTRL_FLAG_SLIDER

V4L2_CTRL_FLAG_WRITE_ONLY

V4L2_CTRL_FLAG_VOLATILE

0x0020

0x0040

0x0080

A hint that this control is best represented as a slider-like element in a user interface.

This control is permanently writable only. Any attempt to read the control will result in an EACCES error code error code. This flag is typically present for relative controls or action controls where writing a value will cause the device to carry out a given action (e. g. motor control) but no meaningful value can be returned.

This control is volatile, which means that the value of the control changes continuously. A typical example would be the current gain value if the device is in auto-gain mode. In such a case the hardware calculates the gain value based on the lighting conditions which can change over time.

Note:

Setting a new value for a volatile control will be ignored unless

V4L2_CTRL_FLAG_EXECUTE_ON_WRITE

is also set.

Setting a new value for a volatile control will

never

trigger a

V4L2_EVENT_CTRL_CH_VALUE event.

V4L2_CTRL_FLAG_HAS_PAYLOAD 0x0100 This control has a pointer type, so its value has to be accessed using one of the pointer fields of struct v4l2_ext_control. This flag is set for controls that are an array, string, or have a compound type. In all cases you have to set a pointer to memory containing the payload of the control.

Continued on next page

260 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Table 1.150 -- continued from previous page

V4L2_CTRL_FLAG_EXECUTE_ON_WRITE 0x0200 The value provided to the control will be propagated to the driver even if it remains constant.

This is required when the control represents an action on the hardware. For example: clearing an error flag or triggering the flash. All the controls of the type V4L2_CTRL_TYPE_BUTTON have this flag set.

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 Generic Error Codes chapter.

EINVAL The struct v4l2_queryctrl id is invalid. The struct v4l2_querymenu id is invalid or index is out of range (less than minimum or greater than maximum) or this particular menu item is not supported by the driver.

EACCES An attempt was made to read a write-only control.

ioctl VIDIOC_QUERY_DV_TIMINGS

Name

VIDIOC_QUERY_DV_TIMINGS - VIDIOC_SUBDEV_QUERY_DV_TIMINGS - Sense the DV preset received by the current input

Synopsis

int ioctl(int fd, VIDIOC_QUERY_DV_TIMINGS, struct v4l2_dv_timings *argp) int ioctl(int fd, VIDIOC_SUBDEV_QUERY_DV_TIMINGS, struct v4l2_dv_timings *argp)

Arguments

fd File descriptor returned by open().

argp

Description

The hardware may be able to detect the current DV timings automatically, similar to sensing the video standard. To do so, applications call ioctl VIDIOC_QUERY_DV_TIMINGS with a pointer to a struct v4l2_dv_timings. Once the hardware detects the timings, it will fill in the timings structure.

Note:

Drivers shall not switch timings automatically if new timings are detected. Instead, drivers should send

the V4L2_EVENT_SOURCE_CHANGE event (if they support this) and expect that userspace will take action

by calling ioctl VIDIOC_QUERY_DV_TIMINGS. The reason is that new timings usually mean different

buffer sizes as well, and you cannot change buffer sizes on the fly. In general, applications that receive

the Source Change event will have to call ioctl VIDIOC_QUERY_DV_TIMINGS, and if the detected timings

are valid they will have to stop streaming, set the new timings, allocate new buffers and start streaming again.

1.2. Part I - Video for Linux API 261

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

If the timings could not be detected because there was no signal, then ENOLINK is returned. If a signal was detected, but it was unstable and the receiver could not lock to the signal, then ENOLCK is returned. If the receiver could lock to the signal, but the format is unsupported (e.g. because the pixelclock is out of range of the hardware capabilities), then the driver fills in whatever timings it could find and returns ERANGE.

In that case the application can call ioctl VIDIOC_DV_TIMINGS_CAP, VIDIOC_SUBDEV_DV_TIMINGS_CAP to compare the found timings with the hardware's capabilities in order to give more precise feedback to the user.

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 Generic Error Codes chapter.

ENODATA Digital video timings are not supported for this input or output.

ENOLINK No timings could be detected because no signal was found.

ENOLCK The signal was unstable and the hardware could not lock on to it.

ERANGE Timings were found, but they are out of range of the hardware capabilities.

ioctl VIDIOC_QUERYSTD

Name

VIDIOC_QUERYSTD - Sense the video standard received by the current input

Synopsis

int ioctl(int fd, VIDIOC_QUERYSTD, v4l2_std_id *argp)

Arguments

fd File descriptor returned by open().

argp

Description

The hardware may be able to detect the current video standard automatically. To do so, applications call

ioctl VIDIOC_QUERYSTD with a pointer to a v4l2_std_id type. The driver stores here a set of candidates, this can be a single flag or a set of supported standards if for example the hardware can only distinguish between 50 and 60 Hz systems. If no signal was detected, then the driver will return V4L2_STD_UNKNOWN.

When detection is not possible or fails, the set must contain all standards supported by the current video input or output.

Note:

Drivers shall not switch the video standard automatically if a new video standard is detected. In-

stead, drivers should send the V4L2_EVENT_SOURCE_CHANGE event (if they support this) and expect

that userspace will take action by calling ioctl VIDIOC_QUERYSTD. The reason is that a new video stan-

dard can mean different buffer sizes as well, and you cannot change buffer sizes on the fly. In general,

applications that receive the Source Change event will have to call ioctl VIDIOC_QUERYSTD, and if the

detected video standard is valid they will have to stop streaming, set the new standard, allocate new buffers and start streaming again.

262 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

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 Generic Error Codes chapter.

ENODATA Standard video timings are not supported for this input or output.

ioctl VIDIOC_REQBUFS

Name

VIDIOC_REQBUFS - Initiate Memory Mapping, User Pointer I/O or DMA buffer I/O

Synopsis

int ioctl(int fd, VIDIOC_REQBUFS, struct v4l2_requestbuffers *argp)

Arguments

fd File descriptor returned by open().

argp

Description

This ioctl is used to initiate

memory mapped

,

user pointer

or

DMABUF

based I/O. Memory mapped buffers are located in device memory and must be allocated with this ioctl before they can be mapped into the application's address space. User buffers are allocated by applications themselves, and this ioctl is merely used to switch the driver into user pointer I/O mode and to setup some internal structures. Similarly,

DMABUF buffers are allocated by applications through a device driver, and this ioctl only configures the driver into DMABUF I/O mode without performing any direct allocation.

To allocate device buffers applications initialize all fields of the struct v4l2_requestbuffers structure.

They set the type field to the respective stream or buffer type, the count field to the desired number of buffers, memory must be set to the requested I/O method and the reserved array must be zeroed. When the ioctl is called with a pointer to this structure the driver will attempt to allocate the requested number of buffers and it stores the actual number allocated in the count field. It can be smaller than the number requested, even zero, when the driver runs out of free memory. A larger number is also possible when the driver requires more buffers to function correctly. For example video output requires at least two buffers, one displayed and one filled by the application.

When the I/O method is not supported the ioctl returns an EINVAL error code.

Applications can call ioctl VIDIOC_REQBUFS again to change the number of buffers, however this cannot succeed when any buffers are still mapped. A count value of zero frees all buffers, after aborting or finishing any DMA in progress, an implicit VIDIOC_STREAMOFF.

v4l2_requestbuffers

1.2. Part I - Video for Linux API 263

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

__u32

__u32

__u32

__u32

Table 1.151: struct v4l2_requestbuffers count type memory reserved[2]

The number of buffers requested or granted.

Type of the stream or buffers, this is the same as the struct v4l2_format type field.

v4l2_buf_type

for valid values.

See

Applications set this field to V4L2_MEMORY_MMAP,

V4L2_MEMORY_DMABUF or V4L2_MEMORY_USERPTR.

See

v4l2_memory

.

A place holder for future extensions. Drivers and applications must set the array to zero.

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 Generic Error Codes chapter.

EINVAL The buffer type (type field) or the requested I/O method (memory) is not supported.

ioctl VIDIOC_S_HW_FREQ_SEEK

Name

VIDIOC_S_HW_FREQ_SEEK - Perform a hardware frequency seek

Synopsis

int ioctl(int fd, VIDIOC_S_HW_FREQ_SEEK, struct v4l2_hw_freq_seek *argp)

Arguments

fd File descriptor returned by open().

argp

Description

Start a hardware frequency seek from the current frequency. To do this applications initialize the tuner, type, seek_upward, wrap_around, spacing, rangelow and rangehigh fields, and zero out the reserved array of a struct v4l2_hw_freq_seek and call the VIDIOC_S_HW_FREQ_SEEK ioctl with a pointer to this structure.

The rangelow and rangehigh fields can be set to a non-zero value to tell the driver to search a specific band. If the struct v4l2_tuner capability field has the V4L2_TUNER_CAP_HWSEEK_PROG_LIM flag set, these values must fall within one of the bands returned by ioctl VIDIOC_ENUM_FREQ_BANDS. If the

V4L2_TUNER_CAP_HWSEEK_PROG_LIM flag is not set, then these values must exactly match those of one of the bands returned by ioctl VIDIOC_ENUM_FREQ_BANDS. If the current frequency of the tuner does not fall within the selected band it will be clamped to fit in the band before the seek is started.

If an error is returned, then the original frequency will be restored.

This ioctl is supported if the V4L2_CAP_HW_FREQ_SEEK capability is set.

If this ioctl is called from a non-blocking filehandle, then EAGAIN error code is returned and no seek takes place.

v4l2_hw_freq_seek

264 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

__u32

__u32

__u32

__u32

__u32

__u32

__u32

__u32 tuner type

Table 1.152: struct v4l2_hw_freq_seek seek_upward wrap_around spacing rangelow rangehigh reserved[5]

The tuner index number. This is the same value as in the struct v4l2_input tuner field and the struct v4l2_tuner index field.

The tuner type.

This is the same value as in the struct v4l2_tuner type field.

v4l2_tuner_type

See

If non-zero, seek upward from the current frequency, else seek downward.

If non-zero, wrap around when at the end of the frequency range, else stop seeking. The struct v4l2_tuner capability field will tell you what the hardware supports.

If non-zero, defines the hardware seek resolution in Hz. The driver selects the nearest value that is supported by the device. If spacing is zero a reasonable default value is used.

If non-zero, the lowest tunable frequency of the band to search in units of 62.5 kHz, or if the struct v4l2_tuner capability field has the

V4L2_TUNER_CAP_LOW flag set, in units of 62.5 Hz or if the struct v4l2_tuner capability field has the V4L2_TUNER_CAP_1HZ flag set, in units of 1 Hz.

If rangelow is zero a reasonable default value is used.

If non-zero, the highest tunable frequency of the band to search in units of 62.5 kHz, or if the struct v4l2_tuner capability field has the

V4L2_TUNER_CAP_LOW flag set, in units of 62.5 Hz or if the struct v4l2_tuner capability field has the V4L2_TUNER_CAP_1HZ flag set, in units of 1 Hz.

If rangehigh is zero a reasonable default value is used.

Reserved for future extensions. Applications must set the array to zero.

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 Generic Error Codes chapter.

EINVAL The tuner index is out of bounds, the wrap_around value is not supported or one of the values in the type, rangelow or rangehigh fields is wrong.

EAGAIN Attempted to call VIDIOC_S_HW_FREQ_SEEK with the filehandle in non-blocking mode.

ENODATA The hardware seek found no channels.

EBUSY Another hardware seek is already in progress.

ioctl VIDIOC_STREAMON, VIDIOC_STREAMOFF

Name

VIDIOC_STREAMON - VIDIOC_STREAMOFF - Start or stop streaming I/O

1.2. Part I - Video for Linux API 265

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Synopsis

int ioctl(int fd, VIDIOC_STREAMON, const int *argp) int ioctl(int fd, VIDIOC_STREAMOFF, const int *argp)

Arguments

fd File descriptor returned by open().

argp

Description

The VIDIOC_STREAMON and VIDIOC_STREAMOFF ioctl start and stop the capture or output process during

streaming (

memory mapping

,

user pointer

or

DMABUF

) I/O.

Capture hardware is disabled and no input buffers are filled (if there are any empty buffers in the incoming queue) until VIDIOC_STREAMON has been called. Output hardware is disabled and no video signal is produced until VIDIOC_STREAMON has been called. The ioctl will succeed when at least one output buffer is in the incoming queue.

Memory-to-memory devices will not start until VIDIOC_STREAMON has been called for both the capture and output stream types.

If VIDIOC_STREAMON fails then any already queued buffers will remain queued.

The VIDIOC_STREAMOFF ioctl, apart of aborting or finishing any DMA in progress, unlocks any user pointer buffers locked in physical memory, and it removes all buffers from the incoming and outgoing queues.

That means all images captured but not dequeued yet will be lost, likewise all images enqueued for output but not transmitted yet. I/O returns to the same state as after calling ioctl VIDIOC_REQBUFS and can be restarted accordingly.

If buffers have been queued with ioctl VIDIOC_QBUF, VIDIOC_DQBUF and VIDIOC_STREAMOFF is called without ever having called VIDIOC_STREAMON, then those queued buffers will also be removed from the incoming queue and all are returned to the same state as after calling ioctl VIDIOC_REQBUFS and can be restarted accordingly.

Both ioctls take a pointer to an integer, the desired buffer or stream type. This is the same as struct v4l2_requestbuffers type.

If VIDIOC_STREAMON is called when streaming is already in progress, or if VIDIOC_STREAMOFF is called when streaming is already stopped, then 0 is returned. Nothing happens in the case of VIDIOC_STREAMON, but VIDIOC_STREAMOFF will return queued buffers to their starting state as mentioned above.

Note:

Applications can be preempted for unknown periods right before or after the VIDIOC_STREAMON or

VIDIOC_STREAMOFF calls, there is no notion of starting or stopping ``now''. Buffer timestamps can be used to synchronize with other events.

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 Generic Error Codes chapter.

EINVAL The buffer type is not supported, or no buffers have been allocated (memory mapping) or enqueued (output) yet.

266 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

EPIPE The driver implements

pad-level format configuration

and the pipeline configuration is invalid.

ENOLINK The driver implements Media Controller interface and the pipeline link configuration is invalid.

ioctl VIDIOC_SUBDEV_ENUM_FRAME_INTERVAL

Name

VIDIOC_SUBDEV_ENUM_FRAME_INTERVAL - Enumerate frame intervals

Synopsis

int ioctl(int fd, VIDIOC_SUBDEV_ENUM_FRAME_INTERVAL, struct v4l2_subdev_frame_interval_enum

* argp)

Arguments

fd File descriptor returned by open().

argp

Description

This ioctl lets applications enumerate available frame intervals on a given sub-device pad. Frame intervals only makes sense for sub-devices that can control the frame period on their own. This includes, for instance, image sensors and TV tuners.

For the common use case of image sensors, the frame intervals available on the sub-device output pad depend on the frame format and size on the same pad. Applications must thus specify the desired format and size when enumerating frame intervals.

To enumerate frame intervals applications initialize the index, pad, which, code, width and height fields of struct v4l2_subdev_frame_interval_enum and call the ioctl VIDIOC_SUBDEV_ENUM_FRAME_INTERVAL ioctl with a pointer to this structure. Drivers fill the rest of the structure or return an EINVAL error code if one of the input fields is invalid. All frame intervals are enumerable by beginning at index zero and incrementing by one until EINVAL is returned.

Available frame intervals may depend on the current `try' formats at other pads of the sub-device, as well as on the current active links. See ioctl VIDIOC_SUBDEV_G_FMT, VIDIOC_SUBDEV_S_FMT for more information about the try formats.

Sub-devices that support the frame interval enumeration ioctl should implemented it on a single pad only.

Its behaviour when supported on multiple pads of the same sub-device is not defined.

v4l2_subdev_frame_interval_enum

1.2. Part I - Video for Linux API 267

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

__u32

__u32

__u32

__u32

__u32 struct v4l2_fract

__u32

__u32

Table 1.153: struct v4l2_subdev_frame_interval_enum index pad code width height interval which reserved[8]

Number of the format in the enumeration, set by the application.

Pad number as reported by the media controller

API.

The media bus format code, as defined in

Media

Bus Formats

.

Frame width, in pixels.

Frame height, in pixels.

Period, in seconds, between consecutive video frames.

Frame intervals to be enumerated, from enum

v4l2_subdev_format_whence.

Reserved for future extensions. Applications and drivers must set the array to zero.

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 Generic Error Codes chapter.

EINVAL The struct v4l2_subdev_frame_interval_enum pad references a non-existing pad, one of the code, width or height fields are invalid for the given pad or the index field is out of bounds.

ioctl VIDIOC_SUBDEV_ENUM_FRAME_SIZE

Name

VIDIOC_SUBDEV_ENUM_FRAME_SIZE - Enumerate media bus frame sizes

Synopsis

int ioctl(int fd, VIDIOC_SUBDEV_ENUM_FRAME_SIZE, struct v4l2_subdev_frame_size_enum * argp)

Arguments

fd File descriptor returned by open().

argp

Description

This ioctl allows applications to enumerate all frame sizes supported by a sub-device on the given pad for the given media bus format.

Supported formats can be retrieved with the ioctl VID-

IOC_SUBDEV_ENUM_MBUS_CODE ioctl.

To enumerate frame sizes applications initialize the pad, which , code and index fields of the struct v4l2_subdev_mbus_code_enum and call the ioctl VIDIOC_SUBDEV_ENUM_FRAME_SIZE ioctl with a pointer to the structure. Drivers fill the minimum and maximum frame sizes or return an EINVAL error code if one of the input parameters is invalid.

Sub-devices that only support discrete frame sizes (such as most sensors) will return one or more frame sizes with identical minimum and maximum values.

268 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

__u32

__u32

__u32

__u32

__u32

__u32

__u32

__u32

__u32

Not all possible sizes in given [minimum, maximum] ranges need to be supported. For instance, a scaler that uses a fixed-point scaling ratio might not be able to produce every frame size between the minimum and maximum values. Applications must use the VIDIOC_SUBDEV_S_FMT ioctl to try the sub-device for an exact supported frame size.

Available frame sizes may depend on the current `try' formats at other pads of the sub-device, as well as on the current active links and the current values of V4L2 controls. See ioctl VIDIOC_SUBDEV_G_FMT,

VIDIOC_SUBDEV_S_FMT for more information about try formats.

v4l2_subdev_frame_size_enum

Table 1.154: struct v4l2_subdev_frame_size_enum index pad code min_width max_width min_height max_height which reserved[8]

Number of the format in the enumeration, set by the application.

Pad number as reported by the media controller

API.

The media bus format code, as defined in

Media

Bus Formats

.

Minimum frame width, in pixels.

Maximum frame width, in pixels.

Minimum frame height, in pixels.

Maximum frame height, in pixels.

Frame sizes to be enumerated, from enum

v4l2_subdev_format_whence.

Reserved for future extensions. Applications and drivers must set the array to zero.

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 Generic Error Codes chapter.

EINVAL The struct v4l2_subdev_frame_size_enum pad references a non-existing pad, the code is invalid for the given pad or the index field is out of bounds.

ioctl VIDIOC_SUBDEV_ENUM_MBUS_CODE

Name

VIDIOC_SUBDEV_ENUM_MBUS_CODE - Enumerate media bus formats

Synopsis

int ioctl(int fd, VIDIOC_SUBDEV_ENUM_MBUS_CODE, struct v4l2_subdev_mbus_code_enum

* argp)

Arguments

fd File descriptor returned by open().

argp

1.2. Part I - Video for Linux API 269

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Description

To enumerate media bus formats available at a given sub-device pad applications initialize the pad, which and index fields of struct v4l2_subdev_mbus_code_enum and call the ioctl VID-

IOC_SUBDEV_ENUM_MBUS_CODE ioctl with a pointer to this structure. Drivers fill the rest of the structure or return an EINVAL error code if either the pad or index are invalid. All media bus formats are enumerable by beginning at index zero and incrementing by one until EINVAL is returned.

Available media bus formats may depend on the current `try' formats at other pads of the sub-device, as well as on the current active links. See ioctl VIDIOC_SUBDEV_G_FMT, VIDIOC_SUBDEV_S_FMT for more information about the try formats.

v4l2_subdev_mbus_code_enum

__u32

__u32

__u32

__u32

__u32

Table 1.155: struct v4l2_subdev_mbus_code_enum pad index code which reserved[8]

Pad number as reported by the media controller

API.

Number of the format in the enumeration, set by the application.

The media bus format code, as defined in

Media

Bus Formats

.

Media bus format codes to be enumerated, from enum v4l2_subdev_format_whence.

Reserved for future extensions. Applications and drivers must set the array to zero.

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 Generic Error Codes chapter.

EINVAL The struct v4l2_subdev_mbus_code_enum pad references a non-existing pad, or the index field is out of bounds.

ioctl VIDIOC_SUBDEV_G_CROP, VIDIOC_SUBDEV_S_CROP

Name

VIDIOC_SUBDEV_G_CROP - VIDIOC_SUBDEV_S_CROP - Get or set the crop rectangle on a subdev pad

Synopsis

int ioctl(int fd, VIDIOC_SUBDEV_G_CROP, struct v4l2_subdev_crop *argp) int ioctl(int fd, VIDIOC_SUBDEV_S_CROP, const struct v4l2_subdev_crop *argp)

Arguments

fd File descriptor returned by open().

argp

270 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Description

Note:

This is an Obsolete API Elements interface and may be removed in the future. It is superseded by the selection API.

To retrieve the current crop rectangle applications set the pad field of a struct v4l2_subdev_crop to the desired pad number as reported by the media API and the which field to V4L2_SUBDEV_FORMAT_ACTIVE.

They then call the VIDIOC_SUBDEV_G_CROP ioctl with a pointer to this structure. The driver fills the members of the rect field or returns EINVAL error code if the input arguments are invalid, or if cropping is not supported on the given pad.

To change the current crop rectangle applications set both the pad and which fields and all members of the rect field. They then call the VIDIOC_SUBDEV_S_CROP ioctl with a pointer to this structure. The driver verifies the requested crop rectangle, adjusts it based on the hardware capabilities and configures the device. Upon return the struct v4l2_subdev_crop contains the current format as would be returned by a

VIDIOC_SUBDEV_G_CROP call.

Applications can query the device capabilities by setting the which to V4L2_SUBDEV_FORMAT_TRY. When set, `try' crop rectangles are not applied to the device by the driver, but are mangled exactly as active crop rectangles and stored in the sub-device file handle. Two applications querying the same sub-device would thus not interact with each other.

Drivers must not return an error solely because the requested crop rectangle doesn't match the device capabilities. They must instead modify the rectangle to match what the hardware can provide. The modified format should be as close as possible to the original request.

v4l2_subdev_crop

__u32

__u32 struct

__u32

v4l2_rect

pad which rect

Table 1.156: struct v4l2_subdev_crop reserved[8]

Pad number as reported by the media framework.

Crop rectangle to get or set, from enum

v4l2_subdev_format_whence.

Crop rectangle boundaries, in pixels.

Reserved for future extensions. Applications and drivers must set the array to zero.

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 Generic Error Codes chapter.

EBUSY The crop rectangle can't be changed because the pad is currently busy. This can be caused, for instance, by an active video stream on the pad. The ioctl must not be retried without performing another action to fix the problem first. Only returned by VIDIOC_SUBDEV_S_CROP

EINVAL The struct v4l2_subdev_crop pad references a non-existing pad, the which field references a non-existing format, or cropping is not supported on the given subdev pad.

ioctl VIDIOC_SUBDEV_G_FMT, VIDIOC_SUBDEV_S_FMT

Name

VIDIOC_SUBDEV_G_FMT - VIDIOC_SUBDEV_S_FMT - Get or set the data format on a subdev pad

1.2. Part I - Video for Linux API 271

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Synopsis

int ioctl(int fd, VIDIOC_SUBDEV_G_FMT, struct v4l2_subdev_format *argp) int ioctl(int fd, VIDIOC_SUBDEV_S_FMT, struct v4l2_subdev_format *argp)

Arguments

fd File descriptor returned by open().

argp

Description

These ioctls are used to negotiate the frame format at specific subdev pads in the image pipeline.

To retrieve the current format applications set the pad field of a struct v4l2_subdev_format to the desired pad number as reported by the media API and the which field to V4L2_SUBDEV_FORMAT_ACTIVE. When they call the VIDIOC_SUBDEV_G_FMT ioctl with a pointer to this structure the driver fills the members of the format field.

To change the current format applications set both the pad and which fields and all members of the format field. When they call the VIDIOC_SUBDEV_S_FMT ioctl with a pointer to this structure the driver verifies the requested format, adjusts it based on the hardware capabilities and configures the device. Upon return the struct v4l2_subdev_format contains the current format as would be returned by a VIDIOC_SUBDEV_G_FMT call.

Applications can query the device capabilities by setting the which to V4L2_SUBDEV_FORMAT_TRY. When set, `try' formats are not applied to the device by the driver, but are changed exactly as active formats and stored in the sub-device file handle. Two applications querying the same sub-device would thus not interact with each other.

For instance, to try a format at the output pad of a sub-device, applications would first set the try format at the sub-device input with the VIDIOC_SUBDEV_S_FMT ioctl. They would then either retrieve the default format at the output pad with the VIDIOC_SUBDEV_G_FMT ioctl, or set the desired output pad format with the VIDIOC_SUBDEV_S_FMT ioctl and check the returned value.

Try formats do not depend on active formats, but can depend on the current links configuration or subdevice controls value. For instance, a low-pass noise filter might crop pixels at the frame boundaries, modifying its output frame size.

Drivers must not return an error solely because the requested format doesn't match the device capabilities. They must instead modify the format to match what the hardware can provide. The modified format should be as close as possible to the original request.

v4l2_subdev_format

__u32

__u32 struct

v4l2_mbus_framefmt

__u32 pad

Table 1.157: struct v4l2_subdev_format which format reserved[8]

Pad number as reported by the media controller

API.

Format to modified,

v4l2_subdev_format_whence.

from enum

Definition of an image format,

v4l2_mbus_framefmt

for details.

see

Reserved for future extensions. Applications and drivers must set the array to zero.

Table 1.158: enum v4l2_subdev_format_whence

V4L2_SUBDEV_FORMAT_TRY

V4L2_SUBDEV_FORMAT_ACTIVE

0

1

Try formats, used for querying device capabilities.

Active formats, applied to the hardware.

272 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

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 Generic Error Codes chapter.

EBUSY The format can't be changed because the pad is currently busy. This can be caused, for instance, by an active video stream on the pad. The ioctl must not be retried without performing another action to fix the problem first. Only returned by VIDIOC_SUBDEV_S_FMT

EINVAL The struct v4l2_subdev_format pad references a non-existing pad, or the which field references a non-existing format.

On success 0 is returned, on error -1 and the errno variable is set appropriately. The generic error codes are described at the Generic Error Codes chapter.

ioctl VIDIOC_SUBDEV_G_FRAME_INTERVAL, VIDIOC_SUBDEV_S_FRAME_INTERVAL

Name

VIDIOC_SUBDEV_G_FRAME_INTERVAL - VIDIOC_SUBDEV_S_FRAME_INTERVAL - Get or set the frame interval on a subdev pad

Synopsis

int ioctl(int fd, VIDIOC_SUBDEV_G_FRAME_INTERVAL, struct v4l2_subdev_frame_interval *argp) int ioctl(int fd, VIDIOC_SUBDEV_S_FRAME_INTERVAL, struct v4l2_subdev_frame_interval *argp)

Arguments

fd File descriptor returned by open().

argp

Description

These ioctls are used to get and set the frame interval at specific subdev pads in the image pipeline. The frame interval only makes sense for sub-devices that can control the frame period on their own. This includes, for instance, image sensors and TV tuners. Sub-devices that don't support frame intervals must not implement these ioctls.

To retrieve the current frame interval applications set the pad field of a struct v4l2_subdev_frame_interval to the desired pad number as reported by the media controller API.

When they call the VIDIOC_SUBDEV_G_FRAME_INTERVAL ioctl with a pointer to this structure the driver fills the members of the interval field.

To change the current frame interval applications set both the pad field and all members of the interval field. When they call the VIDIOC_SUBDEV_S_FRAME_INTERVAL ioctl with a pointer to this structure the driver verifies the requested interval, adjusts it based on the hardware capabilities and configures the device.

Upon return the struct v4l2_subdev_frame_interval contains the current frame interval as would be returned by a VIDIOC_SUBDEV_G_FRAME_INTERVAL call.

Drivers must not return an error solely because the requested interval doesn't match the device capabilities. They must instead modify the interval to match what the hardware can provide. The modified interval should be as close as possible to the original request.

1.2. Part I - Video for Linux API 273

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Sub-devices that support the frame interval ioctls should implement them on a single pad only. Their behaviour when supported on multiple pads of the same sub-device is not defined.

v4l2_subdev_frame_interval

__u32 struct v4l2_fract

__u32

Table 1.159: struct v4l2_subdev_frame_interval pad interval reserved[9]

Pad number as reported by the media controller

API.

Period, in seconds, between consecutive video frames.

Reserved for future extensions. Applications and drivers must set the array to zero.

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 Generic Error Codes chapter.

EBUSY The frame interval can't be changed because the pad is currently busy. This can be caused, for instance, by an active video stream on the pad. The ioctl must not be retried without performing another action to fix the problem first. Only returned by VIDIOC_SUBDEV_S_FRAME_INTERVAL

EINVAL The struct v4l2_subdev_frame_interval pad references a non-existing pad, or the pad doesn't support frame intervals.

ioctl VIDIOC_SUBDEV_G_SELECTION, VIDIOC_SUBDEV_S_SELECTION

Name

VIDIOC_SUBDEV_G_SELECTION - VIDIOC_SUBDEV_S_SELECTION - Get or set selection rectangles on a subdev pad

Synopsis

int ioctl(int fd, VIDIOC_SUBDEV_G_SELECTION, struct v4l2_subdev_selection *argp) int ioctl(int fd, VIDIOC_SUBDEV_S_SELECTION, struct v4l2_subdev_selection *argp)

Arguments

fd File descriptor returned by open().

argp

Description

The selections are used to configure various image processing functionality performed by the subdevs which affect the image size. This currently includes cropping, scaling and composition.

The selection API replaces the old subdev crop API. All the function of the crop API, and more, are supported by the selections API.

See

Sub-device Interface

for more information on how each selection target affects the image processing pipeline inside the subdevice.

274 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Types of selection targets There are two types of selection targets: actual and bounds. The actual targets are the targets which configure the hardware. The BOUNDS target will return a rectangle that contain all possible actual rectangles.

Discovering supported features To discover which targets are supported, the user can perform VID-

IOC_SUBDEV_G_SELECTION on them. Any unsupported target will return EINVAL.

Selection targets and flags are documented in Common selection definitions.

v4l2_subdev_selection

__u32

__u32

__u32

__u32 struct

v4l2_rect

__u32

Table 1.160: struct v4l2_subdev_selection which pad target flags r reserved[8]

Active or try selection,

v4l2_subdev_format_whence.

from enum

Pad number as reported by the media framework.

Target selection rectangle. See Common selection

definitions.

Flags. See Selection flags.

Selection rectangle, in pixels.

Reserved for future extensions. Applications and drivers must set the array to zero.

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 Generic Error Codes chapter.

EBUSY The selection rectangle can't be changed because the pad is currently busy. This can be caused, for instance, by an active video stream on the pad. The ioctl must not be retried without performing another action to fix the problem first. Only returned by VIDIOC_SUBDEV_S_SELECTION

EINVAL The struct v4l2_subdev_selection pad references a non-existing pad, the which field references a non-existing format, or the selection target is not supported on the given subdev pad.

ioctl VIDIOC_SUBSCRIBE_EVENT, VIDIOC_UNSUBSCRIBE_EVENT

Name

VIDIOC_SUBSCRIBE_EVENT - VIDIOC_UNSUBSCRIBE_EVENT - Subscribe or unsubscribe event

Synopsis

int ioctl(int fd, VIDIOC_SUBSCRIBE_EVENT, struct v4l2_event_subscription *argp) int ioctl(int fd, VIDIOC_UNSUBSCRIBE_EVENT, struct v4l2_event_subscription *argp)

Arguments

fd File descriptor returned by open().

argp

1.2. Part I - Video for Linux API 275

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Description

Subscribe or unsubscribe V4L2 event.

Subscribed events are dequeued by using the ioctl VID-

IOC_DQEVENT ioctl.

v4l2_event_subscription

__u32

Table 1.161: struct v4l2_event_subscription type Type of the event, see Event Types.

Note:

V4L2_EVENT_ALL can be used with VID-

IOC_UNSUBSCRIBE_EVENT for unsubscribing

all events at once.

__u32

__u32

__u32 id flags reserved[5]

ID of the event source. If there is no ID associated with the event source, then set this to 0. Whether or not an event needs an ID depends on the event type.

Event flags, see Event Flags.

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

V4L2_EVENT_SUB_FL_SEND_INITIAL

Table 1.162: Event Flags

0x0001

V4L2_EVENT_SUB_FL_ALLOW_FEEDBACK 0x0002

When this event is subscribed an initial event will be sent containing the current status. This only makes sense for events that are triggered by a status change such as V4L2_EVENT_CTRL. Other events will ignore this flag.

If set, then events directly caused by an ioctl will also be sent to the filehandle that called that ioctl. For example, changing a control using VID-

IOC_S_CTRL will cause a V4L2_EVENT_CTRL to be sent back to that same filehandle. Normally such events are suppressed to prevent feedback loops where an application changes a control to a one value and then another, and then receives an event telling it that that control has changed to the first value.

Since it can't tell whether that event was caused by another application or by the VIDIOC_S_CTRL call it is hard to decide whether to set the control to the value in the event, or ignore it.

Think carefully when you set this flag so you won't get into situations like that.

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 Generic Error Codes chapter.

276 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2 mmap()

Name

v4l2-mmap - Map device memory into application address space

Synopsis

#include <unistd.h>

#include <sys/mman.h>

void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset)

Arguments

start Map the buffer to this address in the application's address space. When the MAP_FIXED flag is specified, start must be a multiple of the pagesize and mmap will fail when the specified address cannot be used. Use of this option is discouraged; applications should just specify a NULL pointer here.

length Length of the memory area to map. This must be the same value as returned by the driver in the struct

v4l2_buffer

length field for the single-planar API, and the same value as returned by the driver in the struct

v4l2_plane

length field for the multi-planar API.

prot The prot argument describes the desired memory protection. Regardless of the device type and the direction of data exchange it should be set to PROT_READ | PROT_WRITE, permitting read and write access to image buffers. Drivers should support at least this combination of flags.

Note:

1. The Linux videobuf kernel module, which is used by some drivers supports only PROT_READ

| PROT_WRITE. When the driver does not support the desired protection, the mmap() function

fails.

2. Device memory accesses (e. g. the memory on a graphics card with video capturing hardware) may incur a performance penalty compared to main memory accesses, or reads may be significantly slower than writes or vice versa. Other I/O methods may be more efficient in such case.

flags The flags parameter specifies the type of the mapped object, mapping options and whether modifications made to the mapped copy of the page are private to the process or are to be shared with other references.

MAP_FIXED requests that the driver selects no other address than the one specified. If the specified address cannot be used, mmap() will fail. If MAP_FIXED is specified, start must be a multiple of the pagesize. Use of this option is discouraged.

One of the MAP_SHARED or MAP_PRIVATE flags must be set. MAP_SHARED allows applications to share the mapped memory with other (e. g. child-) processes.

Note:

The Linux videobuf module which is used by some drivers supports only MAP_SHARED.

MAP_PRIVATE requests copy-on-write semantics.

V4L2 applications should not set the

MAP_PRIVATE, MAP_DENYWRITE, MAP_EXECUTABLE or MAP_ANON flags.

fd File descriptor returned by open().

1.2. Part I - Video for Linux API 277

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

offset Offset of the buffer in device memory. This must be the same value as returned by the driver in the struct

v4l2_buffer

m union offset field for the single-planar API, and the same value as returned by the driver in the struct

v4l2_plane

m union mem_offset field for the multi-planar API.

Description

The mmap() function asks to map length bytes starting at offset in the memory of the device specified by fd into the application address space, preferably at address start. This latter address is a hint only, and is usually specified as 0.

Suitable length and offset parameters are queried with the ioctl VIDIOC_QUERYBUF ioctl. Buffers must be allocated with the ioctl VIDIOC_REQBUFS ioctl before they can be queried.

To unmap buffers the munmap() function is used.

Return Value

On success mmap() returns a pointer to the mapped buffer. On error MAP_FAILED (-1) is returned, and the errno variable is set appropriately. Possible error codes are:

EBADF fd is not a valid file descriptor.

EACCES fd is not open for reading and writing.

EINVAL The start or length or offset are not suitable. (E. g. they are too large, or not aligned on a

PAGESIZE boundary.)

The flags or prot value is not supported.

No buffers have been allocated with the ioctl VIDIOC_REQBUFS ioctl.

ENOMEM Not enough physical or virtual memory was available to complete the request.

V4L2 munmap()

Name

v4l2-munmap - Unmap device memory

Synopsis

#include <unistd.h>

#include <sys/mman.h>

int munmap(void *start, size_t length)

Arguments

start Address of the mapped buffer as returned by the mmap() function.

length Length of the mapped buffer. This must be the same value as given to mmap() and returned by the driver in the struct

v4l2_buffer

length field for the single-planar API and in the struct

v4l2_plane

length field for the multi-planar API.

Description

Unmaps a previously with the mmap() function mapped buffer and frees it, if possible.

278 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Return Value

On success munmap() returns 0, on failure -1 and the errno variable is set appropriately:

EINVAL The start or length is incorrect, or no buffers have been mapped yet.

V4L2 open()

Name

v4l2-open - Open a V4L2 device

Synopsis

#include <fcntl.h>

int open(const char *device_name, int flags)

Arguments

device_name Device to be opened.

flags Open flags. Access mode must be O_RDWR. This is just a technicality, input devices still support only reading and output devices only writing.

When the O_NONBLOCK flag is given, the read() function and the VIDIOC_DQBUF ioctl will return the

EAGAIN error code when no data is available or no buffer is in the driver outgoing queue, otherwise these functions block until data becomes available. All V4L2 drivers exchanging data with applications must support the O_NONBLOCK flag.

Other flags have no effect.

Description

To open a V4L2 device applications call open() with the desired device name. This function has no side effects; all data format parameters, current input or output, control values or other properties remain unchanged. At the first open() call after loading the driver they will be reset to default values, drivers are never in an undefined state.

Return Value

On success open() returns the new file descriptor. On error -1 is returned, and the errno variable is set appropriately. Possible error codes are:

EACCES The caller has no permission to access the device.

EBUSY The driver does not support multiple opens and the device is already in use.

ENXIO No device corresponding to this device special file exists.

ENOMEM Not enough kernel memory was available to complete the request.

EMFILE The process already has the maximum number of files open.

ENFILE The limit on the total number of files open on the system has been reached.

1.2. Part I - Video for Linux API 279

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

V4L2 poll()

Name

v4l2-poll - Wait for some event on a file descriptor

Synopsis

#include <sys/poll.h>

int poll(struct pollfd *ufds, unsigned int nfds, int timeout)

Arguments

Description

With the poll() function applications can suspend execution until the driver has captured data or is ready to accept data for output.

When streaming I/O has been negotiated this function waits until a buffer has been filled by the capture device and can be dequeued with the VIDIOC_DQBUF ioctl. For output devices this function waits until the device is ready to accept a new buffer to be queued up with the ioctl VIDIOC_QBUF, VIDIOC_DQBUF ioctl for display. When buffers are already in the outgoing queue of the driver (capture) or the incoming queue isn't full (display) the function returns immediately.

On success poll() returns the number of file descriptors that have been selected (that is, file descriptors for which the revents field of the respective struct pollfd() structure is non-zero). Capture devices set the POLLIN and POLLRDNORM flags in the revents field, output devices the POLLOUT and POLLWRNORM flags. When the function timed out it returns a value of zero, on failure it returns -1 and the errno variable is set appropriately. When the application did not call ioctl VIDIOC_STREAMON, VIDIOC_STREAMOFF the

poll() function succeeds, but sets the POLLERR flag in the revents field. When the application has called

ioctl VIDIOC_STREAMON, VIDIOC_STREAMOFF for a capture device but hasn't yet called ioctl VIDIOC_QBUF,

VIDIOC_DQBUF, the poll() function succeeds and sets the POLLERR flag in the revents field. For output devices this same situation will cause poll() to succeed as well, but it sets the POLLOUT and POLLWRNORM flags in the revents field.

If an event occurred (see ioctl VIDIOC_DQEVENT) then POLLPRI will be set in the revents field and poll() will return.

When use of the read() function has been negotiated and the driver does not capture yet, the poll() function starts capturing. When that fails it returns a POLLERR as above. Otherwise it waits until data has been captured and can be read. When the driver captures continuously (as opposed to, for example, still images) the function may return immediately.

When use of the write() function has been negotiated and the driver does not stream yet, the poll() function starts streaming. When that fails it returns a POLLERR as above. Otherwise it waits until the driver is ready for a non-blocking write() call.

If the caller is only interested in events (just POLLPRI is set in the events field), then poll() will not start streaming if the driver does not stream yet. This makes it possible to just poll for events and not for buffers.

All drivers implementing the read() or write() function or streaming I/O must also support the poll() function.

For more details see the poll() manual page.

280 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Return Value

On success, poll() returns the number structures which have non-zero revents fields, or zero if the call timed out. On error -1 is returned, and the errno variable is set appropriately:

EBADF One or more of the ufds members specify an invalid file descriptor.

EBUSY The driver does not support multiple read or write streams and the device is already in use.

EFAULT ufds references an inaccessible memory area.

EINTR The call was interrupted by a signal.

EINVAL The nfds argument is greater than OPEN_MAX.

V4L2 read()

Name

v4l2-read - Read from a V4L2 device

Synopsis

#include <unistd.h>

ssize_t read(int fd, void *buf, size_t count)

Arguments

fd File descriptor returned by open().

buf Buffer to be filled

count Max number of bytes to read

Description

read() attempts to read up to count bytes from file descriptor fd into the buffer starting at buf. The layout of the data in the buffer is discussed in the respective device interface section, see ##. If count is zero,

read() returns zero and has no other results. If count is greater than SSIZE_MAX, the result is unspecified.

Regardless of the count value each read() call will provide at most one frame (two fields) worth of data.

By default read() blocks until data becomes available. When the O_NONBLOCK flag was given to the open() function it returns immediately with an EAGAIN error code when no data is available. The select() or poll() functions can always be used to suspend execution until data becomes available. All drivers supporting the read() function must also support select() and poll().

Drivers can implement read functionality in different ways, using a single or multiple buffers and discarding the oldest or newest frames once the internal buffers are filled.

read() never returns a ``snapshot'' of a buffer being filled. Using a single buffer the driver will stop capturing when the application starts reading the buffer until the read is finished. Thus only the period of the vertical blanking interval is available for reading, or the capture rate must fall below the nominal frame rate of the video standard.

The behavior of read() when called during the active picture period or the vertical blanking separating the top and bottom field depends on the discarding policy. A driver discarding the oldest frames keeps capturing into an internal buffer, continuously overwriting the previously, not read frame, and returns the frame being received at the time of the read() call as soon as it is complete.

1.2. Part I - Video for Linux API 281

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

A driver discarding the newest frames stops capturing until the next read() call. The frame being received at read() time is discarded, returning the following frame instead. Again this implies a reduction of the capture rate to one half or less of the nominal frame rate. An example of this model is the video read mode of the bttv driver, initiating a DMA to user memory when read() is called and returning when the

DMA finished.

In the multiple buffer model drivers maintain a ring of internal buffers, automatically advancing to the next free buffer. This allows continuous capturing when the application can empty the buffers fast enough.

Again, the behavior when the driver runs out of free buffers depends on the discarding policy.

Applications can get and set the number of buffers used internally by the driver with the VIDIOC_G_PARM and VIDIOC_S_PARM ioctls. They are optional, however. The discarding policy is not reported and cannot be changed. For minimum requirements see

Interfaces

.

Return Value

On success, the number of bytes read is returned. It is not an error if this number is smaller than the number of bytes requested, or the amount of data required for one frame. This may happen for example because read() was interrupted by a signal. On error, -1 is returned, and the errno variable is set appropriately. In this case the next read will start at the beginning of a new frame. Possible error codes are:

EAGAIN Non-blocking I/O has been selected using O_NONBLOCK and no data was immediately available for reading.

EBADF fd is not a valid file descriptor or is not open for reading, or the process already has the maximum number of files open.

EBUSY The driver does not support multiple read streams and the device is already in use.

EFAULT buf references an inaccessible memory area.

EINTR The call was interrupted by a signal before any data was read.

EIO I/O error. This indicates some hardware problem or a failure to communicate with a remote device

(USB camera etc.).

EINVAL The read() function is not supported by this driver, not on this device, or generally not on this type of device.

V4L2 select()

Name

v4l2-select - Synchronous I/O multiplexing

Synopsis

#include <sys/time.h>

#include <sys/types.h>

#include <unistd.h>

int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout)

Arguments

nfds The highest-numbered file descriptor in any of the three sets, plus 1.

readfds File descriptions to be watched if a read() call won't block.

282 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

writefds File descriptions to be watched if a write() won't block.

exceptfds File descriptions to be watched for V4L2 events.

timeout Maximum time to wait.

Description

With the select() function applications can suspend execution until the driver has captured data or is ready to accept data for output.

When streaming I/O has been negotiated this function waits until a buffer has been filled or displayed and can be dequeued with the VIDIOC_DQBUF ioctl. When buffers are already in the outgoing queue of the driver the function returns immediately.

On success select() returns the total number of bits set in struct fd_set(). When the function timed out it returns a value of zero. On failure it returns -1 and the errno variable is set appropriately. When the application did not call ioctl VIDIOC_QBUF, VIDIOC_DQBUF or ioctl VIDIOC_STREAMON, VIDIOC_STREAMOFF yet the select() function succeeds, setting the bit of the file descriptor in readfds or writefds, but subsequent VIDIOC_DQBUF calls will fail.

68

When use of the read() function has been negotiated and the driver does not capture yet, the select() function starts capturing. When that fails, select() returns successful and a subsequent read() call, which also attempts to start capturing, will return an appropriate error code. When the driver captures continuously (as opposed to, for example, still images) and data is already available the select() function returns immediately.

When use of the write() function has been negotiated the select() function just waits until the driver is ready for a non-blocking write() call.

All drivers implementing the read() or write() function or streaming I/O must also support the select() function.

For more details see the select() manual page.

Return Value

On success, select() returns the number of descriptors contained in the three returned descriptor sets, which will be zero if the timeout expired. On error -1 is returned, and the errno variable is set appropriately; the sets and timeout are undefined. Possible error codes are:

EBADF One or more of the file descriptor sets specified a file descriptor that is not open.

EBUSY The driver does not support multiple read or write streams and the device is already in use.

EFAULT The readfds, writefds, exceptfds or timeout pointer references an inaccessible memory area.

EINTR The call was interrupted by a signal.

EINVAL The nfds argument is less than zero or greater than FD_SETSIZE.

V4L2 write()

Name

v4l2-write - Write to a V4L2 device

68

The Linux kernel implements select() like the poll() function, but select() cannot return a POLLERR.

1.2. Part I - Video for Linux API 283

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Synopsis

#include <unistd.h>

ssize_t write(int fd, void *buf, size_t count)

Arguments

fd File descriptor returned by open().

buf Buffer with data to be written

count Number of bytes at the buffer

Description

write() writes up to count bytes to the device referenced by the file descriptor fd from the buffer starting at buf. When the hardware outputs are not active yet, this function enables them. When count is zero,

write() returns 0 without any other effect.

When the application does not provide more data in time, the previous video frame, raw VBI image, sliced

VPS or WSS data is displayed again. Sliced Teletext or Closed Caption data is not repeated, the driver inserts a blank line instead.

Return Value

On success, the number of bytes written are returned. Zero indicates nothing was written. On error, -1 is returned, and the errno variable is set appropriately. In this case the next write will start at the beginning of a new frame. Possible error codes are:

EAGAIN Non-blocking I/O has been selected using the O_NONBLOCK flag and no buffer space was available to write the data immediately.

EBADF fd is not a valid file descriptor or is not open for writing.

EBUSY The driver does not support multiple write streams and the device is already in use.

EFAULT buf references an inaccessible memory area.

EINTR The call was interrupted by a signal before any data was written.

EIO I/O error. This indicates some hardware problem.

EINVAL The write() function is not supported by this driver, not on this device, or generally not on this type of device.

1.2.9 Common definitions for V4L2 and V4L2 subdev interfaces

Common selection definitions

While the

V4L2 selection API

and

V4L2 subdev selection APIs

are very similar, there's one fundamental difference between the two. On sub-device API, the selection rectangle refers to the media bus format, and is bound to a sub-device's pad. On the V4L2 interface the selection rectangles refer to the in-memory pixel format.

This section defines the common definitions of the selection interfaces on the two APIs.

284 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Selection targets

The precise meaning of the selection targets may be dependent on which of the two interfaces they are used.

Target name

Table 1.163: Selection target definitions id Definition

V4L2_SEL_TGT_CROP

V4L2_SEL_TGT_CROP_DEFAULT

V4L2_SEL_TGT_CROP_BOUNDS

V4L2_SEL_TGT_NATIVE_SIZE

0x0000 Crop rectangle. Defines the cropped area.

0x0001 Suggested cropping rectangle that covers the ``whole picture''.

0x0002 Bounds of the crop rectangle.

All valid crop rectangles fit inside the crop bounds rectangle.

0x0003 The native size of the device, e.g.

a sensor's pixel array.

left and top fields are zero for this target.

Setting the native size will generally only make sense for memory to memory devices where the software can create a canvas of a given size in which for example a video frame can be composed. In that case

V4L2_SEL_TGT_NATIVE_SIZE can be used to configure the size of that canvas.

V4L2_SEL_TGT_COMPOSE 0x0100 Compose rectangle. Used to configure scaling and composition.

V4L2_SEL_TGT_COMPOSE_DEFAULT 0x0101 Suggested composition rectangle that covers the ``whole picture''.

V4L2_SEL_TGT_COMPOSE_BOUNDS 0x0102 Bounds of the compose rectangle. All valid compose rectangles fit inside the compose bounds rectangle.

V4L2_SEL_TGT_COMPOSE_PADDED 0x0103 The active area and all padding pixels that are inserted or modified by hardware.

Valid for

V4L2

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Valid for

V4L2 subdev

Yes

No

Yes

Yes

Yes

No

Yes

No

1.2. Part I - Video for Linux API 285

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

Selection flags

Flag name

V4L2_SEL_FLAG_GE

V4L2_SEL_FLAG_LE

Table 1.164: Selection flag definitions id

(1 << 0)

(1 << 1)

V4L2_SEL_FLAG_KEEP_CONFIG (1 << 2)

Definition

Suggest the driver it should choose greater or equal rectangle (in size) than was requested.

Albeit the driver may choose a lesser size, it will only do so due to hardware limitations.

Without this flag (and

V4L2_SEL_FLAG_LE) the behaviour is to choose the closest possible rectangle.

Suggest the driver it should choose lesser or equal rectangle (in size) than was requested. Albeit the driver may choose a greater size, it will only do so due to hardware limitations.

The configuration must not be propagated to any further processing steps.

If this flag is not given, the configuration is propagated inside the subdevice to all further processing steps.

Valid for

V4L2

Yes

Yes

No

Valid for

V4L2 subdev

Yes

Yes

Yes

1.2.10 Video For Linux Two Header File videodev2.h

/*

* Video for Linux Two header file

*

* Copyright (C) 1999-2012 the contributors

*

* This program is free software; you can redistribute it and/or modify

* it under the terms of the GNU General Public License as published by

* the Free Software Foundation; either version 2 of the License, or

* (at your option) any later version.

*

* This program is distributed in the hope that it will be useful,

* but WITHOUT ANY WARRANTY; without even the implied warranty of

* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

See the

* GNU General Public License for more details.

*

* Alternatively you can redistribute this file under the terms of the

* BSD license as stated below:

*

* Redistribution and use in source and binary forms, with or without

* modification, are permitted provided that the following conditions

* are met:

* 1. Redistributions of source code must retain the above copyright

* notice, this list of conditions and the following disclaimer.

* 2. Redistributions in binary form must reproduce the above copyright

* notice, this list of conditions and the following disclaimer in

286 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

* the documentation and/or other materials provided with the

* distribution.

* 3. The names of its contributors may not be used to endorse or promote

*

* products derived from this software without specific prior written permission.

*

* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS

* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT

* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR

* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT

* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,

* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED

* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR

* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF

* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING

* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS

* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

*

* Header file for v4l or V4L2 drivers and applications

* with public API.

* All kernel-specific stuff were moved to media/v4l2-dev.h, so

* no #if __KERNEL tests are allowed here

*

*

*

* See https://linuxtv.org for more info

*

*

*

*/

Author: Bill Dirks < [email protected]

>

Justin Schoeman

Hans Verkuil < et al.

[email protected]

#ifndef _UAPI__LINUX_VIDEODEV2_H

#define _UAPI__LINUX_VIDEODEV2_H

>

#ifndef __KERNEL__

#include <sys/time.h>

#endif

#include <linux/compiler.h>

#include <linux/ioctl.h>

#include <linux/types.h>

#include <linux/v4l2-common.h>

#include <linux/v4l2-controls.h>

/*

* Common stuff for both V4L1 and V4L2

* Moved from videodev.h

*/

#define VIDEO_MAX_FRAME

#define VIDEO_MAX_PLANES

32

8

/*

*

*/

M I S C E L L A N E O U S

/* Four-character-code (FOURCC) */

#define v4l2_fourcc(a, b, c, d)\

((__u32)(a) | ((__u32)(b) << 8) | ((__u32)(c) << 16) | ((__u32)(d) << 24))

#define v4l2_fourcc_be(a, b, c, d) (v4l2_fourcc(a, b, c, d) | (1 << 31))

1.2. Part I - Video for Linux API 287

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

/*

*

*/

E N U M S enum 0order:c.v4l2_fieldmedia/uapi/v4l/field0order:c.v4l2_fieldv4l2_field {

0order:c.v4l2_fieldmedia/uapi/v4l/field0order:c.v4l2_fieldV4L2_FIELD_ANY

= 0, /* driver can choose from none, top, bottom, interlaced order:c.v4l2_fieldV4L2_FIELD_NONE

order:c.v4l2_fieldV4L2_FIELD_TOP

order:c.v4l2_fieldV4L2_FIELD_BOTTOM

order:c.v4l2_fieldV4L2_FIELD_INTERLACED

depending on whatever it thinks is approximate ... */

0order:c.v4l2_fieldmedia/uapi/v4l/field0-

= 1, /* this device has no fields ... */

0order:c.v4l2_fieldmedia/uapi/v4l/field0-

= 2, /* top field only */

0order:c.v4l2_fieldmedia/uapi/v4l/field0-

= 3, /* bottom field only */

0order:c.v4l2_fieldmedia/uapi/v4l/field0-

= 4, /* both fields interlaced */

0order:c.v4l2_fieldmedia/uapi/v4l/field0order:c.v4l2_fieldV4L2_FIELD_SEQ_TB

order:c.v4l2_fieldV4L2_FIELD_SEQ_BT

order:c.v4l2_fieldV4L2_FIELD_ALTERNATE

= 5, /* both fields sequential into one buffer, top-bottom order */

0order:c.v4l2_fieldmedia/uapi/v4l/field0-

= 6, /* same as above + bottom-top order */

0order:c.v4l2_fieldmedia/uapi/v4l/field0-

= 7, /* both fields alternating into separate buffers */

0order:c.v4l2_fieldmedia/uapi/v4l/field0order:c.v4l2_fieldV4L2_FIELD_INTERLACED_TB = 8, /* both fields interlaced, top field first and the top field is transmitted first */

0order:c.v4l2_fieldmedia/uapi/v4l/field0order:c.v4l2_fieldV4L2_FIELD_INTERLACED_BT = 9, /* both fields interlaced, top field first and the bottom field is transmitted first */

};

#define V4L2_FIELD_HAS_TOP(field)

((field) order:c.v4l2_fieldV4L2_FIELD_TOP

(field)

\

==

||\

== order:c.v4l2_fieldV4L2_FIELD_INTERLACED ||\

0order:c.v4l2_fieldmedia/uapi/v4l/field0-

0order:c.v4l2_fieldmedia/uapi/v4l/field0-

(field) == order:c.v4l2_fieldV4L2_FIELD_INTERLACED_TB ||\

0order:c.v4l2_fieldmedia/uapi/v4l/field0-

(field) == order:c.v4l2_fieldV4L2_FIELD_INTERLACED_BT ||\

0order:c.v4l2_fieldmedia/uapi/v4l/field0-

(field) order:c.v4l2_fieldV4L2_FIELD_SEQ_TB

==

||\

0order:c.v4l2_fieldmedia/uapi/v4l/field0-

(field) order:c.v4l2_fieldV4L2_FIELD_SEQ_BT)

#define V4L2_FIELD_HAS_BOTTOM(field)

((field) order:c.v4l2_fieldV4L2_FIELD_BOTTOM

(field)

==

\

==

||\

== order:c.v4l2_fieldV4L2_FIELD_INTERLACED ||\

(field) ==

0order:c.v4l2_fieldmedia/uapi/v4l/field0-

0order:c.v4l2_fieldmedia/uapi/v4l/field0-

0order:c.v4l2_fieldmedia/uapi/v4l/field0-

0order:c.v4l2_fieldmedia/uapi/v4l/field0order:c.v4l2_fieldV4L2_FIELD_INTERLACED_TB ||\

(field) == 0order:c.v4l2_fieldmedia/uapi/v4l/field0order:c.v4l2_fieldV4L2_FIELD_INTERLACED_BT ||\

(field) == 0order:c.v4l2_fieldmedia/uapi/v4l/field0order:c.v4l2_fieldV4L2_FIELD_SEQ_TB

||\

288 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

(field) == order:c.v4l2_fieldV4L2_FIELD_SEQ_BT)

#define V4L2_FIELD_HAS_BOTH(field)

((field)

\

== order:c.v4l2_fieldV4L2_FIELD_INTERLACED ||\

0order:c.v4l2_fieldmedia/uapi/v4l/field0-

0order:c.v4l2_fieldmedia/uapi/v4l/field0-

(field) == order:c.v4l2_fieldV4L2_FIELD_INTERLACED_TB ||\

0order:c.v4l2_fieldmedia/uapi/v4l/field0-

(field) == order:c.v4l2_fieldV4L2_FIELD_INTERLACED_BT ||\

0order:c.v4l2_fieldmedia/uapi/v4l/field0-

(field) order:c.v4l2_fieldV4L2_FIELD_SEQ_TB ||\

== 0order:c.v4l2_fieldmedia/uapi/v4l/field0-

== 0order:c.v4l2_fieldmedia/uapi/v4l/field0(field) order:c.v4l2_fieldV4L2_FIELD_SEQ_BT)

#define V4L2_FIELD_HAS_T_OR_B(field)

((field)

\

== 0order:c.v4l2_fieldmedia/uapi/v4l/field0order:c.v4l2_fieldV4L2_FIELD_BOTTOM ||\

(field) order:c.v4l2_fieldV4L2_FIELD_TOP ||\

(field) order:c.v4l2_fieldV4L2_FIELD_ALTERNATE)

==

==

0order:c.v4l2_fieldmedia/uapi/v4l/field0-

0order:c.v4l2_fieldmedia/uapi/v4l/field0enum

v4l2_buf_type

{

V4L2_BUF_TYPE_VIDEO_CAPTURE

V4L2_BUF_TYPE_VIDEO_OUTPUT

V4L2_BUF_TYPE_VIDEO_OVERLAY

V4L2_BUF_TYPE_VBI_CAPTURE

V4L2_BUF_TYPE_VBI_OUTPUT

V4L2_BUF_TYPE_SLICED_VBI_CAPTURE

V4L2_BUF_TYPE_SLICED_VBI_OUTPUT

= 1,

= 2,

= 3,

= 4,

= 5,

= 6,

= 7,

V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY

= 8,

V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE

= 9,

V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE

= 10,

V4L2_BUF_TYPE_SDR_CAPTURE

V4L2_BUF_TYPE_SDR_OUTPUT

/* Deprecated, do not use */

V4L2_BUF_TYPE_PRIVATE

= 11,

= 12,

= 0x80,

};

#define V4L2_TYPE_IS_MULTIPLANAR(type)

((type) ==

V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE

|| (type) ==

V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE )

\

\

#define V4L2_TYPE_IS_OUTPUT(type)

((type) ==

V4L2_BUF_TYPE_VIDEO_OUTPUT

|| (type) ==

V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE

|| (type) ==

V4L2_BUF_TYPE_VIDEO_OVERLAY

|| (type) ==

V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY

|| (type) ==

V4L2_BUF_TYPE_VBI_OUTPUT

|| (type) ==

V4L2_BUF_TYPE_SLICED_VBI_OUTPUT

|| (type) ==

V4L2_BUF_TYPE_SDR_OUTPUT )

\

\

\

\

\

\

\ enum 0g0tuner:c.v4l2_tuner_typemedia/uapi/v4l/vidioc0g0tuner:c.v4l2_tuner_typev4l2_tuner_type {

0g0tuner:c.v4l2_tuner_typemedia/uapi/v4l/vidioc0g0tuner:c.v4l2_tuner_typeV4L2_TUNER_RADIO

= 1,

0g0tuner:c.v4l2_tuner_typemedia/uapi/v4l/vidioc0g0tuner:c.v4l2_tuner_typeV4L2_TUNER_ANALOG_TV

V4L2_TUNER_DIGITAL_TV = 3,

= 2,

0g0tuner:c.v4l2_tuner_typemedia/uapi/v4l/vidioc0g0-

1.2. Part I - Video for Linux API 289

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

tuner:c.v4l2_tuner_typeV4L2_TUNER_SDR

= 4, tuner:c.v4l2_tuner_typeV4L2_TUNER_RF

0g0tuner:c.v4l2_tuner_typemedia/uapi/v4l/vidioc0g0-

= 5,

};

/* Deprecated, do not use */

#define V4L2_TUNER_ADC 0g0tuner:c.v4l2_tuner_typemedia/uapi/v4l/vidioc0g0tuner:c.v4l2_tuner_typeV4L2_TUNER_SDR

enum

v4l2_memory

{

V4L2_MEMORY_MMAP

V4L2_MEMORY_USERPTR

V4L2_MEMORY_OVERLAY

V4L2_MEMORY_DMABUF

};

= 1,

= 2,

= 3,

= 4,

/* see also http://vektor.theorem.ca/graphics/ycbcr/ */ enum 0006:c.v4l2_colorspacemedia/uapi/v4l/pixfmt0006:c.v4l2_colorspacev4l2_colorspace {

/*

* Default colorspace, i.e. let the driver figure it out.

* Can only be used with video capture.

*/

0006:c.v4l2_colorspacemedia/uapi/v4l/pixfmt0-

006:c.v4l2_colorspaceV4L2_COLORSPACE_DEFAULT

= 0,

/* SMPTE 170M: used for broadcast NTSC/PAL SDTV */

0006:c.v4l2_colorspacemedia/uapi/v4l/pixfmt0-

006:c.v4l2_colorspaceV4L2_COLORSPACE_SMPTE170M

= 1,

/* Obsolete pre-1998 SMPTE 240M HDTV standard, superseded by Rec 709 */

0006:c.v4l2_colorspacemedia/uapi/v4l/pixfmt0-

006:c.v4l2_colorspaceV4L2_COLORSPACE_SMPTE240M

= 2,

/* Rec.709: used for HDTV */

0006:c.v4l2_colorspacemedia/uapi/v4l/pixfmt0-

006:c.v4l2_colorspaceV4L2_COLORSPACE_REC709

= 3,

/*

* Deprecated, do not use. No driver will ever return this. This was

* based on a misunderstanding of the bt878 datasheet.

*/

V4L2_COLORSPACE_BT878 = 4,

/*

* NTSC 1953 colorspace. This only makes sense when dealing with

* really, really old NTSC recordings. Superseded by SMPTE 170M.

*/

0006:c.v4l2_colorspacemedia/uapi/v4l/pixfmt0-

006:c.v4l2_colorspaceV4L2_COLORSPACE_470_SYSTEM_M

= 5,

/*

* EBU Tech 3213 PAL/SECAM colorspace. This only makes sense when

* dealing with really old PAL/SECAM recordings. Superseded by

* SMPTE 170M.

*/

0006:c.v4l2_colorspacemedia/uapi/v4l/pixfmt0-

006:c.v4l2_colorspaceV4L2_COLORSPACE_470_SYSTEM_BG = 6,

290 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

/*

* Effectively shorthand for 0006:c.v4l2_colorspacemedia/uapi/v4l/pixfmt0-

006:c.v4l2_colorspaceV4L2_COLORSPACE_SRGB, 0006:c.v4l2_ycbcr_encodingmedia/uapi/v4l/pixfmt0-

006:c.v4l2_ycbcr_encodingV4L2_YCBCR_ENC_601

* and V4L2_QUANTIZATION_FULL_RANGE. To be used for (Motion-)JPEG.

*/

006:c.v4l2_colorspaceV4L2_COLORSPACE_JPEG

0006:c.v4l2_colorspacemedia/uapi/v4l/pixfmt0-

= 7,

/* For RGB colorspaces such as produces by most webcams. */

0006:c.v4l2_colorspacemedia/uapi/v4l/pixfmt0-

006:c.v4l2_colorspaceV4L2_COLORSPACE_SRGB

= 8,

/* AdobeRGB colorspace */

0006:c.v4l2_colorspacemedia/uapi/v4l/pixfmt0-

006:c.v4l2_colorspaceV4L2_COLORSPACE_ADOBERGB

= 9,

/* BT.2020 colorspace, used for UHDTV. */

0006:c.v4l2_colorspacemedia/uapi/v4l/pixfmt0-

006:c.v4l2_colorspaceV4L2_COLORSPACE_BT2020

= 10,

/* Raw colorspace: for RAW unprocessed images */

0006:c.v4l2_colorspacemedia/uapi/v4l/pixfmt0-

006:c.v4l2_colorspaceV4L2_COLORSPACE_RAW

= 11,

006:c.v4l2_colorspaceV4L2_COLORSPACE_DCI_P3

};

/* DCI-P3 colorspace, used by cinema projectors */

0006:c.v4l2_colorspacemedia/uapi/v4l/pixfmt0-

= 12,

/*

* Determine how COLORSPACE_DEFAULT should map to a proper colorspace.

* This depends on whether this is a SDTV image (use SMPTE 170M), an

* HDTV image (use Rec. 709), or something else (use sRGB).

*/

#define V4L2_MAP_COLORSPACE_DEFAULT(is_sdtv, is_hdtv) \

((is_sdtv) ?

0006:c.v4l2_colorspacemedia/uapi/v4l/pixfmt0-

006:c.v4l2_colorspaceV4L2_COLORSPACE_SMPTE170M : \

((is_hdtv) ?

0006:c.v4l2_colorspacemedia/uapi/v4l/pixfmt0-

006:c.v4l2_colorspaceV4L2_COLORSPACE_REC709 : 0006:c.v4l2_colorspacemedia/uapi/v4l/pixfmt0-

006:c.v4l2_colorspaceV4L2_COLORSPACE_SRGB)) enum 0006:c.v4l2_xfer_funcmedia/uapi/v4l/pixfmt0006:c.v4l2_xfer_funcv4l2_xfer_func {

/*

* Mapping of 0006:c.v4l2_xfer_funcmedia/uapi/v4l/pixfmt0-

006:c.v4l2_xfer_funcV4L2_XFER_FUNC_DEFAULT to actual transfer functions

* for the various colorspaces:

*

* 0006:c.v4l2_colorspacemedia/uapi/v4l/pixfmt0-

006:c.v4l2_colorspaceV4L2_COLORSPACE_SMPTE170M, 0006:c.v4l2_colorspacemedia/uapi/v4l/pixfmt0-

006:c.v4l2_colorspaceV4L2_COLORSPACE_470_SYSTEM_M,

* 0006:c.v4l2_colorspacemedia/uapi/v4l/pixfmt0-

006:c.v4l2_colorspaceV4L2_COLORSPACE_470_SYSTEM_BG, 0006:c.v4l2_colorspacemedia/uapi/v4l/pixfmt0-

006:c.v4l2_colorspaceV4L2_COLORSPACE_REC709 and

* 0006:c.v4l2_colorspacemedia/uapi/v4l/pixfmt0-

006:c.v4l2_colorspaceV4L2_COLORSPACE_BT2020: 0006:c.v4l2_xfer_funcmedia/uapi/v4l/pixfmt0-

006:c.v4l2_xfer_funcV4L2_XFER_FUNC_709

*

1.2. Part I - Video for Linux API 291

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

* 0006:c.v4l2_colorspacemedia/uapi/v4l/pixfmt0-

006:c.v4l2_colorspaceV4L2_COLORSPACE_SRGB, 0006:c.v4l2_colorspacemedia/uapi/v4l/pixfmt0-

006:c.v4l2_colorspaceV4L2_COLORSPACE_JPEG: 0006:c.v4l2_xfer_funcmedia/uapi/v4l/pixfmt0-

006:c.v4l2_xfer_funcV4L2_XFER_FUNC_SRGB

*

* 0006:c.v4l2_colorspacemedia/uapi/v4l/pixfmt0-

006:c.v4l2_colorspaceV4L2_COLORSPACE_ADOBERGB: 0006:c.v4l2_xfer_funcmedia/uapi/v4l/pixfmt0-

006:c.v4l2_xfer_funcV4L2_XFER_FUNC_ADOBERGB

*

* 0006:c.v4l2_colorspacemedia/uapi/v4l/pixfmt0-

006:c.v4l2_colorspaceV4L2_COLORSPACE_SMPTE240M: 0006:c.v4l2_xfer_funcmedia/uapi/v4l/pixfmt0-

006:c.v4l2_xfer_funcV4L2_XFER_FUNC_SMPTE240M

*

* 0006:c.v4l2_colorspacemedia/uapi/v4l/pixfmt0-

006:c.v4l2_colorspaceV4L2_COLORSPACE_RAW: 0006:c.v4l2_xfer_funcmedia/uapi/v4l/pixfmt0-

006:c.v4l2_xfer_funcV4L2_XFER_FUNC_NONE

*

* 0006:c.v4l2_colorspacemedia/uapi/v4l/pixfmt0-

006:c.v4l2_colorspaceV4L2_COLORSPACE_DCI_P3: 0006:c.v4l2_xfer_funcmedia/uapi/v4l/pixfmt0-

006:c.v4l2_xfer_funcV4L2_XFER_FUNC_DCI_P3

*/

006:c.v4l2_xfer_funcV4L2_XFER_FUNC_DEFAULT

006:c.v4l2_xfer_funcV4L2_XFER_FUNC_709

0006:c.v4l2_xfer_funcmedia/uapi/v4l/pixfmt0-

= 0,

0006:c.v4l2_xfer_funcmedia/uapi/v4l/pixfmt0-

= 1,

006:c.v4l2_xfer_funcV4L2_XFER_FUNC_SRGB

0006:c.v4l2_xfer_funcmedia/uapi/v4l/pixfmt0-

= 2,

006:c.v4l2_xfer_funcV4L2_XFER_FUNC_ADOBERGB

0006:c.v4l2_xfer_funcmedia/uapi/v4l/pixfmt0-

= 3,

006:c.v4l2_xfer_funcV4L2_XFER_FUNC_NONE

0006:c.v4l2_xfer_funcmedia/uapi/v4l/pixfmt0-

006:c.v4l2_xfer_funcV4L2_XFER_FUNC_SMPTE240M

= 4,

0006:c.v4l2_xfer_funcmedia/uapi/v4l/pixfmt0-

= 5,

0006:c.v4l2_xfer_funcmedia/uapi/v4l/pixfmt0-

006:c.v4l2_xfer_funcV4L2_XFER_FUNC_DCI_P3

006:c.v4l2_xfer_funcV4L2_XFER_FUNC_SMPTE2084

};

= 6,

0006:c.v4l2_xfer_funcmedia/uapi/v4l/pixfmt0-

= 7,

/*

* Determine how XFER_FUNC_DEFAULT should map to a proper transfer function.

* This depends on the colorspace.

*/

#define V4L2_MAP_XFER_FUNC_DEFAULT(colsp) \

((colsp) == 0006:c.v4l2_colorspacemedia/uapi/v4l/pixfmt0-

006:c.v4l2_colorspaceV4L2_COLORSPACE_ADOBERGB ?

0006:c.v4l2_xfer_funcmedia/uapi/v4l/pixfmt0-

006:c.v4l2_xfer_funcV4L2_XFER_FUNC_ADOBERGB : \

((colsp) == 0006:c.v4l2_colorspacemedia/uapi/v4l/pixfmt0-

006:c.v4l2_colorspaceV4L2_COLORSPACE_SMPTE240M ?

0006:c.v4l2_xfer_funcmedia/uapi/v4l/pixfmt0-

006:c.v4l2_xfer_funcV4L2_XFER_FUNC_SMPTE240M : \

((colsp) == 0006:c.v4l2_colorspacemedia/uapi/v4l/pixfmt0-

006:c.v4l2_colorspaceV4L2_COLORSPACE_DCI_P3 ?

0006:c.v4l2_xfer_funcmedia/uapi/v4l/pixfmt0-

006:c.v4l2_xfer_funcV4L2_XFER_FUNC_DCI_P3 : \

((colsp) == 0006:c.v4l2_colorspacemedia/uapi/v4l/pixfmt0-

006:c.v4l2_colorspaceV4L2_COLORSPACE_RAW ?

0006:c.v4l2_xfer_funcmedia/uapi/v4l/pixfmt0-

006:c.v4l2_xfer_funcV4L2_XFER_FUNC_NONE : \

((colsp) == 0006:c.v4l2_colorspacemedia/uapi/v4l/pixfmt0-

006:c.v4l2_colorspaceV4L2_COLORSPACE_SRGB

|| (colsp) == 0-

292 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

006:c.v4l2_colorspacemedia/uapi/v4l/pixfmt0006:c.v4l2_colorspaceV4L2_COLORSPACE_JPEG ? \

0006:c.v4l2_xfer_funcmedia/uapi/v4l/pixfmt0-

006:c.v4l2_xfer_funcV4L2_XFER_FUNC_SRGB : 0006:c.v4l2_xfer_funcmedia/uapi/v4l/pixfmt0-

006:c.v4l2_xfer_funcV4L2_XFER_FUNC_709))))) enum 0006:c.v4l2_ycbcr_encodingmedia/uapi/v4l/pixfmt0006:c.v4l2_ycbcr_encodingv4l2_ycbcr_encoding {

/*

* Mapping of 0006:c.v4l2_ycbcr_encodingmedia/uapi/v4l/pixfmt0-

006:c.v4l2_ycbcr_encodingV4L2_YCBCR_ENC_DEFAULT to actual encodings for the

* various colorspaces:

*

* 0006:c.v4l2_colorspacemedia/uapi/v4l/pixfmt0-

006:c.v4l2_colorspaceV4L2_COLORSPACE_SMPTE170M, 0006:c.v4l2_colorspacemedia/uapi/v4l/pixfmt0-

006:c.v4l2_colorspaceV4L2_COLORSPACE_470_SYSTEM_M,

* 0006:c.v4l2_colorspacemedia/uapi/v4l/pixfmt0-

006:c.v4l2_colorspaceV4L2_COLORSPACE_470_SYSTEM_BG, 0006:c.v4l2_colorspacemedia/uapi/v4l/pixfmt0-

006:c.v4l2_colorspaceV4L2_COLORSPACE_SRGB,

* 0006:c.v4l2_colorspacemedia/uapi/v4l/pixfmt0-

006:c.v4l2_colorspaceV4L2_COLORSPACE_ADOBERGB and 0006:c.v4l2_colorspacemedia/uapi/v4l/pixfmt0-

006:c.v4l2_colorspaceV4L2_COLORSPACE_JPEG: 0006:c.v4l2_ycbcr_encodingmedia/uapi/v4l/pixfmt0-

006:c.v4l2_ycbcr_encodingV4L2_YCBCR_ENC_601

*

* 0006:c.v4l2_colorspacemedia/uapi/v4l/pixfmt0-

006:c.v4l2_colorspaceV4L2_COLORSPACE_REC709 and 0006:c.v4l2_colorspacemedia/uapi/v4l/pixfmt0-

006:c.v4l2_colorspaceV4L2_COLORSPACE_DCI_P3: 0006:c.v4l2_ycbcr_encodingmedia/uapi/v4l/pixfmt0-

006:c.v4l2_ycbcr_encodingV4L2_YCBCR_ENC_709

*

* 0006:c.v4l2_colorspacemedia/uapi/v4l/pixfmt0-

006:c.v4l2_colorspaceV4L2_COLORSPACE_BT2020: 0006:c.v4l2_ycbcr_encodingmedia/uapi/v4l/pixfmt0-

006:c.v4l2_ycbcr_encodingV4L2_YCBCR_ENC_BT2020

*

* 0006:c.v4l2_colorspacemedia/uapi/v4l/pixfmt0-

006:c.v4l2_colorspaceV4L2_COLORSPACE_SMPTE240M: 0006:c.v4l2_ycbcr_encodingmedia/uapi/v4l/pixfmt0-

006:c.v4l2_ycbcr_encodingV4L2_YCBCR_ENC_SMPTE240M

*/

0006:c.v4l2_ycbcr_encodingmedia/uapi/v4l/pixfmt0-

006:c.v4l2_ycbcr_encodingV4L2_YCBCR_ENC_DEFAULT

= 0,

/* ITU-R 601 -- SDTV */

0006:c.v4l2_ycbcr_encodingmedia/uapi/v4l/pixfmt0-

006:c.v4l2_ycbcr_encodingV4L2_YCBCR_ENC_601

= 1,

/* Rec. 709 -- HDTV */

0006:c.v4l2_ycbcr_encodingmedia/uapi/v4l/pixfmt0-

006:c.v4l2_ycbcr_encodingV4L2_YCBCR_ENC_709

= 2,

/* ITU-R 601/EN 61966-2-4 Extended Gamut -- SDTV */

0006:c.v4l2_ycbcr_encodingmedia/uapi/v4l/pixfmt0-

006:c.v4l2_ycbcr_encodingV4L2_YCBCR_ENC_XV601

= 3,

/* Rec. 709/EN 61966-2-4 Extended Gamut -- HDTV */

0006:c.v4l2_ycbcr_encodingmedia/uapi/v4l/pixfmt0-

006:c.v4l2_ycbcr_encodingV4L2_YCBCR_ENC_XV709

= 4,

#ifndef __KERNEL__

/*

* sYCC (Y'CbCr encoding of sRGB), identical to ENC_601. It was added

* originally due to a misunderstanding of the sYCC standard. It should

1.2. Part I - Video for Linux API 293

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

006:c.v4l2_ycbcr_encodingV4L2_YCBCR_ENC_SYCC

#endif

* not be used, instead use V4L2_YCBCR_ENC_601.

*/

0006:c.v4l2_ycbcr_encodingmedia/uapi/v4l/pixfmt0-

= 5,

/* BT.2020 Non-constant Luminance Y'CbCr */

0006:c.v4l2_ycbcr_encodingmedia/uapi/v4l/pixfmt0-

006:c.v4l2_ycbcr_encodingV4L2_YCBCR_ENC_BT2020

= 6,

/* BT.2020 Constant Luminance Y'CbcCrc */

0006:c.v4l2_ycbcr_encodingmedia/uapi/v4l/pixfmt0-

006:c.v4l2_ycbcr_encodingV4L2_YCBCR_ENC_BT2020_CONST_LUM = 7,

/* SMPTE 240M -- Obsolete HDTV */

0006:c.v4l2_ycbcr_encodingmedia/uapi/v4l/pixfmt0-

006:c.v4l2_ycbcr_encodingV4L2_YCBCR_ENC_SMPTE240M

};

= 8,

/*

* enum 0006:c.v4l2_hsv_encodingmedia/uapi/v4l/pixfmt0006:c.v4l2_hsv_encodingv4l2_hsv_encoding values should not collide with the ones from

* enum v4l2_ycbcr_encoding.

*/ enum 0006:c.v4l2_hsv_encodingmedia/uapi/v4l/pixfmt0006:c.v4l2_hsv_encodingv4l2_hsv_encoding {

/* Hue mapped to 0 - 179 */

006:c.v4l2_hsv_encodingV4L2_HSV_ENC_180

0006:c.v4l2_hsv_encodingmedia/uapi/v4l/pixfmt0-

= 128,

/* Hue mapped to 0-255 */

006:c.v4l2_hsv_encodingV4L2_HSV_ENC_256

};

0006:c.v4l2_hsv_encodingmedia/uapi/v4l/pixfmt0-

= 129,

/*

* Determine how YCBCR_ENC_DEFAULT should map to a proper Y'CbCr encoding.

* This depends on the colorspace.

*/

#define V4L2_MAP_YCBCR_ENC_DEFAULT(colsp) \

(((colsp) == 0006:c.v4l2_colorspacemedia/uapi/v4l/pixfmt0-

006:c.v4l2_colorspaceV4L2_COLORSPACE_REC709 || \

(colsp) == 0006:c.v4l2_colorspacemedia/uapi/v4l/pixfmt0-

006:c.v4l2_colorspaceV4L2_COLORSPACE_DCI_P3) ?

0006:c.v4l2_ycbcr_encodingmedia/uapi/v4l/pixfmt0-

006:c.v4l2_ycbcr_encodingV4L2_YCBCR_ENC_709 : \

((colsp) == 0006:c.v4l2_colorspacemedia/uapi/v4l/pixfmt0-

006:c.v4l2_colorspaceV4L2_COLORSPACE_BT2020 ?

0006:c.v4l2_ycbcr_encodingmedia/uapi/v4l/pixfmt0-

006:c.v4l2_ycbcr_encodingV4L2_YCBCR_ENC_BT2020 : \

((colsp) == 0006:c.v4l2_colorspacemedia/uapi/v4l/pixfmt0-

006:c.v4l2_colorspaceV4L2_COLORSPACE_SMPTE240M ?

0006:c.v4l2_ycbcr_encodingmedia/uapi/v4l/pixfmt0-

006:c.v4l2_ycbcr_encodingV4L2_YCBCR_ENC_SMPTE240M : \

0006:c.v4l2_ycbcr_encodingmedia/uapi/v4l/pixfmt0-

006:c.v4l2_ycbcr_encodingV4L2_YCBCR_ENC_601))) enum 0006:c.v4l2_quantizationmedia/uapi/v4l/pixfmt0006:c.v4l2_quantizationv4l2_quantization {

/*

* The default for R'G'B' quantization is always full range, except

* for the BT2020 colorspace. For Y'CbCr the quantization is always

294 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

* limited range, except for COLORSPACE_JPEG, XV601 or XV709: those

* are full range.

*/

0006:c.v4l2_quantizationmedia/uapi/v4l/pixfmt0-

006:c.v4l2_quantizationV4L2_QUANTIZATION_DEFAULT

= 0,

0006:c.v4l2_quantizationmedia/uapi/v4l/pixfmt0-

006:c.v4l2_quantizationV4L2_QUANTIZATION_FULL_RANGE

= 1,

0006:c.v4l2_quantizationmedia/uapi/v4l/pixfmt0-

006:c.v4l2_quantizationV4L2_QUANTIZATION_LIM_RANGE

= 2,

};

/*

* Determine how QUANTIZATION_DEFAULT should map to a proper quantization.

* This depends on whether the image is RGB or not, the colorspace and the

* Y'CbCr encoding.

*/

#define V4L2_MAP_QUANTIZATION_DEFAULT(is_rgb_or_hsv, colsp, ycbcr_enc) \

(((is_rgb_or_hsv) && (colsp) == 0006:c.v4l2_colorspacemedia/uapi/v4l/pixfmt0-

006:c.v4l2_colorspaceV4L2_COLORSPACE_BT2020) ? \

0006:c.v4l2_quantizationmedia/uapi/v4l/pixfmt0-

006:c.v4l2_quantizationV4L2_QUANTIZATION_LIM_RANGE : \

(((is_rgb_or_hsv) || (ycbcr_enc) == 0-

006:c.v4l2_ycbcr_encodingmedia/uapi/v4l/pixfmt0006:c.v4l2_ycbcr_encodingV4L2_YCBCR_ENC_XV601 || \

(ycbcr_enc) == 0006:c.v4l2_ycbcr_encodingmedia/uapi/v4l/pixfmt0-

006:c.v4l2_ycbcr_encodingV4L2_YCBCR_ENC_XV709

|| (colsp) == 0-

006:c.v4l2_colorspacemedia/uapi/v4l/pixfmt0006:c.v4l2_colorspaceV4L2_COLORSPACE_JPEG) ? \

0006:c.v4l2_quantizationmedia/uapi/v4l/pixfmt0-

006:c.v4l2_quantizationV4L2_QUANTIZATION_FULL_RANGE : 0006:c.v4l2_quantizationmedia/uapi/v4l/pixfmt0-

006:c.v4l2_quantizationV4L2_QUANTIZATION_LIM_RANGE)) enum 0g0priority:c.v4l2_prioritymedia/uapi/v4l/vidioc0g0priority:c.v4l2_priorityv4l2_priority {

0g0priority:c.v4l2_prioritymedia/uapi/v4l/vidioc0g0priority:c.v4l2_priorityV4L2_PRIORITY_UNSET

= 0, /* not initialized */

0g0priority:c.v4l2_prioritymedia/uapi/v4l/vidioc0g0priority:c.v4l2_priorityV4L2_PRIORITY_BACKGROUND

= 1,

0g0priority:c.v4l2_prioritymedia/uapi/v4l/vidioc0g0priority:c.v4l2_priorityV4L2_PRIORITY_INTERACTIVE = 2,

0g0priority:c.v4l2_prioritymedia/uapi/v4l/vidioc0g0priority:c.v4l2_priorityV4L2_PRIORITY_RECORD

= 3,

0g0priority:c.v4l2_prioritymedia/uapi/v4l/vidioc0g0priority:c.v4l2_priorityV4L2_PRIORITY_DEFAULT

= 0g0priority:c.v4l2_prioritymedia/uapi/v4l/vidioc0g0priority:c.v4l2_priorityV4L2_PRIORITY_INTERACTIVE,

}; struct 0overlay:c.v4l2_rectmedia/uapi/v4l/dev0overlay:c.v4l2_rectv4l2_rect {

__s32

__s32 left; top;

__u32

__u32 width; height;

}; struct 0enumstd:c.v4l2_fractmedia/uapi/v4l/vidioc0enumstd:c.v4l2_fractv4l2_fract {

__u32 numerator;

__u32 denominator;

};

/**

* struct 0querycap:c.v4l2_capabilitymedia/uapi/v4l/vidioc0-

1.2. Part I - Video for Linux API 295

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

querycap:c.v4l2_capabilityv4l2_capability - Describes V4L2 device caps returned by 0querycap:vidioc0querycapmedia/uapi/v4l/vidioc0querycap:vidioc0querycapVIDIOC_QUERYCAP

*

* @driver:

* @card:

* @bus_info:

* @version: name of the driver module (e.g. ``bttv'') name of the card (e.g. ``Hauppauge WinTV'') name of the bus (e.g. ``PCI:'' + pci_name(pci_dev) )

KERNEL_VERSION

* @capabilities: capabilities of the physical device as a whole

* @device_caps: capabilities accessed via this particular device (node)

* @reserved:

*/ reserved fields for future extensions struct 0querycap:c.v4l2_capabilitymedia/uapi/v4l/vidioc0querycap:c.v4l2_capabilityv4l2_capability {

__u8 driver[16];

__u8

__u8 card[32]; bus_info[32];

__u32

__u32

__u32

__u32 version; capabilities; device_caps; reserved[3];

};

/* Values for `capabilities' field */

#define 0querycap:device0capabilitiesmedia/uapi/v4l/vidioc0querycap:device0capabilitiesV4L2_CAP_VIDEO_CAPTURE

#define

0x00000001 /* Is a video capture device */

0querycap:device0capabilitiesmedia/uapi/v4l/vidioc0querycap:device0capabilitiesV4L2_CAP_VIDEO_OUTPUT

#define

0x00000002 /* Is a video output device */

0querycap:device0capabilitiesmedia/uapi/v4l/vidioc0querycap:device0capabilitiesV4L2_CAP_VIDEO_OVERLAY

#define

0x00000004 /* Can do video overlay */

0querycap:device0capabilitiesmedia/uapi/v4l/vidioc0querycap:device0capabilitiesV4L2_CAP_VBI_CAPTURE 0x00000010 /* Is a raw VBI capture device */

#define 0querycap:device0capabilitiesmedia/uapi/v4l/vidioc0querycap:device0capabilitiesV4L2_CAP_VBI_OUTPUT 0x00000020 /* Is a raw VBI output device */

#define 0querycap:device0capabilitiesmedia/uapi/v4l/vidioc0querycap:device0capabilitiesV4L2_CAP_SLICED_VBI_CAPTURE 0x00000040 /* Is a sliced VBI capture device */

#define 0querycap:device0capabilitiesmedia/uapi/v4l/vidioc0querycap:device0capabilitiesV4L2_CAP_SLICED_VBI_OUTPUT 0x00000080 /* Is a sliced VBI output device */

#define 0querycap:device0capabilitiesmedia/uapi/v4l/vidioc0querycap:device0capabilitiesV4L2_CAP_RDS_CAPTURE 0x00000100 /* RDS data capture */

#define 0querycap:device0capabilitiesmedia/uapi/v4l/vidioc0querycap:device0capabilitiesV4L2_CAP_VIDEO_OUTPUT_OVERLAY 0x00000200 /* Can do video output overlay */

#define 0querycap:device0capabilitiesmedia/uapi/v4l/vidioc0querycap:device0capabilitiesV4L2_CAP_HW_FREQ_SEEK 0x00000400 /* Can do hardware frequency seek */

#define 0querycap:device0capabilitiesmedia/uapi/v4l/vidioc0querycap:device0capabilitiesV4L2_CAP_RDS_OUTPUT 0x00000800 /* Is an RDS encoder */

/* Is a video capture device that supports multiplanar formats */

#define 0querycap:device0capabilitiesmedia/uapi/v4l/vidioc0querycap:device0capabilitiesV4L2_CAP_VIDEO_CAPTURE_MPLANE 0x00001000

/* Is a video output device that supports multiplanar formats */

#define 0querycap:device0capabilitiesmedia/uapi/v4l/vidioc0querycap:device0capabilitiesV4L2_CAP_VIDEO_OUTPUT_MPLANE 0x00002000

/* Is a video mem-to-mem device that supports multiplanar formats */

#define 0querycap:device0capabilitiesmedia/uapi/v4l/vidioc0querycap:device0capabilitiesV4L2_CAP_VIDEO_M2M_MPLANE

/* Is a video mem-to-mem device */

0x00004000

#define 0querycap:device0capabilitiesmedia/uapi/v4l/vidioc0querycap:device0-

296 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

capabilitiesV4L2_CAP_VIDEO_M2M 0x00008000

#define 0querycap:device0capabilitiesmedia/uapi/v4l/vidioc0querycap:device0capabilitiesV4L2_CAP_TUNER 0x00010000 /* has a tuner */

#define 0querycap:device0capabilitiesmedia/uapi/v4l/vidioc0querycap:device0capabilitiesV4L2_CAP_AUDIO 0x00020000 /* has audio support */

#define 0querycap:device0capabilitiesmedia/uapi/v4l/vidioc0querycap:device0capabilitiesV4L2_CAP_RADIO 0x00040000 /* is a radio device */

#define 0querycap:device0capabilitiesmedia/uapi/v4l/vidioc0querycap:device0capabilitiesV4L2_CAP_MODULATOR 0x00080000 /* has a modulator */

#define 0querycap:device0capabilitiesmedia/uapi/v4l/vidioc0querycap:device0capabilitiesV4L2_CAP_SDR_CAPTURE 0x00100000 /* Is a SDR capture device */

#define 0querycap:device0capabilitiesmedia/uapi/v4l/vidioc0querycap:device0capabilitiesV4L2_CAP_EXT_PIX_FORMAT 0x00200000 /* Supports the extended pixel format */

#define 0querycap:device0capabilitiesmedia/uapi/v4l/vidioc0querycap:device0capabilitiesV4L2_CAP_SDR_OUTPUT 0x00400000 /* Is a SDR output device */

#define 0querycap:device0capabilitiesmedia/uapi/v4l/vidioc0querycap:device0capabilitiesV4L2_CAP_READWRITE 0x01000000 /* read/write systemcalls */

#define 0querycap:device0capabilitiesmedia/uapi/v4l/vidioc0querycap:device0capabilitiesV4L2_CAP_ASYNCIO 0x02000000 /* async I/O */

#define 0querycap:device0capabilitiesmedia/uapi/v4l/vidioc0querycap:device0capabilitiesV4L2_CAP_STREAMING 0x04000000 /* streaming I/O ioctls */

#define 0querycap:device0capabilitiesmedia/uapi/v4l/vidioc0querycap:device0capabilitiesV4L2_CAP_TOUCH 0x10000000 /* Is a touch device */

#define 0querycap:device0capabilitiesmedia/uapi/v4l/vidioc0querycap:device0capabilitiesV4L2_CAP_DEVICE_CAPS 0x80000000 /* sets device capabilities field */

/*

* V I D E O I M A G E F O R M A T

*/ struct 0002:c.v4l2_pix_formatmedia/uapi/v4l/pixfmt0002:c.v4l2_pix_formatv4l2_pix_format {

__u32

__u32

__u32

__u32 field; order:c.v4l2_fieldv4l2_field */ width; height; pixelformat;

/* enum 0order:c.v4l2_fieldmedia/uapi/v4l/field0-

__u32

__u32

__u32

__u32 union { bytesperline; sizeimage;

/* for padding, zero if unused */

__u32 colorspace; /* enum 0-

006:c.v4l2_colorspacemedia/uapi/v4l/pixfmt0006:c.v4l2_colorspacev4l2_colorspace */ priv; flags;

/* private data, depends on pixelformat */

/* format flags (V4L2_PIX_FMT_FLAG_*) */

/* enum 0006:c.v4l2_ycbcr_encodingmedia/uapi/v4l/pixfmt0-

006:c.v4l2_ycbcr_encodingv4l2_ycbcr_encoding */

__u32 ycbcr_enc;

/* enum 0006:c.v4l2_hsv_encodingmedia/uapi/v4l/pixfmt0-

006:c.v4l2_hsv_encodingv4l2_hsv_encoding */

__u32 hsv_enc;

}; tization;

__u32

/* enum

006:c.v4l2_quantizationv4l2_quantization */ quan-

0006:c.v4l2_quantizationmedia/uapi/v4l/pixfmt0-

1.2. Part I - Video for Linux API 297

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

__u32 xfer_func; /* enum 0-

006:c.v4l2_xfer_funcmedia/uapi/v4l/pixfmt0006:c.v4l2_xfer_funcv4l2_xfer_func */

};

/* Pixel format FOURCC depth Description */

/* RGB formats */

#define 0packed0rgb:v4l20pix0fmt0rgb332media/uapi/v4l/pixfmt0packed0rgb:v4l20pix0fmt0rgb332V4L2_PIX_FMT_RGB332 v4l2_fourcc(`R', `G', `B', `1') /* 8 RGB-3-3-2 */

#define 0packed0rgb:v4l20pix0fmt0rgb444media/uapi/v4l/pixfmt0packed0rgb:v4l20pix0fmt0rgb444V4L2_PIX_FMT_RGB444 v4l2_fourcc(`R', `4', `4', `4') /* 16 xxxxrrrr ggggbbbb */

#define 0packed0rgb:v4l20pix0fmt0argb444media/uapi/v4l/pixfmt0packed0rgb:v4l20pix0fmt0argb444V4L2_PIX_FMT_ARGB444 v4l2_fourcc(`A', `R', `1', `2') /* 16 aaaarrrr ggggbbbb */

#define 0packed0rgb:v4l20pix0fmt0xrgb444media/uapi/v4l/pixfmt0packed0rgb:v4l20pix0fmt0xrgb444V4L2_PIX_FMT_XRGB444 v4l2_fourcc(`X', `R', `1', `2') /* 16 xxxxrrrr ggggbbbb */

#define 0packed0rgb:v4l20pix0fmt0rgb555media/uapi/v4l/pixfmt0packed0rgb:v4l20pix0fmt0rgb555V4L2_PIX_FMT_RGB555 v4l2_fourcc(`R', `G', `B', `O') /* 16 RGB-5-5-5

#define

*/

0packed0rgb:v4l20pix0fmt0argb555media/uapi/v4l/pixfmt0packed0rgb:v4l20pix0fmt0argb555V4L2_PIX_FMT_ARGB555 v4l2_fourcc(`A', `R', `1', `5') /* 16 ARGB-1-5-5-5 */

#define 0packed0rgb:v4l20pix0fmt0xrgb555media/uapi/v4l/pixfmt0packed0rgb:v4l20pix0fmt0xrgb555V4L2_PIX_FMT_XRGB555 v4l2_fourcc(`X', `R', `1', `5') /* 16 XRGB-1-5-5-5 */

#define 0packed0rgb:v4l20pix0fmt0rgb565media/uapi/v4l/pixfmt0packed0rgb:v4l20pix0fmt0rgb565V4L2_PIX_FMT_RGB565 v4l2_fourcc(`R', `G', `B', `P') /* 16 RGB-5-6-5

#define

*/

0packed0rgb:v4l20pix0fmt0rgb555xmedia/uapi/v4l/pixfmt0packed0rgb:v4l20pix0fmt0rgb555xV4L2_PIX_FMT_RGB555X v4l2_fourcc(`R', `G', `B', `Q') /* 16 RGB-5-5-5 BE */

#define 0packed0rgb:v4l20pix0fmt0argb555xmedia/uapi/v4l/pixfmt0packed0rgb:v4l20pix0fmt0argb555xV4L2_PIX_FMT_ARGB555X v4l2_fourcc_be(`A', `R', `1', `5') /* 16 ARGB-5-5-

5 BE */

#define 0packed0rgb:v4l20pix0fmt0xrgb555xmedia/uapi/v4l/pixfmt0packed0rgb:v4l20pix0fmt0xrgb555xV4L2_PIX_FMT_XRGB555X v4l2_fourcc_be(`X', `R', `1', `5') /* 16 XRGB-5-5-

5 BE */

#define 0packed0rgb:v4l20pix0fmt0rgb565xmedia/uapi/v4l/pixfmt0packed0rgb:v4l20pix0fmt0rgb565xV4L2_PIX_FMT_RGB565X v4l2_fourcc(`R', `G', `B', `R') /* 16 RGB-5-6-5 BE */

#define 0packed0rgb:v4l20pix0fmt0bgr666media/uapi/v4l/pixfmt0packed0rgb:v4l20pix0fmt0bgr666V4L2_PIX_FMT_BGR666 v4l2_fourcc(`B', `G', `R', `H') /* 18 BGR-6-6-6 */

#define 0packed0rgb:v4l20pix0fmt0bgr24media/uapi/v4l/pixfmt0packed0rgb:v4l20pix0fmt0bgr24V4L2_PIX_FMT_BGR24 v4l2_fourcc(`B', `G', `R', `3') /* 24 BGR-8-8-8 */

#define 0packed0rgb:v4l20pix0fmt0rgb24media/uapi/v4l/pixfmt0packed0rgb:v4l20pix0fmt0rgb24V4L2_PIX_FMT_RGB24 v4l2_fourcc(`R', `G', `B', `3') /* 24 RGB-8-8-8 */

#define 0packed0rgb:v4l20pix0fmt0bgr32media/uapi/v4l/pixfmt0packed0rgb:v4l20pix0fmt0bgr32V4L2_PIX_FMT_BGR32 v4l2_fourcc(`B', `G', `R', `4') /* 32 BGR-8-8-8-8 */

#define 0packed0rgb:v4l20pix0fmt0abgr32media/uapi/v4l/pixfmt0packed0rgb:v4l20pix0fmt0abgr32V4L2_PIX_FMT_ABGR32 v4l2_fourcc(`A', `R', `2', `4') /* 32 BGRA-8-8-8-8 */

#define 0packed0rgb:v4l20pix0fmt0xbgr32media/uapi/v4l/pixfmt0packed0rgb:v4l20pix0fmt0xbgr32V4L2_PIX_FMT_XBGR32 v4l2_fourcc(`X', `R', `2', `4') /* 32 BGRX-8-8-8-8 */

#define 0packed0rgb:v4l20pix0fmt0rgb32media/uapi/v4l/pixfmt0packed0rgb:v4l20pix0fmt0rgb32V4L2_PIX_FMT_RGB32 v4l2_fourcc(`R', `G', `B', `4') /* 32 RGB-8-8-8-8 */

#define 0packed0rgb:v4l20pix0fmt0argb32media/uapi/v4l/pixfmt0packed0rgb:v4l20pix0fmt0argb32V4L2_PIX_FMT_ARGB32 v4l2_fourcc(`B', `A', `2', `4') /* 32 ARGB-8-8-8-8 */

#define 0packed0rgb:v4l20pix0fmt0xrgb32media/uapi/v4l/pixfmt0packed0rgb:v4l20pix0fmt0xrgb32V4L2_PIX_FMT_XRGB32 v4l2_fourcc(`B', `X', `2', `4') /* 32 XRGB-8-8-8-8 */

/* Grey formats */

#define greyV4L2_PIX_FMT_GREY

#define

0grey:v4l20pix0fmt0greymedia/uapi/v4l/pixfmt0grey:v4l20pix0fmt0v4l2_fourcc(`G', `R', `E', `Y') /* 8 Greyscale */

0reserved:v4l20pix0fmt0y4media/uapi/v4l/pixfmt0reserved:v4l20pix0fmt0-

298 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

y4V4L2_PIX_FMT_Y4 v4l2_fourcc(`Y', `0', `4', ` `) /* 4 Greyscale */

#define y6V4L2_PIX_FMT_Y6

0reserved:v4l20pix0fmt0y6media/uapi/v4l/pixfmt0reserved:v4l20pix0fmt0v4l2_fourcc(`Y', `0', `6', ` `) /* 6 Greyscale */

#define y10V4L2_PIX_FMT_Y10

#define y12V4L2_PIX_FMT_Y12

0y10:v4l20pix0fmt0y10media/uapi/v4l/pixfmt0y10:v4l20pix0fmt0v4l2_fourcc(`Y', `1', `0', ` `) /* 10 Greyscale */

0y12:v4l20pix0fmt0y12media/uapi/v4l/pixfmt0y12:v4l20pix0fmt0v4l2_fourcc(`Y', `1', `2', ` `) /* 12 Greyscale */

#define y16V4L2_PIX_FMT_Y16

0y16:v4l20pix0fmt0y16media/uapi/v4l/pixfmt0y16:v4l20pix0fmt0v4l2_fourcc(`Y', `1', `6', ` `) /* 16 Greyscale */

#define 0y160be:v4l20pix0fmt0y160bemedia/uapi/v4l/pixfmt0y160be:v4l20pix0fmt0y160beV4L2_PIX_FMT_Y16_BE v4l2_fourcc_be(`Y', `1', `6', ` `) /* 16 Greyscale BE */

/* Grey bit-packed formats */

#define 0y10b:v4l20pix0fmt0y10bpackmedia/uapi/v4l/pixfmt0y10b:v4l20pix0fmt0y10bpackV4L2_PIX_FMT_Y10BPACK packed */ v4l2_fourcc(`Y', `1', `0', `B') /* 10 Greyscale bit-

/* Palette formats */

#define 0indexed:v4l20pix0fmt0pal8media/uapi/v4l/pixfmt0indexed:v4l20pix0fmt0pal8V4L2_PIX_FMT_PAL8 v4l2_fourcc(`P', `A', `L', `8') /* 8 8-bit palette */

/* Chrominance formats */

#define uv8V4L2_PIX_FMT_UV8

0uv8:v4l20pix0fmt0uv8media/uapi/v4l/pixfmt0uv8:v4l20pix0fmt0v4l2_fourcc(`U', `V', `8', ` `) /* 8 UV 4:4 */

/* Luminance+Chrominance formats */

#define 0yuyv:v4l20pix0fmt0yuyvmedia/uapi/v4l/pixfmt0yuyv:v4l20pix0fmt0yuyvV4L2_PIX_FMT_YUYV

#define v4l2_fourcc(`Y', `U', `Y', `V') /* 16 YUV 4:2:2 */

0reserved:v4l20pix0fmt0yyuvmedia/uapi/v4l/pixfmt0reserved:v4l20pix0fmt0yyuvV4L2_PIX_FMT_YYUV

#define yvyuV4L2_PIX_FMT_YVYU v4l2_fourcc(`Y', `Y', `U', `V') /* 16 YUV 4:2:2 */

0yvyu:v4l20pix0fmt0yvyumedia/uapi/v4l/pixfmt0yvyu:v4l20pix0fmt0v4l2_fourcc(`Y', `V', `Y', `U') /* 16 YVU 4:2:2 */

#define uyvyV4L2_PIX_FMT_UYVY

#define vyuyV4L2_PIX_FMT_VYUY

0uyvy:v4l20pix0fmt0uyvymedia/uapi/v4l/pixfmt0uyvy:v4l20pix0fmt0v4l2_fourcc(`U', `Y', `V', `Y') /* 16 YUV 4:2:2 */

0vyuy:v4l20pix0fmt0vyuymedia/uapi/v4l/pixfmt0vyuy:v4l20pix0fmt0v4l2_fourcc(`V', `Y', `U', `Y') /* 16 YUV 4:2:2 */

#define y41pV4L2_PIX_FMT_Y41P

0y41p:v4l20pix0fmt0y41pmedia/uapi/v4l/pixfmt0y41p:v4l20pix0fmt0v4l2_fourcc(`Y', `4', `1', `P') /* 12 YUV 4:1:1 */

#define 0packed0yuv:v4l20pix0fmt0yuv444media/uapi/v4l/pixfmt0packed0yuv:v4l20pix0fmt0yuv444V4L2_PIX_FMT_YUV444 v4l2_fourcc(`Y', `4', `4', `4') /* 16 xxxxyyyy uuuuvvvv */

#define 0packed0yuv:v4l20pix0fmt0yuv555media/uapi/v4l/pixfmt0packed0yuv:v4l20pix0fmt0yuv555V4L2_PIX_FMT_YUV555 v4l2_fourcc(`Y', `U', `V', `O') /* 16 YUV-5-5-5 */

#define 0packed0yuv:v4l20pix0fmt0yuv565media/uapi/v4l/pixfmt0packed0yuv:v4l20pix0fmt0yuv565V4L2_PIX_FMT_YUV565 v4l2_fourcc(`Y', `U', `V', `P') /* 16 YUV-5-6-5 */

#define 0packed0yuv:v4l20pix0fmt0yuv32media/uapi/v4l/pixfmt0packed0yuv:v4l20pix0fmt0yuv32V4L2_PIX_FMT_YUV32

#define v4l2_fourcc(`Y', `U', `V', `4') /* 32 YUV-8-8-8-8 */

0reserved:v4l20pix0fmt0hi240media/uapi/v4l/pixfmt0reserved:v4l20pix0fmt0hi240V4L2_PIX_FMT_HI240

#define v4l2_fourcc(`H', `I', `2', `4') /* 8 8-bit color */

0reserved:v4l20pix0fmt0hm12media/uapi/v4l/pixfmt0reserved:v4l20pix0fmt0hm12V4L2_PIX_FMT_HM12 roblocks */ v4l2_fourcc(`H', `M', `1', `2') /* 8 YUV 4:2:0 16x16 mac-

#define 0m420:v4l20pix0fmt0m420media/uapi/v4l/pixfmt0m420:v4l20pix0fmt0m420V4L2_PIX_FMT_M420 v4l2_fourcc(`M', `4', `2', `0') /* 12 YUV 4:2:0 2 lines y, 1 line uv interleaved */

/* two planes -- one Y, one Cr + Cb interleaved */

#define 0nv12:v4l20pix0fmt0nv12media/uapi/v4l/pixfmt0nv12:v4l20pix0fmt0nv12V4L2_PIX_FMT_NV12 v4l2_fourcc(`N', `V', `1', `2') /* 12 Y/CbCr 4:2:0 */

1.2. Part I - Video for Linux API 299

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

#define nv21V4L2_PIX_FMT_NV21

#define nv16V4L2_PIX_FMT_NV16

#define nv61V4L2_PIX_FMT_NV61

#define nv24V4L2_PIX_FMT_NV24

#define nv42V4L2_PIX_FMT_NV42

0nv12:v4l20pix0fmt0nv21media/uapi/v4l/pixfmt0nv12:v4l20pix0fmt0v4l2_fourcc(`N', `V', `2', `1') /* 12 Y/CrCb 4:2:0 */

0nv16:v4l20pix0fmt0nv16media/uapi/v4l/pixfmt0nv16:v4l20pix0fmt0v4l2_fourcc(`N', `V', `1', `6') /* 16 Y/CbCr 4:2:2 */

0nv16:v4l20pix0fmt0nv61media/uapi/v4l/pixfmt0nv16:v4l20pix0fmt0v4l2_fourcc(`N', `V', `6', `1') /* 16 Y/CrCb 4:2:2 */

0nv24:v4l20pix0fmt0nv24media/uapi/v4l/pixfmt0nv24:v4l20pix0fmt0v4l2_fourcc(`N', `V', `2', `4') /* 24 Y/CbCr 4:4:4 */

0nv24:v4l20pix0fmt0nv42media/uapi/v4l/pixfmt0nv24:v4l20pix0fmt0v4l2_fourcc(`N', `V', `4', `2') /* 24 Y/CrCb 4:4:4 */

/* two non contiguous planes - one Y, one Cr + Cb interleaved */

#define 0nv12m:v4l20pix0fmt0nv12mmedia/uapi/v4l/pixfmt0nv12m:v4l20pix0fmt0nv12mV4L2_PIX_FMT_NV12M

#define v4l2_fourcc(`N', `M', `1', `2') /* 12 Y/CbCr 4:2:0 */

0nv12m:v4l20pix0fmt0nv21mmedia/uapi/v4l/pixfmt0nv12m:v4l20pix0fmt0nv21mV4L2_PIX_FMT_NV21M v4l2_fourcc(`N', `M', `2', `1') /* 21 Y/CrCb 4:2:0 */

#define 0nv16m:v4l20pix0fmt0nv16mmedia/uapi/v4l/pixfmt0nv16m:v4l20pix0fmt0nv16mV4L2_PIX_FMT_NV16M v4l2_fourcc(`N', `M', `1', `6') /* 16 Y/CbCr 4:2:2 */

#define 0nv16m:v4l20pix0fmt0nv61mmedia/uapi/v4l/pixfmt0nv16m:v4l20pix0fmt0nv61mV4L2_PIX_FMT_NV61M v4l2_fourcc(`N', `M', `6', `1') /* 16 Y/CrCb 4:2:2 */

#define 0nv12mt:v4l20pix0fmt0nv12mtmedia/uapi/v4l/pixfmt0nv12mt:v4l20pix0fmt0nv12mtV4L2_PIX_FMT_NV12MT v4l2_fourcc(`T', `M', `1', `2') /* 12 Y/CbCr 4:2:0 64x32 macroblocks */

#define 0nv12m:v4l20pix0fmt0nv12mt016x16media/uapi/v4l/pixfmt0nv12m:v4l20pix0fmt0nv12mt016x16V4L2_PIX_FMT_NV12MT_16X16 v4l2_fourcc(`V', `M', `1', `2') /* 12 Y/CbCr 4:2:0 16x16 macroblocks */

/* three planes - Y Cb, Cr */

#define 0yuv410:v4l20pix0fmt0yuv410media/uapi/v4l/pixfmt0yuv410:v4l20pix0fmt0yuv410V4L2_PIX_FMT_YUV410 v4l2_fourcc(`Y', `U', `V', `9') /* 9 YUV 4:1:0 */

#define 0yuv410:v4l20pix0fmt0yvu410media/uapi/v4l/pixfmt0yuv410:v4l20pix0fmt0yvu410V4L2_PIX_FMT_YVU410 v4l2_fourcc(`Y', `V', `U', `9') /* 9 YVU 4:1:0 */

#define 0yuv411p:v4l20pix0fmt0yuv411pmedia/uapi/v4l/pixfmt0yuv411p:v4l20pix0fmt0yuv411pV4L2_PIX_FMT_YUV411P v4l2_fourcc(`4', `1', `1', `P') /* 12 YVU411 planar */

#define 0yuv420:v4l20pix0fmt0yuv420media/uapi/v4l/pixfmt0yuv420:v4l20pix0fmt0yuv420V4L2_PIX_FMT_YUV420 v4l2_fourcc(`Y', `U', `1', `2') /* 12 YUV 4:2:0 */

#define 0yuv420:v4l20pix0fmt0yvu420media/uapi/v4l/pixfmt0yuv420:v4l20pix0fmt0yvu420V4L2_PIX_FMT_YVU420 v4l2_fourcc(`Y', `V', `1', `2') /* 12 YVU 4:2:0 */

#define 0yuv422p:v4l20pix0fmt0yuv422pmedia/uapi/v4l/pixfmt0yuv422p:v4l20pix0fmt0yuv422pV4L2_PIX_FMT_YUV422P v4l2_fourcc(`4', `2', `2', `P') /* 16 YVU422 planar */

/* three non contiguous planes - Y, Cb, Cr */

#define 0yuv420m:v4l20pix0fmt0yuv420mmedia/uapi/v4l/pixfmt0yuv420m:v4l20pix0fmt0yuv420mV4L2_PIX_FMT_YUV420M v4l2_fourcc(`Y', `M', `1', `2') /* 12 YUV420 planar */

#define 0yuv420m:v4l20pix0fmt0yvu420mmedia/uapi/v4l/pixfmt0yuv420m:v4l20pix0fmt0yvu420mV4L2_PIX_FMT_YVU420M v4l2_fourcc(`Y', `M', `2', `1') /* 12 YVU420 planar */

#define 0yuv422m:v4l20pix0fmt0yuv422mmedia/uapi/v4l/pixfmt0yuv422m:v4l20pix0fmt0yuv422mV4L2_PIX_FMT_YUV422M v4l2_fourcc(`Y', `M', `1', `6') /* 16 YUV422 planar */

#define 0yuv422m:v4l20pix0fmt0yvu422mmedia/uapi/v4l/pixfmt0yuv422m:v4l20pix0fmt0yvu422mV4L2_PIX_FMT_YVU422M v4l2_fourcc(`Y', `M', `6', `1') /* 16 YVU422 planar */

#define 0yuv444m:v4l20pix0fmt0yuv444mmedia/uapi/v4l/pixfmt0yuv444m:v4l20pix0fmt0yuv444mV4L2_PIX_FMT_YUV444M v4l2_fourcc(`Y', `M', `2', `4') /* 24 YUV444 planar */

#define 0yuv444m:v4l20pix0fmt0yvu444mmedia/uapi/v4l/pixfmt0yuv444m:v4l20pix0fmt0yvu444mV4L2_PIX_FMT_YVU444M v4l2_fourcc(`Y', `M', `4', `2') /* 24 YVU444 planar */

/* Bayer formats - see http://www.siliconimaging.com/RGB%20Bayer.htm */

#define 0srggb8:v4l20pix0fmt0sbggr8media/uapi/v4l/pixfmt0srggb8:v4l20pix0fmt0sbggr8V4L2_PIX_FMT_SBGGR8 v4l2_fourcc(`B', `A', `8', `1') /* 8 BGBG.. GRGR.. */

300 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

#define 0srggb8:v4l20pix0fmt0sgbrg8media/uapi/v4l/pixfmt0srggb8:v4l20pix0fmt0sgbrg8V4L2_PIX_FMT_SGBRG8 v4l2_fourcc(`G', `B', `R', `G') /* 8 GBGB.. RGRG.. */

#define 0srggb8:v4l20pix0fmt0sgrbg8media/uapi/v4l/pixfmt0srggb8:v4l20pix0fmt0sgrbg8V4L2_PIX_FMT_SGRBG8 v4l2_fourcc(`G', `R', `B', `G') /* 8 GRGR.. BGBG.. */

#define 0srggb8:v4l20pix0fmt0srggb8media/uapi/v4l/pixfmt0srggb8:v4l20pix0fmt0srggb8V4L2_PIX_FMT_SRGGB8 v4l2_fourcc(`R', `G', `G', `B') /* 8 RGRG.. GBGB.. */

#define 0srggb10:v4l20pix0fmt0sbggr10media/uapi/v4l/pixfmt0srggb10:v4l20pix0fmt0sbggr10V4L2_PIX_FMT_SBGGR10 v4l2_fourcc(`B', `G', `1', `0') /* 10 BGBG.. GRGR.. */

#define 0srggb10:v4l20pix0fmt0sgbrg10media/uapi/v4l/pixfmt0srggb10:v4l20pix0fmt0sgbrg10V4L2_PIX_FMT_SGBRG10 v4l2_fourcc(`G', `B', `1', `0') /* 10 GBGB.. RGRG.. */

#define 0srggb10:v4l20pix0fmt0sgrbg10media/uapi/v4l/pixfmt0srggb10:v4l20pix0fmt0sgrbg10V4L2_PIX_FMT_SGRBG10 v4l2_fourcc(`B', `A', `1', `0') /* 10 GRGR.. BGBG.. */

#define 0srggb10:v4l20pix0fmt0srggb10media/uapi/v4l/pixfmt0srggb10:v4l20pix0fmt0srggb10V4L2_PIX_FMT_SRGGB10 v4l2_fourcc(`R', `G', `1', `0') /* 10 RGRG.. GBGB.. */

/* 10bit raw bayer packed, 5 bytes for every 4 pixels */

#define 0srggb10p:v4l20pix0fmt0sbggr10pmedia/uapi/v4l/pixfmt0srggb10p:v4l20pix0fmt0sbggr10pV4L2_PIX_FMT_SBGGR10P v4l2_fourcc(`p', `B', `A', `A')

#define 0srggb10p:v4l20pix0fmt0sgbrg10pmedia/uapi/v4l/pixfmt0srggb10p:v4l20pix0fmt0sgbrg10pV4L2_PIX_FMT_SGBRG10P v4l2_fourcc(`p', `G', `A', `A')

#define 0srggb10p:v4l20pix0fmt0sgrbg10pmedia/uapi/v4l/pixfmt0srggb10p:v4l20pix0fmt0sgrbg10pV4L2_PIX_FMT_SGRBG10P v4l2_fourcc(`p', `g', `A', `A')

#define 0srggb10p:v4l20pix0fmt0srggb10pmedia/uapi/v4l/pixfmt0srggb10p:v4l20pix0fmt0srggb10pV4L2_PIX_FMT_SRGGB10P v4l2_fourcc(`p', `R', `A', `A')

/* 10bit raw bayer a-law compressed to 8 bits */

#define 0srggb10alaw8:v4l20pix0fmt0sbggr10alaw8media/uapi/v4l/pixfmt0srggb10alaw8:v4l20pix0fmt0sbggr10alaw8V4L2_PIX_FMT_SBGGR10ALAW8 v4l2_fourcc(`a', `B', `A', `8')

#define 0srggb10alaw8:v4l20pix0fmt0sgbrg10alaw8media/uapi/v4l/pixfmt0srggb10alaw8:v4l20pix0fmt0sgbrg10alaw8V4L2_PIX_FMT_SGBRG10ALAW8 v4l2_fourcc(`a', `G', `A', `8')

#define 0srggb10alaw8:v4l20pix0fmt0sgrbg10alaw8media/uapi/v4l/pixfmt0srggb10alaw8:v4l20pix0fmt0sgrbg10alaw8V4L2_PIX_FMT_SGRBG10ALAW8 v4l2_fourcc(`a', `g', `A', `8')

#define 0srggb10alaw8:v4l20pix0fmt0srggb10alaw8media/uapi/v4l/pixfmt0srggb10alaw8:v4l20pix0fmt0srggb10alaw8V4L2_PIX_FMT_SRGGB10ALAW8 v4l2_fourcc(`a', `R', `A', `8')

#define

/* 10bit raw bayer DPCM compressed to 8 bits */

0srggb10dpcm8:v4l20pix0fmt0sbggr10dpcm8media/uapi/v4l/pixfmt0srggb10dpcm8:v4l20pix0fmt0sbggr10dpcm8V4L2_PIX_FMT_SBGGR10DPCM8 v4l2_fourcc(`b', `B', `A', `8')

#define 0srggb10dpcm8:v4l20pix0fmt0sgbrg10dpcm8media/uapi/v4l/pixfmt0srggb10dpcm8:v4l20pix0fmt0sgbrg10dpcm8V4L2_PIX_FMT_SGBRG10DPCM8 v4l2_fourcc(`b', `G', `A', `8')

#define 0srggb10dpcm8:v4l20pix0fmt0sgrbg10dpcm8media/uapi/v4l/pixfmt0srggb10dpcm8:v4l20pix0fmt0sgrbg10dpcm8V4L2_PIX_FMT_SGRBG10DPCM8 v4l2_fourcc(`B', `D', `1', `0')

#define 0srggb10dpcm8:v4l20pix0fmt0srggb10dpcm8media/uapi/v4l/pixfmt0srggb10dpcm8:v4l20pix0fmt0srggb10dpcm8V4L2_PIX_FMT_SRGGB10DPCM8 v4l2_fourcc(`b', `R', `A', `8')

#define 0srggb12:v4l20pix0fmt0sbggr12media/uapi/v4l/pixfmt0srggb12:v4l20pix0fmt0sbggr12V4L2_PIX_FMT_SBGGR12 v4l2_fourcc(`B', `G', `1', `2') /* 12 BGBG.. GRGR.. */

#define 0srggb12:v4l20pix0fmt0sgbrg12media/uapi/v4l/pixfmt0srggb12:v4l20pix0fmt0sgbrg12V4L2_PIX_FMT_SGBRG12 v4l2_fourcc(`G', `B', `1', `2') /* 12 GBGB.. RGRG.. */

#define 0srggb12:v4l20pix0fmt0sgrbg12media/uapi/v4l/pixfmt0srggb12:v4l20pix0fmt0sgrbg12V4L2_PIX_FMT_SGRBG12 v4l2_fourcc(`B', `A', `1', `2') /* 12 GRGR.. BGBG.. */

#define 0srggb12:v4l20pix0fmt0srggb12media/uapi/v4l/pixfmt0srggb12:v4l20pix0fmt0srggb12V4L2_PIX_FMT_SRGGB12 v4l2_fourcc(`R', `G', `1', `2') /* 12 RGRG.. GBGB.. */

#define 0srggb16:v4l20pix0fmt0sbggr16media/uapi/v4l/pixfmt0srggb16:v4l20pix0fmt0sbggr16V4L2_PIX_FMT_SBGGR16 v4l2_fourcc(`B', `Y', `R', `2') /* 16 BGBG.. GRGR.. */

#define 0srggb16:v4l20pix0fmt0sgbrg16media/uapi/v4l/pixfmt0srggb16:v4l20pix0fmt0sgbrg16V4L2_PIX_FMT_SGBRG16 v4l2_fourcc(`G', `B', `1', `6') /* 16 GBGB.. RGRG.. */

#define 0srggb16:v4l20pix0fmt0sgrbg16media/uapi/v4l/pixfmt0srggb16:v4l20pix0fmt0sgrbg16V4L2_PIX_FMT_SGRBG16 v4l2_fourcc(`G', `R', `1', `6') /* 16 GRGR.. BGBG.. */

#define 0srggb16:v4l20pix0fmt0srggb16media/uapi/v4l/pixfmt0srggb16:v4l20pix0fmt0srggb16V4L2_PIX_FMT_SRGGB16 v4l2_fourcc(`R', `G', `1', `6') /* 16 RGRG.. GBGB.. */

1.2. Part I - Video for Linux API 301

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

/* HSV formats */

#define 0packed0hsv:v4l20pix0fmt0hsv24media/uapi/v4l/pixfmt0packed0hsv:v4l20pix0fmt0hsv24V4L2_PIX_FMT_HSV24 v4l2_fourcc(`H', `S', `V', `3')

#define 0packed0hsv:v4l20pix0fmt0hsv32media/uapi/v4l/pixfmt0packed0hsv:v4l20pix0fmt0hsv32V4L2_PIX_FMT_HSV32 v4l2_fourcc(`H', `S', `V', `4')

/* compressed formats */

#define 0reserved:v4l20pix0fmt0mjpegmedia/uapi/v4l/pixfmt0reserved:v4l20pix0fmt0mjpegV4L2_PIX_FMT_MJPEG

#define v4l2_fourcc(`M', `J', `P', `G') /* Motion-JPEG */

0013:v4l20pix0fmt0jpegmedia/uapi/v4l/pixfmt0013:v4l20pix0fmt0jpegV4L2_PIX_FMT_JPEG

#define v4l2_fourcc(`J', `P', `E', `G') /* JFIF JPEG */

0reserved:v4l20pix0fmt0dvmedia/uapi/v4l/pixfmt0reserved:v4l20pix0fmt0dvV4L2_PIX_FMT_DV

#define v4l2_fourcc(`d', `v', `s', `d') /* 1394 */

0013:v4l20pix0fmt0mpegmedia/uapi/v4l/pixfmt0013:v4l20pix0fmt0mpegV4L2_PIX_FMT_MPEG

#define v4l2_fourcc(`M', `P', `E', `G') /* MPEG-1/2/4 Multiplexed */

0013:v4l20pix0fmt0h264media/uapi/v4l/pixfmt0013:v4l20pix0fmt0h264V4L2_PIX_FMT_H264

#define v4l2_fourcc(`H', `2', `6', `4') /* H264 with start codes */

0013:v4l20pix0fmt0h2640no0scmedia/uapi/v4l/pixfmt0013:v4l20pix0fmt0h2640no0scV4L2_PIX_FMT_H264_NO_SC v4l2_fourcc(`A', `V', `C', `1') /* H264 without start codes */

#define 0013:v4l20pix0fmt0h2640mvcmedia/uapi/v4l/pixfmt0013:v4l20pix0fmt0h2640mvcV4L2_PIX_FMT_H264_MVC v4l2_fourcc(`M', `2', `6', `4') /* H264 MVC */

#define 0013:v4l20pix0fmt0h263media/uapi/v4l/pixfmt0013:v4l20pix0fmt0h263V4L2_PIX_FMT_H263

#define mpeg1V4L2_PIX_FMT_MPEG1

#define v4l2_fourcc(`H', `2', `6', `3') /* H263 */

0013:v4l20pix0fmt0mpeg1media/uapi/v4l/pixfmt0013:v4l20pix0fmt0v4l2_fourcc(`M', `P', `G', `1') /* MPEG-1 ES */

0013:v4l20pix0fmt0mpeg2media/uapi/v4l/pixfmt0013:v4l20pix0fmt0mpeg2V4L2_PIX_FMT_MPEG2

#define mpeg4V4L2_PIX_FMT_MPEG4

#define v4l2_fourcc(`M', `P', `G', `2') /* MPEG-2 ES */

0013:v4l20pix0fmt0mpeg4media/uapi/v4l/pixfmt0013:v4l20pix0fmt0v4l2_fourcc(`M', `P', `G', `4') /* MPEG-4 part 2 ES */

0013:v4l20pix0fmt0xvidmedia/uapi/v4l/pixfmt0013:v4l20pix0fmt0xvidV4L2_PIX_FMT_XVID

#define v4l2_fourcc(`X', `V', `I', `D') /* Xvid */

0013:v4l20pix0fmt0vc10annex0gmedia/uapi/v4l/pixfmt0013:v4l20pix0fmt0vc10annex0gV4L2_PIX_FMT_VC1_ANNEX_G v4l2_fourcc(`V', `C', `1', `G') /* SMPTE 421M Annex G compliant stream */

#define 0013:v4l20pix0fmt0vc10annex0lmedia/uapi/v4l/pixfmt0013:v4l20pix0fmt0vc10annex0lV4L2_PIX_FMT_VC1_ANNEX_L v4l2_fourcc(`V', `C', `1', `L') /* SMPTE 421M Annex L compliant stream */

#define vp8V4L2_PIX_FMT_VP8

0013:v4l20pix0fmt0vp8media/uapi/v4l/pixfmt0013:v4l20pix0fmt0v4l2_fourcc(`V', `P', `8', `0') /* VP8 */

#define vp9V4L2_PIX_FMT_VP9

0013:v4l20pix0fmt0vp9media/uapi/v4l/pixfmt0013:v4l20pix0fmt0v4l2_fourcc(`V', `P', `9', `0') /* VP9 */

/* Vendor-specific formats

#define

*/

0reserved:v4l20pix0fmt0cpia1media/uapi/v4l/pixfmt0reserved:v4l20pix0fmt0cpia1V4L2_PIX_FMT_CPIA1 v4l2_fourcc(`C', `P', `I', `A') /* cpia1 YUV */

#define 0reserved:v4l20pix0fmt0wnvamedia/uapi/v4l/pixfmt0reserved:v4l20pix0fmt0wnvaV4L2_PIX_FMT_WNVA v4l2_fourcc(`W', `N', `V', `A') /* Winnov hw compress */

#define 0reserved:v4l20pix0fmt0sn9c10xmedia/uapi/v4l/pixfmt0reserved:v4l20pix0fmt0sn9c10xV4L2_PIX_FMT_SN9C10X v4l2_fourcc(`S', `9', `1', `0') /* SN9C10x compression */

#define 0reserved:v4l20pix0fmt0sn9c20x0i420media/uapi/v4l/pixfmt0reserved:v4l20pix0fmt0sn9c20x0i420V4L2_PIX_FMT_SN9C20X_I420 v4l2_fourcc(`S', `9', `2', `0') /* SN9C20x YUV 4:2:0 */

#define 0reserved:v4l20pix0fmt0pwc1media/uapi/v4l/pixfmt0reserved:v4l20pix0fmt0pwc1V4L2_PIX_FMT_PWC1 v4l2_fourcc(`P', `W', `C', `1') /* pwc older webcam */

#define 0reserved:v4l20pix0fmt0pwc2media/uapi/v4l/pixfmt0reserved:v4l20pix0fmt0pwc2V4L2_PIX_FMT_PWC2 v4l2_fourcc(`P', `W', `C', `2') /* pwc newer webcam */

#define 0reserved:v4l20pix0fmt0et61x251media/uapi/v4l/pixfmt0reserved:v4l20pix0fmt0et61x251V4L2_PIX_FMT_ET61X251 v4l2_fourcc(`E', `6', `2', `5') /* ET61X251 compression */

#define 0reserved:v4l20pix0fmt0spca501media/uapi/v4l/pixfmt0reserved:v4l20pix0fmt0-

302 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

spca501V4L2_PIX_FMT_SPCA501 v4l2_fourcc(`S', `5', `0', `1') /* YUYV per line */

#define 0reserved:v4l20pix0fmt0spca505media/uapi/v4l/pixfmt0reserved:v4l20pix0fmt0spca505V4L2_PIX_FMT_SPCA505 v4l2_fourcc(`S', `5', `0', `5') /* YYUV per line */

#define 0reserved:v4l20pix0fmt0spca508media/uapi/v4l/pixfmt0reserved:v4l20pix0fmt0spca508V4L2_PIX_FMT_SPCA508 v4l2_fourcc(`S', `5', `0', `8') /* YUVY per line */

#define 0reserved:v4l20pix0fmt0spca561media/uapi/v4l/pixfmt0reserved:v4l20pix0fmt0spca561V4L2_PIX_FMT_SPCA561 v4l2_fourcc(`S', `5', `6', `1') /* compressed GBRG bayer */

#define 0reserved:v4l20pix0fmt0pac207media/uapi/v4l/pixfmt0reserved:v4l20pix0fmt0pac207V4L2_PIX_FMT_PAC207 v4l2_fourcc(`P', `2', `0', `7') /* compressed BGGR bayer */

#define 0reserved:v4l20pix0fmt0mr97310amedia/uapi/v4l/pixfmt0reserved:v4l20pix0fmt0mr97310aV4L2_PIX_FMT_MR97310A v4l2_fourcc(`M', `3', `1', `0') /* compressed BGGR bayer */

#define 0reserved:v4l20pix0fmt0jl2005bcdmedia/uapi/v4l/pixfmt0reserved:v4l20pix0fmt0jl2005bcdV4L2_PIX_FMT_JL2005BCD v4l2_fourcc(`J', `L', `2', `0') /* compressed RGGB bayer */

#define 0reserved:v4l20pix0fmt0sn9c2028media/uapi/v4l/pixfmt0reserved:v4l20pix0fmt0sn9c2028V4L2_PIX_FMT_SN9C2028 v4l2_fourcc(`S', `O', `N', `X') /* compressed GBRG bayer */

#define 0reserved:v4l20pix0fmt0sq905cmedia/uapi/v4l/pixfmt0reserved:v4l20pix0fmt0sq905cV4L2_PIX_FMT_SQ905C v4l2_fourcc(`9', `0', `5', `C') /* compressed RGGB bayer */

#define 0reserved:v4l20pix0fmt0pjpgmedia/uapi/v4l/pixfmt0reserved:v4l20pix0fmt0pjpgV4L2_PIX_FMT_PJPG v4l2_fourcc(`P', `J', `P', `G') /* Pixart 73xx JPEG */

#define 0reserved:v4l20pix0fmt0ov511media/uapi/v4l/pixfmt0reserved:v4l20pix0fmt0ov511V4L2_PIX_FMT_OV511 v4l2_fourcc(`O', `5', `1', `1') /* ov511 JPEG */

#define 0reserved:v4l20pix0fmt0ov518media/uapi/v4l/pixfmt0reserved:v4l20pix0fmt0ov518V4L2_PIX_FMT_OV518 v4l2_fourcc(`O', `5', `1', `8') /* ov518 JPEG */

#define 0reserved:v4l20pix0fmt0stv0680media/uapi/v4l/pixfmt0reserved:v4l20pix0fmt0stv0680V4L2_PIX_FMT_STV0680 v4l2_fourcc(`S', `6', `8', `0') /* stv0680 bayer */

#define 0reserved:v4l20pix0fmt0tm6000media/uapi/v4l/pixfmt0reserved:v4l20pix0fmt0tm6000V4L2_PIX_FMT_TM6000 v4l2_fourcc(`T', `M', `6', `0') /* tm5600/tm60x0 */

#define 0reserved:v4l20pix0fmt0cit0yyvyuymedia/uapi/v4l/pixfmt0reserved:v4l20pix0fmt0cit0yyvyuyV4L2_PIX_FMT_CIT_YYVYUY v4l2_fourcc(`C', `I', `T', `V') /* one line of Y then 1 line of VYUY */

#define 0reserved:v4l20pix0fmt0konica420media/uapi/v4l/pixfmt0reserved:v4l20pix0fmt0konica420V4L2_PIX_FMT_KONICA420 v4l2_fourcc(`K', `O', `N', `I') /* YUV420 planar in blocks of 256 pixels */

#define 0reserved:v4l20pix0fmt0jpglmedia/uapi/v4l/pixfmt0reserved:v4l20pix0fmt0jpglV4L2_PIX_FMT_JPGL

#define v4l2_fourcc(`J', `P', `G', `L') /* JPEG-Lite */

0reserved:v4l20pix0fmt0se401media/uapi/v4l/pixfmt0reserved:v4l20pix0fmt0se401V4L2_PIX_FMT_SE401 pressed rgb */ v4l2_fourcc(`S', `4', `0', `1') /* se401 janggu com-

#define 0reserved:v4l20pix0fmt0s5c0uyvy0jpgmedia/uapi/v4l/pixfmt0reserved:v4l20pix0fmt0s5c0uyvy0jpgV4L2_PIX_FMT_S5C_UYVY_JPG v4l2_fourcc(`S', `5', `C', `I') /* S5C73M3 interleaved UYVY/JPEG */

#define y8iV4L2_PIX_FMT_Y8I leaved */

0y8i:v4l20pix0fmt0y8imedia/uapi/v4l/pixfmt0y8i:v4l20pix0fmt0v4l2_fourcc(`Y', `8', `I', ` `) /* Greyscale 8-bit L/R inter-

#define y12iV4L2_PIX_FMT_Y12I leaved */

0y12i:v4l20pix0fmt0y12imedia/uapi/v4l/pixfmt0y12i:v4l20pix0fmt0v4l2_fourcc(`Y', `1', `2', `I') /* Greyscale 12-bit L/R inter-

#define z16V4L2_PIX_FMT_Z16

#define 0reserved:v4l20pix0fmt0mt21cmedia/uapi/v4l/pixfmt0reserved:v4l20pix0fmt0mt21cV4L2_PIX_FMT_MT21C v4l2_fourcc(`M', `T', `2', `1') /* Mediatek compressed block mode */

0z16:v4l20pix0fmt0z16media/uapi/v4l/pixfmt0z16:v4l20pix0fmt0v4l2_fourcc(`Z', `1', `6', ` `) /* Depth data 16-bit */

/* SDR formats - used only for Software Defined Radio devices */

#define 0sdr0cu08:v4l20sdr0fmt0cu8media/uapi/v4l/pixfmt0sdr0cu08:v4l20sdr0fmt0cu8V4L2_SDR_FMT_CU8 v4l2_fourcc(`C', `U', `0', `8') /* IQ u8 */

#define 0sdr0cu16le:v4l20sdr0fmt0cu16lemedia/uapi/v4l/pixfmt0sdr0cu16le:v4l20sdr0fmt0cu16leV4L2_SDR_FMT_CU16LE v4l2_fourcc(`C', `U', `1', `6') /* IQ u16le */

1.2. Part I - Video for Linux API 303

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

#define 0sdr0cs08:v4l20sdr0fmt0cs8media/uapi/v4l/pixfmt0sdr0cs08:v4l20sdr0fmt0cs8V4L2_SDR_FMT_CS8 v4l2_fourcc(`C', `S', `0', `8') /* complex s8 */

#define 0sdr0cs14le:v4l20sdr0fmt0cs14lemedia/uapi/v4l/pixfmt0sdr0cs14le:v4l20sdr0fmt0cs14leV4L2_SDR_FMT_CS14LE v4l2_fourcc(`C', `S', `1', `4') /* complex s14le */

#define 0sdr0ru12le:v4l20sdr0fmt0ru12lemedia/uapi/v4l/pixfmt0sdr0ru12le:v4l20sdr0fmt0ru12leV4L2_SDR_FMT_RU12LE v4l2_fourcc(`R', `U', `1', `2') /* real u12le */

/* Touch formats - used for Touch devices */

#define 0tch0td16:v4l20tch0fmt0delta0td16media/uapi/v4l/pixfmt0tch0td16:v4l20tch0fmt0delta0td16V4L2_TCH_FMT_DELTA_TD16 v4l2_fourcc(`T', `D', `1', `6') /* 16bit signed deltas */

#define 0tch0td08:v4l20tch0fmt0delta0td08media/uapi/v4l/pixfmt0tch0td08:v4l20tch0fmt0delta0td08V4L2_TCH_FMT_DELTA_TD08 v4l2_fourcc(`T', `D', `0', `8') /* 8bit signed deltas */

#define 0tch0tu16:v4l20tch0fmt0tu16media/uapi/v4l/pixfmt0tch0tu16:v4l20tch0fmt0tu16V4L2_TCH_FMT_TU16 v4l2_fourcc(`T', `U', `1', `6') /* 16-bit unsigned touch data */

#define 0tch0tu08:v4l20tch0fmt0tu08media/uapi/v4l/pixfmt0tch0tu08:v4l20tch0fmt0tu08V4L2_TCH_FMT_TU08 v4l2_fourcc(`T', `U', `0', `8') /* 8-bit unsigned touch data */

/* priv field value to indicates that subsequent fields are valid. */

#define 0002:c.v4l2_pix_formatmedia/uapi/v4l/pixfmt0002:c.v4l2_pix_formatV4L2_PIX_FMT_PRIV_MAGIC

/* Flags */

#define 0reserved:reserved0formatsmedia/uapi/v4l/pixfmt0reserved:reserved0formatsV4L2_PIX_FMT_FLAG_PREMUL_ALPHA 0x00000001

/*

* F O R M A T E N U M E R A T I O N

*/ struct 0enum0fmt:c.v4l2_fmtdescmedia/uapi/v4l/vidioc0enum0fmt:c.v4l2_fmtdescv4l2_fmtdesc {

__u32

__u32 index; type;

/* Format number */

/* enum

v4l2_buf_type

*/

__u32

__u8

__u32

__u32 flags; description[32]; pixelformat; reserved[4];

/* Description string */

/* Format fourcc */

};

#define 0enum0fmt:fmtdesc0flagsmedia/uapi/v4l/vidioc0enum0fmt:fmtdesc0flagsV4L2_FMT_FLAG_COMPRESSED 0x0001

#define 0enum0fmt:fmtdesc0flagsmedia/uapi/v4l/vidioc0enum0fmt:fmtdesc0flagsV4L2_FMT_FLAG_EMULATED 0x0002

/* Frame Size and frame rate enumeration */

/*

*

*/

F R A M E S I Z E E N U M E R A T I O N enum 0enum0framesizes:c.v4l2_frmsizetypesmedia/uapi/v4l/vidioc0enum0framesizes:c.v4l2_frmsizetypesv4l2_frmsizetypes {

0enum0framesizes:c.v4l2_frmsizetypesmedia/uapi/v4l/vidioc0enum0framesizes:c.v4l2_frmsizetypesV4L2_FRMSIZE_TYPE_DISCRETE

= 1,

0enum0framesizes:c.v4l2_frmsizetypesmedia/uapi/v4l/vidioc0enum0framesizes:c.v4l2_frmsizetypesV4L2_FRMSIZE_TYPE_CONTINUOUS

= 2,

0enum0framesizes:c.v4l2_frmsizetypesmedia/uapi/v4l/vidioc0enum0framesizes:c.v4l2_frmsizetypesV4L2_FRMSIZE_TYPE_STEPWISE

= 3,

}; struct 0enum0framesizes:c.v4l2_frmsize_discretemedia/uapi/v4l/vidioc0enum0-

304 Chapter 1. Linux Media Infrastructure userspace API

0xfeedcafe

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

framesizes:c.v4l2_frmsize_discretev4l2_frmsize_discrete {

__u32

__u32 width; height;

/* Frame width [pixel] */

/* Frame height [pixel] */

}; struct 0enum0framesizes:c.v4l2_frmsize_stepwisemedia/uapi/v4l/vidioc0enum0framesizes:c.v4l2_frmsize_stepwisev4l2_frmsize_stepwise {

__u32

__u32 min_width; max_width;

/* Minimum frame width [pixel] */

/* Maximum frame width [pixel] */

__u32

__u32

__u32

__u32 step_width; min_height; max_height; step_height;

/* Frame width step size [pixel] */

/* Minimum frame height [pixel] */

/* Maximum frame height [pixel] */

/* Frame height step size [pixel] */

}; struct 0enum0framesizes:c.v4l2_frmsizeenummedia/uapi/v4l/vidioc0enum0framesizes:c.v4l2_frmsizeenumv4l2_frmsizeenum {

__u32 index;

__u32

__u32 pixel_format; type;

/* Frame size number */

/* Pixel format */

/* Frame size type the device supports. */ union { enum0framesizes:c.v4l2_frmsize_stepwisev4l2_frmsize_stepwise

};

/* Frame size */ struct 0enum0framesizes:c.v4l2_frmsize_discretemedia/uapi/v4l/vidioc0enum0framesizes:c.v4l2_frmsize_discretev4l2_frmsize_discrete

discrete; struct 0enum0framesizes:c.v4l2_frmsize_stepwisemedia/uapi/v4l/vidioc0stepwise;

__u32 reserved[2]; /* Reserved space for future use */

};

/*

* F R A M E R A T E E N U M E R A T I O N

*/ enum 0enum0frameintervals:c.v4l2_frmivaltypesmedia/uapi/v4l/vidioc0enum0frameintervals:c.v4l2_frmivaltypesv4l2_frmivaltypes {

0enum0frameintervals:c.v4l2_frmivaltypesmedia/uapi/v4l/vidioc0enum0frameintervals:c.v4l2_frmivaltypesV4L2_FRMIVAL_TYPE_DISCRETE

= 1,

0enum0frameintervals:c.v4l2_frmivaltypesmedia/uapi/v4l/vidioc0enum0frameintervals:c.v4l2_frmivaltypesV4L2_FRMIVAL_TYPE_CONTINUOUS

= 2,

0enum0frameintervals:c.v4l2_frmivaltypesmedia/uapi/v4l/vidioc0enum0frameintervals:c.v4l2_frmivaltypesV4L2_FRMIVAL_TYPE_STEPWISE

= 3,

}; struct 0enum0frameintervals:c.v4l2_frmival_stepwisemedia/uapi/v4l/vidioc0enum0frameintervals:c.v4l2_frmival_stepwisev4l2_frmival_stepwise { struct 0enumstd:c.v4l2_fractmedia/uapi/v4l/vidioc0enumstd:c.v4l2_fractv4l2_fract

min; struct

/* Minimum frame interval [s] */

0enumstd:c.v4l2_fractmedia/uapi/v4l/vidioc0enumstd:c.v4l2_fractv4l2_fract

enumstd:c.v4l2_fractv4l2_fract

}; max; struct step;

/* Maximum frame interval [s] */

0enumstd:c.v4l2_fractmedia/uapi/v4l/vidioc0-

/* Frame interval step size [s] */ struct 0enum0frameintervals:c.v4l2_frmivalenummedia/uapi/v4l/vidioc0enum0frameintervals:c.v4l2_frmivalenumv4l2_frmivalenum {

__u32

__u32 index; pixel_format;

/* Frame format index */

/* Pixel format */

1.2. Part I - Video for Linux API 305

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

__u32

__u32

__u32 width; height; type;

/* Frame width */

/* Frame height */

/* Frame interval type the device supports. */ union { enum0frameintervals:c.v4l2_frmival_stepwisev4l2_frmival_stepwise

}; struct

/* Frame interval */

0enumstd:c.v4l2_fractmedia/uapi/v4l/vidioc0enumstd:c.v4l2_fractv4l2_fract

discrete; struct 0enum0frameintervals:c.v4l2_frmival_stepwisemedia/uapi/v4l/vidioc0stepwise;

__u32 reserved[2]; /* Reserved space for future use */

};

/*

* T I M E C O D E

*/ struct

v4l2_timecode

{

__u32

__u32

__u8

__u8 type; flags; frames; seconds;

__u8

__u8

__u8 minutes; hours; userbits[4];

};

/* Type */

#define 0typemedia/uapi/v4l/buffer:timecode0typeV4L2_TC_TYPE_24FPS

#define 0typemedia/uapi/v4l/buffer:timecode0typeV4L2_TC_TYPE_25FPS

#define 0typemedia/uapi/v4l/buffer:timecode0typeV4L2_TC_TYPE_30FPS

#define 0typemedia/uapi/v4l/buffer:timecode0typeV4L2_TC_TYPE_50FPS

#define 0typemedia/uapi/v4l/buffer:timecode0typeV4L2_TC_TYPE_60FPS

1

2

3

4

5

/* Flags */

#define 0flagsmedia/uapi/v4l/buffer:timecode0flagsV4L2_TC_FLAG_DROPFRAME

#define 0flagsmedia/uapi/v4l/buffer:timecode0flagsV4L2_TC_USERBITS_8BITCHARS

/* The above is based on SMPTE timecodes */

0x0001 /* ``dropframe'' mode */

#define 0flagsmedia/uapi/v4l/buffer:timecode0flagsV4L2_TC_FLAG_COLORFRAME

#define 0flagsmedia/uapi/v4l/buffer:timecode0flagsV4L2_TC_USERBITS_field

0x0002

0x000C

#define 0flagsmedia/uapi/v4l/buffer:timecode0flagsV4L2_TC_USERBITS_USERDEFINED 0x0000

0x0008 struct 0g0jpegcomp:c.v4l2_jpegcompressionmedia/uapi/v4l/vidioc0g0jpegcomp:c.v4l2_jpegcompressionv4l2_jpegcompression { int quality; int APPn; int APP_len; char APP_data[60];

/* Number of APP segment to be written,

* must be 0..15 */

/* Length of data in JPEG APPn segment */

/* Data in the JPEG APPn segment. */ int COM_len; char COM_data[60];

__u32 jpeg_markers;

/* Length of data in JPEG COM segment */

/* Data in JPEG COM segment */

/* Which markers should go into the JPEG

* output. Unless you exactly know what

* you do, leave them untouched.

306 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

* Including less markers will make the

* resulting code smaller, but there will

* be fewer applications which can read it.

* The presence of the APP and COM marker

* is influenced by APP_len and COM_len

* ONLY, not by this property! */

#define 0g0jpegcomp:jpeg0markersmedia/uapi/v4l/vidioc0g0jpegcomp:jpeg0markersV4L2_JPEG_MARKER_DHT (1<<3) /* Define Huffman Tables */

#define 0g0jpegcomp:jpeg0markersmedia/uapi/v4l/vidioc0g0jpegcomp:jpeg0markersV4L2_JPEG_MARKER_DQT (1<<4) /* Define Quantization Tables */

#define 0g0jpegcomp:jpeg0markersmedia/uapi/v4l/vidioc0g0jpegcomp:jpeg0markersV4L2_JPEG_MARKER_DRI (1<<5) /* Define Restart Interval */

#define 0g0jpegcomp:jpeg0markersmedia/uapi/v4l/vidioc0g0jpegcomp:jpeg0markersV4L2_JPEG_MARKER_COM (1<<6) /* Comment segment */

#define 0g0jpegcomp:jpeg0markersmedia/uapi/v4l/vidioc0g0jpegcomp:jpeg0markersV4L2_JPEG_MARKER_APP (1<<7) /* App segment, driver will

* always use APP0 */

};

/*

* M E M O R Y - M A P P I N G B U F F E R S

*/ struct 0reqbufs:c.v4l2_requestbuffersmedia/uapi/v4l/vidioc0reqbufs:c.v4l2_requestbuffersv4l2_requestbuffers {

__u32

__u32

__u32

__u32 count; type; memory; reserved[2];

/* enum

/* enum

v4l2_buf_type

v4l2_memory

*/

*/

};

/**

* struct

v4l2_plane

- plane info for multi-planar buffers

* @bytesused:

* @length: number of bytes occupied by data in the plane (payload) size of this plane (NOT the payload) in bytes

*

*

* @mem_offset:

* when memory in the associated struct

V4L2_MEMORY_MMAP

v4l2_buffer

is

, equals the offset from the start of

the device memory for this plane (or is a ``cookie'' that should be passed to mmap() called on the video node)

* @userptr:

*

* @fd:

* when memory is

V4L2_MEMORY_USERPTR , a userspace pointer

pointing to this plane when memory is

V4L2_MEMORY_DMABUF , a userspace file

descriptor associated with this plane

* @data_offset:

* offset in the plane to the start of data; usually 0, unless there is a header in front of the data

*

* Multi-planar buffers consist of one or more planes, e.g. an YCbCr buffer

* with two planes can have one plane for Y, and another for interleaved CbCr

* components. Each plane can reside in a separate memory buffer, or even in

* a completely separate memory node (e.g. in embedded devices).

*/ struct

v4l2_plane

{

__u32

__u32 union { bytesused; length;

__u32 unsigned long

__s32 mem_offset; userptr; fd;

} m;

1.2. Part I - Video for Linux API 307

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

__u32

__u32 data_offset; reserved[11];

};

/**

* struct

v4l2_buffer

- video buffer info

* @index:

* @type: id number of the buffer enum

v4l2_buf_type ; buffer type (type == *_MPLANE for

* multiplanar buffers);

* @bytesused: number of bytes occupied by data in the buffer (payload);

*

* @flags: unused (set to 0) for multiplanar buffers buffer informational flags

* @field: enum 0order:c.v4l2_fieldmedia/uapi/v4l/field0order:c.v4l2_fieldv4l2_field; field order of the image in the buffer

* @timestamp: frame timestamp

* @timecode: frame timecode

* @sequence:

* @memory: sequence count of this frame enum

v4l2_memory ; the method, in which the actual video data is

*

*

*

* @offset: passed for non-multiplanar buffers with memory ==

V4L2_MEMORY_MMAP

offset from the start of the device memory for this plane,

(or a ``cookie'' that should be passed to mmap() as offset)

;

* @userptr:

*

* @fd:

*

*

*

* @planes:

*

* @length:

* for non-multiplanar buffers with memory == a userspace pointer pointing to this buffer for non-multiplanar buffers with memory ==

V4L2_MEMORY_USERPTR

V4L2_MEMORY_DMABUF

a userspace file descriptor associated with this buffer

;

;

for multiplanar buffers; userspace pointer to the array of plane info structs for this buffer size in bytes of the buffer (NOT its payload) for single-plane buffers (when type != *_MPLANE); number of elements in the planes array for multi-plane buffers

* Contains data exchanged by application and driver using one of the Streaming

* I/O methods.

*/ struct

v4l2_buffer

{

__u32

__u32

__u32

__u32 index; type; bytesused; flags;

__u32 struct timeval struct

v4l2_timecode

__u32 field; timestamp; timecode; sequence;

/* memory location */

__u32 union { memory;

__u32 unsigned long offset; userptr; struct

v4l2_plane

*planes;

__s32 fd;

} m;

__u32

__u32

__u32 length; reserved2; reserved;

};

308 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

/* Flags for `flags' field */

/* Buffer is mapped (flag) */

#define 0buf0flag0mappedmedia/uapi/v4l/buffer:v4l20buf0flag0mappedV4L2_BUF_FLAG_MAPPED

/* Buffer is queued for processing */

#define 0buf0flag0queuedmedia/uapi/v4l/buffer:v4l20buf0flag0queuedV4L2_BUF_FLAG_QUEUED

/* Buffer is ready */

#define 0buf0flag0donemedia/uapi/v4l/buffer:v4l20buf0flag0doneV4L2_BUF_FLAG_DONE

/* Image is a keyframe (I-frame) */

#define 0buf0flag0keyframemedia/uapi/v4l/buffer:v4l20buf0flag0keyframeV4L2_BUF_FLAG_KEYFRAME

/* Image is a P-frame */

0x00000008

#define 0buf0flag0pframemedia/uapi/v4l/buffer:v4l20buf0flag0pframeV4L2_BUF_FLAG_PFRAME

/* Image is a B-frame */

#define 0buf0flag0bframemedia/uapi/v4l/buffer:v4l20buf0flag0bframeV4L2_BUF_FLAG_BFRAME

/* Buffer is ready, but the data contained within is corrupted. */

#define 0buf0flag0errormedia/uapi/v4l/buffer:v4l20buf0flag0errorV4L2_BUF_FLAG_ERROR

/* timecode field is valid */

#define 0buf0flag0timecodemedia/uapi/v4l/buffer:v4l20buf0flag0timecodeV4L2_BUF_FLAG_TIMECODE

/* Buffer is prepared for queuing */

0x00000100

#define preparedV4L2_BUF_FLAG_PREPARED

0buf0flag0preparedmedia/uapi/v4l/buffer:v4l20buf0flag0-

0x00000400

/* Cache handling flags */

#define 0buf0flag0no0cache0invalidatemedia/uapi/v4l/buffer:v4l20buf0flag0no0cache0invalidateV4L2_BUF_FLAG_NO_CACHE_INVALIDATE

#define

0x00000800

0buf0flag0no0cache0cleanmedia/uapi/v4l/buffer:v4l20buf0flag0no0cache0cleanV4L2_BUF_FLAG_NO_CACHE_CLEAN

/* Timestamp type */

0x00001000

#define 0buf0flag0timestamp0maskmedia/uapi/v4l/buffer:v4l20buf0flag0timestamp0maskV4L2_BUF_FLAG_TIMESTAMP_MASK 0x0000e000

#define 0buf0flag0timestamp0unknownmedia/uapi/v4l/buffer:v4l20buf0flag0timestamp0unknownV4L2_BUF_FLAG_TIMESTAMP_UNKNOWN 0x00000000

#define 0buf0flag0timestamp0monotonicmedia/uapi/v4l/buffer:v4l20buf0flag0timestamp0monotonicV4L2_BUF_FLAG_TIMESTAMP_MONOTONIC 0x00002000

#define 0buf0flag0timestamp0copymedia/uapi/v4l/buffer:v4l20buf0flag0timestamp0copyV4L2_BUF_FLAG_TIMESTAMP_COPY 0x00004000

/* Timestamp sources. */

#define 0buf0flag0tstamp0src0maskmedia/uapi/v4l/buffer:v4l20buf0flag0tstamp0src0maskV4L2_BUF_FLAG_TSTAMP_SRC_MASK

#define

0x00070000

0buf0flag0tstamp0src0eofmedia/uapi/v4l/buffer:v4l20buf0flag0tstamp0src0eofV4L2_BUF_FLAG_TSTAMP_SRC_EOF

#define

0x00000000

0buf0flag0tstamp0src0soemedia/uapi/v4l/buffer:v4l20buf0flag0tstamp0src0soeV4L2_BUF_FLAG_TSTAMP_SRC_SOE

/* mem2mem encoder/decoder */

0x00010000

#define 0buf0flag0lastmedia/uapi/v4l/buffer:v4l20buf0flag0lastV4L2_BUF_FLAG_LAST

/**

* struct 0expbuf:c.v4l2_exportbuffermedia/uapi/v4l/vidioc0expbuf:c.v4l2_exportbufferv4l2_exportbuffer - export of video buffer as DMABUF file descriptor

*

* @index:

* @type:

* id number of the buffer enum

v4l2_buf_type ; buffer type (type == *_MPLANE for

multiplanar buffers); index of the plane to be exported, 0 for single plane queues * @plane:

* @flags:

*

* @fd:

* flags for newly created file, currently only O_CLOEXEC is supported, refer to manual of open syscall for more details file descriptor associated with DMABUF (set by driver)

1.2. Part I - Video for Linux API 309

0x00000001

0x00000002

0x00000004

0x00000010

0x00000020

0x00000040

0x00100000

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

* Contains data used for exporting a video buffer as DMABUF file descriptor.

* The buffer is identified by a `cookie' returned by querybufmedia/uapi/v4l/vidioc0querybuf:vidioc0querybufVIDIOC_QUERYBUF

0querybuf:vidioc0-

* (identical to the cookie used to mmap() the buffer to userspace). All

* reserved fields must be set to zero. The field reserved0 is expected to

* become a structure `type' allowing an alternative layout of the structure

* content. Therefore this field should not be used for any other extensions.

*/ struct 0expbuf:c.v4l2_exportbuffermedia/uapi/v4l/vidioc0expbuf:c.v4l2_exportbufferv4l2_exportbuffer {

__u32

__u32 type; /* enum index;

v4l2_buf_type

*/

__u32

__u32

__s32

__u32 plane; flags; fd; reserved[11];

};

/*

* O V E R L A Y P R E V I E W

*/ struct 0g0fbuf:c.v4l2_framebuffermedia/uapi/v4l/vidioc0g0fbuf:c.v4l2_framebufferv4l2_framebuffer {

__u32

__u32 void struct { capability; flags;

/* FIXME: in theory we should pass something like PCI device + memory

* region + offset instead of some physical address */

*base;

__u32

__u32

__u32

__u32 field; order:c.v4l2_fieldv4l2_field */ width; height; pixelformat;

/* enum 0order:c.v4l2_fieldmedia/uapi/v4l/field0-

__u32

__u32 bytesperline; sizeimage;

/* for padding, zero if unused */

__u32 colorspace; /* enum 0-

006:c.v4l2_colorspacemedia/uapi/v4l/pixfmt0006:c.v4l2_colorspacev4l2_colorspace */

__u32 priv; /* reserved field, set to 0 */

} fmt;

};

/* Flags for the `capability' field. Read only */

#define 0g0fbuf:framebuffer0capmedia/uapi/v4l/vidioc0g0fbuf:framebuffer0capV4L2_FBUF_CAP_EXTERNOVERLAY 0x0001

#define 0g0fbuf:framebuffer0capmedia/uapi/v4l/vidioc0g0fbuf:framebuffer0capV4L2_FBUF_CAP_CHROMAKEY 0x0002

#define 0g0fbuf:framebuffer0capmedia/uapi/v4l/vidioc0g0fbuf:framebuffer0capV4L2_FBUF_CAP_LIST_CLIPPING

#define

0x0004

0g0fbuf:framebuffer0capmedia/uapi/v4l/vidioc0g0fbuf:framebuffer0capV4L2_FBUF_CAP_BITMAP_CLIPPING

#define

0x0008

0g0fbuf:framebuffer0capmedia/uapi/v4l/vidioc0g0fbuf:framebuffer0capV4L2_FBUF_CAP_LOCAL_ALPHA

#define

0x0010

0g0fbuf:framebuffer0capmedia/uapi/v4l/vidioc0g0fbuf:framebuffer0capV4L2_FBUF_CAP_GLOBAL_ALPHA

#define

0x0020

0g0fbuf:framebuffer0capmedia/uapi/v4l/vidioc0g0fbuf:framebuffer0capV4L2_FBUF_CAP_LOCAL_INV_ALPHA

#define

0x0040

0g0fbuf:framebuffer0capmedia/uapi/v4l/vidioc0g0fbuf:framebuffer0capV4L2_FBUF_CAP_SRC_CHROMAKEY

/* Flags for the `flags' field. */

0x0080

#define 0g0fbuf:framebuffer0flagsmedia/uapi/v4l/vidioc0g0fbuf:framebuffer0-

310 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

flagsV4L2_FBUF_FLAG_PRIMARY 0x0001

#define 0g0fbuf:framebuffer0flagsmedia/uapi/v4l/vidioc0g0fbuf:framebuffer0flagsV4L2_FBUF_FLAG_OVERLAY 0x0002

#define 0g0fbuf:framebuffer0flagsmedia/uapi/v4l/vidioc0g0fbuf:framebuffer0flagsV4L2_FBUF_FLAG_CHROMAKEY 0x0004

#define 0g0fbuf:framebuffer0flagsmedia/uapi/v4l/vidioc0g0fbuf:framebuffer0flagsV4L2_FBUF_FLAG_LOCAL_ALPHA 0x0008

#define 0g0fbuf:framebuffer0flagsmedia/uapi/v4l/vidioc0g0fbuf:framebuffer0flagsV4L2_FBUF_FLAG_GLOBAL_ALPHA 0x0010

#define 0g0fbuf:framebuffer0flagsmedia/uapi/v4l/vidioc0g0fbuf:framebuffer0flagsV4L2_FBUF_FLAG_LOCAL_INV_ALPHA 0x0020

#define 0g0fbuf:framebuffer0flagsmedia/uapi/v4l/vidioc0g0fbuf:framebuffer0flagsV4L2_FBUF_FLAG_SRC_CHROMAKEY 0x0040 struct 0overlay:c.v4l2_clipmedia/uapi/v4l/dev0overlay:c.v4l2_clipv4l2_clip { struct 0overlay:c.v4l2_rectmedia/uapi/v4l/dev0overlay:c.v4l2_rectv4l2_rect

overlay:c.v4l2_clipv4l2_clip

}; c; struct 0overlay:c.v4l2_clipmedia/uapi/v4l/dev0-

__user *next; struct 0overlay:c.v4l2_windowmedia/uapi/v4l/dev0overlay:c.v4l2_windowv4l2_window { struct 0overlay:c.v4l2_rectmedia/uapi/v4l/dev0overlay:c.v4l2_rectv4l2_rect

__u32 field; w;

/* enum 0order:c.v4l2_fieldmedia/uapi/v4l/field0order:c.v4l2_fieldv4l2_field */

__u32 overlay:c.v4l2_clipv4l2_clip

__u32 void

__u8 chromakey; struct 0overlay:c.v4l2_clipmedia/uapi/v4l/dev0-

__user *clips; clipcount;

__user *bitmap; global_alpha;

};

/*

* C A P T U R E P A R A M E T E R S

*/ struct 0g0parm:c.v4l2_captureparmmedia/uapi/v4l/vidioc0g0parm:c.v4l2_captureparmv4l2_captureparm {

__u32

__u32 capability; capturemode;

/* Supported modes */

/* Current mode */ struct 0enumstd:c.v4l2_fractmedia/uapi/v4l/vidioc0enumstd:c.v4l2_fractv4l2_fract

timeperframe; /* Time per frame in seconds */

__u32

__u32

__u32 extendedmode; /* Driver-specific extensions */ readbuffers; /* # of buffers for read */ reserved[4];

};

/* Flags for `capability' and `capturemode' fields */

#define 0g0parm:parm0flagsmedia/uapi/v4l/vidioc0g0parm:parm0flagsV4L2_MODE_HIGHQUALITY 0x0001 /* High quality imaging mode */

#define 0g0parm:c.v4l2_captureparmmedia/uapi/v4l/vidioc0g0parm:c.v4l2_captureparmV4L2_CAP_TIMEPERFRAME

0x1000 /* timeperframe field is supported */ struct 0g0parm:c.v4l2_outputparmmedia/uapi/v4l/vidioc0g0parm:c.v4l2_outputparmv4l2_outputparm {

__u32 capability; /* Supported modes */

__u32 outputmode; struct

/* Current mode */

0enumstd:c.v4l2_fractmedia/uapi/v4l/vidioc0enumstd:c.v4l2_fractv4l2_fract

timeperframe; /* Time per frame in seconds */

1.2. Part I - Video for Linux API 311

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

__u32

__u32

__u32 extendedmode; /* Driver-specific extensions */ writebuffers; /* # of buffers for write */ reserved[4];

};

/*

* I N P U T

__u32

I M A G E C R O P P I N G

*/ struct 0cropcap:c.v4l2_cropcapmedia/uapi/v4l/vidioc0cropcap:c.v4l2_cropcapv4l2_cropcap { type; /* enum struct

v4l2_buf_type

*/

0overlay:c.v4l2_rectmedia/uapi/v4l/dev0overlay:c.v4l2_rectv4l2_rect

overlay:c.v4l2_rectv4l2_rect

enumstd:c.v4l2_fractv4l2_fract

}; bounds; struct 0overlay:c.v4l2_rectmedia/uapi/v4l/dev0defrect; struct 0enumstd:c.v4l2_fractmedia/uapi/v4l/vidioc0pixelaspect; struct 0g0crop:c.v4l2_cropmedia/uapi/v4l/vidioc0g0crop:c.v4l2_cropv4l2_crop {

__u32 type; /* enum

v4l2_buf_type

*/ overlay:c.v4l2_rectv4l2_rect

}; struct c;

0overlay:c.v4l2_rectmedia/uapi/v4l/dev0-

/**

* struct 0g0selection:c.v4l2_selectionmedia/uapi/v4l/vidioc0g0selection:c.v4l2_selectionv4l2_selection - selection info

* @type:

* @target: buffer type (do not use *_MPLANE types)

Selection target, used to choose one of possible rectangles;

*

* @flags:

* @r: defined in v4l2-common.h; V4L2_SEL_TGT_* .

constraints flags, defined in v4l2-common.h; V4L2_SEL_FLAG_*.

coordinates of selection window for future use, rounds structure size to 64 bytes, set to zero * @reserved:

*

* Hardware may use multiple helper windows to process a video stream.

* The structure is used to exchange this selection areas between

* an application and a driver.

*/ struct 0g0selection:c.v4l2_selectionmedia/uapi/v4l/vidioc0g0selection:c.v4l2_selectionv4l2_selection {

__u32 type;

__u32

__u32 overlay:c.v4l2_rectv4l2_rect

};

__u32 target; flags; struct r; reserved[9];

0overlay:c.v4l2_rectmedia/uapi/v4l/dev0-

/*

*

*/

A N A L O G V I D E O S T A N D A R D typedef __u64 v4l2_std_id;

/* one bit for each */

#define idV4L2_STD_PAL_B

#define idV4L2_STD_PAL_B1

0enumstd:v4l20std0idmedia/uapi/v4l/vidioc0enumstd:v4l20std0-

((v4l2_std_id)0x00000001)

0enumstd:v4l20std0idmedia/uapi/v4l/vidioc0enumstd:v4l20std0-

((v4l2_std_id)0x00000002)

312 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

#define idV4L2_STD_PAL_G

#define idV4L2_STD_PAL_H

#define idV4L2_STD_PAL_I

#define idV4L2_STD_PAL_D

#define idV4L2_STD_PAL_D1

#define idV4L2_STD_PAL_K

#define idV4L2_STD_PAL_M

#define idV4L2_STD_PAL_N

#define idV4L2_STD_PAL_Nc

#define idV4L2_STD_PAL_60

0enumstd:v4l20std0idmedia/uapi/v4l/vidioc0enumstd:v4l20std0-

((v4l2_std_id)0x00000004)

0enumstd:v4l20std0idmedia/uapi/v4l/vidioc0enumstd:v4l20std0-

((v4l2_std_id)0x00000008)

0enumstd:v4l20std0idmedia/uapi/v4l/vidioc0enumstd:v4l20std0-

((v4l2_std_id)0x00000010)

0enumstd:v4l20std0idmedia/uapi/v4l/vidioc0enumstd:v4l20std0-

((v4l2_std_id)0x00000020)

0enumstd:v4l20std0idmedia/uapi/v4l/vidioc0enumstd:v4l20std0-

((v4l2_std_id)0x00000040)

0enumstd:v4l20std0idmedia/uapi/v4l/vidioc0enumstd:v4l20std0-

((v4l2_std_id)0x00000080)

0enumstd:v4l20std0idmedia/uapi/v4l/vidioc0enumstd:v4l20std0-

((v4l2_std_id)0x00000100)

0enumstd:v4l20std0idmedia/uapi/v4l/vidioc0enumstd:v4l20std0-

((v4l2_std_id)0x00000200)

0enumstd:v4l20std0idmedia/uapi/v4l/vidioc0enumstd:v4l20std0-

((v4l2_std_id)0x00000400)

0enumstd:v4l20std0idmedia/uapi/v4l/vidioc0enumstd:v4l20std0-

((v4l2_std_id)0x00000800)

#define idV4L2_STD_NTSC_M

#define idV4L2_STD_NTSC_M_JP

#define idV4L2_STD_NTSC_443

#define idV4L2_STD_NTSC_M_KR

#define idV4L2_STD_SECAM_B

#define idV4L2_STD_SECAM_D

#define idV4L2_STD_SECAM_G

#define idV4L2_STD_SECAM_H

#define idV4L2_STD_SECAM_K

#define idV4L2_STD_SECAM_K1

#define idV4L2_STD_SECAM_L

#define idV4L2_STD_SECAM_LC

0enumstd:v4l20std0idmedia/uapi/v4l/vidioc0enumstd:v4l20std0-

((v4l2_std_id)0x00001000) /* BTSC */

0enumstd:v4l20std0idmedia/uapi/v4l/vidioc0enumstd:v4l20std0-

((v4l2_std_id)0x00002000) /* EIA-J */

0enumstd:v4l20std0idmedia/uapi/v4l/vidioc0enumstd:v4l20std0-

((v4l2_std_id)0x00004000)

0enumstd:v4l20std0idmedia/uapi/v4l/vidioc0enumstd:v4l20std0-

((v4l2_std_id)0x00008000) /* FM A2 */

0enumstd:v4l20std0idmedia/uapi/v4l/vidioc0enumstd:v4l20std0-

((v4l2_std_id)0x00010000)

0enumstd:v4l20std0idmedia/uapi/v4l/vidioc0enumstd:v4l20std0-

((v4l2_std_id)0x00020000)

0enumstd:v4l20std0idmedia/uapi/v4l/vidioc0enumstd:v4l20std0-

((v4l2_std_id)0x00040000)

0enumstd:v4l20std0idmedia/uapi/v4l/vidioc0enumstd:v4l20std0-

((v4l2_std_id)0x00080000)

0enumstd:v4l20std0idmedia/uapi/v4l/vidioc0enumstd:v4l20std0-

((v4l2_std_id)0x00100000)

0enumstd:v4l20std0idmedia/uapi/v4l/vidioc0enumstd:v4l20std0-

((v4l2_std_id)0x00200000)

0enumstd:v4l20std0idmedia/uapi/v4l/vidioc0enumstd:v4l20std0-

((v4l2_std_id)0x00400000)

0enumstd:v4l20std0idmedia/uapi/v4l/vidioc0enumstd:v4l20std0-

((v4l2_std_id)0x00800000)

/* ATSC/HDTV */

#define idV4L2_STD_ATSC_8_VSB

#define idV4L2_STD_ATSC_16_VSB

0enumstd:v4l20std0idmedia/uapi/v4l/vidioc0enumstd:v4l20std0-

((v4l2_std_id)0x01000000)

0enumstd:v4l20std0idmedia/uapi/v4l/vidioc0enumstd:v4l20std0-

((v4l2_std_id)0x02000000)

/* FIXME:

Although std_id is 64 bits, there is an issue on PPC32 architecture that makes switch(__u64) to break. So, there's a hack on v4l2-common.c rounding this value to 32 bits.

1.2. Part I - Video for Linux API 313

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

As, currently, the max value is for 0enumstd:v4l20std0idmedia/uapi/v4l/vidioc0enumstd:v4l20std0idV4L2_STD_ATSC_16_VSB (30 bits wide), it should work fine. However, if needed to add more than two standards,

*/ v4l2-common.c should be fixed.

/*

* Some macros to merge video standards in order to make live easier for the

* drivers and V4L2 applications

*/

/*

* ``Common'' NTSC/M It should be noticed that idmedia/uapi/v4l/vidioc0enumstd:v4l20std0idV4L2_STD_NTSC_443 is

* Missing here.

*/

#define idV4L2_STD_NTSC idV4L2_STD_NTSC_M |\

0enumstd:v4l20std0-

0enumstd:v4l20std0idmedia/uapi/v4l/vidioc0enumstd:v4l20std0-

( 0enumstd:v4l20std0idmedia/uapi/v4l/vidioc0enumstd:v4l20std0-

0enumstd:v4l20std0idmedia/uapi/v4l/vidioc0enumstd:v4l20std0idV4L2_STD_NTSC_M_JP |\

0enumstd:v4l20std0idmedia/uapi/v4l/vidioc0enumstd:v4l20std0idV4L2_STD_NTSC_M_KR)

/* Secam macros */

#define idV4L2_STD_SECAM_DK idV4L2_STD_SECAM_D |\

0enumstd:v4l20std0idmedia/uapi/v4l/vidioc0enumstd:v4l20std0-

( 0enumstd:v4l20std0idmedia/uapi/v4l/vidioc0enumstd:v4l20std0-

0enumstd:v4l20std0idmedia/uapi/v4l/vidioc0enumstd:v4l20std0idV4L2_STD_SECAM_K |\

0enumstd:v4l20std0idmedia/uapi/v4l/vidioc0enumstd:v4l20std0idV4L2_STD_SECAM_K1)

/* All Secam Standards */

#define idV4L2_STD_SECAM idV4L2_STD_SECAM_B |\

0enumstd:v4l20std0idmedia/uapi/v4l/vidioc0enumstd:v4l20std0-

( 0enumstd:v4l20std0idmedia/uapi/v4l/vidioc0enumstd:v4l20std0-

0enumstd:v4l20std0idmedia/uapi/v4l/vidioc0enumstd:v4l20std0idV4L2_STD_SECAM_G |\

0enumstd:v4l20std0idmedia/uapi/v4l/vidioc0enumstd:v4l20std0idV4L2_STD_SECAM_H |\

0enumstd:v4l20std0idmedia/uapi/v4l/vidioc0enumstd:v4l20std0idV4L2_STD_SECAM_DK |\

0enumstd:v4l20std0idmedia/uapi/v4l/vidioc0enumstd:v4l20std0idV4L2_STD_SECAM_L |\

0enumstd:v4l20std0idmedia/uapi/v4l/vidioc0enumstd:v4l20std0idV4L2_STD_SECAM_LC)

/* PAL macros */

#define idV4L2_STD_PAL_BG idV4L2_STD_PAL_B std0idV4L2_STD_PAL_B1

|\

0enumstd:v4l20std0idmedia/uapi/v4l/vidioc0enumstd:v4l20std0-

( 0enumstd:v4l20std0idmedia/uapi/v4l/vidioc0enumstd:v4l20std0-

|\

0enumstd:v4l20std0idmedia/uapi/v4l/vidioc0enumstd:v4l20-

0enumstd:v4l20std0idmedia/uapi/v4l/vidioc0enumstd:v4l20std0idV4L2_STD_PAL_G)

#define idV4L2_STD_PAL_DK idV4L2_STD_PAL_D std0idV4L2_STD_PAL_D1

|\

0enumstd:v4l20std0idmedia/uapi/v4l/vidioc0enumstd:v4l20std0-

( 0enumstd:v4l20std0idmedia/uapi/v4l/vidioc0enumstd:v4l20std0-

|\

0enumstd:v4l20std0idmedia/uapi/v4l/vidioc0enumstd:v4l20-

314 Chapter 1. Linux Media Infrastructure userspace API

Linux Media Subsystem Documentation, Release 4.11.0-rc4-00191-g7de6e5d

0enumstd:v4l20std0idmedia/uapi/v4l/vidioc0enumstd:v4l20std0idV4L2_STD_PAL_K)

/*

* ``Common'' PAL - This macro is there to be compatible with the old

* V4L1 concept of ``PAL'': /BGDKHI.

* Several PAL standards are missing here: /M, /N and /Nc

*/

#define idV4L2_STD_PAL idV4L2_STD_PAL_BG

0enumstd:v4l20std0idmedia/uapi/v4l/vidioc0enums