Jetson Linux API 参考

32.7.4 版本
08_video_dec_drm (Direct Rendering Manager)

概述

此示例演示了如何使用 NVIDIA® Tegra® Direct Rendering Manager (DRM) 渲染视频流或 UI。此示例在非 X11 和轻量级显示系统上提供渲染支持。DRM 在用户空间中实现,并与 DRM 2.0 兼容。

DRM 是 Linux 内核的一个子系统,它与 GPU 接口。

该示例支持两种运行模式,具体取决于 --disable-video 选项

  • 如果指定,该示例仅在屏幕上绘制 UI。UI 是一个静态 JPEG 图像和一个移动的彩色块。
  • 否则,它将同时显示解码后的视频流和 UI。

该示例演示了支持的 DRM 缓冲区分配策略

  • 由用户分配。UI 流使用此策略。
  • 由其他 V4L2 组件(解码器或转换器)分配,其中内存与 DRM 共享。视频流使用此策略。

该示例支持以下视频格式

  • H.264
  • H.265


构建和运行

前提条件

  • 此示例必须在没有桌面的情况下运行。请通过 SSH 或串行连接打开控制台。
  • 您已完成构建和运行中的步骤 1-3。
  • 如果您是从主机 Linux PC (x86) 构建,则您已完成构建和运行中的步骤 4。

构建

  • 输入
     $ cd /usr/src/jetson_multimedia_api/samples/08_video_dec_drm
     $ make
    

为 Jetson AGX Xavier 和 Jeson Xavier NX 重新分配显示窗口

  • 由于此示例需要两个叠加 DRM 平面,并且默认情况下 Jetson AGX Xavier 每个 CRTC 只有一个叠加平面,因此请使用以下命令为 Jetson AGX Xavier 分配 1 个主平面和 5 个叠加平面。
     $ sudo sh -c 'echo 4 > /sys/class/graphics/fb1/blank'
     $ sudo sh -c 'echo 4 > /sys/class/graphics/fb2/blank'
     $ sudo sh -c 'echo 4 > /sys/class/graphics/fb0/blank'
     $ sudo sh -c 'echo 0x0 > /sys/class/graphics/fb1/device/win_mask'
     $ sudo sh -c 'echo 0x0 > /sys/class/graphics/fb2/device/win_mask'
     $ sudo sh -c 'echo 0x0 > /sys/class/graphics/fb0/device/win_mask'
     $ sudo sh -c 'echo 0x3f > /sys/class/graphics/fb0/device/win_mask'
     $ sudo sh -c 'echo 0 > /sys/class/graphics/fb0/blank'
    

确保 Ubuntu 桌面已禁用

   $ sudo systemctl stop gdm
   $ sudo loginctl terminate-seat seat0

为 Jetson Orin 安装 nvidia-drm 驱动程序

   $ sudo modprobe nvidia-drm modeset=1

如果有两个显示输出,请取消屏蔽第二个非活动显示器

   $ sudo sh -c 'echo 0 > /sys/class/graphics/fb1/blank'

运行

  • 输入
     $ sudo ./video_dec_drm <in-file> <in-format> [options]
    

查看支持的选项

   $ ./video_dec_drm --help

示例:仅渲染 UI 流

   $ sudo ./video_dec_drm --disable-video

示例:仅渲染视频流

   $ sudo ./video_dec_drm ../../data/Video/sample_outdoor_car_1080p_10fps.h264 H264 --disable-ui

示例:渲染 UI 和视频流

   $ sudo ./video_dec_drm ../../data/Video/sample_outdoor_car_1080p_10fps.h264 H264

运行后启用 Ubuntu 桌面

   $ sudo systemctl start gdm


流程

下图显示了数据流经示例的流程。

Flow of Data Through the Sample

下图显示了示例中各个线程之间的交互。

Thread Processing

主线程

如果选项包括 --disable-video,则示例执行以下操作

  1. 创建用于绘制 UI 的 DRM 渲染器。

否则

  1. 创建解码器和转换器,用于从 YUV422/BL 转换为 NV12/PL。
  2. 设置解码器输出平面。
  3. 将数据馈送到解码器输出平面,直到达到 EOS。

dec_capture_loop

  1. 根据用户请求的模式,设置解码器捕获平面和转换器输出/捕获平面。
  2. 创建 DRM 渲染器。
  3. 解码和转换。
  4. 将缓冲区出队到 DRM 以进行显示。

ui_renderer_loop

  1. 在第二个平面上绘制静态图像(第一个平面用于视频流)。
  2. 在第三个平面上绘制移动的彩色块。

render_dequeue_loop

  1. 从 DRM 中出队缓冲区,并将其返回到转换器捕获平面。
    注意
    由于 DRM 出队操作是一个阻塞调用,因此您必须在与入队操作不同的线程中进行调用。
  2. 检测是否已达到 EOS。

主要结构和类

下表显示了此示例使用的主要类和函数。

描述
NvDrmRenderer包含使用 tegra DRM 渲染帧的元素和函数。
NvVideoDecoder包含所有视频解码相关的元素和函数。
NvVideoConverter包含用于视频格式转换的元素和函数。


函数描述
ui_render_loop_fcn用于渲染 UI 图像的线程函数。
renderer_dequeue_loop_fcn用于从 NvDrmRenderer() 中出队翻转帧的线程函数。
conv0_capture_dqbuf_thread_callback用于将新帧入队到 NvDrmRenderer 的回调函数。
conv0_output_dqbuf_thread_callback用于从解码器接收帧并处理格式转换的回调函数。
. All rights reserved.