Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Common code between the AC-3 and E-AC-3 decoders
  3.  * Copyright (c) 2007 Bartlomiej Wolowiec <bartek.wolowiec@gmail.com>
  4.  *
  5.  * This file is part of FFmpeg.
  6.  *
  7.  * FFmpeg is free software; you can redistribute it and/or
  8.  * modify it under the terms of the GNU Lesser General Public
  9.  * License as published by the Free Software Foundation; either
  10.  * version 2.1 of the License, or (at your option) any later version.
  11.  *
  12.  * FFmpeg is distributed in the hope that it will be useful,
  13.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15.  * Lesser General Public License for more details.
  16.  *
  17.  * You should have received a copy of the GNU Lesser General Public
  18.  * License along with FFmpeg; if not, write to the Free Software
  19.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20.  */
  21.  
  22. /**
  23.  * @file
  24.  * Common code between the AC-3 and E-AC-3 decoders.
  25.  *
  26.  * Summary of MDCT Coefficient Grouping:
  27.  * The individual MDCT coefficient indices are often referred to in the
  28.  * (E-)AC-3 specification as frequency bins.  These bins are grouped together
  29.  * into subbands of 12 coefficients each.  The subbands are grouped together
  30.  * into bands as defined in the bitstream by the band structures, which
  31.  * determine the number of bands and the size of each band.  The full spectrum
  32.  * of 256 frequency bins is divided into 1 DC bin + 21 subbands = 253 bins.
  33.  * This system of grouping coefficients is used for channel bandwidth, stereo
  34.  * rematrixing, channel coupling, enhanced coupling, and spectral extension.
  35.  *
  36.  * +-+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+-+
  37.  * |1|  |12|  |  [12|12|12|12]  |  |  |  |  |  |  |  |  |  |  |  |  |3|
  38.  * +-+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+-+
  39.  * ~~~  ~~~~     ~~~~~~~~~~~~~                                      ~~~
  40.  *  |     |            |                                             |
  41.  *  |     |            |                    3 unused frequency bins--+
  42.  *  |     |            |
  43.  *  |     |            +--1 band containing 4 subbands
  44.  *  |     |
  45.  *  |     +--1 subband of 12 frequency bins
  46.  *  |
  47.  *  +--DC frequency bin
  48.  */
  49.  
  50. #ifndef AVCODEC_AC3DEC_H
  51. #define AVCODEC_AC3DEC_H
  52.  
  53. #include "libavutil/float_dsp.h"
  54. #include "libavutil/lfg.h"
  55. #include "ac3.h"
  56. #include "ac3dsp.h"
  57. #include "get_bits.h"
  58. #include "dsputil.h"
  59. #include "fft.h"
  60. #include "fmtconvert.h"
  61.  
  62. #define AC3_OUTPUT_LFEON  8
  63.  
  64. #define SPX_MAX_BANDS    17
  65.  
  66. /** Large enough for maximum possible frame size when the specification limit is ignored */
  67. #define AC3_FRAME_BUFFER_SIZE 32768
  68.  
  69. typedef struct AC3DecodeContext {
  70.     AVClass        *class;                  ///< class for AVOptions
  71.     AVCodecContext *avctx;                  ///< parent context
  72.     GetBitContext gbc;                      ///< bitstream reader
  73.  
  74. ///@name Bit stream information
  75. ///@{
  76.     int frame_type;                         ///< frame type                             (strmtyp)
  77.     int substreamid;                        ///< substream identification
  78.     int frame_size;                         ///< current frame size, in bytes
  79.     int bit_rate;                           ///< stream bit rate, in bits-per-second
  80.     int sample_rate;                        ///< sample frequency, in Hz
  81.     int num_blocks;                         ///< number of audio blocks
  82.     int bitstream_mode;                     ///< bitstream mode                         (bsmod)
  83.     int channel_mode;                       ///< channel mode                           (acmod)
  84.     int channel_layout;                     ///< channel layout
  85.     int lfe_on;                             ///< lfe channel in use
  86.     int channel_map;                        ///< custom channel map
  87.     int center_mix_level;                   ///< Center mix level index
  88.     int surround_mix_level;                 ///< Surround mix level index
  89.     int eac3;                               ///< indicates if current frame is E-AC-3
  90. ///@}
  91.  
  92.     int preferred_stereo_downmix;
  93.     float ltrt_center_mix_level;
  94.     float ltrt_surround_mix_level;
  95.     float loro_center_mix_level;
  96.     float loro_surround_mix_level;
  97.  
  98. ///@name Frame syntax parameters
  99.     int snr_offset_strategy;                ///< SNR offset strategy                    (snroffststr)
  100.     int block_switch_syntax;                ///< block switch syntax enabled            (blkswe)
  101.     int dither_flag_syntax;                 ///< dither flag syntax enabled             (dithflage)
  102.     int bit_allocation_syntax;              ///< bit allocation model syntax enabled    (bamode)
  103.     int fast_gain_syntax;                   ///< fast gain codes enabled                (frmfgaincode)
  104.     int dba_syntax;                         ///< delta bit allocation syntax enabled    (dbaflde)
  105.     int skip_syntax;                        ///< skip field syntax enabled              (skipflde)
  106.  ///@}
  107.  
  108. ///@name Standard coupling
  109.     int cpl_in_use[AC3_MAX_BLOCKS];         ///< coupling in use                        (cplinu)
  110.     int cpl_strategy_exists[AC3_MAX_BLOCKS];///< coupling strategy exists               (cplstre)
  111.     int channel_in_cpl[AC3_MAX_CHANNELS];   ///< channel in coupling                    (chincpl)
  112.     int phase_flags_in_use;                 ///< phase flags in use                     (phsflginu)
  113.     int phase_flags[AC3_MAX_CPL_BANDS];     ///< phase flags                            (phsflg)
  114.     int num_cpl_bands;                      ///< number of coupling bands               (ncplbnd)
  115.     uint8_t cpl_band_sizes[AC3_MAX_CPL_BANDS]; ///< number of coeffs in each coupling band
  116.     int firstchincpl;                       ///< first channel in coupling
  117.     int first_cpl_coords[AC3_MAX_CHANNELS]; ///< first coupling coordinates states      (firstcplcos)
  118.     int cpl_coords[AC3_MAX_CHANNELS][AC3_MAX_CPL_BANDS]; ///< coupling coordinates      (cplco)
  119. ///@}
  120.  
  121. ///@name Spectral extension
  122. ///@{
  123.     int spx_in_use;                             ///< spectral extension in use              (spxinu)
  124.     uint8_t channel_uses_spx[AC3_MAX_CHANNELS]; ///< channel uses spectral extension        (chinspx)
  125.     int8_t spx_atten_code[AC3_MAX_CHANNELS];    ///< spx attenuation code                   (spxattencod)
  126.     int spx_src_start_freq;                     ///< spx start frequency bin
  127.     int spx_dst_end_freq;                       ///< spx end frequency bin
  128.     int spx_dst_start_freq;                     ///< spx starting frequency bin for copying (copystartmant)
  129.                                                 ///< the copy region ends at the start of the spx region.
  130.     int num_spx_bands;                          ///< number of spx bands                    (nspxbnds)
  131.     uint8_t spx_band_sizes[SPX_MAX_BANDS];      ///< number of bins in each spx band
  132.     uint8_t first_spx_coords[AC3_MAX_CHANNELS]; ///< first spx coordinates states           (firstspxcos)
  133.     float spx_noise_blend[AC3_MAX_CHANNELS][SPX_MAX_BANDS]; ///< spx noise blending factor  (nblendfact)
  134.     float spx_signal_blend[AC3_MAX_CHANNELS][SPX_MAX_BANDS];///< spx signal blending factor (sblendfact)
  135. ///@}
  136.  
  137. ///@name Adaptive hybrid transform
  138.     int channel_uses_aht[AC3_MAX_CHANNELS];                         ///< channel AHT in use (chahtinu)
  139.     int pre_mantissa[AC3_MAX_CHANNELS][AC3_MAX_COEFS][AC3_MAX_BLOCKS];  ///< pre-IDCT mantissas
  140. ///@}
  141.  
  142. ///@name Channel
  143.     int fbw_channels;                           ///< number of full-bandwidth channels
  144.     int channels;                               ///< number of total channels
  145.     int lfe_ch;                                 ///< index of LFE channel
  146.     float downmix_coeffs[AC3_MAX_CHANNELS][2];  ///< stereo downmix coefficients
  147.     int downmixed;                              ///< indicates if coeffs are currently downmixed
  148.     int output_mode;                            ///< output channel configuration
  149.     int out_channels;                           ///< number of output channels
  150. ///@}
  151.  
  152. ///@name Dynamic range
  153.     float dynamic_range[2];                 ///< dynamic range
  154.     float drc_scale;                        ///< percentage of dynamic range compression to be applied
  155. ///@}
  156.  
  157. ///@name Bandwidth
  158.     int start_freq[AC3_MAX_CHANNELS];       ///< start frequency bin                    (strtmant)
  159.     int end_freq[AC3_MAX_CHANNELS];         ///< end frequency bin                      (endmant)
  160. ///@}
  161.  
  162. ///@name Rematrixing
  163.     int num_rematrixing_bands;              ///< number of rematrixing bands            (nrematbnd)
  164.     int rematrixing_flags[4];               ///< rematrixing flags                      (rematflg)
  165. ///@}
  166.  
  167. ///@name Exponents
  168.     int num_exp_groups[AC3_MAX_CHANNELS];           ///< Number of exponent groups      (nexpgrp)
  169.     int8_t dexps[AC3_MAX_CHANNELS][AC3_MAX_COEFS];  ///< decoded exponents
  170.     int exp_strategy[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS]; ///< exponent strategies        (expstr)
  171. ///@}
  172.  
  173. ///@name Bit allocation
  174.     AC3BitAllocParameters bit_alloc_params;         ///< bit allocation parameters
  175.     int first_cpl_leak;                             ///< first coupling leak state      (firstcplleak)
  176.     int snr_offset[AC3_MAX_CHANNELS];               ///< signal-to-noise ratio offsets  (snroffst)
  177.     int fast_gain[AC3_MAX_CHANNELS];                ///< fast gain values/SMR's         (fgain)
  178.     uint8_t bap[AC3_MAX_CHANNELS][AC3_MAX_COEFS];   ///< bit allocation pointers
  179.     int16_t psd[AC3_MAX_CHANNELS][AC3_MAX_COEFS];   ///< scaled exponents
  180.     int16_t band_psd[AC3_MAX_CHANNELS][AC3_CRITICAL_BANDS]; ///< interpolated exponents
  181.     int16_t mask[AC3_MAX_CHANNELS][AC3_CRITICAL_BANDS];     ///< masking curve values
  182.     int dba_mode[AC3_MAX_CHANNELS];                 ///< delta bit allocation mode
  183.     int dba_nsegs[AC3_MAX_CHANNELS];                ///< number of delta segments
  184.     uint8_t dba_offsets[AC3_MAX_CHANNELS][8];       ///< delta segment offsets
  185.     uint8_t dba_lengths[AC3_MAX_CHANNELS][8];       ///< delta segment lengths
  186.     uint8_t dba_values[AC3_MAX_CHANNELS][8];        ///< delta values for each segment
  187. ///@}
  188.  
  189. ///@name Zero-mantissa dithering
  190.     int dither_flag[AC3_MAX_CHANNELS];      ///< dither flags                           (dithflg)
  191.     AVLFG dith_state;                       ///< for dither generation
  192. ///@}
  193.  
  194. ///@name IMDCT
  195.     int block_switch[AC3_MAX_CHANNELS];     ///< block switch flags                     (blksw)
  196.     FFTContext imdct_512;                   ///< for 512 sample IMDCT
  197.     FFTContext imdct_256;                   ///< for 256 sample IMDCT
  198. ///@}
  199.  
  200. ///@name Optimization
  201.     DSPContext dsp;                         ///< for optimization
  202.     AVFloatDSPContext fdsp;
  203.     AC3DSPContext ac3dsp;
  204.     FmtConvertContext fmt_conv;             ///< optimized conversion functions
  205. ///@}
  206.  
  207.     float *outptr[AC3_MAX_CHANNELS];
  208.     float *xcfptr[AC3_MAX_CHANNELS];
  209.     float *dlyptr[AC3_MAX_CHANNELS];
  210.  
  211. ///@name Aligned arrays
  212.     DECLARE_ALIGNED(16, int32_t, fixed_coeffs)[AC3_MAX_CHANNELS][AC3_MAX_COEFS];     ///< fixed-point transform coefficients
  213.     DECLARE_ALIGNED(32, float, transform_coeffs)[AC3_MAX_CHANNELS][AC3_MAX_COEFS];   ///< transform coefficients
  214.     DECLARE_ALIGNED(32, float, delay)[AC3_MAX_CHANNELS][AC3_BLOCK_SIZE];             ///< delay - added to the next block
  215.     DECLARE_ALIGNED(32, float, window)[AC3_BLOCK_SIZE];                              ///< window coefficients
  216.     DECLARE_ALIGNED(32, float, tmp_output)[AC3_BLOCK_SIZE];                          ///< temporary storage for output before windowing
  217.     DECLARE_ALIGNED(32, float, output)[AC3_MAX_CHANNELS][AC3_BLOCK_SIZE];            ///< output after imdct transform and windowing
  218.     DECLARE_ALIGNED(32, uint8_t, input_buffer)[AC3_FRAME_BUFFER_SIZE + FF_INPUT_BUFFER_PADDING_SIZE]; ///< temp buffer to prevent overread
  219. ///@}
  220. } AC3DecodeContext;
  221.  
  222. /**
  223.  * Parse the E-AC-3 frame header.
  224.  * This parses both the bit stream info and audio frame header.
  225.  */
  226. int ff_eac3_parse_header(AC3DecodeContext *s);
  227.  
  228. /**
  229.  * Decode mantissas in a single channel for the entire frame.
  230.  * This is used when AHT mode is enabled.
  231.  */
  232. void ff_eac3_decode_transform_coeffs_aht_ch(AC3DecodeContext *s, int ch);
  233.  
  234. /**
  235.  * Apply spectral extension to each channel by copying lower frequency
  236.  * coefficients to higher frequency bins and applying side information to
  237.  * approximate the original high frequency signal.
  238.  */
  239. void ff_eac3_apply_spectral_extension(AC3DecodeContext *s);
  240.  
  241. #endif /* AVCODEC_AC3DEC_H */
  242.