Merge tag 'media/v5.3-1' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media
Pull media updates from Mauro Carvalho Chehab: - new Atmel microship ISC driver - coda has gained support for mpeg2 and mpeg4 - cxusb gained support for analog TV - rockchip staging driver was split into two separate staging drivers - added a new staging driver for Allegro DVT video IP core - added a new staging driver for Amlogic Meson video decoder - lots of improvements and cleanups * tag 'media/v5.3-1' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media: (398 commits) media: allegro: use new v4l2_m2m_ioctl_try_encoder_cmd funcs media: doc-rst: Fix typos media: radio-raremono: change devm_k*alloc to k*alloc media: stv0297: fix frequency range limit media: rc: Prefer KEY_NUMERIC_* for number buttons on remotes media: dvb_frontend: split dvb_frontend_handle_ioctl function media: mceusb: disable "nonsensical irdata" messages media: rc: remove redundant dev_err message media: cec-notifier: add new notifier functions media: cec: add struct cec_connector_info support media: cec-notifier: rename variables, check kstrdup and n->conn_name media: MAINTAINERS: Add maintainers for Media Controller media: staging: media: tegra-vde: Defer dmabuf's unmapping media: staging: media: tegra-vde: Add IOMMU support media: hdpvr: fix locking and a missing msleep media: v4l2: Test type instead of cfg->type in v4l2_ctrl_new_custom() media: atmel: atmel-isc: fix i386 build error media: v4l2-ctrl: Move compound control initialization media: hantro: Use vb2_get_buffer media: pci: cx88: Change the type of 'missed' to u64 ...
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
What: /sys/kernel/debug/cec/*/error-inj
|
||||
Date: March 2018
|
||||
Contact: Hans Verkuil <hans.verkuil@cisco.com>
|
||||
Contact: Hans Verkuil <hverkuil-cisco@xs4all.nl>
|
||||
Description:
|
||||
|
||||
The CEC Framework allows for CEC error injection commands through
|
||||
|
43
Documentation/devicetree/bindings/media/allegro.txt
Normal file
43
Documentation/devicetree/bindings/media/allegro.txt
Normal file
@@ -0,0 +1,43 @@
|
||||
Device-tree bindings for the Allegro DVT video IP codecs present in the Xilinx
|
||||
ZynqMP SoC. The IP core may either be a H.264/H.265 encoder or H.264/H.265
|
||||
decoder ip core.
|
||||
|
||||
Each actual codec engines is controlled by a microcontroller (MCU). Host
|
||||
software uses a provided mailbox interface to communicate with the MCU. The
|
||||
MCU share an interrupt.
|
||||
|
||||
Required properties:
|
||||
- compatible: value should be one of the following
|
||||
"allegro,al5e-1.1", "allegro,al5e": encoder IP core
|
||||
"allegro,al5d-1.1", "allegro,al5d": decoder IP core
|
||||
- reg: base and length of the memory mapped register region and base and
|
||||
length of the memory mapped sram
|
||||
- reg-names: must include "regs" and "sram"
|
||||
- interrupts: shared interrupt from the MCUs to the processing system
|
||||
- clocks: must contain an entry for each entry in clock-names
|
||||
- clock-names: must include "core_clk", "mcu_clk", "m_axi_core_aclk",
|
||||
"m_axi_mcu_aclk", "s_axi_lite_aclk"
|
||||
|
||||
Example:
|
||||
al5e: video-codec@a0009000 {
|
||||
compatible = "allegro,al5e-1.1", "allegro,al5e";
|
||||
reg = <0 0xa0009000 0 0x1000>,
|
||||
<0 0xa0000000 0 0x8000>;
|
||||
reg-names = "regs", "sram";
|
||||
interrupts = <0 96 4>;
|
||||
clocks = <&xlnx_vcu 0>, <&xlnx_vcu 1>,
|
||||
<&clkc 71>, <&clkc 71>, <&clkc 71>;
|
||||
clock-names = "core_clk", "mcu_clk", "m_axi_core_aclk",
|
||||
"m_axi_mcu_aclk", "s_axi_lite_aclk"
|
||||
};
|
||||
al5d: video-codec@a0029000 {
|
||||
compatible = "allegro,al5d-1.1", "allegro,al5d";
|
||||
reg = <0 0xa0029000 0 0x1000>,
|
||||
<0 0xa0020000 0 0x8000>;
|
||||
reg-names = "regs", "sram";
|
||||
interrupts = <0 96 4>;
|
||||
clocks = <&xlnx_vcu 2>, <&xlnx_vcu 3>,
|
||||
<&clkc 71>, <&clkc 71>, <&clkc 71>;
|
||||
clock-names = "core_clk", "mcu_clk", "m_axi_core_aclk",
|
||||
"m_axi_mcu_aclk", "s_axi_lite_aclk"
|
||||
};
|
71
Documentation/devicetree/bindings/media/amlogic,vdec.txt
Normal file
71
Documentation/devicetree/bindings/media/amlogic,vdec.txt
Normal file
@@ -0,0 +1,71 @@
|
||||
Amlogic Video Decoder
|
||||
================================
|
||||
|
||||
The video decoding IP lies within the DOS memory region,
|
||||
except for the hardware bitstream parser that makes use of an undocumented
|
||||
region.
|
||||
|
||||
It makes use of the following blocks:
|
||||
|
||||
- ESPARSER is a bitstream parser that outputs to a VIFIFO. Further VDEC blocks
|
||||
then feed from this VIFIFO.
|
||||
- VDEC_1 can decode MPEG-1, MPEG-2, MPEG-4 part 2, MJPEG, H.263, H.264, VC-1.
|
||||
- VDEC_HEVC can decode HEVC and VP9.
|
||||
|
||||
Both VDEC_1 and VDEC_HEVC share the "vdec" IRQ and as such cannot run
|
||||
concurrently.
|
||||
|
||||
Device Tree Bindings:
|
||||
---------------------
|
||||
|
||||
VDEC: Video Decoder
|
||||
--------------------------
|
||||
|
||||
Required properties:
|
||||
- compatible: value should be different for each SoC family as :
|
||||
- GXBB (S905) : "amlogic,gxbb-vdec"
|
||||
- GXL (S905X, S905D) : "amlogic,gxl-vdec"
|
||||
- GXM (S912) : "amlogic,gxm-vdec"
|
||||
- reg: base address and size of he following memory-mapped regions :
|
||||
- dos
|
||||
- esparser
|
||||
- reg-names: should contain the names of the previous memory regions
|
||||
- interrupts: should contain the following IRQs:
|
||||
- vdec
|
||||
- esparser
|
||||
- interrupt-names: should contain the names of the previous interrupts
|
||||
- amlogic,ao-sysctrl: should point to the AOBUS sysctrl node
|
||||
- amlogic,canvas: should point to a canvas provider node
|
||||
- clocks: should contain the following clocks :
|
||||
- dos_parser
|
||||
- dos
|
||||
- vdec_1
|
||||
- vdec_hevc
|
||||
- clock-names: should contain the names of the previous clocks
|
||||
- resets: should contain the parser reset
|
||||
- reset-names: should be "esparser"
|
||||
|
||||
Example:
|
||||
|
||||
vdec: video-decoder@c8820000 {
|
||||
compatible = "amlogic,gxbb-vdec";
|
||||
reg = <0x0 0xc8820000 0x0 0x10000>,
|
||||
<0x0 0xc110a580 0x0 0xe4>;
|
||||
reg-names = "dos", "esparser";
|
||||
|
||||
interrupts = <GIC_SPI 44 IRQ_TYPE_EDGE_RISING>,
|
||||
<GIC_SPI 32 IRQ_TYPE_EDGE_RISING>;
|
||||
interrupt-names = "vdec", "esparser";
|
||||
|
||||
amlogic,ao-sysctrl = <&sysctrl_AO>;
|
||||
amlogic,canvas = <&canvas>;
|
||||
|
||||
clocks = <&clkc CLKID_DOS_PARSER>,
|
||||
<&clkc CLKID_DOS>,
|
||||
<&clkc CLKID_VDEC_1>,
|
||||
<&clkc CLKID_VDEC_HEVC>;
|
||||
clock-names = "dos_parser", "dos", "vdec_1", "vdec_hevc";
|
||||
|
||||
resets = <&reset RESET_PARSER>;
|
||||
reset-names = "esparser";
|
||||
};
|
@@ -14,8 +14,7 @@ Required properties:
|
||||
- interrupts : should contain CSI interrupt;
|
||||
- clocks : list of clock specifiers, see
|
||||
Documentation/devicetree/bindings/clock/clock-bindings.txt for details;
|
||||
- clock-names : must contain "axi", "mclk" and "dcic" entries, matching
|
||||
entries in the clock property;
|
||||
- clock-names : must contain "mclk";
|
||||
|
||||
The device node shall contain one 'port' child node with one child 'endpoint'
|
||||
node, according to the bindings defined in:
|
||||
@@ -32,10 +31,8 @@ example:
|
||||
compatible = "fsl,imx7-csi";
|
||||
reg = <0x30710000 0x10000>;
|
||||
interrupts = <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&clks IMX7D_CLK_DUMMY>,
|
||||
<&clks IMX7D_CSI_MCLK_ROOT_CLK>,
|
||||
<&clks IMX7D_CLK_DUMMY>;
|
||||
clock-names = "axi", "mclk", "dcic";
|
||||
clocks = <&clks IMX7D_CSI_MCLK_ROOT_CLK>;
|
||||
clock-names = "mclk";
|
||||
|
||||
port {
|
||||
csi_from_csi_mux: endpoint {
|
||||
|
@@ -0,0 +1,50 @@
|
||||
Marvell MMP2 camera host interface
|
||||
|
||||
Required properties:
|
||||
- compatible: Should be "marvell,mmp2-ccic".
|
||||
- reg: Register base and size.
|
||||
- interrupts: The interrupt number.
|
||||
- #clock-cells: Must be 0.
|
||||
|
||||
Optional properties:
|
||||
- clocks: Reference to the input clock as specified by
|
||||
Documentation/devicetree/bindings/clock/clock-bindings.txt.
|
||||
- clock-names: Names of the clocks used; "axi" for the AXI bus interface,
|
||||
"func" for the peripheral clock and "phy" for the parallel
|
||||
video bus interface.
|
||||
- clock-output-names: Optional clock source for sensors. Shall be "mclk".
|
||||
|
||||
Required subnodes:
|
||||
- port: The parallel bus interface port with a single endpoint linked to
|
||||
the sensor's endpoint as described in
|
||||
Documentation/devicetree/bindings/media/video-interfaces.txt.
|
||||
|
||||
Required endpoint properties:
|
||||
- bus-type: data bus type, <5> or <6> for Parallel or Bt.656 respectively
|
||||
- pclk-sample: pixel clock polarity
|
||||
- hsync-active: horizontal synchronization polarity (only required for
|
||||
parallel bus)
|
||||
- vsync-active: vertical synchronization polarity (only required for
|
||||
parallel bus)
|
||||
|
||||
Example:
|
||||
|
||||
camera0: camera@d420a000 {
|
||||
compatible = "marvell,mmp2-ccic";
|
||||
reg = <0xd420a000 0x800>;
|
||||
interrupts = <42>;
|
||||
clocks = <&soc_clocks MMP2_CLK_CCIC0>;
|
||||
clock-names = "axi";
|
||||
#clock-cells = <0>;
|
||||
clock-output-names = "mclk";
|
||||
|
||||
port {
|
||||
camera0_0: endpoint {
|
||||
remote-endpoint = <&ov7670_0>;
|
||||
bus-type = <5>; /* Parallel */
|
||||
hsync-active = <1>; /* Active high */
|
||||
vsync-active = <1>; /* Active high */
|
||||
pclk-sample = <0>; /* Falling */
|
||||
};
|
||||
};
|
||||
};
|
@@ -6,6 +6,7 @@ Allwinner V3s SoC features a CSI module(CSI1) with parallel interface.
|
||||
Required properties:
|
||||
- compatible: value must be one of:
|
||||
* "allwinner,sun6i-a31-csi"
|
||||
* "allwinner,sun8i-a83t-csi"
|
||||
* "allwinner,sun8i-h3-csi"
|
||||
* "allwinner,sun8i-v3s-csi"
|
||||
* "allwinner,sun50i-a64-csi"
|
||||
|
@@ -49,6 +49,8 @@ patternProperties:
|
||||
description: Aeroflex Gaisler AB
|
||||
"^al,.*":
|
||||
description: Annapurna Labs
|
||||
"^allegro,.*":
|
||||
description: Allegro DVT
|
||||
"^allo,.*":
|
||||
description: Allo.com
|
||||
"^allwinner,.*":
|
||||
|
@@ -11,12 +11,12 @@ Digital TV devices are implemented by several different drivers:
|
||||
|
||||
- Frontend drivers that are usually implemented as two separate drivers:
|
||||
|
||||
- A tuner driver that implements the logic with commands the part of the
|
||||
hardware with is responsible to tune into a digital TV transponder or
|
||||
- A tuner driver that implements the logic which commands the part of
|
||||
the hardware responsible for tuning into a digital TV transponder or
|
||||
physical channel. The output of a tuner is usually a baseband or
|
||||
Intermediate Frequency (IF) signal;
|
||||
|
||||
- A demodulator driver (a.k.a "demod") that implements the logic with
|
||||
- A demodulator driver (a.k.a "demod") that implements the logic which
|
||||
commands the digital TV decoding hardware. The output of a demod is
|
||||
a digital stream, with multiple audio, video and data channels typically
|
||||
multiplexed using MPEG Transport Stream [#f1]_.
|
||||
|
@@ -26,8 +26,9 @@ The control framework was created in order to implement all the rules of the
|
||||
V4L2 specification with respect to controls in a central place. And to make
|
||||
life as easy as possible for the driver developer.
|
||||
|
||||
Note that the control framework relies on the presence of a struct v4l2_device
|
||||
for V4L2 drivers and struct v4l2_subdev for sub-device drivers.
|
||||
Note that the control framework relies on the presence of a struct
|
||||
:c:type:`v4l2_device` for V4L2 drivers and struct :c:type:`v4l2_subdev` for
|
||||
sub-device drivers.
|
||||
|
||||
|
||||
Objects in the framework
|
||||
@@ -35,12 +36,13 @@ Objects in the framework
|
||||
|
||||
There are two main objects:
|
||||
|
||||
The v4l2_ctrl object describes the control properties and keeps track of the
|
||||
control's value (both the current value and the proposed new value).
|
||||
The :c:type:`v4l2_ctrl` object describes the control properties and keeps
|
||||
track of the control's value (both the current value and the proposed new
|
||||
value).
|
||||
|
||||
v4l2_ctrl_handler is the object that keeps track of controls. It maintains a
|
||||
list of v4l2_ctrl objects that it owns and another list of references to
|
||||
controls, possibly to controls owned by other handlers.
|
||||
:c:type:`v4l2_ctrl_handler` is the object that keeps track of controls. It
|
||||
maintains a list of v4l2_ctrl objects that it owns and another list of
|
||||
references to controls, possibly to controls owned by other handlers.
|
||||
|
||||
|
||||
Basic usage for V4L2 and sub-device drivers
|
||||
@@ -48,33 +50,15 @@ Basic usage for V4L2 and sub-device drivers
|
||||
|
||||
1) Prepare the driver:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
#include <media/v4l2-ctrls.h>
|
||||
|
||||
1.1) Add the handler to your driver's top-level struct:
|
||||
|
||||
.. code-block:: none
|
||||
For V4L2 drivers:
|
||||
|
||||
struct foo_dev {
|
||||
...
|
||||
struct v4l2_ctrl_handler ctrl_handler;
|
||||
...
|
||||
};
|
||||
|
||||
struct foo_dev *foo;
|
||||
|
||||
1.2) Initialize the handler:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
v4l2_ctrl_handler_init(&foo->ctrl_handler, nr_of_controls);
|
||||
|
||||
The second argument is a hint telling the function how many controls this
|
||||
handler is expected to handle. It will allocate a hashtable based on this
|
||||
information. It is a hint only.
|
||||
|
||||
1.3) Hook the control handler into the driver:
|
||||
|
||||
1.3.1) For V4L2 drivers do this:
|
||||
|
||||
.. code-block:: none
|
||||
.. code-block:: c
|
||||
|
||||
struct foo_dev {
|
||||
...
|
||||
@@ -84,18 +68,9 @@ information. It is a hint only.
|
||||
...
|
||||
};
|
||||
|
||||
foo->v4l2_dev.ctrl_handler = &foo->ctrl_handler;
|
||||
For sub-device drivers:
|
||||
|
||||
Where foo->v4l2_dev is of type struct v4l2_device.
|
||||
|
||||
Finally, remove all control functions from your v4l2_ioctl_ops (if any):
|
||||
vidioc_queryctrl, vidioc_query_ext_ctrl, vidioc_querymenu, vidioc_g_ctrl,
|
||||
vidioc_s_ctrl, vidioc_g_ext_ctrls, vidioc_try_ext_ctrls and vidioc_s_ext_ctrls.
|
||||
Those are now no longer needed.
|
||||
|
||||
1.3.2) For sub-device drivers do this:
|
||||
|
||||
.. code-block:: none
|
||||
.. code-block:: c
|
||||
|
||||
struct foo_dev {
|
||||
...
|
||||
@@ -105,39 +80,60 @@ Those are now no longer needed.
|
||||
...
|
||||
};
|
||||
|
||||
foo->sd.ctrl_handler = &foo->ctrl_handler;
|
||||
1.2) Initialize the handler:
|
||||
|
||||
Where foo->sd is of type struct v4l2_subdev.
|
||||
.. code-block:: c
|
||||
|
||||
v4l2_ctrl_handler_init(&foo->ctrl_handler, nr_of_controls);
|
||||
|
||||
The second argument is a hint telling the function how many controls this
|
||||
handler is expected to handle. It will allocate a hashtable based on this
|
||||
information. It is a hint only.
|
||||
|
||||
1.3) Hook the control handler into the driver:
|
||||
|
||||
For V4L2 drivers:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
foo->v4l2_dev.ctrl_handler = &foo->ctrl_handler;
|
||||
|
||||
For sub-device drivers:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
foo->sd.ctrl_handler = &foo->ctrl_handler;
|
||||
|
||||
1.4) Clean up the handler at the end:
|
||||
|
||||
.. code-block:: none
|
||||
.. code-block:: c
|
||||
|
||||
v4l2_ctrl_handler_free(&foo->ctrl_handler);
|
||||
|
||||
|
||||
2) Add controls:
|
||||
|
||||
You add non-menu controls by calling v4l2_ctrl_new_std:
|
||||
You add non-menu controls by calling :c:func:`v4l2_ctrl_new_std`:
|
||||
|
||||
.. code-block:: none
|
||||
.. code-block:: c
|
||||
|
||||
struct v4l2_ctrl *v4l2_ctrl_new_std(struct v4l2_ctrl_handler *hdl,
|
||||
const struct v4l2_ctrl_ops *ops,
|
||||
u32 id, s32 min, s32 max, u32 step, s32 def);
|
||||
|
||||
Menu and integer menu controls are added by calling v4l2_ctrl_new_std_menu:
|
||||
Menu and integer menu controls are added by calling
|
||||
:c:func:`v4l2_ctrl_new_std_menu`:
|
||||
|
||||
.. code-block:: none
|
||||
.. code-block:: c
|
||||
|
||||
struct v4l2_ctrl *v4l2_ctrl_new_std_menu(struct v4l2_ctrl_handler *hdl,
|
||||
const struct v4l2_ctrl_ops *ops,
|
||||
u32 id, s32 max, s32 skip_mask, s32 def);
|
||||
|
||||
Menu controls with a driver specific menu are added by calling
|
||||
v4l2_ctrl_new_std_menu_items:
|
||||
:c:func:`v4l2_ctrl_new_std_menu_items`:
|
||||
|
||||
.. code-block:: none
|
||||
.. code-block:: c
|
||||
|
||||
struct v4l2_ctrl *v4l2_ctrl_new_std_menu_items(
|
||||
struct v4l2_ctrl_handler *hdl,
|
||||
@@ -145,17 +141,18 @@ v4l2_ctrl_new_std_menu_items:
|
||||
s32 skip_mask, s32 def, const char * const *qmenu);
|
||||
|
||||
Integer menu controls with a driver specific menu can be added by calling
|
||||
v4l2_ctrl_new_int_menu:
|
||||
:c:func:`v4l2_ctrl_new_int_menu`:
|
||||
|
||||
.. code-block:: none
|
||||
.. code-block:: c
|
||||
|
||||
struct v4l2_ctrl *v4l2_ctrl_new_int_menu(struct v4l2_ctrl_handler *hdl,
|
||||
const struct v4l2_ctrl_ops *ops,
|
||||
u32 id, s32 max, s32 def, const s64 *qmenu_int);
|
||||
|
||||
These functions are typically called right after the v4l2_ctrl_handler_init:
|
||||
These functions are typically called right after the
|
||||
:c:func:`v4l2_ctrl_handler_init`:
|
||||
|
||||
.. code-block:: none
|
||||
.. code-block:: c
|
||||
|
||||
static const s64 exp_bias_qmenu[] = {
|
||||
-2, -1, 0, 1, 2
|
||||
@@ -192,33 +189,34 @@ These functions are typically called right after the v4l2_ctrl_handler_init:
|
||||
return err;
|
||||
}
|
||||
|
||||
The v4l2_ctrl_new_std function returns the v4l2_ctrl pointer to the new
|
||||
control, but if you do not need to access the pointer outside the control ops,
|
||||
then there is no need to store it.
|
||||
The :c:func:`v4l2_ctrl_new_std` function returns the v4l2_ctrl pointer to
|
||||
the new control, but if you do not need to access the pointer outside the
|
||||
control ops, then there is no need to store it.
|
||||
|
||||
The v4l2_ctrl_new_std function will fill in most fields based on the control
|
||||
ID except for the min, max, step and default values. These are passed in the
|
||||
last four arguments. These values are driver specific while control attributes
|
||||
like type, name, flags are all global. The control's current value will be set
|
||||
to the default value.
|
||||
The :c:func:`v4l2_ctrl_new_std` function will fill in most fields based on
|
||||
the control ID except for the min, max, step and default values. These are
|
||||
passed in the last four arguments. These values are driver specific while
|
||||
control attributes like type, name, flags are all global. The control's
|
||||
current value will be set to the default value.
|
||||
|
||||
The v4l2_ctrl_new_std_menu function is very similar but it is used for menu
|
||||
controls. There is no min argument since that is always 0 for menu controls,
|
||||
and instead of a step there is a skip_mask argument: if bit X is 1, then menu
|
||||
item X is skipped.
|
||||
The :c:func:`v4l2_ctrl_new_std_menu` function is very similar but it is
|
||||
used for menu controls. There is no min argument since that is always 0 for
|
||||
menu controls, and instead of a step there is a skip_mask argument: if bit
|
||||
X is 1, then menu item X is skipped.
|
||||
|
||||
The v4l2_ctrl_new_int_menu function creates a new standard integer menu
|
||||
control with driver-specific items in the menu. It differs from
|
||||
v4l2_ctrl_new_std_menu in that it doesn't have the mask argument and takes
|
||||
as the last argument an array of signed 64-bit integers that form an exact
|
||||
menu item list.
|
||||
The :c:func:`v4l2_ctrl_new_int_menu` function creates a new standard
|
||||
integer menu control with driver-specific items in the menu. It differs
|
||||
from v4l2_ctrl_new_std_menu in that it doesn't have the mask argument and
|
||||
takes as the last argument an array of signed 64-bit integers that form an
|
||||
exact menu item list.
|
||||
|
||||
The v4l2_ctrl_new_std_menu_items function is very similar to
|
||||
v4l2_ctrl_new_std_menu but takes an extra parameter qmenu, which is the driver
|
||||
specific menu for an otherwise standard menu control. A good example for this
|
||||
control is the test pattern control for capture/display/sensors devices that
|
||||
have the capability to generate test patterns. These test patterns are hardware
|
||||
specific, so the contents of the menu will vary from device to device.
|
||||
The :c:func:`v4l2_ctrl_new_std_menu_items` function is very similar to
|
||||
v4l2_ctrl_new_std_menu but takes an extra parameter qmenu, which is the
|
||||
driver specific menu for an otherwise standard menu control. A good example
|
||||
for this control is the test pattern control for capture/display/sensors
|
||||
devices that have the capability to generate test patterns. These test
|
||||
patterns are hardware specific, so the contents of the menu will vary from
|
||||
device to device.
|
||||
|
||||
Note that if something fails, the function will return NULL or an error and
|
||||
set ctrl_handler->error to the error code. If ctrl_handler->error was already
|
||||
@@ -233,7 +231,7 @@ a bit faster that way.
|
||||
|
||||
3) Optionally force initial control setup:
|
||||
|
||||
.. code-block:: none
|
||||
.. code-block:: c
|
||||
|
||||
v4l2_ctrl_handler_setup(&foo->ctrl_handler);
|
||||
|
||||
@@ -242,9 +240,9 @@ initializes the hardware to the default control values. It is recommended
|
||||
that you do this as this ensures that both the internal data structures and
|
||||
the hardware are in sync.
|
||||
|
||||
4) Finally: implement the v4l2_ctrl_ops
|
||||
4) Finally: implement the :c:type:`v4l2_ctrl_ops`
|
||||
|
||||
.. code-block:: none
|
||||
.. code-block:: c
|
||||
|
||||
static const struct v4l2_ctrl_ops foo_ctrl_ops = {
|
||||
.s_ctrl = foo_s_ctrl,
|
||||
@@ -252,7 +250,7 @@ the hardware are in sync.
|
||||
|
||||
Usually all you need is s_ctrl:
|
||||
|
||||
.. code-block:: none
|
||||
.. code-block:: c
|
||||
|
||||
static int foo_s_ctrl(struct v4l2_ctrl *ctrl)
|
||||
{
|
||||
@@ -305,7 +303,7 @@ Accessing Control Values
|
||||
The following union is used inside the control framework to access control
|
||||
values:
|
||||
|
||||
.. code-block:: none
|
||||
.. code-block:: c
|
||||
|
||||
union v4l2_ctrl_ptr {
|
||||
s32 *p_s32;
|
||||
@@ -317,7 +315,7 @@ values:
|
||||
The v4l2_ctrl struct contains these fields that can be used to access both
|
||||
current and new values:
|
||||
|
||||
.. code-block:: none
|
||||
.. code-block:: c
|
||||
|
||||
s32 val;
|
||||
struct {
|
||||
@@ -330,7 +328,7 @@ current and new values:
|
||||
|
||||
If the control has a simple s32 type type, then:
|
||||
|
||||
.. code-block:: none
|
||||
.. code-block:: c
|
||||
|
||||
&ctrl->val == ctrl->p_new.p_s32
|
||||
&ctrl->cur.val == ctrl->p_cur.p_s32
|
||||
@@ -354,7 +352,7 @@ exception is for controls that return a volatile register such as a signal
|
||||
strength read-out that changes continuously. In that case you will need to
|
||||
implement g_volatile_ctrl like this:
|
||||
|
||||
.. code-block:: none
|
||||
.. code-block:: c
|
||||
|
||||
static int foo_g_volatile_ctrl(struct v4l2_ctrl *ctrl)
|
||||
{
|
||||
@@ -372,7 +370,7 @@ changes.
|
||||
|
||||
To mark a control as volatile you have to set V4L2_CTRL_FLAG_VOLATILE:
|
||||
|
||||
.. code-block:: none
|
||||
.. code-block:: c
|
||||
|
||||
ctrl = v4l2_ctrl_new_std(&sd->ctrl_handler, ...);
|
||||
if (ctrl)
|
||||
@@ -393,7 +391,7 @@ not to introduce deadlocks.
|
||||
Outside of the control ops you have to go through to helper functions to get
|
||||
or set a single control value safely in your driver:
|
||||
|
||||
.. code-block:: none
|
||||
.. code-block:: c
|
||||
|
||||
s32 v4l2_ctrl_g_ctrl(struct v4l2_ctrl *ctrl);
|
||||
int v4l2_ctrl_s_ctrl(struct v4l2_ctrl *ctrl, s32 val);
|
||||
@@ -404,7 +402,7 @@ will result in a deadlock since these helpers lock the handler as well.
|
||||
|
||||
You can also take the handler lock yourself:
|
||||
|
||||
.. code-block:: none
|
||||
.. code-block:: c
|
||||
|
||||
mutex_lock(&state->ctrl_handler.lock);
|
||||
pr_info("String value is '%s'\n", ctrl1->p_cur.p_char);
|
||||
@@ -417,7 +415,7 @@ Menu Controls
|
||||
|
||||
The v4l2_ctrl struct contains this union:
|
||||
|
||||
.. code-block:: none
|
||||
.. code-block:: c
|
||||
|
||||
union {
|
||||
u32 step;
|
||||
@@ -445,7 +443,7 @@ Custom Controls
|
||||
|
||||
Driver specific controls can be created using v4l2_ctrl_new_custom():
|
||||
|
||||
.. code-block:: none
|
||||
.. code-block:: c
|
||||
|
||||
static const struct v4l2_ctrl_config ctrl_filter = {
|
||||
.ops = &ctrl_custom_ops,
|
||||
@@ -499,7 +497,7 @@ By default all controls are independent from the others. But in more
|
||||
complex scenarios you can get dependencies from one control to another.
|
||||
In that case you need to 'cluster' them:
|
||||
|
||||
.. code-block:: none
|
||||
.. code-block:: c
|
||||
|
||||
struct foo {
|
||||
struct v4l2_ctrl_handler ctrl_handler;
|
||||
@@ -523,7 +521,7 @@ composite control. Similar to how a 'struct' works in C.
|
||||
So when s_ctrl is called with V4L2_CID_AUDIO_VOLUME as argument, you should set
|
||||
all two controls belonging to the audio_cluster:
|
||||
|
||||
.. code-block:: none
|
||||
.. code-block:: c
|
||||
|
||||
static int foo_s_ctrl(struct v4l2_ctrl *ctrl)
|
||||
{
|
||||
@@ -545,7 +543,7 @@ all two controls belonging to the audio_cluster:
|
||||
|
||||
In the example above the following are equivalent for the VOLUME case:
|
||||
|
||||
.. code-block:: none
|
||||
.. code-block:: c
|
||||
|
||||
ctrl == ctrl->cluster[AUDIO_CL_VOLUME] == state->audio_cluster[AUDIO_CL_VOLUME]
|
||||
ctrl->cluster[AUDIO_CL_MUTE] == state->audio_cluster[AUDIO_CL_MUTE]
|
||||
@@ -553,7 +551,7 @@ In the example above the following are equivalent for the VOLUME case:
|
||||
In practice using cluster arrays like this becomes very tiresome. So instead
|
||||
the following equivalent method is used:
|
||||
|
||||
.. code-block:: none
|
||||
.. code-block:: c
|
||||
|
||||
struct {
|
||||
/* audio cluster */
|
||||
@@ -565,7 +563,7 @@ The anonymous struct is used to clearly 'cluster' these two control pointers,
|
||||
but it serves no other purpose. The effect is the same as creating an
|
||||
array with two control pointers. So you can just do:
|
||||
|
||||
.. code-block:: none
|
||||
.. code-block:: c
|
||||
|
||||
state->volume = v4l2_ctrl_new_std(&state->ctrl_handler, ...);
|
||||
state->mute = v4l2_ctrl_new_std(&state->ctrl_handler, ...);
|
||||
@@ -621,7 +619,7 @@ changing that control affects the control flags of the manual controls.
|
||||
In order to simplify this a special variation of v4l2_ctrl_cluster was
|
||||
introduced:
|
||||
|
||||
.. code-block:: none
|
||||
.. code-block:: c
|
||||
|
||||
void v4l2_ctrl_auto_cluster(unsigned ncontrols, struct v4l2_ctrl **controls,
|
||||
u8 manual_val, bool set_volatile);
|
||||
@@ -676,7 +674,7 @@ of another handler (e.g. for a video device node), then you should first add
|
||||
the controls to the first handler, add the other controls to the second
|
||||
handler and finally add the first handler to the second. For example:
|
||||
|
||||
.. code-block:: none
|
||||
.. code-block:: c
|
||||
|
||||
v4l2_ctrl_new_std(&radio_ctrl_handler, &radio_ops, V4L2_CID_AUDIO_VOLUME, ...);
|
||||
v4l2_ctrl_new_std(&radio_ctrl_handler, &radio_ops, V4L2_CID_AUDIO_MUTE, ...);
|
||||
@@ -690,7 +688,7 @@ all controls.
|
||||
|
||||
Or you can add specific controls to a handler:
|
||||
|
||||
.. code-block:: none
|
||||
.. code-block:: c
|
||||
|
||||
volume = v4l2_ctrl_new_std(&video_ctrl_handler, &ops, V4L2_CID_AUDIO_VOLUME, ...);
|
||||
v4l2_ctrl_new_std(&video_ctrl_handler, &ops, V4L2_CID_BRIGHTNESS, ...);
|
||||
@@ -699,7 +697,7 @@ Or you can add specific controls to a handler:
|
||||
What you should not do is make two identical controls for two handlers.
|
||||
For example:
|
||||
|
||||
.. code-block:: none
|
||||
.. code-block:: c
|
||||
|
||||
v4l2_ctrl_new_std(&radio_ctrl_handler, &radio_ops, V4L2_CID_AUDIO_MUTE, ...);
|
||||
v4l2_ctrl_new_std(&video_ctrl_handler, &video_ops, V4L2_CID_AUDIO_MUTE, ...);
|
||||
@@ -720,7 +718,7 @@ not own. For example, if you have to find a volume control from a subdev.
|
||||
|
||||
You can do that by calling v4l2_ctrl_find:
|
||||
|
||||
.. code-block:: none
|
||||
.. code-block:: c
|
||||
|
||||
struct v4l2_ctrl *volume;
|
||||
|
||||
@@ -729,7 +727,7 @@ You can do that by calling v4l2_ctrl_find:
|
||||
Since v4l2_ctrl_find will lock the handler you have to be careful where you
|
||||
use it. For example, this is not a good idea:
|
||||
|
||||
.. code-block:: none
|
||||
.. code-block:: c
|
||||
|
||||
struct v4l2_ctrl_handler ctrl_handler;
|
||||
|
||||
@@ -738,7 +736,7 @@ use it. For example, this is not a good idea:
|
||||
|
||||
...and in video_ops.s_ctrl:
|
||||
|
||||
.. code-block:: none
|
||||
.. code-block:: c
|
||||
|
||||
case V4L2_CID_BRIGHTNESS:
|
||||
contrast = v4l2_find_ctrl(&ctrl_handler, V4L2_CID_CONTRAST);
|
||||
@@ -760,7 +758,7 @@ not when it is used in consumer-level hardware. In that case you want to keep
|
||||
those low-level controls local to the subdev. You can do this by simply
|
||||
setting the 'is_private' flag of the control to 1:
|
||||
|
||||
.. code-block:: none
|
||||
.. code-block:: c
|
||||
|
||||
static const struct v4l2_ctrl_config ctrl_private = {
|
||||
.ops = &ctrl_custom_ops,
|
||||
@@ -797,7 +795,7 @@ Sometimes the platform or bridge driver needs to be notified when a control
|
||||
from a sub-device driver changes. You can set a notify callback by calling
|
||||
this function:
|
||||
|
||||
.. code-block:: none
|
||||
.. code-block:: c
|
||||
|
||||
void v4l2_ctrl_notify(struct v4l2_ctrl *ctrl,
|
||||
void (*notify)(struct v4l2_ctrl *ctrl, void *priv), void *priv);
|
||||
|
@@ -39,7 +39,7 @@ Revision and Copyright
|
||||
**********************
|
||||
Authors:
|
||||
|
||||
- Verkuil, Hans <hans.verkuil@cisco.com>
|
||||
- Verkuil, Hans <hverkuil-cisco@xs4all.nl>
|
||||
|
||||
- Initial version.
|
||||
|
||||
|
@@ -294,7 +294,8 @@ EINVAL
|
||||
The requested mode is invalid.
|
||||
|
||||
EPERM
|
||||
Monitor mode is requested without having root permissions
|
||||
Monitor mode is requested, but the process does have the ``CAP_NET_ADMIN``
|
||||
capability.
|
||||
|
||||
EBUSY
|
||||
Someone else is already an exclusive follower or initiator.
|
||||
|
@@ -223,6 +223,18 @@ View On' messages from initiator 0xf ('Unregistered') to destination 0 ('TV').
|
||||
result of the :ref:`ioctl CEC_TRANSMIT <CEC_TRANSMIT>`, and once via
|
||||
:ref:`ioctl CEC_RECEIVE <CEC_RECEIVE>`.
|
||||
|
||||
* .. _`CEC-MSG-FL-RAW`:
|
||||
|
||||
- ``CEC_MSG_FL_RAW``
|
||||
- 2
|
||||
- Normally CEC messages are validated before transmitting them. If this
|
||||
flag is set when :ref:`ioctl CEC_TRANSMIT <CEC_TRANSMIT>` is called,
|
||||
then no validation takes place and the message is transmitted as-is.
|
||||
This is useful when debugging CEC issues.
|
||||
This flag is only allowed if the process has the ``CAP_SYS_RAWIO``
|
||||
capability. If that is not set, then the ``EPERM`` error code is
|
||||
returned.
|
||||
|
||||
|
||||
.. tabularcolumns:: |p{5.6cm}|p{0.9cm}|p{11.0cm}|
|
||||
|
||||
@@ -358,7 +370,8 @@ ENOTTY
|
||||
|
||||
EPERM
|
||||
The CEC adapter is not configured, i.e. :ref:`ioctl CEC_ADAP_S_LOG_ADDRS <CEC_ADAP_S_LOG_ADDRS>`
|
||||
has never been called.
|
||||
has never been called, or ``CEC_MSG_FL_RAW`` was used from a process that
|
||||
did not have the ``CAP_SYS_RAWIO`` capability.
|
||||
|
||||
ENONET
|
||||
The CEC adapter is not configured, i.e. :ref:`ioctl CEC_ADAP_S_LOG_ADDRS <CEC_ADAP_S_LOG_ADDRS>`
|
||||
|
@@ -84,6 +84,11 @@ returned during the enumeration process.
|
||||
- Pointer to a links array allocated by the application. Ignored if
|
||||
NULL.
|
||||
|
||||
* - __u32
|
||||
- ``reserved[4]``
|
||||
- Reserved for future extensions. Drivers and applications must set
|
||||
the array to zero.
|
||||
|
||||
|
||||
.. c:type:: media_pad_desc
|
||||
|
||||
@@ -135,7 +140,7 @@ returned during the enumeration process.
|
||||
- Link flags, see :ref:`media-link-flag` for more details.
|
||||
|
||||
* - __u32
|
||||
- ``reserved[4]``
|
||||
- ``reserved[2]``
|
||||
- Reserved for future extensions. Drivers and applications must set
|
||||
the array to zero.
|
||||
|
||||
|
@@ -54,7 +54,7 @@ the remote via /dev/input/event devices.
|
||||
|
||||
- .. row 3
|
||||
|
||||
- ``KEY_0``
|
||||
- ``KEY_NUMERIC_0``
|
||||
|
||||
- Keyboard digit 0
|
||||
|
||||
@@ -62,7 +62,7 @@ the remote via /dev/input/event devices.
|
||||
|
||||
- .. row 4
|
||||
|
||||
- ``KEY_1``
|
||||
- ``KEY_NUMERIC_1``
|
||||
|
||||
- Keyboard digit 1
|
||||
|
||||
@@ -70,7 +70,7 @@ the remote via /dev/input/event devices.
|
||||
|
||||
- .. row 5
|
||||
|
||||
- ``KEY_2``
|
||||
- ``KEY_NUMERIC_2``
|
||||
|
||||
- Keyboard digit 2
|
||||
|
||||
@@ -78,7 +78,7 @@ the remote via /dev/input/event devices.
|
||||
|
||||
- .. row 6
|
||||
|
||||
- ``KEY_3``
|
||||
- ``KEY_NUMERIC_3``
|
||||
|
||||
- Keyboard digit 3
|
||||
|
||||
@@ -86,7 +86,7 @@ the remote via /dev/input/event devices.
|
||||
|
||||
- .. row 7
|
||||
|
||||
- ``KEY_4``
|
||||
- ``KEY_NUMERIC_4``
|
||||
|
||||
- Keyboard digit 4
|
||||
|
||||
@@ -94,7 +94,7 @@ the remote via /dev/input/event devices.
|
||||
|
||||
- .. row 8
|
||||
|
||||
- ``KEY_5``
|
||||
- ``KEY_NUMERIC_5``
|
||||
|
||||
- Keyboard digit 5
|
||||
|
||||
@@ -102,7 +102,7 @@ the remote via /dev/input/event devices.
|
||||
|
||||
- .. row 9
|
||||
|
||||
- ``KEY_6``
|
||||
- ``KEY_NUMERIC_6``
|
||||
|
||||
- Keyboard digit 6
|
||||
|
||||
@@ -110,7 +110,7 @@ the remote via /dev/input/event devices.
|
||||
|
||||
- .. row 10
|
||||
|
||||
- ``KEY_7``
|
||||
- ``KEY_NUMERIC_7``
|
||||
|
||||
- Keyboard digit 7
|
||||
|
||||
@@ -118,7 +118,7 @@ the remote via /dev/input/event devices.
|
||||
|
||||
- .. row 11
|
||||
|
||||
- ``KEY_8``
|
||||
- ``KEY_NUMERIC_8``
|
||||
|
||||
- Keyboard digit 8
|
||||
|
||||
@@ -126,7 +126,7 @@ the remote via /dev/input/event devices.
|
||||
|
||||
- .. row 12
|
||||
|
||||
- ``KEY_9``
|
||||
- ``KEY_NUMERIC_9``
|
||||
|
||||
- Keyboard digit 9
|
||||
|
||||
@@ -196,7 +196,7 @@ the remote via /dev/input/event devices.
|
||||
|
||||
- ``KEY_PAUSE``
|
||||
|
||||
- Pause sroweam
|
||||
- Pause stream
|
||||
|
||||
- PAUSE / FREEZE
|
||||
|
||||
@@ -220,7 +220,7 @@ the remote via /dev/input/event devices.
|
||||
|
||||
- ``KEY_STOP``
|
||||
|
||||
- Stop sroweam
|
||||
- Stop stream
|
||||
|
||||
- STOP
|
||||
|
||||
@@ -228,7 +228,7 @@ the remote via /dev/input/event devices.
|
||||
|
||||
- ``KEY_RECORD``
|
||||
|
||||
- Start/stop recording sroweam
|
||||
- Start/stop recording stream
|
||||
|
||||
- CAPTURE / REC / RECORD/PAUSE
|
||||
|
||||
@@ -577,7 +577,7 @@ the remote via /dev/input/event devices.
|
||||
|
||||
- ``KEY_CLEAR``
|
||||
|
||||
- Stop sroweam and return to default input video/audio
|
||||
- Stop stream and return to default input video/audio
|
||||
|
||||
- CLEAR / RESET / BOSS KEY
|
||||
|
||||
@@ -593,7 +593,7 @@ the remote via /dev/input/event devices.
|
||||
|
||||
- ``KEY_FAVORITES``
|
||||
|
||||
- Open the favorites sroweam window
|
||||
- Open the favorites stream window
|
||||
|
||||
- TV WALL / Favorites
|
||||
|
||||
|
@@ -122,6 +122,15 @@ ITU BT.1119
|
||||
|
||||
:author: International Telecommunication Union (http://www.itu.ch)
|
||||
|
||||
.. _h264:
|
||||
|
||||
ITU-T Rec. H.264 Specification (04/2017 Edition)
|
||||
================================================
|
||||
|
||||
:title: ITU-T Recommendation H.264 "Advanced Video Coding for Generic Audiovisual Services"
|
||||
|
||||
:author: International Telecommunication Union (http://www.itu.ch)
|
||||
|
||||
.. _jfif:
|
||||
|
||||
JFIF
|
||||
|
@@ -759,6 +759,32 @@ enum v4l2_mpeg_video_h264_level -
|
||||
|
||||
|
||||
|
||||
.. _v4l2-mpeg-video-mpeg2-level:
|
||||
|
||||
``V4L2_CID_MPEG_VIDEO_MPEG2_LEVEL``
|
||||
(enum)
|
||||
|
||||
enum v4l2_mpeg_video_mpeg2_level -
|
||||
The level information for the MPEG2 elementary stream. Applicable to
|
||||
MPEG2 codecs. Possible values are:
|
||||
|
||||
|
||||
|
||||
.. flat-table::
|
||||
:header-rows: 0
|
||||
:stub-columns: 0
|
||||
|
||||
* - ``V4L2_MPEG_VIDEO_MPEG2_LEVEL_LOW``
|
||||
- Low Level (LL)
|
||||
* - ``V4L2_MPEG_VIDEO_MPEG2_LEVEL_MAIN``
|
||||
- Main Level (ML)
|
||||
* - ``V4L2_MPEG_VIDEO_MPEG2_LEVEL_HIGH_1440``
|
||||
- High-1440 Level (H-14)
|
||||
* - ``V4L2_MPEG_VIDEO_MPEG2_LEVEL_HIGH``
|
||||
- High Level (HL)
|
||||
|
||||
|
||||
|
||||
.. _v4l2-mpeg-video-mpeg4-level:
|
||||
|
||||
``V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL``
|
||||
@@ -845,6 +871,36 @@ enum v4l2_mpeg_video_h264_profile -
|
||||
|
||||
|
||||
|
||||
.. _v4l2-mpeg-video-mpeg2-profile:
|
||||
|
||||
``V4L2_CID_MPEG_VIDEO_MPEG2_PROFILE``
|
||||
(enum)
|
||||
|
||||
enum v4l2_mpeg_video_mpeg2_profile -
|
||||
The profile information for MPEG2. Applicable to MPEG2 codecs.
|
||||
Possible values are:
|
||||
|
||||
|
||||
|
||||
.. flat-table::
|
||||
:header-rows: 0
|
||||
:stub-columns: 0
|
||||
|
||||
* - ``V4L2_MPEG_VIDEO_MPEG2_PROFILE_SIMPLE``
|
||||
- Simple profile (SP)
|
||||
* - ``V4L2_MPEG_VIDEO_MPEG2_PROFILE_MAIN``
|
||||
- Main profile (MP)
|
||||
* - ``V4L2_MPEG_VIDEO_MPEG2_PROFILE_SNR_SCALABLE``
|
||||
- SNR Scalable profile (SNR)
|
||||
* - ``V4L2_MPEG_VIDEO_MPEG2_PROFILE_SPATIALLY_SCALABLE``
|
||||
- Spatially Scalable profile (Spt)
|
||||
* - ``V4L2_MPEG_VIDEO_MPEG2_PROFILE_HIGH``
|
||||
- High profile (HP)
|
||||
* - ``V4L2_MPEG_VIDEO_MPEG2_PROFILE_MULTIVIEW``
|
||||
- Multi-view profile (MVP)
|
||||
|
||||
|
||||
|
||||
.. _v4l2-mpeg-video-mpeg4-profile:
|
||||
|
||||
``V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE``
|
||||
@@ -1395,6 +1451,575 @@ enum v4l2_mpeg_video_h264_hierarchical_coding_type -
|
||||
- Layer number
|
||||
|
||||
|
||||
.. _v4l2-mpeg-h264:
|
||||
|
||||
``V4L2_CID_MPEG_VIDEO_H264_SPS (struct)``
|
||||
Specifies the sequence parameter set (as extracted from the
|
||||
bitstream) for the associated H264 slice data. This includes the
|
||||
necessary parameters for configuring a stateless hardware decoding
|
||||
pipeline for H264. The bitstream parameters are defined according
|
||||
to :ref:`h264`, section 7.4.2.1.1 "Sequence Parameter Set Data
|
||||
Semantics". For further documentation, refer to the above
|
||||
specification, unless there is an explicit comment stating
|
||||
otherwise.
|
||||
|
||||
.. note::
|
||||
|
||||
This compound control is not yet part of the public kernel API and
|
||||
it is expected to change.
|
||||
|
||||
.. c:type:: v4l2_ctrl_h264_sps
|
||||
|
||||
.. cssclass:: longtable
|
||||
|
||||
.. flat-table:: struct v4l2_ctrl_h264_sps
|
||||
:header-rows: 0
|
||||
:stub-columns: 0
|
||||
:widths: 1 1 2
|
||||
|
||||
* - __u8
|
||||
- ``profile_idc``
|
||||
-
|
||||
* - __u8
|
||||
- ``constraint_set_flags``
|
||||
- See :ref:`Sequence Parameter Set Constraints Set Flags <h264_sps_constraints_set_flags>`
|
||||
* - __u8
|
||||
- ``level_idc``
|
||||
-
|
||||
* - __u8
|
||||
- ``seq_parameter_set_id``
|
||||
-
|
||||
* - __u8
|
||||
- ``chroma_format_idc``
|
||||
-
|
||||
* - __u8
|
||||
- ``bit_depth_luma_minus8``
|
||||
-
|
||||
* - __u8
|
||||
- ``bit_depth_chroma_minus8``
|
||||
-
|
||||
* - __u8
|
||||
- ``log2_max_frame_num_minus4``
|
||||
-
|
||||
* - __u8
|
||||
- ``pic_order_cnt_type``
|
||||
-
|
||||
* - __u8
|
||||
- ``log2_max_pic_order_cnt_lsb_minus4``
|
||||
-
|
||||
* - __u8
|
||||
- ``max_num_ref_frames``
|
||||
-
|
||||
* - __u8
|
||||
- ``num_ref_frames_in_pic_order_cnt_cycle``
|
||||
-
|
||||
* - __s32
|
||||
- ``offset_for_ref_frame[255]``
|
||||
-
|
||||
* - __s32
|
||||
- ``offset_for_non_ref_pic``
|
||||
-
|
||||
* - __s32
|
||||
- ``offset_for_top_to_bottom_field``
|
||||
-
|
||||
* - __u16
|
||||
- ``pic_width_in_mbs_minus1``
|
||||
-
|
||||
* - __u16
|
||||
- ``pic_height_in_map_units_minus1``
|
||||
-
|
||||
* - __u32
|
||||
- ``flags``
|
||||
- See :ref:`Sequence Parameter Set Flags <h264_sps_flags>`
|
||||
|
||||
.. _h264_sps_constraints_set_flags:
|
||||
|
||||
``Sequence Parameter Set Constraints Set Flags``
|
||||
|
||||
.. cssclass:: longtable
|
||||
|
||||
.. flat-table::
|
||||
:header-rows: 0
|
||||
:stub-columns: 0
|
||||
:widths: 1 1 2
|
||||
|
||||
* - ``V4L2_H264_SPS_CONSTRAINT_SET0_FLAG``
|
||||
- 0x00000001
|
||||
-
|
||||
* - ``V4L2_H264_SPS_CONSTRAINT_SET1_FLAG``
|
||||
- 0x00000002
|
||||
-
|
||||
* - ``V4L2_H264_SPS_CONSTRAINT_SET2_FLAG``
|
||||
- 0x00000004
|
||||
-
|
||||
* - ``V4L2_H264_SPS_CONSTRAINT_SET3_FLAG``
|
||||
- 0x00000008
|
||||
-
|
||||
* - ``V4L2_H264_SPS_CONSTRAINT_SET4_FLAG``
|
||||
- 0x00000010
|
||||
-
|
||||
* - ``V4L2_H264_SPS_CONSTRAINT_SET5_FLAG``
|
||||
- 0x00000020
|
||||
-
|
||||
|
||||
.. _h264_sps_flags:
|
||||
|
||||
``Sequence Parameter Set Flags``
|
||||
|
||||
.. cssclass:: longtable
|
||||
|
||||
.. flat-table::
|
||||
:header-rows: 0
|
||||
:stub-columns: 0
|
||||
:widths: 1 1 2
|
||||
|
||||
* - ``V4L2_H264_SPS_FLAG_SEPARATE_COLOUR_PLANE``
|
||||
- 0x00000001
|
||||
-
|
||||
* - ``V4L2_H264_SPS_FLAG_QPPRIME_Y_ZERO_TRANSFORM_BYPASS``
|
||||
- 0x00000002
|
||||
-
|
||||
* - ``V4L2_H264_SPS_FLAG_DELTA_PIC_ORDER_ALWAYS_ZERO``
|
||||
- 0x00000004
|
||||
-
|
||||
* - ``V4L2_H264_SPS_FLAG_GAPS_IN_FRAME_NUM_VALUE_ALLOWED``
|
||||
- 0x00000008
|
||||
-
|
||||
* - ``V4L2_H264_SPS_FLAG_FRAME_MBS_ONLY``
|
||||
- 0x00000010
|
||||
-
|
||||
* - ``V4L2_H264_SPS_FLAG_MB_ADAPTIVE_FRAME_FIELD``
|
||||
- 0x00000020
|
||||
-
|
||||
* - ``V4L2_H264_SPS_FLAG_DIRECT_8X8_INFERENCE``
|
||||
- 0x00000040
|
||||
-
|
||||
|
||||
``V4L2_CID_MPEG_VIDEO_H264_PPS (struct)``
|
||||
Specifies the picture parameter set (as extracted from the
|
||||
bitstream) for the associated H264 slice data. This includes the
|
||||
necessary parameters for configuring a stateless hardware decoding
|
||||
pipeline for H264. The bitstream parameters are defined according
|
||||
to :ref:`h264`, section 7.4.2.2 "Picture Parameter Set RBSP
|
||||
Semantics". For further documentation, refer to the above
|
||||
specification, unless there is an explicit comment stating
|
||||
otherwise.
|
||||
|
||||
.. note::
|
||||
|
||||
This compound control is not yet part of the public kernel API and
|
||||
it is expected to change.
|
||||
|
||||
.. c:type:: v4l2_ctrl_h264_pps
|
||||
|
||||
.. cssclass:: longtable
|
||||
|
||||
.. flat-table:: struct v4l2_ctrl_h264_pps
|
||||
:header-rows: 0
|
||||
:stub-columns: 0
|
||||
:widths: 1 1 2
|
||||
|
||||
* - __u8
|
||||
- ``pic_parameter_set_id``
|
||||
-
|
||||
* - __u8
|
||||
- ``seq_parameter_set_id``
|
||||
-
|
||||
* - __u8
|
||||
- ``num_slice_groups_minus1``
|
||||
-
|
||||
* - __u8
|
||||
- ``num_ref_idx_l0_default_active_minus1``
|
||||
-
|
||||
* - __u8
|
||||
- ``num_ref_idx_l1_default_active_minus1``
|
||||
-
|
||||
* - __u8
|
||||
- ``weighted_bipred_idc``
|
||||
-
|
||||
* - __s8
|
||||
- ``pic_init_qp_minus26``
|
||||
-
|
||||
* - __s8
|
||||
- ``pic_init_qs_minus26``
|
||||
-
|
||||
* - __s8
|
||||
- ``chroma_qp_index_offset``
|
||||
-
|
||||
* - __s8
|
||||
- ``second_chroma_qp_index_offset``
|
||||
-
|
||||
* - __u16
|
||||
- ``flags``
|
||||
- See :ref:`Picture Parameter Set Flags <h264_pps_flags>`
|
||||
|
||||
.. _h264_pps_flags:
|
||||
|
||||
``Picture Parameter Set Flags``
|
||||
|
||||
.. cssclass:: longtable
|
||||
|
||||
.. flat-table::
|
||||
:header-rows: 0
|
||||
:stub-columns: 0
|
||||
:widths: 1 1 2
|
||||
|
||||
* - ``V4L2_H264_PPS_FLAG_ENTROPY_CODING_MODE``
|
||||
- 0x00000001
|
||||
-
|
||||
* - ``V4L2_H264_PPS_FLAG_BOTTOM_FIELD_PIC_ORDER_IN_FRAME_PRESENT``
|
||||
- 0x00000002
|
||||
-
|
||||
* - ``V4L2_H264_PPS_FLAG_WEIGHTED_PRED``
|
||||
- 0x00000004
|
||||
-
|
||||
* - ``V4L2_H264_PPS_FLAG_DEBLOCKING_FILTER_CONTROL_PRESENT``
|
||||
- 0x00000008
|
||||
-
|
||||
* - ``V4L2_H264_PPS_FLAG_CONSTRAINED_INTRA_PRED``
|
||||
- 0x00000010
|
||||
-
|
||||
* - ``V4L2_H264_PPS_FLAG_REDUNDANT_PIC_CNT_PRESENT``
|
||||
- 0x00000020
|
||||
-
|
||||
* - ``V4L2_H264_PPS_FLAG_TRANSFORM_8X8_MODE``
|
||||
- 0x00000040
|
||||
-
|
||||
* - ``V4L2_H264_PPS_FLAG_PIC_SCALING_MATRIX_PRESENT``
|
||||
- 0x00000080
|
||||
-
|
||||
|
||||
``V4L2_CID_MPEG_VIDEO_H264_SCALING_MATRIX (struct)``
|
||||
Specifies the scaling matrix (as extracted from the bitstream) for
|
||||
the associated H264 slice data. The bitstream parameters are
|
||||
defined according to :ref:`h264`, section 7.4.2.1.1.1 "Scaling
|
||||
List Semantics". For further documentation, refer to the above
|
||||
specification, unless there is an explicit comment stating
|
||||
otherwise.
|
||||
|
||||
.. note::
|
||||
|
||||
This compound control is not yet part of the public kernel API and
|
||||
it is expected to change.
|
||||
|
||||
.. c:type:: v4l2_ctrl_h264_scaling_matrix
|
||||
|
||||
.. cssclass:: longtable
|
||||
|
||||
.. flat-table:: struct v4l2_ctrl_h264_scaling_matrix
|
||||
:header-rows: 0
|
||||
:stub-columns: 0
|
||||
:widths: 1 1 2
|
||||
|
||||
* - __u8
|
||||
- ``scaling_list_4x4[6][16]``
|
||||
-
|
||||
* - __u8
|
||||
- ``scaling_list_8x8[6][64]``
|
||||
-
|
||||
|
||||
``V4L2_CID_MPEG_VIDEO_H264_SLICE_PARAMS (struct)``
|
||||
Specifies the slice parameters (as extracted from the bitstream)
|
||||
for the associated H264 slice data. This includes the necessary
|
||||
parameters for configuring a stateless hardware decoding pipeline
|
||||
for H264. The bitstream parameters are defined according to
|
||||
:ref:`h264`, section 7.4.3 "Slice Header Semantics". For further
|
||||
documentation, refer to the above specification, unless there is
|
||||
an explicit comment stating otherwise.
|
||||
|
||||
.. note::
|
||||
|
||||
This compound control is not yet part of the public kernel API
|
||||
and it is expected to change.
|
||||
|
||||
This structure is expected to be passed as an array, with one
|
||||
entry for each slice included in the bitstream buffer.
|
||||
|
||||
.. c:type:: v4l2_ctrl_h264_slice_params
|
||||
|
||||
.. cssclass:: longtable
|
||||
|
||||
.. flat-table:: struct v4l2_ctrl_h264_slice_params
|
||||
:header-rows: 0
|
||||
:stub-columns: 0
|
||||
:widths: 1 1 2
|
||||
|
||||
* - __u32
|
||||
- ``size``
|
||||
-
|
||||
* - __u32
|
||||
- ``header_bit_size``
|
||||
-
|
||||
* - __u16
|
||||
- ``first_mb_in_slice``
|
||||
-
|
||||
* - __u8
|
||||
- ``slice_type``
|
||||
-
|
||||
* - __u8
|
||||
- ``pic_parameter_set_id``
|
||||
-
|
||||
* - __u8
|
||||
- ``colour_plane_id``
|
||||
-
|
||||
* - __u8
|
||||
- ``redundant_pic_cnt``
|
||||
-
|
||||
* - __u16
|
||||
- ``frame_num``
|
||||
-
|
||||
* - __u16
|
||||
- ``idr_pic_id``
|
||||
-
|
||||
* - __u16
|
||||
- ``pic_order_cnt_lsb``
|
||||
-
|
||||
* - __s32
|
||||
- ``delta_pic_order_cnt_bottom``
|
||||
-
|
||||
* - __s32
|
||||
- ``delta_pic_order_cnt0``
|
||||
-
|
||||
* - __s32
|
||||
- ``delta_pic_order_cnt1``
|
||||
-
|
||||
* - struct :c:type:`v4l2_h264_pred_weight_table`
|
||||
- ``pred_weight_table``
|
||||
-
|
||||
* - __u32
|
||||
- ``dec_ref_pic_marking_bit_size``
|
||||
-
|
||||
* - __u32
|
||||
- ``pic_order_cnt_bit_size``
|
||||
-
|
||||
* - __u8
|
||||
- ``cabac_init_idc``
|
||||
-
|
||||
* - __s8
|
||||
- ``slice_qp_delta``
|
||||
-
|
||||
* - __s8
|
||||
- ``slice_qs_delta``
|
||||
-
|
||||
* - __u8
|
||||
- ``disable_deblocking_filter_idc``
|
||||
-
|
||||
* - __s8
|
||||
- ``slice_alpha_c0_offset_div2``
|
||||
-
|
||||
* - __s8
|
||||
- ``slice_beta_offset_div2``
|
||||
-
|
||||
* - __u8
|
||||
- ``num_ref_idx_l0_active_minus1``
|
||||
-
|
||||
* - __u8
|
||||
- ``num_ref_idx_l1_active_minus1``
|
||||
-
|
||||
* - __u32
|
||||
- ``slice_group_change_cycle``
|
||||
-
|
||||
* - __u8
|
||||
- ``ref_pic_list0[32]``
|
||||
- Reference picture list after applying the per-slice modifications
|
||||
* - __u8
|
||||
- ``ref_pic_list1[32]``
|
||||
- Reference picture list after applying the per-slice modifications
|
||||
* - __u32
|
||||
- ``flags``
|
||||
- See :ref:`Slice Parameter Flags <h264_slice_flags>`
|
||||
|
||||
.. _h264_slice_flags:
|
||||
|
||||
``Slice Parameter Set Flags``
|
||||
|
||||
.. cssclass:: longtable
|
||||
|
||||
.. flat-table::
|
||||
:header-rows: 0
|
||||
:stub-columns: 0
|
||||
:widths: 1 1 2
|
||||
|
||||
* - ``V4L2_H264_SLICE_FLAG_FIELD_PIC``
|
||||
- 0x00000001
|
||||
-
|
||||
* - ``V4L2_H264_SLICE_FLAG_BOTTOM_FIELD``
|
||||
- 0x00000002
|
||||
-
|
||||
* - ``V4L2_H264_SLICE_FLAG_DIRECT_SPATIAL_MV_PRED``
|
||||
- 0x00000004
|
||||
-
|
||||
* - ``V4L2_H264_SLICE_FLAG_SP_FOR_SWITCH``
|
||||
- 0x00000008
|
||||
-
|
||||
|
||||
``Prediction Weight Table``
|
||||
|
||||
The bitstream parameters are defined according to :ref:`h264`,
|
||||
section 7.4.3.2 "Prediction Weight Table Semantics". For further
|
||||
documentation, refer to the above specification, unless there is
|
||||
an explicit comment stating otherwise.
|
||||
|
||||
.. c:type:: v4l2_h264_pred_weight_table
|
||||
|
||||
.. cssclass:: longtable
|
||||
|
||||
.. flat-table:: struct v4l2_h264_pred_weight_table
|
||||
:header-rows: 0
|
||||
:stub-columns: 0
|
||||
:widths: 1 1 2
|
||||
|
||||
* - __u16
|
||||
- ``luma_log2_weight_denom``
|
||||
-
|
||||
* - __u16
|
||||
- ``chroma_log2_weight_denom``
|
||||
-
|
||||
* - struct :c:type:`v4l2_h264_weight_factors`
|
||||
- ``weight_factors[2]``
|
||||
- The weight factors at index 0 are the weight factors for the reference
|
||||
list 0, the one at index 1 for the reference list 1.
|
||||
|
||||
.. c:type:: v4l2_h264_weight_factors
|
||||
|
||||
.. cssclass:: longtable
|
||||
|
||||
.. flat-table:: struct v4l2_h264_weight_factors
|
||||
:header-rows: 0
|
||||
:stub-columns: 0
|
||||
:widths: 1 1 2
|
||||
|
||||
* - __s16
|
||||
- ``luma_weight[32]``
|
||||
-
|
||||
* - __s16
|
||||
- ``luma_offset[32]``
|
||||
-
|
||||
* - __s16
|
||||
- ``chroma_weight[32][2]``
|
||||
-
|
||||
* - __s16
|
||||
- ``chroma_offset[32][2]``
|
||||
-
|
||||
|
||||
``V4L2_CID_MPEG_VIDEO_H264_DECODE_PARAMS (struct)``
|
||||
Specifies the decode parameters (as extracted from the bitstream)
|
||||
for the associated H264 slice data. This includes the necessary
|
||||
parameters for configuring a stateless hardware decoding pipeline
|
||||
for H264. The bitstream parameters are defined according to
|
||||
:ref:`h264`. For further documentation, refer to the above
|
||||
specification, unless there is an explicit comment stating
|
||||
otherwise.
|
||||
|
||||
.. note::
|
||||
|
||||
This compound control is not yet part of the public kernel API and
|
||||
it is expected to change.
|
||||
|
||||
.. c:type:: v4l2_ctrl_h264_decode_params
|
||||
|
||||
.. cssclass:: longtable
|
||||
|
||||
.. flat-table:: struct v4l2_ctrl_h264_decode_params
|
||||
:header-rows: 0
|
||||
:stub-columns: 0
|
||||
:widths: 1 1 2
|
||||
|
||||
* - struct :c:type:`v4l2_h264_dpb_entry`
|
||||
- ``dpb[16]``
|
||||
-
|
||||
* - __u16
|
||||
- ``num_slices``
|
||||
- Number of slices needed to decode the current frame
|
||||
* - __u16
|
||||
- ``nal_ref_idc``
|
||||
- NAL reference ID value coming from the NAL Unit header
|
||||
* - __u8
|
||||
- ``ref_pic_list_p0[32]``
|
||||
- Backward reference list used by P-frames in the original bitstream order
|
||||
* - __u8
|
||||
- ``ref_pic_list_b0[32]``
|
||||
- Backward reference list used by B-frames in the original bitstream order
|
||||
* - __u8
|
||||
- ``ref_pic_list_b1[32]``
|
||||
- Forward reference list used by B-frames in the original bitstream order
|
||||
* - __s32
|
||||
- ``top_field_order_cnt``
|
||||
- Picture Order Count for the coded top field
|
||||
* - __s32
|
||||
- ``bottom_field_order_cnt``
|
||||
- Picture Order Count for the coded bottom field
|
||||
* - __u32
|
||||
- ``flags``
|
||||
- See :ref:`Decode Parameters Flags <h264_decode_params_flags>`
|
||||
|
||||
.. _h264_decode_params_flags:
|
||||
|
||||
``Decode Parameters Flags``
|
||||
|
||||
.. cssclass:: longtable
|
||||
|
||||
.. flat-table::
|
||||
:header-rows: 0
|
||||
:stub-columns: 0
|
||||
:widths: 1 1 2
|
||||
|
||||
* - ``V4L2_H264_DECODE_PARAM_FLAG_IDR_PIC``
|
||||
- 0x00000001
|
||||
- That picture is an IDR picture
|
||||
|
||||
.. c:type:: v4l2_h264_dpb_entry
|
||||
|
||||
.. cssclass:: longtable
|
||||
|
||||
.. flat-table:: struct v4l2_h264_dpb_entry
|
||||
:header-rows: 0
|
||||
:stub-columns: 0
|
||||
:widths: 1 1 2
|
||||
|
||||
* - __u64
|
||||
- ``reference_ts``
|
||||
- Timestamp of the V4L2 capture buffer to use as reference, used
|
||||
with B-coded and P-coded frames. The timestamp refers to the
|
||||
``timestamp`` field in struct :c:type:`v4l2_buffer`. Use the
|
||||
:c:func:`v4l2_timeval_to_ns()` function to convert the struct
|
||||
:c:type:`timeval` in struct :c:type:`v4l2_buffer` to a __u64.
|
||||
* - __u16
|
||||
- ``frame_num``
|
||||
-
|
||||
* - __u16
|
||||
- ``pic_num``
|
||||
-
|
||||
* - __s32
|
||||
- ``top_field_order_cnt``
|
||||
-
|
||||
* - __s32
|
||||
- ``bottom_field_order_cnt``
|
||||
-
|
||||
* - __u32
|
||||
- ``flags``
|
||||
- See :ref:`DPB Entry Flags <h264_dpb_flags>`
|
||||
|
||||
.. _h264_dpb_flags:
|
||||
|
||||
``DPB Entries Flags``
|
||||
|
||||
.. cssclass:: longtable
|
||||
|
||||
.. flat-table::
|
||||
:header-rows: 0
|
||||
:stub-columns: 0
|
||||
:widths: 1 1 2
|
||||
|
||||
* - ``V4L2_H264_DPB_ENTRY_FLAG_VALID``
|
||||
- 0x00000001
|
||||
- The DPB entry is valid and should be considered
|
||||
* - ``V4L2_H264_DPB_ENTRY_FLAG_ACTIVE``
|
||||
- 0x00000002
|
||||
- The DPB entry is currently being used as a reference frame
|
||||
* - ``V4L2_H264_DPB_ENTRY_FLAG_LONG_TERM``
|
||||
- 0x00000004
|
||||
- The DPB entry is a long term reference frame
|
||||
|
||||
.. _v4l2-mpeg-mpeg2:
|
||||
|
||||
|
@@ -85,20 +85,17 @@ 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
|
||||
:ref:`VIDIOC_QUERYCTRL` the
|
||||
:ref:`VIDIOC_QUERY_EXT_CTRL <VIDIOC_QUERYCTRL>` ioctl was added. In
|
||||
particular, this ioctl gives the dimensions of the N-dimensional array
|
||||
if this control consists of more than one element.
|
||||
themselves than is possible with :ref:`VIDIOC_QUERYCTRL <VIDIOC_QUERYCTRL>`
|
||||
the :ref:`VIDIOC_QUERY_EXT_CTRL <VIDIOC_QUERYCTRL>` ioctl was added. In
|
||||
particular, this ioctl gives the dimensions of the N-dimensional array if
|
||||
this control consists of more than one element.
|
||||
|
||||
.. note::
|
||||
|
||||
#. 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 :ref:`VIDIOC_QUERYCTRL` (or :ref:`VIDIOC_QUERY_EXT_CTRL
|
||||
<VIDIOC_QUERYCTRL>`) and :ref:`VIDIOC_QUERYMENU <VIDIOC_QUERYCTRL>`
|
||||
ioctls to check this.
|
||||
:ref:`VIDIOC_QUERYCTRL` to check this.
|
||||
|
||||
#. It is possible that some of the menu indices in a control of
|
||||
type ``V4L2_CTRL_TYPE_MENU`` may not be supported (``VIDIOC_QUERYMENU``
|
||||
@@ -144,7 +141,7 @@ control class is found:
|
||||
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;
|
||||
}
|
||||
|
||||
|
@@ -51,6 +51,11 @@ determined by the video standard. Hence the distinction between temporal
|
||||
and spatial order of fields. The diagrams below should make this
|
||||
clearer.
|
||||
|
||||
In V4L it is assumed that all video cameras transmit fields on the media
|
||||
bus in the same order they were captured, so if the top field was
|
||||
captured first (is the older field), the top field is also transmitted
|
||||
first on the bus.
|
||||
|
||||
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
|
||||
@@ -101,10 +106,10 @@ enum v4l2_field
|
||||
* - ``V4L2_FIELD_INTERLACED``
|
||||
- 4
|
||||
- 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.
|
||||
order of the fields (whether the top or bottom field is older)
|
||||
depends on the current video standard. In M/NTSC the bottom
|
||||
field is the older field. In all other standards the top field
|
||||
is the older field.
|
||||
* - ``V4L2_FIELD_SEQ_TB``
|
||||
- 5
|
||||
- Images contain both fields, the top field lines are stored first
|
||||
@@ -135,11 +140,11 @@ enum v4l2_field
|
||||
* - ``V4L2_FIELD_INTERLACED_TB``
|
||||
- 8
|
||||
- Images contain both fields, interleaved line by line, top field
|
||||
first. The top field is transmitted first.
|
||||
first. The top field is the older field.
|
||||
* - ``V4L2_FIELD_INTERLACED_BT``
|
||||
- 9
|
||||
- Images contain both fields, interleaved line by line, top field
|
||||
first. The bottom field is transmitted first.
|
||||
first. The bottom field is the older field.
|
||||
|
||||
|
||||
|
||||
|
@@ -52,6 +52,31 @@ Compressed Formats
|
||||
- ``V4L2_PIX_FMT_H264_MVC``
|
||||
- 'M264'
|
||||
- H264 MVC video elementary stream.
|
||||
* .. _V4L2-PIX-FMT-H264-SLICE-RAW:
|
||||
|
||||
- ``V4L2_PIX_FMT_H264_SLICE_RAW``
|
||||
- 'S264'
|
||||
- H264 parsed slice data, without the start code and as
|
||||
extracted from the H264 bitstream. This format is adapted for
|
||||
stateless video decoders that implement an H264 pipeline
|
||||
(using the :ref:`mem2mem` and :ref:`media-request-api`).
|
||||
Metadata associated with the frame to decode are required to
|
||||
be passed through the ``V4L2_CID_MPEG_VIDEO_H264_SPS``,
|
||||
``V4L2_CID_MPEG_VIDEO_H264_PPS``,
|
||||
``V4L2_CID_MPEG_VIDEO_H264_SCALING_MATRIX``,
|
||||
``V4L2_CID_MPEG_VIDEO_H264_SLICE_PARAMS`` and
|
||||
``V4L2_CID_MPEG_VIDEO_H264_DECODE_PARAMS`` controls. See the
|
||||
:ref:`associated Codec Control IDs <v4l2-mpeg-h264>`. Exactly
|
||||
one output and one capture buffer must be provided for use
|
||||
with this pixel format. The output buffer must contain the
|
||||
appropriate number of macroblocks to decode a full
|
||||
corresponding frame to the matching capture buffer.
|
||||
|
||||
.. note::
|
||||
|
||||
This format is not yet part of the public kernel API and it
|
||||
is expected to change.
|
||||
|
||||
* .. _V4L2-PIX-FMT-H263:
|
||||
|
||||
- ``V4L2_PIX_FMT_H263``
|
||||
|
@@ -31,7 +31,20 @@ describing all planes of that format.
|
||||
|
||||
* - __u32
|
||||
- ``sizeimage``
|
||||
- Maximum size in bytes required for image data in this plane.
|
||||
- Maximum size in bytes required for image data in this plane,
|
||||
set by the driver. When the image consists of variable length
|
||||
compressed data this is the number of bytes required by the
|
||||
codec to support the worst-case compression scenario.
|
||||
|
||||
The driver will set the value for uncompressed images.
|
||||
|
||||
Clients are allowed to set the sizeimage field for variable length
|
||||
compressed data flagged with ``V4L2_FMT_FLAG_COMPRESSED`` at
|
||||
:ref:`VIDIOC_ENUM_FMT`, but the driver may ignore it and set the
|
||||
value itself, or it may modify the provided value based on
|
||||
alignment requirements or minimum/maximum size requirements.
|
||||
If the client wants to leave this to the driver, then it should
|
||||
set sizeimage to 0.
|
||||
* - __u32
|
||||
- ``bytesperline``
|
||||
- Distance in bytes between the leftmost pixels in two adjacent
|
||||
|
@@ -89,7 +89,18 @@ Single-planar format structure
|
||||
- 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.
|
||||
number of bytes required by the codec to support the worst-case
|
||||
compression scenario.
|
||||
|
||||
The driver will set the value for uncompressed images.
|
||||
|
||||
Clients are allowed to set the sizeimage field for variable length
|
||||
compressed data flagged with ``V4L2_FMT_FLAG_COMPRESSED`` at
|
||||
:ref:`VIDIOC_ENUM_FMT`, but the driver may ignore it and set the
|
||||
value itself, or it may modify the provided value based on
|
||||
alignment requirements or minimum/maximum size requirements.
|
||||
If the client wants to leave this to the driver, then it should
|
||||
set sizeimage to 0.
|
||||
* - __u32
|
||||
- ``colorspace``
|
||||
- Image colorspace, from enum :c:type:`v4l2_colorspace`.
|
||||
|
@@ -139,6 +139,14 @@ 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.
|
||||
|
||||
If the application sets the ``memory`` field to ``V4L2_MEMORY_DMABUF`` to
|
||||
dequeue a :ref:`DMABUF <dmabuf>` buffer, the driver fills the ``m.fd`` field
|
||||
with a file descriptor numerically the same as the one given to ``VIDIOC_QBUF``
|
||||
when the buffer was enqueued. No new file descriptor is created at dequeue time
|
||||
and the value is only for the application convenience. When the multi-planar
|
||||
API is used the ``m.fd`` fields of the passed array of struct
|
||||
:c:type:`v4l2_plane` are filled instead.
|
||||
|
||||
By default ``VIDIOC_DQBUF`` blocks when no buffer is in the outgoing
|
||||
queue. When the ``O_NONBLOCK`` flag was given to the
|
||||
:ref:`open() <func-open>` function, ``VIDIOC_DQBUF`` returns
|
||||
|
@@ -443,6 +443,36 @@ See also the examples in :ref:`control`.
|
||||
- n/a
|
||||
- A struct :c:type:`v4l2_ctrl_mpeg2_quantization`, containing MPEG-2
|
||||
quantization matrices for stateless video decoders.
|
||||
* - ``V4L2_CTRL_TYPE_H264_SPS``
|
||||
- n/a
|
||||
- n/a
|
||||
- n/a
|
||||
- A struct :c:type:`v4l2_ctrl_h264_sps`, containing H264
|
||||
sequence parameters for stateless video decoders.
|
||||
* - ``V4L2_CTRL_TYPE_H264_PPS``
|
||||
- n/a
|
||||
- n/a
|
||||
- n/a
|
||||
- A struct :c:type:`v4l2_ctrl_h264_pps`, containing H264
|
||||
picture parameters for stateless video decoders.
|
||||
* - ``V4L2_CTRL_TYPE_H264_SCALING_MATRIX``
|
||||
- n/a
|
||||
- n/a
|
||||
- n/a
|
||||
- A struct :c:type:`v4l2_ctrl_h264_scaling_matrix`, containing H264
|
||||
scaling matrices for stateless video decoders.
|
||||
* - ``V4L2_CTRL_TYPE_H264_SLICE_PARAMS``
|
||||
- n/a
|
||||
- n/a
|
||||
- n/a
|
||||
- A struct :c:type:`v4l2_ctrl_h264_slice_params`, containing H264
|
||||
slice parameters for stateless video decoders.
|
||||
* - ``V4L2_CTRL_TYPE_H264_DECODE_PARAMS``
|
||||
- n/a
|
||||
- n/a
|
||||
- n/a
|
||||
- A struct :c:type:`v4l2_ctrl_h264_decode_params`, containing H264
|
||||
decode parameters for stateless video decoders.
|
||||
|
||||
.. tabularcolumns:: |p{6.6cm}|p{2.2cm}|p{8.7cm}|
|
||||
|
||||
|
@@ -64,5 +64,6 @@ For more details see the file COPYING in the source distribution of Linux.
|
||||
si476x
|
||||
soc-camera
|
||||
uvcvideo
|
||||
vimc
|
||||
vivid
|
||||
zr364xx
|
||||
|
22
Documentation/media/v4l-drivers/vimc.dot
Normal file
22
Documentation/media/v4l-drivers/vimc.dot
Normal file
@@ -0,0 +1,22 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
digraph board {
|
||||
rankdir=TB
|
||||
n00000001 [label="{{} | Sensor A\n/dev/v4l-subdev0 | {<port0> 0}}", shape=Mrecord, style=filled, fillcolor=green]
|
||||
n00000001:port0 -> n00000005:port0 [style=bold]
|
||||
n00000001:port0 -> n0000000b [style=bold]
|
||||
n00000003 [label="{{} | Sensor B\n/dev/v4l-subdev1 | {<port0> 0}}", shape=Mrecord, style=filled, fillcolor=green]
|
||||
n00000003:port0 -> n00000008:port0 [style=bold]
|
||||
n00000003:port0 -> n0000000f [style=bold]
|
||||
n00000005 [label="{{<port0> 0} | Debayer A\n/dev/v4l-subdev2 | {<port1> 1}}", shape=Mrecord, style=filled, fillcolor=green]
|
||||
n00000005:port1 -> n00000017:port0
|
||||
n00000008 [label="{{<port0> 0} | Debayer B\n/dev/v4l-subdev3 | {<port1> 1}}", shape=Mrecord, style=filled, fillcolor=green]
|
||||
n00000008:port1 -> n00000017:port0 [style=dashed]
|
||||
n0000000b [label="Raw Capture 0\n/dev/video0", shape=box, style=filled, fillcolor=yellow]
|
||||
n0000000f [label="Raw Capture 1\n/dev/video1", shape=box, style=filled, fillcolor=yellow]
|
||||
n00000013 [label="RGB/YUV Input\n/dev/video2", shape=box, style=filled, fillcolor=yellow]
|
||||
n00000013 -> n00000017:port0 [style=dashed]
|
||||
n00000017 [label="{{<port0> 0} | Scaler\n/dev/v4l-subdev4 | {<port1> 1}}", shape=Mrecord, style=filled, fillcolor=green]
|
||||
n00000017:port1 -> n0000001a [style=bold]
|
||||
n0000001a [label="RGB/YUV Capture\n/dev/video3", shape=box, style=filled, fillcolor=yellow]
|
||||
}
|
98
Documentation/media/v4l-drivers/vimc.rst
Normal file
98
Documentation/media/v4l-drivers/vimc.rst
Normal file
@@ -0,0 +1,98 @@
|
||||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
The Virtual Media Controller Driver (vimc)
|
||||
==========================================
|
||||
|
||||
The vimc driver emulates complex video hardware using the V4L2 API and the Media
|
||||
API. It has a capture device and three subdevices: sensor, debayer and scaler.
|
||||
|
||||
Topology
|
||||
--------
|
||||
|
||||
The topology is hardcoded, although you could modify it in vimc-core and
|
||||
recompile the driver to achieve your own topology. This is the default topology:
|
||||
|
||||
.. _vimc_topology_graph:
|
||||
|
||||
.. kernel-figure:: vimc.dot
|
||||
:alt: vimc.dot
|
||||
:align: center
|
||||
|
||||
Media pipeline graph on vimc
|
||||
|
||||
Configuring the topology
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Each subdevice will come with its default configuration (pixelformat, height,
|
||||
width, ...). One needs to configure the topology in order to match the
|
||||
configuration on each linked subdevice to stream frames through the pipeline.
|
||||
If the configuration doesn't match, the stream will fail. The ``v4l-utils``
|
||||
package is a bundle of user-space applications, that comes with ``media-ctl`` and
|
||||
``v4l2-ctl`` that can be used to configure the vimc configuration. This sequence
|
||||
of commands fits for the default topology:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
media-ctl -d platform:vimc -V '"Sensor A":0[fmt:SBGGR8_1X8/640x480]'
|
||||
media-ctl -d platform:vimc -V '"Debayer A":0[fmt:SBGGR8_1X8/640x480]'
|
||||
media-ctl -d platform:vimc -V '"Sensor B":0[fmt:SBGGR8_1X8/640x480]'
|
||||
media-ctl -d platform:vimc -V '"Debayer B":0[fmt:SBGGR8_1X8/640x480]'
|
||||
v4l2-ctl -z platform:vimc -d "RGB/YUV Capture" -v width=1920,height=1440
|
||||
v4l2-ctl -z platform:vimc -d "Raw Capture 0" -v pixelformat=BA81
|
||||
v4l2-ctl -z platform:vimc -d "Raw Capture 1" -v pixelformat=BA81
|
||||
|
||||
Subdevices
|
||||
----------
|
||||
|
||||
Subdevices define the behavior of an entity in the topology. Depending on the
|
||||
subdevice, the entity can have multiple pads of type source or sink.
|
||||
|
||||
vimc-sensor:
|
||||
Generates images in several formats using video test pattern generator.
|
||||
Exposes:
|
||||
|
||||
* 1 Pad source
|
||||
|
||||
vimc-debayer:
|
||||
Transforms images in bayer format into a non-bayer format.
|
||||
Exposes:
|
||||
|
||||
* 1 Pad sink
|
||||
* 1 Pad source
|
||||
|
||||
vimc-scaler:
|
||||
Scale up the image by a factor of 3. E.g.: a 640x480 image becomes a
|
||||
1920x1440 image. (this value can be configured, see at
|
||||
`Module options`_).
|
||||
Exposes:
|
||||
|
||||
* 1 Pad sink
|
||||
* 1 Pad source
|
||||
|
||||
vimc-capture:
|
||||
Exposes node /dev/videoX to allow userspace to capture the stream.
|
||||
Exposes:
|
||||
|
||||
* 1 Pad sink
|
||||
* 1 Pad source
|
||||
|
||||
Module options
|
||||
---------------
|
||||
|
||||
Vimc has a few module parameters to configure the driver. You should pass
|
||||
those arguments to each subdevice, not to the vimc module. For example::
|
||||
|
||||
vimc_subdevice.param=value
|
||||
|
||||
* ``vimc_scaler.sca_mult=<unsigned int>``
|
||||
|
||||
Image size multiplier factor to be used to multiply both width and
|
||||
height, so the image size will be ``sca_mult^2`` bigger than the
|
||||
original one. Currently, only supports scaling up (the default value
|
||||
is 3).
|
||||
|
||||
* ``vimc_debayer.deb_mean_win_size=<unsigned int>``
|
||||
|
||||
Window size to calculate the mean. Note: the window size needs to be an
|
||||
odd number, as the main pixel stays in the center of the window,
|
||||
otherwise the next odd number is considered (the default value is 3).
|
@@ -941,6 +941,11 @@ Digital Video Controls
|
||||
affects the reported colorspace since DVI_D outputs will always use
|
||||
sRGB.
|
||||
|
||||
- Display Present:
|
||||
|
||||
sets the presence of a "display" on the HDMI output. This affects
|
||||
the tx_edid_present, tx_hotplug and tx_rxsense controls.
|
||||
|
||||
|
||||
FM Radio Receiver Controls
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
@@ -136,6 +136,11 @@ replace symbol V4L2_CTRL_TYPE_U32 :c:type:`v4l2_ctrl_type`
|
||||
replace symbol V4L2_CTRL_TYPE_U8 :c:type:`v4l2_ctrl_type`
|
||||
replace symbol V4L2_CTRL_TYPE_MPEG2_SLICE_PARAMS :c:type:`v4l2_ctrl_type`
|
||||
replace symbol V4L2_CTRL_TYPE_MPEG2_QUANTIZATION :c:type:`v4l2_ctrl_type`
|
||||
replace symbol V4L2_CTRL_TYPE_H264_SPS :c:type:`v4l2_ctrl_type`
|
||||
replace symbol V4L2_CTRL_TYPE_H264_PPS :c:type:`v4l2_ctrl_type`
|
||||
replace symbol V4L2_CTRL_TYPE_H264_SCALING_MATRIX :c:type:`v4l2_ctrl_type`
|
||||
replace symbol V4L2_CTRL_TYPE_H264_SLICE_PARAMS :c:type:`v4l2_ctrl_type`
|
||||
replace symbol V4L2_CTRL_TYPE_H264_DECODE_PARAMS :c:type:`v4l2_ctrl_type`
|
||||
|
||||
# V4L2 capability defines
|
||||
replace define V4L2_CAP_VIDEO_CAPTURE device-capabilities
|
||||
|
Reference in New Issue
Block a user