diff options
author | Linux Build Service Account <lnxbuild@localhost> | 2016-02-17 09:24:03 -0800 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2016-02-17 09:24:03 -0800 |
commit | e69363276f3f3ec147bfdf7023a6ed58c2083dcb (patch) | |
tree | 456548b0695f014736dad5e4e1c13c48b6c3f713 | |
parent | 844f029683104718380a2ed6b969a9947223ea06 (diff) | |
parent | 18cb781affefb71373c0798a2655ffa063e73233 (diff) | |
download | android_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.h | 36 | ||||
-rw-r--r-- | mm-video-v4l2/vidc/venc/inc/omx_video_base.h | 1 | ||||
-rw-r--r-- | mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h | 2 | ||||
-rw-r--r-- | mm-video-v4l2/vidc/venc/src/omx_video_base.cpp | 15 | ||||
-rw-r--r-- | mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp | 13 | ||||
-rw-r--r-- | mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp | 53 |
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; |