Fixes #8032.tags/n4.3
@@ -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. | 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 to delay exact number of samples, append 'S' to number. | ||||
If you want instead to delay in seconds, 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 | @end table | ||||
@subsection Examples | @subsection Examples | ||||
@@ -706,6 +710,12 @@ the first channel (and any other channels that may be present) unchanged. | |||||
@example | @example | ||||
adelay=0|500S|700S | adelay=0|500S|700S | ||||
@end example | @end example | ||||
@item | |||||
Delay all channels by same number of samples: | |||||
@example | |||||
adelay=delays=64S:all=1 | |||||
@end example | |||||
@end itemize | @end itemize | ||||
@section aderivative, aintegral | @section aderivative, aintegral | ||||
@@ -36,6 +36,7 @@ typedef struct ChanDelay { | |||||
typedef struct AudioDelayContext { | typedef struct AudioDelayContext { | ||||
const AVClass *class; | const AVClass *class; | ||||
int all; | |||||
char *delays; | char *delays; | ||||
ChanDelay *chandelay; | ChanDelay *chandelay; | ||||
int nb_delays; | int nb_delays; | ||||
@@ -54,6 +55,7 @@ typedef struct AudioDelayContext { | |||||
static const AVOption adelay_options[] = { | static const AVOption adelay_options[] = { | ||||
{ "delays", "set list of delays for each channel", OFFSET(delays), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, A }, | { "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 } | { 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; | s->padding = s->chandelay[0].delay; | ||||
for (i = 1; i < s->nb_delays; i++) { | for (i = 1; i < s->nb_delays; i++) { | ||||
ChanDelay *d = &s->chandelay[i]; | ChanDelay *d = &s->chandelay[i]; | ||||