summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/MediaSync.cpp
diff options
context:
space:
mode:
authorLajos Molnar <lajos@google.com>2015-07-01 16:48:18 -0700
committerLajos Molnar <lajos@google.com>2015-07-16 17:23:36 -0700
commit08dc42c46c942ff316a69be1cf74f3c60cf53e7f (patch)
tree80669f21f0c2b8dfcf10efc989f4d6f40f401159 /media/libstagefright/MediaSync.cpp
parenta3725d7b0cb79ddb49f81cba00a0164d8e645acd (diff)
downloadframeworks_av-08dc42c46c942ff316a69be1cf74f3c60cf53e7f.zip
frameworks_av-08dc42c46c942ff316a69be1cf74f3c60cf53e7f.tar.gz
frameworks_av-08dc42c46c942ff316a69be1cf74f3c60cf53e7f.tar.bz2
stagefright: flush pending video frames for MediaSync
Bug: 22234976 Change-Id: Ib63c2286610181968658fb38f5526a489635cf3e
Diffstat (limited to 'media/libstagefright/MediaSync.cpp')
-rw-r--r--media/libstagefright/MediaSync.cpp32
1 files changed, 31 insertions, 1 deletions
diff --git a/media/libstagefright/MediaSync.cpp b/media/libstagefright/MediaSync.cpp
index 455db42..0df3ec9 100644
--- a/media/libstagefright/MediaSync.cpp
+++ b/media/libstagefright/MediaSync.cpp
@@ -52,6 +52,7 @@ MediaSync::MediaSync()
mNumOutstandingBuffers(0),
mUsageFlagsFromOutput(0),
mMaxAcquiredBufferCount(1),
+ mReturnPendingInputFrame(false),
mNativeSampleRateInHz(0),
mNumFramesWritten(0),
mHasAudio(false),
@@ -245,6 +246,7 @@ void MediaSync::updatePlaybackRate_l(float rate) {
mNextBufferItemMediaUs = -1;
}
mPlaybackRate = rate;
+ // TODO: update frame scheduler with this info
mMediaClock->setPlaybackRate(rate);
onDrainVideo_l();
}
@@ -338,6 +340,23 @@ void MediaSync::setName(const AString &name) {
mInput->setConsumerName(String8(name.c_str()));
}
+void MediaSync::flush() {
+ Mutex::Autolock lock(mMutex);
+ if (mFrameScheduler != NULL) {
+ mFrameScheduler->restart();
+ }
+ while (!mBufferItems.empty()) {
+ BufferItem *bufferItem = &*mBufferItems.begin();
+ returnBufferToInput_l(bufferItem->mGraphicBuffer, bufferItem->mFence);
+ mBufferItems.erase(mBufferItems.begin());
+ }
+ mNextBufferItemMediaUs = -1;
+ mNumFramesWritten = 0;
+ mReturnPendingInputFrame = true;
+ mReleaseCondition.signal();
+ mMediaClock->clearAnchor();
+}
+
status_t MediaSync::setVideoFrameRateHint(float rate) {
Mutex::Autolock lock(mMutex);
if (rate < 0.f) {
@@ -586,10 +605,13 @@ void MediaSync::onFrameAvailableFromInput() {
const static nsecs_t kAcquireWaitTimeout = 2000000000; // 2 seconds
+ mReturnPendingInputFrame = false;
+
// If there are too many outstanding buffers, wait until a buffer is
// released back to the input in onBufferReleased.
// NOTE: BufferQueue allows dequeuing maxAcquiredBufferCount + 1 buffers
- while (mNumOutstandingBuffers > mMaxAcquiredBufferCount && !mIsAbandoned) {
+ while (mNumOutstandingBuffers > mMaxAcquiredBufferCount
+ && !mIsAbandoned && !mReturnPendingInputFrame) {
if (mReleaseCondition.waitRelative(mMutex, kAcquireWaitTimeout) != OK) {
ALOGI("still waiting to release a buffer before acquire");
}
@@ -633,6 +655,14 @@ void MediaSync::onFrameAvailableFromInput() {
}
mBuffersFromInput.add(bufferItem.mGraphicBuffer->getId(), bufferItem.mGraphicBuffer);
+ // If flush happened while waiting for a buffer to be released, simply return it
+ // TRICKY: do it here after it is detached so that we don't have to cache mGraphicBuffer.
+ if (mReturnPendingInputFrame) {
+ mReturnPendingInputFrame = false;
+ returnBufferToInput_l(bufferItem.mGraphicBuffer, bufferItem.mFence);
+ return;
+ }
+
mBufferItems.push_back(bufferItem);
if (mBufferItems.size() == 1) {