xref: /linux/Documentation/userspace-api/media/v4l/selection-api-examples.rst (revision 24168c5e6dfbdd5b414f048f47f75d64533296ca)
1.. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later
2
3********
4Examples
5********
6
7(A video capture device is assumed; change
8``V4L2_BUF_TYPE_VIDEO_CAPTURE`` for other devices; change target to
9``V4L2_SEL_TGT_COMPOSE_*`` family to configure composing area)
10
11Example: Resetting the cropping parameters
12==========================================
13
14.. code-block:: c
15
16	struct v4l2_selection sel = {
17	    .type = V4L2_BUF_TYPE_VIDEO_CAPTURE,
18	    .target = V4L2_SEL_TGT_CROP_DEFAULT,
19	};
20	ret = ioctl(fd, VIDIOC_G_SELECTION, &sel);
21	if (ret)
22	    exit(-1);
23	sel.target = V4L2_SEL_TGT_CROP;
24	ret = ioctl(fd, VIDIOC_S_SELECTION, &sel);
25	if (ret)
26	    exit(-1);
27
28Setting a composing area on output of size of *at most* half of limit
29placed at a center of a display.
30
31Example: Simple downscaling
32===========================
33
34.. code-block:: c
35
36	struct v4l2_selection sel = {
37	    .type = V4L2_BUF_TYPE_VIDEO_OUTPUT,
38	    .target = V4L2_SEL_TGT_COMPOSE_BOUNDS,
39	};
40	struct v4l2_rect r;
41
42	ret = ioctl(fd, VIDIOC_G_SELECTION, &sel);
43	if (ret)
44	    exit(-1);
45	/* setting smaller compose rectangle */
46	r.width = sel.r.width / 2;
47	r.height = sel.r.height / 2;
48	r.left = sel.r.width / 4;
49	r.top = sel.r.height / 4;
50	sel.r = r;
51	sel.target = V4L2_SEL_TGT_COMPOSE;
52	sel.flags = V4L2_SEL_FLAG_LE;
53	ret = ioctl(fd, VIDIOC_S_SELECTION, &sel);
54	if (ret)
55	    exit(-1);
56
57A video output device is assumed; change ``V4L2_BUF_TYPE_VIDEO_OUTPUT``
58for other devices
59
60Example: Querying for scaling factors
61=====================================
62
63.. code-block:: c
64
65	struct v4l2_selection compose = {
66	    .type = V4L2_BUF_TYPE_VIDEO_OUTPUT,
67	    .target = V4L2_SEL_TGT_COMPOSE,
68	};
69	struct v4l2_selection crop = {
70	    .type = V4L2_BUF_TYPE_VIDEO_OUTPUT,
71	    .target = V4L2_SEL_TGT_CROP,
72	};
73	double hscale, vscale;
74
75	ret = ioctl(fd, VIDIOC_G_SELECTION, &compose);
76	if (ret)
77	    exit(-1);
78	ret = ioctl(fd, VIDIOC_G_SELECTION, &crop);
79	if (ret)
80	    exit(-1);
81
82	/* computing scaling factors */
83	hscale = (double)compose.r.width / crop.r.width;
84	vscale = (double)compose.r.height / crop.r.height;
85