[Decode] CENC V1 AVC HW DRM support(CL#811127)
CENC V1 AVC HW DRM support.
Change-Id: I5de6800960d85b28bd45a958e89b5422ac66fdf5
diff --git a/media_driver/agnostic/common/codec/hal/codechal_decode_avc.cpp b/media_driver/agnostic/common/codec/hal/codechal_decode_avc.cpp
index e5095f2..15155fa 100644
--- a/media_driver/agnostic/common/codec/hal/codechal_decode_avc.cpp
+++ b/media_driver/agnostic/common/codec/hal/codechal_decode_avc.cpp
@@ -1151,6 +1151,7 @@
m_picIdRemappingInUse = (m_decodeParams.m_picIdRemappingInUse) ? true : false;
m_cencBuf = m_decodeParams.m_cencBuf;
+ m_fullFrameData = m_decodeParams.m_bFullFrameData;
CODECHAL_DECODE_CHK_NULL_RETURN(m_avcPicParams);
CODECHAL_DECODE_CHK_NULL_RETURN(m_avcIqMatrixParams);
@@ -1682,6 +1683,7 @@
avcSliceState.dwNextLength = length;
avcSliceState.dwSliceIndex = slcCount;
avcSliceState.bLastSlice = (slcCount == lastValidSlice);
+ avcSliceState.bFullFrameData = m_fullFrameData;
CODECHAL_DECODE_CHK_STATUS_RETURN(SendSlice(&avcSliceState, cmdBuf));
@@ -1982,6 +1984,8 @@
//Currently, crc calculation is only supported in AVC decoder
m_reportFrameCrc = true;
+ m_fullFrameData = false;
+
};
#if USE_CODECHAL_DEBUG_TOOL
diff --git a/media_driver/agnostic/common/codec/hal/codechal_decode_avc.h b/media_driver/agnostic/common/codec/hal/codechal_decode_avc.h
index 224e1c0..9ed95a9 100644
--- a/media_driver/agnostic/common/codec/hal/codechal_decode_avc.h
+++ b/media_driver/agnostic/common/codec/hal/codechal_decode_avc.h
@@ -373,6 +373,7 @@
bool m_shortFormatInUse; //!< Indicate it is Short Format
bool m_picIdRemappingInUse; //!< Indicate PicId Remapping are in use
bool m_deblockingEnabled; //!< Indicate Deblocking is enabled
+ bool m_fullFrameData; //!< Indicate it is a full frame
#ifdef _DECODE_PROCESSING_SUPPORTED
CodechalAvcSfcState *m_sfcState = nullptr; //!< Avc Sfc State
diff --git a/media_driver/agnostic/common/codec/shared/codec_def_decode.h b/media_driver/agnostic/common/codec/shared/codec_def_decode.h
index c0dfd28..9e5b804 100644
--- a/media_driver/agnostic/common/codec/shared/codec_def_decode.h
+++ b/media_driver/agnostic/common/codec/shared/codec_def_decode.h
@@ -155,6 +155,8 @@
PMOS_RESOURCE m_presSetMarker = nullptr;
//! \brief [SetMarker] Number Timestamp for SetMarker
uint32_t setMarkerNumTs = 0;
+ //! \brief [CENC Decode] Indicates if it's a full frame
+ bool m_bFullFrameData = false;
};
diff --git a/media_driver/agnostic/common/hw/vdbox/mhw_vdbox_mfx_interface.h b/media_driver/agnostic/common/hw/vdbox/mhw_vdbox_mfx_interface.h
index caa0f01..26dd791 100644
--- a/media_driver/agnostic/common/hw/vdbox/mhw_vdbox_mfx_interface.h
+++ b/media_driver/agnostic/common/hw/vdbox/mhw_vdbox_mfx_interface.h
@@ -369,6 +369,7 @@
bool bVdencInUse;
bool bVdencNoTailInsertion;
bool oneOnOneMapping = false;
+ bool bFullFrameData;
} MHW_VDBOX_AVC_SLICE_STATE, *PMHW_VDBOX_AVC_SLICE_STATE;
typedef struct _MHW_VDBOX_AVC_DPB_PARAMS
diff --git a/media_driver/agnostic/gen10/hw/vdbox/mhw_vdbox_mfx_g10_X.cpp b/media_driver/agnostic/gen10/hw/vdbox/mhw_vdbox_mfx_g10_X.cpp
index 4183789..07a551b 100644
--- a/media_driver/agnostic/gen10/hw/vdbox/mhw_vdbox_mfx_g10_X.cpp
+++ b/media_driver/agnostic/gen10/hw/vdbox/mhw_vdbox_mfx_g10_X.cpp
@@ -1690,8 +1690,16 @@
mhw_vdbox_mfx_g10_X::MFD_AVC_SLICEADDR_CMD cmd;
- cmd.DW1.IndirectBsdDataLength = (avcSliceState->dwNextLength + 1 - m_osInterface->dwNumNalUnitBytesIncluded);
- cmd.DW2.IndirectBsdDataStartAddress = (avcSliceState->dwNextOffset - 1 + m_osInterface->dwNumNalUnitBytesIncluded);
+ if (avcSliceState->bFullFrameData)
+ {
+ cmd.DW1.IndirectBsdDataLength = avcSliceState->dwNextLength;
+ cmd.DW2.IndirectBsdDataStartAddress = avcSliceState->dwNextOffset;
+ }
+ else
+ {
+ cmd.DW1.IndirectBsdDataLength = (avcSliceState->dwNextLength + 1 - m_osInterface->dwNumNalUnitBytesIncluded);
+ cmd.DW2.IndirectBsdDataStartAddress = (avcSliceState->dwNextOffset - 1 + m_osInterface->dwNumNalUnitBytesIncluded);
+ }
MHW_CP_SLICE_INFO_PARAMS sliceInfoParam;
sliceInfoParam.presDataBuffer = avcSliceState->presDataBuffer;
@@ -1735,9 +1743,17 @@
if (avcSliceState->bShortFormatInUse)
{
- cmd.DW1.IndirectBsdDataLength = avcSliceState->dwLength + 1 - m_osInterface->dwNumNalUnitBytesIncluded;
- cmd.DW2.IndirectBsdDataStartAddress =
- sliceParams->slice_data_offset - 1 + m_osInterface->dwNumNalUnitBytesIncluded;
+ if (avcSliceState->bFullFrameData)
+ {
+ cmd.DW1.IndirectBsdDataLength = avcSliceState->dwLength;
+ cmd.DW2.IndirectBsdDataStartAddress = sliceParams->slice_data_offset;
+ }
+ else
+ {
+ cmd.DW1.IndirectBsdDataLength = avcSliceState->dwLength + 1 - m_osInterface->dwNumNalUnitBytesIncluded;
+ cmd.DW2.IndirectBsdDataStartAddress =
+ sliceParams->slice_data_offset - 1 + m_osInterface->dwNumNalUnitBytesIncluded;
+ }
cmd.DW4.FirstMbByteOffsetOfSliceDataOrSliceHeader = 0;
}
else
diff --git a/media_driver/agnostic/gen11/hw/vdbox/mhw_vdbox_mfx_g11_X.cpp b/media_driver/agnostic/gen11/hw/vdbox/mhw_vdbox_mfx_g11_X.cpp
index 5d7c1b6..91d91a6 100644
--- a/media_driver/agnostic/gen11/hw/vdbox/mhw_vdbox_mfx_g11_X.cpp
+++ b/media_driver/agnostic/gen11/hw/vdbox/mhw_vdbox_mfx_g11_X.cpp
@@ -1737,8 +1737,16 @@
mhw_vdbox_mfx_g11_X::MFD_AVC_SLICEADDR_CMD cmd;
- cmd.DW1.IndirectBsdDataLength = (avcSliceState->dwNextLength + 1 - m_osInterface->dwNumNalUnitBytesIncluded);
- cmd.DW2.IndirectBsdDataStartAddress = (avcSliceState->dwNextOffset - 1 + m_osInterface->dwNumNalUnitBytesIncluded);
+ if (avcSliceState->bFullFrameData)
+ {
+ cmd.DW1.IndirectBsdDataLength = avcSliceState->dwNextLength;
+ cmd.DW2.IndirectBsdDataStartAddress = avcSliceState->dwNextOffset;
+ }
+ else
+ {
+ cmd.DW1.IndirectBsdDataLength = (avcSliceState->dwNextLength + 1 - m_osInterface->dwNumNalUnitBytesIncluded);
+ cmd.DW2.IndirectBsdDataStartAddress = (avcSliceState->dwNextOffset - 1 + m_osInterface->dwNumNalUnitBytesIncluded);
+ }
MHW_CP_SLICE_INFO_PARAMS sliceInfoParam;
sliceInfoParam.presDataBuffer = avcSliceState->presDataBuffer;
@@ -1782,9 +1790,17 @@
if (avcSliceState->bShortFormatInUse)
{
- cmd.DW1.IndirectBsdDataLength = avcSliceState->dwLength + 1 - m_osInterface->dwNumNalUnitBytesIncluded;
- cmd.DW2.IndirectBsdDataStartAddress =
- sliceParams->slice_data_offset - 1 + m_osInterface->dwNumNalUnitBytesIncluded;
+ if (avcSliceState->bFullFrameData)
+ {
+ cmd.DW1.IndirectBsdDataLength = avcSliceState->dwLength;
+ cmd.DW2.IndirectBsdDataStartAddress = sliceParams->slice_data_offset;
+ }
+ else
+ {
+ cmd.DW1.IndirectBsdDataLength = avcSliceState->dwLength + 1 - m_osInterface->dwNumNalUnitBytesIncluded;
+ cmd.DW2.IndirectBsdDataStartAddress =
+ sliceParams->slice_data_offset - 1 + m_osInterface->dwNumNalUnitBytesIncluded;
+ }
cmd.DW4.FirstMbByteOffsetOfSliceDataOrSliceHeader = 0;
}
else
diff --git a/media_driver/agnostic/gen8/hw/vdbox/mhw_vdbox_mfx_g8_X.h b/media_driver/agnostic/gen8/hw/vdbox/mhw_vdbox_mfx_g8_X.h
index 3481efa..2b41151 100644
--- a/media_driver/agnostic/gen8/hw/vdbox/mhw_vdbox_mfx_g8_X.h
+++ b/media_driver/agnostic/gen8/hw/vdbox/mhw_vdbox_mfx_g8_X.h
@@ -1176,8 +1176,16 @@
typename TMfxCmds::MFD_AVC_SLICEADDR_CMD cmd;
- cmd.DW1.IndirectBsdDataLength = (avcSliceState->dwNextLength + 1 - this->m_osInterface->dwNumNalUnitBytesIncluded);
- cmd.DW2.IndirectBsdDataStartAddress = (avcSliceState->dwNextOffset - 1 + this->m_osInterface->dwNumNalUnitBytesIncluded);
+ if (avcSliceState->bFullFrameData)
+ {
+ cmd.DW1.IndirectBsdDataLength = avcSliceState->dwNextLength;
+ cmd.DW2.IndirectBsdDataStartAddress = avcSliceState->dwNextOffset;
+ }
+ else
+ {
+ cmd.DW1.IndirectBsdDataLength = (avcSliceState->dwNextLength + 1 - this->m_osInterface->dwNumNalUnitBytesIncluded);
+ cmd.DW2.IndirectBsdDataStartAddress = (avcSliceState->dwNextOffset - 1 + this->m_osInterface->dwNumNalUnitBytesIncluded);
+ }
MHW_CP_SLICE_INFO_PARAMS sliceInfoParam;
sliceInfoParam.presDataBuffer = avcSliceState->presDataBuffer;
@@ -1221,9 +1229,17 @@
if (avcSliceState->bShortFormatInUse)
{
- cmd.DW1.IndirectBsdDataLength = avcSliceState->dwLength + 1 - this->m_osInterface->dwNumNalUnitBytesIncluded;
- cmd.DW2.IndirectBsdDataStartAddress =
- sliceParams->slice_data_offset - 1 + this->m_osInterface->dwNumNalUnitBytesIncluded;
+ if (avcSliceState->bFullFrameData)
+ {
+ cmd.DW1.IndirectBsdDataLength = avcSliceState->dwLength;
+ cmd.DW2.IndirectBsdDataStartAddress = sliceParams->slice_data_offset;
+ }
+ else
+ {
+ cmd.DW1.IndirectBsdDataLength = avcSliceState->dwLength + 1 - this->m_osInterface->dwNumNalUnitBytesIncluded;
+ cmd.DW2.IndirectBsdDataStartAddress =
+ sliceParams->slice_data_offset - 1 + this->m_osInterface->dwNumNalUnitBytesIncluded;
+ }
cmd.DW4.FirstMbByteOffsetOfSliceDataOrSliceHeader = 0;
}
else
diff --git a/media_driver/agnostic/gen9/hw/vdbox/mhw_vdbox_mfx_g9_X.h b/media_driver/agnostic/gen9/hw/vdbox/mhw_vdbox_mfx_g9_X.h
index ea3f395..396025b 100644
--- a/media_driver/agnostic/gen9/hw/vdbox/mhw_vdbox_mfx_g9_X.h
+++ b/media_driver/agnostic/gen9/hw/vdbox/mhw_vdbox_mfx_g9_X.h
@@ -1420,8 +1420,16 @@
typename TMfxCmds::MFD_AVC_SLICEADDR_CMD cmd;
- cmd.DW1.IndirectBsdDataLength = (avcSliceState->dwNextLength + 1 - this->m_osInterface->dwNumNalUnitBytesIncluded);
- cmd.DW2.IndirectBsdDataStartAddress = (avcSliceState->dwNextOffset - 1 + this->m_osInterface->dwNumNalUnitBytesIncluded);
+ if (avcSliceState->bFullFrameData)
+ {
+ cmd.DW1.IndirectBsdDataLength = avcSliceState->dwNextLength;
+ cmd.DW2.IndirectBsdDataStartAddress = avcSliceState->dwNextOffset;
+ }
+ else
+ {
+ cmd.DW1.IndirectBsdDataLength = (avcSliceState->dwNextLength + 1 - this->m_osInterface->dwNumNalUnitBytesIncluded);
+ cmd.DW2.IndirectBsdDataStartAddress = (avcSliceState->dwNextOffset - 1 + this->m_osInterface->dwNumNalUnitBytesIncluded);
+ }
MHW_CP_SLICE_INFO_PARAMS sliceInfoParam;
sliceInfoParam.presDataBuffer = avcSliceState->presDataBuffer;
@@ -1465,9 +1473,17 @@
if (avcSliceState->bShortFormatInUse)
{
- cmd.DW1.IndirectBsdDataLength = avcSliceState->dwLength + 1 - this->m_osInterface->dwNumNalUnitBytesIncluded;
- cmd.DW2.IndirectBsdDataStartAddress =
- sliceParams->slice_data_offset - 1 + this->m_osInterface->dwNumNalUnitBytesIncluded;
+ if (avcSliceState->bFullFrameData)
+ {
+ cmd.DW1.IndirectBsdDataLength = avcSliceState->dwLength;
+ cmd.DW2.IndirectBsdDataStartAddress = sliceParams->slice_data_offset;
+ }
+ else
+ {
+ cmd.DW1.IndirectBsdDataLength = avcSliceState->dwLength + 1 - this->m_osInterface->dwNumNalUnitBytesIncluded;
+ cmd.DW2.IndirectBsdDataStartAddress =
+ sliceParams->slice_data_offset - 1 + this->m_osInterface->dwNumNalUnitBytesIncluded;
+ }
cmd.DW4.FirstMbByteOffsetOfSliceDataOrSliceHeader = 0;
}
else