MPEGaudio.h
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:11k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.     SMPEG - SDL MPEG Player Library
  3.     Copyright (C) 1999  Loki Entertainment Software
  4.     This library is free software; you can redistribute it and/or
  5.     modify it under the terms of the GNU Library General Public
  6.     License as published by the Free Software Foundation; either
  7.     version 2 of the License, or (at your option) any later version.
  8.     This library is distributed in the hope that it will be useful,
  9.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11.     Library General Public License for more details.
  12.     You should have received a copy of the GNU Library General Public
  13.     License along with this library; if not, write to the Free
  14.     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  15. */
  16. /* A class based on the MPEG stream class, used to parse and play audio */
  17. #ifndef _MPEGAUDIO_H_
  18. #define _MPEGAUDIO_H_
  19. #include "systems.h"
  20. /* This improves the performance of the audio player by quite a bit */
  21. #define THREADED_AUDIO
  22. #include "SDL.h"
  23. #include "MPEGerror.h"
  24. #include "MPEGaction.h"
  25. #ifdef THREADED_AUDIO
  26. #include "MPEGring.h"
  27. #endif
  28. class MPEGstream;
  29. /* MPEG/WAVE Sound library
  30.    (C) 1997 by Woo-jae Jung */
  31. /**************************/
  32. /* Define values for MPEG */
  33. /**************************/
  34. #define SCALEBLOCK     12
  35. #define CALCBUFFERSIZE 512
  36. #define MAXSUBBAND     32
  37. #define MAXCHANNEL     2
  38. #define MAXTABLE       2
  39. #define SCALE          32768
  40. #define MAXSCALE       (SCALE-1)
  41. #define MINSCALE       (-SCALE)
  42. #define RAWDATASIZE    (2*2*32*SSLIMIT)
  43. #define LS 0
  44. #define RS 1
  45. #define SSLIMIT      18
  46. #define SBLIMIT      32
  47. #define WINDOWSIZE    4096
  48. // Huffmancode
  49. #define HTN 34
  50. /********************/
  51. /* Type definitions */
  52. /********************/
  53. typedef float REAL;
  54. typedef struct
  55. {
  56.   bool         generalflag;
  57.   unsigned int part2_3_length;
  58.   unsigned int big_values;
  59.   unsigned int global_gain;
  60.   unsigned int scalefac_compress;
  61.   unsigned int window_switching_flag;
  62.   unsigned int block_type;
  63.   unsigned int mixed_block_flag;
  64.   unsigned int table_select[3];
  65.   unsigned int subblock_gain[3];
  66.   unsigned int region0_count;
  67.   unsigned int region1_count;
  68.   unsigned int preflag;
  69.   unsigned int scalefac_scale;
  70.   unsigned int count1table_select;
  71. }layer3grinfo;
  72. typedef struct
  73. {
  74.   unsigned main_data_begin;
  75.   unsigned private_bits;
  76.   struct
  77.   {
  78.     unsigned scfsi[4];
  79.     layer3grinfo gr[2];
  80.   }ch[2];
  81. }layer3sideinfo;
  82. typedef struct
  83. {
  84.   int l[23];            /* [cb] */
  85.   int s[3][13];         /* [window][cb] */
  86. }layer3scalefactor;     /* [ch] */
  87. typedef struct
  88. {
  89.   int tablename;
  90.   unsigned int xlen,ylen;
  91.   unsigned int linbits;
  92.   unsigned int treelen;
  93.   const unsigned int (*val)[2];
  94. }HUFFMANCODETABLE;
  95. // Class for Mpeg layer3
  96. class Mpegbitwindow
  97. {
  98. public:
  99.   Mpegbitwindow(){bitindex=point=0;};
  100.   void initialize(void)  {bitindex=point=0;};
  101.   int  gettotalbit(void) const {return bitindex;};
  102.   void putbyte(int c)    {buffer[point&(WINDOWSIZE-1)]=c;point++;};
  103.   void wrap(void);
  104.   void rewind(int bits)  {bitindex-=bits;};
  105.   void forward(int bits) {bitindex+=bits;};
  106.   int getbit(void) {
  107.       register int r=(buffer[bitindex>>3]>>(7-(bitindex&7)))&1;
  108.       bitindex++;
  109.       return r;
  110.   }
  111.   int getbits9(int bits)
  112.   {
  113.       register unsigned short a;
  114.       { int offset=bitindex>>3;
  115.         a=(((unsigned char)buffer[offset])<<8) | ((unsigned char)buffer[offset+1]);
  116.       }
  117.       a<<=(bitindex&7);
  118.       bitindex+=bits;
  119.       return (int)((unsigned int)(a>>(16-bits)));
  120.   }
  121.   int  getbits(int bits);
  122. private:
  123.   int  point,bitindex;
  124.   char buffer[2*WINDOWSIZE];
  125. };
  126. /* The actual MPEG audio class */
  127. #if 0
  128. class MPEGaudio : public MPEGerror, public MPEGaudioaction {
  129.     friend void Play_MPEGaudio(void *udata, Uint8 *stream, int len);
  130. #ifdef THREADED_AUDIO
  131.     friend int Decode_MPEGaudio(void *udata);
  132. #endif
  133. public:
  134.     MPEGaudio(MPEGstream *stream, bool initSDL = true);
  135.     virtual ~MPEGaudio();
  136.     /* MPEG actions */
  137.     bool GetAudioInfo(MPEG_AudioInfo *info);
  138.     double Time(void);
  139.     void Play(void);
  140.     void Stop(void);
  141.     void Rewind(void);
  142.     void ResetSynchro(double time);
  143.     void Skip(float seconds);
  144.     void Volume(int vol);
  145.     MPEGstatus Status(void);
  146.     /* Returns the desired SDL audio spec for this stream */
  147.     bool WantedSpec(SDL_AudioSpec *wanted);
  148.     /* Inform SMPEG of the actual audio format if configuring SDL
  149.        outside of this class */
  150.     void ActualSpec(const SDL_AudioSpec *actual);
  151. }
  152. #endif
  153.  
  154. class MPEGaudio {
  155.  public:
  156.   MPEGaudio(void);
  157.   ~MPEGaudio();
  158.   int findheader(uint8_t *frombuffer,
  159.  uint32_t frombuffer_len,
  160.  uint32_t *framesize = NULL);
  161.   int decodeFrame(uint8_t *tobuffer,
  162.   uint8_t *frombuffer,
  163.   uint32_t frombuffer_len);
  164. protected:
  165.     bool sdl_audio;
  166. #if 0
  167.     MPEGstream *mpeg;
  168. #endif
  169.     int valid_stream;
  170.     bool stereo;
  171.     double rate_in_s;
  172. #if 0
  173.     Uint32 frags_playing;
  174.     Uint32 frag_time;
  175. #ifdef THREADED_AUDIO
  176.     bool decoding;
  177.     SDL_Thread *decode_thread;
  178.     void StartDecoding(void);
  179.     void StopDecoding(void);
  180. #endif
  181. #endif
  182. /* Code from splay 1.8.2 */
  183.   /*****************************/
  184.   /* Constant tables for layer */
  185.   /*****************************/
  186. private:
  187.   static const int bitrate[2][3][15],frequencies[9];
  188.   static const REAL scalefactorstable[64];
  189.   static const HUFFMANCODETABLE ht[HTN];
  190.   static const REAL filter[512];
  191.   static REAL hcos_64[16],hcos_32[8],hcos_16[4],hcos_8[2],hcos_4;
  192.   /*************************/
  193.   /* MPEG header variables */
  194.   /*************************/
  195. private:
  196.   int layer,protection,bitrateindex,padding,extendedmode;
  197.   bool _mpeg25;
  198.   enum _mpegversion  {mpeg1,mpeg2}                               version;
  199.   enum _mode    {fullstereo,joint,dual,single}                   mode;
  200.   enum _frequency {frequency44100,frequency48000,frequency32000} frequency;
  201.   /***************************************/
  202.   /* Interface for setting music quality */
  203.   /***************************************/
  204. private:
  205.   bool forcetomonoflag;
  206.   bool forcetostereoflag;
  207.   int  downfrequency;
  208. public:
  209.   void setforcetomono(bool flag);
  210.   void setdownfrequency(int value);
  211.   /******************************/
  212.   /* Frame management variables */
  213.   /******************************/
  214. private:
  215.   int decodedframe,currentframe,totalframe;
  216.   /***************************************/
  217.   /* Variables made by MPEG-Audio header */
  218.   /***************************************/
  219. private:
  220.   int tableindex,channelbitrate;
  221.   int stereobound,subbandnumber,inputstereo,outputstereo;
  222.   REAL scalefactor;
  223.   uint32_t framesize;
  224.   /*******************/
  225.   /* Mpegtoraw class */
  226.   /*******************/
  227. public:
  228.   void initialize();
  229.   bool run(int frames, double *timestamp = NULL);
  230.   void clearbuffer(void);
  231.   bool isstereo(void) { return inputstereo == 1; } ;
  232.   int getlayer(void) { return layer; };
  233.   int getfrequency(void) {
  234.     int index;
  235.     index = version * 3 + frequency;
  236.     if (_mpeg25) index += 3;
  237.     return frequencies[index];
  238.   } ;
  239.   int getversion(void) { return version;};
  240.   /*****************************/
  241.   /* Loading MPEG-Audio stream */
  242.   /*****************************/
  243. private:
  244.   unsigned char *_buffer;
  245.   uint32_t _buflen;
  246.   unsigned int _buffer_pos;
  247.   int  bitindex;
  248.   bool fillbuffer(uint32_t size);
  249.   void sync(void);
  250.   bool issync(void);
  251.   int getbyte(void);
  252.   int getbit(void);
  253.   int getbits8(void);
  254.   int getbits9(int bits);
  255.   int getbits(int bits);
  256.   /********************/
  257.   /* Global variables */
  258.   /********************/
  259. private:
  260.   int lastfrequency,laststereo;
  261.   // for Layer3
  262.   int layer3slots,layer3framestart,layer3part2start;
  263.   REAL prevblck[2][2][SBLIMIT][SSLIMIT];
  264.   int currentprevblock;
  265.   layer3sideinfo sideinfo;
  266.   layer3scalefactor scalefactors[2];
  267.   Mpegbitwindow bitwindow;
  268.   int wgetbit  (void)    {return bitwindow.getbit  ();    }
  269.   int wgetbits9(int bits){return bitwindow.getbits9(bits);}
  270.   int wgetbits (int bits){return bitwindow.getbits (bits);}
  271.   /*************************************/
  272.   /* Decoding functions for each layer */
  273.   /*************************************/
  274. private:
  275.   bool loadheader(void);
  276.   //
  277.   // Subbandsynthesis
  278.   //
  279.   REAL calcbufferL[2][CALCBUFFERSIZE],calcbufferR[2][CALCBUFFERSIZE];
  280.   int  currentcalcbuffer,calcbufferoffset;
  281.   void computebuffer(REAL *fraction,REAL buffer[2][CALCBUFFERSIZE]);
  282.   void generatesingle(void);
  283.   void generate(void);
  284.   void subbandsynthesis(REAL *fractionL,REAL *fractionR);
  285.   void computebuffer_2(REAL *fraction,REAL buffer[2][CALCBUFFERSIZE]);
  286.   void generatesingle_2(void);
  287.   void generate_2(void);
  288.   void subbandsynthesis_2(REAL *fractionL,REAL *fractionR);
  289.   // Extarctor
  290.   void extractlayer1(void);    // MPEG-1
  291.   void extractlayer2(void);
  292.   void extractlayer3(void);
  293.   void extractlayer3_2(void);  // MPEG-2
  294.   // Functions for layer 3
  295.   void layer3initialize(void);
  296.   bool layer3getsideinfo(void);
  297.   bool layer3getsideinfo_2(void);
  298.   void layer3getscalefactors(int ch,int gr);
  299.   void layer3getscalefactors_2(int ch);
  300.   void layer3huffmandecode(int ch,int gr,int out[SBLIMIT][SSLIMIT]);
  301.   REAL layer3twopow2(int scale,int preflag,int pretab_offset,int l);
  302.   REAL layer3twopow2_1(int a,int b,int c);
  303.   void layer3dequantizesample(int ch,int gr,int   in[SBLIMIT][SSLIMIT],
  304.                                 REAL out[SBLIMIT][SSLIMIT]);
  305.   void layer3fixtostereo(int gr,REAL  in[2][SBLIMIT][SSLIMIT]);
  306.   void layer3reorderandantialias(int ch,int gr,REAL  in[SBLIMIT][SSLIMIT],
  307.                                REAL out[SBLIMIT][SSLIMIT]);
  308.   void layer3hybrid(int ch,int gr,REAL in[SBLIMIT][SSLIMIT],
  309.                           REAL out[SSLIMIT][SBLIMIT]);
  310.   
  311.   void huffmandecoder_1(const HUFFMANCODETABLE *h,int *x,int *y);
  312.   void huffmandecoder_2(const HUFFMANCODETABLE *h,int *x,int *y,int *v,int *w);
  313.   /********************/
  314.   /* Playing raw data */
  315.   /********************/
  316. private:
  317.   int     samplesperframe;
  318.   int     rawdatareadoffset, rawdatawriteoffset;
  319.   short *rawdata;
  320. #ifdef THREADED_AUDIO
  321.   MPEG_ring *ring;
  322. #else
  323.   short  spillover[ RAWDATASIZE ];
  324. #endif
  325.   int volume;
  326.   void clearrawdata(void)    {
  327.         rawdatareadoffset=0;
  328.         rawdatawriteoffset=0;
  329.         rawdata=NULL;
  330.   }
  331.   void putraw(short int pcm) {rawdata[rawdatawriteoffset++]=pcm;}
  332.   /********************/
  333.   /* Timestamp sync   */
  334.   /********************/
  335. public:
  336. #define N_TIMESTAMPS 5
  337.   double timestamp[N_TIMESTAMPS];
  338. };
  339. #endif /* _MPEGAUDIO_H_ */