MP3Internals.hh
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:4k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /**********
  2. This library is free software; you can redistribute it and/or modify it under
  3. the terms of the GNU Lesser General Public License as published by the
  4. Free Software Foundation; either version 2.1 of the License, or (at your
  5. option) any later version. (See <http://www.gnu.org/copyleft/lesser.html>.)
  6. This library is distributed in the hope that it will be useful, but WITHOUT
  7. ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  8. FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for
  9. more details.
  10. You should have received a copy of the GNU Lesser General Public License
  11. along with this library; if not, write to the Free Software Foundation, Inc.,
  12. 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  13. **********/
  14. // "liveMedia"
  15. // Copyright (c) 1996-2001 Live Networks, Inc.  All rights reserved.
  16. // MP3 internal implementation details
  17. // C++ header
  18. #ifndef _MP3_INTERNALS_HH
  19. #define _MP3_INTERNALS_HH
  20. #ifndef _BOOLEAN_HH
  21. #include "Boolean.hh"
  22. #endif
  23. #ifndef _BIT_VECTOR_HH
  24. #include "BitVector.hh"
  25. #endif
  26. typedef struct MP3SideInfo {
  27.   unsigned main_data_begin;
  28.   unsigned private_bits;
  29.   typedef struct gr_info_s {
  30.     int scfsi;
  31.     unsigned part2_3_length;
  32.     unsigned big_values;
  33.     unsigned global_gain;
  34.     unsigned scalefac_compress;
  35.     unsigned window_switching_flag;
  36.     unsigned block_type;
  37.     unsigned mixed_block_flag;
  38.     unsigned table_select[3];
  39.     unsigned region0_count;
  40.     unsigned region1_count;
  41.     unsigned subblock_gain[3];
  42.     unsigned maxband[3];
  43.     unsigned maxbandl;
  44.     unsigned maxb;
  45.     unsigned region1start;
  46.     unsigned region2start;
  47.     unsigned preflag;
  48.     unsigned scalefac_scale;
  49.     unsigned count1table_select;
  50.     float *full_gain[3];
  51.     float *pow2gain;
  52.   } gr_info_s_t;
  53.   struct {
  54.     gr_info_s_t gr[2];
  55.   } ch[2];
  56. } MP3SideInfo_t;
  57. #define SBLIMIT 32
  58. #define MAX_MP3_FRAME_SIZE 2500 /* also big enough for an 'ADU'ized frame */
  59. class MP3FrameParams {
  60. public:
  61.   MP3FrameParams();
  62.   ~MP3FrameParams();
  63.   // 4-byte MPEG header:
  64.   unsigned hdr;
  65.   // a buffer that can be used to hold the rest of the frame:
  66.   unsigned char frameBytes[MAX_MP3_FRAME_SIZE];
  67.   // public parameters derived from the header
  68.   void setParamsFromHeader(); // this sets them
  69.   Boolean isMPEG2;
  70.   unsigned layer; // currently only 3 is supported
  71.   unsigned bitrate; // in kbps
  72.   unsigned samplingFreq;
  73.   Boolean isStereo;
  74.   Boolean isFreeFormat;
  75.   unsigned frameSize; // doesn't include the initial 4-byte header
  76.   unsigned sideInfoSize;
  77.   Boolean hasCRC;
  78.   void setBytePointer(unsigned char const* restOfFrame,
  79.       unsigned totNumBytes) {// called during setup
  80.     bv.setup((unsigned char*)restOfFrame, 0, 8*totNumBytes);
  81.   }
  82.   // other, public parameters used when parsing input (perhaps get rid of)
  83.   unsigned oldHdr, firstHdr;
  84.   // Extract (unpack) the side info from the frame into a struct:
  85.   void getSideInfo(MP3SideInfo& si);
  86.   // The bit pointer used for reading data from frame data
  87.   unsigned getBits(unsigned numBits) { return bv.getBits(numBits); }
  88.   unsigned get1Bit() { return bv.get1Bit(); }
  89. private:
  90.   BitVector bv;
  91.   // other, private parameters derived from the header
  92.   unsigned bitrateIndex;
  93.   unsigned samplingFreqIndex;
  94.   Boolean isMPEG2_5;
  95.   Boolean padding;
  96.   Boolean extension;
  97.   unsigned mode;
  98.   unsigned mode_ext;
  99.   Boolean copyright;
  100.   Boolean original;
  101.   unsigned emphasis;
  102.   unsigned stereo;
  103. private:
  104.   unsigned computeSideInfoSize();
  105. };
  106. unsigned ComputeFrameSize(unsigned bitrate, unsigned samplingFreq,
  107.   Boolean usePadding, Boolean isMPEG2,
  108.   unsigned char layer);
  109. Boolean GetADUInfoFromMP3Frame(unsigned char const* framePtr,
  110.        unsigned totFrameSize,
  111.        unsigned& hdr, unsigned& frameSize,
  112.        MP3SideInfo& sideInfo, unsigned& sideInfoSize,
  113.        unsigned& backpointer, unsigned& aduSize);
  114. Boolean ZeroOutMP3SideInfo(unsigned char* framePtr, unsigned totFrameSize,
  115.    unsigned newBackpointer);
  116. unsigned TranscodeMP3ADU(unsigned char const* fromPtr, unsigned fromSize,
  117.       unsigned toBitrate,
  118.       unsigned char* toPtr, unsigned toMaxSize,
  119.       unsigned& availableBytesForBackpointer);
  120.   // returns the size of the resulting ADU (0 on failure)
  121. #endif