diff --git a/libavcodec/ac3.c b/libavcodec/ac3.c index 019c7769d6..a1c46c6d2e 100644 --- a/libavcodec/ac3.c +++ b/libavcodec/ac3.c @@ -181,6 +181,11 @@ void ac3_parametric_bit_allocation(AC3BitAllocParameters *s, uint8_t *bap, } 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 @@ void ac3_common_init(void) 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 --git a/libavcodec/ac3.h b/libavcodec/ac3.h index 21cc07044e..28c7f03956 100644 --- a/libavcodec/ac3.h +++ b/libavcodec/ac3.h @@ -45,6 +45,8 @@ typedef struct AC3BitAllocParameters { 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 --git a/libavcodec/ac3enc.c b/libavcodec/ac3enc.c index 4037b91528..623541d23b 100644 --- a/libavcodec/ac3enc.c +++ b/libavcodec/ac3enc.c @@ -611,6 +611,8 @@ static int AC3_encode_init(AVCodecContext *avctx) avctx->frame_size = AC3_FRAME_SIZE; + ac3_common_init(); + /* number of channels */ if (channels < 1 || channels > 6) return -1; @@ -644,7 +646,7 @@ static int AC3_encode_init(AVCodecContext *avctx) 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 @@ static int AC3_encode_init(AVCodecContext *avctx) /* 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 @@ static int ac3_sync(const uint8_t *buf, int *channels, int *sample_rate, 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 @@ static int ac3_sync(const uint8_t *buf, int *channels, int *sample_rate, 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 @@ static int ac3_sync(const uint8_t *buf, int *channels, int *sample_rate, *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 @@ static int ac3_parse_init(AVCodecParserContext *s1) s->inbuf_ptr = s->inbuf; s->header_size = AC3_HEADER_SIZE; s->sync = ac3_sync; + ac3_common_init(); return 0; } #endif