summaryrefslogtreecommitdiff
path: root/msm8996
diff options
context:
space:
mode:
authorPraveen Chavan <pchavan@codeaurora.org>2017-03-29 13:13:36 -0700
committerSooraj Sasindran <sasindran@google.com>2017-04-26 18:42:47 -0700
commit70929c9d4f5f9a789c39d272581c72d3fa6aefe5 (patch)
treed09ea3c485b29666ea6b894aaedbbc9182057591 /msm8996
parentb76bf315339327ed8c3ee873f0fe8494e8df9f42 (diff)
downloadmedia-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')
-rw-r--r--msm8996/mm-core/inc/OMX_QCOMExtns.h1
-rw-r--r--msm8996/mm-video-v4l2/vidc/venc/inc/omx_video_base.h1
-rw-r--r--msm8996/mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h1
-rw-r--r--msm8996/mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp14
-rw-r--r--msm8996/mm-video-v4l2/vidc/venc/src/omx_video_extensions.hpp30
-rw-r--r--msm8996/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp25
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) {