Skip to content

Commit 0d0ba3c

Browse files
gfxVPLsdmpengxin99
andauthored
[Decode] Enable AV1 HDR extract from clips (#6206)
Co-authored-by: Yuan, Pengxin <[email protected]>
1 parent a7bc259 commit 0d0ba3c

File tree

5 files changed

+97
-0
lines changed

5 files changed

+97
-0
lines changed

_studio/mfx_lib/decode/av1/src/mfx_av1_dec_decode.cpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1343,6 +1343,40 @@ mfxStatus VideoDECODEAV1::FillOutputSurface(mfxFrameSurface1** surf_out, mfxFram
13431343
surface_out->Info.FrameRateExtD = isShouldUpdate ? m_init_par.mfx.FrameInfo.FrameRateExtD : m_first_par.mfx.FrameInfo.FrameRateExtD;
13441344
surface_out->Info.FrameRateExtN = isShouldUpdate ? m_init_par.mfx.FrameInfo.FrameRateExtN : m_first_par.mfx.FrameInfo.FrameRateExtN;
13451345

1346+
const UMC_AV1_DECODER::FrameHeader& fh = pFrame->GetFrameHeader();
1347+
// extract HDR MasteringDisplayColourVolume info
1348+
mfxExtMasteringDisplayColourVolume* display_colour = (mfxExtMasteringDisplayColourVolume*)GetExtendedBuffer(surface_out->Data.ExtParam, surface_out->Data.NumExtParam, MFX_EXTBUFF_MASTERING_DISPLAY_COLOUR_VOLUME);
1349+
if (display_colour && fh.meta_data.hdr_mdcv.existence)
1350+
{
1351+
for (size_t i = 0; i < 3; i++)
1352+
{
1353+
display_colour->DisplayPrimariesX[i] = (mfxU16)fh.meta_data.hdr_mdcv.display_primaries[i][0];
1354+
display_colour->DisplayPrimariesY[i] = (mfxU16)fh.meta_data.hdr_mdcv.display_primaries[i][1];
1355+
}
1356+
display_colour->WhitePointX = (mfxU16)fh.meta_data.hdr_mdcv.white_point[0];
1357+
display_colour->WhitePointY = (mfxU16)fh.meta_data.hdr_mdcv.white_point[1];
1358+
display_colour->MaxDisplayMasteringLuminance = (mfxU32)fh.meta_data.hdr_mdcv.max_luminance;
1359+
display_colour->MinDisplayMasteringLuminance = (mfxU32)fh.meta_data.hdr_mdcv.min_luminance;
1360+
display_colour->InsertPayloadToggle = MFX_PAYLOAD_IDR;
1361+
}
1362+
else if(display_colour)
1363+
{
1364+
display_colour->InsertPayloadToggle = MFX_PAYLOAD_OFF;
1365+
}
1366+
1367+
// extract HDR ContentLightLevel info
1368+
mfxExtContentLightLevelInfo* content_light = (mfxExtContentLightLevelInfo*)GetExtendedBuffer(surface_out->Data.ExtParam, surface_out->Data.NumExtParam, MFX_EXTBUFF_CONTENT_LIGHT_LEVEL_INFO);
1369+
if (content_light && fh.meta_data.hdr_cll.existence)
1370+
{
1371+
content_light->MaxContentLightLevel = (mfxU16)fh.meta_data.hdr_cll.max_content_light_level;
1372+
content_light->MaxPicAverageLightLevel = (mfxU16)fh.meta_data.hdr_cll.max_pic_average_light_level;
1373+
content_light->InsertPayloadToggle = MFX_PAYLOAD_IDR;
1374+
}
1375+
else if(content_light)
1376+
{
1377+
content_light->InsertPayloadToggle = MFX_PAYLOAD_OFF;
1378+
}
1379+
13461380
TRACE_BUFFER_EVENT(MFX_TRACE_API_AV1_OUTPUTINFO_TASK, EVENT_TYPE_INFO, TR_KEY_DECODE_BASIC_INFO,
13471381
surface_out, AV1DecodeSurfaceOutparam, SURFACEOUT_AV1D);
13481382

_studio/shared/umc/codec/av1_dec/include/umc_av1_bitstream.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ namespace UMC_AV1_DECODER
4848
uint64_t GetLE(uint32_t);
4949
void ReadSequenceHeader(SequenceHeader&);
5050
void ReadUncompressedHeader(FrameHeader&, SequenceHeader const&, DPBType const&, OBUHeader const&, uint32_t&);
51+
void ReadMetaData(FrameHeader& fh);
5152

5253
using UMC_VP9_DECODER::VP9Bitstream::VP9Bitstream;
5354

_studio/shared/umc/codec/av1_dec/include/umc_av1_dec_defs.h

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,17 @@ namespace UMC_AV1_DECODER
115115
OBU_PADDING = 15,
116116
};
117117

118+
/* OBU metadata types. */
119+
enum OBU_METADATA_TYPE
120+
{
121+
OBU_METADATA_TYPE_AOM_RESERVED_0 = 0,
122+
OBU_METADATA_TYPE_HDR_CLL = 1,
123+
OBU_METADATA_TYPE_HDR_MDCV = 2,
124+
OBU_METADATA_TYPE_SCALABILITY = 3,
125+
OBU_METADATA_TYPE_ITUT_T35 = 4,
126+
OBU_METADATA_TYPE_TIMECODE = 5,
127+
};
128+
118129
const uint32_t OBU_TILE_LIST_HEADER_LENGTH = 4;
119130
const uint32_t OBU_TILE_LIST_ENTRY_HEDAER_LENGTH = 5;
120131

@@ -548,6 +559,24 @@ namespace UMC_AV1_DECODER
548559
uint32_t FrameHeight;
549560
};
550561

