Browse Source

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
pull/1278/head
Richard Fuchs 5 years ago
parent
commit
93377588ad
2 changed files with 14 additions and 2 deletions
  1. +4
    -1
      daemon/rtcp.c
  2. +10
    -1
      daemon/ssrc.c

+ 4
- 1
daemon/rtcp.c View File

@ -1307,7 +1307,7 @@ static void transcode_rr(struct rtcp_process_ctx *ctx, struct report_block *rr)
return; return;
if (ctx->scratch.rr.from != ctx->mp->ssrc_in->parent->h.ssrc) if (ctx->scratch.rr.from != ctx->mp->ssrc_in->parent->h.ssrc)
return; return;
if (!ctx->mp->media || !ctx->mp->media_out)
if (!ctx->mp->media)
return; return;
// reverse SSRC mapping // 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); SSRC_DIR_OUTPUT, ctx->mp->media->monologue);
rr->ssrc = htonl(map_ctx->ssrc_map_out); rr->ssrc = htonl(map_ctx->ssrc_map_out);
if (!ctx->mp->media_out)
return;
// for reception stats // for reception stats
struct ssrc_ctx *input_ctx = get_ssrc_ctx(map_ctx->ssrc_map_out, struct ssrc_ctx *input_ctx = get_ssrc_ctx(map_ctx->ssrc_map_out,
ctx->mp->media_out->monologue->ssrc_hash, ctx->mp->media_out->monologue->ssrc_hash,


+ 10
- 1
daemon/ssrc.c View File

@ -274,13 +274,22 @@ static long long __calc_rtt(struct call_monologue *ml, uint32_t ssrc, uint32_t n
if (!ntp_middle_bits || !delay) if (!ntp_middle_bits || !delay)
return 0; 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)) if (G_UNLIKELY(!e))
return 0; return 0;
if (pt_p) if (pt_p)
*pt_p = e->output_ctx.tracker.most[0] == 255 ? -1 : e->output_ctx.tracker.most[0]; *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; struct ssrc_time_item *sti;
GQueue *q = (((void *) e) + reports_queue_offset); GQueue *q = (((void *) e) + reports_queue_offset);
mutex_lock(&e->h.lock); mutex_lock(&e->h.lock);


Loading…
Cancel
Save