1
#ifndef __BITTREECODER_H
2
#define __BITTREECODER_H
4
#include "AriBitCoder.h"
7
//BRCM modification start
15
#include "lib_malloc.h"
16
#include "lib_printf.h"
17
#define malloc(x) KMALLOC(x, 0)
21
#include <linux/kernel.h>
22
#include <linux/vmalloc.h>
23
#include <linux/slab.h>
25
//#define malloc(x) kmalloc(x,GFP_KERNEL)
26
#define malloc(x) vmalloc(x)
27
#define free(x) vfree(x)
29
//BRCM modification end
31
//////////////////////////
34
typedef struct CBitTreeDecoder
36
UINT32 m_NumBitLevels;
37
CBitDecoder *m_Models;
40
// ~CBitTreeDecoder() { free(m_Models); }
41
INLINE void BitTreeDecoderInit(CBitTreeDecoder *bitTreeDecoder, UINT32 aNumBitLevels)
44
bitTreeDecoder->m_NumBitLevels = aNumBitLevels;
45
bitTreeDecoder->m_Models = (CBitDecoder *)malloc( sizeof(CBitDecoder) * (1 << bitTreeDecoder->m_NumBitLevels));
47
//printf("malloc in BitTreeDecoderInit=%d\n",sizeof(CBitDecoder) * (1 << bitTreeDecoder->m_NumBitLevels));
48
if (!bitTreeDecoder->m_Models) {
49
printf("Error in allocating memory for bitTreeDecoder!\n");
52
for(i = 1; i < (1 << aNumBitLevels); i++)
53
BitDecoderInit(&bitTreeDecoder->m_Models[i]);
55
INLINE UINT32 BitTreeDecode(ISequentialInStream *in_stream, CBitTreeDecoder *bitTreeDecoder, CRangeDecoder *aRangeDecoder)
57
UINT32 aModelIndex = 1;
58
UINT32 aRange = aRangeDecoder->m_Range;
59
UINT32 aCode = aRangeDecoder->m_Code;
61
for(aBitIndex = bitTreeDecoder->m_NumBitLevels; aBitIndex > 0; aBitIndex--)
63
RC_GETBIT(kNumMoveBits, bitTreeDecoder->m_Models[aModelIndex], aModelIndex)
65
aRangeDecoder->m_Range = aRange;
66
aRangeDecoder->m_Code = aCode;
67
return aModelIndex - (1 << bitTreeDecoder->m_NumBitLevels);
71
////////////////////////////////
72
// CReverseBitTreeDecoder2
74
typedef struct CReverseBitTreeDecoder2
76
UINT32 m_NumBitLevels;
77
CBitDecoder *m_Models;
78
} CReverseBitTreeDecoder2;
80
// CReverseBitTreeDecoder2(): m_Models(0) { }
81
// ~CReverseBitTreeDecoder2() { free(m_Models); }
82
INLINE BOOL ReverseBitTreeDecoder2Create(CReverseBitTreeDecoder2 *reverseBitTreeDecoder2, UINT32 aNumBitLevels)
84
reverseBitTreeDecoder2->m_NumBitLevels = aNumBitLevels;
85
reverseBitTreeDecoder2->m_Models = (CBitDecoder *)malloc( sizeof(CBitDecoder) * (1 << reverseBitTreeDecoder2->m_NumBitLevels));
86
//printf("malloc in ReverseBitTreeDecoder2Create=%d\n",sizeof(CBitDecoder) * (1 << reverseBitTreeDecoder2->m_NumBitLevels));
87
if (!reverseBitTreeDecoder2->m_Models) {
88
printf("Error in allocating memory for reverseBitTreeDecoder2!\n");
91
return (reverseBitTreeDecoder2->m_Models != 0);
93
INLINE void ReverseBitTreeDecoder2Init(CReverseBitTreeDecoder2 *reverseBitTreeDecoder2)
95
UINT32 aNumModels = 1 << reverseBitTreeDecoder2->m_NumBitLevels;
97
for(i = 1; i < aNumModels; i++)
98
BitDecoderInit(&reverseBitTreeDecoder2->m_Models[i]);
100
INLINE UINT32 ReverseBitTreeDecoder2Decode(ISequentialInStream *in_stream, CReverseBitTreeDecoder2 *reverseBitTreeDecoder2, CRangeDecoder *aRangeDecoder)
102
UINT32 aModelIndex = 1;
104
UINT32 aRange = aRangeDecoder->m_Range;
105
UINT32 aCode = aRangeDecoder->m_Code;
107
for(aBitIndex = 0; aBitIndex < reverseBitTreeDecoder2->m_NumBitLevels; aBitIndex++)
109
RC_GETBIT2(kNumMoveBits, reverseBitTreeDecoder2->m_Models[aModelIndex], aModelIndex, ; , aSymbol |= (1 << aBitIndex))
111
aRangeDecoder->m_Range = aRange;
112
aRangeDecoder->m_Code = aCode;
117
////////////////////////////
118
// CReverseBitTreeDecoder
120
typedef struct CReverseBitTreeDecoder
122
UINT32 m_NumBitLevels;
123
CBitDecoder *m_Models;
124
} CReverseBitTreeDecoder;
126
// CReverseBitTreeDecoder(): m_Models(0) { }
127
// ~CReverseBitTreeDecoder() { free(m_Models); }
128
INLINE void ReverseBitTreeDecoderInit(CReverseBitTreeDecoder *reverseBitTreeDecoder, UINT32 aNumBitLevels)
131
reverseBitTreeDecoder->m_NumBitLevels = aNumBitLevels;
132
reverseBitTreeDecoder->m_Models = (CBitDecoder *)malloc( sizeof(CBitDecoder) * (1 << reverseBitTreeDecoder->m_NumBitLevels));
133
//printf("malloc in ReverseBitTreeDecoderInit=%d\n",sizeof(CBitDecoder) * (1 << reverseBitTreeDecoder->m_NumBitLevels));
134
if (!reverseBitTreeDecoder->m_Models) {
135
printf("Error in allocating memory for reverseBitTreeDecoder!\n");
138
for(i = 1; i < (1 << reverseBitTreeDecoder->m_NumBitLevels); i++)
139
BitDecoderInit(&reverseBitTreeDecoder->m_Models[i]);
142
INLINE UINT32 ReverseBitTreeDecoderDecode(ISequentialInStream *in_stream, CReverseBitTreeDecoder *reverseBitTreeDecoder, CRangeDecoder *aRangeDecoder)
144
UINT32 aModelIndex = 1;
146
UINT32 aRange = aRangeDecoder->m_Range;
147
UINT32 aCode = aRangeDecoder->m_Code;
149
for(aBitIndex = 0; aBitIndex < reverseBitTreeDecoder->m_NumBitLevels; aBitIndex++)
151
RC_GETBIT2(kNumMoveBits, reverseBitTreeDecoder->m_Models[aModelIndex], aModelIndex, ; , aSymbol |= (1 << aBitIndex))
153
aRangeDecoder->m_Range = aRange;
154
aRangeDecoder->m_Code = aCode;