summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2011-10-07 07:59:35 -0700
committerAndroid (Google) Code Review <android-gerrit@google.com>2011-10-07 07:59:35 -0700
commit003124e20eb0744aab36ad1bde05e15ac122ad75 (patch)
tree431a6dd5869c3675abff12ef42579e2e0c90f8da /media
parent6c904e26d4cd7a79f589e613fa7b2866a9fccb15 (diff)
parenta045cb0e77097120e86e367e1cab5494ce2a5d5e (diff)
downloadframeworks_av-003124e20eb0744aab36ad1bde05e15ac122ad75.zip
frameworks_av-003124e20eb0744aab36ad1bde05e15ac122ad75.tar.gz
frameworks_av-003124e20eb0744aab36ad1bde05e15ac122ad75.tar.bz2
Merge "Allow a system property "media.stagefright.cache-params" to override cache/prefetcher"
Diffstat (limited to 'media')
-rw-r--r--media/libstagefright/NuCachedSource2.cpp57
-rw-r--r--media/libstagefright/include/NuCachedSource2.h17
2 files changed, 65 insertions, 9 deletions
diff --git a/media/libstagefright/NuCachedSource2.cpp b/media/libstagefright/NuCachedSource2.cpp
index 4edb613..2cacfa7 100644
--- a/media/libstagefright/NuCachedSource2.cpp
+++ b/media/libstagefright/NuCachedSource2.cpp
@@ -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
diff --git a/media/libstagefright/include/NuCachedSource2.h b/media/libstagefright/include/NuCachedSource2.h
index 22b2855..f04c566 100644
--- a/media/libstagefright/include/NuCachedSource2.h
+++ b/media/libstagefright/include/NuCachedSource2.h
@@ -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);
};