void stream_reset(struct stream *s) { if (!s) return; jbuf_flush(s->jbuf); }
void stream_reset(struct stream *s) { if (!s) return; jbuf_flush(s->jbuf); stream_start_keepalive(s); }
static void jbuf_destructor(void *data) { struct jbuf *jb = data; jbuf_flush(jb); /* Free all frames in the pool list */ list_flush(&jb->pooll); }
static void rtp_recv(const struct sa *src, const struct rtp_header *hdr, struct mbuf *mb, void *arg) { struct stream *s = arg; bool flush = false; int err; s->ts_last = tmr_jiffies(); if (!mbuf_get_left(mb)) return; if (!(sdp_media_ldir(s->sdp) & SDP_RECVONLY)) return; metric_add_packet(&s->metric_rx, mbuf_get_left(mb)); if (hdr->ssrc != s->ssrc_rx) { if (s->ssrc_rx) { flush = true; info("stream: %s: SSRC changed %x -> %x" " (%u bytes from %J)\n", sdp_media_name(s->sdp), s->ssrc_rx, hdr->ssrc, mbuf_get_left(mb), src); } s->ssrc_rx = hdr->ssrc; } if (s->jbuf) { struct rtp_header hdr2; void *mb2 = NULL; /* Put frame in Jitter Buffer */ if (flush) jbuf_flush(s->jbuf); err = jbuf_put(s->jbuf, hdr, mb); if (err) { info("%s: dropping %u bytes from %J (%m)\n", sdp_media_name(s->sdp), mb->end, src, err); s->metric_rx.n_err++; } if (jbuf_get(s->jbuf, &hdr2, &mb2)) { if (!s->jbuf_started) return; memset(&hdr2, 0, sizeof(hdr2)); } s->jbuf_started = true; if (lostcalc(s, hdr2.seq) > 0) s->rtph(hdr, NULL, s->arg); s->rtph(&hdr2, mb2, s->arg); mem_deref(mb2); } else { if (lostcalc(s, hdr->seq) > 0) s->rtph(hdr, NULL, s->arg); s->rtph(hdr, mb, s->arg); } }