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