www.pudn.com > XvidQP.rar > AC3FileSrc.h


#ifndef f_AC3FILESRC_H 
#define f_AC3FILESRC_H 
 
#include  
#include  
#include  
 
/*  AC3 audio held in a WAV file 
 
    wFormatTag          WAVE_FORMAT_DOLBY_AC3 
    nChannels           1 -6 channels valid 
    nSamplesPerSec      48000, 44100, 32000 
    nAvgByesPerSec      4000 to 80000 
    nBlockAlign         128 - 3840 
    wBitsPerSample      Up to 24 bits - (in the original) 
 
*/ 
 
#define WAVE_FORMAT_DOLBY_AC3 0x2000 
 
 
typedef unsigned long  uint_32; 
typedef unsigned short uint_16; 
typedef unsigned char  uint_8; 
 
typedef signed long    sint_32; 
typedef signed short   sint_16; 
typedef signed char    sint_8; 
 
class AC3_SYNCINFO { 
public: 
  uint_32 magic; 
  /* Sync word == 0x0B77 */ 
  /* uint_16 syncword; */ 
  /* crc for the first 5/8 of the sync block */ 
  /* uint_16 crc1; */ 
  /* Stream Sampling Rate (kHz) 0 = 48, 1 = 44.1, 2 = 32, 3 = reserved */ 
  uint_16 fscod;	 
  /* Frame size code */ 
  uint_16 frmsizecod; 
   
  /* Information not in the AC-3 bitstream, but derived */ 
  /* Frame size in 16 bit words */ 
  uint_16 frame_size; 
  /* Bit rate in kilobits */ 
  uint_16 bit_rate; 
}; 
 
class AC3_BSI { 
public: 
  uint_32 magic; 
  /* Bit stream identification == 0x8 */ 
  uint_16 bsid;	 
  /* Bit stream mode */ 
  uint_16 bsmod; 
  /* Audio coding mode */ 
  uint_16 acmod; 
  /* If we're using the centre channel then */ 
  /* centre mix level */ 
  uint_16 cmixlev; 
  /* If we're using the surround channel then */ 
  /* surround mix level */ 
  uint_16 surmixlev; 
  /* If we're in 2/0 mode then */ 
  /* Dolby surround mix level - NOT USED - */ 
  uint_16 dsurmod; 
  /* Low frequency effects on */ 
  uint_16 lfeon; 
  /* Dialogue Normalization level */ 
  uint_16 dialnorm; 
  /* Compression exists */ 
  uint_16 compre; 
  /* Compression level */ 
  uint_16 compr; 
  /* Language code exists */ 
  uint_16 langcode; 
  /* Language code */ 
  uint_16 langcod; 
  /* Audio production info exists*/ 
  uint_16 audprodie; 
  uint_16 mixlevel; 
  uint_16 roomtyp; 
  /* If we're in dual mono mode (acmod == 0) then extra stuff */ 
  uint_16 dialnorm2; 
  uint_16 compr2e; 
  uint_16 compr2; 
  uint_16 langcod2e; 
  uint_16 langcod2; 
  uint_16 audprodi2e; 
  uint_16 mixlevel2; 
  uint_16 roomtyp2; 
  /* Copyright bit */ 
  uint_16 copyrightb; 
  /* Original bit */ 
  uint_16 origbs; 
  /* Timecode 1 exists */ 
  uint_16 timecod1e; 
  /* Timecode 1 */ 
  uint_16 timecod1; 
  /* Timecode 2 exists */ 
  uint_16 timecod2e; 
  /* Timecode 2 */ 
  uint_16 timecod2; 
  /* Additional bit stream info exists */ 
  uint_16 addbsie; 
  /* Additional bit stream length - 1 (in bytes) */ 
  uint_16 addbsil; 
  /* Additional bit stream information (max 64 bytes) */ 
  uint_8	addbsi[64]; 
   
