📄 ac3enc.c
字号:
case EXP_REUSE:
continue;
case EXP_D15:
group_size = 1;
break;
case EXP_D25:
group_size = 2;
break;
default:
case EXP_D45:
group_size = 4;
break;
}
nb_groups = (s->nb_coefs[ch] + (group_size * 3) - 4) / (3 * group_size);
p = encoded_exp[ch];
/* first exponent */
exp1 = *p++;
put_bits(&s->pb, 4, exp1);
/* next ones are delta encoded */
for(i=0;i<nb_groups;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;
put_bits(&s->pb, 7, ((delta0 * 5 + delta1) * 5) + delta2);
}
if (ch != s->lfe_channel)
put_bits(&s->pb, 2, 0); /* no gain range info */
}
/* bit allocation info */
baie = (block_num == 0);
put_bits(&s->pb, 1, baie);
if (baie) {
put_bits(&s->pb, 2, s->sdecaycod);
put_bits(&s->pb, 2, s->fdecaycod);
put_bits(&s->pb, 2, s->sgaincod);
put_bits(&s->pb, 2, s->dbkneecod);
put_bits(&s->pb, 3, s->floorcod);
}
/* snr offset */
put_bits(&s->pb, 1, baie); /* always present with bai */
if (baie) {
put_bits(&s->pb, 6, s->csnroffst);
for(ch=0;ch<s->nb_all_channels;ch++) {
put_bits(&s->pb, 4, s->fsnroffst[ch]);
put_bits(&s->pb, 3, s->fgaincod[ch]);
}
}
put_bits(&s->pb, 1, 0); /* no delta bit allocation */
put_bits(&s->pb, 1, 0); /* no data to skip */
/* mantissa encoding : we use two passes to handle the grouping. A
one pass method may be faster, but it would necessitate to
modify the output stream. */
/* first pass: quantize */
mant1_cnt = mant2_cnt = mant4_cnt = 0;
qmant1_ptr = qmant2_ptr = qmant4_ptr = NULL;
for (ch = 0; ch < s->nb_all_channels; ch++) {
int b, c, e, v;
for(i=0;i<s->nb_coefs[ch];i++) {
c = mdct_coefs[ch][i];
e = encoded_exp[ch][i] - global_exp[ch];
b = bap[ch][i];
switch(b) {
case 0:
v = 0;
break;
case 1:
v = sym_quant(c, e, 3);
switch(mant1_cnt) {
case 0:
qmant1_ptr = &qmant[ch][i];
v = 9 * v;
mant1_cnt = 1;
break;
case 1:
*qmant1_ptr += 3 * v;
mant1_cnt = 2;
v = 128;
break;
default:
*qmant1_ptr += v;
mant1_cnt = 0;
v = 128;
break;
}
break;
case 2:
v = sym_quant(c, e, 5);
switch(mant2_cnt) {
case 0:
qmant2_ptr = &qmant[ch][i];
v = 25 * v;
mant2_cnt = 1;
break;
case 1:
*qmant2_ptr += 5 * v;
mant2_cnt = 2;
v = 128;
break;
default:
*qmant2_ptr += v;
mant2_cnt = 0;
v = 128;
break;
}
break;
case 3:
v = sym_quant(c, e, 7);
break;
case 4:
v = sym_quant(c, e, 11);
switch(mant4_cnt) {
case 0:
qmant4_ptr = &qmant[ch][i];
v = 11 * v;
mant4_cnt = 1;
break;
default:
*qmant4_ptr += v;
mant4_cnt = 0;
v = 128;
break;
}
break;
case 5:
v = sym_quant(c, e, 15);
break;
case 14:
v = asym_quant(c, e, 14);
break;
case 15:
v = asym_quant(c, e, 16);
break;
default:
v = asym_quant(c, e, b - 1);
break;
}
qmant[ch][i] = v;
}
}
/* second pass : output the values */
for (ch = 0; ch < s->nb_all_channels; ch++) {
int b, q;
for(i=0;i<s->nb_coefs[ch];i++) {
q = qmant[ch][i];
b = bap[ch][i];
switch(b) {
case 0:
break;
case 1:
if (q != 128)
put_bits(&s->pb, 5, q);
break;
case 2:
if (q != 128)
put_bits(&s->pb, 7, q);
break;
case 3:
put_bits(&s->pb, 3, q);
break;
case 4:
if (q != 128)
put_bits(&s->pb, 7, q);
break;
case 14:
put_bits(&s->pb, 14, q);
break;
case 15:
put_bits(&s->pb, 16, q);
break;
default:
put_bits(&s->pb, b - 1, q);
break;
}
}
}
}
#define CRC16_POLY ((1 << 0) | (1 << 2) | (1 << 15) | (1 << 16))
static unsigned int mul_poly(unsigned int a, unsigned int b, unsigned int poly)
{
unsigned int c;
c = 0;
while (a) {
if (a & 1)
c ^= b;
a = a >> 1;
b = b << 1;
if (b & (1 << 16))
b ^= poly;
}
return c;
}
static unsigned int pow_poly(unsigned int a, unsigned int n, unsigned int poly)
{
unsigned int r;
r = 1;
while (n) {
if (n & 1)
r = mul_poly(r, a, poly);
a = mul_poly(a, a, poly);
n >>= 1;
}
return r;
}
/* compute 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);
}
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;
}
}
}
/* fill the end of the frame and compute the two crcs */
static int output_frame_end(AC3EncodeContext *s)
{
int frame_size, frame_size_58, n, crc1, crc2, crc_inv;
uint8_t *frame;
frame_size = s->frame_size; /* frame size in words */
/* align to 8 bits */
flush_put_bits(&s->pb);
/* add zero bytes to reach the frame size */
frame = s->pb.buf;
n = 2 * s->frame_size - (pbBufPtr(&s->pb) - frame) - 2;
//assert(n >= 0);
if(n>0)
memset(pbBufPtr(&s->pb), 0, n);
/* Now we must compute both crcs : this is not so easy for crc1
because it is at the beginning of the data... */
frame_size_58 = (frame_size >> 1) + (frame_size >> 3);
crc1 = bswap_16(av_crc(av_crc8005, 0, frame + 4, 2 * frame_size_58 - 4));
/* XXX: could precompute crc_inv */
crc_inv = pow_poly((CRC16_POLY >> 1), (16 * frame_size_58) - 16, CRC16_POLY);
crc1 = mul_poly(crc_inv, crc1, CRC16_POLY);
AV_WB16(frame+2,crc1);
crc2 = bswap_16(av_crc(av_crc8005, 0, frame + 2 * frame_size_58, (frame_size - frame_size_58) * 2 - 2));
AV_WB16(frame+2*frame_size-2,crc2);
// printf("n=%d frame_size=%d\n", n, frame_size);
return frame_size * 2;
}
static int AC3_encode_frame(AVCodecContext *avctx,
unsigned char *frame, int buf_size, void *data)
{
AC3EncodeContext *s = avctx->priv_data;
int16_t *samples = data;
int i, j, k, v, ch;
int16_t input_samples[N];
int32_t mdct_coef[NB_BLOCKS][AC3_MAX_CHANNELS][N/2];
uint8_t exp[NB_BLOCKS][AC3_MAX_CHANNELS][N/2];
uint8_t exp_strategy[NB_BLOCKS][AC3_MAX_CHANNELS];
uint8_t encoded_exp[NB_BLOCKS][AC3_MAX_CHANNELS][N/2];
uint8_t bap[NB_BLOCKS][AC3_MAX_CHANNELS][N/2];
int8_t exp_samples[NB_BLOCKS][AC3_MAX_CHANNELS];
int frame_bits;
frame_bits = 0;
for(ch=0;ch<s->nb_all_channels;ch++) {
/* fixed mdct to the six sub blocks & exponent computation */
for(i=0;i<NB_BLOCKS;i++) {
int16_t *sptr;
int sinc;
/* compute input samples */
memcpy(input_samples, s->last_samples[ch], N/2 * sizeof(int16_t));
sinc = s->nb_all_channels;
sptr = samples + (sinc * (N/2) * i) + avctx->ac3channels[ch]; /* intentional diff from ffmpeg */
for(j=0;j<N/2;j++) {
v = *sptr;
input_samples[j + N/2] = v;
s->last_samples[ch][j] = v;
sptr += sinc;
}
/* apply the MDCT window */
for(j=0;j<N/2;j++) {
input_samples[j] = MUL16(input_samples[j],
ff_ac3_window[j]) >> 15;
input_samples[N-j-1] = MUL16(input_samples[N-j-1],
ff_ac3_window[j]) >> 15;
}
/* Normalize the samples to use the maximum available
precision */
v = 14 - log2_tab(input_samples, N);
if (v < 0)
v = 0;
exp_samples[i][ch] = v - 8; /* intentional diff from ffmpeg */
lshift_tab(input_samples, N, v);
/* do the MDCT */
mdct512(mdct_coef[i][ch], input_samples);
/* compute "exponents". We take into account the
normalization there */
for(j=0;j<N/2;j++) {
int e;
v = abs(mdct_coef[i][ch][j]);
if (v == 0)
e = 24;
else {
e = 23 - av_log2(v) + exp_samples[i][ch];
if (e >= 24) {
e = 24;
mdct_coef[i][ch][j] = 0;
}
}
exp[i][ch][j] = e;
}
}
compute_exp_strategy(exp_strategy, exp, ch, ch == s->lfe_channel);
/* compute the exponents as the decoder will see them. The
EXP_REUSE case must be handled carefully : we select the
min of the exponents */
i = 0;
while (i < NB_BLOCKS) {
j = i + 1;
while (j < NB_BLOCKS && exp_strategy[j][ch] == EXP_REUSE) {
exponent_min(exp[i][ch], exp[j][ch], s->nb_coefs[ch]);
j++;
}
frame_bits += encode_exp(encoded_exp[i][ch],
exp[i][ch], s->nb_coefs[ch],
exp_strategy[i][ch]);
/* copy encoded exponents for reuse case */
for(k=i+1;k<j;k++) {
memcpy(encoded_exp[k][ch], encoded_exp[i][ch],
s->nb_coefs[ch] * sizeof(uint8_t));
}
i = j;
}
}
/* adjust for fractional frame sizes */
while(s->bits_written >= s->bit_rate*1000 && s->samples_written >= s->sample_rate) {
s->bits_written -= s->bit_rate*1000;
s->samples_written -= s->sample_rate;
}
s->frame_size = s->frame_size_min + (s->bits_written * s->sample_rate < s->samples_written * s->bit_rate*1000);
s->bits_written += s->frame_size * 16;
s->samples_written += AC3_FRAME_SIZE;
compute_bit_allocation(s, bap, encoded_exp, exp_strategy, frame_bits);
/* everything is known... let's output the frame */
output_frame_header(s, frame);
for(i=0;i<NB_BLOCKS;i++) {
output_audio_block(s, exp_strategy[i], encoded_exp[i],
bap[i], mdct_coef[i], exp_samples[i], i);
}
return output_frame_end(s);
}
static int AC3_encode_close(AVCodecContext *avctx)
{
av_freep(&avctx->coded_frame);
return 0;
}
AVCodec ac3_encoder = {
"ac3",
CODEC_TYPE_AUDIO,
CODEC_ID_AC3,
sizeof(AC3EncodeContext),
/*.init=*/AC3_encode_init,
/*.encode=*/AC3_encode_frame,
/*.close=*/AC3_encode_close,
/*.decode=*/NULL,
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -