Skip to main content
您可以通过使用 Qualcomm IM SDK 框架或使用 V4L2 接口,在原生层使用视频功能。Qualcomm 提供基于 GStreamer 和 V4L2 的示例应用,用于运行视频示例用例。

GStreamer 示例

Qualcomm IM SDK 包含用于视频播放的示例 GStreamer 应用。 注意 有关不同 SoC 上支持的示例 GStreamer 应用的信息,请参阅多媒体示例应用 有关 GStreamer 应用先决条件的信息,请参阅运行视频和音频示例应用 下表列出了各方法及对应的视频示例测试用例:
表:测试视频用例的方法
方法用例
使用 gst-launch-1.0视频播放
音视频播放
视频录制
使用 GStreamer 应用视频播放

V4L2 示例

iris_v4l2_test 示例视频测试应用使用 Linux V4L2 接口模拟多种基本的编码器和解码器行为。有关更多信息,请参阅 V4L2 示例应用 Qualcomm Linux 支持以下视频 API:
  • GStreamer API:Qualcomm GStreamer 插件符合开源 GStreamer 框架规范。有关基于 GStreamer 的插件的更多信息,请参阅 Qualcomm IM SDK
  • V4L2 API:Adreno VPU 驱动遵循标准的 V4L2 兼容调用流程。V4L2 API 部分提供与 V4L2 API、命令、控制和事件相关的信息。

配置 GStreamer 和 V4L2 API

  • Qualcomm 提供可集成到您的媒体管线中的基于 GStreamer 的插件。有关基于 GStreamer 的插件的信息,请参阅配置 Qualcomm GStreamer 插件
  • Adreno VPU 驱动使用 V4L2 接口,为所有遵循 V4L2 规范的客户端提供视频编码和解码支持。

GStreamer API

有关 GStreamer 应用开发和管线创建的信息,请参阅 Building an Application

配置 GStreamer API

有关为不同功能和相应插件配置 GStreamer 元素属性的信息,请参阅配置 Qualcomm GStreamer 插件

V4L2 API

本节介绍解码器和编码器的 V4L2 设备节点、文件操作、命令、控制和事件。

VPU 驱动节点

设备在启动过程中注册 VPU 驱动,并为 qcom-multimedia-proprietary-image 分配设备节点编号。
  • 解码器的 VPU 驱动节点:/dev/video32
  • 编码器的 VPU 驱动节点:/dev/video33

注意:

对于 qcom-multimedia-image,VPU 驱动会将设备节点分配到从 video0 到 video27 之间的任意两个设备节点。

V4L2 文件操作

Adreno VPU 驱动支持以下 V4L2 文件操作:
表:V4L2 文件操作
操作描述
open打开视频设备文件描述符 (FD),用于通过输入/输出控制 ioctl 命令与 VPU 驱动通信
close在视频用例完成后关闭视频设备,并释放与该视频设备相关的所有 VPU 驱动资源
poll等待来自 VPU 驱动的事件
ioctl向 VPU 设备发送命令或控制

解码器和编码器的 V4L2 通用命令

VPU 驱动为视频解码器和编码器用例支持以下 ioctl 命令:
  • VIDIOC_ENUM_FMT
  • VIDIOC_TRY_FMT
  • VIDIOC_G_FMT
  • VIDIOC_S_FMT
  • VIDIOC_ENUM_FRAMESIZES
  • VIDIOC_REQBUFS
  • VIDIOC_QUERY_BUF
  • VIDIOC_CREATE_BUF
  • VIDIOC_PREPARE_BUF
  • VIDIOC_QBUF
  • VIDIOC_DQBUF
  • VIDIOC_STREAMON
  • VIDIOC_STREAMOFF
  • VIDIOC_QUERYCAP
  • VIDIOC_QUERYCTRL
  • VIDIOC_QUERYMENU
  • VIDIOC_SUBSCRIBE_EVENT
  • VIDIOC_UNSUBSCRIBE_EVENT
  • VIDIOC_G_SELECTION
  • VIDIOC_G_CTRL
  • VIDIOC_S_CTRL

V4L2 视频解码器

本节提供有关 Adreno VPU 解码器设备节点、支持的控制、命令和事件的信息。有关打开 VPU 解码器节点的步骤,请参阅 VPU 驱动节点 解码器的 V4L2 ioctl 命令 有关标准 ioctl 命令的说明,请参阅 Video for Linux API Function Reference 通用命令外,VPU 驱动还为视频解码器用例支持以下 ioctl 命令:
  • VIDIOC_TRY_DECODER_CMD
  • VIDIOC_DECODER_CMD
