Skip to content

Commit 7906411

Browse files
committed
[Decode] Add AVC 10bit Dec for PTL
1 parent c657f1d commit 7906411

6 files changed

Lines changed: 78 additions & 8 deletions

File tree

_studio/mfx_lib/decode/h264/src/mfx_h264_dec_decode.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,11 @@ mfxStatus VideoDECODEH264::Init(mfxVideoParam *par)
222222

223223
eMFXHWType type = m_core->GetHWType();
224224

225+
if (par->mfx.FrameInfo.FourCC == MFX_FOURCC_P010 ||
226+
par->mfx.FrameInfo.FourCC == MFX_FOURCC_P210 ||
227+
par->mfx.FrameInfo.FourCC == MFX_FOURCC_Y210)
228+
par->mfx.FrameInfo.Shift = 1;
229+
225230
mfxStatus mfxSts = CheckVideoParamDecoders(par, type);
226231
MFX_CHECK(mfxSts >= MFX_ERR_NONE, MFX_ERR_INVALID_VIDEO_PARAM);
227232

@@ -405,6 +410,8 @@ mfxStatus VideoDECODEH264::QueryImplsDescription(
405410
#endif
406411
, MFX_PROFILE_AVC_MULTIVIEW_HIGH
407412
, MFX_PROFILE_AVC_STEREO_HIGH
413+
, MFX_PROFILE_AVC_HIGH10
414+
, MFX_PROFILE_AVC_HIGH_422
408415
};
409416
const mfxResourceType SupportedMemTypes[] =
410417
{
@@ -414,6 +421,8 @@ mfxStatus VideoDECODEH264::QueryImplsDescription(
414421
const mfxU32 SupportedFourCC[] =
415422
{
416423
MFX_FOURCC_NV12
424+
, MFX_FOURCC_P010
425+
, MFX_FOURCC_Y210
417426
};
418427

419428
caps.CodecID = MFX_CODEC_AVC;
@@ -807,6 +816,15 @@ mfxStatus VideoDECODEH264::GetVideoParam(mfxVideoParam *par)
807816
}
808817
}
809818

819+
switch (par->mfx.FrameInfo.FourCC)
820+
{
821+
case MFX_FOURCC_P010:
822+
case MFX_FOURCC_P210:
823+
case MFX_FOURCC_Y210:
824+
par->mfx.FrameInfo.Shift = 1;
825+
default:
826+
break;
827+
}
810828

811829
TRACE_EVENT(MFX_TRACE_API_DECODE_GETVIDEOPARAM_TASK, EVENT_TYPE_END, TR_KEY_MFX_API, make_event_data(MFX_ERR_NONE));
812830

_studio/mfx_lib/shared/include/mfx_platform_caps.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,14 @@ namespace H264DCaps {
273273
{
274274
return platform < MFX_HW_XE_HP_SDV;
275275
}
276+
inline bool IsDec420TenBitSupported(eMFXHWType platform)
277+
{
278+
return (platform >= MFX_HW_PTL);
279+
}
280+
inline bool IsDec422TenBitSupported(eMFXHWType platform)
281+
{
282+
return (platform >= MFX_HW_PTL);
283+
}
276284
}
277285
#endif // MFX_ENABLE_H264_VIDEO_DECODE
278286
#endif // __MFX_PLATFORM_CAPS_H__

_studio/mfx_lib/shared/src/mfx_common_int.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,8 @@ mfxStatus CheckFrameInfoCodecs(mfxFrameInfo *info, mfxU32 codecId)
273273
if (info->FourCC != MFX_FOURCC_NV12 &&
274274
info->FourCC != MFX_FOURCC_P010 &&
275275
info->FourCC != MFX_FOURCC_NV16 &&
276-
info->FourCC != MFX_FOURCC_P210)
276+
info->FourCC != MFX_FOURCC_P210 &&
277+
info->FourCC != MFX_FOURCC_Y210)
277278
MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM);
278279
break;
279280
case MFX_CODEC_HEVC:

_studio/shared/src/libmfx_core_hw.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,12 @@ mfxU32 ChooseProfile(mfxVideoParam const* param, eMFXHWType hwType)
6060
}
6161
#endif
6262
}
63+
64+
if (param->mfx.CodecProfile == MFX_PROFILE_AVC_HIGH10 ||
65+
param->mfx.CodecProfile == MFX_PROFILE_AVC_HIGH_422)
66+
{
67+
profile |= VA_PROFILE_REXT | VA_PROFILE_10;
68+
}
6369
break;
6470

6571
case MFX_CODEC_JPEG:

