diff options
author | Andreas Huber <andih@google.com> | 2010-10-15 08:32:06 -0700 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2010-10-15 08:32:06 -0700 |
commit | 4bd4bd6fc05ab7108f4f59f98bd6b595cec58e02 (patch) | |
tree | c667af4181a0213610fc2ee53d39b3b0aacd3d0a /media | |
parent | d609279c33f7d5587e5fa0bd954bff846623e246 (diff) | |
parent | bb5d7c21615128630fc9d08274bb14ca01e2124b (diff) | |
download | frameworks_base-4bd4bd6fc05ab7108f4f59f98bd6b595cec58e02.zip frameworks_base-4bd4bd6fc05ab7108f4f59f98bd6b595cec58e02.tar.gz frameworks_base-4bd4bd6fc05ab7108f4f59f98bd6b595cec58e02.tar.bz2 |
am bb5d7c21: am 5f423917: Merge "Attempt to derive the avg. bitrate of the entire stream from metadata." into gingerbread
Merge commit 'bb5d7c21615128630fc9d08274bb14ca01e2124b'
* commit 'bb5d7c21615128630fc9d08274bb14ca01e2124b':
Attempt to derive the avg. bitrate of the entire stream from metadata.
Diffstat (limited to 'media')
-rw-r--r-- | media/libstagefright/AwesomePlayer.cpp | 55 | ||||
-rw-r--r-- | media/libstagefright/include/AwesomePlayer.h | 4 |
2 files changed, 50 insertions, 9 deletions
diff --git a/media/libstagefright/AwesomePlayer.cpp b/media/libstagefright/AwesomePlayer.cpp index 7b4dd1c..a0b7f70 100644 --- a/media/libstagefright/AwesomePlayer.cpp +++ b/media/libstagefright/AwesomePlayer.cpp @@ -306,6 +306,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) { @@ -444,6 +466,8 @@ void AwesomePlayer::reset_l() { delete mSuspensionState; mSuspensionState = NULL; + + mBitrate = -1; } void AwesomePlayer::notifyListener_l(int msg, int ext1, int ext2) { @@ -456,17 +480,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; @@ -493,10 +532,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; diff --git a/media/libstagefright/include/AwesomePlayer.h b/media/libstagefright/include/AwesomePlayer.h index 8efe634..5a1d7e7 100644 --- a/media/libstagefright/include/AwesomePlayer.h +++ b/media/libstagefright/include/AwesomePlayer.h @@ -154,6 +154,8 @@ private: bool mSeekNotificationSent; int64_t mSeekTimeUs; + int64_t mBitrate; // total bitrate of the file (in bps) or -1 if unknown. + bool mWatchForAudioSeekComplete; bool mWatchForAudioEOS; @@ -257,6 +259,8 @@ private: static void OnRTSPSeekDoneWrapper(void *cookie); void onRTSPSeekDone(); + bool getBitrate(int64_t *bitrate); + AwesomePlayer(const AwesomePlayer &); AwesomePlayer &operator=(const AwesomePlayer &); }; |