Jetson Linux API 参考

32.7.4 版本
V4L2 视频解码器

详细描述

NVIDIA V4L2 视频解码器描述和扩展。

视频解码器设备节点是

/dev/nvhost-nvdec

支持的像素格式

输出平面捕获平面
V4L2_PIX_FMT_H264V4L2_PIX_FMT_NV12M
V4L2_PIX_FMT_H265V4L2_PIX_FMT_NV12M

支持的内存类型

内存输出平面捕获平面
V4L2_MEMORY_MMAP
V4L2_MEMORY_DMABUF
V4L2_MEMORY_USERPTR

支持的控件

支持的事件

事件目的
V4L2_EVENT_RESOLUTION_CHANGE 流的分辨率已更改。

处理分辨率更改事件

当解码器生成 V4L2_EVENT_RESOLUTION_CHANGE 事件时,应用程序在捕获平面上调用 STREAMOFF,以告知解码器通过调用计数为零的 REQBUF 来释放当前缓冲区,获取新的捕获平面格式,然后继续设置捕获平面的缓冲区。

在解码器的情况下,缓冲区格式可能与显示分辨率不同。应用程序必须使用 VIDIOC_G_CROP 来获取显示分辨率。

EOS 处理

必须遵循以下顺序来发送 EOS 并从解码器接收 EOS。

  1. 通过在输出平面上排队一个 bytesused = 0 的缓冲区(对于第 0 个平面 (v4l2_buffer.m.planes[0].bytesused = 0))向解码器发送 EOS。
  2. 在输出平面上取消排队缓冲区,直到获得一个 bytesused = 0 的缓冲区(对于第 0 个平面 (v4l2_buffer.m.planes[0].bytesused == 0))
  3. 在捕获平面上取消排队缓冲区,直到获得一个 bytesused = 0 的缓冲区(对于第 0 个平面)。

解码器输入帧元数据

解码器支持将流头解析错误信息作为输入帧元数据报告。有关更多信息,请参阅 V4L2_CID_MPEG_VIDEO_ERROR_REPORTINGV4L2_CID_MPEG_VIDEODEC_INPUT_METADATAv4l2_ctrl_video_metadata

解码器输出帧元数据

解码器支持报告帧相关元数据,包括错误报告和 DPB 信息。有关更多信息,请参阅 V4L2_CID_MPEG_VIDEO_ERROR_REPORTINGV4L2_CID_MPEG_VIDEODEC_METADATAv4l2_ctrl_video_metadata

注意
目前,V4L2 插件不支持奇数分辨率。

数据结构

结构体  v4l2_ctrl_videodec_statusmetadata_
 保存帧的解码器错误状态元数据。 更多...
 
结构体  v4l2_ctrl_videodec_refframe_metadata_
 保存参考帧的帧特定元数据。 更多...
 
结构体  v4l2_ctrl_videodec_currentframe_metadata_
 保存当前帧的帧特定元数据。 更多...
 
结构体  v4l2_ctrl_videodec_dpbinfometadata_
 保存解码器 DPB 信息元数据。 更多...
 
结构体  v4l2_ctrl_h264dec_bufmetadata_
 保存帧的 H.264 特定解码器元数据。 更多...
 
结构体  v4l2_ctrl_hevcdec_bufmetadata_
 保存帧的 H.265 特定解码器元数据。 更多...
 
结构体  v4l2_ctrl_videodec_inputbuf_metadata_
 保存帧的视频解码器输入头错误元数据。 更多...
 
结构体  v4l2_ctrl_videodec_outputbuf_metadata_
 保存帧的视频解码器输出元数据。 更多...
 

#define V4L2_CID_MPEG_VIDEO_DISABLE_COMPLETE_FRAME_INPUT   (V4L2_CID_MPEG_BASE+515)
 定义控件 ID,以指示解码器输入缓冲区不包含完整缓冲区。 更多...
 
#define V4L2_CID_MPEG_VIDEO_DISABLE_DPB   (V4L2_CID_MPEG_BASE+516)
 定义控件 ID 以禁用解码器 DPB 管理。 更多...
 
#define V4L2_CID_MPEG_VIDEO_ERROR_REPORTING   (V4L2_CID_MPEG_BASE+517)
 定义控件 ID 以启用解码器错误和元数据报告。 更多...
 
#define V4L2_CID_MPEG_VIDEO_SKIP_FRAMES   (V4L2_CID_MPEG_BASE+518)
 定义控件 ID 以设置解码器的跳帧属性。 更多...
 
