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;