mirror of
				https://github.com/wangyu-/UDPspeeder.git
				synced 2025-11-03 19:35:38 +08:00 
			
		
		
		
	implemented new interface for fec.h fec.c in rs.h and rs.c
This commit is contained in:
		
							
								
								
									
										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);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user