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 ### Ensure the Ubuntu desktop is disabled:
55 $ sudo systemctl stop gdm
56 $ sudo loginctl terminate-seat seat0
58 ### If there are two display outputs, unblank the second inactive display:
60 $ sudo sh -c
'echo 0 > /sys/class/graphics/fb1/blank'
65 $ sudo ./video_dec_drm <in-file> <in-format> [options]
67 ### To view supported options
69 $ ./video_dec_drm --help
71 ### Example: To render only the UI stream
73 $ sudo ./video_dec_drm --disable-video
75 ### Example: To render only the video stream
77 $ sudo ./video_dec_drm ../../data/Video/sample_outdoor_car_1080p_10fps.h264 H264 --disable-ui
79 ### Example: To render the UI and video streams
81 $ sudo ./video_dec_drm ../../data/Video/sample_outdoor_car_1080p_10fps.h264 H264
83 ### Enable the Ubuntu desktop after run
85 $ sudo systemctl start gdm
89 - - - - - - - - - - - - - - -
91 The following diagram shows the flow of data through the sample.
93 
95 The following diagram shows the interactions between the separate threads
98 
101 If the options include `--disable-video`, the sample does the following:
103 1. Creates DRM renderer
for drawing UI.
107 1. Creates the decoder and converter
for conversion from YUV422/BL to NV12/PL.
108 2. Sets up the decoder output plane.
109 3. Feeds data into the decoder output plane, until the EOS is reached.
111 #### dec_capture_loop
113 1. Sets up decoder capture plane and converter output/capture plane based on the
114 modes user requested.
115 2. Creates DRM renderer.
116 3. Decodes and converts.
117 4. Dequeues the buffer into the DRM
for display.
119 #### ui_renderer_loop
121 1. Draws a
static Image on the second plane (the first plane is used
for video
123 2. Draws a moving color block on the third plane.
125 #### render_dequeue_loop:
127 1. Dequeues the buffer from DRM and returns it to the converter capture plane.
128 @note Because the DRM dequeue operation is a blocking call, you must make the
129 call in separate thread from the enqueue operation.
130 2. Detects whether EOS has been reached.
135 - - - - - - - - - - - - - - -
137 ## Key Structure and Classes ##
139 The following tables shows the key classes and functions that
this sample uses.
142 |-------|-----------|
143 |
class @ref
NvDrmRenderer | Contains elements and functions to render frames with tegra DRM.|
144 |class @ref
NvVideoDecoder | Contains all video decoding-related elements and functions.|
145 |class @ref
NvVideoConverter | Contains elements and functions for video format conversion.|
149 |Function|Description|
150 |--------|-----------|
151 |ui_render_loop_fcn | Thread function to render the UI image.|
152 |renderer_dequeue_loop_fcn | Thread function to dequeue the flipped frame from
NvDrmRenderer().|
153 |conv0_capture_dqbuf_thread_callback | Callback function to enqueue a new frame into
NvDrmRenderer. |
154 |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.