summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/MediaSync.cpp
diff options
context:
space:
mode:
authorLajos Molnar <lajos@google.com>2015-07-20 16:24:31 -0700
committerLajos Molnar <lajos@google.com>2015-07-20 16:49:26 -0700
commit82a633b602a7ffe1efd9886744393f52a093a2f3 (patch)
tree94b8f5d5f3729c73371ea8a82a6358ea6aa9d6ff /media/libstagefright/MediaSync.cpp
parent84e4987ffc8d4bb6731bcb28d69a7ff37a0e9921 (diff)
downloadframeworks_av-82a633b602a7ffe1efd9886744393f52a093a2f3.zip
frameworks_av-82a633b602a7ffe1efd9886744393f52a093a2f3.tar.gz
frameworks_av-82a633b602a7ffe1efd9886744393f52a093a2f3.tar.bz2
stagefright: remove workaround for BQ not reporting dropped frames
Bug: 22234976 Related-bug: 22552826 Change-Id: Ic29b8d8533a4df8c15bcf3a9dab924aa24428304
Diffstat (limited to 'media/libstagefright/MediaSync.cpp')
-rw-r--r--media/libstagefright/MediaSync.cpp71
1 files changed, 26 insertions, 45 deletions
diff --git a/media/libstagefright/MediaSync.cpp b/media/libstagefright/MediaSync.cpp
index 0df3ec9..3a45e25 100644
--- a/media/libstagefright/MediaSync.cpp
+++ b/media/libstagefright/MediaSync.cpp
@@ -558,8 +558,7 @@ void MediaSync::onDrainVideo_l() {
// adjust video frame PTS based on vsync
itemRealUs = mFrameScheduler->schedule(itemRealUs * 1000) / 1000;
- int64_t oneVsyncUs = (mFrameScheduler->getVsyncPeriod() / 1000);
- int64_t twoVsyncsUs = oneVsyncUs * 2;
+ int64_t twoVsyncsUs = 2 * (mFrameScheduler->getVsyncPeriod() / 1000);
// post 2 display refreshes before rendering is due
if (itemRealUs <= nowUs + twoVsyncsUs) {
@@ -570,7 +569,7 @@ void MediaSync::onDrainVideo_l() {
if (mHasAudio) {
if (nowUs - itemRealUs <= kMaxAllowedVideoLateTimeUs) {
- renderOneBufferItem_l(*bufferItem, nowUs + oneVsyncUs - itemRealUs);
+ renderOneBufferItem_l(*bufferItem);
} else {
// too late.
returnBufferToInput_l(
@@ -579,7 +578,7 @@ void MediaSync::onDrainVideo_l() {
}
} else {
// always render video buffer in video-only mode.
- renderOneBufferItem_l(*bufferItem, nowUs + oneVsyncUs - itemRealUs);
+ renderOneBufferItem_l(*bufferItem);
// smooth out videos >= 10fps
mMediaClock->updateAnchor(
@@ -613,7 +612,7 @@ void MediaSync::onFrameAvailableFromInput() {
while (mNumOutstandingBuffers > mMaxAcquiredBufferCount
&& !mIsAbandoned && !mReturnPendingInputFrame) {
if (mReleaseCondition.waitRelative(mMutex, kAcquireWaitTimeout) != OK) {
- ALOGI("still waiting to release a buffer before acquire");
+ ALOGI_IF(mPlaybackRate != 0.f, "still waiting to release a buffer before acquire");
}
// If the sync is abandoned while we are waiting, the release
@@ -670,7 +669,7 @@ void MediaSync::onFrameAvailableFromInput() {
}
}
-void MediaSync::renderOneBufferItem_l(const BufferItem &bufferItem, int64_t checkInUs) {
+void MediaSync::renderOneBufferItem_l(const BufferItem &bufferItem) {
IGraphicBufferProducer::QueueBufferInput queueInput(
bufferItem.mTimestamp,
bufferItem.mIsAutoTimestamp,
@@ -710,12 +709,6 @@ void MediaSync::renderOneBufferItem_l(const BufferItem &bufferItem, int64_t chec
mBuffersSentToOutput.add(bufferItem.mGraphicBuffer->getId(), bufferItem.mGraphicBuffer);
ALOGV("queued buffer %#llx to output", (long long)bufferItem.mGraphicBuffer->getId());
-
- // If we have already queued more than one buffer, check for any free buffers in case
- // one of them were dropped - as BQ does not signal onBufferReleased in that case.
- if (mBuffersSentToOutput.size() > 1) {
- (new AMessage(kWhatCheckFrameAvailable, this))->post(checkInUs);
- }
}
void MediaSync::onBufferReleasedByOutput(sp<IGraphicBufferProducer> &output) {
@@ -727,38 +720,32 @@ void MediaSync::onBufferReleasedByOutput(sp<IGraphicBufferProducer> &output) {
sp<GraphicBuffer> buffer;
sp<Fence> fence;
- status_t status;
- // NOTE: This is a workaround for a BufferQueue bug where onBufferReleased is
- // called only for released buffers, but not for buffers that were dropped during
- // acquire. Dropped buffers can still be detached as they are on the free list.
- // TODO: remove if released callback happens also for dropped buffers
- while ((status = mOutput->detachNextBuffer(&buffer, &fence)) != NO_MEMORY) {
- ALOGE_IF(status != NO_ERROR, "detaching buffer from output failed (%d)", status);
-
- if (status == NO_INIT) {
- // If the output has been abandoned, we can't do anything else,
- // since buffer is invalid.
- onAbandoned_l(false /* isInput */);
- return;
- }
+ status_t status = mOutput->detachNextBuffer(&buffer, &fence);
+ ALOGE_IF(status != NO_ERROR, "detaching buffer from output failed (%d)", status);
- ALOGV("detached buffer %#llx from output", (long long)buffer->getId());
+ if (status == NO_INIT) {
+ // If the output has been abandoned, we can't do anything else,
+ // since buffer is invalid.
+ onAbandoned_l(false /* isInput */);
+ return;
+ }
- // If we've been abandoned, we can't return the buffer to the input, so just
- // move on.
- if (mIsAbandoned) {
- return;
- }
+ ALOGV("detached buffer %#llx from output", (long long)buffer->getId());
- ssize_t ix = mBuffersSentToOutput.indexOfKey(buffer->getId());
- if (ix < 0) {
- // The buffer is unknown, maybe leftover, ignore.
- return;
- }
- mBuffersSentToOutput.removeItemsAt(ix);
+ // If we've been abandoned, we can't return the buffer to the input, so just
+ // move on.
+ if (mIsAbandoned) {
+ return;
+ }
- returnBufferToInput_l(buffer, fence);
+ ssize_t ix = mBuffersSentToOutput.indexOfKey(buffer->getId());
+ if (ix < 0) {
+ // The buffer is unknown, maybe leftover, ignore.
+ return;
}
+ mBuffersSentToOutput.removeItemsAt(ix);
+
+ returnBufferToInput_l(buffer, fence);
}
void MediaSync::returnBufferToInput_l(
@@ -829,12 +816,6 @@ void MediaSync::onMessageReceived(const sp<AMessage> &msg) {
break;
}
- case kWhatCheckFrameAvailable:
- {
- onBufferReleasedByOutput(mOutput);
- break;
- }
-
default:
TRESPASS();
break;