diff options
author | Lajos Molnar <lajos@google.com> | 2015-06-26 15:33:17 -0700 |
---|---|---|
committer | Lajos Molnar <lajos@google.com> | 2015-07-01 00:42:40 +0000 |
commit | 264bac95912efe121d6a60026612617f04f42966 (patch) | |
tree | ac73aada986fed92fba30ca624eff7e4fa033c1c /media/libstagefright/MediaSync.cpp | |
parent | 064b2bf712788d30928b9a8bafecd0f3308d7aa4 (diff) | |
download | frameworks_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.cpp | 14 |
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) { |