diff options
author | Andreas Huber <andih@google.com> | 2013-05-20 09:13:23 -0700 |
---|---|---|
committer | Jamie Gennis <jgennis@google.com> | 2013-05-20 19:02:23 -0700 |
commit | 1b4ca5cebd7f42a8f8842e45bfabe19001e9a435 (patch) | |
tree | c07b6273cba3b97b38fe8804384f3bf7f02c3557 /media | |
parent | e2dfa5a4ea3459b155b4b403b7dafe2116d960d4 (diff) | |
download | frameworks_av-1b4ca5cebd7f42a8f8842e45bfabe19001e9a435.zip frameworks_av-1b4ca5cebd7f42a8f8842e45bfabe19001e9a435.tar.gz frameworks_av-1b4ca5cebd7f42a8f8842e45bfabe19001e9a435.tar.bz2 |
Avoid a deadlock during EmptyBufferDone
The deadlock happens withen in the case where we use an OMX encoder with a
GraphicBufferSource.
Bug: 8329090
Change-Id: Icec58bb85ff3839ad1a2e3eca02fa9d6d133ca45
Diffstat (limited to 'media')
-rw-r--r-- | media/libstagefright/omx/OMXNodeInstance.cpp | 28 |
1 files changed, 17 insertions, 11 deletions
diff --git a/media/libstagefright/omx/OMXNodeInstance.cpp b/media/libstagefright/omx/OMXNodeInstance.cpp index e7d5e74..a9eb94f 100644 --- a/media/libstagefright/omx/OMXNodeInstance.cpp +++ b/media/libstagefright/omx/OMXNodeInstance.cpp @@ -779,6 +779,23 @@ void OMXNodeInstance::onMessage(const omx_message &msg) { static_cast<BufferMeta *>(buffer->pAppPrivate); buffer_meta->CopyFromOMX(buffer); + } else if (msg.type == omx_message::EMPTY_BUFFER_DONE) { + const sp<GraphicBufferSource>& bufferSource(getGraphicBufferSource()); + + if (bufferSource != NULL) { + // This is one of the buffers used exclusively by + // GraphicBufferSource. + // Don't dispatch a message back to ACodec, since it doesn't + // know that anyone asked to have the buffer emptied and will + // be very confused. + + OMX_BUFFERHEADERTYPE *buffer = + static_cast<OMX_BUFFERHEADERTYPE *>( + msg.u.buffer_data.buffer); + + bufferSource->codecBufferEmptied(buffer); + return; + } } mObserver->onMessage(msg); @@ -839,17 +856,6 @@ OMX_ERRORTYPE OMXNodeInstance::OnEmptyBufferDone( if (instance->mDying) { return OMX_ErrorNone; } - const sp<GraphicBufferSource>& bufferSource( - instance->getGraphicBufferSource()); - if (bufferSource != NULL) { - bufferSource->codecBufferEmptied(pBuffer); - - // This is one of the buffers used exclusively by GraphicBufferSource. - // Don't dispatch a message back to ACodec, since it doesn't - // know that anyone asked to have the buffer emptied and will - // be very confused. - return OMX_ErrorNone; - } return instance->owner()->OnEmptyBufferDone(instance->nodeID(), pBuffer); } |