[FFmpeg-devel] [PATCH 4/5] file: Add 'blocksize' option

Andrey Utkin andrey.krieger.utkin at gmail.com
Sat Jul 13 19:05:41 CEST 2013


Interruptibility of file operations is strongly desirable in case of
slow storage access, e.g. mounted network share.
This commit introduces possibility to limit data quantity transferred by
'file' protocol at once. By default, old behaviour is preserved and data
is still tried to be transferred without block size limitation.

Note that file I/O operation still may block (or even freeze) inside of
single read(2) or write(2) operation.
---
 libavformat/file.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/libavformat/file.c b/libavformat/file.c
index e09a64b..656c0c1 100644
--- a/libavformat/file.c
+++ b/libavformat/file.c
@@ -49,10 +49,12 @@ typedef struct FileContext {
     const AVClass *class;
     int fd;
     int trunc;
+    int blocksize;
 } FileContext;
 
 static const AVOption file_options[] = {
     { "truncate", "Truncate existing files on write", offsetof(FileContext, trunc), AV_OPT_TYPE_INT, { .i64 = 1 }, 0, 1, AV_OPT_FLAG_ENCODING_PARAM },
+    { "blocksize", "set I/O operation maximum block size", offsetof(FileContext, blocksize), AV_OPT_TYPE_INT, { .i64 = INT_MAX }, 1, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
     { NULL }
 };
 
@@ -66,14 +68,18 @@ static const AVClass file_class = {
 static int file_read(URLContext *h, unsigned char *buf, int size)
 {
     FileContext *c = h->priv_data;
-    int r = read(c->fd, buf, size);
+    int r;
+    size = FFMIN(size, c->blocksize);
+    r = read(c->fd, buf, size);
     return (-1 == r)?AVERROR(errno):r;
 }
 
 static int file_write(URLContext *h, const unsigned char *buf, int size)
 {
     FileContext *c = h->priv_data;
-    int r = write(c->fd, buf, size);
+    int r;
+    size = FFMIN(size, c->blocksize);
+    r = write(c->fd, buf, size);
     return (-1 == r)?AVERROR(errno):r;
 }
 
-- 
1.8.1.5



More information about the ffmpeg-devel mailing list