diff options
Diffstat (limited to 'Src/replicant/nsmp3dec')
31 files changed, 2389 insertions, 0 deletions
diff --git a/Src/replicant/nsmp3dec/bitsequence.h b/Src/replicant/nsmp3dec/bitsequence.h new file mode 100644 index 00000000..df7b78b6 --- /dev/null +++ b/Src/replicant/nsmp3dec/bitsequence.h @@ -0,0 +1,69 @@ +/***************************************************************************\ + * +* MPEG Layer3-Audio Decoder +* © 1997-2006 by Fraunhofer IIS + * All Rights Reserved + * + * filename: bitsequence.h + * project : MPEG Decoder + * author : Martin Sieler + * date : 1997-12-23 + * contents/description: HEADER - bitsequence object + * + * +\***************************************************************************/ + +/* + * $Date: 2010/11/17 20:46:01 $ + * $Id: bitsequence.h,v 1.1 2010/11/17 20:46:01 audiodsp Exp $ + */ + +#ifndef __BITSEQUENCE_H__ +#define __BITSEQUENCE_H__ + +/* ------------------------ includes --------------------------------------*/ + +#include "bitstream.h" + +/*-------------------------- defines --------------------------------------*/ + +/*-------------------------------------------------------------------------*/ + +// +// Bitstream parser class. +// +// This helper class is basically a numerical value that can read itself from +// a CBitStream interface for convenience. The decoder almost completely +// does the bitstream parsing through CBitSequence rather than CBitStream +// directly. +// + +class CBitSequence +{ +public: + + CBitSequence(int nBits = 0) { m_nBits = nBits; m_nValue = 0; } + virtual ~CBitSequence() {} + + void SetNumberOfBits(int nBits) { m_nBits = nBits; } + int GetNumberOfBits() const { return m_nBits; } + + bool ReadFrom(CBitStream &Bs) { m_nValue = Bs.GetBits(m_nBits); return true; } + bool ReadFrom_Bit(CBitStream &Bs) { m_nValue = Bs.Get1Bit(); return true; } + bool ReadFrom(CBitStream &Bs, int nBits) { SetNumberOfBits(nBits); return ReadFrom(Bs); } + + bool Equals(int nValue) const { return (m_nValue == nValue); } + + int ToInt() const { return m_nValue; } + void FromInt(int nValue) { m_nValue = nValue; } + +protected: + +private: + + int m_nBits; + int m_nValue; +}; + +/*-------------------------------------------------------------------------*/ +#endif diff --git a/Src/replicant/nsmp3dec/bitstream.h b/Src/replicant/nsmp3dec/bitstream.h new file mode 100644 index 00000000..c72e4358 --- /dev/null +++ b/Src/replicant/nsmp3dec/bitstream.h @@ -0,0 +1,103 @@ +/***************************************************************************\ + * +* MPEG Layer3-Audio Decoder +* © 1997-2006 by Fraunhofer IIS + * All Rights Reserved + * + * filename: bitstream.h + * project : MPEG Decoder + * author : Martin Sieler + * date : 1997-12-05 + * contents/description: generic bitbuffer - HEADER + * + * +\***************************************************************************/ + +/* + * $Date: 2011/01/18 18:22:02 $ + * $Id: bitstream.h,v 1.4 2011/01/18 18:22:02 audiodsp Exp $ + */ + +#ifndef __BITSTREAM_H__ +#define __BITSTREAM_H__ + +/* ------------------------ includes --------------------------------------*/ + +/*-------------------------- defines --------------------------------------*/ + +class CGioBase; + +/*-------------------------------------------------------------------------*/ + +// +// Bitstream input class. +// +// This class defines the interface that the mp3 decoder object will +// read all of its bitstream input data from. +// + +class CBitStream +{ +public: + + CBitStream(int cbSize); + CBitStream(unsigned char *pBuf, int cbSize, bool fDataValid = false); + virtual ~CBitStream(); + + virtual void Reset(); + bool ByteAligned() const { return !(m_BitNdx & 7); } + bool ResetOccurred() { return m_ResetOccurred; } + void SetResetState(bool state) { m_ResetOccurred = state; } + + void Connect(CGioBase *pGB); + + void ResetBitCnt() { m_BitCnt = 0; } + int GetBitCnt() const { return m_BitCnt; } + + unsigned int GetBits(unsigned int nBits); // gets 16 bits or less + unsigned int GetBits8(unsigned int nBits); // gets 8 bits or less + unsigned int Get1Bit(); + unsigned long Get32Bits(); + + bool Ff(int nBits) { return ( (nBits > 0) ? Seek(nBits) : false); } + bool Rewind(int nBits) { return ( (nBits > 0) ? Seek(-nBits) : false); } + bool Seek(int nBits) + { + m_BitCnt += nBits; + m_ValidBits -= nBits; + m_BitNdx = (m_BitNdx+nBits) & m_bitMask; + return true; + } + + int GetValidBits() const { return m_ValidBits; } + int GetFree() const; + + void SetEof(); + int Fill(const unsigned char *pBuf, int cbSize); + int Fill(CBitStream &Bs, int cbSize); + +protected: + + int Refill(); + bool IsEof() const; + bool IsConnected() const; + +private: + + CGioBase *m_pGB; // I/O object + int m_nBytes; // size of buffer in bytes + int m_mask; + int m_nBits; // size of buffer in bits + int m_bitMask; + int m_ValidBits; // valid bits in buffer + int m_ReadOffset; // where to write next + int m_BitCnt; // bit counter + int m_BitNdx; // position of next bit in byte + bool m_fEof; // indication of input eof + unsigned char *m_Buf; // the buffer + bool m_fBufferIntern; // did we allocate the buffer ourselves + bool m_ResetOccurred; // reset just occurred, only for dynamic buffer used +}; + +/*-------------------------------------------------------------------------*/ +#endif diff --git a/Src/replicant/nsmp3dec/conceal.h b/Src/replicant/nsmp3dec/conceal.h new file mode 100644 index 00000000..c8408f23 --- /dev/null +++ b/Src/replicant/nsmp3dec/conceal.h @@ -0,0 +1,137 @@ +/***************************************************************************\ + * +* MPEG Layer3-Audio Decoder +* © 1997-2006 by Fraunhofer IIS + * All Rights Reserved + * + * filename: conceal.h + * project : ISO/MPEG-Decoder + * author : Stefan Gewinner + * date : 1998-05-26 + * contents/description: error concealment class - HEADER + * + * +\***************************************************************************/ + +/* + * $Date: 2010/11/17 20:46:02 $ + * $Id: conceal.h,v 1.1 2010/11/17 20:46:02 audiodsp Exp $ + */ + +#ifndef __CONCEAL_H__ +#define __CONCEAL_H__ + +/* ------------------------ includes --------------------------------------*/ + +#include "mpeg.h" + +/*-------------------------------------------------------------------------*/ + +// +// Error concealment class. +// +// This object is used to apply error concealment to a spectrum in case of +// CRC errors. CRC protection is optional for ISO/MPEG bitstreams. +// + +class CErrorConcealment +{ +public: + + CErrorConcealment(); + ~CErrorConcealment() {} + + void Init(); + + void Apply + ( + bool fApply, // true: restore, false: store + const MPEG_INFO &Info, + MP3SI &Si, + float *lpSpec, + int gr, + int ch + ); + + enum { MAX_SPECTRUM_DATA = 4 }; + +protected : + + // + // structure to hold information for one granule + // + typedef struct tagGRAN_DATA + { + MP3SI_GRCH gr; /* side info */ + float Rs[SBLIMIT*SSLIMIT]; /* line amplitudes */ + float nrg[23]; /* sf-band energies */ + int nrgValid; /* valid-flag for sf-band energies */ + +#ifdef DEBUG_CONCEALMENT + long frameNumber; +#endif + } GRAN_DATA; + + // + // structure for concealment data + // + typedef struct tagSPECTRUM_DATA + { + int writeOffset; /* place to store next valid granule */ + GRAN_DATA gran[MAX_SPECTRUM_DATA]; /* ring buffer */ + GRAN_DATA estGran; + } SPECTRUM_DATA; + + SPECTRUM_DATA SpecDataBuffer[2]; /* one buffer for each channel */ + + void Store + ( + const MPEG_INFO &Info, + const MP3SI &Si, + const float *lpSpec, + int gr, + int ch + ); + + void Restore + ( + const MPEG_INFO &Info, + MP3SI &Si, + float *lpSpec, + int gr, + int ch + ); + +#ifdef USE_ENERGY_PREDICTION + float predict(const float *hist, const float *coff, int n); + void adaptPredictor(const float *hist, float pwr, float *coff, float d, int n); +#endif + + void estimateBandEnergies(const MPEG_INFO &Info, GRAN_DATA *g); + void predictEnergies(const MPEG_INFO &Info, SPECTRUM_DATA *s); + + + // + // random seeds for the float and bit random generators + // + float ranHigh1(float a); + float ranHigh2(float a); + float ranLow(float a); + float ran3(long *idum); + int irbit2(unsigned long *iseed); + + int inext; + int inextp; + long ma [56]; + int iff ; + + long f_seed, w_seed ; + unsigned long b_seed ; + +#ifdef DEBUG_CONCEALMENT + long currentFrame ; +#endif +}; + +/*-------------------------------------------------------------------------*/ +#endif diff --git a/Src/replicant/nsmp3dec/crc16.h b/Src/replicant/nsmp3dec/crc16.h new file mode 100644 index 00000000..a8deb38e --- /dev/null +++ b/Src/replicant/nsmp3dec/crc16.h @@ -0,0 +1,35 @@ +/***************************************************************************\ + * +* MPEG Layer3-Audio Decoder +* © 1997-2006 by Fraunhofer IIS + * All Rights Reserved + * + * filename: crc16.h + * project : ISO/MPEG decoder + * author : Martin Sieler + * date : 1998-05-26 + * contents/description: functions to calculate a CRC-16 + * + * +\***************************************************************************/ + +/* + * $Date: 2010/11/17 20:46:02 $ + * $Id: crc16.h,v 1.1 2010/11/17 20:46:02 audiodsp Exp $ + */ + +#ifndef __CRC16_H__ +#define __CRC16_H__ + +/* ------------------------ includes --------------------------------------*/ + +/* ------------------------------------------------------------------------*/ + +class CBitStream; + +/* ------------------------------------------------------------------------*/ + +unsigned int CalcCrc(CBitStream &Bs, int len, unsigned int start); + +/*-------------------------------------------------------------------------*/ +#endif diff --git a/Src/replicant/nsmp3dec/giobase.h b/Src/replicant/nsmp3dec/giobase.h new file mode 100644 index 00000000..c30aab26 --- /dev/null +++ b/Src/replicant/nsmp3dec/giobase.h @@ -0,0 +1,46 @@ +/***************************************************************************\ + * +* MPEG Layer3-Audio Decoder +* © 1997-2006 by Fraunhofer IIS + * All Rights Reserved + * + * filename: giobase.h + * project : MPEG Decoder + * author : Martin Sieler + * date : 1998-02-11 + * contents/description: HEADER - basic I/O class for MPEG Decoder + * + * +\***************************************************************************/ + +/* + * $Date: 2010/11/17 20:46:02 $ + * $Id: giobase.h,v 1.1 2010/11/17 20:46:02 audiodsp Exp $ + */ + +#ifndef __GIOBASE_H__ +#define __GIOBASE_H__ + +/* ------------------------ includes --------------------------------------*/ + +#include "mp3sscdef.h" + +/*-------------------------- defines --------------------------------------*/ + +/*-------------------------------------------------------------------------*/ + +class CGioBase +{ +public: + + virtual SSC Read(void *pBuffer, int cbToRead, int *pcbRead) = 0; + virtual bool IsEof() const = 0; + +protected: + ~CGioBase() {} +private: + +}; + +/*-------------------------------------------------------------------------*/ +#endif diff --git a/Src/replicant/nsmp3dec/huffdec.h b/Src/replicant/nsmp3dec/huffdec.h new file mode 100644 index 00000000..069db7c0 --- /dev/null +++ b/Src/replicant/nsmp3dec/huffdec.h @@ -0,0 +1,57 @@ +/***************************************************************************\ + * +* MPEG Layer3-Audio Decoder +* © 1997-2006 by Fraunhofer IIS + * All Rights Reserved + * + * filename: huffdec.h + * project : ISO/MPEG Decoder + * author : Martin Sieler + * date : 1998-05-26 + * contents/description: main hufman decoding - HEADER + * + * +\***************************************************************************/ + +/* + * $Date: 2010/11/17 20:46:02 $ + * $Id: huffdec.h,v 1.1 2010/11/17 20:46:02 audiodsp Exp $ + */ + +#ifndef __HUFFDEC_H__ +#define __HUFFDEC_H__ + +/* ------------------------ includes --------------------------------------*/ + +#include "mpeg.h" +#include "huffmandecoder.h" + +/* ------------------------------------------------------------------------*/ + +// +// MPEG Layer-3 huffman decoding class. +// +// This class is derived from a CHuffmanDecoder object. In addition to +// the CHuffmanDecoder object, this object calculates the number of +// spectral lines in the big value area, the number of spectral lines in the +// count-one area and the region boundaries within the big value area from +// an MPEG Layer-3 bitstream sideinfo. +// + +class CMp3Huffman : protected CHuffmanDecoder +{ +public: + CMp3Huffman() {} + ~CMp3Huffman() {} + + void Read + ( + CBitStream &Bs, // where to read from + int *pISpectrum, // pointer to spectrum + MP3SI_GRCH &SiGrCh, // side info (granule/channel) + const MPEG_INFO &Info // mpeg info + ); +}; + +/*-------------------------------------------------------------------------*/ +#endif diff --git a/Src/replicant/nsmp3dec/huffmanbitobj.h b/Src/replicant/nsmp3dec/huffmanbitobj.h new file mode 100644 index 00000000..21f624d1 --- /dev/null +++ b/Src/replicant/nsmp3dec/huffmanbitobj.h @@ -0,0 +1,54 @@ +/***************************************************************************\ + * +* MPEG Layer3-Audio Decoder +* © 1997-2006 by Fraunhofer IIS + * All Rights Reserved + * + * filename: huffmanbitobj.h + * project : MPEG Decoder + * author : Martin Sieler + * date : 1997-12-29 + * contents/description: HEADER - Huffman Bit Object + * + * +\***************************************************************************/ + +/* + * $Date: 2011/01/18 23:00:53 $ + * $Id: huffmanbitobj.h,v 1.3 2011/01/18 23:00:53 audiodsp Exp $ + */ + +#ifndef __HUFFMANBITOBJ_H__ +#define __HUFFMANBITOBJ_H__ + +/* ------------------------ includes --------------------------------------*/ + +/*-------------------------- defines --------------------------------------*/ + +class CBitStream; +class CHuffmanTable; + +/*-------------------------------------------------------------------------*/ + +// +// Class holding one huffman value. +// +// This object reads and decodes one huffman value from a CBitStream +// object. One huffman value represents either two (big value part) or four +// spectral lines (count-one part). +// + +class CHuffmanBitObj +{ +public: + CHuffmanBitObj(const CHuffmanTable &HT); + virtual ~CHuffmanBitObj(); + + int ReadFrom(CBitStream &BS) const; + +private: + const CHuffmanTable& m_HuffmanTable; +}; + +/*-------------------------------------------------------------------------*/ +#endif diff --git a/Src/replicant/nsmp3dec/huffmandecoder.h b/Src/replicant/nsmp3dec/huffmandecoder.h new file mode 100644 index 00000000..5c4d4615 --- /dev/null +++ b/Src/replicant/nsmp3dec/huffmandecoder.h @@ -0,0 +1,85 @@ +/***************************************************************************\ + * +* MPEG Layer3-Audio Decoder +* © 1997-2006 by Fraunhofer IIS + * All Rights Reserved + * + * filename: huffmandecoder.h + * project : MPEG Decoder + * author : Martin Sieler + * date : 1998-02-08 + * contents/description: HEADER - huffman decoder + * + * +\***************************************************************************/ + +/* + * $Date: 2011/01/21 22:25:58 $ + * $Id: huffmandecoder.h,v 1.4 2011/01/21 22:25:58 audiodsp Exp $ + */ + +#ifndef __HUFFMANDECODER_H__ +#define __HUFFMANDECODER_H__ + +/* ------------------------ includes --------------------------------------*/ + +#include "bitsequence.h" +#include "huffmanbitobj.h" +#include "huffmantable.h" + +/*-------------------------- defines --------------------------------------*/ + +class CBitStream; + +/*-------------------------------------------------------------------------*/ + +// +// Huffman decoder (helper) class. +// +// This object reads and decodes MPEG Layer-3 huffman data. +// + +class CHuffmanDecoder +{ +public: + CHuffmanDecoder(); + virtual ~CHuffmanDecoder(); + + int ReadHuffmanCode(CBitStream &Bs, + int *pIsp, + const int *pTableSelect, + const int *pRegionEnd, + int Count1TableSelect, + int Part2_3Length); + +protected: + +private: + int ReadBigValues(CBitStream &Bs, + int *pIsp, + const int *pTableSelect, + const int *pRegionEnd); + + int ReadCount1Area(CBitStream &Bs, + int *pIsp, + int Count1TableSelect, + int Count1Start, + int Part2_3Length); +#ifdef _MSC_VER + // these only have one caller and inlining shows notable improvements in the profiler + __forceinline void ReadHuffmanDual (CBitStream &Bs, int *pIsp); + __forceinline void ReadHuffmanDualLin(CBitStream &Bs, int *pIsp); + __forceinline bool ReadHuffmanQuad (CBitStream &Bs, int *pIsp); +#else + void ReadHuffmanDual (CBitStream &Bs, int *pIsp); + void ReadHuffmanDualLin(CBitStream &Bs, int *pIsp); + bool ReadHuffmanQuad (CBitStream &Bs, int *pIsp); +#endif + + CHuffmanTable m_HuffmanTable; + CHuffmanBitObj m_HuffmanBitObj; + CBitSequence m_LinBits; +}; + +/*-------------------------------------------------------------------------*/ +#endif diff --git a/Src/replicant/nsmp3dec/huffmantable.h b/Src/replicant/nsmp3dec/huffmantable.h new file mode 100644 index 00000000..b8e7a9a7 --- /dev/null +++ b/Src/replicant/nsmp3dec/huffmantable.h @@ -0,0 +1,102 @@ +/***************************************************************************\ + * +* MPEG Layer3-Audio Decoder +* © 1997-2006 by Fraunhofer IIS + * All Rights Reserved + * + * filename: huffmantable.h + * project : MPEG Decoder + * author : Martin Sieler + * date : 1998-01-05 + * contents/description: HEADER - huffman table object + * + * +\***************************************************************************/ + +/* + * $Date: 2011/01/18 23:00:53 $ + * $Id: huffmantable.h,v 1.3 2011/01/18 23:00:53 audiodsp Exp $ + */ + +#ifndef __HUFFMANTABLE_H__ +#define __HUFFMANTABLE_H__ + +/* ------------------------ includes --------------------------------------*/ + +/*-------------------------- defines --------------------------------------*/ + +#define HUFFMAN_BITS_4 + +/*-------------------------------------------------------------------------*/ + +// Huffman tables. +// +// This object holds the huffman table for ISO/MPEG Layer-3. +// + typedef struct + { + const unsigned char length; + const unsigned char value; + } huffman_entry_t; + +class CHuffmanTable +{ +public: + + /*unsigned int nTableIndex; */ + CHuffmanTable(); + virtual ~CHuffmanTable(); + + void SetTableIndex(unsigned int _nTableIndex) + { nTableIndex = _nTableIndex; } + + unsigned int GetBitsPerLevel() const + { return BITS_PER_LEVEL; } + + unsigned int GetLinBits() const + { return ht[nTableIndex].linbits; } + + unsigned char GetCode (unsigned int nIndex, unsigned int nValue) const + { return (ht[nTableIndex].table[nIndex][nValue] & 0xff); } + + unsigned char GetLength(unsigned int nIndex, unsigned int nValue) const + { return ((ht[nTableIndex].table[nIndex][nValue] >> 8) & 0xff); } + + bool IsTableValid() const + { return (ht[nTableIndex].table ? true:false); } + + bool IsLengthZero(unsigned int nIndex, unsigned int nValue) const + { return ((ht[nTableIndex].table[nIndex][nValue] & 0xff00) == 0); } + + enum + { +#if defined HUFFMAN_BITS_2 /* HuffmanBits parallel huffman tables */ + BITS_PER_LEVEL = 2, + ENTRIES_PER_LEVEL = 4 +#elif defined HUFFMAN_BITS_3 + BITS_PER_LEVEL = 3, + ENTRIES_PER_LEVEL = 8 +#elif defined HUFFMAN_BITS_4 /* HuffmanBits parallel huffman tables */ + BITS_PER_LEVEL = 4, + ENTRIES_PER_LEVEL = 16 +#endif + + }; + +protected: + +private: + + typedef struct + { + unsigned int linbits; + const unsigned short(*table)[ENTRIES_PER_LEVEL]; + } huffmantab; + + static const huffmantab ht[]; + + unsigned int nTableIndex; +}; + +/*-------------------------------------------------------------------------*/ +#endif diff --git a/Src/replicant/nsmp3dec/l3reg.h b/Src/replicant/nsmp3dec/l3reg.h new file mode 100644 index 00000000..dcabdfa4 --- /dev/null +++ b/Src/replicant/nsmp3dec/l3reg.h @@ -0,0 +1,112 @@ +/***************************************************************************\ + * + * (C) copyright Fraunhofer - IIS (1996) + * All Rights Reserved + * + * filename: l3reg.h + * project : <none> + * author : Martin Sieler + * date : 1996-11-05 + * contents/description: HEADER - registered types for MPEG Layer-3 + * +\***************************************************************************/ + +/* + * $Date: 2010/11/17 20:46:02 $ + * $Header: /cvs/root/nullsoft/Replicant/jni/nsmp3/l3reg.h,v 1.1 2010/11/17 20:46:02 audiodsp Exp $ + */ + +#ifndef __L3REG_H__ +#define __L3REG_H__ +/* ------------------------ includes --------------------------------------*/ + +/*-------------------------- defines --------------------------------------*/ + +#ifdef _MSC_VER + #pragma pack(push, 1) /* assume byte packing throughout */ +#endif + +/*-------------------------------------------------------------------------*/ + +//==========================================================================; +// +// ISO/MPEG Layer3 Format Tag +// +#define WAVE_FORMAT_MPEGLAYER3 0x0055 + +//==========================================================================; +// +// Manufacturer ID and Product ID +// +#define MM_FRAUNHOFER_IIS 172 +#define MM_FHGIIS_MPEGLAYER3 10 + +#define MM_FHGIIS_MPEGLAYER3_DECODE 9 +#define MM_FHGIIS_MPEGLAYER3_LITE 10 +#define MM_FHGIIS_MPEGLAYER3_BASIC 11 +#define MM_FHGIIS_MPEGLAYER3_ADVANCED 12 +#define MM_FHGIIS_MPEGLAYER3_PROFESSIONAL 13 + +#define MM_FHGIIS_MPEGLAYER3_ADVANCEDPLUS 14 + +//==========================================================================; +// +// +// +//==========================================================================; + +#ifdef MPEGLAYER3_WFX_EXTRA_BYTES + // + // seems like the structure below is already defined + // +#else + +//==========================================================================; +// +// MPEG Layer3 WAVEFORMATEX structure +// +#define MPEGLAYER3_WFX_EXTRA_BYTES 12 + +// WAVE_FORMAT_MPEGLAYER3 format structure +// +typedef struct tagMPEGLAYER3WAVEFORMAT + { + WAVEFORMATEX wfx; + + WORD wID; + DWORD fdwFlags; + WORD nBlockSize; + WORD nFramesPerBlock; + WORD nCodecDelay; + + } MPEGLAYER3WAVEFORMAT; + +typedef MPEGLAYER3WAVEFORMAT * PMPEGLAYER3WAVEFORMAT; +typedef MPEGLAYER3WAVEFORMAT NEAR *NPMPEGLAYER3WAVEFORMAT; +typedef MPEGLAYER3WAVEFORMAT FAR *LPMPEGLAYER3WAVEFORMAT; + +#endif + +//==========================================================================; + +#define MPEGLAYER3_ID_UNKNOWN 0 +#define MPEGLAYER3_ID_MPEG 1 +#define MPEGLAYER3_ID_CONSTANTFRAMESIZE 2 + +#define MPEGLAYER3_FLAG_PADDING_ISO 0x00000000 +#define MPEGLAYER3_FLAG_PADDING_ON 0x00000001 +#define MPEGLAYER3_FLAG_PADDING_OFF 0x00000002 + +#define MPEGLAYER3_FLAG_CRC_ON 0x00000010 +#define MPEGLAYER3_FLAG_CRC_OFF 0x00000020 + +#define MPEGLAYER3_FLAG_VBR 0x00000100 + +/*-------------------------------------------------------------------------*/ + +#ifdef _MSC_VER + #pragma pack(pop) /* revert to previous packing */ +#endif + +/*-------------------------------------------------------------------------*/ +#endif diff --git a/Src/replicant/nsmp3dec/l3table.h b/Src/replicant/nsmp3dec/l3table.h new file mode 100644 index 00000000..b50f8872 --- /dev/null +++ b/Src/replicant/nsmp3dec/l3table.h @@ -0,0 +1,47 @@ +/***************************************************************************\ + * +* MPEG Layer3-Audio Decoder +* � 1997-2006 by Fraunhofer IIS + * All Rights Reserved + * + * filename: l3table.h + * project : ISO/MPEG-Decoder + * author : Martin Sieler + * date : 1998-05-26 + * contents/description: HEADER - tables for iso/mpeg-decoding (layer3) + * + * +\***************************************************************************/ + +/* + * $Date: 2010/11/17 20:46:02 $ + * $Id: l3table.h,v 1.1 2010/11/17 20:46:02 audiodsp Exp $ + */ + +/*-------------------------------------------------------------------------*/ + +#ifndef __L3TABLE_H__ +#define __L3TABLE_H__ + +#ifdef __cplusplus +extern "C" { +#endif +/* ------------------------ includes --------------------------------------*/ + +/* ------------------------------------------------------------------------*/ + + struct SF_BAND_INDEX +{ + int l[23]; + int s[14]; +}; + +/* ------------------------------------------------------------------------*/ + +extern const SF_BAND_INDEX sfBandIndex[3][3]; + +/*-------------------------------------------------------------------------*/ +#ifdef __cplusplus +} +#endif +#endif diff --git a/Src/replicant/nsmp3dec/mdct.h b/Src/replicant/nsmp3dec/mdct.h new file mode 100644 index 00000000..0c507340 --- /dev/null +++ b/Src/replicant/nsmp3dec/mdct.h @@ -0,0 +1,61 @@ +/***************************************************************************\ + * +* MPEG Layer3-Audio Decoder +* © 1997-2006 by Fraunhofer IIS + * All Rights Reserved + * + * filename: mdct.h + * project : ISO/MPEG-Decoder + * author : Stefan Gewinner + * date : 1998-05-26 + * contents/description: mdct class - HEADER + * + * + \***************************************************************************/ + +/* + * $Date: 2011/01/18 18:22:03 $ + * $Id: mdct.h,v 1.4 2011/01/18 18:22:03 audiodsp Exp $ + */ + +#ifndef __MDCT_H__ +#define __MDCT_H__ + +/* ------------------------ includes --------------------------------------*/ + +#include "mpeg.h" +#include "foundation/align.h" +/*-------------------------------------------------------------------------*/ + +// +// MDCT class. +// +// This object performs the frequency-to-time mapping. +// + +class CMdct +{ + +public : + + CMdct(const MPEG_INFO &_info); + ~CMdct() {} + + void Init(); + void Apply(int ch, const MP3SI_GRCH &SiGrCH, SPECTRUM &rs); + +protected : + + void cos_t_h_long (float *prev,float *dest,const float *win); + void cos_t_h_short(float *prev,float *dest,const float *win); + + float hybrid_res[36]; + NALIGN(16) float cost36_rese[9]; + NALIGN(16) float cost36_reso[9]; + + const MPEG_INFO &info; + SPECTRUM prevblck; +}; + +/*-------------------------------------------------------------------------*/ +#endif diff --git a/Src/replicant/nsmp3dec/meanvalue.h b/Src/replicant/nsmp3dec/meanvalue.h new file mode 100644 index 00000000..5f1a3e58 --- /dev/null +++ b/Src/replicant/nsmp3dec/meanvalue.h @@ -0,0 +1,61 @@ +/***************************************************************************\ + * +* MPEG Layer3-Audio Decoder +* © 1997-2006 by Fraunhofer IIS + * All Rights Reserved + * + * filename: meanvalue.h + * project : --- + * author : Martin Sieler + * date : 1998-02-14 + * contents/description: HEADER - calc mean value + * + * +\***************************************************************************/ + +/* + * $Date: 2010/11/17 20:46:03 $ + * $Id: meanvalue.h,v 1.1 2010/11/17 20:46:03 audiodsp Exp $ + */ + +#ifndef __MEANVALUE_H__ +#define __MEANVALUE_H__ + +/* ------------------------ includes --------------------------------------*/ + +/*-------------------------- defines --------------------------------------*/ + +/*-------------------------------------------------------------------------*/ + +class CMeanValue +{ +public: + + CMeanValue() { Reset(); } + + void Reset(); + CMeanValue& operator+= (int nValue); + + operator int() const { return m_Count ? m_Sum/m_Count : 0; } + operator float() const { return m_Count ? float(m_Sum)/float(m_Count) : 0.0f; } + + int GetSum() const { return m_Sum; } + int GetCount() const { return m_Count; } + int GetMin() const { return m_Min; } + int GetMax() const { return m_Max; } + bool IsFixed() const { return m_bFixed; } + +protected: + +private: + + int m_Count; + int m_Sum; + int m_FirstValue; + int m_Min; + int m_Max; + bool m_bFixed; +}; + +/*-------------------------------------------------------------------------*/ +#endif diff --git a/Src/replicant/nsmp3dec/mp2decode.h b/Src/replicant/nsmp3dec/mp2decode.h new file mode 100644 index 00000000..d918330b --- /dev/null +++ b/Src/replicant/nsmp3dec/mp2decode.h @@ -0,0 +1,50 @@ +#ifndef __MP2DECODE_H__ +#define __MP2DECODE_H__ + +/* ------------------------ includes --------------------------------------*/ + +#include "mpeg.h" +#include "mpegbitstream.h" +#include "polyphase.h" + +/*-------------------------------------------------------------------------*/ + +// +// MPEG Layer-2 decoding class. +// +// This is the main MPEG Layer-2 decoder object. +// + +class CMp2Decode +{ +public: + CMp2Decode(CMpegBitStream &_Bs, DecoderHooks *_hooks=0); + ~CMp2Decode(); + + void Init(bool fFullReset = true); + + SSC Decode(void *pPcm, size_t cbPcm, size_t *pcbUsed); + +private: + SSC Decode2(void *pPcm); + SSC Decode1(void *pPcm); + + void ZeroPolySpectrum(); + void SetInfo(); + + CPolyphase m_Polyphase; // polyphase + + MPEG_INFO m_Info; // info structure + CMpegBitStream &m_Bs; // bitstream + + POLYSPECTRUM m_PolySpectrum; // spectrum (post-mdct) + + char m_tab_3[32 * 3]; + char m_tab_5[128 * 3]; + char m_tab_9[1024 * 3]; + float m_scales[27][64]; + DecoderHooks *hooks; +}; + +/*-------------------------------------------------------------------------*/ +#endif diff --git a/Src/replicant/nsmp3dec/mp3ancofl.h b/Src/replicant/nsmp3dec/mp3ancofl.h new file mode 100644 index 00000000..77e1ea01 --- /dev/null +++ b/Src/replicant/nsmp3dec/mp3ancofl.h @@ -0,0 +1,86 @@ +/***************************************************************************\ +* +* MPEG Layer3-Audio Decoder +* © 1997-2006 by Fraunhofer IIS +* All Rights Reserved +* +* filename: mp3ancofl.h +* project : MPEG Decoder +* author : Dieter Weninger +* date : 2003-05-14 +* contents: ancillary data and original file length - HEADER +* +\***************************************************************************/ +#ifndef __MP3ANCOFL_H__ +#define __MP3ANCOFL_H__ + +#include "mpegbitstream.h" + +#define ID_OFL 0xB +#define VERSION_0_LEN 8 /* bytes */ +#define VERSION_1_LEN 10 /* bytes */ + +class CMp3AncOfl +{ + public: + CMp3AncOfl(CBitStream &__Db); + ~CMp3AncOfl(); + + void Reset(void); + + int getVersion(void); + unsigned int getTotalLength(void); + unsigned int getCodecDelay(void); + unsigned int getAddDelay(void); + + bool validOfl(void); + + void fetchOfl(int oflOn, + CBitStream &Db, + int beforeScf, + unsigned int* startDelay, + unsigned int* totalLength); + + int readAnc(unsigned char *ancBytes, + CBitStream &Db, + const int numAncBits); + + int doReadBytes(){return m_readBytes;} + + private: + void crcOfl(unsigned short crcPoly, + unsigned short crcMask, + unsigned long *crc, + unsigned char byte); + + void cleanUp(void); + bool isFhGAnc( int size); + bool readOfl(CBitStream &Db, int beforeScaleFactors); + bool isOfl(void); + bool justSearched(void); + int toSkip(void); + void getOfl(CBitStream &Db, const int len); + + CBitStream &m_Db; // dynamic buffer + + unsigned char oflArray[10]; + + bool m_valid; + bool m_searched; + bool m_semaphor; + bool m_FhGAncChecked; + bool m_collecting; + bool m_mp3pro; + + unsigned char* m_FhGAncBuf; + unsigned char* m_tmpAncBuf; + + int m_pFhGAncBuf; + int m_FhGAncBufSize; + + // flag signalling byte- or bit-wise reading + int m_readBytes; + +}; + +#endif /* __MP3ANCOFL_H__ */ diff --git a/Src/replicant/nsmp3dec/mp3decode.h b/Src/replicant/nsmp3dec/mp3decode.h new file mode 100644 index 00000000..fb9a8048 --- /dev/null +++ b/Src/replicant/nsmp3dec/mp3decode.h @@ -0,0 +1,113 @@ +/***************************************************************************\ +* +* MPEG Layer3-Audio Decoder +* © 1997-2006 by Fraunhofer IIS +* All Rights Reserved +* +* filename: mp3decode.h +* project : ISO/MPEG-Decoder +* author : Martin Sieler +* date : 1998-05-26 +* contents/description: MPEG Layer-3 decoder +* +* +\***************************************************************************/ + +/* +* $Date: 2011/01/28 21:45:29 $ +* $Id: mp3decode.h,v 1.5 2011/01/28 21:45:29 audiodsp Exp $ +*/ + +#ifndef __MP3DECODE_H__ +#define __MP3DECODE_H__ + +/* ------------------------ includes --------------------------------------*/ + +#include "mpeg.h" +#include "mpegbitstream.h" +#include "huffdec.h" +#include "mdct.h" +#include "polyphase.h" +#include "mp3ancofl.h" + +#ifdef ERROR_CONCEALMENT +#include "conceal.h" +#endif + +/*-------------------------------------------------------------------------*/ + +// +// MPEG Layer-3 decoding class. +// +// This is the main MPEG Layer-3 decoder object. +// + +class NALIGN(16) CMp3Decode +{ +public: + + CMp3Decode(CMpegBitStream &_Bs, int _crc_check, DecoderHooks *_hooks=0); + + ~CMp3Decode(); + + void Init(bool fFullReset = true); + + // PcmFormat: 0: integer, 1: 32 bit float (IEEE) + SSC Decode(float *pPcm, + size_t cbPcm, + size_t *pcbUsed, + unsigned char *ancData, + size_t *numAncBytes = 0, + int oflOn = 0, + unsigned int *startDelay = 0, + unsigned int *totalLength = 0); + + + SSC GetLastAncData(unsigned char* ancData, size_t *numAncBytes); + + SSC GetOflVersion(int* oflVersion); + +protected: + + SSC DecodeOnNoMainData(float *pPcm); + SSC DecodeNormal (float *pPcm, bool fCrcOk); + + void PolyphaseReorder(); + void ZeroISpectrum(); + void ZeroSpectrum(); + void ZeroPolySpectrum(); + void SetInfo(); + + CMp3Huffman m_Mp3Huffman; // huffman decoder + CMdct m_Mdct; // mdct + CPolyphase m_Polyphase; // polyphase + CMp3AncOfl m_AncOfl; // ancillary data and ofl + +#ifdef ERROR_CONCEALMENT + CErrorConcealment m_Conceal; // error concealment +#endif + + MPEG_INFO m_Info; // info structure + CMpegBitStream &m_Bs; // bitstream + CBitStream m_Db; // dynamic buffer + MP3SI m_Si; // side info + MP3SCF m_ScaleFac[2]; // scalefactors + + int m_ISpectrum[2][SSLIMIT*SBLIMIT]; // spectrum (integer) + NALIGN(16) SPECTRUM m_Spectrum; // spectrum (float) + NALIGN(16) POLYSPECTRUM m_PolySpectrum; // spectrum (post-mdct) + + int m_crc_check; // 0: no CRC check, 1: fail on CRC errors + +protected: + + enum { dynBufSize = 2048 } ; + + unsigned char m_dynBufMemory [dynBufSize] ; + +private: + DecoderHooks *hooks; +}; + +/*-------------------------------------------------------------------------*/ +#endif diff --git a/Src/replicant/nsmp3dec/mp3drmifc.h b/Src/replicant/nsmp3dec/mp3drmifc.h new file mode 100644 index 00000000..822e174b --- /dev/null +++ b/Src/replicant/nsmp3dec/mp3drmifc.h @@ -0,0 +1,25 @@ +/***************************************************************************\ + * +* MPEG Layer3-Audio Decoder +* © 1997-2006 by Fraunhofer IIS + * All Rights Reserved + * + * filename: mp3drmifc.h + * project : MPEG Decoder + * author : + * date : 2004-12-06 + * contents/description: DRM Interface + * + * +\***************************************************************************/ + +#ifndef __MP3DRMIFC_H__ +#define __MP3DRMIFC_H__ + +#include "mp3sscdef.h" + +SSC MP3DECAPI mp3decGetScfBuffer(MP3DEC_HANDLE handle, + const unsigned char** ppBuffer, + unsigned int* pBufSize); + +#endif /* __MP3DRMIFC_H__ */ diff --git a/Src/replicant/nsmp3dec/mp3quant.h b/Src/replicant/nsmp3dec/mp3quant.h new file mode 100644 index 00000000..6304fd59 --- /dev/null +++ b/Src/replicant/nsmp3dec/mp3quant.h @@ -0,0 +1,43 @@ +/***************************************************************************\ + * +* MPEG Layer3-Audio Decoder +* © 1997-2006 by Fraunhofer IIS + * All Rights Reserved + * + * filename: mp_quant.h + * project : ISO/MPEG-Decoder + * author : Markus Werner, addings: Martin Sieler + * date : 1995-07-07 + * contents/description: HEADER - sample-dequantization + * + * +\***************************************************************************/ + +/* + * $Date: 2010/11/17 20:46:04 $ + * $Id: mp3quant.h,v 1.1 2010/11/17 20:46:04 audiodsp Exp $ + */ + +/*-------------------------------------------------------------------------*/ + +#ifndef __MP3QUANT_H__ +#define __MP3QUANT_H__ + +/* ------------------------ includes --------------------------------------*/ + +#include "mpeg.h" + +/* ------------------------------------------------------------------------*/ + +void mp3DequantizeSpectrum + ( + int *pIData, + float *pFData, + const MP3SI_GRCH &SiGrCh, + const MP3SCF &ScaleFac, + const MPEG_INFO &Info + ); + +/*-------------------------------------------------------------------------*/ + +#endif diff --git a/Src/replicant/nsmp3dec/mp3read.h b/Src/replicant/nsmp3dec/mp3read.h new file mode 100644 index 00000000..fcd2ecd9 --- /dev/null +++ b/Src/replicant/nsmp3dec/mp3read.h @@ -0,0 +1,60 @@ +/***************************************************************************\ + * +* MPEG Layer3-Audio Decoder +* © 1997-2006 by Fraunhofer IIS + * All Rights Reserved + * + * filename: mp3read.h + * project : ISO/MPEG-Decoder + * author : Martin Sieler + * date : 1998-05-26 + * contents/description: mp3 read-functions: sideinfo, main data, + * scalefactors + * + * +\***************************************************************************/ + +/* + * $Date: 2010/11/17 20:46:04 $ + * $Id: mp3read.h,v 1.1 2010/11/17 20:46:04 audiodsp Exp $ + */ + +/*-------------------------------------------------------------------------*/ + +#ifndef __MP3READ_H__ +#define __MP3READ_H__ + +/* ------------------------ includes --------------------------------------*/ + +#include "mpeg.h" + +/* ------------------------------------------------------------------------*/ + +class CBitStream; + +/* ------------------------------------------------------------------------*/ + +bool mp3SideInfoRead(CBitStream &Bs, MP3SI &Si, const MPEG_INFO &Info, int crc_check); + +bool mp3MainDataRead + ( + CBitStream &Bs, // bitstream + CBitStream &Db, // dynamic buffer + const MP3SI &Si, + const MPEG_INFO &Info + ); + +void mp3ScaleFactorRead + ( + CBitStream &Bs, + MP3SI_GRCH &SiGrCh, + MP3SCF &ScaleFac, + const MPEG_INFO &Info, + const int *pScfsi, + int gr, + int ch + ); + +/*-------------------------------------------------------------------------*/ + +#endif diff --git a/Src/replicant/nsmp3dec/mp3ssc.h b/Src/replicant/nsmp3dec/mp3ssc.h new file mode 100644 index 00000000..ac2876c3 --- /dev/null +++ b/Src/replicant/nsmp3dec/mp3ssc.h @@ -0,0 +1,57 @@ +/***************************************************************************\ + * +* MPEG Layer3-Audio Decoder +* © 1997-2006 by Fraunhofer IIS + * All Rights Reserved + * + * filename: mp3ssc.h + * project : --- + * author : Martin Sieler + * date : 1999-02-15 + * contents/description: ssc helper class (Structured Status Code) + * + * +\***************************************************************************/ + +/* + * $Date: 2010/11/17 20:46:04 $ + * $Id: mp3ssc.h,v 1.1 2010/11/17 20:46:04 audiodsp Exp $ + */ + +#ifndef __MP3SSC_H__ +#define __MP3SSC_H__ + +/* ------------------------ includes --------------------------------------*/ + +#include "mp3sscdef.h" + +/*-------------------------- defines --------------------------------------*/ + +/*-------------------------------------------------------------------------*/ + +/** Helper class for more information about SSC codes. +*/ +class CMp3Ssc +{ +public: + /** Object constructor + + @param An SSC staus code to initialize the object with. + + */ + CMp3Ssc(SSC ssc); + ~CMp3Ssc() {} + + /** Operator for conversion to a text string. + + @return Textual description. + + */ + operator const char*(); + +private: + SSC m_ssc; +}; + +/*-------------------------------------------------------------------------*/ +#endif diff --git a/Src/replicant/nsmp3dec/mp3sscdef.h b/Src/replicant/nsmp3dec/mp3sscdef.h new file mode 100644 index 00000000..04432a30 --- /dev/null +++ b/Src/replicant/nsmp3dec/mp3sscdef.h @@ -0,0 +1,154 @@ +/***************************************************************************\ + * +* MPEG Layer3-Audio Decoder +* © 1997-2006 by Fraunhofer IIS + * All Rights Reserved + * + * filename: mp3sscdef.h + * project : --- + * author : Martin Sieler + * date : 1998-02-16 + * contents/description: ssc definitions (Structured Status Code) + * + * +\***************************************************************************/ + +/* + * $Date: 2010/11/17 20:46:04 $ + * $Id: mp3sscdef.h,v 1.1 2010/11/17 20:46:04 audiodsp Exp $ + */ + +#ifndef __MP3SSCDEF_H__ +#define __MP3SSCDEF_H__ + +/*------------------------- includes --------------------------------------*/ + +/*-------------------------- defines --------------------------------------*/ + +/*-------------------------------------------------------------------------*\ + * + * Standard error/return values are 32 bit values layed out as follows: + * + * 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 + * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 + * +---+-+-+-----------------------+-------------------------------+ + * |Sev|C|R| Handler | Code | + * +---+-+-+-----------------------+-------------------------------+ + * + * where + * + * Sev - is the severity code + * + * 00 - Success + * 01 - Informational + * 10 - Warning + * 11 - Error + * + * C - is the Customer code flag + * + * R - is a reserved bit + * + * Handler - is the handler code + * + * Code - is the facility's status code + * +\*-------------------------------------------------------------------------*/ + +/* + * define the Severity codes + */ + +#define SSC_SEV_SUCCESS 0x00000000L +#define SSC_SEV_INFO 0x40000000L +#define SSC_SEV_WARNING 0x80000000L +#define SSC_SEV_ERROR 0xc0000000L + +/* + * define masks to extract the fields + */ + +#define SSC_MASK_SEVERITY 0xc0000000L +#define SSC_MASK_HANDLER 0x0fff0000L +#define SSC_MASK_CODE 0x0000ffffL + +/* + * define MACROS to test an error/return code + */ + +#define SSC_GETSEV(x) ( (x) & SSC_MASK_SEVERITY ) + + +/* Check, if an SSC indicates success */ +#define SSC_SUCCESS(x) (((SSC_GETSEV(x)==SSC_SEV_SUCCESS)||(SSC_GETSEV(x)==SSC_SEV_INFO))?1:0) + +/* Check, if an SSC indicates an information */ +#define SSC_INFO(x) ((SSC_GETSEV(x)==SSC_SEV_INFO)?1:0) + +/* Check, if an SSC indicates a warning */ +#define SSC_WARNING(x) ((SSC_GETSEV(x)==SSC_SEV_WARNING)?1:0) + +/* Check, if an SSC indicates an error */ +#define SSC_ERROR(x) ((SSC_GETSEV(x)==SSC_SEV_ERROR)?1:0) + +/*-------------------------------------------------------------------------*\ + * + * SSC classes (handler) + * +\*-------------------------------------------------------------------------*/ + +#define SSC_HANDLER_GEN 0x00000000L + +#define SSC_I_GEN (SSC_SEV_INFO | SSC_HANDLER_GEN) +#define SSC_W_GEN (SSC_SEV_WARNING | SSC_HANDLER_GEN) +#define SSC_E_GEN (SSC_SEV_ERROR | SSC_HANDLER_GEN) + +/*-------------------------------------------------------------------------*/ + +#define SSC_HANDLER_IO 0x00010000L + +#define SSC_I_IO (SSC_SEV_INFO | SSC_HANDLER_IO) +#define SSC_W_IO (SSC_SEV_WARNING | SSC_HANDLER_IO) +#define SSC_E_IO (SSC_SEV_ERROR | SSC_HANDLER_IO) + +/*-------------------------------------------------------------------------*/ + +#define SSC_HANDLER_MPGA 0x01010000L + +#define SSC_I_MPGA (SSC_SEV_INFO | SSC_HANDLER_MPGA) +#define SSC_W_MPGA (SSC_SEV_WARNING | SSC_HANDLER_MPGA) +#define SSC_E_MPGA (SSC_SEV_ERROR | SSC_HANDLER_MPGA) + +/*-------------------------------------------------------------------------*\ + * + * SSC codes + * +\*-------------------------------------------------------------------------*/ + +typedef enum + { + SSC_OK = 0x00000000L, + + SSC_E_WRONGPARAMETER = (SSC_E_GEN | 1), + SSC_E_OUTOFMEMORY = (SSC_E_GEN | 2), + SSC_E_INVALIDHANDLE = (SSC_E_GEN | 3), + + SSC_E_IO_GENERIC = (SSC_W_IO | 1), + SSC_E_IO_OPENFAILED = (SSC_W_IO | 2), + SSC_E_IO_CLOSEFAILED = (SSC_W_IO | 3), + SSC_E_IO_READFAILED = (SSC_W_IO | 4), + + SSC_I_MPGA_CRCERROR = (SSC_I_MPGA | 1), + SSC_I_MPGA_NOMAINDATA = (SSC_I_MPGA | 2), + + SSC_E_MPGA_GENERIC = (SSC_E_MPGA | 1), + SSC_E_MPGA_WRONGLAYER = (SSC_E_MPGA | 2), + SSC_E_MPGA_BUFFERTOOSMALL = (SSC_E_MPGA | 3), + + SSC_W_MPGA_SYNCSEARCHED = (SSC_W_MPGA | 1), + SSC_W_MPGA_SYNCLOST = (SSC_W_MPGA | 2), + SSC_W_MPGA_SYNCNEEDDATA = (SSC_W_MPGA | 3), + SSC_W_MPGA_SYNCEOF = (SSC_W_MPGA | 4) + } SSC; + +/*-------------------------------------------------------------------------*/ +#endif diff --git a/Src/replicant/nsmp3dec/mp3streaminfo.h b/Src/replicant/nsmp3dec/mp3streaminfo.h new file mode 100644 index 00000000..7c1eefda --- /dev/null +++ b/Src/replicant/nsmp3dec/mp3streaminfo.h @@ -0,0 +1,117 @@ +/***************************************************************************\ + * +* MPEG Layer3-Audio Decoder +* © 1997-2006 by Fraunhofer IIS + * All Rights Reserved + * + * filename: mp3streaminfo.h + * project : MPEG Layer-3 Decoder + * author : Martin Sieler + * date : 1998-05-27 + * contents/description: current bitstream parameters + * +\***************************************************************************/ + +/* + * $Date: 2010/11/17 20:46:04 $ + * $Id: mp3streaminfo.h,v 1.1 2010/11/17 20:46:04 audiodsp Exp $ + */ + +#ifndef __MP3STREAMINFO_H__ +#define __MP3STREAMINFO_H__ + +/* ------------------------ structure alignment ---------------------------*/ + +#ifdef WIN32 + #pragma pack(push, 8) +#endif + +/*-------------------------------------------------------------------------*/ + +typedef struct +{ + int m_Layer; /* ISO/MPEG Layer */ + int m_MpegVersion; /* ISO/MPEG Version */ + int m_Bitrate; /* Bitrate (Bit/s) */ + int m_BitrateIndex; /* ISO/MPEG Bitrate index of frame */ + int m_Channels; /* Number of Channels (as indicated) */ + int m_SFreq; /* Sampling Frequency (as indicated) */ + int m_EffectiveChannels; /* Number of effective output channels */ + int m_EffectiveSFreq; /* Effective Sampling Frequency */ + int m_BitsPerFrame; /* Number of bits in frame */ + float m_Duration; /* Duration of frame in milli seconds */ + int m_CrcError; /* Indication of CRC Errors */ + int m_NoMainData; /* Indication of missing main data */ + int m_SamplesPerFrame; + } MP3STREAMINFO; + +/*-------------------------------------------------------------------------*/ + +#ifdef __cplusplus + +// +// Mp3 Streaminfo object. +// +// Object holding information on the last successfully decode frame. +// + +class CMp3StreamInfo : protected MP3STREAMINFO +{ +public: + + CMp3StreamInfo() { Reset(); } + + int GetLayer() const { return m_Layer; } + int GetMpegVersion() const { return m_MpegVersion; } + int GetBitrate() const { return m_Bitrate; } + int GetBitrateIndex() const { return m_BitrateIndex; } + int GetChannels() const { return m_Channels; } + int GetSFreq() const { return m_SFreq; } + int GetBitsPerFrame() const { return m_BitsPerFrame; } + float GetDuration() const { return m_Duration; } + int GetCrcError() const { return m_CrcError; } + int GetNoMainData() const { return m_NoMainData; } + int GetSamplesPerFrame() const { return m_SamplesPerFrame; } + +protected: + + friend class CMpgaDecoder; + + void SetLayer(int nValue) { m_Layer = nValue; } + void SetMpegVersion(int nValue) { m_MpegVersion = nValue; } + void SetBitrate(int nValue) { m_Bitrate = nValue; } + void SetBitrateIndex(int nValue) { m_BitrateIndex = nValue; } + void SetChannels(int nValue) { m_Channels = nValue; } + void SetSFreq(int nValue) { m_SFreq = nValue; } + void SetBitsPerFrame(int nValue) { m_BitsPerFrame = nValue; } + void SetDuration(float fValue) { m_Duration = fValue; } + void SetCrcError(int nValue) { m_CrcError = nValue; } + void SetNoMainData(int nValue) { m_NoMainData = nValue; } + void SetSamplesPerFrame(int nValue) { m_SamplesPerFrame = nValue; } + + void Reset() + { + m_Layer = 0; + m_MpegVersion = 0; + m_Bitrate = 0; + m_BitrateIndex = 0; + m_Channels = 0; + m_SFreq = 0; + m_BitsPerFrame = 0; + m_Duration = 0.0f; + m_CrcError = 0; + m_NoMainData = 0; + m_SamplesPerFrame=0; + } +}; + +#endif /* __cplusplus */ + +/*-------------------------------------------------------------------------*/ + +#ifdef WIN32 + #pragma pack(pop) +#endif + +/*-------------------------------------------------------------------------*/ +#endif diff --git a/Src/replicant/nsmp3dec/mp3tools.h b/Src/replicant/nsmp3dec/mp3tools.h new file mode 100644 index 00000000..229e3857 --- /dev/null +++ b/Src/replicant/nsmp3dec/mp3tools.h @@ -0,0 +1,66 @@ +/***************************************************************************\ + * +* MPEG Layer3-Audio Decoder +* © 1997-2006 by Fraunhofer IIS + * All Rights Reserved + * + * filename: mp3tools.h + * project : ISO/MPEG-Decoder + * author : Martin Sieler + * date : 1998-05-26 + * contents/description: HEADER - layer III processing + * + * +\***************************************************************************/ + +/* + * $Date: 2011/01/13 22:43:21 $ + * $Id: mp3tools.h,v 1.2 2011/01/13 22:43:21 audiodsp Exp $ + */ + +/*-------------------------------------------------------------------------*/ + +#ifndef __MP3TOOLS_H__ +#define __MP3TOOLS_H__ + +/* ------------------------ includes --------------------------------------*/ + +#include "mpeg.h" + +/* ------------------------------------------------------------------------*/ + +void mp3ScaleFactorUpdate + ( + const MP3SI_GRCH &SiL, + const MP3SI_GRCH &SiR, + const MPEG_INFO &Info, + MP3SCF &ScaleFac + ); + +void mp3StereoProcessing + ( + float *pLeft, + float *pRight, + MP3SI_GRCH &SiL, + MP3SI_GRCH &SiR, + const MP3SCF &ScaleFac, /* right channel!! */ + const MPEG_INFO &Info + ); + +void mp3Reorder + ( + float *pData, + const MP3SI_GRCH &Si, + const MPEG_INFO &Info + ); + +void mp3Antialias + ( + float *pData, + MP3SI_GRCH &Si, + const MPEG_INFO &Info + ); + +/*-------------------------------------------------------------------------*/ + +#endif diff --git a/Src/replicant/nsmp3dec/mpeg.h b/Src/replicant/nsmp3dec/mpeg.h new file mode 100644 index 00000000..00f06e8b --- /dev/null +++ b/Src/replicant/nsmp3dec/mpeg.h @@ -0,0 +1,174 @@ +/***************************************************************************\ + * +* MPEG Layer3-Audio Decoder +* © 1997-2006 by Fraunhofer IIS + * All Rights Reserved + * + * filename: mpeg.h + * project : ISO/MPEG-Decoder + * author : Markus Werner, addings: Martin Sieler + * date : 1995-07-07 + * contents/description: HEADER - iso/mpeg-definitions + * + * +\***************************************************************************/ + +/* + * $Date: 2011/01/20 22:14:40 $ + * $Id: mpeg.h,v 1.3 2011/01/20 22:14:40 audiodsp Exp $ + */ + +/*-------------------------------------------------------------------------*/ + +#ifndef __MPEG_H__ +#define __MPEG_H__ +#include "foundation/align.h" + +/* ------------------------ includes --------------------------------------*/ + +/* ------------------------------------------------------------------------*/ + +// +// MPEG ID (fhgVersion) +// +#define MPG_MPEG1 1 +#define MPG_MPEG2 0 +#define MPG_MPEG25 2 + +/* ------------------------------------------------------------------------*/ + +// +// sample rate +// +#define MPG_SF_LOW 2 + +/* ------------------------------------------------------------------------*/ + +// +// header-mode field +// +#define MPG_MD_STEREO 0 +#define MPG_MD_JOINT_STEREO 1 +#define MPG_MD_DUAL_CHANNEL 2 +#define MPG_MD_MONO 3 + +/*-------------------------------------------------------------------------*/ + +// +// channels +// +#define MONO 1 +#define STEREO 2 + +/* ------------------------------------------------------------------------*/ + +// +// subbands, samples/subband +// +#define SBLIMIT 32 +#define SSLIMIT 18 + +/* ------------------------------------------------------------------------*/ + +// +// info structure +// +typedef struct + { + int stereo; + int sample_rate_ndx; + int frame_bits; + int mode; + int mode_ext; + int header_size; + int fhgVersion; + int protection; + bool IsMpeg1; + } MPEG_INFO; + +/* ------------------------------------------------------------------------*/ + +// +// MPEG Layer-3 sideinfo (per channel/granule) +// +typedef struct + { + int part2_3_length; + int big_values; + int global_gain; + int scalefac_compress; + int window_switching_flag; + int block_type; + int mixed_block_flag; + int table_select[3]; + int subblock_gain[3]; + int region0_count; + int region1_count; + int preflag; + int scalefac_scale; + int count1table_select; + + // additional calced values + int intensity_scale; // MPEG 2, MPEG 2.5 only + int zeroStartNdx; + int zeroSfbStartNdxIsLong; + int zeroSfbStartNdxL; + int zeroSfbStartNdxSMax; + int zeroSfbStartNdxS[3]; + int zeroSbStartNdx; + } MP3SI_GRCH; + +/* ------------------------------------------------------------------------*/ + +// +// MPEG Layer-3 sideinfo +// +typedef struct + { + int main_data_begin; + int private_bits; + struct + { + int scfsi[4]; + MP3SI_GRCH gr[2]; + } ch[2]; + } MP3SI; + +/* ------------------------------------------------------------------------*/ + +// +// MPEG Layer-3 scalefactors +// +typedef struct + { + // scalefactors + int l[23]; + int s[3][13]; + + // illegal intensity position + int l_iip[23]; + int s_iip[13]; + } MP3SCF; + +/* ------------------------------------------------------------------------*/ + +// +// spectrum (as transmitted) +// +typedef NALIGN(16) float SPECTRUM[2][SBLIMIT][SSLIMIT]; + +// +// spectrum (after mdct) +// +typedef NALIGN(16) float POLYSPECTRUM[2][SSLIMIT][SBLIMIT]; + +/* Nullsoft added 25 Oct 2007 */ +struct DecoderHooks +{ + void (*layer3_vis)(SPECTRUM vistable,int gr, int nch); + void (*layer2_eq)(float *xr, int nch, int srate, int nparts); + void (*layer3_eq)(float *xr, int nch, int srate); +}; + +/* ------------------------------------------------------------------------*/ +#endif diff --git a/Src/replicant/nsmp3dec/mpegbitstream.h b/Src/replicant/nsmp3dec/mpegbitstream.h new file mode 100644 index 00000000..ec37626a --- /dev/null +++ b/Src/replicant/nsmp3dec/mpegbitstream.h @@ -0,0 +1,71 @@ +/***************************************************************************\ + * +* MPEG Layer3-Audio Decoder +* © 1997-2006 by Fraunhofer IIS + * All Rights Reserved + * + * filename: mpegbitstream.h + * project : MPEG Decoder + * author : Martin Sieler + * date : 1997-12-05 + * contents/description: MPEG bitstream - HEADER + * + * +\***************************************************************************/ + +/* + * $Date: 2010/11/17 20:46:04 $ + * $Id: mpegbitstream.h,v 1.1 2010/11/17 20:46:04 audiodsp Exp $ + */ + +#ifndef __MPEGBITSTREAM_H__ +#define __MPEGBITSTREAM_H__ + +/* ------------------------ includes --------------------------------------*/ + +#include "bitstream.h" +#include "mpegheader.h" +#include "mp3sscdef.h" + +/*-------------------------- defines --------------------------------------*/ + +/*-------------------------------------------------------------------------*/ + +// +// MPEG bitstream class. +// +// This object is derived from CBitStream. In addition to CBitStream +// this object is able to sync to the next ISO/MPEG header position. +// + +class CMpegBitStream : public CBitStream +{ +public: + CMpegBitStream(int cbSize); + CMpegBitStream(unsigned char *pBuf, int cbSize, bool fDataValid = false); + virtual ~CMpegBitStream(); + + virtual void Reset(); + + SSC DoSync(); + int GetSyncPosition() const { return m_SyncPosition; } + const CMpegHeader *GetHdr() const { return &m_Hdr; } + +protected: + +private: + + SSC DoSyncInitial(); + SSC DoSyncContinue(); + + enum { FRAMES_TO_CHECK = 10 }; + + CMpegHeader m_Hdr; // mpeg header + unsigned long m_FirstHdr; // "relevant" bits of first good header + unsigned long m_nFramesToCheck; // # frames to be checked for next mpeg header + int m_SyncPosition; // offset of first sync in bits + SSC m_SyncState; // last sync state +}; + +/*-------------------------------------------------------------------------*/ +#endif diff --git a/Src/replicant/nsmp3dec/mpegheader.h b/Src/replicant/nsmp3dec/mpegheader.h new file mode 100644 index 00000000..0afb9138 --- /dev/null +++ b/Src/replicant/nsmp3dec/mpegheader.h @@ -0,0 +1,105 @@ +/***************************************************************************\ + * +* MPEG Layer3-Audio Decoder +* © 1997-2006 by Fraunhofer IIS + * All Rights Reserved + * + * filename: mpegheader.h + * project : MPEG Decoder + * author : Martin Sieler + * date : 1997-12-05 + * contents/description: ISO/MPEG Header + * + * +\***************************************************************************/ + +/* + * $Date: 2010/11/17 20:46:04 $ + * $Id: mpegheader.h,v 1.1 2010/11/17 20:46:04 audiodsp Exp $ + */ + +#ifndef __MPEGHEADER_H__ +#define __MPEGHEADER_H__ + +/* ------------------------ includes --------------------------------------*/ + +/*-------------------------- defines --------------------------------------*/ + +class CBitStream; + +/*-------------------------------------------------------------------------*/ + +// +// MPEG header class. +// +// This object reads and decodes an ISO/MPEG header. +// + +class CMpegHeader +{ +public: + CMpegHeader(); + virtual ~CMpegHeader(); + + int ReadFrom(CBitStream &sBS); + int FromInt(unsigned long dwHdrBits); + + int GetMpegVersion() const { return m_MpegVersion;} + int GetLayer() const { return m_Layer;} + int GetChannels() const { return m_Channels;} + int GetSampleRate() const { return m_SampleRate;} + int GetSampleRateNdx() const { return m_SampleRateNdx;} + int GetBitrate() const { return m_Bitrate;} + int GetBitrateNdx() const { return m_BitrateNdx;} + int GetMode() const { return m_Mode;} + int GetModeExt() const { return m_ModeExt;} + int GetPadding() const { return m_Padding; } + int GetCrcCheck() const { return m_CrcCheck;} + int GetCopyright() const { return m_Copyright;} + int GetOriginal() const { return m_Original;} + int GetEmphasis() const { return m_Emphasis;} + + int GetHeaderLen() const + { return MPEG_HDRLEN+(m_CrcCheck?MPEG_CRCLEN:0); } + int GetFrameLen() const { return m_FrameLen;} + float GetDuration() const { return m_Duration;} + int GetSamplesPerFrame() const; + +protected: + +private: + + enum { MPEG_HDRLEN = 32, MPEG_CRCLEN = 16 }; + + int CalcFrameLen(); + void ResetMembers(); + void SetMembers(); + + // header fields + int m_Syncword; + int m_Idex; + int m_Id; + int m_Layer; + int m_CrcCheck; + int m_BitrateNdx; + int m_SampleRateNdx; + int m_Padding; + int m_Private; + int m_Mode; + int m_ModeExt; + int m_Copyright; + int m_Original; + int m_Emphasis; + + // calculated data + int m_HeaderValid; + int m_MpegVersion; + int m_Channels; + int m_SampleRate; + int m_Bitrate; + int m_FrameLen; + float m_Duration; +}; + +/*-------------------------------------------------------------------------*/ +#endif diff --git a/Src/replicant/nsmp3dec/mpgadecoder.h b/Src/replicant/nsmp3dec/mpgadecoder.h new file mode 100644 index 00000000..3466cf76 --- /dev/null +++ b/Src/replicant/nsmp3dec/mpgadecoder.h @@ -0,0 +1,100 @@ +/***************************************************************************\ + * +* MPEG Layer3-Audio Decoder +* © 1997-2006 by Fraunhofer IIS + * All Rights Reserved + * + * filename: mpgadecoder.h + * project : MPEG Decoder + * author : Martin Sieler + * date : 1998-05-26 + * contents/description: MPEG Decoder class - HEADER + * + * +\***************************************************************************/ + +/* + * $Date: 2011/01/25 18:24:17 $ + * $Id: mpgadecoder.h,v 1.4 2011/01/25 18:24:17 audiodsp Exp $ + */ + +#ifndef __MPGADECODER_H__ +#define __MPGADECODER_H__ + +/* ------------------------ includes --------------------------------------*/ + +#include "mp3sscdef.h" +#include "mp3streaminfo.h" +#include "mpegbitstream.h" +#include "mp3decode.h" +#include "mp2decode.h" + + +/*-------------------------- defines --------------------------------------*/ + +/*-------------------------------------------------------------------------*/ + +// +// Mp3 Decoder Top Level Object. +// +// This is the main ISO/MPEG decoder object that interfaces with the +// application code. +// +// It is however recommended to use IMpgaDecoder (see mp3decifc.h) instead. +// Define USE_MP3DECIFC when planning to use IMpgaDecoder. +// + +enum +{ + MPEGAUDIO_CRCCHECK_OFF = 0, + MPEGAUDIO_CRCCHECK_ON = 1, +}; + +class CMpgaDecoder +{ +public: + CMpgaDecoder(int crcCheck = MPEGAUDIO_CRCCHECK_OFF); + CMpgaDecoder(DecoderHooks *hooks, int crcCheck = MPEGAUDIO_CRCCHECK_OFF); + CMpgaDecoder(unsigned char *pBuf, int cbSize, int crcCheck = MPEGAUDIO_CRCCHECK_OFF); + ~CMpgaDecoder(); + void *operator new(size_t stAllocateBlock); + void operator delete(void *); + + void Reset(); + + SSC DecodeFrame(float *pPcm, size_t cbPcm, size_t *pcbUsed = 0, unsigned char *ancData = 0, size_t *numAncBytes = 0, int oflOn = 0, unsigned int *startDelay = 0, unsigned int *totalLength = 0); + + const CMp3StreamInfo *GetStreamInfo() const; + + void Connect(CGioBase *gf); + int Fill(const unsigned char *pBuffer, int cbBuffer); + int GetInputFree() const; + int GetInputLeft() const; + void SetInputEof(); + bool IsEof() const; + +#ifdef KSA_DRM + int GetScfBuffer(const unsigned char** ppBuffer, unsigned int* pBufSize) const; +#endif + + SSC GetLastAncData(unsigned char* ancData = 0, size_t *numAncBytes = 0); + + SSC GetOflVersion(int* oflVersion = 0); +//protected: + + void SetStreamInfo(SSC dwReturn); + + + CMp3StreamInfo m_Info; + CMpegBitStream m_Mbs; + NALIGN(16) CMp3Decode m_Mp3Decode; + NALIGN(16) CMp2Decode m_Mp2Decode; + bool m_IsEof; + int m_Layer; + +private: + +}; + +/*-------------------------------------------------------------------------*/ +#endif diff --git a/Src/replicant/nsmp3dec/polyphase.h b/Src/replicant/nsmp3dec/polyphase.h new file mode 100644 index 00000000..0d221274 --- /dev/null +++ b/Src/replicant/nsmp3dec/polyphase.h @@ -0,0 +1,61 @@ +/***************************************************************************\ + * +* MPEG Layer3-Audio Decoder +* © 1997-2006 by Fraunhofer IIS + * All Rights Reserved + * + * filename: polyphase.h + * project : ISO/MPEG-Decoder + * author : Stefan Gewinner + * date : 1998-05-26 + * contents/description: polyphase class - HEADER + * + * +\***************************************************************************/ + +/* + * $Date: 2011/02/14 14:48:56 $ + * $Id: polyphase.h,v 1.6 2011/02/14 14:48:56 bigg Exp $ + */ + +#pragma once +//#ifndef __POLYPHASE_H__ +//#define __POLYPHASE_H__ + +/* ------------------------ includes --------------------------------------*/ + +#include "mpeg.h" +#include "foundation/align.h" +/*-------------------------------------------------------------------------*/ + +#define HAN_SIZE 512 + +/*-------------------------------------------------------------------------*/ + +// Class for (inverse) Polyphase calculation. + +class CPolyphase +{ + +public: + + CPolyphase(const MPEG_INFO &_info); + + ~CPolyphase() {} + + void Init(); + float *Apply(POLYSPECTRUM &sample, float *pPcm, int frms=18); + static void Reorder(int channels, POLYSPECTRUM &output, const SPECTRUM &input); +protected: + + int bufOffset; + NALIGN(16) float syn_buf[2][HAN_SIZE]; + + const MPEG_INFO &info ; // info-structure + + void window_band_m(int bufOffset, float *out_samples) const; + void window_band_s(int bufOffset, float *out_samples) const; +}; + +/*-------------------------------------------------------------------------*/ +//#endif diff --git a/Src/replicant/nsmp3dec/precomp.h b/Src/replicant/nsmp3dec/precomp.h new file mode 100644 index 00000000..c4708f9c --- /dev/null +++ b/Src/replicant/nsmp3dec/precomp.h @@ -0,0 +1,19 @@ +// +// precomp.h +// nsmp3 +// + +#include <assert.h> +#include <iostream> +#include <limits.h> +#include <math.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "foundation/align.h" + +#include "bitstream.h" +#include "mpeg.h" +#include "mp3ssc.h" +#include "mp3sscdef.h" diff --git a/Src/replicant/nsmp3dec/regtypes.h b/Src/replicant/nsmp3dec/regtypes.h new file mode 100644 index 00000000..5de3c2cf --- /dev/null +++ b/Src/replicant/nsmp3dec/regtypes.h @@ -0,0 +1,66 @@ +/***************************************************************************\ + * + * (C) copyright Fraunhofer - IIS (1998) + * All Rights Reserved + * + * filename: regtypes.h + * project : - + * author : Stefan Gewinner gew@iis.fhg.de + * date : 1998-06-08 + * contents/description: absolute minimum to make l3reg.h compile without windef.h + * + * $Header: /cvs/root/nullsoft/Replicant/jni/nsmp3/regtypes.h,v 1.1 2010/11/17 20:46:05 audiodsp Exp $ + * +\***************************************************************************/ + +/* the typedefs should be in place if we already got windows.h included */ + +#ifndef _INC_WINDOWS + +#ifndef __REGTYPES_H__ +#define __REGTYPES_H__ + +/*-------------------------------------------------------------------------*/ + +#ifdef _MSC_VER + #pragma warning(disable:4103) + #pragma pack(push, 1) /* assume byte packing throughout */ +#endif + +/*-------------------------------------------------------------------------*/ + +#define FAR +#define NEAR + +typedef unsigned long DWORD ; +typedef unsigned short WORD ; + +/* + * extended waveform format structure used for all non-PCM formats. this + * structure is common to all non-PCM formats. + */ +typedef struct tagWAVEFORMATEX +{ + WORD wFormatTag; /* format type */ + WORD nChannels; /* number of channels (i.e. mono, stereo...) */ + DWORD nSamplesPerSec; /* sample rate */ + DWORD nAvgBytesPerSec; /* for buffer estimation */ + WORD nBlockAlign; /* block size of data */ + WORD wBitsPerSample; /* number of bits per sample of mono data */ + WORD cbSize; /* the count in bytes of the size of */ + /* extra information (after cbSize) */ +} WAVEFORMATEX, *PWAVEFORMATEX, NEAR *NPWAVEFORMATEX, FAR *LPWAVEFORMATEX ; + +typedef const WAVEFORMATEX FAR *LPCWAVEFORMATEX ; + +/*-------------------------------------------------------------------------*/ + +#ifdef _MSC_VER + #pragma pack(pop) /* revert to previous packing */ +#endif + +/*-------------------------------------------------------------------------*/ + +#endif + +#endif diff --git a/Src/replicant/nsmp3dec/sequencedetector.h b/Src/replicant/nsmp3dec/sequencedetector.h new file mode 100644 index 00000000..b59b27f4 --- /dev/null +++ b/Src/replicant/nsmp3dec/sequencedetector.h @@ -0,0 +1,53 @@ +/***************************************************************************\ + * +* MPEG Layer3-Audio Decoder +* © 1997-2006 by Fraunhofer IIS + * All Rights Reserved + * + * filename: sequencedetector.h + * project : --- + * author : Martin Sieler + * date : 1998-02-14 + * contents/description: HEADER - sequence detector + * + * +\***************************************************************************/ + +/* + * $Date: 2010/11/17 20:46:05 $ + * $Id: sequencedetector.h,v 1.1 2010/11/17 20:46:05 audiodsp Exp $ + */ + +#ifndef __SEQUENCEDETECTOR_H__ +#define __SEQUENCEDETECTOR_H__ + +/* ------------------------ includes --------------------------------------*/ + +/*-------------------------- defines --------------------------------------*/ + +/*-------------------------------------------------------------------------*/ + +class CSequenceDetector +{ +public: + CSequenceDetector(int nLimit); + ~CSequenceDetector(); + + void Reset(); + CSequenceDetector& operator+= (int nValue); + + int GetLength() const; + int GetValue(int nIndex) const; + int GetSum() const; + +protected: + +private: + int m_Limit; + int m_Count; + bool *m_pDisabled; + int *m_pArray; +}; + +/*-------------------------------------------------------------------------*/ +#endif |