[PORT FROM R42B-STABLE] To fix the corruption problem of widevine playback on BYT

BZ: 146611

When the widevine clips have multiple slices in one frame,
the corruptions will be observed. This is caused by the mismatched
parameters between the LibMIX and i965 driver.

In the fix, the PAVP encrypted buffer is passed as the
VASliceDataBuffer just one time for each frame. The slice offset
and slice size are passed in the VASliceParameterBuffer for each
frame.

Change-Id: I1f4fadae60e76ca91d46597cc5738f65d7e4c7dd
Signed-off-by: wfeng6 <wei.feng@intel.com>
diff --git a/videodecoder/securevideo/baytrail/VideoDecoderAVCSecure.cpp b/videodecoder/securevideo/baytrail/VideoDecoderAVCSecure.cpp
index 675b37a..06fb677 100644
--- a/videodecoder/securevideo/baytrail/VideoDecoderAVCSecure.cpp
+++ b/videodecoder/securevideo/baytrail/VideoDecoderAVCSecure.cpp
@@ -92,6 +92,7 @@
     uint8_t naluType;
     frame_info_t* pFrameInfo;
 
+    mFrameSize = 0;
     if (buffer->flag & IS_SECURE_DATA) {
         VTRACE("Decoding protected video ...");
         mIsEncryptData = 1;
@@ -107,6 +108,9 @@
     }
     pFrameInfo = (frame_info_t*) buffer->data;
 
+    mFrameSize = pFrameInfo->length;
+    VTRACE("mFrameSize = %d", mFrameSize);
+
     memcpy(&mEncParam, pFrameInfo->pavp, sizeof(pavp_info_t));
     for (int32_t i = 0; i < pFrameInfo->num_nalus; i++) {
         naluType = pFrameInfo->nalus[i].type & NALU_TYPE_MASK;
@@ -277,7 +281,19 @@
             bufferIDCount++;
         }
 
+        vaStatus = vaCreateBuffer(
+            mVADisplay,
+            mVAContext,
+            VASliceDataBufferType,
+            mFrameSize, //size
+            1,        //num_elements
+            sliceData->buffer_addr + sliceData->slice_offset,
+            &bufferIDs[bufferIDCount]);
+        CHECK_VA_STATUS("vaCreateSliceDataBuffer");
+        bufferIDCount++;
+
     }
+
     vaStatus = vaCreateBuffer(
         mVADisplay,
         mVAContext,
@@ -290,29 +306,6 @@
     CHECK_VA_STATUS("vaCreateSliceParameterBuffer");
     bufferIDCount++;
 
-    if (mIsEncryptData) {
-        vaStatus = vaCreateBuffer(
-            mVADisplay,
-            mVAContext,
-            VASliceDataBufferType,
-            sliceData->slice_size, //size
-            1,        //num_elements
-            sliceData->buffer_addr + sliceData->slice_offset,
-            &bufferIDs[bufferIDCount]);
-    } else {
-        // This is for clear video playback
-        vaStatus = vaCreateBuffer(
-            mVADisplay,
-            mVAContext,
-            VASliceDataBufferType,
-            sliceData->slice_size, //size
-            1,        //num_elements
-            sliceData->buffer_addr + sliceData->slice_offset,
-            &bufferIDs[bufferIDCount]);
-    }
-    CHECK_VA_STATUS("vaCreateSliceDataBuffer");
-    bufferIDCount++;
-
     vaStatus = vaRenderPicture(
         mVADisplay,
         mVAContext,
diff --git a/videodecoder/securevideo/baytrail/VideoDecoderAVCSecure.h b/videodecoder/securevideo/baytrail/VideoDecoderAVCSecure.h
index 2b2e489..18289eb 100644
--- a/videodecoder/securevideo/baytrail/VideoDecoderAVCSecure.h
+++ b/videodecoder/securevideo/baytrail/VideoDecoderAVCSecure.h
@@ -46,6 +46,7 @@
     uint8_t *mNaluHeaderBuffer;
     uint8_t *mSliceHeaderBuffer;
     uint32_t mIsEncryptData;
+    uint32_t mFrameSize;
 };
 
 #endif /* VIDEO_DECODER_AVC_SECURE_H_ */