static int apply_window_and_mdct(AVCodecContext *avctx, const AVFrame *frame) { WMACodecContext *s = avctx->priv_data; float **audio = (float **) frame->extended_data; int len = frame->nb_samples; int window_index = s->frame_len_bits - s->block_len_bits; FFTContext *mdct = &s->mdct_ctx[window_index]; int ch; const float *win = s->windows[window_index]; int window_len = 1 << s->block_len_bits; float n = 2.0 * 32768.0 / window_len; for (ch = 0; ch < avctx->channels; ch++) { memcpy(s->output, s->frame_out[ch], window_len * sizeof(*s->output)); s->fdsp->vector_fmul_scalar(s->frame_out[ch], audio[ch], n, len); s->fdsp->vector_fmul_reverse(&s->output[window_len], s->frame_out[ch], win, len); s->fdsp->vector_fmul(s->frame_out[ch], s->frame_out[ch], win, len); mdct->mdct_calc(mdct, s->coefs[ch], s->output); if (!isfinite(s->coefs[ch][0])) { av_log(avctx, AV_LOG_ERROR, "Input contains NaN/+-Inf\n"); return AVERROR(EINVAL); } } return 0; }
static void imdct_and_window(TwinVQContext *tctx, enum TwinVQFrameType ftype, int wtype, float *in, float *prev, int ch) { FFTContext *mdct = &tctx->mdct_ctx[ftype]; const TwinVQModeTab *mtab = tctx->mtab; int bsize = mtab->size / mtab->fmode[ftype].sub; int size = mtab->size; float *buf1 = tctx->tmp_buf; int j, first_wsize, wsize; // Window size float *out = tctx->curr_frame + 2 * ch * mtab->size; float *out2 = out; float *prev_buf; int types_sizes[] = { mtab->size / mtab->fmode[TWINVQ_FT_LONG].sub, mtab->size / mtab->fmode[TWINVQ_FT_MEDIUM].sub, mtab->size / (mtab->fmode[TWINVQ_FT_SHORT].sub * 2), }; wsize = types_sizes[wtype_to_wsize[wtype]]; first_wsize = wsize; prev_buf = prev + (size - bsize) / 2; for (j = 0; j < mtab->fmode[ftype].sub; j++) { int sub_wtype = ftype == TWINVQ_FT_MEDIUM ? 8 : wtype; if (!j && wtype == 4) sub_wtype = 4; else if (j == mtab->fmode[ftype].sub - 1 && wtype == 7) sub_wtype = 7; wsize = types_sizes[wtype_to_wsize[sub_wtype]]; mdct->imdct_half(mdct, buf1 + bsize * j, in + bsize * j); tctx->fdsp.vector_fmul_window(out2, prev_buf + (bsize - wsize) / 2, buf1 + bsize * j, ff_sine_windows[av_log2(wsize)], wsize / 2); out2 += wsize; memcpy(out2, buf1 + bsize * j + wsize / 2, (bsize - wsize / 2) * sizeof(float)); out2 += ftype == TWINVQ_FT_MEDIUM ? (bsize - wsize) / 2 : bsize - wsize; prev_buf = buf1 + bsize * j + bsize / 2; } tctx->last_block_pos[ch] = (size + first_wsize) / 2; }
static void apply_window_and_mdct(AVCodecContext * avctx, const signed short * audio, int len) { WMACodecContext *s = avctx->priv_data; int window_index= s->frame_len_bits - s->block_len_bits; FFTContext *mdct = &s->mdct_ctx[window_index]; int i, j, channel; const float * win = s->windows[window_index]; int window_len = 1 << s->block_len_bits; float n = window_len/2; for (channel = 0; channel < avctx->channels; channel++) { memcpy(s->output, s->frame_out[channel], sizeof(float)*window_len); j = channel; for (i = 0; i < len; i++, j += avctx->channels){ s->output[i+window_len] = audio[j] / n * win[window_len - i - 1]; s->frame_out[channel][i] = audio[j] / n * win[i]; } mdct->mdct_calc(mdct, s->coefs[channel], s->output); } }
static void apply_window_and_mdct(AVCodecContext * avctx, const AVFrame *frame) { WMACodecContext *s = avctx->priv_data; float **audio = (float **)frame->extended_data; int len = frame->nb_samples; int window_index= s->frame_len_bits - s->block_len_bits; FFTContext *mdct = &s->mdct_ctx[window_index]; int ch; const float * win = s->windows[window_index]; int window_len = 1 << s->block_len_bits; float n = 2.0 * 32768.0 / window_len; for (ch = 0; ch < avctx->channels; ch++) { memcpy(s->output, s->frame_out[ch], window_len * sizeof(*s->output)); s->fdsp.vector_fmul_scalar(s->frame_out[ch], audio[ch], n, len); s->dsp.vector_fmul_reverse(&s->output[window_len], s->frame_out[ch], win, len); s->fdsp.vector_fmul(s->frame_out[ch], s->frame_out[ch], win, len); mdct->mdct_calc(mdct, s->coefs[ch], s->output); } }