[FFmpeg-devel,v3,01/11] avformat/dashenc: replacing 'min_seg_duration' with 'seg_duration'

Submitted by Dixit, Vishwanath on April 11, 2018, 7 a.m.

Details

Message ID 1523430006-16738-1-git-send-email-vdixit@akamai.com
State Accepted
Commit 01ba52852d2ada3c79fe02a7de5bc1fdc27d56e8
Headers show

Commit Message

Dixit, Vishwanath April 11, 2018, 7 a.m.
From: Vishwanath Dixit <vdixit@akamai.com>

---
 doc/muxers.texi       |  4 +++-
 libavformat/dashenc.c | 23 ++++++++++++++++++-----
 libavformat/version.h |  3 +++
 3 files changed, 24 insertions(+), 6 deletions(-)

Comments

Carl Eugen Hoyos April 11, 2018, 6:17 p.m.
2018-04-11 9:00 GMT+02:00, vdixit@akamai.com <vdixit@akamai.com>:

> +#if FF_API_DASH_MIN_SEG_DURATION
> +    { "min_seg_duration", "minimum segment duration (in microseconds) (will
> be deprecated)"

"is deprecated"
But since this is a user option added after the last release, you
may also choose to simply delete it if this simplifies the code.

Otoh: Your commit message is missing an explanation why
renaming this option is a good idea.

Carl Eugen
Dixit, Vishwanath April 12, 2018, 4:31 a.m.
On 4/11/18 11:47 PM, Carl Eugen Hoyos wrote:
> 2018-04-11 9:00 GMT+02:00, vdixit@akamai.com <vdixit@akamai.com>:

>

>> +#if FF_API_DASH_MIN_SEG_DURATION

>> +    { "min_seg_duration", "minimum segment duration (in microseconds) (will

>> be deprecated)"

>

> "is deprecated"

> But since this is a user option added after the last release, you

> may also choose to simply delete it if this simplifies the code.

>

Thanks for your review inputs. Could you please clarify the comment? Do you mean, the option 'min_seg_duration' was added after the last stable release ffmpeg-3.4.2?
But, it looks like the option 'min_seg_duration' was added 4 years ago, much earlier than the couple of last stable releases. Please correct me if I am wrong.

> Otoh: Your commit message is missing an explanation why

> renaming this option is a good idea.

Sure. I will submit a new version of this patch with the explanation in the commit message.
>

> Carl Eugen

Patch hide | download patch | download mbox

diff --git a/doc/muxers.texi b/doc/muxers.texi
index cb75c26..8dbfede 100644
--- a/doc/muxers.texi
+++ b/doc/muxers.texi
@@ -226,7 +226,9 @@  ffmpeg -re -i <input> -map 0 -map 0 -c:a libfdk_aac -c:v libx264
 
 @table @option
 @item -min_seg_duration @var{microseconds}
-Set the segment length in microseconds.
+This is a deprecated option to set the segment length in microseconds, use @var{seg_duration} instead.
+@item -seg_duration @var{duration}
+Set the segment length in seconds (fractional value can be set).
 @item -window_size @var{size}
 Set the maximum number of segments kept in the manifest.
 @item -extra_window_size @var{size}
