xref: /aosp_15_r20/external/fec/encode_rs.c (revision 638691a093b4f9473cd6ee8f3e0139deef159a86)
1*638691a0SAndroid Build Coastguard Worker /* Reed-Solomon encoder
2*638691a0SAndroid Build Coastguard Worker  * Copyright 2002, Phil Karn, KA9Q
3*638691a0SAndroid Build Coastguard Worker  * May be used under the terms of the GNU Lesser General Public License (LGPL)
4*638691a0SAndroid Build Coastguard Worker  */
5*638691a0SAndroid Build Coastguard Worker #include <string.h>
6*638691a0SAndroid Build Coastguard Worker 
7*638691a0SAndroid Build Coastguard Worker #ifdef FIXED
8*638691a0SAndroid Build Coastguard Worker #include "fixed.h"
9*638691a0SAndroid Build Coastguard Worker #elif defined(BIGSYM)
10*638691a0SAndroid Build Coastguard Worker #include "int.h"
11*638691a0SAndroid Build Coastguard Worker #else
12*638691a0SAndroid Build Coastguard Worker #include "char.h"
13*638691a0SAndroid Build Coastguard Worker #endif
14*638691a0SAndroid Build Coastguard Worker 
ENCODE_RS(data_t * data,data_t * bb,int pad)15*638691a0SAndroid Build Coastguard Worker void ENCODE_RS(
16*638691a0SAndroid Build Coastguard Worker #ifdef FIXED
17*638691a0SAndroid Build Coastguard Worker data_t *data, data_t *bb,int pad){
18*638691a0SAndroid Build Coastguard Worker #else
19*638691a0SAndroid Build Coastguard Worker void *p,data_t *data, data_t *bb){
20*638691a0SAndroid Build Coastguard Worker   struct rs *rs = (struct rs *)p;
21*638691a0SAndroid Build Coastguard Worker #endif
22*638691a0SAndroid Build Coastguard Worker   int i, j;
23*638691a0SAndroid Build Coastguard Worker   data_t feedback;
24*638691a0SAndroid Build Coastguard Worker 
25*638691a0SAndroid Build Coastguard Worker #ifdef FIXED
26*638691a0SAndroid Build Coastguard Worker   /* Check pad parameter for validity */
27*638691a0SAndroid Build Coastguard Worker   if(pad < 0 || pad >= NN)
28*638691a0SAndroid Build Coastguard Worker     return;
29*638691a0SAndroid Build Coastguard Worker #endif
30*638691a0SAndroid Build Coastguard Worker 
31*638691a0SAndroid Build Coastguard Worker   memset(bb,0,NROOTS*sizeof(data_t));
32*638691a0SAndroid Build Coastguard Worker 
33*638691a0SAndroid Build Coastguard Worker   for(i=0;i<NN-NROOTS-PAD;i++){
34*638691a0SAndroid Build Coastguard Worker     feedback = INDEX_OF[data[i] ^ bb[0]];
35*638691a0SAndroid Build Coastguard Worker     if(feedback != A0){      /* feedback term is non-zero */
36*638691a0SAndroid Build Coastguard Worker #ifdef UNNORMALIZED
37*638691a0SAndroid Build Coastguard Worker       /* This line is unnecessary when GENPOLY[NROOTS] is unity, as it must
38*638691a0SAndroid Build Coastguard Worker        * always be for the polynomials constructed by init_rs()
39*638691a0SAndroid Build Coastguard Worker        */
40*638691a0SAndroid Build Coastguard Worker       feedback = MODNN(NN - GENPOLY[NROOTS] + feedback);
41*638691a0SAndroid Build Coastguard Worker #endif
42*638691a0SAndroid Build Coastguard Worker       for(j=1;j<NROOTS;j++)
43*638691a0SAndroid Build Coastguard Worker 	bb[j] ^= ALPHA_TO[MODNN(feedback + GENPOLY[NROOTS-j])];
44*638691a0SAndroid Build Coastguard Worker     }
45*638691a0SAndroid Build Coastguard Worker     /* Shift */
46*638691a0SAndroid Build Coastguard Worker     memmove(&bb[0],&bb[1],sizeof(data_t)*(NROOTS-1));
47*638691a0SAndroid Build Coastguard Worker     if(feedback != A0)
48*638691a0SAndroid Build Coastguard Worker       bb[NROOTS-1] = ALPHA_TO[MODNN(feedback + GENPOLY[0])];
49*638691a0SAndroid Build Coastguard Worker     else
50*638691a0SAndroid Build Coastguard Worker       bb[NROOTS-1] = 0;
51*638691a0SAndroid Build Coastguard Worker   }
52*638691a0SAndroid Build Coastguard Worker }
53