mpegtoraw.cpp
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:12k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /* MPEG/WAVE Sound library
  2.    (C) 1997 by Jung woo-jae */
  3. // Mpegtoraw.cc
  4. // Server which get mpeg format and put raw format.
  5. #ifdef HAVE_CONFIG_H
  6. #include "config.h"
  7. #endif
  8. #include <math.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11. #include <assert.h>
  12. #ifdef DEBUG_AUDIO
  13. #include <stdio.h>
  14. #endif
  15. #include "MPEGaudio.h"
  16. #if 0
  17. #include "MPEGstream.h"
  18. #endif
  19. #if defined(_WIN32)
  20. #include <windows.h>
  21. #endif
  22. #define MY_PI 3.14159265358979323846
  23. #if SDL_BYTEORDER == SDL_LIL_ENDIAN
  24. #define _KEY 0
  25. #else
  26. #define _KEY 3
  27. #endif
  28. int MPEGaudio::getbits( int bits )
  29. {
  30.     union
  31.     {
  32.         char store[4];
  33.         int current;
  34.     } u;
  35.     int bi;
  36.     if( ! bits )
  37.         return 0;
  38.     u.current = 0;
  39.     bi = (bitindex & 7);
  40.     u.store[ _KEY ] = _buffer[ bitindex >> 3 ] << bi;
  41.     bi = 8 - bi;
  42.     bitindex += bi;
  43.     while( bits )
  44.     {
  45.         if( ! bi )
  46.         {
  47.             u.store[ _KEY ] = _buffer[ bitindex >> 3 ];
  48.             bitindex += 8;
  49.             bi = 8;
  50.         }
  51.         if( bits >= bi )
  52.         {
  53.             u.current <<= bi;
  54.             bits -= bi;
  55.             bi = 0;
  56.         }
  57.         else
  58.         {
  59.             u.current <<= bits;
  60.             bi -= bits;
  61.             bits = 0;
  62.         }
  63.     }
  64.     bitindex -= bi;
  65.     return( u.current >> 8 );
  66. }
  67. // Convert mpeg to raw
  68. // Mpeg headder class
  69. void MPEGaudio::initialize()
  70. {
  71.   static bool initialized = false;
  72.   register int i;
  73.   register REAL *s1,*s2;
  74.   REAL *s3,*s4;
  75.   forcetomonoflag = false;
  76.   forcetostereoflag = false;
  77.   downfrequency = 0;
  78.   scalefactor=SCALE;
  79.   calcbufferoffset=15;
  80.   currentcalcbuffer=0;
  81.   s1 = calcbufferL[0];
  82.   s2 = calcbufferR[0];
  83.   s3 = calcbufferL[1];
  84.   s4 = calcbufferR[1];
  85.   for(i=CALCBUFFERSIZE-1;i>=0;i--)
  86.   {
  87.     calcbufferL[0][i]=calcbufferL[1][i]=
  88.     calcbufferR[0][i]=calcbufferR[1][i]=0.0;
  89.   }
  90.   if( ! initialized )
  91.   {
  92.     for(i=0;i<16;i++) hcos_64[i] = (float)
  93. (1.0/(2.0*cos(MY_PI*double(i*2+1)/64.0)));
  94.     for(i=0;i< 8;i++) hcos_32[i] = (float)
  95. (1.0/(2.0*cos(MY_PI*double(i*2+1)/32.0)));
  96.     for(i=0;i< 4;i++) hcos_16[i] = (float)
  97. (1.0/(2.0*cos(MY_PI*double(i*2+1)/16.0)));
  98.     for(i=0;i< 2;i++) hcos_8 [i] = (float)
  99. (1.0/(2.0*cos(MY_PI*double(i*2+1)/ 8.0)));
  100.     hcos_4 = (float)(1.0f / (2.0f * cos( MY_PI * 1.0 / 4.0 )));
  101.     initialized = true;
  102.   }
  103.   layer3initialize();
  104. #if WMAY_OUT
  105. #ifdef THREADED_AUDIO
  106.   decode_thread = NULL;
  107.   ring = NULL;
  108. #endif
  109.   Rewind();
  110.   ResetSynchro(0);
  111. #endif
  112. };
  113. bool MPEGaudio::loadheader(void)
  114. {
  115.     register unsigned char c;
  116.     bool flag;
  117.     int sampling_freq;
  118.     flag = false;
  119.     do
  120.     {
  121. if (fillbuffer(4) == false)
  122. return false;
  123.         c = _buffer[0];
  124. _buffer++;
  125. _buflen--;
  126.         if( c == 0xff )
  127.         {
  128.             while( ! flag )
  129.             {
  130. c = _buffer[0];
  131. _buflen--;
  132. _buffer++;
  133.                 if( (c & 0xe0) == 0xe0 )
  134.                 {
  135.                     flag = true;
  136.                     break;
  137.                 }
  138.                 else if( c != 0xff )
  139.                 {
  140. return false;
  141.                 } 
  142.             }
  143.         } else {
  144. return false;
  145. }
  146.     } while( ! flag );
  147.     // Analyzing
  148.     if ((c & 0x10) == 0)
  149.       _mpeg25 = true;
  150.     else 
  151.       _mpeg25 = false;
  152.     c &= 0xf;
  153.     protection = c & 1;
  154.     layer = 4 - ((c >> 1) & 3);
  155.     if (_mpeg25 == false)
  156.       version = (_mpegversion) ((c >> 3) ^ 1);
  157.     else 
  158.       version = mpeg2;
  159. #if 0
  160.     c = mpeg->copy_byte() >> 1;
  161. #else
  162.     c = _buffer[0] >> 1;
  163. _buffer++;
  164. _buflen--;
  165. #endif
  166.     padding = (c & 1);
  167.     c >>= 1;
  168.     frequency = (_frequency) (c&3);
  169.     if (frequency == 3)
  170.         return false;
  171.     c >>= 2;
  172.     bitrateindex = (int) c;
  173.     if( bitrateindex == 15 )
  174.         return false;
  175.     sampling_freq = frequency + version * 3;
  176.     if (_mpeg25) sampling_freq += 3;
  177. #if 0
  178.     c = ((unsigned int)mpeg->copy_byte()) >> 4;
  179. #else
  180.     c = _buffer[0] >> 4;
  181. _buffer++;
  182. _buflen--;
  183. #endif
  184.     extendedmode = c & 3;
  185.     mode = (_mode) (c >> 2);
  186.     // Making information
  187.     inputstereo = (mode == single) ? 0 : 1;
  188. #if 0
  189.     forcetomonoflag = (!stereo && inputstereo);
  190.     forcetostereoflag = (stereo && !inputstereo);
  191. #else
  192.     forcetomonoflag = false;
  193.     forcetostereoflag = false;
  194. #endif
  195.     if(forcetomonoflag)
  196.         outputstereo=0;
  197.     else
  198.         outputstereo=inputstereo;
  199.     channelbitrate=bitrateindex;
  200.     if(inputstereo)
  201.     {
  202.         if(channelbitrate==4)
  203.             channelbitrate=1;
  204.         else
  205.             channelbitrate-=4;
  206.     }
  207.     if(channelbitrate==1 || channelbitrate==2)
  208.         tableindex=0;
  209.     else
  210.         tableindex=1;
  211.   if(layer==1)
  212.       subbandnumber=MAXSUBBAND;
  213.   else
  214.   {
  215.     if(!tableindex)
  216.       if(frequency==frequency32000)subbandnumber=12; else subbandnumber=8;
  217.     else if(frequency==frequency48000||
  218.         (channelbitrate>=3 && channelbitrate<=5))
  219.       subbandnumber=27;
  220.     else subbandnumber=30;
  221.   }
  222.   if(mode==single)stereobound=0;
  223.   else if(mode==joint)stereobound=(extendedmode+1)<<2;
  224.   else stereobound=subbandnumber;
  225.   if(stereobound>subbandnumber)stereobound=subbandnumber;
  226.   // framesize & slots
  227.   if(layer==1)
  228.   {
  229.     framesize=(12000*bitrate[version][0][bitrateindex])/
  230.               frequencies[sampling_freq];
  231.     if(frequency==frequency44100 && padding)framesize++;
  232.     framesize<<=2;
  233.   }
  234.   else
  235.   {
  236.     framesize=(144000*bitrate[version][layer-1][bitrateindex])/
  237.       (frequencies[sampling_freq]<<version);
  238.     if(padding)framesize++;
  239.     if(layer==3)
  240.     {
  241.       if(version)
  242.     layer3slots=framesize-((mode==single)?9:17)
  243.                          -(protection?0:2)
  244.                          -4;
  245.       else
  246.     layer3slots=framesize-((mode==single)?17:32)
  247.                          -(protection?0:2)
  248.                          -4;
  249.     }
  250.   }
  251. #ifdef DEBUG_AUDIO
  252.   fprintf(stderr, "MPEG %d audio layer %d (%d kbps), at %d Hz %s [%d]n", version+1, layer,  bitrate[version][layer-1][bitrateindex], frequencies[version][frequency], (mode == single) ? "mono" : "stereo", framesize);
  253. #endif
  254.   return true;
  255. }
  256. #if 0
  257. bool MPEGaudio::run( int frames, double *timestamp)
  258. {
  259.     double last_timestamp = -1;
  260.     int totFrames = frames;
  261.     for( ; frames; frames-- )
  262.     {
  263.         if( loadheader() == false ) {
  264.   return false;   
  265.         }
  266.         if (frames == totFrames  && timestamp != NULL)
  267.             if (last_timestamp != mpeg->timestamp){
  268. if (mpeg->timestamp_pos <= _buffer_pos)
  269.     last_timestamp = *timestamp = mpeg->timestamp;
  270.     }
  271.             else
  272.                 *timestamp = -1;
  273.         if     ( layer == 3 ) extractlayer3();
  274.         else if( layer == 2 ) extractlayer2();
  275.         else if( layer == 1 ) extractlayer1();
  276.         /* Handle expanding to stereo output */
  277.         if ( forcetostereoflag ) {
  278.             Sint16 *in, *out;
  279.             in = rawdata+rawdatawriteoffset;
  280.             rawdatawriteoffset *= 2;
  281.             out = rawdata+rawdatawriteoffset;
  282.             while ( in > rawdata ) {
  283.                 --in;
  284.                 *(--out) = *in;
  285.                 *(--out) = *in;
  286.             }
  287.         }
  288.         ++decodedframe;
  289. #ifndef THREADED_AUDIO
  290.         ++currentframe;
  291. #endif
  292.     }
  293.     return(true);
  294. }
  295. #ifdef THREADED_AUDIO
  296. int Decode_MPEGaudio(void *udata)
  297. {
  298.     MPEGaudio *audio = (MPEGaudio *)udata;
  299.     double timestamp;
  300. #if defined(_WIN32)
  301.     SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST);
  302. #endif
  303.     while ( audio->decoding && ! audio->mpeg->eof() ) {
  304.         audio->rawdata = (Sint16 *)audio->ring->NextWriteBuffer();
  305.         if ( audio->rawdata ) {
  306.             audio->rawdatawriteoffset = 0;
  307.             audio->run(1, &timestamp);
  308.     if((Uint32)audio->rawdatawriteoffset*2 <= audio->ring->BufferSize())
  309.       audio->ring->WriteDone(audio->rawdatawriteoffset*2, timestamp);
  310.         }
  311.     }
  312.     audio->decoding = false;
  313.     audio->decode_thread = NULL;
  314.     return(0);
  315. }
  316. #endif /* THREADED_AUDIO */
  317. // Helper function for SDL audio
  318. void Play_MPEGaudio(void *udata, Uint8 *stream, int len)
  319. {
  320.     MPEGaudio *audio = (MPEGaudio *)udata;
  321.     int volume;
  322.     long copylen;
  323.     /* Bail if audio isn't playing */
  324.     if ( audio->Status() != MPEG_PLAYING ) {
  325.         return;
  326.     }
  327.     volume = audio->volume;
  328.     /* Increment the current play time (assuming fixed frag size) */
  329.     switch (audio->frags_playing++) {
  330.       // Vivien: Well... the theorical way seems good to me :-)
  331.         case 0:        /* The first audio buffer is being filled */
  332.             break;
  333.         case 1:        /* The first audio buffer is starting playback */
  334.             audio->frag_time = SDL_GetTicks();
  335.             break;
  336.         default:    /* A buffer has completed, filling a new one */
  337.             audio->frag_time = SDL_GetTicks();
  338.             audio->play_time += ((double)len)/audio->rate_in_s;
  339.             break;
  340.     }
  341.     /* Copy the audio data to output */
  342. #ifdef THREADED_AUDIO
  343.     Uint8 *rbuf;
  344.     assert(audio);
  345.     assert(audio->ring);
  346.     do {
  347. /* this is empirical, I don't realy know how to find out when
  348.    a certain piece of audio has finished playing or even if
  349.    the timestamps refer to the time when the frame starts
  350.    playing or then the frame ends playing, but as is works
  351.    quite right */
  352.         copylen = audio->ring->NextReadBuffer(&rbuf);
  353.         if ( copylen > len ) {
  354.             SDL_MixAudio(stream, rbuf, len, volume);
  355.             audio->ring->ReadSome(len);
  356.             len = 0;
  357.     for (int i=0; i < N_TIMESTAMPS -1; i++)
  358. audio->timestamp[i] = audio->timestamp[i+1];
  359.     audio->timestamp[N_TIMESTAMPS-1] = audio->ring->ReadTimeStamp();
  360.         } else {
  361.             SDL_MixAudio(stream, rbuf, copylen, volume);
  362.             ++audio->currentframe;
  363.             audio->ring->ReadDone();
  364. //fprintf(stderr, "-");
  365.             len -= copylen;
  366.             stream += copylen;
  367.         }
  368. if (audio->timestamp[0] != -1){
  369.     double timeshift = audio->Time() - audio->timestamp[0];
  370.     double correction = 0;
  371.     assert(audio->timestamp >= 0);
  372.     if (fabs(timeshift) > 1.0){
  373.         correction = -timeshift;
  374. #ifdef DEBUG_TIMESTAMP_SYNC
  375.                 fprintf(stderr, "audio jump %fn", timeshift);
  376. #endif
  377.             } else
  378.         correction = -timeshift/100;
  379. #ifdef USE_TIMESTAMP_SYNC
  380.     audio->play_time += correction;
  381. #endif
  382. #ifdef DEBUG_TIMESTAMP_SYNC
  383.     fprintf(stderr, "raudio: time:%8.3f shift:%8.4f",
  384.                     audio->Time(), timeshift);
  385. #endif
  386.     audio->timestamp[0] = -1;
  387. }
  388.     } while ( copylen && (len > 0) && ((audio->currentframe < audio->decodedframe) || audio->decoding));
  389. #else
  390.     /* The length is interpreted as being in samples */
  391.     len /= 2;
  392.     /* Copy in any saved data */
  393.     if ( audio->rawdatawriteoffset > 0 ) {
  394.         copylen = (audio->rawdatawriteoffset-audio->rawdatareadoffset);
  395.         assert(copylen >= 0);
  396.         if ( copylen >= len ) {
  397.             SDL_MixAudio(stream, (Uint8 *)&audio->spillover[audio->rawdatareadoffset],
  398.                                                        len*2, volume);
  399.             audio->rawdatareadoffset += len;
  400.             return;
  401.         }
  402.         SDL_MixAudio(stream, (Uint8 *)&audio->spillover[audio->rawdatareadoffset],
  403.                                                        copylen*2, volume);
  404.         len -= copylen;
  405.         stream += copylen*2;
  406.     }
  407.     /* Copy in any new data */
  408.     audio->rawdata = (Sint16 *)stream;
  409.     audio->rawdatawriteoffset = 0;
  410.     audio->run(len/audio->samplesperframe);
  411.     len -= audio->rawdatawriteoffset;
  412.     stream += audio->rawdatawriteoffset*2;
  413.     /* Write a save buffer for remainder */
  414.     audio->rawdata = audio->spillover;
  415.     audio->rawdatawriteoffset = 0;
  416.     if ( audio->run(1) ) {
  417.         assert(audio->rawdatawriteoffset > len);
  418.         SDL_MixAudio(stream, (Uint8 *) audio->spillover, len*2, volume);
  419.         audio->rawdatareadoffset = len;
  420.     } else {
  421.         audio->rawdatareadoffset = 0;
  422.     }
  423. #endif
  424. }
  425. #endif
  426. // EOF