diff --git a/libavformat/dashenc.c b/libavformat/dashenc.c
index bdf8c8d..7169e11 100644
--- a/libavformat/dashenc.c
+++ b/libavformat/dashenc.c
@@ -94,7 +94,10 @@  typedef struct DASHContext {
     int nb_as;
     int window_size;
     int extra_window_size;
+#if FF_API_DASH_MIN_SEG_DURATION
     int min_seg_duration;
+#endif
+    int64_t seg_duration;
     int remove_at_exit;
     int use_template;
     int use_timeline;
@@ -871,6 +874,13 @@  static int dash_init(AVFormatContext *s)
     if (c->single_file)
         c->use_template = 0;
 
+#if FF_API_DASH_MIN_SEG_DURATION
+    if (c->min_seg_duration != 5000000) {
+        av_log(s, AV_LOG_WARNING, "The min_seg_duration option is deprecated and will be removed. Please use the -seg_duration\n");
+        c->seg_duration = c->min_seg_duration;
+    }
+#endif
+
     av_strlcpy(c->dirname, s->url, sizeof(c->dirname));
     ptr = strrchr(c->dirname, '/');
     if (ptr) {
@@ -974,7 +984,7 @@  static int dash_init(AVFormatContext *s)
             else
                 av_dict_set(&opts, "movflags", "frag_custom+dash+delay_moov", 0);
         } else {
-            av_dict_set_int(&opts, "cluster_time_limit", c->min_seg_duration / 1000, 0);
+            av_dict_set_int(&opts, "cluster_time_limit", c->seg_duration / 1000, 0);
             av_dict_set_int(&opts, "cluster_size_limit", 5 * 1024 * 1024, 0); // set a large cluster size limit
             av_dict_set_int(&opts, "dash", 1, 0);
             av_dict_set_int(&opts, "dash_track_number", i + 1, 0);
@@ -1020,8 +1030,8 @@  static int dash_init(AVFormatContext *s)
         os->segment_index = 1;
     }
 
-    if (!c->has_video && c->min_seg_duration <= 0) {
-        av_log(s, AV_LOG_WARNING, "no video stream and no min seg duration set\n");
+    if (!c->has_video && c->seg_duration <= 0) {
+        av_log(s, AV_LOG_WARNING, "no video stream and no seg duration set\n");
         return AVERROR(EINVAL);
     }
     return 0;
@@ -1287,7 +1297,7 @@  static int dash_write_packet(AVFormatContext *s, AVPacket *pkt)
     if ((!c->has_video || st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) &&
         pkt->flags & AV_PKT_FLAG_KEY && os->packets_written &&
         av_compare_ts(pkt->pts - os->start_pts, st->time_base,
-                      c->min_seg_duration, AV_TIME_BASE_Q) >= 0) {
+                      c->seg_duration, AV_TIME_BASE_Q) >= 0) {
         int64_t prev_duration = c->last_duration;
 
         c->last_duration = av_rescale_q(pkt->pts - os->start_pts,
@@ -1427,7 +1437,10 @@  static const AVOption options[] = {
     { "adaptation_sets", "Adaptation sets. Syntax: id=0,streams=0,1,2 id=1,streams=3,4 and so on", OFFSET(adaptation_sets), AV_OPT_TYPE_STRING, { 0 }, 0, 0, AV_OPT_FLAG_ENCODING_PARAM },
     { "window_size", "number of segments kept in the manifest", OFFSET(window_size), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, E },
     { "extra_window_size", "number of segments kept outside of the manifest before removing from disk", OFFSET(extra_window_size), AV_OPT_TYPE_INT, { .i64 = 5 }, 0, INT_MAX, E },
-    { "min_seg_duration", "minimum segment duration (in microseconds)", OFFSET(min_seg_duration), AV_OPT_TYPE_INT, { .i64 = 5000000 }, 0, INT_MAX, E },
+#if FF_API_DASH_MIN_SEG_DURATION
+    { "min_seg_duration", "minimum segment duration (in microseconds) (will be deprecated)", OFFSET(min_seg_duration), AV_OPT_TYPE_INT, { .i64 = 5000000 }, 0, INT_MAX, E },
+#endif
+    { "seg_duration", "segment duration (in seconds, fractional value can be set)", OFFSET(seg_duration), AV_OPT_TYPE_DURATION, { .i64 = 5000000 }, 0, INT_MAX, E },
     { "remove_at_exit", "remove all segments when finished", OFFSET(remove_at_exit), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, E },
     { "use_template", "Use SegmentTemplate instead of SegmentList", OFFSET(use_template), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, E },
     { "use_timeline", "Use SegmentTimeline in SegmentTemplate", OFFSET(use_timeline), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, E },
diff --git a/libavformat/version.h b/libavformat/version.h
index a96e13b..d02e17e 100644
--- a/libavformat/version.h
+++ b/libavformat/version.h
@@ -94,6 +94,9 @@ 
 #ifndef FF_API_NEXT
 #define FF_API_NEXT                     (LIBAVFORMAT_VERSION_MAJOR < 59)
 #endif
+#ifndef FF_API_DASH_MIN_SEG_DURATION
+#define FF_API_DASH_MIN_SEG_DURATION    (LIBAVFORMAT_VERSION_MAJOR < 59)
+#endif
 
 
 #ifndef FF_API_R_FRAME_RATE