summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mm-core/inc/OMX_QCOMExtns.h4
-rw-r--r--mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h1
-rw-r--r--mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp27
-rw-r--r--mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp35
4 files changed, 66 insertions, 1 deletions
diff --git a/mm-core/inc/OMX_QCOMExtns.h b/mm-core/inc/OMX_QCOMExtns.h
index 6f36ee12..07982c30 100644
--- a/mm-core/inc/OMX_QCOMExtns.h
+++ b/mm-core/inc/OMX_QCOMExtns.h
@@ -528,6 +528,10 @@ enum OMX_QCOM_EXTN_INDEXTYPE
/* Enable VQZIP SEI NAL type */
OMX_QTIIndexParamVQZIPSEIType = 0x7F000053,
+
+ /* Encoder Low Latency mode */
+ OMX_QcomIndexConfigVideoVencLowLatencyMode = 0x7F000054,
+
};
/**
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 c4fce684..b918206e 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
@@ -408,6 +408,7 @@ class venc_dev
bool venc_set_session_priority(OMX_U32 priority);
bool venc_set_operatingrate(OMX_U32 rate);
bool venc_set_max_hierp(OMX_U32 hierp_layers);
+ bool venc_set_lowlatency_mode(OMX_BOOL enable);
#ifdef MAX_RES_1080P
OMX_U32 pmem_free();
diff --git a/mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp b/mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp
index b5ffd0e5..c1fe8560 100644
--- a/mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp
+++ b/mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp
@@ -55,6 +55,8 @@ static int bframes;
static int entropy;
static int perfmode;
static int hybrid_hp;
+static int lowlatency;
+
// factory function executed by the core to create instances
void *get_omx_component_factory_fn(void)
{
@@ -164,6 +166,10 @@ omx_venc::omx_venc()
property_get("vidc.debug.hybrid.hierp", property_value, "0");
hybrid_hp = atoi(property_value);
property_value[0] = '\0';
+ property_get("vidc.debug.lowlatency", property_value, "0");
+ lowlatency = atoi(property_value);
+ property_value[0] = '\0';
+
m_perf_control.send_hint_to_mpctl(true);
DEBUG_PRINT_HIGH("omx_venc: constructor completed");
}
@@ -607,6 +613,18 @@ OMX_ERRORTYPE omx_venc::component_init(OMX_STRING role)
DEBUG_PRINT_ERROR("Max hybrid_hp layers supported is %d", hybrid_hp);
}
}
+
+ if (lowlatency)
+ {
+ QOMX_ENABLETYPE low_latency;
+ low_latency.bEnable = OMX_TRUE;
+ DEBUG_PRINT_LOW("Enable lowlatency mode");
+ if (!handle->venc_set_param(&low_latency,
+ (OMX_INDEXTYPE)OMX_QcomIndexConfigVideoVencLowLatencyMode)) {
+ DEBUG_PRINT_ERROR("Failed enabling low latency mode");
+ }
+ }
+
DEBUG_PRINT_INFO("Component_init : %s : return = 0x%x", m_nkind, eRet);
return eRet;
}
@@ -1524,6 +1542,15 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
}
break;
}
+ case OMX_QcomIndexConfigVideoVencLowLatencyMode:
+ {
+ if(!handle->venc_set_param(paramData,
+ (OMX_INDEXTYPE)OMX_QcomIndexConfigVideoVencLowLatencyMode)) {
+ DEBUG_PRINT_ERROR("Request to Enable Low latency mode failed");
+ return OMX_ErrorUnsupportedSetting;
+ }
+ break;
+ }
case OMX_IndexParamVideoSliceFMO:
default:
{
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 217d3a07..e5571ca9 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
@@ -1941,6 +1941,16 @@ bool venc_dev::venc_set_param(void *paramData, OMX_INDEXTYPE index)
}
break;
}
+ case OMX_QcomIndexConfigVideoVencLowLatencyMode:
+ {
+ QOMX_ENABLETYPE *pParam = (QOMX_ENABLETYPE*)paramData;
+
+ if (!venc_set_lowlatency_mode(pParam->bEnable)) {
+ DEBUG_PRINT_ERROR("Setting low latency mode failed");
+ return OMX_ErrorUnsupportedSetting;
+ }
+ break;
+ }
case OMX_IndexParamVideoSliceFMO:
default:
DEBUG_PRINT_ERROR("ERROR: Unsupported parameter in venc_set_param: %u",
@@ -3665,7 +3675,8 @@ bool venc_dev::venc_set_intra_period(OMX_U32 nPFrames, OMX_U32 nBFrames)
DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%lu", control.id, intra_period.num_bframes);
- if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) {
+ if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264 ||
+ m_sVenc_cfg.codectype == V4L2_PIX_FMT_HEVC) {
control.id = V4L2_CID_MPEG_VIDC_VIDEO_IDR_PERIOD;
control.value = 1;
@@ -4661,6 +4672,28 @@ bool venc_dev::venc_set_max_hierp(OMX_U32 hierp_layers)
}
}
+bool venc_dev::venc_set_lowlatency_mode(OMX_BOOL enable)
+{
+ int rc = 0;
+ struct v4l2_control control;
+
+ control.id = V4L2_CID_MPEG_VIDC_VIDEO_LOWLATENCY_MODE;
+ if (enable)
+ control.value = V4L2_CID_MPEG_VIDC_VIDEO_LOWLATENCY_ENABLE;
+ else
+ control.value = V4L2_CID_MPEG_VIDC_VIDEO_LOWLATENCY_DISABLE;
+
+ DEBUG_PRINT_LOW("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 lowlatency control");
+ return false;
+ }
+ DEBUG_PRINT_LOW("Success IOCTL set control for id=%x, value=%d", control.id, control.value);
+
+ return true;
+}
+
bool venc_dev::venc_set_vui_timing_info(OMX_BOOL enable)
{
struct v4l2_control control;