分享

第二章点对点视频网络传输实验

 春华_秋实 2012-05-04

 

 

 

void *writerThrFxn(void *arg)

{

WriterBufferElement wFlush = { WRITER_FLUSH };

WriterEnv *envp = (WriterEnv *) arg;

void *status = THREAD_SUCCESS;

FILE *outputFp = NULL;

WriterBufferElement we;

char sip[32];

char lip[32];

int pklen=0;

int i=0;

int r=0;

int j=0;

int opt=1;

//////// 建主UDP UDP UDP UDP socket socket socket socket 套接字

sockfd = socket(AF_INET, SOCK_DGRAM, 0);//SOCK_DGRAM SOCK_STREAM

nport=getlocalhostip(sockfd,lip);

printf("local port= %d \n",nport);

/* init servaddr */

bzero(&servaddr, sizeof(servaddr));

servaddr.sin_family = AF_INET;

servaddr.sin_port = htons(OFFSETPORT+nport); //nport //nport //nport //nport -t-t-t-t 输入的参数

//servaddr.sin_addr.s_addr = htonl(INADDR_BROADCAST);

sprintf(sip,"%s%d",lip,bport);

printf("send to %s:%d\n",sip,OFFSETPORT+nport);

if(inet_pton(AF_INET, sip, &servaddr.sin_addr) <= 0)

{

printf("########### not a valid IPaddress\n");

return status;

}

//UDP //UDP //UDP //UDP 广播发送

if(nport==255)

{

r = fcntl(sockfd, F_GETFL, 0);

fcntl(sockfd, F_SETFL, r & ~O_NONBLOCK);

r = setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,(char*)&opt,siz

}

DBG("Video file successfully opened\n");

/* Signal that initialization is done and wait for other threads */

Rendezvous_meet(envp->hRendezvousInit);

DBG("Entering writer main loop.\n");

while (!gblGetQuit()) {

/* Get an encoded buffer from the video thread */

if (FifoUtil_get(&envp->inFifo, &we) == FIFOUTIL_FAILURE) {

breakLoop(THREAD_FAILURE);

}

/* Is the video thread flushing the pipe? */

if (we.id == WRITER_FLUSH) {

breakLoop(THREAD_SUCCESS);

}

/* Store the encoded frame to disk */

if (we.id != WRITER_PRIME && we.frameSize) {

pklen= we.frameSize;

pbuf=we.encodedBuffer;

//////// 发送视频数据

sendto(sockfd,(unsigned char*)pbuf,pklen,0,&servaddr, sizeof(servaddr));

sendto(sockfd,(unsigned char*)pbuf,pklen,0,&servaddr, sizeof(servaddr));

//////// 为了防止丢包,这里连发两次视频数据

printf("%d \n",pklen);

}

else {

we.id = WRITER_NORMAL;

}

/* Send back the buffer to the video thread */

if (FifoUtil_put(&envp->outFifo, &we) == FIFOUTIL_FAILURE) {

ERR("Failed to put buffer in output fifo\n");

breakLoop(THREAD_FAILURE);

}

}

cleanup:

/* Make sure the other threads aren't waiting for init to complete */

Rendezvous_force(envp->hRendezvousInit);

/* Make sure the other threads aren't stuck pausing */

Pause_off(envp->hPause);

/* Make sure the video thread isn't stuck in FifoUtil_get() */

FifoUtil_put(&envp->outFifo, &wFlush);

/* Meet up with other threads before cleaning up */

Rendezvous_meet(envp->hRendezvousCleanup);

if (sockfd) {

shutdown(sockfd,2);

}

return status;

 

接收端loader.c

static unsigned char

mpeg4header[]={0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x20,0x00,0x84,0x40,0x06,0x68,0xB4,0

x22,0x40,0xA2,0x1F,0x00,0x00,0x01,0xB6,0x10}; /* /* /* /* 这个就TI TI TI TI MPEG-4 MPEG-4 MPEG-4 MPEG-4 数据头,即VOL*/ VOL*/ VOL*/ VOL*/

int loaderPrime(LoaderState *statep, char **framePtr) /* /* /* /* 读关键帧函数*/ */ */ */

{

int numBytes=0;

int len=0;

int r=0;

unsigned char* pbuf;

sockdecfd = socket(AF_INET, SOCK_DGRAM, 0); /* /* /* /* 打开接收的udp udp udp udp socket socket socket socket */ */ */ */

r = fcntl(sockdecfd, F_GETFL, 0);

fcntl(sockdecfd, F_SETFL, r & ~O_NONBLOCK);

bport+=OFFSETPORT;

/* init servaddr */

bzero(&servaddr, sizeof(servaddr));

servaddr.sin_family = AF_INET;

servaddr.sin_addr.s_addr =htonl(INADDR_ANY);

servaddr.sin_port = htons(bport);

printf("local bind port = %d\n",sockdecfd,bport);

/* bind address and port to socket */

if(bind(sockdecfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1)

{

printf("bind error\n");

return 0;

}

slen=sizeof(servaddr);

/* Read a full 'window' of encoded data */

pbuf=(unsigned char*)statep->readBuffer;

numBytes=24;

memcpy(pbuf,mpeg4header,24);

/* Initialize the state */

statep->curPtr = statep->readBuffer;

statep->readPtr = statep->readBuffer + numBytes;

*framePtr = statep->curPtr;

statep->firstFrame = TRUE;

statep->endClip = FALSE;

return SUCCESS;

}

/* /* /* /* 读普通帧函数*/ */ */ */

int loaderGetFrame(LoaderState *statep, int frameSize, char **framePtr)

{

int numBytes=0;

statep->firstFrame = FALSE;

static int flag=0;

unsigned char* pbuf =NULL;

flag=(!flag);

pbuf=(unsigned char*)statep->readPtr+statep->readSize*flag;

/* /* /* /* 从指定的端口中读出数据流* * * *

numBytes=recvfrom(sockdecfd, pbuf, MAXBUF, 0, (struct sockaddr *)&servaddr,

&slen);

if(numBytes==savenum) //////// 重复包判断

numBytes=recvfrom(sockfd, pbuf, MAXBUF, 0, (struct sockaddr *)&servaddr,

&slen);

savenum=numBytes;

printf("recv %d\n",numBytes);

usleep(1);

if(numBytes<=0) return FAILURE;

statep->curPtr = pbuf;

*framePtr = statep->curPtr;

return SUCCESS;

}

//////// 初始化语音UDP UDP UDP UDP 套接字并读取语音数据

int loaderPrimeSpeech(LoaderState *statep, char **framePtr)

{

int numBytes=0;

int len=0;

int r=0;

unsigned char* pbuf;

sockfd1 = socket(AF_INET, SOCK_DGRAM, 0); /* create a socket */

r = fcntl(sockfd1, F_GETFL, 0);

fcntl(sockfd1, F_SETFL, r & ~O_NONBLOCK);

/* init servaddr */

bzero(&servaddr1, sizeof(servaddr1));

servaddr1.sin_family = AF_INET;

servaddr1.sin_addr.s_addr =htonl(INADDR_ANY);

servaddr1.sin_port = htons(OFFSETPORT+bport+500) ;// ;// ;// ;// 设置要读的端口号

/* bind address and port to socket */

if(bind(sockfd1, (struct sockaddr *)&servaddr1, sizeof(servaddr1)) == -1)

{

printf("speech bind error\n");

gblSetQuit();

return 0;

}

slen=sizeof(servaddr1);

/* Read a full 'window' of encoded data */

//numBytes = read(statep->inputFd, statep->readBuffer, statep->readSize);

pbuf=(unsigned char*)statep->readBuffer;

//////// 从指定的端口读语音数据

numBytes= recvfrom(sockfd1, (unsigned char*)statep->readBuffer, MAXBUF, 0, (struct

sockaddr *)&servaddr1, &slen);

/* Initialize the state */

statep->curPtr = statep->readBuffer;

statep->readPtr = statep->readBuffer + numBytes;

*framePtr = statep->curPtr;

statep->firstFrame = TRUE;

statep->endClip = FALSE;

}

int loaderGetSpeech(LoaderState *statep, int frameSize, char **framePtr)

{

int numBytes=0;

statep->firstFrame = FALSE;

static int flag=0;

unsigned char* pbuf =NULL;

flag=(!flag);

pbuf=(unsigned char*)statep->readPtr+statep->readSize*flag

/ / / / 从指定的端口读语音数据;

numBytes=recvfrom(sockfd1, pbuf, MAXBUF, 0, (struct sockaddr *)&servaddr,

&slen);

if(numBytes<=0) return FAILURE;

statep->curPtr = pbuf;

*framePtr = statep->curPtr;

return SUCCESS;

}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多