  /* Information not in the AC-3 bitstream, but derived */ 
  /* Number of channels (excluding LFE) 
   * Derived from acmod */ 
  uint_16 nfchans; 
}; 
 
class AC3_AUDBLK { 
public: 
  uint_32 magic1; 
  /* block switch bit indexed by channel num */ 
  uint_16 blksw[5]; 
  /* dither enable bit indexed by channel num */ 
  uint_16 dithflag[5]; 
  /* dynamic range gain exists */ 
  uint_16 dynrnge; 
  /* dynamic range gain */ 
  uint_16 dynrng; 
  /* if acmod==0 then */ 
  /* dynamic range 2 gain exists */ 
  uint_16 dynrng2e; 
  /* dynamic range 2 gain */ 
  uint_16 dynrng2; 
  /* coupling strategy exists */ 
  uint_16 cplstre; 
  /* coupling in use */ 
  uint_16 cplinu; 
  /* channel coupled */ 
  uint_16 chincpl[5]; 
  /* if acmod==2 then */ 
  /* Phase flags in use */ 
  uint_16 phsflginu; 
  /* coupling begin frequency code */ 
  uint_16 cplbegf; 
  /* coupling end frequency code */ 
  uint_16 cplendf; 
  /* coupling band structure bits */ 
  uint_16 cplbndstrc[18]; 
  /* Do coupling co-ords exist for this channel? */ 
  uint_16 cplcoe[5]; 
  /* Master coupling co-ordinate */ 
  uint_16 mstrcplco[5]; 
  /* Per coupling band coupling co-ordinates */ 
  uint_16 cplcoexp[5][18]; 
  uint_16 cplcomant[5][18]; 
  /* Phase flags for dual mono */ 
  uint_16 phsflg[18]; 
  /* Is there a rematrixing strategy */ 
  uint_16 rematstr; 
  /* Rematrixing bits */ 
  uint_16 rematflg[4]; 
  /* Coupling exponent strategy */ 
  uint_16 cplexpstr; 
  /* Exponent strategy for full bandwidth channels */ 
  uint_16 chexpstr[5]; 
  /* Exponent strategy for lfe channel */ 
  uint_16 lfeexpstr; 
  /* Channel bandwidth for independent channels */ 
  uint_16 chbwcod[5]; 
  /* The absolute coupling exponent */ 
  uint_16 cplabsexp; 
  /* Coupling channel exponents (D15 mode gives 18 * 12 /3  encoded exponents */ 
  uint_16 cplexps[18 * 12 / 3]; 
  /* Sanity checking constant */ 
  uint_32	magic2; 
  /* fbw channel exponents */ 
  uint_16 exps[5][252 / 3]; 
  /* channel gain range */ 
  uint_16 gainrng[5]; 
  /* low frequency exponents */ 
  uint_16 lfeexps[3]; 
   
  /* Bit allocation info */ 
  uint_16 baie; 
  /* Slow decay code */ 
  uint_16 sdcycod; 
  /* Fast decay code */ 
  uint_16 fdcycod; 
  /* Slow gain code */ 
  uint_16 sgaincod; 
  /* dB per bit code */ 
  uint_16 dbpbcod; 
  /* masking floor code */ 
  uint_16 floorcod; 
   
  /* SNR offset info */ 
  uint_16 snroffste; 
  /* coarse SNR offset */ 
  uint_16 csnroffst; 
  /* coupling fine SNR offset */ 
  uint_16 cplfsnroffst; 
  /* coupling fast gain code */ 
  uint_16 cplfgaincod; 
  /* fbw fine SNR offset */ 
  uint_16 fsnroffst[5]; 
  /* fbw fast gain code */ 
  uint_16 fgaincod[5]; 
  /* lfe fine SNR offset */ 
  uint_16 lfefsnroffst; 
  /* lfe fast gain code */ 
  uint_16 lfefgaincod; 
   
