diff options
author | Andreas Huber <andih@google.com> | 2010-11-18 11:03:48 -0800 |
---|---|---|
committer | Andreas Huber <andih@google.com> | 2010-11-18 12:45:12 -0800 |
commit | 7d23aa2a8354046ae0390eb5ad492346af5bce0f (patch) | |
tree | bca61c738bda9d21f15ab9a22e49388210e5a6b2 /media/libstagefright/httplive | |
parent | 14d32754d3a9c1ccf49188c489f224800cd747a7 (diff) | |
download | frameworks_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.cpp | 35 |
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; |