00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00029
00030
00031
00032 #include "libavutil/audioconvert.h"
00033 #include "libavutil/avassert.h"
00034 #include "libavutil/crc.h"
00035 #include "avcodec.h"
00036 #include "put_bits.h"
00037 #include "dsputil.h"
00038 #include "ac3dsp.h"
00039 #include "ac3.h"
00040 #include "audioconvert.h"
00041
00042
00043 #ifndef CONFIG_AC3ENC_FLOAT
00044 #define CONFIG_AC3ENC_FLOAT 0
00045 #endif
00046
00047
00049 #define AC3_MAX_EXP_GROUPS 85
00050
00051
00052 #define AC3_REMATRIXING_IS_STATIC 0x1
00053 #define AC3_REMATRIXING_SUMS 0
00054 #define AC3_REMATRIXING_NONE 1
00055 #define AC3_REMATRIXING_ALWAYS 3
00056
00058 #define SCALE_FLOAT(a, bits) lrintf((a) * (float)(1 << (bits)))
00059
00060
00061 #if CONFIG_AC3ENC_FLOAT
00062 #include "ac3enc_float.h"
00063 #else
00064 #include "ac3enc_fixed.h"
00065 #endif
00066
00067
00071 typedef struct AC3Block {
00072 uint8_t **bap;
00073 CoefType **mdct_coef;
00074 int32_t **fixed_coef;
00075 uint8_t **exp;
00076 uint8_t **grouped_exp;
00077 int16_t **psd;
00078 int16_t **band_psd;
00079 int16_t **mask;
00080 uint16_t **qmant;
00081 uint8_t coeff_shift[AC3_MAX_CHANNELS];
00082 uint8_t new_rematrixing_strategy;
00083 uint8_t rematrixing_flags[4];
00084 } AC3Block;
00085
00089 typedef struct AC3EncodeContext {
00090 PutBitContext pb;
00091 DSPContext dsp;
00092 AC3DSPContext ac3dsp;
00093 AC3MDCTContext mdct;
00094
00095 AC3Block blocks[AC3_MAX_BLOCKS];
00096
00097 int bitstream_id;
00098 int bitstream_mode;
00099
00100 int bit_rate;
00101 int sample_rate;
00102
00103 int frame_size_min;
00104 int frame_size;
00105 int frame_size_code;
00106 uint16_t crc_inv[2];
00107 int bits_written;
00108 int samples_written;
00109
00110 int fbw_channels;
00111 int channels;
00112 int lfe_on;
00113 int lfe_channel;
00114 int channel_mode;
00115 const uint8_t *channel_map;
00116
00117 int cutoff;
00118 int bandwidth_code[AC3_MAX_CHANNELS];
00119 int nb_coefs[AC3_MAX_CHANNELS];
00120
00121 int rematrixing;
00122 int num_rematrixing_bands;
00123
00124
00125 int slow_gain_code;
00126 int slow_decay_code;
00127 int fast_decay_code;
00128 int db_per_bit_code;
00129 int floor_code;
00130 AC3BitAllocParameters bit_alloc;
00131 int coarse_snr_offset;
00132 int fast_gain_code[AC3_MAX_CHANNELS];
00133 int fine_snr_offset[AC3_MAX_CHANNELS];
00134 int frame_bits_fixed;
00135 int frame_bits;
00136 int exponent_bits;
00137
00138
00139 int mant1_cnt, mant2_cnt, mant4_cnt;
00140 uint16_t *qmant1_ptr, *qmant2_ptr, *qmant4_ptr;
00141
00142 SampleType **planar_samples;
00143 uint8_t *bap_buffer;
00144 uint8_t *bap1_buffer;
00145 CoefType *mdct_coef_buffer;
00146 int32_t *fixed_coef_buffer;
00147 uint8_t *exp_buffer;
00148 uint8_t *grouped_exp_buffer;
00149 int16_t *psd_buffer;
00150 int16_t *band_psd_buffer;
00151 int16_t *mask_buffer;
00152 uint16_t *qmant_buffer;
00153
00154 uint8_t exp_strategy[AC3_MAX_CHANNELS][AC3_MAX_BLOCKS];
00155
00156 DECLARE_ALIGNED(16, SampleType, windowed_samples)[AC3_WINDOW_SIZE];
00157 } AC3EncodeContext;
00158
00159
00160
00161
00162 static av_cold void mdct_end(AC3MDCTContext *mdct);
00163
00164 static av_cold int mdct_init(AVCodecContext *avctx, AC3MDCTContext *mdct,
00165 int nbits);
00166
00167 static void mdct512(AC3MDCTContext *mdct, CoefType *out, SampleType *in);
00168
00169 static void apply_window(DSPContext *dsp, SampleType *output, const SampleType *input,
00170 const SampleType *window, int n);
00171
00172 static int normalize_samples(AC3EncodeContext *s);
00173
00174 static void scale_coefficients(AC3EncodeContext *s);
00175
00176
00181 static uint8_t exponent_group_tab[3][256];
00182
00183
00187 static const int64_t ac3_channel_layouts[] = {
00188 AV_CH_LAYOUT_MONO,
00189 AV_CH_LAYOUT_STEREO,
00190 AV_CH_LAYOUT_2_1,
00191 AV_CH_LAYOUT_SURROUND,
00192 AV_CH_LAYOUT_2_2,
00193 AV_CH_LAYOUT_QUAD,
00194 AV_CH_LAYOUT_4POINT0,
00195 AV_CH_LAYOUT_5POINT0,
00196 AV_CH_LAYOUT_5POINT0_BACK,
00197 (AV_CH_LAYOUT_MONO | AV_CH_LOW_FREQUENCY),
00198 (AV_CH_LAYOUT_STEREO | AV_CH_LOW_FREQUENCY),
00199 (AV_CH_LAYOUT_2_1 | AV_CH_LOW_FREQUENCY),
00200 (AV_CH_LAYOUT_SURROUND | AV_CH_LOW_FREQUENCY),
00201 (AV_CH_LAYOUT_2_2 | AV_CH_LOW_FREQUENCY),
00202 (AV_CH_LAYOUT_QUAD | AV_CH_LOW_FREQUENCY),
00203 (AV_CH_LAYOUT_4POINT0 | AV_CH_LOW_FREQUENCY),
00204 AV_CH_LAYOUT_5POINT1,
00205 AV_CH_LAYOUT_5POINT1_BACK,
00206 0
00207 };
00208
00209
00214 static void adjust_frame_size(AC3EncodeContext *s)
00215 {
00216 while (s->bits_written >= s->bit_rate && s->samples_written >= s->sample_rate) {
00217 s->bits_written -= s->bit_rate;
00218 s->samples_written -= s->sample_rate;
00219 }
00220 s->frame_size = s->frame_size_min +
00221 2 * (s->bits_written * s->sample_rate < s->samples_written * s->bit_rate);
00222 s->bits_written += s->frame_size * 8;
00223 s->samples_written += AC3_FRAME_SIZE;
00224 }
00225
00226
00231 static void deinterleave_input_samples(AC3EncodeContext *s,
00232 const SampleType *samples)
00233 {
00234 int ch, i;
00235
00236
00237 for (ch = 0; ch < s->channels; ch++) {
00238 const SampleType *sptr;
00239 int sinc;
00240
00241
00242 memcpy(&s->planar_samples[ch][0], &s->planar_samples[ch][AC3_FRAME_SIZE],
00243 AC3_BLOCK_SIZE * sizeof(s->planar_samples[0][0]));
00244
00245
00246 sinc = s->channels;
00247 sptr = samples + s->channel_map[ch];
00248 for (i = AC3_BLOCK_SIZE; i < AC3_FRAME_SIZE+AC3_BLOCK_SIZE; i++) {
00249 s->planar_samples[ch][i] = *sptr;
00250 sptr += sinc;
00251 }
00252 }
00253 }
00254
00255
00261 static void apply_mdct(AC3EncodeContext *s)
00262 {
00263 int blk, ch;
00264
00265 for (ch = 0; ch < s->channels; ch++) {
00266 for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) {
00267 AC3Block *block = &s->blocks[blk];
00268 const SampleType *input_samples = &s->planar_samples[ch][blk * AC3_BLOCK_SIZE];
00269
00270 apply_window(&s->dsp, s->windowed_samples, input_samples, s->mdct.window, AC3_WINDOW_SIZE);
00271
00272 block->coeff_shift[ch] = normalize_samples(s);
00273
00274 mdct512(&s->mdct, block->mdct_coef[ch], s->windowed_samples);
00275 }
00276 }
00277 }
00278
00279
00284 static void rematrixing_init(AC3EncodeContext *s)
00285 {
00286 if (s->channel_mode == AC3_CHMODE_STEREO)
00287 s->rematrixing = AC3_REMATRIXING_SUMS;
00288 else
00289 s->rematrixing = AC3_REMATRIXING_NONE;
00290
00291
00292
00293 if (s->rematrixing & AC3_REMATRIXING_IS_STATIC) {
00294 int flag = (s->rematrixing == AC3_REMATRIXING_ALWAYS);
00295 s->blocks[0].new_rematrixing_strategy = 1;
00296 memset(s->blocks[0].rematrixing_flags, flag,
00297 sizeof(s->blocks[0].rematrixing_flags));
00298 }
00299 }
00300
00301
00305 static void compute_rematrixing_strategy(AC3EncodeContext *s)
00306 {
00307 int nb_coefs;
00308 int blk, bnd, i;
00309 AC3Block *block, *block0;
00310
00311 s->num_rematrixing_bands = 4;
00312
00313 if (s->rematrixing & AC3_REMATRIXING_IS_STATIC)
00314 return;
00315
00316 nb_coefs = FFMIN(s->nb_coefs[0], s->nb_coefs[1]);
00317
00318 for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) {
00319 block = &s->blocks[blk];
00320 block->new_rematrixing_strategy = !blk;
00321 for (bnd = 0; bnd < s->num_rematrixing_bands; bnd++) {
00322
00323 int start = ff_ac3_rematrix_band_tab[bnd];
00324 int end = FFMIN(nb_coefs, ff_ac3_rematrix_band_tab[bnd+1]);
00325 CoefSumType sum[4] = {0,};
00326 for (i = start; i < end; i++) {
00327 CoefType lt = block->mdct_coef[0][i];
00328 CoefType rt = block->mdct_coef[1][i];
00329 CoefType md = lt + rt;
00330 CoefType sd = lt - rt;
00331 MAC_COEF(sum[0], lt, lt);
00332 MAC_COEF(sum[1], rt, rt);
00333 MAC_COEF(sum[2], md, md);
00334 MAC_COEF(sum[3], sd, sd);
00335 }
00336
00337
00338 if (FFMIN(sum[2], sum[3]) < FFMIN(sum[0], sum[1]))
00339 block->rematrixing_flags[bnd] = 1;
00340 else
00341 block->rematrixing_flags[bnd] = 0;
00342
00343
00344 if (blk &&
00345 block->rematrixing_flags[bnd] != block0->rematrixing_flags[bnd]) {
00346 block->new_rematrixing_strategy = 1;
00347 }
00348 }
00349 block0 = block;
00350 }
00351 }
00352
00353
00357 static void apply_rematrixing(AC3EncodeContext *s)
00358 {
00359 int nb_coefs;
00360 int blk, bnd, i;
00361 int start, end;
00362 uint8_t *flags;
00363
00364 if (s->rematrixing == AC3_REMATRIXING_NONE)
00365 return;
00366
00367 nb_coefs = FFMIN(s->nb_coefs[0], s->nb_coefs[1]);
00368
00369 for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) {
00370 AC3Block *block = &s->blocks[blk];
00371 if (block->new_rematrixing_strategy)
00372 flags = block->rematrixing_flags;
00373 for (bnd = 0; bnd < s->num_rematrixing_bands; bnd++) {
00374 if (flags[bnd]) {
00375 start = ff_ac3_rematrix_band_tab[bnd];
00376 end = FFMIN(nb_coefs, ff_ac3_rematrix_band_tab[bnd+1]);
00377 for (i = start; i < end; i++) {
00378 int32_t lt = block->fixed_coef[0][i];
00379 int32_t rt = block->fixed_coef[1][i];
00380 block->fixed_coef[0][i] = (lt + rt) >> 1;
00381 block->fixed_coef[1][i] = (lt - rt) >> 1;
00382 }
00383 }
00384 }
00385 }
00386 }
00387
00388
00392 static av_cold void exponent_init(AC3EncodeContext *s)
00393 {
00394 int i;
00395 for (i = 73; i < 256; i++) {
00396 exponent_group_tab[0][i] = (i - 1) / 3;
00397 exponent_group_tab[1][i] = (i + 2) / 6;
00398 exponent_group_tab[2][i] = (i + 8) / 12;
00399 }
00400
00401 exponent_group_tab[0][7] = 2;
00402 }
00403
00404
00410 static void extract_exponents(AC3EncodeContext *s)
00411 {
00412 int blk, ch, i;
00413
00414 for (ch = 0; ch < s->channels; ch++) {
00415 for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) {
00416 AC3Block *block = &s->blocks[blk];
00417 uint8_t *exp = block->exp[ch];
00418 int32_t *coef = block->fixed_coef[ch];
00419 for (i = 0; i < AC3_MAX_COEFS; i++) {
00420 int e;
00421 int v = abs(coef[i]);
00422 if (v == 0)
00423 e = 24;
00424 else {
00425 e = 23 - av_log2(v);
00426 if (e >= 24) {
00427 e = 24;
00428 coef[i] = 0;
00429 }
00430 av_assert2(e >= 0);
00431 }
00432 exp[i] = e;
00433 }
00434 }
00435 }
00436 }
00437
00438
00443 #define EXP_DIFF_THRESHOLD 500
00444
00445
00449 static void compute_exp_strategy_ch(AC3EncodeContext *s, uint8_t *exp_strategy,
00450 uint8_t *exp)
00451 {
00452 int blk, blk1;
00453 int exp_diff;
00454
00455
00456
00457 exp_strategy[0] = EXP_NEW;
00458 exp += AC3_MAX_COEFS;
00459 for (blk = 1; blk < AC3_MAX_BLOCKS; blk++) {
00460 exp_diff = s->dsp.sad[0](NULL, exp, exp - AC3_MAX_COEFS, 16, 16);
00461 if (exp_diff > EXP_DIFF_THRESHOLD)
00462 exp_strategy[blk] = EXP_NEW;
00463 else
00464 exp_strategy[blk] = EXP_REUSE;
00465 exp += AC3_MAX_COEFS;
00466 }
00467
00468
00469
00470 blk = 0;
00471 while (blk < AC3_MAX_BLOCKS) {
00472 blk1 = blk + 1;
00473 while (blk1 < AC3_MAX_BLOCKS && exp_strategy[blk1] == EXP_REUSE)
00474 blk1++;
00475 switch (blk1 - blk) {
00476 case 1: exp_strategy[blk] = EXP_D45; break;
00477 case 2:
00478 case 3: exp_strategy[blk] = EXP_D25; break;
00479 default: exp_strategy[blk] = EXP_D15; break;
00480 }
00481 blk = blk1;
00482 }
00483 }
00484
00485
00490 static void compute_exp_strategy(AC3EncodeContext *s)
00491 {
00492 int ch, blk;
00493
00494 for (ch = 0; ch < s->fbw_channels; ch++) {
00495 compute_exp_strategy_ch(s, s->exp_strategy[ch], s->blocks[0].exp[ch]);
00496 }
00497 if (s->lfe_on) {
00498 ch = s->lfe_channel;
00499 s->exp_strategy[ch][0] = EXP_D15;
00500 for (blk = 1; blk < AC3_MAX_BLOCKS; blk++)
00501 s->exp_strategy[ch][blk] = EXP_REUSE;
00502 }
00503 }
00504
00505
00509 static void encode_exponents_blk_ch(uint8_t *exp, int nb_exps, int exp_strategy)
00510 {
00511 int nb_groups, i, k;
00512
00513 nb_groups = exponent_group_tab[exp_strategy-1][nb_exps] * 3;
00514
00515
00516 switch(exp_strategy) {
00517 case EXP_D25:
00518 for (i = 1, k = 1; i <= nb_groups; i++) {
00519 uint8_t exp_min = exp[k];
00520 if (exp[k+1] < exp_min)
00521 exp_min = exp[k+1];
00522 exp[i] = exp_min;
00523 k += 2;
00524 }
00525 break;
00526 case EXP_D45:
00527 for (i = 1, k = 1; i <= nb_groups; i++) {
00528 uint8_t exp_min = exp[k];
00529 if (exp[k+1] < exp_min)
00530 exp_min = exp[k+1];
00531 if (exp[k+2] < exp_min)
00532 exp_min = exp[k+2];
00533 if (exp[k+3] < exp_min)
00534 exp_min = exp[k+3];
00535 exp[i] = exp_min;
00536 k += 4;
00537 }
00538 break;
00539 }
00540
00541
00542 if (exp[0] > 15)
00543 exp[0] = 15;
00544
00545
00546
00547 for (i = 1; i <= nb_groups; i++)
00548 exp[i] = FFMIN(exp[i], exp[i-1] + 2);
00549 i--;
00550 while (--i >= 0)
00551 exp[i] = FFMIN(exp[i], exp[i+1] + 2);
00552
00553
00554 switch (exp_strategy) {
00555 case EXP_D25:
00556 for (i = nb_groups, k = nb_groups * 2; i > 0; i--) {
00557 uint8_t exp1 = exp[i];
00558 exp[k--] = exp1;
00559 exp[k--] = exp1;
00560 }
00561 break;
00562 case EXP_D45:
00563 for (i = nb_groups, k = nb_groups * 4; i > 0; i--) {
00564 exp[k] = exp[k-1] = exp[k-2] = exp[k-3] = exp[i];
00565 k -= 4;
00566 }
00567 break;
00568 }
00569 }
00570
00571
00578 static void encode_exponents(AC3EncodeContext *s)
00579 {
00580 int blk, blk1, ch;
00581 uint8_t *exp, *exp1, *exp_strategy;
00582 int nb_coefs, num_reuse_blocks;
00583
00584 for (ch = 0; ch < s->channels; ch++) {
00585 exp = s->blocks[0].exp[ch];
00586 exp_strategy = s->exp_strategy[ch];
00587 nb_coefs = s->nb_coefs[ch];
00588
00589 blk = 0;
00590 while (blk < AC3_MAX_BLOCKS) {
00591 blk1 = blk + 1;
00592
00593
00594 while (blk1 < AC3_MAX_BLOCKS && exp_strategy[blk1] == EXP_REUSE)
00595 blk1++;
00596 num_reuse_blocks = blk1 - blk - 1;
00597
00598
00599 s->ac3dsp.ac3_exponent_min(exp, num_reuse_blocks, nb_coefs);
00600
00601 encode_exponents_blk_ch(exp, nb_coefs, exp_strategy[blk]);
00602
00603
00604 exp1 = exp + AC3_MAX_COEFS;
00605 while (blk < blk1-1) {
00606 memcpy(exp1, exp, nb_coefs * sizeof(*exp));
00607 exp1 += AC3_MAX_COEFS;
00608 blk++;
00609 }
00610 blk = blk1;
00611 exp = exp1;
00612 }
00613 }
00614 }
00615
00616
00622 static void group_exponents(AC3EncodeContext *s)
00623 {
00624 int blk, ch, i;
00625 int group_size, nb_groups, bit_count;
00626 uint8_t *p;
00627 int delta0, delta1, delta2;
00628 int exp0, exp1;
00629
00630 bit_count = 0;
00631 for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) {
00632 AC3Block *block = &s->blocks[blk];
00633 for (ch = 0; ch < s->channels; ch++) {
00634 int exp_strategy = s->exp_strategy[ch][blk];
00635 if (exp_strategy == EXP_REUSE)
00636 continue;
00637 group_size = exp_strategy + (exp_strategy == EXP_D45);
00638 nb_groups = exponent_group_tab[exp_strategy-1][s->nb_coefs[ch]];
00639 bit_count += 4 + (nb_groups * 7);
00640 p = block->exp[ch];
00641
00642
00643 exp1 = *p++;
00644 block->grouped_exp[ch][0] = exp1;
00645
00646
00647 for (i = 1; i <= nb_groups; i++) {
00648
00649 exp0 = exp1;
00650 exp1 = p[0];
00651 p += group_size;
00652 delta0 = exp1 - exp0 + 2;
00653 av_assert2(delta0 >= 0 && delta0 <= 4);
00654
00655 exp0 = exp1;
00656 exp1 = p[0];
00657 p += group_size;
00658 delta1 = exp1 - exp0 + 2;
00659 av_assert2(delta1 >= 0 && delta1 <= 4);
00660
00661 exp0 = exp1;
00662 exp1 = p[0];
00663 p += group_size;
00664 delta2 = exp1 - exp0 + 2;
00665 av_assert2(delta2 >= 0 && delta2 <= 4);
00666
00667 block->grouped_exp[ch][i] = ((delta0 * 5 + delta1) * 5) + delta2;
00668 }
00669 }
00670 }
00671
00672 s->exponent_bits = bit_count;
00673 }
00674
00675
00681 static void process_exponents(AC3EncodeContext *s)
00682 {
00683 extract_exponents(s);
00684
00685 compute_exp_strategy(s);
00686
00687 encode_exponents(s);
00688
00689 group_exponents(s);
00690
00691 emms_c();
00692 }
00693
00694
00699 static void count_frame_bits_fixed(AC3EncodeContext *s)
00700 {
00701 static const int frame_bits_inc[8] = { 0, 0, 2, 2, 2, 4, 2, 4 };
00702 int blk;
00703 int frame_bits;
00704
00705
00706
00707
00708
00709
00710
00711
00712
00713
00714
00715
00716 frame_bits = 65;
00717 frame_bits += frame_bits_inc[s->channel_mode];
00718
00719
00720 for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) {
00721 frame_bits += s->fbw_channels * 2 + 2;
00722 if (s->channel_mode == AC3_CHMODE_STEREO) {
00723 frame_bits++;
00724 }
00725 frame_bits += 2 * s->fbw_channels;
00726 if (s->lfe_on)
00727 frame_bits++;
00728 frame_bits++;
00729 frame_bits++;
00730 frame_bits += 2;
00731 }
00732 frame_bits++;
00733
00734
00735
00736
00737 frame_bits += 2*4 + 3 + 6 + s->channels * (4 + 3);
00738
00739
00740 frame_bits += 2;
00741
00742
00743 frame_bits += 16;
00744
00745 s->frame_bits_fixed = frame_bits;
00746 }
00747
00748
00753 static void bit_alloc_init(AC3EncodeContext *s)
00754 {
00755 int ch;
00756
00757
00758 s->slow_decay_code = 2;
00759 s->fast_decay_code = 1;
00760 s->slow_gain_code = 1;
00761 s->db_per_bit_code = 3;
00762 s->floor_code = 7;
00763 for (ch = 0; ch < s->channels; ch++)
00764 s->fast_gain_code[ch] = 4;
00765
00766
00767 s->coarse_snr_offset = 40;
00768
00769
00770
00771
00772 s->bit_alloc.slow_decay = ff_ac3_slow_decay_tab[s->slow_decay_code] >> s->bit_alloc.sr_shift;
00773 s->bit_alloc.fast_decay = ff_ac3_fast_decay_tab[s->fast_decay_code] >> s->bit_alloc.sr_shift;
00774 s->bit_alloc.slow_gain = ff_ac3_slow_gain_tab[s->slow_gain_code];
00775 s->bit_alloc.db_per_bit = ff_ac3_db_per_bit_tab[s->db_per_bit_code];
00776 s->bit_alloc.floor = ff_ac3_floor_tab[s->floor_code];
00777
00778 count_frame_bits_fixed(s);
00779 }
00780
00781
00787 static void count_frame_bits(AC3EncodeContext *s)
00788 {
00789 int blk, ch;
00790 int frame_bits = 0;
00791
00792 for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) {
00793
00794 if (s->channel_mode == AC3_CHMODE_STEREO &&
00795 s->blocks[blk].new_rematrixing_strategy) {
00796 frame_bits += s->num_rematrixing_bands;
00797 }
00798
00799 for (ch = 0; ch < s->fbw_channels; ch++) {
00800 if (s->exp_strategy[ch][blk] != EXP_REUSE)
00801 frame_bits += 6 + 2;
00802 }
00803 }
00804 s->frame_bits = s->frame_bits_fixed + frame_bits;
00805 }
00806
00807
00811 static int compute_mantissa_size(int mant_cnt[5], uint8_t *bap, int nb_coefs)
00812 {
00813 int bits, b, i;
00814
00815 bits = 0;
00816 for (i = 0; i < nb_coefs; i++) {
00817 b = bap[i];
00818 if (b <= 4) {
00819
00820 mant_cnt[b]++;
00821 } else if (b <= 13) {
00822
00823 bits += b - 1;
00824 } else {
00825
00826 bits += (b == 14) ? 14 : 16;
00827 }
00828 }
00829 return bits;
00830 }
00831
00832
00836 static int compute_mantissa_size_final(int mant_cnt[5])
00837 {
00838
00839 int bits = (mant_cnt[1] / 3) * 5;
00840
00841
00842 bits += ((mant_cnt[2] / 3) + (mant_cnt[4] >> 1)) * 7;
00843
00844 bits += mant_cnt[3] * 3;
00845 return bits;
00846 }
00847
00848
00853 static void bit_alloc_masking(AC3EncodeContext *s)
00854 {
00855 int blk, ch;
00856
00857 for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) {
00858 AC3Block *block = &s->blocks[blk];
00859 for (ch = 0; ch < s->channels; ch++) {
00860
00861
00862
00863 if (s->exp_strategy[ch][blk] != EXP_REUSE) {
00864 ff_ac3_bit_alloc_calc_psd(block->exp[ch], 0,
00865 s->nb_coefs[ch],
00866 block->psd[ch], block->band_psd[ch]);
00867 ff_ac3_bit_alloc_calc_mask(&s->bit_alloc, block->band_psd[ch],
00868 0, s->nb_coefs[ch],
00869 ff_ac3_fast_gain_tab[s->fast_gain_code[ch]],
00870 ch == s->lfe_channel,
00871 DBA_NONE, 0, NULL, NULL, NULL,
00872 block->mask[ch]);
00873 }
00874 }
00875 }
00876 }
00877
00878
00883 static void reset_block_bap(AC3EncodeContext *s)
00884 {
00885 int blk, ch;
00886 if (s->blocks[0].bap[0] == s->bap_buffer)
00887 return;
00888 for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) {
00889 for (ch = 0; ch < s->channels; ch++) {
00890 s->blocks[blk].bap[ch] = &s->bap_buffer[AC3_MAX_COEFS * (blk * s->channels + ch)];
00891 }
00892 }
00893 }
00894
00895
00903 static int bit_alloc(AC3EncodeContext *s, int snr_offset)
00904 {
00905 int blk, ch;
00906 int mantissa_bits;
00907 int mant_cnt[5];
00908
00909 snr_offset = (snr_offset - 240) << 2;
00910
00911 reset_block_bap(s);
00912 mantissa_bits = 0;
00913 for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) {
00914 AC3Block *block = &s->blocks[blk];
00915
00916
00917
00918 mant_cnt[0] = mant_cnt[3] = 0;
00919 mant_cnt[1] = mant_cnt[2] = 2;
00920 mant_cnt[4] = 1;
00921 for (ch = 0; ch < s->channels; ch++) {
00922
00923
00924
00925
00926 if (s->exp_strategy[ch][blk] == EXP_REUSE) {
00927 memcpy(block->bap[ch], s->blocks[blk-1].bap[ch], AC3_MAX_COEFS);
00928 } else {
00929 ff_ac3_bit_alloc_calc_bap(block->mask[ch], block->psd[ch], 0,
00930 s->nb_coefs[ch], snr_offset,
00931 s->bit_alloc.floor, ff_ac3_bap_tab,
00932 block->bap[ch]);
00933 }
00934 mantissa_bits += compute_mantissa_size(mant_cnt, block->bap[ch], s->nb_coefs[ch]);
00935 }
00936 mantissa_bits += compute_mantissa_size_final(mant_cnt);
00937 }
00938 return mantissa_bits;
00939 }
00940
00941
00946 static int cbr_bit_allocation(AC3EncodeContext *s)
00947 {
00948 int ch;
00949 int bits_left;
00950 int snr_offset, snr_incr;
00951
00952 bits_left = 8 * s->frame_size - (s->frame_bits + s->exponent_bits);
00953 av_assert2(bits_left >= 0);
00954
00955 snr_offset = s->coarse_snr_offset << 4;
00956
00957
00958
00959 if ((snr_offset | s->fine_snr_offset[0]) == 1023) {
00960 if (bit_alloc(s, 1023) <= bits_left)
00961 return 0;
00962 }
00963
00964 while (snr_offset >= 0 &&
00965 bit_alloc(s, snr_offset) > bits_left) {
00966 snr_offset -= 64;
00967 }
00968 if (snr_offset < 0)
00969 return AVERROR(EINVAL);
00970
00971 FFSWAP(uint8_t *, s->bap_buffer, s->bap1_buffer);
00972 for (snr_incr = 64; snr_incr > 0; snr_incr >>= 2) {
00973 while (snr_offset + snr_incr <= 1023 &&
00974 bit_alloc(s, snr_offset + snr_incr) <= bits_left) {
00975 snr_offset += snr_incr;
00976 FFSWAP(uint8_t *, s->bap_buffer, s->bap1_buffer);
00977 }
00978 }
00979 FFSWAP(uint8_t *, s->bap_buffer, s->bap1_buffer);
00980 reset_block_bap(s);
00981
00982 s->coarse_snr_offset = snr_offset >> 4;
00983 for (ch = 0; ch < s->channels; ch++)
00984 s->fine_snr_offset[ch] = snr_offset & 0xF;
00985
00986 return 0;
00987 }
00988
00989
00997 static int downgrade_exponents(AC3EncodeContext *s)
00998 {
00999 int ch, blk;
01000
01001 for (ch = 0; ch < s->fbw_channels; ch++) {
01002 for (blk = AC3_MAX_BLOCKS-1; blk >= 0; blk--) {
01003 if (s->exp_strategy[ch][blk] == EXP_D15) {
01004 s->exp_strategy[ch][blk] = EXP_D25;
01005 return 0;
01006 }
01007 }
01008 }
01009 for (ch = 0; ch < s->fbw_channels; ch++) {
01010 for (blk = AC3_MAX_BLOCKS-1; blk >= 0; blk--) {
01011 if (s->exp_strategy[ch][blk] == EXP_D25) {
01012 s->exp_strategy[ch][blk] = EXP_D45;
01013 return 0;
01014 }
01015 }
01016 }
01017 for (ch = 0; ch < s->fbw_channels; ch++) {
01018
01019
01020 for (blk = AC3_MAX_BLOCKS-1; blk > 0; blk--) {
01021 if (s->exp_strategy[ch][blk] > EXP_REUSE) {
01022 s->exp_strategy[ch][blk] = EXP_REUSE;
01023 return 0;
01024 }
01025 }
01026 }
01027 return -1;
01028 }
01029
01030
01037 static int reduce_bandwidth(AC3EncodeContext *s, int min_bw_code)
01038 {
01039 int ch;
01040
01041 if (s->bandwidth_code[0] > min_bw_code) {
01042 for (ch = 0; ch < s->fbw_channels; ch++) {
01043 s->bandwidth_code[ch]--;
01044 s->nb_coefs[ch] = s->bandwidth_code[ch] * 3 + 73;
01045 }
01046 return 0;
01047 }
01048 return -1;
01049 }
01050
01051
01058 static int compute_bit_allocation(AC3EncodeContext *s)
01059 {
01060 int ret;
01061
01062 count_frame_bits(s);
01063
01064 bit_alloc_masking(s);
01065
01066 ret = cbr_bit_allocation(s);
01067 while (ret) {
01068
01069 if (!downgrade_exponents(s)) {
01070 extract_exponents(s);
01071 encode_exponents(s);
01072 group_exponents(s);
01073 ret = compute_bit_allocation(s);
01074 continue;
01075 }
01076
01077
01078
01079
01080 if (!s->cutoff && !reduce_bandwidth(s, 0)) {
01081 process_exponents(s);
01082 ret = compute_bit_allocation(s);
01083 continue;
01084 }
01085
01086
01087 break;
01088 }
01089
01090 return ret;
01091 }
01092
01093
01097 static inline int sym_quant(int c, int e, int levels)
01098 {
01099 int v;
01100
01101 if (c >= 0) {
01102 v = (levels * (c << e)) >> 24;
01103 v = (v + 1) >> 1;
01104 v = (levels >> 1) + v;
01105 } else {
01106 v = (levels * ((-c) << e)) >> 24;
01107 v = (v + 1) >> 1;
01108 v = (levels >> 1) - v;
01109 }
01110 av_assert2(v >= 0 && v < levels);
01111 return v;
01112 }
01113
01114
01118 static inline int asym_quant(int c, int e, int qbits)
01119 {
01120 int lshift, m, v;
01121
01122 lshift = e + qbits - 24;
01123 if (lshift >= 0)
01124 v = c << lshift;
01125 else
01126 v = c >> (-lshift);
01127
01128 v = (v + 1) >> 1;
01129 m = (1 << (qbits-1));
01130 if (v >= m)
01131 v = m - 1;
01132 av_assert2(v >= -m);
01133 return v & ((1 << qbits)-1);
01134 }
01135
01136
01140 static void quantize_mantissas_blk_ch(AC3EncodeContext *s, int32_t *fixed_coef,
01141 uint8_t *exp,
01142 uint8_t *bap, uint16_t *qmant, int n)
01143 {
01144 int i;
01145
01146 for (i = 0; i < n; i++) {
01147 int v;
01148 int c = fixed_coef[i];
01149 int e = exp[i];
01150 int b = bap[i];
01151 switch (b) {
01152 case 0:
01153 v = 0;
01154 break;
01155 case 1:
01156 v = sym_quant(c, e, 3);
01157 switch (s->mant1_cnt) {
01158 case 0:
01159 s->qmant1_ptr = &qmant[i];
01160 v = 9 * v;
01161 s->mant1_cnt = 1;
01162 break;
01163 case 1:
01164 *s->qmant1_ptr += 3 * v;
01165 s->mant1_cnt = 2;
01166 v = 128;
01167 break;
01168 default:
01169 *s->qmant1_ptr += v;
01170 s->mant1_cnt = 0;
01171 v = 128;
01172 break;
01173 }
01174 break;
01175 case 2:
01176 v = sym_quant(c, e, 5);
01177 switch (s->mant2_cnt) {
01178 case 0:
01179 s->qmant2_ptr = &qmant[i];
01180 v = 25 * v;
01181 s->mant2_cnt = 1;
01182 break;
01183 case 1:
01184 *s->qmant2_ptr += 5 * v;
01185 s->mant2_cnt = 2;
01186 v = 128;
01187 break;
01188 default:
01189 *s->qmant2_ptr += v;
01190 s->mant2_cnt = 0;
01191 v = 128;
01192 break;
01193 }
01194 break;
01195 case 3:
01196 v = sym_quant(c, e, 7);
01197 break;
01198 case 4:
01199 v = sym_quant(c, e, 11);
01200 switch (s->mant4_cnt) {
01201 case 0:
01202 s->qmant4_ptr = &qmant[i];
01203 v = 11 * v;
01204 s->mant4_cnt = 1;
01205 break;
01206 default:
01207 *s->qmant4_ptr += v;
01208 s->mant4_cnt = 0;
01209 v = 128;
01210 break;
01211 }
01212 break;
01213 case 5:
01214 v = sym_quant(c, e, 15);
01215 break;
01216 case 14:
01217 v = asym_quant(c, e, 14);
01218 break;
01219 case 15:
01220 v = asym_quant(c, e, 16);
01221 break;
01222 default:
01223 v = asym_quant(c, e, b - 1);
01224 break;
01225 }
01226 qmant[i] = v;
01227 }
01228 }
01229
01230
01234 static void quantize_mantissas(AC3EncodeContext *s)
01235 {
01236 int blk, ch;
01237
01238
01239 for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) {
01240 AC3Block *block = &s->blocks[blk];
01241 s->mant1_cnt = s->mant2_cnt = s->mant4_cnt = 0;
01242 s->qmant1_ptr = s->qmant2_ptr = s->qmant4_ptr = NULL;
01243
01244 for (ch = 0; ch < s->channels; ch++) {
01245 quantize_mantissas_blk_ch(s, block->fixed_coef[ch],
01246 block->exp[ch], block->bap[ch],
01247 block->qmant[ch], s->nb_coefs[ch]);
01248 }
01249 }
01250 }
01251
01252
01256 static void output_frame_header(AC3EncodeContext *s)
01257 {
01258 put_bits(&s->pb, 16, 0x0b77);
01259 put_bits(&s->pb, 16, 0);
01260 put_bits(&s->pb, 2, s->bit_alloc.sr_code);
01261 put_bits(&s->pb, 6, s->frame_size_code + (s->frame_size - s->frame_size_min) / 2);
01262 put_bits(&s->pb, 5, s->bitstream_id);
01263 put_bits(&s->pb, 3, s->bitstream_mode);
01264 put_bits(&s->pb, 3, s->channel_mode);
01265 if ((s->channel_mode & 0x01) && s->channel_mode != AC3_CHMODE_MONO)
01266 put_bits(&s->pb, 2, 1);
01267 if (s->channel_mode & 0x04)
01268 put_bits(&s->pb, 2, 1);
01269 if (s->channel_mode == AC3_CHMODE_STEREO)
01270 put_bits(&s->pb, 2, 0);
01271 put_bits(&s->pb, 1, s->lfe_on);
01272 put_bits(&s->pb, 5, 31);
01273 put_bits(&s->pb, 1, 0);
01274 put_bits(&s->pb, 1, 0);
01275 put_bits(&s->pb, 1, 0);
01276 put_bits(&s->pb, 1, 0);
01277 put_bits(&s->pb, 1, 1);
01278 put_bits(&s->pb, 1, 0);
01279 put_bits(&s->pb, 1, 0);
01280 put_bits(&s->pb, 1, 0);
01281 }
01282
01283
01287 static void output_audio_block(AC3EncodeContext *s, int blk)
01288 {
01289 int ch, i, baie, rbnd;
01290 AC3Block *block = &s->blocks[blk];
01291
01292
01293 for (ch = 0; ch < s->fbw_channels; ch++)
01294 put_bits(&s->pb, 1, 0);
01295
01296
01297 for (ch = 0; ch < s->fbw_channels; ch++)
01298 put_bits(&s->pb, 1, 1);
01299
01300
01301 put_bits(&s->pb, 1, 0);
01302
01303
01304 if (!blk) {
01305 put_bits(&s->pb, 1, 1);
01306 put_bits(&s->pb, 1, 0);
01307 } else {
01308 put_bits(&s->pb, 1, 0);
01309 }
01310
01311
01312 if (s->channel_mode == AC3_CHMODE_STEREO) {
01313 put_bits(&s->pb, 1, block->new_rematrixing_strategy);
01314 if (block->new_rematrixing_strategy) {
01315
01316 for (rbnd = 0; rbnd < s->num_rematrixing_bands; rbnd++)
01317 put_bits(&s->pb, 1, block->rematrixing_flags[rbnd]);
01318 }
01319 }
01320
01321
01322 for (ch = 0; ch < s->fbw_channels; ch++)
01323 put_bits(&s->pb, 2, s->exp_strategy[ch][blk]);
01324 if (s->lfe_on)
01325 put_bits(&s->pb, 1, s->exp_strategy[s->lfe_channel][blk]);
01326
01327
01328 for (ch = 0; ch < s->fbw_channels; ch++) {
01329 if (s->exp_strategy[ch][blk] != EXP_REUSE)
01330 put_bits(&s->pb, 6, s->bandwidth_code[ch]);
01331 }
01332
01333
01334 for (ch = 0; ch < s->channels; ch++) {
01335 int nb_groups;
01336
01337 if (s->exp_strategy[ch][blk] == EXP_REUSE)
01338 continue;
01339
01340
01341 put_bits(&s->pb, 4, block->grouped_exp[ch][0]);
01342
01343
01344 nb_groups = exponent_group_tab[s->exp_strategy[ch][blk]-1][s->nb_coefs[ch]];
01345 for (i = 1; i <= nb_groups; i++)
01346 put_bits(&s->pb, 7, block->grouped_exp[ch][i]);
01347
01348
01349 if (ch != s->lfe_channel)
01350 put_bits(&s->pb, 2, 0);
01351 }
01352
01353
01354 baie = (blk == 0);
01355 put_bits(&s->pb, 1, baie);
01356 if (baie) {
01357 put_bits(&s->pb, 2, s->slow_decay_code);
01358 put_bits(&s->pb, 2, s->fast_decay_code);
01359 put_bits(&s->pb, 2, s->slow_gain_code);
01360 put_bits(&s->pb, 2, s->db_per_bit_code);
01361 put_bits(&s->pb, 3, s->floor_code);
01362 }
01363
01364
01365 put_bits(&s->pb, 1, baie);
01366 if (baie) {
01367 put_bits(&s->pb, 6, s->coarse_snr_offset);
01368 for (ch = 0; ch < s->channels; ch++) {
01369 put_bits(&s->pb, 4, s->fine_snr_offset[ch]);
01370 put_bits(&s->pb, 3, s->fast_gain_code[ch]);
01371 }
01372 }
01373
01374 put_bits(&s->pb, 1, 0);
01375 put_bits(&s->pb, 1, 0);
01376
01377
01378 for (ch = 0; ch < s->channels; ch++) {
01379 int b, q;
01380 for (i = 0; i < s->nb_coefs[ch]; i++) {
01381 q = block->qmant[ch][i];
01382 b = block->bap[ch][i];
01383 switch (b) {
01384 case 0: break;
01385 case 1: if (q != 128) put_bits(&s->pb, 5, q); break;
01386 case 2: if (q != 128) put_bits(&s->pb, 7, q); break;
01387 case 3: put_bits(&s->pb, 3, q); break;
01388 case 4: if (q != 128) put_bits(&s->pb, 7, q); break;
01389 case 14: put_bits(&s->pb, 14, q); break;
01390 case 15: put_bits(&s->pb, 16, q); break;
01391 default: put_bits(&s->pb, b-1, q); break;
01392 }
01393 }
01394 }
01395 }
01396
01397
01399 #define CRC16_POLY ((1 << 0) | (1 << 2) | (1 << 15) | (1 << 16))
01400
01401
01402 static unsigned int mul_poly(unsigned int a, unsigned int b, unsigned int poly)
01403 {
01404 unsigned int c;
01405
01406 c = 0;
01407 while (a) {
01408 if (a & 1)
01409 c ^= b;
01410 a = a >> 1;
01411 b = b << 1;
01412 if (b & (1 << 16))
01413 b ^= poly;
01414 }
01415 return c;
01416 }
01417
01418
01419 static unsigned int pow_poly(unsigned int a, unsigned int n, unsigned int poly)
01420 {
01421 unsigned int r;
01422 r = 1;
01423 while (n) {
01424 if (n & 1)
01425 r = mul_poly(r, a, poly);
01426 a = mul_poly(a, a, poly);
01427 n >>= 1;
01428 }
01429 return r;
01430 }
01431
01432
01436 static void output_frame_end(AC3EncodeContext *s)
01437 {
01438 const AVCRC *crc_ctx = av_crc_get_table(AV_CRC_16_ANSI);
01439 int frame_size_58, pad_bytes, crc1, crc2_partial, crc2, crc_inv;
01440 uint8_t *frame;
01441
01442 frame_size_58 = ((s->frame_size >> 2) + (s->frame_size >> 4)) << 1;
01443
01444
01445 av_assert2(s->frame_size * 8 - put_bits_count(&s->pb) >= 18);
01446 flush_put_bits(&s->pb);
01447 frame = s->pb.buf;
01448 pad_bytes = s->frame_size - (put_bits_ptr(&s->pb) - frame) - 2;
01449 av_assert2(pad_bytes >= 0);
01450 if (pad_bytes > 0)
01451 memset(put_bits_ptr(&s->pb), 0, pad_bytes);
01452
01453
01454
01455 crc1 = av_bswap16(av_crc(crc_ctx, 0, frame + 4, frame_size_58 - 4));
01456 crc_inv = s->crc_inv[s->frame_size > s->frame_size_min];
01457 crc1 = mul_poly(crc_inv, crc1, CRC16_POLY);
01458 AV_WB16(frame + 2, crc1);
01459
01460
01461 crc2_partial = av_crc(crc_ctx, 0, frame + frame_size_58,
01462 s->frame_size - frame_size_58 - 3);
01463 crc2 = av_crc(crc_ctx, crc2_partial, frame + s->frame_size - 3, 1);
01464
01465 if (crc2 == 0x770B) {
01466 frame[s->frame_size - 3] ^= 0x1;
01467 crc2 = av_crc(crc_ctx, crc2_partial, frame + s->frame_size - 3, 1);
01468 }
01469 crc2 = av_bswap16(crc2);
01470 AV_WB16(frame + s->frame_size - 2, crc2);
01471 }
01472
01473
01477 static void output_frame(AC3EncodeContext *s, unsigned char *frame)
01478 {
01479 int blk;
01480
01481 init_put_bits(&s->pb, frame, AC3_MAX_CODED_FRAME_SIZE);
01482
01483 output_frame_header(s);
01484
01485 for (blk = 0; blk < AC3_MAX_BLOCKS; blk++)
01486 output_audio_block(s, blk);
01487
01488 output_frame_end(s);
01489 }
01490
01491
01495 static int ac3_encode_frame(AVCodecContext *avctx, unsigned char *frame,
01496 int buf_size, void *data)
01497 {
01498 AC3EncodeContext *s = avctx->priv_data;
01499 const SampleType *samples = data;
01500 int ret;
01501
01502 if (s->bit_alloc.sr_code == 1)
01503 adjust_frame_size(s);
01504
01505 deinterleave_input_samples(s, samples);
01506
01507 apply_mdct(s);
01508
01509 scale_coefficients(s);
01510
01511 compute_rematrixing_strategy(s);
01512
01513 apply_rematrixing(s);
01514
01515 process_exponents(s);
01516
01517 ret = compute_bit_allocation(s);
01518 if (ret) {
01519 av_log(avctx, AV_LOG_ERROR, "Bit allocation failed. Try increasing the bitrate.\n");
01520 return ret;
01521 }
01522
01523 quantize_mantissas(s);
01524
01525 output_frame(s, frame);
01526
01527 return s->frame_size;
01528 }
01529
01530
01534 static av_cold int ac3_encode_close(AVCodecContext *avctx)
01535 {
01536 int blk, ch;
01537 AC3EncodeContext *s = avctx->priv_data;
01538
01539 for (ch = 0; ch < s->channels; ch++)
01540 av_freep(&s->planar_samples[ch]);
01541 av_freep(&s->planar_samples);
01542 av_freep(&s->bap_buffer);
01543 av_freep(&s->bap1_buffer);
01544 av_freep(&s->mdct_coef_buffer);
01545 av_freep(&s->fixed_coef_buffer);
01546 av_freep(&s->exp_buffer);
01547 av_freep(&s->grouped_exp_buffer);
01548 av_freep(&s->psd_buffer);
01549 av_freep(&s->band_psd_buffer);
01550 av_freep(&s->mask_buffer);
01551 av_freep(&s->qmant_buffer);
01552 for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) {
01553 AC3Block *block = &s->blocks[blk];
01554 av_freep(&block->bap);
01555 av_freep(&block->mdct_coef);
01556 av_freep(&block->fixed_coef);
01557 av_freep(&block->exp);
01558 av_freep(&block->grouped_exp);
01559 av_freep(&block->psd);
01560 av_freep(&block->band_psd);
01561 av_freep(&block->mask);
01562 av_freep(&block->qmant);
01563 }
01564
01565 mdct_end(&s->mdct);
01566
01567 av_freep(&avctx->coded_frame);
01568 return 0;
01569 }
01570
01571
01575 static av_cold int set_channel_info(AC3EncodeContext *s, int channels,
01576 int64_t *channel_layout)
01577 {
01578 int ch_layout;
01579
01580 if (channels < 1 || channels > AC3_MAX_CHANNELS)
01581 return AVERROR(EINVAL);
01582 if ((uint64_t)*channel_layout > 0x7FF)
01583 return AVERROR(EINVAL);
01584 ch_layout = *channel_layout;
01585 if (!ch_layout)
01586 ch_layout = avcodec_guess_channel_layout(channels, CODEC_ID_AC3, NULL);
01587 if (av_get_channel_layout_nb_channels(ch_layout) != channels)
01588 return AVERROR(EINVAL);
01589
01590 s->lfe_on = !!(ch_layout & AV_CH_LOW_FREQUENCY);
01591 s->channels = channels;
01592 s->fbw_channels = channels - s->lfe_on;
01593 s->lfe_channel = s->lfe_on ? s->fbw_channels : -1;
01594 if (s->lfe_on)
01595 ch_layout -= AV_CH_LOW_FREQUENCY;
01596
01597 switch (ch_layout) {
01598 case AV_CH_LAYOUT_MONO: s->channel_mode = AC3_CHMODE_MONO; break;
01599 case AV_CH_LAYOUT_STEREO: s->channel_mode = AC3_CHMODE_STEREO; break;
01600 case AV_CH_LAYOUT_SURROUND: s->channel_mode = AC3_CHMODE_3F; break;
01601 case AV_CH_LAYOUT_2_1: s->channel_mode = AC3_CHMODE_2F1R; break;
01602 case AV_CH_LAYOUT_4POINT0: s->channel_mode = AC3_CHMODE_3F1R; break;
01603 case AV_CH_LAYOUT_QUAD:
01604 case AV_CH_LAYOUT_2_2: s->channel_mode = AC3_CHMODE_2F2R; break;
01605 case AV_CH_LAYOUT_5POINT0:
01606 case AV_CH_LAYOUT_5POINT0_BACK: s->channel_mode = AC3_CHMODE_3F2R; break;
01607 default:
01608 return AVERROR(EINVAL);
01609 }
01610
01611 s->channel_map = ff_ac3_enc_channel_map[s->channel_mode][s->lfe_on];
01612 *channel_layout = ch_layout;
01613 if (s->lfe_on)
01614 *channel_layout |= AV_CH_LOW_FREQUENCY;
01615
01616 return 0;
01617 }
01618
01619
01620 static av_cold int validate_options(AVCodecContext *avctx, AC3EncodeContext *s)
01621 {
01622 int i, ret;
01623
01624
01625 if (!avctx->channel_layout) {
01626 av_log(avctx, AV_LOG_WARNING, "No channel layout specified. The "
01627 "encoder will guess the layout, but it "
01628 "might be incorrect.\n");
01629 }
01630 ret = set_channel_info(s, avctx->channels, &avctx->channel_layout);
01631 if (ret) {
01632 av_log(avctx, AV_LOG_ERROR, "invalid channel layout\n");
01633 return ret;
01634 }
01635
01636
01637 for (i = 0; i < 9; i++) {
01638 if ((ff_ac3_sample_rate_tab[i / 3] >> (i % 3)) == avctx->sample_rate)
01639 break;
01640 }
01641 if (i == 9) {
01642 av_log(avctx, AV_LOG_ERROR, "invalid sample rate\n");
01643 return AVERROR(EINVAL);
01644 }
01645 s->sample_rate = avctx->sample_rate;
01646 s->bit_alloc.sr_shift = i % 3;
01647 s->bit_alloc.sr_code = i / 3;
01648
01649
01650 for (i = 0; i < 19; i++) {
01651 if ((ff_ac3_bitrate_tab[i] >> s->bit_alloc.sr_shift)*1000 == avctx->bit_rate)
01652 break;
01653 }
01654 if (i == 19) {
01655 av_log(avctx, AV_LOG_ERROR, "invalid bit rate\n");
01656 return AVERROR(EINVAL);
01657 }
01658 s->bit_rate = avctx->bit_rate;
01659 s->frame_size_code = i << 1;
01660
01661
01662 if (avctx->cutoff < 0) {
01663 av_log(avctx, AV_LOG_ERROR, "invalid cutoff frequency\n");
01664 return AVERROR(EINVAL);
01665 }
01666 s->cutoff = avctx->cutoff;
01667 if (s->cutoff > (s->sample_rate >> 1))
01668 s->cutoff = s->sample_rate >> 1;
01669
01670 return 0;
01671 }
01672
01673
01679 static av_cold void set_bandwidth(AC3EncodeContext *s)
01680 {
01681 int ch, bw_code;
01682
01683 if (s->cutoff) {
01684
01685 int fbw_coeffs;
01686 fbw_coeffs = s->cutoff * 2 * AC3_MAX_COEFS / s->sample_rate;
01687 bw_code = av_clip((fbw_coeffs - 73) / 3, 0, 60);
01688 } else {
01689
01690
01691
01692 bw_code = 50;
01693 }
01694
01695
01696 for (ch = 0; ch < s->fbw_channels; ch++) {
01697 s->bandwidth_code[ch] = bw_code;
01698 s->nb_coefs[ch] = bw_code * 3 + 73;
01699 }
01700 if (s->lfe_on)
01701 s->nb_coefs[s->lfe_channel] = 7;
01702 }
01703
01704
01705 static av_cold int allocate_buffers(AVCodecContext *avctx)
01706 {
01707 int blk, ch;
01708 AC3EncodeContext *s = avctx->priv_data;
01709
01710 FF_ALLOC_OR_GOTO(avctx, s->planar_samples, s->channels * sizeof(*s->planar_samples),
01711 alloc_fail);
01712 for (ch = 0; ch < s->channels; ch++) {
01713 FF_ALLOCZ_OR_GOTO(avctx, s->planar_samples[ch],
01714 (AC3_FRAME_SIZE+AC3_BLOCK_SIZE) * sizeof(**s->planar_samples),
01715 alloc_fail);
01716 }
01717 FF_ALLOC_OR_GOTO(avctx, s->bap_buffer, AC3_MAX_BLOCKS * s->channels *
01718 AC3_MAX_COEFS * sizeof(*s->bap_buffer), alloc_fail);
01719 FF_ALLOC_OR_GOTO(avctx, s->bap1_buffer, AC3_MAX_BLOCKS * s->channels *
01720 AC3_MAX_COEFS * sizeof(*s->bap1_buffer), alloc_fail);
01721 FF_ALLOC_OR_GOTO(avctx, s->mdct_coef_buffer, AC3_MAX_BLOCKS * s->channels *
01722 AC3_MAX_COEFS * sizeof(*s->mdct_coef_buffer), alloc_fail);
01723 FF_ALLOC_OR_GOTO(avctx, s->exp_buffer, AC3_MAX_BLOCKS * s->channels *
01724 AC3_MAX_COEFS * sizeof(*s->exp_buffer), alloc_fail);
01725 FF_ALLOC_OR_GOTO(avctx, s->grouped_exp_buffer, AC3_MAX_BLOCKS * s->channels *
01726 128 * sizeof(*s->grouped_exp_buffer), alloc_fail);
01727 FF_ALLOC_OR_GOTO(avctx, s->psd_buffer, AC3_MAX_BLOCKS * s->channels *
01728 AC3_MAX_COEFS * sizeof(*s->psd_buffer), alloc_fail);
01729 FF_ALLOC_OR_GOTO(avctx, s->band_psd_buffer, AC3_MAX_BLOCKS * s->channels *
01730 64 * sizeof(*s->band_psd_buffer), alloc_fail);
01731 FF_ALLOC_OR_GOTO(avctx, s->mask_buffer, AC3_MAX_BLOCKS * s->channels *
01732 64 * sizeof(*s->mask_buffer), alloc_fail);
01733 FF_ALLOC_OR_GOTO(avctx, s->qmant_buffer, AC3_MAX_BLOCKS * s->channels *
01734 AC3_MAX_COEFS * sizeof(*s->qmant_buffer), alloc_fail);
01735 for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) {
01736 AC3Block *block = &s->blocks[blk];
01737 FF_ALLOC_OR_GOTO(avctx, block->bap, s->channels * sizeof(*block->bap),
01738 alloc_fail);
01739 FF_ALLOCZ_OR_GOTO(avctx, block->mdct_coef, s->channels * sizeof(*block->mdct_coef),
01740 alloc_fail);
01741 FF_ALLOCZ_OR_GOTO(avctx, block->exp, s->channels * sizeof(*block->exp),
01742 alloc_fail);
01743 FF_ALLOCZ_OR_GOTO(avctx, block->grouped_exp, s->channels * sizeof(*block->grouped_exp),
01744 alloc_fail);
01745 FF_ALLOCZ_OR_GOTO(avctx, block->psd, s->channels * sizeof(*block->psd),
01746 alloc_fail);
01747 FF_ALLOCZ_OR_GOTO(avctx, block->band_psd, s->channels * sizeof(*block->band_psd),
01748 alloc_fail);
01749 FF_ALLOCZ_OR_GOTO(avctx, block->mask, s->channels * sizeof(*block->mask),
01750 alloc_fail);
01751 FF_ALLOCZ_OR_GOTO(avctx, block->qmant, s->channels * sizeof(*block->qmant),
01752 alloc_fail);
01753
01754 for (ch = 0; ch < s->channels; ch++) {
01755
01756 block->bap[ch] = &s->bap_buffer [AC3_MAX_COEFS * (blk * s->channels + ch)];
01757 block->mdct_coef[ch] = &s->mdct_coef_buffer [AC3_MAX_COEFS * (blk * s->channels + ch)];
01758 block->grouped_exp[ch] = &s->grouped_exp_buffer[128 * (blk * s->channels + ch)];
01759 block->psd[ch] = &s->psd_buffer [AC3_MAX_COEFS * (blk * s->channels + ch)];
01760 block->band_psd[ch] = &s->band_psd_buffer [64 * (blk * s->channels + ch)];
01761 block->mask[ch] = &s->mask_buffer [64 * (blk * s->channels + ch)];
01762 block->qmant[ch] = &s->qmant_buffer [AC3_MAX_COEFS * (blk * s->channels + ch)];
01763
01764
01765 block->exp[ch] = &s->exp_buffer [AC3_MAX_COEFS * (AC3_MAX_BLOCKS * ch + blk)];
01766 }
01767 }
01768
01769 if (CONFIG_AC3ENC_FLOAT) {
01770 FF_ALLOC_OR_GOTO(avctx, s->fixed_coef_buffer, AC3_MAX_BLOCKS * s->channels *
01771 AC3_MAX_COEFS * sizeof(*s->fixed_coef_buffer), alloc_fail);
01772 for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) {
01773 AC3Block *block = &s->blocks[blk];
01774 FF_ALLOCZ_OR_GOTO(avctx, block->fixed_coef, s->channels *
01775 sizeof(*block->fixed_coef), alloc_fail);
01776 for (ch = 0; ch < s->channels; ch++)
01777 block->fixed_coef[ch] = &s->fixed_coef_buffer[AC3_MAX_COEFS * (blk * s->channels + ch)];
01778 }
01779 } else {
01780 for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) {
01781 AC3Block *block = &s->blocks[blk];
01782 FF_ALLOCZ_OR_GOTO(avctx, block->fixed_coef, s->channels *
01783 sizeof(*block->fixed_coef), alloc_fail);
01784 for (ch = 0; ch < s->channels; ch++)
01785 block->fixed_coef[ch] = (int32_t *)block->mdct_coef[ch];
01786 }
01787 }
01788
01789 return 0;
01790 alloc_fail:
01791 return AVERROR(ENOMEM);
01792 }
01793
01794
01798 static av_cold int ac3_encode_init(AVCodecContext *avctx)
01799 {
01800 AC3EncodeContext *s = avctx->priv_data;
01801 int ret, frame_size_58;
01802
01803 avctx->frame_size = AC3_FRAME_SIZE;
01804
01805 ff_ac3_common_init();
01806
01807 ret = validate_options(avctx, s);
01808 if (ret)
01809 return ret;
01810
01811 s->bitstream_id = 8 + s->bit_alloc.sr_shift;
01812 s->bitstream_mode = 0;
01813
01814 s->frame_size_min = 2 * ff_ac3_frame_size_tab[s->frame_size_code][s->bit_alloc.sr_code];
01815 s->bits_written = 0;
01816 s->samples_written = 0;
01817 s->frame_size = s->frame_size_min;
01818
01819
01820 frame_size_58 = (( s->frame_size >> 2) + ( s->frame_size >> 4)) << 1;
01821 s->crc_inv[0] = pow_poly((CRC16_POLY >> 1), (8 * frame_size_58) - 16, CRC16_POLY);
01822 if (s->bit_alloc.sr_code == 1) {
01823 frame_size_58 = (((s->frame_size+2) >> 2) + ((s->frame_size+2) >> 4)) << 1;
01824 s->crc_inv[1] = pow_poly((CRC16_POLY >> 1), (8 * frame_size_58) - 16, CRC16_POLY);
01825 }
01826
01827 set_bandwidth(s);
01828
01829 rematrixing_init(s);
01830
01831 exponent_init(s);
01832
01833 bit_alloc_init(s);
01834
01835 ret = mdct_init(avctx, &s->mdct, 9);
01836 if (ret)
01837 goto init_fail;
01838
01839 ret = allocate_buffers(avctx);
01840 if (ret)
01841 goto init_fail;
01842
01843 avctx->coded_frame= avcodec_alloc_frame();
01844
01845 dsputil_init(&s->dsp, avctx);
01846 ff_ac3dsp_init(&s->ac3dsp, avctx->flags & CODEC_FLAG_BITEXACT);
01847
01848 return 0;
01849 init_fail:
01850 ac3_encode_close(avctx);
01851 return ret;
01852 }