00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00027 #include "avcodec.h"
00028 #include "ac3.h"
00029 #include "bitstream.h"
00030
00031 static uint8_t bndtab[51];
00032 static uint8_t masktab[253];
00033
00034 static inline int calc_lowcomp1(int a, int b0, int b1, int c)
00035 {
00036 if ((b0 + 256) == b1) {
00037 a = c;
00038 } else if (b0 > b1) {
00039 a = FFMAX(a - 64, 0);
00040 }
00041 return a;
00042 }
00043
00044 static inline int calc_lowcomp(int a, int b0, int b1, int bin)
00045 {
00046 if (bin < 7) {
00047 return calc_lowcomp1(a, b0, b1, 384);
00048 } else if (bin < 20) {
00049 return calc_lowcomp1(a, b0, b1, 320);
00050 } else {
00051 return FFMAX(a - 128, 0);
00052 }
00053 }
00054
00055 void ff_ac3_bit_alloc_calc_psd(int8_t *exp, int start, int end, int16_t *psd,
00056 int16_t *bndpsd)
00057 {
00058 int bin, i, j, k, end1, v;
00059
00060
00061 for(bin=start;bin<end;bin++) {
00062 psd[bin]=(3072 - (exp[bin] << 7));
00063 }
00064
00065
00066 j=start;
00067 k=masktab[start];
00068 do {
00069 v=psd[j];
00070 j++;
00071 end1 = FFMIN(bndtab[k+1], end);
00072 for(i=j;i<end1;i++) {
00073
00074 int adr = FFMIN(FFABS(v - psd[j]) >> 1, 255);
00075 v = FFMAX(v, psd[j]) + ff_ac3_latab[adr];
00076 j++;
00077 }
00078 bndpsd[k]=v;
00079 k++;
00080 } while (end > bndtab[k]);
00081 }
00082
00083 void ff_ac3_bit_alloc_calc_mask(AC3BitAllocParameters *s, int16_t *bndpsd,
00084 int start, int end, int fgain, int is_lfe,
00085 int deltbae, int deltnseg, uint8_t *deltoffst,
00086 uint8_t *deltlen, uint8_t *deltba,
00087 int16_t *mask)
00088 {
00089 int16_t excite[50];
00090 int bin, k;
00091 int bndstrt, bndend, begin, end1, tmp;
00092 int lowcomp, fastleak, slowleak;
00093
00094
00095 bndstrt = masktab[start];
00096 bndend = masktab[end-1] + 1;
00097
00098 if (bndstrt == 0) {
00099 lowcomp = 0;
00100 lowcomp = calc_lowcomp1(lowcomp, bndpsd[0], bndpsd[1], 384);
00101 excite[0] = bndpsd[0] - fgain - lowcomp;
00102 lowcomp = calc_lowcomp1(lowcomp, bndpsd[1], bndpsd[2], 384);
00103 excite[1] = bndpsd[1] - fgain - lowcomp;
00104 begin = 7;
00105 for (bin = 2; bin < 7; bin++) {
00106 if (!(is_lfe && bin == 6))
00107 lowcomp = calc_lowcomp1(lowcomp, bndpsd[bin], bndpsd[bin+1], 384);
00108 fastleak = bndpsd[bin] - fgain;
00109 slowleak = bndpsd[bin] - s->sgain;
00110 excite[bin] = fastleak - lowcomp;
00111 if (!(is_lfe && bin == 6)) {
00112 if (bndpsd[bin] <= bndpsd[bin+1]) {
00113 begin = bin + 1;
00114 break;
00115 }
00116 }
00117 }
00118
00119 end1=bndend;
00120 if (end1 > 22) end1=22;
00121
00122 for (bin = begin; bin < end1; bin++) {
00123 if (!(is_lfe && bin == 6))
00124 lowcomp = calc_lowcomp(lowcomp, bndpsd[bin], bndpsd[bin+1], bin);
00125
00126 fastleak = FFMAX(fastleak - s->fdecay, bndpsd[bin] - fgain);
00127 slowleak = FFMAX(slowleak - s->sdecay, bndpsd[bin] - s->sgain);
00128 excite[bin] = FFMAX(fastleak - lowcomp, slowleak);
00129 }
00130 begin = 22;
00131 } else {
00132
00133 begin = bndstrt;
00134
00135 fastleak = (s->cplfleak << 8) + 768;
00136 slowleak = (s->cplsleak << 8) + 768;
00137 }
00138
00139 for (bin = begin; bin < bndend; bin++) {
00140 fastleak = FFMAX(fastleak - s->fdecay, bndpsd[bin] - fgain);
00141 slowleak = FFMAX(slowleak - s->sdecay, bndpsd[bin] - s->sgain);
00142 excite[bin] = FFMAX(fastleak, slowleak);
00143 }
00144
00145
00146
00147 for (bin = bndstrt; bin < bndend; bin++) {
00148 tmp = s->dbknee - bndpsd[bin];
00149 if (tmp > 0) {
00150 excite[bin] += tmp >> 2;
00151 }
00152 mask[bin] = FFMAX(ff_ac3_hth[bin >> s->halfratecod][s->fscod], excite[bin]);
00153 }
00154
00155
00156
00157 if (deltbae == DBA_REUSE || deltbae == DBA_NEW) {
00158 int band, seg, delta;
00159 band = 0;
00160 for (seg = 0; seg < deltnseg; seg++) {
00161 band += deltoffst[seg];
00162 if (deltba[seg] >= 4) {
00163 delta = (deltba[seg] - 3) << 7;
00164 } else {
00165 delta = (deltba[seg] - 4) << 7;
00166 }
00167 for (k = 0; k < deltlen[seg]; k++) {
00168 mask[band] += delta;
00169 band++;
00170 }
00171 }
00172 }
00173 }
00174
00175 void ff_ac3_bit_alloc_calc_bap(int16_t *mask, int16_t *psd, int start, int end,
00176 int snroffset, int floor, uint8_t *bap)
00177 {
00178 int i, j, k, end1, v, address;
00179
00180
00181 if(snroffset == -960) {
00182 memset(bap, 0, 256);
00183 return;
00184 }
00185
00186 i = start;
00187 j = masktab[start];
00188 do {
00189 v = (FFMAX(mask[j] - snroffset - floor, 0) & 0x1FE0) + floor;
00190 end1 = FFMIN(bndtab[j] + ff_ac3_bndsz[j], end);
00191 for (k = i; k < end1; k++) {
00192 address = av_clip((psd[i] - v) >> 5, 0, 63);
00193 bap[i] = ff_ac3_baptab[address];
00194 i++;
00195 }
00196 } while (end > bndtab[j++]);
00197 }
00198
00199
00200
00201 void ac3_parametric_bit_allocation(AC3BitAllocParameters *s, uint8_t *bap,
00202 int8_t *exp, int start, int end,
00203 int snroffset, int fgain, int is_lfe,
00204 int deltbae,int deltnseg,
00205 uint8_t *deltoffst, uint8_t *deltlen,
00206 uint8_t *deltba)
00207 {
00208 int16_t psd[256];
00209 int16_t bndpsd[50];
00210 int16_t mask[50];
00211
00212 ff_ac3_bit_alloc_calc_psd(exp, start, end, psd, bndpsd);
00213
00214 ff_ac3_bit_alloc_calc_mask(s, bndpsd, start, end, fgain, is_lfe,
00215 deltbae, deltnseg, deltoffst, deltlen, deltba,
00216 mask);
00217
00218 ff_ac3_bit_alloc_calc_bap(mask, psd, start, end, snroffset, s->floor, bap);
00219 }
00220
00226 void ac3_common_init(void)
00227 {
00228 int i, j, k, l, v;
00229
00230 k = 0;
00231 l = 0;
00232 for(i=0;i<50;i++) {
00233 bndtab[i] = l;
00234 v = ff_ac3_bndsz[i];
00235 for(j=0;j<v;j++) masktab[k++]=i;
00236 l += v;
00237 }
00238 bndtab[50] = l;
00239 }