summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2013-05-20 09:13:23 -0700
committerJamie Gennis <jgennis@google.com>2013-05-20 19:02:23 -0700
commit1b4ca5cebd7f42a8f8842e45bfabe19001e9a435 (patch)
treec07b6273cba3b97b38fe8804384f3bf7f02c3557 /media
parente2dfa5a4ea3459b155b4b403b7dafe2116d960d4 (diff)
downloadframeworks_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.cpp28
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);
}