eac3_spectral.patch
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:20k
源码类别:

midi

开发平台:

Unix_Linux

  1. diff --git a/libavcodec/ac3dec.c b/libavcodec/ac3dec.c
  2. index baff415..49d6ea9 100644
  3. --- a/libavcodec/ac3dec.c
  4. +++ b/libavcodec/ac3dec.c
  5. @@ -826,14 +826,105 @@ static int decode_audio_block(AC3DecodeContext *s, int blk)
  6.  
  7.      /* spectral extension strategy */
  8.      if (s->eac3 && (!blk || get_bits1(gbc))) {
  9. -        if (get_bits1(gbc)) {
  10. -            av_log_missing_feature(s->avctx, "Spectral extension", 1);
  11. -            return -1;
  12. +        s->spx_in_use = get_bits1(gbc);
  13. +        if (s->spx_in_use) {
  14. +            int copy_start, start_subband, end_subband, start_freq, end_freq;
  15. +
  16. +            /* determine which channels use spx */
  17. +            if (s->channel_mode == AC3_CHMODE_MONO) {
  18. +                s->channel_uses_spx[1] = 1;
  19. +            } else {
  20. +                for (ch = 1; ch <= fbw_channels; ch++)
  21. +                    s->channel_uses_spx[ch] = get_bits1(gbc);
  22. +            }
  23. +
  24. +            /* get the frequency bins of the spx copy region and the spx start
  25. +               and end subbands */
  26. +            copy_start    = get_bits(gbc, 2);
  27. +            start_subband = get_bits(gbc, 3) + 2;
  28. +            if (start_subband > 7)
  29. +                start_subband += start_subband - 7;
  30. +            end_subband   = get_bits(gbc, 3) + 5;
  31. +            if (end_subband   > 7)
  32. +                end_subband   += end_subband   - 7;
  33. +            copy_start    = copy_start    * 12 + 25;
  34. +            start_freq    = start_subband * 12 + 25;
  35. +            end_freq      = end_subband   * 12 + 25;
  36. +
  37. +            /* check validity of spx ranges */
  38. +            if (start_subband >= end_subband) {
  39. +                av_log(s->avctx, AV_LOG_ERROR, "invalid spectral extension "
  40. +                       "range (%d >= %d)n", start_subband, end_subband);
  41. +                return -1;
  42. +            }
  43. +            if (copy_start >= start_freq) {
  44. +                av_log(s->avctx, AV_LOG_ERROR, "invalid spectral extension "
  45. +                       "copy start bin (%d >= %d)n", copy_start, start_freq);
  46. +                return -1;
  47. +            }
  48. +
  49. +            s->spx_copy_start_freq = copy_start;
  50. +            s->spx_start_subband   = start_subband;
  51. +            s->spx_start_freq      = start_freq;
  52. +            s->spx_end_freq        = end_freq;
  53. +
  54. +            decode_band_structure(gbc, blk, s->eac3, 0,
  55. +                                  start_subband, end_subband,
  56. +                                  ff_eac3_default_spx_band_struct,
  57. +                                  &s->num_spx_bands,
  58. +                                  s->spx_band_sizes);
  59. +        } else {
  60. +            for (ch = 1; ch <= fbw_channels; ch++) {
  61. +                s->channel_uses_spx[ch] = 0;
  62. +                s->first_spx_coords[ch] = 1;
  63. +            }
  64.          }
  65. -        /* TODO: parse spectral extension strategy info */
  66.      }
  67.  
  68. -    /* TODO: spectral extension coordinates */
  69. +    /* spectral extension coordinates */
  70. +    if (s->spx_in_use) {
  71. +        for (ch = 1; ch <= fbw_channels; ch++) {
  72. +            if (s->channel_uses_spx[ch]) {
  73. +                if (s->first_spx_coords[ch] || get_bits1(gbc)) {
  74. +                    float spx_blend;
  75. +                    int bin, master_spx_coord;
  76. +
  77. +                    s->first_spx_coords[ch] = 0;
  78. +                    spx_blend = get_bits(gbc, 5) * (1.0f/32);
  79. +                    master_spx_coord = get_bits(gbc, 2) * 3;
  80. +
  81. +                    bin = s->spx_start_freq;
  82. +                    for (bnd = 0; bnd < s->num_spx_bands; bnd++) {
  83. +                        int bandsize;
  84. +                        int spx_coord_exp, spx_coord_mant;
  85. +                        float nratio, sblend, nblend, spx_coord;
  86. +
  87. +                        /* calculate blending factors */
  88. +                        bandsize = s->spx_band_sizes[bnd];
  89. +                        nratio = ((float)((bin + (bandsize >> 1))) / s->spx_end_freq) - spx_blend;
  90. +                        nratio = av_clipf(nratio, 0.0f, 1.0f);
  91. +                        nblend = sqrtf(3.0f * nratio); // noise is scaled by sqrt(3) to give unity variance
  92. +                        sblend = sqrtf(1.0f - nratio);
  93. +                        bin += bandsize;
  94. +
  95. +                        /* decode spx coordinates */
  96. +                        spx_coord_exp  = get_bits(gbc, 4);
  97. +                        spx_coord_mant = get_bits(gbc, 2);
  98. +                        if (spx_coord_exp == 15) spx_coord_mant <<= 1;
  99. +                        else                     spx_coord_mant += 4;
  100. +                        spx_coord_mant <<= (25 - spx_coord_exp - master_spx_coord);
  101. +                        spx_coord = spx_coord_mant * (1.0f/(1<<23));
  102. +
  103. +                        /* multiply noise and signal blending factors by spx coordinate */
  104. +                        s->spx_noise_blend [ch][bnd] = nblend * spx_coord;
  105. +                        s->spx_signal_blend[ch][bnd] = sblend * spx_coord;
  106. +                    }
  107. +                }
  108. +            } else {
  109. +                s->first_spx_coords[ch] = 1;
  110. +            }
  111. +        }
  112. +    }
  113.  
  114.      /* coupling strategy */
  115.      if (s->eac3 ? s->cpl_strategy_exists[blk] : get_bits1(gbc)) {
  116. @@ -870,9 +961,9 @@ static int decode_audio_block(AC3DecodeContext *s, int blk)
  117.                  s->phase_flags_in_use = get_bits1(gbc);
  118.  
  119.              /* coupling frequency range */
  120. -            /* TODO: modify coupling end freq if spectral extension is used */
  121.              cpl_start_subband = get_bits(gbc, 4);
  122. -            cpl_end_subband   = get_bits(gbc, 4) + 3;
  123. +            cpl_end_subband = s->spx_in_use ? s->spx_start_subband - 1 :
  124. +                                              get_bits(gbc, 4) + 3;
  125.              if (cpl_start_subband >= cpl_end_subband) {
  126.                  av_log(s->avctx, AV_LOG_ERROR, "invalid coupling range (%d >= %d)n",
  127.                         cpl_start_subband, cpl_end_subband);
  128. @@ -945,8 +1036,11 @@ static int decode_audio_block(AC3DecodeContext *s, int blk)
  129.      if (channel_mode == AC3_CHMODE_STEREO) {
  130.          if ((s->eac3 && !blk) || get_bits1(gbc)) {
  131.              s->num_rematrixing_bands = 4;
  132. -            if(cpl_in_use && s->start_freq[CPL_CH] <= 61)
  133. +            if (cpl_in_use && s->start_freq[CPL_CH] <= 61) {
  134.                  s->num_rematrixing_bands -= 1 + (s->start_freq[CPL_CH] == 37);
  135. +            } else if (s->spx_in_use && s->spx_start_freq <= 61) {
  136. +                s->num_rematrixing_bands -= 1;
  137. +            }
  138.              for(bnd=0; bnd<s->num_rematrixing_bands; bnd++)
  139.                  s->rematrixing_flags[bnd] = get_bits1(gbc);
  140.          } else if (!blk) {
  141. @@ -971,6 +1065,8 @@ static int decode_audio_block(AC3DecodeContext *s, int blk)
  142.              int prev = s->end_freq[ch];
  143.              if (s->channel_in_cpl[ch])
  144.                  s->end_freq[ch] = s->start_freq[CPL_CH];
  145. +            else if (s->channel_uses_spx[ch])
  146. +                s->end_freq[ch] = s->spx_start_freq;
  147.              else {
  148.                  int bandwidth_code = get_bits(gbc, 6);
  149.                  if (bandwidth_code > 60) {
  150. @@ -1167,8 +1263,6 @@ static int decode_audio_block(AC3DecodeContext *s, int blk)
  151.  
  152.      /* TODO: generate enhanced coupling coordinates and uncouple */
  153.  
  154. -    /* TODO: apply spectral extension */
  155. -
  156.      /* recover coefficients if rematrixing is in use */
  157.      if(s->channel_mode == AC3_CHMODE_STEREO)
  158.          do_rematrixing(s);
  159. @@ -1184,6 +1278,10 @@ static int decode_audio_block(AC3DecodeContext *s, int blk)
  160.          s->dsp.int32_to_float_fmul_scalar(s->transform_coeffs[ch], s->fixed_coeffs[ch], gain, 256);
  161.      }
  162.  
  163. +    /* apply spectral extension to high frequency bins */
  164. +    if (s->spx_in_use)
  165. +        ff_eac3_apply_spectral_extension(s);
  166. +
  167.      /* downmix and MDCT. order depends on whether block switching is used for
  168.         any channel in this block. this is because coefficients for the long
  169.         and short transforms cannot be mixed. */
  170. diff --git a/libavcodec/ac3dec.h b/libavcodec/ac3dec.h
  171. index 38c2deb..fa6057d 100644
  172. --- a/libavcodec/ac3dec.h
  173. +++ b/libavcodec/ac3dec.h
  174. @@ -42,6 +42,7 @@
  175.  #define AC3_MAX_COEFS   256
  176.  #define AC3_BLOCK_SIZE  256
  177.  #define MAX_BLOCKS        6
  178. +#define SPX_MAX_BANDS    17
  179.  
  180.  typedef struct {
  181.      AVCodecContext *avctx;                  ///< parent context
  182. @@ -88,6 +89,23 @@ typedef struct {
  183.      int cpl_coords[AC3_MAX_CHANNELS][18];   ///< coupling coordinates                   (cplco)
  184.  ///@}
  185.  
  186. +///@defgroup spx spectral extension
  187. +///@{
  188. +    int spx_in_use;                             ///< spectral extension in use              (spxinu)
  189. +    uint8_t channel_uses_spx[AC3_MAX_CHANNELS]; ///< channel uses spectral extension        (chinspx)
  190. +    int8_t spx_atten_code[AC3_MAX_CHANNELS];    ///< spx attenuation code                   (spxattencod)
  191. +    int spx_start_subband;                      ///< spx beginning frequency band           (spxbegf)
  192. +    int spx_start_freq;                         ///< spx start frequency bin
  193. +    int spx_end_freq;                           ///< spx end frequency bin
  194. +    int spx_copy_start_freq;                    ///< spx starting frequency bin for copying (copystartmant)
  195. +    int num_spx_bands;                          ///< number of spx bands                    (nspxbnds)
  196. +    uint8_t spx_band_struct[SPX_MAX_BANDS];     ///< spectral extension band structure      (spxbndstrc)
  197. +    uint8_t spx_band_sizes[SPX_MAX_BANDS];      ///< number of bins in each band            (spxbndsztab)
  198. +    uint8_t first_spx_coords[AC3_MAX_CHANNELS]; ///< first spx coordinates states           (firstspxcos)
  199. +    float spx_noise_blend[AC3_MAX_CHANNELS][SPX_MAX_BANDS]; ///< spx noise blending factor  (nblendfact)
  200. +    float spx_signal_blend[AC3_MAX_CHANNELS][SPX_MAX_BANDS];///< spx signal blending factor (sblendfact)
  201. +///@}
  202. +
  203.  ///@defgroup aht adaptive hybrid transform
  204.      int channel_uses_aht[AC3_MAX_CHANNELS];                         ///< channel AHT in use (chahtinu)
  205.      int pre_mantissa[AC3_MAX_CHANNELS][AC3_MAX_COEFS][MAX_BLOCKS];  ///< pre-IDCT mantissas
  206. @@ -179,4 +197,11 @@ int ff_eac3_parse_header(AC3DecodeContext *s);
  207.   */
  208.  void ff_eac3_decode_transform_coeffs_aht_ch(AC3DecodeContext *s, int ch);
  209.  
  210. +/**
  211. + * Apply spectral extension to each channel by copying lower frequency
  212. + * coefficients to higher frequency bins and applying side information to
  213. + * approximate the original high frequency signal.
  214. + */
  215. +void ff_eac3_apply_spectral_extension(AC3DecodeContext *s);
  216. +
  217.  #endif /* AVCODEC_AC3DEC_H */
  218. diff --git a/libavcodec/ac3dec_data.c b/libavcodec/ac3dec_data.c
  219. index 907a3ae..abe359b 100644
  220. --- a/libavcodec/ac3dec_data.c
  221. +++ b/libavcodec/ac3dec_data.c
  222. @@ -64,3 +64,9 @@ const uint8_t ff_eac3_hebap_tab[64] = {
  223.   */
  224.  const uint8_t ff_eac3_default_cpl_band_struct[18] =
  225.  { 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1 };
  226. +
  227. +/**
  228. + * Table E2.15 Default Spectral Extension Banding Structure
  229. + */
  230. +const uint8_t ff_eac3_default_spx_band_struct[17] =
  231. +{ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 };
  232. diff --git a/libavcodec/ac3dec_data.h b/libavcodec/ac3dec_data.h
  233. index 8d9db05..9ed7c73 100644
  234. --- a/libavcodec/ac3dec_data.h
  235. +++ b/libavcodec/ac3dec_data.h
  236. @@ -29,5 +29,6 @@ extern const uint8_t ff_ac3_rematrix_band_tab[5];
  237.  
  238.  extern const uint8_t ff_eac3_hebap_tab[64];
  239.  extern const uint8_t ff_eac3_default_cpl_band_struct[18];
  240. +extern const uint8_t ff_eac3_default_spx_band_struct[17];
  241.  
  242.  #endif /* AVCODEC_AC3DEC_DATA_H */
  243. diff --git a/libavcodec/eac3dec.c b/libavcodec/eac3dec.c
  244. index 3784ccf..3a78540 100644
  245. --- a/libavcodec/eac3dec.c
  246. +++ b/libavcodec/eac3dec.c
  247. @@ -23,10 +23,6 @@
  248.  /*
  249.   * There are several features of E-AC-3 that this decoder does not yet support.
  250.   *
  251. - * Spectral Extension
  252. - *     There is a patch to get this working for the two samples we have that
  253. - *     use it, but it needs some minor changes in order to be accepted.
  254. - *
  255.   * Enhanced Coupling
  256.   *     No known samples exist.  If any ever surface, this feature should not be
  257.   *     too difficult to implement.
  258. @@ -67,6 +63,95 @@ typedef enum {
  259.  
  260.  #define EAC3_SR_CODE_REDUCED  3
  261.  
  262. +void ff_eac3_apply_spectral_extension(AC3DecodeContext *s)
  263. +{
  264. +    int bin, bnd, ch, i;
  265. +    uint8_t wrapflag[SPX_MAX_BANDS]={1,0,}, num_copy_sections, copy_sizes[SPX_MAX_BANDS];
  266. +    float rms_energy[SPX_MAX_BANDS];
  267. +
  268. +    /* Set copy index mapping table. Set wrap flags to apply a notch filter at
  269. +       wrap points later on. */
  270. +    bin = s->spx_copy_start_freq;
  271. +    num_copy_sections = 0;
  272. +    for (bnd = 0; bnd < s->num_spx_bands; bnd++) {
  273. +        int copysize;
  274. +        int bandsize = s->spx_band_sizes[bnd];
  275. +        if (bin + bandsize > s->spx_start_freq) {
  276. +            copy_sizes[num_copy_sections++] = bin - s->spx_copy_start_freq;
  277. +            bin = s->spx_copy_start_freq;
  278. +            wrapflag[bnd] = 1;
  279. +        }
  280. +        for (i = 0; i < bandsize; i += copysize) {
  281. +            if (bin == s->spx_start_freq) {
  282. +                copy_sizes[num_copy_sections++] = bin - s->spx_copy_start_freq;
  283. +                bin = s->spx_copy_start_freq;
  284. +            }
  285. +            copysize = FFMIN(bandsize - i, s->spx_start_freq - bin);
  286. +            bin += copysize;
  287. +        }
  288. +    }
  289. +    copy_sizes[num_copy_sections++] = bin - s->spx_copy_start_freq;
  290. +
  291. +    for (ch = 1; ch <= s->fbw_channels; ch++) {
  292. +        if (!s->channel_uses_spx[ch])
  293. +            continue;
  294. +
  295. +        /* Copy coeffs from normal bands to extension bands */
  296. +        bin = s->spx_start_freq;
  297. +        for (i = 0; i < num_copy_sections; i++) {
  298. +            memcpy(&s->transform_coeffs[ch][bin],
  299. +                   &s->transform_coeffs[ch][s->spx_copy_start_freq],
  300. +                   copy_sizes[i]*sizeof(float));
  301. +            bin += copy_sizes[i];
  302. +        }
  303. +
  304. +        /* Calculate RMS energy for each SPX band. */
  305. +        bin = s->spx_start_freq;
  306. +        for (bnd = 0; bnd < s->num_spx_bands; bnd++) {
  307. +            int bandsize = s->spx_band_sizes[bnd];
  308. +            float accum = 0.0f;
  309. +            for (i = 0; i < bandsize; i++) {
  310. +                float coeff = s->transform_coeffs[ch][bin++];
  311. +                accum += coeff * coeff;
  312. +            }
  313. +            rms_energy[bnd] = sqrtf(accum / bandsize);
  314. +        }
  315. +
  316. +        /* Apply a notch filter at transitions between normal and extension
  317. +           bands and at all wrap points. */
  318. +        if (s->spx_atten_code[ch] >= 0) {
  319. +            const float *atten_tab = ff_eac3_spx_atten_tab[s->spx_atten_code[ch]];
  320. +            bin = s->spx_start_freq - 2;
  321. +            for (bnd = 0; bnd < s->num_spx_bands; bnd++) {
  322. +                if (wrapflag[bnd]) {
  323. +                    float *coeffs = &s->transform_coeffs[ch][bin];
  324. +                    coeffs[0] *= atten_tab[0];
  325. +                    coeffs[1] *= atten_tab[1];
  326. +                    coeffs[2] *= atten_tab[2];
  327. +                    coeffs[3] *= atten_tab[1];
  328. +                    coeffs[4] *= atten_tab[0];
  329. +                }
  330. +                bin += s->spx_band_sizes[bnd];
  331. +            }
  332. +        }
  333. +
  334. +        /* Apply noise-blended coefficient scaling based on previously
  335. +           calculated RMS energy, blending factors, and SPX coordinates for
  336. +           each band. */
  337. +        bin = s->spx_start_freq;
  338. +        for (bnd = 0; bnd < s->num_spx_bands; bnd++) {
  339. +            float nscale = s->spx_noise_blend[ch][bnd] * rms_energy[bnd] * (1.0f/(1<<31));
  340. +            float sscale = s->spx_signal_blend[ch][bnd];
  341. +            for (i = 0; i < s->spx_band_sizes[bnd]; i++) {
  342. +                float noise  = nscale * (int32_t)av_lfg_get(&s->dith_state);
  343. +                s->transform_coeffs[ch][bin]   *= sscale;
  344. +                s->transform_coeffs[ch][bin++] += noise;
  345. +            }
  346. +        }
  347. +    }
  348. +}
  349. +
  350. +
  351.  /** lrint(M_SQRT2*cos(2*M_PI/12)*(1<<23)) */
  352.  #define COEFF_0 10273905LL
  353.  
  354. @@ -492,13 +577,11 @@ int ff_eac3_parse_header(AC3DecodeContext *s)
  355.      }
  356.  
  357.      /* spectral extension attenuation data */
  358. -    if (parse_spx_atten_data) {
  359. -        av_log_missing_feature(s->avctx, "Spectral extension attenuation", 1);
  360. -        for (ch = 1; ch <= s->fbw_channels; ch++) {
  361. -            if (get_bits1(gbc)) { // channel has spx attenuation
  362. -                skip_bits(gbc, 5); // skip spx attenuation code
  363. -            }
  364. -        }
  365. +    for (ch = 1; ch <= s->fbw_channels; ch++) {
  366. +        if (parse_spx_atten_data && get_bits1(gbc))
  367. +            s->spx_atten_code[ch] = get_bits(gbc, 5);
  368. +        else
  369. +            s->spx_atten_code[ch] = -1;
  370.      }
  371.  
  372.      /* block start information */
  373. @@ -514,6 +597,7 @@ int ff_eac3_parse_header(AC3DecodeContext *s)
  374.  
  375.      /* syntax state initialization */
  376.      for (ch = 1; ch <= s->fbw_channels; ch++) {
  377. +        s->first_spx_coords[ch] = 1;
  378.          s->first_cpl_coords[ch] = 1;
  379.      }
  380.      s->first_cpl_leak = 1;
  381. diff --git a/libavcodec/eac3dec_data.c b/libavcodec/eac3dec_data.c
  382. index 6c6a551..9e9f8a2 100644
  383. --- a/libavcodec/eac3dec_data.c
  384. +++ b/libavcodec/eac3dec_data.c
  385. @@ -1093,3 +1093,42 @@ const uint8_t ff_eac3_frm_expstr[32][6] = {
  386.  {    EXP_D45,    EXP_D45,    EXP_D45,    EXP_D45,    EXP_D25,  EXP_REUSE},
  387.  {    EXP_D45,    EXP_D45,    EXP_D45,    EXP_D45,    EXP_D45,    EXP_D45},
  388.  };
  389. +
  390. +/**
  391. + * Table E.25: Spectral Extension Attenuation Table
  392. + * ff_eac3_spx_atten_tab[code][bin]=pow(2.0,(bin+1)*(code+1)/-15.0);
  393. + */
  394. +const float ff_eac3_spx_atten_tab[32][3] = {
  395. +    { 0.954841603910416503f, 0.911722488558216804f, 0.870550563296124125f },
  396. +    { 0.911722488558216804f, 0.831237896142787758f, 0.757858283255198995f },
  397. +    { 0.870550563296124125f, 0.757858283255198995f, 0.659753955386447100f },
  398. +    { 0.831237896142787758f, 0.690956439983888004f, 0.574349177498517438f },
  399. +    { 0.793700525984099792f, 0.629960524947436595f, 0.500000000000000000f },
  400. +    { 0.757858283255198995f, 0.574349177498517438f, 0.435275281648062062f },
  401. +    { 0.723634618720189082f, 0.523647061410313364f, 0.378929141627599553f },
  402. +    { 0.690956439983888004f, 0.477420801955208307f, 0.329876977693223550f },
  403. +    { 0.659753955386447100f, 0.435275281648062062f, 0.287174588749258719f },
  404. +    { 0.629960524947436595f, 0.396850262992049896f, 0.250000000000000000f },
  405. +    { 0.601512518041058319f, 0.361817309360094541f, 0.217637640824031003f },
  406. +    { 0.574349177498517438f, 0.329876977693223550f, 0.189464570813799776f },
  407. +    { 0.548412489847312945f, 0.300756259020529160f, 0.164938488846611775f },
  408. +    { 0.523647061410313364f, 0.274206244923656473f, 0.143587294374629387f },
  409. +    { 0.500000000000000000f, 0.250000000000000000f, 0.125000000000000000f },
  410. +    { 0.477420801955208307f, 0.227930622139554201f, 0.108818820412015502f },
  411. +    { 0.455861244279108402f, 0.207809474035696939f, 0.094732285406899888f },
  412. +    { 0.435275281648062062f, 0.189464570813799776f, 0.082469244423305887f },
  413. +    { 0.415618948071393879f, 0.172739109995972029f, 0.071793647187314694f },
  414. +    { 0.396850262992049896f, 0.157490131236859149f, 0.062500000000000000f },
  415. +    { 0.378929141627599553f, 0.143587294374629387f, 0.054409410206007751f },
  416. +    { 0.361817309360094541f, 0.130911765352578369f, 0.047366142703449930f },
  417. +    { 0.345478219991944002f, 0.119355200488802049f, 0.041234622211652958f },
  418. +    { 0.329876977693223550f, 0.108818820412015502f, 0.035896823593657347f },
  419. +    { 0.314980262473718298f, 0.099212565748012460f, 0.031250000000000000f },
  420. +    { 0.300756259020529160f, 0.090454327340023621f, 0.027204705103003875f },
  421. +    { 0.287174588749258719f, 0.082469244423305887f, 0.023683071351724965f },
  422. +    { 0.274206244923656473f, 0.075189064755132290f, 0.020617311105826479f },
  423. +    { 0.261823530705156682f, 0.068551561230914118f, 0.017948411796828673f },
  424. +    { 0.250000000000000000f, 0.062500000000000000f, 0.015625000000000000f },
  425. +    { 0.238710400977604098f, 0.056982655534888536f, 0.013602352551501938f },
  426. +    { 0.227930622139554201f, 0.051952368508924235f, 0.011841535675862483f }
  427. +};
  428. diff --git a/libavcodec/eac3dec_data.h b/libavcodec/eac3dec_data.h
  429. index 76dd154..1331833 100644
  430. --- a/libavcodec/eac3dec_data.h
  431. +++ b/libavcodec/eac3dec_data.h
  432. @@ -31,5 +31,6 @@ extern const int16_t ff_eac3_gaq_remap_2_4_b[9][2];
  433.  
  434.  extern const int16_t (* const ff_eac3_mantissa_vq[8])[6];
  435.  extern const uint8_t ff_eac3_frm_expstr[32][6];
  436. +extern const float   ff_eac3_spx_atten_tab[32][3];
  437.  
  438.  #endif /* AVCODEC_EAC3DEC_DATA_H */