1 Copyright (c) 2016-2017, NVIDIA CORPORATION. All rights reserved.
3 @page l4t_mm_08_video_decode_drm 08_video_dec_drm
6 - [Overview](#overview)
7 - [Building and Running](#build_and_run)
9 - [Key Structure and Classes](#key)
11 - - - - - - - - - - - - - - -
15 This sample demonstrates how to render video stream or UI with the
16 NVIDIA<sup>®</sup> Tegra<sup>®</sup> Direct Rendering Manager (DRM).
17 This sample provides rendering support on non-X11 and lightweight display
18 systems. The DRM is implemented in user-space and is compatible with DRM 2.0.
20 A DRM is a subsystem of the Linux kernel that interfaces with GPUs.
22 The sample supports two running modes, depending on the `--disable-video` option:
23 - If specified, the sample draws only the UI on the screen.
24 The UI is a
static JPEG image and a moving color block.
25 - Otherwise, it displays both the decoded video stream and the UI.
27 The sample demonstrates the supported DRM buffer allocation policies:
28 - Allocated by user. UI stream uses
this policy.
29 - Allocated by other V4L2 components (decoder or converter), where memory is
30 shared with DRM. Video stream uses
this policy.
32 The sample supports these video formats:
37 <a name=
"build_and_run">
38 - - - - - - - - - - - - - - -
39 ## Building and Running ##
41 #### Prerequisites ####
42 * This sample must be run without desktop. Please open a console via SSH or serial connection.
43 * You have followed Steps 1-3 in @ref mmapi_build.
44 * If you are building from your host Linux PC (x86), you have
45 followed Step 4 in @ref mmapi_build.
50 $ cd $HOME/tegra_multimedia_api/samples/08_video_dec_drm
53 ### Reassign display windows for Jetson AGX Xavier and Jeson Xavier NX:
54 * Since
this sample requires two overlay DRM planes and by
default Jetson AGX Xavier only has 1 overlay
55 plane
for each CRTC, assign 1 primary and 5 overlay planes by below command
for Jetson AGX Xavier.
57 $ sudo sh -c
'echo 4 > /sys/class/graphics/fb1/blank'
58 $ sudo sh -c
'echo 4 > /sys/class/graphics/fb2/blank'
59 $ sudo sh -c
'echo 4 > /sys/class/graphics/fb0/blank'
60 $ sudo sh -c
'echo 0x0 > /sys/class/graphics/fb1/device/win_mask'
61 $ sudo sh -c
'echo 0x0 > /sys/class/graphics/fb2/device/win_mask'
62 $ sudo sh -c
'echo 0x0 > /sys/class/graphics/fb0/device/win_mask'
63 $ sudo sh -c
'echo 0x3f > /sys/class/graphics/fb0/device/win_mask'
64 $ sudo sh -c
'echo 0 > /sys/class/graphics/fb0/blank'
66 ### Ensure the Ubuntu desktop is disabled:
68 $ sudo systemctl stop gdm
69 $ sudo loginctl terminate-seat seat0
71 ### If there are two display outputs, unblank the second inactive display:
73 $ sudo sh -c
'echo 0 > /sys/class/graphics/fb1/blank'
78 $ sudo ./video_dec_drm <in-file> <in-format> [options]
80 ### To view supported options
82 $ ./video_dec_drm --help
84 ### Example: To render only the UI stream
86 $ sudo ./video_dec_drm --disable-video
88 ### Example: To render only the video stream
90 $ sudo ./video_dec_drm ../../data/Video/sample_outdoor_car_1080p_10fps.h264 H264 --disable-ui
92 ### Example: To render the UI and video streams
94 $ sudo ./video_dec_drm ../../data/Video/sample_outdoor_car_1080p_10fps.h264 H264
96 ### Enable the Ubuntu desktop after run
98 $ sudo systemctl start gdm
102 - - - - - - - - - - - - - - -
104 The following diagram shows the flow of data through the sample.
106 
108 The following diagram shows the interactions between the separate threads
111 
114 If the options include `--disable-video`, the sample does the following:
116 1. Creates DRM renderer
for drawing UI.
120 1. Creates the decoder and converter
for conversion from YUV422/BL to NV12/PL.
121 2. Sets up the decoder output plane.
122 3. Feeds data into the decoder output plane, until the EOS is reached.
124 #### dec_capture_loop
126 1. Sets up decoder capture plane and converter output/capture plane based on the
127 modes user requested.
128 2. Creates DRM renderer.
129 3. Decodes and converts.
130 4. Dequeues the buffer into the DRM
for display.
132 #### ui_renderer_loop
134 1. Draws a
static Image on the second plane (the first plane is used
for video
136 2. Draws a moving color block on the third plane.
138 #### render_dequeue_loop:
140 1. Dequeues the buffer from DRM and returns it to the converter capture plane.
141 @note Because the DRM dequeue operation is a blocking call, you must make the
142 call in separate thread from the enqueue operation.
143 2. Detects whether EOS has been reached.
148 - - - - - - - - - - - - - - -
150 ## Key Structure and Classes ##
152 The following tables shows the key classes and functions that
this sample uses.
155 |-------|-----------|
156 |
class @ref
NvDrmRenderer | Contains elements and functions to render frames with tegra DRM.|
157 |class @ref
NvVideoDecoder | Contains all video decoding-related elements and functions.|
158 |class @ref
NvVideoConverter | Contains elements and functions for video format conversion.|
162 |Function|Description|
163 |--------|-----------|
164 |ui_render_loop_fcn | Thread function to render the UI image.|
165 |renderer_dequeue_loop_fcn | Thread function to dequeue the flipped frame from
NvDrmRenderer().|
166 |conv0_capture_dqbuf_thread_callback | Callback function to enqueue a new frame into
NvDrmRenderer. |
167 |conv0_output_dqbuf_thread_callback | Callback function to receive a frame from decoder and process format conversion.|
Helper class for rendering using LibDRM.
Defines a helper class for V4L2 Video Decoder.
Defines a helper class for V4L2 Video Converter.