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

Reply via email to