|
|
|
@@ -444,9 +444,15 @@ static int write_manifest(AVFormatContext *s, int final) |
|
|
|
AVIOContext *out; |
|
|
|
char temp_filename[1024]; |
|
|
|
int ret, i; |
|
|
|
const char *proto = avio_find_protocol_name(s->filename); |
|
|
|
int use_rename = proto && !strcmp(proto, "file"); |
|
|
|
static unsigned int warned_non_file = 0; |
|
|
|
AVDictionaryEntry *title = av_dict_get(s->metadata, "title", NULL, 0); |
|
|
|
|
|
|
|
snprintf(temp_filename, sizeof(temp_filename), "%s.tmp", s->filename); |
|
|
|
if (!use_rename && !warned_non_file++) |
|
|
|
av_log(s, AV_LOG_ERROR, "Cannot use rename on non file protocol, this may lead to races and temporary partial files\n"); |
|
|
|
|
|
|
|
snprintf(temp_filename, sizeof(temp_filename), use_rename ? "%s.tmp" : "%s", s->filename); |
|
|
|
ret = s->io_open(s, &out, temp_filename, AVIO_FLAG_WRITE, NULL); |
|
|
|
if (ret < 0) { |
|
|
|
av_log(s, AV_LOG_ERROR, "Unable to open %s for writing\n", temp_filename); |
|
|
|
@@ -548,7 +554,11 @@ static int write_manifest(AVFormatContext *s, int final) |
|
|
|
avio_printf(out, "</MPD>\n"); |
|
|
|
avio_flush(out); |
|
|
|
ff_format_io_close(s, &out); |
|
|
|
return avpriv_io_move(temp_filename, s->filename); |
|
|
|
|
|
|
|
if (use_rename) |
|
|
|
return avpriv_io_move(temp_filename, s->filename); |
|
|
|
|
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
static int dash_init(AVFormatContext *s) |
|
|
|
@@ -796,6 +806,10 @@ static int dash_flush(AVFormatContext *s, int final, int stream) |
|
|
|
{ |
|
|
|
DASHContext *c = s->priv_data; |
|
|
|
int i, ret = 0; |
|
|
|
|
|
|
|
const char *proto = avio_find_protocol_name(s->filename); |
|
|
|
int use_rename = proto && !strcmp(proto, "file"); |
|
|
|
|
|
|
|
int cur_flush_segment_index = 0; |
|
|
|
if (stream >= 0) |
|
|
|
cur_flush_segment_index = c->streams[stream].segment_index; |
|
|
|
@@ -833,7 +847,7 @@ static int dash_flush(AVFormatContext *s, int final, int stream) |
|
|
|
if (!c->single_file) { |
|
|
|
dash_fill_tmpl_params(filename, sizeof(filename), c->media_seg_name, i, os->segment_index, os->bit_rate, os->start_pts); |
|
|
|
snprintf(full_path, sizeof(full_path), "%s%s", c->dirname, filename); |
|
|
|
snprintf(temp_path, sizeof(temp_path), "%s.tmp", full_path); |
|
|
|
snprintf(temp_path, sizeof(temp_path), use_rename ? "%s.tmp" : "%s", full_path); |
|
|
|
ret = s->io_open(s, &os->out, temp_path, AVIO_FLAG_WRITE, NULL); |
|
|
|
if (ret < 0) |
|
|
|
break; |
|
|
|
@@ -851,9 +865,12 @@ static int dash_flush(AVFormatContext *s, int final, int stream) |
|
|
|
find_index_range(s, full_path, start_pos, &index_length); |
|
|
|
} else { |
|
|
|
ff_format_io_close(s, &os->out); |
|
|
|
ret = avpriv_io_move(temp_path, full_path); |
|
|
|
if (ret < 0) |
|
|
|
break; |
|
|
|
|
|
|
|
if (use_rename) { |
|
|
|
ret = avpriv_io_move(temp_path, full_path); |
|
|
|
if (ret < 0) |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
add_segment(os, filename, os->start_pts, os->max_pts - os->start_pts, start_pos, range_length, index_length); |
|
|
|
av_log(s, AV_LOG_VERBOSE, "Representation %d media segment %d written to: %s\n", i, os->segment_index, full_path); |
|
|
|
|