diff options
author | James Dong <jdong@google.com> | 2010-08-12 10:07:51 -0700 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2010-08-12 10:07:51 -0700 |
commit | 45cb3cfacf3b07ae3c5f15eba9bbbcd060cee261 (patch) | |
tree | 773d6f747e55868f205f5ce82257d5bf85fdd61c | |
parent | b6541f0af89b1fe85cb53e5dac461587eb040fb0 (diff) | |
parent | afe5305855e2f3d830337f768028615a44d4aa16 (diff) | |
download | frameworks_base-45cb3cfacf3b07ae3c5f15eba9bbbcd060cee261.zip frameworks_base-45cb3cfacf3b07ae3c5f15eba9bbbcd060cee261.tar.gz frameworks_base-45cb3cfacf3b07ae3c5f15eba9bbbcd060cee261.tar.bz2 |
Merge "Handle large audio lost" into gingerbread
-rw-r--r-- | include/media/stagefright/AudioSource.h | 3 | ||||
-rw-r--r-- | media/libstagefright/AudioSource.cpp | 26 |
2 files changed, 19 insertions, 10 deletions
diff --git a/include/media/stagefright/AudioSource.h b/include/media/stagefright/AudioSource.h index f1d45d2..2597e9e 100644 --- a/include/media/stagefright/AudioSource.h +++ b/include/media/stagefright/AudioSource.h @@ -60,7 +60,8 @@ private: int64_t mStartTimeUs; int16_t mMaxAmplitude; int64_t mPrevSampleTimeUs; - int64_t mNumLostFrames; + int64_t mTotalLostFrames; + int64_t mPrevLostBytes; MediaBufferGroup *mGroup; diff --git a/media/libstagefright/AudioSource.cpp b/media/libstagefright/AudioSource.cpp index 99978e8..c8dfede 100644 --- a/media/libstagefright/AudioSource.cpp +++ b/media/libstagefright/AudioSource.cpp @@ -35,7 +35,8 @@ AudioSource::AudioSource( : mStarted(false), mCollectStats(false), mPrevSampleTimeUs(0), - mNumLostFrames(0), + mTotalLostFrames(0), + mPrevLostBytes(0), mGroup(NULL) { LOGV("sampleRate: %d, channels: %d", sampleRate, channels); @@ -108,7 +109,8 @@ status_t AudioSource::stop() { mStarted = false; if (mCollectStats) { - LOGI("Total lost audio frames: %lld", mNumLostFrames); + LOGI("Total lost audio frames: %lld", + mTotalLostFrames + (mPrevLostBytes >> 1)); } return OK; @@ -186,10 +188,11 @@ status_t AudioSource::read( // Insert null frames when lost frames are detected. int64_t timestampUs = mPrevSampleTimeUs; uint32_t numLostBytes = mRecord->getInputFramesLost() << 1; + numLostBytes += mPrevLostBytes; #if 0 // Simulate lost frames - numLostBytes = ((rand() * 1.0 / RAND_MAX)) * kMaxBufferSize; - numLostBytes &= 0xFFFFFFFE; // Alignment request + numLostBytes = ((rand() * 1.0 / RAND_MAX)) * 2 * kMaxBufferSize; + numLostBytes &= 0xFFFFFFFE; // Alignment requirement // Reduce the chance to lose if (rand() * 1.0 / RAND_MAX >= 0.05) { @@ -197,13 +200,18 @@ status_t AudioSource::read( } #endif if (numLostBytes > 0) { - // Not expect too many lost frames! - CHECK(numLostBytes <= kMaxBufferSize); + if (numLostBytes > kMaxBufferSize) { + mPrevLostBytes = numLostBytes - kMaxBufferSize; + numLostBytes = kMaxBufferSize; + } + + CHECK_EQ(numLostBytes & 1, 0); + timestampUs += ((1000000LL * (numLostBytes >> 1)) + + (sampleRate >> 1)) / sampleRate; - timestampUs += (1000000LL * numLostBytes >> 1) / sampleRate; CHECK(timestampUs > mPrevSampleTimeUs); if (mCollectStats) { - mNumLostFrames += (numLostBytes >> 1); + mTotalLostFrames += (numLostBytes >> 1); } if ((err = skipFrame(timestampUs, options)) == -1) { buffer->release(); @@ -240,7 +248,7 @@ status_t AudioSource::read( buffer->meta_data()->setInt64(kKeyTime, mPrevSampleTimeUs); CHECK(timestampUs > mPrevSampleTimeUs); - if (mNumLostFrames == 0) { + if (mTotalLostFrames == 0) { CHECK_EQ(mPrevSampleTimeUs, mStartTimeUs + (1000000LL * numFramesRecorded) / sampleRate); } |