yading@10: /* yading@10: * AAC encoder yading@10: * Copyright (C) 2008 Konstantin Shishkov yading@10: * yading@10: * This file is part of FFmpeg. yading@10: * yading@10: * FFmpeg is free software; you can redistribute it and/or yading@10: * modify it under the terms of the GNU Lesser General Public yading@10: * License as published by the Free Software Foundation; either yading@10: * version 2.1 of the License, or (at your option) any later version. yading@10: * yading@10: * FFmpeg is distributed in the hope that it will be useful, yading@10: * but WITHOUT ANY WARRANTY; without even the implied warranty of yading@10: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU yading@10: * Lesser General Public License for more details. yading@10: * yading@10: * You should have received a copy of the GNU Lesser General Public yading@10: * License along with FFmpeg; if not, write to the Free Software yading@10: * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA yading@10: */ yading@10: yading@10: #ifndef AVCODEC_AACENC_H yading@10: #define AVCODEC_AACENC_H yading@10: yading@10: #include "libavutil/float_dsp.h" yading@10: #include "avcodec.h" yading@10: #include "put_bits.h" yading@10: yading@10: #include "aac.h" yading@10: #include "audio_frame_queue.h" yading@10: #include "psymodel.h" yading@10: yading@10: #define AAC_CODER_NB 4 yading@10: yading@10: typedef struct AACEncOptions { yading@10: int stereo_mode; yading@10: int aac_coder; yading@10: } AACEncOptions; yading@10: yading@10: struct AACEncContext; yading@10: yading@10: typedef struct AACCoefficientsEncoder { yading@10: void (*search_for_quantizers)(AVCodecContext *avctx, struct AACEncContext *s, yading@10: SingleChannelElement *sce, const float lambda); yading@10: void (*encode_window_bands_info)(struct AACEncContext *s, SingleChannelElement *sce, yading@10: int win, int group_len, const float lambda); yading@10: void (*quantize_and_encode_band)(struct AACEncContext *s, PutBitContext *pb, const float *in, int size, yading@10: int scale_idx, int cb, const float lambda); yading@10: void (*search_for_ms)(struct AACEncContext *s, ChannelElement *cpe, const float lambda); yading@10: } AACCoefficientsEncoder; yading@10: yading@10: extern AACCoefficientsEncoder ff_aac_coders[]; yading@10: yading@10: /** yading@10: * AAC encoder context yading@10: */ yading@10: typedef struct AACEncContext { yading@10: AVClass *av_class; yading@10: AACEncOptions options; ///< encoding options yading@10: PutBitContext pb; yading@10: FFTContext mdct1024; ///< long (1024 samples) frame transform context yading@10: FFTContext mdct128; ///< short (128 samples) frame transform context yading@10: AVFloatDSPContext fdsp; yading@10: float *planar_samples[6]; ///< saved preprocessed input yading@10: yading@10: int samplerate_index; ///< MPEG-4 samplerate index yading@10: int channels; ///< channel count yading@10: const uint8_t *chan_map; ///< channel configuration map yading@10: yading@10: ChannelElement *cpe; ///< channel elements yading@10: FFPsyContext psy; yading@10: struct FFPsyPreprocessContext* psypp; yading@10: AACCoefficientsEncoder *coder; yading@10: int cur_channel; yading@10: int last_frame; yading@10: float lambda; yading@10: AudioFrameQueue afq; yading@10: DECLARE_ALIGNED(16, int, qcoefs)[96]; ///< quantized coefficients yading@10: DECLARE_ALIGNED(32, float, scoefs)[1024]; ///< scaled coefficients yading@10: yading@10: struct { yading@10: float *samples; yading@10: } buffer; yading@10: } AACEncContext; yading@10: yading@10: extern float ff_aac_pow34sf_tab[428]; yading@10: yading@10: void ff_aac_coder_init_mips(AACEncContext *c); yading@10: yading@10: #endif /* AVCODEC_AACENC_H */