diff options
| author | Dan Liang <dan.liang@intel.com> | 2012-01-14 21:50:40 +0800 |
|---|---|---|
| committer | Patrick Tjin <pattjin@google.com> | 2014-07-21 22:02:45 -0700 |
| commit | edc549bb8da3889bbb10e32f979832a8bf0fc917 (patch) | |
| tree | bbee272793377031398687b45855e8e5b8cdc35b | |
| parent | ff264f763f6a700c127b6eed284831501aec9c42 (diff) | |
| download | android_hardware_intel_common_omx-components-edc549bb8da3889bbb10e32f979832a8bf0fc917.tar.gz android_hardware_intel_common_omx-components-edc549bb8da3889bbb10e32f979832a8bf0fc917.tar.bz2 android_hardware_intel_common_omx-components-edc549bb8da3889bbb10e32f979832a8bf0fc917.zip | |
omx-component: manage buffer queue for native buffer mode as supplement to Gerrit#27893
BZ: 18772
The buffer to be rendered and returned to framework was still in buffer queue
so omx component thought it owned that buffer and used it again later, which
causes the chaos of buffer state.
Also adjust some indent of source code in this patch.
Change-Id: Ieaa0bf57771438aab8a6fc0e3615a3cd315c3bfd
Signed-off-by: Dan Liang <dan.liang@intel.com>
Reviewed-on: http://android.intel.com:8080/31955
Reviewed-by: Wang, Yi A <yi.a.wang@intel.com>
Reviewed-by: Xiao, FengX <fengx.xiao@intel.com>
Reviewed-by: Chen, Weian <weian.chen@intel.com>
Tested-by: Ding, Haitao <haitao.ding@intel.com>
Reviewed-by: buildbot <buildbot@intel.com>
Tested-by: buildbot <buildbot@intel.com>
| -rw-r--r-- | videocodec/OMXVideoDecoderBase.cpp | 35 |
1 files changed, 24 insertions, 11 deletions
diff --git a/videocodec/OMXVideoDecoderBase.cpp b/videocodec/OMXVideoDecoderBase.cpp index ecbc15f..3774c45 100644 --- a/videocodec/OMXVideoDecoderBase.cpp +++ b/videocodec/OMXVideoDecoderBase.cpp @@ -485,7 +485,7 @@ OMX_ERRORTYPE OMXVideoDecoderBase::FillRenderBuffer(OMX_BUFFERHEADERTYPE **pBuff PortBase *port_out = this->ports[OUTPORT_INDEX]; //check orign buffer - if(buffer_orign != buffer){ + if(buffer_orign != buffer) { bool used = false; mVideoDecoder->GetNativeBufferStatus(buffer_orign->pBuffer,&used); @@ -498,22 +498,35 @@ OMX_ERRORTYPE OMXVideoDecoderBase::FillRenderBuffer(OMX_BUFFERHEADERTYPE **pBuff //need pop the returing buffer from mix used buffer queue OMX_U32 len = port_out->MixBufferQueueLength(); OMX_BUFFERHEADERTYPE *temp = NULL; - for(OMX_U32 i =0 ; i < len; i++){ + for(OMX_U32 i = 0 ; i < len; i++) { temp = port_out->MixPopBuffer(); if(temp == NULL) - break; - if(temp == buffer){ - LOGV("FillRenderBuffer Poped buffer = %p from mix queue",temp); - break; + break; + if(temp == buffer) { + LOGV("FillRenderBuffer Poped buffer = %p from mix queue",temp); + break; } - else{ - port_out->MixPushThisBuffer(temp); + else { + port_out->MixPushThisBuffer(temp); } } - } - - buffer->nFilledLen = sizeof(OMX_U8*); + // make sure the render buffer has been moved out of bufferq + len = port_out->BufferQueueLength(); + for(OMX_U32 i = 0; i < len; i++) { + temp = port_out->PopBuffer(); + if(temp == NULL) + break; + if(temp == buffer) { + LOGV("FillRenderBuffer Poped buffer = %p from buffer queue",temp); + break; + } + else { + port_out->PushThisBuffer(temp); + } + } + } + buffer->nFilledLen = sizeof(OMX_U8*); } else { MapRawNV12(renderBuffer, buffer->pBuffer + buffer->nOffset, buffer->nFilledLen); buffer->pPlatformPrivate = (void *)renderBuffer; |
