aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan Liang <dan.liang@intel.com>2012-01-14 21:50:40 +0800
committerPatrick Tjin <pattjin@google.com>2014-07-21 22:02:45 -0700
commitedc549bb8da3889bbb10e32f979832a8bf0fc917 (patch)
treebbee272793377031398687b45855e8e5b8cdc35b
parentff264f763f6a700c127b6eed284831501aec9c42 (diff)
downloadandroid_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.cpp35
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;