[CP] Implement protected session context robustness
Check if attached protected session is alive or not in vaBeginPicture/vaRenderPicture/vaEndPicture. If not alive, then return error.
diff --git a/media_driver/linux/common/codec/ddi/media_libva_decoder.cpp b/media_driver/linux/common/codec/ddi/media_libva_decoder.cpp
index 3949d92..ae061d0 100644
--- a/media_driver/linux/common/codec/ddi/media_libva_decoder.cpp
+++ b/media_driver/linux/common/codec/ddi/media_libva_decoder.cpp
@@ -119,6 +119,11 @@
PDDI_DECODE_CONTEXT decCtx = (PDDI_DECODE_CONTEXT)DdiMedia_GetContextFromContextID(ctx, context, &ctxType);
DDI_CHK_NULL(decCtx, "nullptr decCtx", VA_STATUS_ERROR_INVALID_CONTEXT);
+ if (decCtx->pCpDdiInterface)
+ {
+ DDI_CHK_RET(decCtx->pCpDdiInterface->IsAttachedSessionAlive(), "Session not alive!");
+ }
+
if (decCtx->m_ddiDecode)
{
VAStatus va = decCtx->m_ddiDecode->BeginPicture(ctx, context, renderTarget);
@@ -150,6 +155,12 @@
// assume the VAContextID is decoder ID
PDDI_DECODE_CONTEXT decCtx = (PDDI_DECODE_CONTEXT)DdiMedia_GetContextFromContextID(ctx, context, &ctxType);
DDI_CHK_NULL(decCtx, "nullptr decCtx", VA_STATUS_ERROR_INVALID_CONTEXT);
+
+ if (decCtx->pCpDdiInterface)
+ {
+ DDI_CHK_RET(decCtx->pCpDdiInterface->IsAttachedSessionAlive(), "Session not alive!");
+ }
+
if (decCtx->m_ddiDecode)
{
VAStatus va = decCtx->m_ddiDecode->EndPicture(ctx, context);
@@ -188,6 +199,11 @@
PDDI_DECODE_CONTEXT decCtx = (PDDI_DECODE_CONTEXT)DdiMedia_GetContextFromContextID(ctx, context, &ctxType);
DDI_CHK_NULL(decCtx, "nullptr decCtx", VA_STATUS_ERROR_INVALID_CONTEXT);
+ if (decCtx->pCpDdiInterface)
+ {
+ DDI_CHK_RET(decCtx->pCpDdiInterface->IsAttachedSessionAlive(), "Session not alive!");
+ }
+
priorityIndexInBuffers = DdiMedia_GetGpuPriority(ctx, buffers, numOfBuffers, &updatePriority, &priority);
if (priorityIndexInBuffers != -1)
{
diff --git a/media_driver/linux/common/cp/ddi/media_libva_cp_interface.cpp b/media_driver/linux/common/cp/ddi/media_libva_cp_interface.cpp
index 17ca293..f8e525c 100644
--- a/media_driver/linux/common/cp/ddi/media_libva_cp_interface.cpp
+++ b/media_driver/linux/common/cp/ddi/media_libva_cp_interface.cpp
@@ -173,3 +173,9 @@
DdiStubMessage();
return VA_STATUS_SUCCESS;
}
+
+VAStatus DdiCpInterface::IsAttachedSessionAlive()
+{
+ DdiStubMessage();
+ return VA_STATUS_SUCCESS;
+}
diff --git a/media_driver/linux/common/cp/ddi/media_libva_cp_interface.h b/media_driver/linux/common/cp/ddi/media_libva_cp_interface.h
index 12679e5..244276c 100644
--- a/media_driver/linux/common/cp/ddi/media_libva_cp_interface.h
+++ b/media_driver/linux/common/cp/ddi/media_libva_cp_interface.h
@@ -108,6 +108,8 @@
VAContextID context
);
+ virtual VAStatus IsAttachedSessionAlive();
+
};
//!