static void rtcp_handler(const struct sa *src, struct rtcp_msg *msg, void *arg) { struct stream *s = arg; (void)src; if (s->rtcph) s->rtcph(msg, s->arg); switch (msg->hdr.pt) { case RTCP_SR: (void)rtcp_stats(s->rtp, msg->r.sr.ssrc, &s->rtcp_stats); if (s->cfg.rtp_stats) call_set_xrtpstat(s->call); break; } }
int call_hangup(struct call *call, uint16_t scode, const char *reason) { int err = 0; if (!call) return EINVAL; if (call->config_avt.rtp_stats) call_set_xrtpstat(call); switch (call->state) { case STATE_INCOMING: if (scode < 400) { scode = 486; reason = "Rejected"; } info("call: rejecting incoming call from %s (%u %s)\n", call->peer_uri, scode, reason); (void)sipsess_reject(call->sess, scode, reason, NULL); break; default: info("call: terminate call '%s' with %s\n", sip_dialog_callid(sipsess_dialog(call->sess)), call->peer_uri); call->sess = mem_deref(call->sess); break; } set_state(call, STATE_TERMINATED); call_stream_stop(call); return err; }