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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. #include "MPEGaudio.h"
  2. MPEGaudio::MPEGaudio (void)
  3. {
  4.   initialize();
  5. }
  6. MPEGaudio::~MPEGaudio()
  7. {
  8. }
  9. bool MPEGaudio::fillbuffer(uint32_t _size)
  10. {
  11.   //printf("fillbuffer %dn", _size);
  12.   //int buflen = _buflen;
  13.   if (_size > _buflen) {
  14.       return false;
  15.   }
  16.   bitindex = 0;
  17.   return true;
  18. }
  19. int MPEGaudio::findheader (uint8_t *frombuffer, 
  20.    uint32_t frombuffer_len,
  21.    uint32_t *frameptr)
  22. {
  23.   for (uint32_t skipped = 0; 
  24.        skipped <= frombuffer_len - 4;
  25.        skipped++) {
  26.     if (frombuffer[skipped] == 0xff &&
  27. ((frombuffer[skipped + 1] & 0xe0) == 0xe0)) {
  28.       _buffer = (unsigned char *)frombuffer + skipped;
  29.       _buflen = frombuffer_len - skipped;
  30.       if (loadheader()) {
  31. /* Fill the buffer with new data */
  32. if (frameptr != NULL) {
  33.   *frameptr = framesize;
  34. }
  35. return skipped;
  36.       }
  37.     }
  38.       
  39.   }
  40.   return -1;
  41. }
  42. int MPEGaudio::decodeFrame (uint8_t *tobuffer, 
  43.     uint8_t *frombuffer, 
  44.     uint32_t fromlen)
  45. {
  46.   //printf("DecodeFramen");
  47.   _buffer = (unsigned char *)frombuffer;
  48.   _buflen = fromlen;
  49.   if (loadheader() == false) {
  50. #if 1
  51.     printf("Couldn't load mp3 header - orig %d buflen %dn", 
  52.    fromlen, _buflen);
  53. #endif
  54. #if 0
  55.     for (uint32_t ix = 0; ix < fromlen; ix += 8) {
  56.       printf("%4d %02x %02x %02x %02x  %02x %02x %02x %02xn",
  57.      ix, 
  58.      frombuffer[ix],
  59.      frombuffer[ix + 1],
  60.      frombuffer[ix + 2],
  61.      frombuffer[ix + 3],
  62.      frombuffer[ix + 4],
  63.      frombuffer[ix + 5],
  64.      frombuffer[ix + 6],
  65.      frombuffer[ix + 7]);
  66.     }
  67. #endif
  68.     return fromlen - _buflen;
  69.   }
  70.  
  71.   /* Fill the buffer with new data */
  72.   if(!fillbuffer(framesize-4))
  73.     return false;
  74.   if(!protection)
  75.   {
  76.     getbyte();                      // CRC, Not check!!
  77.     getbyte();
  78.   }
  79.   rawdata = (short *)tobuffer;
  80.   rawdatawriteoffset = 0;
  81.   if (layer == 3) extractlayer3();
  82.   else if (layer == 2) extractlayer2();
  83.   else if (layer == 1) extractlayer1();
  84. #if 0
  85.   printf("orig %d buflen %d framesize %dn", 
  86.  fromlen, _buflen, framesize - 4);
  87. #endif
  88.   return ((fromlen - _buflen) + (framesize - 4));
  89. }
  90.