59 #define OFFSET(x) offsetof(AudioFIRSourceContext, x)
60 #define FLAGS AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
73 {
"nb_samples",
"set the number of samples per requested frame",
OFFSET(nb_samples),
AV_OPT_TYPE_INT, {.i64 = 1024}, 1, INT_MAX,
FLAGS },
74 {
"n",
"set the number of samples per requested frame",
OFFSET(nb_samples),
AV_OPT_TYPE_INT, {.i64 = 1024}, 1, INT_MAX,
FLAGS },
106 if (!(
s->nb_taps & 1)) {
176 (*items)[(*nb_items)++] =
av_strtod(tail, &tail);
177 new_items =
av_fast_realloc(*items, items_size, (*nb_items + 1) *
sizeof(
float));
183 }
while (tail && *tail);
190 const float *magnitude,
194 for (
int i = 0;
i < minterp;
i++) {
195 for (
int j = 1; j < m; j++) {
196 const float x =
i / (float)minterp;
199 const float mg = (x - freq[j-1]) / (freq[j] - freq[j-1]) * (magnitude[j] - magnitude[j-1]) + magnitude[j-1];
200 const float ph = (x - freq[j-1]) / (freq[j] - freq[j-1]) * (phase[j] - phase[j-1]) + phase[j-1];
214 float overlap, scale = 1.f, compensation;
215 int fft_size, middle, ret;
217 s->nb_freq =
s->nb_magnitude =
s->nb_phase = 0;
219 ret =
parse_string(
s->freq_points_str, &
s->freq, &
s->nb_freq, &
s->freq_size);
223 ret =
parse_string(
s->magnitude_str, &
s->magnitude, &
s->nb_magnitude, &
s->magnitude_size);
231 if (
s->nb_freq !=
s->nb_magnitude &&
s->nb_freq !=
s->nb_phase &&
s->nb_freq >= 2) {
236 for (
int i = 0;
i <
s->nb_freq;
i++) {
237 if (
i == 0 &&
s->freq[
i] != 0.f) {
242 if (
i ==
s->nb_freq - 1 &&
s->freq[
i] != 1.f) {
247 if (
i &&
s->freq[
i] <
s->freq[
i-1]) {
253 fft_size = 1 << (
av_log2(
s->nb_taps) + 1);
254 s->complexf =
av_calloc(fft_size * 2,
sizeof(*
s->complexf));
272 lininterp(
s->complexf,
s->freq,
s->magnitude,
s->phase,
s->nb_freq, fft_size / 2);
274 s->tx_fn(
s->tx_ctx,
s->complexf + fft_size,
s->complexf,
sizeof(
float));
276 compensation = 2.f / fft_size;
277 middle =
s->nb_taps / 2;
279 for (
int i = 0;
i <= middle;
i++) {
280 s->taps[
i] =
s->complexf[fft_size + middle -
i].re * compensation *
s->win[
i];
281 s->taps[middle +
i] =
s->complexf[fft_size +
i].re * compensation *
s->win[middle +
i];
296 nb_samples =
FFMIN(
s->nb_samples,
s->nb_taps -
s->pts);
303 memcpy(
frame->
data[0],
s->taps +
s->pts, nb_samples *
sizeof(
float));
306 s->pts += nb_samples;
329 .priv_class = &afirsrc_class,
static enum AVSampleFormat sample_fmts[]
static const AVFilterPad inputs[]
static const AVFilterPad outputs[]
AVFILTER_DEFINE_CLASS(afirsrc)
static void lininterp(AVComplexFloat *complexf, const float *freq, const float *magnitude, const float *phase, int m, int minterp)
static av_cold int query_formats(AVFilterContext *ctx)
static int request_frame(AVFilterLink *outlink)
static av_cold int config_output(AVFilterLink *outlink)
static int parse_string(char *str, float **items, int *nb_items, int *items_size)
static const AVOption afirsrc_options[]
static const AVFilterPad afirsrc_outputs[]
static av_cold int init(AVFilterContext *ctx)
static av_cold void uninit(AVFilterContext *ctx)
AVFrame * ff_get_audio_buffer(AVFilterLink *link, int nb_samples)
Request an audio samples buffer with a specific set of permissions.
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
Main libavfilter public API header.
double av_strtod(const char *numstr, char **tail)
Parse the string in numstr and return its value as a double.
simple arithmetic expression evaluator
#define AV_CH_LAYOUT_MONO
#define AVERROR_EOF
End of file.
#define AV_LOG_WARNING
Something somehow does not look correct.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
void * av_fast_realloc(void *ptr, unsigned int *size, size_t min_size)
Reallocate the given buffer if it is not large enough, otherwise do nothing.
void * av_calloc(size_t nmemb, size_t size)
Non-inlined equivalent of av_mallocz_array().
AVSampleFormat
Audio sample formats.
common internal API header
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
enum MovChannelLayoutTag * layouts
Describe the class of an AVClass context structure.
A list of supported channel layouts.
A link between two filters.
AVFilterContext * src
source filter
A filter pad used for either input or output.
const char * name
Pad name.
const char * name
Filter name.
This structure describes decoded (raw) audio or video data.
int64_t pts
Presentation timestamp in time_base units (time when frame should be shown to user).
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
AVComplexFloat * complexf
av_cold void av_tx_uninit(AVTXContext **ctx)
Frees a context and sets ctx to NULL, does nothing when ctx == NULL.
av_cold int av_tx_init(AVTXContext **ctx, av_tx_fn *tx, enum AVTXType type, int inv, int len, const void *scale, uint64_t flags)
Initialize a transform context with the given configuration (i)MDCTs with an odd length are currently...
@ AV_TX_FLOAT_FFT
Standard complex to complex FFT with sample data type AVComplexFloat.
void(* av_tx_fn)(AVTXContext *s, void *out, void *in, ptrdiff_t stride)
Function pointer to a function to perform the transform.
static void generate_window_func(float *lut, int N, int win_func, float *overlap)