comparison ac3enc.c @ 9452:42803399ba8a libavcodec

ac3enc: reorder input channels to AC-3 channel order
author jbr
date Fri, 17 Apr 2009 08:39:11 +0000
parents 932543edc1d2
children 24532a2d9d2c
comparison
equal deleted inserted replaced
9451:93c20dd3da43 9452:42803399ba8a
34 typedef struct AC3EncodeContext { 34 typedef struct AC3EncodeContext {
35 PutBitContext pb; 35 PutBitContext pb;
36 int nb_channels; 36 int nb_channels;
37 int nb_all_channels; 37 int nb_all_channels;
38 int lfe_channel; 38 int lfe_channel;
39 const uint8_t *channel_map;
39 int bit_rate; 40 int bit_rate;
40 unsigned int sample_rate; 41 unsigned int sample_rate;
41 unsigned int bitstream_id; 42 unsigned int bitstream_id;
42 unsigned int frame_size_min; /* minimum frame size in case rounding is necessary */ 43 unsigned int frame_size_min; /* minimum frame size in case rounding is necessary */
43 unsigned int frame_size; /* current frame size in words */ 44 unsigned int frame_size; /* current frame size in words */
636 s->channel_mode = channel_mode_defs[channels - 1]; 637 s->channel_mode = channel_mode_defs[channels - 1];
637 s->lfe = (channels == 6) ? 1 : 0; 638 s->lfe = (channels == 6) ? 1 : 0;
638 s->nb_all_channels = channels; 639 s->nb_all_channels = channels;
639 s->nb_channels = channels > 5 ? 5 : channels; 640 s->nb_channels = channels > 5 ? 5 : channels;
640 s->lfe_channel = s->lfe ? 5 : -1; 641 s->lfe_channel = s->lfe ? 5 : -1;
642 s->channel_map = ff_ac3_enc_channel_map[s->channel_mode][s->lfe];
641 643
642 /* frequency */ 644 /* frequency */
643 for(i=0;i<3;i++) { 645 for(i=0;i<3;i++) {
644 for(j=0;j<3;j++) 646 for(j=0;j<3;j++)
645 if ((ff_ac3_sample_rate_tab[j] >> i) == freq) 647 if ((ff_ac3_sample_rate_tab[j] >> i) == freq)
1156 int8_t exp_samples[NB_BLOCKS][AC3_MAX_CHANNELS]; 1158 int8_t exp_samples[NB_BLOCKS][AC3_MAX_CHANNELS];
1157 int frame_bits; 1159 int frame_bits;
1158 1160
1159 frame_bits = 0; 1161 frame_bits = 0;
1160 for(ch=0;ch<s->nb_all_channels;ch++) { 1162 for(ch=0;ch<s->nb_all_channels;ch++) {
1163 int ich = s->channel_map[ch];
1161 /* fixed mdct to the six sub blocks & exponent computation */ 1164 /* fixed mdct to the six sub blocks & exponent computation */
1162 for(i=0;i<NB_BLOCKS;i++) { 1165 for(i=0;i<NB_BLOCKS;i++) {
1163 int16_t *sptr; 1166 int16_t *sptr;
1164 int sinc; 1167 int sinc;
1165 1168
1166 /* compute input samples */ 1169 /* compute input samples */
1167 memcpy(input_samples, s->last_samples[ch], N/2 * sizeof(int16_t)); 1170 memcpy(input_samples, s->last_samples[ich], N/2 * sizeof(int16_t));
1168 sinc = s->nb_all_channels; 1171 sinc = s->nb_all_channels;
1169 sptr = samples + (sinc * (N/2) * i) + ch; 1172 sptr = samples + (sinc * (N/2) * i) + ich;
1170 for(j=0;j<N/2;j++) { 1173 for(j=0;j<N/2;j++) {
1171 v = *sptr; 1174 v = *sptr;
1172 input_samples[j + N/2] = v; 1175 input_samples[j + N/2] = v;
1173 s->last_samples[ch][j] = v; 1176 s->last_samples[ich][j] = v;
1174 sptr += sinc; 1177 sptr += sinc;
1175 } 1178 }
1176 1179
1177 /* apply the MDCT window */ 1180 /* apply the MDCT window */
1178 for(j=0;j<N/2;j++) { 1181 for(j=0;j<N/2;j++) {