Skip to content

Commit

Permalink
Eliminate rounding errors when handling HDR metadata
Browse files Browse the repository at this point in the history
  • Loading branch information
thexai committed Jan 6, 2020
1 parent ef8ace0 commit ac6e6b8
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 23 deletions.
34 changes: 12 additions & 22 deletions xbmc/cores/VideoPlayer/VideoRenderers/windows/RendererBase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -532,39 +532,29 @@ AVPixelFormat CRendererBase::GetAVFormat(DXGI_FORMAT dxgi_format)

DXGI_HDR_METADATA_HDR10 CRendererBase::GetDXGIHDR10MetaData(CRenderBuffer* rb)
{
constexpr double FACTOR_1 = 50000.0;
constexpr double FACTOR_2 = 10000.0;
DXGI_HDR_METADATA_HDR10 hdr10 = {};

if (rb->displayMetadata.has_primaries)
{
hdr10.RedPrimary[0] =
static_cast<uint16_t>(FACTOR_1 * av_q2d(rb->displayMetadata.display_primaries[0][0]));
hdr10.RedPrimary[1] =
static_cast<uint16_t>(FACTOR_1 * av_q2d(rb->displayMetadata.display_primaries[0][1]));
hdr10.GreenPrimary[0] =
static_cast<uint16_t>(FACTOR_1 * av_q2d(rb->displayMetadata.display_primaries[1][0]));
hdr10.GreenPrimary[1] =
static_cast<uint16_t>(FACTOR_1 * av_q2d(rb->displayMetadata.display_primaries[1][1]));
hdr10.BluePrimary[0] =
static_cast<uint16_t>(FACTOR_1 * av_q2d(rb->displayMetadata.display_primaries[2][0]));
hdr10.BluePrimary[1] =
static_cast<uint16_t>(FACTOR_1 * av_q2d(rb->displayMetadata.display_primaries[2][1]));
hdr10.WhitePoint[0] =
static_cast<uint16_t>(FACTOR_1 * av_q2d(rb->displayMetadata.white_point[0]));
hdr10.WhitePoint[1] =
static_cast<uint16_t>(FACTOR_1 * av_q2d(rb->displayMetadata.white_point[1]));
hdr10.RedPrimary[0] = static_cast<uint16_t>(rb->displayMetadata.display_primaries[0][0].num);
hdr10.RedPrimary[1] = static_cast<uint16_t>(rb->displayMetadata.display_primaries[0][1].num);
hdr10.GreenPrimary[0] = static_cast<uint16_t>(rb->displayMetadata.display_primaries[1][0].num);
hdr10.GreenPrimary[1] = static_cast<uint16_t>(rb->displayMetadata.display_primaries[1][1].num);
hdr10.BluePrimary[0] = static_cast<uint16_t>(rb->displayMetadata.display_primaries[2][0].num);
hdr10.BluePrimary[1] = static_cast<uint16_t>(rb->displayMetadata.display_primaries[2][1].num);
hdr10.WhitePoint[0] = static_cast<uint16_t>(rb->displayMetadata.white_point[0].num);
hdr10.WhitePoint[1] = static_cast<uint16_t>(rb->displayMetadata.white_point[1].num);
}
if (rb->displayMetadata.has_luminance)
{
hdr10.MaxMasteringLuminance =
static_cast<uint32_t>(FACTOR_2 * av_q2d(rb->displayMetadata.max_luminance));
hdr10.MinMasteringLuminance =
static_cast<uint32_t>(FACTOR_2 * av_q2d(rb->displayMetadata.min_luminance));
hdr10.MaxMasteringLuminance = static_cast<uint32_t>(rb->displayMetadata.max_luminance.num);
hdr10.MinMasteringLuminance = static_cast<uint32_t>(rb->displayMetadata.min_luminance.num);
}
if (rb->hasLightMetadata)
{
hdr10.MaxContentLightLevel = static_cast<uint16_t>(rb->lightMetadata.MaxCLL);
hdr10.MaxFrameAverageLightLevel = static_cast<uint16_t>(rb->lightMetadata.MaxFALL);
}

return hdr10;
}
11 changes: 10 additions & 1 deletion xbmc/rendering/dx/DeviceResources.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1139,6 +1139,15 @@ void DX::DeviceResources::SetHdrMetaData(DXGI_HDR_METADATA_HDR10& hdr10) const
{
if (SUCCEEDED(swapChain4->SetHDRMetaData(DXGI_HDR_METADATA_TYPE_HDR10, sizeof(hdr10), &hdr10)))
{
CLog::LogF(LOGNOTICE,
"(raw) RP {0} {1} | GP {2} {3} | BP {4} {5} | WP {6} {7} | Max ML {8} | min ML "
"{9} | Max CLL {10} | Max FALL {11}",
hdr10.RedPrimary[0], hdr10.RedPrimary[1], hdr10.GreenPrimary[0],
hdr10.GreenPrimary[1], hdr10.BluePrimary[0], hdr10.BluePrimary[1],
hdr10.WhitePoint[0], hdr10.WhitePoint[1], hdr10.MaxMasteringLuminance,
hdr10.MinMasteringLuminance, hdr10.MaxContentLightLevel,
hdr10.MaxFrameAverageLightLevel);

constexpr double FACTOR_1 = 50000.0;
constexpr double FACTOR_2 = 10000.0;
const double RP_0 = static_cast<double>(hdr10.RedPrimary[0]) / FACTOR_1;
Expand All @@ -1155,7 +1164,7 @@ void DX::DeviceResources::SetHdrMetaData(DXGI_HDR_METADATA_HDR10& hdr10) const
CLog::LogF(LOGNOTICE,
"RP {0:0.3f} {1:0.3f} | GP {2:0.3f} {3:0.3f} | BP "
"{4:0.3f} {5:0.3f} | WP {6:0.3f} "
"{7:0.3f} | MAX ML {8:0.0f} "
"{7:0.3f} | Max ML {8:0.0f} "
"| min ML {9:0.3f} | Max CLL {10:d} | Max FALL {11:d}",
RP_0, RP_1, GP_0, GP_1, BP_0, BP_1, WP_0, WP_1, Max_ML, min_ML,
hdr10.MaxContentLightLevel, hdr10.MaxFrameAverageLightLevel);
Expand Down

0 comments on commit ac6e6b8

Please sign in to comment.