Commit 3e102233 authored by Marton Balint's avatar Marton Balint

avformat/file: add seekable option to disallow seeking

Signed-off-by: 's avatarMarton Balint <cus@passwd.hu>
parent 6ed7df5b
...@@ -199,6 +199,14 @@ If set to 1, the protocol will retry reading at the end of the file, allowing ...@@ -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, 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 you either need to use the rw_timeout option, or use the interrupt callback
(for API users). (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 @end table
@section ftp @section ftp
......
...@@ -73,6 +73,7 @@ typedef struct FileContext { ...@@ -73,6 +73,7 @@ typedef struct FileContext {
int trunc; int trunc;
int blocksize; int blocksize;
int follow; int follow;
int seekable;
#if HAVE_DIRENT_H #if HAVE_DIRENT_H
DIR *dir; DIR *dir;
#endif #endif
...@@ -82,6 +83,7 @@ static const AVOption file_options[] = { ...@@ -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 }, { "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 }, { "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 }, { "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 } { NULL }
}; };
...@@ -238,6 +240,9 @@ static int file_open(URLContext *h, const char *filename, int flags) ...@@ -238,6 +240,9 @@ static int file_open(URLContext *h, const char *filename, int flags)
if (!h->is_streamed && flags & AVIO_FLAG_WRITE) if (!h->is_streamed && flags & AVIO_FLAG_WRITE)
h->min_packet_size = h->max_packet_size = 262144; h->min_packet_size = h->max_packet_size = 262144;
if (c->seekable >= 0)
h->is_streamed = !c->seekable;
return 0; return 0;
} }
......
...@@ -33,7 +33,7 @@ ...@@ -33,7 +33,7 @@
// Also please add any ticket numbers that you believe might be affected here // Also please add any ticket numbers that you believe might be affected here
#define LIBAVFORMAT_VERSION_MAJOR 58 #define LIBAVFORMAT_VERSION_MAJOR 58
#define LIBAVFORMAT_VERSION_MINOR 27 #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, \ #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
LIBAVFORMAT_VERSION_MINOR, \ LIBAVFORMAT_VERSION_MINOR, \
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment