I'm trying to comprehend WTF has On2 invented in their AVC codec.
So far the only thing missing in my decoder is reconstruction for
window types 4-7.
Window types 0-3 are ordinary AAC window types but those are special.
Can someone look at the decompile and say if it resembles something existing?
void __cdecl do_windowing(Context *a1, int wmode, float *ch_data, float *ch_buf, float *dst)
{
switch ( wmode ) {
case 0:
do_dct(ch_data, (const int *)&long_dct_order);
long_window_func(ch_data, ch_buf, dst, a1->window_512, 512);
memcpy(ch_buf, ch_data, 512 * 4);
break;
case 4:
case 5:
case 6:
case 7:
memcpy(dst, ch_buf, 448 * 4);
if ( wmode == 7 ) {
do_dct(ch_data, (const int *)&long_dct_order);
} else {
dword_10179818 -= get_rdtsc_cycles();
process_win_456(a1, ch_data, 512, wmode);
dword_10179818 += get_rdtsc_cycles();
}
short_window_func(ch_data, ch_buf, dst, a1->window_64_3);
scale_by_sqrt2_div_1024(ch_data + 960, dst + 576);
scale_by_sqrt2_div_1024(ch_data + 512, ch_buf);
scale_by_1_8(ch_data, ch_buf + 448, 64);
break;
case 1: //stop
do_dct(ch_data, (const int *)&long_dct_order);
long_window_func(ch_data, ch_buf, dst, a1->window_512, 512);
scale_by_sqrt2_div_1024(ch_data + 512, ch_buf);
scale_by_1_8(ch_data, ch_buf + 448, 64);
break;
case 2: //start
memcpy(dst, ch_buf, 448 * 4);
do_dct(ch_data, (const int *)&long_dct_order);
short_window_func(ch_data, ch_buf, dst, a1->window_64_3);
scale_by_sqrt2_div_1024(ch_data + 960, dst + 576);
memcpy(ch_buf, ch_data, 512 * 4);
break;
case 3: //short
for (i = 0; i < 8; i++)
do_dct(ch_data + i * 128, (const int *)&short_dct_order);
v10 = ch_buf;
memcpy(dst, ch_buf, 448 * 4);
for (v11 = dst + 448; v11 < dst + 1024 - 128; v11 += 128)
long_window_func(ch_data + i * 128,
i ? ch_data + (i - 1) * 128 : (ch_buf + 448),
v11, a1->window_64, 64);
long_window_func(ch_data + 1024 - 128, ch_data + 1024 - 128 * 2,
ch_buf, a1->window_64, 64);
memcpy(v11, v10, 64 * 4);
v14 = v10 + 64;
memcpy(v10, v10 + 64, 64 * 4);
v15 = ch_data;
for ( i = ch_data + 128; i < ch_data + 1024; v14 += 128 )
{
long_window_func(i, i - 128, v14, a1->window_64, 64);
v15 = i;
i += 128;
}
memcpy(ch_buf + 448, i - 128, 64 * 4);
break;
default:
return;
}
}
void long_window_func(float *a1, float *a2, float *dst, float *window, int m2)
{
for (i = 0; i < m2 * 2; i++)
dst[i] = a2[m2 - i - 1] * window[i * 2 + 1] - a1[m2 + i] * window[i * 2];
}
void short_window_func(float *src1, float *src2, float *dst, float *window)
{
for (;;) {
dst[576 + i] = src1[960 + i] * window[i * 4 + 1] + src2[512 - i - 1] * window[i * 4];
dst[448 + i] = src1[960 + i] * window[i * 4 + 2] + src2[512 - i - 1] * window[i * 4 + 3];
}
}
void scale_by_1_8(float *in, float *out, int size)
{
for (i = 0; i < size; i++)
out[i] = in[i] * 0.125;
}
void scale_by_sqrt2_div_1024(float *src, float *dst)
{
for (i = 0; i < 448; i++)
dst[i] = src[-i - 1] * -0.0013810679;
}
void process_win_456(Context *a1, float *a2, signed int size, int mode)
{
Context *v4; // eax@1
int size_; // ebp@1
int v6; // ebx@1
float *v8; // eax@2
double v9; // st7@3
float *v10; // eax@6
int v11; // ecx@7
double v12; // st7@8
float *v13; // edi@9
float *v14; // ebx@9
signed int v15; // eax@9
double v16; // st7@10
double v17; // st6@10
float *v18; // edi@13
float *v19; // ebx@13
signed int v20; // eax@13
double v21; // st7@14
double v22; // st6@14
float *v23; // edi@15
int v24; // eax@16
double v25; // st7@17
float *v26; // eax@19
float *v27; // ecx@19
float *v28; // edx@19
signed int v29; // edi@19
double v30; // st7@20
double v31; // st6@20
double v32; // st5@20
double v33; // st4@20
float *v34; // eax@21
float *v35; // ecx@21
double v36; // st7@22
float size_flt; // [sp+Ch] [bp+Ch]@1
v4 = a1;
size_ = size;
size_flt = (double)size;
a1->field_6A2C = 0;
v6 = 2 * size_;
if ( mode != 4 ) {
if ( mode == 5 ) {
a1->handle_win512_func(a1, a2, size_);
v10 = a2;
if ( size_ > 0 ) {
v11 = size_;
do {
*v10++ *= size_flt;
} while ( --v11 );
}
v13 = &a2[size_];
v14 = &a2[2 * size_ - 1];
do_dct(&a2[size_], (const int *)&static_val_9);
v15 = 256;
do {
v16 = *v13 + *v13;
v17 = *v14 + *v14;
*v13++ = v17;
*v14-- = v16;
} while ( --v15 );
} else {
if ( mode != 6 ) //should not happen
goto LABEL_19;
v18 = a2;
v19 = &a2[size_ - 1];
do_dct(a2, (const int *)&static_val_9);
v20 = 256;
do {
v21 = *v18 + *v18;
v22 = *v19 + *v19;
*v18++ = v22;
*v19-- = v21;
} while ( --v20 );
v23 = &a2[size_];
a1->handle_win512_func(a1, &a2[size_], size_);
if ( size_ > 0 ) {
v24 = size_;
do {
*v23++ *= size_flt;
} while ( --v24 );
}
}
v4 = a1;
LABEL_19:
v26 = v4->window_64_2;
v27 = a2 + 448;
v28 = a2 + 575;
v29 = 64;
do {
v30 = *v27 * v26[0] + *v28 * v26[1];
v32 = *v27 * v26[1] - *v28 * v26[0];
*v27++ = v32;
*v28-- = v30;
v26 += 2;
} while ( --v29 );
goto LABEL_21;
} else { // mode == 4
a1->handle_win512_func(a1, a2, 2 * size_);
v8 = a2;
if ( v6 > 0 ) {
do {
*v8++ *= size_flt;
} while ( --v6 );
}
}
LABEL_21:
v34 = &a2[size_];
v35 = v34 - 1;
if ( size_ > 0 ) {
do {
v36 = *v34;
*v34++ = *v35;
*v35-- = v36;
} while ( --size_ );
}
}
void zero_head_and_tail(float *a1, int len, int *orders)
{
if ( orders[0] > 0 )
memset(a1, 0, 4 * orders[0]);
if ( orders[1] > 0 )
memset(a1 + len - orders[1], 0, 4 * orders[1]);
}
int add_something_decomposed(float *src, float *dst, int a3, unsigned int tab_step, signed int a5, int *orders, double **tabs)
{
dword_1017A340 -= get_rdtsc_cycles();
if (orders[0] == 16 15 13 11 8 7 5 4 3 1) {
out = dst;
tab = tabs[0];
for (i = 0; i < tab_step; i++) {
double sum = 0;
for (j = 0; j < orders[0]; j++)
sum += src[j] * tab[j * tab_step + i];
out[i] += sum;
}
} else {
_assert((int)"0", "d:\\wdz.mnt\\src\\pkg\\avcDX\\waveDX.c", 165);
return result;
}
if (orders[1] == 11 8 7 5 4 3 1) {
out = dst + a3 - tab_step;
tab = tabs[v197];
src2 = src + (a3 - tab_step) / a5 + 1 + orders[0];
for (i = 0; i < tab_step; i++) {
double sum = 0;
for (j = 0; j < orders[1]; j++)
sum += src2[j] * tab[j * tab_step + i];
out[i] += sum;
}
} else {
_assert((int)"0", "d:\\wdz.mnt\\src\\pkg\\avcDX\\waveDX.c", 186);
return result;
}
result = get_rdtsc_cycles();
dword_1017A340 += result;
}
void twiddle_something(float *a1, float *a2, int a2_len, double *a4, unsigned int a4_len, signed int a6, int *orders, double **tabs)
{
v9 = (a2_len - a4_len) / a6 + 1;
add_something_decomposed(a1, a2, a2_len, a4_len, a6, orders, tabs);
mask = a4_len - 1;
if ( v9 <= 0 )
return;
dword_1017A344 -= get_rdtsc_cycles();
for (i = 0; i < v9; i++) {
v49 = a1[orders[0] + i];
v50 = (a2_len - 1) & mask;
if ( v50 < a4_len ) {
v56 = 0;
if ( v50 >= 0 ) {
v59 = a4;
v56 = ((a2_len - 1) & mask) + 1;
for (j = (a2_len - 1) & mask; j >= 0; j--)
a2[j] += v49 * *v59++;
}
if ( v56 < a4_len ) {
for (j = 0; j < a4_len - v56; j++)
a2[a2_len - j - 1] += v49 * a4[v56 + j];
}
} else {
for (j = 0; j < a4_len; j++)
a2[v50 - j] += v49 * a4[j];
}
mask = a6 + v50;
}
dword_1017A344 += get_rdtsc_cycles();
}
void pretwiddle_maybe(float *a1, float *a2, float *a3, float *a4, float *a5, float *a6, float *a7, float *a8, float *a9, signed int a10, signed int a11)
{
v83 = a10 >> 1;
v79 = a10 >> 2;
dword_1017A348 -= get_rdtsc_cycles();
v11 = a11;
for ( i = a10 >> 1; v11 > 1; i *= 2 )
v11 >>= 1;
v33 = 2;
v36 = (a10 >> 1) + 2;
v39 = &a6[i];
v40 = &a7[i];
v13 = 2 * a11;
v41 = &a8[i];
v86 = v13;
v42 = &a9[i];
v14 = v13;
v15 = a4;
v16 = a5;
*a5 = *a8 * *a3 + *a6 * *a1 + *a9 * *a4 + *a7 * *a2;
if ( v79 > 2 ) {
v81 = &a5[v36];
v82 = (v79 - 1) >> 1;
v33 = 2 * (v82 + 1);
v36 += 2 * v82;
v14 = v86 * (v82 + 1);
k = 2;
j = v13;
do
{
a5[k] = a6[j] * a1[k]
- a6[j + 1] * a1[k + 1]
+ a7[j] * a2[k]
- a7[j + 1] * a2[k + 1]
+ a8[j] * a3[k]
- a8[j + 1] * a3[k + 1];
+ a9[j] * a4[k]
- a9[j + 1] * a4[k + 1];
a5[k + 1] = a9[j + 1] * a4[k]
+ a9[j] * a4[k + 1]
+ a8[j + 1] * a3[k]
+ a8[j] * a3[k + 1]
+ a7[j + 1] * a2[k]
+ a7[j] * a2[k + 1]
+ a6[j + 1] * a6[k + 1]
+ a6[j] * a6[k];
v81[0] = v39[j] * a1[k]
- v39[j + 1] * a1[k + 1]
+ v40[j] * a2[k]
- v40[j + 1] * a2[k + 1]
+ v41[j] * a3[k]
- v41[j + 1] * a3[k + 1]
+ v42[j] * a4[k]
- v42[j + 1] * a4[k + 1];
v81[1] = v39[j] * a1[k + 1]
+ v39[j + 1] * a1[k]
+ v40[j] * a2[k + 1]
+ v40[j + 1] * a2[k]
+ v41[j] * a3[k + 1]
+ v41[j + 1] * a3[k]
+ v42[j] * a4[k + 1]
+ v42[j + 1] * a4[k];
i += 2;
j += v86;
} while ( --v82 );
v15 = a4;
v13 = v86;
v16 = a5;
}
v16[v33] = a6[v14] * a1[1] + a7[v14] * a2[1] + a9[v14] * v15[1] + a8[v14] * a3[1];
v16[v33 + 1] = a6[v14 + 1] * a1[1] + a7[v14 + 1] * a2[1] + a9[v14 + 1] * v15[1] + a8[v14 + 1] * a3[1];
v16[v36] = v42[v14] * v15[1] + v40[v14] * a2[1] + v39[v14] * a1[1] + v41[v14] * a3[1];
v16[v36 + 1] = v41[v14 + 1] * a3[1] + v42[v14 + 1] * v15[1] + v40[v14 + 1] * a2[1] + v39[v14 + 1] * a1[1];
v34 = v33 + 2;
v24 = v13 + v14;
v37 = v36 + 2;
v25 = v34;
if ( v34 < v83 ) {
v85 = 4 * v13;
v84 = (v83 - v34 + 1) >> 1;
v35 = v34 + 2 * v84;
v24 += v86 * v84;
j = v24;
k = v79 - 2;
do {
v70[0] = a1[k] * a6[j]
+ a1[k + 1] * a6[j + 1]
+ a2[k] * a7[j]
+ a2[k + 1] * a7[j + 1]
+ a3[k] * a8[j]
+ a3[k + 1] * a8[j + 1]
+ a4[k] * a9[j]
+ a4[k + 1] * a9[j + 1];
v70[1] = a1[k] * a6[j + 1]
- a1[k + 1] * a6[j]
+ a2[k] * a7[j + 1]
- a2[k + 1] * a7[j]
+ a3[k] * a8[j + 1]
- a3[k + 1] * a8[j]
+ a4[k] * a9[j + 1]
- a4[k + 1] * a9[j];
v38[0] = a1[k] * v39[j]
+ a1[k + 1] * v39[j + 1]
+ a2[k] * v40[j]
+ a2[k + 1] * v40[j + 1]
+ a3[k] * v41[j]
+ a3[k + 1] * v41[j + 1]
+ a4[k] * v42[j]
+ a4[k + 1] * v42[j + 1];
v38[1] = a1[k] * v39[j + 1]
- a1[k + 1] * v39[j]
+ a2[k] * v40[j + 1]
- a2[k + 1] * v40[j]
+ a3[k] * v41[j + 1]
- a3[k + 1] * v41[j]
+ a4[k] * v42[j + 1]
- a4[k + 1] * v42[j];
j += v13;
k += 2;
} while ( --v84 );
v15 = a4;
v25 = v35;
v16 = a5;
}
v16[v25] = a9[v24] * *v15 + a6[v24] * *a1 + a7[v24] * a2[0] + a8[v24] * *a3;
v16[v25 + 1] = a9[v24 + 1] * *v15 + a6[v24 + 1] * *a1 + a7[v24 + 1] * a2[0] + a8[v24 + 1] * *a3;
v16[1] = a6[1] * *a1 + a7[1] * a2[0] + a8[1] * *a3 + a9[1] * *v15;
dword_1017A348 += get_rdtsc_cycles();
}
void decode_weird_40k(Context *a1, float *src, int length)
{
if ( length == 1024 ) {
half = 0;
} else {
if ( length != 512 )
_assert((int)"0", "d:\\wdz.mnt\\src\\pkg\\avcDX\\waveDX.c", 895);
half = 1;
}
zero_float_array(a1->wch0, length);
zero_float_array(a1->wch1, length);
if ( half ) {
twiddle_something(src, &a1->wch0[ 0], 16, tab_10_1, 10, 2, orders_1_3, tabs_4_10_1);
twiddle_something(src + 8, &a1->wch0[ 0], 16, tab_10_2, 10, 2, orders_3_1, tabs_4_10_2);
twiddle_something(src + 16, &a1->wch0[16], 16, tab_10_2, 10, 2, orders_3_1, tabs_4_10_2);
twiddle_something(src + 24, &a1->wch0[16], 16, tab_10_1, 10, 2, orders_1_3, tabs_4_10_1);
twiddle_something(src + 32, &a1->wch0[32], 16, tab_10_1, 10, 2, orders_1_3, tabs_4_10_1);
twiddle_something(src + 40, &a1->wch0[32], 16, tab_10_2, 10, 2, orders_3_1, tabs_4_10_2);
twiddle_something(src + 48, &a1->wch0[48], 16, tab_10_2, 10, 2, orders_3_1, tabs_4_10_2);
twiddle_something(src + 56, &a1->wch0[48], 16, tab_10_1, 10, 2, orders_1_3, tabs_4_10_1);
twiddle_something(&a1->wch0[ 0], &a1->wch1[ 0], 32, tab_20_1, 20, 2, orders_5_4, tabs_9_20_1);
twiddle_something(&a1->wch0[16], &a1->wch1[ 0], 32, tab_20_2, 20, 2, orders_4_5, tabs_9_20_2);
twiddle_something(&a1->wch0[32], &a1->wch1[32], 32, tab_20_2, 20, 2, orders_4_5, tabs_9_20_2);
twiddle_something(&a1->wch0[48], &a1->wch1[32], 32, tab_20_1, 20, 2, orders_5_4, tabs_9_20_1);
twiddle_something(src + 64, &a1->wch1[64], 32, tab_20_1, 20, 2, orders_5_4, tabs_9_20_1);
twiddle_something(src + 80, &a1->wch1[64], 32, tab_20_2, 20, 2, orders_4_5, tabs_9_20_2);
twiddle_something(src + 96, &a1->wch1[96], 32, tab_20_2, 20, 2, orders_4_5, tabs_9_20_2);
twiddle_something(src + 112, &a1->wch1[96], 32, tab_20_1, 20, 2, orders_5_4, tabs_9_20_1);
twiddle_something(src + 128, &a1->wch1[128], 32, tab_20_1, 20, 2, orders_5_4, tabs_9_20_1);
twiddle_something(src + 144, &a1->wch1[128], 32, tab_20_2, 20, 2, orders_4_5, tabs_9_20_2);
twiddle_something(src + 160, &a1->wch1[160], 32, tab_20_2, 20, 2, orders_4_5, tabs_9_20_2);
twiddle_something(src + 176, &a1->wch1[160], 32, tab_20_1, 20, 2, orders_5_4, tabs_9_20_1);
zero_float_array(&a1->wch0[0], 64);
twiddle_something(&a1->wch1[ 0], &a1->wch0[0], 128, tab_84_1, 84, 4, orders_16_4, tabs_20_84_1);
twiddle_something(&a1->wch1[32], &a1->wch0[0], 128, tab_84_2, 84, 4, orders_16_4_, tabs_20_84_2);
twiddle_something(&a1->wch1[64], &a1->wch0[0], 128, tab_84_3, 84, 4, orders_13_7, tabs_20_84_3);
twiddle_something(&a1->wch1[96], &a1->wch0[0], 128, tab_84_4, 84, 4, orders_15_5, tabs_20_84_4);
twiddle_something(&a1->wch1[128], &a1->wch0[128], 128, tab_84_4, 84, 4, orders_15_5, tabs_20_84_4);
twiddle_something(&a1->wch1[160], &a1->wch0[128], 128, tab_84_3, 84, 4, orders_13_7, tabs_20_84_3);
twiddle_something(src + 192, &a1->wch0[128], 128, tab_84_2, 84, 4, orders_16_4_, tabs_20_84_2);
twiddle_something(src + 224, &a1->wch0[128], 128, tab_84_1, 84, 4, orders_16_4, tabs_20_84_1);
twiddle_something(src + 256, &a1->wch0[256], 128, tab_84_1, 84, 4, orders_16_4, tabs_20_84_1);
twiddle_something(src + 288, &a1->wch0[256], 128, tab_84_2, 84, 4, orders_16_4_, tabs_20_84_2);
twiddle_something(src + 320, &a1->wch0[256], 128, tab_84_3, 84, 4, orders_13_7, tabs_20_84_3);
twiddle_something(src + 352, &a1->wch0[256], 128, tab_84_4, 84, 4, orders_15_5, tabs_20_84_4);
copy_delay(src, &a1->wch0[0], 384);
copy_delay(&a1->wch0[384], src + 384, 128);
zero_head_and_tail(src, 128, orders_16_4);
zero_head_and_tail(src + 128, 128, orders_16_4_);
zero_head_and_tail(src + 256, 128, orders_13_7);
zero_head_and_tail(src + 384, 128, orders_15_5);
do_fft_maybe(src, 7, 0, 1.0);
do_fft_maybe(src + 128, 7, 0, 1.0);
do_fft_maybe(src + 256, 7, 0, 1.0);
do_fft_maybe(src + 384, 7, 0, 1.0);
pretwiddle_maybe(src, src + 128, src + 256, src + 384, a1->wch1, ctab_1, ctab_2, ctab_3, ctab_4, 512, 2);
do_fft_maybe(a1->wch1, 9, 1, 0.00390625);
add_something_decomposed(&a1->wch0[ 0], a1->wch1, 512, 84, 4, orders_16_4, tabs_20_84_1);
add_something_decomposed(&a1->wch0[128], a1->wch1, 512, 84, 4, orders_16_4_, tabs_20_84_2);
add_something_decomposed(&a1->wch0[256], a1->wch1, 512, 84, 4, orders_13_7, tabs_20_84_3);
add_something_decomposed(&a1->wch0[384], a1->wch1, 512, 84, 4, orders_15_5, tabs_20_84_4);
memcpy(src, a1->wch1, 512 * sizeof(float));
} else {
twiddle_something(src, &a1->wch0[ 0], 32, tab_20_1, 20, 2, orders_5_4, tabs_9_20_1);
twiddle_something(src + 16, &a1->wch0[ 0], 32, tab_20_2, 20, 2, orders_4_5, tabs_9_20_2);
twiddle_something(src + 32, &a1->wch0[32], 32, tab_20_2, 20, 2, orders_4_5, tabs_9_20_2);
twiddle_something(src + 48, &a1->wch0[32], 32, tab_20_1, 20, 2, orders_5_4, tabs_9_20_1);
twiddle_something(src + 64, &a1->wch0[64], 32, tab_20_1, 20, 2, orders_5_4, tabs_9_20_1);
twiddle_something(src + 80, &a1->wch0[64], 32, tab_20_2, 20, 2, orders_4_5, tabs_9_20_2);
twiddle_something(src + 96, &a1->wch0[96], 32, tab_20_2, 20, 2, orders_4_5, tabs_9_20_2);
twiddle_something(src + 112, &a1->wch0[96], 32, tab_20_1, 20, 2, orders_5_4, tabs_9_20_1);
twiddle_something(&a1->wch0[ 0], &a1->wch1[ 0], 64, tab_40_1, 40, 2, orders_11_8, tabs_19_40_1);
twiddle_something(&a1->wch0[32], &a1->wch1[ 0], 64, tab_40_2, 40, 2, orders_8_11, tabs_19_40_2);
twiddle_something(&a1->wch0[64], &a1->wch1[64], 64, tab_40_2, 40, 2, orders_8_11, tabs_19_40_2);
twiddle_something(&a1->wch0[96], &a1->wch1[64], 64, tab_40_1, 40, 2, orders_11_8, tabs_19_40_1);
twiddle_something(src + 128, &a1->wch1[128], 64, tab_40_1, 40, 2, orders_11_8, tabs_19_40_1);
twiddle_something(src + 160, &a1->wch1[128], 64, tab_40_2, 40, 2, orders_8_11, tabs_19_40_2);
twiddle_something(src + 192, &a1->wch1[192], 64, tab_40_2, 40, 2, orders_8_11, tabs_19_40_2);
twiddle_something(src + 224, &a1->wch1[192], 64, tab_40_1, 40, 2, orders_11_8, tabs_19_40_1);
twiddle_something(src + 256, &a1->wch1[256], 64, tab_40_1, 40, 2, orders_11_8, tabs_19_40_1);
twiddle_something(src + 288, &a1->wch1[256], 64, tab_40_2, 40, 2, orders_8_11, tabs_19_40_2);
twiddle_something(src + 320, &a1->wch1[320], 64, tab_40_2, 40, 2, orders_8_11, tabs_19_40_2);
twiddle_something(src + 352, &a1->wch1[320], 64, tab_40_1, 40, 2, orders_11_8, tabs_19_40_1);
zero_float_array(&a1->wch0[0], 128);
twiddle_something(&a1->wch1[ 0], &a1->wch0[0], 256, tab_84_1, 84, 4, orders_16_4, tabs_20_84_1);
twiddle_something(&a1->wch1[ 64], &a1->wch0[0], 256, tab_84_2, 84, 4, orders_16_4_, tabs_20_84_2);
twiddle_something(&a1->wch1[128], &a1->wch0[0], 256, tab_84_3, 84, 4, orders_13_7, tabs_20_84_3);
twiddle_something(&a1->wch1[192], &a1->wch0[0], 256, tab_84_4, 84, 4, orders_15_5, tabs_20_84_4);
twiddle_something(&a1->wch1[256], &a1->wch0[256], 256, tab_84_4, 84, 4, orders_15_5, tabs_20_84_4);
twiddle_something(&a1->wch1[320], &a1->wch0[256], 256, tab_84_3, 84, 4, orders_13_7, tabs_20_84_3);
twiddle_something(src + 384, &a1->wch0[256], 256, tab_84_2, 84, 4, orders_16_4_, tabs_20_84_2);
twiddle_something(src + 448, &a1->wch0[256], 256, tab_84_1, 84, 4, orders_16_4, tabs_20_84_1);
twiddle_something(src + 512, &a1->wch0[512], 256, tab_84_1, 84, 4, orders_16_4, tabs_20_84_1);
twiddle_something(src + 576, &a1->wch0[512], 256, tab_84_2, 84, 4, orders_16_4_, tabs_20_84_2);
twiddle_something(src + 640, &a1->wch0[512], 256, tab_84_3, 84, 4, orders_13_7, tabs_20_84_3);
twiddle_something(src + 704, &a1->wch0[512], 256, tab_84_4, 84, 4, orders_15_5, tabs_20_84_4);
copy_delay(src, &a1->wch0[0], 768);
copy_delay(&a1->wch0[768], src + 768, 256);
zero_head_and_tail(src, 256, orders_16_4);
zero_head_and_tail(src + 256, 256, orders_16_4_);
zero_head_and_tail(src + 512, 256, orders_13_7);
zero_head_and_tail(src + 768, 256, orders_15_5);
do_fft_maybe(src, 8, 0, 1.0);
do_fft_maybe(src + 256, 8, 0, 1.0);
do_fft_maybe(src + 512, 8, 0, 1.0);
do_fft_maybe(src + 768, 8, 0, 1.0);
pretwiddle_maybe(src, src + 256, src + 512, src + 768, a1->wch1, ctab_1, ctab_2, ctab_3, ctab_4, 1024, 1);
do_fft_maybe(a1->wch1, 10, 1, 0.001953125);
add_something_decomposed(&a1->wch0[ 0], a1->wch1, 1024, 84, 4, orders_16_4, tabs_20_84_1);
add_something_decomposed(&a1->wch0[256], a1->wch1, 1024, 84, 4, orders_16_4_, tabs_20_84_2);
add_something_decomposed(&a1->wch0[512], a1->wch1, 1024, 84, 4, orders_13_7, tabs_20_84_3);
add_something_decomposed(&a1->wch0[768], a1->wch1, 1024, 84, 4, orders_15_5, tabs_20_84_4);
memcpy(src, a1->wch1, 1024 * sizeof(float));
}
}
void decode_weird_44k(Context *a1, float *src, int length)
{
if ( length == 1024 ) {
half = 0;
} else {
if ( length != 512 )
_assert((int)"0", "d:\\wdz.mnt\\src\\pkg\\avcDX\\waveDX.c", 714);
half = 1;
}
zero_float_array(a1->wch0, length);
zero_float_array(a1->wch1, length);
if ( half ) {
twiddle_something(src, &a1->wch0[ 0], 16, tab_10_1, 10, 2, orders_1_3, tabs_4_10_1);
twiddle_something(src + 8, &a1->wch0[ 0], 16, tab_10_2, 10, 2, orders_3_1, tabs_4_10_2);
twiddle_something(src + 16, &a1->wch0[16], 16, tab_10_2, 10, 2, orders_3_1, tabs_4_10_2);
twiddle_something(src + 24, &a1->wch0[16], 16, tab_10_1, 10, 2, orders_1_3, tabs_4_10_1);
twiddle_something(src + 32, &a1->wch0[32], 16, tab_10_1, 10, 2, orders_1_3, tabs_4_10_1);
twiddle_something(src + 40, &a1->wch0[32], 16, tab_10_2, 10, 2, orders_3_1, tabs_4_10_2);
twiddle_something(src + 48, &a1->wch0[48], 16, tab_10_2, 10, 2, orders_3_1, tabs_4_10_2);
twiddle_something(src + 56, &a1->wch0[48], 16, tab_10_1, 10, 2, orders_1_3, tabs_4_10_1);
twiddle_something(&a1->wch0[ 0], &a1->wch1[ 0], 32, tab_20_1, 20, 2, orders_5_4, tabs_9_20_1);
twiddle_something(&a1->wch0[16], &a1->wch1[ 0], 32, tab_20_2, 20, 2, orders_4_5, tabs_9_20_2);
twiddle_something(&a1->wch0[32], &a1->wch1[32], 32, tab_20_2, 20, 2, orders_4_5, tabs_9_20_2);
twiddle_something(&a1->wch0[48], &a1->wch1[32], 32, tab_20_1, 20, 2, orders_5_4, tabs_9_20_1);
twiddle_something(src + 64, &a1->wch1[64], 32, tab_20_1, 20, 2, orders_5_4, tabs_9_20_1);
twiddle_something(src + 80, &a1->wch1[64], 32, tab_20_2, 20, 2, orders_4_5, tabs_9_20_2);
twiddle_something(src + 96, &a1->wch1[96], 32, tab_20_2, 20, 2, orders_4_5, tabs_9_20_2);
twiddle_something(src + 112, &a1->wch1[96], 32, tab_20_1, 20, 2, orders_5_4, tabs_9_20_1);
zero_float_array(&a1->wch0[0], 64);
twiddle_something(&a1->wch1[ 0], &a1->wch0[0], 128, tab_84_1, 84, 4, orders_16_4, tabs_20_84_1);
twiddle_something(&a1->wch1[32], &a1->wch0[0], 128, tab_84_2, 84, 4, orders_16_4_, tabs_20_84_2);
twiddle_something(&a1->wch1[64], &a1->wch0[0], 128, tab_84_3, 84, 4, orders_13_7, tabs_20_84_3);
twiddle_something(&a1->wch1[96], &a1->wch0[0], 128, tab_84_4, 84, 4, orders_15_5, tabs_20_84_4);
twiddle_something(src + 128, &a1->wch0[128], 128, tab_84_4, 84, 4, orders_15_5, tabs_20_84_4);
twiddle_something(src + 160, &a1->wch0[128], 128, tab_84_3, 84, 4, orders_13_7, tabs_20_84_3);
twiddle_something(src + 192, &a1->wch0[128], 128, tab_84_2, 84, 4, orders_16_4_, tabs_20_84_2);
twiddle_something(src + 224, &a1->wch0[128], 128, tab_84_1, 84, 4, orders_16_4, tabs_20_84_1);
twiddle_something(src + 256, &a1->wch0[256], 128, tab_40_1, 40, 2, orders_11_8, tabs_19_40_1);
twiddle_something(src + 320, &a1->wch0[256], 128, tab_40_2, 40, 2, orders_8_11, tabs_19_40_2);
copy_delay(src, &a1->wch0[0], 384);
copy_delay(&a1->wch0[384], src + 384, 128);
zero_head_and_tail(src, 128, orders_16_4);
zero_head_and_tail(src + 128, 128, orders_16_4_);
zero_head_and_tail(src + 256, 128, orders_13_7);
zero_head_and_tail(src + 384, 128, orders_15_5);
do_fft_maybe(src, 7, 0, 1.0);
do_fft_maybe(src + 128, 7, 0, 1.0);
do_fft_maybe(src + 256, 7, 0, 1.0);
do_fft_maybe(src + 384, 7, 0, 1.0);
pretwiddle_maybe(src, src + 128, src + 256, src + 384, a1->wch1, ctab_1, ctab_2, ctab_3, ctab_4, 512, 2);
do_fft_maybe(a1->wch1, 9, 1, 0.00390625);
add_something_decomposed(&a1->wch0[ 0], a1->wch1, 512, 84, 4, orders_16_4, tabs_20_84_1);
add_something_decomposed(&a1->wch0[128], a1->wch1, 512, 84, 4, orders_16_4_, tabs_20_84_2);
add_something_decomposed(&a1->wch0[256], a1->wch1, 512, 84, 4, orders_13_7, tabs_20_84_3);
add_something_decomposed(&a1->wch0[384], a1->wch1, 512, 84, 4, orders_15_5, tabs_20_84_4);
memcpy(src, a1->wch1, 512 * sizeof(float));
} else {
twiddle_something(src, &a1->wch0[ 0], 32, tab_20_1, 20, 2, orders_5_4, tabs_9_20_1);
twiddle_something(src + 16, &a1->wch0[ 0], 32, tab_20_2, 20, 2, orders_4_5, tabs_9_20_2);
twiddle_something(src + 32, &a1->wch0[32], 32, tab_20_2, 20, 2, orders_4_5, tabs_9_20_2);
twiddle_something(src + 48, &a1->wch0[32], 32, tab_20_1, 20, 2, orders_5_4, tabs_9_20_1);
twiddle_something(src + 64, &a1->wch0[64], 32, tab_20_1, 20, 2, orders_5_4, tabs_9_20_1);
twiddle_something(src + 80, &a1->wch0[64], 32, tab_20_2, 20, 2, orders_4_5, tabs_9_20_2);
twiddle_something(src + 96, &a1->wch0[96], 32, tab_20_2, 20, 2, orders_4_5, tabs_9_20_2);
twiddle_something(src + 112, &a1->wch0[96], 32, tab_20_1, 20, 2, orders_5_4, tabs_9_20_1);
twiddle_something(&a1->wch0[ 0], &a1->wch1[ 0], 64, tab_40_1, 40, 2, orders_11_8, tabs_19_40_1);
twiddle_something(&a1->wch0[32], &a1->wch1[ 0], 64, tab_40_2, 40, 2, orders_8_11, tabs_19_40_2);
twiddle_something(&a1->wch0[64], &a1->wch1[64], 64, tab_40_2, 40, 2, orders_8_11, tabs_19_40_2);
twiddle_something(&a1->wch0[96], &a1->wch1[64], 64, tab_40_1, 40, 2, orders_11_8, tabs_19_40_1);
twiddle_something(src + 128, &a1->wch1[128], 64, tab_40_1, 40, 2, orders_11_8, tabs_19_40_1);
twiddle_something(src + 160, &a1->wch1[128], 64, tab_40_2, 40, 2, orders_8_11, tabs_19_40_2);
twiddle_something(src + 192, &a1->wch1[192], 64, tab_40_2, 40, 2, orders_8_11, tabs_19_40_2);
twiddle_something(src + 224, &a1->wch1[192], 64, tab_40_1, 40, 2, orders_11_8, tabs_19_40_1);
zero_float_array(&a1->wch0[0], 128);
twiddle_something(&a1->wch1[ 0], &a1->wch0[0], 256, tab_84_1, 84, 4, orders_16_4, tabs_20_84_1);
twiddle_something(&a1->wch1[ 64], &a1->wch0[0], 256, tab_84_2, 84, 4, orders_16_4_, tabs_20_84_2);
twiddle_something(&a1->wch1[128], &a1->wch0[0], 256, tab_84_3, 84, 4, orders_13_7, tabs_20_84_3);
twiddle_something(&a1->wch1[192], &a1->wch0[0], 256, tab_84_4, 84, 4, orders_15_5, tabs_20_84_4);
twiddle_something(src + 256, &a1->wch0[256], 256, tab_84_4, 84, 4, orders_15_5, tabs_20_84_4);
twiddle_something(src + 320, &a1->wch0[256], 256, tab_84_3, 84, 4, orders_13_7, tabs_20_84_3);
twiddle_something(src + 384, &a1->wch0[256], 256, tab_84_2, 84, 4, orders_16_4_, tabs_20_84_2);
twiddle_something(src + 448, &a1->wch0[256], 256, tab_84_1, 84, 4, orders_16_4, tabs_20_84_1);
twiddle_something(src + 512, &a1->wch0[512], 256, tab_40_1, 40, 2, orders_11_8, tabs_19_40_1);
twiddle_something(src + 640, &a1->wch0[512], 256, tab_40_2, 40, 2, orders_8_11, tabs_19_40_2);
copy_delay(src, &a1->wch0[0], 768);
copy_delay(&a1->wch0[768], src + 768, 256);
zero_head_and_tail(src, 256, orders_16_4);
zero_head_and_tail(src + 256, 256, orders_16_4_);
zero_head_and_tail(src + 512, 256, orders_13_7);
zero_head_and_tail(src + 768, 256, orders_15_5);
do_fft_maybe(src, 8, 0, 1.0);
do_fft_maybe(src + 256, 8, 0, 1.0);
do_fft_maybe(src + 512, 8, 0, 1.0);
do_fft_maybe(src + 768, 8, 0, 1.0);
pretwiddle_maybe(src, src + 256, src + 512, src + 768, a1->wch1, ctab_1, ctab_2, ctab_3, ctab_4, 1024, 1);
do_fft_maybe(a1->wch1, 10, 1, 0.001953125);
add_something_decomposed(&a1->wch0[ 0], a1->wch1, 1024, 84, 4, orders_16_4, tabs_20_84_1);
add_something_decomposed(&a1->wch0[256], a1->wch1, 1024, 84, 4, orders_16_4_, tabs_20_84_2);
add_something_decomposed(&a1->wch0[512], a1->wch1, 1024, 84, 4, orders_13_7, tabs_20_84_3);
add_something_decomposed(&a1->wch0[768], a1->wch1, 1024, 84, 4, orders_15_5, tabs_20_84_4);
memcpy(src, a1->wch1, 1024 * sizeof(float));
}
}
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel