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