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 "get_bits.h"
00030
00031 #if CONFIG_HARDCODED_TABLES
00032
00036 static const uint8_t band_start_tab[51] = {
00037 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
00038 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
00039 20, 21, 22, 23, 24, 25, 26, 27, 28, 31,
00040 34, 37, 40, 43, 46, 49, 55, 61, 67, 73,
00041 79, 85, 97, 109, 121, 133, 157, 181, 205, 229, 253
00042 };
00043
00047 static const uint8_t bin_to_band_tab[253] = {
00048 0,
00049 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
00050 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
00051 25, 26, 27, 28, 28, 28, 29, 29, 29, 30, 30, 30,
00052 31, 31, 31, 32, 32, 32, 33, 33, 33, 34, 34, 34,
00053 35, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 36,
00054 37, 37, 37, 37, 37, 37, 38, 38, 38, 38, 38, 38,
00055 39, 39, 39, 39, 39, 39, 40, 40, 40, 40, 40, 40,
00056 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
00057 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
00058 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
00059 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
00060 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
00061 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
00062 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
00063 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
00064 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
00065 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
00066 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
00067 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
00068 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
00069 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49
00070 };
00071
00072 #else
00073 static uint8_t band_start_tab[51];
00074 static uint8_t bin_to_band_tab[253];
00075 #endif
00076
00077 static inline int calc_lowcomp1(int a, int b0, int b1, int c)
00078 {
00079 if ((b0 + 256) == b1) {
00080 a = c;
00081 } else if (b0 > b1) {
00082 a = FFMAX(a - 64, 0);
00083 }
00084 return a;
00085 }
00086
00087 static inline int calc_lowcomp(int a, int b0, int b1, int bin)
00088 {
00089 if (bin < 7) {
00090 return calc_lowcomp1(a, b0, b1, 384);
00091 } else if (bin < 20) {
00092 return calc_lowcomp1(a, b0, b1, 320);
00093 } else {
00094 return FFMAX(a - 128, 0);
00095 }
00096 }
00097
00098 void ff_ac3_bit_alloc_calc_psd(int8_t *exp, int start, int end, int16_t *psd,
00099 int16_t *band_psd)
00100 {
00101 int bin, band;
00102
00103
00104 for (bin = start; bin < end; bin++) {
00105 psd[bin]=(3072 - (exp[bin] << 7));
00106 }
00107
00108
00109 bin = start;
00110 band = bin_to_band_tab[start];
00111 do {
00112 int v = psd[bin++];
00113 int band_end = FFMIN(band_start_tab[band+1], end);
00114 for (; bin < band_end; bin++) {
00115 int max = FFMAX(v, psd[bin]);
00116
00117 int adr = FFMIN(max - ((v + psd[bin] + 1) >> 1), 255);
00118 v = max + ff_ac3_log_add_tab[adr];
00119 }
00120 band_psd[band++] = v;
00121 } while (end > band_start_tab[band]);
00122 }
00123
00124 int ff_ac3_bit_alloc_calc_mask(AC3BitAllocParameters *s, int16_t *band_psd,
00125 int start, int end, int fast_gain, int is_lfe,
00126 int dba_mode, int dba_nsegs, uint8_t *dba_offsets,
00127 uint8_t *dba_lengths, uint8_t *dba_values,
00128 int16_t *mask)
00129 {
00130 int16_t excite[50];
00131 int band;
00132 int band_start, band_end, begin, end1;
00133 int lowcomp, fastleak, slowleak;
00134
00135
00136 band_start = bin_to_band_tab[start];
00137 band_end = bin_to_band_tab[end-1] + 1;
00138
00139 if (band_start == 0) {
00140 lowcomp = 0;
00141 lowcomp = calc_lowcomp1(lowcomp, band_psd[0], band_psd[1], 384);
00142 excite[0] = band_psd[0] - fast_gain - lowcomp;
00143 lowcomp = calc_lowcomp1(lowcomp, band_psd[1], band_psd[2], 384);
00144 excite[1] = band_psd[1] - fast_gain - lowcomp;
00145 begin = 7;
00146 for (band = 2; band < 7; band++) {
00147 if (!(is_lfe && band == 6))
00148 lowcomp = calc_lowcomp1(lowcomp, band_psd[band], band_psd[band+1], 384);
00149 fastleak = band_psd[band] - fast_gain;
00150 slowleak = band_psd[band] - s->slow_gain;
00151 excite[band] = fastleak - lowcomp;
00152 if (!(is_lfe && band == 6)) {
00153 if (band_psd[band] <= band_psd[band+1]) {
00154 begin = band + 1;
00155 break;
00156 }
00157 }
00158 }
00159
00160 end1 = FFMIN(band_end, 22);
00161 for (band = begin; band < end1; band++) {
00162 if (!(is_lfe && band == 6))
00163 lowcomp = calc_lowcomp(lowcomp, band_psd[band], band_psd[band+1], band);
00164 fastleak = FFMAX(fastleak - s->fast_decay, band_psd[band] - fast_gain);
00165 slowleak = FFMAX(slowleak - s->slow_decay, band_psd[band] - s->slow_gain);
00166 excite[band] = FFMAX(fastleak - lowcomp, slowleak);
00167 }
00168 begin = 22;
00169 } else {
00170
00171 begin = band_start;
00172 fastleak = (s->cpl_fast_leak << 8) + 768;
00173 slowleak = (s->cpl_slow_leak << 8) + 768;
00174 }
00175
00176 for (band = begin; band < band_end; band++) {
00177 fastleak = FFMAX(fastleak - s->fast_decay, band_psd[band] - fast_gain);
00178 slowleak = FFMAX(slowleak - s->slow_decay, band_psd[band] - s->slow_gain);
00179 excite[band] = FFMAX(fastleak, slowleak);
00180 }
00181
00182
00183
00184 for (band = band_start; band < band_end; band++) {
00185 int tmp = s->db_per_bit - band_psd[band];
00186 if (tmp > 0) {
00187 excite[band] += tmp >> 2;
00188 }
00189 mask[band] = FFMAX(ff_ac3_hearing_threshold_tab[band >> s->sr_shift][s->sr_code], excite[band]);
00190 }
00191
00192
00193
00194 if (dba_mode == DBA_REUSE || dba_mode == DBA_NEW) {
00195 int i, seg, delta;
00196 if (dba_nsegs >= 8)
00197 return -1;
00198 band = 0;
00199 for (seg = 0; seg < dba_nsegs; seg++) {
00200 band += dba_offsets[seg];
00201 if (band >= 50 || dba_lengths[seg] > 50-band)
00202 return -1;
00203 if (dba_values[seg] >= 4) {
00204 delta = (dba_values[seg] - 3) << 7;
00205 } else {
00206 delta = (dba_values[seg] - 4) << 7;
00207 }
00208 for (i = 0; i < dba_lengths[seg]; i++) {
00209 mask[band++] += delta;
00210 }
00211 }
00212 }
00213 return 0;
00214 }
00215
00216 void ff_ac3_bit_alloc_calc_bap(int16_t *mask, int16_t *psd, int start, int end,
00217 int snr_offset, int floor,
00218 const uint8_t *bap_tab, uint8_t *bap)
00219 {
00220 int bin, band;
00221
00222
00223 if (snr_offset == -960) {
00224 memset(bap, 0, 256);
00225 return;
00226 }
00227
00228 bin = start;
00229 band = bin_to_band_tab[start];
00230 do {
00231 int m = (FFMAX(mask[band] - snr_offset - floor, 0) & 0x1FE0) + floor;
00232 int band_end = FFMIN(band_start_tab[band+1], end);
00233 for (; bin < band_end; bin++) {
00234 int address = av_clip((psd[bin] - m) >> 5, 0, 63);
00235 bap[bin] = bap_tab[address];
00236 }
00237 } while (end > band_start_tab[band++]);
00238 }
00239
00240
00241
00242 void ac3_parametric_bit_allocation(AC3BitAllocParameters *s, uint8_t *bap,
00243 int8_t *exp, int start, int end,
00244 int snr_offset, int fast_gain, int is_lfe,
00245 int dba_mode, int dba_nsegs,
00246 uint8_t *dba_offsets, uint8_t *dba_lengths,
00247 uint8_t *dba_values)
00248 {
00249 int16_t psd[256];
00250 int16_t band_psd[50];
00251 int16_t mask[50];
00252
00253 ff_ac3_bit_alloc_calc_psd(exp, start, end, psd, band_psd);
00254
00255 ff_ac3_bit_alloc_calc_mask(s, band_psd, start, end, fast_gain, is_lfe,
00256 dba_mode, dba_nsegs, dba_offsets, dba_lengths,
00257 dba_values, mask);
00258
00259 ff_ac3_bit_alloc_calc_bap(mask, psd, start, end, snr_offset, s->floor,
00260 ff_ac3_bap_tab, bap);
00261 }
00262
00268 av_cold void ac3_common_init(void)
00269 {
00270 #if !CONFIG_HARDCODED_TABLES
00271
00272 int bin = 0, band;
00273 for (band = 0; band < 50; band++) {
00274 int band_end = bin + ff_ac3_critical_band_size_tab[band];
00275 band_start_tab[band] = bin;
00276 while (bin < band_end)
00277 bin_to_band_tab[bin++] = band;
00278 }
00279 band_start_tab[50] = bin;
00280 #endif
00281 }