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