* 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) 2006 Kartikey Mahendra BHATT (bhattkm at gmail dot com)
* Copyright (c) 2007-2008 Bartlomiej Wolowiec <bartek.wolowiec@gmail.com>
* Copyright (c) 2007 Justin Ruggles <justin.ruggles@gmail.com>
*
#include <string.h>
#include "libavutil/crc.h"
+#include "internal.h"
+#include "aac_ac3_parser.h"
#include "ac3_parser.h"
#include "ac3dec.h"
#include "ac3dec_data.h"
/* get decoding parameters from header info */
s->bit_alloc_params.sr_code = hdr.sr_code;
s->channel_mode = hdr.channel_mode;
+ s->channel_layout = hdr.channel_layout;
s->lfe_on = hdr.lfe_on;
s->bit_alloc_params.sr_shift = hdr.sr_shift;
s->sample_rate = hdr.sample_rate;
* Decode the grouped exponents according to exponent strategy.
* reference: Section 7.1.3 Exponent Decoding
*/
-static void decode_exponents(GetBitContext *gbc, int exp_strategy, int ngrps,
- uint8_t absexp, int8_t *dexps)
+static int decode_exponents(GetBitContext *gbc, int exp_strategy, int ngrps,
+ uint8_t absexp, int8_t *dexps)
{
int i, j, grp, group_size;
int dexp[256];
/* convert to absolute exps and expand groups */
prevexp = absexp;
- for(i=0; i<ngrps*3; i++) {
- prevexp = av_clip(prevexp + dexp[i]-2, 0, 24);
- for(j=0; j<group_size; j++) {
- dexps[(i*group_size)+j] = prevexp;
+ for(i=0,j=0; i<ngrps*3; i++) {
+ prevexp += dexp[i] - 2;
+ if (prevexp > 24U)
+ return -1;
+ switch (group_size) {
+ case 4: dexps[j++] = prevexp;
+ dexps[j++] = prevexp;
+ case 2: dexps[j++] = prevexp;
+ case 1: dexps[j++] = prevexp;
}
}
+ return 0;
}
/**
int ecpl, int start_subband, int end_subband,
const uint8_t *default_band_struct,
uint8_t *band_struct, int *num_subbands,
- int *num_bands, int *band_sizes)
+ int *num_bands, uint8_t *band_sizes)
{
- int subbnd, bnd, n_subbands, n_bands, bnd_sz[22];
+ int subbnd, bnd, n_subbands, n_bands=0;
+ uint8_t bnd_sz[22];
n_subbands = end_subband - start_subband;
if (num_bands)
*num_bands = n_bands;
if (band_sizes)
- memcpy(band_sizes, bnd_sz, sizeof(int)*n_bands);
+ memcpy(band_sizes, bnd_sz, n_bands);
}
/**
/* spectral extension strategy */
if (s->eac3 && (!blk || get_bits1(gbc))) {
- s->spx_in_use[blk] = get_bits1(gbc);
- if (s->spx_in_use[blk]) {
- int begf, endf;
- int spx_end_subband;
-
- /* determine which channels use spx */
- if (s->channel_mode == AC3_CHMODE_MONO) {
- s->channel_in_spx[1] = 1;
- s->spx_coords_exist[1] = 0;
- } else {
- for (ch = 1; ch <= fbw_channels; ch++) {
- s->channel_in_spx[ch] = get_bits1(gbc);
- s->spx_coords_exist[ch] = 0;
- }
- }
-
- s->spx_copy_start_freq = get_bits(gbc, 2) * 12 + 25;
- begf = get_bits(gbc, 3);
- endf = get_bits(gbc, 3);
- s->spx_start_subband = begf < 6 ? begf+2 : 2*begf-3;
- spx_end_subband = endf < 4 ? endf+5 : 2*endf+3;
- s->num_spx_subbands = spx_end_subband - s->spx_start_subband;
- s->spx_start_freq = s->spx_start_subband * 12 + 25;
- s->spx_end_freq = spx_end_subband * 12 + 25;
-
- decode_band_structure(gbc, blk, s->eac3, 0,
- s->spx_start_subband, spx_end_subband,
- ff_eac3_default_spx_band_struct,
- s->spx_band_struct, NULL, &s->num_spx_bands,
- s->spx_band_sizes);
- } else {
- for (ch = 1; ch <= fbw_channels; ch++) {
- s->channel_in_spx[ch] = 0;
- s->first_spx_coords[ch] = 1;
- }
+ if (get_bits1(gbc)) {
+ ff_log_missing_feature(s->avctx, "Spectral extension", 1);
+ return -1;
}
- } else {
- s->spx_in_use[blk] = blk ? s->spx_in_use[blk-1] : 0;
+ /* TODO: parse spectral extension strategy info */
}
- /* spectral extension coordinates */
- if (s->spx_in_use[blk]) {
- for (ch = 1; ch <= fbw_channels; ch++) {
- if (s->channel_in_spx[ch]) {
- if (s->first_spx_coords[ch] || get_bits1(gbc)) {
- int bin, spx_blend;
- int master_spx_coord;
- s->first_spx_coords[ch] = 0;
- s->spx_coords_exist[ch] = 1;
- spx_blend = get_bits(gbc, 5) << 18;
- master_spx_coord = get_bits(gbc, 2) * 3;
- bin = s->spx_start_freq;
- for (bnd = 0; bnd < s->num_spx_bands; bnd++) {
- int spx_coord_exp, spx_coord_mant;
-
- /* calculate blending factors */
- int bandsize = s->spx_band_sizes[bnd];
- int nratio = (((bin + (bandsize >> 1)) << 23) / s->spx_end_freq) - spx_blend;
- nratio = av_clip(nratio, 0, INT24_MAX);
- s->spx_noise_blend [ch][bnd] = ff_sqrt(( nratio) << 8) * M_SQRT_POW2_15;
- s->spx_signal_blend[ch][bnd] = ff_sqrt((INT24_MAX - nratio) << 8) * M_SQRT_POW2_15;
- bin += bandsize;
-
- /* decode spx coordinates */
- spx_coord_exp = get_bits(gbc, 4);
- spx_coord_mant = get_bits(gbc, 2);
- if (spx_coord_exp == 15)
- s->spx_coords[ch][bnd] = spx_coord_mant << 26;
- else
- s->spx_coords[ch][bnd] = (spx_coord_mant + 4) << 25;
- s->spx_coords[ch][bnd] >>= (spx_coord_exp + master_spx_coord);
- }
- } else {
- s->spx_coords_exist[ch] = 0;
- }
- } else {
- s->first_spx_coords[ch] = 1;
- }
- }
- }
+ /* TODO: spectral extension coordinates */
/* coupling strategy */
if (s->eac3 ? s->cpl_strategy_exists[blk] : get_bits1(gbc)) {
/* 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);
+ ff_log_missing_feature(s->avctx, "Enhanced coupling", 1);
return -1;
}
s->phase_flags_in_use = get_bits1(gbc);
/* coupling frequency range */
+ /* TODO: modify coupling end freq if spectral extension is used */
cpl_start_subband = get_bits(gbc, 4);
- if (s->spx_in_use[blk]) {
- cpl_end_subband = s->spx_start_subband - 1;
- } else {
- cpl_end_subband = get_bits(gbc, 4) + 3;
- }
+ cpl_end_subband = get_bits(gbc, 4) + 3;
s->num_cpl_subbands = cpl_end_subband - cpl_start_subband;
if (s->num_cpl_subbands < 0) {
av_log(s->avctx, AV_LOG_ERROR, "invalid coupling range (%d > %d)\n",
if (channel_mode == AC3_CHMODE_STEREO) {
if ((s->eac3 && !blk) || get_bits1(gbc)) {
s->num_rematrixing_bands = 4;
- if (cpl_in_use) {
- if (s->start_freq[CPL_CH] <= 61)
- s->num_rematrixing_bands -= 1 + (s->start_freq[CPL_CH] == 37);
- } else if (s->spx_in_use[blk]) {
- if (s->spx_start_freq <= 61)
- s->num_rematrixing_bands -= 1 + (s->spx_start_freq <= 37) +
- (s->spx_start_freq <= 25);
- }
+ if(cpl_in_use && s->start_freq[CPL_CH] <= 61)
+ s->num_rematrixing_bands -= 1 + (s->start_freq[CPL_CH] == 37);
for(bnd=0; bnd<s->num_rematrixing_bands; bnd++)
s->rematrixing_flags[bnd] = get_bits1(gbc);
} else if (!blk) {
int prev = s->end_freq[ch];
if (s->channel_in_cpl[ch])
s->end_freq[ch] = s->start_freq[CPL_CH];
- else if (s->channel_in_spx[ch])
- s->end_freq[ch] = s->spx_start_freq;
else {
int bandwidth_code = get_bits(gbc, 6);
if (bandwidth_code > 60) {
for (ch = !cpl_in_use; ch <= s->channels; ch++) {
if (s->exp_strategy[blk][ch] != EXP_REUSE) {
s->dexps[ch][0] = get_bits(gbc, 4) << !ch;
- decode_exponents(gbc, s->exp_strategy[blk][ch],
- s->num_exp_groups[ch], s->dexps[ch][0],
- &s->dexps[ch][s->start_freq[ch]+!!ch]);
+ if (decode_exponents(gbc, s->exp_strategy[blk][ch],
+ s->num_exp_groups[ch], s->dexps[ch][0],
+ &s->dexps[ch][s->start_freq[ch]+!!ch])) {
+ av_log(s->avctx, AV_LOG_ERROR, "exponent out-of-range\n");
+ return -1;
+ }
if(ch != CPL_CH && ch != s->lfe_ch)
skip_bits(gbc, 2); /* skip gainrng */
}
if(bit_alloc_stages[ch] > 1) {
/* Compute excitation function, Compute masking curve, and
Apply delta bit allocation */
- ff_ac3_bit_alloc_calc_mask(&s->bit_alloc_params, s->band_psd[ch],
- s->start_freq[ch], s->end_freq[ch],
- s->fast_gain[ch], (ch == s->lfe_ch),
- s->dba_mode[ch], s->dba_nsegs[ch],
- s->dba_offsets[ch], s->dba_lengths[ch],
- s->dba_values[ch], s->mask[ch]);
+ if (ff_ac3_bit_alloc_calc_mask(&s->bit_alloc_params, s->band_psd[ch],
+ s->start_freq[ch], s->end_freq[ch],
+ s->fast_gain[ch], (ch == s->lfe_ch),
+ s->dba_mode[ch], s->dba_nsegs[ch],
+ s->dba_offsets[ch], s->dba_lengths[ch],
+ s->dba_values[ch], s->mask[ch])) {
+ av_log(s->avctx, AV_LOG_ERROR, "error in bit allocation\n");
+ return -1;
+ }
}
if(bit_alloc_stages[ch] > 0) {
/* Compute bit allocation */
/* 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);
- ff_eac3_apply_spectral_extension(s);
-
/* apply scaling to coefficients (headroom, dynrng) */
for(ch=1; ch<=s->channels; ch++) {
float gain = s->mul_bias / 4194304.0f;
* Decode a single AC-3 frame.
*/
static int ac3_decode_frame(AVCodecContext * avctx, void *data, int *data_size,
- const uint8_t *buf, int buf_size)
+ AVPacket *avpkt)
{
+ const uint8_t *buf = avpkt->data;
+ int buf_size = avpkt->size;
AC3DecodeContext *s = avctx->priv_data;
int16_t *out_samples = (int16_t *)data;
int blk, ch, err;
+ const uint8_t *channel_map;
+ const float *output[AC3_MAX_CHANNELS];
/* initialize the GetBitContext with the start of valid AC-3 Frame */
if (s->input_buffer) {
/* check that reported frame size fits in input buffer */
if(s->frame_size > buf_size) {
av_log(avctx, AV_LOG_ERROR, "incomplete frame\n");
- err = AC3_PARSE_ERROR_FRAME_SIZE;
+ err = AAC_AC3_PARSE_ERROR_FRAME_SIZE;
}
/* check for crc mismatch */
- if(err != AC3_PARSE_ERROR_FRAME_SIZE && avctx->error_recognition >= FF_ER_CAREFUL) {
+ if(err != AAC_AC3_PARSE_ERROR_FRAME_SIZE && avctx->error_recognition >= FF_ER_CAREFUL) {
if(av_crc(av_crc_get_table(AV_CRC_16_ANSI), 0, &buf[2], s->frame_size-2)) {
av_log(avctx, AV_LOG_ERROR, "frame CRC mismatch\n");
- err = AC3_PARSE_ERROR_CRC;
+ err = AAC_AC3_PARSE_ERROR_CRC;
}
}
- if(err && err != AC3_PARSE_ERROR_CRC) {
+ if(err && err != AAC_AC3_PARSE_ERROR_CRC) {
switch(err) {
- case AC3_PARSE_ERROR_SYNC:
+ case AAC_AC3_PARSE_ERROR_SYNC:
av_log(avctx, AV_LOG_ERROR, "frame sync error\n");
return -1;
- case AC3_PARSE_ERROR_BSID:
+ case AAC_AC3_PARSE_ERROR_BSID:
av_log(avctx, AV_LOG_ERROR, "invalid bitstream id\n");
break;
- case AC3_PARSE_ERROR_SAMPLE_RATE:
+ case AAC_AC3_PARSE_ERROR_SAMPLE_RATE:
av_log(avctx, AV_LOG_ERROR, "invalid sample rate\n");
break;
- case AC3_PARSE_ERROR_FRAME_SIZE:
+ case AAC_AC3_PARSE_ERROR_FRAME_SIZE:
av_log(avctx, AV_LOG_ERROR, "invalid frame size\n");
break;
- case AC3_PARSE_ERROR_FRAME_TYPE:
+ case AAC_AC3_PARSE_ERROR_FRAME_TYPE:
/* skip frame if CRC is ok. otherwise use error concealment. */
/* TODO: add support for substreams and dependent frames */
if(s->frame_type == EAC3_FRAME_TYPE_DEPENDENT || s->substreamid) {
avctx->request_channels < s->channels) {
s->out_channels = avctx->request_channels;
s->output_mode = avctx->request_channels == 1 ? AC3_CHMODE_MONO : AC3_CHMODE_STEREO;
+ s->channel_layout = ff_ac3_channel_layout_tab[s->output_mode];
}
avctx->channels = s->out_channels;
+ avctx->channel_layout = s->channel_layout;
/* set downmixing coefficients if needed */
if(s->channels != s->out_channels && !((s->output_mode & AC3_OUTPUT_LFEON) &&
}
/* decode the audio blocks */
+ channel_map = ff_ac3_dec_channel_map[s->output_mode & ~AC3_OUTPUT_LFEON][s->lfe_on];
+ for (ch = 0; ch < s->out_channels; ch++)
+ output[ch] = s->output[channel_map[ch]];
for (blk = 0; blk < s->num_blocks; blk++) {
- const float *output[s->out_channels];
if (!err && decode_audio_block(s, blk)) {
av_log(avctx, AV_LOG_ERROR, "error decoding the audio block\n");
+ err = 1;
}
- for (ch = 0; ch < s->out_channels; ch++)
- output[ch] = s->output[ch];
s->dsp.float_to_int16_interleave(out_samples, output, 256, s->out_channels);
out_samples += 256 * s->out_channels;
}