/***************************************************************************\
*
*                    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