19#include <rubberband/rubberband-c.h>
44#define OFFSET(x) offsetof(RubberBandContext, x)
45#define A AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
46#define AT AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
51 {
"transients",
"set transients",
OFFSET(transients),
AV_OPT_TYPE_INT, {.i64=0}, 0, INT_MAX,
A, .unit =
"transients" },
52 {
"crisp", 0, 0,
AV_OPT_TYPE_CONST, {.i64=RubberBandOptionTransientsCrisp}, 0, 0,
A, .unit =
"transients" },
53 {
"mixed", 0, 0,
AV_OPT_TYPE_CONST, {.i64=RubberBandOptionTransientsMixed}, 0, 0,
A, .unit =
"transients" },
54 {
"smooth", 0, 0,
AV_OPT_TYPE_CONST, {.i64=RubberBandOptionTransientsSmooth}, 0, 0,
A, .unit =
"transients" },
55 {
"detector",
"set detector",
OFFSET(detector),
AV_OPT_TYPE_INT, {.i64=0}, 0, INT_MAX,
A, .unit =
"detector" },
56 {
"compound", 0, 0,
AV_OPT_TYPE_CONST, {.i64=RubberBandOptionDetectorCompound}, 0, 0,
A, .unit =
"detector" },
57 {
"percussive", 0, 0,
AV_OPT_TYPE_CONST, {.i64=RubberBandOptionDetectorPercussive}, 0, 0,
A, .unit =
"detector" },
58 {
"soft", 0, 0,
AV_OPT_TYPE_CONST, {.i64=RubberBandOptionDetectorSoft}, 0, 0,
A, .unit =
"detector" },
60 {
"laminar", 0, 0,
AV_OPT_TYPE_CONST, {.i64=RubberBandOptionPhaseLaminar}, 0, 0,
A, .unit =
"phase" },
61 {
"independent", 0, 0,
AV_OPT_TYPE_CONST, {.i64=RubberBandOptionPhaseIndependent}, 0, 0,
A, .unit =
"phase" },
63 {
"standard", 0, 0,
AV_OPT_TYPE_CONST, {.i64=RubberBandOptionWindowStandard}, 0, 0,
A, .unit =
"window" },
64 {
"short", 0, 0,
AV_OPT_TYPE_CONST, {.i64=RubberBandOptionWindowShort}, 0, 0,
A, .unit =
"window" },
65 {
"long", 0, 0,
AV_OPT_TYPE_CONST, {.i64=RubberBandOptionWindowLong}, 0, 0,
A, .unit =
"window" },
66 {
"smoothing",
"set smoothing",
OFFSET(smoothing),
AV_OPT_TYPE_INT, {.i64=0}, 0, INT_MAX,
A, .unit =
"smoothing" },
67 {
"off", 0, 0,
AV_OPT_TYPE_CONST, {.i64=RubberBandOptionSmoothingOff}, 0, 0,
A, .unit =
"smoothing" },
68 {
"on", 0, 0,
AV_OPT_TYPE_CONST, {.i64=RubberBandOptionSmoothingOn}, 0, 0,
A, .unit =
"smoothing" },
69 {
"formant",
"set formant",
OFFSET(formant),
AV_OPT_TYPE_INT, {.i64=0}, 0, INT_MAX,
A, .unit =
"formant" },
70 {
"shifted", 0, 0,
AV_OPT_TYPE_CONST, {.i64=RubberBandOptionFormantShifted}, 0, 0,
A, .unit =
"formant" },
71 {
"preserved", 0, 0,
AV_OPT_TYPE_CONST, {.i64=RubberBandOptionFormantPreserved}, 0, 0,
A, .unit =
"formant" },
72 {
"pitchq",
"set pitch quality",
OFFSET(opitch),
AV_OPT_TYPE_INT, {.i64=0}, 0, INT_MAX,
A, .unit =
"pitch" },
73 {
"quality", 0, 0,
AV_OPT_TYPE_CONST, {.i64=RubberBandOptionPitchHighQuality}, 0, 0,
A, .unit =
"pitch" },
74 {
"speed", 0, 0,
AV_OPT_TYPE_CONST, {.i64=RubberBandOptionPitchHighSpeed}, 0, 0,
A, .unit =
"pitch" },
75 {
"consistency", 0, 0,
AV_OPT_TYPE_CONST, {.i64=RubberBandOptionPitchHighConsistency}, 0, 0,
A, .unit =
"pitch" },
77 {
"apart", 0, 0,
AV_OPT_TYPE_CONST, {.i64=RubberBandOptionChannelsApart}, 0, 0,
A, .unit =
"channels" },
78 {
"together", 0, 0,
AV_OPT_TYPE_CONST, {.i64=RubberBandOptionChannelsTogether}, 0, 0,
A, .unit =
"channels" },
89 rubberband_delete(
s->rbs);
98 int ret = 0, nb_samples;
101 s->first_pts = in->
pts;
106 nb_samples = rubberband_available(
s->rbs);
107 if (nb_samples > 0) {
116 s->last_pts =
out->pts;
117 nb_samples = rubberband_retrieve(
s->rbs, (
float *
const *)
out->extended_data, nb_samples);
118 out->nb_samples = nb_samples;
120 s->nb_samples_out += nb_samples;
126 return ret < 0 ? ret : nb_samples;
133 int opts =
s->transients|
s->detector|
s->phase|
s->window|
134 s->smoothing|
s->formant|
s->opitch|
s->channels|
135 RubberBandOptionProcessRealTime;
138 rubberband_delete(
s->rbs);
143 s->nb_samples = rubberband_get_samples_required(
s->rbs);
184 char *res,
int res_len,
int flags)
193 rubberband_set_time_ratio(
s->rbs, 1. /
s->tempo);
194 rubberband_set_pitch_scale(
s->rbs,
s->pitch);
195 s->nb_samples = rubberband_get_samples_required(
s->rbs);
209 .p.name =
"rubberband",
211 .p.priv_class = &rubberband_class,
static int config_input(AVFilterLink *inlink)
static int process_command(AVFilterContext *ctx, const char *cmd, const char *args, char *res, int res_len, int flags)
const FFFilter ff_af_rubberband
static const AVOption rubberband_options[]
static int config_input(AVFilterLink *inlink)
static int filter_frame(AVFilterLink *inlink, AVFrame *in)
static const AVFilterPad rubberband_inputs[]
static int process_command(AVFilterContext *ctx, const char *cmd, const char *args, char *res, int res_len, int flags)
static int activate(AVFilterContext *ctx)
static av_cold void uninit(AVFilterContext *ctx)
static AVFormatContext * ctx
static AVDictionary * opts
const AVFilterPad ff_audio_default_filterpad[1]
An AVFilterPad array whose only entry has name "default" and is of type AVMEDIA_TYPE_AUDIO.
AVFrame * ff_get_audio_buffer(AVFilterLink *link, int nb_samples)
Request an audio samples buffer with a specific set of permissions.
int ff_inlink_acknowledge_status(AVFilterLink *link, int *rstatus, int64_t *rpts)
Test and acknowledge the change of status on the link.
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
int ff_filter_process_command(AVFilterContext *ctx, const char *cmd, const char *arg, char *res, int res_len, int flags)
Generic processing of user supplied commands that are set in the same way as the filter options.
int ff_inlink_consume_samples(AVFilterLink *link, unsigned min, unsigned max, AVFrame **rframe)
Take samples from the link's FIFO and update the link's stats.
void ff_filter_set_ready(AVFilterContext *filter, unsigned priority)
Mark a filter ready and schedule it for activation.
int ff_inlink_queued_samples(AVFilterLink *link)
Main libavfilter public API header.
#define flags(name, subs,...)
Public libavutil channel layout APIs header.
common internal and external API header
static SDL_Window * window
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
@ AV_OPT_TYPE_INT
Underlying C type is int.
@ AV_OPT_TYPE_DOUBLE
Underlying C type is double.
#define AVERROR_EOF
End of file.
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
@ AV_SAMPLE_FMT_FLTP
float, planar
#define AV_NOPTS_VALUE
Undefined timestamp value.
static av_cold void uninit(AVBitStreamFilterContext *ctx)
static int activate(AVBitStreamFilterContext *ctx)
#define FILTER_INPUTS(array)
#define FILTER_OUTPUTS(array)
#define FF_FILTER_FORWARD_WANTED(outlink, inlink)
Forward the frame_wanted_out flag from an output link to an input link.
static void ff_outlink_set_status(AVFilterLink *link, int status, int64_t pts)
Set the status field of a link from the source filter.
#define FFERROR_NOT_READY
Filters implementation helper functions and internal structures.
#define FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink)
Forward the status on an output link to an input link.
#define FILTER_SINGLE_SAMPLEFMT(sample_fmt_)
#define AVFILTER_DEFINE_CLASS(fname)
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
int nb_channels
Number of channels in this layout.
Describe the class of an AVClass context structure.
A link between two filters.
AVRational time_base
Define the time base used by the PTS of the frames/samples which will pass through this link.
int sample_rate
samples per second
AVChannelLayout ch_layout
channel layout of current buffer (see libavutil/channel_layout.h)
AVFilterContext * dst
dest filter
A filter pad used for either input or output.
This structure describes decoded (raw) audio or video data.
int nb_samples
number of audio samples (per channel) described by this frame
int64_t pts
Presentation timestamp in time_base units (time when frame should be shown to user).
uint8_t ** extended_data
pointers to the data planes/channels.
Rational number (pair of numerator and denominator).