Mercurial > libavcodec.hg
comparison aacenc.c @ 7681:bcc058a7b12e libavcodec
okayed chunks of AAC encoder
author | kostya |
---|---|
date | Sun, 24 Aug 2008 05:56:23 +0000 |
parents | 1c01b74dc78c |
children | dc1a7a6ec58d |
comparison
equal
deleted
inserted
replaced
7680:eb4802bc73f0 | 7681:bcc058a7b12e |
---|---|
26 | 26 |
27 /*********************************** | 27 /*********************************** |
28 * TODOs: | 28 * TODOs: |
29 * psy model selection with some option | 29 * psy model selection with some option |
30 * add sane pulse detection | 30 * add sane pulse detection |
31 * add temporal noise shaping | |
31 ***********************************/ | 32 ***********************************/ |
32 | 33 |
33 #include "avcodec.h" | 34 #include "avcodec.h" |
34 #include "bitstream.h" | 35 #include "bitstream.h" |
35 #include "dsputil.h" | 36 #include "dsputil.h" |
209 if(avctx->channels > 6){ | 210 if(avctx->channels > 6){ |
210 av_log(avctx, AV_LOG_ERROR, "Unsupported number of channels: %d\n", avctx->channels); | 211 av_log(avctx, AV_LOG_ERROR, "Unsupported number of channels: %d\n", avctx->channels); |
211 return -1; | 212 return -1; |
212 } | 213 } |
213 s->samplerate_index = i; | 214 s->samplerate_index = i; |
214 s->swb_sizes1024 = swb_size_1024[i]; | |
215 s->swb_num1024 = ff_aac_num_swb_1024[i]; | |
216 s->swb_sizes128 = swb_size_128[i]; | |
217 s->swb_num128 = ff_aac_num_swb_128[i]; | |
218 | 215 |
219 dsputil_init(&s->dsp, avctx); | 216 dsputil_init(&s->dsp, avctx); |
220 ff_mdct_init(&s->mdct1024, 11, 0); | 217 ff_mdct_init(&s->mdct1024, 11, 0); |
221 ff_mdct_init(&s->mdct128, 8, 0); | 218 ff_mdct_init(&s->mdct128, 8, 0); |
222 // window init | 219 // window init |
227 | 224 |
228 s->samples = av_malloc(2 * 1024 * avctx->channels * sizeof(s->samples[0])); | 225 s->samples = av_malloc(2 * 1024 * avctx->channels * sizeof(s->samples[0])); |
229 s->cpe = av_mallocz(sizeof(ChannelElement) * aac_chan_configs[avctx->channels-1][0]); | 226 s->cpe = av_mallocz(sizeof(ChannelElement) * aac_chan_configs[avctx->channels-1][0]); |
230 if(ff_aac_psy_init(&s->psy, avctx, AAC_PSY_3GPP, | 227 if(ff_aac_psy_init(&s->psy, avctx, AAC_PSY_3GPP, |
231 aac_chan_configs[avctx->channels-1][0], 0, | 228 aac_chan_configs[avctx->channels-1][0], 0, |
232 s->swb_sizes1024, s->swb_num1024, s->swb_sizes128, s->swb_num128) < 0){ | 229 swb_size_1024[i], ff_aac_num_swb_1024[i], swb_size_128[i], ff_aac_num_swb_128[i]) < 0){ |
233 av_log(avctx, AV_LOG_ERROR, "Cannot initialize selected model.\n"); | 230 av_log(avctx, AV_LOG_ERROR, "Cannot initialize selected model.\n"); |
234 return -1; | 231 return -1; |
235 } | 232 } |
236 avctx->extradata = av_malloc(2); | 233 avctx->extradata = av_malloc(2); |
237 avctx->extradata_size = 2; | 234 avctx->extradata_size = 2; |
241 | 238 |
242 /** | 239 /** |
243 * Encode ics_info element. | 240 * Encode ics_info element. |
244 * @see Table 4.6 (syntax of ics_info) | 241 * @see Table 4.6 (syntax of ics_info) |
245 */ | 242 */ |
246 static void put_ics_info(AVCodecContext *avctx, IndividualChannelStream *info) | 243 static void put_ics_info(AACEncContext *s, IndividualChannelStream *info) |
247 { | 244 { |
248 AACEncContext *s = avctx->priv_data; | |
249 int i; | 245 int i; |
250 | 246 |
251 put_bits(&s->pb, 1, 0); // ics_reserved bit | 247 put_bits(&s->pb, 1, 0); // ics_reserved bit |
252 put_bits(&s->pb, 2, info->window_sequence[0]); | 248 put_bits(&s->pb, 2, info->window_sequence[0]); |
253 put_bits(&s->pb, 1, info->use_kb_window[0]); | 249 put_bits(&s->pb, 1, info->use_kb_window[0]); |
260 put_bits(&s->pb, 1, info->group_len[i]); | 256 put_bits(&s->pb, 1, info->group_len[i]); |
261 } | 257 } |
262 } | 258 } |
263 | 259 |
264 /** | 260 /** |
261 * Calculate the number of bits needed to code all coefficient signs in current band. | |
262 */ | |
263 static int calculate_band_sign_bits(AACEncContext *s, SingleChannelElement *sce, | |
264 int group_len, int start, int size) | |
265 { | |
266 int bits = 0; | |
267 int i, w; | |
268 for(w = 0; w < group_len; w++){ | |
269 for(i = 0; i < size; i++){ | |
270 if(sce->icoefs[start + i]) | |
271 bits++; | |
272 } | |
273 start += 128; | |
274 } | |
275 return bits; | |
276 } | |
277 | |
278 /** | |
265 * Encode pulse data. | 279 * Encode pulse data. |
266 */ | 280 */ |
267 static void encode_pulses(AACEncContext *s, Pulse *pulse) | 281 static void encode_pulses(AACEncContext *s, Pulse *pulse) |
268 { | 282 { |
269 int i; | 283 int i; |
293 if(sce->zeroes[w*16 + i]){ | 307 if(sce->zeroes[w*16 + i]){ |
294 start += sce->ics.swb_sizes[i]; | 308 start += sce->ics.swb_sizes[i]; |
295 continue; | 309 continue; |
296 } | 310 } |
297 for(w2 = w; w2 < w + sce->ics.group_len[wg]; w2++){ | 311 for(w2 = w; w2 < w + sce->ics.group_len[wg]; w2++){ |
298 encode_band_coeffs(s, cpe, channel, start + w2*128, | 312 encode_band_coeffs(s, sce, start + w2*128, |
299 sce->ics.swb_sizes[i], | 313 sce->ics.swb_sizes[i], |
300 sce->band_type[w*16 + i]); | 314 sce->band_type[w*16 + i]); |
301 } | 315 } |
302 start += sce->ics.swb_sizes[i]; | 316 start += sce->ics.swb_sizes[i]; |
303 } | 317 } |