// Version 0.01
/*
* This is FEC-based streaming test system. It is (C) Copyright 2007
* by Xingjun Zhang. You may modify and use this program as long as
* you send modifications to Dr.Zhang.
*
* This is the server part
* (1) get footage data;
* (2) RS-encoding ...
* (3) send the data to client...
*/
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <signal.h>
#include <errno.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <memory.h>
#include <time.h>
#include <assert.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/un.h>
#include "rs.h"
#include "packet.h"
#define PKT_LETH 168
#define NUM_RS_K 5
#define SET_S 840
#define NUM_RS_SYMBOL 448
#define LETH_SYMBOL 3
#define MASK0 7
#define MASK1L2 3
#define MASK1U1 128
#define MASK2L1 1
#define MASK2U2 192
#define MASK3 224
#define MASK3_SHIFT_R 5
#define MASK4 112
#define MASK4_SHIFT_R 4
#define MASK5 56
#define MASK5_SHIFT_R 3
#define MASK6 28
#define MASK6_SHIFT_R 2
#define MASK7 14
#define MASK7_SHIFT_R 1
#define MASK_R_0_3L2 3
#define MASK_R_0_3L2_SHIFT 6
#define MASK_7 7
#define MASK_R_0_QT2_SHIFT 3
#define MASK_R_1_3L1 1
#define MASK_R_1_3L1_SHIFT 7
#define MASK_R_1_QT2_SHIFT 4
#define MASK_R_1_QT1_SHIFT 1
#define MASK_R_1_QT 4
#define MASK_R_1_QT_SHIFT 2
#define MASK_R_2_QT2_SHIFT 5
#define MASK_R_2_QT1_SHIFT 2
#define MASK_R_2_QTU2 6
#define MASK_R_2_QTU2_SHIFT 1
int main(int argc,char **argv)
{
//test
//int tmpt = 0;
// original footage file & received footage file
FILE *footage_in,*footage_out;
// a set of rs-coding information packets
u_char packet1[PKT_LETH],packet2[PKT_LETH],packet3[PKT_LETH],packet4[PKT_LETH],packet5[PKT_LETH];
int set_num; //the set number of RS information in footage
int reminder; //after main loop, process the reminder data
int qt, rm; //quotient and reminder for bytes to bits
int qt_r, rm_r; //quotient and reminder for bits to bytes
int l; //main loop times
long int f_size; //footage size
int i,j; //NUM_RS_SYMBOL
struct timespec t,r;
int ret;
struct PKT *pPkt;
struct PKT vdp;
int pktLen;
int server;
unsigned short int port;
struct sockaddr_in local;
struct sockaddr_in client;
long int sent_p = 0;
// Generated parity data
u_char parity1[NUM_RS_SYMBOL],parity2[NUM_RS_SYMBOL],parity_pkt1[PKT_LETH],parity_pkt2[PKT_LETH];
if((footage_in=fopen("paris.ts","rb")) == NULL)
{
printf("Cannot open paris.ts!");
exit(0);
}
if((footage_out = fopen( "paris_out.ts", "wb" )) == NULL)
{
printf("Cannot open paris_out.ts!");
exit(0);
}
//Denerate Galois Field & Generator Poly
generate_gf();
gen_poly();
//Create socket
server = socket (AF_INET, SOCK_DGRAM, 0);
if (server < 0)
{
printf("fuck... Ha Ha \n");
perror ("socket");
exit (EXIT_FAILURE);
}
port = SERVER_PORT;
local.sin_family = AF_INET;
local.sin_port = htons (port);
local.sin_addr.s_addr = htonl (INADDR_ANY);
if (bind (server, (struct sockaddr *) &local, sizeof (local)) < 0)
{
perror ("bind");
exit (EXIT_FAILURE);
}
//get file size
fseek(footage_in, 0L, SEEK_END );
f_size = ftell(footage_in);
printf("footage size = %d\n",f_size);
fseek(footage_in, 0L, SEEK_SET );
//calculate the number of RS-coding set
set_num = f_size / SET_S;
reminder = f_size % SET_S;
//Precessing set by set
for(l=0; l<set_num; l++)
{
sent_p = sent_p + 7;
fread(packet1, sizeof(char), PKT_LETH, footage_in);
fread(packet2, sizeof(char), PKT_LETH, footage_in);
fread(packet3, sizeof(char), PKT_LETH, footage_in);
fread(packet4, sizeof(char), PKT_LETH, footage_in);
fread(packet5, sizeof(char), PKT_LETH, footage_in);
/*
//test
//if((tmpt == 230)||(tmpt == 460)||(tmpt == 900))
if(tmpt < 10)
{
int ui = 0;
int t5;
if(tmpt == 0)
t5 = 5;
if(tmpt == 1)
t5 = 6;
if(tmpt == 2)
t5 = 7;
if(tmpt == 3)
t5 = 8;
if(tmpt == 4)
t5 = 9;
if(tmpt == 5)
t5 = 10;
if(tmpt == 6)
t5 = 11;
if(tmpt == 7)
t5 = 12;
if(tmpt == 8)
t5 = 13;
if(tmpt == 9)
t5 = 14;
for(ui=0;ui<PKT_LETH;ui++)
packet1[ui] = 1;
for(ui=0;ui<PKT_LETH;ui++)
packet2[ui] = 2;
for(ui=0;ui<PKT_LETH;ui++)
packet3[ui] = 3;
for(ui=0;ui<PKT_LETH;ui++)
packet4[ui] = 4;
for(ui=0;ui<PKT_LETH;ui++)
packet5[ui] = t5;
}
*/
//Generating two parity packets
for(i=0;i<NUM_RS_SYMBOL;i++)
{
//preparing data[NUM_RS_K]
qt = ((i+1) * LETH_SYMBOL) / 8;
rm = ((i+1) * LETH_SYMBOL) % 8;
switch(rm)
{
case 0 :
data[0] = packet1[qt-1] & MASK0;
data[1] = packet2[qt-1] & MASK0;
data[2] = packet3[qt-1] & MASK0;
data[3] = packet4[qt-1] & MASK0;
data[4] = packet5[qt-1] & MASK0;
//RS coding generating two parity values
encode_rs();
parity1[i] = bb[0];
parity2[i] = bb[1];
/*
if((tmpt == 230)||(tmpt == 460)||(tmpt == 900))
{
printf("rm0 mask0 %d \n",MASK0);
printf("parity1[%d]: bb[0]: %d\n",i,bb[0]);
printf("parity2[%d]: bb[1]: %d\n",i,bb[1]);
printf("packet1[%d]: %d data0: %d\n",qt-1,packet1[qt-1],data[0]);
printf("packet2[%d]: %d data1: %d\n",qt-1,packet1[qt-1],data[1]);
printf("packet3[%d]: %d data2: %d\n",qt-1,packet1[qt-1],data[2]);
printf("packet4[%d]: %d data3: %d\n",qt-1,packet1[qt-1],data[3]);
printf("packet5[%d]: %d data4: %d\n",qt-1,packet1[qt-1],data[4]);
}
*/ break;
case 1:
data[0] = ((packet1[qt-1] & MASK1L2) << 1)+((packet1[qt] & MASK1U1) >> 7);
data[1] = ((packet2[qt-1] & MASK1L2) << 1)+((packet2[qt] & MASK1U1) >> 7);
data[2] = ((packet3[qt-1] & MASK1L2) << 1)+((packet3[qt] & MASK1U1) >> 7);
data[3] = ((packet4[qt-1] & MASK1L2) << 1)+((packet4[qt] & MASK1U1) >> 7);
data[4] = ((packet5[qt-1] & MASK1L2) << 1)+((packet5[qt] & MASK1U1) >> 7);
//RS coding generating two parity values
encode_rs();
parity1[i] = bb[0];
parity2[i] = bb[1];
/*
if((tmpt == 230)||(tmpt == 460)||(tmpt == 900))
{
printf("rm1 mask1L2:%d mask1u1:%d \n",MASK1L2,MASK1U1);
printf("parity1[%d]: bb[0]: %d\n",i,bb[0]);
printf("parity2[%d]: bb[1]: %d\n",i,bb[1]);
printf("packet1[%d]: %d packet1[%d]: %d data0: %d\n",qt-1,packet1[qt-1],qt,packet1[qt],data[0]);
printf("packet2[%d]: %d packet2[%d]: %d data1: %d\n",qt-1,packet2[qt-1],qt,packet2[qt],data[1]);
printf("packet3[%d]: %d packet3[%d]: %d data2: %d\n",qt-1,packet3[qt-1],qt,packet3[qt],data[2]);
printf("packet4[%d]: %d packet4[%d]: %d data3: %d\n",qt-1,packet4[qt-1],qt,packet4[qt],data[3]);
printf("packet5[%d]: %d packet5[%d]: %d data4: %d\n",qt-1,packet5[qt-1],qt,packet5[qt],data[4]);
}
*/ break;
case 2:
data[0] = ((packet1[qt-1] & MASK2L1) << 2)+((packet1[qt] & MASK2U2) >> 6);
data[1] = ((packet2[qt-1] & MASK2L1) << 2)+((packet2[qt] & MASK2U2) >> 6);
data[2] = ((packet3[qt-1] & MASK2L1) << 2)+((packet3[qt] & MASK2U2) >> 6);
data[3] = ((packet4[qt-1] & MASK2L1) << 2)+((packet4[qt] & MASK2U2) >> 6);
data[4] = ((packet5[qt-1] & MASK2L1) << 2)+((packet5[qt] & MASK2U2) >> 6);
//RS coding generating two parity values
encode_rs();
parity1[i] = bb[0];
parity2[i] = bb[1];
/*
if((tmpt == 230)||(tmpt == 460)||(tmpt == 900))
{
printf("rm2 MASK2L1:%d MASK2U2:%d \n",MASK2L1,MASK2U2);
printf("parity1[%d]: bb[0]: %d\n",i,bb[0]);
printf("parity2[%d]: bb[1]: %d\n",i,bb[1]);
printf("packet1[%d]: %d packet1[%d]: %d data0: %d\n",qt-1,packet1[qt-1],qt,packet1[qt],data[0]);
printf("packet2[%d]: %d packet2[%d]: %d data1: %d\n",qt-1,packet2[qt-1],qt,packet2[qt],data[1])
没有合适的资源?快使用搜索试试~ 我知道了~
基于RS编码的视频源代码
共7个文件
ts:3个
h:2个
c:1个
2星 需积分: 9 17 下载量 142 浏览量
2010-10-19
20:16:13
上传
评论 1
收藏 8.47MB RAR 举报
温馨提示
基于FEC的rs视频编码方法,用于测试RS视频编码的效率。此程序完成了基于RS的视频编码方法,完成了各项功能检测,并突出了采用RS编码后的效果。
资源推荐
资源详情
资源评论
收起资源包目录
linux+sender+ok.rar (7个子文件)
rs.h 15KB
paris_out.ts 0B
sender 15KB
paris.ts 4.74MB
packet.h 774B
paris-mpeg4.ts 4.54MB
sender.c 20KB
共 7 条
- 1
资源评论
- pandagto2014-05-07用处不大不值10分
jingcuiping
- 粉丝: 1
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功