[FFmpeg-cvslog] avfilter/af_apad: add pad_dur and whole_dur options

Paul B Mahol git at videolan.org
Mon Dec 17 20:21:23 EET 2018


ffmpeg | branch: master | Paul B Mahol <onemda at gmail.com> | Sun Dec 16 17:00:56 2018 +0100| [d54276f9def8049c5354822d25663d86d524b026] | committer: Paul B Mahol

avfilter/af_apad: add pad_dur and whole_dur options

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=d54276f9def8049c5354822d25663d86d524b026
---

 doc/filters.texi      | 18 +++++++++++++++---
 libavfilter/af_apad.c | 23 +++++++++++++++++++++--
 2 files changed, 36 insertions(+), 5 deletions(-)

diff --git a/doc/filters.texi b/doc/filters.texi
index e3415630ec..ac4c9b44d8 100644
--- a/doc/filters.texi
+++ b/doc/filters.texi
@@ -1776,11 +1776,23 @@ Set the minimum total number of samples in the output audio stream. If
 the value is longer than the input audio length, silence is added to
 the end, until the value is reached. This option is mutually exclusive
 with @option{pad_len}.
+
+ at item pad_dur
+Specify the duration of samples of silence to add. See
+ at ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils}
+for the accepted syntax. Used only if set to non-zero value.
+
+ at item whole_dur
+Specify the minimum total duration in the output audio stream. See
+ at ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils}
+for the accepted syntax. Used only if set to non-zero value. If the value is longer than
+the input audio length, silence is added to the end, until the value is reached.
+This option is mutually exclusive with @option{pad_dur}
 @end table
 
-If neither the @option{pad_len} nor the @option{whole_len} option is
-set, the filter will add silence to the end of the input stream
-indefinitely.
+If neither the @option{pad_len} nor the @option{whole_len} nor @option{pad_dur}
+nor @option{whole_dur} option is set, the filter will add silence to the end of
+the input stream indefinitely.
 
 @subsection Examples
 
diff --git a/libavfilter/af_apad.c b/libavfilter/af_apad.c
index f7a4199c64..fbcf6d1349 100644
--- a/libavfilter/af_apad.c
+++ b/libavfilter/af_apad.c
@@ -41,6 +41,8 @@ typedef struct APadContext {
     int packet_size;
     int64_t pad_len, pad_len_left;
     int64_t whole_len, whole_len_left;
+    int64_t pad_dur;
+    int64_t whole_dur;
 } APadContext;
 
 #define OFFSET(x) offsetof(APadContext, x)
@@ -50,6 +52,8 @@ static const AVOption apad_options[] = {
     { "packet_size", "set silence packet size",                                  OFFSET(packet_size), AV_OPT_TYPE_INT,   { .i64 = 4096 }, 0, INT_MAX, A },
     { "pad_len",     "set number of samples of silence to add",                  OFFSET(pad_len),     AV_OPT_TYPE_INT64, { .i64 = -1 }, -1, INT64_MAX, A },
     { "whole_len",   "set minimum target number of samples in the audio stream", OFFSET(whole_len),   AV_OPT_TYPE_INT64, { .i64 = -1 }, -1, INT64_MAX, A },
+    { "pad_dur",     "set duration of silence to add",                           OFFSET(pad_dur),     AV_OPT_TYPE_DURATION, { .i64 = 0 }, 0, INT64_MAX, A },
+    { "whole_dur",   "set minimum target duration in the audio stream",          OFFSET(whole_dur),   AV_OPT_TYPE_DURATION, { .i64 = 0 }, 0, INT64_MAX, A },
     { NULL }
 };
 
@@ -64,8 +68,6 @@ static av_cold int init(AVFilterContext *ctx)
         av_log(ctx, AV_LOG_ERROR, "Both whole and pad length are set, this is not possible\n");
         return AVERROR(EINVAL);
     }
-    s->pad_len_left   = s->pad_len;
-    s->whole_len_left = s->whole_len;
 
     return 0;
 }
@@ -131,6 +133,22 @@ static int request_frame(AVFilterLink *outlink)
     return ret;
 }
 
+static int config_output(AVFilterLink *outlink)
+{
+    AVFilterContext *ctx = outlink->src;
+    APadContext *s  = ctx->priv;
+
+    if (s->pad_dur)
+        s->pad_len = av_rescale(s->pad_dur, outlink->sample_rate, AV_TIME_BASE);
+    if (s->whole_dur)
+        s->whole_len = av_rescale(s->whole_dur, outlink->sample_rate, AV_TIME_BASE);
+
+    s->pad_len_left   = s->pad_len;
+    s->whole_len_left = s->whole_len;
+
+    return 0;
+}
+
 static const AVFilterPad apad_inputs[] = {
     {
         .name         = "default",
@@ -144,6 +162,7 @@ static const AVFilterPad apad_outputs[] = {
     {
         .name          = "default",
         .request_frame = request_frame,
+        .config_props  = config_output,
         .type          = AVMEDIA_TYPE_AUDIO,
     },
     { NULL }



More information about the ffmpeg-cvslog mailing list