hardware: samsung_slsi: libhwjpeg: support DMABUF

Change-Id: I4ca119dbc9c83a2c334b095cf305fc8df72e0207
Signed-off-by: Sungjoong Kang <sj3.kang@samsung.com>
diff --git a/libhwjpeg/ExynosJpegBase.cpp b/libhwjpeg/ExynosJpegBase.cpp
index eb565d6..5f58515 100644
--- a/libhwjpeg/ExynosJpegBase.cpp
+++ b/libhwjpeg/ExynosJpegBase.cpp
@@ -194,43 +194,6 @@
     return iRet;
 }
 
-int ExynosJpegBase::t_v4l2Querybuf(int iFd, struct BUF_INFO *pstBufInfo, struct BUFFER *pstBuf)
-{
-    struct v4l2_buffer v4l2_buf;
-    struct v4l2_plane plane[JPEG_MAX_PLANE_CNT];
-    int iRet = ERROR_NONE;
-    int i;
-
-    memset(plane, 0, (int)JPEG_MAX_PLANE_CNT * sizeof(struct v4l2_plane));
-
-    v4l2_buf.index = 0;
-    v4l2_buf.type = pstBufInfo->buf_type;
-    v4l2_buf.memory = pstBufInfo->memory;
-    v4l2_buf.length = pstBufInfo->numOfPlanes;
-    v4l2_buf.m.planes = plane;
-
-    iRet = ioctl(iFd, VIDIOC_QUERYBUF, &v4l2_buf);
-    if (iRet < 0) {
-        JPEG_ERROR_LOG("[%s:%d]: VIDIOC_QUERYBUF failed\n", __func__, iRet);
-        return iRet;
-    }
-
-    for (i= 0; i < v4l2_buf.length; i++) {
-        pstBuf->size[i] = v4l2_buf.m.planes[i].length;
-        pstBuf->addr[i] = (char *) mmap(0,
-            pstBuf->size[i],
-            PROT_READ | PROT_WRITE, MAP_SHARED, iFd,
-            v4l2_buf.m.planes[i].m.mem_offset);
-
-        if ((pstBuf->addr[i] == MAP_FAILED) || (pstBuf->size[i] <= 0)) {
-            JPEG_ERROR_LOG("[%s]: mmap failed\n", __func__);
-            return ERROR_MMAP_FAILED;
-        }
-    }
-
-    return iRet;
-}
-
 int ExynosJpegBase::t_v4l2Qbuf(int iFd, struct BUF_INFO *pstBufInfo, struct BUFFER *pstBuf)
 {
     struct v4l2_buffer v4l2_buf;
@@ -248,9 +211,9 @@
     v4l2_buf.length = pstBufInfo->numOfPlanes;
     v4l2_buf.m.planes = plane;
 
-    if (pstBufInfo->memory == V4L2_MEMORY_USERPTR) {
+    if (pstBufInfo->memory == V4L2_MEMORY_DMABUF) {
         for (i = 0; i < pstBufInfo->numOfPlanes; i++) {
-            v4l2_buf.m.planes[i].m.userptr = (unsigned long)pstBuf->addr[i];
+            v4l2_buf.m.planes[i].m.fd = (unsigned long)pstBuf->addr[i];
             v4l2_buf.m.planes[i].length = pstBuf->size[i];
         }
     }
@@ -480,11 +443,7 @@
     case MODE_ENCODE:
         switch (t_stJpegConfig.pix.enc_fmt.in_fmt) {
         case V4L2_PIX_FMT_YUV420:
-            t_iPlaneNum = 3;
-            break;
         case V4L2_PIX_FMT_NV16:
-            t_iPlaneNum = 2;
-            break;
         case V4L2_PIX_FMT_YUYV:
         case V4L2_PIX_FMT_RGB565X:
         case V4L2_PIX_FMT_BGR32:
@@ -500,11 +459,7 @@
     case MODE_DECODE:
         switch (t_stJpegConfig.pix.dec_fmt.out_fmt) {
         case V4L2_PIX_FMT_YUV420:
-            t_iPlaneNum = 3;
-            break;
         case V4L2_PIX_FMT_NV16:
-            t_iPlaneNum = 2;
-            break;
         case V4L2_PIX_FMT_YUYV:
         case V4L2_PIX_FMT_RGB565X:
         case V4L2_PIX_FMT_BGR32:
@@ -535,7 +490,7 @@
     return &t_stJpegConfig;
 }
 
-int ExynosJpegBase::getBuf(bool bCreateBuf, struct BUFFER *pstBuf, char **pcBuf, int *iBufSize, int iSize, int iPlaneNum)
+int ExynosJpegBase::getBuf(bool bCreateBuf, struct BUFFER *pstBuf, int *piBuf, int *iBufSize, int iSize, int iPlaneNum)
 {
     if (t_bFlagCreate == false) {
         return ERROR_JPEG_DEVICE_NOT_CREATE_YET;
@@ -545,7 +500,7 @@
         return ERROR_BUF_NOT_SET_YET;
     }
 
-     if ((pcBuf == NULL) || (iSize == 0)) {
+     if ((piBuf == NULL) || (iSize == 0)) {
         return ERROR_BUFFR_IS_NULL;
      }
 
@@ -554,7 +509,7 @@
      }
 
     for (int i=0;i<iPlaneNum;i++) {
-        pcBuf[i] = pstBuf->addr[i];
+        piBuf[i] = pstBuf->addr[i];
     }
 
     for (int i=0;i<iPlaneNum;i++) {
@@ -564,7 +519,7 @@
     return ERROR_NONE;
 }
 
-int ExynosJpegBase::setBuf(struct BUFFER *pstBuf, char **pcBuf, int *iSize, int iPlaneNum)
+int ExynosJpegBase::setBuf(struct BUFFER *pstBuf, int *piBuf, int *iSize, int iPlaneNum)
 {
     if (t_bFlagCreate == false) {
         return ERROR_JPEG_DEVICE_NOT_CREATE_YET;
@@ -575,7 +530,7 @@
     }
 
     for(int i=0;i<iPlaneNum;i++) {
-        if (pcBuf[i] == NULL) {
+        if (piBuf[i] == NULL) {
             memset(pstBuf, 0, sizeof(struct BUFFER));
             return ERROR_BUFFR_IS_NULL;
         }
@@ -583,7 +538,7 @@
             memset(pstBuf, 0, sizeof(struct BUFFER));
             return ERROR_BUFFER_TOO_SMALL;
         }
-        pstBuf->addr[i] = pcBuf[i];
+        pstBuf->addr[i] = piBuf[i];
         pstBuf->size[i] = iSize[i];
     }
 
@@ -640,11 +595,7 @@
 
     switch (iV4l2ColorFormat) {
     case V4L2_PIX_FMT_YUV420:
-        t_iPlaneNum = 3;
-        break;
     case V4L2_PIX_FMT_NV16:
-        t_iPlaneNum = 2;
-        break;
     case V4L2_PIX_FMT_YUYV:
     case V4L2_PIX_FMT_RGB565X:
     case V4L2_PIX_FMT_BGR32:
@@ -721,6 +672,7 @@
     switch (iFormat) {
     case V4L2_PIX_FMT_YUYV:
     case V4L2_PIX_FMT_RGB565X:
+    case V4L2_PIX_FMT_NV16:
         pBufSize[0] = width*height*2;
         pBufSize[1] = 0;
         pBufSize[2] = 0;
@@ -731,15 +683,10 @@
         pBufSize[1] = 0;
         pBufSize[2] = 0;
         break;
-    case V4L2_PIX_FMT_NV16:
-        pBufSize[0] = width*height;
-        pBufSize[1] = width*height;
-        pBufSize[2] = 0;
-        break;
     case V4L2_PIX_FMT_YUV420:
-        pBufSize[0] = width*height;
-        pBufSize[1] = width*height/4;
-        pBufSize[2] = width*height/4;
+        pBufSize[0] = (width*height*3)/2;
+        pBufSize[1] = 0;
+        pBufSize[2] = 0;
         break;
     default:
         pBufSize[0] = width*height*4;
@@ -782,7 +729,7 @@
 
     stBufInfo.numOfPlanes = iInBufs;
     stBufInfo.buf_type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-    stBufInfo.memory = V4L2_MEMORY_USERPTR;
+    stBufInfo.memory = V4L2_MEMORY_DMABUF;
 
     iRet = t_v4l2Reqbufs(t_iJpegFd, iInBufs, &stBufInfo);
     if (iRet < 0) {
@@ -823,7 +770,7 @@
     stBufInfo.numOfPlanes = iInBufPlanes;
     stBufInfo.buf_type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
 
-    stBufInfo.memory = V4L2_MEMORY_USERPTR;
+    stBufInfo.memory = V4L2_MEMORY_DMABUF;
 
     iRet = t_v4l2Qbuf(t_iJpegFd, &stBufInfo, &t_stJpegInbuf);
     if (iRet < 0) {
diff --git a/libhwjpeg/ExynosJpegDecoder.cpp b/libhwjpeg/ExynosJpegDecoder.cpp
index bb3dbc5..a9e4139 100644
--- a/libhwjpeg/ExynosJpegDecoder.cpp
+++ b/libhwjpeg/ExynosJpegDecoder.cpp
@@ -75,21 +75,21 @@
     return ExynosJpegBase::setJpegConfig(MODE_DECODE, pConfig);
 }
 
-int ExynosJpegDecoder::getInBuf(char **pcBuf, int *piInputSize)
+int ExynosJpegDecoder::getInBuf(int *piBuf, int *piInputSize)
 {
-    return getBuf(t_bFlagCreateInBuf, &t_stJpegInbuf, pcBuf, piInputSize, \
+    return getBuf(t_bFlagCreateInBuf, &t_stJpegInbuf, piBuf, piInputSize, \
                         NUM_JPEG_DEC_IN_PLANES, NUM_JPEG_DEC_IN_PLANES);
 }
 
-int ExynosJpegDecoder::getOutBuf(char **pcBuf, int *piOutputSize, int iSize)
+int ExynosJpegDecoder::getOutBuf(int *piBuf, int *piOutputSize, int iSize)
 {
-    return getBuf(t_bFlagCreateOutBuf, &t_stJpegOutbuf, pcBuf, piOutputSize, iSize, t_iPlaneNum);
+    return getBuf(t_bFlagCreateOutBuf, &t_stJpegOutbuf, piBuf, piOutputSize, iSize, t_iPlaneNum);
 }
 
-int  ExynosJpegDecoder::setInBuf(char *pcBuf, int iSize)
+int  ExynosJpegDecoder::setInBuf(int iBuf, int iSize)
 {
     int iRet = ERROR_NONE;
-    iRet = setBuf(&t_stJpegInbuf, &pcBuf, &iSize, NUM_JPEG_DEC_IN_PLANES);
+    iRet = setBuf(&t_stJpegInbuf, &iBuf, &iSize, NUM_JPEG_DEC_IN_PLANES);
 
     if (iRet == ERROR_NONE) {
         t_bFlagCreateInBuf = true;
@@ -98,10 +98,10 @@
     return iRet;
 }
 
-int  ExynosJpegDecoder::setOutBuf(char **pcBuf, int *iSize)
+int  ExynosJpegDecoder::setOutBuf(int *piBuf, int *iSize)
 {
     int iRet = ERROR_NONE;
-    iRet = setBuf(&t_stJpegOutbuf, pcBuf, iSize, t_iPlaneNum);
+    iRet = setBuf(&t_stJpegOutbuf, piBuf, iSize, t_iPlaneNum);
 
     if (iRet == ERROR_NONE) {
         t_bFlagCreateOutBuf = true;
diff --git a/libhwjpeg/ExynosJpegEncoder.cpp b/libhwjpeg/ExynosJpegEncoder.cpp
index 7aaba12..f99affd 100644
--- a/libhwjpeg/ExynosJpegEncoder.cpp
+++ b/libhwjpeg/ExynosJpegEncoder.cpp
@@ -72,21 +72,21 @@
     return ExynosJpegBase::setJpegConfig(MODE_ENCODE, pConfig);
 }
 
- int ExynosJpegEncoder::getInBuf(char **pcBuf, int *piInputSize, int iSize)
+ int ExynosJpegEncoder::getInBuf(int *piBuf, int *piInputSize, int iSize)
 {
-    return getBuf(t_bFlagCreateInBuf, &t_stJpegInbuf, pcBuf, piInputSize, iSize, t_iPlaneNum);
+    return getBuf(t_bFlagCreateInBuf, &t_stJpegInbuf, piBuf, piInputSize, iSize, t_iPlaneNum);
 }
 
-int ExynosJpegEncoder::getOutBuf(char **pcBuf, int *piOutputSize)
+int ExynosJpegEncoder::getOutBuf(int *piBuf, int *piOutputSize)
 {
-    return getBuf(t_bFlagCreateOutBuf, &t_stJpegOutbuf, pcBuf, piOutputSize, \
+    return getBuf(t_bFlagCreateOutBuf, &t_stJpegOutbuf, piBuf, piOutputSize, \
         NUM_JPEG_ENC_OUT_PLANES, NUM_JPEG_ENC_OUT_PLANES);
 }
 
-int ExynosJpegEncoder::setInBuf(char **pcBuf, int *iSize)
+int ExynosJpegEncoder::setInBuf(int *piBuf, int *iSize)
 {
     int iRet = ERROR_NONE;
-    iRet = setBuf(&t_stJpegInbuf, pcBuf, iSize, t_iPlaneNum);
+    iRet = setBuf(&t_stJpegInbuf, piBuf, iSize, t_iPlaneNum);
 
     if (iRet == ERROR_NONE) {
         t_bFlagCreateInBuf = true;
@@ -95,10 +95,10 @@
     return iRet;
 }
 
-int  ExynosJpegEncoder::setOutBuf(char *pcBuf, int iSize)
+int  ExynosJpegEncoder::setOutBuf(int iBuf, int iSize)
 {
     int iRet = ERROR_NONE;
-    iRet = setBuf(&t_stJpegOutbuf, &pcBuf, &iSize, NUM_JPEG_ENC_OUT_PLANES);
+    iRet = setBuf(&t_stJpegOutbuf, &iBuf, &iSize, NUM_JPEG_ENC_OUT_PLANES);
 
     if (iRet == ERROR_NONE) {
         t_bFlagCreateOutBuf = true;