void AmRtpStream::recvPacket() { AmRtpPacket* p = mem.newPacket(); if (!p) { // drop received data AmRtpPacket dummy; dummy.recv(l_sd); return; } if(p->recv(l_sd) > 0){ int parse_res = p->parse(); gettimeofday(&p->recv_time,NULL); if (parse_res == -1) { DBG("error while parsing RTP packet.\n"); clearRTPTimeout(&p->recv_time); mem.freePacket(p); } else { bufferPacket(p); } } else { mem.freePacket(p); } }
void AmRtpReceiver::run() { unsigned int tmp_nfds = 0; struct pollfd* tmp_fds = new struct pollfd[MAX_RTP_SESSIONS]; while(true){ fds_mut.lock(); tmp_nfds = nfds; memcpy(tmp_fds,fds,nfds*sizeof(struct pollfd)); fds_mut.unlock(); int ret = poll(tmp_fds,tmp_nfds,RTP_POLL_TIMEOUT); if(ret < 0) ERROR("AmRtpReceiver: poll: %s\n",strerror(errno)); if(ret < 1) continue; for(unsigned int i=0; i<tmp_nfds; i++) { if(!(tmp_fds[i].revents & POLLIN)) continue; streams_mut.lock(); Streams::iterator it = streams.find(tmp_fds[i].fd); if(it != streams.end()) { AmRtpPacket* p = it->second->newPacket(); if (!p) { // drop received data AmRtpPacket dummy; dummy.recv(tmp_fds[i].fd); streams_mut.unlock(); continue; } if(p->recv(tmp_fds[i].fd) > 0){ int parse_res = p->parse(); gettimeofday(&p->recv_time,NULL); if (parse_res == -1) { DBG("error while parsing RTP packet.\n"); it->second->clearRTPTimeout(&p->recv_time); it->second->freePacket(p); } else { it->second->bufferPacket(p); } } else { it->second->freePacket(p); } } streams_mut.unlock(); } } }