[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