📄 literalcoder.h
字号:
// LiteralCoder.h#ifndef __LITERALCODER_H#define __LITERALCODER_H#include "AriBitCoder.h"#include "RCDefs.h"class CLiteralDecoder2{ CBitDecoder m_Decoders[3][1 << 8];public: void Init() { for (int i = 0; i < 3; i++) for (int j = 1; j < (1 << 8); j++) m_Decoders[i][j].Init(); } BYTE DecodeNormal(CRangeDecoder *rangeDecoder) { int symbol = 1; RC_INIT_VAR do { // symbol = (symbol << 1) | m_Decoders[0][symbol].Decode(rangeDecoder); RC_GETBIT(m_Decoders[0][symbol].m_Probability, symbol) } while (symbol < 0x100); RC_FLUSH_VAR return symbol; } BYTE DecodeWithMatchByte(CRangeDecoder *rangeDecoder, BYTE matchByte) { int symbol = 1; RC_INIT_VAR do { int matchBit = (matchByte >> 7) & 1; matchByte <<= 1; // int bit = m_Decoders[1 + matchBit][symbol].Decode(rangeDecoder); // symbol = (symbol << 1) | bit; int bit; RC_GETBIT2(m_Decoders[1 + matchBit][symbol].m_Probability, symbol, bit = 0, bit = 1) if (matchBit != bit) { while (symbol < 0x100) { // symbol = (symbol << 1) | m_Decoders[0][symbol].Decode(rangeDecoder); RC_GETBIT(m_Decoders[0][symbol].m_Probability, symbol) } break; } } while (symbol < 0x100); RC_FLUSH_VAR return symbol; }};class CLiteralDecoder{ CLiteralDecoder2 *m_Coders; int m_NumPrevBits; int m_NumPosBits; int m_PosMask;public: CLiteralDecoder(): m_Coders(0) {} BYTE *Create(BYTE *memory, int numPosBits, int numPrevBits) { m_NumPosBits = numPosBits; m_PosMask = (1 << numPosBits) - 1; m_NumPrevBits = numPrevBits; int numStates = 1 << (m_NumPrevBits + m_NumPosBits); m_Coders = (CLiteralDecoder2 *)memory; return memory + sizeof(CLiteralDecoder2) * numStates; } void Init() { int numStates = 1 << (m_NumPrevBits + m_NumPosBits); for (int i = 0; i < numStates; i++) m_Coders[i].Init(); } int GetState(int pos, BYTE prevByte) const { return ((pos & m_PosMask) << m_NumPrevBits) + (prevByte >> (8 - m_NumPrevBits)); } BYTE DecodeNormal(CRangeDecoder *rangeDecoder, int pos, BYTE prevByte) { return m_Coders[GetState(pos, prevByte)].DecodeNormal(rangeDecoder); } BYTE DecodeWithMatchByte(CRangeDecoder *rangeDecoder, int pos, BYTE prevByte, BYTE matchByte) { return m_Coders[GetState(pos, prevByte)].DecodeWithMatchByte(rangeDecoder, matchByte); }};#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -