Mercurial > libavcodec.hg
annotate aacenc.c @ 12483:0159a19bfff7 libavcodec
aacdec: Rework channel mapping compatibility hacks.
For a PCE based configuration map the channels solely based on tags.
For an indexed configuration map the channels solely based on position.
This works with all known exotic samples including al17, elem_id0, bad_concat,
and lfe_is_sce.
author | alexc |
---|---|
date | Fri, 10 Sep 2010 18:01:48 +0000 |
parents | 7919771169c5 |
children |
rev | line source |
---|---|
7571 | 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 /** | |
11644
7dd2a45249a9
Remove explicit filename from Doxygen @file commands.
diego
parents:
11580
diff
changeset
|
23 * @file |
7571 | 24 * AAC encoder |
25 */ | |
26 | |
27 /*********************************** | |
28 * TODOs: | |
7584 | 29 * add sane pulse detection |
7681 | 30 * add temporal noise shaping |
7571 | 31 ***********************************/ |
32 | |
33 #include "avcodec.h" | |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
34 #include "put_bits.h" |
7571 | 35 #include "dsputil.h" |
36 #include "mpeg4audio.h" | |
37 | |
38 #include "aac.h" | |
39 #include "aactab.h" | |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
40 #include "aacenc.h" |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
41 |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
42 #include "psymodel.h" |
7571 | 43 |
12095 | 44 #define AAC_MAX_CHANNELS 6 |
45 | |
7571 | 46 static const uint8_t swb_size_1024_96[] = { |
47 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, | |
48 12, 12, 12, 12, 12, 16, 16, 24, 28, 36, 44, | |
49 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64 | |
50 }; | |
51 | |
52 static const uint8_t swb_size_1024_64[] = { | |
53 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, | |
54 12, 12, 12, 16, 16, 16, 20, 24, 24, 28, 36, | |
55 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40 | |
56 }; | |
57 | |
58 static const uint8_t swb_size_1024_48[] = { | |
59 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8, | |
60 12, 12, 12, 12, 16, 16, 20, 20, 24, 24, 28, 28, | |
61 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, | |
62 96 | |
63 }; | |
64 | |
65 static const uint8_t swb_size_1024_32[] = { | |
66 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8, | |
67 12, 12, 12, 12, 16, 16, 20, 20, 24, 24, 28, 28, | |
68 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32 | |
69 }; | |
70 | |
71 static const uint8_t swb_size_1024_24[] = { | |
72 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, | |
73 12, 12, 12, 12, 16, 16, 16, 20, 20, 24, 24, 28, 28, | |
74 32, 36, 36, 40, 44, 48, 52, 52, 64, 64, 64, 64, 64 | |
75 }; | |
76 | |
77 static const uint8_t swb_size_1024_16[] = { | |
78 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, | |
79 12, 12, 12, 12, 12, 12, 12, 12, 12, 16, 16, 16, 16, 20, 20, 20, 24, 24, 28, 28, | |
80 32, 36, 40, 40, 44, 48, 52, 56, 60, 64, 64, 64 | |
81 }; | |
82 | |
83 static const uint8_t swb_size_1024_8[] = { | |
84 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, | |
85 16, 16, 16, 16, 16, 16, 16, 20, 20, 20, 20, 24, 24, 24, 28, 28, | |
86 32, 36, 36, 40, 44, 48, 52, 56, 60, 64, 80 | |
87 }; | |
88 | |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
89 static const uint8_t *swb_size_1024[] = { |
7571 | 90 swb_size_1024_96, swb_size_1024_96, swb_size_1024_64, |
91 swb_size_1024_48, swb_size_1024_48, swb_size_1024_32, | |
92 swb_size_1024_24, swb_size_1024_24, swb_size_1024_16, | |
93 swb_size_1024_16, swb_size_1024_16, swb_size_1024_8 | |
94 }; | |
95 | |
96 static const uint8_t swb_size_128_96[] = { | |
97 4, 4, 4, 4, 4, 4, 8, 8, 8, 16, 28, 36 | |
98 }; | |
99 | |
100 static const uint8_t swb_size_128_48[] = { | |
101 4, 4, 4, 4, 4, 8, 8, 8, 12, 12, 12, 16, 16, 16 | |
102 }; | |
103 | |
104 static const uint8_t swb_size_128_24[] = { | |
105 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 12, 12, 16, 16, 20 | |
106 }; | |
107 | |
108 static const uint8_t swb_size_128_16[] = { | |
109 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 12, 12, 16, 20, 20 | |
110 }; | |
111 | |
112 static const uint8_t swb_size_128_8[] = { | |
113 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 12, 16, 20, 20 | |
114 }; | |
115 | |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
116 static const uint8_t *swb_size_128[] = { |
7571 | 117 /* the last entry on the following row is swb_size_128_64 but is a |
118 duplicate of swb_size_128_96 */ | |
119 swb_size_128_96, swb_size_128_96, swb_size_128_96, | |
120 swb_size_128_48, swb_size_128_48, swb_size_128_48, | |
121 swb_size_128_24, swb_size_128_24, swb_size_128_16, | |
122 swb_size_128_16, swb_size_128_16, swb_size_128_8 | |
123 }; | |
124 | |
125 /** default channel configurations */ | |
126 static const uint8_t aac_chan_configs[6][5] = { | |
7585 | 127 {1, TYPE_SCE}, // 1 channel - single channel element |
128 {1, TYPE_CPE}, // 2 channels - channel pair | |
129 {2, TYPE_SCE, TYPE_CPE}, // 3 channels - center + stereo | |
130 {3, TYPE_SCE, TYPE_CPE, TYPE_SCE}, // 4 channels - front center + stereo + back center | |
131 {3, TYPE_SCE, TYPE_CPE, TYPE_CPE}, // 5 channels - front center + stereo + back stereo | |
132 {4, TYPE_SCE, TYPE_CPE, TYPE_CPE, TYPE_LFE}, // 6 channels - front center + stereo + back stereo + LFE | |
7571 | 133 }; |
134 | |
135 /** | |
136 * Make AAC audio config object. | |
137 * @see 1.6.2.1 "Syntax - AudioSpecificConfig" | |
138 */ | |
139 static void put_audio_specific_config(AVCodecContext *avctx) | |
140 { | |
141 PutBitContext pb; | |
142 AACEncContext *s = avctx->priv_data; | |
143 | |
144 init_put_bits(&pb, avctx->extradata, avctx->extradata_size*8); | |
145 put_bits(&pb, 5, 2); //object type - AAC-LC | |
146 put_bits(&pb, 4, s->samplerate_index); //sample rate index | |
147 put_bits(&pb, 4, avctx->channels); | |
148 //GASpecificConfig | |
149 put_bits(&pb, 1, 0); //frame length - 1024 samples | |
150 put_bits(&pb, 1, 0); //does not depend on core coder | |
151 put_bits(&pb, 1, 0); //is not extension | |
152 flush_put_bits(&pb); | |
153 } | |
154 | |
155 static av_cold int aac_encode_init(AVCodecContext *avctx) | |
156 { | |
157 AACEncContext *s = avctx->priv_data; | |
158 int i; | |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
159 const uint8_t *sizes[2]; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
160 int lengths[2]; |
7571 | 161 |
162 avctx->frame_size = 1024; | |
163 | |
9936 | 164 for (i = 0; i < 16; i++) |
165 if (avctx->sample_rate == ff_mpeg4audio_sample_rates[i]) | |
7571 | 166 break; |
9936 | 167 if (i == 16) { |
7571 | 168 av_log(avctx, AV_LOG_ERROR, "Unsupported sample rate %d\n", avctx->sample_rate); |
169 return -1; | |
170 } | |
12095 | 171 if (avctx->channels > AAC_MAX_CHANNELS) { |
7571 | 172 av_log(avctx, AV_LOG_ERROR, "Unsupported number of channels: %d\n", avctx->channels); |
173 return -1; | |
174 } | |
11580
baf1f1555e92
aacenc: Error when an unsupported profile is requested
alexc
parents:
11560
diff
changeset
|
175 if (avctx->profile != FF_PROFILE_UNKNOWN && avctx->profile != FF_PROFILE_AAC_LOW) { |
baf1f1555e92
aacenc: Error when an unsupported profile is requested
alexc
parents:
11560
diff
changeset
|
176 av_log(avctx, AV_LOG_ERROR, "Unsupported profile %d\n", avctx->profile); |
baf1f1555e92
aacenc: Error when an unsupported profile is requested
alexc
parents:
11560
diff
changeset
|
177 return -1; |
baf1f1555e92
aacenc: Error when an unsupported profile is requested
alexc
parents:
11560
diff
changeset
|
178 } |
11687
855ec3d8a62b
Error out when too many bits per frame are requested.
alexc
parents:
11644
diff
changeset
|
179 if (1024.0 * avctx->bit_rate / avctx->sample_rate > 6144 * avctx->channels) { |
855ec3d8a62b
Error out when too many bits per frame are requested.
alexc
parents:
11644
diff
changeset
|
180 av_log(avctx, AV_LOG_ERROR, "Too many bits per frame requested\n"); |
855ec3d8a62b
Error out when too many bits per frame are requested.
alexc
parents:
11644
diff
changeset
|
181 return -1; |
855ec3d8a62b
Error out when too many bits per frame are requested.
alexc
parents:
11644
diff
changeset
|
182 } |
7571 | 183 s->samplerate_index = i; |
184 | |
185 dsputil_init(&s->dsp, avctx); | |
9658
67a20f0eb42c
Support for getting (i)MDCT output multiplied by a constant scaling factor.
serge
parents:
9428
diff
changeset
|
186 ff_mdct_init(&s->mdct1024, 11, 0, 1.0); |
67a20f0eb42c
Support for getting (i)MDCT output multiplied by a constant scaling factor.
serge
parents:
9428
diff
changeset
|
187 ff_mdct_init(&s->mdct128, 8, 0, 1.0); |
7584 | 188 // window init |
189 ff_kbd_window_init(ff_aac_kbd_long_1024, 4.0, 1024); | |
190 ff_kbd_window_init(ff_aac_kbd_short_128, 6.0, 128); | |
10827
3d011a01a6a0
Add support for hard-coded MDCT-related ff_sine_windows tables.
reimar
parents:
10145
diff
changeset
|
191 ff_init_ff_sine_windows(10); |
3d011a01a6a0
Add support for hard-coded MDCT-related ff_sine_windows tables.
reimar
parents:
10145
diff
changeset
|
192 ff_init_ff_sine_windows(7); |
7571 | 193 |
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
194 s->samples = av_malloc(2 * 1024 * avctx->channels * sizeof(s->samples[0])); |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
195 s->cpe = av_mallocz(sizeof(ChannelElement) * aac_chan_configs[avctx->channels-1][0]); |
11994 | 196 avctx->extradata = av_mallocz(2 + FF_INPUT_BUFFER_PADDING_SIZE); |
7571 | 197 avctx->extradata_size = 2; |
198 put_audio_specific_config(avctx); | |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
199 |
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
200 sizes[0] = swb_size_1024[i]; |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
201 sizes[1] = swb_size_128[i]; |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
202 lengths[0] = ff_aac_num_swb_1024[i]; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
203 lengths[1] = ff_aac_num_swb_128[i]; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
204 ff_psy_init(&s->psy, avctx, 2, sizes, lengths); |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
205 s->psypp = ff_psy_preprocess_init(avctx); |
11729
6598cef880fc
aacenc: Select the TLS (two-loop search) as the default scalefactor coder.
alexc
parents:
11728
diff
changeset
|
206 s->coder = &ff_aac_coders[2]; |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
207 |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
208 s->lambda = avctx->global_quality ? avctx->global_quality : 120; |
11932 | 209 |
210 ff_aac_tableinit(); | |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
211 |
7571 | 212 return 0; |
213 } | |
214 | |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
215 static void apply_window_and_mdct(AVCodecContext *avctx, AACEncContext *s, |
12190
4be87c8091bf
aacenc: Refactor apply_window_and_mdct() so it no longer takes an offset channel.
alexc
parents:
12110
diff
changeset
|
216 SingleChannelElement *sce, short *audio) |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
217 { |
12190
4be87c8091bf
aacenc: Refactor apply_window_and_mdct() so it no longer takes an offset channel.
alexc
parents:
12110
diff
changeset
|
218 int i, k; |
4be87c8091bf
aacenc: Refactor apply_window_and_mdct() so it no longer takes an offset channel.
alexc
parents:
12110
diff
changeset
|
219 const int chans = avctx->channels; |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
220 const float * lwindow = sce->ics.use_kb_window[0] ? ff_aac_kbd_long_1024 : ff_sine_1024; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
221 const float * swindow = sce->ics.use_kb_window[0] ? ff_aac_kbd_short_128 : ff_sine_128; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
222 const float * pwindow = sce->ics.use_kb_window[1] ? ff_aac_kbd_short_128 : ff_sine_128; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
223 |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
224 if (sce->ics.window_sequence[0] != EIGHT_SHORT_SEQUENCE) { |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
225 memcpy(s->output, sce->saved, sizeof(float)*1024); |
9936 | 226 if (sce->ics.window_sequence[0] == LONG_STOP_SEQUENCE) { |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
227 memset(s->output, 0, sizeof(s->output[0]) * 448); |
9936 | 228 for (i = 448; i < 576; i++) |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
229 s->output[i] = sce->saved[i] * pwindow[i - 448]; |
9936 | 230 for (i = 576; i < 704; i++) |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
231 s->output[i] = sce->saved[i]; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
232 } |
9936 | 233 if (sce->ics.window_sequence[0] != LONG_START_SEQUENCE) { |
12190
4be87c8091bf
aacenc: Refactor apply_window_and_mdct() so it no longer takes an offset channel.
alexc
parents:
12110
diff
changeset
|
234 for (i = 0; i < 1024; i++) { |
4be87c8091bf
aacenc: Refactor apply_window_and_mdct() so it no longer takes an offset channel.
alexc
parents:
12110
diff
changeset
|
235 s->output[i+1024] = audio[i * chans] * lwindow[1024 - i - 1]; |
4be87c8091bf
aacenc: Refactor apply_window_and_mdct() so it no longer takes an offset channel.
alexc
parents:
12110
diff
changeset
|
236 sce->saved[i] = audio[i * chans] * lwindow[i]; |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
237 } |
9936 | 238 } else { |
12190
4be87c8091bf
aacenc: Refactor apply_window_and_mdct() so it no longer takes an offset channel.
alexc
parents:
12110
diff
changeset
|
239 for (i = 0; i < 448; i++) |
4be87c8091bf
aacenc: Refactor apply_window_and_mdct() so it no longer takes an offset channel.
alexc
parents:
12110
diff
changeset
|
240 s->output[i+1024] = audio[i * chans]; |
4be87c8091bf
aacenc: Refactor apply_window_and_mdct() so it no longer takes an offset channel.
alexc
parents:
12110
diff
changeset
|
241 for (; i < 576; i++) |
4be87c8091bf
aacenc: Refactor apply_window_and_mdct() so it no longer takes an offset channel.
alexc
parents:
12110
diff
changeset
|
242 s->output[i+1024] = audio[i * chans] * swindow[576 - i - 1]; |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
243 memset(s->output+1024+576, 0, sizeof(s->output[0]) * 448); |
12190
4be87c8091bf
aacenc: Refactor apply_window_and_mdct() so it no longer takes an offset channel.
alexc
parents:
12110
diff
changeset
|
244 for (i = 0; i < 1024; i++) |
4be87c8091bf
aacenc: Refactor apply_window_and_mdct() so it no longer takes an offset channel.
alexc
parents:
12110
diff
changeset
|
245 sce->saved[i] = audio[i * chans]; |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
246 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
247 ff_mdct_calc(&s->mdct1024, sce->coeffs, s->output); |
9936 | 248 } else { |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
249 for (k = 0; k < 1024; k += 128) { |
9936 | 250 for (i = 448 + k; i < 448 + k + 256; i++) |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
251 s->output[i - 448 - k] = (i < 1024) |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
252 ? sce->saved[i] |
12190
4be87c8091bf
aacenc: Refactor apply_window_and_mdct() so it no longer takes an offset channel.
alexc
parents:
12110
diff
changeset
|
253 : audio[(i-1024)*chans]; |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
254 s->dsp.vector_fmul (s->output, k ? swindow : pwindow, 128); |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
255 s->dsp.vector_fmul_reverse(s->output+128, s->output+128, swindow, 128); |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
256 ff_mdct_calc(&s->mdct128, sce->coeffs + k, s->output); |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
257 } |
12190
4be87c8091bf
aacenc: Refactor apply_window_and_mdct() so it no longer takes an offset channel.
alexc
parents:
12110
diff
changeset
|
258 for (i = 0; i < 1024; i++) |
4be87c8091bf
aacenc: Refactor apply_window_and_mdct() so it no longer takes an offset channel.
alexc
parents:
12110
diff
changeset
|
259 sce->saved[i] = audio[i * chans]; |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
260 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
261 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
262 |
7571 | 263 /** |
264 * Encode ics_info element. | |
265 * @see Table 4.6 (syntax of ics_info) | |
266 */ | |
7681 | 267 static void put_ics_info(AACEncContext *s, IndividualChannelStream *info) |
7571 | 268 { |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
269 int w; |
7571 | 270 |
271 put_bits(&s->pb, 1, 0); // ics_reserved bit | |
272 put_bits(&s->pb, 2, info->window_sequence[0]); | |
273 put_bits(&s->pb, 1, info->use_kb_window[0]); | |
9936 | 274 if (info->window_sequence[0] != EIGHT_SHORT_SEQUENCE) { |
7571 | 275 put_bits(&s->pb, 6, info->max_sfb); |
276 put_bits(&s->pb, 1, 0); // no prediction | |
9936 | 277 } else { |
7571 | 278 put_bits(&s->pb, 4, info->max_sfb); |
9938
6c1ac45b3097
cosmetics: Remove unnecessary {} around if/for blocks;
diego
parents:
9937
diff
changeset
|
279 for (w = 1; w < 8; w++) |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
280 put_bits(&s->pb, 1, !info->group_len[w]); |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
281 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
282 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
283 |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
284 /** |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
285 * Encode MS data. |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
286 * @see 4.6.8.1 "Joint Coding - M/S Stereo" |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
287 */ |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
288 static void encode_ms_info(PutBitContext *pb, ChannelElement *cpe) |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
289 { |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
290 int i, w; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
291 |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
292 put_bits(pb, 2, cpe->ms_mode); |
9938
6c1ac45b3097
cosmetics: Remove unnecessary {} around if/for blocks;
diego
parents:
9937
diff
changeset
|
293 if (cpe->ms_mode == 1) |
6c1ac45b3097
cosmetics: Remove unnecessary {} around if/for blocks;
diego
parents:
9937
diff
changeset
|
294 for (w = 0; w < cpe->ch[0].ics.num_windows; w += cpe->ch[0].ics.group_len[w]) |
9936 | 295 for (i = 0; i < cpe->ch[0].ics.max_sfb; i++) |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
296 put_bits(pb, 1, cpe->ms_mask[w*16 + i]); |
7571 | 297 } |
298 | |
299 /** | |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
300 * Produce integer coefficients from scalefactors provided by the model. |
7681 | 301 */ |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
302 static void adjust_frame_information(AACEncContext *apc, ChannelElement *cpe, int chans) |
7681 | 303 { |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
304 int i, w, w2, g, ch; |
12445
7919771169c5
aacenc: Remove an unused variable from adjust_frame_information().
alexc
parents:
12444
diff
changeset
|
305 int start, maxsfb, cmaxsfb; |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
306 |
9936 | 307 for (ch = 0; ch < chans; ch++) { |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
308 IndividualChannelStream *ics = &cpe->ch[ch].ics; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
309 start = 0; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
310 maxsfb = 0; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
311 cpe->ch[ch].pulse.num_pulse = 0; |
9936 | 312 for (w = 0; w < ics->num_windows*16; w += 16) { |
313 for (g = 0; g < ics->num_swb; g++) { | |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
314 //apply M/S |
12441 | 315 if (cpe->common_window && !ch && cpe->ms_mask[w + g]) { |
9936 | 316 for (i = 0; i < ics->swb_sizes[g]; i++) { |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
317 cpe->ch[0].coeffs[start+i] = (cpe->ch[0].coeffs[start+i] + cpe->ch[1].coeffs[start+i]) / 2.0; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
318 cpe->ch[1].coeffs[start+i] = cpe->ch[0].coeffs[start+i] - cpe->ch[1].coeffs[start+i]; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
319 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
320 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
321 start += ics->swb_sizes[g]; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
322 } |
9938
6c1ac45b3097
cosmetics: Remove unnecessary {} around if/for blocks;
diego
parents:
9937
diff
changeset
|
323 for (cmaxsfb = ics->num_swb; cmaxsfb > 0 && cpe->ch[ch].zeroes[w+cmaxsfb-1]; cmaxsfb--) |
6c1ac45b3097
cosmetics: Remove unnecessary {} around if/for blocks;
diego
parents:
9937
diff
changeset
|
324 ; |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
325 maxsfb = FFMAX(maxsfb, cmaxsfb); |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
326 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
327 ics->max_sfb = maxsfb; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
328 |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
329 //adjust zero bands for window groups |
9936 | 330 for (w = 0; w < ics->num_windows; w += ics->group_len[w]) { |
331 for (g = 0; g < ics->max_sfb; g++) { | |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
332 i = 1; |
9936 | 333 for (w2 = w; w2 < w + ics->group_len[w]; w2++) { |
334 if (!cpe->ch[ch].zeroes[w2*16 + g]) { | |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
335 i = 0; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
336 break; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
337 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
338 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
339 cpe->ch[ch].zeroes[w*16 + g] = i; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
340 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
341 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
342 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
343 |
9936 | 344 if (chans > 1 && cpe->common_window) { |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
345 IndividualChannelStream *ics0 = &cpe->ch[0].ics; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
346 IndividualChannelStream *ics1 = &cpe->ch[1].ics; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
347 int msc = 0; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
348 ics0->max_sfb = FFMAX(ics0->max_sfb, ics1->max_sfb); |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
349 ics1->max_sfb = ics0->max_sfb; |
9936 | 350 for (w = 0; w < ics0->num_windows*16; w += 16) |
351 for (i = 0; i < ics0->max_sfb; i++) | |
9938
6c1ac45b3097
cosmetics: Remove unnecessary {} around if/for blocks;
diego
parents:
9937
diff
changeset
|
352 if (cpe->ms_mask[w+i]) |
6c1ac45b3097
cosmetics: Remove unnecessary {} around if/for blocks;
diego
parents:
9937
diff
changeset
|
353 msc++; |
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
354 if (msc == 0 || ics0->max_sfb == 0) |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
355 cpe->ms_mode = 0; |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
356 else |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
357 cpe->ms_mode = msc < ics0->max_sfb ? 1 : 2; |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
358 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
359 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
360 |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
361 /** |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
362 * Encode scalefactor band coding type. |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
363 */ |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
364 static void encode_band_info(AACEncContext *s, SingleChannelElement *sce) |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
365 { |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
366 int w; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
367 |
9938
6c1ac45b3097
cosmetics: Remove unnecessary {} around if/for blocks;
diego
parents:
9937
diff
changeset
|
368 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
369 s->coder->encode_window_bands_info(s, sce, w, sce->ics.group_len[w], s->lambda); |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
370 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
371 |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
372 /** |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
373 * Encode scalefactors. |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
374 */ |
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
375 static void encode_scale_factors(AVCodecContext *avctx, AACEncContext *s, |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
376 SingleChannelElement *sce) |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
377 { |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
378 int off = sce->sf_idx[0], diff; |
7681 | 379 int i, w; |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
380 |
9936 | 381 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { |
382 for (i = 0; i < sce->ics.max_sfb; i++) { | |
383 if (!sce->zeroes[w*16 + i]) { | |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
384 diff = sce->sf_idx[w*16 + i] - off + SCALE_DIFF_ZERO; |
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
385 if (diff < 0 || diff > 120) |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
386 av_log(avctx, AV_LOG_ERROR, "Scalefactor difference is too big to be coded\n"); |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
387 off = sce->sf_idx[w*16 + i]; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
388 put_bits(&s->pb, ff_aac_scalefactor_bits[diff], ff_aac_scalefactor_code[diff]); |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
389 } |
7681 | 390 } |
391 } | |
392 } | |
393 | |
394 /** | |
7584 | 395 * Encode pulse data. |
396 */ | |
7672
1c01b74dc78c
Do not pass unnecessary arguments to AAC encoder functions
kostya
parents:
7605
diff
changeset
|
397 static void encode_pulses(AACEncContext *s, Pulse *pulse) |
7584 | 398 { |
399 int i; | |
400 | |
401 put_bits(&s->pb, 1, !!pulse->num_pulse); | |
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
402 if (!pulse->num_pulse) |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
403 return; |
7584 | 404 |
405 put_bits(&s->pb, 2, pulse->num_pulse - 1); | |
406 put_bits(&s->pb, 6, pulse->start); | |
9936 | 407 for (i = 0; i < pulse->num_pulse; i++) { |
7585 | 408 put_bits(&s->pb, 5, pulse->pos[i]); |
7584 | 409 put_bits(&s->pb, 4, pulse->amp[i]); |
410 } | |
411 } | |
412 | |
413 /** | |
414 * Encode spectral coefficients processed by psychoacoustic model. | |
415 */ | |
7672
1c01b74dc78c
Do not pass unnecessary arguments to AAC encoder functions
kostya
parents:
7605
diff
changeset
|
416 static void encode_spectral_coeffs(AACEncContext *s, SingleChannelElement *sce) |
7584 | 417 { |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
418 int start, i, w, w2; |
7584 | 419 |
9936 | 420 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { |
7584 | 421 start = 0; |
9936 | 422 for (i = 0; i < sce->ics.max_sfb; i++) { |
423 if (sce->zeroes[w*16 + i]) { | |
7672
1c01b74dc78c
Do not pass unnecessary arguments to AAC encoder functions
kostya
parents:
7605
diff
changeset
|
424 start += sce->ics.swb_sizes[i]; |
7584 | 425 continue; |
426 } | |
9938
6c1ac45b3097
cosmetics: Remove unnecessary {} around if/for blocks;
diego
parents:
9937
diff
changeset
|
427 for (w2 = w; w2 < w + sce->ics.group_len[w]; w2++) |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
428 s->coder->quantize_and_encode_band(s, &s->pb, sce->coeffs + start + w2*128, |
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
429 sce->ics.swb_sizes[i], |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
430 sce->sf_idx[w*16 + i], |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
431 sce->band_type[w*16 + i], |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
432 s->lambda); |
7672
1c01b74dc78c
Do not pass unnecessary arguments to AAC encoder functions
kostya
parents:
7605
diff
changeset
|
433 start += sce->ics.swb_sizes[i]; |
7584 | 434 } |
435 } | |
436 } | |
437 | |
438 /** | |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
439 * Encode one channel of audio data. |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
440 */ |
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
441 static int encode_individual_channel(AVCodecContext *avctx, AACEncContext *s, |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
442 SingleChannelElement *sce, |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
443 int common_window) |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
444 { |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
445 put_bits(&s->pb, 8, sce->sf_idx[0]); |
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
446 if (!common_window) |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
447 put_ics_info(s, &sce->ics); |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
448 encode_band_info(s, sce); |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
449 encode_scale_factors(avctx, s, sce); |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
450 encode_pulses(s, &sce->pulse); |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
451 put_bits(&s->pb, 1, 0); //tns |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
452 put_bits(&s->pb, 1, 0); //ssr |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
453 encode_spectral_coeffs(s, sce); |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
454 return 0; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
455 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
456 |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
457 /** |
7571 | 458 * Write some auxiliary information about the created AAC file. |
459 */ | |
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
460 static void put_bitstream_info(AVCodecContext *avctx, AACEncContext *s, |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
461 const char *name) |
7571 | 462 { |
463 int i, namelen, padbits; | |
464 | |
465 namelen = strlen(name) + 2; | |
7585 | 466 put_bits(&s->pb, 3, TYPE_FIL); |
7571 | 467 put_bits(&s->pb, 4, FFMIN(namelen, 15)); |
9936 | 468 if (namelen >= 15) |
7571 | 469 put_bits(&s->pb, 8, namelen - 16); |
470 put_bits(&s->pb, 4, 0); //extension type - filler | |
471 padbits = 8 - (put_bits_count(&s->pb) & 7); | |
472 align_put_bits(&s->pb); | |
9936 | 473 for (i = 0; i < namelen - 2; i++) |
7571 | 474 put_bits(&s->pb, 8, name[i]); |
475 put_bits(&s->pb, 12 - padbits, 0); | |
476 } | |
477 | |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
478 static int aac_encode_frame(AVCodecContext *avctx, |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
479 uint8_t *frame, int buf_size, void *data) |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
480 { |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
481 AACEncContext *s = avctx->priv_data; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
482 int16_t *samples = s->samples, *samples2, *la; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
483 ChannelElement *cpe; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
484 int i, j, chans, tag, start_ch; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
485 const uint8_t *chan_map = aac_chan_configs[avctx->channels-1]; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
486 int chan_el_counter[4]; |
12095 | 487 FFPsyWindowInfo windows[AAC_MAX_CHANNELS]; |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
488 |
9936 | 489 if (s->last_frame) |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
490 return 0; |
9936 | 491 if (data) { |
492 if (!s->psypp) { | |
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
493 memcpy(s->samples + 1024 * avctx->channels, data, |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
494 1024 * avctx->channels * sizeof(s->samples[0])); |
9936 | 495 } else { |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
496 start_ch = 0; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
497 samples2 = s->samples + 1024 * avctx->channels; |
9936 | 498 for (i = 0; i < chan_map[0]; i++) { |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
499 tag = chan_map[i+1]; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
500 chans = tag == TYPE_CPE ? 2 : 1; |
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
501 ff_psy_preprocess(s->psypp, (uint16_t*)data + start_ch, |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
502 samples2 + start_ch, start_ch, chans); |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
503 start_ch += chans; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
504 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
505 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
506 } |
9936 | 507 if (!avctx->frame_number) { |
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
508 memcpy(s->samples, s->samples + 1024 * avctx->channels, |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
509 1024 * avctx->channels * sizeof(s->samples[0])); |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
510 return 0; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
511 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
512 |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
513 start_ch = 0; |
9936 | 514 for (i = 0; i < chan_map[0]; i++) { |
9940
580fad942ae6
Refactor windowing and early psy from bitstream writing parts of the AAC encoder.
alexc
parents:
9939
diff
changeset
|
515 FFPsyWindowInfo* wi = windows + start_ch; |
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
516 tag = chan_map[i+1]; |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
517 chans = tag == TYPE_CPE ? 2 : 1; |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
518 cpe = &s->cpe[i]; |
9936 | 519 for (j = 0; j < chans; j++) { |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
520 IndividualChannelStream *ics = &cpe->ch[j].ics; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
521 int k; |
12191
335efeae3bb7
aacenc: Adjust array offsets for the current channel before calling ff_psy_suggest_window().
alexc
parents:
12190
diff
changeset
|
522 int cur_channel = start_ch + j; |
335efeae3bb7
aacenc: Adjust array offsets for the current channel before calling ff_psy_suggest_window().
alexc
parents:
12190
diff
changeset
|
523 samples2 = samples + cur_channel; |
335efeae3bb7
aacenc: Adjust array offsets for the current channel before calling ff_psy_suggest_window().
alexc
parents:
12190
diff
changeset
|
524 la = samples2 + (448+64) * avctx->channels; |
335efeae3bb7
aacenc: Adjust array offsets for the current channel before calling ff_psy_suggest_window().
alexc
parents:
12190
diff
changeset
|
525 if (!data) |
335efeae3bb7
aacenc: Adjust array offsets for the current channel before calling ff_psy_suggest_window().
alexc
parents:
12190
diff
changeset
|
526 la = NULL; |
12109 | 527 if (tag == TYPE_LFE) { |
528 wi[j].window_type[0] = ONLY_LONG_SEQUENCE; | |
529 wi[j].window_shape = 0; | |
530 wi[j].num_windows = 1; | |
531 wi[j].grouping[0] = 1; | |
532 } else { | |
12191
335efeae3bb7
aacenc: Adjust array offsets for the current channel before calling ff_psy_suggest_window().
alexc
parents:
12190
diff
changeset
|
533 wi[j] = ff_psy_suggest_window(&s->psy, samples2, la, cur_channel, |
12110 | 534 ics->window_sequence[0]); |
12109 | 535 } |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
536 ics->window_sequence[1] = ics->window_sequence[0]; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
537 ics->window_sequence[0] = wi[j].window_type[0]; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
538 ics->use_kb_window[1] = ics->use_kb_window[0]; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
539 ics->use_kb_window[0] = wi[j].window_shape; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
540 ics->num_windows = wi[j].num_windows; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
541 ics->swb_sizes = s->psy.bands [ics->num_windows == 8]; |
12109 | 542 ics->num_swb = tag == TYPE_LFE ? 12 : s->psy.num_bands[ics->num_windows == 8]; |
9936 | 543 for (k = 0; k < ics->num_windows; k++) |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
544 ics->group_len[k] = wi[j].grouping[k]; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
545 |
12191
335efeae3bb7
aacenc: Adjust array offsets for the current channel before calling ff_psy_suggest_window().
alexc
parents:
12190
diff
changeset
|
546 apply_window_and_mdct(avctx, s, &cpe->ch[j], samples2); |
9940
580fad942ae6
Refactor windowing and early psy from bitstream writing parts of the AAC encoder.
alexc
parents:
9939
diff
changeset
|
547 } |
580fad942ae6
Refactor windowing and early psy from bitstream writing parts of the AAC encoder.
alexc
parents:
9939
diff
changeset
|
548 start_ch += chans; |
580fad942ae6
Refactor windowing and early psy from bitstream writing parts of the AAC encoder.
alexc
parents:
9939
diff
changeset
|
549 } |
9941 | 550 do { |
551 int frame_bits; | |
9942 | 552 init_put_bits(&s->pb, frame, buf_size*8); |
553 if ((avctx->frame_number & 0xFF)==1 && !(avctx->flags & CODEC_FLAG_BITEXACT)) | |
554 put_bitstream_info(avctx, s, LIBAVCODEC_IDENT); | |
555 start_ch = 0; | |
556 memset(chan_el_counter, 0, sizeof(chan_el_counter)); | |
557 for (i = 0; i < chan_map[0]; i++) { | |
558 FFPsyWindowInfo* wi = windows + start_ch; | |
559 tag = chan_map[i+1]; | |
560 chans = tag == TYPE_CPE ? 2 : 1; | |
561 cpe = &s->cpe[i]; | |
12443 | 562 put_bits(&s->pb, 3, tag); |
563 put_bits(&s->pb, 4, chan_el_counter[tag]++); | |
9942 | 564 for (j = 0; j < chans; j++) { |
11706
15e7486e5c7a
Set cur_channel in the AAC encoder context where needed.
alexc
parents:
11687
diff
changeset
|
565 s->cur_channel = start_ch + j; |
11728 | 566 ff_psy_set_band_info(&s->psy, s->cur_channel, cpe->ch[j].coeffs, &wi[j]); |
9942 | 567 s->coder->search_for_quantizers(avctx, s, &cpe->ch[j], s->lambda); |
568 } | |
569 cpe->common_window = 0; | |
570 if (chans > 1 | |
571 && wi[0].window_type[0] == wi[1].window_type[0] | |
572 && wi[0].window_shape == wi[1].window_shape) { | |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
573 |
9942 | 574 cpe->common_window = 1; |
575 for (j = 0; j < wi[0].num_windows; j++) { | |
576 if (wi[0].grouping[j] != wi[1].grouping[j]) { | |
577 cpe->common_window = 0; | |
578 break; | |
579 } | |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
580 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
581 } |
11706
15e7486e5c7a
Set cur_channel in the AAC encoder context where needed.
alexc
parents:
11687
diff
changeset
|
582 s->cur_channel = start_ch; |
9942 | 583 if (cpe->common_window && s->coder->search_for_ms) |
584 s->coder->search_for_ms(s, cpe, s->lambda); | |
585 adjust_frame_information(s, cpe, chans); | |
586 if (chans == 2) { | |
587 put_bits(&s->pb, 1, cpe->common_window); | |
588 if (cpe->common_window) { | |
589 put_ics_info(s, &cpe->ch[0].ics); | |
590 encode_ms_info(&s->pb, cpe); | |
591 } | |
592 } | |
593 for (j = 0; j < chans; j++) { | |
594 s->cur_channel = start_ch + j; | |
595 encode_individual_channel(avctx, s, &cpe->ch[j], cpe->common_window); | |
596 } | |
597 start_ch += chans; | |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
598 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
599 |
9941 | 600 frame_bits = put_bits_count(&s->pb); |
601 if (frame_bits <= 6144 * avctx->channels - 3) | |
602 break; | |
603 | |
604 s->lambda *= avctx->bit_rate * 1024.0f / avctx->sample_rate / frame_bits; | |
605 | |
606 } while (1); | |
607 | |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
608 put_bits(&s->pb, 3, TYPE_END); |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
609 flush_put_bits(&s->pb); |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
610 avctx->frame_bits = put_bits_count(&s->pb); |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
611 |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
612 // rate control stuff |
9936 | 613 if (!(avctx->flags & CODEC_FLAG_QSCALE)) { |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
614 float ratio = avctx->bit_rate * 1024.0f / avctx->sample_rate / avctx->frame_bits; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
615 s->lambda *= ratio; |
9944
c5ca5e520fe1
Change fminf/fmaxf to FFMIN/FFMAX to fix the build on broken operating systems.
alexc
parents:
9942
diff
changeset
|
616 s->lambda = FFMIN(s->lambda, 65536.f); |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
617 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
618 |
9936 | 619 if (!data) |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
620 s->last_frame = 1; |
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
621 memcpy(s->samples, s->samples + 1024 * avctx->channels, |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
622 1024 * avctx->channels * sizeof(s->samples[0])); |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
623 return put_bits_count(&s->pb)>>3; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
624 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
625 |
7571 | 626 static av_cold int aac_encode_end(AVCodecContext *avctx) |
627 { | |
628 AACEncContext *s = avctx->priv_data; | |
629 | |
630 ff_mdct_end(&s->mdct1024); | |
631 ff_mdct_end(&s->mdct128); | |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
632 ff_psy_end(&s->psy); |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
633 ff_psy_preprocess_end(s->psypp); |
7571 | 634 av_freep(&s->samples); |
635 av_freep(&s->cpe); | |
636 return 0; | |
637 } | |
638 | |
639 AVCodec aac_encoder = { | |
640 "aac", | |
11560
8a4984c5cacc
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
10827
diff
changeset
|
641 AVMEDIA_TYPE_AUDIO, |
7571 | 642 CODEC_ID_AAC, |
643 sizeof(AACEncContext), | |
644 aac_encode_init, | |
645 aac_encode_frame, | |
646 aac_encode_end, | |
11786 | 647 .capabilities = CODEC_CAP_SMALL_LAST_FRAME | CODEC_CAP_DELAY | CODEC_CAP_EXPERIMENTAL, |
10145
7955db355703
Make sample_fmts and channel_layouts compound literals const to reduce size of
reimar
parents:
9972
diff
changeset
|
648 .sample_fmts = (const enum SampleFormat[]){SAMPLE_FMT_S16,SAMPLE_FMT_NONE}, |
7571 | 649 .long_name = NULL_IF_CONFIG_SMALL("Advanced Audio Coding"), |
650 }; |