vdr-plugin-softhddevice-drm-gles 1.6.4-d0291bb
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
34
39
41static inline uint16_t EncodeXYY(float xyy)
42{
43 return static_cast<uint16_t>(xyy * 50000.0f + 0.5f);
44}
45
59{
60 if (!m_pRender->CanHandleHdr())
61 return -1;
62
63 // clean up FFmpeg stuff
66
68 return -1;
69
71 if (sd1)
72 mdMetadata = reinterpret_cast<AVMasteringDisplayMetadata *>(sd1->data);
73
75 if (sd2)
76 clMetadata = reinterpret_cast<AVContentLightMetadata *>(sd2->data);
77
80 return -1;
81 }
82 } else if (clMetadata && !memcmp(clMetadata, &m_clMetadata, sizeof(m_clMetadata))) {
83 return -1;
84 }
85
86 if (clMetadata)
88 if (mdMetadata)
90
91 LOGDEBUG2(L_DRM, "HDR %s: Update HDR to TRC %d color %d", __FUNCTION__, colorTrc, colorPrimaries);
92
95
97 switch (colorTrc) {
98 case AVCOL_TRC_BT2020_10: // 14
100 case AVCOL_TRC_ARIB_STD_B67: // 18 HLG
101 eotf = EOTF_HLG;
102 break;
103 case AVCOL_TRC_SMPTE2084: // 16
105 break;
106 case AVCOL_TRC_BT709: // 1
107 case AVCOL_TRC_UNSPECIFIED: // 2
108 default:
110 break;
111 }
112
113 struct colorspace *cs;
114 switch (colorPrimaries) {
115 case AVCOL_PRI_BT2020: // 9
116 cs = colorspace_lookup("BT.2020");
117 break;
118 case AVCOL_PRI_BT470BG: // 5
119 cs = colorspace_lookup("BT.470 B/G"); // BT.601
120 break;
121 case AVCOL_PRI_BT709: // 1
122 case AVCOL_PRI_UNSPECIFIED: // 2
123 default:
124 cs = colorspace_lookup("BT.709");
125 break;
126 }
127
128 int maxLum = 4000;
129 int minLum = 0050;
130 if (mdMetadata) { // we got Metadata
131 if (mdMetadata->has_primaries) {
132 LOGDEBUG2(L_DRM, "HDR %s: Mastering Display Metadata:", __FUNCTION__);
133 LOGDEBUG2(L_DRM, "HDR %s: has_primaries: %d has_luminance: %d", __FUNCTION__,
134 mdMetadata->has_primaries, mdMetadata->has_luminance);
135 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__,
136 av_q2d(mdMetadata->display_primaries[0][0]), av_q2d(mdMetadata->display_primaries[0][1]), av_q2d(mdMetadata->display_primaries[1][0]),
137 av_q2d(mdMetadata->display_primaries[1][1]), av_q2d(mdMetadata->display_primaries[2][0]), av_q2d(mdMetadata->display_primaries[2][1]),
138 av_q2d(mdMetadata->white_point[0]), av_q2d(mdMetadata->white_point[1]));
139 LOGDEBUG2(L_DRM, "HDR %s: min_luminance= %f, max_luminance= %f", __FUNCTION__,
140 av_q2d(mdMetadata->min_luminance), av_q2d(mdMetadata->max_luminance));
141
142 cs = &m_hdr10;
143 cs->r.f[0] = (float)mdMetadata->display_primaries[0][0].num / (float)mdMetadata->display_primaries[0][0].den;
144 cs->r.f[1] = (float)mdMetadata->display_primaries[0][1].num / (float)mdMetadata->display_primaries[0][1].den;
145 cs->g.f[0] = (float)mdMetadata->display_primaries[1][0].num / (float)mdMetadata->display_primaries[1][0].den;
146 cs->g.f[1] = (float)mdMetadata->display_primaries[1][1].num / (float)mdMetadata->display_primaries[1][1].den;
147 cs->b.f[0] = (float)mdMetadata->display_primaries[2][0].num / (float)mdMetadata->display_primaries[2][0].den;
148 cs->b.f[1] = (float)mdMetadata->display_primaries[2][1].num / (float)mdMetadata->display_primaries[2][1].den;
149 cs->whitepoint.f[0] = (float)mdMetadata->white_point[0].num / (float)mdMetadata->white_point[0].den;
150 cs->whitepoint.f[1] = (float)mdMetadata->white_point[1].num / (float)mdMetadata->white_point[1].den;
151 }
152 if (mdMetadata->has_luminance) {
153 maxLum = static_cast<uint16_t>(av_q2d(mdMetadata->max_luminance) + 0.5);
154 minLum = static_cast<uint16_t>(av_q2d(mdMetadata->min_luminance) * 10000 + 0.5);
155 LOGDEBUG2(L_DRM, "HDR %s: maxLum %d minLum %d", __FUNCTION__, maxLum, minLum);
156 }
157 }
158
159 int maxCLL = 1500;
160 int maxFALL = 400;
161 if (clMetadata) {
162 maxCLL = clMetadata->MaxCLL;
163 maxFALL = clMetadata->MaxFALL;
164 LOGDEBUG2(L_DRM, "HDR %s: Has maxCLL %d maxFALL %d", __FUNCTION__, maxCLL, maxFALL);
165 }
166
167 data->metadata_type = METADATA_TYPE1;
168 data->hdmi_metadata_type1.eotf = eotf;
169 data->hdmi_metadata_type1.metadata_type = METADATA_TYPE1;
170 data->hdmi_metadata_type1.display_primaries[0].x = EncodeXYY(cs->r.f[0]);
171 data->hdmi_metadata_type1.display_primaries[0].y = EncodeXYY(cs->r.f[1]);
172 data->hdmi_metadata_type1.display_primaries[1].x = EncodeXYY(cs->g.f[0]);
173 data->hdmi_metadata_type1.display_primaries[1].y = EncodeXYY(cs->g.f[1]);
174 data->hdmi_metadata_type1.display_primaries[2].x = EncodeXYY(cs->b.f[0]);
175 data->hdmi_metadata_type1.display_primaries[2].y = EncodeXYY(cs->b.f[1]);
176 data->hdmi_metadata_type1.white_point.x = EncodeXYY(cs->whitepoint.f[0]);
177 data->hdmi_metadata_type1.white_point.y = EncodeXYY(cs->whitepoint.f[1]);
178 data->hdmi_metadata_type1.max_display_mastering_luminance = maxLum;
179 data->hdmi_metadata_type1.min_display_mastering_luminance = minLum;
180 data->hdmi_metadata_type1.max_cll = maxCLL;
181 data->hdmi_metadata_type1.max_fall = maxFALL;
182
183 LOGDEBUG2(L_DRM, "HDR %s: blob metadata set at %p", __FUNCTION__, data);
184
185 return 0;
186}
AVMasteringDisplayMetadata m_mdMetadata
saved mastering display metadata fron AVFrame sidedata
Definition drmhdr.h:120
AVContentLightMetadata m_clMetadata
saved content light metadata fron AVFrame sidedata
Definition drmhdr.h:121
int m_colorTrc
saved transfer charateristics
Definition drmhdr.h:119
cVideoRender * m_pRender
pointer to cVideoRender object
Definition drmhdr.h:117
int m_colorPrimaries
saved color primaries
Definition drmhdr.h:118
struct colorspace m_hdr10
hdr colorspace
Definition drmhdr.h:122
int Build(struct hdr_output_metadata *, int, int, AVFrameSideData *, AVFrameSideData *)
Build an HDR static metadata blob.
Definition drmhdr.cpp:58
bool CanHandleHdr(void)
Return true, if the device can handle HDR.
HDR (High Dynamic Range) Header File.
hdrMetadataEotf
Definition drmhdr.cpp:28
metadataId
Definition drmhdr.cpp:36
static struct colorspace * colorspace_lookup(const char *name)
Definition drmhdr.h:86
static uint16_t EncodeXYY(float xyy)
Definition drmhdr.cpp:41
@ EOTF_TRADITIONAL_GAMMA_HDR
Definition drmhdr.cpp:30
@ EOTF_HLG
Definition drmhdr.cpp:32
@ EOTF_ST2084
Definition drmhdr.cpp:31
@ EOTF_TRADITIONAL_GAMMA_SDR
Definition drmhdr.cpp:29
@ METADATA_TYPE1
Definition drmhdr.cpp:37
#define LOGDEBUG2
log to LOG_DEBUG and add a prefix
Definition logger.h:47
@ L_DRM
drm logs
Definition logger.h:60
Logger Header File.
float f[4]
Definition drmhdr.h:34
Video Renderer (Display) Header File.