libmix: support Kbuf handle buffer sharing mode

BZ: 27501

support Kbuf handle buffer sharing mode
Signed-off-by: Weian Chen <weian.chen@intel.com>

Change-Id: Ic766a4e0d91cb9d8ebe48cea5a82c65fe7676d42
Reviewed-on: http://android.intel.com:8080/39155
Reviewed-by: Tao, Tao Q <tao.q.tao@intel.com>
Reviewed-by: Verdu, Miguel <miguel.verdu@intel.com>
Reviewed-by: Poornachandran, Rajesh <rajesh.poornachandran@intel.com>
Reviewed-by: Chen, Weian <weian.chen@intel.com>
Tested-by: Sun, Hang L <hang.l.sun@intel.com>
Reviewed-by: buildbot <buildbot@intel.com>
Tested-by: buildbot <buildbot@intel.com>
diff --git a/videoencoder/VideoEncoderBase.cpp b/videoencoder/VideoEncoderBase.cpp
old mode 100755
new mode 100644
index 2f45064..7a3b6a8
--- a/videoencoder/VideoEncoderBase.cpp
+++ b/videoencoder/VideoEncoderBase.cpp
@@ -200,6 +200,7 @@
             case BUFFER_SHARING_V4L2:
             case BUFFER_SHARING_SURFACE:
             case BUFFER_SHARING_GFXHANDLE:
+            case BUFFER_SHARING_KBUFHANDLE:
             {
                 mSharedSurfacesCnt = mUpstreamBufferCnt;
                 normalSurfacesCnt = VENCODER_NUMBER_EXTRA_SURFACES_SHARED_MODE;
@@ -280,6 +281,10 @@
             ret = surfaceMappingForGfxHandle();
             CHECK_ENCODE_STATUS_CLEANUP("surfaceMappingForGfxHandle");
             break;
+        case BUFFER_SHARING_KBUFHANDLE:
+            ret = surfaceMappingForKbufHandle();
+            CHECK_ENCODE_STATUS_CLEANUP("surfaceMappingForKbufHandle");
+            break;
         case BUFFER_SHARING_NONE:
             break;
         case BUFFER_SHARING_USRPTR: {
@@ -1513,8 +1518,7 @@
     }
 
     if (upStreamBuffer->bufAttrib) {
-        mBufAttrib->format = upStreamBuffer->bufAttrib->format;
-        mBufAttrib->lumaStride = upStreamBuffer->bufAttrib->lumaStride;
+        memcpy(mBufAttrib, upStreamBuffer->bufAttrib, sizeof(ExternalBufferAttrib));
     } else {
         LOG_E ("Buffer Attrib doesn't set by client, return error");
         return ENCODE_INVALID_PARAMS;
@@ -1687,6 +1691,35 @@
     return ret;
 }
 
+Encode_Status VideoEncoderBase::surfaceMappingForKbufHandle() {
+
+    uint32_t index;
+    VAStatus vaStatus = VA_STATUS_SUCCESS;
+    Encode_Status ret = ENCODE_SUCCESS;
+
+    uint32_t lumaOffset = 0;
+    uint32_t chromaUOffset = mBufAttrib->realHeight * mBufAttrib->lumaStride;
+    uint32_t chromaVOffset = chromaUOffset + 1;
+
+    for (index = 0; index < mSharedSurfacesCnt; index++) {
+
+        vaStatus = vaCreateSurfaceFromKBuf(
+                mVADisplay, mComParams.resolution.width, mComParams.resolution.height, VA_RT_FORMAT_YUV420,
+                (VASurfaceID *)&mSharedSurfaces[index], mUpstreamBufferList[index], mBufAttrib->lumaStride * mComParams.resolution.height * 3 / 2,
+                mBufAttrib->format, mBufAttrib->lumaStride, mBufAttrib->chromStride, mBufAttrib->chromStride, lumaOffset, chromaUOffset, chromaVOffset);
+
+        CHECK_VA_STATUS_RETURN("vaCreateSurfaceFromKbuf");
+
+        LOG_I("Surface ID created from Kbuf = 0x%08x", mSharedSurfaces[index]);
+
+        mSurfaces[index] = mSharedSurfaces[index];
+        ret = generateVideoBufferAndAttachToList(index, NULL);
+        CHECK_ENCODE_STATUS_RETURN("generateVideoBufferAndAttachToList");
+    }
+
+    return ret;
+}
+
 Encode_Status VideoEncoderBase::surfaceMappingForCIFrameList() {
     uint32_t index;
     VAStatus vaStatus = VA_STATUS_SUCCESS;
@@ -1731,7 +1764,9 @@
 
         }
 
-    } else if (mBufferMode == BUFFER_SHARING_SURFACE || mBufferMode == BUFFER_SHARING_GFXHANDLE) {
+    } else if (mBufferMode == BUFFER_SHARING_SURFACE ||
+                   mBufferMode == BUFFER_SHARING_GFXHANDLE  ||
+                   mBufferMode == BUFFER_SHARING_KBUFHANDLE) {
 
         bufIndex = (uint32_t) -1;
         data = *(uint32_t*)inBuffer->data;
@@ -1782,6 +1817,7 @@
         case BUFFER_SHARING_CI:
         case BUFFER_SHARING_SURFACE:
         case BUFFER_SHARING_GFXHANDLE:
+        case BUFFER_SHARING_KBUFHANDLE:
         case BUFFER_SHARING_USRPTR: {
 
             if (mRefFrame== NULL) {
diff --git a/videoencoder/VideoEncoderBase.h b/videoencoder/VideoEncoderBase.h
index a03f0dd..4b11253 100644
--- a/videoencoder/VideoEncoderBase.h
+++ b/videoencoder/VideoEncoderBase.h
@@ -62,6 +62,7 @@
     Encode_Status surfaceMappingForSurfaceList();
     Encode_Status surfaceMappingForGfxHandle();
     Encode_Status surfaceMappingForCIFrameList();
+    Encode_Status surfaceMappingForKbufHandle();
 
     VideoEncSurfaceBuffer *appendVideoSurfaceBuffer(
             VideoEncSurfaceBuffer *head, VideoEncSurfaceBuffer *buffer);
diff --git a/videoencoder/VideoEncoderDef.h b/videoencoder/VideoEncoderDef.h
index 67a2443..d5f10b5 100644
--- a/videoencoder/VideoEncoderDef.h
+++ b/videoencoder/VideoEncoderDef.h
@@ -98,6 +98,7 @@
     BUFFER_SHARING_SURFACE = 8,
     BUFFER_SHARING_USRPTR = 16,
     BUFFER_SHARING_GFXHANDLE = 32,
+    BUFFER_SHARING_KBUFHANDLE = 64,
     BUFFER_LAST
 };
 
@@ -213,8 +214,8 @@
 };
 
 typedef struct {
-    uint32_t width;
-    uint32_t height;
+    uint32_t realWidth;
+    uint32_t realHeight;
     uint32_t lumaStride;
     uint32_t chromStride;
     uint32_t format;