diff --git a/libavcodec/wma.c b/libavcodec/wma.c index ecc7e41a51..51fda3f22f 100644 --- a/libavcodec/wma.c +++ b/libavcodec/wma.c @@ -86,7 +86,6 @@ av_cold int ff_wma_init(AVCodecContext *avctx, int flags2) return -1; ff_fmt_convert_init(&s->fmt_conv, avctx); - avpriv_float_dsp_init(&s->fdsp, avctx->flags & CODEC_FLAG_BITEXACT); if (avctx->codec->id == AV_CODEC_ID_WMAV1) s->version = 1; @@ -333,6 +332,10 @@ av_cold int ff_wma_init(AVCodecContext *avctx, int flags2) #endif /* TRACE */ } + s->fdsp = avpriv_float_dsp_alloc(avctx->flags & CODEC_FLAG_BITEXACT); + if (!s->fdsp) + return AVERROR(ENOMEM); + /* choose the VLC tables for the coefficients */ coef_vlc_table = 2; if (avctx->sample_rate >= 32000) { @@ -383,6 +386,7 @@ int ff_wma_end(AVCodecContext *avctx) av_freep(&s->level_table[i]); av_freep(&s->int_table[i]); } + av_freep(&s->fdsp); return 0; } diff --git a/libavcodec/wma.h b/libavcodec/wma.h index 6e5198a360..a232b8a4c6 100644 --- a/libavcodec/wma.h +++ b/libavcodec/wma.h @@ -132,7 +132,7 @@ typedef struct WMACodecContext { float lsp_pow_m_table1[(1 << LSP_POW_BITS)]; float lsp_pow_m_table2[(1 << LSP_POW_BITS)]; FmtConvertContext fmt_conv; - AVFloatDSPContext fdsp; + AVFloatDSPContext *fdsp; #ifdef TRACE int frame_count; diff --git a/libavcodec/wmadec.c b/libavcodec/wmadec.c index 6c3f28f25f..d32ca6ff76 100644 --- a/libavcodec/wmadec.c +++ b/libavcodec/wmadec.c @@ -390,14 +390,14 @@ static void wma_window(WMACodecContext *s, float *out) block_len = s->block_len; bsize = s->frame_len_bits - s->block_len_bits; - s->fdsp.vector_fmul_add(out, in, s->windows[bsize], + s->fdsp->vector_fmul_add(out, in, s->windows[bsize], out, block_len); } else { block_len = 1 << s->prev_block_len_bits; n = (s->block_len - block_len) / 2; bsize = s->frame_len_bits - s->prev_block_len_bits; - s->fdsp.vector_fmul_add(out + n, in + n, s->windows[bsize], + s->fdsp->vector_fmul_add(out + n, in + n, s->windows[bsize], out + n, block_len); memcpy(out + n + block_len, in + n + block_len, n * sizeof(float)); @@ -411,7 +411,7 @@ static void wma_window(WMACodecContext *s, float *out) block_len = s->block_len; bsize = s->frame_len_bits - s->block_len_bits; - s->fdsp.vector_fmul_reverse(out, in, s->windows[bsize], block_len); + s->fdsp->vector_fmul_reverse(out, in, s->windows[bsize], block_len); } else { block_len = 1 << s->next_block_len_bits; n = (s->block_len - block_len) / 2; @@ -419,7 +419,7 @@ static void wma_window(WMACodecContext *s, float *out) memcpy(out, in, n * sizeof(float)); - s->fdsp.vector_fmul_reverse(out + n, in + n, s->windows[bsize], + s->fdsp->vector_fmul_reverse(out + n, in + n, s->windows[bsize], block_len); memset(out + n + block_len, 0, n * sizeof(float)); @@ -738,7 +738,7 @@ static int wma_decode_block(WMACodecContext *s) s->channel_coded[0] = 1; } - s->fdsp.butterflies_float(s->coefs[0], s->coefs[1], s->block_len); + s->fdsp->butterflies_float(s->coefs[0], s->coefs[1], s->block_len); } next: diff --git a/libavcodec/wmaenc.c b/libavcodec/wmaenc.c index 6337779fa3..08d45e9273 100644 --- a/libavcodec/wmaenc.c +++ b/libavcodec/wmaenc.c @@ -107,10 +107,10 @@ static void apply_window_and_mdct(AVCodecContext *avctx, const AVFrame *frame) 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], + 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); + s->fdsp->vector_fmul(s->frame_out[ch], s->frame_out[ch], win, len); mdct->mdct_calc(mdct, s->coefs[ch], s->output); } }