|
|
@@ -75,7 +75,6 @@ typedef struct DASHContext { |
|
|
|
int single_file; |
|
|
|
OutputStream *streams; |
|
|
|
int has_video, has_audio; |
|
|
|
int nb_segments; |
|
|
|
int last_duration; |
|
|
|
int total_duration; |
|
|
|
char availability_start_time[100]; |
|
|
@@ -595,10 +594,13 @@ static void find_index_range(AVFormatContext *s, const char *dirname, |
|
|
|
*index_length = AV_RB32(&buf[0]); |
|
|
|
} |
|
|
|
|
|
|
|
static int dash_flush(AVFormatContext *s, int final) |
|
|
|
static int dash_flush(AVFormatContext *s, int final, int stream) |
|
|
|
{ |
|
|
|
DASHContext *c = s->priv_data; |
|
|
|
int i, ret = 0; |
|
|
|
int cur_flush_segment_index = 0; |
|
|
|
if (stream >= 0) |
|
|
|
cur_flush_segment_index = c->streams[stream].segment_index; |
|
|
|
|
|
|
|
for (i = 0; i < s->nb_streams; i++) { |
|
|
|
OutputStream *os = &c->streams[i]; |
|
|
@@ -609,6 +611,18 @@ static int dash_flush(AVFormatContext *s, int final) |
|
|
|
if (!os->packets_written) |
|
|
|
continue; |
|
|
|
|
|
|
|
// Flush the single stream that got a keyframe right now. |
|
|
|
// Flush all audio streams as well, in sync with video keyframes, |
|
|
|
// but not the other video streams. |
|
|
|
if (stream >= 0 && i != stream) { |
|
|
|
if (s->streams[i]->codec->codec_type != AVMEDIA_TYPE_AUDIO) |
|
|
|
continue; |
|
|
|
// Make sure we don't flush audio streams multiple times, when |
|
|
|
// all video streams are flushed one at a time. |
|
|
|
if (c->has_video && os->segment_index > cur_flush_segment_index) |
|
|
|
continue; |
|
|
|
} |
|
|
|
|
|
|
|
if (!c->single_file) { |
|
|
|
snprintf(filename, sizeof(filename), "chunk-stream%d-%05d.m4s", i, os->segment_index); |
|
|
|
snprintf(full_path, sizeof(full_path), "%s%s", c->dirname, filename); |
|
|
@@ -665,7 +679,7 @@ static int dash_write_packet(AVFormatContext *s, AVPacket *pkt) |
|
|
|
DASHContext *c = s->priv_data; |
|
|
|
AVStream *st = s->streams[pkt->stream_index]; |
|
|
|
OutputStream *os = &c->streams[pkt->stream_index]; |
|
|
|
int64_t seg_end_duration = (c->nb_segments + 1) * (int64_t) c->min_seg_duration; |
|
|
|
int64_t seg_end_duration = (os->segment_index) * (int64_t) c->min_seg_duration; |
|
|
|
int ret; |
|
|
|
|
|
|
|
// If forcing the stream to start at 0, the mp4 muxer will set the start |
|
|
@@ -701,9 +715,8 @@ static int dash_write_packet(AVFormatContext *s, AVPacket *pkt) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if ((ret = dash_flush(s, 0)) < 0) |
|
|
|
if ((ret = dash_flush(s, 0, pkt->stream_index)) < 0) |
|
|
|
return ret; |
|
|
|
c->nb_segments++; |
|
|
|
} |
|
|
|
|
|
|
|
if (!os->packets_written) |
|
|
@@ -729,7 +742,7 @@ static int dash_write_trailer(AVFormatContext *s) |
|
|
|
s->streams[0]->time_base, |
|
|
|
AV_TIME_BASE_Q); |
|
|
|
} |
|
|
|
dash_flush(s, 1); |
|
|
|
dash_flush(s, 1, -1); |
|
|
|
|
|
|
|
if (c->remove_at_exit) { |
|
|
|
char filename[1024]; |
|
|
|