1234567891011121314151617181920212223242526272829303132333435363738394041424344 |
- #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
|