/*
* Copyright 2012, 2014 Range Networks, Inc.
*
* This software is distributed under multiple licenses; see the COPYING file in the main directory for licensing information for this specific distribution.
*
* This use of this software may be subject to additional restrictions.
* See the LEGAL file in the main directory for details.

    This program 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.

*/



#ifndef GSM503TABLES_H
#define GSM503TABLES_H



namespace GSM {

// don't change the positions in this enum
// (pat) The first 8 values are used as indicies into numerous tables.
// (pat) Encoder/decoder mode includes 8 modes for AMR + TCH_FS makes 9.
// TODO: Add AFS_SID type.  And why is it not type 8?
enum AMRMode {TCH_AFS12_2, TCH_AFS10_2, TCH_AFS7_95, TCH_AFS7_4, TCH_AFS6_7, TCH_AFS5_9, TCH_AFS5_15, TCH_AFS4_75, TCH_FS};

/** Tables #7-14 from GSM 05.03 */
extern const unsigned int gAMRBitOrderTCH_AFS12_2[244];
extern const unsigned int gAMRBitOrderTCH_AFS10_2[204];
extern const unsigned int gAMRBitOrderTCH_AFS7_95[159];
extern const unsigned int gAMRBitOrderTCH_AFS7_4[148];
extern const unsigned int gAMRBitOrderTCH_AFS6_7[134];
extern const unsigned int gAMRBitOrderTCH_AFS5_9[118];
extern const unsigned int gAMRBitOrderTCH_AFS5_15[103];
extern const unsigned int gAMRBitOrderTCH_AFS4_75[95];

/** GSM 05.03 3.9.4.4 */
extern const unsigned int gAMRPuncturedTCH_AFS12_2[60];
extern const unsigned int gAMRPuncturedTCH_AFS10_2[194];
extern const unsigned int gAMRPuncturedTCH_AFS7_95[65];
extern const unsigned int gAMRPuncturedTCH_AFS7_4[26];
extern const unsigned int gAMRPuncturedTCH_AFS6_7[128];
extern const unsigned int gAMRPuncturedTCH_AFS5_9[72];
extern const unsigned int gAMRPuncturedTCH_AFS5_15[117];
extern const unsigned int gAMRPuncturedTCH_AFS4_75[87];

/* GSM 05.03 Tables 7-14 */
extern const unsigned *gAMRBitOrder[8];

/* GSM 05.03 3.9.4.2 */
extern const unsigned gAMRKd[9];

/* GSM 05.03 3.9.4.2 */
extern const unsigned gAMRClass1ALth[8];

/* GSM 05.03 3.9.4.4 */
extern const unsigned gAMRTCHUCLth[8];

/* GSM 05.03 3.9.4.2 */
extern const unsigned gAMRPunctureLth[8];

/* GSM 05.03 3.9.4.4 */
extern const unsigned *gAMRPuncture[8];

}


#endif
