static struct rtp_packet * rtpp_socket_rtp_recv_simple(struct rtpp_socket *self, const struct rtpp_timestamp *dtime, struct sockaddr *laddr, int port) { struct rtpp_socket_priv *pvt; struct rtp_packet *packet; packet = rtp_packet_alloc(); if (packet == NULL) { return NULL; } pvt = PUB2PVT(self); packet->rlen = sizeof(packet->raddr); packet->size = recvfrom(pvt->fd, packet->data.buf, sizeof(packet->data.buf), 0, sstosa(&packet->raddr), &packet->rlen); if (packet->size == -1) { rtp_packet_free(packet); return (NULL); } packet->laddr = laddr; packet->lport = port; if (dtime != NULL) { packet->rtime.wall = dtime->wall; packet->rtime.mono = dtime->mono; } return (packet); }
struct rtpp_acct_rtcp * rtpp_acct_rtcp_ctor(const char *call_id, const struct rtp_packet *pp) { struct rtpp_acct_rtcp_priv *pvt; pvt = rtpp_rzmalloc(sizeof(struct rtpp_acct_rtcp_priv), PVT_RCOFFS(pvt)); if (pvt == NULL) { goto e0; } pvt->pub.pkt = rtp_packet_alloc(); if (pvt->pub.pkt == NULL) { goto e1; } rtp_packet_dup(pvt->pub.pkt, pp, 0); pvt->pub.call_id = strdup(call_id); if (pvt->pub.call_id == NULL) { goto e2; } pvt->pub.jt = &pvt->_jt; CALL_SMETHOD(pvt->pub.rcnt, attach, (rtpp_refcnt_dtor_t)&rtpp_acct_rtcp_dtor, pvt); return ((&pvt->pub)); e2: rtp_packet_free(pvt->pub.pkt); e1: CALL_SMETHOD(pvt->pub.rcnt, decref); free(pvt); e0: return (NULL); }
static struct rtp_packet * rtpp_socket_rtp_recv(struct rtpp_socket *self, const struct rtpp_timestamp *dtime, struct sockaddr *laddr, int port) { struct rtpp_socket_priv *pvt; struct rtp_packet *packet; struct timeval rtime; size_t llen; packet = rtp_packet_alloc(); if (packet == NULL) { return NULL; } pvt = PUB2PVT(self); packet->rlen = sizeof(packet->raddr); llen = sizeof(packet->_laddr); memset(&rtime, '\0', sizeof(rtime)); packet->size = recvfromto(pvt->fd, packet->data.buf, sizeof(packet->data.buf), sstosa(&packet->raddr), &packet->rlen, sstosa(&packet->_laddr), &llen, &rtime); if (packet->size == -1) { rtp_packet_free(packet); return (NULL); } if (llen > 0) { packet->laddr = sstosa(&packet->_laddr); packet->lport = getport(packet->laddr); } else { packet->laddr = laddr; packet->lport = port; } if (!timevaliszero(&rtime)) { packet->rtime.wall = timeval2dtime(&rtime); } else { packet->rtime.wall = dtime->wall; } RTPP_DBG_ASSERT(packet->rtime.wall > 0); packet->rtime.mono = dtime->mono; return (packet); }
struct rtp_packet * rtp_recv(int fd) { struct rtp_packet *pkt; pkt = rtp_packet_alloc(); if (pkt == NULL) return NULL; pkt->rlen = sizeof(pkt->raddr); pkt->size = recvfrom(fd, pkt->data.buf, sizeof(pkt->data.buf), 0, sstosa(&pkt->raddr), &pkt->rlen); if (pkt->size == -1) { rtp_packet_free(pkt); return NULL; } return pkt; }
struct rtp_packet * rtp_server_get(struct rtp_server *rp, double dtime, int *rval) { struct rtp_packet *pkt; uint32_t ts; int rlen, rticks, bytes_per_frame, ticks_per_frame, number_of_frames; int hlen; if (rp->btime == -1) rp->btime = dtime; ts = ntohl(rp->rtp->ts); if (rp->btime + ((double)ts / RTPS_SRATE) > dtime) { *rval = RTPS_LATER; return (NULL); } switch (rp->rtp->pt) { case RTP_PCMU: case RTP_PCMA: bytes_per_frame = 8; ticks_per_frame = 1; break; case RTP_G729: /* 10 ms per 8 kbps G.729 frame */ bytes_per_frame = 10; ticks_per_frame = 10; break; case RTP_G723: /* 30 ms per 6.3 kbps G.723 frame */ bytes_per_frame = 24; ticks_per_frame = 30; break; case RTP_GSM: /* 20 ms per 13 kbps GSM frame */ bytes_per_frame = 33; ticks_per_frame = 20; break; case RTP_G722: bytes_per_frame = 8; ticks_per_frame = 1; break; default: *rval = RTPS_ERROR; return (NULL); } number_of_frames = RTPS_TICKS_MIN / ticks_per_frame; if (RTPS_TICKS_MIN % ticks_per_frame != 0) number_of_frames++; rlen = bytes_per_frame * number_of_frames; rticks = ticks_per_frame * number_of_frames; pkt = rtp_packet_alloc(); if (pkt == NULL) { *rval = RTPS_ENOMEM; return (NULL); } hlen = RTP_HDR_LEN(rp->rtp); if (read(rp->fd, pkt->data.buf + hlen, rlen) != rlen) { if (rp->loop == 0 || lseek(rp->fd, 0, SEEK_SET) == -1 || read(rp->fd, pkt->data.buf + hlen, rlen) != rlen) { *rval = RTPS_EOF; rtp_packet_free(pkt); return (NULL); } if (rp->loop != -1) rp->loop -= 1; } if (rp->rtp->m != 0 && ntohs(rp->rtp->seq) != 0) { rp->rtp->m = 0; } rp->rtp->ts = htonl(ts + (RTPS_SRATE * rticks / 1000)); rp->rtp->seq = htons(ntohs(rp->rtp->seq) + 1); memcpy(&pkt->data.header, rp->rtp, hlen); pkt->size = hlen + rlen; return (pkt); }