Mercurial > libavcodec.hg
annotate aacenc.c @ 12197:fbf4d5b1b664 libavcodec
Remove FF_MM_SSE2/3 flags for CPUs where this is generally not faster than
regular MMX code. Examples of this are the Core1 CPU. Instead, set a new flag,
FF_MM_SSE2/3SLOW, which can be checked for particular SSE2/3 functions that
have been checked specifically on such CPUs and are actually faster than
their MMX counterparts.
In addition, use this flag to enable particular VP8 and LPC SSE2 functions
that are faster than their MMX counterparts.
Based on a patch by Loren Merritt <lorenm AT u washington edu>.
author | rbultje |
---|---|
date | Mon, 19 Jul 2010 22:38:23 +0000 |
parents | 335efeae3bb7 |
children | a3aca8bcbaf4 |
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; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
305 int start, sum, maxsfb, cmaxsfb; |
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 sum = 0; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
315 //apply M/S |
9936 | 316 if (!ch && cpe->ms_mask[w + g]) { |
317 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
|
318 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
|
319 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
|
320 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
321 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
322 start += ics->swb_sizes[g]; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
323 } |
9938
6c1ac45b3097
cosmetics: Remove unnecessary {} around if/for blocks;
diego
parents:
9937
diff
changeset
|
324 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
|
325 ; |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
326 maxsfb = FFMAX(maxsfb, cmaxsfb); |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
327 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
328 ics->max_sfb = maxsfb; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
329 |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
330 //adjust zero bands for window groups |
9936 | 331 for (w = 0; w < ics->num_windows; w += ics->group_len[w]) { |
332 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
|
333 i = 1; |
9936 | 334 for (w2 = w; w2 < w + ics->group_len[w]; w2++) { |
335 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
|
336 i = 0; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
337 break; |
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 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
340 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
|
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 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
344 |
9936 | 345 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
|
346 IndividualChannelStream *ics0 = &cpe->ch[0].ics; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
347 IndividualChannelStream *ics1 = &cpe->ch[1].ics; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
348 int msc = 0; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
349 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
|
350 ics1->max_sfb = ics0->max_sfb; |
9936 | 351 for (w = 0; w < ics0->num_windows*16; w += 16) |
352 for (i = 0; i < ics0->max_sfb; i++) | |
9938
6c1ac45b3097
cosmetics: Remove unnecessary {} around if/for blocks;
diego
parents:
9937
diff
changeset
|
353 if (cpe->ms_mask[w+i]) |
6c1ac45b3097
cosmetics: Remove unnecessary {} around if/for blocks;
diego
parents:
9937
diff
changeset
|
354 msc++; |
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
355 if (msc == 0 || ics0->max_sfb == 0) |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
356 cpe->ms_mode = 0; |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
357 else |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
358 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
|
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 /** |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
363 * Encode scalefactor band coding type. |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
364 */ |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
365 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
|
366 { |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
367 int w; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
368 |
9938
6c1ac45b3097
cosmetics: Remove unnecessary {} around if/for blocks;
diego
parents:
9937
diff
changeset
|
369 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
|
370 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
|
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 /** |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
374 * Encode scalefactors. |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
375 */ |
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
376 static void encode_scale_factors(AVCodecContext *avctx, AACEncContext *s, |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
377 SingleChannelElement *sce) |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
378 { |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
379 int off = sce->sf_idx[0], diff; |
7681 | 380 int i, w; |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
381 |
9936 | 382 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { |
383 for (i = 0; i < sce->ics.max_sfb; i++) { | |
384 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
|
385 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
|
386 if (diff < 0 || diff > 120) |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
387 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
|
388 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
|
389 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
|
390 } |
7681 | 391 } |
392 } | |
393 } | |
394 | |
395 /** | |
7584 | 396 * Encode pulse data. |
397 */ | |
7672
1c01b74dc78c
Do not pass unnecessary arguments to AAC encoder functions
kostya
parents:
7605
diff
changeset
|
398 static void encode_pulses(AACEncContext *s, Pulse *pulse) |
7584 | 399 { |
400 int i; | |
401 | |
402 put_bits(&s->pb, 1, !!pulse->num_pulse); | |
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
403 if (!pulse->num_pulse) |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
404 return; |
7584 | 405 |
406 put_bits(&s->pb, 2, pulse->num_pulse - 1); | |
407 put_bits(&s->pb, 6, pulse->start); | |
9936 | 408 for (i = 0; i < pulse->num_pulse; i++) { |
7585 | 409 put_bits(&s->pb, 5, pulse->pos[i]); |
7584 | 410 put_bits(&s->pb, 4, pulse->amp[i]); |
411 } | |
412 } | |
413 | |
414 /** | |
415 * Encode spectral coefficients processed by psychoacoustic model. | |
416 */ | |
7672
1c01b74dc78c
Do not pass unnecessary arguments to AAC encoder functions
kostya
parents:
7605
diff
changeset
|
417 static void encode_spectral_coeffs(AACEncContext *s, SingleChannelElement *sce) |
7584 | 418 { |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
419 int start, i, w, w2; |
7584 | 420 |
9936 | 421 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { |
7584 | 422 start = 0; |
9936 | 423 for (i = 0; i < sce->ics.max_sfb; i++) { |
424 if (sce->zeroes[w*16 + i]) { | |
7672
1c01b74dc78c
Do not pass unnecessary arguments to AAC encoder functions
kostya
parents:
7605
diff
changeset
|
425 start += sce->ics.swb_sizes[i]; |
7584 | 426 continue; |
427 } | |
9938
6c1ac45b3097
cosmetics: Remove unnecessary {} around if/for blocks;
diego
parents:
9937
diff
changeset
|
428 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
|
429 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
|
430 sce->ics.swb_sizes[i], |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
431 sce->sf_idx[w*16 + i], |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
432 sce->band_type[w*16 + i], |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
433 s->lambda); |
7672
1c01b74dc78c
Do not pass unnecessary arguments to AAC encoder functions
kostya
parents:
7605
diff
changeset
|
434 start += sce->ics.swb_sizes[i]; |
7584 | 435 } |
436 } | |
437 } | |
438 | |
439 /** | |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
440 * Encode one channel of audio data. |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
441 */ |
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
442 static int encode_individual_channel(AVCodecContext *avctx, AACEncContext *s, |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
443 SingleChannelElement *sce, |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
444 int common_window) |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
445 { |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
446 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
|
447 if (!common_window) |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
448 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
|
449 encode_band_info(s, sce); |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
450 encode_scale_factors(avctx, s, sce); |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
451 encode_pulses(s, &sce->pulse); |
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); //tns |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
453 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
|
454 encode_spectral_coeffs(s, sce); |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
455 return 0; |
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 |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
458 /** |
7571 | 459 * Write some auxiliary information about the created AAC file. |
460 */ | |
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
461 static void put_bitstream_info(AVCodecContext *avctx, AACEncContext *s, |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
462 const char *name) |
7571 | 463 { |
464 int i, namelen, padbits; | |
465 | |
466 namelen = strlen(name) + 2; | |
7585 | 467 put_bits(&s->pb, 3, TYPE_FIL); |
7571 | 468 put_bits(&s->pb, 4, FFMIN(namelen, 15)); |
9936 | 469 if (namelen >= 15) |
7571 | 470 put_bits(&s->pb, 8, namelen - 16); |
471 put_bits(&s->pb, 4, 0); //extension type - filler | |
472 padbits = 8 - (put_bits_count(&s->pb) & 7); | |
473 align_put_bits(&s->pb); | |
9936 | 474 for (i = 0; i < namelen - 2; i++) |
7571 | 475 put_bits(&s->pb, 8, name[i]); |
476 put_bits(&s->pb, 12 - padbits, 0); | |
477 } | |
478 | |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
479 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
|
480 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
|
481 { |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
482 AACEncContext *s = avctx->priv_data; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
483 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
|
484 ChannelElement *cpe; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
485 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
|
486 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
|
487 int chan_el_counter[4]; |
12095 | 488 FFPsyWindowInfo windows[AAC_MAX_CHANNELS]; |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
489 |
9936 | 490 if (s->last_frame) |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
491 return 0; |
9936 | 492 if (data) { |
493 if (!s->psypp) { | |
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
494 memcpy(s->samples + 1024 * avctx->channels, data, |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
495 1024 * avctx->channels * sizeof(s->samples[0])); |
9936 | 496 } else { |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
497 start_ch = 0; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
498 samples2 = s->samples + 1024 * avctx->channels; |
9936 | 499 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
|
500 tag = chan_map[i+1]; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
501 chans = tag == TYPE_CPE ? 2 : 1; |
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
502 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
|
503 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
|
504 start_ch += chans; |
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 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
507 } |
9936 | 508 if (!avctx->frame_number) { |
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
509 memcpy(s->samples, s->samples + 1024 * avctx->channels, |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
510 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
|
511 return 0; |
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 |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
514 start_ch = 0; |
9936 | 515 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
|
516 FFPsyWindowInfo* wi = windows + start_ch; |
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
517 tag = chan_map[i+1]; |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
518 chans = tag == TYPE_CPE ? 2 : 1; |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
519 cpe = &s->cpe[i]; |
9936 | 520 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
|
521 IndividualChannelStream *ics = &cpe->ch[j].ics; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
522 int k; |
12191
335efeae3bb7
aacenc: Adjust array offsets for the current channel before calling ff_psy_suggest_window().
alexc
parents:
12190
diff
changeset
|
523 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
|
524 samples2 = samples + cur_channel; |
335efeae3bb7
aacenc: Adjust array offsets for the current channel before calling ff_psy_suggest_window().
alexc
parents:
12190
diff
changeset
|
525 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
|
526 if (!data) |
335efeae3bb7
aacenc: Adjust array offsets for the current channel before calling ff_psy_suggest_window().
alexc
parents:
12190
diff
changeset
|
527 la = NULL; |
12109 | 528 if (tag == TYPE_LFE) { |
529 wi[j].window_type[0] = ONLY_LONG_SEQUENCE; | |
530 wi[j].window_shape = 0; | |
531 wi[j].num_windows = 1; | |
532 wi[j].grouping[0] = 1; | |
533 } else { | |
12191
335efeae3bb7
aacenc: Adjust array offsets for the current channel before calling ff_psy_suggest_window().
alexc
parents:
12190
diff
changeset
|
534 wi[j] = ff_psy_suggest_window(&s->psy, samples2, la, cur_channel, |
12110 | 535 ics->window_sequence[0]); |
12109 | 536 } |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
537 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
|
538 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
|
539 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
|
540 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
|
541 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
|
542 ics->swb_sizes = s->psy.bands [ics->num_windows == 8]; |
12109 | 543 ics->num_swb = tag == TYPE_LFE ? 12 : s->psy.num_bands[ics->num_windows == 8]; |
9936 | 544 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
|
545 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
|
546 |
12191
335efeae3bb7
aacenc: Adjust array offsets for the current channel before calling ff_psy_suggest_window().
alexc
parents:
12190
diff
changeset
|
547 s->cur_channel = cur_channel; |
335efeae3bb7
aacenc: Adjust array offsets for the current channel before calling ff_psy_suggest_window().
alexc
parents:
12190
diff
changeset
|
548 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
|
549 } |
580fad942ae6
Refactor windowing and early psy from bitstream writing parts of the AAC encoder.
alexc
parents:
9939
diff
changeset
|
550 start_ch += chans; |
580fad942ae6
Refactor windowing and early psy from bitstream writing parts of the AAC encoder.
alexc
parents:
9939
diff
changeset
|
551 } |
9941 | 552 do { |
553 int frame_bits; | |
9942 | 554 init_put_bits(&s->pb, frame, buf_size*8); |
555 if ((avctx->frame_number & 0xFF)==1 && !(avctx->flags & CODEC_FLAG_BITEXACT)) | |
556 put_bitstream_info(avctx, s, LIBAVCODEC_IDENT); | |
557 start_ch = 0; | |
558 memset(chan_el_counter, 0, sizeof(chan_el_counter)); | |
559 for (i = 0; i < chan_map[0]; i++) { | |
560 FFPsyWindowInfo* wi = windows + start_ch; | |
561 tag = chan_map[i+1]; | |
562 chans = tag == TYPE_CPE ? 2 : 1; | |
563 cpe = &s->cpe[i]; | |
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 put_bits(&s->pb, 3, tag); | |
587 put_bits(&s->pb, 4, chan_el_counter[tag]++); | |
588 if (chans == 2) { | |
589 put_bits(&s->pb, 1, cpe->common_window); | |
590 if (cpe->common_window) { | |
591 put_ics_info(s, &cpe->ch[0].ics); | |
592 encode_ms_info(&s->pb, cpe); | |
593 } | |
594 } | |
595 for (j = 0; j < chans; j++) { | |
596 s->cur_channel = start_ch + j; | |
597 encode_individual_channel(avctx, s, &cpe->ch[j], cpe->common_window); | |
598 } | |
599 start_ch += chans; | |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
600 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
601 |
9941 | 602 frame_bits = put_bits_count(&s->pb); |
603 if (frame_bits <= 6144 * avctx->channels - 3) | |
604 break; | |
605 | |
606 s->lambda *= avctx->bit_rate * 1024.0f / avctx->sample_rate / frame_bits; | |
607 | |
608 } while (1); | |
609 | |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
610 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
|
611 flush_put_bits(&s->pb); |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
612 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
|
613 |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
614 // rate control stuff |
9936 | 615 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
|
616 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
|
617 s->lambda *= ratio; |
9944
c5ca5e520fe1
Change fminf/fmaxf to FFMIN/FFMAX to fix the build on broken operating systems.
alexc
parents:
9942
diff
changeset
|
618 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
|
619 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
620 |
9936 | 621 if (!data) |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
622 s->last_frame = 1; |
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
623 memcpy(s->samples, s->samples + 1024 * avctx->channels, |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
624 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
|
625 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
|
626 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
627 |
7571 | 628 static av_cold int aac_encode_end(AVCodecContext *avctx) |
629 { | |
630 AACEncContext *s = avctx->priv_data; | |
631 | |
632 ff_mdct_end(&s->mdct1024); | |
633 ff_mdct_end(&s->mdct128); | |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
634 ff_psy_end(&s->psy); |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
635 ff_psy_preprocess_end(s->psypp); |
7571 | 636 av_freep(&s->samples); |
637 av_freep(&s->cpe); | |
638 return 0; | |
639 } | |
640 | |
641 AVCodec aac_encoder = { | |
642 "aac", | |
11560
8a4984c5cacc
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
10827
diff
changeset
|
643 AVMEDIA_TYPE_AUDIO, |
7571 | 644 CODEC_ID_AAC, |
645 sizeof(AACEncContext), | |
646 aac_encode_init, | |
647 aac_encode_frame, | |
648 aac_encode_end, | |
11786 | 649 .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
|
650 .sample_fmts = (const enum SampleFormat[]){SAMPLE_FMT_S16,SAMPLE_FMT_NONE}, |
7571 | 651 .long_name = NULL_IF_CONFIG_SMALL("Advanced Audio Coding"), |
652 }; |