summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/omx/OMXNodeInstance.cpp
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2013-11-07 11:13:27 -0800
committerAndreas Huber <andih@google.com>2013-11-07 13:50:18 -0800
commitad3b7e8d40bf1c97347f1538d30bba78ca371f67 (patch)
tree4f3b8ec0d04db8a0c8ab26bb8c0ee7addaf3930f /media/libstagefright/omx/OMXNodeInstance.cpp
parentf8a1169d98a09d1473f289c363353d08301576f6 (diff)
downloadframeworks_av-ad3b7e8d40bf1c97347f1538d30bba78ca371f67.zip
frameworks_av-ad3b7e8d40bf1c97347f1538d30bba78ca371f67.tar.gz
frameworks_av-ad3b7e8d40bf1c97347f1538d30bba78ca371f67.tar.bz2
Properly handle executing->idle in GraphicBufferSource
ACodec has initiated the transition from exectuing->idle and is waiting for the component to return all buffers so they can be freed. It's counter productive and with some vendors harmful to submit additional buffers to the component from this point on. Change-Id: I332be254a1faf94902c77b5792a373ab447e44d3 related-to-bug: 11573543
Diffstat (limited to 'media/libstagefright/omx/OMXNodeInstance.cpp')
-rw-r--r--media/libstagefright/omx/OMXNodeInstance.cpp19
1 files changed, 12 insertions, 7 deletions
diff --git a/media/libstagefright/omx/OMXNodeInstance.cpp b/media/libstagefright/omx/OMXNodeInstance.cpp
index 46e5d71..5f104fc 100644
--- a/media/libstagefright/omx/OMXNodeInstance.cpp
+++ b/media/libstagefright/omx/OMXNodeInstance.cpp
@@ -243,13 +243,18 @@ status_t OMXNodeInstance::freeNode(OMXMaster *master) {
status_t OMXNodeInstance::sendCommand(
OMX_COMMANDTYPE cmd, OMX_S32 param) {
const sp<GraphicBufferSource>& bufferSource(getGraphicBufferSource());
- if (bufferSource != NULL
- && cmd == OMX_CommandStateSet
- && param == OMX_StateLoaded) {
- // Initiating transition from Executing -> Loaded
- // Buffers are about to be freed.
- bufferSource->omxLoaded();
- setGraphicBufferSource(NULL);
+ if (bufferSource != NULL && cmd == OMX_CommandStateSet) {
+ if (param == OMX_StateIdle) {
+ // Initiating transition from Executing -> Idle
+ // ACodec is waiting for all buffers to be returned, do NOT
+ // submit any more buffers to the codec.
+ bufferSource->omxIdle();
+ } else if (param == OMX_StateLoaded) {
+ // Initiating transition from Idle/Executing -> Loaded
+ // Buffers are about to be freed.
+ bufferSource->omxLoaded();
+ setGraphicBufferSource(NULL);
+ }
// fall through
}