mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-01-24 13:56:33 +02:00
avformat/dashenc: opening a segment file when its first frame is ready
This commit is contained in:
parent
74afa54528
commit
ffe7cc89d0
@ -81,6 +81,9 @@ typedef struct OutputStream {
|
||||
char bandwidth_str[64];
|
||||
|
||||
char codec_str[100];
|
||||
char filename[1024];
|
||||
char full_path[1024];
|
||||
char temp_path[1024];
|
||||
} OutputStream;
|
||||
|
||||
typedef struct DASHContext {
|
||||
@ -1134,7 +1137,6 @@ static int dash_flush(AVFormatContext *s, int final, int stream)
|
||||
for (i = 0; i < s->nb_streams; i++) {
|
||||
OutputStream *os = &c->streams[i];
|
||||
AVStream *st = s->streams[i];
|
||||
char filename[1024] = "", full_path[1024], temp_path[1024];
|
||||
int range_length, index_length = 0;
|
||||
|
||||
if (!os->packets_written)
|
||||
@ -1152,24 +1154,11 @@ static int dash_flush(AVFormatContext *s, int final, int stream)
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!os->init_range_length) {
|
||||
flush_init_segment(s, os);
|
||||
}
|
||||
|
||||
if (!c->single_file) {
|
||||
AVDictionary *opts = NULL;
|
||||
ff_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), use_rename ? "%s.tmp" : "%s", full_path);
|
||||
set_http_options(&opts, c);
|
||||
ret = dashenc_io_open(s, &os->out, temp_path, &opts);
|
||||
if (ret < 0)
|
||||
break;
|
||||
av_dict_free(&opts);
|
||||
if (!strcmp(os->format_name, "mp4"))
|
||||
write_styp(os->ctx->pb);
|
||||
} else {
|
||||
snprintf(full_path, sizeof(full_path), "%s%s", c->dirname, os->initfile);
|
||||
snprintf(os->full_path, sizeof(os->full_path), "%s%s", c->dirname, os->initfile);
|
||||
}
|
||||
|
||||
ret = flush_dynbuf(os, &range_length);
|
||||
@ -1178,12 +1167,12 @@ static int dash_flush(AVFormatContext *s, int final, int stream)
|
||||
os->packets_written = 0;
|
||||
|
||||
if (c->single_file) {
|
||||
find_index_range(s, full_path, os->pos, &index_length);
|
||||
find_index_range(s, os->full_path, os->pos, &index_length);
|
||||
} else {
|
||||
dashenc_io_close(s, &os->out, temp_path);
|
||||
dashenc_io_close(s, &os->out, os->temp_path);
|
||||
|
||||
if (use_rename) {
|
||||
ret = avpriv_io_move(temp_path, full_path);
|
||||
ret = avpriv_io_move(os->temp_path, os->full_path);
|
||||
if (ret < 0)
|
||||
break;
|
||||
}
|
||||
@ -1200,8 +1189,8 @@ static int dash_flush(AVFormatContext *s, int final, int stream)
|
||||
" bandwidth=\"%d\"", os->bit_rate);
|
||||
}
|
||||
}
|
||||
add_segment(os, filename, os->start_pts, os->max_pts - os->start_pts, os->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);
|
||||
add_segment(os, os->filename, os->start_pts, os->max_pts - os->start_pts, os->pos, range_length, index_length);
|
||||
av_log(s, AV_LOG_VERBOSE, "Representation %d media segment %d written to: %s\n", i, os->segment_index, os->full_path);
|
||||
|
||||
os->pos += range_length;
|
||||
}
|
||||
@ -1303,7 +1292,33 @@ static int dash_write_packet(AVFormatContext *s, AVPacket *pkt)
|
||||
else
|
||||
os->max_pts = FFMAX(os->max_pts, pkt->pts + pkt->duration);
|
||||
os->packets_written++;
|
||||
return ff_write_chained(os->ctx, 0, pkt, s, 0);
|
||||
if ((ret = ff_write_chained(os->ctx, 0, pkt, s, 0)) < 0)
|
||||
return ret;
|
||||
|
||||
if (!os->init_range_length)
|
||||
flush_init_segment(s, os);
|
||||
|
||||
//open the output context when the first frame of a segment is ready
|
||||
if (!c->single_file && !os->out) {
|
||||
AVDictionary *opts = NULL;
|
||||
const char *proto = avio_find_protocol_name(s->filename);
|
||||
int use_rename = proto && !strcmp(proto, "file");
|
||||
os->filename[0] = os->full_path[0] = os->temp_path[0] = '\0';
|
||||
ff_dash_fill_tmpl_params(os->filename, sizeof(os->filename),
|
||||
c->media_seg_name, pkt->stream_index,
|
||||
os->segment_index, os->bit_rate, os->start_pts);
|
||||
snprintf(os->full_path, sizeof(os->full_path), "%s%s", c->dirname,
|
||||
os->filename);
|
||||
snprintf(os->temp_path, sizeof(os->temp_path),
|
||||
use_rename ? "%s.tmp" : "%s", os->full_path);
|
||||
set_http_options(&opts, c);
|
||||
ret = dashenc_io_open(s, &os->out, os->temp_path, &opts);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
av_dict_free(&opts);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int dash_write_trailer(AVFormatContext *s)
|
||||
|
Loading…
x
Reference in New Issue
Block a user