From e98f8c04faf27df3b1829d336299ad51dad569cf Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Thu, 23 Feb 2012 11:21:43 -0800 Subject: Be more greedy when it comes to gathering input and output buffers. Change-Id: I54c4f608e5155917ca35eba5655b4c06357fb112 --- cmds/stagefright/SimplePlayer.cpp | 73 +++++++++++++++++++++++++-------------- cmds/stagefright/codec.cpp | 2 +- 2 files changed, 49 insertions(+), 26 deletions(-) (limited to 'cmds/stagefright') diff --git a/cmds/stagefright/SimplePlayer.cpp b/cmds/stagefright/SimplePlayer.cpp index f850344b..f269e809 100644 --- a/cmds/stagefright/SimplePlayer.cpp +++ b/cmds/stagefright/SimplePlayer.cpp @@ -259,7 +259,7 @@ void SimplePlayer::onMessageReceived(const sp &msg) { status_t err = onDoMoreStuff(); if (err == OK) { - msg->post(5000ll); + msg->post(10000ll); } break; } @@ -411,33 +411,53 @@ status_t SimplePlayer::onReset() { } status_t SimplePlayer::onDoMoreStuff() { + ALOGV("onDoMoreStuff"); for (size_t i = 0; i < mStateByTrackIndex.size(); ++i) { CodecState *state = &mStateByTrackIndex.editValueAt(i); - size_t index; - status_t err = state->mCodec->dequeueInputBuffer(&index); + status_t err; + do { + size_t index; + err = state->mCodec->dequeueInputBuffer(&index); - if (err == OK) { - state->mAvailInputBufferIndices.push_back(index); - } + if (err == OK) { + ALOGV("dequeued input buffer on track %d", + mStateByTrackIndex.keyAt(i)); - BufferInfo info; - err = state->mCodec->dequeueOutputBuffer( - &info.mIndex, - &info.mOffset, - &info.mSize, - &info.mPresentationTimeUs, - &info.mFlags); - - if (err == OK) { - state->mAvailOutputBufferInfos.push_back(info); - } else if (err == INFO_FORMAT_CHANGED) { - err = onOutputFormatChanged(mStateByTrackIndex.keyAt(i), state); - CHECK_EQ(err, (status_t)OK); - } else if (err == INFO_OUTPUT_BUFFERS_CHANGED) { - err = state->mCodec->getOutputBuffers(&state->mBuffers[1]); - CHECK_EQ(err, (status_t)OK); - } + state->mAvailInputBufferIndices.push_back(index); + } else { + ALOGV("dequeueInputBuffer on track %d returned %d", + mStateByTrackIndex.keyAt(i), err); + } + } while (err == OK); + + do { + BufferInfo info; + err = state->mCodec->dequeueOutputBuffer( + &info.mIndex, + &info.mOffset, + &info.mSize, + &info.mPresentationTimeUs, + &info.mFlags); + + if (err == OK) { + ALOGV("dequeued output buffer on track %d", + mStateByTrackIndex.keyAt(i)); + + state->mAvailOutputBufferInfos.push_back(info); + } else if (err == INFO_FORMAT_CHANGED) { + err = onOutputFormatChanged(mStateByTrackIndex.keyAt(i), state); + CHECK_EQ(err, (status_t)OK); + } else if (err == INFO_OUTPUT_BUFFERS_CHANGED) { + err = state->mCodec->getOutputBuffers(&state->mBuffers[1]); + CHECK_EQ(err, (status_t)OK); + } else { + ALOGV("dequeueOutputBuffer on track %d returned %d", + mStateByTrackIndex.keyAt(i), err); + } + } while (err == OK + || err == INFO_FORMAT_CHANGED + || err == INFO_OUTPUT_BUFFERS_CHANGED); } for (;;) { @@ -475,6 +495,8 @@ status_t SimplePlayer::onDoMoreStuff() { 0); CHECK_EQ(err, (status_t)OK); + ALOGV("enqueued input data on track %d", trackIndex); + err = mExtractor->advance(); CHECK_EQ(err, (status_t)OK); } @@ -500,7 +522,7 @@ status_t SimplePlayer::onDoMoreStuff() { if (lateByUs > 30000ll) { ALOGI("track %d buffer late by %lld us, dropping.", - i, lateByUs); + mStateByTrackIndex.keyAt(i), lateByUs); state->mCodec->releaseOutputBuffer(info->mIndex); } else { if (state->mAudioTrack != NULL) { @@ -529,7 +551,8 @@ status_t SimplePlayer::onDoMoreStuff() { break; } } else { - ALOGV("track %d buffer early by %lld us.", i, -lateByUs); + ALOGV("track %d buffer early by %lld us.", + mStateByTrackIndex.keyAt(i), -lateByUs); break; } } diff --git a/cmds/stagefright/codec.cpp b/cmds/stagefright/codec.cpp index 02dc8ddc..ad246d26 100644 --- a/cmds/stagefright/codec.cpp +++ b/cmds/stagefright/codec.cpp @@ -394,7 +394,7 @@ int main(int argc, char **argv) { player->setDataSource(argv[0]); player->setSurface(surface->getSurfaceTexture()); player->start(); - sleep(10); + sleep(60); player->stop(); player->reset(); -- cgit v1.2.3