diff options
author | Andreas Huber <andih@google.com> | 2012-04-19 16:25:20 -0700 |
---|---|---|
committer | Andreas Huber <andih@google.com> | 2012-04-19 16:53:42 -0700 |
commit | a53d87c7b1428fe02f535c31dafd64cb1362fde9 (patch) | |
tree | 91d1c0a816d28e2b4103522753119ae0b7b5a3e5 /media/libstagefright/NuMediaExtractor.cpp | |
parent | 8d6086781c79620ce6133df7bd27f0efdee6b4e6 (diff) | |
download | frameworks_av-a53d87c7b1428fe02f535c31dafd64cb1362fde9.zip frameworks_av-a53d87c7b1428fe02f535c31dafd64cb1362fde9.tar.gz frameworks_av-a53d87c7b1428fe02f535c31dafd64cb1362fde9.tar.bz2 |
Add the ability to query the amount of cached data to NuMediaExtractor.
Change-Id: I0966270a2bd36698330beaa03f47d02fc6a40c44
related-to-bug: 6364341
Diffstat (limited to 'media/libstagefright/NuMediaExtractor.cpp')
-rw-r--r-- | media/libstagefright/NuMediaExtractor.cpp | 86 |
1 files changed, 85 insertions, 1 deletions
diff --git a/media/libstagefright/NuMediaExtractor.cpp b/media/libstagefright/NuMediaExtractor.cpp index 00bb74f..123e510 100644 --- a/media/libstagefright/NuMediaExtractor.cpp +++ b/media/libstagefright/NuMediaExtractor.cpp @@ -21,6 +21,7 @@ #include <media/stagefright/NuMediaExtractor.h> #include "include/ESDS.h" +#include "include/NuCachedSource2.h" #include "include/WVMExtractor.h" #include <media/stagefright/foundation/ABuffer.h> @@ -38,7 +39,10 @@ namespace android { -NuMediaExtractor::NuMediaExtractor() { +NuMediaExtractor::NuMediaExtractor() + : mIsWidevineExtractor(false), + mTotalBitrate(-1ll), + mDurationUs(-1ll) { } NuMediaExtractor::~NuMediaExtractor() { @@ -66,6 +70,7 @@ status_t NuMediaExtractor::setDataSource( return -ENOENT; } + mIsWidevineExtractor = false; if (!strncasecmp("widevine://", path, 11)) { String8 mimeType; float confidence; @@ -82,6 +87,7 @@ status_t NuMediaExtractor::setDataSource( extractor->setAdaptiveStreamingMode(true); mImpl = extractor; + mIsWidevineExtractor = true; } else { mImpl = MediaExtractor::Create(dataSource); } @@ -90,6 +96,10 @@ status_t NuMediaExtractor::setDataSource( return ERROR_UNSUPPORTED; } + mDataSource = dataSource; + + updateDurationAndBitrate(); + return OK; } @@ -111,9 +121,39 @@ status_t NuMediaExtractor::setDataSource(int fd, off64_t offset, off64_t size) { return ERROR_UNSUPPORTED; } + mDataSource = fileSource; + + updateDurationAndBitrate(); + return OK; } +void NuMediaExtractor::updateDurationAndBitrate() { + mTotalBitrate = 0ll; + mDurationUs = -1ll; + + for (size_t i = 0; i < mImpl->countTracks(); ++i) { + sp<MetaData> meta = mImpl->getTrackMetaData(i); + + int32_t bitrate; + if (!meta->findInt32(kKeyBitRate, &bitrate)) { + const char *mime; + CHECK(meta->findCString(kKeyMIMEType, &mime)); + ALOGV("track of type '%s' does not publish bitrate", mime); + + mTotalBitrate = -1ll; + } else if (mTotalBitrate >= 0ll) { + mTotalBitrate += bitrate; + } + + int64_t durationUs; + if (meta->findInt64(kKeyDuration, &durationUs) + && durationUs > mDurationUs) { + mDurationUs = durationUs; + } + } +} + size_t NuMediaExtractor::countTracks() const { return mImpl == NULL ? 0 : mImpl->countTracks(); } @@ -508,4 +548,48 @@ status_t NuMediaExtractor::getSampleMeta(sp<MetaData> *sampleMeta) { return OK; } +bool NuMediaExtractor::getTotalBitrate(int64_t *bitrate) const { + if (mTotalBitrate >= 0) { + *bitrate = mTotalBitrate; + return true; + } + + off64_t size; + if (mDurationUs >= 0 && mDataSource->getSize(&size) == OK) { + *bitrate = size * 8000000ll / mDurationUs; // in bits/sec + return true; + } + + return false; +} + +// Returns true iff cached duration is available/applicable. +bool NuMediaExtractor::getCachedDuration( + int64_t *durationUs, bool *eos) const { + int64_t bitrate; + if (mIsWidevineExtractor) { + sp<WVMExtractor> wvmExtractor = + static_cast<WVMExtractor *>(mImpl.get()); + + status_t finalStatus; + *durationUs = wvmExtractor->getCachedDurationUs(&finalStatus); + *eos = (finalStatus != OK); + return true; + } else if ((mDataSource->flags() & DataSource::kIsCachingDataSource) + && getTotalBitrate(&bitrate)) { + sp<NuCachedSource2> cachedSource = + static_cast<NuCachedSource2 *>(mDataSource.get()); + + status_t finalStatus; + size_t cachedDataRemaining = + cachedSource->approxDataRemaining(&finalStatus); + + *durationUs = cachedDataRemaining * 8000000ll / bitrate; + *eos = (finalStatus != OK); + return true; + } + + return false; +} + } // namespace android |