#define V4L2_CID_MPEG_VIDEODEC_METADATA   (V4L2_CID_MPEG_BASE+519)
 定义控件 ID 以获取解码器输出元数据。 更多...
 
#define V4L2_CID_MPEG_VIDEODEC_INPUT_METADATA   (V4L2_CID_MPEG_BASE+520)
 定义控件 ID 以获取解码器输入头错误元数据。 更多...
 
#define V4L2_CID_VIDEODEC_DISPLAYDATA_PRESENT   (V4L2_CID_MPEG_BASE+521)
 定义控件 ID 以检查显示数据是否存在。 更多...
 
#define V4L2_CID_VIDEODEC_HDR_MASTERING_DISPLAY_DATA   (V4L2_CID_MPEG_BASE+522)
 定义控件 ID 以在 V4L2_CID_VIDEODEC_DISPLAYDATA_PRESENT 返回 true 时获取显示数据。 更多...
 
#define V4L2_CID_MPEG_VIDEODEC_SAR_WIDTH   (V4L2_CID_MPEG_BASE+569)
 定义控件 ID 以获取解码的样本宽高比宽度。 更多...
 
#define V4L2_CID_MPEG_VIDEODEC_SAR_HEIGHT   (V4L2_CID_MPEG_BASE+570)
 定义控件 ID 以获取解码的样本宽高比高度。 更多...
 
#define V4L2_CID_MPEG_VIDEOENC_DS_SEI_DATA   (V4L2_CID_MPEG_BASE+571)
 定义控件 ID 以嵌入来自上游插件的 SEI 数据。 更多...
 

类型定义

typedef struct v4l2_ctrl_videodec_statusmetadata_ v4l2_ctrl_videodec_statusmetadata
 保存帧的解码器错误状态元数据。 更多...
 
typedef struct v4l2_ctrl_videodec_refframe_metadata_ v4l2_ctrl_videodec_refframe_metadata
 保存参考帧的帧特定元数据。 更多...
 
typedef struct v4l2_ctrl_videodec_currentframe_metadata_ v4l2_ctrl_videodec_currentframe_metadata
 保存当前帧的帧特定元数据。 更多...
 
typedef struct v4l2_ctrl_videodec_dpbinfometadata_ v4l2_ctrl_videodec_dpbinfometadata
 保存解码器 DPB 信息元数据。 更多...
 
typedef struct v4l2_ctrl_h264dec_bufmetadata_ v4l2_ctrl_h264dec_bufmetadata
 保存帧的 H.264 特定解码器元数据。 更多...
 
typedef struct v4l2_ctrl_hevcdec_bufmetadata_ v4l2_ctrl_hevcdec_bufmetadata
 保存帧的 H.265 特定解码器元数据。 更多...
 
typedef struct v4l2_ctrl_videodec_inputbuf_metadata_ v4l2_ctrl_videodec_inputbuf_metadata
 保存帧的视频解码器输入头错误元数据。 更多...
 
typedef struct v4l2_ctrl_videodec_outputbuf_metadata_ v4l2_ctrl_videodec_outputbuf_metadata
 保存帧的视频解码器输出元数据。 更多...
 

枚举

enum  v4l2_skip_frames_type {
  V4L2_SKIP_FRAMES_TYPE_NONE = 0,
  V4L2_SKIP_FRAMES_TYPE_NONREF = 1,
  V4L2_SKIP_FRAMES_TYPE_DECODE_IDR_ONLY = 2
}
 枚举 v4l2_skip_frames_type,解码器跳帧的可能方法。 更多...
 
enum  v4l2_cuda_mem_type {
  V4L2_CUDA_MEM_TYPE_DEVICE = 0,
  V4L2_CUDA_MEM_TYPE_PINNED = 1,
  V4L2_CUDA_MEM_TYPE_UNIFIED = 2
}
 枚举 v4l2_cuda_mem_type,cuda 内存类型的可能方法。 更多...
 
enum  v4l2_videodec_input_error_type {
  V4L2_DEC_ERROR_NONE = 0x0,
  V4L2_DEC_ERROR_SPS = 0x1,
  V4L2_DEC_ERROR_PPS = 0x2,
  V4L2_DEC_ERROR_SLICE_HDR = 0x4,
  V4L2_DEC_ERROR_MISSING_REF_FRAME = 0x8,
  V4L2_DEC_ERROR_VPS = 0x10
}
 枚举 v4l2_videodec_input_error_type,输入流的可能错误类型。 更多...
 

