|
|
|
|
@ -1407,6 +1407,62 @@ void rtcp_init(void) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Send generated RTCP to Homer in the same JSON format used for received RTCP.
|
|
|
|
|
static void rtcp_homer_generated(call_t *c, struct sender_report_packet *sr,
|
|
|
|
|
struct ssrc_sender_report *ssr, ssrc_rr_q *srrs, struct call_media *media,
|
|
|
|
|
uint32_t ssrc, const endpoint_t *src, const endpoint_t *dst)
|
|
|
|
|
{
|
|
|
|
|
struct rtcp_process_ctx ctx;
|
|
|
|
|
struct sdes_chunk chunk;
|
|
|
|
|
struct sdes_item item;
|
|
|
|
|
struct source_description_packet sdes;
|
|
|
|
|
|
|
|
|
|
if (!rtcp_handlers.homer->init)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
ZERO(ctx);
|
|
|
|
|
rtcp_handlers.homer->init(&ctx);
|
|
|
|
|
|
|
|
|
|
ctx.scratch_common_ssrc = ssrc;
|
|
|
|
|
ctx.scratch.sr = *ssr;
|
|
|
|
|
ctx.scratch.sr.ssrc = ssrc;
|
|
|
|
|
|
|
|
|
|
rtcp_handlers.homer->sr(&ctx, sr);
|
|
|
|
|
rtcp_handlers.homer->rr_list_start(&ctx, &sr->rtcp);
|
|
|
|
|
|
|
|
|
|
for (__auto_type l = srrs->head; l; l = l->next) {
|
|
|
|
|
struct ssrc_receiver_report *srr = l->data;
|
|
|
|
|
ctx.scratch.rr = *srr;
|
|
|
|
|
rtcp_handlers.homer->rr(&ctx, NULL);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
rtcp_handlers.homer->rr_list_end(&ctx);
|
|
|
|
|
|
|
|
|
|
ZERO(sdes);
|
|
|
|
|
sdes.header.count = 1;
|
|
|
|
|
rtcp_handlers.homer->sdes_list_start(&ctx, &sdes);
|
|
|
|
|
|
|
|
|
|
ZERO(chunk);
|
|
|
|
|
chunk.ssrc = htonl(ssrc);
|
|
|
|
|
|
|
|
|
|
ZERO(item);
|
|
|
|
|
item.type = SDES_TYPE_CNAME;
|
|
|
|
|
item.length = rtpe_instance_id.len;
|
|
|
|
|
rtcp_handlers.homer->sdes_item(&ctx, &chunk, &item, rtpe_instance_id.s);
|
|
|
|
|
|
|
|
|
|
if (media->bundle) {
|
|
|
|
|
ZERO(item);
|
|
|
|
|
item.type = SDES_TYPE_MID;
|
|
|
|
|
item.length = media->media_id.len;
|
|
|
|
|
rtcp_handlers.homer->sdes_item(&ctx, &chunk, &item, media->media_id.s);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
rtcp_handlers.homer->sdes_list_end(&ctx);
|
|
|
|
|
rtcp_handlers.homer->finish(&ctx, c, src, dst, rtpe_now);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static GString *rtcp_sender_report(struct ssrc_sender_report *ssr,
|
|
|
|
|
uint32_t ssrc, uint32_t ssrc_out, uint32_t ts, uint32_t packets, uint32_t octets, ssrc_q *rrs,
|
|
|
|
|
ssrc_rr_q *srrs, struct call_media *media)
|
|
|
|
|
@ -1608,6 +1664,11 @@ void rtcp_send_report(struct call_media *media, struct ssrc_entry_call *ssrc_out
|
|
|
|
|
atomic64_get(&ssrc_out->stats->bytes),
|
|
|
|
|
&rrs, &srrs, media);
|
|
|
|
|
|
|
|
|
|
// mirror generated RTCP to Homer (plaintext, before SRTCP) if configured
|
|
|
|
|
rtcp_homer_generated(media->call, (struct sender_report_packet *) sr->str,
|
|
|
|
|
&ssr, &srrs, media, ssrc_out->h.ssrc,
|
|
|
|
|
&ps->selected_sfd->socket.local, &ps->endpoint);
|
|
|
|
|
|
|
|
|
|
// handle crypto
|
|
|
|
|
|
|
|
|
|
str rtcp_packet = STR_GS(sr);
|
|
|
|
|
|