summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2016-02-17 09:24:03 -0800
committerGerrit - the friendly Code Review server <code-review@localhost>2016-02-17 09:24:03 -0800
commite69363276f3f3ec147bfdf7023a6ed58c2083dcb (patch)
tree456548b0695f014736dad5e4e1c13c48b6c3f713
parent844f029683104718380a2ed6b969a9947223ea06 (diff)
parent18cb781affefb71373c0798a2655ffa063e73233 (diff)
downloadandroid_hardware_qcom_media-e69363276f3f3ec147bfdf7023a6ed58c2083dcb.tar.gz
android_hardware_qcom_media-e69363276f3f3ec147bfdf7023a6ed58c2083dcb.tar.bz2
android_hardware_qcom_media-e69363276f3f3ec147bfdf7023a6ed58c2083dcb.zip
Merge "mm-video-v4l2: vidc: venc: Add support for low latency mode"
-rw-r--r--mm-core/inc/OMX_QCOMExtns.h36
-rw-r--r--mm-video-v4l2/vidc/venc/inc/omx_video_base.h1
-rw-r--r--mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h2
-rw-r--r--mm-video-v4l2/vidc/venc/src/omx_video_base.cpp15
-rw-r--r--mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp13
-rw-r--r--mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp53
6 files changed, 99 insertions, 21 deletions
diff --git a/mm-core/inc/OMX_QCOMExtns.h b/mm-core/inc/OMX_QCOMExtns.h
index 8eb50a23..07bf3c69 100644
--- a/mm-core/inc/OMX_QCOMExtns.h
+++ b/mm-core/inc/OMX_QCOMExtns.h
@@ -548,11 +548,32 @@ enum OMX_QCOM_EXTN_INDEXTYPE
/* Configure ROI info */
OMX_QTIIndexConfigVideoRoiInfo = 0x7F000059,
+ /* Set Low Latency Mode */
+ OMX_QTIIndexParamLowLatencyMode = 0x7F00005A,
+
/* Force OPB to UnCompressed mode */
OMX_QTIIndexParamForceUnCompressedForOPB = 0x7F00005A,
+
};
/**
+* This is custom extension to configure Low Latency Mode.
+*
+* STRUCT MEMBERS
+*
+* nSize : Size of Structure in bytes
+* nVersion : OpenMAX IL specification version information
+* bLowLatencyMode : Enable/Disable Low Latency mode
+*/
+
+typedef struct QOMX_EXTNINDEX_VIDEO_VENC_LOW_LATENCY_MODE
+{
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_BOOL bLowLatencyMode;
+} QOMX_EXTNINDEX_VIDEO_VENC_LOW_LATENCY_MODE;
+
+/**
* This is custom extension to configure Encoder Aspect Ratio.
*
* STRUCT MEMBERS
@@ -1590,20 +1611,6 @@ typedef struct QOMX_VIDEO_CUSTOM_BUFFERSIZE {
#define OMX_QCOM_INDEX_CONFIG_VIDEO_FRAMEPACKING_INFO "OMX.QCOM.index.config.video.FramePackingInfo"
#define OMX_QCOM_INDEX_PARAM_VIDEO_MPEG2SEQDISP_EXTRADATA "OMX.QCOM.index.param.video.Mpeg2SeqDispExtraData"
-
-#define OMX_QCOM_INDEX_PARAM_VIDEO_HIERSTRUCTURE "OMX.QCOM.index.param.video.HierStructure"
-#define OMX_QCOM_INDEX_PARAM_VIDEO_LTRCOUNT "OMX.QCOM.index.param.video.LTRCount"
-#define OMX_QCOM_INDEX_PARAM_VIDEO_LTRPERIOD "OMX.QCOM.index.param.video.LTRPeriod"
-#define OMX_QCOM_INDEX_CONFIG_VIDEO_LTRUSE "OMX.QCOM.index.config.video.LTRUse"
-#define OMX_QCOM_INDEX_CONFIG_VIDEO_LTRMARK "OMX.QCOM.index.config.video.LTRMark"
-#define OMX_QCOM_INDEX_CONFIG_VIDEO_MAX_HIER_P_LAYERS "OMX.QCOM.index.config.video.hierplayers"
-#define OMX_QCOM_INDEX_CONFIG_RECTANGLE_TYPE "OMX.QCOM.index.config.video.rectangle"
-#define OMX_QCOM_INDEX_PARAM_VIDEO_BASE_LAYER_ID "OMX.QCOM.index.param.video.baselayerid"
-#define OMX_QCOM_INDEX_PARAM_VIDEO_DRIVERVERSION "OMX.QCOM.index.param.video.FramePackingInfo"
-#define OMX_QCOM_INDEX_CONFIG_VIDEO_QP "OMX.QCOM.index.config.video.qp"
-#define OMX_QCOM_INDEX_PARAM_VIDEO_SAR "OMX.QCOM.index.param.video.sar"
-
-
#define OMX_QCOM_INDEX_PARAM_VIDEO_HIERSTRUCTURE "OMX.QCOM.index.param.video.HierStructure"
#define OMX_QCOM_INDEX_PARAM_VIDEO_LTRCOUNT "OMX.QCOM.index.param.video.LTRCount"
#define OMX_QCOM_INDEX_PARAM_VIDEO_LTRPERIOD "OMX.QCOM.index.param.video.LTRPeriod"
@@ -1614,6 +1621,7 @@ typedef struct QOMX_VIDEO_CUSTOM_BUFFERSIZE {
#define OMX_QCOM_INDEX_PARAM_VIDEO_BASE_LAYER_ID "OMX.QCOM.index.param.video.baselayerid"
#define OMX_QCOM_INDEX_CONFIG_VIDEO_QP "OMX.QCOM.index.config.video.qp"
#define OMX_QCOM_INDEX_PARAM_VIDEO_SAR "OMX.QCOM.index.param.video.sar"
+#define OMX_QTI_INDEX_PARAM_VIDEO_LOW_LATENCY "OMX.QTI.index.param.video.LowLatency"
#define OMX_QCOM_INDEX_PARAM_VIDEO_PASSINPUTBUFFERFD "OMX.QCOM.index.param.video.PassInputBufferFd"
#define OMX_QTI_INDEX_PARAM_VIDEO_PREFER_ADAPTIVE_PLAYBACK "OMX.QTI.index.param.video.PreferAdaptivePlayback"
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 883c18c7..d9e5a4a4 100644
--- a/mm-video-v4l2/vidc/venc/inc/omx_video_base.h
+++ b/mm-video-v4l2/vidc/venc/inc/omx_video_base.h
@@ -635,6 +635,7 @@ class omx_video: public qc_omx_component
PrependSPSPPSToIDRFramesParams m_sPrependSPSPPS;
OMX_U32 m_sExtraData;
OMX_U32 m_input_msg_id;
+ QOMX_EXTNINDEX_VIDEO_VENC_LOW_LATENCY_MODE m_slowLatencyMode;
// fill this buffer queue
omx_cmd_queue m_ftb_q;
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 0d5ef09f..4499a1b2 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
@@ -504,6 +504,7 @@ class venc_dev
bool venc_set_operatingrate(OMX_U32 rate);
bool venc_set_layer_bitrates(QOMX_EXTNINDEX_VIDEO_HYBRID_HP_MODE* hpmode);
bool venc_set_roi_qp_info(OMX_QTI_VIDEO_CONFIG_ROIINFO *roiInfo);
+ bool venc_set_low_latency(OMX_BOOL enable);
#ifdef MAX_RES_1080P
OMX_U32 pmem_free();
@@ -532,6 +533,7 @@ class venc_dev
int supported_rc_modes;
bool is_thulium_v1;
bool camera_mode_enabled;
+ OMX_BOOL low_latency_mode;
bool venc_empty_batch (OMX_BUFFERHEADERTYPE *buf, unsigned index);
static const int kMaxBuffersInBatch = 16;
diff --git a/mm-video-v4l2/vidc/venc/src/omx_video_base.cpp b/mm-video-v4l2/vidc/venc/src/omx_video_base.cpp
index e7e3845c..63a37f0b 100644
--- a/mm-video-v4l2/vidc/venc/src/omx_video_base.cpp
+++ b/mm-video-v4l2/vidc/venc/src/omx_video_base.cpp
@@ -2045,6 +2045,13 @@ OMX_ERRORTYPE omx_video::get_parameter(OMX_IN OMX_HANDLETYPE hComp,
memcpy(pParam, &m_sSar, sizeof(m_sSar));
break;
}
+ case OMX_QTIIndexParamLowLatencyMode:
+ {
+ QOMX_EXTNINDEX_VIDEO_VENC_LOW_LATENCY_MODE * pParam =
+ reinterpret_cast<QOMX_EXTNINDEX_VIDEO_VENC_LOW_LATENCY_MODE *>(paramData);
+ memcpy(pParam, &m_slowLatencyMode, sizeof(m_slowLatencyMode));
+ break;
+ }
case OMX_IndexParamVideoSliceFMO:
default:
{
@@ -2294,6 +2301,7 @@ OMX_ERRORTYPE omx_video::get_extension_index(OMX_IN OMX_HANDLETYPE hComp,
*indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamBatchSize;
return OMX_ErrorNone;
}
+
if (!strncmp(paramName, OMX_QTI_INDEX_PARAM_VIDEO_ENABLE_ROIINFO,
sizeof(OMX_QTI_INDEX_PARAM_VIDEO_ENABLE_ROIINFO) - 1)) {
*indexType = (OMX_INDEXTYPE)OMX_QTIIndexParamVideoEnableRoiInfo;
@@ -2304,6 +2312,13 @@ OMX_ERRORTYPE omx_video::get_extension_index(OMX_IN OMX_HANDLETYPE hComp,
*indexType = (OMX_INDEXTYPE)OMX_QTIIndexConfigVideoRoiInfo;
return OMX_ErrorNone;
}
+
+ if (!strncmp(paramName, "OMX.QTI.index.param.video.LowLatency",
+ sizeof("OMX.QTI.index.param.video.LowLatency") - 1)) {
+ *indexType = (OMX_INDEXTYPE)OMX_QTIIndexParamLowLatencyMode;
+ return OMX_ErrorNone;
+ }
+
return OMX_ErrorNotImplemented;
}
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 94a61165..75ae1d62 100644
--- a/mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp
+++ b/mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp
@@ -543,6 +543,9 @@ OMX_ERRORTYPE omx_venc::component_init(OMX_STRING role)
m_sMBIStatistics.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
m_sMBIStatistics.eMBIStatisticsType = QOMX_MBI_STATISTICS_MODE_DEFAULT;
+ OMX_INIT_STRUCT(&m_slowLatencyMode, QOMX_EXTNINDEX_VIDEO_VENC_LOW_LATENCY_MODE);
+ m_slowLatencyMode.bLowLatencyMode = OMX_FALSE;
+
m_state = OMX_StateLoaded;
m_sExtraData = 0;
@@ -1564,6 +1567,16 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
}
break;
}
+ case OMX_QTIIndexParamLowLatencyMode:
+ {
+ if (!handle->venc_set_param(paramData,
+ (OMX_INDEXTYPE)OMX_QTIIndexParamLowLatencyMode)) {
+ DEBUG_PRINT_ERROR("ERROR: Setting OMX_QTIIndexParamLowLatencyMode failed");
+ return OMX_ErrorUnsupportedSetting;
+ }
+ memcpy(&m_slowLatencyMode, paramData, sizeof(m_slowLatencyMode));
+ 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 532172da..ceafc1dc 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
@@ -266,6 +266,7 @@ venc_dev::venc_dev(class omx_venc *venc_class):mInputExtradata(venc_class), mOut
memset(&hybrid_hp, 0, sizeof(hybrid_hp));
sess_priority.priority = 1;
operating_rate = 0;
+ low_latency_mode = OMX_FALSE;
char property_value[PROPERTY_VALUE_MAX] = {0};
property_get("vidc.enc.log.in", property_value, "0");
@@ -2272,6 +2273,16 @@ bool venc_dev::venc_set_param(void *paramData, OMX_INDEXTYPE index)
}
break;
}
+ case OMX_QTIIndexParamLowLatencyMode:
+ {
+ QOMX_EXTNINDEX_VIDEO_VENC_LOW_LATENCY_MODE* pParam =
+ (QOMX_EXTNINDEX_VIDEO_VENC_LOW_LATENCY_MODE*)paramData;
+ if (!venc_set_low_latency(pParam->bLowLatencyMode)) {
+ DEBUG_PRINT_ERROR("ERROR: Setting OMX_QTIIndexParamLowLatencyMode failed");
+ return OMX_ErrorUnsupportedSetting;
+ }
+ break;
+ }
case OMX_IndexParamVideoSliceFMO:
default:
DEBUG_PRINT_ERROR("ERROR: Unsupported parameter in venc_set_param: %u",
@@ -2781,14 +2792,20 @@ unsigned venc_dev::venc_start(void)
streaming[CAPTURE_PORT] = true;
- control.id = V4L2_CID_MPEG_VIDC_VIDEO_REQUEST_SEQ_HEADER;
- control.value = 1;
- ret = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
- if (ret) {
- DEBUG_PRINT_ERROR("failed to request seq header");
- return 1;
- }
+ /*
+ * Workaround for Skype usecase. Skpye doesn't like SPS\PPS come as
+ seperate buffer. It wants SPS\PPS with IDR frame FTB.
+ */
+ if (!low_latency_mode) {
+ control.id = V4L2_CID_MPEG_VIDC_VIDEO_REQUEST_SEQ_HEADER;
+ control.value = 1;
+ ret = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
+ if (ret) {
+ DEBUG_PRINT_ERROR("failed to request seq header");
+ return 1;
+ }
+ }
stopped = 0;
return 0;
@@ -5618,6 +5635,28 @@ bool venc_dev::venc_set_max_hierp(OMX_U32 hierp_layers)
}
}
+bool venc_dev::venc_set_low_latency(OMX_BOOL enable)
+{
+ struct v4l2_control control;
+
+ if (m_sVenc_cfg.codectype != V4L2_PIX_FMT_H264) {
+ DEBUG_PRINT_ERROR("Low Latency mode is valid only for H264");
+ return false;
+ }
+
+ enable ? control.value = 2 : control.value = 0;
+
+ control.id = V4L2_CID_MPEG_VIDC_VIDEO_H264_PIC_ORDER_CNT;
+ if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) {
+ DEBUG_PRINT_ERROR("Failed to set H264_PICORDER_CNT");
+ return false;
+ }
+
+ low_latency_mode = (OMX_BOOL) enable;
+
+ return true;
+}
+
bool venc_dev::venc_set_baselayerid(OMX_U32 baseid)
{
struct v4l2_control control;