vdr-plugin-softhddevice-drm-gles 1.6.2
drmhdr.cpp
Go to the documentation of this file.
1// SPDX-License-Identifier: AGPL-3.0-or-later
2
16extern "C" {
17#include <libavutil/frame.h>
18#include <libavutil/mastering_display_metadata.h>
19}
20
21#include <drm_mode.h>
22
23#include "drmhdr.h"
24#include "logger.h"
25#include "videorender.h"
26
38
42
43static inline uint16_t EncodeXYY(float xyy)
44{
45 return static_cast<uint16_t>(xyy * 50000.0f + 0.5f);
46}
47
61{
62 if (!m_pRender->CanHandleHdr())
63 return -1;
64
65 // clean up FFmpeg stuff
68
70 return -1;
71
73 if (sd1)
74 mdMetadata = reinterpret_cast<AVMasteringDisplayMetadata *>(sd1->data);
75
77 if (sd2)
78 clMetadata = reinterpret_cast<AVContentLightMetadata *>(sd2->data);
79
82 return -1;
83 }
84 } else if (clMetadata && !memcmp(clMetadata, &m_clMetadata, sizeof(m_clMetadata))) {
85 return -1;
86 }
87
88 if (clMetadata)
90 if (mdMetadata)
92
93 LOGDEBUG2(L_DRM, "HDR %s: Update HDR to TRC %d color %d", __FUNCTION__, colorTrc, colorPrimaries);
94
97
99 switch (colorTrc) {
100 case AVCOL_TRC_BT2020_10: // 14
102 case AVCOL_TRC_ARIB_STD_B67: // 18 HLG
103 eotf = EOTF_HLG;
104 break;
105 case AVCOL_TRC_SMPTE2084: // 16
107 break;
108 case AVCOL_TRC_BT709: // 1
109 case AVCOL_TRC_UNSPECIFIED: // 2
110 default:
112 break;
113 }
114
115 struct colorspace *cs;
116 switch (colorPrimaries) {
117 case AVCOL_PRI_BT2020: // 9
118 cs = colorspace_lookup("BT.2020");
119 break;
120 case AVCOL_PRI_BT470BG: // 5
121 cs = colorspace_lookup("BT.470 B/G"); // BT.601
122 break;
123 case AVCOL_PRI_BT709: // 1
124 case AVCOL_PRI_UNSPECIFIED: // 2
125 default:
126 cs = colorspace_lookup("BT.709");
127 break;
128 }
129
130 int maxLum = 4000;
131 int minLum = 0050;
132 if (mdMetadata) { // we got Metadata
133 if (mdMetadata->has_primaries) {
134 LOGDEBUG2(L_DRM, "HDR %s: Mastering Display Metadata:", __FUNCTION__);
135 LOGDEBUG2(L_DRM, "HDR %s: has_primaries: %d has_luminance: %d", __FUNCTION__,
136 mdMetadata->has_primaries, mdMetadata->has_luminance);
137 LOGDEBUG2(L_DRM, "HDR %s: r(%5.4f,%5.4f) g(%5.4f,%5.4f) b(%5.4f %5.4f) wp(%5.4f, %5.4f)", __FUNCTION__,
138 av_q2d(mdMetadata->display_primaries[0][0]), av_q2d(mdMetadata->display_primaries[0][1]), av_q2d(mdMetadata->display_primaries[1][0]),
139 av_q2d(mdMetadata->display_primaries[1][1]), av_q2d(mdMetadata->display_primaries[2][0]), av_q2d(mdMetadata->display_primaries[2][1]),
140 av_q2d(mdMetadata->white_point[0]), av_q2d(mdMetadata->white_point[1]));
141 LOGDEBUG2(L_DRM, "HDR %s: min_luminance= %f, max_luminance= %f", __FUNCTION__,
142 av_q2d(mdMetadata->min_luminance), av_q2d(mdMetadata->max_luminance));
143
144 cs = &m_hdr10;
145 cs->r.f[0] = (float)mdMetadata->display_primaries[0][0].num / (float)mdMetadata->display_primaries[0][0].den;
146 cs->r.f[1] = (float)mdMetadata->display_primaries[0][1].num / (float)mdMetadata->display_primaries[0][1].den;
147 cs->g.f[0] = (float)mdMetadata->display_primaries[1][0].num / (float)mdMetadata->display_primaries[1][0].den;
148 cs->g.f[1] = (float)mdMetadata->display_primaries[1][1].num / (float)mdMetadata->display_primaries[1][1].den;
149 cs->b.f[0] = (float)mdMetadata->display_primaries[2][0].num / (float)mdMetadata->display_primaries[2][0].den;
150 cs->b.f[1] = (float)mdMetadata->display_primaries[2][1].num / (float)mdMetadata->display_primaries[2][1].den;
151 cs->whitepoint.f[0] = (float)mdMetadata->white_point[0].num / (float)mdMetadata->white_point[0].den;
152 cs->whitepoint.f[1] = (float)mdMetadata->white_point[1].num / (float)mdMetadata->white_point[1].den;
153 }
154 if (mdMetadata->has_luminance) {
155 maxLum = static_cast<uint16_t>(av_q2d(mdMetadata->max_luminance) + 0.5);
156 minLum = static_cast<uint16_t>(av_q2d(mdMetadata->min_luminance) * 10000 + 0.5);
157 LOGDEBUG2(L_DRM, "HDR %s: maxLum %d minLum %d", __FUNCTION__, maxLum, minLum);
158 }
159 }
160
161 int maxCLL = 1500;
162 int maxFALL = 400;
163 if (clMetadata) {
164 maxCLL = clMetadata->MaxCLL;
165 maxFALL = clMetadata->MaxFALL;
166 LOGDEBUG2(L_DRM, "HDR %s: Has maxCLL %d maxFALL %d", __FUNCTION__, maxCLL, maxFALL);
167 }
168
169 data->metadata_type = METADATA_TYPE1;
170 data->hdmi_metadata_type1.eotf = eotf;
171 data->hdmi_metadata_type1.metadata_type = METADATA_TYPE1;
172 data->hdmi_metadata_type1.display_primaries[0].x = EncodeXYY(cs->r.f[0]);
173 data->hdmi_metadata_type1.display_primaries[0].y = EncodeXYY(cs->r.f[1]);
174 data->hdmi_metadata_type1.display_primaries[1].x = EncodeXYY(cs->g.f[0]);
175 data->hdmi_metadata_type1.display_primaries[1].y = EncodeXYY(cs->g.f[1]);
176 data->hdmi_metadata_type1.display_primaries[2].x = EncodeXYY(cs->b.f[0]);
177 data->hdmi_metadata_type1.display_primaries[2].y = EncodeXYY(cs->b.f[1]);
178 data->hdmi_metadata_type1.white_point.x = EncodeXYY(cs->whitepoint.f[0]);
179 data->hdmi_metadata_type1.white_point.y = EncodeXYY(cs->whitepoint.f[1]);
180 data->hdmi_metadata_type1.max_display_mastering_luminance = maxLum;
181 data->hdmi_metadata_type1.min_display_mastering_luminance = minLum;
182 data->hdmi_metadata_type1.max_cll = maxCLL;
183 data->hdmi_metadata_type1.max_fall = maxFALL;
184
185 LOGDEBUG2(L_DRM, "HDR %s: blob metadata set at %p", __FUNCTION__, data);
186
187 return 0;
188}
189
AVMasteringDisplayMetadata m_mdMetadata
saved mastering display metadata fron AVFrame sidedata
Definition drmhdr.h:116
AVContentLightMetadata m_clMetadata
saved content light metadata fron AVFrame sidedata
Definition drmhdr.h:117
int m_colorTrc
saved transfer charateristics
Definition drmhdr.h:115
cVideoRender * m_pRender
pointer to cVideoRender object
Definition drmhdr.h:113
int m_colorPrimaries
saved color primaries
Definition drmhdr.h:114
struct colorspace m_hdr10
hdr colorspace
Definition drmhdr.h:118
HDR (High Dynamic Range) Header File.
hdrMetadataEotf
Definition drmhdr.cpp:32
metadataId
Definition drmhdr.cpp:39
static struct colorspace * colorspace_lookup(const char *name)
Definition drmhdr.h:86
static uint16_t EncodeXYY(float xyy)
Definition drmhdr.cpp:43
int Build(struct hdr_output_metadata *, int, int, AVFrameSideData *, AVFrameSideData *)
Build an HDR static metadata blob.
Definition drmhdr.cpp:60
@ EOTF_TRADITIONAL_GAMMA_HDR
Definition drmhdr.cpp:34
@ EOTF_HLG
Definition drmhdr.cpp:36
@ EOTF_ST2084
Definition drmhdr.cpp:35
@ EOTF_TRADITIONAL_GAMMA_SDR
Definition drmhdr.cpp:33
@ METADATA_TYPE1
Definition drmhdr.cpp:40
#define LOGDEBUG2
log to LOG_DEBUG and add a prefix
Definition logger.h:42
@ L_DRM
drm logs
Definition logger.h:55
bool CanHandleHdr(void)
Logger Header File.
float f[4]
Definition drmhdr.h:34
Video Renderer (Display) Header File.