summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/httplive
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2010-11-18 11:03:48 -0800
committerAndreas Huber <andih@google.com>2010-11-18 12:45:12 -0800
commit7d23aa2a8354046ae0390eb5ad492346af5bce0f (patch)
treebca61c738bda9d21f15ab9a22e49388210e5a6b2 /media/libstagefright/httplive
parent14d32754d3a9c1ccf49188c489f224800cd747a7 (diff)
downloadframeworks_av-7d23aa2a8354046ae0390eb5ad492346af5bce0f.zip
frameworks_av-7d23aa2a8354046ae0390eb5ad492346af5bce0f.tar.gz
frameworks_av-7d23aa2a8354046ae0390eb5ad492346af5bce0f.tar.bz2
Support for "chunked" HTTP transfer encoding.
Change-Id: I2f20d2d9ec0fa0c840b429049b0385289a30e774 related-to-bug: 3205131
Diffstat (limited to 'media/libstagefright/httplive')
-rw-r--r--media/libstagefright/httplive/LiveSource.cpp35
1 files changed, 28 insertions, 7 deletions
diff --git a/media/libstagefright/httplive/LiveSource.cpp b/media/libstagefright/httplive/LiveSource.cpp
index f9d27eb..c19b6f7 100644
--- a/media/libstagefright/httplive/LiveSource.cpp
+++ b/media/libstagefright/httplive/LiveSource.cpp
@@ -555,20 +555,41 @@ status_t LiveSource::fetchM3U(const char *url, sp<ABuffer> *out) {
status_t err = source->getSize(&size);
if (err != OK) {
- return err;
+ size = 65536;
}
sp<ABuffer> buffer = new ABuffer(size);
- size_t offset = 0;
- while (offset < (size_t)size) {
+ buffer->setRange(0, 0);
+
+ for (;;) {
+ size_t bufferRemaining = buffer->capacity() - buffer->size();
+
+ if (bufferRemaining == 0) {
+ bufferRemaining = 32768;
+
+ LOGV("increasing download buffer to %d bytes",
+ buffer->size() + bufferRemaining);
+
+ sp<ABuffer> copy = new ABuffer(buffer->size() + bufferRemaining);
+ memcpy(copy->data(), buffer->data(), buffer->size());
+ copy->setRange(0, buffer->size());
+
+ buffer = copy;
+ }
+
ssize_t n = source->readAt(
- offset, buffer->data() + offset, size - offset);
+ buffer->size(), buffer->data() + buffer->size(),
+ bufferRemaining);
- if (n <= 0) {
- return ERROR_IO;
+ if (n < 0) {
+ return err;
+ }
+
+ if (n == 0) {
+ break;
}
- offset += n;
+ buffer->setRange(0, buffer->size() + (size_t)n);
}
*out = buffer;