diff options
| author | Yew, Chang Ching <chang.ching.yew@intel.com> | 2021-11-10 14:20:47 +0800 |
|---|---|---|
| committer | Anuj Mittal <anuj.mittal@intel.com> | 2021-11-11 22:22:24 +0800 |
| commit | 42a15be8a931c5049310d4e7796db479d4573f58 (patch) | |
| tree | 5417356f051524ef35ce1faeb4f6befec85df556 | |
| parent | 5a66f35237cf396b20cea60279262e93a8f52bdc (diff) | |
| download | meta-intel-42a15be8a931c5049310d4e7796db479d4573f58.tar.gz | |
onevpl-intel-gpu: Add VDSFC CSC support
Signed-off-by: Yew, Chang Ching <chang.ching.yew@intel.com>
Signed-off-by: Anuj Mittal <anuj.mittal@intel.com>
3 files changed, 273 insertions, 0 deletions
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 @@ | |||
| 1 | From f23ba1b768a4db58ed985a0f066b65d9a65dd61b Mon Sep 17 00:00:00 2001 | ||
| 2 | From: "Yew, Chang Ching" <chang.ching.yew@intel.com> | ||
| 3 | Date: Mon, 1 Nov 2021 13:28:06 +0000 | ||
| 4 | Subject: [PATCH 2/2] [AVCd] Add frame info check and update ChromaFormat in | ||
| 5 | FillOutputSurface for VDSFC CSC | ||
| 6 | |||
| 7 | Upstream-Status: Submitted | ||
| 8 | innersource PR #3871 | ||
| 9 | |||
| 10 | Signed-off-by: Yew, Chang Ching <chang.ching.yew@intel.com> | ||
| 11 | --- | ||
| 12 | .../decode/h264/src/mfx_h264_dec_decode.cpp | 48 +++++++++---------- | ||
| 13 | 1 file changed, 24 insertions(+), 24 deletions(-) | ||
| 14 | |||
| 15 | 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 | ||
| 16 | index 84e57f7f18..8e51ad7852 100644 | ||
| 17 | --- a/_studio/mfx_lib/decode/h264/src/mfx_h264_dec_decode.cpp | ||
| 18 | +++ b/_studio/mfx_lib/decode/h264/src/mfx_h264_dec_decode.cpp | ||
| 19 | @@ -1140,12 +1140,8 @@ mfxStatus VideoDECODEH264::DecodeFrameCheck(mfxBitstream *bs, mfxFrameSurface1 * | ||
| 20 | isVideoProcCscEnabled = true; | ||
| 21 | } | ||
| 22 | #endif | ||
| 23 | - sts = CheckFrameInfoCodecs(&surface_work->Info, MFX_CODEC_AVC); | ||
| 24 | - //Decode CSC support more FourCC format, already checked in Init, skip the check return; | ||
| 25 | - if(!isVideoProcCscEnabled) | ||
| 26 | - { | ||
| 27 | - MFX_CHECK(sts == MFX_ERR_NONE, MFX_ERR_UNSUPPORTED); | ||
| 28 | - } | ||
| 29 | + sts = isVideoProcCscEnabled ? CheckFrameInfoDecVideoProcCsc(&surface_work->Info, MFX_CODEC_AVC) : CheckFrameInfoCodecs(&surface_work->Info, MFX_CODEC_AVC); | ||
| 30 | + MFX_CHECK(sts == MFX_ERR_NONE, MFX_ERR_INVALID_VIDEO_PARAM) | ||
| 31 | |||
| 32 | sts = CheckFrameData(surface_work); | ||
| 33 | MFX_CHECK_STS(sts); | ||
| 34 | @@ -1420,11 +1416,6 @@ void VideoDECODEH264::FillOutputSurface(mfxFrameSurface1 **surf_out, mfxFrameSur | ||
| 35 | } | ||
| 36 | #endif | ||
| 37 | |||
| 38 | - surface_out->Info.CropH = (mfxU16)(pFrame->lumaSize().height - pFrame->m_crop_bottom - pFrame->m_crop_top); | ||
| 39 | - surface_out->Info.CropW = (mfxU16)(pFrame->lumaSize().width - pFrame->m_crop_right - pFrame->m_crop_left); | ||
| 40 | - surface_out->Info.CropX = (mfxU16)(pFrame->m_crop_left); | ||
| 41 | - surface_out->Info.CropY = (mfxU16)(pFrame->m_crop_top); | ||
| 42 | - | ||
| 43 | #ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE | ||
| 44 | mfxExtDecVideoProcessing * videoProcessing = (mfxExtDecVideoProcessing *)GetExtendedBuffer(m_vFirstPar.ExtParam, m_vFirstPar.NumExtParam, MFX_EXTBUFF_DEC_VIDEO_PROCESSING); | ||
| 45 | if (videoProcessing) | ||
| 46 | @@ -1433,8 +1424,28 @@ void VideoDECODEH264::FillOutputSurface(mfxFrameSurface1 **surf_out, mfxFrameSur | ||
| 47 | surface_out->Info.CropW = videoProcessing->Out.CropW; | ||
| 48 | surface_out->Info.CropX = videoProcessing->Out.CropX; | ||
| 49 | surface_out->Info.CropY = videoProcessing->Out.CropY; | ||
| 50 | - } | ||
| 51 | + surface_out->Info.ChromaFormat = videoProcessing->Out.ChromaFormat; | ||
| 52 | + } else | ||
| 53 | #endif | ||
| 54 | + { | ||
| 55 | + surface_out->Info.CropH = (mfxU16)(pFrame->lumaSize().height - pFrame->m_crop_bottom - pFrame->m_crop_top); | ||
| 56 | + surface_out->Info.CropW = (mfxU16)(pFrame->lumaSize().width - pFrame->m_crop_right - pFrame->m_crop_left); | ||
| 57 | + surface_out->Info.CropX = (mfxU16)(pFrame->m_crop_left); | ||
| 58 | + surface_out->Info.CropY = (mfxU16)(pFrame->m_crop_top); | ||
| 59 | + | ||
| 60 | + switch(pFrame->m_chroma_format) | ||
| 61 | + { | ||
| 62 | + case 0: | ||
| 63 | + surface_out->Info.ChromaFormat = MFX_CHROMAFORMAT_YUV400; | ||
| 64 | + break; | ||
| 65 | + case 2: | ||
| 66 | + surface_out->Info.ChromaFormat = MFX_CHROMAFORMAT_YUV422; | ||
| 67 | + break; | ||
| 68 | + default: | ||
| 69 | + surface_out->Info.ChromaFormat = MFX_CHROMAFORMAT_YUV420; | ||
| 70 | + break; | ||
| 71 | + } | ||
| 72 | + } | ||
| 73 | |||
| 74 | bool isShouldUpdate = !(m_vFirstPar.mfx.FrameInfo.AspectRatioH || m_vFirstPar.mfx.FrameInfo.AspectRatioW); | ||
| 75 | |||
| 76 | @@ -1447,18 +1458,7 @@ void VideoDECODEH264::FillOutputSurface(mfxFrameSurface1 **surf_out, mfxFrameSur | ||
| 77 | surface_out->Info.FrameRateExtN = isShouldUpdate ? m_vPar.mfx.FrameInfo.FrameRateExtN : m_vFirstPar.mfx.FrameInfo.FrameRateExtN; | ||
| 78 | |||
| 79 | surface_out->Info.PicStruct = 0; | ||
| 80 | - switch(pFrame->m_chroma_format) | ||
| 81 | - { | ||
| 82 | - case 0: | ||
| 83 | - surface_out->Info.ChromaFormat = MFX_CHROMAFORMAT_YUV400; | ||
| 84 | - break; | ||
| 85 | - case 2: | ||
| 86 | - surface_out->Info.ChromaFormat = MFX_CHROMAFORMAT_YUV422; | ||
| 87 | - break; | ||
| 88 | - default: | ||
| 89 | - surface_out->Info.ChromaFormat = MFX_CHROMAFORMAT_YUV420; | ||
| 90 | - break; | ||
| 91 | - } | ||
| 92 | + | ||
| 93 | |||
| 94 | switch (pFrame->m_displayPictureStruct) | ||
| 95 | { | ||
| 96 | -- | ||
| 97 | 2.33.1 | ||
| 98 | |||
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 @@ | |||
| 1 | From 99160958668fd4a170cd749492e37ebdb28dae69 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: "Yew, Chang Ching" <chang.ching.yew@intel.com> | ||
| 3 | Date: Thu, 23 Sep 2021 21:34:16 +0000 | ||
| 4 | Subject: [PATCH 1/2] [HEVCd] Add frame info check and update ChromaFormat in | ||
| 5 | FillOutputSurface for VDSFC CSC | ||
| 6 | |||
| 7 | Upstream-Status: Submitted | ||
| 8 | innersource PR #3871 | ||
| 9 | |||
| 10 | Signed-off-by: Yew, Chang Ching <chang.ching.yew@intel.com> | ||
| 11 | --- | ||
| 12 | .../decode/h265/src/mfx_h265_dec_decode.cpp | 64 +++++++++++-------- | ||
| 13 | .../mfx_lib/shared/include/mfx_common_int.h | 1 + | ||
| 14 | _studio/mfx_lib/shared/src/mfx_common_int.cpp | 33 ++++++++++ | ||
| 15 | 3 files changed, 71 insertions(+), 27 deletions(-) | ||
| 16 | |||
| 17 | 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 | ||
| 18 | index fe2bcf2c3f..362ad257d6 100644 | ||
| 19 | --- a/_studio/mfx_lib/decode/h265/src/mfx_h265_dec_decode.cpp | ||
| 20 | +++ b/_studio/mfx_lib/decode/h265/src/mfx_h265_dec_decode.cpp | ||
| 21 | @@ -963,8 +963,16 @@ mfxStatus VideoDECODEH265::DecodeFrameCheck(mfxBitstream *bs, mfxFrameSurface1 * | ||
| 22 | |||
| 23 | if (surface_work) | ||
| 24 | { | ||
| 25 | - sts = CheckFrameInfoCodecs(&surface_work->Info, MFX_CODEC_HEVC); | ||
| 26 | - MFX_CHECK(sts == MFX_ERR_NONE, MFX_ERR_INVALID_VIDEO_PARAM); | ||
| 27 | + bool isVideoProcCscEnabled = false; | ||
| 28 | +#ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE | ||
| 29 | + mfxExtDecVideoProcessing* videoProcessing = (mfxExtDecVideoProcessing*)GetExtendedBuffer(m_vInitPar.ExtParam, m_vInitPar.NumExtParam, MFX_EXTBUFF_DEC_VIDEO_PROCESSING); | ||
| 30 | + if (videoProcessing && videoProcessing->Out.FourCC != m_vPar.mfx.FrameInfo.FourCC) | ||
| 31 | + { | ||
| 32 | + isVideoProcCscEnabled = true; | ||
| 33 | + } | ||
| 34 | +#endif | ||
| 35 | + sts = isVideoProcCscEnabled ? CheckFrameInfoDecVideoProcCsc(&surface_work->Info, MFX_CODEC_HEVC) : CheckFrameInfoCodecs(&surface_work->Info, MFX_CODEC_HEVC); | ||
| 36 | + MFX_CHECK(sts == MFX_ERR_NONE, MFX_ERR_INVALID_VIDEO_PARAM) | ||
| 37 | |||
| 38 | sts = CheckFrameData(surface_work); | ||
| 39 | MFX_CHECK_STS(sts); | ||
| 40 | @@ -1172,11 +1180,6 @@ void VideoDECODEH265::FillOutputSurface(mfxFrameSurface1 **surf_out, mfxFrameSur | ||
| 41 | |||
| 42 | surface_out->Info.FrameId.TemporalId = 0; | ||
| 43 | |||
| 44 | - surface_out->Info.CropH = (mfxU16)(pFrame->lumaSize().height - pFrame->m_crop_bottom - pFrame->m_crop_top); | ||
| 45 | - surface_out->Info.CropW = (mfxU16)(pFrame->lumaSize().width - pFrame->m_crop_right - pFrame->m_crop_left); | ||
| 46 | - surface_out->Info.CropX = (mfxU16)(pFrame->m_crop_left); | ||
| 47 | - surface_out->Info.CropY = (mfxU16)(pFrame->m_crop_top); | ||
| 48 | - | ||
| 49 | #ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE | ||
| 50 | mfxExtDecVideoProcessing * videoProcessing = (mfxExtDecVideoProcessing *)GetExtendedBuffer(m_vFirstPar.ExtParam, m_vFirstPar.NumExtParam, MFX_EXTBUFF_DEC_VIDEO_PROCESSING); | ||
| 51 | if (videoProcessing) | ||
| 52 | @@ -1185,8 +1188,35 @@ void VideoDECODEH265::FillOutputSurface(mfxFrameSurface1 **surf_out, mfxFrameSur | ||
| 53 | surface_out->Info.CropW = videoProcessing->Out.CropW; | ||
| 54 | surface_out->Info.CropX = videoProcessing->Out.CropX; | ||
| 55 | surface_out->Info.CropY = videoProcessing->Out.CropY; | ||
| 56 | + surface_out->Info.ChromaFormat = videoProcessing->Out.ChromaFormat; | ||
| 57 | } | ||
| 58 | + else | ||
| 59 | #endif | ||
| 60 | + { | ||
| 61 | + surface_out->Info.CropH = (mfxU16)(pFrame->lumaSize().height - pFrame->m_crop_bottom - pFrame->m_crop_top); | ||
| 62 | + surface_out->Info.CropW = (mfxU16)(pFrame->lumaSize().width - pFrame->m_crop_right - pFrame->m_crop_left); | ||
| 63 | + surface_out->Info.CropX = (mfxU16)(pFrame->m_crop_left); | ||
| 64 | + surface_out->Info.CropY = (mfxU16)(pFrame->m_crop_top); | ||
| 65 | + | ||
| 66 | + switch(pFrame->m_chroma_format) | ||
| 67 | + { | ||
| 68 | + case 0: | ||
| 69 | + surface_out->Info.ChromaFormat = MFX_CHROMAFORMAT_YUV400; | ||
| 70 | + break; | ||
| 71 | + case 1: | ||
| 72 | + surface_out->Info.ChromaFormat = MFX_CHROMAFORMAT_YUV420; | ||
| 73 | + break; | ||
| 74 | + case 2: | ||
| 75 | + surface_out->Info.ChromaFormat = MFX_CHROMAFORMAT_YUV422; | ||
| 76 | + break; | ||
| 77 | + case 3: | ||
| 78 | + surface_out->Info.ChromaFormat = MFX_CHROMAFORMAT_YUV444; | ||
| 79 | + break; | ||
| 80 | + default: | ||
| 81 | + VM_ASSERT(!"Unknown chroma format"); | ||
| 82 | + surface_out->Info.ChromaFormat = MFX_CHROMAFORMAT_YUV420; | ||
| 83 | + } | ||
| 84 | + } | ||
| 85 | |||
| 86 | bool isShouldUpdate = !(m_vFirstPar.mfx.FrameInfo.AspectRatioH || m_vFirstPar.mfx.FrameInfo.AspectRatioW); | ||
| 87 | |||
| 88 | @@ -1198,26 +1228,6 @@ void VideoDECODEH265::FillOutputSurface(mfxFrameSurface1 **surf_out, mfxFrameSur | ||
| 89 | surface_out->Info.FrameRateExtD = isShouldUpdate ? m_vPar.mfx.FrameInfo.FrameRateExtD : m_vFirstPar.mfx.FrameInfo.FrameRateExtD; | ||
| 90 | surface_out->Info.FrameRateExtN = isShouldUpdate ? m_vPar.mfx.FrameInfo.FrameRateExtN : m_vFirstPar.mfx.FrameInfo.FrameRateExtN; | ||
| 91 | |||
| 92 | - surface_out->Info.PicStruct = 0; | ||
| 93 | - switch(pFrame->m_chroma_format) | ||
| 94 | - { | ||
| 95 | - case 0: | ||
| 96 | - surface_out->Info.ChromaFormat = MFX_CHROMAFORMAT_YUV400; | ||
| 97 | - break; | ||
| 98 | - case 1: | ||
| 99 | - surface_out->Info.ChromaFormat = MFX_CHROMAFORMAT_YUV420; | ||
| 100 | - break; | ||
| 101 | - case 2: | ||
| 102 | - surface_out->Info.ChromaFormat = MFX_CHROMAFORMAT_YUV422; | ||
| 103 | - break; | ||
| 104 | - case 3: | ||
| 105 | - surface_out->Info.ChromaFormat = MFX_CHROMAFORMAT_YUV444; | ||
| 106 | - break; | ||
| 107 | - default: | ||
| 108 | - VM_ASSERT(!"Unknown chroma format"); | ||
| 109 | - surface_out->Info.ChromaFormat = MFX_CHROMAFORMAT_YUV420; | ||
| 110 | - } | ||
| 111 | - | ||
| 112 | surface_out->Info.PicStruct = | ||
| 113 | UMC2MFX_PicStruct(pFrame->m_DisplayPictureStruct_H265, !!m_vPar.mfx.ExtendedPicStruct); | ||
| 114 | |||
| 115 | diff --git a/_studio/mfx_lib/shared/include/mfx_common_int.h b/_studio/mfx_lib/shared/include/mfx_common_int.h | ||
| 116 | index 4f12ddb883..73f4667a18 100644 | ||
| 117 | --- a/_studio/mfx_lib/shared/include/mfx_common_int.h | ||
| 118 | +++ b/_studio/mfx_lib/shared/include/mfx_common_int.h | ||
| 119 | @@ -29,6 +29,7 @@ | ||
| 120 | |||
| 121 | mfxStatus CheckFrameInfoCommon(mfxFrameInfo *info, mfxU32 codecId); | ||
| 122 | mfxStatus CheckFrameInfoEncoders(mfxFrameInfo *info); | ||
| 123 | +mfxStatus CheckFrameInfoDecVideoProcCsc(mfxFrameInfo *info, mfxU32 codecId); | ||
| 124 | mfxStatus CheckFrameInfoCodecs(mfxFrameInfo *info, mfxU32 codecId = MFX_CODEC_AVC); | ||
| 125 | |||
| 126 | mfxStatus CheckVideoParamEncoders(mfxVideoParam *in, eMFXHWType type); | ||
| 127 | diff --git a/_studio/mfx_lib/shared/src/mfx_common_int.cpp b/_studio/mfx_lib/shared/src/mfx_common_int.cpp | ||
| 128 | index 1142457f00..4f2126d944 100644 | ||
| 129 | --- a/_studio/mfx_lib/shared/src/mfx_common_int.cpp | ||
| 130 | +++ b/_studio/mfx_lib/shared/src/mfx_common_int.cpp | ||
| 131 | @@ -163,6 +163,39 @@ mfxStatus CheckFrameInfoEncoders(mfxFrameInfo *info) | ||
| 132 | return MFX_ERR_NONE; | ||
| 133 | } | ||
| 134 | |||
| 135 | +mfxStatus CheckFrameInfoDecVideoProcCsc(mfxFrameInfo *info, mfxU32 codecId) | ||
| 136 | +{ | ||
| 137 | + mfxStatus sts = CheckFrameInfoCommon(info, codecId); | ||
| 138 | + MFX_CHECK_STS(sts); | ||
| 139 | + | ||
| 140 | + switch(info->FourCC) { | ||
| 141 | + case MFX_FOURCC_NV12: | ||
| 142 | + case MFX_FOURCC_P010: | ||
| 143 | + case MFX_FOURCC_P016: | ||
| 144 | + if (info->ChromaFormat == MFX_CHROMAFORMAT_YUV420) | ||
| 145 | + return MFX_ERR_NONE; | ||
| 146 | + MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); | ||
| 147 | + | ||
| 148 | + case MFX_FOURCC_YUY2: | ||
| 149 | + case MFX_FOURCC_Y210: | ||
| 150 | + case MFX_FOURCC_Y216: | ||
| 151 | + if (info->ChromaFormat == MFX_CHROMAFORMAT_YUV422) | ||
| 152 | + return MFX_ERR_NONE; | ||
| 153 | + MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); | ||
| 154 | + | ||
| 155 | + case MFX_FOURCC_AYUV: | ||
| 156 | + case MFX_FOURCC_Y410: | ||
| 157 | + case MFX_FOURCC_Y416: | ||
| 158 | + case MFX_FOURCC_RGB4: | ||
| 159 | + if (info->ChromaFormat == MFX_CHROMAFORMAT_YUV444) | ||
| 160 | + return MFX_ERR_NONE; | ||
| 161 | + MFX_RETURN(MFX_ERR_INVALID_VIDEO_PARAM); | ||
| 162 | + | ||
| 163 | + default: | ||
| 164 | + MFX_RETURN(MFX_ERR_UNSUPPORTED); | ||
| 165 | + } | ||
| 166 | +} | ||
| 167 | + | ||
| 168 | mfxStatus CheckFrameInfoCodecs(mfxFrameInfo *info, mfxU32 codecId) | ||
| 169 | { | ||
| 170 | mfxStatus sts = CheckFrameInfoCommon(info, codecId); | ||
| 171 | -- | ||
| 172 | 2.33.1 | ||
| 173 | |||
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" | |||
| 19 | SRC_URI = "git://github.com/oneapi-src/oneVPL-intel-gpu.git;protocol=https;branch=main;lfs=0 \ | 19 | SRC_URI = "git://github.com/oneapi-src/oneVPL-intel-gpu.git;protocol=https;branch=main;lfs=0 \ |
| 20 | file://0001-jpegd-Enable-JPEG-decode-error-report.patch \ | 20 | file://0001-jpegd-Enable-JPEG-decode-error-report.patch \ |
| 21 | file://0001-Adding-missing-device-ID-4692-for-ADL-S.patch \ | 21 | file://0001-Adding-missing-device-ID-4692-for-ADL-S.patch \ |
| 22 | file://0001-HEVCd-Add-frame-info-check-and-update-ChromaFormat-i.patch \ | ||
| 23 | file://0001-AVCd-Add-frame-info-check-and-update-ChromaFormat-in.patch \ | ||
| 22 | " | 24 | " |
| 23 | 25 | ||
| 24 | SRCREV = "51608c724044802cc060b7969084126a3e90ca4a" | 26 | SRCREV = "51608c724044802cc060b7969084126a3e90ca4a" |
