/* * Reference: * * https://www.avm.de/de/Extern/files/x-rtp/xrtpv32.pdf */ int audio_print_rtpstat(struct re_printf *pf, const struct audio *a) { const struct stream *s; const struct rtcp_stats *rtcp; int srate_tx = 8000; int srate_rx = 8000; int err; if (!a) return 1; s = a->strm; rtcp = &s->rtcp_stats; if (!rtcp->tx.sent) return 1; if (a->tx.ac) srate_tx = get_srate(a->tx.ac); if (a->rx.ac) srate_rx = get_srate(a->rx.ac); err = re_hprintf(pf, "EX=BareSip;" /* Reporter Identifier */ "CS=%d;" /* Call Setup in milliseconds */ "CD=%d;" /* Call Duration in seconds */ "PR=%u;PS=%u;" /* Packets RX, TX */ "PL=%d,%d;" /* Packets Lost RX, TX */ "PD=%d,%d;" /* Packets Discarded, RX, TX */ "JI=%.1f,%.1f;" /* Jitter RX, TX in timestamp units */ "IP=%J,%J" /* Local, Remote IPs */ , call_setup_duration(s->call) * 1000, call_duration(s->call), s->metric_rx.n_packets, s->metric_tx.n_packets, rtcp->rx.lost, rtcp->tx.lost, s->metric_rx.n_err, s->metric_tx.n_err, /* timestamp units (ie: 8 ts units = 1 ms @ 8KHZ) */ 1.0 * rtcp->rx.jit/1000 * (srate_rx/1000), 1.0 * rtcp->tx.jit/1000 * (srate_tx/1000), sdp_media_laddr(s->sdp), sdp_media_raddr(s->sdp) ); if (a->tx.ac) { err |= re_hprintf(pf, ";EN=%s/%d", a->tx.ac->name, srate_tx ); } if (a->rx.ac) { err |= re_hprintf(pf, ";DE=%s/%d", a->rx.ac->name, srate_rx ); } return err; }
static int print_duration(struct re_printf *pf, const struct call *call) { const uint32_t dur = call_duration(call); const uint32_t sec = dur%60%60; const uint32_t min = dur/60%60; const uint32_t hrs = dur/60/60; return re_hprintf(pf, "%u:%02u:%02u", hrs, min, sec); }
static void print_summary(const struct call *call) { uint32_t dur = call_duration(call); if (!dur) return; info("%s: Call with %s terminated (duration: %H)\n", call->local_uri, call->peer_uri, fmt_human_time, &dur); }