libavcodec/ac3.c
96ae7f11
 /*
14b70628
  * Common code between the AC-3 encoder and decoder
406792e7
  * Copyright (c) 2000 Fabrice Bellard
96ae7f11
  *
  * This file is part of FFmpeg.
  *
  * FFmpeg is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
  *
  * FFmpeg is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
  * License along with FFmpeg; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 /**
ba87f080
  * @file
14b70628
  * Common code between the AC-3 encoder and decoder.
96ae7f11
  */
 
 #include "avcodec.h"
 #include "ac3.h"
9106a698
 #include "get_bits.h"
96ae7f11
 
b05e4195
 /**
  * Starting frequency coefficient bin for each critical band.
  */
6d9f52b2
 const uint8_t ff_ac3_band_start_tab[AC3_CRITICAL_BANDS+1] = {
b05e4195
       0,  1,   2,   3,   4,   5,   6,   7,   8,   9,
      10,  11, 12,  13,  14,  15,  16,  17,  18,  19,
      20,  21, 22,  23,  24,  25,  26,  27,  28,  31,
      34,  37, 40,  43,  46,  49,  55,  61,  67,  73,
      79,  85, 97, 109, 121, 133, 157, 181, 205, 229, 253
 };
 
e732af87
 #if CONFIG_HARDCODED_TABLES
 
b05e4195
 /**
49bd8e4b
  * Map each frequency coefficient bin to the critical band that contains it.
b05e4195
  */
6d9f52b2
 const uint8_t ff_ac3_bin_to_band_tab[253] = {
b05e4195
      0,
      1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12,
     13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
     25, 26, 27, 28, 28, 28, 29, 29, 29, 30, 30, 30,
     31, 31, 31, 32, 32, 32, 33, 33, 33, 34, 34, 34,
     35, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 36,
     37, 37, 37, 37, 37, 37, 38, 38, 38, 38, 38, 38,
     39, 39, 39, 39, 39, 39, 40, 40, 40, 40, 40, 40,
     41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
     42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
     43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
     44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
     45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
     45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
     46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
     46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
     47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
     47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
     48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
     48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
     49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
     49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49
 };
 
 #else /* CONFIG_HARDCODED_TABLES */
6d9f52b2
 uint8_t ff_ac3_bin_to_band_tab[253];
b05e4195
 #endif
7adb10be
 
96ae7f11
 static inline int calc_lowcomp1(int a, int b0, int b1, int c)
 {
     if ((b0 + 256) == b1) {
         a = c;
     } else if (b0 > b1) {
         a = FFMAX(a - 64, 0);
     }
     return a;
 }
 
 static inline int calc_lowcomp(int a, int b0, int b1, int bin)
 {
     if (bin < 7) {
         return calc_lowcomp1(a, b0, b1, 384);
     } else if (bin < 20) {
         return calc_lowcomp1(a, b0, b1, 320);
     } else {
         return FFMAX(a - 128, 0);
     }
 }
 
575bf46f
 void ff_ac3_bit_alloc_calc_psd(int8_t *exp, int start, int end, int16_t *psd,
5ce21342
                                int16_t *band_psd)
96ae7f11
 {
89e6317b
     int bin, band;
96ae7f11
 
     /* exponent mapping to PSD */
612bdf18
     for (bin = start; bin < end; bin++) {
96ae7f11
         psd[bin]=(3072 - (exp[bin] << 7));
     }
 
     /* PSD integration */
89e6317b
     bin  = start;
6d9f52b2
     band = ff_ac3_bin_to_band_tab[start];
96ae7f11
     do {
89e6317b
         int v = psd[bin++];
6d9f52b2
         int band_end = FFMIN(ff_ac3_band_start_tab[band+1], end);
89e6317b
         for (; bin < band_end; bin++) {
29b75f0b
             int max = FFMAX(v, psd[bin]);
96ae7f11
             /* logadd */
29b75f0b
             int adr = FFMIN(max - ((v + psd[bin] + 1) >> 1), 255);
             v = max + ff_ac3_log_add_tab[adr];
96ae7f11
         }
bf864383
         band_psd[band++] = v;
6d9f52b2
     } while (end > ff_ac3_band_start_tab[band]);
575bf46f
 }
 
72a6244b
 int ff_ac3_bit_alloc_calc_mask(AC3BitAllocParameters *s, int16_t *band_psd,
20e04726
                                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)
