#include "avcodec.h"
#include "ac3.h"
-#include "ac3tab.h"
+#include "bitstream.h"
+
+static uint8_t bndtab[51];
+static uint8_t masktab[253];
static inline int calc_lowcomp1(int a, int b0, int b1, int c)
{
}
}
-/* 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)
+void ff_ac3_bit_alloc_calc_psd(int8_t *exp, int start, int end, int16_t *psd,
+ int16_t *bndpsd)
{
- int bin,i,j,k,end1,v,bndstrt,bndend,lowcomp,begin;
- int fastleak,slowleak,address,tmp;
- int16_t psd[256]; /* scaled exponents */
- int16_t bndpsd[50]; /* interpolated exponents */
- int16_t excite[50]; /* excitation */
- int16_t mask[50]; /* masking value */
+ int bin, i, j, k, end1, v;
/* exponent mapping to PSD */
for(bin=start;bin<end;bin++) {
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_latab[adr];
j++;
}
bndpsd[k]=v;
k++;
} while (end > bndtab[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,
+ int16_t *mask)
+{
+ int16_t excite[50]; /* excitation */
+ int bin, k;
+ int bndstrt, bndend, begin, end1, tmp;
+ int lowcomp, fastleak, slowleak;
/* excitation function */
bndstrt = masktab[start];
if (tmp > 0) {
excite[bin] += tmp >> 2;
}
- mask[bin] = FFMAX(hth[bin >> s->halfratecod][s->fscod], excite[bin]);
+ mask[bin] = FFMAX(ff_ac3_hth[bin >> s->halfratecod][s->fscod], excite[bin]);
}
/* delta bit allocation */
- if (deltbae == 0 || deltbae == 1) {
+ if (deltbae == DBA_REUSE || deltbae == DBA_NEW) {
int band, seg, delta;
band = 0;
for (seg = 0; seg < deltnseg; seg++) {
}
}
}
+}
+
+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 i, j, k, end1, v, address;
- /* compute bit allocation */
+ /* special case, if snroffset is -960, set all bap's to zero */
+ if(snroffset == -960) {
+ memset(bap, 0, 256);
+ return;
+ }
i = start;
j = masktab[start];
do {
- v = (FFMAX(mask[j] - snroffset - s->floor, 0) & 0x1FE0) + s->floor;
- end1 = FFMIN(bndtab[j] + bndsz[j], end);
+ v = (FFMAX(mask[j] - snroffset - floor, 0) & 0x1FE0) + floor;
+ end1 = FFMIN(bndtab[j] + ff_ac3_bndsz[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_baptab[address];
i++;
}
} while (end > bndtab[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)
+{
+ int16_t psd[256]; /* scaled exponents */
+ int16_t bndpsd[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_mask(s, bndpsd, start, end, fgain, is_lfe,
+ deltbae, deltnseg, deltoffst, deltlen, deltba,
+ mask);
+
+ ff_ac3_bit_alloc_calc_bap(mask, psd, start, end, snroffset, s->floor, bap);
+}
+
/**
* Initializes some tables.
* note: This function must remain thread safe because it is called by the
l = 0;
for(i=0;i<50;i++) {
bndtab[i] = l;
- v = bndsz[i];
+ v = ff_ac3_bndsz[i];
for(j=0;j<v;j++) masktab[k++]=i;
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 );
- }
}