summaryrefslogtreecommitdiffstats
path: root/media/libstagefright
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2010-04-08 07:51:20 -0700
committerAndreas Huber <andih@google.com>2010-04-08 07:51:20 -0700
commitd8c76856c6d52dcd11a90124dafef0af99956e15 (patch)
treef9ef2f8539358e4d08e4d3a0edc79be3612ed8cb /media/libstagefright
parentdac4ee72bac87388a1495e098f39d73168c8078f (diff)
downloadframeworks_av-d8c76856c6d52dcd11a90124dafef0af99956e15.zip
frameworks_av-d8c76856c6d52dcd11a90124dafef0af99956e15.tar.gz
frameworks_av-d8c76856c6d52dcd11a90124dafef0af99956e15.tar.bz2
Increase the size of the pages used in CachingDataSource (total amount of memory used remains the same) to compensate for reduced locality of audio/video data requests. Also fixes a mistaken trailing "\r\n" in the range header and better error handling on http connection.
Change-Id: Ic9a6ef204362bc9afdc61e081c76bc62e5ef92ad related-to-bug: 2580785
Diffstat (limited to 'media/libstagefright')
-rw-r--r--media/libstagefright/AwesomePlayer.cpp2
-rw-r--r--media/libstagefright/DataSource.cpp2
-rw-r--r--media/libstagefright/HTTPDataSource.cpp25
3 files changed, 24 insertions, 5 deletions
diff --git a/media/libstagefright/AwesomePlayer.cpp b/media/libstagefright/AwesomePlayer.cpp
index e7022f4..63dfa67 100644
--- a/media/libstagefright/AwesomePlayer.cpp
+++ b/media/libstagefright/AwesomePlayer.cpp
@@ -1091,7 +1091,7 @@ status_t AwesomePlayer::finishSetDataSource_l() {
}
dataSource = new CachingDataSource(
- mConnectingDataSource, 32 * 1024, 20);
+ mConnectingDataSource, 64 * 1024, 10);
mConnectingDataSource.clear();
} else {
diff --git a/media/libstagefright/DataSource.cpp b/media/libstagefright/DataSource.cpp
index 284e3bc..86e4bfe 100644
--- a/media/libstagefright/DataSource.cpp
+++ b/media/libstagefright/DataSource.cpp
@@ -105,7 +105,7 @@ sp<DataSource> DataSource::CreateFromURI(
if (httpSource->connect() != OK) {
return NULL;
}
- source = new CachingDataSource(httpSource, 32 * 1024, 20);
+ source = new CachingDataSource(httpSource, 64 * 1024, 10);
} else {
// Assume it's a filename.
source = new FileSource(uri);
diff --git a/media/libstagefright/HTTPDataSource.cpp b/media/libstagefright/HTTPDataSource.cpp
index 61ffa8d..48f8e7a 100644
--- a/media/libstagefright/HTTPDataSource.cpp
+++ b/media/libstagefright/HTTPDataSource.cpp
@@ -35,7 +35,8 @@ namespace android {
// connected.
static bool PerformRedirectIfNecessary(
HTTPStream *http, const String8 &headers,
- string *host, string *path, int *port) {
+ string *host, string *path, int *port,
+ status_t *result) {
String8 request;
request.append("GET ");
request.append(path->c_str());
@@ -52,6 +53,8 @@ static bool PerformRedirectIfNecessary(
err = http->receive_header(&http_status);
}
+ *result = err;
+
if (err != OK) {
return false;
}
@@ -181,6 +184,7 @@ status_t HTTPDataSource::connect() {
host.c_str(), port, path.c_str());
int numRedirectsRemaining = 5;
+ status_t result;
do {
status_t err = mHttp->connect(host.c_str(), port);
@@ -194,9 +198,19 @@ status_t HTTPDataSource::connect() {
return err;
}
- } while (PerformRedirectIfNecessary(mHttp, mHeaders, &host, &path, &port)
+ } while (PerformRedirectIfNecessary(
+ mHttp, mHeaders, &host, &path, &port, &result)
&& numRedirectsRemaining-- > 0);
+ if (result != OK) {
+ // An error occurred while attempting to follow redirections/connect.
+ Mutex::Autolock autoLock(mStateLock);
+
+ mState = DISCONNECTED;
+
+ return result;
+ }
+
string value;
if (mHttp->find_header_value("Content-Length", &value)) {
char *end;
@@ -282,7 +296,7 @@ ssize_t HTTPDataSource::sendRangeRequest(size_t offset) {
char range[128];
if (offset > 0) {
- sprintf(range, "Range: bytes=%d-\r\n\r\n", offset);
+ sprintf(range, "Range: bytes=%d-\r\n", offset);
} else {
range[0] = '\0';
}
@@ -313,6 +327,7 @@ ssize_t HTTPDataSource::sendRangeRequest(size_t offset) {
}
if ((http_status / 100) != 2) {
+ LOGE("HTTP request failed, http status = %d", http_status);
return UNKNOWN_ERROR;
}
@@ -349,6 +364,10 @@ rinse_repeat:
memcpy(data, (const char *)mBuffer + (offset - mBufferOffset), copy);
+ if (copy < size) {
+ LOGV("short read (1), returning %d vs. %d requested", copy, size);
+ }
+
return copy;
}