Memory-to-Memory Stateful Video Decoder Interface 中所述,解码器支持视频解码器用例所需的所有必备命令。 解码器的 V4L2 开源控制 有关标准开源控制的说明,请参阅 Codec Control Reference VPU 驱动为视频解码器用例支持以下开源控制:
表:解码器的 V4L2 开源控制
控制 ID用途动态/静态
V4L2_CID_MPEG_VIDEO_H264_PROFILEH.264 解码器配置文件静态
V4L2_CID_MPEG_VIDEO_HEVC_PROFILEHEVC 解码器配置文件静态
V4L2_CID_MPEG_VIDEO_VP9_PROFILEVP9 解码器配置文件静态
V4L2_CID_MPEG_VIDEO_H264_LEVELH.264 解码器级别静态
V4L2_CID_MPEG_VIDEO_HEVC_LEVELHEVC 解码器级别静态
V4L2_CID_MPEG_VIDEO_VP9_LEVELVP9 解码器级别静态
V4L2_CID_MPEG_VIDEO_HEVC_TIERHEVC 解码器层 (tier)静态
解码器支持以下 V4L2 开源事件:
  • V4L2_EVENT_EOS
  • V4L2_EVENT_SOURCE_CHANGE
  • V4L2_EVENT_CTRL
解码器支持以下 V4L2 命令:
  • V4L2_DEC_CMD_START
  • V4L2_DEC_CMD_STOP

V4L2 视频编码器

本节提供有关 Adreno VPU 编码器设备节点、支持的控制、命令和事件的信息。有关打开 VPU 编码器节点的步骤,请参阅 VPU 驱动节点 编码器的 V4L2 ioctl 命令 有关标准 ioctl 命令的说明,请参阅 Function Reference 通用命令外,VPU 驱动还为编码用例支持以下 ioctl 命令:
  • VIDIOC_ENUM_FRAMEINTERVALS
  • VIDIOC_S_SELECTION
  • VIDIOC_S_PARM
  • VIDIOC_G_PARM
  • VIDIOC_TRY_ENCODER_CMD
  • VIDIOC_ENCODER_CMD
