mm-video-v4l2: venc: Clean up slice mode handling

Remove stale definitions for slice-mode and merge
handling for MB and BYTE based slice-mode in a
single function.

CRs-Fixed: 2051408
Change-Id: I7f774d61868229c32551634c3f15aeeda9d20b61
diff --git a/mm-video-v4l2/vidc/venc/inc/omx_video_base.h b/mm-video-v4l2/vidc/venc/inc/omx_video_base.h
index f1f7c65..69b5f4c 100644
--- a/mm-video-v4l2/vidc/venc/inc/omx_video_base.h
+++ b/mm-video-v4l2/vidc/venc/inc/omx_video_base.h
@@ -140,12 +140,6 @@
 #define VEN_MSG_HW_OVERLOAD	11
 #define VEN_MSG_MAX_CLIENTS	12
 
-/*Different methods of Multi slice selection.*/
-#define VEN_MSLICE_OFF	1
-#define VEN_MSLICE_CNT_MB	2 /*number of MBscount per slice*/
-#define VEN_MSLICE_CNT_BYTE	3 /*number of bytes count per slice.*/
-#define VEN_MSLICE_GOB	4 /*Multi slice by GOB for H.263 only.*/
-
 #define MAX_NUM_INPUT_BUFFERS 64
 #define MAX_NUM_OUTPUT_BUFFERS 64
 
diff --git a/mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h b/mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h
index 8512231..a9f5e34 100644
--- a/mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h
+++ b/mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h
@@ -496,7 +496,7 @@
         bool venc_set_intra_vop_refresh(OMX_BOOL intra_vop_refresh);
         bool venc_set_color_format(OMX_COLOR_FORMATTYPE color_format);
         bool venc_validate_profile_level(OMX_U32 *eProfile, OMX_U32 *eLevel);
-        bool venc_set_multislice_cfg(OMX_INDEXTYPE codec, OMX_U32 slicesize);
+        bool venc_set_multislice_cfg(OMX_U32 slicemode, OMX_U32 slicesize);
         bool venc_set_entropy_config(OMX_BOOL enable, OMX_U32 i_cabac_level);
         bool venc_set_inloop_filter(OMX_VIDEO_AVCLOOPFILTERTYPE loop_filter);
         bool venc_set_intra_refresh (OMX_VIDEO_INTRAREFRESHTYPE intrarefresh, OMX_U32 irMBs);
diff --git a/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp b/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp
index 199e80f..31d01b8 100644
--- a/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp
+++ b/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp
@@ -1998,7 +1998,7 @@
                         return false;
                     }
 
-                    if (!venc_set_multislice_cfg(OMX_IndexParamVideoAvc, pParam->nSliceHeaderSpacing)) {
+                    if (!venc_set_multislice_cfg(V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_MB, pParam->nSliceHeaderSpacing)) {
                         DEBUG_PRINT_ERROR("WARNING: Unsuccessful in updating slice_config");
                         return false;
                     }
@@ -4979,19 +4979,40 @@
     return true;
 }
 
-bool venc_dev::venc_set_multislice_cfg(OMX_INDEXTYPE Codec, OMX_U32 nSlicesize) // MB
+bool venc_dev::venc_set_multislice_cfg(OMX_U32 nSlicemode, OMX_U32 nSlicesize)
 {
     int rc;
+    int slice_id = 0;
     struct v4l2_control control;
     bool status = true;
 
-    if ((Codec != OMX_IndexParamVideoH263)  && (nSlicesize)) {
-        control.value =  V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_MB;
-    } else {
-        control.value =  V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE;
+    if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H263 || nSlicesize == 0) {
+        nSlicemode = V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE;
+        nSlicesize = 0;
     }
 
-    control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE;
+    if (nSlicemode == V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_MB) {
+        if (!venc_validate_range(V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MB, nSlicesize)) {
+            DEBUG_PRINT_ERROR("Invalid settings, hardware doesn't support %u as slicesize", nSlicesize);
+            return false;
+        }
+        slice_id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MB;
+
+    } else if (nSlicemode == V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_BYTES) {
+        if (!venc_validate_range(V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_BYTES, nSlicesize)) {
+            DEBUG_PRINT_ERROR("Invalid settings, hardware doesn't support %u as slicesize", nSlicesize);
+            return false;
+        }
+        slice_id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_BYTES;
+
+    } else if (nSlicesize) {
+        DEBUG_PRINT_ERROR("Invalid settings, unexpected slicemode = %u and slice size = %u", nSlicemode, nSlicesize);
+        return false;
+    }
+
+    control.id    = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE;
+    control.value = nSlicemode;
+
     DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d", control.id, control.value);
     rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
 
@@ -5001,25 +5022,27 @@
     }
 
     DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d", control.id, control.value);
