* AAC encoder
* Copyright (C) 2008 Konstantin Shishkov
*
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef AVCODEC_AACENC_H
#define AVCODEC_AACENC_H
#include <stdint.h>
#include "libavutil/channel_layout.h"
#include "libavutil/float_dsp.h"
#include "libavutil/mem_internal.h"
#include "libavutil/tx.h"
#include "avcodec.h"
#include "put_bits.h"
#include "aac.h"
#include "aacencdsp.h"
#include "audio_frame_queue.h"
#include "psymodel.h"
#include "lpc.h"
#define CLIP_AVOIDANCE_FACTOR 0.95f
typedef enum AACCoder {
AAC_CODER_ANMR = 0,
AAC_CODER_TWOLOOP,
AAC_CODER_FAST,
AAC_CODER_NB,
}AACCoder;
* Predictor State
*/
typedef struct PredictorState {
float cor0;
float cor1;
float var0;
float var1;
float r0;
float r1;
float k1;
float x_est;
} PredictorState;
typedef struct AACEncOptions {
int coder;
int pns;
int tns;
int ltp;
int pce;
int pred;
int mid_side;
int intensity_stereo;
} AACEncOptions;
* Long Term Prediction
*/
typedef struct LongTermPrediction {
int8_t present;
int16_t lag;
int coef_idx;
float coef;
int8_t used[MAX_LTP_LONG_SFB];
} LongTermPrediction;
* Individual Channel Stream
*/
typedef struct IndividualChannelStream {
uint8_t max_sfb;
enum WindowSequence window_sequence[2];
uint8_t use_kb_window[2];
uint8_t group_len[8];
LongTermPrediction ltp;
const uint16_t *swb_offset;
const uint8_t *swb_sizes;
int num_swb;
int num_windows;
int tns_max_bands;
int predictor_present;
int predictor_initialized;
int predictor_reset_group;
int predictor_reset_count[31];
uint8_t prediction_used[41];
uint8_t window_clipping[8];
float clip_avoidance_factor;
} IndividualChannelStream;
* Temporal Noise Shaping
*/
typedef struct TemporalNoiseShaping {
int present;
int n_filt[8];
int length[8][4];
int direction[8][4];
int order[8][4];
int coef_idx[8][4][TNS_MAX_ORDER];
float coef[8][4][TNS_MAX_ORDER];
} TemporalNoiseShaping;
* Single Channel Element - used for both SCE and LFE elements.
*/
typedef struct SingleChannelElement {
IndividualChannelStream ics;
TemporalNoiseShaping tns;
Pulse pulse;
enum BandType band_type[128];
enum BandType band_alt[128];
int sf_idx[128];
uint8_t zeroes[128];
uint8_t can_pns[128];
float is_ener[128];
float pns_ener[128];
DECLARE_ALIGNED(32, float, pcoeffs)[1024];
DECLARE_ALIGNED(32, float, coeffs)[1024];
DECLARE_ALIGNED(32, float, ret_buf)[2048];
DECLARE_ALIGNED(16, float, ltp_state)[3072];
DECLARE_ALIGNED(32, float, lcoeffs)[1024];
DECLARE_ALIGNED(32, float, prcoeffs)[1024];
PredictorState predictor_state[MAX_PREDICTORS];
} SingleChannelElement;
* channel element - generic struct for SCE/CPE/CCE/LFE
*/
typedef struct ChannelElement {
int common_window;
int ms_mode;
uint8_t is_mode;
uint8_t ms_mask[128];
uint8_t is_mask[128];
SingleChannelElement ch[2];
} ChannelElement;
struct AACEncContext;
typedef struct AACCoefficientsEncoder {
void (*search_for_quantizers)(AVCodecContext *avctx, struct AACEncContext *s,
SingleChannelElement *sce, const float lambda);
void (*encode_window_bands_info)(struct AACEncContext *s, SingleChannelElement *sce,
int win, int group_len, const float lambda);
void (*quantize_and_encode_band)(struct AACEncContext *s, PutBitContext *pb, const float *in, float *out, int size,
int scale_idx, int cb, const float lambda, int rtz);
void (*encode_tns_info)(struct AACEncContext *s, SingleChannelElement *sce);
void (*encode_ltp_info)(struct AACEncContext *s, SingleChannelElement *sce, int common_window);
void (*encode_main_pred)(struct AACEncContext *s, SingleChannelElement *sce);
void (*adjust_common_pred)(struct AACEncContext *s, ChannelElement *cpe);
void (*adjust_common_ltp)(struct AACEncContext *s, ChannelElement *cpe);
void (*apply_main_pred)(struct AACEncContext *s, SingleChannelElement *sce);
void (*apply_tns_filt)(struct AACEncContext *s, SingleChannelElement *sce);
void (*update_ltp)(struct AACEncContext *s, SingleChannelElement *sce);
void (*ltp_insert_new_frame)(struct AACEncContext *s);
void (*set_special_band_scalefactors)(struct AACEncContext *s, SingleChannelElement *sce);
void (*search_for_pns)(struct AACEncContext *s, AVCodecContext *avctx, SingleChannelElement *sce);
void (*mark_pns)(struct AACEncContext *s, AVCodecContext *avctx, SingleChannelElement *sce);
void (*search_for_tns)(struct AACEncContext *s, SingleChannelElement *sce);
void (*search_for_ltp)(struct AACEncContext *s, SingleChannelElement *sce, int common_window);
void (*search_for_ms)(struct AACEncContext *s, ChannelElement *cpe);
void (*search_for_is)(struct AACEncContext *s, AVCodecContext *avctx, ChannelElement *cpe);
void (*search_for_pred)(struct AACEncContext *s, SingleChannelElement *sce);
} AACCoefficientsEncoder;
extern const AACCoefficientsEncoder ff_aac_coders[];
typedef struct AACQuantizeBandCostCacheEntry {
float rd;
float energy;
int bits;
char cb;
char rtz;
uint16_t generation;
} AACQuantizeBandCostCacheEntry;
typedef struct AACPCEInfo {
AVChannelLayout layout;
int num_ele[4];
int pairing[3][8];
int index[4][8];
uint8_t config_map[16];
uint8_t reorder_map[16];
} AACPCEInfo;
* AAC encoder context
*/
typedef struct AACEncContext {
AVClass *av_class;
AACEncOptions options;
PutBitContext pb;
AVTXContext *mdct1024;
av_tx_fn mdct1024_fn;
AVTXContext *mdct128;
av_tx_fn mdct128_fn;
AVFloatDSPContext *fdsp;
AACPCEInfo pce;
float *planar_samples[16];
int profile;
int needs_pce;
LPCContext lpc;
int samplerate_index;
int channels;
const uint8_t *reorder_map;
const uint8_t *chan_map;
ChannelElement *cpe;
FFPsyContext psy;
struct FFPsyPreprocessContext* psypp;
const AACCoefficientsEncoder *coder;
int cur_channel;
int random_state;
float lambda;
int last_frame_pb_count;
float lambda_sum;
int lambda_count;
enum RawDataBlockType cur_type;
AudioFrameQueue afq;
DECLARE_ALIGNED(32, int, qcoefs)[96];
DECLARE_ALIGNED(32, float, scoefs)[1024];
uint16_t quantize_band_cost_cache_generation;
AACQuantizeBandCostCacheEntry quantize_band_cost_cache[256][128];
AACEncDSPContext aacdsp;
struct {
float *samples;
} buffer;
} AACEncContext;
void ff_quantize_band_cost_cache_init(struct AACEncContext *s);
#endif