[FFmpeg-devel] cache: read ahead to avoid excessive small requests

Robert Nagy ronag89 at gmail.com
Sat Sep 22 20:29:18 EEST 2018


*diff --git a/libavformat/cache.c b/libavformat/cache.c*

*index 66bbbf54c9..48ff5ab363 100644*

*--- a/libavformat/cache.c*

*+++ b/libavformat/cache.c*

@@ -153,6 +153,38 @@ fail:

     return ret;

 }



+static int cache_read_ahead(URLContext *h)

+{

+    Context *c= h->priv_data;

+    int64_t r, read_ahead, pos;

+    uint8_t buf[32768];

+

+    pos = c->logical_pos;

+    read_ahead = c->read_ahead_limit < 0

+        ? 512 * 512

+        : FFMIN(512 * 512, c->read_ahead_limit);

+

+    while (read_ahead > 0) {

+        r = ffurl_read(c->inner, buf, FFMIN(read_ahead, sizeof(buf)));

+        if (r == AVERROR_EOF) {

+            c->is_true_eof = 1;

+            av_assert0(c->end >= c->logical_pos);

+        }

+        if (r<=0)

+            break;

+        c->inner_pos += r;

+

+        add_entry(h, buf, r);

+        c->logical_pos += r;

+        c->end = FFMAX(c->end, c->logical_pos);

+        read_ahead -= r;

+    }

+

+    c->logical_pos = pos;

+

+    return r < 0 ? r : 0;

+}

+

 static int cache_read(URLContext *h, unsigned char *buf, int size)

 {

     Context *c= h->priv_data;

@@ -215,6 +247,10 @@ static int cache_read(URLContext *h, unsigned char
*buf, int size)

     c->logical_pos += r;

     c->end = FFMAX(c->end, c->logical_pos);



+    // Fake filling thread to avoid excessive

+    // small reads.

+    cache_read_ahead(h);

+

     return r;

 }


More information about the ffmpeg-devel mailing list