avfilter/af_apad: do not add infinite silence for zero pad_dur or whole_dur

Unfortunately pad_len and pad_dur behaviour was different if 0 was specified,
pad_dur handled 0 duration as infinity, for pad_len, infinity was -1.

Let's make the behaviour consistent by handling 0 duration for pad_dur and
whole_dur as indeed 0 duration. This somewhat changes the behaviour of the
filter if 0 was explicitly specified, but deprecating the old option and adding
a new for the corrected behaviour seemed a bit overkill. So let's document the
change instead.

Signed-off-by: Marton Balint <cus@passwd.hu>
This commit is contained in:
Marton Balint 2021-07-28 23:53:42 +02:00
parent 97c3053d59
commit 0a9edac48e
3 changed files with 10 additions and 7 deletions

View File

@ -2291,12 +2291,12 @@ with @option{pad_len}.
@item pad_dur @item pad_dur
Specify the duration of samples of silence to add. See Specify the duration of samples of silence to add. See
@ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils} @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. for the accepted syntax. Used only if set to non-negative value.
@item whole_dur @item whole_dur
Specify the minimum total duration in the output audio stream. See Specify the minimum total duration in the output audio stream. See
@ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils} @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 for the accepted syntax. Used only if set to non-negative value. If the value is longer than
the input audio length, silence is added to the end, until the value is reached. the input audio length, silence is added to the end, until the value is reached.
This option is mutually exclusive with @option{pad_dur} This option is mutually exclusive with @option{pad_dur}
@end table @end table
@ -2305,6 +2305,9 @@ 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 nor @option{whole_dur} option is set, the filter will add silence to the end of
the input stream indefinitely. the input stream indefinitely.
Note that for ffmpeg 4.4 and earlier a zero @option{pad_dur} or
@option{whole_dur} also caused the filter to add silence indefinitely.
@subsection Examples @subsection Examples
@itemize @itemize

View File

@ -52,8 +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 }, { "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 }, { "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 }, { "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 }, { "pad_dur", "set duration of silence to add", OFFSET(pad_dur), AV_OPT_TYPE_DURATION, { .i64 = -1 }, -1, 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 }, { "whole_dur", "set minimum target duration in the audio stream", OFFSET(whole_dur), AV_OPT_TYPE_DURATION, { .i64 = -1 }, -1, INT64_MAX, A },
{ NULL } { NULL }
}; };
@ -138,9 +138,9 @@ static int config_output(AVFilterLink *outlink)
AVFilterContext *ctx = outlink->src; AVFilterContext *ctx = outlink->src;
APadContext *s = ctx->priv; APadContext *s = ctx->priv;
if (s->pad_dur) if (s->pad_dur >= 0)
s->pad_len = av_rescale(s->pad_dur, outlink->sample_rate, AV_TIME_BASE); s->pad_len = av_rescale(s->pad_dur, outlink->sample_rate, AV_TIME_BASE);
if (s->whole_dur) if (s->whole_dur >= 0)
s->whole_len = av_rescale(s->whole_dur, outlink->sample_rate, AV_TIME_BASE); s->whole_len = av_rescale(s->whole_dur, outlink->sample_rate, AV_TIME_BASE);
s->pad_len_left = s->pad_len; s->pad_len_left = s->pad_len;

View File

@ -31,7 +31,7 @@
#define LIBAVFILTER_VERSION_MAJOR 8 #define LIBAVFILTER_VERSION_MAJOR 8
#define LIBAVFILTER_VERSION_MINOR 16 #define LIBAVFILTER_VERSION_MINOR 16
#define LIBAVFILTER_VERSION_MICRO 101 #define LIBAVFILTER_VERSION_MICRO 102
#define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \ #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \