MythTV master
mythhdrvideometadata.cpp
Go to the documentation of this file.
1// MythTV
3#include "mythframe.h"
4
5// Std
6#include <cmath>
7
8// FFmpeg
9extern "C" {
10#include "libavutil/mastering_display_metadata.h"
11}
12
13static inline uint16_t UINT16(double x)
14{ return static_cast<uint16_t>(std::round(x)); }
15
27void MythHDRVideoMetadata::Update(const AVMasteringDisplayMetadata* Display,
28 const AVContentLightMetadata* Light)
29{
30 bool luminance = Display && Display->has_luminance;
31 bool primaries = Display && Display->has_primaries;
32 m_maxMasteringLuminance = luminance ? UINT16(av_q2d(Display->max_luminance)) : 0;
33 m_minMasteringLuminance = luminance ? UINT16(av_q2d(Display->min_luminance) * 10000) : 0;
34 m_whitePoint[0] = primaries ? UINT16(av_q2d(Display->white_point[0]) * 50000) : 0;
35 m_whitePoint[1] = primaries ? UINT16(av_q2d(Display->white_point[1]) * 50000) : 0;
36 for (size_t i = 0; i < 3; i++)
37 {
38 m_displayPrimaries[i][0] = primaries ? UINT16(av_q2d(Display->display_primaries[i][0]) * 50000) : 0;
39 m_displayPrimaries[i][1] = primaries ? UINT16(av_q2d(Display->display_primaries[i][1]) * 50000) : 0;
40 }
41 m_maxContentLightLevel = Light ? static_cast<uint16_t>(Light->MaxCLL) : 0;
42 m_maxFrameAverageLightLevel = Light ? static_cast<uint16_t>(Light->MaxFALL) : 0;
43}
44
48{
49 if (!Frame)
50 return;
51
52 if (AvFrame)
53 {
54 const auto * display = av_frame_get_side_data(AvFrame, AV_FRAME_DATA_MASTERING_DISPLAY_METADATA);
55 const auto * ddata = display ? reinterpret_cast<AVMasteringDisplayMetadata*>(display->data) : nullptr;
56 const auto * content = av_frame_get_side_data(AvFrame, AV_FRAME_DATA_CONTENT_LIGHT_LEVEL);
57 const auto * cdata = content ? reinterpret_cast<AVContentLightMetadata*>(content->data) : nullptr;
58 if (ddata || cdata)
59 {
60 if (!Frame->m_hdrMetadata.get())
61 Frame->m_hdrMetadata = std::make_shared<MythHDRVideoMetadata>();
62 Frame->m_hdrMetadata->Update(ddata, cdata);
63 return;
64 }
65 }
66 Frame->m_hdrMetadata = nullptr;
67}
AVFrame AVFrame
uint16_t m_maxFrameAverageLightLevel
Definition: mythhdr.h:27
uint16_t m_maxContentLightLevel
Definition: mythhdr.h:26
MythPrimariesUInt16 m_displayPrimaries
Definition: mythhdr.h:22
uint16_t m_minMasteringLuminance
Definition: mythhdr.h:25
MythPrimaryUInt16 m_whitePoint
Definition: mythhdr.h:23
uint16_t m_maxMasteringLuminance
Definition: mythhdr.h:24
void Update(const struct AVMasteringDisplayMetadata *Display, const struct AVContentLightMetadata *Light)
static void Populate(class MythVideoFrame *Frame, struct AVFrame *AvFrame)
Create, update or destroy HDR metadata for the given MythVideoFrame.
unsigned short uint16_t
Definition: iso6937tables.h:3
static uint16_t UINT16(double x)