X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=fec.c;h=932e0693e3786fc28b5a180428a9b296534a1fd5;hp=dc6e75209473c3eb14c9d52324707f5329d398d0;hb=HEAD;hpb=d5738d17b54186db8c9c7f119a03b58382ae9be4 diff --git a/fec.c b/fec.c index dc6e7520..932e0693 100644 --- a/fec.c +++ b/fec.c @@ -74,7 +74,7 @@ static unsigned char gf_mul_table[GF_SIZE + 1][GF_SIZE + 1]; #define gf_mul(x,y) gf_mul_table[x][y] /* Compute x % GF_SIZE without a slow divide. */ -static inline unsigned char modnn(int x) +__a_const static inline unsigned char modnn(int x) { while (x >= GF_SIZE) { x -= GF_SIZE; @@ -97,7 +97,7 @@ static void init_mul_table(void) static unsigned char *alloc_matrix(int rows, int cols) { - return para_malloc(rows * cols); + return arr_alloc(rows, cols); } /* @@ -179,14 +179,18 @@ static void generate_gf(void) * This is used often, so better optimize it! Currently the loop is unrolled 16 * times. The case c=0 is also optimized, whereas c=1 is not. */ -static void addmul(unsigned char *dst1, const unsigned char const *src1, +static void addmul(unsigned char *dst1, const unsigned char *src1, unsigned char c, int sz) { + unsigned char *dst, *lim, *col; + const unsigned char *src = src1; + if (c == 0) return; - unsigned char *dst = dst1, *lim = &dst[sz - UNROLL + 1], - *col = gf_mul_table[c]; - const unsigned char const *src = src1; + + dst = dst1; + lim = &dst[sz - UNROLL + 1]; + col = gf_mul_table[c]; for (; dst < lim; dst += UNROLL, src += UNROLL) { dst[0] ^= col[src[0]]; @@ -241,9 +245,9 @@ static void matmul(unsigned char *a, unsigned char *b, unsigned char *c, static int invert_mat(unsigned char *src, int k) { int irow, icol, row, col, ix, error; - int *indxc = para_malloc(k * sizeof(int)); - int *indxr = para_malloc(k * sizeof(int)); - int *ipiv = para_malloc(k * sizeof(int)); /* elements used as pivots */ + int *indxc = arr_alloc(k, sizeof(int)); + int *indxr = arr_alloc(k, sizeof(int)); + int *ipiv = arr_alloc(k, sizeof(int)); /* elements used as pivots */ unsigned char c, *p, *id_row = alloc_matrix(1, k), *temp_row = alloc_matrix(1, k); @@ -367,9 +371,9 @@ static void invert_vdm(unsigned char *src, int k) * c holds the coefficient of P(x) = Prod (x - p_i), i=0..k-1 * b holds the coefficient for the matrix inversion */ - c = para_malloc(k); - b = para_malloc(k); - p = para_malloc(k); + c = alloc(k); + b = alloc(k); + p = alloc(k); for (j = 1, i = 0; i < k; i++, j += k) { c[i] = 0; @@ -462,7 +466,7 @@ int fec_new(int k, int n, struct fec_parms **result) if (k < 1 || k > GF_SIZE + 1 || n > GF_SIZE + 1 || k > n) return -E_FEC_PARMS; - parms = para_malloc(sizeof(struct fec_parms)); + parms = alloc(sizeof(struct fec_parms)); parms->k = k; parms->n = n; parms->enc_matrix = alloc_matrix(n, k); @@ -603,10 +607,10 @@ int fec_decode(struct fec_parms *parms, unsigned char **data, int *idx, if (ret < 0) return ret; /* do the actual decoding */ - slice = para_malloc(k * sizeof(unsigned char *)); + slice = arr_alloc(k, sizeof(unsigned char *)); for (row = 0; row < k; row++) { if (idx[row] >= k) { - slice[row] = para_calloc(sz); + slice[row] = zalloc(sz); for (col = 0; col < k; col++) addmul(slice[row], data[col], m_dec[row * k + col], sz);