libclamunrar/rs16.hpp
d39cb658
 #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