Message ID | 1521782825-26685-1-git-send-email-vdixit@akamai.com |
---|---|
State | Superseded |
Headers | show |
On 3/23/18 10:57 AM, vdixit@akamai.com wrote: > From: Vishwanath Dixit <vdixit@akamai.com> > > 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. > --- > libavformat/dashenc.c | 11 ++++++++++- > 1 file changed, 10 insertions(+), 1 deletion(-) > > diff --git a/libavformat/dashenc.c b/libavformat/dashenc.c > index b62cb3e..d20bdba 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]; > + int64_t chunk_duration; Remove this variable chunk_duration, and instead create a variable directly for availabilityTimeOffset. > } OutputStream; > > typedef struct DASHContext { > @@ -343,8 +344,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=\"%d\" ", c->seg_duration); > + if (c->streaming && os->chunk_duration) > + avio_printf(out, "availabilityTimeOffset=\"%.3f\" ", > + ((double) c->seg_duration - os->chunk_duration) / AV_TIME_BASE); > + } > 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; > @@ -1283,6 +1288,10 @@ static int dash_write_packet(AVFormatContext *s, AVPacket *pkt) > format_date_now(c->availability_start_time, > sizeof(c->availability_start_time)); > > + if (!os->chunk_duration && pkt->duration) > + os->chunk_duration = av_rescale_q(pkt->duration, st->time_base, > + AV_TIME_BASE_Q); Don’t use the term ‘chunk_duration’ here, as it is not clearly conceptualized in this file. Instead use the term ‘frame_duration’(local variable) to avoid confusion. > + > 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;
On 4/2/18 9:36 AM, Jeyapal, Karthick wrote: > > > On 3/23/18 10:57 AM, vdixit@akamai.com wrote: >> From: Vishwanath Dixit <vdixit@akamai.com> >> >> 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. >> --- >> libavformat/dashenc.c | 11 ++++++++++- >> 1 file changed, 10 insertions(+), 1 deletion(-) >> >> diff --git a/libavformat/dashenc.c b/libavformat/dashenc.c >> index b62cb3e..d20bdba 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]; >> + int64_t chunk_duration; > Remove this variable chunk_duration, and instead create a variable directly for availabilityTimeOffset. Thanks for the review. I have submitted the revised patch https://patchwork.ffmpeg.org/patch/8312/ >> } OutputStream; >> >> typedef struct DASHContext { >> @@ -343,8 +344,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=\"%d\" ", c->seg_duration); >> + if (c->streaming && os->chunk_duration) >> + avio_printf(out, "availabilityTimeOffset=\"%.3f\" ", >> + ((double) c->seg_duration - os->chunk_duration) / AV_TIME_BASE); >> + } >> 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; >> @@ -1283,6 +1288,10 @@ static int dash_write_packet(AVFormatContext *s, AVPacket *pkt) >> format_date_now(c->availability_start_time, >> sizeof(c->availability_start_time)); >> >> + if (!os->chunk_duration && pkt->duration) >> + os->chunk_duration = av_rescale_q(pkt->duration, st->time_base, >> + AV_TIME_BASE_Q); > Don’t use the term ‘chunk_duration’ here, as it is not clearly conceptualized in this file. > Instead use the term ‘frame_duration’(local variable) to avoid confusion. Thanks for the review. I have submitted the revised patch https://patchwork.ffmpeg.org/patch/8312/ >> + >> 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; > > >
diff --git a/libavformat/dashenc.c b/libavformat/dashenc.c index b62cb3e..d20bdba 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]; + int64_t chunk_duration; } OutputStream; typedef struct DASHContext { @@ -343,8 +344,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=\"%d\" ", c->seg_duration); + if (c->streaming && os->chunk_duration) + avio_printf(out, "availabilityTimeOffset=\"%.3f\" ", + ((double) c->seg_duration - os->chunk_duration) / AV_TIME_BASE); + } 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; @@ -1283,6 +1288,10 @@ static int dash_write_packet(AVFormatContext *s, AVPacket *pkt) format_date_now(c->availability_start_time, sizeof(c->availability_start_time)); + if (!os->chunk_duration && pkt->duration) + os->chunk_duration = av_rescale_q(pkt->duration, st->time_base, + AV_TIME_BASE_Q); + 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;
From: Vishwanath Dixit <vdixit@akamai.com> 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. --- libavformat/dashenc.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-)