xref: /aosp_15_r20/external/fec/encode_rs.h (revision 638691a093b4f9473cd6ee8f3e0139deef159a86)
1*638691a0SAndroid Build Coastguard Worker /* The guts of the Reed-Solomon encoder, meant to be #included
2*638691a0SAndroid Build Coastguard Worker  * into a function body with the following typedefs, macros and variables supplied
3*638691a0SAndroid Build Coastguard Worker  * according to the code parameters:
4*638691a0SAndroid Build Coastguard Worker 
5*638691a0SAndroid Build Coastguard Worker  * data_t - a typedef for the data symbol
6*638691a0SAndroid Build Coastguard Worker  * data_t data[] - array of NN-NROOTS-PAD and type data_t to be encoded
7*638691a0SAndroid Build Coastguard Worker  * data_t parity[] - an array of NROOTS and type data_t to be written with parity symbols
8*638691a0SAndroid Build Coastguard Worker  * NROOTS - the number of roots in the RS code generator polynomial,
9*638691a0SAndroid Build Coastguard Worker  *          which is the same as the number of parity symbols in a block.
10*638691a0SAndroid Build Coastguard Worker             Integer variable or literal.
11*638691a0SAndroid Build Coastguard Worker 	    *
12*638691a0SAndroid Build Coastguard Worker  * NN - the total number of symbols in a RS block. Integer variable or literal.
13*638691a0SAndroid Build Coastguard Worker  * PAD - the number of pad symbols in a block. Integer variable or literal.
14*638691a0SAndroid Build Coastguard Worker  * ALPHA_TO - The address of an array of NN elements to convert Galois field
15*638691a0SAndroid Build Coastguard Worker  *            elements in index (log) form to polynomial form. Read only.
16*638691a0SAndroid Build Coastguard Worker  * INDEX_OF - The address of an array of NN elements to convert Galois field
17*638691a0SAndroid Build Coastguard Worker  *            elements in polynomial form to index (log) form. Read only.
18*638691a0SAndroid Build Coastguard Worker  * MODNN - a function to reduce its argument modulo NN. May be inline or a macro.
19*638691a0SAndroid Build Coastguard Worker  * GENPOLY - an array of NROOTS+1 elements containing the generator polynomial in index form
20*638691a0SAndroid Build Coastguard Worker 
21*638691a0SAndroid Build Coastguard Worker  * The memset() and memmove() functions are used. The appropriate header
22*638691a0SAndroid Build Coastguard Worker  * file declaring these functions (usually <string.h>) must be included by the calling
23*638691a0SAndroid Build Coastguard Worker  * program.
24*638691a0SAndroid Build Coastguard Worker 
25*638691a0SAndroid Build Coastguard Worker  * Copyright 2004, Phil Karn, KA9Q
26*638691a0SAndroid Build Coastguard Worker  * May be used under the terms of the GNU Lesser General Public License (LGPL)
27*638691a0SAndroid Build Coastguard Worker  */
28*638691a0SAndroid Build Coastguard Worker 
29*638691a0SAndroid Build Coastguard Worker 
30*638691a0SAndroid Build Coastguard Worker #undef A0
31*638691a0SAndroid Build Coastguard Worker #define A0 (NN) /* Special reserved value encoding zero in index form */
32*638691a0SAndroid Build Coastguard Worker 
33*638691a0SAndroid Build Coastguard Worker {
34*638691a0SAndroid Build Coastguard Worker   int i, j;
35*638691a0SAndroid Build Coastguard Worker   data_t feedback;
36*638691a0SAndroid Build Coastguard Worker 
37*638691a0SAndroid Build Coastguard Worker   memset(parity,0,NROOTS*sizeof(data_t));
38*638691a0SAndroid Build Coastguard Worker 
39*638691a0SAndroid Build Coastguard Worker   for(i=0;i<NN-NROOTS-PAD;i++){
40*638691a0SAndroid Build Coastguard Worker     feedback = INDEX_OF[data[i] ^ parity[0]];
41*638691a0SAndroid Build Coastguard Worker     if(feedback != A0){      /* feedback term is non-zero */
42*638691a0SAndroid Build Coastguard Worker #ifdef UNNORMALIZED
43*638691a0SAndroid Build Coastguard Worker       /* This line is unnecessary when GENPOLY[NROOTS] is unity, as it must
44*638691a0SAndroid Build Coastguard Worker        * always be for the polynomials constructed by init_rs()
45*638691a0SAndroid Build Coastguard Worker        */
46*638691a0SAndroid Build Coastguard Worker       feedback = MODNN(NN - GENPOLY[NROOTS] + feedback);
47*638691a0SAndroid Build Coastguard Worker #endif
48*638691a0SAndroid Build Coastguard Worker       for(j=1;j<NROOTS;j++)
49*638691a0SAndroid Build Coastguard Worker 	parity[j] ^= ALPHA_TO[MODNN(feedback + GENPOLY[NROOTS-j])];
50*638691a0SAndroid Build Coastguard Worker     }
51*638691a0SAndroid Build Coastguard Worker     /* Shift */
52*638691a0SAndroid Build Coastguard Worker     memmove(&parity[0],&parity[1],sizeof(data_t)*(NROOTS-1));
53*638691a0SAndroid Build Coastguard Worker     if(feedback != A0)
54*638691a0SAndroid Build Coastguard Worker       parity[NROOTS-1] = ALPHA_TO[MODNN(feedback + GENPOLY[0])];
55*638691a0SAndroid Build Coastguard Worker     else
56*638691a0SAndroid Build Coastguard Worker       parity[NROOTS-1] = 0;
57*638691a0SAndroid Build Coastguard Worker   }
58*638691a0SAndroid Build Coastguard Worker }
59