diff mbox

[FFmpeg-devel,06/11] avformat/dashenc: addition of @availabilityTimeOffset in MPD

Message ID 1521782825-26685-1-git-send-email-vdixit@akamai.com
State Superseded
Headers show

Commit Message

Dixit, Vishwanath March 23, 2018, 5:27 a.m. UTC
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(-)

Comments

Jeyapal, Karthick April 2, 2018, 4:06 a.m. UTC | #1
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;
Dixit, Vishwanath April 4, 2018, 9:07 a.m. UTC | #2
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 mbox

Patch

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;