[FFmpeg-cvslog] http: move chunk handling from http_read_stream() to http_buf_read().

Ronald S. Bultje git at videolan.org
Mon Dec 5 23:51:25 EET 2016


ffmpeg | branch: release/3.0 | Ronald S. Bultje <rsbultje at gmail.com> | Mon Dec  5 10:18:10 2016 -0500| [726faff0aa86fa040280c57f27eefde47a17ea1b] | committer: Ronald S. Bultje

http: move chunk handling from http_read_stream() to http_buf_read().

(cherry picked from commit 845bb401781ef04e342bd558df16a8dbf5f800f9)

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=726faff0aa86fa040280c57f27eefde47a17ea1b
---

 libavformat/http.c | 57 +++++++++++++++++++++++++++++-------------------------
 1 file changed, 31 insertions(+), 26 deletions(-)

diff --git a/libavformat/http.c b/libavformat/http.c
index bd84aa0..f027e03 100644
--- a/libavformat/http.c
+++ b/libavformat/http.c
@@ -1153,6 +1153,34 @@ static int http_buf_read(URLContext *h, uint8_t *buf, int size)
 {
     HTTPContext *s = h->priv_data;
     int len;
+
+    if (s->chunksize != UINT64_MAX) {
+        if (!s->chunksize) {
+            char line[32];
+            int err;
+
+            do {
+                if ((err = http_get_line(s, line, sizeof(line))) < 0)
+                    return err;
+            } while (!*line);    /* skip CR LF from last chunk */
+
+            s->chunksize = strtoull(line, NULL, 16);
+
+            av_log(h, AV_LOG_TRACE,
+                   "Chunked encoding data size: %"PRIu64"'\n",
+                    s->chunksize);
+
+            if (!s->chunksize)
+                return 0;
+            else if (s->chunksize == UINT64_MAX) {
+                av_log(h, AV_LOG_ERROR, "Invalid chunk size %"PRIu64"\n",
+                       s->chunksize);
+                return AVERROR(EINVAL);
+            }
+        }
+        size = FFMIN(size, s->chunksize);
+    }
+
     /* read bytes from input buffer first */
     len = s->buf_end - s->buf_ptr;
     if (len > 0) {
@@ -1175,8 +1203,10 @@ static int http_buf_read(URLContext *h, uint8_t *buf, int size)
     }
     if (len > 0) {
         s->off += len;
-        if (s->chunksize > 0)
+        if (s->chunksize > 0) {
+            av_assert0(s->chunksize >= len);
             s->chunksize -= len;
+        }
     }
     return len;
 }
@@ -1230,31 +1260,6 @@ static int http_read_stream(URLContext *h, uint8_t *buf, int size)
             return err;
     }
 
-    if (s->chunksize != UINT64_MAX) {
-        if (!s->chunksize) {
-            char line[32];
-
-                do {
-                    if ((err = http_get_line(s, line, sizeof(line))) < 0)
-                        return err;
-                } while (!*line);    /* skip CR LF from last chunk */
-
-                s->chunksize = strtoull(line, NULL, 16);
-
-                av_log(h, AV_LOG_TRACE,
-                       "Chunked encoding data size: %"PRIu64"'\n",
-                        s->chunksize);
-
-                if (!s->chunksize)
-                    return 0;
-                else if (s->chunksize == UINT64_MAX) {
-                    av_log(h, AV_LOG_ERROR, "Invalid chunk size %"PRIu64"\n",
-                           s->chunksize);
-                    return AVERROR(EINVAL);
-                }
-        }
-        size = FFMIN(size, s->chunksize);
-    }
 #if CONFIG_ZLIB
     if (s->compressed)
         return http_buf_read_compressed(h, buf, size);



More information about the ffmpeg-cvslog mailing list