summaryrefslogtreecommitdiffstats
path: root/mm-video
diff options
context:
space:
mode:
authorDeepak Verma <dverma@codeaurora.org>2013-07-08 16:35:43 +0530
committerGerrit - the friendly Code Review server <code-review@localhost>2013-07-08 04:09:20 -0700
commit2be114ea62794efd795bf4cc7ef0098323f78c67 (patch)
treeb61a1343635d06d47aa93118db7a18753ca21887 /mm-video
parentd4f83efc62a7f2b3aba5f5464b49e8b00d6c6630 (diff)
downloadandroid_hardware_qcom_media-2be114ea62794efd795bf4cc7ef0098323f78c67.tar.gz
android_hardware_qcom_media-2be114ea62794efd795bf4cc7ef0098323f78c67.tar.bz2
android_hardware_qcom_media-2be114ea62794efd795bf4cc7ef0098323f78c67.zip
mm-video: Add data corrupt flag on output buffers when required
- If non-IDR frames received after seek operation, corrupted YUV frames are displayed. - Add OMX_BUFFERFLAG_DATACORRUPT flag to each output buffer till OMX_BUFFERFLAG_SYNCFRAME received. - IL client can skip rendering if DATACORRUPT flag observed. Change-Id: I735fb3d5dcfbbfd0efd3c77a59f0323ee7695c10
Diffstat (limited to 'mm-video')
-rw-r--r--mm-video/vidc/vdec/inc/omx_vdec.h1
-rw-r--r--mm-video/vidc/vdec/src/omx_vdec.cpp18
2 files changed, 19 insertions, 0 deletions
diff --git a/mm-video/vidc/vdec/inc/omx_vdec.h b/mm-video/vidc/vdec/inc/omx_vdec.h
index 1fc76194..fa32b5e5 100644
--- a/mm-video/vidc/vdec/inc/omx_vdec.h
+++ b/mm-video/vidc/vdec/inc/omx_vdec.h
@@ -735,6 +735,7 @@ private:
OMX_BOOL m_out_bPopulated;
// encapsulate the waiting states.
unsigned int m_flags;
+ OMX_BOOL m_out_sync_frm_received;
#ifdef _ANDROID_
// Heap pointer to frame buffers
diff --git a/mm-video/vidc/vdec/src/omx_vdec.cpp b/mm-video/vidc/vdec/src/omx_vdec.cpp
index 8d672242..dd63fddf 100644
--- a/mm-video/vidc/vdec/src/omx_vdec.cpp
+++ b/mm-video/vidc/vdec/src/omx_vdec.cpp
@@ -496,6 +496,7 @@ omx_vdec::omx_vdec(): m_state(OMX_StateInvalid),
m_inp_bPopulated(OMX_FALSE),
m_out_bPopulated(OMX_FALSE),
m_flags(0),
+ m_out_sync_frm_received(OMX_FALSE),
m_inp_bEnabled(OMX_TRUE),
m_out_bEnabled(OMX_TRUE),
m_platform_list(NULL),
@@ -954,6 +955,7 @@ void omx_vdec::process_event_cb(void *ctxt, unsigned char id)
else
{
pThis->execute_output_flush();
+ pThis->m_out_sync_frm_received = OMX_FALSE;
if (pThis->m_cb.EventHandler)
{
if (p2 != VDEC_S_SUCCESS)
@@ -1189,6 +1191,7 @@ void omx_vdec::process_event_cb(void *ctxt, unsigned char id)
}
pThis->prev_ts = LLONG_MAX;
pThis->rst_prev_ts = true;
+ pThis->m_out_sync_frm_received = OMX_FALSE;
break;
case OMX_COMPONENT_GENERATE_HARDWARE_ERROR:
@@ -6714,6 +6717,7 @@ OMX_ERRORTYPE omx_vdec::fill_buffer_done(OMX_HANDLETYPE hComp,
OMX_BUFFERHEADERTYPE * buffer)
{
OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pPMEMInfo = NULL;
+ struct vdec_output_frameinfo *ptr_respbuffer = NULL;
if (!buffer || (buffer - m_out_mem_ptr) >= drv_ctx.op_buf.actualcount)
{
@@ -6756,6 +6760,20 @@ OMX_ERRORTYPE omx_vdec::fill_buffer_done(OMX_HANDLETYPE hComp,
"TS = %lld", buffer, buffer->pBuffer, buffer->nFlags, buffer->nTimeStamp);
pending_output_buffers --;
+ ptr_respbuffer = (struct vdec_output_frameinfo *)buffer->pOutputPortPrivate;
+ if (!m_out_sync_frm_received)
+ {
+ if(buffer->nFlags & OMX_BUFFERFLAG_SYNCFRAME)
+ {
+ m_out_sync_frm_received = OMX_TRUE;
+ }
+ else if(ptr_respbuffer->pic_type==PICTURE_TYPE_P)
+ {
+ DEBUG_PRINT_HIGH("Sync frame not received, marking buffer "
+ "0x%x flags 0x%x as decode only", buffer->pBuffer, buffer->nFlags);
+ buffer->nFlags |= OMX_BUFFERFLAG_DATACORRUPT;
+ }
+ }
if (buffer->nFlags & OMX_BUFFERFLAG_EOS)
{