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;
}