@@ -1986,7 +1986,12 @@ Adjust audio tempo. | |||||
The filter accepts exactly one parameter, the audio tempo. If not | The filter accepts exactly one parameter, the audio tempo. If not | ||||
specified then the filter will assume nominal 1.0 tempo. Tempo must | specified then the filter will assume nominal 1.0 tempo. Tempo must | ||||
be in the [0.5, 2.0] range. | |||||
be in the [0.5, 100.0] range. | |||||
Note that tempo greater than 2 will skip some samples rather than | |||||
blend them in. If for any reason this is a concern it is always | |||||
possible to daisy-chain several instances of atempo to achieve the | |||||
desired product tempo. | |||||
@subsection Examples | @subsection Examples | ||||
@@ -1998,9 +2003,15 @@ atempo=0.8 | |||||
@end example | @end example | ||||
@item | @item | ||||
To speed up audio to 125% tempo: | |||||
To speed up audio to 300% tempo: | |||||
@example | |||||
atempo=3 | |||||
@end example | |||||
@item | |||||
To speed up audio to 300% tempo by daisy-chaining two atempo instances: | |||||
@example | @example | ||||
atempo=1.25 | |||||
atempo=sqrt(3),atempo=sqrt(3) | |||||
@end example | @end example | ||||
@end itemize | @end itemize | ||||
@@ -153,7 +153,7 @@ typedef struct ATempoContext { | |||||
static const AVOption atempo_options[] = { | static const AVOption atempo_options[] = { | ||||
{ "tempo", "set tempo scale factor", | { "tempo", "set tempo scale factor", | ||||
OFFSET(tempo), AV_OPT_TYPE_DOUBLE, { .dbl = 1.0 }, 0.5, 2.0, | |||||
OFFSET(tempo), AV_OPT_TYPE_DOUBLE, { .dbl = 1.0 }, 0.5, 100.0, | |||||
AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_FILTERING_PARAM }, | AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_FILTERING_PARAM }, | ||||
{ NULL } | { NULL } | ||||
}; | }; | ||||
@@ -439,8 +439,8 @@ static int yae_load_data(ATempoContext *atempo, | |||||
return 0; | return 0; | ||||
} | } | ||||
// samples are not expected to be skipped: | |||||
av_assert0(read_size <= atempo->ring); | |||||
// samples are not expected to be skipped, unless tempo is greater than 2: | |||||
av_assert0(read_size <= atempo->ring || atempo->tempo > 2.0); | |||||
while (atempo->position[0] < stop_here && src < src_end) { | while (atempo->position[0] < stop_here && src < src_end) { | ||||
int src_samples = (src_end - src) / atempo->stride; | int src_samples = (src_end - src) / atempo->stride; | ||||