-    multislice.mslice_mode=control.value;
 
-    if (multislice.mslice_mode!=V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE) {
-
-        control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MB;
-        control.value = nSlicesize;
-        DEBUG_PRINT_LOW("Calling SLICE_MB IOCTL set control for id=%d, val=%d", control.id, control.value);
-        rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
-
-        if (rc) {
-        DEBUG_PRINT_ERROR("Failed to set control, id %#x, value %d", control.id, control.value);
-            return false;
-        }
-
-        DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d", control.id, control.value);
-        multislice.mslice_size=control.value;
-
+    if (nSlicemode == V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE) {
+        return status;
     }
 
+    control.id    = slice_id;
+    control.value = nSlicesize;
+
+    DEBUG_PRINT_LOW("Calling SLICE_MB IOCTL set control for id=%d, val=%d", control.id, control.value);
+    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
+
+    if (rc) {
+        DEBUG_PRINT_ERROR("Failed to set control");
+        return false;
+    }
+
+    DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d", control.id, control.value);
+
+    multislice.mslice_mode = nSlicemode;
+    multislice.mslice_size = nSlicesize;
+
     return status;
 }
 
@@ -5109,48 +5132,9 @@
         resynchMarkerSpacingBytes = error_resilience->nResynchMarkerSpacing;
         resynchMarkerSpacingBytes = ALIGN(resynchMarkerSpacingBytes, 8) >> 3;
     }
-    if (( m_sVenc_cfg.codectype != V4L2_PIX_FMT_H263) &&
-            (error_resilience->nResynchMarkerSpacing)) {
-        multislice_cfg.mslice_mode = VEN_MSLICE_CNT_BYTE;
-        multislice_cfg.mslice_size = resynchMarkerSpacingBytes;
-        control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE;
-        control.value = V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_BYTES;
-    } else {
-        multislice_cfg.mslice_mode = VEN_MSLICE_OFF;
-        multislice_cfg.mslice_size = 0;
-        control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE;
-        control.value =  V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE;
-    }
 
-    DEBUG_PRINT_LOW("%s(): mode = %lu, size = %lu", __func__,
-            multislice_cfg.mslice_mode, multislice_cfg.mslice_size);
-    DEBUG_PRINT_ERROR("Calling IOCTL set control for id=%x, val=%d", control.id, control.value);
-    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
+    status = venc_set_multislice_cfg(V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_BYTES, resynchMarkerSpacingBytes);
 
-    if (rc) {
-        DEBUG_PRINT_ERROR("Failed to set Slice mode control, value %d", control.value);
-        return false;
-    }
-
-    DEBUG_PRINT_ERROR("Success IOCTL set control for id=%x, value=%d", control.id, control.value);
-    multislice.mslice_mode=control.value;
-
-    if(multislice_cfg.mslice_mode == VEN_MSLICE_CNT_BYTE) {
-        control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_BYTES;
-        control.value = resynchMarkerSpacingBytes;
-        DEBUG_PRINT_ERROR("Calling IOCTL set control for id=%x, val=%d", control.id, control.value);
-
-        rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
-
-        if (rc) {
-            DEBUG_PRINT_ERROR("Failed to set MAX MB control, value %d", control.value);
-            return false;
-        }
-    }
-
-    DEBUG_PRINT_ERROR("Success IOCTL set control for id=%x, value=%d", control.id, control.value);
-    multislice.mslice_mode = multislice_cfg.mslice_mode;
-    multislice.mslice_size = multislice_cfg.mslice_size;
     return status;
 }