# HG changeset patch # User jbr # Date 1173579185 0 # Node ID 056127e5df897401b0d493a3ed3d155e2e0ff8d5 # Parent 414d484f6483f3ba8770a568c613a509c6ff81a5 remove redundancy in AC-3 parser by using common tables from ac3tab.h diff -r 414d484f6483 -r 056127e5df89 ac3.c --- a/ac3.c Sat Mar 10 09:20:07 2007 +0000 +++ b/ac3.c Sun Mar 11 02:13:05 2007 +0000 @@ -181,6 +181,11 @@ } while (end > bndtab[j++]); } +/** + * Initializes some tables. + * note: This function must remain thread safe because it is called by the + * AVParser init code. + */ void ac3_common_init(void) { int i, j, k, l, v; @@ -194,4 +199,12 @@ l += v; } bndtab[50] = l; + + /* generate ff_ac3_frame_sizes table */ + for(i=0; i<38; i++) { + int br = ff_ac3_bitratetab[i >> 1]; + ff_ac3_frame_sizes[i][0] = ( 2*br ); + ff_ac3_frame_sizes[i][1] = (320*br / 147) + (i & 1); + ff_ac3_frame_sizes[i][2] = ( 3*br ); + } } diff -r 414d484f6483 -r 056127e5df89 ac3.h --- a/ac3.h Sat Mar 10 09:20:07 2007 +0000 +++ b/ac3.h Sun Mar 11 02:13:05 2007 +0000 @@ -45,6 +45,8 @@ int cplfleak, cplsleak; } AC3BitAllocParameters; +extern uint16_t ff_ac3_frame_sizes[38][3]; +extern const uint8_t ff_ac3_channels[8]; extern const uint16_t ff_ac3_freqs[3]; extern const uint16_t ff_ac3_bitratetab[19]; extern const int16_t ff_ac3_window[256]; diff -r 414d484f6483 -r 056127e5df89 ac3enc.c --- a/ac3enc.c Sat Mar 10 09:20:07 2007 +0000 +++ b/ac3enc.c Sun Mar 11 02:13:05 2007 +0000 @@ -611,6 +611,8 @@ avctx->frame_size = AC3_FRAME_SIZE; + ac3_common_init(); + /* number of channels */ if (channels < 1 || channels > 6) return -1; @@ -644,7 +646,7 @@ return -1; s->bit_rate = bitrate; s->frmsizecod = i << 1; - s->frame_size_min = (bitrate * 1000 * AC3_FRAME_SIZE) / (freq * 16); + s->frame_size_min = ff_ac3_frame_sizes[s->frmsizecod][s->fscod]; s->bits_written = 0; s->samples_written = 0; s->frame_size = s->frame_size_min; @@ -663,8 +665,6 @@ /* initial snr offset */ s->csnroffst = 40; - ac3_common_init(); - /* mdct init */ fft_init(MDCT_NBITS - 2); for(i=0;i 37) return 0; skip_bits(&bits, 5); /* bsid */ @@ -687,12 +634,12 @@ lfeon = get_bits1(&bits); halfratecod = FFMAX(bsid, 8) - 8; - *sample_rate = ac3_sample_rates[fscod] >> halfratecod; - *bit_rate = (ac3_bitrates[frmsizecod] * 1000) >> halfratecod; - *channels = ac3_channels[acmod] + lfeon; + *sample_rate = ff_ac3_freqs[fscod] >> halfratecod; + *bit_rate = (ff_ac3_bitratetab[frmsizecod] * 1000) >> halfratecod; + *channels = ff_ac3_channels[acmod] + lfeon; *samples = 6 * 256; - return ac3_frame_sizes[frmsizecod][fscod] * 2; + return ff_ac3_frame_sizes[frmsizecod][fscod] * 2; } else if (bsid > 10 && bsid <= 16) { /* Enhanced AC-3 */ strmtyp = get_bits(&bits, 2); substreamid = get_bits(&bits, 3); @@ -709,11 +656,11 @@ if(fscod2 == 3) return 0; - *sample_rate = ac3_sample_rates[fscod2] / 2; + *sample_rate = ff_ac3_freqs[fscod2] / 2; } else { numblkscod = get_bits(&bits, 2); - *sample_rate = ac3_sample_rates[fscod]; + *sample_rate = ff_ac3_freqs[fscod]; } acmod = get_bits(&bits, 3); @@ -721,7 +668,7 @@ *samples = eac3_blocks[numblkscod] * 256; *bit_rate = frmsiz * (*sample_rate) * 16 / (*samples); - *channels = ac3_channels[acmod] + lfeon; + *channels = ff_ac3_channels[acmod] + lfeon; return frmsiz * 2; } @@ -780,6 +727,7 @@ s->inbuf_ptr = s->inbuf; s->header_size = AC3_HEADER_SIZE; s->sync = ac3_sync; + ac3_common_init(); return 0; } #endif