X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fac3enc.c;h=1b95e8060ffc761c115005bd2ef55b9e8846dfcc;hb=13686bc2cddbeca540863052e2895460d062ccc3;hp=aae06e4545af19c406a3c9161594c22191bdac85;hpb=132041f06fe30eff483769e19681bb2d5f92f26c;p=ffmpeg diff --git a/libavcodec/ac3enc.c b/libavcodec/ac3enc.c index aae06e4545a..1b95e8060ff 100644 --- a/libavcodec/ac3enc.c +++ b/libavcodec/ac3enc.c @@ -2,19 +2,21 @@ * The simplest AC3 encoder * Copyright (c) 2000 Fabrice Bellard. * - * This library is free software; you can redistribute it and/or + * 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 - * version 2 of the License, or (at your option) any later version. + * version 2.1 of the License, or (at your option) any later version. * - * This library is distributed in the hope that it will be useful, + * 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 - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ /** @@ -25,6 +27,7 @@ //#define DEBUG_BITALLOC #include "avcodec.h" #include "bitstream.h" +#include "crc.h" #include "ac3.h" typedef struct AC3EncodeContext { @@ -34,30 +37,35 @@ typedef struct AC3EncodeContext { int lfe_channel; int bit_rate; unsigned int sample_rate; - unsigned int bsid; + unsigned int bitstream_id; unsigned int frame_size_min; /* minimum frame size in case rounding is necessary */ unsigned int frame_size; /* current frame size in words */ - int halfratecod; - unsigned int frmsizecod; - unsigned int fscod; /* frequency */ - unsigned int acmod; + unsigned int bits_written; + unsigned int samples_written; + int sr_shift; + unsigned int frame_size_code; + unsigned int sr_code; /* frequency */ + unsigned int channel_mode; int lfe; - unsigned int bsmod; + unsigned int bitstream_mode; short last_samples[AC3_MAX_CHANNELS][256]; unsigned int chbwcod[AC3_MAX_CHANNELS]; int nb_coefs[AC3_MAX_CHANNELS]; - + /* bitrate allocation control */ - int sgaincod, sdecaycod, fdecaycod, dbkneecod, floorcod; + int slow_gain_code, slow_decay_code, fast_decay_code, db_per_bit_code, floor_code; AC3BitAllocParameters bit_alloc; - int csnroffst; - int fgaincod[AC3_MAX_CHANNELS]; - int fsnroffst[AC3_MAX_CHANNELS]; + int coarse_snr_offset; + int fast_gain_code[AC3_MAX_CHANNELS]; + int fine_snr_offset[AC3_MAX_CHANNELS]; /* mantissa encoding */ int mant1_cnt, mant2_cnt, mant4_cnt; } AC3EncodeContext; -#include "ac3tab.h" +static int16_t costab[64]; +static int16_t sintab[64]; +static int16_t xcos1[128]; +static int16_t xsin1[128]; #define MDCT_NBITS 9 #define N (1 << MDCT_NBITS) @@ -65,233 +73,24 @@ typedef struct AC3EncodeContext { /* new exponents are sent if their Norm 1 exceed this number */ #define EXP_DIFF_THRESHOLD 1000 -static void fft_init(int ln); -static void ac3_crc_init(void); - static inline int16_t fix15(float a) { int v; v = (int)(a * (float)(1 << 15)); if (v < -32767) v = -32767; - else if (v > 32767) + else if (v > 32767) v = 32767; return v; } -static inline int calc_lowcomp1(int a, int b0, int b1) -{ - if ((b0 + 256) == b1) { - a = 384 ; - } else if (b0 > b1) { - a = a - 64; - if (a < 0) a=0; - } - return a; -} - -static inline int calc_lowcomp(int a, int b0, int b1, int bin) -{ - if (bin < 7) { - if ((b0 + 256) == b1) { - a = 384 ; - } else if (b0 > b1) { - a = a - 64; - if (a < 0) a=0; - } - } else if (bin < 20) { - if ((b0 + 256) == b1) { - a = 320 ; - } else if (b0 > b1) { - a= a - 64; - if (a < 0) a=0; - } - } else { - a = a - 128; - if (a < 0) a=0; - } - return a; -} - -/* AC3 bit allocation. The algorithm is the one described in the AC3 - spec. */ -void ac3_parametric_bit_allocation(AC3BitAllocParameters *s, uint8_t *bap, - int8_t *exp, int start, int end, - int snroffset, int fgain, int is_lfe, - int deltbae,int deltnseg, - uint8_t *deltoffst, uint8_t *deltlen, uint8_t *deltba) -{ - int bin,i,j,k,end1,v,v1,bndstrt,bndend,lowcomp,begin; - int fastleak,slowleak,address,tmp; - int16_t psd[256]; /* scaled exponents */ - int16_t bndpsd[50]; /* interpolated exponents */ - int16_t excite[50]; /* excitation */ - int16_t mask[50]; /* masking value */ - - /* exponent mapping to PSD */ - for(bin=start;bin end) end1=end; - for(i=j;i= 0) { - adr=c >> 1; - if (adr > 255) adr=255; - v=v + latab[adr]; - } else { - adr=(-c) >> 1; - if (adr > 255) adr=255; - v=v1 + latab[adr]; - } - j++; - } - bndpsd[k]=v; - k++; - } while (end > bndtab[k]); - - /* excitation function */ - bndstrt = masktab[start]; - bndend = masktab[end-1] + 1; - - if (bndstrt == 0) { - lowcomp = 0; - lowcomp = calc_lowcomp1(lowcomp, bndpsd[0], bndpsd[1]) ; - excite[0] = bndpsd[0] - fgain - lowcomp ; - lowcomp = calc_lowcomp1(lowcomp, bndpsd[1], bndpsd[2]) ; - excite[1] = bndpsd[1] - fgain - lowcomp ; - begin = 7 ; - for (bin = 2; bin < 7; bin++) { - if (!(is_lfe && bin == 6)) - lowcomp = calc_lowcomp1(lowcomp, bndpsd[bin], bndpsd[bin+1]) ; - fastleak = bndpsd[bin] - fgain ; - slowleak = bndpsd[bin] - s->sgain ; - excite[bin] = fastleak - lowcomp ; - if (!(is_lfe && bin == 6)) { - if (bndpsd[bin] <= bndpsd[bin+1]) { - begin = bin + 1 ; - break ; - } - } - } - - end1=bndend; - if (end1 > 22) end1=22; - - for (bin = begin; bin < end1; bin++) { - if (!(is_lfe && bin == 6)) - lowcomp = calc_lowcomp(lowcomp, bndpsd[bin], bndpsd[bin+1], bin) ; - - fastleak -= s->fdecay ; - v = bndpsd[bin] - fgain; - if (fastleak < v) fastleak = v; - - slowleak -= s->sdecay ; - v = bndpsd[bin] - s->sgain; - if (slowleak < v) slowleak = v; - - v=fastleak - lowcomp; - if (slowleak > v) v=slowleak; - - excite[bin] = v; - } - begin = 22; - } else { - /* coupling channel */ - begin = bndstrt; - - fastleak = (s->cplfleak << 8) + 768; - slowleak = (s->cplsleak << 8) + 768; - } - - for (bin = begin; bin < bndend; bin++) { - fastleak -= s->fdecay ; - v = bndpsd[bin] - fgain; - if (fastleak < v) fastleak = v; - slowleak -= s->sdecay ; - v = bndpsd[bin] - s->sgain; - if (slowleak < v) slowleak = v; - - v=fastleak; - if (slowleak > v) v = slowleak; - excite[bin] = v; - } - - /* compute masking curve */ - - for (bin = bndstrt; bin < bndend; bin++) { - v1 = excite[bin]; - tmp = s->dbknee - bndpsd[bin]; - if (tmp > 0) { - v1 += tmp >> 2; - } - v=hth[bin >> s->halfratecod][s->fscod]; - if (v1 > v) v=v1; - mask[bin] = v; - } - - /* delta bit allocation */ - - if (deltbae == 0 || deltbae == 1) { - int band, seg, delta; - band = 0 ; - for (seg = 0; seg < deltnseg; seg++) { - band += deltoffst[seg] ; - if (deltba[seg] >= 4) { - delta = (deltba[seg] - 3) << 7; - } else { - delta = (deltba[seg] - 4) << 7; - } - for (k = 0; k < deltlen[seg]; k++) { - mask[band] += delta ; - band++ ; - } - } - } - - /* compute bit allocation */ - - i = start ; - j = masktab[start] ; - do { - v=mask[j]; - v -= snroffset ; - v -= s->floor ; - if (v < 0) v = 0; - v &= 0x1fe0 ; - v += s->floor ; - - end1=bndtab[j] + bndsz[j]; - if (end1 > end) end1=end; - - for (k = i; k < end1; k++) { - address = (psd[i] - v) >> 5 ; - if (address < 0) address=0; - else if (address > 63) address=63; - bap[i] = baptab[address]; - i++; - } - } while (end > bndtab[j++]) ; -} - typedef struct IComplex { short re,im; } IComplex; static void fft_init(int ln) { - int i, j, m, n; + int i, n; float alpha; n = 1 << ln; @@ -301,14 +100,6 @@ static void fft_init(int ln) costab[i] = fix15(cos(alpha)); sintab[i] = fix15(sin(alpha)); } - - for(i=0;i> j) & 1) << (ln-j-1); - } - fft_rev[i]=m; - } } /* butter fly op */ @@ -337,8 +128,8 @@ static void fft_init(int ln) /* do a 2^n point complex fft on 2^ln points. */ static void fft(IComplex *z, int ln) { - int j, l, np, np2; - int nblocks, nloops; + int j, l, np, np2; + int nblocks, nloops; register IComplex *p,*q; int tmp_re, tmp_im; @@ -346,14 +137,9 @@ static void fft(IComplex *z, int ln) /* reverse */ for(j=0;j> (8 - ln); + if (k < j) + FFSWAP(IComplex, z[k], z[j]); } /* pass 0 */ @@ -361,7 +147,7 @@ static void fft(IComplex *z, int ln) p=&z[0]; j=(np >> 1); do { - BF(p[0].re, p[0].im, p[1].re, p[1].im, + BF(p[0].re, p[0].im, p[1].re, p[1].im, p[0].re, p[0].im, p[1].re, p[1].im); p+=2; } while (--j != 0); @@ -371,9 +157,9 @@ static void fft(IComplex *z, int ln) p=&z[0]; j=np >> 2; do { - BF(p[0].re, p[0].im, p[2].re, p[2].im, + 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, + BF(p[1].re, p[1].im, p[3].re, p[3].im, p[1].re, p[1].im, p[3].im, -p[3].re); p+=4; } while (--j != 0); @@ -390,7 +176,7 @@ static void fft(IComplex *z, int ln) 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) { @@ -412,7 +198,7 @@ static void fft(IComplex *z, int ln) static void mdct512(int32_t *out, int16_t *in) { int i, re, im, re1, im1; - int16_t rot[N]; + int16_t rot[N]; IComplex x[N/4]; /* shift to simplify computations */ @@ -420,7 +206,7 @@ static void mdct512(int32_t *out, int16_t *in) rot[i] = -in[i + 3*N/4]; for(i=N/4;i> 1; @@ -429,7 +215,7 @@ static void mdct512(int32_t *out, int16_t *in) } fft(x, MDCT_NBITS - 2); - + /* post rotation */ for(i=0;i EXP_DIFF_THRESHOLD) @@ -472,7 +258,7 @@ static void compute_exp_strategy(uint8_t exp_strategy[NB_BLOCKS][AC3_MAX_CHANNEL exp_strategy[i][ch] = EXP_REUSE; } if (is_lfe) - return; + return; /* now select the encoding strategy type : if exponents are often recoded, we use a coarse encoding */ @@ -493,7 +279,7 @@ static void compute_exp_strategy(uint8_t exp_strategy[NB_BLOCKS][AC3_MAX_CHANNEL exp_strategy[i][ch] = EXP_D15; break; } - i = j; + i = j; } } @@ -507,11 +293,11 @@ static void exponent_min(uint8_t exp[N/2], uint8_t exp1[N/2], int n) exp[i] = exp1[i]; } } - + /* update the exponents so that they are the ones the decoder will decode. Return the number of bits used to code the exponents */ -static int encode_exp(uint8_t encoded_exp[N/2], - uint8_t exp[N/2], +static int encode_exp(uint8_t encoded_exp[N/2], + uint8_t exp[N/2], int nb_exps, int exp_strategy) { @@ -553,9 +339,9 @@ static int encode_exp(uint8_t encoded_exp[N/2], /* 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); + 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); + exp1[i] = FFMIN(exp1[i], exp1[i+1] + 2); /* now we have the exponent values the decoder will see */ encoded_exp[0] = exp1[0]; @@ -566,7 +352,7 @@ static int encode_exp(uint8_t encoded_exp[N/2], } k += group_size; } - + #if defined(DEBUG) av_log(NULL, AV_LOG_DEBUG, "exponents: strategy=%d\n", exp_strategy); for(i=0;i<=nb_groups * group_size;i++) { @@ -592,14 +378,14 @@ static int compute_mantissa_size(AC3EncodeContext *s, uint8_t *m, int nb_coefs) break; case 1: /* 3 mantissa in 5 bits */ - if (s->mant1_cnt == 0) + if (s->mant1_cnt == 0) bits += 5; if (++s->mant1_cnt == 3) s->mant1_cnt = 0; break; case 2: /* 3 mantissa in 7 bits */ - if (s->mant2_cnt == 0) + if (s->mant2_cnt == 0) bits += 7; if (++s->mant2_cnt == 3) s->mant2_cnt = 0; @@ -611,7 +397,7 @@ static int compute_mantissa_size(AC3EncodeContext *s, uint8_t *m, int nb_coefs) /* 2 mantissa in 7 bits */ if (s->mant4_cnt == 0) bits += 7; - if (++s->mant4_cnt == 2) + if (++s->mant4_cnt == 2) s->mant4_cnt = 0; break; case 14: @@ -629,13 +415,45 @@ static int compute_mantissa_size(AC3EncodeContext *s, uint8_t *m, int nb_coefs) } +static void bit_alloc_masking(AC3EncodeContext *s, + uint8_t encoded_exp[NB_BLOCKS][AC3_MAX_CHANNELS][N/2], + uint8_t exp_strategy[NB_BLOCKS][AC3_MAX_CHANNELS], + int16_t psd[NB_BLOCKS][AC3_MAX_CHANNELS][N/2], + int16_t mask[NB_BLOCKS][AC3_MAX_CHANNELS][50]) +{ + int blk, ch; + int16_t band_psd[NB_BLOCKS][AC3_MAX_CHANNELS][50]; + + for(blk=0; blknb_all_channels;ch++) { + if(exp_strategy[blk][ch] == EXP_REUSE) { + memcpy(psd[blk][ch], psd[blk-1][ch], (N/2)*sizeof(int16_t)); + memcpy(mask[blk][ch], mask[blk-1][ch], 50*sizeof(int16_t)); + } 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]); + } + } + } +} + static int bit_alloc(AC3EncodeContext *s, + int16_t mask[NB_BLOCKS][AC3_MAX_CHANNELS][50], + int16_t psd[NB_BLOCKS][AC3_MAX_CHANNELS][N/2], uint8_t bap[NB_BLOCKS][AC3_MAX_CHANNELS][N/2], - uint8_t encoded_exp[NB_BLOCKS][AC3_MAX_CHANNELS][N/2], - uint8_t exp_strategy[NB_BLOCKS][AC3_MAX_CHANNELS], - int frame_bits, int csnroffst, int fsnroffst) + int frame_bits, int coarse_snr_offset, int fine_snr_offset) { int i, ch; + int snr_offset; + + snr_offset = (((coarse_snr_offset - 15) << 4) + fine_snr_offset) << 2; /* compute size */ for(i=0;imant2_cnt = 0; s->mant4_cnt = 0; for(ch=0;chnb_all_channels;ch++) { - ac3_parametric_bit_allocation(&s->bit_alloc, - bap[i][ch], (int8_t *)encoded_exp[i][ch], - 0, s->nb_coefs[ch], - (((csnroffst-15) << 4) + - fsnroffst) << 2, - fgaintab[s->fgaincod[ch]], - ch == s->lfe_channel, - 2, 0, NULL, NULL, NULL); - frame_bits += compute_mantissa_size(s, bap[i][ch], + ff_ac3_bit_alloc_calc_bap(mask[i][ch], psd[i][ch], 0, + s->nb_coefs[ch], snr_offset, + s->bit_alloc.floor, bap[i][ch]); + frame_bits += compute_mantissa_size(s, bap[i][ch], s->nb_coefs[ch]); } } #if 0 - printf("csnr=%d fsnr=%d frame_bits=%d diff=%d\n", - csnroffst, fsnroffst, frame_bits, + printf("csnr=%d fsnr=%d frame_bits=%d diff=%d\n", + coarse_snr_offset, fine_snr_offset, frame_bits, 16 * s->frame_size - ((frame_bits + 7) & ~7)); #endif return 16 * s->frame_size - frame_bits; @@ -672,44 +485,46 @@ static int compute_bit_allocation(AC3EncodeContext *s, int frame_bits) { int i, ch; - int csnroffst, fsnroffst; + int coarse_snr_offset, fine_snr_offset; uint8_t bap1[NB_BLOCKS][AC3_MAX_CHANNELS][N/2]; + int16_t psd[NB_BLOCKS][AC3_MAX_CHANNELS][N/2]; + int16_t mask[NB_BLOCKS][AC3_MAX_CHANNELS][50]; static int frame_bits_inc[8] = { 0, 0, 2, 2, 2, 4, 2, 4 }; /* init default parameters */ - s->sdecaycod = 2; - s->fdecaycod = 1; - s->sgaincod = 1; - s->dbkneecod = 2; - s->floorcod = 4; - for(ch=0;chnb_all_channels;ch++) - s->fgaincod[ch] = 4; - + 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;chnb_all_channels;ch++) + s->fast_gain_code[ch] = 4; + /* compute real values */ - s->bit_alloc.fscod = s->fscod; - s->bit_alloc.halfratecod = s->halfratecod; - s->bit_alloc.sdecay = sdecaytab[s->sdecaycod] >> s->halfratecod; - s->bit_alloc.fdecay = fdecaytab[s->fdecaycod] >> s->halfratecod; - s->bit_alloc.sgain = sgaintab[s->sgaincod]; - s->bit_alloc.dbknee = dbkneetab[s->dbkneecod]; - s->bit_alloc.floor = floortab[s->floorcod]; - + s->bit_alloc.sr_code = s->sr_code; + s->bit_alloc.sr_shift = s->sr_shift; + s->bit_alloc.slow_decay = ff_ac3_slow_decay_tab[s->slow_decay_code] >> s->sr_shift; + s->bit_alloc.fast_decay = ff_ac3_fast_decay_tab[s->fast_decay_code] >> s->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]; + /* header size */ frame_bits += 65; - // if (s->acmod == 2) + // if (s->channel_mode == 2) // frame_bits += 2; - frame_bits += frame_bits_inc[s->acmod]; + frame_bits += frame_bits_inc[s->channel_mode]; /* audio blocks */ for(i=0;inb_channels * 2 + 2; /* blksw * c, dithflag * c, dynrnge, cplstre */ - if (s->acmod == 2) { + if (s->channel_mode == AC3_CHMODE_STEREO) { frame_bits++; /* rematstr */ if(i==0) frame_bits += 4; } frame_bits += 2 * s->nb_channels; /* chexpstr[2] * c */ - if (s->lfe) - frame_bits++; /* lfeexpstr */ + if (s->lfe) + frame_bits++; /* lfeexpstr */ for(ch=0;chnb_channels;ch++) { if (exp_strategy[i][ch] != EXP_REUSE) frame_bits += 6 + 2; /* chbwcod[6], gainrng[2] */ @@ -731,46 +546,49 @@ static int compute_bit_allocation(AC3EncodeContext *s, /* CRC */ frame_bits += 16; + /* 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 */ - csnroffst = s->csnroffst; - while (csnroffst >= 0 && - bit_alloc(s, bap, encoded_exp, exp_strategy, frame_bits, csnroffst, 0) < 0) - csnroffst -= SNR_INC1; - if (csnroffst < 0) { - av_log(NULL, AV_LOG_ERROR, "Yack, Error !!!\n"); - return -1; + coarse_snr_offset = s->coarse_snr_offset; + while (coarse_snr_offset >= 0 && + bit_alloc(s, mask, psd, bap, frame_bits, coarse_snr_offset, 0) < 0) + coarse_snr_offset -= SNR_INC1; + if (coarse_snr_offset < 0) { + av_log(NULL, AV_LOG_ERROR, "Bit allocation failed. Try increasing the bitrate.\n"); + return -1; } - while ((csnroffst + SNR_INC1) <= 63 && - bit_alloc(s, bap1, encoded_exp, exp_strategy, frame_bits, - csnroffst + SNR_INC1, 0) >= 0) { - csnroffst += SNR_INC1; + while ((coarse_snr_offset + SNR_INC1) <= 63 && + bit_alloc(s, mask, psd, bap1, frame_bits, + coarse_snr_offset + SNR_INC1, 0) >= 0) { + coarse_snr_offset += SNR_INC1; memcpy(bap, bap1, sizeof(bap1)); } - while ((csnroffst + 1) <= 63 && - bit_alloc(s, bap1, encoded_exp, exp_strategy, frame_bits, csnroffst + 1, 0) >= 0) { - csnroffst++; + while ((coarse_snr_offset + 1) <= 63 && + bit_alloc(s, mask, psd, bap1, frame_bits, coarse_snr_offset + 1, 0) >= 0) { + coarse_snr_offset++; memcpy(bap, bap1, sizeof(bap1)); } - fsnroffst = 0; - while ((fsnroffst + SNR_INC1) <= 15 && - bit_alloc(s, bap1, encoded_exp, exp_strategy, frame_bits, - csnroffst, fsnroffst + SNR_INC1) >= 0) { - fsnroffst += SNR_INC1; + fine_snr_offset = 0; + while ((fine_snr_offset + SNR_INC1) <= 15 && + bit_alloc(s, mask, psd, bap1, frame_bits, + coarse_snr_offset, fine_snr_offset + SNR_INC1) >= 0) { + fine_snr_offset += SNR_INC1; memcpy(bap, bap1, sizeof(bap1)); } - while ((fsnroffst + 1) <= 15 && - bit_alloc(s, bap1, encoded_exp, exp_strategy, frame_bits, - csnroffst, fsnroffst + 1) >= 0) { - fsnroffst++; + while ((fine_snr_offset + 1) <= 15 && + bit_alloc(s, mask, psd, bap1, frame_bits, + coarse_snr_offset, fine_snr_offset + 1) >= 0) { + fine_snr_offset++; memcpy(bap, bap1, sizeof(bap1)); } - - s->csnroffst = csnroffst; + + s->coarse_snr_offset = coarse_snr_offset; for(ch=0;chnb_all_channels;ch++) - s->fsnroffst[ch] = fsnroffst; + s->fine_snr_offset[ch] = fine_snr_offset; #if defined(DEBUG_BITALLOC) { int j; @@ -790,22 +608,6 @@ static int compute_bit_allocation(AC3EncodeContext *s, return 0; } -void ac3_common_init(void) -{ - int i, j, k, l, v; - /* compute bndtab and masktab from bandsz */ - k = 0; - l = 0; - for(i=0;i<50;i++) { - bndtab[i] = l; - v = bndsz[i]; - for(j=0;jsample_rate; @@ -814,21 +616,24 @@ static int AC3_encode_init(AVCodecContext *avctx) AC3EncodeContext *s = avctx->priv_data; int i, j, ch; float alpha; - static const uint8_t acmod_defs[6] = { - 0x01, /* C */ - 0x02, /* L R */ - 0x03, /* L C R */ - 0x06, /* L R SL SR */ - 0x07, /* L C R SL SR */ - 0x07, /* L C R SL SR (+LFE) */ + int bw_code; + static const uint8_t channel_mode_defs[6] = { + 0x01, /* C */ + 0x02, /* L R */ + 0x03, /* L C R */ + 0x06, /* L R SL SR */ + 0x07, /* L C R SL SR */ + 0x07, /* L C R SL SR (+LFE) */ }; avctx->frame_size = AC3_FRAME_SIZE; - + + ac3_common_init(); + /* number of channels */ if (channels < 1 || channels > 6) - return -1; - s->acmod = acmod_defs[channels - 1]; + return -1; + s->channel_mode = channel_mode_defs[channels - 1]; s->lfe = (channels == 6) ? 1 : 0; s->nb_all_channels = channels; s->nb_channels = channels > 5 ? 5 : channels; @@ -836,47 +641,54 @@ static int AC3_encode_init(AVCodecContext *avctx) /* frequency */ for(i=0;i<3;i++) { - for(j=0;j<3;j++) - if ((ac3_freqs[j] >> i) == freq) + for(j=0;j<3;j++) + if ((ff_ac3_sample_rate_tab[j] >> i) == freq) goto found; } return -1; - found: + found: s->sample_rate = freq; - s->halfratecod = i; - s->fscod = j; - s->bsid = 8 + s->halfratecod; - s->bsmod = 0; /* complete main audio service */ + s->sr_shift = i; + s->sr_code = j; + s->bitstream_id = 8 + s->sr_shift; + s->bitstream_mode = 0; /* complete main audio service */ /* bitrate & frame size */ - bitrate /= 1000; for(i=0;i<19;i++) { - if ((ac3_bitratetab[i] >> s->halfratecod) == bitrate) + if ((ff_ac3_bitrate_tab[i] >> s->sr_shift)*1000 == bitrate) break; } if (i == 19) return -1; s->bit_rate = bitrate; - s->frmsizecod = i << 1; - s->frame_size_min = (bitrate * 1000 * AC3_FRAME_SIZE) / (freq * 16); - /* for now we do not handle fractional sizes */ + s->frame_size_code = i << 1; + s->frame_size_min = ff_ac3_frame_size_tab[s->frame_size_code][s->sr_code]; + s->bits_written = 0; + s->samples_written = 0; s->frame_size = s->frame_size_min; - + /* bit allocation init */ - for(ch=0;chnb_channels;ch++) { - /* bandwidth for each channel */ + if(avctx->cutoff) { + /* calculate bandwidth based on user-specified cutoff frequency */ + int cutoff = av_clip(avctx->cutoff, 1, s->sample_rate >> 1); + int fbw_coeffs = cutoff * 512 / s->sample_rate; + bw_code = av_clip((fbw_coeffs - 73) / 3, 0, 60); + } else { + /* use default bandwidth setting */ /* XXX: should compute the bandwidth according to the frame size, so that we avoid anoying high freq artefacts */ - s->chbwcod[ch] = 50; /* sample bandwidth as mpeg audio layer 2 table 0 */ - s->nb_coefs[ch] = ((s->chbwcod[ch] + 12) * 3) + 37; + bw_code = 50; + } + for(ch=0;chnb_channels;ch++) { + /* bandwidth for each channel */ + s->chbwcod[ch] = bw_code; + s->nb_coefs[ch] = bw_code * 3 + 73; } if (s->lfe) { - s->nb_coefs[s->lfe_channel] = 7; /* fixed */ + s->nb_coefs[s->lfe_channel] = 7; /* fixed */ } /* initial snr offset */ - s->csnroffst = 40; - - ac3_common_init(); + s->coarse_snr_offset = 40; /* mdct init */ fft_init(MDCT_NBITS - 2); @@ -886,8 +698,6 @@ static int AC3_encode_init(AVCodecContext *avctx) xsin1[i] = fix15(-sin(alpha)); } - ac3_crc_init(); - avctx->coded_frame= avcodec_alloc_frame(); avctx->coded_frame->key_frame= 1; @@ -901,16 +711,16 @@ static void output_frame_header(AC3EncodeContext *s, unsigned char *frame) put_bits(&s->pb, 16, 0x0b77); /* frame header */ put_bits(&s->pb, 16, 0); /* crc1: will be filled later */ - put_bits(&s->pb, 2, s->fscod); - put_bits(&s->pb, 6, s->frmsizecod + (s->frame_size - s->frame_size_min)); - put_bits(&s->pb, 5, s->bsid); - put_bits(&s->pb, 3, s->bsmod); - put_bits(&s->pb, 3, s->acmod); - if ((s->acmod & 0x01) && s->acmod != 0x01) - put_bits(&s->pb, 2, 1); /* XXX -4.5 dB */ - if (s->acmod & 0x04) - put_bits(&s->pb, 2, 1); /* XXX -6 dB */ - if (s->acmod == 0x02) + put_bits(&s->pb, 2, s->sr_code); + put_bits(&s->pb, 6, s->frame_size_code + (s->frame_size - s->frame_size_min)); + put_bits(&s->pb, 5, s->bitstream_id); + put_bits(&s->pb, 3, s->bitstream_mode); + put_bits(&s->pb, 3, s->channel_mode); + if ((s->channel_mode & 0x01) && s->channel_mode != AC3_CHMODE_MONO) + put_bits(&s->pb, 2, 1); /* XXX -4.5 dB */ + if (s->channel_mode & 0x04) + put_bits(&s->pb, 2, 1); /* XXX -6 dB */ + if (s->channel_mode == AC3_CHMODE_STEREO) put_bits(&s->pb, 2, 0); /* surround not indicated */ put_bits(&s->pb, 1, s->lfe); /* LFE */ put_bits(&s->pb, 5, 31); /* dialog norm: -31 db */ @@ -921,7 +731,7 @@ static void output_frame_header(AC3EncodeContext *s, unsigned char *frame) put_bits(&s->pb, 1, 1); /* original bitstream */ put_bits(&s->pb, 1, 0); /* no time code 1 */ put_bits(&s->pb, 1, 0); /* no time code 2 */ - put_bits(&s->pb, 1, 0); /* no addtional bit stream info */ + put_bits(&s->pb, 1, 0); /* no additional bit stream info */ } /* symetric quantization on 'levels' levels */ @@ -979,9 +789,9 @@ static void output_audio_block(AC3EncodeContext *s, uint16_t *qmant1_ptr, *qmant2_ptr, *qmant4_ptr; int delta0, delta1, delta2; - for(ch=0;chnb_channels;ch++) + for(ch=0;chnb_channels;ch++) put_bits(&s->pb, 1, 0); /* 512 point MDCT */ - for(ch=0;chnb_channels;ch++) + for(ch=0;chnb_channels;ch++) put_bits(&s->pb, 1, 1); /* no dither */ put_bits(&s->pb, 1, 0); /* no dynamic range */ if (block_num == 0) { @@ -993,25 +803,25 @@ static void output_audio_block(AC3EncodeContext *s, put_bits(&s->pb, 1, 0); /* no new coupling strategy */ } - if (s->acmod == 2) + if (s->channel_mode == AC3_CHMODE_STEREO) { - if(block_num==0) - { - /* first block must define rematrixing (rematstr) */ - put_bits(&s->pb, 1, 1); - - /* dummy rematrixing rematflg(1:4)=0 */ - for (rbnd=0;rbnd<4;rbnd++) - put_bits(&s->pb, 1, 0); - } - else - { - /* no matrixing (but should be used in the future) */ - put_bits(&s->pb, 1, 0); - } + if(block_num==0) + { + /* first block must define rematrixing (rematstr) */ + put_bits(&s->pb, 1, 1); + + /* dummy rematrixing rematflg(1:4)=0 */ + for (rbnd=0;rbnd<4;rbnd++) + put_bits(&s->pb, 1, 0); + } + else + { + /* no matrixing (but should be used in the future) */ + put_bits(&s->pb, 1, 0); + } } -#if defined(DEBUG) +#if defined(DEBUG) { static int count = 0; av_log(NULL, AV_LOG_DEBUG, "Block #%d (%d)\n", block_num, count++); @@ -1021,16 +831,16 @@ static void output_audio_block(AC3EncodeContext *s, for(ch=0;chnb_channels;ch++) { put_bits(&s->pb, 2, exp_strategy[ch]); } - + if (s->lfe) { - put_bits(&s->pb, 1, exp_strategy[s->lfe_channel]); + put_bits(&s->pb, 1, exp_strategy[s->lfe_channel]); } for(ch=0;chnb_channels;ch++) { if (exp_strategy[ch] != EXP_REUSE) put_bits(&s->pb, 6, s->chbwcod[ch]); } - + /* exponents */ for (ch = 0; ch < s->nb_all_channels; ch++) { switch(exp_strategy[ch]) { @@ -1047,7 +857,7 @@ static void output_audio_block(AC3EncodeContext *s, group_size = 4; break; } - nb_groups = (s->nb_coefs[ch] + (group_size * 3) - 4) / (3 * group_size); + nb_groups = (s->nb_coefs[ch] + (group_size * 3) - 4) / (3 * group_size); p = encoded_exp[ch]; /* first exponent */ @@ -1075,31 +885,31 @@ static void output_audio_block(AC3EncodeContext *s, 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 */ + 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); + put_bits(&s->pb, 2, s->slow_decay_code); + put_bits(&s->pb, 2, s->fast_decay_code); + put_bits(&s->pb, 2, s->slow_gain_code); + put_bits(&s->pb, 2, s->db_per_bit_code); + put_bits(&s->pb, 3, s->floor_code); } /* snr offset */ put_bits(&s->pb, 1, baie); /* always present with bai */ if (baie) { - put_bits(&s->pb, 6, s->csnroffst); + put_bits(&s->pb, 6, s->coarse_snr_offset); for(ch=0;chnb_all_channels;ch++) { - put_bits(&s->pb, 4, s->fsnroffst[ch]); - put_bits(&s->pb, 3, s->fgaincod[ch]); + put_bits(&s->pb, 4, s->fine_snr_offset[ch]); + put_bits(&s->pb, 3, s->fast_gain_code[ch]); } } - + put_bits(&s->pb, 1, 0); /* no delta bit allocation */ put_bits(&s->pb, 1, 0); /* no data to skip */ @@ -1200,7 +1010,7 @@ static void output_audio_block(AC3EncodeContext *s, /* second pass : output the values */ for (ch = 0; ch < s->nb_all_channels; ch++) { int b, q; - + for(i=0;inb_coefs[ch];i++) { q = qmant[ch][i]; b = bap[ch][i]; @@ -1208,11 +1018,11 @@ static void output_audio_block(AC3EncodeContext *s, case 0: break; case 1: - if (q != 128) + if (q != 128) put_bits(&s->pb, 5, q); break; case 2: - if (q != 128) + if (q != 128) put_bits(&s->pb, 7, q); break; case 3: @@ -1236,35 +1046,8 @@ static void output_audio_block(AC3EncodeContext *s, } } -/* compute the ac3 crc */ - #define CRC16_POLY ((1 << 0) | (1 << 2) | (1 << 15) | (1 << 16)) -static void ac3_crc_init(void) -{ - unsigned int c, n, k; - - for(n=0;n<256;n++) { - c = n << 8; - for (k = 0; k < 8; k++) { - if (c & (1 << 15)) - c = ((c << 1) & 0xffff) ^ (CRC16_POLY & 0xffff); - else - c = c << 1; - } - crc_table[n] = c; - } -} - -static unsigned int ac3_crc(uint8_t *data, int n, unsigned int crc) -{ - int i; - for(i=0;i> 8)] ^ (crc << 8)) & 0xffff; - } - return crc; -} - static unsigned int mul_poly(unsigned int a, unsigned int b, unsigned int poly) { unsigned int c; @@ -1338,20 +1121,21 @@ static int output_frame_end(AC3EncodeContext *s) 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 = ac3_crc(frame + 4, (2 * frame_size_58) - 4, 0); + crc1 = bswap_16(av_crc(av_crc_get_table(AV_CRC_16_ANSI), 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); - frame[2] = crc1 >> 8; - frame[3] = crc1; - - crc2 = ac3_crc(frame + 2 * frame_size_58, (frame_size - frame_size_58) * 2 - 2, 0); - frame[2*frame_size - 2] = crc2 >> 8; - frame[2*frame_size - 1] = crc2; + AV_WB16(frame+2,crc1); + + crc2 = bswap_16(av_crc(av_crc_get_table(AV_CRC_16_ANSI), 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; @@ -1386,29 +1170,29 @@ static int AC3_encode_frame(AVCodecContext *avctx, for(j=0;jlast_samples[ch][j] = v; + s->last_samples[ch][j] = v; sptr += sinc; } /* apply the MDCT window */ for(j=0;j> 15; - input_samples[N-j-1] = MUL16(input_samples[N-j-1], - ac3_window[j]) >> 15; + 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; + exp_samples[i][ch] = v - 9; 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;jlfe_channel); /* compute the exponents as the decoder will see them. The @@ -1440,23 +1224,32 @@ static int AC3_encode_frame(AVCodecContext *avctx, j++; } frame_bits += encode_exp(encoded_exp[i][ch], - exp[i][ch], s->nb_coefs[ch], + exp[i][ch], s->nb_coefs[ch], exp_strategy[i][ch]); /* copy encoded exponents for reuse case */ for(k=i+1;knb_coefs[ch] * sizeof(uint8_t)); } i = j; } } + /* adjust for fractional frame sizes */ + 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 + (s->bits_written * s->sample_rate < s->samples_written * s->bit_rate); + 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