38 #define SIN(s, n, x) (s->costab[(n) - (x)])
41 #define COS(s, n, x) (s->costab[x])
45 int n = 1 <<
ctx->nbits;
49 for (
i = 1;
i < n / 2;
i++) {
50 float tmp1 =
data[
i ];
51 float tmp2 =
data[n -
i];
55 tmp1 = (tmp1 - tmp2) * 0.5f;
65 for (
i = 1;
i < n - 2;
i += 2) {
75 int n = 1 <<
ctx->nbits;
77 float next = -0.5f * (
data[0] -
data[n]);
79 for (
i = 0;
i < n / 2;
i++) {
81 float tmp2 =
data[n -
i];
90 tmp1 = (tmp1 + tmp2) * 0.5f;
99 for (
i = 3;
i <= n;
i += 2)
105 int n = 1 <<
ctx->nbits;
108 float next =
data[n - 1];
109 float inv_n = 1.0f / n;
111 for (
i = n - 2;
i >= 2;
i -= 2) {
112 float val1 =
data[
i];
118 data[
i + 1] =
s * val1 -
c * val2;
125 for (
i = 0;
i < n / 2;
i++) {
126 float tmp1 =
data[
i] * inv_n;
127 float tmp2 =
data[n -
i - 1] * inv_n;
128 float csc =
ctx->csc2[
i] * (tmp1 - tmp2);
131 data[
i] = tmp1 + csc;
132 data[n -
i - 1] = tmp1 - csc;
138 int n = 1 <<
ctx->nbits;
142 for (
i = 0;
i < n / 2;
i++) {
143 float tmp1 =
data[
i];
144 float tmp2 =
data[n -
i - 1];
148 tmp1 = (tmp1 + tmp2) * 0.5f;
156 next =
data[1] * 0.5;
159 for (
i = n - 2;
i >= 0;
i -= 2) {
160 float inr =
data[
i ];
161 float ini =
data[
i + 1];
168 next +=
s * inr -
c * ini;
183 memset(
s, 0,
sizeof(*
s));
193 s->costab = ff_cos_tabs[nbits + 2];
203 for (
i = 0;
i < n / 2;
i++)
204 s->csc2[
i] = 0.5 / sin((
M_PI / (2 * n) * (2 *
i + 1)));
static uint32_t inverse(uint32_t v)
find multiplicative inverse modulo 2 ^ 32
void ff_dct32_float(float *dst, const float *src)
static void dct_calc_III_c(DCTContext *ctx, FFTSample *data)
static void dct_calc_II_c(DCTContext *ctx, FFTSample *data)
av_cold int ff_dct_init(DCTContext *s, int nbits, enum DCTTransformType inverse)
Set up DCT.
static void dct32_func(DCTContext *ctx, FFTSample *data)
static void dst_calc_I_c(DCTContext *ctx, FFTSample *data)
static void dct_calc_I_c(DCTContext *ctx, FFTSample *data)
av_cold void ff_dct_end(DCTContext *s)
void ff_dct_init_x86(DCTContext *s)
void ff_init_ff_cos_tabs(int index)
Initialize the cosine table in ff_cos_tabs[index].
av_cold int ff_rdft_init(RDFTContext *s, int nbits, enum RDFTransformType trans)
Set up a real FFT.
av_cold void ff_rdft_end(RDFTContext *s)
#define av_malloc_array(a, b)