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();      
    }
  }
}