static av_cold int decode_init(AVCodecContext *avctx) { ATRAC3PContext *ctx = avctx->priv_data; int i, ch, ret; ff_atrac3p_init_vlcs(); avpriv_float_dsp_init(&ctx->fdsp, avctx->flags & CODEC_FLAG_BITEXACT); /* initialize IPQF */ ff_mdct_init(&ctx->ipqf_dct_ctx, 5, 1, 32.0 / 32768.0); ff_atrac3p_init_imdct(avctx, &ctx->mdct_ctx); ff_atrac_init_gain_compensation(&ctx->gainc_ctx, 6, 2); ff_atrac3p_init_wave_synth(); if ((ret = set_channel_params(ctx, avctx)) < 0) return ret; ctx->my_channel_layout = avctx->channel_layout; ctx->ch_units = av_mallocz(sizeof(*ctx->ch_units) * ctx->num_channel_blocks); if (!ctx->ch_units) { decode_close(avctx); return AVERROR(ENOMEM); } for (i = 0; i < ctx->num_channel_blocks; i++) { for (ch = 0; ch < 2; ch++) { ctx->ch_units[i].channels[ch].ch_num = ch; ctx->ch_units[i].channels[ch].wnd_shape = &ctx->ch_units[i].channels[ch].wnd_shape_hist[0][0]; ctx->ch_units[i].channels[ch].wnd_shape_prev = &ctx->ch_units[i].channels[ch].wnd_shape_hist[1][0]; ctx->ch_units[i].channels[ch].gain_data = &ctx->ch_units[i].channels[ch].gain_data_hist[0][0]; ctx->ch_units[i].channels[ch].gain_data_prev = &ctx->ch_units[i].channels[ch].gain_data_hist[1][0]; ctx->ch_units[i].channels[ch].tones_info = &ctx->ch_units[i].channels[ch].tones_info_hist[0][0]; ctx->ch_units[i].channels[ch].tones_info_prev = &ctx->ch_units[i].channels[ch].tones_info_hist[1][0]; /* clear IMDCT overlapping buffer */ memset(&ctx->ch_units[i].prev_buf[ch][0], 0, sizeof(ctx->ch_units[i].prev_buf[ch][0]) * ATRAC3P_FRAME_SAMPLES); /* clear IPQF history */ memset(&ctx->ch_units[i].ipqf_ctx[ch], 0, sizeof(ctx->ch_units[i].ipqf_ctx[ch])); } ctx->ch_units[i].waves_info = &ctx->ch_units[i].wave_synth_hist[0]; ctx->ch_units[i].waves_info_prev = &ctx->ch_units[i].wave_synth_hist[1]; } avctx->sample_fmt = AV_SAMPLE_FMT_FLTP; return 0; }
static av_cold int atrac3p_decode_init(AVCodecContext *avctx) { ATRAC3PContext *ctx = avctx->priv_data; int i, ch, ret; if (!avctx->block_align) { av_log(avctx, AV_LOG_ERROR, "block_align is not set\n"); return AVERROR(EINVAL); } ff_atrac3p_init_vlcs(); /* initialize IPQF */ ff_mdct_init(&ctx->ipqf_dct_ctx, 5, 1, 32.0 / 32768.0); ff_atrac3p_init_imdct(avctx, &ctx->mdct_ctx); ff_atrac_init_gain_compensation(&ctx->gainc_ctx, 6, 2); ff_atrac3p_init_wave_synth(); if ((ret = set_channel_params(ctx, avctx)) < 0) return ret; ctx->my_channel_layout = avctx->channel_layout; ctx->ch_units = av_mallocz_array(ctx->num_channel_blocks, sizeof(*ctx->ch_units)); ctx->fdsp = avpriv_float_dsp_alloc(avctx->flags & CODEC_FLAG_BITEXACT); if (!ctx->ch_units || !ctx->fdsp) { atrac3p_decode_close(avctx); return AVERROR(ENOMEM); } for (i = 0; i < ctx->num_channel_blocks; i++) { for (ch = 0; ch < 2; ch++) { ctx->ch_units[i].channels[ch].ch_num = ch; ctx->ch_units[i].channels[ch].wnd_shape = &ctx->ch_units[i].channels[ch].wnd_shape_hist[0][0]; ctx->ch_units[i].channels[ch].wnd_shape_prev = &ctx->ch_units[i].channels[ch].wnd_shape_hist[1][0]; ctx->ch_units[i].channels[ch].gain_data = &ctx->ch_units[i].channels[ch].gain_data_hist[0][0]; ctx->ch_units[i].channels[ch].gain_data_prev = &ctx->ch_units[i].channels[ch].gain_data_hist[1][0]; ctx->ch_units[i].channels[ch].tones_info = &ctx->ch_units[i].channels[ch].tones_info_hist[0][0]; ctx->ch_units[i].channels[ch].tones_info_prev = &ctx->ch_units[i].channels[ch].tones_info_hist[1][0]; } ctx->ch_units[i].waves_info = &ctx->ch_units[i].wave_synth_hist[0]; ctx->ch_units[i].waves_info_prev = &ctx->ch_units[i].wave_synth_hist[1]; } avctx->sample_fmt = AV_SAMPLE_FMT_FLTP; return 0; }