int stream_send(struct stream *s, bool marker, int pt, uint32_t ts, struct mbuf *mb) { int err = 0; if (!s) return EINVAL; if (!sa_isset(sdp_media_raddr(s->sdp), SA_ALL)) return 0; if (sdp_media_dir(s->sdp) != SDP_SENDRECV) return 0; metric_add_packet(&s->metric_tx, mbuf_get_left(mb)); if (pt < 0) pt = s->pt_enc; if (pt >= 0) { err = rtp_send(s->rtp, sdp_media_raddr(s->sdp), marker, pt, ts, mb); if (err) s->metric_tx.n_err++; } rtpkeep_refresh(s->rtpkeep, ts); return err; }
int stream_send(struct stream *s, bool marker, int pt, uint32_t ts, struct mbuf *mb) { int err = 0; if (!s) return EINVAL; if (!sa_isset(sdp_media_raddr(s->sdp), SA_ALL)) return 0; if (sdp_media_dir(s->sdp) != SDP_SENDRECV) return 0; s->stats.b_tx += mbuf_get_left(mb); if (pt < 0) pt = s->pt_enc; if (pt >= 0) { err = rtp_send(s->rtp, sdp_media_raddr(s->sdp), marker, pt, ts, mb); } rtpkeep_refresh(s->rtpkeep, ts); ++s->stats.n_tx; return err; }
/* TODO: should we check RTP per stream, or should we have the * check in struct call instead? */ static void check_rtp_handler(void *arg) { struct stream *strm = arg; const uint64_t now = tmr_jiffies(); int diff_ms; tmr_start(&strm->tmr_rtp, RTP_CHECK_INTERVAL, check_rtp_handler, strm); /* If no RTP was received at all, check later */ if (!strm->ts_last) return; /* We are in sendrecv mode, check when the last RTP packet * was received. */ if (sdp_media_dir(strm->sdp) == SDP_SENDRECV) { diff_ms = (int)(now - strm->ts_last); debug("stream: last \"%s\" RTP packet: %d milliseconds\n", sdp_media_name(strm->sdp), diff_ms); if (diff_ms > (int)strm->rtp_timeout_ms) { info("stream: no %s RTP packets received for" " %d milliseconds\n", sdp_media_name(strm->sdp), diff_ms); stream_close(strm, ETIMEDOUT); } } else { re_printf("check_rtp: not checking (dir=%s)\n", sdp_dir_name(sdp_media_dir(strm->sdp))); } }
int stream_debug(struct re_printf *pf, const struct stream *s) { struct sa rrtcp; int err; if (!s) return 0; err = re_hprintf(pf, " %s dir=%s pt_enc=%d\n", sdp_media_name(s->sdp), sdp_dir_name(sdp_media_dir(s->sdp)), s->pt_enc); sdp_media_raddr_rtcp(s->sdp, &rrtcp); err |= re_hprintf(pf, " remote: %J/%J\n", sdp_media_raddr(s->sdp), &rrtcp); err |= rtp_debug(pf, s->rtp); err |= jbuf_debug(pf, s->jbuf); return err; }