diff options
author | Martin Storsjö <martin@martin.st> | 2012-09-09 22:42:56 +0300 |
---|---|---|
committer | Martin Storsjö <martin@martin.st> | 2012-09-12 23:42:09 +0300 |
commit | 29a9b12b10c91c638205da74f3330acd06517ae8 (patch) | |
tree | 3bcf22a2b1f5796e02697233ae8ec2861210030f | |
parent | 5e3572893d7f17679c5e051c511bf42f3da77b00 (diff) | |
download | ffmpeg-29a9b12b10c91c638205da74f3330acd06517ae8.tar.gz |
file: Add an avoption for disabling truncating existing files on open
Signed-off-by: Martin Storsjö <martin@martin.st>
-rw-r--r-- | libavformat/file.c | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/libavformat/file.c b/libavformat/file.c index 3cfd28c2a4..3ea681fd9f 100644 --- a/libavformat/file.c +++ b/libavformat/file.c @@ -20,6 +20,7 @@ */ #include "libavutil/avstring.h" +#include "libavutil/opt.h" #include "avformat.h" #include <fcntl.h> #if HAVE_IO_H @@ -37,9 +38,23 @@ /* standard file protocol */ typedef struct FileContext { + const AVClass *class; int fd; + int trunc; } 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 }, + { NULL } +}; + +static const AVClass file_class = { + .class_name = "file", + .item_name = av_default_item_name, + .option = file_options, + .version = LIBAVUTIL_VERSION_INT, +}; + static int file_read(URLContext *h, unsigned char *buf, int size) { FileContext *c = h->priv_data; @@ -82,9 +97,13 @@ static int file_open(URLContext *h, const char *filename, int flags) av_strstart(filename, "file:", &filename); if (flags & AVIO_FLAG_WRITE && flags & AVIO_FLAG_READ) { - access = O_CREAT | O_TRUNC | O_RDWR; + access = O_CREAT | O_RDWR; + if (c->trunc) + access |= O_TRUNC; } else if (flags & AVIO_FLAG_WRITE) { - access = O_CREAT | O_TRUNC | O_WRONLY; + access = O_CREAT | O_WRONLY; + if (c->trunc) + access |= O_TRUNC; } else { access = O_RDONLY; } @@ -126,6 +145,7 @@ URLProtocol ff_file_protocol = { .url_get_file_handle = file_get_handle, .url_check = file_check, .priv_data_size = sizeof(FileContext), + .priv_data_class = &file_class, }; #endif /* CONFIG_FILE_PROTOCOL */ |