Memory-to-Memory Stateful Video Encoder Interface 中所述,编码器支持视频编码器用例所需的所有必备命令。 编码器的 V4L2 开源控制 有关标准开源控制的说明,请参阅 Codec Control Reference VPU 驱动为视频编码器用例支持以下开源控制:
表:编码器的 V4L2 开源控制
控制 ID用途动态/静态
V4L2_CID_MPEG_VIDEO_H264_PROFILEH.264 编码器配置文件静态
V4L2_CID_MPEG_VIDEO_HEVC_PROFILEHEVC 编码器配置文件静态
V4L2_CID_MPEG_VIDEO_H264_LEVELH.264 编码器级别静态
V4L2_CID_MPEG_VIDEO_HEVC_LEVELHEVC 编码器级别静态
V4L2_CID_MPEG_VIDEO_HEVC_TIERH.264 编码器层 (tier)静态
V4L2_CID_HFLIP水平翻转两者
V4L2_CID_VFLIP垂直翻转两者
V4L2_CID_ROTATE旋转静态
V4L2_CID_MPEG_VIDEO_HEADER_MODE头模式静态
V4L2_CID_MPEG_VIDEO_PREPEND_SPSPPS_TO_IDRSPS/PPS 随即时解码器刷新 (IDR) 帧静态
V4L2_CID_MPEG_VIDEO_FORCE_KEY_FRAME请求强制同步帧两者
V4L2_CID_MPEG_VIDEO_BITRATE平均码率两者
V4L2_CID_MPEG_VIDEO_BITRATE_PEAK峰值码率两者
V4L2_CID_MPEG_VIDEO_BITRATE_MODE码率控制静态
V4L2_CID_MPEG_VIDEO_FRAME_SKIP_MODE跳帧模式静态
V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE启用/禁用 RC静态
V4L2_CID_MPEG_VIDEO_GOP_SIZE图像组大小两者
V4L2_CID_MPEG_VIDEO_B_FRAMESB 帧静态
V4L2_CID_MPEG_VIDEO_LTR_COUNTLTR 帧数量静态
V4L2_CID_MPEG_VIDEO_USE_LTR_FRAMES使用 LTR两者
V4L2_CID_MPEG_VIDEO_FRAME_LTR_INDEX标记 LTR两者
V4L2_CID_MPEG_VIDEO_BASELAYER_PRIORITY_ID为分层编码设置基础层 ID静态
V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE帧内刷新静态
V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD帧内刷新周期两者
V4L2_CID_MPEG_VIDEO_H264_MIN_QPH.264 最小量化参数 (QP)静态
V4L2_CID_MPEG_VIDEO_HEVC_MIN_QPHEVC 最小 QP静态
V4L2_CID_MPEG_VIDEO_H264_MAX_QPH.264 最大 QP静态
V4L2_CID_MPEG_VIDEO_HEVC_MAX_QPHEVC 最大 QP静态
V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MIN_QPH.264 I 帧最小 QP静态
V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_MIN_QPHEVC I 帧最小 QP静态
V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MIN_QPH.264 P 帧最小 QP静态
V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_MIN_QPHEVC P 帧最小 QP静态
V4L2_CID_MPEG_VIDEO_H264_B_FRAME_MIN_QPH.264 B 帧最小 QP静态
V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_MIN_QPHEVC B 帧最小 QP静态
V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MAX_QPH.264 I 帧最大 QP静态
V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_MAX_QPHEVC I 帧最大 QP静态
V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MAX_QPH.264 P 帧最大 QP静态
V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_MAX_QPHEVC P 帧最大 QP静态
V4L2_CID_MPEG_VIDEO_H264_B_FRAME_MAX_QPH.264 B 帧最大 QP静态
V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_MAX_QPHEVC B 帧最大 QP静态
V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_QPHEVC I 帧 QP两者
V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QPH.264 I 帧 QP两者
V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_QPHEVC P 帧 QP两者
V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QPH.264 P 帧 QP两者
V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_QPHEVC B 帧 QP两者
V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QPH.264 B 帧 QP两者
V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_TYPEHEVC 分层编码类型静态
V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_TYPEH.264 分层编码类型静态
V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODINGH.264 分层编码静态
V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_LAYERHEVC 分层层数两者
V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_LAYERH.264 分层层数两者
V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L0_BRH.264 第 0 层码率两者
V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L0_BRHEVC 第 0 层码率两者
V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L1_BRH.264 第 1 层码率两者
V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L1_BRHEVC 第 1 层码率两者
V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L2_BRH.264 第 2 层码率两者
V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L2_BRHEVC 第 2 层码率两者
V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L3_BRH.264 第 3 层码率两者
V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L3_BRHEVC 第 3 层码率两者
V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L4_BRH.264 第 4 层码率两者
V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L4_BRHEVC 第 4 层码率两者
V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L5_BRH.264 第 5 层码率两者
V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L5_BRHEVC 第 5 层码率两者
V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODEH.264 熵编码模式静态
V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE编码切片模式静态
V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_BYTES切片最大字节数静态
V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MB切片最大宏块数静态
请在两个平面上设置格式之后、在任一平面上请求缓冲区之前,设置所有静态配置选项。请在两个平面上设置格式之后调用动态参数。 有关编码器 V4L2 控制的信息,请参阅 Codec Control Reference 编码器支持的开源事件包括:
  • V4L2_EVENT_EOS
  • V4L2_EVENT_CTRL
编码器支持的开源命令包括:
  • V4L2_ENC_CMD_START
  • V4L2_ENC_CMD_STOP

配置 V4L2 API

使用本节提供的 V4L2 控制 ID、接受的格式、接受的范围和示例代码信息,在设备上配置和管理不同的视频功能。 B 帧编码 您可以使用 VIDIOC_S_CTRL ioctl 系统调用配置 VPU 驱动,在编码器会话中设置 B 帧。请在输出平面上设置 VIDIOC_STREAMON 之前设置 B 帧编码配置。VPU 驱动仅在分层编码时支持 B 帧编码。此功能不支持动态配置。
表:B 帧编码的控制 ID
H.264 和 HEVC 编解码器的控制 ID接受的格式范围
V4L2_CID_MPEG_VIDEO_B_FRAMES整数
  • 0:禁用 B 帧
  • 1:启用单个 B 帧
以下代码示例展示了单个 B 帧的静态配置:
编码器初始 QP 覆盖 您可以配置 VPU 驱动,将 I 帧、P 帧和 B 帧的初始帧量化参数 (QP) 覆盖为编码帧的目标值。您可以使用 VIDIOC_S_CTRL ioctl 系统调用进行覆盖。QP 覆盖提供了灵活性,可仅为 I 帧、仅为 P 帧、仅为 B 帧、仅为 I 帧和 P 帧、仅为 P 帧和 B 帧或这些帧的组合设置初始帧 QP。请在输出平面上执行 VIDIOC_STREAMON 之前设置编码器初始 QP 覆盖配置,且该配置仅适用于编码器会话。
表:编码器初始 QP 覆盖的控制 ID
H.264 编解码器的控制 ID接受的格式QP 范围
V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP整数
根据编解码器标准的示例:
  • 8 位为 1 到 51
  • 10 位为 1 到 63(-12 到 51)
V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP整数
V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP整数
HEVC 编解码器的控制 ID接受的格式QP 范围
V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_QP整数
根据编解码器标准的示例:
  • 8 位为 1 到 51
  • 10 位为 1 到 63(-12 到 51)
V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_QPI整数
V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_QP整数
以下代码示例展示了要设置的静态配置参数:
  • 将 I 帧的初始 QP 设置为 40
  • 将 P 帧的初始 QP 设置为 35
  • 为 H.264 会话设置 B 帧
切片编码 您可以使用 VIDIOC_S_CTRL ioctl 系统调用配置 VPU 驱动,将单个帧编码为多个切片。每个切片的比特数或每个切片的宏块数即为切片边界。请在输出平面上执行 VIDIOC_STREAMON 之前设置切片编码配置。切片编码功能不支持动态配置,且此配置仅适用于编码器会话。
表:切片编码的控制 ID
H.264 和 HEVC 编解码器的控制 ID接受的格式范围
V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODEenum
v4l2_mpeg_video_multi_slice_mode
根据编解码器标准的值:
enum
v4l2_mpeg_video_multi_slice_mode
V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_BYTES整数
512 - MAX_BITRATE/8
单位:比特/秒
V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MB整数1 到 36864
单位:宏块
以下代码示例展示了将帧编码为多个切片、且每个切片的最大宏块数设置为 400 的静态配置:
帧内刷新 您可以使用 VIDIOC_S_CTRL ioctl 系统调用配置 VPU 驱动,激活帧内刷新模式和帧内刷新周期。请在输出平面上发出 VIDIOC_STREAMON 之前设置帧内刷新配置。您可以在会话期间动态更改帧内刷新周期,此功能仅适用于编码器会话。
表:帧内刷新的控制 ID
H.264 和 HEVC 编解码器的控制 ID接受的格式范围
V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE
enum
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
V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD整数
将帧内刷新周期设置为小于 I 帧间隔
单位:帧数
以下代码示例展示了每 10 帧激活一次随机帧内刷新的静态配置:
旋转 您可以使用 VIDIOC_S_CTRL ioctl 系统调用配置 VPU 驱动,在编码前旋转输入帧。请在输出平面上执行 VIDIOC_STREAMON 之前设置旋转配置。旋转功能不支持动态配置,且仅适用于编码器会话。
表:旋转的控制 ID
H.264 和 HEVC 编解码器的控制 ID接受的格式范围
V4L2_CID_ROTATE整数
单位:度
以下代码示例展示了将输入帧旋转 90 度的静态配置:
帧 QP 范围 您可以使用 VIDIOC_S_CTRL ioctl 系统调用配置 VPU 驱动,将 I 帧、P 帧和 B 帧的最小和最大帧 QP 范围参数设置为编码帧的目标值。请在输出平面上执行 VIDIOC_STREAMON 之前设置帧 QP 范围配置。这些值在整个会话期间有效。不支持动态配置,且帧 QP 功能仅适用于编码器会话。
表:帧 QP 范围的控制 ID
H.264 编解码器的控制 ID接受的格式范围
V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MIN_QP整数根据编解码器标准的示例:8 位为 1 到 51
V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MAX_QP
V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MIN_QP
V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MAX_QP
V4L2_CID_MPEG_VIDEO_H264_B_FRAME_MIN_QP
V4L2_CID_MPEG_VIDEO_H264_B_FRAME_MAX_QP
V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_MIN_QP
V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_MAX_QP
V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_MIN_QP
V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_MAX_QP
V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_MIN_QP
V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_MAX_QP
以下代码示例展示了在 H.264 会话中为 I 帧、P 帧和 B 帧选择 40 作为最大 QP、10 作为最小 QP 的静态配置参数:
如果需要为 I 帧、P 帧和 B 帧设置相同的最小和最大 QP 值,可以配置以下控制: 表:H.264 编解码器的控制 ID
表:H.264 编解码器的控制 ID
H.264 编解码器的控制 ID接受的格式范围
V4L2_CID_MPEG_VIDEO_H264_MIN_QP整数根据编码标准的示例:8 位为 1 到 51
V4L2_CID_MPEG_VIDEO_H264_MAX_QP
表:HEVC 编解码器的控制 ID
HEVC 编解码器的控制 ID接受的格式范围
V4L2_CID_MPEG_VIDEO_HEVC_MIN_QP整数根据编码标准的示例:8 位为 1 到 51
V4L2_CID_MPEG_VIDEO_HEVC_MAX_QP整数

后续步骤