L4T Multimedia API Reference

31.1 Release

 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
multimedia_api/ll_samples/docs/l4t_mm_08_video_decode_drm.md
Go to the documentation of this file.
1 Copyright (c) 2016-2017, NVIDIA CORPORATION. All rights reserved.
2 
3 @page l4t_mm_08_video_decode_drm 08_video_dec_drm
4 @{
5 
6  - [Overview](#overview)
7  - [Building and Running](#build_and_run)
8  - [Flow](#flow)
9  - [Key Structure and Classes](#key)
10 
11 - - - - - - - - - - - - - - -
12 <a name="overview">
13 ## Overview ##
14 
15 This sample demonstrates how to render video stream or UI with the
16 NVIDIA<sup>&reg;</sup> Tegra<sup>&reg;</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.
19 
20 A DRM is a subsystem of the Linux kernel that interfaces with GPUs.
21 
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.
26 
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.
31 
32 The sample supports these video formats:
33 - H.264
34 - H.265
35 
36 
37 <a name="build_and_run">
38 - - - - - - - - - - - - - - -
39 ## Building and Running ##
40 
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.
46 
47 ### To build:
48 * Enter:
49 
50  $ cd $HOME/multimedia_api/samples/08_video_dec_drm
51  $ make
52 
53 ### Ensure the Ubuntu desktop is disabled:
54 
55  $ sudo systemctl stop gdm
56  $ sudo loginctl terminate-seat seat0
57 
58 ### If there are two display outputs, unblank the second inactive display:
59 
60  $ sudo sh -c 'echo 0 > /sys/class/graphics/fb1/blank'
61 
62 ### To run
63 * Enter:
64 
65  $ ./video_dec_drm <in-file> <in-format> [options]
66 
67 ### To view supported options
68 
69  $ ./video_dec_drm --help
70 
71 ### Example: To render only the UI stream
72 
73  $ ./video_dec_drm --disable-video
74 
75 ### Example: To render only the video stream
76 
77  $ ./video_dec_drm ../../data/Video/sample_outdoor_car_1080p_10fps.h264 H264 --disable-ui
78 
79 ### Example: To render the UI and video streams
80 
81  $ ./video_dec_drm ../../data/Video/sample_outdoor_car_1080p_10fps.h264 H264
82 
83 ### Enable the Ubuntu desktop after run
84 
85  $ sudo systemctl start gdm
86 
87 
88 <a name="flow">
89 - - - - - - - - - - - - - - -
90 ##Flow
91 The following diagram shows the flow of data through the sample.
92 
93 ![Flow of Data Through the Sample](l4t_mm_08_video_decode_drm_flow.png)
94 
95 The following diagram shows the interactions between the separate threads
96 in the sample.
97 
98 ![Thread Processing](l4t_mm_08_video_decode_drm_thread.png)
99 
100 #### Main Thread
101 If the options include `--disable-video`, the sample does the following:
102 
103 1. Creates DRM renderer for drawing UI.
104 
105 Otherwise:
106 
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.
110 
111 #### dec_capture_loop
112 
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.
118 
119 #### ui_renderer_loop
120 
121 1. Draws a static Image on the second plane (the first plane is used for video
122  streaming).
123 2. Draws a moving color block on the third plane.
124 
125 #### render_dequeue_loop:
126 
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.
131 
132 
133 
134 
135 - - - - - - - - - - - - - - -
136 <a name="key">
137 ## Key Structure and Classes ##
138 
139 The following tables shows the key classes and functions that this sample uses.
140 
141 |Class |Description|
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.|
146 
147 <br>
148 
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.
Definition: NvDrmRenderer.h:66
Defines a helper class for V4L2 Video Decoder.
Defines a helper class for V4L2 Video Converter.