From a53d87c7b1428fe02f535c31dafd64cb1362fde9 Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Thu, 19 Apr 2012 16:25:20 -0700 Subject: Add the ability to query the amount of cached data to NuMediaExtractor. Change-Id: I0966270a2bd36698330beaa03f47d02fc6a40c44 related-to-bug: 6364341 --- media/libstagefright/NuMediaExtractor.cpp | 86 ++++++++++++++++++++++++++++++- 1 file changed, 85 insertions(+), 1 deletion(-) (limited to 'media/libstagefright/NuMediaExtractor.cpp') 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 #include "include/ESDS.h" +#include "include/NuCachedSource2.h" #include "include/WVMExtractor.h" #include @@ -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 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 *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 = + static_cast(mImpl.get()); + + status_t finalStatus; + *durationUs = wvmExtractor->getCachedDurationUs(&finalStatus); + *eos = (finalStatus != OK); + return true; + } else if ((mDataSource->flags() & DataSource::kIsCachingDataSource) + && getTotalBitrate(&bitrate)) { + sp cachedSource = + static_cast(mDataSource.get()); + + status_t finalStatus; + size_t cachedDataRemaining = + cachedSource->approxDataRemaining(&finalStatus); + + *durationUs = cachedDataRemaining * 8000000ll / bitrate; + *eos = (finalStatus != OK); + return true; + } + + return false; +} + } // namespace android -- cgit v1.1