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);