aboutsummaryrefslogtreecommitdiff
path: root/Src/replicant/nsmp3dec/huffmantable.h
blob: b8e7a9a79a68c2e7a6f8e8282e82b909da10c3cc (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
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