summaryrefslogtreecommitdiff
path: root/libavformat/dashenc.c
diff options
context:
space:
mode:
authorMartin Storsjö <martin@martin.st>2014-11-18 14:06:19 +0200
committerMartin Storsjö <martin@martin.st>2014-11-24 23:34:44 +0200
commitb9d08c77a44390b0848c06f20bc0e9e951ba6a3c (patch)
tree3b888a8c125faa6e0aa695cf55fb96b1485331bf /libavformat/dashenc.c
parent40665d27e38e6a2f65037878202bd1a398c7683e (diff)
lavf: Don't try to update files atomically with renames on windows
On windows, rename(2) will fail if the target file exists. On unix this trick is used to make sure that people reading the file either will get the full previous file, or the full new version of the file, but no intermediate version. Signed-off-by: Martin Storsjö <martin@martin.st>
Diffstat (limited to 'libavformat/dashenc.c')
-rw-r--r--libavformat/dashenc.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/libavformat/dashenc.c b/libavformat/dashenc.c
index 065466169e..57ce85fb71 100644
--- a/libavformat/dashenc.c
+++ b/libavformat/dashenc.c
@@ -296,13 +296,15 @@ static int write_manifest(AVFormatContext *s, int final)
DASHContext *c = s->priv_data;
AVIOContext *out;
char temp_filename[1024];
+ const char *write_filename;
int ret, i;
AVDictionaryEntry *title = av_dict_get(s->metadata, "title", NULL, 0);
snprintf(temp_filename, sizeof(temp_filename), "%s.tmp", s->filename);
- ret = avio_open2(&out, temp_filename, AVIO_FLAG_WRITE, &s->interrupt_callback, NULL);
+ write_filename = USE_RENAME_REPLACE ? temp_filename : s->filename;
+ ret = avio_open2(&out, write_filename, AVIO_FLAG_WRITE, &s->interrupt_callback, NULL);
if (ret < 0) {
- av_log(s, AV_LOG_ERROR, "Unable to open %s for writing\n", temp_filename);
+ av_log(s, AV_LOG_ERROR, "Unable to open %s for writing\n", write_filename);
return ret;
}
avio_printf(out, "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
@@ -392,7 +394,7 @@ static int write_manifest(AVFormatContext *s, int final)
avio_printf(out, "</MPD>\n");
avio_flush(out);
avio_close(out);
- return ff_rename(temp_filename, s->filename);
+ return USE_RENAME_REPLACE ? ff_rename(temp_filename, s->filename) : 0;
}
static int dash_write_header(AVFormatContext *s)
@@ -605,6 +607,7 @@ static int dash_flush(AVFormatContext *s, int final, int stream)
for (i = 0; i < s->nb_streams; i++) {
OutputStream *os = &c->streams[i];
char filename[1024] = "", full_path[1024], temp_path[1024];
+ const char *write_path;
int64_t start_pos = avio_tell(os->ctx->pb);
int range_length, index_length = 0;
@@ -627,7 +630,8 @@ static int dash_flush(AVFormatContext *s, int final, int stream)
snprintf(filename, sizeof(filename), "chunk-stream%d-%05d.m4s", i, os->segment_index);
snprintf(full_path, sizeof(full_path), "%s%s", c->dirname, filename);
snprintf(temp_path, sizeof(temp_path), "%s.tmp", full_path);
- ret = ffurl_open(&os->out, temp_path, AVIO_FLAG_WRITE, &s->interrupt_callback, NULL);
+ write_path = USE_RENAME_REPLACE ? temp_path : full_path;
+ ret = ffurl_open(&os->out, write_path, AVIO_FLAG_WRITE, &s->interrupt_callback, NULL);
if (ret < 0)
break;
write_styp(os->ctx->pb);
@@ -642,7 +646,7 @@ static int dash_flush(AVFormatContext *s, int final, int stream)
} else {
ffurl_close(os->out);
os->out = NULL;
- ret = ff_rename(temp_path, full_path);
+ ret = USE_RENAME_REPLACE ? ff_rename(temp_path, full_path) : 0;
if (ret < 0)
break;
}