From 594f0ba996ec04218f758458ae62182f98d58ac5 Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Wed, 5 Oct 2011 14:32:17 -0700 Subject: [PATCH] Allow a system property "media.stagefright.cache-params" to override cache/prefetcher default parameters. To override specify a property adb shell setprop media.stagefright.cache-params "4096/20480/15" to set the low water threshold to 4096 KB, the high water threshold to 20 MB and the keepalive interval to 15 secs. if high and/or lowwater mark are negative, the default values are used for the respective value. if keep-alive interval is 0, keep-alives are disabled. Change-Id: I89a4a06836e4a2f473d7a92b567ab07818c2f87d --- media/libstagefright/NuCachedSource2.cpp | 57 +++++++++++++++++-- .../libstagefright/include/NuCachedSource2.h | 17 ++++-- 2 files changed, 65 insertions(+), 9 deletions(-) diff --git a/media/libstagefright/NuCachedSource2.cpp b/media/libstagefright/NuCachedSource2.cpp index 4edb613c33b62..2cacfa73d0474 100644 --- a/media/libstagefright/NuCachedSource2.cpp +++ b/media/libstagefright/NuCachedSource2.cpp @@ -21,6 +21,7 @@ #include "include/NuCachedSource2.h" #include "include/HTTPBase.h" +#include #include #include #include @@ -186,7 +187,12 @@ NuCachedSource2::NuCachedSource2(const sp &source) mLastAccessPos(0), mFetching(true), mLastFetchTimeUs(-1), - mNumRetriesLeft(kMaxNumRetries) { + mNumRetriesLeft(kMaxNumRetries), + mHighwaterThresholdBytes(kDefaultHighWaterThreshold), + mLowwaterThresholdBytes(kDefaultLowWaterThreshold), + mKeepAliveIntervalUs(kDefaultKeepAliveIntervalUs) { + updateCacheParamsFromSystemProperty(); + mLooper->setName("NuCachedSource2"); mLooper->registerHandler(mReflector); mLooper->start(); @@ -318,7 +324,8 @@ void NuCachedSource2::onFetch() { bool keepAlive = !mFetching && mFinalStatus == OK - && ALooper::GetNowUs() >= mLastFetchTimeUs + kKeepAliveIntervalUs; + && mKeepAliveIntervalUs > 0 + && ALooper::GetNowUs() >= mLastFetchTimeUs + mKeepAliveIntervalUs; if (mFetching || keepAlive) { if (keepAlive) { @@ -329,7 +336,7 @@ void NuCachedSource2::onFetch() { mLastFetchTimeUs = ALooper::GetNowUs(); - if (mFetching && mCache->totalSize() >= kHighWaterThreshold) { + if (mFetching && mCache->totalSize() >= mHighwaterThresholdBytes) { LOGI("Cache full, done prefetching for now"); mFetching = false; } @@ -392,7 +399,7 @@ void NuCachedSource2::restartPrefetcherIfNecessary_l( if (!ignoreLowWaterThreshold && !force && mCacheOffset + mCache->totalSize() - mLastAccessPos - >= kLowWaterThreshold) { + >= mLowwaterThresholdBytes) { return; } @@ -482,7 +489,7 @@ size_t NuCachedSource2::approxDataRemaining_l(status_t *finalStatus) { } ssize_t NuCachedSource2::readInternal(off64_t offset, void *data, size_t size) { - CHECK_LE(size, (size_t)kHighWaterThreshold); + CHECK_LE(size, (size_t)mHighwaterThresholdBytes); LOGV("readInternal offset %lld size %d", offset, size); @@ -580,4 +587,44 @@ String8 NuCachedSource2::getMIMEType() const { return mSource->getMIMEType(); } +void NuCachedSource2::updateCacheParamsFromSystemProperty() { + char value[PROPERTY_VALUE_MAX]; + if (!property_get("media.stagefright.cache-params", value, NULL)) { + return; + } + + updateCacheParamsFromString(value); +} + +void NuCachedSource2::updateCacheParamsFromString(const char *s) { + ssize_t lowwaterMarkKb, highwaterMarkKb; + unsigned keepAliveSecs; + + if (sscanf(s, "%ld/%ld/%u", + &lowwaterMarkKb, &highwaterMarkKb, &keepAliveSecs) != 3 + || lowwaterMarkKb >= highwaterMarkKb) { + LOGE("Failed to parse cache parameters from '%s'.", s); + return; + } + + if (lowwaterMarkKb >= 0) { + mLowwaterThresholdBytes = lowwaterMarkKb * 1024; + } else { + mLowwaterThresholdBytes = kDefaultLowWaterThreshold; + } + + if (highwaterMarkKb >= 0) { + mHighwaterThresholdBytes = highwaterMarkKb * 1024; + } else { + mHighwaterThresholdBytes = kDefaultHighWaterThreshold; + } + + mKeepAliveIntervalUs = keepAliveSecs * 1000000ll; + + LOGV("lowwater = %d bytes, highwater = %d bytes, keepalive = %lld us", + mLowwaterThresholdBytes, + mHighwaterThresholdBytes, + mKeepAliveIntervalUs); +} + } // namespace android diff --git a/media/libstagefright/include/NuCachedSource2.h b/media/libstagefright/include/NuCachedSource2.h index 22b2855204e97..f04c56664713f 100644 --- a/media/libstagefright/include/NuCachedSource2.h +++ b/media/libstagefright/include/NuCachedSource2.h @@ -63,13 +63,13 @@ private: friend struct AHandlerReflector; enum { - kPageSize = 65536, - kHighWaterThreshold = 20 * 1024 * 1024, - kLowWaterThreshold = 4 * 1024 * 1024, + kPageSize = 65536, + kDefaultHighWaterThreshold = 20 * 1024 * 1024, + kDefaultLowWaterThreshold = 4 * 1024 * 1024, // Read data after a 15 sec timeout whether we're actively // fetching or not. - kKeepAliveIntervalUs = 15000000, + kDefaultKeepAliveIntervalUs = 15000000, }; enum { @@ -99,6 +99,12 @@ private: int32_t mNumRetriesLeft; + size_t mHighwaterThresholdBytes; + size_t mLowwaterThresholdBytes; + + // If the keep-alive interval is 0, keep-alives are disabled. + int64_t mKeepAliveIntervalUs; + void onMessageReceived(const sp &msg); void onFetch(); void onRead(const sp &msg); @@ -112,6 +118,9 @@ private: void restartPrefetcherIfNecessary_l( bool ignoreLowWaterThreshold = false, bool force = false); + void updateCacheParamsFromSystemProperty(); + void updateCacheParamsFromString(const char *s); + DISALLOW_EVIL_CONSTRUCTORS(NuCachedSource2); };