diff options
author | Andreas Huber <andih@google.com> | 2010-10-12 16:55:11 -0700 |
---|---|---|
committer | Andreas Huber <andih@google.com> | 2010-10-13 10:39:41 -0700 |
commit | 7fbdb0903dfbf70b314a74e64e28fb880cdb9247 (patch) | |
tree | fc9511b938ec6183dcf9d41d5f892bee2e8d85de /media/libstagefright/AwesomePlayer.cpp | |
parent | 5cb77e080ced5362b5f047e107327b3cb6ece6c9 (diff) | |
download | frameworks_av-7fbdb0903dfbf70b314a74e64e28fb880cdb9247.zip frameworks_av-7fbdb0903dfbf70b314a74e64e28fb880cdb9247.tar.gz frameworks_av-7fbdb0903dfbf70b314a74e64e28fb880cdb9247.tar.bz2 |
Attempt to derive the avg. bitrate of the entire stream from metadata.
related-to-bug: 3093224
Change-Id: I4726b023373e04468cc12fd64f7fe6ee923add95
Diffstat (limited to 'media/libstagefright/AwesomePlayer.cpp')
-rw-r--r-- | media/libstagefright/AwesomePlayer.cpp | 55 |
1 files changed, 46 insertions, 9 deletions
diff --git a/media/libstagefright/AwesomePlayer.cpp b/media/libstagefright/AwesomePlayer.cpp index 69389f5..57bea8c 100644 --- a/media/libstagefright/AwesomePlayer.cpp +++ b/media/libstagefright/AwesomePlayer.cpp @@ -303,6 +303,28 @@ status_t AwesomePlayer::setDataSource_l( } status_t AwesomePlayer::setDataSource_l(const sp<MediaExtractor> &extractor) { + // Attempt to approximate overall stream bitrate by summing all + // tracks' individual bitrates, if not all of them advertise bitrate, + // we have to fail. + + int64_t totalBitRate = 0; + + for (size_t i = 0; i < extractor->countTracks(); ++i) { + sp<MetaData> meta = extractor->getTrackMetaData(i); + + int32_t bitrate; + if (!meta->findInt32(kKeyBitRate, &bitrate)) { + totalBitRate = -1; + break; + } + + totalBitRate += bitrate; + } + + mBitrate = totalBitRate; + + LOGV("mBitrate = %lld bits/sec", mBitrate); + bool haveAudio = false; bool haveVideo = false; for (size_t i = 0; i < extractor->countTracks(); ++i) { @@ -441,6 +463,8 @@ void AwesomePlayer::reset_l() { delete mSuspensionState; mSuspensionState = NULL; + + mBitrate = -1; } void AwesomePlayer::notifyListener_l(int msg, int ext1, int ext2) { @@ -453,17 +477,32 @@ void AwesomePlayer::notifyListener_l(int msg, int ext1, int ext2) { } } +bool AwesomePlayer::getBitrate(int64_t *bitrate) { + off_t size; + if (mDurationUs >= 0 && mCachedSource != NULL + && mCachedSource->getSize(&size) == OK) { + *bitrate = size * 8000000ll / mDurationUs; // in bits/sec + return true; + } + + if (mBitrate >= 0) { + *bitrate = mBitrate; + return true; + } + + *bitrate = 0; + + return false; +} + // Returns true iff cached duration is available/applicable. bool AwesomePlayer::getCachedDuration_l(int64_t *durationUs, bool *eos) { - off_t totalSize; + int64_t bitrate; if (mRTSPController != NULL) { *durationUs = mRTSPController->getQueueDurationUs(eos); return true; - } else if (mCachedSource != NULL && mDurationUs >= 0 - && mCachedSource->getSize(&totalSize) == OK) { - int64_t bitrate = totalSize * 8000000ll / mDurationUs; // in bits/sec - + } else if (mCachedSource != NULL && getBitrate(&bitrate)) { size_t cachedDataRemaining = mCachedSource->approxDataRemaining(eos); *durationUs = cachedDataRemaining * 8000000ll / bitrate; return true; @@ -490,10 +529,8 @@ void AwesomePlayer::onBufferingUpdate() { finishAsyncPrepare_l(); } } else { - off_t size; - if (mDurationUs >= 0 && mCachedSource->getSize(&size) == OK) { - int64_t bitrate = size * 8000000ll / mDurationUs; // in bits/sec - + int64_t bitrate; + if (getBitrate(&bitrate)) { size_t cachedSize = mCachedSource->cachedSize(); int64_t cachedDurationUs = cachedSize * 8000000ll / bitrate; |