Index: libavcodec/ac3dec.c =================================================================== --- libavcodec/ac3dec.c (revision 14819) +++ libavcodec/ac3dec.c (working copy) @@ -1,8 +1,10 @@ /* * AC-3 Audio Decoder - * This code is developed as part of Google Summer of Code 2006 Program. + * This code was developed as part of Google Summer of Code 2006. + * E-AC-3 support was added as part of Google Summer of Code 2007. * * Copyright (c) 2006 Kartikey Mahendra BHATT (bhattkm at gmail dot com). + * Copyright (c) 2007-2008 Bartlomiej Wolowiec * Copyright (c) 2007 Justin Ruggles * * Portions of this code are derived from liba52 @@ -37,8 +39,8 @@ #include "ac3dec.h" #include "ac3dec_data.h" -/** Maximum possible frame size when the specification limit is ignored */ -#define AC3_MAX_FRAME_SIZE 21695 +/** Large enough for maximum possible frame size when the specification limit is ignored */ +#define AC3_FRAME_BUFFER_SIZE 32768 /** * table for ungrouping 3 values in 7 bits. @@ -215,7 +217,7 @@ /* allocate context input buffer */ if (avctx->error_resilience >= FF_ER_CAREFUL) { - s->input_buffer = av_mallocz(AC3_MAX_FRAME_SIZE + FF_INPUT_BUFFER_PADDING_SIZE); + s->input_buffer = av_mallocz(AC3_FRAME_BUFFER_SIZE + FF_INPUT_BUFFER_PADDING_SIZE); if (!s->input_buffer) return AVERROR_NOMEM; } @@ -302,10 +304,22 @@ s->channel_in_cpl[s->lfe_ch] = 0; } - if(hdr.bitstream_id > 10) - return AC3_PARSE_ERROR_BSID; - + if (hdr.bitstream_id <= 10) { + s->eac3 = 0; + s->snr_offset_strategy = 2; + s->block_switch_syntax = 1; + s->dither_flag_syntax = 1; + s->bit_allocation_syntax = 1; + s->fast_gain_syntax = 0; + s->first_cpl_leak = 0; + s->dba_syntax = 1; + s->skip_syntax = 1; + memset(s->channel_uses_aht, 0, sizeof(s->channel_uses_aht)); return ac3_parse_header(s); + } else { + s->eac3 = 1; + return ff_eac3_parse_header(s); + } } /** @@ -428,7 +442,7 @@ * Get the transform coefficients for a particular channel * reference: Section 7.3 Quantization and Decoding of Mantissas */ -static void get_transform_coeffs_ch(AC3DecodeContext *s, int ch_index, mant_groups *m) +static void ac3_get_transform_coeffs_ch(AC3DecodeContext *s, int ch_index, mant_groups *m) { GetBitContext *gbc = &s->gbc; int i, gcode, tbap, start, end; @@ -533,10 +547,27 @@ } } +static void get_transform_coeffs_ch(AC3DecodeContext *s, int blk, int ch, + mant_groups *m) +{ + if (!s->channel_uses_aht[ch]) { + ac3_get_transform_coeffs_ch(s, ch, m); + } else { + /* if AHT is used, mantissas for all blocks are encoded in the first + block of the frame. */ + int bin; + if (!blk) + ff_eac3_get_transform_coeffs_aht_ch(s, ch); + for (bin = s->start_freq[ch]; bin < s->end_freq[ch]; bin++) { + s->fixed_coeffs[ch][bin] = s->pre_mantissa[ch][bin][blk] >> s->dexps[ch][bin]; + } + } +} + /** * Get the transform coefficients. */ -static void get_transform_coeffs(AC3DecodeContext *s) +static void get_transform_coeffs(AC3DecodeContext *s, int blk) { int ch, end; int got_cplchan = 0; @@ -546,12 +577,12 @@ for (ch = 1; ch <= s->channels; ch++) { /* transform coefficients for full-bandwidth channel */ - get_transform_coeffs_ch(s, ch, &m); + get_transform_coeffs_ch(s, blk, ch, &m); /* tranform coefficients for coupling channel come right after the coefficients for the first coupled channel*/ if (s->channel_in_cpl[ch]) { if (!got_cplchan) { - get_transform_coeffs_ch(s, CPL_CH, &m); + get_transform_coeffs_ch(s, blk, CPL_CH, &m); calc_transform_coeffs_cpl(s); got_cplchan = 1; } @@ -657,7 +688,7 @@ */ static void ac3_upmix_delay(AC3DecodeContext *s) { - int channel_data_size = 128*sizeof(float); + int channel_data_size = sizeof(s->delay[0]); switch(s->channel_mode) { case AC3_CHMODE_DUALMONO: case AC3_CHMODE_STEREO: @@ -698,19 +729,23 @@ /* block switch flags */ different_transforms = 0; + if (s->block_switch_syntax) { for (ch = 1; ch <= fbw_channels; ch++) { s->block_switch[ch] = get_bits1(gbc); if(ch > 1 && s->block_switch[ch] != s->block_switch[1]) different_transforms = 1; } + } /* dithering flags */ + if (s->dither_flag_syntax) { s->dither_all = 1; for (ch = 1; ch <= fbw_channels; ch++) { s->dither_flag[ch] = get_bits1(gbc); if(!s->dither_flag[ch]) s->dither_all = 0; } + } /* dynamic range */ i = !(s->channel_mode); @@ -723,9 +758,23 @@ } } while(i--); + /* spectral extension strategy */ + if (s->eac3 && (!blk || get_bits1(gbc))) { + if (get_bits1(gbc)) { + av_log_missing_feature(s->avctx, "Spectral extension", 1); + return -1; + } + /* TODO: parse spectral extension strategy info */ + } + + /* TODO: spectral extension coordinates */ + /* coupling strategy */ - if (get_bits1(gbc)) { + if (!s->eac3) + s->cpl_strategy_exists[blk] = get_bits1(gbc); + if (s->cpl_strategy_exists[blk]) { memset(bit_alloc_stages, 3, AC3_MAX_CHANNELS); + if (!s->eac3) s->cpl_in_use[blk] = get_bits1(gbc); if (s->cpl_in_use[blk]) { /* coupling in use */ @@ -736,15 +785,28 @@ return -1; } + /* check for enhanced coupling */ + if (s->eac3 && get_bits1(gbc)) { + /* TODO: parse enhanced coupling strategy info */ + av_log_missing_feature(s->avctx, "Enhanced coupling", 1); + return -1; + } + /* determine which channels are coupled */ + if (s->eac3 && s->channel_mode == AC3_CHMODE_STEREO) { + s->channel_in_cpl[1] = 1; + s->channel_in_cpl[2] = 1; + } else { for (ch = 1; ch <= fbw_channels; ch++) s->channel_in_cpl[ch] = get_bits1(gbc); + } /* phase flags in use */ if (channel_mode == AC3_CHMODE_STEREO) s->phase_flags_in_use = get_bits1(gbc); - /* coupling frequency range and band structure */ + /* coupling frequency range */ + /* TODO: modify coupling end freq if spectral extension is used */ cpl_begin_freq = get_bits(gbc, 4); cpl_end_freq = get_bits(gbc, 4); if (3 + cpl_end_freq - cpl_begin_freq < 0) { @@ -754,24 +816,40 @@ s->num_cpl_bands = s->num_cpl_subbands = 3 + cpl_end_freq - cpl_begin_freq; s->start_freq[CPL_CH] = cpl_begin_freq * 12 + 37; s->end_freq[CPL_CH] = cpl_end_freq * 12 + 73; + + /* coupling band structure */ + if (!s->eac3 || get_bits1(gbc)) { for (bnd = 0; bnd < s->num_cpl_subbands - 1; bnd++) { - if (get_bits1(gbc)) { - s->cpl_band_struct[bnd] = 1; - s->num_cpl_bands--; + s->cpl_band_struct[bnd] = get_bits1(gbc); } + } else if (!blk) { + for (bnd = 0; bnd < s->num_cpl_subbands - 1; bnd++) { + s->cpl_band_struct[bnd] = ff_eac3_default_cpl_band_struct[bnd+cpl_begin_freq+1]; + } } s->cpl_band_struct[s->num_cpl_subbands-1] = 0; + + /* calculate number of coupling bands based on band structure */ + for (bnd = 0; bnd < s->num_cpl_subbands-1; bnd++) { + s->num_cpl_bands -= s->cpl_band_struct[bnd]; + } } else { /* coupling not in use */ - for (ch = 1; ch <= fbw_channels; ch++) + for (ch = 1; ch <= fbw_channels; ch++) { s->channel_in_cpl[ch] = 0; + s->first_cpl_coords[ch] = 1; + } + s->first_cpl_leak = 1; + s->phase_flags_in_use = 0; } - } else if (!blk) { + } else if (!s->eac3) { + if(!blk) { av_log(s->avctx, AV_LOG_ERROR, "new coupling strategy must be present in block 0\n"); return -1; } else { s->cpl_in_use[blk] = s->cpl_in_use[blk-1]; } + } cpl_in_use = s->cpl_in_use[blk]; /* coupling coordinates */ @@ -780,7 +858,17 @@ for (ch = 1; ch <= fbw_channels; ch++) { if (s->channel_in_cpl[ch]) { - if (get_bits1(gbc)) { + int new_cpl_coords = 0; + + /* determine if coupling coordinates are new or reused */ + if (s->eac3 && s->first_cpl_coords[ch]) { + new_cpl_coords = 1; + s->first_cpl_coords[ch] = 0; + } else { + new_cpl_coords = get_bits1(gbc); + } + + if (new_cpl_coords) { int master_cpl_coord, cpl_coord_exp, cpl_coord_mant; cpl_coords_exist = 1; master_cpl_coord = 3 * get_bits(gbc, 2); @@ -797,6 +885,9 @@ av_log(s->avctx, AV_LOG_ERROR, "new coupling coordinates must be present in block 0\n"); return -1; } + } else { + /* channel not in coupling */ + s->first_cpl_coords[ch] = 1; } } /* phase flags */ @@ -809,7 +900,7 @@ /* stereo rematrixing strategy and band structure */ if (channel_mode == AC3_CHMODE_STEREO) { - if (get_bits1(gbc)) { + if ((s->eac3 && !blk) || get_bits1(gbc)) { s->num_rematrixing_bands = 4; if(cpl_in_use && s->start_freq[CPL_CH] <= 61) s->num_rematrixing_bands -= 1 + (s->start_freq[CPL_CH] == 37); @@ -822,10 +913,14 @@ } /* exponent strategies for each channel */ - s->exp_strategy[blk][CPL_CH] = EXP_REUSE; - s->exp_strategy[blk][s->lfe_ch] = EXP_REUSE; + if (!s->eac3) { + for (ch = !cpl_in_use; ch <= s->channels; ch++) { + s->exp_strategy[blk][ch] = get_bits(gbc, 2 - (ch == s->lfe_ch)); + } + } + + /* check exponent strategies to set bit allocation stages */ for (ch = !cpl_in_use; ch <= s->channels; ch++) { - s->exp_strategy[blk][ch] = get_bits(gbc, 2 - (ch == s->lfe_ch)); if(s->exp_strategy[blk][ch] != EXP_REUSE) bit_alloc_stages[ch] = 3; } @@ -852,7 +947,7 @@ memset(bit_alloc_stages, 3, AC3_MAX_CHANNELS); } } - if (cpl_in_use && s->exp_strategy[blk][CPL_CH] != EXP_REUSE) { + if (cpl_in_use) { s->num_exp_groups[CPL_CH] = (s->end_freq[CPL_CH] - s->start_freq[CPL_CH]) / (3 << (s->exp_strategy[blk][CPL_CH] - 1)); } @@ -870,6 +965,7 @@ } /* bit allocation information */ + if (s->bit_allocation_syntax) { if (get_bits1(gbc)) { s->bit_alloc_params.slow_decay = ff_ac3_slow_decay_tab[get_bits(gbc, 2)] >> s->bit_alloc_params.sr_shift; s->bit_alloc_params.fast_decay = ff_ac3_fast_decay_tab[get_bits(gbc, 2)] >> s->bit_alloc_params.sr_shift; @@ -882,35 +978,78 @@ av_log(s->avctx, AV_LOG_ERROR, "new bit allocation info must be present in block 0\n"); return -1; } + } /* signal-to-noise ratio offsets and fast gains (signal-to-mask ratios) */ - if (get_bits1(gbc)) { + if (s->snr_offset_strategy && (!s->eac3 || !blk) && get_bits1(gbc)) { + int snr = 0; int csnr; csnr = (get_bits(gbc, 6) - 15) << 4; - for (ch = !cpl_in_use; ch <= s->channels; ch++) { /* snr offset and fast gain */ - s->snr_offset[ch] = (csnr + get_bits(gbc, 4)) << 2; - s->fast_gain[ch] = ff_ac3_fast_gain_tab[get_bits(gbc, 3)]; + for (i = ch = !cpl_in_use; ch <= s->channels; ch++) { + /* snr offset */ + if (ch == i || s->snr_offset_strategy == 2) + snr = (csnr + get_bits(gbc, 4)) << 2; + /* run at least last bit allocation stage if snr offset changes */ + if(blk && s->snr_offset[ch] != snr) { + bit_alloc_stages[ch] = FFMAX(bit_alloc_stages[ch], 1); + } + s->snr_offset[ch] = snr; + + /* fast gain (normal AC-3 only) */ + if (!s->eac3) { + int prev = s->fast_gain[ch]; + s->fast_gain[ch] = ff_ac3_fast_gain_tab[get_bits(gbc, 3)]; + /* run last 2 bit allocation stages if fast gain changes */ + if(blk && prev != s->fast_gain[ch]) + bit_alloc_stages[ch] = FFMAX(bit_alloc_stages[ch], 2); + } } - memset(bit_alloc_stages, 3, AC3_MAX_CHANNELS); - } else if (!blk) { + } else if (!s->eac3 && !blk) { av_log(s->avctx, AV_LOG_ERROR, "new snr offsets must be present in block 0\n"); return -1; } + /* fast gain (E-AC-3 only) */ + if (s->fast_gain_syntax && get_bits1(gbc)) { + for (ch = !cpl_in_use; ch <= s->channels; ch++) { + int prev = s->fast_gain[ch]; + s->fast_gain[ch] = ff_ac3_fast_gain_tab[get_bits(gbc, 3)]; + /* run last 2 bit allocation stages if fast gain changes */ + if(blk && prev != s->fast_gain[ch]) + bit_alloc_stages[ch] = FFMAX(bit_alloc_stages[ch], 2); + } + } else if (s->eac3 && !blk) { + for (ch = !cpl_in_use; ch <= s->channels; ch++) + s->fast_gain[ch] = ff_ac3_fast_gain_tab[4]; + } + + /* E-AC-3 to AC-3 converter SNR offset */ + if (s->frame_type == EAC3_FRAME_TYPE_INDEPENDENT && get_bits1(gbc)) { + skip_bits(gbc, 10); // skip converter snr offset + } + /* coupling leak information */ if (cpl_in_use) { - if (get_bits1(gbc)) { + if (s->first_cpl_leak || get_bits1(gbc)) { + int prev_fl = s->bit_alloc_params.cpl_fast_leak; + int prev_sl = s->bit_alloc_params.cpl_slow_leak; s->bit_alloc_params.cpl_fast_leak = get_bits(gbc, 3); s->bit_alloc_params.cpl_slow_leak = get_bits(gbc, 3); + /* run last 2 bit allocation stages for coupling channel if + coupling leak changes */ + if(blk && (prev_fl != s->bit_alloc_params.cpl_fast_leak || + prev_sl != s->bit_alloc_params.cpl_slow_leak)) { bit_alloc_stages[CPL_CH] = FFMAX(bit_alloc_stages[CPL_CH], 2); - } else if (!blk) { + } + } else if (!s->eac3 && !blk) { av_log(s->avctx, AV_LOG_ERROR, "new coupling leak info must be present in block 0\n"); return -1; } + s->first_cpl_leak = 0; } /* delta bit allocation information */ - if (get_bits1(gbc)) { + if (s->dba_syntax && get_bits1(gbc)) { /* delta bit allocation exists (strategy) */ for (ch = !cpl_in_use; ch <= fbw_channels; ch++) { s->dba_mode[ch] = get_bits(gbc, 2); @@ -959,16 +1098,18 @@ } if(bit_alloc_stages[ch] > 0) { /* Compute bit allocation */ + const uint8_t *bap_tab = s->channel_uses_aht[ch] ? + ff_eac3_hebap_tab : ff_ac3_bap_tab; ff_ac3_bit_alloc_calc_bap(s->mask[ch], s->psd[ch], s->start_freq[ch], s->end_freq[ch], s->snr_offset[ch], s->bit_alloc_params.floor, - ff_ac3_bap_tab, s->bap[ch]); + bap_tab, s->bap[ch]); } } /* unused dummy data */ - if (get_bits1(gbc)) { + if (s->skip_syntax && get_bits1(gbc)) { int skipl = get_bits(gbc, 9); while(skipl--) skip_bits(gbc, 8); @@ -976,8 +1117,12 @@ /* unpack the transform coefficients this also uncouples channels if coupling is in use. */ - get_transform_coeffs(s); + get_transform_coeffs(s, blk); + /* TODO: generate enhanced coupling coordinates and uncouple */ + + /* TODO: apply spectral extension */ + /* recover coefficients if rematrixing is in use */ if(s->channel_mode == AC3_CHMODE_STEREO) do_rematrixing(s); @@ -1042,7 +1187,7 @@ if (s->input_buffer) { /* copy input buffer to decoder context to avoid reading past the end of the buffer, which can be caused by a damaged input stream. */ - memcpy(s->input_buffer, buf, FFMIN(buf_size, AC3_MAX_FRAME_SIZE)); + memcpy(s->input_buffer, buf, FFMIN(buf_size, AC3_FRAME_BUFFER_SIZE)); init_get_bits(&s->gbc, s->input_buffer, buf_size * 8); } else { init_get_bits(&s->gbc, buf, buf_size * 8); @@ -1161,5 +1306,5 @@ .init = ac3_decode_init, .close = ac3_decode_end, .decode = ac3_decode_frame, - .long_name = NULL_IF_CONFIG_SMALL("ATSC A/52 / AC-3"), + .long_name = NULL_IF_CONFIG_SMALL("ATSC A/52 (AC-3, E-AC-3)"), }; Index: libavcodec/ac3dec.h =================================================================== --- libavcodec/ac3dec.h (revision 14819) +++ libavcodec/ac3dec.h (working copy) @@ -168,4 +168,16 @@ ///@} } AC3DecodeContext; +/** + * Parse the E-AC-3 frame header. + * This parses both the bit stream info and audio frame header. + */ +int ff_eac3_parse_header(AC3DecodeContext *s); + +/** + * Decode mantissas in a single channel for the entire frame. + * This is used when AHT mode is enabled. + */ +void ff_eac3_get_transform_coeffs_aht_ch(AC3DecodeContext *s, int ch); + #endif /* FFMPEG_AC3DEC_H */ Index: libavcodec/Makefile =================================================================== --- libavcodec/Makefile (revision 14819) +++ libavcodec/Makefile (working copy) @@ -26,7 +26,7 @@ OBJS-$(CONFIG_ENCODERS) += faandct.o jfdctfst.o jfdctint.o OBJS-$(CONFIG_AASC_DECODER) += aasc.o -OBJS-$(CONFIG_AC3_DECODER) += ac3dec.o ac3tab.o ac3dec_data.o ac3.o mdct.o fft.o +OBJS-$(CONFIG_AC3_DECODER) += eac3dec.o ac3dec.o ac3tab.o ac3dec_data.o ac3.o mdct.o fft.o OBJS-$(CONFIG_AC3_ENCODER) += ac3enc.o ac3tab.o ac3.o OBJS-$(CONFIG_ALAC_DECODER) += alac.o OBJS-$(CONFIG_AMV_DECODER) += sp5xdec.o mjpegdec.o mjpeg.o Index: libavcodec/ac3enc.c =================================================================== --- libavcodec/ac3enc.c (revision 14819) +++ libavcodec/ac3enc.c (working copy) @@ -1365,5 +1365,5 @@ AC3_encode_close, NULL, .sample_fmts = (enum SampleFormat[]){SAMPLE_FMT_S16,SAMPLE_FMT_NONE}, - .long_name = NULL_IF_CONFIG_SMALL("ATSC A/52 / AC-3"), + .long_name = NULL_IF_CONFIG_SMALL("ATSC A/52 (AC-3, E-AC-3)"), };