int AmRtpStream::receive( unsigned char* buffer, unsigned int size, unsigned int& ts, int &out_payload) { AmRtpPacket* rp = NULL; int err = nextPacket(rp); if(err <= 0) return err; if (!rp) return 0; handleSymmetricRtp(rp); /* do we have a new talk spurt? */ begin_talk = ((last_payload == 13) || rp->marker); last_payload = rp->payload; if(!rp->getDataSize()) { mem.freePacket(rp); return RTP_EMPTY; } if (rp->payload == getLocalTelephoneEventPT()) { dtmf_payload_t* dpl = (dtmf_payload_t*)rp->getData(); DBG("DTMF: event=%i; e=%i; r=%i; volume=%i; duration=%i; ts=%u\n", dpl->event,dpl->e,dpl->r,dpl->volume,ntohs(dpl->duration),rp->timestamp); session->postDtmfEvent(new AmRtpDtmfEvent(dpl, getLocalTelephoneEventRate(), rp->timestamp)); mem.freePacket(rp); return RTP_DTMF; } assert(rp->getData()); if(rp->getDataSize() > size){ ERROR("received too big RTP packet\n"); mem.freePacket(rp); return RTP_BUFFER_SIZE; } memcpy(buffer,rp->getData(),rp->getDataSize()); ts = rp->timestamp; out_payload = rp->payload; int res = rp->getDataSize(); mem.freePacket(rp); return res; }
int AmRtpStream::receive( unsigned char* buffer, unsigned int size, unsigned int& ts, int &out_payload) { AmRtpPacket* rp = NULL; int err = nextPacket(rp); if(err <= 0) return err; if (!rp) return 0; #ifndef SUPPORT_IPV6 if(passive) { // #ifdef SUPPORT_IPV6 // struct sockaddr_storage recv_addr; // #else struct sockaddr_in recv_addr; rp->getAddr(&recv_addr); // symmetric RTP if ((recv_addr.sin_port != r_saddr.sin_port) || (recv_addr.sin_addr.s_addr != r_saddr.sin_addr.s_addr)) { string addr_str = get_addr_str(recv_addr.sin_addr); int port = ntohs(recv_addr.sin_port); setRAddr(addr_str,port); DBG("Symmetric RTP: setting new remote address: %s:%i\n", addr_str.c_str(),port); // avoid comparing each time sender address } else { DBG("Symmetric RTP: remote end sends RTP from advertised address. Leaving passive mode.\n"); } passive = false; } #endif /* do we have a new talk spurt? */ begin_talk = ((last_payload == 13) || rp->marker); last_payload = rp->payload; if(!rp->getDataSize()) { mem.freePacket(rp); return RTP_EMPTY; } if (telephone_event_pt.get() && rp->payload == telephone_event_pt->payload_type) { dtmf_payload_t* dpl = (dtmf_payload_t*)rp->getData(); DBG("DTMF: event=%i; e=%i; r=%i; volume=%i; duration=%i\n", dpl->event,dpl->e,dpl->r,dpl->volume,ntohs(dpl->duration)); session->postDtmfEvent(new AmRtpDtmfEvent(dpl, getTelephoneEventRate())); mem.freePacket(rp); return RTP_DTMF; } assert(rp->getData()); if(rp->getDataSize() > size){ ERROR("received too big RTP packet\n"); mem.freePacket(rp); return RTP_BUFFER_SIZE; } memcpy(buffer,rp->getData(),rp->getDataSize()); ts = rp->timestamp; out_payload = rp->payload; int res = rp->getDataSize(); mem.freePacket(rp); return res; }