*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; } _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel