static inline void dct_init(DCTContext **d, int nbits, enum DCTTransformType trans) { #if AVFFT *d = av_dct_init(nbits, trans); #else ff_dct_init(*d, nbits, trans); #endif }
DCTContext *av_dct_init(int nbits, int inverse) { DCTContext *s = av_malloc(sizeof(*s)); if (s) ff_dct_init(s, nbits, inverse); return s; }
DCTContext *av_dct_init(int nbits, enum DCTTransformType inverse) { DCTContext *s = av_malloc(sizeof(*s)); if (s && ff_dct_init(s, nbits, inverse)) av_freep(&s); return s; }
void ff_mpadsp_init(MPADSPContext *s) { DCTContext dct; ff_dct_init(&dct, 5, DCT_II); ff_init_mpadsp_tabs_float(); ff_init_mpadsp_tabs_fixed(); s->apply_window_float = ff_mpadsp_apply_window_float; s->apply_window_fixed = ff_mpadsp_apply_window_fixed; s->dct32_float = dct.dct32; s->dct32_fixed = ff_dct32_fixed; s->imdct36_blocks_float = ff_imdct36_blocks_float; s->imdct36_blocks_fixed = ff_imdct36_blocks_fixed; if (ARCH_ARM) ff_mpadsp_init_arm(s); if (ARCH_X86) ff_mpadsp_init_x86(s); if (HAVE_ALTIVEC) ff_mpadsp_init_altivec(s); if (HAVE_MIPSFPU) ff_mpadsp_init_mipsfpu(s); if (HAVE_MIPSDSPR1) ff_mpadsp_init_mipsdspr1(s); }
void ff_mpadsp_init(MPADSPContext *s) { DCTContext dct; ff_dct_init(&dct, 5, DCT_II); ff_init_mpadsp_tabs_float(); ff_init_mpadsp_tabs_fixed(); s->apply_window_float = ff_mpadsp_apply_window_float; s->apply_window_fixed = ff_mpadsp_apply_window_fixed; s->dct32_float = dct.dct32; s->dct32_fixed = ff_dct32_fixed; s->imdct36_blocks_float = ff_imdct36_blocks_float; s->imdct36_blocks_fixed = ff_imdct36_blocks_fixed; if (ARCH_ARM) ff_mpadsp_init_arm(s); if (HAVE_MMX) ff_mpadsp_init_mmx(s); //if (HAVE_ALTIVEC) ff_mpadsp_init_altivec(s); #ifdef XENON ff_mpadsp_init_altivec(s); #endif }
av_cold void ff_mpadsp_init(MPADSPContext *s) { DCTContext dct; ff_dct_init(&dct, 5, DCT_II); ff_init_mpadsp_tabs_float(); ff_init_mpadsp_tabs_fixed(); s->apply_window_float = ff_mpadsp_apply_window_float; s->apply_window_fixed = ff_mpadsp_apply_window_fixed; s->dct32_float = dct.dct32; s->dct32_fixed = ff_dct32_fixed; s->imdct36_blocks_float = ff_imdct36_blocks_float; s->imdct36_blocks_fixed = ff_imdct36_blocks_fixed; #if (ARCH_AARCH64 == 1) if (ARCH_AARCH64) ff_mpadsp_init_aarch64(s); #endif #if (ARCH_ARM == 1) if (ARCH_ARM) ff_mpadsp_init_arm(s); #endif #if (ARCH_PPC == 1) if (ARCH_PPC) ff_mpadsp_init_ppc(s); #endif #if (ARCH_X86 == 1) if (ARCH_X86) ff_mpadsp_init_x86(s); #endif #if defined(ARCH_MIPSFPU) && (ARCH_MIPSFPU == 1) if (HAVE_MIPSFPU) ff_mpadsp_init_mipsfpu(s); #endif #if defined(ARCH_MIPSSDPR1) && (ARCH_MIPSDSPR1 == 1) if (HAVE_MIPSDSPR1) ff_mpadsp_init_mipsdspr1(s); #endif }
static av_cold int decode_init(AVCodecContext *avctx) { BinkAudioContext *s = avctx->priv_data; int sample_rate = avctx->sample_rate; int sample_rate_half; int i; int frame_len_bits; /* determine frame length */ if (avctx->sample_rate < 22050) { frame_len_bits = 9; } else if (avctx->sample_rate < 44100) { frame_len_bits = 10; } else { frame_len_bits = 11; } if (avctx->channels > MAX_CHANNELS) { av_log(avctx, AV_LOG_ERROR, "too many channels: %d\n", avctx->channels); return -1; } avctx->channel_layout = avctx->channels == 1 ? AV_CH_LAYOUT_MONO : AV_CH_LAYOUT_STEREO; s->version_b = avctx->extradata && avctx->extradata[3] == 'b'; if (avctx->codec->id == AV_CODEC_ID_BINKAUDIO_RDFT) { // audio is already interleaved for the RDFT format variant avctx->sample_fmt = AV_SAMPLE_FMT_FLT; sample_rate *= avctx->channels; s->channels = 1; if (!s->version_b) frame_len_bits += av_log2(avctx->channels); } else { s->channels = avctx->channels; avctx->sample_fmt = AV_SAMPLE_FMT_FLTP; } s->frame_len = 1 << frame_len_bits; s->overlap_len = s->frame_len / 16; s->block_size = (s->frame_len - s->overlap_len) * s->channels; sample_rate_half = (sample_rate + 1) / 2; if (avctx->codec->id == AV_CODEC_ID_BINKAUDIO_RDFT) s->root = 2.0 / (sqrt(s->frame_len) * 32768.0); else s->root = s->frame_len / (sqrt(s->frame_len) * 32768.0); for (i = 0; i < 96; i++) { /* constant is result of 0.066399999/log10(M_E) */ quant_table[i] = expf(i * 0.15289164787221953823f) * s->root; } /* calculate number of bands */ for (s->num_bands = 1; s->num_bands < 25; s->num_bands++) if (sample_rate_half <= ff_wma_critical_freqs[s->num_bands - 1]) break; s->bands = av_malloc((s->num_bands + 1) * sizeof(*s->bands)); if (!s->bands) return AVERROR(ENOMEM); /* populate bands data */ s->bands[0] = 2; for (i = 1; i < s->num_bands; i++) s->bands[i] = (ff_wma_critical_freqs[i - 1] * s->frame_len / sample_rate_half) & ~1; s->bands[s->num_bands] = s->frame_len; s->first = 1; if (CONFIG_BINKAUDIO_RDFT_DECODER && avctx->codec->id == AV_CODEC_ID_BINKAUDIO_RDFT) ff_rdft_init(&s->trans.rdft, frame_len_bits, DFT_C2R); else if (CONFIG_BINKAUDIO_DCT_DECODER) ff_dct_init(&s->trans.dct, frame_len_bits, DCT_III); else return -1; return 0; }
int main(int argc, char **argv) { FFTComplex *tab, *tab1, *tab_ref; FFTSample *tab2; int it, i, c; int do_speed = 0; int err = 1; enum tf_transform transform = TRANSFORM_FFT; int do_inverse = 0; FFTContext s1, *s = &s1; FFTContext m1, *m = &m1; RDFTContext r1, *r = &r1; DCTContext d1, *d = &d1; int fft_nbits, fft_size, fft_size_2; double scale = 1.0; AVLFG prng; av_lfg_init(&prng, 1); fft_nbits = 9; for(;;) { c = getopt(argc, argv, "hsimrdn:f:"); if (c == -1) break; switch(c) { case 'h': help(); break; case 's': do_speed = 1; break; case 'i': do_inverse = 1; break; case 'm': transform = TRANSFORM_MDCT; break; case 'r': transform = TRANSFORM_RDFT; break; case 'd': transform = TRANSFORM_DCT; break; case 'n': fft_nbits = atoi(optarg); break; case 'f': scale = atof(optarg); break; } } fft_size = 1 << fft_nbits; fft_size_2 = fft_size >> 1; tab = av_malloc(fft_size * sizeof(FFTComplex)); tab1 = av_malloc(fft_size * sizeof(FFTComplex)); tab_ref = av_malloc(fft_size * sizeof(FFTComplex)); tab2 = av_malloc(fft_size * sizeof(FFTSample)); switch (transform) { case TRANSFORM_MDCT: av_log(NULL, AV_LOG_INFO,"Scale factor is set to %f\n", scale); if (do_inverse) av_log(NULL, AV_LOG_INFO,"IMDCT"); else av_log(NULL, AV_LOG_INFO,"MDCT"); ff_mdct_init(m, fft_nbits, do_inverse, scale); break; case TRANSFORM_FFT: if (do_inverse) av_log(NULL, AV_LOG_INFO,"IFFT"); else av_log(NULL, AV_LOG_INFO,"FFT"); ff_fft_init(s, fft_nbits, do_inverse); fft_ref_init(fft_nbits, do_inverse); break; case TRANSFORM_RDFT: if (do_inverse) av_log(NULL, AV_LOG_INFO,"IDFT_C2R"); else av_log(NULL, AV_LOG_INFO,"DFT_R2C"); ff_rdft_init(r, fft_nbits, do_inverse ? IDFT_C2R : DFT_R2C); fft_ref_init(fft_nbits, do_inverse); break; case TRANSFORM_DCT: if (do_inverse) av_log(NULL, AV_LOG_INFO,"DCT_III"); else av_log(NULL, AV_LOG_INFO,"DCT_II"); ff_dct_init(d, fft_nbits, do_inverse ? DCT_III : DCT_II); break; } av_log(NULL, AV_LOG_INFO," %d test\n", fft_size); /* generate random data */ for (i = 0; i < fft_size; i++) { tab1[i].re = frandom(&prng); tab1[i].im = frandom(&prng); } /* checking result */ av_log(NULL, AV_LOG_INFO,"Checking...\n"); switch (transform) { case TRANSFORM_MDCT: if (do_inverse) { imdct_ref((float *)tab_ref, (float *)tab1, fft_nbits); ff_imdct_calc(m, tab2, (float *)tab1); err = check_diff((float *)tab_ref, tab2, fft_size, scale); } else { mdct_ref((float *)tab_ref, (float *)tab1, fft_nbits); ff_mdct_calc(m, tab2, (float *)tab1); err = check_diff((float *)tab_ref, tab2, fft_size / 2, scale); } break; case TRANSFORM_FFT: memcpy(tab, tab1, fft_size * sizeof(FFTComplex)); ff_fft_permute(s, tab); ff_fft_calc(s, tab); fft_ref(tab_ref, tab1, fft_nbits); err = check_diff((float *)tab_ref, (float *)tab, fft_size * 2, 1.0); break; case TRANSFORM_RDFT: if (do_inverse) { tab1[ 0].im = 0; tab1[fft_size_2].im = 0; for (i = 1; i < fft_size_2; i++) { tab1[fft_size_2+i].re = tab1[fft_size_2-i].re; tab1[fft_size_2+i].im = -tab1[fft_size_2-i].im; } memcpy(tab2, tab1, fft_size * sizeof(FFTSample)); tab2[1] = tab1[fft_size_2].re; ff_rdft_calc(r, tab2); fft_ref(tab_ref, tab1, fft_nbits); for (i = 0; i < fft_size; i++) { tab[i].re = tab2[i]; tab[i].im = 0; } err = check_diff((float *)tab_ref, (float *)tab, fft_size * 2, 0.5); } else { for (i = 0; i < fft_size; i++) { tab2[i] = tab1[i].re; tab1[i].im = 0; } ff_rdft_calc(r, tab2); fft_ref(tab_ref, tab1, fft_nbits); tab_ref[0].im = tab_ref[fft_size_2].re; err = check_diff((float *)tab_ref, (float *)tab2, fft_size, 1.0); } break; case TRANSFORM_DCT: memcpy(tab, tab1, fft_size * sizeof(FFTComplex)); ff_dct_calc(d, tab); if (do_inverse) { idct_ref(tab_ref, tab1, fft_nbits); } else { dct_ref(tab_ref, tab1, fft_nbits); } err = check_diff((float *)tab_ref, (float *)tab, fft_size, 1.0); break; } /* do a speed test */ if (do_speed) { int64_t time_start, duration; int nb_its; av_log(NULL, AV_LOG_INFO,"Speed test...\n"); /* we measure during about 1 seconds */ nb_its = 1; for(;;) { time_start = gettime(); for (it = 0; it < nb_its; it++) { switch (transform) { case TRANSFORM_MDCT: if (do_inverse) { ff_imdct_calc(m, (float *)tab, (float *)tab1); } else { ff_mdct_calc(m, (float *)tab, (float *)tab1); } break; case TRANSFORM_FFT: memcpy(tab, tab1, fft_size * sizeof(FFTComplex)); ff_fft_calc(s, tab); break; case TRANSFORM_RDFT: memcpy(tab2, tab1, fft_size * sizeof(FFTSample)); ff_rdft_calc(r, tab2); break; case TRANSFORM_DCT: memcpy(tab2, tab1, fft_size * sizeof(FFTSample)); ff_dct_calc(d, tab2); break; } } duration = gettime() - time_start; if (duration >= 1000000) break; nb_its *= 2; } av_log(NULL, AV_LOG_INFO,"time: %0.1f us/transform [total time=%0.2f s its=%d]\n", (double)duration / nb_its, (double)duration / 1000000.0, nb_its); } switch (transform) { case TRANSFORM_MDCT: ff_mdct_end(m); break; case TRANSFORM_FFT: ff_fft_end(s); break; case TRANSFORM_RDFT: ff_rdft_end(r); break; case TRANSFORM_DCT: ff_dct_end(d); break; } av_free(tab); av_free(tab1); av_free(tab2); av_free(tab_ref); av_free(exptab); return err; }
int main(int argc, char **argv) { FFTComplex *tab, *tab1, *tab_ref; FFTSample *tab2; enum tf_transform transform = TRANSFORM_FFT; FFTContext m, s; #if FFT_FLOAT RDFTContext r; DCTContext d; #if CONFIG_LIBFFTW3 FFTWContext fftw; FFTWComplex *tab_fftw, *tab_fftw_copy; #endif /* CONFIG_LIBFFTW3 */ #endif /* FFT_FLOAT */ int it, i, err = 1; int do_speed = 0, do_inverse = 0; int fft_nbits = 9, fft_size; double scale = 1.0; AVLFG prng; av_lfg_init(&prng, 1); for (;;) { int c = getopt(argc, argv, "hsitmrdn:f:c:"); if (c == -1) break; switch (c) { case 'h': help(); return 1; case 's': do_speed = 1; break; case 'i': do_inverse = 1; break; #if CONFIG_LIBFFTW3 case 't': transform = TRANSFORM_FFTW; break; #endif /* CONFIG_LIBFFTW3 */ case 'm': transform = TRANSFORM_MDCT; break; case 'r': transform = TRANSFORM_RDFT; break; case 'd': transform = TRANSFORM_DCT; break; case 'n': fft_nbits = atoi(optarg); break; case 'f': scale = atof(optarg); break; case 'c': { unsigned cpuflags = av_get_cpu_flags(); if (av_parse_cpu_caps(&cpuflags, optarg) < 0) return 1; av_force_cpu_flags(cpuflags); break; } } } fft_size = 1 << fft_nbits; tab = av_malloc_array(fft_size, sizeof(FFTComplex)); tab1 = av_malloc_array(fft_size, sizeof(FFTComplex)); tab_ref = av_malloc_array(fft_size, sizeof(FFTComplex)); tab2 = av_malloc_array(fft_size, sizeof(FFTSample)); #if CONFIG_LIBFFTW3 && FFT_FLOAT tab_fftw = av_malloc_array(fft_size, sizeof(*tab_fftw)); tab_fftw_copy = av_malloc_array(fft_size, sizeof(*tab_fftw_copy)); if (!(tab_fftw && tab_fftw_copy)) goto cleanup_fftw; #endif /* CONFIG_LIBFFTW3 */ if (!(tab && tab1 && tab_ref && tab2)) goto cleanup; switch (transform) { #if CONFIG_MDCT case TRANSFORM_MDCT: av_log(NULL, AV_LOG_INFO, "Scale factor is set to %f\n", scale); if (do_inverse) av_log(NULL, AV_LOG_INFO, "IMDCT"); else av_log(NULL, AV_LOG_INFO, "MDCT"); ff_mdct_init(&m, fft_nbits, do_inverse, scale); break; #endif /* CONFIG_MDCT */ case TRANSFORM_FFT: if (do_inverse) av_log(NULL, AV_LOG_INFO, "IFFT"); else av_log(NULL, AV_LOG_INFO, "FFT"); ff_fft_init(&s, fft_nbits, do_inverse); if ((err = fft_ref_init(fft_nbits, do_inverse)) < 0) goto cleanup; break; #if CONFIG_LIBFFTW3 && FFT_FLOAT case TRANSFORM_FFTW: if (do_inverse) av_log(NULL, AV_LOG_INFO, "IFFTW"); else av_log(NULL, AV_LOG_INFO, "FFTW"); ff_fftw_init(&fftw, fft_size, do_inverse); if ((err = fft_ref_init(fft_nbits, do_inverse)) < 0) goto cleanup; break; #endif /* CONFIG_LIBFFTW3 */ #if FFT_FLOAT # if CONFIG_RDFT case TRANSFORM_RDFT: if (do_inverse) av_log(NULL, AV_LOG_INFO, "IDFT_C2R"); else av_log(NULL, AV_LOG_INFO, "DFT_R2C"); ff_rdft_init(&r, fft_nbits, do_inverse ? IDFT_C2R : DFT_R2C); if ((err = fft_ref_init(fft_nbits, do_inverse)) < 0) goto cleanup; break; # endif /* CONFIG_RDFT */ # if CONFIG_DCT case TRANSFORM_DCT: if (do_inverse) av_log(NULL, AV_LOG_INFO, "DCT_III"); else av_log(NULL, AV_LOG_INFO, "DCT_II"); ff_dct_init(&d, fft_nbits, do_inverse ? DCT_III : DCT_II); break; # endif /* CONFIG_DCT */ #endif /* FFT_FLOAT */ default: av_log(NULL, AV_LOG_ERROR, "Requested transform not supported\n"); goto cleanup; } av_log(NULL, AV_LOG_INFO, " %d test\n", fft_size); /* generate random data */ for (i = 0; i < fft_size; i++) { tab1[i].re = frandom(&prng); tab1[i].im = frandom(&prng); #if CONFIG_LIBFFTW3 && FFT_FLOAT tab_fftw[i][0] = tab1[i].re; tab_fftw[i][1] = tab1[i].im; #endif /* CONFIG_LIBFFTW3 */ } #if CONFIG_LIBFFTW3 && FFT_FLOAT memcpy(tab_fftw_copy, tab_fftw, fft_size * sizeof(*tab_fftw)); #endif /* checking result */ av_log(NULL, AV_LOG_INFO, "Checking...\n"); switch (transform) { #if CONFIG_MDCT case TRANSFORM_MDCT: if (do_inverse) { imdct_ref(&tab_ref->re, &tab1->re, fft_nbits); m.imdct_calc(&m, tab2, &tab1->re); err = check_diff(&tab_ref->re, tab2, fft_size, scale); } else { mdct_ref(&tab_ref->re, &tab1->re, fft_nbits); m.mdct_calc(&m, tab2, &tab1->re); err = check_diff(&tab_ref->re, tab2, fft_size / 2, scale); } break; #endif /* CONFIG_MDCT */ case TRANSFORM_FFT: memcpy(tab, tab1, fft_size * sizeof(FFTComplex)); s.fft_permute(&s, tab); s.fft_calc(&s, tab); fft_ref(tab_ref, tab1, fft_nbits); err = check_diff(&tab_ref->re, &tab->re, fft_size * 2, 1.0); break; #if CONFIG_LIBFFTW3 && FFT_FLOAT case TRANSFORM_FFTW: fftw.fft_calc(&fftw, tab_fftw); fft_ref(tab_ref, tab1, fft_nbits); for (i = 0; i < fft_size; i++) { tab[i].re = tab_fftw[i][0]; tab[i].im = tab_fftw[i][1]; } err = check_diff(&tab_ref->re, &tab->re, fft_size * 2, 1.0); break; #endif /* CONFIG_LIBFFTW3 */ #if FFT_FLOAT #if CONFIG_RDFT case TRANSFORM_RDFT: { int fft_size_2 = fft_size >> 1; if (do_inverse) { tab1[0].im = 0; tab1[fft_size_2].im = 0; for (i = 1; i < fft_size_2; i++) { tab1[fft_size_2 + i].re = tab1[fft_size_2 - i].re; tab1[fft_size_2 + i].im = -tab1[fft_size_2 - i].im; } memcpy(tab2, tab1, fft_size * sizeof(FFTSample)); tab2[1] = tab1[fft_size_2].re; r.rdft_calc(&r, tab2); fft_ref(tab_ref, tab1, fft_nbits); for (i = 0; i < fft_size; i++) { tab[i].re = tab2[i]; tab[i].im = 0; } err = check_diff(&tab_ref->re, &tab->re, fft_size * 2, 0.5); } else { for (i = 0; i < fft_size; i++) { tab2[i] = tab1[i].re; tab1[i].im = 0; } r.rdft_calc(&r, tab2); fft_ref(tab_ref, tab1, fft_nbits); tab_ref[0].im = tab_ref[fft_size_2].re; err = check_diff(&tab_ref->re, tab2, fft_size, 1.0); } break; } #endif /* CONFIG_RDFT */ #if CONFIG_DCT case TRANSFORM_DCT: memcpy(tab, tab1, fft_size * sizeof(FFTComplex)); d.dct_calc(&d, &tab->re); if (do_inverse) idct_ref(&tab_ref->re, &tab1->re, fft_nbits); else dct_ref(&tab_ref->re, &tab1->re, fft_nbits); err = check_diff(&tab_ref->re, &tab->re, fft_size, 1.0); break; #endif /* CONFIG_DCT */ #endif /* FFT_FLOAT */ } /* do a speed test */ if (do_speed) { int64_t time_start, duration; int nb_its; av_log(NULL, AV_LOG_INFO, "Speed test...\n"); /* we measure during about 1 seconds */ nb_its = 1; for (;;) { time_start = av_gettime_relative(); for (it = 0; it < nb_its; it++) { switch (transform) { case TRANSFORM_MDCT: if (do_inverse) m.imdct_calc(&m, &tab->re, &tab1->re); else m.mdct_calc(&m, &tab->re, &tab1->re); break; case TRANSFORM_FFT: memcpy(tab, tab1, fft_size * sizeof(FFTComplex)); s.fft_permute(&s, tab); s.fft_calc(&s, tab); break; #if CONFIG_LIBFFTW3 && FFT_FLOAT case TRANSFORM_FFTW: memcpy(tab_fftw, tab_fftw_copy, fft_size * sizeof(*tab_fftw)); fftw.fft_calc(&fftw, tab_fftw); break; #endif /* CONFIG_LIBFFTW3 */ #if FFT_FLOAT case TRANSFORM_RDFT: memcpy(tab2, tab1, fft_size * sizeof(FFTSample)); r.rdft_calc(&r, tab2); break; case TRANSFORM_DCT: memcpy(tab2, tab1, fft_size * sizeof(FFTSample)); d.dct_calc(&d, tab2); break; #endif /* FFT_FLOAT */ } } duration = av_gettime_relative() - time_start; if (duration >= 1000000) break; nb_its *= 2; } av_log(NULL, AV_LOG_INFO, "time: %0.2f us/transform [total time=%0.2f s its=%d]\n", (double) duration / nb_its, (double) duration / 1000000.0, nb_its); } switch (transform) { #if CONFIG_MDCT case TRANSFORM_MDCT: ff_mdct_end(&m); break; #endif /* CONFIG_MDCT */ case TRANSFORM_FFT: ff_fft_end(&s); break; #if CONFIG_LIBFFTW3 && FFT_FLOAT case TRANSFORM_FFTW: ff_fftw_deinit(&fftw); break; #endif /* CONFIG_LIBFFTW3 */ #if FFT_FLOAT # if CONFIG_RDFT case TRANSFORM_RDFT: ff_rdft_end(&r); break; # endif /* CONFIG_RDFT */ # if CONFIG_DCT case TRANSFORM_DCT: ff_dct_end(&d); break; # endif /* CONFIG_DCT */ #endif /* FFT_FLOAT */ } #if CONFIG_LIBFFTW3 && FFT_FLOAT cleanup_fftw: av_freep(&tab_fftw); #endif /* CONFIG_LIBFFTW3 */ cleanup: av_freep(&tab); av_freep(&tab1); av_freep(&tab2); av_freep(&tab_ref); av_freep(&exptab); if (err) printf("Error: %d.\n", err); return !!err; }
int BIKPlayer::sound_init(bool need_init) { int sample_rate = header.samplerate; int sample_rate_half; unsigned int i; int frame_len_bits; int ret; if(need_init) { s_stream = setAudioStream(); } else { s_stream = -1; return 0; } if(s_stream<0) { return 0; } if(header.audioflag&BINK_AUD_STEREO) { header.channels=2; } /* determine frame length */ if (sample_rate < 22050) { frame_len_bits = 9; } else if (sample_rate < 44100) { frame_len_bits = 10; } else { frame_len_bits = 11; } //audio frame length s_frame_len = 1 << frame_len_bits; if (header.channels > MAX_CHANNELS) { //av_log(s->avctx, AV_LOG_ERROR, "too many channels: %d\n", s->channels); return -1; } if (header.audioflag&BINK_AUD_USEDCT) { s_channels = header.channels; } else { // audio is already interleaved for the RDFT format variant sample_rate *= header.channels; s_frame_len *= header.channels; s_channels = 1; if (header.channels == 2) frame_len_bits++; } s_overlap_len = s_frame_len / 16; s_block_size = (s_frame_len - s_overlap_len) * s_channels; sample_rate_half = (sample_rate + 1) / 2; s_root = (float) (2.0 / sqrt((float) s_frame_len)); /* calculate number of bands */ for (s_num_bands = 1; s_num_bands < 25; s_num_bands++) { if (sample_rate_half <= ff_wma_critical_freqs[s_num_bands - 1]) { break; } } s_bands = (unsigned int *) av_malloc((s_num_bands + 1) * sizeof(*s_bands)); if (!s_bands) { return -2; } /* populate bands data */ s_bands[0] = 1; for (i = 1; i < s_num_bands; i++) s_bands[i] = ff_wma_critical_freqs[i - 1] * (s_frame_len / 2) / sample_rate_half; s_bands[s_num_bands] = s_frame_len / 2; s_first = 1; for (i = 0; i < s_channels; i++) s_coeffs_ptr[i] = s_coeffs + i * s_frame_len; if (header.audioflag&BINK_AUD_USEDCT) ret = ff_dct_init(&s_trans.dct, frame_len_bits, 1); else ret = ff_rdft_init(&s_trans.rdft, frame_len_bits, IRIDFT); return ret; }