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
|