  /* Coupling leak info */ 
  uint_16 cplleake; 
  /* coupling fast leak initialization */ 
  uint_16 cplfleak; 
  /* coupling slow leak initialization */ 
  uint_16 cplsleak; 
   
  /* delta bit allocation info */ 
  uint_16 deltbaie; 
  /* coupling delta bit allocation exists */ 
  uint_16 cpldeltbae; 
  /* fbw delta bit allocation exists */ 
  uint_16 deltbae[5]; 
  /* number of cpl delta bit segments */ 
  uint_16 cpldeltnseg; 
  /* coupling delta bit allocation offset */ 
  uint_16 cpldeltoffst[8]; 
  /* coupling delta bit allocation length */ 
  uint_16 cpldeltlen[8]; 
  /* coupling delta bit allocation length */ 
  uint_16 cpldeltba[8]; 
  /* number of delta bit segments */ 
  uint_16 deltnseg[5]; 
  /* fbw delta bit allocation offset */ 
  uint_16 deltoffst[5][8]; 
  /* fbw delta bit allocation length */ 
  uint_16 deltlen[5][8]; 
  /* fbw delta bit allocation length */ 
  uint_16 deltba[5][8]; 
   
  /* skip length exists */ 
  uint_16 skiple; 
  /* skip length */ 
  uint_16 skipl; 
   
  /* channel mantissas */ 
  uint_16 chmant[5][256]; 
   
  /* coupling mantissas */ 
  uint_16 cplmant[256]; 
   
  /* coupling mantissas */ 
  uint_16 lfemant[7]; 
   
  /*  -- Information not in the bitstream, but derived thereof  -- */ 
   
  /* Number of coupling sub-bands */ 
  uint_16 ncplsubnd; 
   
  /* Number of combined coupling sub-bands 
   * Derived from ncplsubnd and cplbndstrc */ 
  uint_16 ncplbnd; 
   
  /* Number of exponent groups by channel 
   * Derived from strmant, endmant */ 
  uint_16 nchgrps[5]; 
   
  /* Number of coupling exponent groups 
   * Derived from cplbegf, cplendf, cplexpstr */ 
  uint_16 ncplgrps; 
   
  /* End mantissa numbers of fbw channels */ 
  uint_16 endmant[5]; 
   
  /* Start and end mantissa numbers for the coupling channel */ 
  uint_16 cplstrtmant; 
  uint_16 cplendmant; 
   
  /* Decoded exponent info */ 
  uint_16 fbw_exp[5][256]; 
  uint_16 cpl_exp[256]; 
  uint_16 lfe_exp[7]; 
   
  /* Bit allocation pointer results */ 
  uint_16 fbw_bap[5][256]; 
  /* FIXME figure out exactly how many entries there should be (253-37?) */ 
  uint_16 cpl_bap[256]; 
  uint_16 lfe_bap[7]; 
   
  uint_32 magic3; 
}; 
 
class AC3_Bitstream { 
public: 
  FILE    *file; 
  uint_32 current_word; 
  uint_32 bits_left; 
  uint_32 total_bits_read; 
  BOOL    done; 
  long    total_bytes_read; 
 
  AC3_Bitstream(FILE *file); 
  ~AC3_Bitstream(); 
 
  int GetBitSequence(uint_32 num_bits); 
  int Load(); 
  int Resync(); 
}; 
 
class AC3FileSrc { 
public: 
  FILE          *m_ac3File; 
  AC3_Bitstream *m_ac3Bitstream; 
  AC3_SYNCINFO  *m_sync_info; 
  AC3_BSI       *m_bsi; 
  AC3_AUDBLK    *m_audblk; 
 
public: 
  AC3FileSrc(FILE *f); 
  ~AC3FileSrc(); 
 
  BOOL Parse(LPWAVEFORMATEX fmt); 
 
private: 
  void ParseBSI(); 
  void ParseSyncInfo(); 
}; 
 
#endif