[FFmpeg-devel] [PATCH] dashenc: Add a segment_start_number option

Rodger Combs rodger.combs at gmail.com
Fri Nov 21 04:51:15 CET 2014


> On Nov 20, 2014, at 21:47, Rodger Combs <rodger.combs at gmail.com> wrote:
> 
> 
>> On Nov 20, 2014, at 02:41, Benoit Fouet <benoit.fouet at free.fr <mailto:benoit.fouet at free.fr>> wrote:
>> 
>> Hi,
>> 
>> ----- Mail original -----
>>> From b38a1396e2335e2d0ef2619b5a3890f91c31c8a8 Mon Sep 17 00:00:00
>>> 2001
>>> From: Rodger Combs <rodger.combs at gmail.com <mailto:rodger.combs at gmail.com>>
>>> Date: Thu, 20 Nov 2014 01:47:05 -0600
>>> Subject: [PATCH] dashenc: Add a segment_start_number option
>>> 
>>> This defaults to 0 instead of 1 for consistency with the segment
>>> encoder
>>> ---
>>> libavformat/dashenc.c | 6 ++++--
>>> 1 file changed, 4 insertions(+), 2 deletions(-)
>>> 
>>> diff --git a/libavformat/dashenc.c b/libavformat/dashenc.c
>>> index dac217e..5958270 100644
>>> --- a/libavformat/dashenc.c
>>> +++ b/libavformat/dashenc.c
>>> @@ -80,6 +80,7 @@ typedef struct DASHContext {
>>>     int total_duration;
>>>     char availability_start_time[100];
>>>     char dirname[1024];
>>> +    int segment_start_number;
>>> } DASHContext;
>>> 
>>> static int dash_write(void *opaque, uint8_t *buf, int buf_size)
>>> @@ -182,7 +183,7 @@ static void dash_free(AVFormatContext *s)
>>> 
>>> static void output_segment_list(OutputStream *os, AVIOContext *out,
>>> DASHContext *c)
>>> {
>>> -    int i, start_index = 0, start_number = 1;
>>> +    int i, start_index = 0, start_number = c->segment_start_number;
>>>     if (c->window_size) {
>>>         start_index  = FFMAX(os->nb_segments   - c->window_size, 0);
>>>         start_number = FFMAX(os->segment_index - c->window_size, 1);
>>> @@ -512,7 +513,7 @@ static int dash_write_header(AVFormatContext *s)
>>> 
>>>         set_codec_str(s, os->ctx->streams[0]->codec, os->codec_str,
>>>         sizeof(os->codec_str));
>>>         os->first_dts = AV_NOPTS_VALUE;
>>> -        os->segment_index = 1;
>>> +        os->segment_index = c->segment_start_number;
>>>     }
>>> 
>>>     if (!c->has_video && c->min_seg_duration <= 0) {
>>> @@ -754,6 +755,7 @@ static const AVOption options[] = {
>>>     { "use_template", "Use SegmentTemplate instead of SegmentList",
>>>     OFFSET(use_template), AV_OPT_TYPE_INT, { .i64 = 1 }, 0, 1, E },
>>>     { "use_timeline", "Use SegmentTimeline in SegmentTemplate",
>>>     OFFSET(use_timeline), AV_OPT_TYPE_INT, { .i64 = 1 }, 0, 1, E },
>>>     { "single_file", "Store all segments in one file, accessed using
>>>     byte ranges", OFFSET(single_file), AV_OPT_TYPE_INT, { .i64 = 0
>>>     }, 0, 1, E },
>>> +    { "segment_start_number", "first segment number to write",
>>> OFFSET(segment_start_number), AV_OPT_TYPE_INT, { .i64 = 0 }, 0,
>>> INT_MAX, E },
>>> 
>> 
>> Default should be 1, in order not to change the current behavior.
>> 
>> -- 
>> Ben
>> _______________________________________________
>> ffmpeg-devel mailing list
>> ffmpeg-devel at ffmpeg.org <mailto:ffmpeg-devel at ffmpeg.org>
>> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel <http://ffmpeg.org/mailman/listinfo/ffmpeg-devel>
> Alright, here's a version with that. Also, adjusted to reflect the change properly in the MPD.
> 
> From ec2b7e5033acb25bb0310f12ea576a8185f4e396 Mon Sep 17 00:00:00 2001
> From: Rodger Combs <rodger.combs at gmail.com <mailto:rodger.combs at gmail.com>>
> Date: Thu, 20 Nov 2014 01:47:05 -0600
> Subject: [PATCH] dashenc: Add a segment_start_number option
> 
> ---
>  libavformat/dashenc.c | 6 ++++--
>  1 file changed, 4 insertions(+), 2 deletions(-)
> 
> diff --git a/libavformat/dashenc.c b/libavformat/dashenc.c
> index dac217e..5958270 100644
> --- a/libavformat/dashenc.c
> +++ b/libavformat/dashenc.c
> @@ -80,6 +80,7 @@ typedef struct DASHContext {
>      int total_duration;
>      char availability_start_time[100];
>      char dirname[1024];
> +    int segment_start_number;
>  } DASHContext;
>  
>  static int dash_write(void *opaque, uint8_t *buf, int buf_size)
> @@ -182,7 +183,7 @@ static void dash_free(AVFormatContext *s)
>  
>  static void output_segment_list(OutputStream *os, AVIOContext *out, DASHContext *c)
>  {
> -    int i, start_index = 0, start_number = 1;
> +    int i, start_index = 0, start_number = c->segment_start_number;
>      if (c->window_size) {
>          start_index  = FFMAX(os->nb_segments   - c->window_size, 0);
>          start_number = FFMAX(os->segment_index - c->window_size, 1);
> @@ -512,7 +513,7 @@ static int dash_write_header(AVFormatContext *s)
>  
>          set_codec_str(s, os->ctx->streams[0]->codec, os->codec_str, sizeof(os->codec_str));
>          os->first_dts = AV_NOPTS_VALUE;
> -        os->segment_index = 1;
> +        os->segment_index = c->segment_start_number;
>      }
>  
>      if (!c->has_video && c->min_seg_duration <= 0) {
> @@ -754,6 +755,7 @@ static const AVOption options[] = {
>      { "use_template", "Use SegmentTemplate instead of SegmentList", OFFSET(use_template), AV_OPT_TYPE_INT, { .i64 = 1 }, 0, 1, E },
>      { "use_timeline", "Use SegmentTimeline in SegmentTemplate", OFFSET(use_timeline), AV_OPT_TYPE_INT, { .i64 = 1 }, 0, 1, E },
>      { "single_file", "Store all segments in one file, accessed using byte ranges", OFFSET(single_file), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, E },
> +    { "segment_start_number", "first segment number to write", OFFSET(segment_start_number), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, E },
>      { NULL },
>  };
>  
> -- 
> 1.9.1
> 
> 

...in which I screw up and post the same patch. Here you go...

From f06aa763f3e3593d12cc16d8017e796c9e5db3b3 Mon Sep 17 00:00:00 2001
From: Rodger Combs <rodger.combs at gmail.com>
Date: Thu, 20 Nov 2014 01:47:05 -0600
Subject: [PATCH] dashenc: Add a segment_start_number option

---
 libavformat/dashenc.c | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/libavformat/dashenc.c b/libavformat/dashenc.c
index dac217e..549c7c3 100644
--- a/libavformat/dashenc.c
+++ b/libavformat/dashenc.c
@@ -80,6 +80,7 @@ typedef struct DASHContext {
     int total_duration;
     char availability_start_time[100];
     char dirname[1024];
+    int segment_start_number;
 } DASHContext;
 
 static int dash_write(void *opaque, uint8_t *buf, int buf_size)
@@ -182,10 +183,10 @@ static void dash_free(AVFormatContext *s)
 
 static void output_segment_list(OutputStream *os, AVIOContext *out, DASHContext *c)
 {
-    int i, start_index = 0, start_number = 1;
+    int i, start_index = 0, start_number = c->segment_start_number;
     if (c->window_size) {
         start_index  = FFMAX(os->nb_segments   - c->window_size, 0);
-        start_number = FFMAX(os->segment_index - c->window_size, 1);
+        start_number = FFMAX(os->segment_index - c->window_size, c->segment_start_number);
     }
 
     if (c->use_template) {
@@ -193,7 +194,7 @@ static void output_segment_list(OutputStream *os, AVIOContext *out, DASHContext
         avio_printf(out, "\t\t\t\t<SegmentTemplate timescale=\"%d\" ", timescale);
         if (!c->use_timeline)
             avio_printf(out, "duration=\"%d\" ", c->last_duration);
-        avio_printf(out, "initialization=\"init-stream$RepresentationID$.m4s\" media=\"chunk-stream$RepresentationID$-$Number%%05d$.m4s\" startNumber=\"%d\">\n", c->use_timeline ? start_number : 1);
+        avio_printf(out, "initialization=\"init-stream$RepresentationID$.m4s\" media=\"chunk-stream$RepresentationID$-$Number%%05d$.m4s\" startNumber=\"%d\">\n", start_number);
         if (c->use_timeline) {
             avio_printf(out, "\t\t\t\t\t<SegmentTimeline>\n");
             for (i = start_index; i < os->nb_segments; ) {
@@ -512,7 +513,7 @@ static int dash_write_header(AVFormatContext *s)
 
         set_codec_str(s, os->ctx->streams[0]->codec, os->codec_str, sizeof(os->codec_str));
         os->first_dts = AV_NOPTS_VALUE;
-        os->segment_index = 1;
+        os->segment_index = c->segment_start_number;
     }
 
     if (!c->has_video && c->min_seg_duration <= 0) {
@@ -754,6 +755,7 @@ static const AVOption options[] = {
     { "use_template", "Use SegmentTemplate instead of SegmentList", OFFSET(use_template), AV_OPT_TYPE_INT, { .i64 = 1 }, 0, 1, E },
     { "use_timeline", "Use SegmentTimeline in SegmentTemplate", OFFSET(use_timeline), AV_OPT_TYPE_INT, { .i64 = 1 }, 0, 1, E },
     { "single_file", "Store all segments in one file, accessed using byte ranges", OFFSET(single_file), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, E },
+    { "segment_start_number", "first segment number to write", OFFSET(segment_start_number), AV_OPT_TYPE_INT, { .i64 = 1 }, 0, INT_MAX, E },
     { NULL },
 };
 
-- 
1.9.1




More information about the ffmpeg-devel mailing list