From b218bced479533186962bcbb610c761190e538c3 Mon Sep 17 00:00:00 2001 From: Nana Zhang Date: Wed, 22 Jan 2025 01:30:16 +0000 Subject: [PATCH] Support secure and non-secure Signed-off-by: Nana Zhang --- _studio/mfx_lib/shared/src/mfx_common_int.cpp | 3 ++- _studio/shared/src/libmfx_core_vaapi.cpp | 4 ++++ .../shared/umc/codec/h264_dec/src/umc_h264_va_packer.cpp | 6 ++++-- _studio/shared/umc/core/umc/include/umc_va_base.h | 1 + _studio/shared/umc/io/umc_va/include/umc_va_linux.h | 3 +++ _studio/shared/umc/io/umc_va/src/umc_va_linux.cpp | 8 +++++++- api/mediasdk_structures/ts_ext_buffers_decl.h | 1 + api/vpl/mfxstructures.h | 6 ++++++ 8 files changed, 28 insertions(+), 4 deletions(-) diff --git a/_studio/mfx_lib/shared/src/mfx_common_int.cpp b/_studio/mfx_lib/shared/src/mfx_common_int.cpp index eb180692..c9a22930 100644 --- a/_studio/mfx_lib/shared/src/mfx_common_int.cpp +++ b/_studio/mfx_lib/shared/src/mfx_common_int.cpp @@ -569,7 +569,8 @@ mfxStatus CheckDecodersExtendedBuffers(mfxVideoParam const* par) #ifndef MFX_ADAPTIVE_PLAYBACK_DISABLE MFX_EXTBUFF_DEC_ADAPTIVE_PLAYBACK, #endif - MFX_EXTBUFF_ALLOCATION_HINTS + MFX_EXTBUFF_ALLOCATION_HINTS, + MFX_EXTBUFF_SECURE_CODEC }; static const mfxU32 g_decoderSupportedExtBuffersAVC[] = { diff --git a/_studio/shared/src/libmfx_core_vaapi.cpp b/_studio/shared/src/libmfx_core_vaapi.cpp index 6c95c79f..2909e635 100644 --- a/_studio/shared/src/libmfx_core_vaapi.cpp +++ b/_studio/shared/src/libmfx_core_vaapi.cpp @@ -1162,6 +1162,10 @@ mfxStatus VAAPIVideoCORE_T::CreateVideoAccelerator( params.m_surf = (void **)RenderTargets; params.m_protectedVA = param->Protected; + params.m_secure = false; + const mfxExtSecureCodec* secureCodec = (mfxExtSecureCodec*)mfx::GetExtBuffer(param->ExtParam, param->NumExtParam, MFX_EXTBUFF_SECURE_CODEC); + if (secureCodec && secureCodec->on) + params.m_secure = true; #ifndef MFX_DEC_VIDEO_POSTPROCESS_DISABLE /* There are following conditions for post processing via HW fixed function engine: diff --git a/_studio/shared/umc/codec/h264_dec/src/umc_h264_va_packer.cpp b/_studio/shared/umc/codec/h264_dec/src/umc_h264_va_packer.cpp index bb1e410e..f60a7582 100644 --- a/_studio/shared/umc/codec/h264_dec/src/umc_h264_va_packer.cpp +++ b/_studio/shared/umc/codec/h264_dec/src/umc_h264_va_packer.cpp @@ -691,7 +691,8 @@ int32_t PackerVA::PackSliceParams(H264Slice *pSlice, int32_t sliceNum, int32_t c TRACE_BUFFER_EVENT(VA_TRACE_API_AVC_SLICEPARAMETER_TASK, EVENT_TYPE_INFO, TR_KEY_DECODE_SLICEPARAM, pSlice_H264, H264DecodeSliceParam, SLICEPARAM_AVC); - SetupDecryptDecode(pSlice, &crypto_params_, &encryption_segment_info_, NalUnitSize); + if (m_va->IsSecure()) + SetupDecryptDecode(pSlice, &crypto_params_, &encryption_segment_info_, NalUnitSize); return partial_data; } @@ -914,7 +915,8 @@ void PackerVA::PackAU(const H264DecoderFrame *pFrame, int32_t isTop) if (m_va->GetVideoProcessingVA()) PackProcessingInfo(sliceInfo); #endif - PackEncryptedParams(&crypto_params_); + if (m_va->IsSecure()) + PackEncryptedParams(&crypto_params_); Status sts = m_va->Execute(); if (sts != UMC_OK) diff --git a/_studio/shared/umc/core/umc/include/umc_va_base.h b/_studio/shared/umc/core/umc/include/umc_va_base.h index af7da60d..2bae9eb5 100644 --- a/_studio/shared/umc/core/umc/include/umc_va_base.h +++ b/_studio/shared/umc/core/umc/include/umc_va_base.h @@ -264,6 +264,7 @@ class VideoAccelerator virtual int32_t GetSurfaceID(int32_t idx) const { return idx; } virtual bool DecryptCTR(const mfxExtDecryptConfig& decryptConfig, VAEncryptionParameters* pEncryptionParam) = 0; + virtual bool IsSecure() = 0; #if defined(MFX_ENABLE_PROTECT) virtual ProtectedVA * GetProtectedVA() { return m_protectedVA.get(); } diff --git a/_studio/shared/umc/io/umc_va/include/umc_va_linux.h b/_studio/shared/umc/io/umc_va/include/umc_va_linux.h index 8097b5b2..b34f8721 100644 --- a/_studio/shared/umc/io/umc_va/include/umc_va_linux.h +++ b/_studio/shared/umc/io/umc_va/include/umc_va_linux.h @@ -87,6 +87,7 @@ class LinuxVideoAcceleratorParams : public VideoAcceleratorParams VAContextID* m_pContext; bool* m_pKeepVAState; int m_CreateFlags; + bool m_secure; }; /* LinuxVideoAccelerator -----------------------------------------------------*/ @@ -136,6 +137,7 @@ class LinuxVideoAccelerator : public VideoAccelerator { return UMC_ERR_UNSUPPORTED; } bool DecryptCTR(const mfxExtDecryptConfig& , VAEncryptionParameters*); + bool IsSecure(); protected: @@ -165,6 +167,7 @@ class LinuxVideoAccelerator : public VideoAccelerator VAContextID* m_pContext; bool* m_pKeepVAState; lvaFrameState m_FrameState; + bool m_secure; uint32_t m_uiCompBuffersNum; uint32_t m_uiCompBuffersUsed; diff --git a/_studio/shared/umc/io/umc_va/src/umc_va_linux.cpp b/_studio/shared/umc/io/umc_va/src/umc_va_linux.cpp index f97b413d..8fdf202e 100644 --- a/_studio/shared/umc/io/umc_va/src/umc_va_linux.cpp +++ b/_studio/shared/umc/io/umc_va/src/umc_va_linux.cpp @@ -376,6 +376,7 @@ Status LinuxVideoAccelerator::Init(VideoAcceleratorParams* pInfo) height = pParams->m_pVideoStreamInfo->clip_info.height; m_allocator = pParams->m_allocator; m_FrameState = lvaBeforeBegin; + m_secure = pParams->m_secure; // profile or stream type should be set if (UNKNOWN == (m_Profile & VA_CODEC)) @@ -552,7 +553,7 @@ Status LinuxVideoAccelerator::Init(VideoAcceleratorParams* pInfo) umcRes = va_to_umc_res(va_res); } - if (1) + if (m_secure) { m_protectedSessionID = CreateProtectedSession(VA_PC_SESSION_MODE_HEAVY, VA_PC_SESSION_TYPE_DISPLAY, VAEntrypointProtectedContent, EncryptionScheme::kCenc); @@ -873,6 +874,11 @@ bool LinuxVideoAccelerator::DecryptCTR(const mfxExtDecryptConfig& decryptConfig, return true; } +bool LinuxVideoAccelerator::IsSecure() +{ + return m_secure; +} + Status LinuxVideoAccelerator::Close(void) { MFX_AUTO_LTRACE(MFX_TRACE_LEVEL_HOTSPOTS, "LinuxVideoAccelerator::Close"); diff --git a/api/mediasdk_structures/ts_ext_buffers_decl.h b/api/mediasdk_structures/ts_ext_buffers_decl.h index b4f5a176..faf3fefa 100644 --- a/api/mediasdk_structures/ts_ext_buffers_decl.h +++ b/api/mediasdk_structures/ts_ext_buffers_decl.h @@ -160,3 +160,4 @@ EXTBUF(mfxExtEncodeStatsOutput, MFX_EXTBUFF_ENCODESTATS) // encrytion EXTBUF(mfxExtDecryptConfig, MFX_EXTBUFF_DECRYPT_CONFIG) +EXTBUF(mfxExtSecureCodec, MFX_EXTBUFF_SECURE_CODEC) diff --git a/api/vpl/mfxstructures.h b/api/vpl/mfxstructures.h index c9f1cdca..489ba044 100644 --- a/api/vpl/mfxstructures.h +++ b/api/vpl/mfxstructures.h @@ -2399,6 +2399,7 @@ enum { #endif MFX_EXTBUFF_DECRYPT_CONFIG = MFX_MAKEFOURCC('D', 'E', 'C', 'R'), + MFX_EXTBUFF_SECURE_CODEC = MFX_MAKEFOURCC('S', 'E', 'C', 'U'), }; /* VPP Conf: Do not use certain algorithms */ @@ -5141,6 +5142,11 @@ typedef struct { SubsampleEntry *subsamples; } mfxExtDecryptConfig; +typedef struct { + mfxExtBuffer Header; + mfxU8 on; +} mfxExtSecureCodec; + #ifdef __cplusplus } // extern "C"