Newer
Older
* The simplest AC-3 encoder
* Copyright (c) 2000 Fabrice Bellard
Diego Biurrun
committed
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
Diego Biurrun
committed
* version 2.1 of the License, or (at your option) any later version.
Diego Biurrun
committed
* FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
* You should have received a copy of the GNU Lesser General Public
Diego Biurrun
committed
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
* The simplest AC-3 encoder.
#include "libavcore/audioconvert.h"
#include "libavutil/crc.h"
#include "put_bits.h"
#include "audioconvert.h"
#define MDCT_NBITS 9
#define MDCT_SAMPLES (1 << MDCT_NBITS)
/** Maximum number of exponent groups. +1 for separate DC exponent. */
#define AC3_MAX_EXP_GROUPS 85
Justin Ruggles
committed
/** Scale a float value by 2^bits and convert to an integer. */
#define SCALE_FLOAT(a, bits) lrintf((a) * (float)(1 << (bits)))
Justin Ruggles
committed
/** Scale a float value by 2^15, convert to an integer, and clip to int16_t range. */
#define FIX15(a) av_clip_int16(SCALE_FLOAT(a, 15))
Justin Ruggles
committed
/**
* Compex number.
* Used in fixed-point MDCT calculation.
*/
typedef struct IComplex {
int16_t re,im;
} IComplex;
Justin Ruggles
committed
/**
* AC-3 encoder private context.
*/
typedef struct AC3EncodeContext {
PutBitContext pb; ///< bitstream writer context
int bitstream_id; ///< bitstream id (bsid)
int bitstream_mode; ///< bitstream mode (bsmod)
int bit_rate; ///< target bit rate, in bits-per-second
int sample_rate; ///< sampling frequency, in Hz
int frame_size_min; ///< minimum frame size in case rounding is necessary
int frame_size; ///< current frame size in bytes
int frame_size_code; ///< frame size code (frmsizecod)
int bits_written; ///< bit count (used to avg. bitrate)
int samples_written; ///< sample count (used to avg. bitrate)
int fbw_channels; ///< number of full-bandwidth channels (nfchans)
int channels; ///< total number of channels (nchans)
int lfe_on; ///< indicates if there is an LFE channel (lfeon)
int lfe_channel; ///< channel index of the LFE channel
int channel_mode; ///< channel mode (acmod)
const uint8_t *channel_map; ///< channel map used to reorder channels
int bandwidth_code[AC3_MAX_CHANNELS]; ///< bandwidth code (0 to 60) (chbwcod)
int nb_coefs[AC3_MAX_CHANNELS];
/* bitrate allocation control */
int slow_gain_code; ///< slow gain code (sgaincod)
int slow_decay_code; ///< slow decay code (sdcycod)
int fast_decay_code; ///< fast decay code (fdcycod)
int db_per_bit_code; ///< dB/bit code (dbpbcod)
int floor_code; ///< floor code (floorcod)
AC3BitAllocParameters bit_alloc; ///< bit allocation parameters
int coarse_snr_offset; ///< coarse SNR offsets (csnroffst)
int fast_gain_code[AC3_MAX_CHANNELS]; ///< fast gain codes (signal-to-mask ratio) (fgaincod)
int fine_snr_offset[AC3_MAX_CHANNELS]; ///< fine SNR offsets (fsnroffst)
int frame_bits; ///< all frame bits except exponents and mantissas
int exponent_bits; ///< number of bits used for exponents
int mant1_cnt, mant2_cnt, mant4_cnt; ///< mantissa counts for bap=1,2,4
uint16_t *qmant1_ptr, *qmant2_ptr, *qmant4_ptr; ///< mantissa pointers for bap=1,2,4
int16_t last_samples[AC3_MAX_CHANNELS][AC3_BLOCK_SIZE]; ///< last 256 samples from previous frame
Justin Ruggles
committed
/** MDCT and FFT tables */
static int16_t costab[64];
static int16_t sintab[64];
static int16_t xcos1[128];
static int16_t xsin1[128];
/**
* Adjust the frame size to make the average bit rate match the target bit rate.
* This is only needed for 11025, 22050, and 44100 sample rates.
*/
static void adjust_frame_size(AC3EncodeContext *s)
{
while (s->bits_written >= s->bit_rate && s->samples_written >= s->sample_rate) {
s->bits_written -= s->bit_rate;
s->samples_written -= s->sample_rate;
}
s->frame_size = s->frame_size_min + 2 * (s->bits_written * s->sample_rate < s->samples_written * s->bit_rate);
s->bits_written += s->frame_size * 8;
s->samples_written += AC3_FRAME_SIZE;
}
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
/**
* Deinterleave input samples.
* Channels are reordered from FFmpeg's default order to AC-3 order.
*/
static void deinterleave_input_samples(AC3EncodeContext *s,
const int16_t *samples,
int16_t planar_samples[AC3_MAX_CHANNELS][AC3_BLOCK_SIZE+AC3_FRAME_SIZE])
{
int ch, i;
/* deinterleave and remap input samples */
for (ch = 0; ch < s->channels; ch++) {
const int16_t *sptr;
int sinc;
/* copy last 256 samples of previous frame to the start of the current frame */
memcpy(&planar_samples[ch][0], s->last_samples[ch],
AC3_BLOCK_SIZE * sizeof(planar_samples[0][0]));
/* deinterleave */
sinc = s->channels;
sptr = samples + s->channel_map[ch];
for (i = AC3_BLOCK_SIZE; i < AC3_FRAME_SIZE+AC3_BLOCK_SIZE; i++) {
planar_samples[ch][i] = *sptr;
sptr += sinc;
}
/* save last 256 samples for next frame */
memcpy(s->last_samples[ch], &planar_samples[ch][6* AC3_BLOCK_SIZE],
AC3_BLOCK_SIZE * sizeof(planar_samples[0][0]));
}
}
Justin Ruggles
committed
/**
* Initialize FFT tables.
* @param ln log2(FFT size)
*/
static av_cold void fft_init(int ln)
for (i = 0; i < n2; i++) {
alpha = 2.0 * M_PI * i / n;
costab[i] = FIX15(cos(alpha));
sintab[i] = FIX15(sin(alpha));
Justin Ruggles
committed
/**
* Initialize MDCT tables.
* @param nbits log2(MDCT size)
*/
static av_cold void mdct_init(int nbits)
{
int i, n, n4;
n = 1 << nbits;
n4 = n >> 2;
fft_init(nbits - 2);
for (i = 0; i < n4; i++) {
float alpha = 2.0 * M_PI * (i + 1.0 / 8.0) / n;
xcos1[i] = FIX15(-cos(alpha));
xsin1[i] = FIX15(-sin(alpha));
}
}
Justin Ruggles
committed
/** Butterfly op */
#define BF(pre, pim, qre, qim, pre1, pim1, qre1, qim1) \
{ \
int ax, ay, bx, by; \
bx = pre1; \
by = pim1; \
ax = qre1; \
ay = qim1; \
pre = (bx + ax) >> 1; \
pim = (by + ay) >> 1; \
qre = (bx - ax) >> 1; \
qim = (by - ay) >> 1; \
Justin Ruggles
committed
/** Complex multiply */
#define CMUL(pre, pim, are, aim, bre, bim) \
{ \
pre = (MUL16(are, bre) - MUL16(aim, bim)) >> 15; \
pim = (MUL16(are, bim) + MUL16(bre, aim)) >> 15; \
Justin Ruggles
committed
/**
* Calculate a 2^n point complex FFT on 2^ln points.
* @param z complex input/output samples
* @param ln log2(FFT size)
*/
int j, l, np, np2;
int nblocks, nloops;
register IComplex *p,*q;
int tmp_re, tmp_im;
np = 1 << ln;
/* reverse */
for (j = 0; j < np; j++) {
int k = av_reverse[j] >> (8 - ln);
if (k < j)
FFSWAP(IComplex, z[k], z[j]);
p = &z[0];
j = np >> 1;
BF(p[0].re, p[0].im, p[1].re, p[1].im,
p += 2;
} while (--j);
p = &z[0];
j = np >> 2;
BF(p[0].re, p[0].im, p[2].re, p[2].im,
p[0].re, p[0].im, p[2].re, p[2].im);
BF(p[1].re, p[1].im, p[3].re, p[3].im,
nloops = 1 << 2;
np2 = np >> 1;
for (j = 0; j < nblocks; j++) {
BF(p->re, p->im, q->re, q->im,
p->re, p->im, q->re, q->im);
p++;
q++;
for(l = nblocks; l < np2; l += nblocks) {
CMUL(tmp_re, tmp_im, costab[l], -sintab[l], q->re, q->im);
BF(p->re, p->im, q->re, q->im,
p->re, p->im, tmp_re, tmp_im);
p++;
q++;
}
p += nloops;
q += nloops;
}
nblocks = nblocks >> 1;
nloops = nloops << 1;
} while (nblocks);
Justin Ruggles
committed
/**
* Calculate a 512-point MDCT
* @param out 256 output frequency coefficients
* @param in 512 windowed input audio samples
*/
static void mdct512(int32_t *out, int16_t *in)
int16_t rot[MDCT_SAMPLES];
IComplex x[MDCT_SAMPLES/4];
for (i = 0; i < MDCT_SAMPLES/4; i++)
rot[i] = -in[i + 3*MDCT_SAMPLES/4];
for (;i < MDCT_SAMPLES; i++)
rot[i] = in[i - MDCT_SAMPLES/4];
for (i = 0; i < MDCT_SAMPLES/4; i++) {
re = ((int)rot[ 2*i] - (int)rot[MDCT_SAMPLES -1-2*i]) >> 1;
im = -((int)rot[MDCT_SAMPLES/2+2*i] - (int)rot[MDCT_SAMPLES/2-1-2*i]) >> 1;
CMUL(x[i].re, x[i].im, re, im, -xcos1[i], xsin1[i]);
}
fft(x, MDCT_NBITS - 2);
for (i = 0; i < MDCT_SAMPLES/4; i++) {
re = x[i].re;
im = x[i].im;
CMUL(re1, im1, re, im, xsin1[i], xcos1[i]);
out[MDCT_SAMPLES/2-1-2*i] = re1;
/**
* Apply KBD window to input samples prior to MDCT.
*/
static void apply_window(int16_t *output, const int16_t *input,
const int16_t *window, int n)
{
int i;
int n2 = n >> 1;
for (i = 0; i < n2; i++) {
output[i] = MUL16(input[i], window[i]) >> 15;
output[n-i-1] = MUL16(input[n-i-1], window[i]) >> 15;
}
}
Justin Ruggles
committed
/**
* Calculate the log2() of the maximum absolute value in an array.
* @param tab input array
* @param n number of values in the array
* @return log2(max(abs(tab[])))
*/
static int log2_tab(int16_t *tab, int n)
{
int i, v;
v = 0;
for (i = 0; i < n; i++)
v |= abs(tab[i]);
return av_log2(v);
}
Justin Ruggles
committed
/**
* Left-shift each value in an array by a specified amount.
* @param tab input array
* @param n number of values in the array
* @param lshift left shift amount. a negative value means right shift.
*/
static void lshift_tab(int16_t *tab, int n, int lshift)
{
int i;
if (lshift > 0) {
for(i = 0; i < n; i++)
tab[i] <<= lshift;
} else if (lshift < 0) {
lshift = -lshift;
for (i = 0; i < n; i++)
tab[i] >>= lshift;
}
}
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
/**
* Normalize the input samples to use the maximum available precision.
* This assumes signed 16-bit input samples. Exponents are reduced by 9 to
* match the 24-bit internal precision for MDCT coefficients.
*
* @return exponent shift
*/
static int normalize_samples(AC3EncodeContext *s,
int16_t windowed_samples[AC3_WINDOW_SIZE])
{
int v = 14 - log2_tab(windowed_samples, AC3_WINDOW_SIZE);
v = FFMAX(0, v);
lshift_tab(windowed_samples, AC3_WINDOW_SIZE, v);
return v - 9;
}
/**
* Apply the MDCT to input samples to generate frequency coefficients.
* This applies the KBD window and normalizes the input to reduce precision
* loss due to fixed-point calculations.
*/
static void apply_mdct(AC3EncodeContext *s,
int16_t planar_samples[AC3_MAX_CHANNELS][AC3_BLOCK_SIZE+AC3_FRAME_SIZE],
int8_t exp_shift[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS],
int32_t mdct_coef[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][AC3_MAX_COEFS])
{
int blk, ch;
int16_t windowed_samples[AC3_WINDOW_SIZE];
for (ch = 0; ch < s->channels; ch++) {
for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) {
const int16_t *input_samples = &planar_samples[ch][blk * AC3_BLOCK_SIZE];
apply_window(windowed_samples, input_samples, ff_ac3_window, AC3_WINDOW_SIZE);
exp_shift[blk][ch] = normalize_samples(s, windowed_samples);
mdct512(mdct_coef[blk][ch], windowed_samples);
}
}
}
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
/**
* Extract exponents from the MDCT coefficients.
* This takes into account the normalization that was done to the input samples
* by adjusting the exponents by the exponent shift values.
*/
static void extract_exponents(AC3EncodeContext *s,
int32_t mdct_coef[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][AC3_MAX_COEFS],
int8_t exp_shift[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS],
uint8_t exp[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][AC3_MAX_COEFS])
{
int blk, ch, i;
/* extract exponents */
for (ch = 0; ch < s->channels; ch++) {
for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) {
/* compute "exponents". We take into account the normalization there */
for (i = 0; i < AC3_MAX_COEFS; i++) {
int e;
int v = abs(mdct_coef[blk][ch][i]);
if (v == 0)
e = 24;
else {
e = 23 - av_log2(v) + exp_shift[blk][ch];
if (e >= 24) {
e = 24;
mdct_coef[blk][ch][i] = 0;
}
}
exp[blk][ch][i] = e;
}
}
}
}
Justin Ruggles
committed
/**
* Calculate the sum of absolute differences (SAD) between 2 sets of exponents.
*/
static int calc_exp_diff(uint8_t *exp1, uint8_t *exp2, int n)
sum += abs(exp1[i] - exp2[i]);
return sum;
}
Justin Ruggles
committed
/**
* Exponent Difference Threshold.
* New exponents are sent if their SAD exceed this number.
*/
#define EXP_DIFF_THRESHOLD 1000
Justin Ruggles
committed
/**
* Calculate exponent strategies for all blocks in a single channel.
*/
static void compute_exp_strategy_ch(uint8_t *exp_strategy, uint8_t **exp)
int blk, blk1;
/* estimate if the exponent variation & decide if they should be
reused in the next frame */
exp_strategy[0] = EXP_NEW;
for (blk = 1; blk < AC3_MAX_BLOCKS; blk++) {
exp_diff = calc_exp_diff(exp[blk], exp[blk-1], AC3_MAX_COEFS);
exp_strategy[blk] = EXP_NEW;
exp_strategy[blk] = EXP_REUSE;
/* now select the encoding strategy type : if exponents are often
recoded, we use a coarse encoding */
blk = 0;
while (blk < AC3_MAX_BLOCKS) {
blk1 = blk + 1;
while (blk1 < AC3_MAX_BLOCKS && exp_strategy[blk1] == EXP_REUSE)
blk1++;
switch (blk1 - blk) {
case 1: exp_strategy[blk] = EXP_D45; break;
case 3: exp_strategy[blk] = EXP_D25; break;
default: exp_strategy[blk] = EXP_D15; break;
blk = blk1;
/**
* Calculate exponent strategies for all channels.
* Array arrangement is reversed to simplify the per-channel calculation.
*/
static void compute_exp_strategy(AC3EncodeContext *s,
uint8_t exp_strategy[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS],
uint8_t exp[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][AC3_MAX_COEFS])
{
uint8_t *exp1[AC3_MAX_CHANNELS][AC3_MAX_BLOCKS];
uint8_t exp_str1[AC3_MAX_CHANNELS][AC3_MAX_BLOCKS];
int ch, blk;
for (ch = 0; ch < s->fbw_channels; ch++) {
for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) {
exp1[ch][blk] = exp[blk][ch];
exp_str1[ch][blk] = exp_strategy[blk][ch];
}
compute_exp_strategy_ch(exp_str1[ch], exp1[ch]);
for (blk = 0; blk < AC3_MAX_BLOCKS; blk++)
exp_strategy[blk][ch] = exp_str1[ch][blk];
}
if (s->lfe_on) {
ch = s->lfe_channel;
exp_strategy[0][ch] = EXP_D15;
for (blk = 1; blk < 5; blk++)
exp_strategy[blk][ch] = EXP_REUSE;
Justin Ruggles
committed
/**
* Set each encoded exponent in a block to the minimum of itself and the
* exponent in the same frequency bin of a following block.
* exp[i] = min(exp[i], exp1[i]
*/
static void exponent_min(uint8_t exp[AC3_MAX_COEFS], uint8_t exp1[AC3_MAX_COEFS], int n)
for (i = 0; i < n; i++) {
if (exp1[i] < exp[i])
exp[i] = exp1[i];
}
}
Justin Ruggles
committed
/**
* Update the exponents so that they are the ones the decoder will decode.
*/
static void encode_exponents_blk_ch(uint8_t encoded_exp[AC3_MAX_COEFS],
uint8_t exp[AC3_MAX_COEFS],
int nb_exps, int exp_strategy,
uint8_t *num_exp_groups)
Jeff Muizelaar
committed
int group_size, nb_groups, i, j, k, exp_min;
uint8_t exp1[AC3_MAX_COEFS];
group_size = exp_strategy + (exp_strategy == EXP_D45);
*num_exp_groups = (nb_exps + (group_size * 3) - 4) / (3 * group_size);
nb_groups = *num_exp_groups * 3;
/* for each group, compute the minimum exponent */
exp1[0] = exp[0]; /* DC exponent is handled separately */
k = 1;
for (i = 1; i <= nb_groups; i++) {
exp_min = exp[k];
assert(exp_min >= 0 && exp_min <= 24);
for (j = 1; j < group_size; j++) {
if (exp[k+j] < exp_min)
exp_min = exp[k+j];
}
exp1[i] = exp_min;
k += group_size;
}
/* constraint for DC exponent */
if (exp1[0] > 15)
exp1[0] = 15;
/* decrease the delta between each groups to within 2 so that they can be
differentially encoded */
for (i = 1; i <= nb_groups; i++)
exp1[i] = FFMIN(exp1[i], exp1[i-1] + 2);
for (i = nb_groups-1; i >= 0; i--)
exp1[i] = FFMIN(exp1[i], exp1[i+1] + 2);
Jeff Muizelaar
committed
/* now we have the exponent values the decoder will see */
encoded_exp[0] = exp1[0];
k = 1;
for (i = 1; i <= nb_groups; i++) {
for (j = 0; j < group_size; j++)
encoded_exp[k+j] = exp1[i];
k += group_size;
}
}
/**
* Encode exponents from original extracted form to what the decoder will see.
* This copies and groups exponents based on exponent strategy and reduces
* deltas between adjacent exponent groups so that they can be differentially
* encoded.
*/
static void encode_exponents(AC3EncodeContext *s,
uint8_t exp[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][AC3_MAX_COEFS],
uint8_t exp_strategy[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS],
uint8_t num_exp_groups[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS],
uint8_t encoded_exp[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][AC3_MAX_COEFS])
{
int blk, blk1, blk2, ch;
for (ch = 0; ch < s->channels; ch++) {
/* for the EXP_REUSE case we select the min of the exponents */
blk = 0;
while (blk < AC3_MAX_BLOCKS) {
blk1 = blk + 1;
while (blk1 < AC3_MAX_BLOCKS && exp_strategy[blk1][ch] == EXP_REUSE) {
exponent_min(exp[blk][ch], exp[blk1][ch], s->nb_coefs[ch]);
blk1++;
}
encode_exponents_blk_ch(encoded_exp[blk][ch],
exp[blk][ch], s->nb_coefs[ch],
exp_strategy[blk][ch],
&num_exp_groups[blk][ch]);
/* copy encoded exponents for reuse case */
for (blk2 = blk+1; blk2 < blk1; blk2++) {
memcpy(encoded_exp[blk2][ch], encoded_exp[blk][ch],
s->nb_coefs[ch] * sizeof(uint8_t));
}
blk = blk1;
}
}
}
/**
* Group exponents.
* 3 delta-encoded exponents are in each 7-bit group. The number of groups
* varies depending on exponent strategy and bandwidth.
*/
static void group_exponents(AC3EncodeContext *s,
uint8_t encoded_exp[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][AC3_MAX_COEFS],
uint8_t exp_strategy[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS],
uint8_t num_exp_groups[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS],
uint8_t grouped_exp[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][AC3_MAX_EXP_GROUPS])
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
{
int blk, ch, i;
int group_size, bit_count;
uint8_t *p;
int delta0, delta1, delta2;
int exp0, exp1;
bit_count = 0;
for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) {
for (ch = 0; ch < s->channels; ch++) {
if (exp_strategy[blk][ch] == EXP_REUSE) {
num_exp_groups[blk][ch] = 0;
continue;
}
group_size = exp_strategy[blk][ch] + (exp_strategy[blk][ch] == EXP_D45);
bit_count += 4 + (num_exp_groups[blk][ch] * 7);
p = encoded_exp[blk][ch];
/* DC exponent */
exp1 = *p++;
grouped_exp[blk][ch][0] = exp1;
/* remaining exponents are delta encoded */
for (i = 1; i <= num_exp_groups[blk][ch]; i++) {
/* merge three delta in one code */
exp0 = exp1;
exp1 = p[0];
p += group_size;
delta0 = exp1 - exp0 + 2;
exp0 = exp1;
exp1 = p[0];
p += group_size;
delta1 = exp1 - exp0 + 2;
exp0 = exp1;
exp1 = p[0];
p += group_size;
delta2 = exp1 - exp0 + 2;
grouped_exp[blk][ch][i] = ((delta0 * 5 + delta1) * 5) + delta2;
}
}
}
}
/**
* Calculate final exponents from the supplied MDCT coefficients and exponent shift.
* Extract exponents from MDCT coefficients, calculate exponent strategies,
* and encode final exponents.
*/
static void process_exponents(AC3EncodeContext *s,
int32_t mdct_coef[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][AC3_MAX_COEFS],
int8_t exp_shift[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS],
uint8_t exp[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][AC3_MAX_COEFS],
uint8_t exp_strategy[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS],
uint8_t encoded_exp[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][AC3_MAX_COEFS],
uint8_t num_exp_groups[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS],
uint8_t grouped_exp[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][AC3_MAX_EXP_GROUPS])
{
extract_exponents(s, mdct_coef, exp_shift, exp);
compute_exp_strategy(s, exp_strategy, exp);
encode_exponents(s, exp, exp_strategy, num_exp_groups, encoded_exp);
group_exponents(s, encoded_exp, exp_strategy, num_exp_groups, grouped_exp);
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
/**
* Initialize bit allocation.
* Set default parameter codes and calculate parameter values.
*/
static void bit_alloc_init(AC3EncodeContext *s)
{
int ch;
/* init default parameters */
s->slow_decay_code = 2;
s->fast_decay_code = 1;
s->slow_gain_code = 1;
s->db_per_bit_code = 2;
s->floor_code = 4;
for (ch = 0; ch < s->channels; ch++)
s->fast_gain_code[ch] = 4;
/* initial snr offset */
s->coarse_snr_offset = 40;
/* compute real values */
/* currently none of these values change during encoding, so we can just
set them once at initialization */
s->bit_alloc.slow_decay = ff_ac3_slow_decay_tab[s->slow_decay_code] >> s->bit_alloc.sr_shift;
s->bit_alloc.fast_decay = ff_ac3_fast_decay_tab[s->fast_decay_code] >> s->bit_alloc.sr_shift;
s->bit_alloc.slow_gain = ff_ac3_slow_gain_tab[s->slow_gain_code];
s->bit_alloc.db_per_bit = ff_ac3_db_per_bit_tab[s->db_per_bit_code];
s->bit_alloc.floor = ff_ac3_floor_tab[s->floor_code];
}
/**
* Count the bits used to encode the frame, minus exponents and mantissas.
*/
static void count_frame_bits(AC3EncodeContext *s,
uint8_t exp_strategy[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS])
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
{
static const int frame_bits_inc[8] = { 0, 0, 2, 2, 2, 4, 2, 4 };
int blk, ch;
int frame_bits;
/* header size */
frame_bits = 65;
frame_bits += frame_bits_inc[s->channel_mode];
/* audio blocks */
for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) {
frame_bits += s->fbw_channels * 2 + 2; /* blksw * c, dithflag * c, dynrnge, cplstre */
if (s->channel_mode == AC3_CHMODE_STEREO) {
frame_bits++; /* rematstr */
if (!blk)
frame_bits += 4;
}
frame_bits += 2 * s->fbw_channels; /* chexpstr[2] * c */
if (s->lfe_on)
frame_bits++; /* lfeexpstr */
for (ch = 0; ch < s->fbw_channels; ch++) {
if (exp_strategy[blk][ch] != EXP_REUSE)
frame_bits += 6 + 2; /* chbwcod[6], gainrng[2] */
}
frame_bits++; /* baie */
frame_bits++; /* snr */
frame_bits += 2; /* delta / skip */
}
frame_bits++; /* cplinu for block 0 */
/* bit alloc info */
/* sdcycod[2], fdcycod[2], sgaincod[2], dbpbcod[2], floorcod[3] */
/* csnroffset[6] */
/* (fsnoffset[4] + fgaincod[4]) * c */
frame_bits += 2*4 + 3 + 6 + s->channels * (4 + 3);
/* auxdatae, crcrsv */
frame_bits += 2;
/* CRC */
frame_bits += 16;
Justin Ruggles
committed
/**
* Calculate the number of bits needed to encode a set of mantissas.
*/
static int compute_mantissa_size(AC3EncodeContext *s, uint8_t *m, int nb_coefs)
for (i = 0; i < nb_coefs; i++) {
case 0:
/* nothing */
break;
case 1:
/* 3 mantissa in 5 bits */
bits += 5;
if (++s->mant1_cnt == 3)
s->mant1_cnt = 0;
break;
case 2:
/* 3 mantissa in 7 bits */
bits += 7;
if (++s->mant2_cnt == 3)
s->mant2_cnt = 0;
break;
case 3:
bits += 3;
break;
case 4:
/* 2 mantissa in 7 bits */
if (s->mant4_cnt == 0)
bits += 7;
s->mant4_cnt = 0;
break;
case 14:
bits += 14;
break;
case 15:
bits += 16;
break;
default:
bits += mant - 1;
break;
}
}
return bits;
}
Justin Ruggles
committed
/**
* Calculate masking curve based on the final exponents.
* Also calculate the power spectral densities to use in future calculations.
*/
static void bit_alloc_masking(AC3EncodeContext *s,
uint8_t encoded_exp[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][AC3_MAX_COEFS],
uint8_t exp_strategy[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS],
int16_t psd[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][AC3_MAX_COEFS],
int16_t mask[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][AC3_CRITICAL_BANDS])
{
int blk, ch;
int16_t band_psd[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][AC3_CRITICAL_BANDS];
for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) {
for (ch = 0; ch < s->channels; ch++) {
if(exp_strategy[blk][ch] == EXP_REUSE) {
memcpy(psd[blk][ch], psd[blk-1][ch], AC3_MAX_COEFS*sizeof(psd[0][0][0]));
memcpy(mask[blk][ch], mask[blk-1][ch], AC3_CRITICAL_BANDS*sizeof(mask[0][0][0]));
} else {
ff_ac3_bit_alloc_calc_psd(encoded_exp[blk][ch], 0,
s->nb_coefs[ch],
psd[blk][ch], band_psd[blk][ch]);
ff_ac3_bit_alloc_calc_mask(&s->bit_alloc, band_psd[blk][ch],
0, s->nb_coefs[ch],
ff_ac3_fast_gain_tab[s->fast_gain_code[ch]],
ch == s->lfe_channel,
DBA_NONE, 0, NULL, NULL, NULL,
mask[blk][ch]);
}
}
}
}
Justin Ruggles
committed
/**
* Run the bit allocation with a given SNR offset.
* This calculates the bit allocation pointers that will be used to determine
* the quantization of each mantissa.
* @return the number of bits needed for mantissas if the given SNR offset is
* is used.
Justin Ruggles
committed
*/
int16_t mask[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][AC3_CRITICAL_BANDS],
int16_t psd[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][AC3_MAX_COEFS],
uint8_t bap[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][AC3_MAX_COEFS],
int snr_offset)
int blk, ch;
int mantissa_bits;
snr_offset = (snr_offset - 240) << 2;
mantissa_bits = 0;
for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) {
s->mant1_cnt = 0;
s->mant2_cnt = 0;
s->mant4_cnt = 0;
for (ch = 0; ch < s->channels; ch++) {
ff_ac3_bit_alloc_calc_bap(mask[blk][ch], psd[blk][ch], 0,
s->nb_coefs[ch], snr_offset,
s->bit_alloc.floor, ff_ac3_bap_tab,
bap[blk][ch]);
mantissa_bits += compute_mantissa_size(s, bap[blk][ch], s->nb_coefs[ch]);
return mantissa_bits;
Justin Ruggles
committed
/**
* Perform bit allocation search.
* Finds the SNR offset value that maximizes quality and fits in the specified
* frame size. Output is the SNR offset and a set of bit allocation pointers
* used to quantize the mantissas.
*/
static int compute_bit_allocation(AC3EncodeContext *s,
uint8_t bap[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][AC3_MAX_COEFS],
uint8_t encoded_exp[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][AC3_MAX_COEFS],
uint8_t exp_strategy[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS])
int snr_offset;
uint8_t bap1[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][AC3_MAX_COEFS];
int16_t psd[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][AC3_MAX_COEFS];
int16_t mask[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][AC3_CRITICAL_BANDS];
/* count frame bits other than exponents and mantissas */
count_frame_bits(s, exp_strategy);
/* calculate psd and masking curve before doing bit allocation */
bit_alloc_masking(s, encoded_exp, exp_strategy, psd, mask);
/* now the big work begins : do the bit allocation. Modify the snr
offset until we can pack everything in the requested frame size */
bits_left = 8 * s->frame_size - (s->frame_bits + s->exponent_bits);
snr_offset = s->coarse_snr_offset << 4;
while (snr_offset >= 0 &&
bit_alloc(s, mask, psd, bap, snr_offset) > bits_left) {
snr_offset -= 64;
if (snr_offset < 0) {
return AVERROR(EINVAL);
while (snr_offset + 64 <= 1023 &&
bit_alloc(s, mask, psd, bap1, snr_offset + 64) <= bits_left) {
snr_offset += 64;
while (snr_offset + 16 <= 1023 &&
bit_alloc(s, mask, psd, bap1, snr_offset + 16) <= bits_left) {
snr_offset += 16;
while (snr_offset + 4 <= 1023 &&
bit_alloc(s, mask, psd, bap1, snr_offset + 4) <= bits_left) {