Mercurial > libavformat.hg
changeset 5059:a5b8b8cce2dd libavformat
Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
author | rbultje |
---|---|
date | Tue, 23 Jun 2009 15:38:53 +0000 |
parents | 33a244b7ca65 |
children | 0bac77c4a578 |
files | http.c |
diffstat | 1 files changed, 31 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/http.c Mon Jun 22 23:09:34 2009 +0000 +++ b/http.c Tue Jun 23 15:38:53 2009 +0000 @@ -23,6 +23,7 @@ #include "libavutil/avstring.h" #include "avformat.h" #include <unistd.h> +#include <strings.h> #include "network.h" #include "os_support.h" @@ -39,6 +40,7 @@ unsigned char buffer[BUFFER_SIZE], *buf_ptr, *buf_end; int line_count; int http_code; + int64_t chunksize; /**< Used if "Transfer-Encoding: chunked" otherwise -1. */ int64_t off, filesize; char location[URL_SIZE]; } HTTPContext; @@ -124,6 +126,7 @@ } h->priv_data = s; s->filesize = -1; + s->chunksize = -1; s->off = 0; av_strlcpy(s->location, uri, URL_SIZE); @@ -222,6 +225,9 @@ s->filesize = atoll(slash+1); } h->is_streamed = 0; /* we _can_ in fact seek */ + } else if (!strcmp (tag, "Transfer-Encoding") && !strncasecmp(p, "chunked", 7)) { + s->filesize = -1; + s->chunksize = 0; } } return 1; @@ -296,6 +302,27 @@ HTTPContext *s = h->priv_data; int len; + if (s->chunksize >= 0) { + if (!s->chunksize) { + char line[32]; + + for(;;) { + do { + if (http_get_line(s, line, sizeof(line)) < 0) + return AVERROR(EIO); + } while (!*line); /* skip CR LF from last chunk */ + + s->chunksize = strtoll(line, NULL, 16); + + dprintf(NULL, "Chunked encoding data size: %"PRId64"'\n", s->chunksize); + + if (!s->chunksize) + return 0; + break; + } + } + size = FFMIN(size, s->chunksize); + } /* read bytes from input buffer first */ len = s->buf_end - s->buf_ptr; if (len > 0) { @@ -306,8 +333,11 @@ } else { len = url_read(s->hd, buf, size); } - if (len > 0) + if (len > 0) { s->off += len; + if (s->chunksize > 0) + s->chunksize -= len; + } return len; }