562+
struct MetaData
563+
{
564+
struct MasteringDisplayColorVolume
565+
{
566+
bool existence;
567+
uint16_t display_primaries[3][2];
568+
uint16_t white_point[2];
569+
uint32_t max_luminance;
570+
uint32_t min_luminance;
571+
}hdr_mdcv;
572+
573+
struct ContentLightLevelInfo {
574+
bool existence;
575+
uint16_t max_content_light_level;
576+
uint16_t max_pic_average_light_level;
577+
}hdr_cll;
578+
};
579+
551580
struct FrameHeader
552581
{
553582
//Rev 0.85 parameters (AV1 spec version 1.0) in order of appearance/calculation in uncompressed_header()
@@ -632,6 +661,7 @@ namespace UMC_AV1_DECODER
632661
uint32_t enable_masked_compound;
633662
uint32_t enable_intra_edge_filter;
634663
uint32_t enable_filter_intra;
664+
MetaData meta_data;
635665
};
636666

637667
struct OBUHeader

_studio/shared/umc/codec/av1_dec/src/umc_av1_bitstream.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2026,6 +2026,35 @@ namespace UMC_AV1_DECODER
20262026
AV1D_LOG("[-]: %d", (uint32_t)BitsDecoded());
20272027
}
20282028

2029+
void AV1Bitstream::ReadMetaData(FrameHeader& fh)
2030+
{
2031+
const uint8_t MetaData_byte = (uint8_t)GetBits(8);
2032+
switch ((OBU_METADATA_TYPE)MetaData_byte)
2033+
{
2034+
case OBU_METADATA_TYPE_HDR_CLL:
2035+
fh.meta_data.hdr_cll.max_content_light_level = (uint16_t)GetBits(16);
2036+
fh.meta_data.hdr_cll.max_pic_average_light_level = (uint16_t)GetBits(16);
2037+
fh.meta_data.hdr_cll.existence = true;
2038+
break;
2039+
case OBU_METADATA_TYPE_HDR_MDCV:
2040+
for (size_t i = 0; i < 3; ++i)
2041+
{
2042+
fh.meta_data.hdr_mdcv.display_primaries[i][0] = (uint16_t)GetBits(16);
2043+
fh.meta_data.hdr_mdcv.display_primaries[i][1] = (uint16_t)GetBits(16);
2044+
}
2045+
// White point(x, y)
2046+
fh.meta_data.hdr_mdcv.white_point[0] = (uint16_t)GetBits(16);
2047+
fh.meta_data.hdr_mdcv.white_point[1] = (uint16_t)GetBits(16);
2048+
2049+
// Max and min luminance of mastering display
2050+
fh.meta_data.hdr_mdcv.max_luminance = (uint32_t)GetBits(32);
2051+
fh.meta_data.hdr_mdcv.min_luminance = (uint32_t)GetBits(32);
2052+
fh.meta_data.hdr_mdcv.existence = true;
2053+
default:
2054+
break;
2055+
}
2056+
}
2057+
20292058
} // namespace UMC_AV1_DECODER
20302059

20312060
#endif // MFX_ENABLE_AV1_VIDEO_DECODE

_studio/shared/umc/codec/av1_dec/src/umc_av1_decoder.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -817,6 +817,9 @@ namespace UMC_AV1_DECODER
817817
break;
818818
}
819819
}
820+
case OBU_METADATA:
821+
bs.ReadMetaData(fh);
822+
break;
820823
default:
821824
break;
822825
}

0 commit comments

Comments
 (0)