blob: 9d244fd1f58239784e29121004f657aa2ef2b7b5
1 | /* |
2 | * AAC encoder |
3 | * Copyright (C) 2008 Konstantin Shishkov |
4 | * |
5 | * This file is part of FFmpeg. |
6 | * |
7 | * FFmpeg is free software; you can redistribute it and/or |
8 | * modify it under the terms of the GNU Lesser General Public |
9 | * License as published by the Free Software Foundation; either |
10 | * version 2.1 of the License, or (at your option) any later version. |
11 | * |
12 | * FFmpeg is distributed in the hope that it will be useful, |
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
15 | * Lesser General Public License for more details. |
16 | * |
17 | * You should have received a copy of the GNU Lesser General Public |
18 | * License along with FFmpeg; if not, write to the Free Software |
19 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
20 | */ |
21 | |
22 | #ifndef AVCODEC_AACENC_H |
23 | #define AVCODEC_AACENC_H |
24 | |
25 | #include "libavutil/float_dsp.h" |
26 | #include "avcodec.h" |
27 | #include "put_bits.h" |
28 | |
29 | #include "aac.h" |
30 | #include "audio_frame_queue.h" |
31 | #include "psymodel.h" |
32 | |
33 | #include "lpc.h" |
34 | |
35 | typedef enum AACCoder { |
36 | AAC_CODER_ANMR = 0, |
37 | AAC_CODER_TWOLOOP, |
38 | AAC_CODER_FAST, |
39 | |
40 | AAC_CODER_NB, |
41 | }AACCoder; |
42 | |
43 | typedef struct AACEncOptions { |
44 | int coder; |
45 | int pns; |
46 | int tns; |
47 | int ltp; |
48 | int pred; |
49 | int mid_side; |
50 | int intensity_stereo; |
51 | } AACEncOptions; |
52 | |
53 | struct AACEncContext; |
54 | |
55 | typedef struct AACCoefficientsEncoder { |
56 | void (*search_for_quantizers)(AVCodecContext *avctx, struct AACEncContext *s, |
57 | SingleChannelElement *sce, const float lambda); |
58 | void (*encode_window_bands_info)(struct AACEncContext *s, SingleChannelElement *sce, |
59 | int win, int group_len, const float lambda); |
60 | void (*quantize_and_encode_band)(struct AACEncContext *s, PutBitContext *pb, const float *in, float *out, int size, |
61 | int scale_idx, int cb, const float lambda, int rtz); |
62 | void (*encode_tns_info)(struct AACEncContext *s, SingleChannelElement *sce); |
63 | void (*encode_ltp_info)(struct AACEncContext *s, SingleChannelElement *sce, int common_window); |
64 | void (*encode_main_pred)(struct AACEncContext *s, SingleChannelElement *sce); |
65 | void (*adjust_common_pred)(struct AACEncContext *s, ChannelElement *cpe); |
66 | void (*adjust_common_ltp)(struct AACEncContext *s, ChannelElement *cpe); |
67 | void (*apply_main_pred)(struct AACEncContext *s, SingleChannelElement *sce); |
68 | void (*apply_tns_filt)(struct AACEncContext *s, SingleChannelElement *sce); |
69 | void (*update_ltp)(struct AACEncContext *s, SingleChannelElement *sce); |
70 | void (*ltp_insert_new_frame)(struct AACEncContext *s); |
71 | void (*set_special_band_scalefactors)(struct AACEncContext *s, SingleChannelElement *sce); |
72 | void (*search_for_pns)(struct AACEncContext *s, AVCodecContext *avctx, SingleChannelElement *sce); |
73 | void (*mark_pns)(struct AACEncContext *s, AVCodecContext *avctx, SingleChannelElement *sce); |
74 | void (*search_for_tns)(struct AACEncContext *s, SingleChannelElement *sce); |
75 | void (*search_for_ltp)(struct AACEncContext *s, SingleChannelElement *sce, int common_window); |
76 | void (*search_for_ms)(struct AACEncContext *s, ChannelElement *cpe); |
77 | void (*search_for_is)(struct AACEncContext *s, AVCodecContext *avctx, ChannelElement *cpe); |
78 | void (*search_for_pred)(struct AACEncContext *s, SingleChannelElement *sce); |
79 | } AACCoefficientsEncoder; |
80 | |
81 | extern AACCoefficientsEncoder ff_aac_coders[]; |
82 | |
83 | typedef struct AACQuantizeBandCostCacheEntry { |
84 | float rd; |
85 | float energy; |
86 | int bits; |
87 | char cb; |
88 | char rtz; |
89 | uint16_t generation; |
90 | } AACQuantizeBandCostCacheEntry; |
91 | |
92 | /** |
93 | * AAC encoder context |
94 | */ |
95 | typedef struct AACEncContext { |
96 | AVClass *av_class; |
97 | AACEncOptions options; ///< encoding options |
98 | PutBitContext pb; |
99 | FFTContext mdct1024; ///< long (1024 samples) frame transform context |
100 | FFTContext mdct128; ///< short (128 samples) frame transform context |
101 | AVFloatDSPContext *fdsp; |
102 | float *planar_samples[8]; ///< saved preprocessed input |
103 | |
104 | int profile; ///< copied from avctx |
105 | LPCContext lpc; ///< used by TNS |
106 | int samplerate_index; ///< MPEG-4 samplerate index |
107 | int channels; ///< channel count |
108 | const uint8_t *chan_map; ///< channel configuration map |
109 | |
110 | ChannelElement *cpe; ///< channel elements |
111 | FFPsyContext psy; |
112 | struct FFPsyPreprocessContext* psypp; |
113 | AACCoefficientsEncoder *coder; |
114 | int cur_channel; ///< current channel for coder context |
115 | int random_state; |
116 | float lambda; |
117 | int last_frame_pb_count; ///< number of bits for the previous frame |
118 | float lambda_sum; ///< sum(lambda), for Qvg reporting |
119 | int lambda_count; ///< count(lambda), for Qvg reporting |
120 | enum RawDataBlockType cur_type; ///< channel group type cur_channel belongs to |
121 | |
122 | AudioFrameQueue afq; |
123 | DECLARE_ALIGNED(16, int, qcoefs)[96]; ///< quantized coefficients |
124 | DECLARE_ALIGNED(32, float, scoefs)[1024]; ///< scaled coefficients |
125 | |
126 | uint16_t quantize_band_cost_cache_generation; |
127 | AACQuantizeBandCostCacheEntry quantize_band_cost_cache[256][128]; ///< memoization area for quantize_band_cost |
128 | |
129 | void (*abs_pow34)(float *out, const float *in, const int size); |
130 | void (*quant_bands)(int *out, const float *in, const float *scaled, |
131 | int size, int is_signed, int maxval, const float Q34, |
132 | const float rounding); |
133 | |
134 | struct { |
135 | float *samples; |
136 | } buffer; |
137 | } AACEncContext; |
138 | |
139 | void ff_aac_dsp_init_x86(AACEncContext *s); |
140 | void ff_aac_coder_init_mips(AACEncContext *c); |
141 | void ff_quantize_band_cost_cache_init(struct AACEncContext *s); |
142 | |
143 | |
144 | #endif /* AVCODEC_AACENC_H */ |
145 |