diff options
author | Vishwanath Dixit <vdixit@akamai.com> | 2018-04-11 12:31:47 +0530 |
---|---|---|
committer | Karthick Jeyapal <kjeyapal@akamai.com> | 2018-04-17 14:33:37 +0530 |
commit | 990380367b071212675813be25c2a93054c1d3d2 (patch) | |
tree | be6305cec37fe677690ccf56a0d4aa5a48e19c80 | |
parent | 3e75057a1d702ccc71f858095f64f6cd96f6461e (diff) | |
download | ffmpeg-streaming-990380367b071212675813be25c2a93054c1d3d2.zip ffmpeg-streaming-990380367b071212675813be25c2a93054c1d3d2.tar.gz |
avformat/dashenc: addition of @availabilityTimeOffset in MPD
availability time of Nth segment = availabilityStartTime + (N*segment duration) - availabilityTimeOffset.
This field helps to reduce the latency by about a segment duration in streaming mode.
-rw-r--r-- | libavformat/dashenc.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/libavformat/dashenc.c b/libavformat/dashenc.c index 5d5310d..70409e5 100644 --- a/libavformat/dashenc.c +++ b/libavformat/dashenc.c @@ -85,6 +85,7 @@ typedef struct OutputStream { char filename[1024]; char full_path[1024]; char temp_path[1024]; + double availability_time_offset; } OutputStream; typedef struct DASHContext { @@ -346,8 +347,12 @@ static void output_segment_list(OutputStream *os, AVIOContext *out, AVFormatCont if (c->use_template) { int timescale = c->use_timeline ? os->ctx->streams[0]->time_base.den : AV_TIME_BASE; avio_printf(out, "\t\t\t\t<SegmentTemplate timescale=\"%d\" ", timescale); - if (!c->use_timeline) + if (!c->use_timeline) { avio_printf(out, "duration=\"%"PRId64"\" ", c->seg_duration); + if (c->streaming && os->availability_time_offset) + avio_printf(out, "availabilityTimeOffset=\"%.3f\" ", + os->availability_time_offset); + } avio_printf(out, "initialization=\"%s\" media=\"%s\" startNumber=\"%d\">\n", c->init_seg_name, c->media_seg_name, c->use_timeline ? start_number : 1); if (c->use_timeline) { int64_t cur_time = 0; @@ -1293,6 +1298,13 @@ static int dash_write_packet(AVFormatContext *s, AVPacket *pkt) format_date_now(c->availability_start_time, sizeof(c->availability_start_time)); + if (!os->availability_time_offset && pkt->duration) { + int64_t frame_duration = av_rescale_q(pkt->duration, st->time_base, + AV_TIME_BASE_Q); + os->availability_time_offset = ((double) c->seg_duration - + frame_duration) / AV_TIME_BASE; + } + if (c->use_template && !c->use_timeline) { elapsed_duration = pkt->pts - os->first_pts; seg_end_duration = (int64_t) os->segment_index * c->seg_duration; |