![]() 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; } |
|
来自: 春华_秋实 > 《嵌入式Linux》