# 配置

Source: [https://docs.qualcomm.com/doc/80-70014-20Y/topic/configure.html](https://docs.qualcomm.com/doc/80-70014-20Y/topic/configure.html)

此处提供了有关如何为不同的功能配置 V4L2 和 GStreamer API 的信息。

## 为不同的功能配置 V4L2 API

下面的信息涉及不同功能的 V4L2 控件 ID、可接受的格式、范围和示例代码：

**B 帧编码**

可以将 VPU 驱动程序配置为使用 `VIDIOC_S_CTRL` ioctl 系统调用在编码器会话中启用 B 帧。此配置必须在输出平面上的 `VIDIOC_STREAMON` 之前设置。VPU 驱动程序仅支持使用分层编码的 B 帧编码。不支持动态设置。

| H.264 和 HEVC 编解码器的控件 ID | 接受的格式 | 范围 |
| :---: | :---: | :---: |
| V4L2_CID_MPEG_VIDEO_B_FRAMESCopy to clipboard | 整型 | <ul class="ul" id="concept_igj_kz3_bzb__ul_svf_x5v_m1c_eputla_02-21-24-1612-55-72"><br>                                        <li class="li">{0, 1}</li><br><br>                                        <li class="li">0：禁用 B 帧</li><br><br>                                        <li class="li">1：启用一个 B 帧</li><br><br>                                    </ul> |

以下代码示例显示了启用单个 B 帧的静态配置：

v4l2_control control;
    int ret = 0;
    int bframes = 1;
    memset(&control, 0, sizeof(control));
    control.id = V4L2_CID_MPEG_VIDEO_B_FRAMES;
    control.value = bframes;
    ret = ioctl(mDriverFd, VIDIOC_S_CTRL, &control);// mDriverFd returned from open() system call
    if (ret) {
        return -1;
    }
    memset(&control, 0, sizeof(control));
    control.id = V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_TYPE;
    control.value = 0;// V4L2_MPEG_VIDEO_HEVC_HIERARCHICAL_CODING_B
    ret = ioctl(mDriverFd, VIDIOC_S_CTRL, &control);// mDriverFd returned from open() system call
    if (ret) { 
        return -1;
    }
    memset(&control, 0, sizeof(control));
    control.id = V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_LAYER;
    control.value = 1;//Enable 1 layer
    ret = ioctl(mDriverFd, VIDIOC_S_CTRL, &control);// mDriverFd returned from open() system call
    if (ret) { 
        return -1;
    }Copy to clipboard

**编码器初始 QP 覆盖**

可以配置 VPU 驱动程序，将 I、P 和 B 帧的初始帧量化参数 (QP) 覆盖为编码帧的预期值。可使用 `VIDIOC_S_CTRL` ioctl 系统调用执行此操作。它还可以灵活地设置仅 I 的初始帧 QP，或仅 P，或仅 B，或仅 I 和 P，或仅 P 和 B 等。此配置必须在输出平面上的 `VIDIOC_STREAMON` 之前设置，并且仅适用于编码器会话。

| H.264 编解码器的控制 ID | 接受的格式 | QP 范围 |
| --- | --- | --- |
| V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QPCopy to clipboard | 整型 | 符合编解码器标准的示例：<ul class="ul" id="concept_igj_kz3_bzb__ul_atj_wjk_n1c_eputla_02-23-24-1619-14-34"><br>                                        <li class="li">8 位为 1 到 51</li><br><br>                                        <li class="li">10 位为 1 到 63（-12 至 51）</li><br><br>                                    </ul> |
| V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QPCopy to clipboard | 整型 | 符合编解码器标准的示例：<ul class="ul" id="concept_igj_kz3_bzb__ul_atj_wjk_n1c_eputla_02-23-24-1619-14-34"><br>                                        <li class="li">8 位为 1 到 51</li><br><br>                                        <li class="li">10 位为 1 到 63（-12 至 51）</li><br><br>                                    </ul> |
| V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QPCopy to clipboard | 整型 | 符合编解码器标准的示例：<ul class="ul" id="concept_igj_kz3_bzb__ul_atj_wjk_n1c_eputla_02-23-24-1619-14-34"><br>                                        <li class="li">8 位为 1 到 51</li><br><br>                                        <li class="li">10 位为 1 到 63（-12 至 51）</li><br><br>                                    </ul> |
|  |  |  |
|  |  |  |

| HEVC 编解码器的控件 ID | 接受的格式 | QP 范围 |
| --- | --- | --- |
| V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_QPCopy to clipboard | 整型 | 符合编解码器标准的示例：<ul class="ul" id="concept_igj_kz3_bzb__ul_iwz_hlk_n1c_eputla_02-23-24-1630-15-248"><br>                                        <li class="li">8 位为 1 到 51</li><br><br>                                        <li class="li">10 位为 1 到 63（-12 至 51）</li><br><br>                                    </ul> |
| V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_QPICopy to clipboard | 整型 | 符合编解码器标准的示例：<ul class="ul" id="concept_igj_kz3_bzb__ul_iwz_hlk_n1c_eputla_02-23-24-1630-15-248"><br>                                        <li class="li">8 位为 1 到 51</li><br><br>                                        <li class="li">10 位为 1 到 63（-12 至 51）</li><br><br>                                    </ul> |
| V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_QPCopy to clipboard | 整型 | 符合编解码器标准的示例：<ul class="ul" id="concept_igj_kz3_bzb__ul_iwz_hlk_n1c_eputla_02-23-24-1630-15-248"><br>                                        <li class="li">8 位为 1 到 51</li><br><br>                                        <li class="li">10 位为 1 到 63（-12 至 51）</li><br><br>                                    </ul> |
|  |  |  |
|  |  |  |

以下代码示例显示了用于选择下列选项的静态配置参数：
- 40 作为 I 帧的初始 QP
- 35 作为 P 帧的初始 QP
- B 帧用于 H.264 会话

v4l2_control control;
    int ret = 0;
    memset(&control, 0, sizeof(control));
    control.id = V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP;
    control.value = 40;
    ret = ioctl(mDriverFd, VIDIOC_S_CTRL, &control);// mDriverFd returned from open() system call
    if (ret) {
        return -1;
    }
    memset(&control, 0, sizeof(control));
    control.id = V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP;
    control.value = 35;
    ret = ioctl(mDriverFd, VIDIOC_S_CTRL, &control);// mDriverFd returned from open() system call
    if (ret) {
        return -1;
    memset(&control, 0, sizeof(control));
    control.id = V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP;
    control.value = 35;
    ret = ioctl(mDriverFd, VIDIOC_S_CTRL, &control);// mDriverFd returned from open() system call
    if (ret) {
        return -1;
    }Copy to clipboard

**分片编码**

可以将 VPU 驱动程序配置为使用 `VIDIOC_S_CTRL` ioctl 系统调用将单个帧编码为多个分片。分片边界可指定为每个分片的位数或每个分片的宏块数。此配置必须在输出平面上的 `VIDIOC_STREAMON` 之前设置。此功能不支持动态配置，动态配置仅适用于编码器会话。

| H.264 和 HEVC 的控件 ID | 接受的格式 | 范围 |
| :---: | :---: | :---: |
| V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODECopy to clipboard | Enum<br>`v4l2_mpeg_video_multi_slice_mode` | 符合编解码器标准的值：<br>Enum<br><br><br>`v4l2_mpeg_video_multi_slice_mode` |
| V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_BYTESCopy to clipboard | 整型 | 512 - MAX\_BITRATE/8<br>单位：比特/秒 |
| V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MBCopy to clipboard | 整型 | 1 到 36864<br>单位：宏块 |

以下代码示例展示了一个用于编码具有多个分片的帧，并将每个分片的最大宏块数设置为 400 的静态配置：

v4l2_control control;
    int ret = 0;
    v4l2_mpeg_video_multi_slice_mode slicemode = V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_MAX_MB;
    memset(&control, 0, sizeof(control));
    control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE;
    control.value = slicemode;
    ret = ioctl(mDriverFd, VIDIOC_S_CTRL, &control);// mDriverFd returned from open() system call
    if (ret) {
        return -1;
    }
    memset(&control, 0, sizeof(control));
    control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MB;
    control.value = 400;
    ret = ioctl(mDriverFd, VIDIOC_S_CTRL, &control);// mDriverFd returned from open() system call
    if (ret) {
        return -1;
    }
    Copy to clipboard

**内部刷新**

可以使用 `VIDIOC_S_CTRL` ioctl 系统调用将 VPU 驱动程序配置为启用内部刷新模式和内部刷新周期。此配置必须在输出平面上的 `VIDIOC_STREAMON` 之前设置。需要注意的是，内部刷新周期可以在会话期间动态修改，并且此功能仅适用于编码器会话。

| H.264 和 HEVC 的控件 ID | 接受的格式 | 范围 |
| :---: | :---: | :---: |
| V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPECopy to clipboard | Enum<br>`v4l2_mpeg_video_intra_refresh_period_type` | `{V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE_RANDOM, V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE_CYCLIC}`<br>随机模式：<br><br>    V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE_RANDOMCopy to clipboard<br><br><br>循环模式：<br><br>    V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE_CYCLICCopy to clipboard |
| V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIODCopy to clipboard | 整型 | 将内部刷新周期内设置为小于 I 帧间隔<br><br><br>                                    <br>单位：帧数 |

以下代码示例展示了为每 10 帧启用随机内部刷新的静态配置：

v4l2_control control;
    int ret = 0;
    v4l2_mpeg_video_intra_refresh_period_type refreshtype = V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE_RANDOM;
         
    memset(&control, 0, sizeof(control));
    control.id = V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE;
    control.value = refreshtype;
    ret = ioctl(mDriverFd, VIDIOC_S_CTRL, &control);// mDriverFd returned from open() system call
    if (ret) {
        return -1;
    }
    memset(&control, 0, sizeof(control));
    control.id = V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD;
    control.value = 10;
    ret = ioctl(mDriverFd, VIDIOC_S_CTRL, &control);// mDriverFd returned from open() system call
    if (ret) {
        return -1;
    }Copy to clipboard

**旋转**

可以将 VPU 驱动程序配置为在使用 `VIDIOC_S_CTRL` ioctl 系统调用进行编码之前旋转输入帧。此配置必须在输出平面上的 `VIDIOC_STREAMON` 之前设置。此功能不支持动态配置，动态配置仅适用于编码器会话。

| H264 和 HEVC 的控件 ID | 接受的格式 | 范围 |
| :---: | :---: | :---: |
| V4L2_CID_ROTATECopy to clipboard | 整型 | {90, 180, 270} 单位：度 |

以下示例代码展示了将输入帧旋转到 90 度的静态配置：

v4l2_control control;
    int ret = 0;
    memset(&control, 0, sizeof(control));
    control.id = V4L2_CID_ROTATE;
    control.value = 90;
    ret = ioctl(mDriverFd, VIDIOC_S_CTRL, &control);// mDriverFd returned from open() system call
    if (ret) {
        return -1;
    }Copy to clipboard

**帧 QP 范围**

可以使用 `VIDIOC_S_CTRL` ioctl 系统调用配置 VPU 驱动程序，以将 I、P 和 B 帧的最小和最大帧 QP 范围参数设置为编码帧的预期值。此配置必须在输出平面上的 `VIDIOC_STREAMON` 之前设置。这些值对整个会话有效。不支持动态配置，此功能仅适用于编码器会话。

| H.264 编解码器的控制 ID | 接受的格式 | 范围 |
| --- | --- | --- |
| V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MIN_QPCopy to clipboard | 整型 | 符合编解码器标准的示例：8 位为 1 到 51 |
| V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MAX_QPCopy to clipboard | 整型 | 符合编解码器标准的示例：8 位为 1 到 51 |
| V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MIN_QPCopy to clipboard | 整型 | 符合编解码器标准的示例：8 位为 1 到 51 |
| V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MAX_QPCopy to clipboard | 整型 | 符合编解码器标准的示例：8 位为 1 到 51 |
| V4L2_CID_MPEG_VIDEO_H264_B_FRAME_MIN_QPCopy to clipboard | 整型 | 符合编解码器标准的示例：8 位为 1 到 51 |
| V4L2_CID_MPEG_VIDEO_H264_B_FRAME_MAX_QPCopy to clipboard | 整型 | 符合编解码器标准的示例：8 位为 1 到 51 |
| V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_MIN_QPCopy to clipboard | 整型 | 符合编解码器标准的示例：8 位为 1 到 51 |
| V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_MAX_QPCopy to clipboard | 整型 | 符合编解码器标准的示例：8 位为 1 到 51 |
| V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_MIN_QPCopy to clipboard | 整型 | 符合编解码器标准的示例：8 位为 1 到 51 |
| V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_MAX_QPCopy to clipboard | 整型 | 符合编解码器标准的示例：8 位为 1 到 51 |
| V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_MIN_QPCopy to clipboard | 整型 | 符合编解码器标准的示例：8 位为 1 到 51 |
| V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_MAX_QPCopy to clipboard | 整型 | 符合编解码器标准的示例：8 位为 1 到 51 |
|  |  |  |
|  |  |  |
|  |  |  |
|  |  |  |
|  |  |  |
|  |  |  |
|  |  |  |
|  |  |  |
|  |  |  |
|  |  |  |
|  |  |  |

以下代码示例展示了静态配置参数，用于选择 40 作为 H.264 会话中 I、P 和 B 帧的最大 QP，选择 10 作为最小 QP：

v4l2_control control;
    int ret = 0;
    memset(&control, 0, sizeof(control));
    control.id = V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MIN_QP;
    control.value = 10;
    ret = ioctl(mDriverFd, VIDIOC_S_CTRL, &control);// mDriverFd returned from open() system call
    if (ret) {
        return -1;
    }
    memset(&control, 0, sizeof(control));
    control.id = V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MIN_QP;
    control.value = 10;
    ret = ioctl(mDriverFd, VIDIOC_S_CTRL, &control);// mDriverFd returned from open() system call
    if (ret) {
        return -1;
    }
    memset(&control, 0, sizeof(control));
    control.id = V4L2_CID_MPEG_VIDEO_H264_B_FRAME_MIN_QP;
    control.value = 10;
    ret = ioctl(mDriverFd, VIDIOC_S_CTRL, &control);// mDriverFd returned from open() system call
    if (ret) {
        return -1;
    }
    memset(&control, 0, sizeof(control));
    control.id = V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MAX_QP;
    control.value = 40;
    ret = ioctl(mDriverFd, VIDIOC_S_CTRL, &control);// mDriverFd returned from open() system call
    if (ret) {
        return -1;
    }
    memset(&control, 0, sizeof(control));
    control.id = V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MAX_QP;
    control.value = 40;
    ret = ioctl(mDriverFd, VIDIOC_S_CTRL, &control);// mDriverFd returned from open() system call
    if (ret) {
        return -1;
    }
    memset(&control, 0, sizeof(control));
    control.id = V4L2_CID_MPEG_VIDEO_H264_B_FRAME_MAX_QP;
    control.value = 40;
    ret = ioctl(mDriverFd, VIDIOC_S_CTRL, &control);// mDriverFd returned from open() system call
    if (ret) {
        return -1;
    }
    Copy to clipboard

或者，如果您希望 I、P 和 B 帧具有相同的最小和最大 QP 值，则可以配置以下控件：

| H.264 编解码器的控制 ID | 接受的格式 | 范围 |
| --- | --- | --- |
| `V4L2_CID_MPEG_VIDEO_H264_MIN_QP` | 整型 | 符合代码标准的示例：8 位为 1 到 51 |
| `V4L2_CID_MPEG_VIDEO_H264_MAX_QP` | 整型 | 符合代码标准的示例：8 位为 1 到 51 |
|  |  |  |

| HEVC 编解码器的控件 ID | 接受的格式 | 范围 |
| --- | --- | --- |
| `V4L2_CID_MPEG_VIDEO_HEVC_MIN_QP` | 整型 | 符合代码标准的示例：8 位为 1 到 51 |
| `V4L2_CID_MPEG_VIDEO_HEVC_MAX_QP` | 整型 | 符合代码标准的示例：8 位为 1 到 51 |
|  |  |  |

## 为不同的功能配置 GStreamer API

有关不同的功能和相应插件的 GStreamer 元素属性的更多信息，参见 [Qualcomm GST 插件](https://docs.qualcomm.com/bundle/publicresource/topics/80-70014-50Y/qim-sdk-plugins.html)。

Last Published: Aug 22, 2024

[Previous Topic
验证](https://docs.qualcomm.com/bundle/publicresource/80-70014-20Y/topics/bring-up.md) [Next Topic
调试](https://docs.qualcomm.com/bundle/publicresource/80-70014-20Y/topics/debug.md)