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 }