X-Git-Url: https://git.piment-noir.org/?p=deb_ffmpeg.git;a=blobdiff_plain;f=ffmpeg%2Flibavcodec%2Fopus_celt.c;h=4f3212b7a8123cccaad8aa4f2e1acd0290cf0a2f;hp=e8a8de7f45b0491d07a10778d4509d2470d16bf3;hb=f6fa7814ccfe3e76514b36cf04f5cd3cb657c8cf;hpb=2ba45a602cbfa7b771effba9b11bb4245c21bc00 diff --git a/ffmpeg/libavcodec/opus_celt.c b/ffmpeg/libavcodec/opus_celt.c index e8a8de7..4f3212b 100644 --- a/ffmpeg/libavcodec/opus_celt.c +++ b/ffmpeg/libavcodec/opus_celt.c @@ -62,7 +62,7 @@ struct CeltContext { // constant values that do not change during context lifetime AVCodecContext *avctx; CeltIMDCTContext *imdct[4]; - AVFloatDSPContext dsp; + AVFloatDSPContext *dsp; int output_channels; // values that have inter-frame effect and must be reset on flush @@ -2072,7 +2072,7 @@ int ff_celt_decode_frame(CeltContext *s, OpusRangeCoder *rc, /* stereo -> mono downmix */ if (s->output_channels < s->coded_channels) { - s->dsp.vector_fmac_scalar(s->coeffs[0], s->coeffs[1], 1.0, FFALIGN(frame_size, 16)); + s->dsp->vector_fmac_scalar(s->coeffs[0], s->coeffs[1], 1.0, FFALIGN(frame_size, 16)); imdct_scale = 0.5; } else if (s->output_channels > s->coded_channels) memcpy(s->coeffs[1], s->coeffs[0], frame_size * sizeof(float)); @@ -2098,7 +2098,7 @@ int ff_celt_decode_frame(CeltContext *s, OpusRangeCoder *rc, imdct->imdct_half(imdct, dst + CELT_OVERLAP / 2, s->coeffs[i] + j, s->blocks, imdct_scale); - s->dsp.vector_fmul_window(dst, dst, dst + CELT_OVERLAP / 2, + s->dsp->vector_fmul_window(dst, dst, dst + CELT_OVERLAP / 2, celt_window, CELT_OVERLAP / 2); } @@ -2181,6 +2181,7 @@ void ff_celt_free(CeltContext **ps) for (i = 0; i < FF_ARRAY_ELEMS(s->imdct); i++) ff_celt_imdct_uninit(&s->imdct[i]); + av_freep(&s->dsp); av_freep(ps); } @@ -2208,7 +2209,11 @@ int ff_celt_init(AVCodecContext *avctx, CeltContext **ps, int output_channels) goto fail; } - avpriv_float_dsp_init(&s->dsp, avctx->flags & CODEC_FLAG_BITEXACT); + s->dsp = avpriv_float_dsp_alloc(avctx->flags & CODEC_FLAG_BITEXACT); + if (!s->dsp) { + ret = AVERROR(ENOMEM); + goto fail; + } ff_celt_flush(s);