宏定义文档

◆ V4L2_CID_MPEG_VIDEO_DISABLE_COMPLETE_FRAME_INPUT

#define V4L2_CID_MPEG_VIDEO_DISABLE_COMPLETE_FRAME_INPUT   (V4L2_CID_MPEG_BASE+515)

定义控件 ID,以指示解码器输入缓冲区不包含完整缓冲区。

注意
当帧包含多个切片,且输入缓冲区不包含帧的所有切片时,必须设置此控件。

必须为此控件提供布尔值。

定义于文件 v4l2_nv_extensions.h 的第 501 行。

◆ V4L2_CID_MPEG_VIDEO_DISABLE_DPB

#define V4L2_CID_MPEG_VIDEO_DISABLE_DPB   (V4L2_CID_MPEG_BASE+516)

定义控件 ID 以禁用解码器 DPB 管理。

注意
这仅适用于具有单个参考帧的流。

必须为此控件提供布尔值。

注意
必须在设置两个平面上的格式之后以及在请求任一平面上的缓冲区之前设置此控件。

定义于文件 v4l2_nv_extensions.h 的第 513 行。

◆ V4L2_CID_MPEG_VIDEO_ERROR_REPORTING

#define V4L2_CID_MPEG_VIDEO_ERROR_REPORTING   (V4L2_CID_MPEG_BASE+517)

定义控件 ID 以启用解码器错误和元数据报告。

必须为此控件提供布尔值。

注意
必须在设置两个平面上的格式之后以及在请求任一平面上的缓冲区之前设置此控件。

定义于文件 v4l2_nv_extensions.h 的第 523 行。

◆ V4L2_CID_MPEG_VIDEO_SKIP_FRAMES

#define V4L2_CID_MPEG_VIDEO_SKIP_FRAMES   (V4L2_CID_MPEG_BASE+518)

定义控件 ID 以设置解码器的跳帧属性。

必须将解码器配置为跳过某些类型的帧。必须传递一个 v4l2_skip_frames_type

注意
必须在设置两个平面上的格式之后以及在请求任一平面上的缓冲区之前设置此控件。此控件 ID 仅支持 H264。

定义于文件 v4l2_nv_extensions.h 的第 535 行。

◆ V4L2_CID_MPEG_VIDEODEC_INPUT_METADATA

#define V4L2_CID_MPEG_VIDEODEC_INPUT_METADATA   (V4L2_CID_MPEG_BASE+520)

定义控件 ID 以获取解码器输入头错误元数据。

注意
必须为此启用元数据报告,使用 V4L2_CID_MPEG_VIDEO_ERROR_REPORTING IOCTL。

必须为此控件提供指向有效 v4l2_ctrl_video_metadata 结构的指针。

注意
必须在从输出平面成功取消排队缓冲区后读取此控件。结构中的值在缓冲区再次排队之前有效。

定义于文件 v4l2_nv_extensions.h 的第 565 行。

◆ V4L2_CID_MPEG_VIDEODEC_METADATA

#define V4L2_CID_MPEG_VIDEODEC_METADATA   (V4L2_CID_MPEG_BASE+519)

定义控件 ID 以获取解码器输出元数据。

注意
必须为此启用元数据报告,使用 V4L2_CID_MPEG_VIDEO_ERROR_REPORTING IOCTL。

必须为此控件提供指向有效 v4l2_ctrl_video_metadata 结构的指针。

注意
必须在从捕获平面成功取消排队缓冲区后读取此控件。结构中的值在缓冲区再次排队之前有效。

定义于文件 v4l2_nv_extensions.h 的第 550 行。

◆ V4L2_CID_MPEG_VIDEODEC_SAR_HEIGHT

#define V4L2_CID_MPEG_VIDEODEC_SAR_HEIGHT   (V4L2_CID_MPEG_BASE+570)

定义控件 ID 以获取解码的样本宽高比高度。

此控件返回样本宽高比高度的无符号整数。

注意
必须在接收 V4L2_EVENT_RESOLUTION_CHANGE 后设置此控件。

定义于文件 v4l2_nv_extensions.h 的第 602 行。

◆ V4L2_CID_MPEG_VIDEODEC_SAR_WIDTH

#define V4L2_CID_MPEG_VIDEODEC_SAR_WIDTH   (V4L2_CID_MPEG_BASE+569)

