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,0x
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;
}
联系客服