45 lines
1.5 KiB
C++
45 lines
1.5 KiB
C++
#ifndef _RAR_RS16_
|
|
#define _RAR_RS16_
|
|
|
|
class RSCoder16
|
|
{
|
|
private:
|
|
static const uint gfSize=65535; // Galois field size.
|
|
void gfInit(); // Galois field inititalization.
|
|
inline uint gfAdd(uint a,uint b); // Addition in Galois field.
|
|
inline uint gfMul(uint a,uint b); // Multiplication in Galois field.
|
|
inline uint gfInv(uint a); // Inverse element in Galois field.
|
|
uint *gfExp; // Galois field exponents.
|
|
uint *gfLog; // Galois field logarithms.
|
|
|
|
void MakeEncoderMatrix();
|
|
void MakeDecoderMatrix();
|
|
void InvertDecoderMatrix();
|
|
|
|
#ifdef USE_SSE
|
|
bool SSE_UpdateECC(uint DataNum, uint ECCNum, const byte *Data, byte *ECC, size_t BlockSize);
|
|
#endif
|
|
|
|
bool Decoding; // If we are decoding or encoding data.
|
|
uint ND; // Number of data units.
|
|
uint NR; // Number of Reed-Solomon code units.
|
|
uint NE; // Number of erasures.
|
|
bool *ValidFlags; // Validity flags for data and ECC units.
|
|
uint *MX; // Cauchy based coding or decoding matrix.
|
|
|
|
uint *DataLog; // Buffer to store data logarithms for UpdateECC.
|
|
size_t DataLogSize;
|
|
|
|
public:
|
|
RSCoder16();
|
|
~RSCoder16();
|
|
|
|
bool Init(uint DataCount, uint RecCount, bool *ValidityFlags);
|
|
#if 0 // We use only UpdateECC now.
|
|
void Process(const uint *Data, uint *Out);
|
|
#endif
|
|
void UpdateECC(uint DataNum, uint ECCNum, const byte *Data, byte *ECC, size_t BlockSize);
|
|
};
|
|
|
|
#endif
|