_studio/shared/umc/codec/h264_dec/src/umc_h264_mfx_supplier.cpp

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -516,10 +516,13 @@ bool MFX_Utility::IsNeedPartialAcceleration(mfxVideoParam * par, eMFXHWType )
516516
if (par->mfx.SliceGroupsPresent) // Is FMO
517517
return true;
518518

519-
if (par->mfx.FrameInfo.FourCC != MFX_FOURCC_NV12) // yuv422 in SW only
519+
if (par->mfx.FrameInfo.FourCC != MFX_FOURCC_NV12
520+
&& par->mfx.FrameInfo.FourCC != MFX_FOURCC_P210
521+
&& par->mfx.FrameInfo.FourCC != MFX_FOURCC_P010
522+
&& par->mfx.FrameInfo.FourCC != MFX_FOURCC_Y210)
520523
return true;
521524

522-
if (par->mfx.FrameInfo.BitDepthLuma > 8 || par->mfx.FrameInfo.BitDepthChroma > 8) // yuv422 in SW only
525+
if (par->mfx.FrameInfo.BitDepthLuma > 10 || par->mfx.FrameInfo.BitDepthChroma > 10)
523526
return true;
524527

525528
mfxExtMVCSeqDesc * points = (mfxExtMVCSeqDesc*)GetExtendedBuffer(par->ExtParam, par->NumExtParam, MFX_EXTBUFF_MVC_SEQ_DESC);
@@ -569,6 +572,17 @@ UMC::Status MFX_Utility::FillVideoParam(UMC::TaskSupplier * supplier, mfxVideoPa
569572
if (pps)
570573
par->mfx.SliceGroupsPresent = pps->num_slice_groups > 1;
571574

575+
if (par->mfx.FrameInfo.FourCC == MFX_FOURCC_P010
576+
|| par->mfx.FrameInfo.FourCC == MFX_FOURCC_P210
577+
|| par->mfx.FrameInfo.FourCC == MFX_FOURCC_Y210)
578+
{
579+
par->mfx.FrameInfo.Shift = 1;
580+
}
581+
else
582+
{
583+
par->mfx.FrameInfo.Shift = 0;
584+
}
585+
572586
return UMC::UMC_OK;
573587
}
574588

@@ -1158,7 +1172,11 @@ inline bool CheckFourcc(mfxU32 fourcc, mfxU16 codecProfile, eMFXHWType type)
11581172
#endif
11591173
case MFX_PROFILE_AVC_MULTIVIEW_HIGH:
11601174
case MFX_PROFILE_AVC_STEREO_HIGH:
1161-
return fourcc == MFX_FOURCC_NV12;
1175+
return (fourcc == MFX_FOURCC_NV12);
1176+
case MFX_PROFILE_AVC_HIGH10: //High10 may have 8bit clip.
1177+
return H264DCaps::IsDec420TenBitSupported(type) ? (fourcc == MFX_FOURCC_NV12 || fourcc == MFX_FOURCC_P010) : (fourcc == MFX_FOURCC_NV12);
1178+
case MFX_PROFILE_AVC_HIGH_422: //HIGH_422 may have 420 clip
1179+
return H264DCaps::IsDec422TenBitSupported(type) ? (fourcc == MFX_FOURCC_NV12 || fourcc == MFX_FOURCC_P010 || fourcc == MFX_FOURCC_Y210) : (fourcc == MFX_FOURCC_NV12);
11621180
default:
11631181
return false;
11641182
}
@@ -1196,7 +1214,9 @@ mfxStatus MFX_Utility::Query(VideoCORE *core, mfxVideoParam *in, mfxVideoParam *
11961214
(MFX_PROFILE_AVC_SCALABLE_HIGH == in->mfx.CodecProfile) ||
11971215
#endif
11981216
(MFX_PROFILE_AVC_MULTIVIEW_HIGH == in->mfx.CodecProfile) ||
1199-
(MFX_PROFILE_AVC_STEREO_HIGH == in->mfx.CodecProfile)
1217+
(MFX_PROFILE_AVC_STEREO_HIGH == in->mfx.CodecProfile) ||
1218+
(MFX_PROFILE_AVC_HIGH_422 == in->mfx.CodecProfile) ||
1219+
(MFX_PROFILE_AVC_HIGH10 == in->mfx.CodecProfile)
12001220
)
12011221
out->mfx.CodecProfile = in->mfx.CodecProfile;
12021222
else
@@ -1340,6 +1360,9 @@ mfxStatus MFX_Utility::Query(VideoCORE *core, mfxVideoParam *in, mfxVideoParam *
13401360
sts = MFX_ERR_UNSUPPORTED;
13411361
}
13421362

