summaryrefslogtreecommitdiff
path: root/contrib/ffmpeg/libavcodec/ac3.c
diff options
context:
space:
mode:
authorDiego 'Flameeyes' Pettenò <flameeyes@gmail.com>2008-03-01 03:05:13 +0100
committerDiego 'Flameeyes' Pettenò <flameeyes@gmail.com>2008-03-01 03:05:13 +0100
commit1d0b3b20c34517b9d1ddf3ea347776304b0c4b44 (patch)
tree89f4fc640c2becc6f00ae08996754952ecf149c1 /contrib/ffmpeg/libavcodec/ac3.c
parent09496ad3469a0ade8dbd9a351e639b78f20b7942 (diff)
downloadxine-lib-1d0b3b20c34517b9d1ddf3ea347776304b0c4b44.tar.gz
xine-lib-1d0b3b20c34517b9d1ddf3ea347776304b0c4b44.tar.bz2
Update internal FFmpeg copy.
Diffstat (limited to 'contrib/ffmpeg/libavcodec/ac3.c')
-rw-r--r--contrib/ffmpeg/libavcodec/ac3.c168
1 files changed, 60 insertions, 108 deletions
diff --git a/contrib/ffmpeg/libavcodec/ac3.c b/contrib/ffmpeg/libavcodec/ac3.c
index 3749d02f0..cc80277bc 100644
--- a/contrib/ffmpeg/libavcodec/ac3.c
+++ b/contrib/ffmpeg/libavcodec/ac3.c
@@ -26,9 +26,11 @@
#include "avcodec.h"
#include "ac3.h"
-#include "ac3tab.h"
#include "bitstream.h"
+static uint8_t band_start_tab[51];
+static uint8_t bin_to_band_tab[253];
+
static inline int calc_lowcomp1(int a, int b0, int b1, int c)
{
if ((b0 + 256) == b1) {
@@ -51,7 +53,7 @@ static inline int calc_lowcomp(int a, int b0, int b1, int bin)
}
void ff_ac3_bit_alloc_calc_psd(int8_t *exp, int start, int end, int16_t *psd,
- int16_t *bndpsd)
+ int16_t *band_psd)
{
int bin, i, j, k, end1, v;
@@ -62,26 +64,26 @@ void ff_ac3_bit_alloc_calc_psd(int8_t *exp, int start, int end, int16_t *psd,
/* PSD integration */
j=start;
- k=masktab[start];
+ k=bin_to_band_tab[start];
do {
v=psd[j];
j++;
- end1 = FFMIN(bndtab[k+1], end);
+ end1 = FFMIN(band_start_tab[k+1], end);
for(i=j;i<end1;i++) {
/* logadd */
int adr = FFMIN(FFABS(v - psd[j]) >> 1, 255);
- v = FFMAX(v, psd[j]) + latab[adr];
+ v = FFMAX(v, psd[j]) + ff_ac3_log_add_tab[adr];
j++;
}
- bndpsd[k]=v;
+ band_psd[k]=v;
k++;
- } while (end > bndtab[k]);
+ } while (end > band_start_tab[k]);
}
-void ff_ac3_bit_alloc_calc_mask(AC3BitAllocParameters *s, int16_t *bndpsd,
- int start, int end, int fgain, int is_lfe,
- int deltbae, int deltnseg, uint8_t *deltoffst,
- uint8_t *deltlen, uint8_t *deltba,
+void ff_ac3_bit_alloc_calc_mask(AC3BitAllocParameters *s, int16_t *band_psd,
+ int start, int end, int fast_gain, int is_lfe,
+ int dba_mode, int dba_nsegs, uint8_t *dba_offsets,
+ uint8_t *dba_lengths, uint8_t *dba_values,
int16_t *mask)
{
int16_t excite[50]; /* excitation */
@@ -90,24 +92,24 @@ void ff_ac3_bit_alloc_calc_mask(AC3BitAllocParameters *s, int16_t *bndpsd,
int lowcomp, fastleak, slowleak;
/* excitation function */
- bndstrt = masktab[start];
- bndend = masktab[end-1] + 1;
+ bndstrt = bin_to_band_tab[start];
+ bndend = bin_to_band_tab[end-1] + 1;
if (bndstrt == 0) {
lowcomp = 0;
- lowcomp = calc_lowcomp1(lowcomp, bndpsd[0], bndpsd[1], 384);
- excite[0] = bndpsd[0] - fgain - lowcomp;
- lowcomp = calc_lowcomp1(lowcomp, bndpsd[1], bndpsd[2], 384);
- excite[1] = bndpsd[1] - fgain - lowcomp;
+ lowcomp = calc_lowcomp1(lowcomp, band_psd[0], band_psd[1], 384);
+ excite[0] = band_psd[0] - fast_gain - lowcomp;
+ lowcomp = calc_lowcomp1(lowcomp, band_psd[1], band_psd[2], 384);
+ excite[1] = band_psd[1] - fast_gain - lowcomp;
begin = 7;
for (bin = 2; bin < 7; bin++) {
if (!(is_lfe && bin == 6))
- lowcomp = calc_lowcomp1(lowcomp, bndpsd[bin], bndpsd[bin+1], 384);
- fastleak = bndpsd[bin] - fgain;
- slowleak = bndpsd[bin] - s->sgain;
+ lowcomp = calc_lowcomp1(lowcomp, band_psd[bin], band_psd[bin+1], 384);
+ fastleak = band_psd[bin] - fast_gain;
+ slowleak = band_psd[bin] - s->slow_gain;
excite[bin] = fastleak - lowcomp;
if (!(is_lfe && bin == 6)) {
- if (bndpsd[bin] <= bndpsd[bin+1]) {
+ if (band_psd[bin] <= band_psd[bin+1]) {
begin = bin + 1;
break;
}
@@ -119,10 +121,10 @@ void ff_ac3_bit_alloc_calc_mask(AC3BitAllocParameters *s, int16_t *bndpsd,
for (bin = begin; bin < end1; bin++) {
if (!(is_lfe && bin == 6))
- lowcomp = calc_lowcomp(lowcomp, bndpsd[bin], bndpsd[bin+1], bin);
+ lowcomp = calc_lowcomp(lowcomp, band_psd[bin], band_psd[bin+1], bin);
- fastleak = FFMAX(fastleak - s->fdecay, bndpsd[bin] - fgain);
- slowleak = FFMAX(slowleak - s->sdecay, bndpsd[bin] - s->sgain);
+ fastleak = FFMAX(fastleak - s->fast_decay, band_psd[bin] - fast_gain);
+ slowleak = FFMAX(slowleak - s->slow_decay, band_psd[bin] - s->slow_gain);
excite[bin] = FFMAX(fastleak - lowcomp, slowleak);
}
begin = 22;
@@ -130,39 +132,39 @@ void ff_ac3_bit_alloc_calc_mask(AC3BitAllocParameters *s, int16_t *bndpsd,
/* coupling channel */
begin = bndstrt;
- fastleak = (s->cplfleak << 8) + 768;
- slowleak = (s->cplsleak << 8) + 768;
+ fastleak = (s->cpl_fast_leak << 8) + 768;
+ slowleak = (s->cpl_slow_leak << 8) + 768;
}
for (bin = begin; bin < bndend; bin++) {
- fastleak = FFMAX(fastleak - s->fdecay, bndpsd[bin] - fgain);
- slowleak = FFMAX(slowleak - s->sdecay, bndpsd[bin] - s->sgain);
+ fastleak = FFMAX(fastleak - s->fast_decay, band_psd[bin] - fast_gain);
+ slowleak = FFMAX(slowleak - s->slow_decay, band_psd[bin] - s->slow_gain);
excite[bin] = FFMAX(fastleak, slowleak);
}
/* compute masking curve */
for (bin = bndstrt; bin < bndend; bin++) {
- tmp = s->dbknee - bndpsd[bin];
+ tmp = s->db_per_bit - band_psd[bin];
if (tmp > 0) {
excite[bin] += tmp >> 2;
}
- mask[bin] = FFMAX(hth[bin >> s->halfratecod][s->fscod], excite[bin]);
+ mask[bin] = FFMAX(ff_ac3_hearing_threshold_tab[bin >> s->sr_shift][s->sr_code], excite[bin]);
}
/* delta bit allocation */
- if (deltbae == 0 || deltbae == 1) {
+ if (dba_mode == DBA_REUSE || dba_mode == DBA_NEW) {
int band, seg, delta;
band = 0;
- for (seg = 0; seg < deltnseg; seg++) {
- band += deltoffst[seg];
- if (deltba[seg] >= 4) {
- delta = (deltba[seg] - 3) << 7;
+ for (seg = 0; seg < dba_nsegs; seg++) {
+ band += dba_offsets[seg];
+ if (dba_values[seg] >= 4) {
+ delta = (dba_values[seg] - 3) << 7;
} else {
- delta = (deltba[seg] - 4) << 7;
+ delta = (dba_values[seg] - 4) << 7;
}
- for (k = 0; k < deltlen[seg]; k++) {
+ for (k = 0; k < dba_lengths[seg]; k++) {
mask[band] += delta;
band++;
}
@@ -171,49 +173,49 @@ void ff_ac3_bit_alloc_calc_mask(AC3BitAllocParameters *s, int16_t *bndpsd,
}
void ff_ac3_bit_alloc_calc_bap(int16_t *mask, int16_t *psd, int start, int end,
- int snroffset, int floor, uint8_t *bap)
+ int snr_offset, int floor, uint8_t *bap)
{
int i, j, k, end1, v, address;
- /* special case, if snroffset is -960, set all bap's to zero */
- if(snroffset == -960) {
+ /* special case, if snr offset is -960, set all bap's to zero */
+ if(snr_offset == -960) {
memset(bap, 0, 256);
return;
}
i = start;
- j = masktab[start];
+ j = bin_to_band_tab[start];
do {
- v = (FFMAX(mask[j] - snroffset - floor, 0) & 0x1FE0) + floor;
- end1 = FFMIN(bndtab[j] + bndsz[j], end);
+ v = (FFMAX(mask[j] - snr_offset - floor, 0) & 0x1FE0) + floor;
+ end1 = FFMIN(band_start_tab[j] + ff_ac3_critical_band_size_tab[j], end);
for (k = i; k < end1; k++) {
address = av_clip((psd[i] - v) >> 5, 0, 63);
- bap[i] = baptab[address];
+ bap[i] = ff_ac3_bap_tab[address];
i++;
}
- } while (end > bndtab[j++]);
+ } while (end > band_start_tab[j++]);
}
/* AC3 bit allocation. The algorithm is the one described in the AC3
spec. */
void ac3_parametric_bit_allocation(AC3BitAllocParameters *s, uint8_t *bap,
int8_t *exp, int start, int end,
- int snroffset, int fgain, int is_lfe,
- int deltbae,int deltnseg,
- uint8_t *deltoffst, uint8_t *deltlen,
- uint8_t *deltba)
+ int snr_offset, int fast_gain, int is_lfe,
+ int dba_mode, int dba_nsegs,
+ uint8_t *dba_offsets, uint8_t *dba_lengths,
+ uint8_t *dba_values)
{
int16_t psd[256]; /* scaled exponents */
- int16_t bndpsd[50]; /* interpolated exponents */
+ int16_t band_psd[50]; /* interpolated exponents */
int16_t mask[50]; /* masking value */
- ff_ac3_bit_alloc_calc_psd(exp, start, end, psd, bndpsd);
+ ff_ac3_bit_alloc_calc_psd(exp, start, end, psd, band_psd);
- ff_ac3_bit_alloc_calc_mask(s, bndpsd, start, end, fgain, is_lfe,
- deltbae, deltnseg, deltoffst, deltlen, deltba,
+ ff_ac3_bit_alloc_calc_mask(s, band_psd, start, end, fast_gain, is_lfe,
+ dba_mode, dba_nsegs, dba_offsets, dba_lengths, dba_values,
mask);
- ff_ac3_bit_alloc_calc_bap(mask, psd, start, end, snroffset, s->floor, bap);
+ ff_ac3_bit_alloc_calc_bap(mask, psd, start, end, snr_offset, s->floor, bap);
}
/**
@@ -228,60 +230,10 @@ void ac3_common_init(void)
k = 0;
l = 0;
for(i=0;i<50;i++) {
- bndtab[i] = l;
- v = bndsz[i];
- for(j=0;j<v;j++) masktab[k++]=i;
+ band_start_tab[i] = l;
+ v = ff_ac3_critical_band_size_tab[i];
+ for(j=0;j<v;j++) bin_to_band_tab[k++]=i;
l += v;
}
- bndtab[50] = l;
-}
-
-int ff_ac3_parse_header(const uint8_t buf[7], AC3HeaderInfo *hdr)
-{
- GetBitContext gbc;
-
- memset(hdr, 0, sizeof(*hdr));
-
- init_get_bits(&gbc, buf, 54);
-
- hdr->sync_word = get_bits(&gbc, 16);
- if(hdr->sync_word != 0x0B77)
- return -1;
-
- /* read ahead to bsid to make sure this is AC-3, not E-AC-3 */
- hdr->bsid = show_bits_long(&gbc, 29) & 0x1F;
- if(hdr->bsid > 10)
- return -2;
-
- hdr->crc1 = get_bits(&gbc, 16);
- hdr->fscod = get_bits(&gbc, 2);
- if(hdr->fscod == 3)
- return -3;
-
- hdr->frmsizecod = get_bits(&gbc, 6);
- if(hdr->frmsizecod > 37)
- return -4;
-
- skip_bits(&gbc, 5); // skip bsid, already got it
-
- hdr->bsmod = get_bits(&gbc, 3);
- hdr->acmod = get_bits(&gbc, 3);
- if((hdr->acmod & 1) && hdr->acmod != 1) {
- hdr->cmixlev = get_bits(&gbc, 2);
- }
- if(hdr->acmod & 4) {
- hdr->surmixlev = get_bits(&gbc, 2);
- }
- if(hdr->acmod == 2) {
- hdr->dsurmod = get_bits(&gbc, 2);
- }
- hdr->lfeon = get_bits1(&gbc);
-
- hdr->halfratecod = FFMAX(hdr->bsid, 8) - 8;
- hdr->sample_rate = ff_ac3_freqs[hdr->fscod] >> hdr->halfratecod;
- hdr->bit_rate = (ff_ac3_bitratetab[hdr->frmsizecod>>1] * 1000) >> hdr->halfratecod;
- hdr->channels = ff_ac3_channels[hdr->acmod] + hdr->lfeon;
- hdr->frame_size = ff_ac3_frame_sizes[hdr->frmsizecod][hdr->fscod] * 2;
-
- return 0;
+ band_start_tab[50] = l;
}