L4T Multimedia API Reference

28.2 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 needs to be run without desktop, so 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/tegra_multimedia_api/samples/08_video_dec_drm
51  $ make
52 
53 ### Ensure the Ubuntu desktop is disabled:
54 
55  $ sudo systemctl stop lightdm.service
56 
57 ### If there are two display outputs, unblank the second inactive display:
58 
59  $ sudo sh -c 'echo 0 > /sys/class/graphics/fb1/blank'
60 
61 ### To run
62 * Enter:
63 
64  $ ./video_dec_drm <in-file> <in-format> [options]
65 
66 ### To view supported options
67 
68  $ ./video_dec_drm --help
69 
70 ### Example: To render only the UI stream
71 
72  $ ./video_dec_drm --disable-video
73 
74 ### Example: To render only the video stream
75 
76  $ ./video_dec_drm ../../data/Video/sample_outdoor_car_1080p_10fps.h264 H264 --disable-ui
77 
78 ### Example: To render the UI and video streams
79 
80  $ ./video_dec_drm ../../data/Video/sample_outdoor_car_1080p_10fps.h264 H264
81 
82 ### Enable the Ubuntu desktop after run
83 
84  $ sudo systemctl start lightdm.service
85 
86 
87 <a name="flow">
88 - - - - - - - - - - - - - - -
89 ##Flow
90 The following diagram shows the flow of data through the sample.
91 
92 ![Flow of Data Through the Sample](l4t_mm_08_video_decode_drm_flow.png)
93 
94 The following diagram shows the interactions between the separate threads
95 in the sample.
96 
97 ![Thread Processing](l4t_mm_08_video_decode_drm_thread.png)
98 
99 #### Main Thread
100 If the options include `--disable-video`, the sample does the following:
101 
102 1. Creates DRM renderer for drawing UI.
103 
104 Otherwise:
105 
106 1. Creates the decoder and converter for conversion from YUV422/BL to NV12/PL.
107 2. Sets up the decoder output plane.
108 3. Feeds data into the decoder output plane, until the EOS is reached.
109 
110 #### dec_capture_loop
111 
112 1. Sets up decoder capture plane and converter output/capture plane based on the
113  modes user requested.
114 2. Creates DRM renderer.
115 3. Decodes and converts.
116 4. Dequeues the buffer into the DRM for display.
117 
118 #### ui_renderer_loop
119 
120 1. Draws a static Image on the second plane (the first plane is used for video
121  streaming).
122 2. Draws a moving color block on the third plane.
123 
124 #### render_dequeue_loop:
125 
126 1. Dequeues the buffer from DRM and returns it to the converter capture plane.
127  @note Because the DRM dequeue operation is a blocking call, you must make the
128  call in separate thread from the enqueue operation.
129 2. Detects whether EOS has been reached.
130 
131 
132 
133 
134 - - - - - - - - - - - - - - -
135 <a name="key">
136 ## Key Structure and Classes ##
137 
138 The following tables shows the key classes and functions that this sample uses.
139 
140 |Class |Description|
141 |-------|-----------|
142 |class @ref NvDrmRenderer | Contains elements and functions to render frames with tegra DRM.|
143 |class @ref NvVideoDecoder | Contains all video decoding-related elements and functions.|
144 |class @ref NvVideoConverter | Contains elements and functions for video format conversion.|
145 
146 <br>
147 
148 |Function|Description|
149 |--------|-----------|
150 |ui_render_loop_fcn | Thread function to render the UI image.|
151 |renderer_dequeue_loop_fcn | Thread function to dequeue the flipped frame from NvDrmRenderer().|
152 |conv0_capture_dqbuf_thread_callback | Callback function to enqueue a new frame into NvDrmRenderer. |
153 |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.