X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fac3enc.c;h=e85d86c9018eefaf29be4f6f4f7de26eb90a33e5;hb=9f4aa353599b0c12c7364fd9fe80132da96f3eb7;hp=0754c8657084a6cb716cd52b7dbc4d3ba7cc7add;hpb=34763c151fd387f2977f850eac11762bf965467f;p=ffmpeg diff --git a/libavcodec/ac3enc.c b/libavcodec/ac3enc.c index 0754c865708..e85d86c9018 100644 --- a/libavcodec/ac3enc.c +++ b/libavcodec/ac3enc.c @@ -1,239 +1,96 @@ /* * The simplest AC3 encoder - * Copyright (c) 2000 Gerard Lantau. + * Copyright (c) 2000 Fabrice Bellard. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * This file is part of FFmpeg. * - * This program is distributed in the hope that it will be useful, + * 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.1 of the License, or (at your option) any later version. + * + * 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 General Public License for more details. + * 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 General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file ac3enc.c + * The simplest AC3 encoder. */ //#define DEBUG //#define DEBUG_BITALLOC +#include "libavutil/crc.h" #include "avcodec.h" -#include - -#include "ac3enc.h" -#include "ac3tab.h" +#include "bitstream.h" +#include "ac3.h" + +typedef struct AC3EncodeContext { + PutBitContext pb; + int nb_channels; + int nb_all_channels; + int lfe_channel; + int bit_rate; + unsigned int sample_rate; + 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 */ + 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 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 slow_gain_code, slow_decay_code, fast_decay_code, db_per_bit_code, floor_code; + AC3BitAllocParameters bit_alloc; + 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; +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) -#define NB_BLOCKS 6 /* number of PCM blocks inside an AC3 frame */ /* new exponents are sent if their Norm 1 exceed this number */ #define EXP_DIFF_THRESHOLD 1000 -/* exponent encoding strategy */ -#define EXP_REUSE 0 -#define EXP_NEW 1 - -#define EXP_D15 1 -#define EXP_D25 2 -#define EXP_D45 3 - -static void fft_init(int ln); -static void ac3_crc_init(void); - -static inline INT16 fix15(float a) +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 with some optimizations because of our simplified encoding - assumptions. */ -void parametric_bit_allocation(AC3EncodeContext *s, UINT8 *bap, - INT8 *exp, int start, int end, - int snroffset, int fgain) -{ - int bin,i,j,k,end1,v,v1,bndstrt,bndend,lowcomp,begin; - int fastleak,slowleak,address,tmp; - INT16 psd[256]; /* scaled exponents */ - INT16 bndpsd[50]; /* interpolated exponents */ - INT16 excite[50]; /* excitation */ - INT16 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; - - 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++) { - lowcomp = calc_lowcomp1(lowcomp, bndpsd[bin], bndpsd[bin+1]) ; - fastleak = bndpsd[bin] - fgain ; - slowleak = bndpsd[bin] - s->sgain ; - excite[bin] = fastleak - lowcomp ; - if (bndpsd[bin] <= bndpsd[bin+1]) { - begin = bin + 1 ; - break ; - } - } - - end1=bndend; - if (end1 > 22) end1=22; - - for (bin = begin; bin < end1; bin++) { - 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; - } - - for (bin = 22; 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; - } - - /* 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; @@ -243,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 */ @@ -279,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; @@ -288,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 */ @@ -303,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); @@ -313,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); @@ -332,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) { @@ -351,10 +195,10 @@ static void fft(IComplex *z, int ln) } /* do a 512 point mdct */ -static void mdct512(INT32 *out, INT16 *in) +static void mdct512(int32_t *out, int16_t *in) { int i, re, im, re1, im1; - INT16 rot[N]; + int16_t rot[N]; IComplex x[N/4]; /* shift to simplify computations */ @@ -362,7 +206,7 @@ static void mdct512(INT32 *out, INT16 *in) rot[i] = -in[i + 3*N/4]; for(i=N/4;i> 1; @@ -371,7 +215,7 @@ static void mdct512(INT32 *out, INT16 *in) } fft(x, MDCT_NBITS - 2); - + /* post rotation */ for(i=0;i EXP_DIFF_THRESHOLD) exp_strategy[i][ch] = EXP_NEW; else exp_strategy[i][ch] = EXP_REUSE; } + if (is_lfe) + return; + /* now select the encoding strategy type : if exponents are often recoded, we use a coarse encoding */ i = 0; @@ -437,7 +284,7 @@ static void compute_exp_strategy(UINT8 exp_strategy[NB_BLOCKS][AC3_MAX_CHANNELS] } /* set exp[i] to min(exp[i], exp1[i]) */ -static void exponent_min(UINT8 exp[N/2], UINT8 exp1[N/2], int n) +static void exponent_min(uint8_t exp[N/2], uint8_t exp1[N/2], int n) { int i; @@ -446,16 +293,16 @@ static void exponent_min(UINT8 exp[N/2], UINT8 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 encoded_exp[N/2], - UINT8 exp[N/2], +static int encode_exp(uint8_t encoded_exp[N/2], + uint8_t exp[N/2], int nb_exps, int exp_strategy) { - int group_size, nb_groups, i, j, k, recurse, exp_min, delta; - UINT8 exp1[N/2]; + int group_size, nb_groups, i, j, k, exp_min; + uint8_t exp1[N/2]; switch(exp_strategy) { case EXP_D15: @@ -489,25 +336,13 @@ static int encode_exp(UINT8 encoded_exp[N/2], if (exp1[0] > 15) exp1[0] = 15; - /* Iterate until the delta constraints between each groups are - satisfyed. I'm sure it is possible to find a better algorithm, - but I am lazy */ - do { - recurse = 0; - for(i=1;i<=nb_groups;i++) { - delta = exp1[i] - exp1[i-1]; - if (delta > 2) { - /* if delta too big, we encode a smaller exponent */ - exp1[i] = exp1[i-1] + 2; - } else if (delta < -2) { - /* if delta is too small, we must decrease the previous - exponent, which means we must recurse */ - recurse = 1; - exp1[i-1] = exp1[i] + 2; - } - } - } while (recurse); - + /* 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); + /* now we have the exponent values the decoder will see */ encoded_exp[0] = exp1[0]; k = 1; @@ -517,20 +352,20 @@ static int encode_exp(UINT8 encoded_exp[N/2], } k += group_size; } - + #if defined(DEBUG) - printf("exponents: strategy=%d\n", exp_strategy); + av_log(NULL, AV_LOG_DEBUG, "exponents: strategy=%d\n", exp_strategy); for(i=0;i<=nb_groups * group_size;i++) { - printf("%d ", encoded_exp[i]); + av_log(NULL, AV_LOG_DEBUG, "%d ", encoded_exp[i]); } - printf("\n"); + av_log(NULL, AV_LOG_DEBUG, "\n"); #endif return 4 + (nb_groups / 3) * 7; } /* return the size in bits taken by the mantissa */ -int compute_mantissa_size(AC3EncodeContext *s, UINT8 *m, int nb_coefs) +static int compute_mantissa_size(AC3EncodeContext *s, uint8_t *m, int nb_coefs) { int bits, mant, i; @@ -543,14 +378,14 @@ int compute_mantissa_size(AC3EncodeContext *s, UINT8 *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; @@ -562,7 +397,7 @@ int compute_mantissa_size(AC3EncodeContext *s, UINT8 *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: @@ -580,32 +415,62 @@ int compute_mantissa_size(AC3EncodeContext *s, UINT8 *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, - UINT8 bap[NB_BLOCKS][AC3_MAX_CHANNELS][N/2], - UINT8 encoded_exp[NB_BLOCKS][AC3_MAX_CHANNELS][N/2], - UINT8 exp_strategy[NB_BLOCKS][AC3_MAX_CHANNELS], - int frame_bits, int csnroffst, int fsnroffst) + 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], + 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;imant1_cnt = 0; s->mant2_cnt = 0; s->mant4_cnt = 0; - for(ch=0;chnb_channels;ch++) { - parametric_bit_allocation(s, bap[i][ch], (INT8 *)encoded_exp[i][ch], - 0, s->nb_coefs[ch], - (((csnroffst-15) << 4) + - fsnroffst) << 2, - fgaintab[s->fgaincod[ch]]); - frame_bits += compute_mantissa_size(s, bap[i][ch], + for(ch=0;chnb_all_channels;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; @@ -614,45 +479,55 @@ static int bit_alloc(AC3EncodeContext *s, #define SNR_INC1 4 static int compute_bit_allocation(AC3EncodeContext *s, - UINT8 bap[NB_BLOCKS][AC3_MAX_CHANNELS][N/2], - UINT8 encoded_exp[NB_BLOCKS][AC3_MAX_CHANNELS][N/2], - UINT8 exp_strategy[NB_BLOCKS][AC3_MAX_CHANNELS], + 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 i, ch; - int csnroffst, fsnroffst; - UINT8 bap1[NB_BLOCKS][AC3_MAX_CHANNELS][N/2]; + 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_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->sdecay = sdecaytab[s->sdecaycod] >> s->halfratecod; - s->fdecay = fdecaytab[s->fdecaycod] >> s->halfratecod; - s->sgain = sgaintab[s->sgaincod]; - s->dbknee = dbkneetab[s->dbkneecod]; - s->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) - frame_bits += 2; + // if (s->channel_mode == 2) + // frame_bits += 2; + frame_bits += frame_bits_inc[s->channel_mode]; /* audio blocks */ for(i=0;inb_channels * 2 + 2; - if (s->acmod == 2) - frame_bits++; - frame_bits += 2 * s->nb_channels; + frame_bits += s->nb_channels * 2 + 2; /* blksw * c, dithflag * c, dynrnge, cplstre */ + 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 */ for(ch=0;chnb_channels;ch++) { if (exp_strategy[i][ch] != EXP_REUSE) - frame_bits += 6 + 2; + frame_bits += 6 + 2; /* chbwcod[6], gainrng[2] */ } frame_bits++; /* baie */ frame_bits++; /* snr */ @@ -660,57 +535,66 @@ static int compute_bit_allocation(AC3EncodeContext *s, } frame_bits++; /* cplinu for block 0 */ /* bit alloc info */ - frame_bits += 2*4 + 3 + 6 + s->nb_channels * (4 + 3); + /* sdcycod[2], fdcycod[2], sgaincod[2], dbpbcod[2], floorcod[3] */ + /* csnroffset[6] */ + /* (fsnoffset[4] + fgaincod[4]) * c */ + frame_bits += 2*4 + 3 + 6 + s->nb_all_channels * (4 + 3); + + /* auxdatae, crcrsv */ + frame_bits += 2; /* 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) { - fprintf(stderr, "Error !!!\n"); + 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; - for(ch=0;chnb_channels;ch++) - s->fsnroffst[ch] = fsnroffst; + + s->coarse_snr_offset = coarse_snr_offset; + for(ch=0;chnb_all_channels;ch++) + s->fine_snr_offset[ch] = fine_snr_offset; #if defined(DEBUG_BITALLOC) { int j; for(i=0;i<6;i++) { - for(ch=0;chnb_channels;ch++) { + for(ch=0;chnb_all_channels;ch++) { printf("Block #%d Ch%d:\n", i, ch); printf("bap="); for(j=0;jnb_coefs[ch];j++) { @@ -724,77 +608,87 @@ static int compute_bit_allocation(AC3EncodeContext *s, return 0; } -static int AC3_encode_init(AVCodecContext *avctx) +static av_cold int AC3_encode_init(AVCodecContext *avctx) { int freq = avctx->sample_rate; int bitrate = avctx->bit_rate; int channels = avctx->channels; AC3EncodeContext *s = avctx->priv_data; - int i, j, k, l, ch, v; + int i, j, ch; float alpha; - static unsigned short freqs[3] = { 48000, 44100, 32000 }; + 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; - avctx->key_frame = 1; /* always key frame */ - + + ac3_common_init(); + /* number of channels */ - if (channels == 1) - s->acmod = 1; - else if (channels == 2) - s->acmod = 2; - else + if (channels < 1 || channels > 6) return -1; - s->nb_channels = channels; + 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; + s->lfe_channel = s->lfe ? 5 : -1; /* frequency */ for(i=0;i<3;i++) { - for(j=0;j<3;j++) - if ((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 ((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 */ + 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 annoying high frequency artifacts */ + bw_code = 50; + } for(ch=0;chnb_channels;ch++) { /* bandwidth for each channel */ - /* 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; + s->chbwcod[ch] = bw_code; + s->nb_coefs[ch] = bw_code * 3 + 73; } - /* initial snr offset */ - s->csnroffst = 40; - - /* 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;jlfe) { + s->nb_coefs[s->lfe_channel] = 7; /* fixed */ } - bndtab[50] = 0; + /* initial snr offset */ + s->coarse_snr_offset = 40; /* mdct init */ fft_init(MDCT_NBITS - 2); @@ -804,7 +698,8 @@ 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; return 0; } @@ -812,19 +707,22 @@ static int AC3_encode_init(AVCodecContext *avctx) /* output the AC3 frame header */ static void output_frame_header(AC3EncodeContext *s, unsigned char *frame) { - init_put_bits(&s->pb, frame, AC3_MAX_CODED_FRAME_SIZE, NULL, NULL); + init_put_bits(&s->pb, frame, AC3_MAX_CODED_FRAME_SIZE); 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 == 2) { + 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, 0); /* no LFE */ + put_bits(&s->pb, 1, s->lfe); /* LFE */ put_bits(&s->pb, 5, 31); /* dialog norm: -31 db */ put_bits(&s->pb, 1, 0); /* no compression control word */ put_bits(&s->pb, 1, 0); /* no lang code */ @@ -833,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 */ @@ -842,10 +740,12 @@ static inline int sym_quant(int c, int e, int levels) int v; if (c >= 0) { - v = (levels * (c << e)) >> 25; + v = (levels * (c << e)) >> 24; + v = (v + 1) >> 1; v = (levels >> 1) + v; } else { - v = (levels * ((-c) << e)) >> 25; + v = (levels * ((-c) << e)) >> 24; + v = (v + 1) >> 1; v = (levels >> 1) - v; } assert (v >= 0 && v < levels); @@ -874,24 +774,24 @@ static inline int asym_quant(int c, int e, int qbits) /* Output one audio block. There are NB_BLOCKS audio blocks in one AC3 frame */ static void output_audio_block(AC3EncodeContext *s, - UINT8 exp_strategy[AC3_MAX_CHANNELS], - UINT8 encoded_exp[AC3_MAX_CHANNELS][N/2], - UINT8 bap[AC3_MAX_CHANNELS][N/2], - INT32 mdct_coefs[AC3_MAX_CHANNELS][N/2], - INT8 global_exp[AC3_MAX_CHANNELS], + uint8_t exp_strategy[AC3_MAX_CHANNELS], + uint8_t encoded_exp[AC3_MAX_CHANNELS][N/2], + uint8_t bap[AC3_MAX_CHANNELS][N/2], + int32_t mdct_coefs[AC3_MAX_CHANNELS][N/2], + int8_t global_exp[AC3_MAX_CHANNELS], int block_num) { - int ch, nb_groups, group_size, i, baie; - UINT8 *p; - UINT16 qmant[AC3_MAX_CHANNELS][N/2]; + int ch, nb_groups, group_size, i, baie, rbnd; + uint8_t *p; + uint16_t qmant[AC3_MAX_CHANNELS][N/2]; int exp0, exp1; int mant1_cnt, mant2_cnt, mant4_cnt; - UINT16 *qmant1_ptr, *qmant2_ptr, *qmant4_ptr; + 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) { @@ -903,28 +803,46 @@ static void output_audio_block(AC3EncodeContext *s, put_bits(&s->pb, 1, 0); /* no new coupling strategy */ } - if (s->acmod == 2) { - put_bits(&s->pb, 1, 0); /* no matrixing (but should be used in the future) */ - } + 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 defined(DEBUG) +#if defined(DEBUG) { - static int count = 0; - printf("Block #%d (%d)\n", block_num, count++); + static int count = 0; + av_log(NULL, AV_LOG_DEBUG, "Block #%d (%d)\n", block_num, count++); } #endif /* exponent strategy */ 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]); + } + 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_channels; ch++) { + for (ch = 0; ch < s->nb_all_channels; ch++) { switch(exp_strategy[ch]) { case EXP_REUSE: continue; @@ -967,30 +885,31 @@ static void output_audio_block(AC3EncodeContext *s, put_bits(&s->pb, 7, ((delta0 * 5 + delta1) * 5) + delta2); } - 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); - for(ch=0;chnb_channels;ch++) { - put_bits(&s->pb, 4, s->fsnroffst[ch]); - put_bits(&s->pb, 3, s->fgaincod[ch]); + put_bits(&s->pb, 6, s->coarse_snr_offset); + for(ch=0;chnb_all_channels;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 */ @@ -1002,7 +921,7 @@ static void output_audio_block(AC3EncodeContext *s, mant1_cnt = mant2_cnt = mant4_cnt = 0; qmant1_ptr = qmant2_ptr = qmant4_ptr = NULL; - for (ch = 0; ch < s->nb_channels; ch++) { + for (ch = 0; ch < s->nb_all_channels; ch++) { int b, c, e, v; for(i=0;inb_coefs[ch];i++) { @@ -1089,9 +1008,9 @@ static void output_audio_block(AC3EncodeContext *s, } /* second pass : output the values */ - for (ch = 0; ch < s->nb_channels; ch++) { + 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]; @@ -1099,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: @@ -1127,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 *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; @@ -1187,7 +1079,7 @@ static unsigned int pow_poly(unsigned int a, unsigned int n, unsigned int poly) /* compute log2(max(abs(tab[]))) */ -static int log2_tab(INT16 *tab, int n) +static int log2_tab(int16_t *tab, int n) { int i, v; @@ -1198,7 +1090,7 @@ static int log2_tab(INT16 *tab, int n) return av_log2(v); } -static void lshift_tab(INT16 *tab, int n, int lshift) +static void lshift_tab(int16_t *tab, int n, int lshift) { int i; @@ -1218,87 +1110,89 @@ static void lshift_tab(INT16 *tab, int n, int lshift) static int output_frame_end(AC3EncodeContext *s) { int frame_size, frame_size_58, n, crc1, crc2, crc_inv; - UINT8 *frame; + 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 - (s->pb.buf_ptr - frame) - 2; + n = 2 * s->frame_size - (pbBufPtr(&s->pb) - frame) - 2; assert(n >= 0); - memset(s->pb.buf_ptr, 0, n); - + 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; } -int AC3_encode_frame(AVCodecContext *avctx, - unsigned char *frame, int buf_size, void *data) +static int AC3_encode_frame(AVCodecContext *avctx, + unsigned char *frame, int buf_size, void *data) { AC3EncodeContext *s = avctx->priv_data; - short *samples = data; + int16_t *samples = data; int i, j, k, v, ch; - INT16 input_samples[N]; - INT32 mdct_coef[NB_BLOCKS][AC3_MAX_CHANNELS][N/2]; - UINT8 exp[NB_BLOCKS][AC3_MAX_CHANNELS][N/2]; - UINT8 exp_strategy[NB_BLOCKS][AC3_MAX_CHANNELS]; - UINT8 encoded_exp[NB_BLOCKS][AC3_MAX_CHANNELS][N/2]; - UINT8 bap[NB_BLOCKS][AC3_MAX_CHANNELS][N/2]; - INT8 exp_samples[NB_BLOCKS][AC3_MAX_CHANNELS]; + 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;chnb_channels;ch++) { + for(ch=0;chnb_all_channels;ch++) { /* fixed mdct to the six sub blocks & exponent computation */ for(i=0;ilast_samples[ch], N/2 * sizeof(INT16)); - sinc = s->nb_channels; + memcpy(input_samples, s->last_samples[ch], N/2 * sizeof(int16_t)); + sinc = s->nb_all_channels; sptr = samples + (sinc * (N/2) * i) + ch; 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 EXP_REUSE case must be handled carefully : we select the @@ -1330,32 +1224,48 @@ 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)); + 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 && 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;icoded_frame); + return 0; +} + #if 0 /*************************************************************************/ /* TEST */ +#undef random #define FN (N/4) void fft_test(void) @@ -1382,15 +1292,15 @@ void fft_test(void) sum_re += in1[n].re * cos(a) - in1[n].im * sin(a); sum_im += in1[n].re * sin(a) + in1[n].im * cos(a); } - printf("%3d: %6d,%6d %6.0f,%6.0f\n", - k, in[k].re, in[k].im, sum_re / FN, sum_im / FN); + printf("%3d: %6d,%6d %6.0f,%6.0f\n", + k, in[k].re, in[k].im, sum_re / FN, sum_im / FN); } } void mdct_test(void) { - INT16 input[N]; - INT32 output[N/2]; + int16_t input[N]; + int32_t output[N/2]; float input1[N]; float output1[N/2]; float s, a, err, e, emax; @@ -1402,7 +1312,7 @@ void mdct_test(void) } mdct512(output, input); - + /* do it by hand */ for(k=0;k