29#define MAX_NB_COEFFS 16
56#define PFILTER(name, type, sin, cos, cc) \
57static void pfilter_channel_## name(AVFilterContext *ctx, \
59 AVFrame *in, AVFrame *out) \
61 AFreqShift *s = ctx->priv; \
62 const int nb_samples = in->nb_samples; \
63 const type *src = (const type *)in->extended_data[ch]; \
64 type *dst = (type *)out->extended_data[ch]; \
65 type *i1 = (type *)s->i1->extended_data[ch]; \
66 type *o1 = (type *)s->o1->extended_data[ch]; \
67 type *i2 = (type *)s->i2->extended_data[ch]; \
68 type *o2 = (type *)s->o2->extended_data[ch]; \
69 const int nb_coeffs = s->nb_coeffs; \
70 const type *c = s->cc; \
71 const type level = s->level; \
72 type shift = s->shift * M_PI; \
73 type cos_theta = cos(shift); \
74 type sin_theta = sin(shift); \
76 for (int n = 0; n < nb_samples; n++) { \
77 type xn1 = src[n], xn2 = src[n]; \
80 for (int j = 0; j < nb_coeffs; j++) { \
81 I = c[j] * (xn1 + o2[j]) - i2[j]; \
89 for (int j = nb_coeffs; j < nb_coeffs*2; j++) { \
90 Q = c[j] * (xn2 + o2[j]) - i2[j]; \
97 Q = o2[nb_coeffs * 2 - 1]; \
99 dst[n] = (I * cos_theta - Q * sin_theta) * level; \
103PFILTER(flt,
float, sin, cos, cf)
104PFILTER(dbl,
double, sin, cos, cd)
106#define FFILTER(name, type, sin, cos, fmod, cc) \
107static void ffilter_channel_## name(AVFilterContext *ctx, \
109 AVFrame *in, AVFrame *out) \
111 AFreqShift *s = ctx->priv; \
112 const int nb_samples = in->nb_samples; \
113 const type *src = (const type *)in->extended_data[ch]; \
114 type *dst = (type *)out->extended_data[ch]; \
115 type *i1 = (type *)s->i1->extended_data[ch]; \
116 type *o1 = (type *)s->o1->extended_data[ch]; \
117 type *i2 = (type *)s->i2->extended_data[ch]; \
118 type *o2 = (type *)s->o2->extended_data[ch]; \
119 const int nb_coeffs = s->nb_coeffs; \
120 const type *c = s->cc; \
121 const type level = s->level; \
122 type ts = 1. / in->sample_rate; \
123 type shift = s->shift; \
124 int64_t N = s->in_samples; \
126 for (int n = 0; n < nb_samples; n++) { \
127 type xn1 = src[n], xn2 = src[n]; \
130 for (int j = 0; j < nb_coeffs; j++) { \
131 I = c[j] * (xn1 + o2[j]) - i2[j]; \
139 for (int j = nb_coeffs; j < nb_coeffs*2; j++) { \
140 Q = c[j] * (xn2 + o2[j]) - i2[j]; \
147 Q = o2[nb_coeffs * 2 - 1]; \
149 theta = 2. * M_PI * fmod(shift * (N + n) * ts, 1.); \
150 dst[n] = (I * cos(theta) - Q * sin(theta)) * level; \
155FFILTER(dbl,
double, sin, cos, fmod, cd)
159 double kksqrt, e, e2, e4, k, q;
161 k = tan((1. - transition * 2.) *
M_PI / 4.);
163 kksqrt = pow(1 - k * k, 0.25);
164 e = 0.5 * (1. - kksqrt) / (1. + kksqrt);
167 q = e * (1. + e4 * (2. + e4 * (15. + 150. * e4)));
196 q_ii1 *= sin((
i * 2 + 1) *
c *
M_PI / order) * j;
201 }
while (
fabs(q_ii1) > 1e-100);
215 q_i2 *= cos(
i * 2 *
c *
M_PI / order) * j;
220 }
while (
fabs(q_i2) > 1e-100);
230 const double ww = num / den;
231 const double wwsq = ww * ww;
233 const double x = sqrt((1 - wwsq * k) * (1 - wwsq / k)) / (1 + wwsq);
234 const double coef = (1 - x) / (1 + x);
239static void compute_coefs(
double *coef_arrd,
float *coef_arrf,
int nbr_coefs,
double transition)
241 const int order = nbr_coefs * 2 + 1;
246 for (
int n = 0; n < nbr_coefs; n++) {
247 const int idx = (n / 2) + (n & 1) * nbr_coefs / 2;
250 coef_arrf[idx] = coef_arrd[idx];
259 if (
s->old_nb_coeffs !=
s->nb_coeffs)
261 s->old_nb_coeffs =
s->nb_coeffs;
267 if (!
s->i1 || !
s->o1 || !
s->i2 || !
s->o2)
271 if (!strcmp(
ctx->filter->name,
"afreqshift"))
272 s->filter_channel = ffilter_channel_dbl;
274 s->filter_channel = pfilter_channel_dbl;
276 if (!strcmp(
ctx->filter->name,
"afreqshift"))
277 s->filter_channel = ffilter_channel_flt;
279 s->filter_channel = pfilter_channel_flt;
298 for (
int ch = start; ch < end; ch++)
299 s->filter_channel(
ctx, ch, in,
out);
312 if (
s->old_nb_coeffs !=
s->nb_coeffs)
314 s->old_nb_coeffs =
s->nb_coeffs;
348#define OFFSET(x) offsetof(AFreqShift, x)
349#define FLAGS AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
370 .p.name =
"afreqshift",
372 .p.priv_class = &afreqshift_class,
393 .p.name =
"aphaseshift",
395 .p.priv_class = &aphaseshift_class,
static int fn filter_channels(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
static enum AVSampleFormat sample_fmts[]
static const AVFilterPad inputs[]
static int config_input(AVFilterLink *inlink)
#define FFILTER(name, type, sin, cos, fmod, cc)
const FFFilter ff_af_afreqshift
static double compute_coef(int index, double k, double q, int order)
static void compute_coefs(double *coef_arrd, float *coef_arrf, int nbr_coefs, double transition)
static int filter_channels(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
static int config_input(AVFilterLink *inlink)
static const AVOption aphaseshift_options[]
#define PFILTER(name, type, sin, cos, cc)
const FFFilter ff_af_aphaseshift
static int filter_frame(AVFilterLink *inlink, AVFrame *in)
static const AVOption afreqshift_options[]
static void compute_transition_param(double *K, double *Q, double transition)
static av_cold void uninit(AVFilterContext *ctx)
static double compute_acc_den(double q, int order, int c)
static double compute_acc_num(double q, int order, int c)
static double ipowp(double x, int64_t n)
static AVFormatContext * ctx
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_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_filter_execute(AVFilterContext *ctx, avfilter_action_func *func, void *arg, int *ret, int nb_jobs)
int ff_filter_get_nb_threads(AVFilterContext *ctx)
Get number of threads for current filter instance.
Main libavfilter public API header.
#define i(width, name, range_min, range_max)
Public libavutil channel layout APIs header.
static __device__ float fabs(float a)
static int filter_frame(DBEDecodeContext *s, AVFrame *frame)
channel
Use these values when setting the channel map with ebur128_set_channel().
internal math functions header
@ AV_OPT_TYPE_INT
Underlying C type is int.
@ AV_OPT_TYPE_DOUBLE
Underlying C type is double.
#define AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC
Some filters support a generic "enable" expression option that can be used to enable or disable a fil...
#define AVFILTER_FLAG_SLICE_THREADS
The filter supports multithreading by splitting frames into multiple parts and processing them concur...
int av_frame_is_writable(AVFrame *frame)
Check if the frame data is writable.
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
int av_frame_copy_props(AVFrame *dst, const AVFrame *src)
Copy only "metadata" fields from src to dst.
AVSampleFormat
Audio sample formats.
@ AV_SAMPLE_FMT_FLTP
float, planar
@ AV_SAMPLE_FMT_DBLP
double, planar
static av_cold void uninit(AVBitStreamFilterContext *ctx)
static int shift(int a, int b)
#define FILTER_INPUTS(array)
#define FILTER_SAMPLEFMTS_ARRAY(array)
#define FILTER_OUTPUTS(array)
static int ff_slice_pos(int total, int jobnr, int nb_jobs)
Compute the boundary index for a slice when work of size total is split into nb_jobs slices.
#define AVFILTER_DEFINE_CLASS(fname)
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
float cf[MAX_NB_COEFFS *2]
double cd[MAX_NB_COEFFS *2]
void(* filter_channel)(AVFilterContext *ctx, int channel, AVFrame *in, AVFrame *out)
int nb_channels
Number of channels in this layout.
Describe the class of an AVClass context structure.
A link between two filters.
int sample_rate
samples per second
AVChannelLayout ch_layout
channel layout of current buffer (see libavutil/channel_layout.h)
AVFilterContext * dst
dest filter
int format
agreed upon media format
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
AVChannelLayout ch_layout
Channel layout of the audio data.
Used for passing data between threads.