diff options
author | Praveen Chavan <pchavan@codeaurora.org> | 2017-03-29 13:13:36 -0700 |
---|---|---|
committer | Sooraj Sasindran <sasindran@google.com> | 2017-04-26 18:42:47 -0700 |
commit | 70929c9d4f5f9a789c39d272581c72d3fa6aefe5 (patch) | |
tree | d09ea3c485b29666ea6b894aaedbbc9182057591 /msm8996 | |
parent | b76bf315339327ed8c3ee873f0fe8494e8df9f42 (diff) | |
download | media-70929c9d4f5f9a789c39d272581c72d3fa6aefe5.tar.gz |
mm-video-v4l2:add extension to support av-timer
mm-video-v4l2: venc: add extension to support av-timer timestamps
Use timestamps sent in-band with graphic handles (updated from
camera with av-timer source) for vt usecases.
Bug: 32746650
Change-Id: I2bfb7215ca4446fecf6b5450aa40e4e26350846b
CRs-Fixed: 2026950
Diffstat (limited to 'msm8996')
6 files changed, 69 insertions, 3 deletions
diff --git a/msm8996/mm-core/inc/OMX_QCOMExtns.h b/msm8996/mm-core/inc/OMX_QCOMExtns.h index 8e92946..2a36dcc 100644 --- a/msm8996/mm-core/inc/OMX_QCOMExtns.h +++ b/msm8996/mm-core/inc/OMX_QCOMExtns.h @@ -565,6 +565,7 @@ enum OMX_QCOM_EXTN_INDEXTYPE OMX_QTIIndexParamVPXColorSpaceExtraData = 0x7F000062, + OMX_QTIIndexParamEnableAVTimerTimestamps = 0x7F000063, }; /** diff --git a/msm8996/mm-video-v4l2/vidc/venc/inc/omx_video_base.h b/msm8996/mm-video-v4l2/vidc/venc/inc/omx_video_base.h index 3a96a2d..f97bcd7 100644 --- a/msm8996/mm-video-v4l2/vidc/venc/inc/omx_video_base.h +++ b/msm8996/mm-video-v4l2/vidc/venc/inc/omx_video_base.h @@ -653,6 +653,7 @@ class omx_video: public qc_omx_component OMX_VIDEO_PARAM_ANDROID_TEMPORALLAYERINGTYPE m_sParamTemporalLayers; OMX_VIDEO_CONFIG_ANDROID_TEMPORALLAYERINGTYPE m_sConfigTemporalLayers; DescribeColorAspectsParams m_sConfigColorAspects; + QOMX_ENABLETYPE m_sParamAVTimerTimestampMode; // use VT-timestamps in gralloc-handle // fill this buffer queue omx_cmd_queue m_ftb_q; diff --git a/msm8996/mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h b/msm8996/mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h index 8ad2235..80e7542 100644 --- a/msm8996/mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h +++ b/msm8996/mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h @@ -598,6 +598,7 @@ class venc_dev static inline int getTimeStampAt(native_handle_t *, int index); }; BatchInfo mBatchInfo; + bool mUseAVTimerTimestamps; }; enum instance_state { diff --git a/msm8996/mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp b/msm8996/mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp index acc5b02..0562bde 100644 --- a/msm8996/mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp +++ b/msm8996/mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp @@ -556,6 +556,9 @@ OMX_ERRORTYPE omx_venc::component_init(OMX_STRING role) OMX_INIT_STRUCT(&m_sConfigTemporalLayers, OMX_VIDEO_CONFIG_ANDROID_TEMPORALLAYERINGTYPE); + OMX_INIT_STRUCT(&m_sParamAVTimerTimestampMode, QOMX_ENABLETYPE); + m_sParamAVTimerTimestampMode.bEnable = OMX_FALSE; + m_state = OMX_StateLoaded; m_sExtraData = 0; @@ -1665,6 +1668,17 @@ OMX_ERRORTYPE omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE hComp, OMX_VIDEO_ANDROID_MAXTEMPORALLAYERS * sizeof(OMX_U32)); break; } + case OMX_QTIIndexParamEnableAVTimerTimestamps: + { + VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE); + if (!handle->venc_set_param(paramData, + (OMX_INDEXTYPE)OMX_QTIIndexParamEnableAVTimerTimestamps)) { + DEBUG_PRINT_ERROR("ERROR: Setting OMX_QTIIndexParamEnableAVTimerTimestamps failed"); + return OMX_ErrorUnsupportedSetting; + } + memcpy(&m_sParamAVTimerTimestampMode, paramData, sizeof(QOMX_ENABLETYPE)); + break; + } case OMX_IndexParamVideoSliceFMO: default: { diff --git a/msm8996/mm-video-v4l2/vidc/venc/src/omx_video_extensions.hpp b/msm8996/mm-video-v4l2/vidc/venc/src/omx_video_extensions.hpp index 163fd50..5be091e 100644 --- a/msm8996/mm-video-v4l2/vidc/venc/src/omx_video_extensions.hpp +++ b/msm8996/mm-video-v4l2/vidc/venc/src/omx_video_extensions.hpp @@ -44,6 +44,9 @@ void omx_video::init_vendor_extensions(VendorExtensionStore &store) { ADD_EXTENSION("qti-ext-enc-custom-profile-level", OMX_IndexParamVideoProfileLevelCurrent, OMX_DirOutput) ADD_PARAM ("profile", OMX_AndroidVendorValueInt32) ADD_PARAM_END("level", OMX_AndroidVendorValueInt32) + + ADD_EXTENSION("qti-ext-enc-timestamp-source-avtimer", OMX_QTIIndexParamEnableAVTimerTimestamps, OMX_DirInput) + ADD_PARAM_END("enable", OMX_AndroidVendorValueInt32) } OMX_ERRORTYPE omx_video::get_vendor_extension_config( @@ -66,7 +69,7 @@ OMX_ERRORTYPE omx_video::get_vendor_extension_config( bool setStatus = true; - switch (vExt.extensionIndex()) { + switch ((OMX_U32)vExt.extensionIndex()) { case OMX_IndexConfigCommonRotate: { setStatus &= vExt.setParamInt32(ext, "angle", m_sConfigFrameRotation.nRotation); @@ -92,6 +95,11 @@ OMX_ERRORTYPE omx_video::get_vendor_extension_config( break; } + case OMX_QTIIndexParamEnableAVTimerTimestamps: + { + setStatus &= vExt.setParamInt32(ext, "enable", m_sParamAVTimerTimestampMode.bEnable); + break; + } default: { return OMX_ErrorNotImplemented; @@ -124,7 +132,7 @@ OMX_ERRORTYPE omx_video::set_vendor_extension_config( vExt.set(); bool valueSet = false; - switch (vExt.extensionIndex()) { + switch ((OMX_U32)vExt.extensionIndex()) { case OMX_IndexConfigCommonRotate: { OMX_CONFIG_ROTATIONTYPE rotationParam; @@ -205,7 +213,25 @@ OMX_ERRORTYPE omx_video::set_vendor_extension_config( break; } + case OMX_QTIIndexParamEnableAVTimerTimestamps: + { + QOMX_ENABLETYPE avTimerEnableParam; + memcpy(&avTimerEnableParam, &m_sParamAVTimerTimestampMode, sizeof(QOMX_ENABLETYPE)); + valueSet |= vExt.readParamInt32(ext, "enable", (OMX_S32 *)&(avTimerEnableParam.bEnable)); + if (!valueSet) { + break; + } + DEBUG_PRINT_HIGH("VENDOR-EXT: AV-timer timestamp mode enable=%u", avTimerEnableParam.bEnable); + + err = set_parameter( + NULL, (OMX_INDEXTYPE)OMX_QTIIndexParamEnableAVTimerTimestamps, &avTimerEnableParam); + if (err != OMX_ErrorNone) { + DEBUG_PRINT_ERROR("set_param: OMX_QTIIndexParamEnableAVTimerTimestamps failed !"); + } + + break; + } default: { return OMX_ErrorNotImplemented; diff --git a/msm8996/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp b/msm8996/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp index 76bd24a..cb46051 100644 --- a/msm8996/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp +++ b/msm8996/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp @@ -304,6 +304,8 @@ venc_dev::venc_dev(class omx_venc *venc_class):mInputExtradata(venc_class), mOut } snprintf(m_debug.log_loc, PROPERTY_VALUE_MAX, "%s", BUFFER_LOG_LOC); + + mUseAVTimerTimestamps = false; } venc_dev::~venc_dev() @@ -2309,6 +2311,13 @@ bool venc_dev::venc_set_param(void *paramData, OMX_INDEXTYPE index) } break; } + case OMX_QTIIndexParamEnableAVTimerTimestamps: + { + QOMX_ENABLETYPE *pParam = (QOMX_ENABLETYPE *)paramData; + mUseAVTimerTimestamps = pParam->bEnable == OMX_TRUE; + DEBUG_PRINT_INFO("AVTimer timestamps enabled"); + break; + } case OMX_IndexParamVideoSliceFMO: default: DEBUG_PRINT_ERROR("ERROR: Unsupported parameter in venc_set_param: %u", @@ -3501,8 +3510,22 @@ bool venc_dev::venc_empty_buf(void *buffer, void *pmem_data_buf, unsigned index, fd, plane[0].bytesused, plane[0].length, buf.flags, m_sVenc_cfg.inputformat); } else if (meta_buf->buffer_type == kMetadataBufferTypeGrallocSource) { private_handle_t *handle = (private_handle_t *)meta_buf->meta_handle; - if (!streaming[OUTPUT_PORT] && handle) { + if (!handle) { + DEBUG_PRINT_ERROR("%s : handle is null!", __FUNCTION__); + return false; + } + + if (mUseAVTimerTimestamps) { + uint64_t avTimerTimestampNs = bufhdr->nTimeStamp * 1000; + if (getMetaData(handle, GET_VT_TIMESTAMP, &avTimerTimestampNs) == 0 + && avTimerTimestampNs > 0) { + bufhdr->nTimeStamp = avTimerTimestampNs / 1000; + DEBUG_PRINT_LOW("AVTimer TS : %llu us", (unsigned long long)bufhdr->nTimeStamp); + } + } + + if (!streaming[OUTPUT_PORT]) { // Moment of truth... actual colorspace is known here.. ColorSpace_t colorSpace = ITU_R_601; if (getMetaData(handle, GET_COLOR_SPACE, &colorSpace) == 0) { |