Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
RishiRecon
GitHub Repository: RishiRecon/exploits
Path: blob/main/misc/emulator/xnes/snes9x/jma/aribitcd.h
28798 views
1
#ifndef __COMPRESSION_BITCODER_H
2
#define __COMPRESSION_BITCODER_H
3
4
#include "rngcoder.h"
5
6
namespace NCompression {
7
namespace NArithmetic {
8
9
const int kNumBitModelTotalBits = 11;
10
const UINT32 kBitModelTotal = (1 << kNumBitModelTotalBits);
11
12
const int kNumMoveReducingBits = 2;
13
14
/////////////////////////////
15
// CBitModel
16
17
template <int aNumMoveBits>
18
class CBitModel
19
{
20
public:
21
UINT32 m_Probability;
22
void UpdateModel(UINT32 aSymbol)
23
{
24
/*
25
m_Probability -= (m_Probability + ((aSymbol - 1) & ((1 << aNumMoveBits) - 1))) >> aNumMoveBits;
26
m_Probability += (1 - aSymbol) << (kNumBitModelTotalBits - aNumMoveBits);
27
*/
28
if (aSymbol == 0)
29
m_Probability += (kBitModelTotal - m_Probability) >> aNumMoveBits;
30
else
31
m_Probability -= (m_Probability) >> aNumMoveBits;
32
}
33
public:
34
void Init() { m_Probability = kBitModelTotal / 2; }
35
};
36
37
template <int aNumMoveBits>
38
class CBitDecoder: public CBitModel<aNumMoveBits>
39
{
40
public:
41
UINT32 Decode(CRangeDecoder *aRangeDecoder)
42
{
43
UINT32 aNewBound = (aRangeDecoder->m_Range >> kNumBitModelTotalBits) * CBitModel<aNumMoveBits>::m_Probability;
44
if (aRangeDecoder->m_Code < aNewBound)
45
{
46
aRangeDecoder->m_Range = aNewBound;
47
CBitModel<aNumMoveBits>::m_Probability += (kBitModelTotal - CBitModel<aNumMoveBits>::m_Probability) >> aNumMoveBits;
48
if (aRangeDecoder->m_Range < kTopValue)
49
{
50
aRangeDecoder->m_Code = (aRangeDecoder->m_Code << 8) | aRangeDecoder->m_Stream.ReadByte();
51
aRangeDecoder->m_Range <<= 8;
52
}
53
return 0;
54
}
55
else
56
{
57
aRangeDecoder->m_Range -= aNewBound;
58
aRangeDecoder->m_Code -= aNewBound;
59
CBitModel<aNumMoveBits>::m_Probability -= (CBitModel<aNumMoveBits>::m_Probability) >> aNumMoveBits;
60
if (aRangeDecoder->m_Range < kTopValue)
61
{
62
aRangeDecoder->m_Code = (aRangeDecoder->m_Code << 8) | aRangeDecoder->m_Stream.ReadByte();
63
aRangeDecoder->m_Range <<= 8;
64
}
65
return 1;
66
}
67
}
68
};
69
70
}}
71
72
73
#endif
74
75