AC3FileSrc.h
上传用户:tuheem
上传日期:2007-05-01
资源大小:21889k
文件大小:8k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. #ifndef f_AC3FILESRC_H
  2. #define f_AC3FILESRC_H
  3. #include <stdio.h>
  4. #include <windows.h>
  5. #include <vfw.h>
  6. /*  AC3 audio held in a WAV file
  7.     wFormatTag          WAVE_FORMAT_DOLBY_AC3
  8.     nChannels           1 -6 channels valid
  9.     nSamplesPerSec      48000, 44100, 32000
  10.     nAvgByesPerSec      4000 to 80000
  11.     nBlockAlign         128 - 3840
  12.     wBitsPerSample      Up to 24 bits - (in the original)
  13. */
  14. #define WAVE_FORMAT_DOLBY_AC3 0x2000
  15. typedef unsigned long  uint_32;
  16. typedef unsigned short uint_16;
  17. typedef unsigned char  uint_8;
  18. typedef signed long    sint_32;
  19. typedef signed short   sint_16;
  20. typedef signed char    sint_8;
  21. class AC3_SYNCINFO {
  22. public:
  23.   uint_32 magic;
  24.   /* Sync word == 0x0B77 */
  25.   /* uint_16 syncword; */
  26.   /* crc for the first 5/8 of the sync block */
  27.   /* uint_16 crc1; */
  28.   /* Stream Sampling Rate (kHz) 0 = 48, 1 = 44.1, 2 = 32, 3 = reserved */
  29.   uint_16 fscod;
  30.   /* Frame size code */
  31.   uint_16 frmsizecod;
  32.   
  33.   /* Information not in the AC-3 bitstream, but derived */
  34.   /* Frame size in 16 bit words */
  35.   uint_16 frame_size;
  36.   /* Bit rate in kilobits */
  37.   uint_16 bit_rate;
  38. };
  39. class AC3_BSI {
  40. public:
  41.   uint_32 magic;
  42.   /* Bit stream identification == 0x8 */
  43.   uint_16 bsid;
  44.   /* Bit stream mode */
  45.   uint_16 bsmod;
  46.   /* Audio coding mode */
  47.   uint_16 acmod;
  48.   /* If we're using the centre channel then */
  49.   /* centre mix level */
  50.   uint_16 cmixlev;
  51.   /* If we're using the surround channel then */
  52.   /* surround mix level */
  53.   uint_16 surmixlev;
  54.   /* If we're in 2/0 mode then */
  55.   /* Dolby surround mix level - NOT USED - */
  56.   uint_16 dsurmod;
  57.   /* Low frequency effects on */
  58.   uint_16 lfeon;
  59.   /* Dialogue Normalization level */
  60.   uint_16 dialnorm;
  61.   /* Compression exists */
  62.   uint_16 compre;
  63.   /* Compression level */
  64.   uint_16 compr;
  65.   /* Language code exists */
  66.   uint_16 langcode;
  67.   /* Language code */
  68.   uint_16 langcod;
  69.   /* Audio production info exists*/
  70.   uint_16 audprodie;
  71.   uint_16 mixlevel;
  72.   uint_16 roomtyp;
  73.   /* If we're in dual mono mode (acmod == 0) then extra stuff */
  74.   uint_16 dialnorm2;
  75.   uint_16 compr2e;
  76.   uint_16 compr2;
  77.   uint_16 langcod2e;
  78.   uint_16 langcod2;
  79.   uint_16 audprodi2e;
  80.   uint_16 mixlevel2;
  81.   uint_16 roomtyp2;
  82.   /* Copyright bit */
  83.   uint_16 copyrightb;
  84.   /* Original bit */
  85.   uint_16 origbs;
  86.   /* Timecode 1 exists */
  87.   uint_16 timecod1e;
  88.   /* Timecode 1 */
  89.   uint_16 timecod1;
  90.   /* Timecode 2 exists */
  91.   uint_16 timecod2e;
  92.   /* Timecode 2 */
  93.   uint_16 timecod2;
  94.   /* Additional bit stream info exists */
  95.   uint_16 addbsie;
  96.   /* Additional bit stream length - 1 (in bytes) */
  97.   uint_16 addbsil;
  98.   /* Additional bit stream information (max 64 bytes) */
  99.   uint_8 addbsi[64];
  100.   
  101.   /* Information not in the AC-3 bitstream, but derived */
  102.   /* Number of channels (excluding LFE)
  103.    * Derived from acmod */
  104.   uint_16 nfchans;
  105. };
  106. class AC3_AUDBLK {
  107. public:
  108.   uint_32 magic1;
  109.   /* block switch bit indexed by channel num */
  110.   uint_16 blksw[5];
  111.   /* dither enable bit indexed by channel num */
  112.   uint_16 dithflag[5];
  113.   /* dynamic range gain exists */
  114.   uint_16 dynrnge;
  115.   /* dynamic range gain */
  116.   uint_16 dynrng;
  117.   /* if acmod==0 then */
  118.   /* dynamic range 2 gain exists */
  119.   uint_16 dynrng2e;
  120.   /* dynamic range 2 gain */
  121.   uint_16 dynrng2;
  122.   /* coupling strategy exists */
  123.   uint_16 cplstre;
  124.   /* coupling in use */
  125.   uint_16 cplinu;
  126.   /* channel coupled */
  127.   uint_16 chincpl[5];
  128.   /* if acmod==2 then */
  129.   /* Phase flags in use */
  130.   uint_16 phsflginu;
  131.   /* coupling begin frequency code */
  132.   uint_16 cplbegf;
  133.   /* coupling end frequency code */
  134.   uint_16 cplendf;
  135.   /* coupling band structure bits */
  136.   uint_16 cplbndstrc[18];
  137.   /* Do coupling co-ords exist for this channel? */
  138.   uint_16 cplcoe[5];
  139.   /* Master coupling co-ordinate */
  140.   uint_16 mstrcplco[5];
  141.   /* Per coupling band coupling co-ordinates */
  142.   uint_16 cplcoexp[5][18];
  143.   uint_16 cplcomant[5][18];
  144.   /* Phase flags for dual mono */
  145.   uint_16 phsflg[18];
  146.   /* Is there a rematrixing strategy */
  147.   uint_16 rematstr;
  148.   /* Rematrixing bits */
  149.   uint_16 rematflg[4];
  150.   /* Coupling exponent strategy */
  151.   uint_16 cplexpstr;
  152.   /* Exponent strategy for full bandwidth channels */
  153.   uint_16 chexpstr[5];
  154.   /* Exponent strategy for lfe channel */
  155.   uint_16 lfeexpstr;
  156.   /* Channel bandwidth for independent channels */
  157.   uint_16 chbwcod[5];
  158.   /* The absolute coupling exponent */
  159.   uint_16 cplabsexp;
  160.   /* Coupling channel exponents (D15 mode gives 18 * 12 /3  encoded exponents */
  161.   uint_16 cplexps[18 * 12 / 3];
  162.   /* Sanity checking constant */
  163.   uint_32 magic2;
  164.   /* fbw channel exponents */
  165.   uint_16 exps[5][252 / 3];
  166.   /* channel gain range */
  167.   uint_16 gainrng[5];
  168.   /* low frequency exponents */
  169.   uint_16 lfeexps[3];
  170.   
  171.   /* Bit allocation info */
  172.   uint_16 baie;
  173.   /* Slow decay code */
  174.   uint_16 sdcycod;
  175.   /* Fast decay code */
  176.   uint_16 fdcycod;
  177.   /* Slow gain code */
  178.   uint_16 sgaincod;
  179.   /* dB per bit code */
  180.   uint_16 dbpbcod;
  181.   /* masking floor code */
  182.   uint_16 floorcod;
  183.   
  184.   /* SNR offset info */
  185.   uint_16 snroffste;
  186.   /* coarse SNR offset */
  187.   uint_16 csnroffst;
  188.   /* coupling fine SNR offset */
  189.   uint_16 cplfsnroffst;
  190.   /* coupling fast gain code */
  191.   uint_16 cplfgaincod;
  192.   /* fbw fine SNR offset */
  193.   uint_16 fsnroffst[5];
  194.   /* fbw fast gain code */
  195.   uint_16 fgaincod[5];
  196.   /* lfe fine SNR offset */
  197.   uint_16 lfefsnroffst;
  198.   /* lfe fast gain code */
  199.   uint_16 lfefgaincod;
  200.   
  201.   /* Coupling leak info */
  202.   uint_16 cplleake;
  203.   /* coupling fast leak initialization */
  204.   uint_16 cplfleak;
  205.   /* coupling slow leak initialization */
  206.   uint_16 cplsleak;
  207.   
  208.   /* delta bit allocation info */
  209.   uint_16 deltbaie;
  210.   /* coupling delta bit allocation exists */
  211.   uint_16 cpldeltbae;
  212.   /* fbw delta bit allocation exists */
  213.   uint_16 deltbae[5];
  214.   /* number of cpl delta bit segments */
  215.   uint_16 cpldeltnseg;
  216.   /* coupling delta bit allocation offset */
  217.   uint_16 cpldeltoffst[8];
  218.   /* coupling delta bit allocation length */
  219.   uint_16 cpldeltlen[8];
  220.   /* coupling delta bit allocation length */
  221.   uint_16 cpldeltba[8];
  222.   /* number of delta bit segments */
  223.   uint_16 deltnseg[5];
  224.   /* fbw delta bit allocation offset */
  225.   uint_16 deltoffst[5][8];
  226.   /* fbw delta bit allocation length */
  227.   uint_16 deltlen[5][8];
  228.   /* fbw delta bit allocation length */
  229.   uint_16 deltba[5][8];
  230.   
  231.   /* skip length exists */
  232.   uint_16 skiple;
  233.   /* skip length */
  234.   uint_16 skipl;
  235.   
  236.   /* channel mantissas */
  237.   uint_16 chmant[5][256];
  238.   
  239.   /* coupling mantissas */
  240.   uint_16 cplmant[256];
  241.   
  242.   /* coupling mantissas */
  243.   uint_16 lfemant[7];
  244.   
  245.   /*  -- Information not in the bitstream, but derived thereof  -- */
  246.   
  247.   /* Number of coupling sub-bands */
  248.   uint_16 ncplsubnd;
  249.   
  250.   /* Number of combined coupling sub-bands
  251.    * Derived from ncplsubnd and cplbndstrc */
  252.   uint_16 ncplbnd;
  253.   
  254.   /* Number of exponent groups by channel
  255.    * Derived from strmant, endmant */
  256.   uint_16 nchgrps[5];
  257.   
  258.   /* Number of coupling exponent groups
  259.    * Derived from cplbegf, cplendf, cplexpstr */
  260.   uint_16 ncplgrps;
  261.   
  262.   /* End mantissa numbers of fbw channels */
  263.   uint_16 endmant[5];
  264.   
  265.   /* Start and end mantissa numbers for the coupling channel */
  266.   uint_16 cplstrtmant;
  267.   uint_16 cplendmant;
  268.   
  269.   /* Decoded exponent info */
  270.   uint_16 fbw_exp[5][256];
  271.   uint_16 cpl_exp[256];
  272.   uint_16 lfe_exp[7];
  273.   
  274.   /* Bit allocation pointer results */
  275.   uint_16 fbw_bap[5][256];
  276.   /* FIXME figure out exactly how many entries there should be (253-37?) */
  277.   uint_16 cpl_bap[256];
  278.   uint_16 lfe_bap[7];
  279.   
  280.   uint_32 magic3;
  281. };
  282. class AC3_Bitstream {
  283. public:
  284.   FILE    *file;
  285.   uint_32 current_word;
  286.   uint_32 bits_left;
  287.   uint_32 total_bits_read;
  288.   BOOL    done;
  289.   long    total_bytes_read;
  290.   AC3_Bitstream(FILE *file);
  291.   ~AC3_Bitstream();
  292.   int GetBitSequence(uint_32 num_bits);
  293.   int Load();
  294.   int Resync();
  295. };
  296. class AC3FileSrc {
  297. public:
  298.   FILE          *m_ac3File;
  299.   AC3_Bitstream *m_ac3Bitstream;
  300.   AC3_SYNCINFO  *m_sync_info;
  301.   AC3_BSI       *m_bsi;
  302.   AC3_AUDBLK    *m_audblk;
  303. public:
  304.   AC3FileSrc(FILE *f);
  305.   ~AC3FileSrc();
  306.   BOOL Parse(LPWAVEFORMATEX fmt);
  307. private:
  308.   void ParseBSI();
  309.   void ParseSyncInfo();
  310. };
  311. #endif