Merge "mm-video: vidc: Add support to set frame rate to driver"
diff --git a/mm-core/inc/OMX_QCOMExtns.h b/mm-core/inc/OMX_QCOMExtns.h
index b55a64d..b3d175e 100644
--- a/mm-core/inc/OMX_QCOMExtns.h
+++ b/mm-core/inc/OMX_QCOMExtns.h
@@ -373,6 +373,8 @@
/*"OMX.QCOM.index.param.video.QPRange" */
OMX_QcomIndexParamVideoQPRange = 0x7F000022,
+
+ OMX_QcomIndexEnableH263PlusPType = 0x7F000023,
};
/**
diff --git a/mm-video/vidc/vdec/Android.mk b/mm-video/vidc/vdec/Android.mk
index 30f3dac..b9bf414 100755
--- a/mm-video/vidc/vdec/Android.mk
+++ b/mm-video/vidc/vdec/Android.mk
@@ -128,7 +128,7 @@
LOCAL_C_INCLUDES := $(mm-vdec-test-inc)
LOCAL_PRELINK_MODULE := false
-LOCAL_SHARED_LIBRARIES := libutils libOmxCore libOmxVdec libbinder
+LOCAL_SHARED_LIBRARIES := libutils libOmxCore libOmxVdec libbinder libcutils
LOCAL_SRC_FILES := src/queue.c
LOCAL_SRC_FILES += test/omx_vdec_test.cpp
diff --git a/mm-video/vidc/vdec/inc/omx_vdec.h b/mm-video/vidc/vdec/inc/omx_vdec.h
index d5ddbc3..2bb1f47 100644
--- a/mm-video/vidc/vdec/inc/omx_vdec.h
+++ b/mm-video/vidc/vdec/inc/omx_vdec.h
@@ -610,14 +610,16 @@
void adjust_timestamp(OMX_S64 &act_timestamp);
void set_frame_rate(OMX_S64 act_timestamp);
void handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr);
- OMX_ERRORTYPE enable_extradata(OMX_U32 requested_extradata, bool enable = true);
void print_debug_extradata(OMX_OTHER_EXTRADATATYPE *extra);
#ifdef _MSM8974_
void append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra,
OMX_U32 interlaced_format_type);
+ OMX_ERRORTYPE enable_extradata(OMX_U32 requested_extradata, bool is_internal,
+ bool enable = true);
#else
void append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra,
OMX_U32 interlaced_format_type, OMX_U32 buf_index);
+ OMX_ERRORTYPE enable_extradata(OMX_U32 requested_extradata, bool enable = true);
#endif
void append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra,
OMX_U32 num_conceal_mb,
@@ -801,6 +803,8 @@
OMX_U32 h264_last_au_flags;
OMX_U32 m_demux_offsets[8192];
OMX_U32 m_demux_entries;
+ OMX_U32 m_disp_hor_size;
+ OMX_U32 m_disp_vert_size;
OMX_S64 prev_ts;
bool rst_prev_ts;
diff --git a/mm-video/vidc/vdec/src/omx_vdec.cpp b/mm-video/vidc/vdec/src/omx_vdec.cpp
index 931c544..9f037c1 100644
--- a/mm-video/vidc/vdec/src/omx_vdec.cpp
+++ b/mm-video/vidc/vdec/src/omx_vdec.cpp
@@ -483,6 +483,8 @@
h264_last_au_ts(LLONG_MAX),
h264_last_au_flags(0),
m_inp_err_count(0),
+ m_disp_hor_size(0),
+ m_disp_vert_size(0),
#ifdef _ANDROID_
m_heap_ptr(NULL),
m_heap_count(0),
@@ -2663,6 +2665,11 @@
eRet = OMX_ErrorNoMore;
}
}
+ else
+ {
+ DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported ret NoMore\n");
+ eRet = OMX_ErrorNoMore;
+ }
}
else
{
@@ -6929,7 +6936,6 @@
output_respbuf->aspect_ratio_info =
vdec_msg->msgdata.output_frame.aspect_ratio_info;
-
if (omx->output_use_buffer)
memcpy ( omxhdr->pBuffer,
(vdec_msg->msgdata.output_frame.bufferaddr +
@@ -8244,7 +8250,6 @@
OMX_U32 index = p_buf_hdr - m_out_mem_ptr;
OMX_U8* pBuffer = (OMX_U8 *)drv_ctx.ptr_outputbuffer[index].bufferaddr;
-
p_extra = (OMX_OTHER_EXTRADATATYPE *)
((unsigned)(pBuffer + p_buf_hdr->nOffset +
p_buf_hdr->nFilledLen + 3)&(~3));
@@ -8300,8 +8305,24 @@
}
else if (p_extra->eType == VDEC_EXTRADATA_EXT_DATA)
{
+ OMX_U8 *data_ptr = (OMX_U8*)p_extra->data;
+ OMX_U32 value = 0;
p_extn_user[extn_user_data_cnt] = p_extra;
extn_user_data_cnt++;
+ if((*data_ptr & 0xf0) == 0x20)
+ {
+ value = ((*data_ptr) & 0x01);
+ data_ptr++;
+ if (value)
+ data_ptr += 3;
+ value = *((OMX_U32*)data_ptr);
+ value = ((value << 24) | (((value >> 8)<<24)>>8) |
+ (((value >> 16)<<24)>>16) | (value >> 24));
+ m_disp_hor_size = (value & 0xfffc0000)>>18;
+ m_disp_vert_size = (value & 0x0001fff8)>>3;
+ DEBUG_PRINT_LOW("Display Vertical Size = %d Display Horizontal Size = %d",
+ m_disp_vert_size, m_disp_hor_size);
+ }
}
else if (p_extra->eType == VDEC_EXTRADATA_USER_DATA)
{
@@ -8682,8 +8703,74 @@
OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info)
{
m_extradata = frame_info;
- m_extradata->aspectRatio.aspectRatioX = aspect_ratio_info->par_width;
- m_extradata->aspectRatio.aspectRatioY = aspect_ratio_info->par_height;
+ if(drv_ctx.decoder_format == VDEC_CODECTYPE_MPEG2)
+ {
+ switch(aspect_ratio_info->aspect_ratio)
+ {
+ case 1:
+ m_extradata->aspectRatio.aspectRatioX = 1;
+ m_extradata->aspectRatio.aspectRatioY = 1;
+ break;
+ case 2:
+ if (m_disp_hor_size && m_disp_vert_size)
+ {
+ m_extradata->aspectRatio.aspectRatioX = aspect_ratio_info->par_width *
+ m_disp_vert_size;
+ m_extradata->aspectRatio.aspectRatioY = aspect_ratio_info->par_height *
+ m_disp_hor_size;
+ }
+ else
+ {
+ m_extradata->aspectRatio.aspectRatioX = aspect_ratio_info->par_width *
+ drv_ctx.video_resolution.frame_height;
+ m_extradata->aspectRatio.aspectRatioY = aspect_ratio_info->par_height *
+ drv_ctx.video_resolution.frame_width;
+ }
+ break;
+ case 3:
+ if (m_disp_hor_size && m_disp_vert_size)
+ {
+ m_extradata->aspectRatio.aspectRatioX = aspect_ratio_info->par_width *
+ m_disp_vert_size;
+ m_extradata->aspectRatio.aspectRatioY = aspect_ratio_info->par_height *
+ m_disp_hor_size;
+ }
+ else
+ {
+ m_extradata->aspectRatio.aspectRatioX = aspect_ratio_info->par_width *
+ drv_ctx.video_resolution.frame_height;
+ m_extradata->aspectRatio.aspectRatioY = aspect_ratio_info->par_height *
+ drv_ctx.video_resolution.frame_width;
+ }
+ break;
+ case 4:
+ if (m_disp_hor_size && m_disp_vert_size)
+ {
+ m_extradata->aspectRatio.aspectRatioX = aspect_ratio_info->par_width *
+ m_disp_vert_size;
+ m_extradata->aspectRatio.aspectRatioY = aspect_ratio_info->par_height *
+ m_disp_hor_size;
+ }
+ else
+ {
+ m_extradata->aspectRatio.aspectRatioX = aspect_ratio_info->par_width *
+ drv_ctx.video_resolution.frame_height;
+ m_extradata->aspectRatio.aspectRatioY = aspect_ratio_info->par_height *
+ drv_ctx.video_resolution.frame_width;
+ }
+ break;
+ default:
+ m_extradata->aspectRatio.aspectRatioX = 1;
+ m_extradata->aspectRatio.aspectRatioY = 1;
+ }
+ }
+ else
+ {
+ m_extradata->aspectRatio.aspectRatioX = aspect_ratio_info->par_width;
+ m_extradata->aspectRatio.aspectRatioY = aspect_ratio_info->par_height;
+ }
+ DEBUG_PRINT_LOW("aspectRatioX %d aspectRatioX %d", m_extradata->aspectRatio.aspectRatioX,
+ m_extradata->aspectRatio.aspectRatioY);
}
void omx_vdec::append_portdef_extradata(OMX_OTHER_EXTRADATATYPE *extra)
diff --git a/mm-video/vidc/vdec/src/omx_vdec_msm8974.cpp b/mm-video/vidc/vdec/src/omx_vdec_msm8974.cpp
index c82df29..4ecf0b5 100644
--- a/mm-video/vidc/vdec/src/omx_vdec_msm8974.cpp
+++ b/mm-video/vidc/vdec/src/omx_vdec_msm8974.cpp
@@ -1331,7 +1331,6 @@
int r,ret=0;
bool codec_ambiguous = false;
OMX_STRING device_name = "/dev/video32";
-
if(!strncmp(role, "OMX.qcom.video.decoder.avc.secure",OMX_MAX_STRINGNAME_SIZE)){
struct v4l2_control control;
secure_mode = true;
@@ -1647,7 +1646,7 @@
DEBUG_PRINT_HIGH("Input Buffer Size =%d \n ",drv_ctx.ip_buf.buffer_size);
#ifdef DEFAULT_EXTRADATA
if (eRet == OMX_ErrorNone && !secure_mode)
- enable_extradata(DEFAULT_EXTRADATA, 1);
+ enable_extradata(DEFAULT_EXTRADATA, true, true);
#endif
if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
{
@@ -3122,11 +3121,13 @@
}
}
else if (portDefn->nBufferCountActual >= drv_ctx.ip_buf.mincount
- && portDefn->nBufferSize == drv_ctx.ip_buf.buffer_size)
+ || portDefn->nBufferSize != drv_ctx.ip_buf.buffer_size)
{
+ vdec_allocatorproperty *buffer_prop = &drv_ctx.ip_buf;
drv_ctx.ip_buf.actualcount = portDefn->nBufferCountActual;
- drv_ctx.ip_buf.buffer_size = portDefn->nBufferSize;
- eRet = set_buffer_req(&drv_ctx.ip_buf);
+ drv_ctx.ip_buf.buffer_size = (portDefn->nBufferSize + buffer_prop->alignment - 1) &
+ (~(buffer_prop->alignment - 1));
+ eRet = set_buffer_req(buffer_prop);
}
else
{
@@ -3443,7 +3444,7 @@
}
case OMX_QcomIndexParamConcealMBMapExtraData:
if(!secure_mode)
- eRet = enable_extradata(VDEC_EXTRADATA_MB_ERROR_MAP,
+ eRet = enable_extradata(VDEC_EXTRADATA_MB_ERROR_MAP, false,
((QOMX_ENABLETYPE *)paramData)->bEnable);
else {
DEBUG_PRINT_ERROR("\n secure mode setting not supported");
@@ -3453,7 +3454,7 @@
case OMX_QcomIndexParamFrameInfoExtraData:
{
if(!secure_mode)
- eRet = enable_extradata(OMX_FRAMEINFO_EXTRADATA,
+ eRet = enable_extradata(OMX_FRAMEINFO_EXTRADATA, false,
((QOMX_ENABLETYPE *)paramData)->bEnable);
else {
DEBUG_PRINT_ERROR("\n secure mode setting not supported");
@@ -3463,7 +3464,7 @@
}
case OMX_QcomIndexParamInterlaceExtraData:
if(!secure_mode)
- eRet = enable_extradata(OMX_INTERLACE_EXTRADATA,
+ eRet = enable_extradata(OMX_INTERLACE_EXTRADATA, false,
((QOMX_ENABLETYPE *)paramData)->bEnable);
else {
DEBUG_PRINT_ERROR("\n secure mode setting not supported");
@@ -3472,7 +3473,7 @@
break;
case OMX_QcomIndexParamH264TimeInfo:
if(!secure_mode)
- eRet = enable_extradata(OMX_TIMEINFO_EXTRADATA,
+ eRet = enable_extradata(OMX_TIMEINFO_EXTRADATA, false,
((QOMX_ENABLETYPE *)paramData)->bEnable);
else {
DEBUG_PRINT_ERROR("\n secure mode setting not supported");
@@ -3541,7 +3542,7 @@
(extradataIndexType->nPortIndex == 1))
{
DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamIndexExtraDataType SmoothStreaming\n");
- eRet = enable_extradata(OMX_PORTDEF_EXTRADATA, extradataIndexType->bEnabled);
+ eRet = enable_extradata(OMX_PORTDEF_EXTRADATA, false, extradataIndexType->bEnabled);
}
}
@@ -7807,9 +7808,6 @@
extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
extra_data_size = fmt.fmt.pix_mp.plane_fmt[extra_idx].sizeimage;
- /*Temporary workaround for FW bug*/
- extra_data_size += 128;
- client_extra_data_size += 128;
} else if (extra_idx >= VIDEO_MAX_PLANES) {
DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d\n", extra_idx);
return OMX_ErrorBadParameter;
@@ -8347,7 +8345,8 @@
return;
}
-OMX_ERRORTYPE omx_vdec::enable_extradata(OMX_U32 requested_extradata, bool enable)
+OMX_ERRORTYPE omx_vdec::enable_extradata(OMX_U32 requested_extradata,
+ bool is_internal, bool enable)
{
OMX_ERRORTYPE ret = OMX_ErrorNone;
struct v4l2_control control;
@@ -8356,13 +8355,15 @@
DEBUG_PRINT_ERROR("ERROR: enable extradata allowed in Loaded state only");
return OMX_ErrorIncorrectStateOperation;
}
- DEBUG_PRINT_ERROR("enable_extradata: actual[%x] requested[%x] enable[%d]",
- client_extradata, requested_extradata, enable);
+ DEBUG_PRINT_ERROR("NOTE: enable_extradata: actual[%x] requested[%x] enable[%d], is_internal: %d\n",
+ client_extradata, requested_extradata, enable, is_internal);
- if (enable)
- client_extradata |= requested_extradata;
- else
- client_extradata = client_extradata & ~requested_extradata;
+ if (!is_internal) {
+ if (enable)
+ client_extradata |= requested_extradata;
+ else
+ client_extradata = client_extradata & ~requested_extradata;
+ }
if (enable) {
if (requested_extradata & OMX_INTERLACE_EXTRADATA) {
@@ -8477,6 +8478,9 @@
{
OMX_STREAMINTERLACEFORMAT *interlace_format;
OMX_U32 mbaff = 0;
+ if (!(client_extradata & OMX_INTERLACE_EXTRADATA)) {
+ return;
+ }
extra->nSize = OMX_INTERLACE_EXTRADATA_SIZE;
extra->nVersion.nVersion = OMX_SPEC_VERSION;
extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
@@ -8565,6 +8569,9 @@
void omx_vdec::append_terminator_extradata(OMX_OTHER_EXTRADATATYPE *extra)
{
+ if (!client_extradata) {
+ return;
+ }
extra->nSize = sizeof(OMX_OTHER_EXTRADATATYPE);
extra->nVersion.nVersion = OMX_SPEC_VERSION;
extra->eType = OMX_ExtraDataNone;
diff --git a/mm-video/vidc/vdec/test/omx_vdec_test.cpp b/mm-video/vidc/vdec/test/omx_vdec_test.cpp
index e170e6c..6f755e0 100644
--- a/mm-video/vidc/vdec/test/omx_vdec_test.cpp
+++ b/mm-video/vidc/vdec/test/omx_vdec_test.cpp
@@ -45,6 +45,7 @@
#include <semaphore.h>
#include "OMX_QCOMExtns.h"
#include <sys/time.h>
+#include <cutils/properties.h>
#include <linux/android_pmem.h>
@@ -715,11 +716,15 @@
int canDisplay = 1, contigous_drop_frame = 0, bytes_written = 0, ret = 0;
OMX_S64 base_timestamp = 0, lastTimestamp = 0;
OMX_BUFFERHEADERTYPE *pBuffer = NULL, *pPrevBuff = NULL;
+ char value[PROPERTY_VALUE_MAX] = {0};
+ OMX_U32 aspectratio_prop = 0;
pthread_mutex_lock(&eos_lock);
#ifdef _MSM8974_
int stride,scanlines,stride_c,i;
#endif
DEBUG_PRINT("First Inside %s\n", __FUNCTION__);
+ property_get("vidc.vdec.debug.aspectratio", value, "0");
+ aspectratio_prop = atoi(value);
while(currentStatus != ERROR_STATE && !bOutputEosReached)
{
pthread_mutex_unlock(&eos_lock);
@@ -894,7 +899,12 @@
DEBUG_PRINT("OMX_ExtraDataFrameInfo: Buf(%p) TSmp(%lld) PicType(%u) IntT(%u) ConMB(%u)",
pBuffer->pBuffer, pBuffer->nTimeStamp, frame_info->ePicType,
frame_info->interlaceType, frame_info->nConcealedMacroblocks);
- DEBUG_PRINT(" FrmRate(%u), AspRatioX(%u), AspRatioY(%u) ",
+ if (aspectratio_prop)
+ DEBUG_PRINT_ERROR(" FrmRate(%u), AspRatioX(%u), AspRatioY(%u) ",
+ frame_info->nFrameRate, frame_info->aspectRatio.aspectRatioX,
+ frame_info->aspectRatio.aspectRatioY);
+ else
+ DEBUG_PRINT(" FrmRate(%u), AspRatioX(%u), AspRatioY(%u) ",
frame_info->nFrameRate, frame_info->aspectRatio.aspectRatioX,
frame_info->aspectRatio.aspectRatioY);
DEBUG_PRINT("PANSCAN numWindows(%d)", frame_info->panScan.numWindows);
diff --git a/mm-video/vidc/venc/inc/video_encoder_device.h b/mm-video/vidc/venc/inc/video_encoder_device.h
index 3940d49..07a3b9d 100644
--- a/mm-video/vidc/venc/inc/video_encoder_device.h
+++ b/mm-video/vidc/venc/inc/video_encoder_device.h
@@ -143,6 +143,7 @@
bool venc_set_voptiming_cfg(OMX_U32 nTimeIncRes);
void venc_config_print();
bool venc_set_slice_delivery_mode(OMX_BOOL enable);
+ bool venc_set_plusptype(OMX_BOOL enable);
#ifdef MAX_RES_1080P
OMX_U32 pmem_free();
OMX_U32 pmem_allocate(OMX_U32 size, OMX_U32 alignment, OMX_U32 count);
diff --git a/mm-video/vidc/venc/src/omx_video_base.cpp b/mm-video/vidc/venc/src/omx_video_base.cpp
index 5c09c75..cdad91b 100644
--- a/mm-video/vidc/venc/src/omx_video_base.cpp
+++ b/mm-video/vidc/venc/src/omx_video_base.cpp
@@ -4320,6 +4320,11 @@
eRet = OMX_ErrorNoMore;
}
}
+ else
+ {
+ DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported ret NoMore\n");
+ eRet = OMX_ErrorNoMore;
+ }
}
else
{
diff --git a/mm-video/vidc/venc/src/omx_video_encoder.cpp b/mm-video/vidc/venc/src/omx_video_encoder.cpp
index 9f9eba6..e86337e 100644
--- a/mm-video/vidc/venc/src/omx_video_encoder.cpp
+++ b/mm-video/vidc/venc/src/omx_video_encoder.cpp
@@ -1139,6 +1139,28 @@
break;
}
#endif
+ case OMX_QcomIndexEnableH263PlusPType:
+ {
+ QOMX_EXTNINDEX_PARAMTYPE* pParam =
+ (QOMX_EXTNINDEX_PARAMTYPE*)paramData;
+ DEBUG_PRINT_LOW("OMX_QcomIndexEnableH263PlusPType");
+ if(pParam->nPortIndex == PORT_INDEX_OUT)
+ {
+ if(!handle->venc_set_param(paramData,
+ (OMX_INDEXTYPE)OMX_QcomIndexEnableH263PlusPType))
+ {
+ DEBUG_PRINT_ERROR("ERROR: Request for setting PlusPType failed");
+ return OMX_ErrorUnsupportedSetting;
+ }
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("ERROR: OMX_QcomIndexEnableH263PlusPType "
+ "called on wrong port(%d)", pParam->nPortIndex);
+ return OMX_ErrorBadPortIndex;
+ }
+ break;
+ }
case OMX_IndexParamVideoSliceFMO:
default:
{
diff --git a/mm-video/vidc/venc/src/video_encoder_device.cpp b/mm-video/vidc/venc/src/video_encoder_device.cpp
index f888cbe..17c08d1 100644
--- a/mm-video/vidc/venc/src/video_encoder_device.cpp
+++ b/mm-video/vidc/venc/src/video_encoder_device.cpp
@@ -1011,6 +1011,27 @@
}
break;
}
+ case OMX_QcomIndexEnableH263PlusPType:
+ {
+ QOMX_EXTNINDEX_PARAMTYPE* pParam =
+ (QOMX_EXTNINDEX_PARAMTYPE*)paramData;
+ DEBUG_PRINT_LOW("OMX_QcomIndexEnableH263PlusPType");
+ if(pParam->nPortIndex == PORT_INDEX_OUT)
+ {
+ if(venc_set_plusptype(pParam->bEnable) == false)
+ {
+ DEBUG_PRINT_ERROR("Setting PlusPType failed for H263");
+ return OMX_ErrorUnsupportedSetting;
+ }
+ }
+ else
+ {
+ DEBUG_PRINT_ERROR("OMX_QcomIndexEnableH263PlusPType "
+ "called on wrong port(%d)", pParam->nPortIndex);
+ return OMX_ErrorBadPortIndex;
+ }
+ break;
+ }
case OMX_IndexParamVideoSliceFMO:
default:
DEBUG_PRINT_ERROR("\nERROR: Unsupported parameter in venc_set_param: %u",
@@ -1776,6 +1797,22 @@
return true;
}
+bool venc_dev::venc_set_plusptype(OMX_BOOL enable)
+{
+ venc_ioctl_msg ioctl_msg = {NULL,NULL};
+ struct venc_plusptype plusptype = {0};
+ DEBUG_PRINT_LOW("Set plusptype: %d", enable);
+ plusptype.plusptype_enable = enable;
+ ioctl_msg.in = (void*)&plusptype;
+ ioctl_msg.out = NULL;
+ if(ioctl(m_nDriver_fd, VEN_IOCTL_SET_H263_PLUSPTYPE,(void*)&ioctl_msg) < 0)
+ {
+ DEBUG_PRINT_ERROR("Request for setting plusptype for h263 failed");
+ return false;
+ }
+ return true;
+}
+
bool venc_dev::venc_set_extradata(OMX_U32 extra_data)
{
venc_ioctl_msg ioctl_msg = {NULL,NULL};