]> git.sesse.net Git - ffmpeg/commitdiff
avfilter/af_adelay: add option which changes how unset channels are delayed
authorPaul B Mahol <onemda@gmail.com>
Mon, 7 Oct 2019 16:02:50 +0000 (18:02 +0200)
committerPaul B Mahol <onemda@gmail.com>
Mon, 7 Oct 2019 16:10:28 +0000 (18:10 +0200)
Fixes #8032.

doc/filters.texi
libavfilter/af_adelay.c

index accea99182c3bcd91631b284fb61705021ab0f9d..0e72cce8292ac6ef17b51758ffc6bf10d7612dd0 100644 (file)
@@ -688,6 +688,10 @@ Unused delays will be silently ignored. If number of given delays is
 smaller than number of channels all remaining channels will not be delayed.
 If you want to delay exact number of samples, append 'S' to number.
 If you want instead to delay in seconds, append 's' to number.
+
+@item all
+Use last set delay for all remaining channels. By default is disabled.
+This option if enabled changes how option @code{delays} is interpreted.
 @end table
 
 @subsection Examples
@@ -706,6 +710,12 @@ the first channel (and any other channels that may be present) unchanged.
 @example
 adelay=0|500S|700S
 @end example
+
+@item
+Delay all channels by same number of samples:
+@example
+adelay=delays=64S:all=1
+@end example
 @end itemize
 
 @section aderivative, aintegral
index eb97039566d7169867e0eb90b51046fd4d4962b2..06e39fa6a423b55edf9042d20c693315c35b16d0 100644 (file)
@@ -36,6 +36,7 @@ typedef struct ChanDelay {
 
 typedef struct AudioDelayContext {
     const AVClass *class;
+    int all;
     char *delays;
     ChanDelay *chandelay;
     int nb_delays;
@@ -54,6 +55,7 @@ typedef struct AudioDelayContext {
 
 static const AVOption adelay_options[] = {
     { "delays", "set list of delays for each channel", OFFSET(delays), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, A },
+    { "all",    "use last available delay for remained channels", OFFSET(all), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, A },
     { NULL }
 };
 
@@ -163,6 +165,11 @@ static int config_input(AVFilterLink *inlink)
         }
     }
 
+    if (s->all) {
+        for (int j = i + 1; j < s->nb_delays; j++)
+            s->chandelay[j].delay = s->chandelay[i].delay;
+    }
+
     s->padding = s->chandelay[0].delay;
     for (i = 1; i < s->nb_delays; i++) {
         ChanDelay *d = &s->chandelay[i];