From 2897286dae2934562c48febd4427b8839aeb4007 Mon Sep 17 00:00:00 2001 From: David Smith Date: Tue, 9 Sep 2014 14:01:13 -0700 Subject: stagefright: finish implementing MediaFilter flush Bug: 17203044 Change-Id: I6a967ead4dd9588caafe0041f2f4a39637368a62 --- media/libstagefright/filters/MediaFilter.cpp | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) (limited to 'media') diff --git a/media/libstagefright/filters/MediaFilter.cpp b/media/libstagefright/filters/MediaFilter.cpp index 5a15ec5..89934d4 100644 --- a/media/libstagefright/filters/MediaFilter.cpp +++ b/media/libstagefright/filters/MediaFilter.cpp @@ -273,6 +273,7 @@ MediaFilter::BufferInfo* MediaFilter::findBufferByID( } void MediaFilter::postFillThisBuffer(BufferInfo *info) { + ALOGV("postFillThisBuffer on buffer %d", info->mBufferID); if (mPortEOS[kPortIndexInput]) { return; } @@ -293,14 +294,15 @@ void MediaFilter::postFillThisBuffer(BufferInfo *info) { notify->setMessage("reply", reply); - notify->post(); - info->mStatus = BufferInfo::OWNED_BY_UPSTREAM; + notify->post(); } void MediaFilter::postDrainThisBuffer(BufferInfo *info) { CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_US); + info->mGeneration = mGeneration; + sp notify = mNotify->dup(); notify->setInt32("what", CodecBase::kWhatDrainThisBuffer); notify->setInt32("buffer-id", info->mBufferID); @@ -544,9 +546,11 @@ void MediaFilter::onInputBufferFilled(const sp &msg) { } if (info->mGeneration != mGeneration) { + ALOGV("Caught a stale input buffer [ID %d]", bufferID); // buffer is stale (taken before a flush/shutdown) - repost it CHECK_EQ(info->mStatus, BufferInfo::OWNED_BY_US); postFillThisBuffer(info); + return; } CHECK_EQ(info->mStatus, BufferInfo::OWNED_BY_UPSTREAM); @@ -563,6 +567,7 @@ void MediaFilter::onInputBufferFilled(const sp &msg) { if (err == OK) { // buffers with no errors are returned on MediaCodec.flush ALOGV("saw unfilled buffer (MediaCodec.flush)"); + postFillThisBuffer(info); return; } else { ALOGV("saw error %d instead of an input buffer", err); @@ -610,6 +615,13 @@ void MediaFilter::onOutputBufferDrained(const sp &msg) { return; } + if (info->mGeneration != mGeneration) { + ALOGV("Caught a stale output buffer [ID %d]", bufferID); + // buffer is stale (taken before a flush/shutdown) - keep it + CHECK_EQ(info->mStatus, BufferInfo::OWNED_BY_US); + return; + } + CHECK_EQ(info->mStatus, BufferInfo::OWNED_BY_UPSTREAM); info->mStatus = BufferInfo::OWNED_BY_US; @@ -644,13 +656,16 @@ void MediaFilter::onShutdown(const sp &msg) { void MediaFilter::onFlush() { mGeneration++; + mAvailableInputBuffers.clear(); for (size_t i = 0; i < mBuffers[kPortIndexInput].size(); ++i) { BufferInfo *info = &mBuffers[kPortIndexInput].editItemAt(i); info->mStatus = BufferInfo::OWNED_BY_US; } + mAvailableOutputBuffers.clear(); for (size_t i = 0; i < mBuffers[kPortIndexOutput].size(); ++i) { BufferInfo *info = &mBuffers[kPortIndexOutput].editItemAt(i); info->mStatus = BufferInfo::OWNED_BY_US; + mAvailableOutputBuffers.push_back(info); } mPortEOS[kPortIndexInput] = false; @@ -660,8 +675,10 @@ void MediaFilter::onFlush() { sp notify = mNotify->dup(); notify->setInt32("what", CodecBase::kWhatFlushCompleted); notify->post(); + ALOGV("Posted kWhatFlushCompleted"); - requestFillEmptyInput(); + // MediaCodec returns all input buffers after flush, so in + // onInputBufferFilled we call postFillThisBuffer on them } void MediaFilter::onSetParameters(const sp &msg) { -- cgit v1.1