요약·해설과 원문, 전문 번역을 서로 분리했습니다. API 이름, symbol, source path는 원문 표기를 사용합니다.
1. 요약·해설
원문의 핵심 논리와 kernel programming 관점의 보충 설명입니다. 아래의 전문 번역과는 별도로 작성했습니다.
2. 영어 원문 전체
번역 기준이 된 Linux v6.18.37 원문입니다. 줄 번호는 이 버전의 파일 좌표입니다.
원문 전체 펼치기
.. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later
.. c:namespace:: V4L
.. _VIDIOC_SUBDEV_ENUM_FRAME_SIZE:
***********************************
ioctl VIDIOC_SUBDEV_ENUM_FRAME_SIZE
***********************************
Name
====
VIDIOC_SUBDEV_ENUM_FRAME_SIZE - Enumerate media bus frame sizes
Synopsis
========
.. c:macro:: VIDIOC_SUBDEV_ENUM_FRAME_SIZE
``int ioctl(int fd, VIDIOC_SUBDEV_ENUM_FRAME_SIZE, struct v4l2_subdev_frame_size_enum * argp)``
Arguments
=========
``fd``
File descriptor returned by :c:func:`open()`.
``argp``
Pointer to struct :c:type:`v4l2_subdev_frame_size_enum`.
Description
===========
This ioctl allows applications to access the enumeration of frame sizes
supported by a sub-device on the specified pad
for the specified media bus format.
Supported formats can be retrieved with the
:ref:`VIDIOC_SUBDEV_ENUM_MBUS_CODE`
ioctl.
The enumerations are defined by the driver, and indexed using the ``index`` field
of the struct :c:type:`v4l2_subdev_frame_size_enum`.
Each pair of ``pad`` and ``code`` correspond to a separate enumeration.
Each enumeration starts with the ``index`` of 0, and
the lowest invalid index marks the end of the enumeration.
Therefore, to enumerate frame sizes allowed on the specified pad
and using the specified mbus format, initialize the
``pad``, ``which``, and ``code`` fields to desired values,
and set ``index`` to 0.
Then call the :ref:`VIDIOC_SUBDEV_ENUM_FRAME_SIZE` ioctl with a pointer to the
structure.
A successful call will return with minimum and maximum frame sizes filled in.
Repeat with increasing ``index`` until ``EINVAL`` is received.
``EINVAL`` means that either no more entries are available in the enumeration,
or that an input parameter was 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.
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
:ref:`VIDIOC_SUBDEV_S_FMT <VIDIOC_SUBDEV_G_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
:ref:`VIDIOC_SUBDEV_G_FMT` for more
information about try formats.
.. c:type:: v4l2_subdev_frame_size_enum
.. tabularcolumns:: |p{4.4cm}|p{4.4cm}|p{8.5cm}|
.. flat-table:: struct v4l2_subdev_frame_size_enum
:header-rows: 0
:stub-columns: 0
:widths: 1 1 2
* - __u32
- ``index``
- Index of the frame size in the enumeration belonging to the given pad
and format. Filled in by the application.
* - __u32
- ``pad``
- Pad number as reported by the media controller API.
Filled in by the application.
* - __u32
- ``code``
- The media bus format code, as defined in
:ref:`v4l2-mbus-format`. Filled in by the application.
* - __u32
- ``min_width``
- Minimum frame width, in pixels. Filled in by the driver.
* - __u32
- ``max_width``
- Maximum frame width, in pixels. Filled in by the driver.
* - __u32
- ``min_height``
- Minimum frame height, in pixels. Filled in by the driver.
* - __u32
- ``max_height``
- Maximum frame height, in pixels. Filled in by the driver.
* - __u32
- ``which``
- Frame sizes to be enumerated, from enum
:ref:`v4l2_subdev_format_whence <v4l2-subdev-format-whence>`.
* - __u32
- ``stream``
- Stream identifier.
* - __u32
- ``reserved``\ [7]
- 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
:ref:`Generic Error Codes <gen-errors>` chapter.
EINVAL
The struct :c:type:`v4l2_subdev_frame_size_enum` ``pad`` references a
non-existing pad, the ``which`` field has an unsupported value, the ``code``
is invalid for the given pad, or the ``index`` field is out of bounds.
3. 한국어 전문 번역
영어 원문의 문단 순서와 의미를 유지한 전체 번역입니다. 코드, 함수명, symbol과 URL은 원문 표기를 유지합니다.
목적, 호출 형식과 인자
1-30`VIDIOC_SUBDEV_ENUM_FRAME_SIZE`는 지정한 서브디바이스 pad와 media-bus 형식에서 지원하는 프레임 크기 목록을 조회합니다. `argp`는 선택 조건과 결과를 담는 `struct v4l2_subdev_frame_size_enum`을 가리킵니다.
.. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later
.. c:namespace:: V4L
.. _VIDIOC_SUBDEV_ENUM_FRAME_SIZE:
***********************************
ioctl VIDIOC_SUBDEV_ENUM_FRAME_SIZE
***********************************
Name
====
VIDIOC_SUBDEV_ENUM_FRAME_SIZE - Enumerate media bus frame sizes
Synopsis
========
.. c:macro:: VIDIOC_SUBDEV_ENUM_FRAME_SIZE
``int ioctl(int fd, VIDIOC_SUBDEV_ENUM_FRAME_SIZE, struct v4l2_subdev_frame_size_enum * argp)``
Arguments
=========
``fd``
File descriptor returned by :c:func:`open()`.
``argp``
Pointer to struct :c:type:`v4l2_subdev_frame_size_enum`.
열거 절차와 범위의 의미
31-74먼저 `VIDIOC_SUBDEV_ENUM_MBUS_CODE`로 pad가 지원하는 media-bus 형식 코드를 얻습니다. 드라이버는 `pad`와 `code` 조합마다 별도의 크기 열거 목록을 정의합니다.
응용 프로그램은 `pad`, `which`, `code`를 원하는 값으로 설정하고 `index = 0`에서 시작합니다. 호출이 성공하면 드라이버가 최소·최대 너비와 높이를 채우며, 인덱스를 1씩 증가시켜 `EINVAL`이 반환될 때까지 반복합니다.
`EINVAL`은 항목을 모두 열거했다는 뜻일 수도 있고 입력 매개변수가 잘못되었다는 뜻일 수도 있습니다. 첫 호출부터 실패하면 pad, which, code의 유효성을 먼저 확인해야 합니다.
대부분의 센서처럼 이산 크기만 지원하는 장치는 최소값과 최대값이 같은 항목을 하나 이상 반환합니다.
최소값과 최대값이 다르더라도 그 사이의 모든 크기가 지원된다는 뜻은 아닙니다. 고정소수점 배율을 사용하는 스케일러처럼 일부 중간 크기를 만들 수 없는 장치가 있으므로, 정확한 크기는 `VIDIOC_SUBDEV_S_FMT`로 실제 적용을 시도해 확인해야 합니다.
사용 가능한 크기는 다른 pad의 현재 try format, 활성 링크, V4L2 control 값에도 의존할 수 있습니다. 파이프라인 상태가 바뀌면 같은 pad와 code의 열거 결과도 달라질 수 있습니다.
각 pad와 media-bus code 조합의 크기 항목을 순서대로 조회합니다.
Description
===========
This ioctl allows applications to access the enumeration of frame sizes
supported by a sub-device on the specified pad
for the specified media bus format.
Supported formats can be retrieved with the
:ref:`VIDIOC_SUBDEV_ENUM_MBUS_CODE`
ioctl.
The enumerations are defined by the driver, and indexed using the ``index`` field
of the struct :c:type:`v4l2_subdev_frame_size_enum`.
Each pair of ``pad`` and ``code`` correspond to a separate enumeration.
Each enumeration starts with the ``index`` of 0, and
the lowest invalid index marks the end of the enumeration.
Therefore, to enumerate frame sizes allowed on the specified pad
and using the specified mbus format, initialize the
``pad``, ``which``, and ``code`` fields to desired values,
and set ``index`` to 0.
Then call the :ref:`VIDIOC_SUBDEV_ENUM_FRAME_SIZE` ioctl with a pointer to the
structure.
A successful call will return with minimum and maximum frame sizes filled in.
Repeat with increasing ``index`` until ``EINVAL`` is received.
``EINVAL`` means that either no more entries are available in the enumeration,
or that an input parameter was 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.
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
:ref:`VIDIOC_SUBDEV_S_FMT <VIDIOC_SUBDEV_G_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
:ref:`VIDIOC_SUBDEV_G_FMT` for more
information about try formats.
struct v4l2_subdev_frame_size_enum
75-119응용 프로그램 입력과 드라이버 출력 필드를 구분합니다.
`min_width == max_width`이고 `min_height == max_height`이면 그 항목은 하나의 이산 프레임 크기를 나타냅니다. 범위 항목은 허용 영역을 나타내지만 내부의 모든 점을 보장하지 않습니다.
.. c:type:: v4l2_subdev_frame_size_enum
.. tabularcolumns:: |p{4.4cm}|p{4.4cm}|p{8.5cm}|
.. flat-table:: struct v4l2_subdev_frame_size_enum
:header-rows: 0
:stub-columns: 0
:widths: 1 1 2
* - __u32
- ``index``
- Index of the frame size in the enumeration belonging to the given pad
and format. Filled in by the application.
* - __u32
- ``pad``
- Pad number as reported by the media controller API.
Filled in by the application.
* - __u32
- ``code``
- The media bus format code, as defined in
:ref:`v4l2-mbus-format`. Filled in by the application.
* - __u32
- ``min_width``
- Minimum frame width, in pixels. Filled in by the driver.
* - __u32
- ``max_width``
- Maximum frame width, in pixels. Filled in by the driver.
* - __u32
- ``min_height``
- Minimum frame height, in pixels. Filled in by the driver.
* - __u32
- ``max_height``
- Maximum frame height, in pixels. Filled in by the driver.
* - __u32
- ``which``
- Frame sizes to be enumerated, from enum
:ref:`v4l2_subdev_format_whence <v4l2-subdev-format-whence>`.
* - __u32
- ``stream``
- Stream identifier.
* - __u32
- ``reserved``\ [7]
- Reserved for future extensions. Applications and drivers must set
the array to zero.
반환값과 EINVAL
120-131성공하면 0, 오류이면 -1을 반환하고 `errno`를 설정합니다.
입력 조건과 열거 경계를 함께 나타내는 오류입니다.
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
:ref:`Generic Error Codes <gen-errors>` chapter.
EINVAL
The struct :c:type:`v4l2_subdev_frame_size_enum` ``pad`` references a
non-existing pad, the ``which`` field has an unsupported value, the ``code``
is invalid for the given pad, or the ``index`` field is out of bounds.
요약·해설
vidioc-subdev-enum-frame-size.rst:1-131최소·최대 범위는 모든 중간 크기의 지원을 보증하지 않으므로 열거로 후보를 좁힌 뒤 S_FMT로 정확한 크기를 시험해야 합니다.