1*df25739fSMilanka Ringwald /****************************************************************************** 2*df25739fSMilanka Ringwald * 3*df25739fSMilanka Ringwald * Copyright (C) 2014 The Android Open Source Project 4*df25739fSMilanka Ringwald * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved. 5*df25739fSMilanka Ringwald * 6*df25739fSMilanka Ringwald * Licensed under the Apache License, Version 2.0 (the "License"); 7*df25739fSMilanka Ringwald * you may not use this file except in compliance with the License. 8*df25739fSMilanka Ringwald * You may obtain a copy of the License at: 9*df25739fSMilanka Ringwald * 10*df25739fSMilanka Ringwald * http://www.apache.org/licenses/LICENSE-2.0 11*df25739fSMilanka Ringwald * 12*df25739fSMilanka Ringwald * Unless required by applicable law or agreed to in writing, software 13*df25739fSMilanka Ringwald * distributed under the License is distributed on an "AS IS" BASIS, 14*df25739fSMilanka Ringwald * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15*df25739fSMilanka Ringwald * See the License for the specific language governing permissions and 16*df25739fSMilanka Ringwald * limitations under the License. 17*df25739fSMilanka Ringwald * 18*df25739fSMilanka Ringwald ******************************************************************************/ 19*df25739fSMilanka Ringwald 20*df25739fSMilanka Ringwald /********************************************************************************** 21*df25739fSMilanka Ringwald $Revision: #1 $ 22*df25739fSMilanka Ringwald ***********************************************************************************/ 23*df25739fSMilanka Ringwald 24*df25739fSMilanka Ringwald /** @file 25*df25739fSMilanka Ringwald @ingroup codec_internal 26*df25739fSMilanka Ringwald */ 27*df25739fSMilanka Ringwald 28*df25739fSMilanka Ringwald /**@addgroup codec_internal*/ 29*df25739fSMilanka Ringwald /**@{*/ 30*df25739fSMilanka Ringwald 31*df25739fSMilanka Ringwald /* 32*df25739fSMilanka Ringwald * Performs an 8-point Type-II scaled DCT using the Arai-Agui-Nakajima 33*df25739fSMilanka Ringwald * factorization. The scaling factors are folded into the windowing 34*df25739fSMilanka Ringwald * constants. 29 adds and 5 16x32 multiplies per 8 samples. 35*df25739fSMilanka Ringwald */ 36*df25739fSMilanka Ringwald 37*df25739fSMilanka Ringwald #include "oi_codec_sbc_private.h" 38*df25739fSMilanka Ringwald 39*df25739fSMilanka Ringwald #define AAN_C4_FIX (759250125)/* S1.30 759250125 0.707107*/ 40*df25739fSMilanka Ringwald 41*df25739fSMilanka Ringwald #define AAN_C6_FIX (410903207)/* S1.30 410903207 0.382683*/ 42*df25739fSMilanka Ringwald 43*df25739fSMilanka Ringwald #define AAN_Q0_FIX (581104888)/* S1.30 581104888 0.541196*/ 44*df25739fSMilanka Ringwald 45*df25739fSMilanka Ringwald #define AAN_Q1_FIX (1402911301)/* S1.30 1402911301 1.306563*/ 46*df25739fSMilanka Ringwald 47*df25739fSMilanka Ringwald /** Scales x by y bits to the right, adding a rounding factor. 48*df25739fSMilanka Ringwald */ 49*df25739fSMilanka Ringwald #ifndef SCALE 50*df25739fSMilanka Ringwald #define SCALE(x, y) (((x) + (1 <<((y)-1))) >> (y)) 51*df25739fSMilanka Ringwald #endif 52*df25739fSMilanka Ringwald 53*df25739fSMilanka Ringwald /** 54*df25739fSMilanka Ringwald * Default C language implementation of a 32x32->32 multiply. This function may 55*df25739fSMilanka Ringwald * be replaced by a platform-specific version for speed. 56*df25739fSMilanka Ringwald * 57*df25739fSMilanka Ringwald * @param u A signed 32-bit multiplicand 58*df25739fSMilanka Ringwald * @param v A signed 32-bit multiplier 59*df25739fSMilanka Ringwald 60*df25739fSMilanka Ringwald * @return A signed 32-bit value corresponding to the 32 most significant bits 61*df25739fSMilanka Ringwald * of the 64-bit product of u and v. 62*df25739fSMilanka Ringwald */ 63*df25739fSMilanka Ringwald INLINE OI_INT32 default_mul_32s_32s_hi(OI_INT32 u, OI_INT32 v) 64*df25739fSMilanka Ringwald { 65*df25739fSMilanka Ringwald OI_UINT32 u0, v0; 66*df25739fSMilanka Ringwald OI_INT32 u1, v1, w1, w2, t; 67*df25739fSMilanka Ringwald 68*df25739fSMilanka Ringwald u0 = u & 0xFFFF; u1 = u >> 16; 69*df25739fSMilanka Ringwald v0 = v & 0xFFFF; v1 = v >> 16; 70*df25739fSMilanka Ringwald t = u0*v0; 71*df25739fSMilanka Ringwald t = u1*v0 + ((OI_UINT32)t >> 16); 72*df25739fSMilanka Ringwald w1 = t & 0xFFFF; 73*df25739fSMilanka Ringwald w2 = t >> 16; 74*df25739fSMilanka Ringwald w1 = u0*v1 + w1; 75*df25739fSMilanka Ringwald return u1*v1 + w2 + (w1 >> 16); 76*df25739fSMilanka Ringwald } 77*df25739fSMilanka Ringwald 78*df25739fSMilanka Ringwald #define MUL_32S_32S_HI(_x, _y) default_mul_32s_32s_hi(_x, _y) 79*df25739fSMilanka Ringwald 80*df25739fSMilanka Ringwald 81*df25739fSMilanka Ringwald #ifdef DEBUG_DCT 82*df25739fSMilanka Ringwald PRIVATE void float_dct2_8(float * RESTRICT out, OI_INT32 const *RESTRICT in) 83*df25739fSMilanka Ringwald { 84*df25739fSMilanka Ringwald #define FIX(x,bits) (((int)floor(0.5f+((x)*((float)(1<<bits)))))/((float)(1<<bits))) 85*df25739fSMilanka Ringwald #define FLOAT_BUTTERFLY(x,y) x += y; y = x - (y*2); OI_ASSERT(VALID_INT32(x)); OI_ASSERT(VALID_INT32(y)); 86*df25739fSMilanka Ringwald #define FLOAT_MULT_DCT(K, sample) (FIX(K,20) * sample) 87*df25739fSMilanka Ringwald #define FLOAT_SCALE(x, y) (((x) / (double)(1 << (y)))) 88*df25739fSMilanka Ringwald 89*df25739fSMilanka Ringwald double L00,L01,L02,L03,L04,L05,L06,L07; 90*df25739fSMilanka Ringwald double L25; 91*df25739fSMilanka Ringwald 92*df25739fSMilanka Ringwald double in0,in1,in2,in3; 93*df25739fSMilanka Ringwald double in4,in5,in6,in7; 94*df25739fSMilanka Ringwald 95*df25739fSMilanka Ringwald in0 = FLOAT_SCALE(in[0], DCTII_8_SHIFT_IN); OI_ASSERT(VALID_INT32(in0)); 96*df25739fSMilanka Ringwald in1 = FLOAT_SCALE(in[1], DCTII_8_SHIFT_IN); OI_ASSERT(VALID_INT32(in1)); 97*df25739fSMilanka Ringwald in2 = FLOAT_SCALE(in[2], DCTII_8_SHIFT_IN); OI_ASSERT(VALID_INT32(in2)); 98*df25739fSMilanka Ringwald in3 = FLOAT_SCALE(in[3], DCTII_8_SHIFT_IN); OI_ASSERT(VALID_INT32(in3)); 99*df25739fSMilanka Ringwald in4 = FLOAT_SCALE(in[4], DCTII_8_SHIFT_IN); OI_ASSERT(VALID_INT32(in4)); 100*df25739fSMilanka Ringwald in5 = FLOAT_SCALE(in[5], DCTII_8_SHIFT_IN); OI_ASSERT(VALID_INT32(in5)); 101*df25739fSMilanka Ringwald in6 = FLOAT_SCALE(in[6], DCTII_8_SHIFT_IN); OI_ASSERT(VALID_INT32(in6)); 102*df25739fSMilanka Ringwald in7 = FLOAT_SCALE(in[7], DCTII_8_SHIFT_IN); OI_ASSERT(VALID_INT32(in7)); 103*df25739fSMilanka Ringwald 104*df25739fSMilanka Ringwald L00 = (in0 + in7); OI_ASSERT(VALID_INT32(L00)); 105*df25739fSMilanka Ringwald L01 = (in1 + in6); OI_ASSERT(VALID_INT32(L01)); 106*df25739fSMilanka Ringwald L02 = (in2 + in5); OI_ASSERT(VALID_INT32(L02)); 107*df25739fSMilanka Ringwald L03 = (in3 + in4); OI_ASSERT(VALID_INT32(L03)); 108*df25739fSMilanka Ringwald 109*df25739fSMilanka Ringwald L04 = (in3 - in4); OI_ASSERT(VALID_INT32(L04)); 110*df25739fSMilanka Ringwald L05 = (in2 - in5); OI_ASSERT(VALID_INT32(L05)); 111*df25739fSMilanka Ringwald L06 = (in1 - in6); OI_ASSERT(VALID_INT32(L06)); 112*df25739fSMilanka Ringwald L07 = (in0 - in7); OI_ASSERT(VALID_INT32(L07)); 113*df25739fSMilanka Ringwald 114*df25739fSMilanka Ringwald FLOAT_BUTTERFLY(L00, L03); 115*df25739fSMilanka Ringwald FLOAT_BUTTERFLY(L01, L02); 116*df25739fSMilanka Ringwald 117*df25739fSMilanka Ringwald L02 += L03; OI_ASSERT(VALID_INT32(L02)); 118*df25739fSMilanka Ringwald 119*df25739fSMilanka Ringwald L02 = FLOAT_MULT_DCT(AAN_C4_FLOAT, L02); OI_ASSERT(VALID_INT32(L02)); 120*df25739fSMilanka Ringwald 121*df25739fSMilanka Ringwald FLOAT_BUTTERFLY(L00, L01); 122*df25739fSMilanka Ringwald 123*df25739fSMilanka Ringwald out[0] = (float)FLOAT_SCALE(L00, DCTII_8_SHIFT_0); OI_ASSERT(VALID_INT16(out[0])); 124*df25739fSMilanka Ringwald out[4] = (float)FLOAT_SCALE(L01, DCTII_8_SHIFT_4); OI_ASSERT(VALID_INT16(out[4])); 125*df25739fSMilanka Ringwald 126*df25739fSMilanka Ringwald FLOAT_BUTTERFLY(L03, L02); 127*df25739fSMilanka Ringwald out[6] = (float)FLOAT_SCALE(L02, DCTII_8_SHIFT_6); OI_ASSERT(VALID_INT16(out[6])); 128*df25739fSMilanka Ringwald out[2] = (float)FLOAT_SCALE(L03, DCTII_8_SHIFT_2); OI_ASSERT(VALID_INT16(out[2])); 129*df25739fSMilanka Ringwald 130*df25739fSMilanka Ringwald L04 += L05; OI_ASSERT(VALID_INT32(L04)); 131*df25739fSMilanka Ringwald L05 += L06; OI_ASSERT(VALID_INT32(L05)); 132*df25739fSMilanka Ringwald L06 += L07; OI_ASSERT(VALID_INT32(L06)); 133*df25739fSMilanka Ringwald 134*df25739fSMilanka Ringwald L04/=2; 135*df25739fSMilanka Ringwald L05/=2; 136*df25739fSMilanka Ringwald L06/=2; 137*df25739fSMilanka Ringwald L07/=2; 138*df25739fSMilanka Ringwald 139*df25739fSMilanka Ringwald L05 = FLOAT_MULT_DCT(AAN_C4_FLOAT, L05); OI_ASSERT(VALID_INT32(L05)); 140*df25739fSMilanka Ringwald 141*df25739fSMilanka Ringwald L25 = L06 - L04; OI_ASSERT(VALID_INT32(L25)); 142*df25739fSMilanka Ringwald L25 = FLOAT_MULT_DCT(AAN_C6_FLOAT, L25); OI_ASSERT(VALID_INT32(L25)); 143*df25739fSMilanka Ringwald 144*df25739fSMilanka Ringwald L04 = FLOAT_MULT_DCT(AAN_Q0_FLOAT, L04); OI_ASSERT(VALID_INT32(L04)); 145*df25739fSMilanka Ringwald L04 -= L25; OI_ASSERT(VALID_INT32(L04)); 146*df25739fSMilanka Ringwald 147*df25739fSMilanka Ringwald L06 = FLOAT_MULT_DCT(AAN_Q1_FLOAT, L06); OI_ASSERT(VALID_INT32(L06)); 148*df25739fSMilanka Ringwald L06 -= L25; OI_ASSERT(VALID_INT32(L25)); 149*df25739fSMilanka Ringwald 150*df25739fSMilanka Ringwald FLOAT_BUTTERFLY(L07, L05); 151*df25739fSMilanka Ringwald 152*df25739fSMilanka Ringwald FLOAT_BUTTERFLY(L05, L04); 153*df25739fSMilanka Ringwald out[3] = (float)(FLOAT_SCALE(L04, DCTII_8_SHIFT_3-1)); OI_ASSERT(VALID_INT16(out[3])); 154*df25739fSMilanka Ringwald out[5] = (float)(FLOAT_SCALE(L05, DCTII_8_SHIFT_5-1)); OI_ASSERT(VALID_INT16(out[5])); 155*df25739fSMilanka Ringwald 156*df25739fSMilanka Ringwald FLOAT_BUTTERFLY(L07, L06); 157*df25739fSMilanka Ringwald out[7] = (float)(FLOAT_SCALE(L06, DCTII_8_SHIFT_7-1)); OI_ASSERT(VALID_INT16(out[7])); 158*df25739fSMilanka Ringwald out[1] = (float)(FLOAT_SCALE(L07, DCTII_8_SHIFT_1-1)); OI_ASSERT(VALID_INT16(out[1])); 159*df25739fSMilanka Ringwald } 160*df25739fSMilanka Ringwald #undef BUTTERFLY 161*df25739fSMilanka Ringwald #endif 162*df25739fSMilanka Ringwald 163*df25739fSMilanka Ringwald 164*df25739fSMilanka Ringwald /* 165*df25739fSMilanka Ringwald * This function calculates the AAN DCT. Its inputs are in S16.15 format, as 166*df25739fSMilanka Ringwald * returned by OI_SBC_Dequant. In practice, abs(in[x]) < 52429.0 / 1.38 167*df25739fSMilanka Ringwald * (1244918057 integer). The function it computes is an approximation to the array defined 168*df25739fSMilanka Ringwald * by: 169*df25739fSMilanka Ringwald * 170*df25739fSMilanka Ringwald * diag(aan_s) * AAN= C2 171*df25739fSMilanka Ringwald * 172*df25739fSMilanka Ringwald * or 173*df25739fSMilanka Ringwald * 174*df25739fSMilanka Ringwald * AAN = diag(1/aan_s) * C2 175*df25739fSMilanka Ringwald * 176*df25739fSMilanka Ringwald * where C2 is as it is defined in the comment at the head of this file, and 177*df25739fSMilanka Ringwald * 178*df25739fSMilanka Ringwald * aan_s[i] = aan_s = 1/(2*cos(i*pi/16)) with i = 1..7, aan_s[0] = 1; 179*df25739fSMilanka Ringwald * 180*df25739fSMilanka Ringwald * aan_s[i] = [ 1.000 0.510 0.541 0.601 0.707 0.900 1.307 2.563 ] 181*df25739fSMilanka Ringwald * 182*df25739fSMilanka Ringwald * The output ranges are shown as follows: 183*df25739fSMilanka Ringwald * 184*df25739fSMilanka Ringwald * Let Y[0..7] = AAN * X[0..7] 185*df25739fSMilanka Ringwald * 186*df25739fSMilanka Ringwald * Without loss of generality, assume the input vector X consists of elements 187*df25739fSMilanka Ringwald * between -1 and 1. The maximum possible value of a given output element occurs 188*df25739fSMilanka Ringwald * with some particular combination of input vector elements each of which is -1 189*df25739fSMilanka Ringwald * or 1. Consider the computation of Y[i]. Y[i] = sum t=0..7 of AAN[t,i]*X[i]. Y is 190*df25739fSMilanka Ringwald * maximized if the sign of X[i] matches the sign of AAN[t,i], ensuring a 191*df25739fSMilanka Ringwald * positive contribution to the sum. Equivalently, one may simply sum 192*df25739fSMilanka Ringwald * abs(AAN)[t,i] over t to get the maximum possible value of Y[i]. 193*df25739fSMilanka Ringwald * 194*df25739fSMilanka Ringwald * This yields approximately [8.00 10.05 9.66 8.52 8.00 5.70 4.00 2.00] 195*df25739fSMilanka Ringwald * 196*df25739fSMilanka Ringwald * Given the maximum magnitude sensible input value of +/-37992, this yields the 197*df25739fSMilanka Ringwald * following vector of maximum output magnitudes: 198*df25739fSMilanka Ringwald * 199*df25739fSMilanka Ringwald * [ 303936 381820 367003 323692 303936 216555 151968 75984 ] 200*df25739fSMilanka Ringwald * 201*df25739fSMilanka Ringwald * Ultimately, these values must fit into 16 bit signed integers, so they must 202*df25739fSMilanka Ringwald * be scaled. A non-uniform scaling helps maximize the kept precision. The 203*df25739fSMilanka Ringwald * relative number of extra bits of precision maintainable with respect to the 204*df25739fSMilanka Ringwald * largest value is given here: 205*df25739fSMilanka Ringwald * 206*df25739fSMilanka Ringwald * [ 0 0 0 0 0 0 1 2 ] 207*df25739fSMilanka Ringwald * 208*df25739fSMilanka Ringwald */ 209*df25739fSMilanka Ringwald PRIVATE void dct2_8(SBC_BUFFER_T * RESTRICT out, OI_INT32 const *RESTRICT in) 210*df25739fSMilanka Ringwald { 211*df25739fSMilanka Ringwald #define BUTTERFLY(x,y) x += y; y = x - (y<<1); 212*df25739fSMilanka Ringwald #define FIX_MULT_DCT(K, x) (MUL_32S_32S_HI(K,x)<<2) 213*df25739fSMilanka Ringwald 214*df25739fSMilanka Ringwald OI_INT32 L00,L01,L02,L03,L04,L05,L06,L07; 215*df25739fSMilanka Ringwald OI_INT32 L25; 216*df25739fSMilanka Ringwald 217*df25739fSMilanka Ringwald OI_INT32 in0,in1,in2,in3; 218*df25739fSMilanka Ringwald OI_INT32 in4,in5,in6,in7; 219*df25739fSMilanka Ringwald 220*df25739fSMilanka Ringwald #if DCTII_8_SHIFT_IN != 0 221*df25739fSMilanka Ringwald in0 = SCALE(in[0], DCTII_8_SHIFT_IN); 222*df25739fSMilanka Ringwald in1 = SCALE(in[1], DCTII_8_SHIFT_IN); 223*df25739fSMilanka Ringwald in2 = SCALE(in[2], DCTII_8_SHIFT_IN); 224*df25739fSMilanka Ringwald in3 = SCALE(in[3], DCTII_8_SHIFT_IN); 225*df25739fSMilanka Ringwald in4 = SCALE(in[4], DCTII_8_SHIFT_IN); 226*df25739fSMilanka Ringwald in5 = SCALE(in[5], DCTII_8_SHIFT_IN); 227*df25739fSMilanka Ringwald in6 = SCALE(in[6], DCTII_8_SHIFT_IN); 228*df25739fSMilanka Ringwald in7 = SCALE(in[7], DCTII_8_SHIFT_IN); 229*df25739fSMilanka Ringwald #else 230*df25739fSMilanka Ringwald in0 = in[0]; 231*df25739fSMilanka Ringwald in1 = in[1]; 232*df25739fSMilanka Ringwald in2 = in[2]; 233*df25739fSMilanka Ringwald in3 = in[3]; 234*df25739fSMilanka Ringwald in4 = in[4]; 235*df25739fSMilanka Ringwald in5 = in[5]; 236*df25739fSMilanka Ringwald in6 = in[6]; 237*df25739fSMilanka Ringwald in7 = in[7]; 238*df25739fSMilanka Ringwald #endif 239*df25739fSMilanka Ringwald 240*df25739fSMilanka Ringwald L00 = in0 + in7; 241*df25739fSMilanka Ringwald L01 = in1 + in6; 242*df25739fSMilanka Ringwald L02 = in2 + in5; 243*df25739fSMilanka Ringwald L03 = in3 + in4; 244*df25739fSMilanka Ringwald 245*df25739fSMilanka Ringwald L04 = in3 - in4; 246*df25739fSMilanka Ringwald L05 = in2 - in5; 247*df25739fSMilanka Ringwald L06 = in1 - in6; 248*df25739fSMilanka Ringwald L07 = in0 - in7; 249*df25739fSMilanka Ringwald 250*df25739fSMilanka Ringwald BUTTERFLY(L00, L03); 251*df25739fSMilanka Ringwald BUTTERFLY(L01, L02); 252*df25739fSMilanka Ringwald 253*df25739fSMilanka Ringwald L02 += L03; 254*df25739fSMilanka Ringwald 255*df25739fSMilanka Ringwald L02 = FIX_MULT_DCT(AAN_C4_FIX, L02); 256*df25739fSMilanka Ringwald 257*df25739fSMilanka Ringwald BUTTERFLY(L00, L01); 258*df25739fSMilanka Ringwald 259*df25739fSMilanka Ringwald out[0] = (OI_INT16)SCALE(L00, DCTII_8_SHIFT_0); 260*df25739fSMilanka Ringwald out[4] = (OI_INT16)SCALE(L01, DCTII_8_SHIFT_4); 261*df25739fSMilanka Ringwald 262*df25739fSMilanka Ringwald BUTTERFLY(L03, L02); 263*df25739fSMilanka Ringwald out[6] = (OI_INT16)SCALE(L02, DCTII_8_SHIFT_6); 264*df25739fSMilanka Ringwald out[2] = (OI_INT16)SCALE(L03, DCTII_8_SHIFT_2); 265*df25739fSMilanka Ringwald 266*df25739fSMilanka Ringwald L04 += L05; 267*df25739fSMilanka Ringwald L05 += L06; 268*df25739fSMilanka Ringwald L06 += L07; 269*df25739fSMilanka Ringwald 270*df25739fSMilanka Ringwald L04/=2; 271*df25739fSMilanka Ringwald L05/=2; 272*df25739fSMilanka Ringwald L06/=2; 273*df25739fSMilanka Ringwald L07/=2; 274*df25739fSMilanka Ringwald 275*df25739fSMilanka Ringwald L05 = FIX_MULT_DCT(AAN_C4_FIX, L05); 276*df25739fSMilanka Ringwald 277*df25739fSMilanka Ringwald L25 = L06 - L04; 278*df25739fSMilanka Ringwald L25 = FIX_MULT_DCT(AAN_C6_FIX, L25); 279*df25739fSMilanka Ringwald 280*df25739fSMilanka Ringwald L04 = FIX_MULT_DCT(AAN_Q0_FIX, L04); 281*df25739fSMilanka Ringwald L04 -= L25; 282*df25739fSMilanka Ringwald 283*df25739fSMilanka Ringwald L06 = FIX_MULT_DCT(AAN_Q1_FIX, L06); 284*df25739fSMilanka Ringwald L06 -= L25; 285*df25739fSMilanka Ringwald 286*df25739fSMilanka Ringwald BUTTERFLY(L07, L05); 287*df25739fSMilanka Ringwald 288*df25739fSMilanka Ringwald BUTTERFLY(L05, L04); 289*df25739fSMilanka Ringwald out[3] = (OI_INT16)SCALE(L04, DCTII_8_SHIFT_3-1); 290*df25739fSMilanka Ringwald out[5] = (OI_INT16)SCALE(L05, DCTII_8_SHIFT_5-1); 291*df25739fSMilanka Ringwald 292*df25739fSMilanka Ringwald BUTTERFLY(L07, L06); 293*df25739fSMilanka Ringwald out[7] = (OI_INT16)SCALE(L06, DCTII_8_SHIFT_7-1); 294*df25739fSMilanka Ringwald out[1] = (OI_INT16)SCALE(L07, DCTII_8_SHIFT_1-1); 295*df25739fSMilanka Ringwald #undef BUTTERFLY 296*df25739fSMilanka Ringwald 297*df25739fSMilanka Ringwald #ifdef DEBUG_DCT 298*df25739fSMilanka Ringwald { 299*df25739fSMilanka Ringwald float float_out[8]; 300*df25739fSMilanka Ringwald float_dct2_8(float_out, in); 301*df25739fSMilanka Ringwald } 302*df25739fSMilanka Ringwald #endif 303*df25739fSMilanka Ringwald } 304*df25739fSMilanka Ringwald 305*df25739fSMilanka Ringwald /**@}*/ 306