summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/MediaSync.cpp
diff options
context:
space:
mode:
authorLajos Molnar <lajos@google.com>2015-06-26 15:33:17 -0700
committerLajos Molnar <lajos@google.com>2015-07-01 00:42:40 +0000
commit264bac95912efe121d6a60026612617f04f42966 (patch)
treeac73aada986fed92fba30ca624eff7e4fa033c1c /media/libstagefright/MediaSync.cpp
parent064b2bf712788d30928b9a8bafecd0f3308d7aa4 (diff)
downloadframeworks_av-264bac95912efe121d6a60026612617f04f42966.zip
frameworks_av-264bac95912efe121d6a60026612617f04f42966.tar.gz
frameworks_av-264bac95912efe121d6a60026612617f04f42966.tar.bz2
stagefright: prevent allocating stale buffers for OMX decoders
Also fix some issues encountered once using generationNumbers: - properly account outstanding buffers in MediaSync - don't release arbitrary frame if attach fails Bug: 11990461 Change-Id: Icee5ea188ca4eb856138feb5e6ec5d4ee5e44008
Diffstat (limited to 'media/libstagefright/MediaSync.cpp')
-rw-r--r--media/libstagefright/MediaSync.cpp14
1 files changed, 6 insertions, 8 deletions
diff --git a/media/libstagefright/MediaSync.cpp b/media/libstagefright/MediaSync.cpp
index b402e48..52077a7 100644
--- a/media/libstagefright/MediaSync.cpp
+++ b/media/libstagefright/MediaSync.cpp
@@ -558,7 +558,6 @@ void MediaSync::onFrameAvailableFromInput() {
return;
}
}
- ++mNumOutstandingBuffers;
// Acquire and detach the buffer from the input.
BufferItem bufferItem;
@@ -567,6 +566,7 @@ void MediaSync::onFrameAvailableFromInput() {
ALOGE("acquiring buffer from input failed (%d)", status);
return;
}
+ ++mNumOutstandingBuffers;
ALOGV("acquired buffer %#llx from input", (long long)bufferItem.mGraphicBuffer->getId());
@@ -608,6 +608,7 @@ void MediaSync::renderOneBufferItem_l( const BufferItem &bufferItem) {
// Attach and queue the buffer to the output.
int slot;
+ mOutput->setGenerationNumber(bufferItem.mGraphicBuffer->getGenerationNumber());
status_t status = mOutput->attachBuffer(&slot, bufferItem.mGraphicBuffer);
ALOGE_IF(status != NO_ERROR, "attaching buffer to output failed (%d)", status);
if (status == NO_ERROR) {
@@ -695,16 +696,13 @@ void MediaSync::returnBufferToInput_l(
ALOGE_IF(status != NO_ERROR, "releasing buffer to input failed (%d)", status);
}
- if (status != NO_ERROR) {
- // TODO: do we need to try to return this buffer later?
- return;
- }
-
- ALOGV("released buffer %#llx to input", (long long)oldBuffer->getId());
-
// Notify any waiting onFrameAvailable calls.
--mNumOutstandingBuffers;
mReleaseCondition.signal();
+
+ if (status == NO_ERROR) {
+ ALOGV("released buffer %#llx to input", (long long)oldBuffer->getId());
+ }
}
void MediaSync::onAbandoned_l(bool isInput) {