From 42a15be8a931c5049310d4e7796db479d4573f58 Mon Sep 17 00:00:00 2001 From: "Yew, Chang Ching" Date: Wed, 10 Nov 2021 14:20:47 +0800 Subject: onevpl-intel-gpu: Add VDSFC CSC support Signed-off-by: Yew, Chang Ching Signed-off-by: Anuj Mittal --- ...ame-info-check-and-update-ChromaFormat-in.patch | 98 ++++++++++++ ...rame-info-check-and-update-ChromaFormat-i.patch | 173 +++++++++++++++++++++ .../onevpl/onevpl-intel-gpu_21.3.4.bb | 2 + 3 files changed, 273 insertions(+) create mode 100644 recipes-multimedia/onevpl/onevpl-intel-gpu/0001-AVCd-Add-frame-info-check-and-update-ChromaFormat-in.patch create mode 100644 recipes-multimedia/onevpl/onevpl-intel-gpu/0001-HEVCd-Add-frame-info-check-and-update-ChromaFormat-i.patch (limited to 'recipes-multimedia') diff --git a/recipes-multimedia/onevpl/onevpl-intel-gpu/0001-AVCd-Add-frame-info-check-and-update-ChromaFormat-in.patch b/recipes-multimedia/onevpl/onevpl-intel-gpu/0001-AVCd-Add-frame-info-check-and-update-ChromaFormat-in.patch new file mode 100644 index 00000000..3c41c741 --- /dev/null +++ b/recipes-multimedia/onevpl/onevpl-intel-gpu/0001-AVCd-Add-frame-info-check-and-update-ChromaFormat-in.patch @@ -0,0 +1,98 @@ +From f23ba1b768a4db58ed985a0f066b65d9a65dd61b Mon Sep 17 00:00:00 2001 +From: "Yew, Chang Ching" +Date: Mon, 1 Nov 2021 13:28:06 +0000 +Subject: [PATCH 2/2] [AVCd] Add frame info check and update ChromaFormat in + FillOutputSurface for VDSFC CSC + +Upstream-Status: Submitted +innersource PR #3871 + +Signed-off-by: Yew, Chang Ching +--- + .../decode/h264/src/mfx_h264_dec_decode.cpp | 48 +++++++++---------- + 1 file changed, 24 insertions(+), 24 deletions(-) + +diff --git a/_studio/mfx_lib/decode/h264/src/mfx_h264_dec_decode.cpp b/_studio/mfx_lib/decode/h264/src/mfx_h264_dec_decode.cpp +index 84e57f7f18..8e51ad7852 100644 +--- a/_studio/mfx_lib/decode/h264/src/mfx_h264_dec_decode.cpp ++++ b/_studio/mfx_lib/decode/h264/src/mfx_h264_dec_decode.cpp +@@ -1140,12 +1140,8 @@ mfxStatus VideoDECODEH264::DecodeFrameCheck(mfxBitstream *bs, mfxFrameSurface1 * + isVideoProcCscEnabled = true; + } + #endif +- sts = CheckFrameInfoCodecs(&surface_work->Info, MFX_CODEC_AVC); +- //Decode CSC support more FourCC format, already checked in Init, skip the check return; +- if(!isVideoProcCscEnabled) +- { +- MFX_CHECK(sts == MFX_ERR_NONE, MFX_ERR_UNSUPPORTED); +- } ++ sts = isVideoProcCscEnabled ? CheckFrameInfoDecVideoProcCsc(&surface_work->Info, MFX_CODEC_AVC) : CheckFrameInfoCodecs(&surface_work->Info, MFX_CODEC_AVC); ++ MFX_CHECK(sts == MFX_ERR_NONE, MFX_ERR_INVALID_VIDEO_PARAM) + + sts = CheckFrameData(surface_work); + MFX_CHECK_STS(sts); +@@ -1420,11 +1416,6 @@ void VideoDECODEH264::FillOutputSurface(mfxFrameSurface1 **surf_out, mfxFrameSur + } + #endif + +- surface_out->Info.CropH = (mfxU16)(pFrame->lumaSize().height - pFrame->m_crop_bottom - pFrame->m_crop_top); +- surface_out->Info.CropW = (mfxU16)(pFrame->lumaSize().width - pFrame->m_crop_right - pFrame->m_crop_left); +- surface_out->Info.CropX = (mfxU16)(pFrame->m_crop_left); +- surface_out->Info.CropY = (mfxU16)(pFrame->m_crop_top); +- + #ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE + mfxExtDecVideoProcessing * videoProcessing = (mfxExtDecVideoProcessing *)GetExtendedBuffer(m_vFirstPar.ExtParam, m_vFirstPar.NumExtParam, MFX_EXTBUFF_DEC_VIDEO_PROCESSING); + if (videoProcessing) +@@ -1433,8 +1424,28 @@ void VideoDECODEH264::FillOutputSurface(mfxFrameSurface1 **surf_out, mfxFrameSur + surface_out->Info.CropW = videoProcessing->Out.CropW; + surface_out->Info.CropX = videoProcessing->Out.CropX; + surface_out->Info.CropY = videoProcessing->Out.CropY; +- } ++ surface_out->Info.ChromaFormat = videoProcessing->Out.ChromaFormat; ++ } else + #endif ++ { ++ surface_out->Info.CropH = (mfxU16)(pFrame->lumaSize().height - pFrame->m_crop_bottom - pFrame->m_crop_top); ++ surface_out->Info.CropW = (mfxU16)(pFrame->lumaSize().width - pFrame->m_crop_right - pFrame->m_crop_left); ++ surface_out->Info.CropX = (mfxU16)(pFrame->m_crop_left); ++ surface_out->Info.CropY = (mfxU16)(pFrame->m_crop_top); ++ ++ switch(pFrame->m_chroma_format) ++ { ++ case 0: ++ surface_out->Info.ChromaFormat = MFX_CHROMAFORMAT_YUV400; ++ break; ++ case 2: ++ surface_out->Info.ChromaFormat = MFX_CHROMAFORMAT_YUV422; ++ break; ++ default: ++ surface_out->Info.ChromaFormat = MFX_CHROMAFORMAT_YUV420; ++ break; ++ } ++ } + + bool isShouldUpdate = !(m_vFirstPar.mfx.FrameInfo.AspectRatioH || m_vFirstPar.mfx.FrameInfo.AspectRatioW); + +@@ -1447,18 +1458,7 @@ void VideoDECODEH264::FillOutputSurface(mfxFrameSurface1 **surf_out, mfxFrameSur + surface_out->Info.FrameRateExtN = isShouldUpdate ? m_vPar.mfx.FrameInfo.FrameRateExtN : m_vFirstPar.mfx.FrameInfo.FrameRateExtN; + + surface_out->Info.PicStruct = 0; +- switch(pFrame->m_chroma_format) +- { +- case 0: +- surface_out->Info.ChromaFormat = MFX_CHROMAFORMAT_YUV400; +- break; +- case 2: +- surface_out->Info.ChromaFormat = MFX_CHROMAFORMAT_YUV422; +- break; +- default: +- surface_out->Info.ChromaFormat = MFX_CHROMAFORMAT_YUV420; +- break; +- } ++ + + switch (pFrame->m_displayPictureStruct) + { +-- +2.33.1 + diff --git a/recipes-multimedia/onevpl/onevpl-intel-gpu/0001-HEVCd-Add-frame-info-check-and-update-ChromaFormat-i.patch b/recipes-multimedia/onevpl/onevpl-intel-gpu/0001-HEVCd-Add-frame-info-check-and-update-ChromaFormat-i.patch new file mode 100644 index 00000000..69ce1369 --- /dev/null +++ b/recipes-multimedia/onevpl/onevpl-intel-gpu/0001-HEVCd-Add-frame-info-check-and-update-ChromaFormat-i.patch @@ -0,0 +1,173 @@ +From 99160958668fd4a170cd749492e37ebdb28dae69 Mon Sep 17 00:00:00 2001 +From: "Yew, Chang Ching" +Date: Thu, 23 Sep 2021 21:34:16 +0000 +Subject: [PATCH 1/2] [HEVCd] Add frame info check and update ChromaFormat in + FillOutputSurface for VDSFC CSC + +Upstream-Status: Submitted +innersource PR #3871 + +Signed-off-by: Yew, Chang Ching +--- + .../decode/h265/src/mfx_h265_dec_decode.cpp | 64 +++++++++++-------- + .../mfx_lib/shared/include/mfx_common_int.h | 1 + + _studio/mfx_lib/shared/src/mfx_common_int.cpp | 33 ++++++++++ + 3 files changed, 71 insertions(+), 27 deletions(-) + +diff --git a/_studio/mfx_lib/decode/h265/src/mfx_h265_dec_decode.cpp b/_studio/mfx_lib/decode/h265/src/mfx_h265_dec_decode.cpp +index fe2bcf2c3f..362ad257d6 100644 +--- a/_studio/mfx_lib/decode/h265/src/mfx_h265_dec_decode.cpp ++++ b/_studio/mfx_lib/decode/h265/src/mfx_h265_dec_decode.cpp +@@ -963,8 +963,16 @@ mfxStatus VideoDECODEH265::DecodeFrameCheck(mfxBitstream *bs, mfxFrameSurface1 * + + if (surface_work) + { +- sts = CheckFrameInfoCodecs(&surface_work->Info, MFX_CODEC_HEVC); +- MFX_CHECK(sts == MFX_ERR_NONE, MFX_ERR_INVALID_VIDEO_PARAM); ++ bool isVideoProcCscEnabled = false; ++#ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE ++ mfxExtDecVideoProcessing* videoProcessing = (mfxExtDecVideoProcessing*)GetExtendedBuffer(m_vInitPar.ExtParam, m_vInitPar.NumExtParam, MFX_EXTBUFF_DEC_VIDEO_PROCESSING); ++ if (videoProcessing && videoProcessing->Out.FourCC != m_vPar.mfx.FrameInfo.FourCC) ++ { ++ isVideoProcCscEnabled = true; ++ } ++#endif ++ sts = isVideoProcCscEnabled ? CheckFrameInfoDecVideoProcCsc(&surface_work->Info, MFX_CODEC_HEVC) : CheckFrameInfoCodecs(&surface_work->Info, MFX_CODEC_HEVC); ++ MFX_CHECK(sts == MFX_ERR_NONE, MFX_ERR_INVALID_VIDEO_PARAM) + + sts = CheckFrameData(surface_work); + MFX_CHECK_STS(sts); +@@ -1172,11 +1180,6 @@ void VideoDECODEH265::FillOutputSurface(mfxFrameSurface1 **surf_out, mfxFrameSur + + surface_out->Info.FrameId.TemporalId = 0; + +- surface_out->Info.CropH = (mfxU16)(pFrame->lumaSize().height - pFrame->m_crop_bottom - pFrame->m_crop_top); +- surface_out->Info.CropW = (mfxU16)(pFrame->lumaSize().width - pFrame->m_crop_right - pFrame->m_crop_left); +- surface_out->Info.CropX = (mfxU16)(pFrame->m_crop_left); +- surface_out->Info.CropY = (mfxU16)(pFrame->m_crop_top); +- + #ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE + mfxExtDecVideoProcessing * videoProcessing = (mfxExtDecVideoProcessing *)GetExtendedBuffer(m_vFirstPar.ExtParam, m_vFirstPar.NumExtParam, MFX_EXTBUFF_DEC_VIDEO_PROCESSING); + if (videoProcessing) +@@ -1185,8 +1188,35 @@ void VideoDECODEH265::FillOutputSurface(mfxFrameSurface1 **surf_out, mfxFrameSur + surface_out->Info.CropW = videoProcessing->Out.CropW; + surface_out->Info.CropX = videoProcessing->Out.CropX; + surface_out->Info.CropY = videoProcessing->Out.CropY; ++ surface_out->Info.ChromaFormat = videoProcessing->Out.ChromaFormat; + } ++ else + #endif ++ { ++ surface_out->Info.CropH = (mfxU16)(pFrame->lumaSize().height - pFrame->m_crop_bottom - pFrame->m_crop_top); ++ surface_out->Info.CropW = (mfxU16)(pFrame->lumaSize().width - pFrame->m_crop_right - pFrame->m_crop_left); ++ surface_out->Info.CropX = (mfxU16)(pFrame->m_crop_left); ++ surface_out->Info.CropY = (mfxU16)(pFrame->m_crop_top); ++ ++ switch(pFrame->m_chroma_format) ++ { ++ case 0: ++ surface_out->Info.ChromaFormat = MFX_CHROMAFORMAT_YUV400; ++ break; ++ case 1: ++ surface_out->Info.ChromaFormat = MFX_CHROMAFORMAT_YUV420; ++ break; ++ case 2: ++ surface_out->Info.ChromaFormat = MFX_CHROMAFORMAT_YUV422; ++ break; ++ case 3: ++ surface_out->Info.ChromaFormat = MFX_CHROMAFORMAT_YUV444; ++ break; ++ default: ++ VM_ASSERT(!"Unknown chroma format"); ++ surface_out->Info.ChromaFormat = MFX_CHROMAFORMAT_YUV420; ++ } ++ } + + bool isShouldUpdate = !(m_vFirstPar.mfx.FrameInfo.AspectRatioH || m_vFirstPar.mfx.FrameInfo.AspectRatioW); + +@@ -1198,26 +1228,6 @@ void VideoDECODEH265::FillOutputSurface(mfxFrameSurface1 **surf_out, mfxFrameSur + surface_out->Info.FrameRateExtD = isShouldUpdate ? m_vPar.mfx.FrameInfo.FrameRateExtD : m_vFirstPar.mfx.FrameInfo.FrameRateExtD; + surface_out->Info.FrameRateExtN = isShouldUpdate ? m_vPar.mfx.FrameInfo.FrameRateExtN : m_vFirstPar.mfx.FrameInfo.FrameRateExtN; + +- surface_out->Info.PicStruct = 0; +- switch(pFrame->m_chroma_format) +- { +- case 0: +- surface_out->Info.ChromaFormat = MFX_CHROMAFORMAT_YUV400; +- break; +- case 1: +- surface_out->Info.ChromaFormat = MFX_CHROMAFORMAT_YUV420; +- break; +- case 2: +- surface_out->Info.ChromaFormat = MFX_CHROMAFORMAT_YUV422; +- break; +- case 3: +- surface_out->Info.ChromaFormat = MFX_CHROMAFORMAT_YUV444; +- break; +- default: +- VM_ASSERT(!"Unknown chroma format"); +- surface_out->Info.ChromaFormat = MFX_CHROMAFORMAT_YUV420; +- } +- + surface_out->Info.PicStruct = + UMC2MFX_PicStruct(pFrame->m_DisplayPictureStruct_H265, !!m_vPar.mfx.ExtendedPicStruct); + +diff --git a/_studio/mfx_lib/shared/include/mfx_common_int.h b/_studio/mfx_lib/shared/include/mfx_common_int.h +index 4f12ddb883..73f4667a18 100644 +--- a/_studio/mfx_lib/shared/include/mfx_common_int.h ++++ b/_studio/mfx_lib/shared/include/mfx_common_int.h +@@ -29,6 +29,7 @@ + + mfxStatus CheckFrameInfoCommon(mfxFrameInfo *info, mfxU32 codecId); + mfxStatus CheckFrameInfoEncoders(mfxFrameInfo *info); ++mfxStatus CheckFrameInfoDecVideoProcCsc(mfxFrameInfo *info, mfxU32 codecId); + mfxStatus CheckFrameInfoCodecs(mfxFrameInfo *info, mfxU32 codecId = MFX_CODEC_AVC); + + mfxStatus CheckVideoParamEncoders(mfxVideoParam *in, eMFXHWType type); +diff --git a/_studio/mfx_lib/shared/src/mfx_common_int.cpp b/_studio/mfx_lib/shared/src/mfx_common_int.cpp +index 1142457f00..4f2126d944 100644 +--- a/_studio/mfx_lib/shared/src/mfx_common_int.cpp ++++ b/_studio/mfx_lib/shared/src/mfx_common_int.cpp +@@ -163,6 +163,39 @@ mfxStatus CheckFrameInfoEncoders(mfxFrameInfo *info) + return MFX_ERR_NONE; + } + ++mfxStatus CheckFrameInfoDecVideoProcCsc(mfxFrameInfo *info, mfxU32 codecId) ++{ ++ mfxStatus sts = CheckFrameInfoCommon(info, codecId); ++ MFX_CHECK_STS(sts); ++ ++ switch(info->FourCC) { ++ case MFX_FOURCC_NV12: ++ case MFX_FOURCC_P010: ++ case MFX_FOURCC_P016: ++ if (info->ChromaFormat == MFX_CHROMAFORMAT_YUV420) ++ return MFX_ERR_NONE; ++ MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); ++ ++ case MFX_FOURCC_YUY2: ++ case MFX_FOURCC_Y210: ++ case MFX_FOURCC_Y216: ++ if (info->ChromaFormat == MFX_CHROMAFORMAT_YUV422) ++ return MFX_ERR_NONE; ++ MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); ++ ++ case MFX_FOURCC_AYUV: ++ case MFX_FOURCC_Y410: ++ case MFX_FOURCC_Y416: ++ case MFX_FOURCC_RGB4: ++ if (info->ChromaFormat == MFX_CHROMAFORMAT_YUV444) ++ return MFX_ERR_NONE; ++ MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); ++ ++ default: ++ MFX_RETURN(MFX_ERR_UNSUPPORTED); ++ } ++} ++ + mfxStatus CheckFrameInfoCodecs(mfxFrameInfo *info, mfxU32 codecId) + { + mfxStatus sts = CheckFrameInfoCommon(info, codecId); +-- +2.33.1 + diff --git a/recipes-multimedia/onevpl/onevpl-intel-gpu_21.3.4.bb b/recipes-multimedia/onevpl/onevpl-intel-gpu_21.3.4.bb index d0a8b222..1fc4c4b2 100644 --- a/recipes-multimedia/onevpl/onevpl-intel-gpu_21.3.4.bb +++ b/recipes-multimedia/onevpl/onevpl-intel-gpu_21.3.4.bb @@ -19,6 +19,8 @@ DEPENDS += "libdrm libva intel-media-driver onevpl pkgconfig-native" SRC_URI = "git://github.com/oneapi-src/oneVPL-intel-gpu.git;protocol=https;branch=main;lfs=0 \ file://0001-jpegd-Enable-JPEG-decode-error-report.patch \ file://0001-Adding-missing-device-ID-4692-for-ADL-S.patch \ + file://0001-HEVCd-Add-frame-info-check-and-update-ChromaFormat-i.patch \ + file://0001-AVCd-Add-frame-info-check-and-update-ChromaFormat-in.patch \ " SRCREV = "51608c724044802cc060b7969084126a3e90ca4a" -- cgit v1.2.3-54-g00ecf