diff options
-rw-r--r-- | mm-core/inc/OMX_QCOMExtns.h | 4 | ||||
-rw-r--r-- | mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h | 1 | ||||
-rw-r--r-- | mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp | 27 | ||||
-rw-r--r-- | mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp | 35 |
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; |