MythTV  master
mythhdrvideometadata.cpp
Go to the documentation of this file.
1 // MythTV
2 #include "mythhdrvideometadata.h"
3 #include "mythframe.h"
4 
5 // Std
6 #include <cmath>
7 
8 // FFmpeg
9 extern "C" {
10 #include "libavutil/mastering_display_metadata.h"
11 }
12 
13 static inline uint16_t UINT16(double x)
14 { return static_cast<uint16_t>(std::round(x)); }
15 
27 void 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 }
MythHDRVideoMetadata::Populate
static void Populate(class MythVideoFrame *Frame, struct AVFrame *AvFrame)
Create, update or destroy HDR metadata for the given MythVideoFrame.
Definition: mythhdrvideometadata.cpp:47
MythHDRMetadata::m_displayPrimaries
MythPrimariesUInt16 m_displayPrimaries
Definition: mythhdr.h:22
MythHDRMetadata::m_maxContentLightLevel
uint16_t m_maxContentLightLevel
Definition: mythhdr.h:26
MythHDRMetadata::m_maxMasteringLuminance
uint16_t m_maxMasteringLuminance
Definition: mythhdr.h:24
Frame
Definition: zmdefines.h:93
build_compdb.content
content
Definition: build_compdb.py:38
mythhdrvideometadata.h
MythHDRVideoMetadata::Update
void Update(const struct AVMasteringDisplayMetadata *Display, const struct AVContentLightMetadata *Light)
Definition: mythhdrvideometadata.cpp:27
mythframe.h
AVFrame
struct AVFrame AVFrame
Definition: BorderDetector.h:15
MythHDRMetadata::m_minMasteringLuminance
uint16_t m_minMasteringLuminance
Definition: mythhdr.h:25
UINT16
static uint16_t UINT16(double x)
Definition: mythhdrvideometadata.cpp:13
MythHDRMetadata::m_maxFrameAverageLightLevel
uint16_t m_maxFrameAverageLightLevel
Definition: mythhdr.h:27
uint16_t
unsigned short uint16_t
Definition: iso6937tables.h:3
MythVideoFrame
Definition: mythframe.h:88
MythHDRMetadata::m_whitePoint
MythPrimaryUInt16 m_whitePoint
Definition: mythhdr.h:23