Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/FFmpeg/FFmpeg.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarton Balint <cus@passwd.hu>2019-04-03 02:13:55 +0300
committerMarton Balint <cus@passwd.hu>2019-04-11 22:18:51 +0300
commit3e10223385b83358f013cbf6ba069f15fedc731a (patch)
tree2dc382e9b557f17ee1e4dd2a5f1a43a53f126d22
parent6ed7df5b20e46b30f16deca5b619a1cf88bd48b3 (diff)
avformat/file: add seekable option to disallow seeking
Signed-off-by: Marton Balint <cus@passwd.hu>
-rw-r--r--doc/protocols.texi8
-rw-r--r--libavformat/file.c5
-rw-r--r--libavformat/version.h2
3 files changed, 14 insertions, 1 deletions
diff --git a/doc/protocols.texi b/doc/protocols.texi
index e1caa049a5..3e4e7af3d4 100644
--- a/doc/protocols.texi
+++ b/doc/protocols.texi
@@ -199,6 +199,14 @@ If set to 1, the protocol will retry reading at the end of the file, allowing
reading files that still are being written. In order for this to terminate,
you either need to use the rw_timeout option, or use the interrupt callback
(for API users).
+
+@item seekable
+Controls if seekability is advertised on the file. 0 means non-seekable, -1
+means auto (seekable for normal files, non-seekable for named pipes).
+
+Many demuxers handle seekable and non-seekable resources differently,
+overriding this might speed up opening certain files at the cost of losing some
+features (e.g. accurate seeking).
@end table
@section ftp
diff --git a/libavformat/file.c b/libavformat/file.c
index e613b91010..08c7f8e6dd 100644
--- a/libavformat/file.c
+++ b/libavformat/file.c
@@ -73,6 +73,7 @@ typedef struct FileContext {
int trunc;
int blocksize;
int follow;
+ int seekable;
#if HAVE_DIRENT_H
DIR *dir;
#endif
@@ -82,6 +83,7 @@ static const AVOption file_options[] = {
{ "truncate", "truncate existing files on write", offsetof(FileContext, trunc), AV_OPT_TYPE_BOOL, { .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 },
{ "follow", "Follow a file as it is being written", offsetof(FileContext, follow), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, AV_OPT_FLAG_DECODING_PARAM },
+ { "seekable", "Sets if the file is seekable", offsetof(FileContext, seekable), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 0, AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM },
{ NULL }
};
@@ -238,6 +240,9 @@ static int file_open(URLContext *h, const char *filename, int flags)
if (!h->is_streamed && flags & AVIO_FLAG_WRITE)
h->min_packet_size = h->max_packet_size = 262144;
+ if (c->seekable >= 0)
+ h->is_streamed = !c->seekable;
+
return 0;
}
diff --git a/libavformat/version.h b/libavformat/version.h
index b611d4d75f..d57c151554 100644
--- a/libavformat/version.h
+++ b/libavformat/version.h
@@ -33,7 +33,7 @@
// Also please add any ticket numbers that you believe might be affected here
#define LIBAVFORMAT_VERSION_MAJOR 58
#define LIBAVFORMAT_VERSION_MINOR 27
-#define LIBAVFORMAT_VERSION_MICRO 101
+#define LIBAVFORMAT_VERSION_MICRO 102
#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
LIBAVFORMAT_VERSION_MINOR, \