L4T Multimedia API Reference

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