Mercurial > libavcodec.hg
annotate aacenc.c @ 11352:6e0af2cfdcfe libavcodec
Do MC and IDCT in coding (hilbert) order
This increases the slice size to 64 pixels, due to having to decode an
entire chroma superblock row per slice.
This can be up to 6% slower depending on clip and CPU, but is necessary
for future optimizations that gain significantly more than was lost.
author | conrad |
---|---|
date | Wed, 03 Mar 2010 23:27:40 +0000 |
parents | 3d011a01a6a0 |
children | 8a4984c5cacc |
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 /** | |
8718
e9d9d946f213
Use full internal pathname in doxygen @file directives.
diego
parents:
7978
diff
changeset
|
23 * @file libavcodec/aacenc.c |
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 |
44 static const uint8_t swb_size_1024_96[] = { | |
45 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, | |
46 12, 12, 12, 12, 12, 16, 16, 24, 28, 36, 44, | |
47 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64 | |
48 }; | |
49 | |
50 static const uint8_t swb_size_1024_64[] = { | |
51 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, | |
52 12, 12, 12, 16, 16, 16, 20, 24, 24, 28, 36, | |
53 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40 | |
54 }; | |
55 | |
56 static const uint8_t swb_size_1024_48[] = { | |
57 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8, | |
58 12, 12, 12, 12, 16, 16, 20, 20, 24, 24, 28, 28, | |
59 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, | |
60 96 | |
61 }; | |
62 | |
63 static const uint8_t swb_size_1024_32[] = { | |
64 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8, | |
65 12, 12, 12, 12, 16, 16, 20, 20, 24, 24, 28, 28, | |
66 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32 | |
67 }; | |
68 | |
69 static const uint8_t swb_size_1024_24[] = { | |
70 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, | |
71 12, 12, 12, 12, 16, 16, 16, 20, 20, 24, 24, 28, 28, | |
72 32, 36, 36, 40, 44, 48, 52, 52, 64, 64, 64, 64, 64 | |
73 }; | |
74 | |
75 static const uint8_t swb_size_1024_16[] = { | |
76 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, | |
77 12, 12, 12, 12, 12, 12, 12, 12, 12, 16, 16, 16, 16, 20, 20, 20, 24, 24, 28, 28, | |
78 32, 36, 40, 40, 44, 48, 52, 56, 60, 64, 64, 64 | |
79 }; | |
80 | |
81 static const uint8_t swb_size_1024_8[] = { | |
82 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, | |
83 16, 16, 16, 16, 16, 16, 16, 20, 20, 20, 20, 24, 24, 24, 28, 28, | |
84 32, 36, 36, 40, 44, 48, 52, 56, 60, 64, 80 | |
85 }; | |
86 | |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
87 static const uint8_t *swb_size_1024[] = { |
7571 | 88 swb_size_1024_96, swb_size_1024_96, swb_size_1024_64, |
89 swb_size_1024_48, swb_size_1024_48, swb_size_1024_32, | |
90 swb_size_1024_24, swb_size_1024_24, swb_size_1024_16, | |
91 swb_size_1024_16, swb_size_1024_16, swb_size_1024_8 | |
92 }; | |
93 | |
94 static const uint8_t swb_size_128_96[] = { | |
95 4, 4, 4, 4, 4, 4, 8, 8, 8, 16, 28, 36 | |
96 }; | |
97 | |
98 static const uint8_t swb_size_128_48[] = { | |
99 4, 4, 4, 4, 4, 8, 8, 8, 12, 12, 12, 16, 16, 16 | |
100 }; | |
101 | |
102 static const uint8_t swb_size_128_24[] = { | |
103 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 12, 12, 16, 16, 20 | |
104 }; | |
105 | |
106 static const uint8_t swb_size_128_16[] = { | |
107 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 12, 12, 16, 20, 20 | |
108 }; | |
109 | |
110 static const uint8_t swb_size_128_8[] = { | |
111 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 12, 16, 20, 20 | |
112 }; | |
113 | |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
114 static const uint8_t *swb_size_128[] = { |
7571 | 115 /* the last entry on the following row is swb_size_128_64 but is a |
116 duplicate of swb_size_128_96 */ | |
117 swb_size_128_96, swb_size_128_96, swb_size_128_96, | |
118 swb_size_128_48, swb_size_128_48, swb_size_128_48, | |
119 swb_size_128_24, swb_size_128_24, swb_size_128_16, | |
120 swb_size_128_16, swb_size_128_16, swb_size_128_8 | |
121 }; | |
122 | |
123 /** default channel configurations */ | |
124 static const uint8_t aac_chan_configs[6][5] = { | |
7585 | 125 {1, TYPE_SCE}, // 1 channel - single channel element |
126 {1, TYPE_CPE}, // 2 channels - channel pair | |
127 {2, TYPE_SCE, TYPE_CPE}, // 3 channels - center + stereo | |
128 {3, TYPE_SCE, TYPE_CPE, TYPE_SCE}, // 4 channels - front center + stereo + back center | |
129 {3, TYPE_SCE, TYPE_CPE, TYPE_CPE}, // 5 channels - front center + stereo + back stereo | |
130 {4, TYPE_SCE, TYPE_CPE, TYPE_CPE, TYPE_LFE}, // 6 channels - front center + stereo + back stereo + LFE | |
7571 | 131 }; |
132 | |
133 /** | |
134 * Make AAC audio config object. | |
135 * @see 1.6.2.1 "Syntax - AudioSpecificConfig" | |
136 */ | |
137 static void put_audio_specific_config(AVCodecContext *avctx) | |
138 { | |
139 PutBitContext pb; | |
140 AACEncContext *s = avctx->priv_data; | |
141 | |
142 init_put_bits(&pb, avctx->extradata, avctx->extradata_size*8); | |
143 put_bits(&pb, 5, 2); //object type - AAC-LC | |
144 put_bits(&pb, 4, s->samplerate_index); //sample rate index | |
145 put_bits(&pb, 4, avctx->channels); | |
146 //GASpecificConfig | |
147 put_bits(&pb, 1, 0); //frame length - 1024 samples | |
148 put_bits(&pb, 1, 0); //does not depend on core coder | |
149 put_bits(&pb, 1, 0); //is not extension | |
150 flush_put_bits(&pb); | |
151 } | |
152 | |
153 static av_cold int aac_encode_init(AVCodecContext *avctx) | |
154 { | |
155 AACEncContext *s = avctx->priv_data; | |
156 int i; | |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
157 const uint8_t *sizes[2]; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
158 int lengths[2]; |
7571 | 159 |
160 avctx->frame_size = 1024; | |
161 | |
9936 | 162 for (i = 0; i < 16; i++) |
163 if (avctx->sample_rate == ff_mpeg4audio_sample_rates[i]) | |
7571 | 164 break; |
9936 | 165 if (i == 16) { |
7571 | 166 av_log(avctx, AV_LOG_ERROR, "Unsupported sample rate %d\n", avctx->sample_rate); |
167 return -1; | |
168 } | |
9936 | 169 if (avctx->channels > 6) { |
7571 | 170 av_log(avctx, AV_LOG_ERROR, "Unsupported number of channels: %d\n", avctx->channels); |
171 return -1; | |
172 } | |
173 s->samplerate_index = i; | |
174 | |
175 dsputil_init(&s->dsp, avctx); | |
9658
67a20f0eb42c
Support for getting (i)MDCT output multiplied by a constant scaling factor.
serge
parents:
9428
diff
changeset
|
176 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
|
177 ff_mdct_init(&s->mdct128, 8, 0, 1.0); |
7584 | 178 // window init |
179 ff_kbd_window_init(ff_aac_kbd_long_1024, 4.0, 1024); | |
180 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
|
181 ff_init_ff_sine_windows(10); |
3d011a01a6a0
Add support for hard-coded MDCT-related ff_sine_windows tables.
reimar
parents:
10145
diff
changeset
|
182 ff_init_ff_sine_windows(7); |
7571 | 183 |
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
184 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
|
185 s->cpe = av_mallocz(sizeof(ChannelElement) * aac_chan_configs[avctx->channels-1][0]); |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
186 avctx->extradata = av_malloc(2); |
7571 | 187 avctx->extradata_size = 2; |
188 put_audio_specific_config(avctx); | |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
189 |
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
190 sizes[0] = swb_size_1024[i]; |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
191 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
|
192 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
|
193 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
|
194 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
|
195 s->psypp = ff_psy_preprocess_init(avctx); |
9972
dea232ef4287
Revert unintended portion of last commit. (Setting the default coder to
alexc
parents:
9971
diff
changeset
|
196 s->coder = &ff_aac_coders[0]; |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
197 |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
198 s->lambda = avctx->global_quality ? avctx->global_quality : 120; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
199 #if !CONFIG_HARDCODED_TABLES |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
200 for (i = 0; i < 428; i++) |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
201 ff_aac_pow2sf_tab[i] = pow(2, (i - 200)/4.); |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
202 #endif /* CONFIG_HARDCODED_TABLES */ |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
203 |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
204 if (avctx->channels > 5) |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
205 av_log(avctx, AV_LOG_ERROR, "This encoder does not yet enforce the restrictions on LFEs. " |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
206 "The output will most likely be an illegal bitstream.\n"); |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
207 |
7571 | 208 return 0; |
209 } | |
210 | |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
211 static void apply_window_and_mdct(AVCodecContext *avctx, AACEncContext *s, |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
212 SingleChannelElement *sce, short *audio, int channel) |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
213 { |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
214 int i, j, k; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
215 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
|
216 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
|
217 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
|
218 |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
219 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
|
220 memcpy(s->output, sce->saved, sizeof(float)*1024); |
9936 | 221 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
|
222 memset(s->output, 0, sizeof(s->output[0]) * 448); |
9936 | 223 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
|
224 s->output[i] = sce->saved[i] * pwindow[i - 448]; |
9936 | 225 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
|
226 s->output[i] = sce->saved[i]; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
227 } |
9936 | 228 if (sce->ics.window_sequence[0] != LONG_START_SEQUENCE) { |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
229 j = channel; |
9936 | 230 for (i = 0; i < 1024; i++, j += avctx->channels) { |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
231 s->output[i+1024] = audio[j] * lwindow[1024 - i - 1]; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
232 sce->saved[i] = audio[j] * lwindow[i]; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
233 } |
9936 | 234 } else { |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
235 j = channel; |
9936 | 236 for (i = 0; i < 448; i++, j += avctx->channels) |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
237 s->output[i+1024] = audio[j]; |
9936 | 238 for (i = 448; i < 576; i++, j += avctx->channels) |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
239 s->output[i+1024] = audio[j] * swindow[576 - i - 1]; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
240 memset(s->output+1024+576, 0, sizeof(s->output[0]) * 448); |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
241 j = channel; |
9936 | 242 for (i = 0; i < 1024; i++, j += avctx->channels) |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
243 sce->saved[i] = audio[j]; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
244 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
245 ff_mdct_calc(&s->mdct1024, sce->coeffs, s->output); |
9936 | 246 } else { |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
247 j = channel; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
248 for (k = 0; k < 1024; k += 128) { |
9936 | 249 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
|
250 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
|
251 ? sce->saved[i] |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
252 : audio[channel + (i-1024)*avctx->channels]; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
253 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
|
254 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
|
255 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
|
256 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
257 j = channel; |
9936 | 258 for (i = 0; i < 1024; i++, j += avctx->channels) |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
259 sce->saved[i] = audio[j]; |
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]; |
9940
580fad942ae6
Refactor windowing and early psy from bitstream writing parts of the AAC encoder.
alexc
parents:
9939
diff
changeset
|
488 FFPsyWindowInfo windows[avctx->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]; |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
520 samples2 = samples + start_ch; |
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
521 la = samples2 + 1024 * avctx->channels + start_ch; |
9938
6c1ac45b3097
cosmetics: Remove unnecessary {} around if/for blocks;
diego
parents:
9937
diff
changeset
|
522 if (!data) |
6c1ac45b3097
cosmetics: Remove unnecessary {} around if/for blocks;
diego
parents:
9937
diff
changeset
|
523 la = NULL; |
9936 | 524 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
|
525 IndividualChannelStream *ics = &cpe->ch[j].ics; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
526 int k; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
527 wi[j] = ff_psy_suggest_window(&s->psy, samples2, la, start_ch + j, ics->window_sequence[0]); |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
528 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
|
529 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
|
530 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
|
531 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
|
532 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
|
533 ics->swb_sizes = s->psy.bands [ics->num_windows == 8]; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
534 ics->num_swb = s->psy.num_bands[ics->num_windows == 8]; |
9936 | 535 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
|
536 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
|
537 |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
538 s->cur_channel = start_ch + j; |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
539 apply_window_and_mdct(avctx, s, &cpe->ch[j], samples2, j); |
9940
580fad942ae6
Refactor windowing and early psy from bitstream writing parts of the AAC encoder.
alexc
parents:
9939
diff
changeset
|
540 } |
580fad942ae6
Refactor windowing and early psy from bitstream writing parts of the AAC encoder.
alexc
parents:
9939
diff
changeset
|
541 start_ch += chans; |
580fad942ae6
Refactor windowing and early psy from bitstream writing parts of the AAC encoder.
alexc
parents:
9939
diff
changeset
|
542 } |
9941 | 543 do { |
544 int frame_bits; | |
9942 | 545 init_put_bits(&s->pb, frame, buf_size*8); |
546 if ((avctx->frame_number & 0xFF)==1 && !(avctx->flags & CODEC_FLAG_BITEXACT)) | |
547 put_bitstream_info(avctx, s, LIBAVCODEC_IDENT); | |
548 start_ch = 0; | |
549 memset(chan_el_counter, 0, sizeof(chan_el_counter)); | |
550 for (i = 0; i < chan_map[0]; i++) { | |
551 FFPsyWindowInfo* wi = windows + start_ch; | |
552 tag = chan_map[i+1]; | |
553 chans = tag == TYPE_CPE ? 2 : 1; | |
554 cpe = &s->cpe[i]; | |
555 for (j = 0; j < chans; j++) { | |
556 s->coder->search_for_quantizers(avctx, s, &cpe->ch[j], s->lambda); | |
557 } | |
558 cpe->common_window = 0; | |
559 if (chans > 1 | |
560 && wi[0].window_type[0] == wi[1].window_type[0] | |
561 && 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
|
562 |
9942 | 563 cpe->common_window = 1; |
564 for (j = 0; j < wi[0].num_windows; j++) { | |
565 if (wi[0].grouping[j] != wi[1].grouping[j]) { | |
566 cpe->common_window = 0; | |
567 break; | |
568 } | |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
569 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
570 } |
9942 | 571 if (cpe->common_window && s->coder->search_for_ms) |
572 s->coder->search_for_ms(s, cpe, s->lambda); | |
573 adjust_frame_information(s, cpe, chans); | |
574 put_bits(&s->pb, 3, tag); | |
575 put_bits(&s->pb, 4, chan_el_counter[tag]++); | |
576 if (chans == 2) { | |
577 put_bits(&s->pb, 1, cpe->common_window); | |
578 if (cpe->common_window) { | |
579 put_ics_info(s, &cpe->ch[0].ics); | |
580 encode_ms_info(&s->pb, cpe); | |
581 } | |
582 } | |
583 for (j = 0; j < chans; j++) { | |
584 s->cur_channel = start_ch + j; | |
585 ff_psy_set_band_info(&s->psy, s->cur_channel, cpe->ch[j].coeffs, &wi[j]); | |
586 encode_individual_channel(avctx, s, &cpe->ch[j], cpe->common_window); | |
587 } | |
588 start_ch += chans; | |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
589 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
590 |
9941 | 591 frame_bits = put_bits_count(&s->pb); |
592 if (frame_bits <= 6144 * avctx->channels - 3) | |
593 break; | |
594 | |
595 s->lambda *= avctx->bit_rate * 1024.0f / avctx->sample_rate / frame_bits; | |
596 | |
597 } while (1); | |
598 | |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
599 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
|
600 flush_put_bits(&s->pb); |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
601 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
|
602 |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
603 // rate control stuff |
9936 | 604 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
|
605 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
|
606 s->lambda *= ratio; |
9944
c5ca5e520fe1
Change fminf/fmaxf to FFMIN/FFMAX to fix the build on broken operating systems.
alexc
parents:
9942
diff
changeset
|
607 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
|
608 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
609 |
9936 | 610 if (!data) |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
611 s->last_frame = 1; |
9937
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
612 memcpy(s->samples, s->samples + 1024 * avctx->channels, |
3e39dbd2d9eb
cosmetics: prettyprinting, K&R style, break overly long lines
diego
parents:
9936
diff
changeset
|
613 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
|
614 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
|
615 } |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
616 |
7571 | 617 static av_cold int aac_encode_end(AVCodecContext *avctx) |
618 { | |
619 AACEncContext *s = avctx->priv_data; | |
620 | |
621 ff_mdct_end(&s->mdct1024); | |
622 ff_mdct_end(&s->mdct128); | |
9935
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
623 ff_psy_end(&s->psy); |
d09283aeeef8
Merge the AAC encoder from SoC svn. It is still considered experimental.
alexc
parents:
9658
diff
changeset
|
624 ff_psy_preprocess_end(s->psypp); |
7571 | 625 av_freep(&s->samples); |
626 av_freep(&s->cpe); | |
627 return 0; | |
628 } | |
629 | |
630 AVCodec aac_encoder = { | |
631 "aac", | |
632 CODEC_TYPE_AUDIO, | |
633 CODEC_ID_AAC, | |
634 sizeof(AACEncContext), | |
635 aac_encode_init, | |
636 aac_encode_frame, | |
637 aac_encode_end, | |
638 .capabilities = CODEC_CAP_SMALL_LAST_FRAME | CODEC_CAP_DELAY, | |
10145
7955db355703
Make sample_fmts and channel_layouts compound literals const to reduce size of
reimar
parents:
9972
diff
changeset
|
639 .sample_fmts = (const enum SampleFormat[]){SAMPLE_FMT_S16,SAMPLE_FMT_NONE}, |
7571 | 640 .long_name = NULL_IF_CONFIG_SMALL("Advanced Audio Coding"), |
641 }; |