1363+
out->mfx.FrameInfo.BitDepthLuma = in->mfx.FrameInfo.BitDepthLuma;
1364+
out->mfx.FrameInfo.BitDepthChroma = in->mfx.FrameInfo.BitDepthChroma;
1365+
13431366
out->mfx.FrameInfo.Shift = in->mfx.FrameInfo.Shift;
13441367
switch (in->mfx.FrameInfo.PicStruct)
13451368
{
@@ -1772,6 +1795,8 @@ bool MFX_Utility::CheckVideoParam(mfxVideoParam *in, eMFXHWType type)
17721795
case MFX_PROFILE_AVC_MAIN:
17731796
case MFX_PROFILE_AVC_EXTENDED:
17741797
case MFX_PROFILE_AVC_HIGH:
1798+
case MFX_PROFILE_AVC_HIGH10:
1799+
case MFX_PROFILE_AVC_HIGH_422:
17751800
case MFX_PROFILE_AVC_STEREO_HIGH:
17761801
case MFX_PROFILE_AVC_MULTIVIEW_HIGH:
17771802
#ifdef MFX_ENABLE_SVC_VIDEO_DECODE
@@ -1814,9 +1839,8 @@ bool MFX_Utility::CheckVideoParam(mfxVideoParam *in, eMFXHWType type)
18141839
if (in->mfx.FrameInfo.Height > 16384 || (in->mfx.FrameInfo.Height % 16))
18151840
return false;
18161841

1817-
18181842
if (in->mfx.FrameInfo.FourCC != MFX_FOURCC_NV12 && in->mfx.FrameInfo.FourCC != MFX_FOURCC_NV16 &&
1819-
in->mfx.FrameInfo.FourCC != MFX_FOURCC_P010 && in->mfx.FrameInfo.FourCC != MFX_FOURCC_P210)
1843+
in->mfx.FrameInfo.FourCC != MFX_FOURCC_P010 && in->mfx.FrameInfo.FourCC != MFX_FOURCC_P210 && in->mfx.FrameInfo.FourCC != MFX_FOURCC_Y210)
18201844
return false;
18211845

18221846
// both zero or not zero
@@ -1842,7 +1866,7 @@ bool MFX_Utility::CheckVideoParam(mfxVideoParam *in, eMFXHWType type)
18421866

18431867
if (in->mfx.FrameInfo.ChromaFormat == MFX_CHROMAFORMAT_YUV422)
18441868
{
1845-
if (in->mfx.FrameInfo.FourCC != MFX_FOURCC_P210 && in->mfx.FrameInfo.FourCC != MFX_FOURCC_NV16)
1869+
if (in->mfx.FrameInfo.FourCC != MFX_FOURCC_P210 && in->mfx.FrameInfo.FourCC != MFX_FOURCC_Y210 && in->mfx.FrameInfo.FourCC != MFX_FOURCC_NV16)
18461870
return false;
18471871
}
18481872

_studio/shared/umc/io/umc_va/src/umc_va_linux.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,16 @@ VAProfile g_H264Profiles[] =
141141
VAProfileH264High, VAProfileH264Main, VAProfileH264ConstrainedBaseline
142142
};
143143

144+
VAProfile g_H26410BitProfiles[] =
145+
{
146+
#if VA_CHECK_VERSION(1, 18, 0)
147+
VAProfileH264High10,
148+
#endif
149+
#if VA_CHECK_VERSION(1, 23, 0)
150+
VAProfileH264High422,
151+
#endif
152+
};
153+
144154
VAProfile g_H265Profiles[] =
145155
{
146156
VAProfileHEVCMain
@@ -211,6 +221,9 @@ VAProfile get_next_va_profile(uint32_t umc_codec, uint32_t profile)
211221
case UMC::VA_H264:
212222
if (profile < UMC_ARRAY_SIZE(g_H264Profiles)) va_profile = g_H264Profiles[profile];
213223
break;
224+
case UMC::VA_H264 | UMC::VA_PROFILE_REXT | UMC::VA_PROFILE_10:
225+
if (profile < UMC_ARRAY_SIZE(g_H26410BitProfiles)) va_profile = g_H26410BitProfiles[profile];
226+
break;
214227
case UMC::VA_H265:
215228
if (profile < UMC_ARRAY_SIZE(g_H265Profiles)) va_profile = g_H265Profiles[profile];
216229
break;

0 commit comments

Comments
 (0)