定义控件 ID 以获取解码的样本宽高比宽度。

此控件返回样本宽高比宽度的无符号整数。

注意
必须在接收 V4L2_EVENT_RESOLUTION_CHANGE 后设置此控件。

定义于文件 v4l2_nv_extensions.h 的第 592 行。

◆ V4L2_CID_MPEG_VIDEOENC_DS_SEI_DATA

#define V4L2_CID_MPEG_VIDEOENC_DS_SEI_DATA   (V4L2_CID_MPEG_BASE+571)

定义控件 ID 以嵌入来自上游插件的 SEI 数据。

此控件设置编码器的 SEI 有效负载大小和 SEI 数据指针。

注意
必须在接收 V4L2_EVENT_RESOLUTION_CHANGE 后设置此控件。

定义于文件 v4l2_nv_extensions.h 的第 612 行。

◆ V4L2_CID_VIDEODEC_DISPLAYDATA_PRESENT

#define V4L2_CID_VIDEODEC_DISPLAYDATA_PRESENT   (V4L2_CID_MPEG_BASE+521)

定义控件 ID 以检查显示数据是否存在。

如果 HDR 元数据存在于流中,则此控件返回 true。

定义于文件 v4l2_nv_extensions.h 的第 573 行。

◆ V4L2_CID_VIDEODEC_HDR_MASTERING_DISPLAY_DATA

#define V4L2_CID_VIDEODEC_HDR_MASTERING_DISPLAY_DATA   (V4L2_CID_MPEG_BASE+522)

定义控件 ID 以在 V4L2_CID_VIDEODEC_DISPLAYDATA_PRESENT 返回 true 时获取显示数据。

此控件返回显示模块所需的显示数据,例如 display_primaries、white_point 和 display_parameter_luminance。

定义于文件 v4l2_nv_extensions.h 的第 582 行。

类型定义文档

◆ v4l2_ctrl_h264dec_bufmetadata

保存帧的 H.264 特定解码器元数据。

◆ v4l2_ctrl_hevcdec_bufmetadata

保存帧的 H.265 特定解码器元数据。

◆ v4l2_ctrl_videodec_currentframe_metadata

保存当前帧的帧特定元数据。

◆ v4l2_ctrl_videodec_dpbinfometadata

保存解码器 DPB 信息元数据。

◆ v4l2_ctrl_videodec_inputbuf_metadata

保存帧的视频解码器输入头错误元数据。

◆ v4l2_ctrl_videodec_outputbuf_metadata

保存帧的视频解码器输出元数据。

◆ v4l2_ctrl_videodec_refframe_metadata

保存参考帧的帧特定元数据。

◆ v4l2_ctrl_videodec_statusmetadata

保存帧的解码器错误状态元数据。

枚举类型文档

◆ v4l2_cuda_mem_type

枚举 v4l2_cuda_mem_type,cuda 内存类型的可能方法。

枚举器
V4L2_CUDA_MEM_TYPE_DEVICE 

内存类型设备。

V4L2_CUDA_MEM_TYPE_PINNED 

内存类型主机。

V4L2_CUDA_MEM_TYPE_UNIFIED 

内存类型统一。

定义于文件 1602 行,文件为 v4l2_nv_extensions.h

◆ v4l2_skip_frames_type

枚举 v4l2_skip_frames_type,解码器跳帧的可能方法。

枚举器
V4L2_SKIP_FRAMES_TYPE_NONE 

不跳过任何帧。

V4L2_SKIP_FRAMES_TYPE_NONREF 

跳过所有非参考帧。

V4L2_SKIP_FRAMES_TYPE_DECODE_IDR_ONLY 

跳过除 IDR 之外的所有帧。

定义于文件 1591 行,文件为 v4l2_nv_extensions.h

◆ v4l2_videodec_input_error_type

枚举 v4l2_videodec_input_error_type,输入流的可能错误类型。

枚举器
V4L2_DEC_ERROR_NONE 

无错误。

V4L2_DEC_ERROR_SPS 

SPS 错误。

V4L2_DEC_ERROR_PPS 

PPS 错误。

V4L2_DEC_ERROR_SLICE_HDR 

切片头错误。

V4L2_DEC_ERROR_MISSING_REF_FRAME 

缺少参考帧错误。

V4L2_DEC_ERROR_VPS 

VPS 错误。

定义于文件 1613 行,文件为 v4l2_nv_extensions.h

. All rights reserved.