blob: 6301af865ce53078a0ad4e6c2c6b580900b884d6 [file] [log] [blame]
/**********
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