summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/filters
diff options
context:
space:
mode:
authorDavid Smith <davidas@google.com>2014-09-09 14:01:13 -0700
committerDavid Smith <davidas@google.com>2014-09-09 14:23:58 -0700
commit2897286dae2934562c48febd4427b8839aeb4007 (patch)
tree2cdc7411c89705b5488347bd76a577c35f879698 /media/libstagefright/filters
parentb5f9ccfa2f8ddcd2e0c391d15fededc66533c9dd (diff)
downloadframeworks_av-2897286dae2934562c48febd4427b8839aeb4007.zip
frameworks_av-2897286dae2934562c48febd4427b8839aeb4007.tar.gz
frameworks_av-2897286dae2934562c48febd4427b8839aeb4007.tar.bz2
stagefright: finish implementing MediaFilter flush
Bug: 17203044 Change-Id: I6a967ead4dd9588caafe0041f2f4a39637368a62
Diffstat (limited to 'media/libstagefright/filters')
-rw-r--r--media/libstagefright/filters/MediaFilter.cpp23
1 files changed, 20 insertions, 3 deletions
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<AMessage> notify = mNotify->dup();
notify->setInt32("what", CodecBase::kWhatDrainThisBuffer);
notify->setInt32("buffer-id", info->mBufferID);
@@ -544,9 +546,11 @@ void MediaFilter::onInputBufferFilled(const sp<AMessage> &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<AMessage> &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<AMessage> &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<AMessage> &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<AMessage> 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<AMessage> &msg) {