/********** 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 .) 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-2017 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