Jetson Linux API 参考文档

32.7.4 版本
decoder_unit_sample (视频解码单元示例)

概述

decode_sample 应用程序是一个单元级别的实现,演示了如何使用 libv4l2 组件分配的缓冲区来解码 H.264 视频流。

该应用程序读取 H.264 基本视频文件,对其进行解码,并将原始 YUV 缓冲区写入文件,而无需任何额外的内存复制。

支持的视频格式包括

  • H.264


构建和运行

前提条件

  • 您已按照 构建和运行 中的步骤 1-3 进行操作。
  • 如果您是从主机 Linux PC (x86) 构建,则已按照 构建和运行 中的步骤 4 进行操作。

构建

  • 输入
     $ cd /usr/src/jetson_multimedia_api/samples/unittest_samples/decoder_unit_sample
     $ make
    

运行

  • 输入
     $ ./decode_sample <in-file> <out-file>
    

示例

  $ ./decode_sample ../../data/Video/sample_outdoor_car_1080p_10fps.h264 out_sample_outdoor_car_1080p_10fps.yuv


流程

以下步骤展示了本示例的流程。

  • 创建解码器实例。
  • 订阅了 V4L2_EVENT_RESOLUTION_CHANGE 事件。
  • 设置了输出平面和捕获平面。
  • 设置了外部控件。
  • 输出平面接收比特流格式的输入,并将其传递给解码器进行解码。
  • 捕获平面以 YUV 格式将解码后的帧传输到应用程序。
  • 对于输出平面,应用程序支持 MMAP 内存类型。对于捕获平面,它支持 DMABUF 内存类型。
  • 应用程序从捕获平面获取解码后的缓冲区,并将其转储到文件中。


关键结构和类

该示例使用以下关键类

元素描述
缓冲区基于 v4l2_buffer 结构建模的类。

该示例中使用的关键结构和函数包括

函数描述
decode_process函数循环,用于在输出平面上对缓冲区进行 DQ(dequeue,出队)和 EnQ(enqueue,入队)操作,直到发出 eos(end-of-stream,流结束)信号。
capture_thread指向解码捕获循环的线程处理程序的指针。
dq_event用于出队事件的函数。
dq_buffer用于从平面出队缓冲区的函数。
q_buffer用于在平面上入队缓冲区的函数。
req_buffers_on_capture_plane用于请求解码器捕获平面上的缓冲区的函数。
req_buffers_on_output_plane用于请求解码器输出平面上的缓冲区的函数。
set_capture_plane_format用于设置解码器捕获平面格式的函数。
set_output_plane_format用于设置解码器输出平面格式的函数。
set_ext_controls用于设置控件值的函数。
subscribe_event用于订阅 V4L2 事件的函数。
. All rights reserved.