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