From 93377588ad530e49710ce623b1c7bf438580bc7c Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Mon, 5 Jul 2021 11:26:04 -0400 Subject: [PATCH] TT#121752 fix RTCP RR SSRC substitution when transcoding Perform reverse SSRC mapping even if output media is not known, and use the appropriate media side when looking up SSRCs for received RTCP timestamps. closes #1298 Change-Id: Ifa5a982163bf7b0510ffc2a92ae25995d1adb888 --- daemon/rtcp.c | 5 ++++- daemon/ssrc.c | 11 ++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/daemon/rtcp.c b/daemon/rtcp.c index 78c5fdac7..d17369e1c 100644 --- a/daemon/rtcp.c +++ b/daemon/rtcp.c @@ -1307,7 +1307,7 @@ static void transcode_rr(struct rtcp_process_ctx *ctx, struct report_block *rr) return; if (ctx->scratch.rr.from != ctx->mp->ssrc_in->parent->h.ssrc) return; - if (!ctx->mp->media || !ctx->mp->media_out) + if (!ctx->mp->media) return; // reverse SSRC mapping @@ -1315,6 +1315,9 @@ static void transcode_rr(struct rtcp_process_ctx *ctx, struct report_block *rr) SSRC_DIR_OUTPUT, ctx->mp->media->monologue); rr->ssrc = htonl(map_ctx->ssrc_map_out); + if (!ctx->mp->media_out) + return; + // for reception stats struct ssrc_ctx *input_ctx = get_ssrc_ctx(map_ctx->ssrc_map_out, ctx->mp->media_out->monologue->ssrc_hash, diff --git a/daemon/ssrc.c b/daemon/ssrc.c index 32f3a2df2..fa0cd4f67 100644 --- a/daemon/ssrc.c +++ b/daemon/ssrc.c @@ -274,13 +274,22 @@ static long long __calc_rtt(struct call_monologue *ml, uint32_t ssrc, uint32_t n if (!ntp_middle_bits || !delay) return 0; - struct ssrc_entry_call *e = hunt_ssrc(ml, ssrc); + struct ssrc_entry_call *e = find_ssrc(ssrc, ml->ssrc_hash); if (G_UNLIKELY(!e)) return 0; if (pt_p) *pt_p = e->output_ctx.tracker.most[0] == 255 ? -1 : e->output_ctx.tracker.most[0]; + // grab the opposite side SSRC for the time reports + uint32_t map_ssrc = e->output_ctx.ssrc_map_out; + if (!map_ssrc) + map_ssrc = e->h.ssrc; + obj_put(&e->h); + e = hunt_ssrc(ml, map_ssrc); + if (G_UNLIKELY(!e)) + return 0; + struct ssrc_time_item *sti; GQueue *q = (((void *) e) + reports_queue_offset); mutex_lock(&e->h.lock);