GetBitContext gb;
BswapDSPContext bdsp;
- AVFloatDSPContext *fdsp;
+ void (*butterflies_float)(float *av_restrict v1, float *av_restrict v2, int len);
FFTContext fft;
DECLARE_ALIGNED(32, FFTComplex, samples)[COEFFS / 2];
float *out_samples;
int8_t cyclTab[32], cyclTab2[32];
float weights1[31], weights2[31];
+
+ AVCodecContext *avctx;
} IMCContext;
static VLC huffman_vlc[4][4];
{
int i, j, ret;
IMCContext *q = avctx->priv_data;
+ AVFloatDSPContext *fdsp;
double r1, r2;
if (avctx->codec_id == AV_CODEC_ID_IAC && avctx->sample_rate > 96000) {
memcpy(q->weights2, imc_weights2, sizeof(imc_weights2));
}
+ fdsp = avpriv_float_dsp_alloc(avctx->flags & AV_CODEC_FLAG_BITEXACT);
+ if (!fdsp)
+ return AVERROR(ENOMEM);
+ q->butterflies_float = fdsp->butterflies_float;
+ av_free(fdsp);
if ((ret = ff_fft_init(&q->fft, 7, 1))) {
av_log(avctx, AV_LOG_INFO, "FFT init failed\n");
return ret;
}
ff_bswapdsp_init(&q->bdsp);
- q->fdsp = avpriv_float_dsp_alloc(avctx->flags & AV_CODEC_FLAG_BITEXACT);
- if (!q->fdsp) {
- ff_fft_end(&q->fft);
-
- return AVERROR(ENOMEM);
- }
avctx->sample_fmt = AV_SAMPLE_FMT_FLTP;
avctx->channel_layout = avctx->channels == 1 ? AV_CH_LAYOUT_MONO
for (i = 0; i < BANDS - 1; i++) {
if (chctx->flcoeffs5[i] <= 0) {
- av_log(NULL, AV_LOG_ERROR, "flcoeffs5 %f invalid\n", chctx->flcoeffs5[i]);
+ av_log(q->avctx, AV_LOG_ERROR, "flcoeffs5 %f invalid\n", chctx->flcoeffs5[i]);
return AVERROR_INVALIDDATA;
}
chctx->flcoeffs4[i] = chctx->flcoeffs3[i] - log2f(chctx->flcoeffs5[i]);
LOCAL_ALIGNED_16(uint16_t, buf16, [(IMC_BLOCK_SIZE + AV_INPUT_BUFFER_PADDING_SIZE) / 2]);
+ q->avctx = avctx;
+
if (buf_size < IMC_BLOCK_SIZE * avctx->channels) {
av_log(avctx, AV_LOG_ERROR, "frame too small!\n");
return AVERROR_INVALIDDATA;
}
if (avctx->channels == 2) {
- q->fdsp->butterflies_float((float *)frame->extended_data[0],
- (float *)frame->extended_data[1], COEFFS);
+ q->butterflies_float((float *)frame->extended_data[0],
+ (float *)frame->extended_data[1], COEFFS);
}
*got_frame_ptr = 1;
IMCContext *q = avctx->priv_data;
ff_fft_end(&q->fft);
- av_freep(&q->fdsp);
return 0;
}