1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * Copyright (c) 2001, 2002 Fabrice Bellard 3cabdff1aSopenharmony_ci * 4cabdff1aSopenharmony_ci * This file is part of FFmpeg. 5cabdff1aSopenharmony_ci * 6cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 7cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 8cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 9cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 10cabdff1aSopenharmony_ci * 11cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 12cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 13cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14cabdff1aSopenharmony_ci * Lesser General Public License for more details. 15cabdff1aSopenharmony_ci * 16cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 17cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 18cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 19cabdff1aSopenharmony_ci */ 20cabdff1aSopenharmony_ci 21cabdff1aSopenharmony_ci#include <stdint.h> 22cabdff1aSopenharmony_ci 23cabdff1aSopenharmony_ci#include "libavutil/attributes.h" 24cabdff1aSopenharmony_ci#include "libavutil/mem_internal.h" 25cabdff1aSopenharmony_ci#include "libavutil/thread.h" 26cabdff1aSopenharmony_ci 27cabdff1aSopenharmony_ci#include "dct32.h" 28cabdff1aSopenharmony_ci#include "mathops.h" 29cabdff1aSopenharmony_ci#include "mpegaudiodsp.h" 30cabdff1aSopenharmony_ci#include "mpegaudio.h" 31cabdff1aSopenharmony_ci 32cabdff1aSopenharmony_ci#if USE_FLOATS 33cabdff1aSopenharmony_ci#define RENAME(n) n##_float 34cabdff1aSopenharmony_ci 35cabdff1aSopenharmony_cistatic inline float round_sample(float *sum) 36cabdff1aSopenharmony_ci{ 37cabdff1aSopenharmony_ci float sum1=*sum; 38cabdff1aSopenharmony_ci *sum = 0; 39cabdff1aSopenharmony_ci return sum1; 40cabdff1aSopenharmony_ci} 41cabdff1aSopenharmony_ci 42cabdff1aSopenharmony_ci#define MACS(rt, ra, rb) rt+=(ra)*(rb) 43cabdff1aSopenharmony_ci#define MULS(ra, rb) ((ra)*(rb)) 44cabdff1aSopenharmony_ci#define MULH3(x, y, s) ((s)*(y)*(x)) 45cabdff1aSopenharmony_ci#define MLSS(rt, ra, rb) rt-=(ra)*(rb) 46cabdff1aSopenharmony_ci#define MULLx(x, y, s) ((y)*(x)) 47cabdff1aSopenharmony_ci#define FIXHR(x) ((float)(x)) 48cabdff1aSopenharmony_ci#define FIXR(x) ((float)(x)) 49cabdff1aSopenharmony_ci#define SHR(a,b) ((a)*(1.0f/(1<<(b)))) 50cabdff1aSopenharmony_ci 51cabdff1aSopenharmony_ci#else 52cabdff1aSopenharmony_ci 53cabdff1aSopenharmony_ci#define RENAME(n) n##_fixed 54cabdff1aSopenharmony_ci#define OUT_SHIFT (WFRAC_BITS + FRAC_BITS - 15) 55cabdff1aSopenharmony_ci 56cabdff1aSopenharmony_cistatic inline int round_sample(int64_t *sum) 57cabdff1aSopenharmony_ci{ 58cabdff1aSopenharmony_ci int sum1; 59cabdff1aSopenharmony_ci sum1 = (int)((*sum) >> OUT_SHIFT); 60cabdff1aSopenharmony_ci *sum &= (1<<OUT_SHIFT)-1; 61cabdff1aSopenharmony_ci return av_clip_int16(sum1); 62cabdff1aSopenharmony_ci} 63cabdff1aSopenharmony_ci 64cabdff1aSopenharmony_ci# define MULS(ra, rb) MUL64(ra, rb) 65cabdff1aSopenharmony_ci# define MACS(rt, ra, rb) MAC64(rt, ra, rb) 66cabdff1aSopenharmony_ci# define MLSS(rt, ra, rb) MLS64(rt, ra, rb) 67cabdff1aSopenharmony_ci# define MULH3(x, y, s) MULH((s)*(x), y) 68cabdff1aSopenharmony_ci# define MULLx(x, y, s) MULL((int)(x),(y),s) 69cabdff1aSopenharmony_ci# define SHR(a,b) (((int)(a))>>(b)) 70cabdff1aSopenharmony_ci# define FIXR(a) ((int)((a) * FRAC_ONE + 0.5)) 71cabdff1aSopenharmony_ci# define FIXHR(a) ((int)((a) * (1LL<<32) + 0.5)) 72cabdff1aSopenharmony_ci#endif 73cabdff1aSopenharmony_ci 74cabdff1aSopenharmony_ci/** Window for MDCT. Actually only the elements in [0,17] and 75cabdff1aSopenharmony_ci [MDCT_BUF_SIZE/2, MDCT_BUF_SIZE/2 + 17] are actually used. The rest 76cabdff1aSopenharmony_ci is just to preserve alignment for SIMD implementations. 77cabdff1aSopenharmony_ci*/ 78cabdff1aSopenharmony_ciDECLARE_ALIGNED(16, INTFLOAT, RENAME(ff_mdct_win))[8][MDCT_BUF_SIZE]; 79cabdff1aSopenharmony_ci 80cabdff1aSopenharmony_ciDECLARE_ALIGNED(16, MPA_INT, RENAME(ff_mpa_synth_window))[512+256]; 81cabdff1aSopenharmony_ci 82cabdff1aSopenharmony_ci#define SUM8(op, sum, w, p) \ 83cabdff1aSopenharmony_ci{ \ 84cabdff1aSopenharmony_ci op(sum, (w)[0 * 64], (p)[0 * 64]); \ 85cabdff1aSopenharmony_ci op(sum, (w)[1 * 64], (p)[1 * 64]); \ 86cabdff1aSopenharmony_ci op(sum, (w)[2 * 64], (p)[2 * 64]); \ 87cabdff1aSopenharmony_ci op(sum, (w)[3 * 64], (p)[3 * 64]); \ 88cabdff1aSopenharmony_ci op(sum, (w)[4 * 64], (p)[4 * 64]); \ 89cabdff1aSopenharmony_ci op(sum, (w)[5 * 64], (p)[5 * 64]); \ 90cabdff1aSopenharmony_ci op(sum, (w)[6 * 64], (p)[6 * 64]); \ 91cabdff1aSopenharmony_ci op(sum, (w)[7 * 64], (p)[7 * 64]); \ 92cabdff1aSopenharmony_ci} 93cabdff1aSopenharmony_ci 94cabdff1aSopenharmony_ci#define SUM8P2(sum1, op1, sum2, op2, w1, w2, p) \ 95cabdff1aSopenharmony_ci{ \ 96cabdff1aSopenharmony_ci INTFLOAT tmp;\ 97cabdff1aSopenharmony_ci tmp = p[0 * 64];\ 98cabdff1aSopenharmony_ci op1(sum1, (w1)[0 * 64], tmp);\ 99cabdff1aSopenharmony_ci op2(sum2, (w2)[0 * 64], tmp);\ 100cabdff1aSopenharmony_ci tmp = p[1 * 64];\ 101cabdff1aSopenharmony_ci op1(sum1, (w1)[1 * 64], tmp);\ 102cabdff1aSopenharmony_ci op2(sum2, (w2)[1 * 64], tmp);\ 103cabdff1aSopenharmony_ci tmp = p[2 * 64];\ 104cabdff1aSopenharmony_ci op1(sum1, (w1)[2 * 64], tmp);\ 105cabdff1aSopenharmony_ci op2(sum2, (w2)[2 * 64], tmp);\ 106cabdff1aSopenharmony_ci tmp = p[3 * 64];\ 107cabdff1aSopenharmony_ci op1(sum1, (w1)[3 * 64], tmp);\ 108cabdff1aSopenharmony_ci op2(sum2, (w2)[3 * 64], tmp);\ 109cabdff1aSopenharmony_ci tmp = p[4 * 64];\ 110cabdff1aSopenharmony_ci op1(sum1, (w1)[4 * 64], tmp);\ 111cabdff1aSopenharmony_ci op2(sum2, (w2)[4 * 64], tmp);\ 112cabdff1aSopenharmony_ci tmp = p[5 * 64];\ 113cabdff1aSopenharmony_ci op1(sum1, (w1)[5 * 64], tmp);\ 114cabdff1aSopenharmony_ci op2(sum2, (w2)[5 * 64], tmp);\ 115cabdff1aSopenharmony_ci tmp = p[6 * 64];\ 116cabdff1aSopenharmony_ci op1(sum1, (w1)[6 * 64], tmp);\ 117cabdff1aSopenharmony_ci op2(sum2, (w2)[6 * 64], tmp);\ 118cabdff1aSopenharmony_ci tmp = p[7 * 64];\ 119cabdff1aSopenharmony_ci op1(sum1, (w1)[7 * 64], tmp);\ 120cabdff1aSopenharmony_ci op2(sum2, (w2)[7 * 64], tmp);\ 121cabdff1aSopenharmony_ci} 122cabdff1aSopenharmony_ci 123cabdff1aSopenharmony_civoid RENAME(ff_mpadsp_apply_window)(MPA_INT *synth_buf, MPA_INT *window, 124cabdff1aSopenharmony_ci int *dither_state, OUT_INT *samples, 125cabdff1aSopenharmony_ci ptrdiff_t incr) 126cabdff1aSopenharmony_ci{ 127cabdff1aSopenharmony_ci register const MPA_INT *w, *w2, *p; 128cabdff1aSopenharmony_ci int j; 129cabdff1aSopenharmony_ci OUT_INT *samples2; 130cabdff1aSopenharmony_ci#if USE_FLOATS 131cabdff1aSopenharmony_ci float sum, sum2; 132cabdff1aSopenharmony_ci#else 133cabdff1aSopenharmony_ci int64_t sum, sum2; 134cabdff1aSopenharmony_ci#endif 135cabdff1aSopenharmony_ci 136cabdff1aSopenharmony_ci /* copy to avoid wrap */ 137cabdff1aSopenharmony_ci memcpy(synth_buf + 512, synth_buf, 32 * sizeof(*synth_buf)); 138cabdff1aSopenharmony_ci 139cabdff1aSopenharmony_ci samples2 = samples + 31 * incr; 140cabdff1aSopenharmony_ci w = window; 141cabdff1aSopenharmony_ci w2 = window + 31; 142cabdff1aSopenharmony_ci 143cabdff1aSopenharmony_ci sum = *dither_state; 144cabdff1aSopenharmony_ci p = synth_buf + 16; 145cabdff1aSopenharmony_ci SUM8(MACS, sum, w, p); 146cabdff1aSopenharmony_ci p = synth_buf + 48; 147cabdff1aSopenharmony_ci SUM8(MLSS, sum, w + 32, p); 148cabdff1aSopenharmony_ci *samples = round_sample(&sum); 149cabdff1aSopenharmony_ci samples += incr; 150cabdff1aSopenharmony_ci w++; 151cabdff1aSopenharmony_ci 152cabdff1aSopenharmony_ci /* we calculate two samples at the same time to avoid one memory 153cabdff1aSopenharmony_ci access per two sample */ 154cabdff1aSopenharmony_ci for(j=1;j<16;j++) { 155cabdff1aSopenharmony_ci sum2 = 0; 156cabdff1aSopenharmony_ci p = synth_buf + 16 + j; 157cabdff1aSopenharmony_ci SUM8P2(sum, MACS, sum2, MLSS, w, w2, p); 158cabdff1aSopenharmony_ci p = synth_buf + 48 - j; 159cabdff1aSopenharmony_ci SUM8P2(sum, MLSS, sum2, MLSS, w + 32, w2 + 32, p); 160cabdff1aSopenharmony_ci 161cabdff1aSopenharmony_ci *samples = round_sample(&sum); 162cabdff1aSopenharmony_ci samples += incr; 163cabdff1aSopenharmony_ci sum += sum2; 164cabdff1aSopenharmony_ci *samples2 = round_sample(&sum); 165cabdff1aSopenharmony_ci samples2 -= incr; 166cabdff1aSopenharmony_ci w++; 167cabdff1aSopenharmony_ci w2--; 168cabdff1aSopenharmony_ci } 169cabdff1aSopenharmony_ci 170cabdff1aSopenharmony_ci p = synth_buf + 32; 171cabdff1aSopenharmony_ci SUM8(MLSS, sum, w + 32, p); 172cabdff1aSopenharmony_ci *samples = round_sample(&sum); 173cabdff1aSopenharmony_ci *dither_state= sum; 174cabdff1aSopenharmony_ci} 175cabdff1aSopenharmony_ci 176cabdff1aSopenharmony_ci/* 32 sub band synthesis filter. Input: 32 sub band samples, Output: 177cabdff1aSopenharmony_ci 32 samples. */ 178cabdff1aSopenharmony_civoid RENAME(ff_mpa_synth_filter)(MPADSPContext *s, MPA_INT *synth_buf_ptr, 179cabdff1aSopenharmony_ci int *synth_buf_offset, 180cabdff1aSopenharmony_ci MPA_INT *window, int *dither_state, 181cabdff1aSopenharmony_ci OUT_INT *samples, ptrdiff_t incr, 182cabdff1aSopenharmony_ci MPA_INT *sb_samples) 183cabdff1aSopenharmony_ci{ 184cabdff1aSopenharmony_ci MPA_INT *synth_buf; 185cabdff1aSopenharmony_ci int offset; 186cabdff1aSopenharmony_ci 187cabdff1aSopenharmony_ci offset = *synth_buf_offset; 188cabdff1aSopenharmony_ci synth_buf = synth_buf_ptr + offset; 189cabdff1aSopenharmony_ci 190cabdff1aSopenharmony_ci s->RENAME(dct32)(synth_buf, sb_samples); 191cabdff1aSopenharmony_ci s->RENAME(apply_window)(synth_buf, window, dither_state, samples, incr); 192cabdff1aSopenharmony_ci 193cabdff1aSopenharmony_ci offset = (offset - 32) & 511; 194cabdff1aSopenharmony_ci *synth_buf_offset = offset; 195cabdff1aSopenharmony_ci} 196cabdff1aSopenharmony_ci 197cabdff1aSopenharmony_cistatic av_cold void mpa_synth_init(MPA_INT *window) 198cabdff1aSopenharmony_ci{ 199cabdff1aSopenharmony_ci int i, j; 200cabdff1aSopenharmony_ci 201cabdff1aSopenharmony_ci /* max = 18760, max sum over all 16 coefs : 44736 */ 202cabdff1aSopenharmony_ci for(i=0;i<257;i++) { 203cabdff1aSopenharmony_ci INTFLOAT v; 204cabdff1aSopenharmony_ci v = ff_mpa_enwindow[i]; 205cabdff1aSopenharmony_ci#if USE_FLOATS 206cabdff1aSopenharmony_ci v *= 1.0 / (1LL<<(16 + FRAC_BITS)); 207cabdff1aSopenharmony_ci#endif 208cabdff1aSopenharmony_ci window[i] = v; 209cabdff1aSopenharmony_ci if ((i & 63) != 0) 210cabdff1aSopenharmony_ci v = -v; 211cabdff1aSopenharmony_ci if (i != 0) 212cabdff1aSopenharmony_ci window[512 - i] = v; 213cabdff1aSopenharmony_ci } 214cabdff1aSopenharmony_ci 215cabdff1aSopenharmony_ci 216cabdff1aSopenharmony_ci // Needed for avoiding shuffles in ASM implementations 217cabdff1aSopenharmony_ci for(i=0; i < 8; i++) 218cabdff1aSopenharmony_ci for(j=0; j < 16; j++) 219cabdff1aSopenharmony_ci window[512+16*i+j] = window[64*i+32-j]; 220cabdff1aSopenharmony_ci 221cabdff1aSopenharmony_ci for(i=0; i < 8; i++) 222cabdff1aSopenharmony_ci for(j=0; j < 16; j++) 223cabdff1aSopenharmony_ci window[512+128+16*i+j] = window[64*i+48-j]; 224cabdff1aSopenharmony_ci} 225cabdff1aSopenharmony_ci 226cabdff1aSopenharmony_cistatic av_cold void mpa_synth_window_init(void) 227cabdff1aSopenharmony_ci{ 228cabdff1aSopenharmony_ci mpa_synth_init(RENAME(ff_mpa_synth_window)); 229cabdff1aSopenharmony_ci} 230cabdff1aSopenharmony_ci 231cabdff1aSopenharmony_ciav_cold void RENAME(ff_mpa_synth_init)(void) 232cabdff1aSopenharmony_ci{ 233cabdff1aSopenharmony_ci static AVOnce init_static_once = AV_ONCE_INIT; 234cabdff1aSopenharmony_ci ff_thread_once(&init_static_once, mpa_synth_window_init); 235cabdff1aSopenharmony_ci} 236cabdff1aSopenharmony_ci 237cabdff1aSopenharmony_ci/* cos(pi*i/18) */ 238cabdff1aSopenharmony_ci#define C1 FIXHR(0.98480775301220805936/2) 239cabdff1aSopenharmony_ci#define C2 FIXHR(0.93969262078590838405/2) 240cabdff1aSopenharmony_ci#define C3 FIXHR(0.86602540378443864676/2) 241cabdff1aSopenharmony_ci#define C4 FIXHR(0.76604444311897803520/2) 242cabdff1aSopenharmony_ci#define C5 FIXHR(0.64278760968653932632/2) 243cabdff1aSopenharmony_ci#define C6 FIXHR(0.5/2) 244cabdff1aSopenharmony_ci#define C7 FIXHR(0.34202014332566873304/2) 245cabdff1aSopenharmony_ci#define C8 FIXHR(0.17364817766693034885/2) 246cabdff1aSopenharmony_ci 247cabdff1aSopenharmony_ci/* 0.5 / cos(pi*(2*i+1)/36) */ 248cabdff1aSopenharmony_cistatic const INTFLOAT icos36[9] = { 249cabdff1aSopenharmony_ci FIXR(0.50190991877167369479), 250cabdff1aSopenharmony_ci FIXR(0.51763809020504152469), //0 251cabdff1aSopenharmony_ci FIXR(0.55168895948124587824), 252cabdff1aSopenharmony_ci FIXR(0.61038729438072803416), 253cabdff1aSopenharmony_ci FIXR(0.70710678118654752439), //1 254cabdff1aSopenharmony_ci FIXR(0.87172339781054900991), 255cabdff1aSopenharmony_ci FIXR(1.18310079157624925896), 256cabdff1aSopenharmony_ci FIXR(1.93185165257813657349), //2 257cabdff1aSopenharmony_ci FIXR(5.73685662283492756461), 258cabdff1aSopenharmony_ci}; 259cabdff1aSopenharmony_ci 260cabdff1aSopenharmony_ci/* 0.5 / cos(pi*(2*i+1)/36) */ 261cabdff1aSopenharmony_cistatic const INTFLOAT icos36h[9] = { 262cabdff1aSopenharmony_ci FIXHR(0.50190991877167369479/2), 263cabdff1aSopenharmony_ci FIXHR(0.51763809020504152469/2), //0 264cabdff1aSopenharmony_ci FIXHR(0.55168895948124587824/2), 265cabdff1aSopenharmony_ci FIXHR(0.61038729438072803416/2), 266cabdff1aSopenharmony_ci FIXHR(0.70710678118654752439/2), //1 267cabdff1aSopenharmony_ci FIXHR(0.87172339781054900991/2), 268cabdff1aSopenharmony_ci FIXHR(1.18310079157624925896/4), 269cabdff1aSopenharmony_ci FIXHR(1.93185165257813657349/4), //2 270cabdff1aSopenharmony_ci// FIXHR(5.73685662283492756461), 271cabdff1aSopenharmony_ci}; 272cabdff1aSopenharmony_ci 273cabdff1aSopenharmony_ci/* using Lee like decomposition followed by hand coded 9 points DCT */ 274cabdff1aSopenharmony_cistatic void imdct36(INTFLOAT *out, INTFLOAT *buf, SUINTFLOAT *in, INTFLOAT *win) 275cabdff1aSopenharmony_ci{ 276cabdff1aSopenharmony_ci int i, j; 277cabdff1aSopenharmony_ci SUINTFLOAT t0, t1, t2, t3, s0, s1, s2, s3; 278cabdff1aSopenharmony_ci SUINTFLOAT tmp[18], *tmp1, *in1; 279cabdff1aSopenharmony_ci 280cabdff1aSopenharmony_ci for (i = 17; i >= 1; i--) 281cabdff1aSopenharmony_ci in[i] += in[i-1]; 282cabdff1aSopenharmony_ci for (i = 17; i >= 3; i -= 2) 283cabdff1aSopenharmony_ci in[i] += in[i-2]; 284cabdff1aSopenharmony_ci 285cabdff1aSopenharmony_ci for (j = 0; j < 2; j++) { 286cabdff1aSopenharmony_ci tmp1 = tmp + j; 287cabdff1aSopenharmony_ci in1 = in + j; 288cabdff1aSopenharmony_ci 289cabdff1aSopenharmony_ci t2 = in1[2*4] + in1[2*8] - in1[2*2]; 290cabdff1aSopenharmony_ci 291cabdff1aSopenharmony_ci t3 = in1[2*0] + SHR(in1[2*6],1); 292cabdff1aSopenharmony_ci t1 = in1[2*0] - in1[2*6]; 293cabdff1aSopenharmony_ci tmp1[ 6] = t1 - SHR(t2,1); 294cabdff1aSopenharmony_ci tmp1[16] = t1 + t2; 295cabdff1aSopenharmony_ci 296cabdff1aSopenharmony_ci t0 = MULH3(in1[2*2] + in1[2*4] , C2, 2); 297cabdff1aSopenharmony_ci t1 = MULH3(in1[2*4] - in1[2*8] , -2*C8, 1); 298cabdff1aSopenharmony_ci t2 = MULH3(in1[2*2] + in1[2*8] , -C4, 2); 299cabdff1aSopenharmony_ci 300cabdff1aSopenharmony_ci tmp1[10] = t3 - t0 - t2; 301cabdff1aSopenharmony_ci tmp1[ 2] = t3 + t0 + t1; 302cabdff1aSopenharmony_ci tmp1[14] = t3 + t2 - t1; 303cabdff1aSopenharmony_ci 304cabdff1aSopenharmony_ci tmp1[ 4] = MULH3(in1[2*5] + in1[2*7] - in1[2*1], -C3, 2); 305cabdff1aSopenharmony_ci t2 = MULH3(in1[2*1] + in1[2*5], C1, 2); 306cabdff1aSopenharmony_ci t3 = MULH3(in1[2*5] - in1[2*7], -2*C7, 1); 307cabdff1aSopenharmony_ci t0 = MULH3(in1[2*3], C3, 2); 308cabdff1aSopenharmony_ci 309cabdff1aSopenharmony_ci t1 = MULH3(in1[2*1] + in1[2*7], -C5, 2); 310cabdff1aSopenharmony_ci 311cabdff1aSopenharmony_ci tmp1[ 0] = t2 + t3 + t0; 312cabdff1aSopenharmony_ci tmp1[12] = t2 + t1 - t0; 313cabdff1aSopenharmony_ci tmp1[ 8] = t3 - t1 - t0; 314cabdff1aSopenharmony_ci } 315cabdff1aSopenharmony_ci 316cabdff1aSopenharmony_ci i = 0; 317cabdff1aSopenharmony_ci for (j = 0; j < 4; j++) { 318cabdff1aSopenharmony_ci t0 = tmp[i]; 319cabdff1aSopenharmony_ci t1 = tmp[i + 2]; 320cabdff1aSopenharmony_ci s0 = t1 + t0; 321cabdff1aSopenharmony_ci s2 = t1 - t0; 322cabdff1aSopenharmony_ci 323cabdff1aSopenharmony_ci t2 = tmp[i + 1]; 324cabdff1aSopenharmony_ci t3 = tmp[i + 3]; 325cabdff1aSopenharmony_ci s1 = MULH3(t3 + t2, icos36h[ j], 2); 326cabdff1aSopenharmony_ci s3 = MULLx(t3 - t2, icos36 [8 - j], FRAC_BITS); 327cabdff1aSopenharmony_ci 328cabdff1aSopenharmony_ci t0 = s0 + s1; 329cabdff1aSopenharmony_ci t1 = s0 - s1; 330cabdff1aSopenharmony_ci out[(9 + j) * SBLIMIT] = MULH3(t1, win[ 9 + j], 1) + buf[4*(9 + j)]; 331cabdff1aSopenharmony_ci out[(8 - j) * SBLIMIT] = MULH3(t1, win[ 8 - j], 1) + buf[4*(8 - j)]; 332cabdff1aSopenharmony_ci buf[4 * ( 9 + j )] = MULH3(t0, win[MDCT_BUF_SIZE/2 + 9 + j], 1); 333cabdff1aSopenharmony_ci buf[4 * ( 8 - j )] = MULH3(t0, win[MDCT_BUF_SIZE/2 + 8 - j], 1); 334cabdff1aSopenharmony_ci 335cabdff1aSopenharmony_ci t0 = s2 + s3; 336cabdff1aSopenharmony_ci t1 = s2 - s3; 337cabdff1aSopenharmony_ci out[(9 + 8 - j) * SBLIMIT] = MULH3(t1, win[ 9 + 8 - j], 1) + buf[4*(9 + 8 - j)]; 338cabdff1aSopenharmony_ci out[ j * SBLIMIT] = MULH3(t1, win[ j], 1) + buf[4*( j)]; 339cabdff1aSopenharmony_ci buf[4 * ( 9 + 8 - j )] = MULH3(t0, win[MDCT_BUF_SIZE/2 + 9 + 8 - j], 1); 340cabdff1aSopenharmony_ci buf[4 * ( j )] = MULH3(t0, win[MDCT_BUF_SIZE/2 + j], 1); 341cabdff1aSopenharmony_ci i += 4; 342cabdff1aSopenharmony_ci } 343cabdff1aSopenharmony_ci 344cabdff1aSopenharmony_ci s0 = tmp[16]; 345cabdff1aSopenharmony_ci s1 = MULH3(tmp[17], icos36h[4], 2); 346cabdff1aSopenharmony_ci t0 = s0 + s1; 347cabdff1aSopenharmony_ci t1 = s0 - s1; 348cabdff1aSopenharmony_ci out[(9 + 4) * SBLIMIT] = MULH3(t1, win[ 9 + 4], 1) + buf[4*(9 + 4)]; 349cabdff1aSopenharmony_ci out[(8 - 4) * SBLIMIT] = MULH3(t1, win[ 8 - 4], 1) + buf[4*(8 - 4)]; 350cabdff1aSopenharmony_ci buf[4 * ( 9 + 4 )] = MULH3(t0, win[MDCT_BUF_SIZE/2 + 9 + 4], 1); 351cabdff1aSopenharmony_ci buf[4 * ( 8 - 4 )] = MULH3(t0, win[MDCT_BUF_SIZE/2 + 8 - 4], 1); 352cabdff1aSopenharmony_ci} 353cabdff1aSopenharmony_ci 354cabdff1aSopenharmony_civoid RENAME(ff_imdct36_blocks)(INTFLOAT *out, INTFLOAT *buf, INTFLOAT *in, 355cabdff1aSopenharmony_ci int count, int switch_point, int block_type) 356cabdff1aSopenharmony_ci{ 357cabdff1aSopenharmony_ci int j; 358cabdff1aSopenharmony_ci for (j=0 ; j < count; j++) { 359cabdff1aSopenharmony_ci /* apply window & overlap with previous buffer */ 360cabdff1aSopenharmony_ci 361cabdff1aSopenharmony_ci /* select window */ 362cabdff1aSopenharmony_ci int win_idx = (switch_point && j < 2) ? 0 : block_type; 363cabdff1aSopenharmony_ci INTFLOAT *win = RENAME(ff_mdct_win)[win_idx + (4 & -(j & 1))]; 364cabdff1aSopenharmony_ci 365cabdff1aSopenharmony_ci imdct36(out, buf, in, win); 366cabdff1aSopenharmony_ci 367cabdff1aSopenharmony_ci in += 18; 368cabdff1aSopenharmony_ci buf += ((j&3) != 3 ? 1 : (72-3)); 369cabdff1aSopenharmony_ci out++; 370cabdff1aSopenharmony_ci } 371cabdff1aSopenharmony_ci} 372cabdff1aSopenharmony_ci 373