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
This commit is contained in:
Andreas Huber
2011-10-05 14:32:17 -07:00
parent 94d2f366f9
commit 594f0ba996
2 changed files with 65 additions and 9 deletions

View File

@@ -21,6 +21,7 @@
#include "include/NuCachedSource2.h"
#include "include/HTTPBase.h"
#include <cutils/properties.h>
#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/foundation/AMessage.h>
#include <media/stagefright/MediaErrors.h>
@@ -186,7 +187,12 @@ NuCachedSource2::NuCachedSource2(const sp<DataSource> &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

View File

@@ -63,13 +63,13 @@ private:
friend struct AHandlerReflector<NuCachedSource2>;
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<AMessage> &msg);
void onFetch();
void onRead(const sp<AMessage> &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);
};