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