Mercurial > libavcodec.hg
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++) { |