Merge "mm-video: vidc: hevc: extradata issue fixes"
diff --git a/mm-video-v4l2/vidc/vdec/inc/omx_vdec_hevc_swvdec.h b/mm-video-v4l2/vidc/vdec/inc/omx_vdec_hevc_swvdec.h
index 7a78875..5e1021f 100644
--- a/mm-video-v4l2/vidc/vdec/inc/omx_vdec_hevc_swvdec.h
+++ b/mm-video-v4l2/vidc/vdec/inc/omx_vdec_hevc_swvdec.h
@@ -773,7 +773,7 @@
{
if (m_cb.EventHandler && !m_error_propogated)
{
- ALOGE("\nERROR: Sending OMX_EventError to Client");
+ DEBUG_PRINT_ERROR("\nERROR: Sending OMX_EventError to Client");
m_error_propogated = true;
m_cb.EventHandler(&m_cmp,m_app_data,
OMX_EventError,OMX_ErrorHardware,0,NULL);
@@ -784,8 +784,7 @@
{
if (m_cb.EventHandler && !m_error_propogated)
{
- DEBUG_PRINT_ERROR(
- "ERROR: Sending OMX_ErrorUnsupportedSetting to Client");
+ DEBUG_PRINT_ERROR("ERROR: Sending OMX_ErrorUnsupportedSetting to Client");
m_error_propogated = true;
m_cb.EventHandler(&m_cmp,m_app_data,
OMX_EventError,OMX_ErrorUnsupportedSetting,0,NULL);
diff --git a/mm-video-v4l2/vidc/vdec/src/omx_vdec_hevc_swvdec.cpp b/mm-video-v4l2/vidc/vdec/src/omx_vdec_hevc_swvdec.cpp
index e9e4975..181254a 100644
--- a/mm-video-v4l2/vidc/vdec/src/omx_vdec_hevc_swvdec.cpp
+++ b/mm-video-v4l2/vidc/vdec/src/omx_vdec_hevc_swvdec.cpp
@@ -6252,15 +6252,15 @@
#endif
if (m_debug.infile) {
- fclose(m_debug.infile);
- m_debug.infile = NULL;
+ fclose(m_debug.infile);
+ m_debug.infile = NULL;
}
if (m_debug.outfile) {
- fclose(m_debug.outfile);
- m_debug.outfile = NULL;
+ fclose(m_debug.outfile);
+ m_debug.outfile = NULL;
}
if (m_debug.imbfile) {
- fclose(m_debug.imbfile);
+ fclose(m_debug.imbfile);
m_debug.imbfile = NULL;
}
@@ -7837,8 +7837,8 @@
drv_ctx.extradata_info.buffer_size = extra_data_size;
buf_size += client_extra_data_size;
buf_size = (buf_size + buffer_prop->alignment - 1)&(~(buffer_prop->alignment - 1));
- DEBUG_PRINT_HIGH("GetBufReq UPDATE: ActCnt(%d) Size(%d) BufSize(%d) BufType(%d)",
- buffer_prop->actualcount, buffer_prop->buffer_size, buf_size, buffer_prop->buffer_type);
+ DEBUG_PRINT_HIGH("GetBufReq UPDATE: ActCnt(%d) Size(%d) BufSize(%d) BufType(%d), extradata size %d",
+ buffer_prop->actualcount, buffer_prop->buffer_size, buf_size, buffer_prop->buffer_type, client_extra_data_size);
if (in_reconfig) // BufReq will be set to driver when port is disabled
buffer_prop->buffer_size = buf_size;
else if (buf_size != buffer_prop->buffer_size)
@@ -8294,8 +8294,10 @@
}
p_extra = (OMX_OTHER_EXTRADATATYPE *)
((unsigned)(pBuffer + p_buf_hdr->nOffset + p_buf_hdr->nFilledLen + 3)&(~3));
+ if (!client_extradata)
+ p_extra = NULL;
char *p_extradata = drv_ctx.extradata_info.uaddr + buf_index * drv_ctx.extradata_info.buffer_size;
- if ((OMX_U8*)p_extra > (pBuffer + p_buf_hdr->nAllocLen))
+ if ((OMX_U8*)p_extra >= (pBuffer + p_buf_hdr->nAllocLen))
p_extra = NULL;
OMX_OTHER_EXTRADATATYPE *data = (struct OMX_OTHER_EXTRADATATYPE *)p_extradata;
if (data) {
@@ -8393,7 +8395,7 @@
DEBUG_PRINT_ERROR("ERROR: enable extradata allowed in Loaded state only");
return OMX_ErrorIncorrectStateOperation;
}
- DEBUG_PRINT_ERROR("NOTE: enable_extradata: actual[%lu] requested[%lu] enable[%d], is_internal: %d swvdec mode %d",
+ DEBUG_PRINT_ERROR("NOTE: enable_extradata: actual[%x] requested[%x] enable[%d], is_internal: %d swvdec mode %d",
client_extradata, requested_extradata, enable, is_internal, m_swvdec_mode);
if (!is_internal) {
@@ -8404,7 +8406,7 @@
}
if (enable) {
- if (m_swvdec_mode == SWVDEC_MODE_DECODE_ONLY) {
+ if (m_pSwVdec == NULL || m_swvdec_mode == SWVDEC_MODE_DECODE_ONLY) {
if (requested_extradata & OMX_INTERLACE_EXTRADATA) {
control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
control.value = V4L2_MPEG_VIDC_EXTRADATA_INTERLACE_VIDEO;
@@ -8551,7 +8553,7 @@
{
OMX_STREAMINTERLACEFORMAT *interlace_format;
OMX_U32 mbaff = 0;
- if (!(client_extradata & OMX_INTERLACE_EXTRADATA)) {
+ if (!(client_extradata & OMX_INTERLACE_EXTRADATA) || !extra) {
return;
}
extra->nSize = OMX_INTERLACE_EXTRADATA_SIZE;
@@ -8597,7 +8599,7 @@
{
OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info = NULL;
struct msm_vidc_panscan_window *panscan_window;
- if (!(client_extradata & OMX_FRAMEINFO_EXTRADATA)) {
+ if (!(client_extradata & OMX_FRAMEINFO_EXTRADATA) || !extra) {
return;
}
extra->nSize = OMX_FRAMEINFO_EXTRADATA_SIZE;
@@ -8648,6 +8650,10 @@
void omx_vdec::append_portdef_extradata(OMX_OTHER_EXTRADATATYPE *extra)
{
+ if (!client_extradata || !extra) {
+ return;
+ }
+
OMX_PARAM_PORTDEFINITIONTYPE *portDefn = NULL;
extra->nSize = OMX_PORTDEF_EXTRADATA_SIZE;
extra->nVersion.nVersion = OMX_SPEC_VERSION;
@@ -8665,7 +8671,7 @@
void omx_vdec::append_terminator_extradata(OMX_OTHER_EXTRADATATYPE *extra)
{
- if (!client_extradata) {
+ if (!client_extradata || !extra) {
return;
}
extra->nSize = sizeof(OMX_OTHER_EXTRADATATYPE);
@@ -9252,10 +9258,33 @@
}
else
{
- drv_ctx.op_buf.buffer_size = property.uProperty.sOpBuffReq.nSize;
+ int client_extra_data_size = 0;
+ if (client_extradata & OMX_FRAMEINFO_EXTRADATA)
+ {
+ DEBUG_PRINT_HIGH("Frame info extra data enabled!");
+ client_extra_data_size += OMX_FRAMEINFO_EXTRADATA_SIZE;
+ }
+ if (client_extradata & OMX_INTERLACE_EXTRADATA)
+ {
+ DEBUG_PRINT_HIGH("OMX_INTERLACE_EXTRADATA!");
+ client_extra_data_size += OMX_INTERLACE_EXTRADATA_SIZE;
+ }
+ if (client_extradata & OMX_PORTDEF_EXTRADATA)
+ {
+ client_extra_data_size += OMX_PORTDEF_EXTRADATA_SIZE;
+ DEBUG_PRINT_HIGH("Smooth streaming enabled extra_data_size=%d",
+ client_extra_data_size);
+ }
+ if (client_extra_data_size)
+ {
+ client_extra_data_size += sizeof(OMX_OTHER_EXTRADATATYPE); //Space for terminator
+ }
+ drv_ctx.op_buf.buffer_size = property.uProperty.sOpBuffReq.nSize + client_extra_data_size;
drv_ctx.op_buf.mincount = property.uProperty.sOpBuffReq.nMinCount;
drv_ctx.op_buf.actualcount = property.uProperty.sOpBuffReq.nMinCount;
- DEBUG_PRINT_ERROR("swvdec output buf size %d count %d",drv_ctx.op_buf.buffer_size,drv_ctx.op_buf.actualcount);
+ DEBUG_PRINT_HIGH("swvdec opbuf size %d extradata size %d total size %d count %d",
+ property.uProperty.sOpBuffReq.nSize, client_extra_data_size,
+ drv_ctx.op_buf.buffer_size,drv_ctx.op_buf.actualcount);
}
if (m_swvdec_mode == SWVDEC_MODE_DECODE_ONLY)