요약·해설과 원문, 전문 번역을 서로 분리했습니다. API 이름, symbol, source path는 원문 표기를 사용합니다.
1. 요약·해설
원문의 핵심 논리와 kernel programming 관점의 보충 설명입니다. 아래의 전문 번역과는 별도로 작성했습니다.
2. 영어 원문 전체
번역 기준이 된 Linux v6.18.37 원문입니다. 줄 번호는 이 버전의 파일 좌표입니다.
원문 전체 펼치기
.. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later
********
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
==========================================
.. code-block:: c
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
===========================
.. code-block:: c
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
=====================================
.. code-block:: c
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;
3. 한국어 전문 번역
영어 원문의 문단 순서와 의미를 유지한 전체 번역입니다. 코드, 함수명, symbol과 URL은 원문 표기를 유지합니다.
자르기 영역을 기본값으로 재설정
1-27예제는 비디오 캡처 장치를 가정합니다. 다른 장치 유형에서는 `type`을 해당 버퍼 유형으로 바꾸고, 합성 작업이라면 CROP 계열 대신 COMPOSE 계열 대상을 사용합니다.
기본 자르기를 읽은 뒤 그 사각형을 활성 자르기로 설정합니다. 두 ioctl 모두 구조체에 실제 적용값을 돌려주므로 오류를 확인하고 반환된 값을 유지해야 합니다.
struct v4l2_selection sel = { 0 };
sel.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
sel.target = V4L2_SEL_TGT_CROP_DEFAULT;
ioctl(fd, VIDIOC_G_SELECTION, &sel);
sel.target = V4L2_SEL_TGT_CROP;
ioctl(fd, VIDIOC_S_SELECTION, &sel);
.. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later
********
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
==========================================
.. code-block:: c
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);
출력 영상을 절반 크기로 중앙 배치
28-59출력의 COMPOSE_BOUNDS를 조회한 뒤 너비와 높이를 절반으로 줄이고, 왼쪽과 위쪽 오프셋을 원래 크기의 4분의 1로 지정하면 화면 중앙에 절반 크기 영상이 배치됩니다.
`V4L2_SEL_FLAG_LE`는 드라이버가 요청값보다 크지 않은 사각형을 선택하도록 요구합니다. 하드웨어 정렬 제약 때문에 정확한 절반 크기를 만들 수 없을 때도 반환값이 요청 상한을 넘지 않게 합니다.
sel.type = V4L2_BUF_TYPE_VIDEO_OUTPUT;
sel.target = V4L2_SEL_TGT_COMPOSE_BOUNDS;
ioctl(fd, VIDIOC_G_SELECTION, &sel);
sel.r.width /= 2;
sel.r.height /= 2;
sel.r.left = sel.r.width / 2;
sel.r.top = sel.r.height / 2;
sel.target = V4L2_SEL_TGT_COMPOSE;
sel.flags = V4L2_SEL_FLAG_LE;
ioctl(fd, VIDIOC_S_SELECTION, &sel);
Setting a composing area on output of size of *at most* half of limit
placed at a center of a display.
Example: Simple downscaling
===========================
.. code-block:: c
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
현재 배율 조회
60-84출력 장치에서 활성 COMPOSE와 CROP 사각형을 각각 조회하면 현재 가로 및 세로 배율을 계산할 수 있습니다. 이 방식은 드라이버가 조정한 최종 사각형을 사용하므로 실제 하드웨어 상태를 반영합니다.
hscale = (double)compose.r.width / crop.r.width;
vscale = (double)compose.r.height / crop.r.height;
Example: Querying for scaling factors
=====================================
.. code-block:: c
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;
요약·해설
selection-api-examples.rst:1-84기본 자르기 복원, 중앙 축소 출력, 현재 배율 조회 예제를 제공합니다.