mirror of
https://github.com/wangyu-/UDPspeeder.git
synced 2025-01-31 12:19:35 +08:00
implemented new interface for fec.h fec.c in rs.h and rs.c
This commit is contained in:
parent
acebde7de5
commit
761de18ba5
11
lib/fec.c
11
lib/fec.c
@ -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)
|
||||
|
@ -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 */
|
||||
|
36
lib/rs.c
36
lib/rs.c
@ -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);
|
||||
}
|
||||
|
31
lib/rs.h
31
lib/rs.h
@ -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);
|
||||
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user