1*638691a0SAndroid Build Coastguard Worker /* User include file for libfec
2*638691a0SAndroid Build Coastguard Worker * Copyright 2004, 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
6*638691a0SAndroid Build Coastguard Worker #ifndef _FEC_H_
7*638691a0SAndroid Build Coastguard Worker #define _FEC_H_
8*638691a0SAndroid Build Coastguard Worker
9*638691a0SAndroid Build Coastguard Worker /* r=1/2 k=7 convolutional encoder polynomials
10*638691a0SAndroid Build Coastguard Worker * The NASA-DSN convention is to use V27POLYA inverted, then V27POLYB
11*638691a0SAndroid Build Coastguard Worker * The CCSDS/NASA-GSFC convention is to use V27POLYB, then V27POLYA inverted
12*638691a0SAndroid Build Coastguard Worker */
13*638691a0SAndroid Build Coastguard Worker #define V27POLYA 0x6d
14*638691a0SAndroid Build Coastguard Worker #define V27POLYB 0x4f
15*638691a0SAndroid Build Coastguard Worker
16*638691a0SAndroid Build Coastguard Worker void *create_viterbi27(int len);
17*638691a0SAndroid Build Coastguard Worker void set_viterbi27_polynomial(int polys[2]);
18*638691a0SAndroid Build Coastguard Worker int init_viterbi27(void *vp,int starting_state);
19*638691a0SAndroid Build Coastguard Worker int update_viterbi27_blk(void *vp,unsigned char sym[],int npairs);
20*638691a0SAndroid Build Coastguard Worker int chainback_viterbi27(void *vp, unsigned char *data,unsigned int nbits,unsigned int endstate);
21*638691a0SAndroid Build Coastguard Worker void delete_viterbi27(void *vp);
22*638691a0SAndroid Build Coastguard Worker
23*638691a0SAndroid Build Coastguard Worker #ifdef __VEC__
24*638691a0SAndroid Build Coastguard Worker void *create_viterbi27_av(int len);
25*638691a0SAndroid Build Coastguard Worker void set_viterbi27_polynomial_av(int polys[2]);
26*638691a0SAndroid Build Coastguard Worker int init_viterbi27_av(void *p,int starting_state);
27*638691a0SAndroid Build Coastguard Worker int chainback_viterbi27_av(void *p,unsigned char *data,unsigned int nbits,unsigned int endstate);
28*638691a0SAndroid Build Coastguard Worker void delete_viterbi27_av(void *p);
29*638691a0SAndroid Build Coastguard Worker int update_viterbi27_blk_av(void *p,unsigned char *syms,int nbits);
30*638691a0SAndroid Build Coastguard Worker #endif
31*638691a0SAndroid Build Coastguard Worker
32*638691a0SAndroid Build Coastguard Worker #ifdef __i386__
33*638691a0SAndroid Build Coastguard Worker void *create_viterbi27_mmx(int len);
34*638691a0SAndroid Build Coastguard Worker void set_viterbi27_polynomial_mmx(int polys[2]);
35*638691a0SAndroid Build Coastguard Worker int init_viterbi27_mmx(void *p,int starting_state);
36*638691a0SAndroid Build Coastguard Worker int chainback_viterbi27_mmx(void *p,unsigned char *data,unsigned int nbits,unsigned int endstate);
37*638691a0SAndroid Build Coastguard Worker void delete_viterbi27_mmx(void *p);
38*638691a0SAndroid Build Coastguard Worker int update_viterbi27_blk_mmx(void *p,unsigned char *syms,int nbits);
39*638691a0SAndroid Build Coastguard Worker
40*638691a0SAndroid Build Coastguard Worker void *create_viterbi27_sse(int len);
41*638691a0SAndroid Build Coastguard Worker void set_viterbi27_polynomial_sse(int polys[2]);
42*638691a0SAndroid Build Coastguard Worker int init_viterbi27_sse(void *p,int starting_state);
43*638691a0SAndroid Build Coastguard Worker int chainback_viterbi27_sse(void *p,unsigned char *data,unsigned int nbits,unsigned int endstate);
44*638691a0SAndroid Build Coastguard Worker void delete_viterbi27_sse(void *p);
45*638691a0SAndroid Build Coastguard Worker int update_viterbi27_blk_sse(void *p,unsigned char *syms,int nbits);
46*638691a0SAndroid Build Coastguard Worker
47*638691a0SAndroid Build Coastguard Worker void *create_viterbi27_sse2(int len);
48*638691a0SAndroid Build Coastguard Worker void set_viterbi27_polynomial_sse2(int polys[2]);
49*638691a0SAndroid Build Coastguard Worker int init_viterbi27_sse2(void *p,int starting_state);
50*638691a0SAndroid Build Coastguard Worker int chainback_viterbi27_sse2(void *p,unsigned char *data,unsigned int nbits,unsigned int endstate);
51*638691a0SAndroid Build Coastguard Worker void delete_viterbi27_sse2(void *p);
52*638691a0SAndroid Build Coastguard Worker int update_viterbi27_blk_sse2(void *p,unsigned char *syms,int nbits);
53*638691a0SAndroid Build Coastguard Worker #endif
54*638691a0SAndroid Build Coastguard Worker
55*638691a0SAndroid Build Coastguard Worker void *create_viterbi27_port(int len);
56*638691a0SAndroid Build Coastguard Worker void set_viterbi27_polynomial_port(int polys[2]);
57*638691a0SAndroid Build Coastguard Worker int init_viterbi27_port(void *p,int starting_state);
58*638691a0SAndroid Build Coastguard Worker int chainback_viterbi27_port(void *p,unsigned char *data,unsigned int nbits,unsigned int endstate);
59*638691a0SAndroid Build Coastguard Worker void delete_viterbi27_port(void *p);
60*638691a0SAndroid Build Coastguard Worker int update_viterbi27_blk_port(void *p,unsigned char *syms,int nbits);
61*638691a0SAndroid Build Coastguard Worker
62*638691a0SAndroid Build Coastguard Worker /* r=1/2 k=9 convolutional encoder polynomials */
63*638691a0SAndroid Build Coastguard Worker #define V29POLYA 0x1af
64*638691a0SAndroid Build Coastguard Worker #define V29POLYB 0x11d
65*638691a0SAndroid Build Coastguard Worker
66*638691a0SAndroid Build Coastguard Worker void *create_viterbi29(int len);
67*638691a0SAndroid Build Coastguard Worker void set_viterbi29_polynomial(int polys[2]);
68*638691a0SAndroid Build Coastguard Worker int init_viterbi29(void *vp,int starting_state);
69*638691a0SAndroid Build Coastguard Worker int update_viterbi29_blk(void *vp,unsigned char syms[],int nbits);
70*638691a0SAndroid Build Coastguard Worker int chainback_viterbi29(void *vp, unsigned char *data,unsigned int nbits,unsigned int endstate);
71*638691a0SAndroid Build Coastguard Worker void delete_viterbi29(void *vp);
72*638691a0SAndroid Build Coastguard Worker
73*638691a0SAndroid Build Coastguard Worker #ifdef __VEC__
74*638691a0SAndroid Build Coastguard Worker void *create_viterbi29_av(int len);
75*638691a0SAndroid Build Coastguard Worker void set_viterbi29_polynomial_av(int polys[2]);
76*638691a0SAndroid Build Coastguard Worker int init_viterbi29_av(void *p,int starting_state);
77*638691a0SAndroid Build Coastguard Worker int chainback_viterbi29_av(void *p,unsigned char *data,unsigned int nbits,unsigned int endstate);
78*638691a0SAndroid Build Coastguard Worker void delete_viterbi29_av(void *p);
79*638691a0SAndroid Build Coastguard Worker int update_viterbi29_blk_av(void *p,unsigned char *syms,int nbits);
80*638691a0SAndroid Build Coastguard Worker #endif
81*638691a0SAndroid Build Coastguard Worker
82*638691a0SAndroid Build Coastguard Worker #ifdef __i386__
83*638691a0SAndroid Build Coastguard Worker void *create_viterbi29_mmx(int len);
84*638691a0SAndroid Build Coastguard Worker void set_viterbi29_polynomial_mmx(int polys[2]);
85*638691a0SAndroid Build Coastguard Worker int init_viterbi29_mmx(void *p,int starting_state);
86*638691a0SAndroid Build Coastguard Worker int chainback_viterbi29_mmx(void *p,unsigned char *data,unsigned int nbits,unsigned int endstate);
87*638691a0SAndroid Build Coastguard Worker void delete_viterbi29_mmx(void *p);
88*638691a0SAndroid Build Coastguard Worker int update_viterbi29_blk_mmx(void *p,unsigned char *syms,int nbits);
89*638691a0SAndroid Build Coastguard Worker
90*638691a0SAndroid Build Coastguard Worker void *create_viterbi29_sse(int len);
91*638691a0SAndroid Build Coastguard Worker void set_viterbi29_polynomial_sse(int polys[2]);
92*638691a0SAndroid Build Coastguard Worker int init_viterbi29_sse(void *p,int starting_state);
93*638691a0SAndroid Build Coastguard Worker int chainback_viterbi29_sse(void *p,unsigned char *data,unsigned int nbits,unsigned int endstate);
94*638691a0SAndroid Build Coastguard Worker void delete_viterbi29_sse(void *p);
95*638691a0SAndroid Build Coastguard Worker int update_viterbi29_blk_sse(void *p,unsigned char *syms,int nbits);
96*638691a0SAndroid Build Coastguard Worker
97*638691a0SAndroid Build Coastguard Worker void *create_viterbi29_sse2(int len);
98*638691a0SAndroid Build Coastguard Worker void set_viterbi29_polynomial_sse2(int polys[2]);
99*638691a0SAndroid Build Coastguard Worker int init_viterbi29_sse2(void *p,int starting_state);
100*638691a0SAndroid Build Coastguard Worker int chainback_viterbi29_sse2(void *p,unsigned char *data,unsigned int nbits,unsigned int endstate);
101*638691a0SAndroid Build Coastguard Worker void delete_viterbi29_sse2(void *p);
102*638691a0SAndroid Build Coastguard Worker int update_viterbi29_blk_sse2(void *p,unsigned char *syms,int nbits);
103*638691a0SAndroid Build Coastguard Worker #endif
104*638691a0SAndroid Build Coastguard Worker
105*638691a0SAndroid Build Coastguard Worker void *create_viterbi29_port(int len);
106*638691a0SAndroid Build Coastguard Worker void set_viterbi29_polynomial_port(int polys[2]);
107*638691a0SAndroid Build Coastguard Worker int init_viterbi29_port(void *p,int starting_state);
108*638691a0SAndroid Build Coastguard Worker int chainback_viterbi29_port(void *p,unsigned char *data,unsigned int nbits,unsigned int endstate);
109*638691a0SAndroid Build Coastguard Worker void delete_viterbi29_port(void *p);
110*638691a0SAndroid Build Coastguard Worker int update_viterbi29_blk_port(void *p,unsigned char *syms,int nbits);
111*638691a0SAndroid Build Coastguard Worker
112*638691a0SAndroid Build Coastguard Worker /* r=1/3 k=9 convolutional encoder polynomials */
113*638691a0SAndroid Build Coastguard Worker #define V39POLYA 0x1ed
114*638691a0SAndroid Build Coastguard Worker #define V39POLYB 0x19b
115*638691a0SAndroid Build Coastguard Worker #define V39POLYC 0x127
116*638691a0SAndroid Build Coastguard Worker
117*638691a0SAndroid Build Coastguard Worker void *create_viterbi39(int len);
118*638691a0SAndroid Build Coastguard Worker void set_viterbi39_polynomial(int polys[3]);
119*638691a0SAndroid Build Coastguard Worker int init_viterbi39(void *vp,int starting_state);
120*638691a0SAndroid Build Coastguard Worker int update_viterbi39_blk(void *vp,unsigned char syms[],int nbits);
121*638691a0SAndroid Build Coastguard Worker int chainback_viterbi39(void *vp, unsigned char *data,unsigned int nbits,unsigned int endstate);
122*638691a0SAndroid Build Coastguard Worker void delete_viterbi39(void *vp);
123*638691a0SAndroid Build Coastguard Worker
124*638691a0SAndroid Build Coastguard Worker #ifdef __VEC__
125*638691a0SAndroid Build Coastguard Worker void *create_viterbi39_av(int len);
126*638691a0SAndroid Build Coastguard Worker void set_viterbi39_polynomial_av(int polys[3]);
127*638691a0SAndroid Build Coastguard Worker int init_viterbi39_av(void *p,int starting_state);
128*638691a0SAndroid Build Coastguard Worker int chainback_viterbi39_av(void *p,unsigned char *data,unsigned int nbits,unsigned int endstate);
129*638691a0SAndroid Build Coastguard Worker void delete_viterbi39_av(void *p);
130*638691a0SAndroid Build Coastguard Worker int update_viterbi39_blk_av(void *p,unsigned char *syms,int nbits);
131*638691a0SAndroid Build Coastguard Worker #endif
132*638691a0SAndroid Build Coastguard Worker
133*638691a0SAndroid Build Coastguard Worker #ifdef __i386__
134*638691a0SAndroid Build Coastguard Worker void *create_viterbi39_mmx(int len);
135*638691a0SAndroid Build Coastguard Worker void set_viterbi39_polynomial_mmx(int polys[3]);
136*638691a0SAndroid Build Coastguard Worker int init_viterbi39_mmx(void *p,int starting_state);
137*638691a0SAndroid Build Coastguard Worker int chainback_viterbi39_mmx(void *p,unsigned char *data,unsigned int nbits,unsigned int endstate);
138*638691a0SAndroid Build Coastguard Worker void delete_viterbi39_mmx(void *p);
139*638691a0SAndroid Build Coastguard Worker int update_viterbi39_blk_mmx(void *p,unsigned char *syms,int nbits);
140*638691a0SAndroid Build Coastguard Worker
141*638691a0SAndroid Build Coastguard Worker void *create_viterbi39_sse(int len);
142*638691a0SAndroid Build Coastguard Worker void set_viterbi39_polynomial_sse(int polys[3]);
143*638691a0SAndroid Build Coastguard Worker int init_viterbi39_sse(void *p,int starting_state);
144*638691a0SAndroid Build Coastguard Worker int chainback_viterbi39_sse(void *p,unsigned char *data,unsigned int nbits,unsigned int endstate);
145*638691a0SAndroid Build Coastguard Worker void delete_viterbi39_sse(void *p);
146*638691a0SAndroid Build Coastguard Worker int update_viterbi39_blk_sse(void *p,unsigned char *syms,int nbits);
147*638691a0SAndroid Build Coastguard Worker
148*638691a0SAndroid Build Coastguard Worker void *create_viterbi39_sse2(int len);
149*638691a0SAndroid Build Coastguard Worker void set_viterbi39_polynomial_sse2(int polys[3]);
150*638691a0SAndroid Build Coastguard Worker int init_viterbi39_sse2(void *p,int starting_state);
151*638691a0SAndroid Build Coastguard Worker int chainback_viterbi39_sse2(void *p,unsigned char *data,unsigned int nbits,unsigned int endstate);
152*638691a0SAndroid Build Coastguard Worker void delete_viterbi39_sse2(void *p);
153*638691a0SAndroid Build Coastguard Worker int update_viterbi39_blk_sse2(void *p,unsigned char *syms,int nbits);
154*638691a0SAndroid Build Coastguard Worker #endif
155*638691a0SAndroid Build Coastguard Worker
156*638691a0SAndroid Build Coastguard Worker void *create_viterbi39_port(int len);
157*638691a0SAndroid Build Coastguard Worker void set_viterbi39_polynomial_port(int polys[3]);
158*638691a0SAndroid Build Coastguard Worker int init_viterbi39_port(void *p,int starting_state);
159*638691a0SAndroid Build Coastguard Worker int chainback_viterbi39_port(void *p,unsigned char *data,unsigned int nbits,unsigned int endstate);
160*638691a0SAndroid Build Coastguard Worker void delete_viterbi39_port(void *p);
161*638691a0SAndroid Build Coastguard Worker int update_viterbi39_blk_port(void *p,unsigned char *syms,int nbits);
162*638691a0SAndroid Build Coastguard Worker
163*638691a0SAndroid Build Coastguard Worker
164*638691a0SAndroid Build Coastguard Worker /* r=1/6 k=15 Cassini convolutional encoder polynomials without symbol inversion
165*638691a0SAndroid Build Coastguard Worker * dfree = 56
166*638691a0SAndroid Build Coastguard Worker * These bits may be left-right flipped from some textbook representations;
167*638691a0SAndroid Build Coastguard Worker * here I have the bits entering the shift register from the right (low) end
168*638691a0SAndroid Build Coastguard Worker *
169*638691a0SAndroid Build Coastguard Worker * Some other spacecraft use the same code, but with the polynomials in a different order.
170*638691a0SAndroid Build Coastguard Worker * E.g., Mars Pathfinder and STEREO swap POLYC and POLYD. All use alternate symbol inversion,
171*638691a0SAndroid Build Coastguard Worker * so use set_viterbi615_polynomial() as appropriate.
172*638691a0SAndroid Build Coastguard Worker */
173*638691a0SAndroid Build Coastguard Worker #define V615POLYA 042631
174*638691a0SAndroid Build Coastguard Worker #define V615POLYB 047245
175*638691a0SAndroid Build Coastguard Worker #define V615POLYC 056507
176*638691a0SAndroid Build Coastguard Worker #define V615POLYD 073363
177*638691a0SAndroid Build Coastguard Worker #define V615POLYE 077267
178*638691a0SAndroid Build Coastguard Worker #define V615POLYF 064537
179*638691a0SAndroid Build Coastguard Worker
180*638691a0SAndroid Build Coastguard Worker void *create_viterbi615(int len);
181*638691a0SAndroid Build Coastguard Worker void set_viterbi615_polynomial(int polys[6]);
182*638691a0SAndroid Build Coastguard Worker int init_viterbi615(void *vp,int starting_state);
183*638691a0SAndroid Build Coastguard Worker int update_viterbi615_blk(void *vp,unsigned char *syms,int nbits);
184*638691a0SAndroid Build Coastguard Worker int chainback_viterbi615(void *vp, unsigned char *data,unsigned int nbits,unsigned int endstate);
185*638691a0SAndroid Build Coastguard Worker void delete_viterbi615(void *vp);
186*638691a0SAndroid Build Coastguard Worker
187*638691a0SAndroid Build Coastguard Worker #ifdef __VEC__
188*638691a0SAndroid Build Coastguard Worker void *create_viterbi615_av(int len);
189*638691a0SAndroid Build Coastguard Worker void set_viterbi615_polynomial_av(int polys[6]);
190*638691a0SAndroid Build Coastguard Worker int init_viterbi615_av(void *p,int starting_state);
191*638691a0SAndroid Build Coastguard Worker int chainback_viterbi615_av(void *p,unsigned char *data,unsigned int nbits,unsigned int endstate);
192*638691a0SAndroid Build Coastguard Worker void delete_viterbi615_av(void *p);
193*638691a0SAndroid Build Coastguard Worker int update_viterbi615_blk_av(void *p,unsigned char *syms,int nbits);
194*638691a0SAndroid Build Coastguard Worker #endif
195*638691a0SAndroid Build Coastguard Worker
196*638691a0SAndroid Build Coastguard Worker #ifdef __i386__
197*638691a0SAndroid Build Coastguard Worker void *create_viterbi615_mmx(int len);
198*638691a0SAndroid Build Coastguard Worker void set_viterbi615_polynomial_mmx(int polys[6]);
199*638691a0SAndroid Build Coastguard Worker int init_viterbi615_mmx(void *p,int starting_state);
200*638691a0SAndroid Build Coastguard Worker int chainback_viterbi615_mmx(void *p,unsigned char *data,unsigned int nbits,unsigned int endstate);
201*638691a0SAndroid Build Coastguard Worker void delete_viterbi615_mmx(void *p);
202*638691a0SAndroid Build Coastguard Worker int update_viterbi615_blk_mmx(void *p,unsigned char *syms,int nbits);
203*638691a0SAndroid Build Coastguard Worker
204*638691a0SAndroid Build Coastguard Worker void *create_viterbi615_sse(int len);
205*638691a0SAndroid Build Coastguard Worker void set_viterbi615_polynomial_sse(int polys[6]);
206*638691a0SAndroid Build Coastguard Worker int init_viterbi615_sse(void *p,int starting_state);
207*638691a0SAndroid Build Coastguard Worker int chainback_viterbi615_sse(void *p,unsigned char *data,unsigned int nbits,unsigned int endstate);
208*638691a0SAndroid Build Coastguard Worker void delete_viterbi615_sse(void *p);
209*638691a0SAndroid Build Coastguard Worker int update_viterbi615_blk_sse(void *p,unsigned char *syms,int nbits);
210*638691a0SAndroid Build Coastguard Worker
211*638691a0SAndroid Build Coastguard Worker void *create_viterbi615_sse2(int len);
212*638691a0SAndroid Build Coastguard Worker void set_viterbi615_polynomial_sse2(int polys[6]);
213*638691a0SAndroid Build Coastguard Worker int init_viterbi615_sse2(void *p,int starting_state);
214*638691a0SAndroid Build Coastguard Worker int chainback_viterbi615_sse2(void *p,unsigned char *data,unsigned int nbits,unsigned int endstate);
215*638691a0SAndroid Build Coastguard Worker void delete_viterbi615_sse2(void *p);
216*638691a0SAndroid Build Coastguard Worker int update_viterbi615_blk_sse2(void *p,unsigned char *syms,int nbits);
217*638691a0SAndroid Build Coastguard Worker
218*638691a0SAndroid Build Coastguard Worker #endif
219*638691a0SAndroid Build Coastguard Worker
220*638691a0SAndroid Build Coastguard Worker void *create_viterbi615_port(int len);
221*638691a0SAndroid Build Coastguard Worker void set_viterbi615_polynomial_port(int polys[6]);
222*638691a0SAndroid Build Coastguard Worker int init_viterbi615_port(void *p,int starting_state);
223*638691a0SAndroid Build Coastguard Worker int chainback_viterbi615_port(void *p,unsigned char *data,unsigned int nbits,unsigned int endstate);
224*638691a0SAndroid Build Coastguard Worker void delete_viterbi615_port(void *p);
225*638691a0SAndroid Build Coastguard Worker int update_viterbi615_blk_port(void *p,unsigned char *syms,int nbits);
226*638691a0SAndroid Build Coastguard Worker
227*638691a0SAndroid Build Coastguard Worker
228*638691a0SAndroid Build Coastguard Worker /* General purpose RS codec, 8-bit symbols */
229*638691a0SAndroid Build Coastguard Worker void encode_rs_char(void *rs,unsigned char *data,unsigned char *parity);
230*638691a0SAndroid Build Coastguard Worker int decode_rs_char(void *rs,unsigned char *data,int *eras_pos,
231*638691a0SAndroid Build Coastguard Worker int no_eras);
232*638691a0SAndroid Build Coastguard Worker void *init_rs_char(int symsize,int gfpoly,
233*638691a0SAndroid Build Coastguard Worker int fcr,int prim,int nroots,
234*638691a0SAndroid Build Coastguard Worker int pad);
235*638691a0SAndroid Build Coastguard Worker void free_rs_char(void *rs);
236*638691a0SAndroid Build Coastguard Worker
237*638691a0SAndroid Build Coastguard Worker /* General purpose RS codec, integer symbols */
238*638691a0SAndroid Build Coastguard Worker void encode_rs_int(void *rs,int *data,int *parity);
239*638691a0SAndroid Build Coastguard Worker int decode_rs_int(void *rs,int *data,int *eras_pos,int no_eras);
240*638691a0SAndroid Build Coastguard Worker void *init_rs_int(int symsize,int gfpoly,int fcr,
241*638691a0SAndroid Build Coastguard Worker int prim,int nroots,int pad);
242*638691a0SAndroid Build Coastguard Worker void free_rs_int(void *rs);
243*638691a0SAndroid Build Coastguard Worker
244*638691a0SAndroid Build Coastguard Worker /* CCSDS standard (255,223) RS codec with conventional (*not* dual-basis)
245*638691a0SAndroid Build Coastguard Worker * symbol representation
246*638691a0SAndroid Build Coastguard Worker */
247*638691a0SAndroid Build Coastguard Worker void encode_rs_8(unsigned char *data,unsigned char *parity,int pad);
248*638691a0SAndroid Build Coastguard Worker int decode_rs_8(unsigned char *data,int *eras_pos,int no_eras,int pad);
249*638691a0SAndroid Build Coastguard Worker
250*638691a0SAndroid Build Coastguard Worker /* CCSDS standard (255,223) RS codec with dual-basis symbol representation */
251*638691a0SAndroid Build Coastguard Worker void encode_rs_ccsds(unsigned char *data,unsigned char *parity,int pad);
252*638691a0SAndroid Build Coastguard Worker int decode_rs_ccsds(unsigned char *data,int *eras_pos,int no_eras,int pad);
253*638691a0SAndroid Build Coastguard Worker
254*638691a0SAndroid Build Coastguard Worker /* Tables to map from conventional->dual (Taltab) and
255*638691a0SAndroid Build Coastguard Worker * dual->conventional (Tal1tab) bases
256*638691a0SAndroid Build Coastguard Worker */
257*638691a0SAndroid Build Coastguard Worker extern unsigned char Taltab[],Tal1tab[];
258*638691a0SAndroid Build Coastguard Worker
259*638691a0SAndroid Build Coastguard Worker
260*638691a0SAndroid Build Coastguard Worker /* CPU SIMD instruction set available */
261*638691a0SAndroid Build Coastguard Worker extern enum cpu_mode {UNKNOWN=0,PORT,MMX,SSE,SSE2,ALTIVEC} Cpu_mode;
262*638691a0SAndroid Build Coastguard Worker void find_cpu_mode(void); /* Call this once at startup to set Cpu_mode */
263*638691a0SAndroid Build Coastguard Worker
264*638691a0SAndroid Build Coastguard Worker /* Determine parity of argument: 1 = odd, 0 = even */
265*638691a0SAndroid Build Coastguard Worker #ifdef __i386__
parityb(unsigned char x)266*638691a0SAndroid Build Coastguard Worker static inline int parityb(unsigned char x){
267*638691a0SAndroid Build Coastguard Worker __asm__ __volatile__ ("test %1,%1;setpo %0" : "=g"(x) : "r" (x));
268*638691a0SAndroid Build Coastguard Worker return x;
269*638691a0SAndroid Build Coastguard Worker }
270*638691a0SAndroid Build Coastguard Worker #else
271*638691a0SAndroid Build Coastguard Worker void partab_init();
272*638691a0SAndroid Build Coastguard Worker
parityb(unsigned char x)273*638691a0SAndroid Build Coastguard Worker static inline int parityb(unsigned char x){
274*638691a0SAndroid Build Coastguard Worker extern unsigned char Partab[256];
275*638691a0SAndroid Build Coastguard Worker extern int P_init;
276*638691a0SAndroid Build Coastguard Worker if(!P_init){
277*638691a0SAndroid Build Coastguard Worker partab_init();
278*638691a0SAndroid Build Coastguard Worker }
279*638691a0SAndroid Build Coastguard Worker return Partab[x];
280*638691a0SAndroid Build Coastguard Worker }
281*638691a0SAndroid Build Coastguard Worker #endif
282*638691a0SAndroid Build Coastguard Worker
283*638691a0SAndroid Build Coastguard Worker
parity(int x)284*638691a0SAndroid Build Coastguard Worker static inline int parity(int x){
285*638691a0SAndroid Build Coastguard Worker /* Fold down to one byte */
286*638691a0SAndroid Build Coastguard Worker x ^= (x >> 16);
287*638691a0SAndroid Build Coastguard Worker x ^= (x >> 8);
288*638691a0SAndroid Build Coastguard Worker return parityb(x);
289*638691a0SAndroid Build Coastguard Worker }
290*638691a0SAndroid Build Coastguard Worker
291*638691a0SAndroid Build Coastguard Worker /* Useful utilities for simulation */
292*638691a0SAndroid Build Coastguard Worker double normal_rand(double mean, double std_dev);
293*638691a0SAndroid Build Coastguard Worker unsigned char addnoise(int sym,double amp,double gain,double offset,int clip);
294*638691a0SAndroid Build Coastguard Worker
295*638691a0SAndroid Build Coastguard Worker extern int Bitcnt[];
296*638691a0SAndroid Build Coastguard Worker
297*638691a0SAndroid Build Coastguard Worker /* Dot product functions */
298*638691a0SAndroid Build Coastguard Worker void *initdp(signed short coeffs[],int len);
299*638691a0SAndroid Build Coastguard Worker void freedp(void *dp);
300*638691a0SAndroid Build Coastguard Worker long dotprod(void *dp,signed short a[]);
301*638691a0SAndroid Build Coastguard Worker
302*638691a0SAndroid Build Coastguard Worker void *initdp_port(signed short coeffs[],int len);
303*638691a0SAndroid Build Coastguard Worker void freedp_port(void *dp);
304*638691a0SAndroid Build Coastguard Worker long dotprod_port(void *dp,signed short a[]);
305*638691a0SAndroid Build Coastguard Worker
306*638691a0SAndroid Build Coastguard Worker #ifdef __i386__
307*638691a0SAndroid Build Coastguard Worker void *initdp_mmx(signed short coeffs[],int len);
308*638691a0SAndroid Build Coastguard Worker void freedp_mmx(void *dp);
309*638691a0SAndroid Build Coastguard Worker long dotprod_mmx(void *dp,signed short a[]);
310*638691a0SAndroid Build Coastguard Worker
311*638691a0SAndroid Build Coastguard Worker void *initdp_sse(signed short coeffs[],int len);
312*638691a0SAndroid Build Coastguard Worker void freedp_sse(void *dp);
313*638691a0SAndroid Build Coastguard Worker long dotprod_sse(void *dp,signed short a[]);
314*638691a0SAndroid Build Coastguard Worker
315*638691a0SAndroid Build Coastguard Worker void *initdp_sse2(signed short coeffs[],int len);
316*638691a0SAndroid Build Coastguard Worker void freedp_sse2(void *dp);
317*638691a0SAndroid Build Coastguard Worker long dotprod_sse2(void *dp,signed short a[]);
318*638691a0SAndroid Build Coastguard Worker #endif
319*638691a0SAndroid Build Coastguard Worker
320*638691a0SAndroid Build Coastguard Worker #ifdef __VEC__
321*638691a0SAndroid Build Coastguard Worker void *initdp_av(signed short coeffs[],int len);
322*638691a0SAndroid Build Coastguard Worker void freedp_av(void *dp);
323*638691a0SAndroid Build Coastguard Worker long dotprod_av(void *dp,signed short a[]);
324*638691a0SAndroid Build Coastguard Worker #endif
325*638691a0SAndroid Build Coastguard Worker
326*638691a0SAndroid Build Coastguard Worker /* Sum of squares - accepts signed shorts, produces unsigned long long */
327*638691a0SAndroid Build Coastguard Worker unsigned long long sumsq(signed short *in,int cnt);
328*638691a0SAndroid Build Coastguard Worker unsigned long long sumsq_port(signed short *in,int cnt);
329*638691a0SAndroid Build Coastguard Worker
330*638691a0SAndroid Build Coastguard Worker #ifdef __i386__
331*638691a0SAndroid Build Coastguard Worker unsigned long long sumsq_mmx(signed short *in,int cnt);
332*638691a0SAndroid Build Coastguard Worker unsigned long long sumsq_sse(signed short *in,int cnt);
333*638691a0SAndroid Build Coastguard Worker unsigned long long sumsq_sse2(signed short *in,int cnt);
334*638691a0SAndroid Build Coastguard Worker #endif
335*638691a0SAndroid Build Coastguard Worker #ifdef __VEC__
336*638691a0SAndroid Build Coastguard Worker unsigned long long sumsq_av(signed short *in,int cnt);
337*638691a0SAndroid Build Coastguard Worker #endif
338*638691a0SAndroid Build Coastguard Worker
339*638691a0SAndroid Build Coastguard Worker
340*638691a0SAndroid Build Coastguard Worker /* Low-level data structures and routines */
341*638691a0SAndroid Build Coastguard Worker
342*638691a0SAndroid Build Coastguard Worker int cpu_features(void);
343*638691a0SAndroid Build Coastguard Worker
344*638691a0SAndroid Build Coastguard Worker #endif /* _FEC_H_ */
345*638691a0SAndroid Build Coastguard Worker
346*638691a0SAndroid Build Coastguard Worker
347*638691a0SAndroid Build Coastguard Worker
348