| /********** |
| This library is free software; you can redistribute it and/or modify it under |
| the terms of the GNU Lesser General Public License as published by the |
| Free Software Foundation; either version 3 of the License, or (at your |
| option) any later version. (See <http://www.gnu.org/copyleft/lesser.html>.) |
| |
| This library is distributed in the hope that it will be useful, but WITHOUT |
| ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS |
| FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for |
| more details. |
| |
| You should have received a copy of the GNU Lesser General Public License |
| along with this library; if not, write to the Free Software Foundation, Inc., |
| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
| **********/ |
| // "liveMedia" |
| // Copyright (c) 1996-2020 Live Networks, Inc. All rights reserved. |
| // MP3 internal implementation details |
| // C++ header |
| |
| #ifndef _MP3_INTERNALS_HH |
| #define _MP3_INTERNALS_HH |
| |
| #ifndef _BOOLEAN_HH |
| #include "Boolean.hh" |
| #endif |
| #ifndef _BIT_VECTOR_HH |
| #include "BitVector.hh" |
| #endif |
| |
| typedef struct MP3SideInfo { |
| unsigned main_data_begin; |
| unsigned private_bits; |
| typedef struct gr_info_s { |
| int scfsi; |
| unsigned part2_3_length; |
| unsigned big_values; |
| unsigned global_gain; |
| unsigned scalefac_compress; |
| unsigned window_switching_flag; |
| unsigned block_type; |
| unsigned mixed_block_flag; |
| unsigned table_select[3]; |
| unsigned region0_count; |
| unsigned region1_count; |
| unsigned subblock_gain[3]; |
| unsigned maxband[3]; |
| unsigned maxbandl; |
| unsigned maxb; |
| unsigned region1start; |
| unsigned region2start; |
| unsigned preflag; |
| unsigned scalefac_scale; |
| unsigned count1table_select; |
| double *full_gain[3]; |
| double *pow2gain; |
| } gr_info_s_t; |
| struct { |
| gr_info_s_t gr[2]; |
| } ch[2]; |
| } MP3SideInfo_t; |
| |
| #define SBLIMIT 32 |
| #define MAX_MP3_FRAME_SIZE 2500 /* also big enough for an 'ADU'ized frame */ |
| |
| class MP3FrameParams { |
| public: |
| MP3FrameParams(); |
| ~MP3FrameParams(); |
| |
| // 4-byte MPEG header: |
| unsigned hdr; |
| |
| // a buffer that can be used to hold the rest of the frame: |
| unsigned char frameBytes[MAX_MP3_FRAME_SIZE]; |
| |
| // public parameters derived from the header |
| void setParamsFromHeader(); // this sets them |
| Boolean isMPEG2; |
| unsigned layer; // currently only 3 is supported |
| unsigned bitrate; // in kbps |
| unsigned samplingFreq; |
| Boolean isStereo; |
| Boolean isFreeFormat; |
| unsigned frameSize; // doesn't include the initial 4-byte header |
| unsigned sideInfoSize; |
| Boolean hasCRC; |
| |
| void setBytePointer(unsigned char const* restOfFrame, |
| unsigned totNumBytes) {// called during setup |
| bv.setup((unsigned char*)restOfFrame, 0, 8*totNumBytes); |
| } |
| |
| // other, public parameters used when parsing input (perhaps get rid of) |
| unsigned oldHdr, firstHdr; |
| |
| // Extract (unpack) the side info from the frame into a struct: |
| void getSideInfo(MP3SideInfo& si); |
| |
| // The bit pointer used for reading data from frame data |
| unsigned getBits(unsigned numBits) { return bv.getBits(numBits); } |
| unsigned get1Bit() { return bv.get1Bit(); } |
| |
| private: |
| BitVector bv; |
| |
| // other, private parameters derived from the header |
| unsigned bitrateIndex; |
| unsigned samplingFreqIndex; |
| Boolean isMPEG2_5; |
| Boolean padding; |
| Boolean extension; |
| unsigned mode; |
| unsigned mode_ext; |
| Boolean copyright; |
| Boolean original; |
| unsigned emphasis; |
| unsigned stereo; |
| |
| private: |
| unsigned computeSideInfoSize(); |
| }; |
| |
| unsigned ComputeFrameSize(unsigned bitrate, unsigned samplingFreq, |
| Boolean usePadding, Boolean isMPEG2, |
| unsigned char layer); |
| |
| Boolean GetADUInfoFromMP3Frame(unsigned char const* framePtr, |
| unsigned totFrameSize, |
| unsigned& hdr, unsigned& frameSize, |
| MP3SideInfo& sideInfo, unsigned& sideInfoSize, |
| unsigned& backpointer, unsigned& aduSize); |
| |
| Boolean ZeroOutMP3SideInfo(unsigned char* framePtr, unsigned totFrameSize, |
| unsigned newBackpointer); |
| |
| unsigned TranscodeMP3ADU(unsigned char const* fromPtr, unsigned fromSize, |
| unsigned toBitrate, |
| unsigned char* toPtr, unsigned toMaxSize, |
| unsigned& availableBytesForBackpointer); |
| // returns the size of the resulting ADU (0 on failure) |
| |
| #endif |