diff options
author | Nicolas George <nicolas.george@normalesup.org> | 2011-02-04 19:12:37 +0100 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2011-02-06 20:31:46 +0100 |
commit | 3ce3b4982447eb557555c444b2e75787de7c3472 (patch) | |
tree | dc194f3e1e21d109fa05557438614fa275162d20 | |
parent | f4bd5800acc0cfcc26a28b3600c4c4c9077cc154 (diff) | |
download | ffmpeg-3ce3b4982447eb557555c444b2e75787de7c3472.tar.gz |
Non-blocking protocol: core wrapper functions
Signed-off-by: Nicolas George <nicolas.george@normalesup.org>
Signed-off-by: Ronald S. Bultje <rsbultje@gmail.com>
(cherry picked from commit 90441276e4f661c6aec5e4d2c5718cde1ff1946d)
-rw-r--r-- | libavformat/avio.c | 32 | ||||
-rw-r--r-- | libavformat/avio.h | 1 |
2 files changed, 19 insertions, 14 deletions
diff --git a/libavformat/avio.c b/libavformat/avio.c index 9a4d7355c5..a19ec37cb1 100644 --- a/libavformat/avio.c +++ b/libavformat/avio.c @@ -206,24 +206,21 @@ int url_open(URLContext **puc, const char *filename, int flags) return ret; } -int url_read(URLContext *h, unsigned char *buf, int size) -{ - int ret; - if (h->flags & URL_WRONLY) - return AVERROR(EIO); - ret = h->prot->url_read(h, buf, size); - return ret; -} - -static inline int retry_transfer_wrapper(URLContext *h, unsigned char *buf, int size, +static inline int retry_transfer_wrapper(URLContext *h, unsigned char *buf, int size, int size_min, int (*transfer_func)(URLContext *h, unsigned char *buf, int size)) { int ret, len; int fast_retries = 5; len = 0; - while (len < size) { + while (len < size_min) { + if (url_interrupt_cb()) + return AVERROR(EINTR); ret = transfer_func(h, buf+len, size-len); + if (ret == AVERROR(EINTR)) + continue; + if (h->flags & URL_FLAG_NONBLOCK) + return ret; if (ret == AVERROR(EAGAIN)) { ret = 0; if (fast_retries) @@ -239,9 +236,18 @@ static inline int retry_transfer_wrapper(URLContext *h, unsigned char *buf, int return len; } +int url_read(URLContext *h, unsigned char *buf, int size) +{ + if (h->flags & URL_WRONLY) + return AVERROR(EIO); + return retry_transfer_wrapper(h, buf, size, 1, h->prot->url_read); +} + int url_read_complete(URLContext *h, unsigned char *buf, int size) { - return retry_transfer_wrapper(h, buf, size, url_read); + if (h->flags & URL_WRONLY) + return AVERROR(EIO); + return retry_transfer_wrapper(h, buf, size, size, h->prot->url_read); } int url_write(URLContext *h, const unsigned char *buf, int size) @@ -252,7 +258,7 @@ int url_write(URLContext *h, const unsigned char *buf, int size) if (h->max_packet_size && size > h->max_packet_size) return AVERROR(EIO); - return retry_transfer_wrapper(h, buf, size, h->prot->url_write); + return retry_transfer_wrapper(h, buf, size, size, h->prot->url_write); } int64_t url_seek(URLContext *h, int64_t pos, int whence) diff --git a/libavformat/avio.h b/libavformat/avio.h index d05cab1810..c899c0df0e 100644 --- a/libavformat/avio.h +++ b/libavformat/avio.h @@ -151,7 +151,6 @@ int url_read(URLContext *h, unsigned char *buf, int size); /** * Read as many bytes as possible (up to size), calling the * read function multiple times if necessary. - * Will also retry if the read function returns AVERROR(EAGAIN). * This makes special short-read handling in applications * unnecessary, if the return value is < size then it is * certain there was either an error or the end of file was reached. |