78e65cd7 |
/*
* 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
|
d5a7229b |
#include "libavutil/float_dsp.h" |
78e65cd7 |
#include "avcodec.h"
#include "put_bits.h"
#include "aac.h" |
ad95307f |
#include "audio_frame_queue.h" |
78e65cd7 |
#include "psymodel.h"
|
b47a1e5c |
#include "lpc.h"
|
16837f98 |
typedef enum AACCoder { |
6a505e95 |
AAC_CODER_ANMR = 0, |
16837f98 |
AAC_CODER_TWOLOOP,
AAC_CODER_FAST, |
4bd910d8 |
|
16837f98 |
AAC_CODER_NB,
}AACCoder; |
1b122387 |
|
cc9947ff |
typedef struct AACEncOptions { |
0f4334df |
int coder; |
c5d4f87e |
int pns; |
a1c487e9 |
int tns; |
27d23ae0 |
int ltp; |
eab12d07 |
int pred; |
0f4334df |
int mid_side; |
e8576dc8 |
int intensity_stereo; |
cc9947ff |
} AACEncOptions;
|
78e65cd7 |
struct AACEncContext;
|
fd257dc4 |
typedef struct AACCoefficientsEncoder { |
78e65cd7 |
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); |
43b378a0 |
void (*quantize_and_encode_band)(struct AACEncContext *s, PutBitContext *pb, const float *in, float *out, int size, |
59216e05 |
int scale_idx, int cb, const float lambda, int rtz); |
a1c487e9 |
void (*encode_tns_info)(struct AACEncContext *s, SingleChannelElement *sce); |
27d23ae0 |
void (*encode_ltp_info)(struct AACEncContext *s, SingleChannelElement *sce, int common_window); |
76b81b10 |
void (*encode_main_pred)(struct AACEncContext *s, SingleChannelElement *sce); |
93e6b23c |
void (*adjust_common_pred)(struct AACEncContext *s, ChannelElement *cpe); |
27d23ae0 |
void (*adjust_common_ltp)(struct AACEncContext *s, ChannelElement *cpe); |
76b81b10 |
void (*apply_main_pred)(struct AACEncContext *s, SingleChannelElement *sce); |
f3f6c6b9 |
void (*apply_tns_filt)(struct AACEncContext *s, SingleChannelElement *sce); |
27d23ae0 |
void (*update_ltp)(struct AACEncContext *s, SingleChannelElement *sce);
void (*ltp_insert_new_frame)(struct AACEncContext *s); |
e06578e3 |
void (*set_special_band_scalefactors)(struct AACEncContext *s, SingleChannelElement *sce); |
6d175158 |
void (*search_for_pns)(struct AACEncContext *s, AVCodecContext *avctx, SingleChannelElement *sce); |
01ecb717 |
void (*mark_pns)(struct AACEncContext *s, AVCodecContext *avctx, SingleChannelElement *sce); |
a1c487e9 |
void (*search_for_tns)(struct AACEncContext *s, SingleChannelElement *sce); |
27d23ae0 |
void (*search_for_ltp)(struct AACEncContext *s, SingleChannelElement *sce, int common_window); |
6d175158 |
void (*search_for_ms)(struct AACEncContext *s, ChannelElement *cpe);
void (*search_for_is)(struct AACEncContext *s, AVCodecContext *avctx, ChannelElement *cpe); |
76b81b10 |
void (*search_for_pred)(struct AACEncContext *s, SingleChannelElement *sce); |
fd257dc4 |
} AACCoefficientsEncoder; |
78e65cd7 |
|
fd9212f2 |
extern const AACCoefficientsEncoder ff_aac_coders[]; |
78e65cd7 |
|
b629c67d |
typedef struct AACQuantizeBandCostCacheEntry {
float rd;
float energy; |
b91e3763 |
int bits; |
b629c67d |
char cb;
char rtz; |
b91e3763 |
uint16_t generation; |
b629c67d |
} AACQuantizeBandCostCacheEntry;
|
78e65cd7 |
/**
* AAC encoder context
*/
typedef struct AACEncContext { |
cc9947ff |
AVClass *av_class;
AACEncOptions options; ///< encoding options |
78e65cd7 |
PutBitContext pb; |
01b22147 |
FFTContext mdct1024; ///< long (1024 samples) frame transform context
FFTContext mdct128; ///< short (128 samples) frame transform context |
14285c33 |
AVFloatDSPContext *fdsp; |
65f5b96d |
float *planar_samples[8]; ///< saved preprocessed input |
78e65cd7 |
|
eab12d07 |
int profile; ///< copied from avctx |
b47a1e5c |
LPCContext lpc; ///< used by TNS |
78e65cd7 |
int samplerate_index; ///< MPEG-4 samplerate index |
04af2efa |
int channels; ///< channel count |
ce2649af |
const uint8_t *chan_map; ///< channel configuration map |
78e65cd7 |
ChannelElement *cpe; ///< channel elements
FFPsyContext psy;
struct FFPsyPreprocessContext* psypp; |
fd9212f2 |
const AACCoefficientsEncoder *coder; |
7ec74ae4 |
int cur_channel; ///< current channel for coder context |
92aa3e7f |
int random_state; |
78e65cd7 |
float lambda; |
4386f17b |
int last_frame_pb_count; ///< number of bits for the previous frame |
01ecb717 |
float lambda_sum; ///< sum(lambda), for Qvg reporting
int lambda_count; ///< count(lambda), for Qvg reporting |
7ec74ae4 |
enum RawDataBlockType cur_type; ///< channel group type cur_channel belongs to
|
ad95307f |
AudioFrameQueue afq; |
4d986b71 |
DECLARE_ALIGNED(16, int, qcoefs)[96]; ///< quantized coefficients |
9d35fa52 |
DECLARE_ALIGNED(32, float, scoefs)[1024]; ///< scaled coefficients |
9b8e2a87 |
|
b91e3763 |
uint16_t quantize_band_cost_cache_generation; |
b629c67d |
AACQuantizeBandCostCacheEntry quantize_band_cost_cache[256][128]; ///< memoization area for quantize_band_cost
|
d2ae5f77 |
void (*abs_pow34)(float *out, const float *in, const int size);
void (*quant_bands)(int *out, const float *in, const float *scaled,
int size, int is_signed, int maxval, const float Q34,
const float rounding);
|
9b8e2a87 |
struct {
float *samples;
} buffer; |
78e65cd7 |
} AACEncContext;
|
d2ae5f77 |
void ff_aac_dsp_init_x86(AACEncContext *s); |
26f3924d |
void ff_aac_coder_init_mips(AACEncContext *c); |
b629c67d |
void ff_quantize_band_cost_cache_init(struct AACEncContext *s);
|
26f3924d |
|
78e65cd7 |
#endif /* AVCODEC_AACENC_H */ |