575bf46f
 {
47ae6e79
     int16_t excite[AC3_CRITICAL_BANDS]; /* excitation */
403b1543
     int band;
     int band_start, band_end, begin, end1;
575bf46f
     int lowcomp, fastleak, slowleak;
96ae7f11
 
     /* excitation function */
6d9f52b2
     band_start = ff_ac3_bin_to_band_tab[start];
     band_end   = ff_ac3_bin_to_band_tab[end-1] + 1;
96ae7f11
 
403b1543
     if (band_start == 0) {
96ae7f11
         lowcomp = 0;
5ce21342
         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;
96ae7f11
         begin = 7;
403b1543
         for (band = 2; band < 7; band++) {
             if (!(is_lfe && band == 6))
                 lowcomp = calc_lowcomp1(lowcomp, band_psd[band], band_psd[band+1], 384);
             fastleak = band_psd[band] - fast_gain;
             slowleak = band_psd[band] - s->slow_gain;
             excite[band] = fastleak - lowcomp;
             if (!(is_lfe && band == 6)) {
                 if (band_psd[band] <= band_psd[band+1]) {
                     begin = band + 1;
96ae7f11
                     break;
                 }
             }
         }
 
403b1543
         end1 = FFMIN(band_end, 22);
         for (band = begin; band < end1; band++) {
             if (!(is_lfe && band == 6))
                 lowcomp = calc_lowcomp(lowcomp, band_psd[band], band_psd[band+1], band);
             fastleak = FFMAX(fastleak - s->fast_decay, band_psd[band] - fast_gain);
             slowleak = FFMAX(slowleak - s->slow_decay, band_psd[band] - s->slow_gain);
             excite[band] = FFMAX(fastleak - lowcomp, slowleak);
96ae7f11
         }
         begin = 22;
     } else {
         /* coupling channel */
403b1543
         begin = band_start;
5ce21342
         fastleak = (s->cpl_fast_leak << 8) + 768;
         slowleak = (s->cpl_slow_leak << 8) + 768;
96ae7f11
     }
 
403b1543
     for (band = begin; band < band_end; band++) {
         fastleak = FFMAX(fastleak - s->fast_decay, band_psd[band] - fast_gain);
         slowleak = FFMAX(slowleak - s->slow_decay, band_psd[band] - s->slow_gain);
         excite[band] = FFMAX(fastleak, slowleak);
96ae7f11
     }
 
     /* compute masking curve */
 
403b1543
     for (band = band_start; band < band_end; band++) {
         int tmp = s->db_per_bit - band_psd[band];
96ae7f11
         if (tmp > 0) {
403b1543
             excite[band] += tmp >> 2;
96ae7f11
         }
403b1543
         mask[band] = FFMAX(ff_ac3_hearing_threshold_tab[band >> s->sr_shift][s->sr_code], excite[band]);
96ae7f11
     }
 
     /* delta bit allocation */
 
5ce21342
     if (dba_mode == DBA_REUSE || dba_mode == DBA_NEW) {
403b1543
         int i, seg, delta;
4c64c8e9
         if (dba_nsegs > 8)
72a6244b
             return -1;
4c64c8e9
         band = band_start;
72a6244b
         for (seg = 0; seg < dba_nsegs; seg++) {
             band += dba_offsets[seg];
47ae6e79
             if (band >= AC3_CRITICAL_BANDS || dba_lengths[seg] > AC3_CRITICAL_BANDS-band)
72a6244b
                 return -1;
5ce21342
             if (dba_values[seg] >= 4) {
                 delta = (dba_values[seg] - 3) << 7;
96ae7f11
             } else {
5ce21342
                 delta = (dba_values[seg] - 4) << 7;
96ae7f11
             }
403b1543
             for (i = 0; i < dba_lengths[seg]; i++) {
                 mask[band++] += delta;
96ae7f11
             }
         }
     }
72a6244b
     return 0;
575bf46f
 }
96ae7f11
 
050aa8b9
 /**
49bd8e4b
  * Initialize some tables.
050aa8b9
  * note: This function must remain thread safe because it is called by the
  *       AVParser init code.
  */
dff80041
 av_cold void ff_ac3_common_init(void)
96ae7f11
 {
b05e4195
 #if !CONFIG_HARDCODED_TABLES
6d9f52b2
     /* compute ff_ac3_bin_to_band_tab from ff_ac3_band_start_tab */
84cb4bc6
     int bin = 0, band;
47ae6e79
     for (band = 0; band < AC3_CRITICAL_BANDS; band++) {
6d9f52b2
         int band_end = ff_ac3_band_start_tab[band+1];
84cb4bc6
         while (bin < band_end)
6d9f52b2
             ff_ac3_bin_to_band_tab[bin++] = band;
96ae7f11
     }
b05e4195
 #endif /* !CONFIG_HARDCODED_TABLES */
96ae7f11
 }