implemented new interface for fec.h fec.c in rs.h and rs.c

This commit is contained in:
wangyu- 2017-09-14 11:57:27 -05:00
parent acebde7de5
commit 761de18ba5
4 changed files with 78 additions and 5 deletions

View File

@ -879,7 +879,16 @@ fec_decode(void *code0, void *pkt0[], int index[], int sz)
return 0;
}
int get_n(void *code0)
{
struct fec_parms * code= (struct fec_parms *)code0;
return code->n;
}
int get_k(void *code0)
{
struct fec_parms * code= (struct fec_parms *)code0;
return code->k;
}
/*********** end of FEC code -- beginning of test code ************/
#if (TEST || DEBUG)

View File

@ -44,10 +44,13 @@
#define GF_SIZE ((1 << GF_BITS) - 1) /* powers of \alpha */
void fec_free(void *p) ;
void * fec_new(int k, int n) ;
void * fec_new(int k, int n) ;//n>=k
void init_fec() ;
void fec_encode(void *code, void *src[], void *dst, int index, int sz) ;
int fec_decode(void *code, void *pkt[], int index[], int sz) ;
int get_k(void *code);
int get_n(void *codev);
/* end of file */

View File

@ -4,5 +4,41 @@
* Created on: Sep 14, 2017
* Author: root
*/
#include "rs.h"
void rs_encode(void *code,void *data[],int size)
{
int k=get_k(code);
int n=get_n(code);
for(int i=k;i<n;i++)
{
fec_encode(code, data, data[i],i, size);
}
return ;
}
int rs_decode(void *code,void *data[],int size)
{
int k=get_k(code);
int n=get_n(code);
int index[n];
int count=0;
for(int i=0;i<n;i++)
{
if(data[i]!=0)
{
index[count++]=i;
}
}
if(count<k)
return -1;
for(int i=0;i<n;i++)
{
if(k<count)
data[i]=data[index[i]];
else
data[i]=0;
}
return fec_decode(code,data,index,size);
}

View File

@ -10,12 +10,37 @@
#include "fec.h"
// input:
// code, generated by fec_new() function from fec.h
// data[0....k-1 ], points to original data
// size, data length
//
// output:
// data[k....n-1], points to generated redundant data
//
// info:
// the function will always succeed,except malloc fail.if malloc fail,it will call exit()
void rs_encode(void *code,char *data[],int size);
// input:
// data[0.....n-1] points to original data and redundate data,in right order
// if data[i] is missing ,set poniter data[i] to 0 (point it to null)
//
// outout:
// data[0.....k-1] will point to the recovered original data.
//
// info:
// return zero on success
// if the number of no-zero pointers is less than k,the function will fail and return non-zero
//
// advanced info:
// 1. rs_decode wont malloc memory for those zero pointers in data[0.....k-1]. instead it will re-use the memory of other non-zero pointers (and let data[0.....k-1] point to those memory).
// 2. if the input data[0.....n-1] contains x non-zero pointers,after called rs_decode,there will still be exactly x non-zero poninters in data[0.....n-1],just the order may change.
int rs_decode(void *code,char *data[],int size);
int rs_encode(void *code,void *data[],int size);
int rs_recover_data(void *code,void *data[],int size);
int rs_recover_all(void *code,void *data[],int size);