summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2014-08-04 08:30:41 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2014-08-04 08:30:41 -0700
commit32590c334b7682448e180857d5d6b260502e7737 (patch)
treef36eace852e7472c4b961870bb9b821aa40027a1
parent4f9ab24520fe115351929ecca6e40016ccc568db (diff)
parent60b4f4d4531e02c83efa97c3b9185461408481ac (diff)
downloadmedia-32590c334b7682448e180857d5d6b260502e7737.tar.gz
Merge "mm_video: vidc: Add support to set custom input buffer size"
-rw-r--r--mm-core/inc/OMX_QCOMExtns.h9
-rw-r--r--mm-video-v4l2/vidc/vdec/inc/omx_vdec.h3
-rw-r--r--mm-video-v4l2/vidc/vdec/src/omx_vdec_msm8974.cpp35
3 files changed, 47 insertions, 0 deletions
diff --git a/mm-core/inc/OMX_QCOMExtns.h b/mm-core/inc/OMX_QCOMExtns.h
index bc902cee..75447455 100644
--- a/mm-core/inc/OMX_QCOMExtns.h
+++ b/mm-core/inc/OMX_QCOMExtns.h
@@ -473,6 +473,9 @@ enum OMX_QCOM_EXTN_INDEXTYPE
/*"OMX.QCOM.index.config.video.LTRMark"*/
OMX_QcomIndexConfigVideoLTRMark = QOMX_IndexConfigVideoLTRMark,
+
+ /*"OMX.QCOM.index.param.video.CustomBufferSize"*/
+ OMX_QcomIndexParamVideoCustomBufferSize = 0x7F00003E,
};
/**
@@ -1325,6 +1328,12 @@ typedef struct QOMX_INDEXDOWNSCALAR {
OMX_BOOL bEnable;
} QOMX_INDEXDOWNSCALAR;
+typedef struct QOMX_VIDEO_CUSTOM_BUFFERSIZE {
+ OMX_U32 nSize;
+ OMX_VERSIONTYPE nVersion;
+ OMX_U32 nPortIndex;
+ OMX_U32 nBufferSize;
+} QOMX_VIDEO_CUSTOM_BUFFERSIZE;
#define OMX_QCOM_INDEX_PARAM_VIDEO_SYNCFRAMEDECODINGMODE "OMX.QCOM.index.param.video.SyncFrameDecodingMode"
#define OMX_QCOM_INDEX_PARAM_INDEXEXTRADATA "OMX.QCOM.index.param.IndexExtraData"
diff --git a/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h b/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h
index 40f8f80c..ac0b6f76 100644
--- a/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h
+++ b/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h
@@ -942,6 +942,9 @@ class omx_vdec: public qc_omx_component
OMX_U32 prev_n_filled_len;
bool is_down_scalar_enabled;
#endif
+ struct custom_buffersize {
+ OMX_U32 input_buffersize;
+ } m_custom_buffersize;
bool m_power_hinted;
bool is_q6_platform;
OMX_ERRORTYPE power_module_register();
diff --git a/mm-video-v4l2/vidc/vdec/src/omx_vdec_msm8974.cpp b/mm-video-v4l2/vidc/vdec/src/omx_vdec_msm8974.cpp
index c5a7e0c9..092ccc53 100644
--- a/mm-video-v4l2/vidc/vdec/src/omx_vdec_msm8974.cpp
+++ b/mm-video-v4l2/vidc/vdec/src/omx_vdec_msm8974.cpp
@@ -662,6 +662,7 @@ omx_vdec::omx_vdec(): m_error_propogated(false),
memset (&h264_scratch,0,sizeof (OMX_BUFFERHEADERTYPE));
memset (m_hwdevice_name,0,sizeof(m_hwdevice_name));
memset(m_demux_offsets, 0, ( sizeof(OMX_U32) * 8192) );
+ memset(&m_custom_buffersize, 0, sizeof(m_custom_buffersize));
m_demux_entries = 0;
msg_thread_id = 0;
async_thread_id = 0;
@@ -3379,6 +3380,13 @@ OMX_ERRORTYPE omx_vdec::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
}
}
}
+ if (m_custom_buffersize.input_buffersize
+ && (portDefn->nBufferSize > m_custom_buffersize.input_buffersize)) {
+ DEBUG_PRINT_ERROR("ERROR: Custom buffer size set by client: %d, trying to set: %d",
+ m_custom_buffersize.input_buffersize, portDefn->nBufferSize);
+ eRet = OMX_ErrorBadParameter;
+ break;
+ }
if (portDefn->nBufferCountActual >= drv_ctx.ip_buf.mincount
|| portDefn->nBufferSize != drv_ctx.ip_buf.buffer_size) {
port_format_changed = true;
@@ -3913,6 +3921,33 @@ OMX_ERRORTYPE omx_vdec::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
}
#endif
+ case OMX_QcomIndexParamVideoCustomBufferSize:
+ {
+ DEBUG_PRINT_LOW("set_parameter: OMX_QcomIndexParamVideoCustomBufferSize");
+ QOMX_VIDEO_CUSTOM_BUFFERSIZE* pParam = (QOMX_VIDEO_CUSTOM_BUFFERSIZE*)paramData;
+ if (pParam->nPortIndex == OMX_CORE_INPUT_PORT_INDEX) {
+ struct v4l2_control control;
+ control.id = V4L2_CID_MPEG_VIDC_VIDEO_BUFFER_SIZE_LIMIT;
+ control.value = pParam->nBufferSize;
+ if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
+ DEBUG_PRINT_ERROR("Failed to set input buffer size");
+ eRet = OMX_ErrorUnsupportedSetting;
+ } else {
+ eRet = get_buffer_req(&drv_ctx.ip_buf);
+ if (eRet == OMX_ErrorNone) {
+ m_custom_buffersize.input_buffersize = drv_ctx.ip_buf.buffer_size;
+ DEBUG_PRINT_HIGH("Successfully set custom input buffer size = %d",
+ m_custom_buffersize.input_buffersize);
+ } else {
+ DEBUG_PRINT_ERROR("Failed to get buffer requirement");
+ }
+ }
+ } else {
+ DEBUG_PRINT_ERROR("ERROR: Custom buffer size in not supported on output port");
+ eRet = OMX_ErrorBadParameter;
+ }
+ break;
+ }
default: {
DEBUG_PRINT_ERROR("Setparameter: unknown param %d", paramIndex);
eRet = OMX_ErrorUnsupportedIndex;