diff --git a/daemon/call.c b/daemon/call.c index 8189d80ce..c52c7c8f2 100644 --- a/daemon/call.c +++ b/daemon/call.c @@ -669,6 +669,7 @@ struct call_media *call_media_new(call_t *call) { mutex_init(&med->dtmf_lock); med->sdp_attr_print = sdp_insert_media_attributes; RESET_BANDWIDTH(med->sdp_media_bandwidth, -1); + med->ssrc_hash = create_ssrc_hash_call(); return med; } @@ -4180,57 +4181,57 @@ void call_destroy(call_t *c) { atomic64_get_na(&ps->stats_out->bytes), atomic64_get_na(&ps->stats_out->errors)); } - } - for (k = ml->ssrc_hash->nq.head; k; k = k->next) { - struct ssrc_entry_call *se = k->data; + for (k = md->ssrc_hash->nq.head; k; k = k->next) { + struct ssrc_entry_call *se = k->data; - // stats output only - no cleanups + // stats output only - no cleanups - if (!se->stats_blocks.length || !se->lowest_mos || !se->highest_mos) - continue; - int mos_samples = (se->stats_blocks.length - se->no_mos_count); - if (mos_samples < 1) mos_samples = 1; - - ilog(LOG_INFO, "--- SSRC %s%" PRIx32 "%s", FMT_M(se->h.ssrc)); - ilog(LOG_INFO, "------ Average MOS %" PRIu64 ".%" PRIu64 ", " - "lowest MOS %" PRIu64 ".%" PRIu64 " (at %u:%02u), " - "highest MOS %" PRIu64 ".%" PRIu64 " (at %u:%02u) lost:%u", - se->average_mos.mos / mos_samples / 10, - se->average_mos.mos / mos_samples % 10, - se->lowest_mos->mos / 10, - se->lowest_mos->mos % 10, - (unsigned int) (timeval_diff(&se->lowest_mos->reported, &c->created) / 1000000) / 60, - (unsigned int) (timeval_diff(&se->lowest_mos->reported, &c->created) / 1000000) % 60, - se->highest_mos->mos / 10, - se->highest_mos->mos % 10, - (unsigned int) (timeval_diff(&se->highest_mos->reported, &c->created) / 1000000) / 60, - (unsigned int) (timeval_diff(&se->highest_mos->reported, &c->created) / 1000000) % 60, - (unsigned int) se->packets_lost); - ilog(LOG_INFO, "------ respective (avg/min/max) jitter %" PRIu64 "/%" PRIu64 "/%" PRIu64 " ms, " - "RTT-e2e %" PRIu64 ".%" PRIu64 "/%" PRIu64 ".%" PRIu64 - "/%" PRIu64 ".%" PRIu64 " ms, " - "RTT-dsct %" PRIu32 ".%" PRIu32 "/%" PRIu32 ".%" PRIu32 - "/%" PRIu32 ".%" PRIu32 " ms, " - "packet loss %" PRIu64 "/%" PRIu64 "/%" PRIu64 "%%", - se->average_mos.jitter / mos_samples, - se->lowest_mos->jitter, - se->highest_mos->jitter, - se->average_mos.rtt / mos_samples / 1000, - (se->average_mos.rtt / mos_samples / 100) % 10, - se->lowest_mos->rtt / 1000, - (se->lowest_mos->rtt / 100) % 10, - se->highest_mos->rtt / 1000, - (se->highest_mos->rtt / 100) % 10, - se->average_mos.rtt_leg / mos_samples / 1000, - (se->average_mos.rtt_leg / mos_samples / 100) % 10, - se->lowest_mos->rtt_leg / 1000, - (se->lowest_mos->rtt_leg / 100) % 10, - se->highest_mos->rtt_leg / 1000, - (se->highest_mos->rtt_leg / 100) % 10, - se->average_mos.packetloss / mos_samples, - se->lowest_mos->packetloss, - se->highest_mos->packetloss); + if (!se->stats_blocks.length || !se->lowest_mos || !se->highest_mos) + continue; + int mos_samples = (se->stats_blocks.length - se->no_mos_count); + if (mos_samples < 1) mos_samples = 1; + + ilog(LOG_INFO, "--- SSRC %s%" PRIx32 "%s", FMT_M(se->h.ssrc)); + ilog(LOG_INFO, "------ Average MOS %" PRIu64 ".%" PRIu64 ", " + "lowest MOS %" PRIu64 ".%" PRIu64 " (at %u:%02u), " + "highest MOS %" PRIu64 ".%" PRIu64 " (at %u:%02u) lost:%u", + se->average_mos.mos / mos_samples / 10, + se->average_mos.mos / mos_samples % 10, + se->lowest_mos->mos / 10, + se->lowest_mos->mos % 10, + (unsigned int) (timeval_diff(&se->lowest_mos->reported, &c->created) / 1000000) / 60, + (unsigned int) (timeval_diff(&se->lowest_mos->reported, &c->created) / 1000000) % 60, + se->highest_mos->mos / 10, + se->highest_mos->mos % 10, + (unsigned int) (timeval_diff(&se->highest_mos->reported, &c->created) / 1000000) / 60, + (unsigned int) (timeval_diff(&se->highest_mos->reported, &c->created) / 1000000) % 60, + (unsigned int) se->packets_lost); + ilog(LOG_INFO, "------ respective (avg/min/max) jitter %" PRIu64 "/%" PRIu64 "/%" PRIu64 " ms, " + "RTT-e2e %" PRIu64 ".%" PRIu64 "/%" PRIu64 ".%" PRIu64 + "/%" PRIu64 ".%" PRIu64 " ms, " + "RTT-dsct %" PRIu32 ".%" PRIu32 "/%" PRIu32 ".%" PRIu32 + "/%" PRIu32 ".%" PRIu32 " ms, " + "packet loss %" PRIu64 "/%" PRIu64 "/%" PRIu64 "%%", + se->average_mos.jitter / mos_samples, + se->lowest_mos->jitter, + se->highest_mos->jitter, + se->average_mos.rtt / mos_samples / 1000, + (se->average_mos.rtt / mos_samples / 100) % 10, + se->lowest_mos->rtt / 1000, + (se->lowest_mos->rtt / 100) % 10, + se->highest_mos->rtt / 1000, + (se->highest_mos->rtt / 100) % 10, + se->average_mos.rtt_leg / mos_samples / 1000, + (se->average_mos.rtt_leg / mos_samples / 100) % 10, + se->lowest_mos->rtt_leg / 1000, + (se->lowest_mos->rtt_leg / 100) % 10, + se->highest_mos->rtt_leg / 1000, + (se->highest_mos->rtt_leg / 100) % 10, + se->average_mos.packetloss / mos_samples, + se->lowest_mos->packetloss, + se->highest_mos->packetloss); + } } } @@ -4299,6 +4300,7 @@ void call_media_free(struct call_media **mdp) { t38_gateway_put(&md->t38_gateway); ice_candidates_free(&md->ice_candidates); mutex_destroy(&md->dtmf_lock); + free_ssrc_hash(&md->ssrc_hash); g_free(md); *mdp = NULL; } @@ -4307,7 +4309,6 @@ void __monologue_free(struct call_monologue *m) { t_ptr_array_free(m->medias, true); g_hash_table_destroy(m->associated_tags); t_hash_table_destroy(m->media_ids); - free_ssrc_hash(&m->ssrc_hash); if (m->last_out_sdp) g_string_free(m->last_out_sdp, TRUE); if (m->session_sdp_orig) @@ -4683,7 +4684,6 @@ struct call_monologue *__monologue_create(call_t *call) { ret->associated_tags = g_hash_table_new(g_direct_hash, g_direct_equal); ret->medias = medias_arr_new(); ret->media_ids = media_id_ht_new(); - ret->ssrc_hash = create_ssrc_hash_call(); ret->sdp_attr_print = sdp_insert_monologue_attributes; /* explicitely set b=RR/b=RS to -1 so it's not considered as 0 inadvertently */ RESET_BANDWIDTH(ret->sdp_session_bandwidth, -1); diff --git a/daemon/call_interfaces.c b/daemon/call_interfaces.c index 851a15adc..590654811 100644 --- a/daemon/call_interfaces.c +++ b/daemon/call_interfaces.c @@ -2832,7 +2832,7 @@ stats: #define BF_M(k, f) if (MEDIA_ISSET(m, f)) parser->list_add_string(flags, k) static void ng_stats_media(ng_command_ctx_t *ctx, parser_arg list, const struct call_media *m, - struct call_stats *totals) + struct call_stats *totals, parser_arg ssrc) { parser_arg dict, streams = {0}, flags; struct packet_stream *ps; @@ -2888,6 +2888,8 @@ static void ng_stats_media(ng_command_ctx_t *ctx, parser_arg list, const struct BF_M("transcoding", TRANSCODING); BF_M("block egress", BLOCK_EGRESS); + ng_stats_ssrc(parser, ssrc, m->ssrc_hash); + stats: for (auto_iter(l, m->streams.head); l; l = l->next) { ps = l->data; @@ -2967,8 +2969,6 @@ static void ng_stats_monologue(ng_command_ctx_t *ctx, parser_arg dict, const str } } - ng_stats_ssrc(parser, ssrc, ml->ssrc_hash); - medias = parser->dict_add_list(sub, "medias"); parser_arg list = parser->dict_add_list(sub, "VSC"); @@ -2995,7 +2995,7 @@ stats: m = ml->medias->pdata[i]; if (!m) continue; - ng_stats_media(ctx, medias, m, totals); + ng_stats_media(ctx, medias, m, totals, ssrc); } } diff --git a/daemon/codec.c b/daemon/codec.c index 6d331e374..d1e0965bb 100644 --- a/daemon/codec.c +++ b/daemon/codec.c @@ -823,7 +823,7 @@ reset: __handler_stats_entry(handler); - ssrc_hash_foreach(handler->media->monologue->ssrc_hash, __reset_sequencer, NULL); + ssrc_hash_foreach(handler->media->ssrc_hash, __reset_sequencer, NULL); no_handler_reset: __delay_buffer_setup(&handler->delay_buffer, handler, handler->media->call, handler->media->buffer_delay); diff --git a/daemon/dtmf.c b/daemon/dtmf.c index 9483999c3..ad6280d06 100644 --- a/daemon/dtmf.c +++ b/daemon/dtmf.c @@ -724,15 +724,14 @@ static const char *dtmf_inject_pcm(struct call_media *media, struct call_media * for (__auto_type l = ps->rtp_sinks.head; l; l = l->next) { struct sink_handler *sh = l->data; struct packet_stream *sink_ps = sh->sink; - struct call_monologue *sink_ml = sink_ps->media->monologue; + __auto_type sink_media = sink_ps->media; packet_sequencer_t *seq = g_hash_table_lookup(ssrc_in->parent->sequencers, sink_ps->media); if (!seq) continue; struct ssrc_ctx *ssrc_out = get_ssrc_ctx(sh->attrs.transcoding ? ssrc_in->ssrc_map_out : ssrc_in->parent->h.ssrc, - sink_ml->ssrc_hash, SSRC_DIR_OUTPUT, - monologue); + sink_media->ssrc_hash, SSRC_DIR_OUTPUT); if (!ssrc_out) return "No output SSRC context present"; // XXX generate stream diff --git a/daemon/media_player.c b/daemon/media_player.c index 8acfc0bda..bf24a8cba 100644 --- a/daemon/media_player.c +++ b/daemon/media_player.c @@ -244,14 +244,11 @@ void media_player_new(struct media_player **mpp, struct call_monologue *ml, stru if (!(mp = *mpp)) { //ilog(LOG_DEBUG, "creating media_player"); - uint32_t ssrc = 0; - while (ssrc == 0) - ssrc = ssl_random(); - struct ssrc_ctx *ssrc_ctx = get_ssrc_ctx(ssrc, ml->ssrc_hash, SSRC_DIR_OUTPUT, ml); - ssrc_ctx->next_rtcp = rtpe_now; - mp = *mpp = obj_alloc0(struct media_player, __media_player_free); + while (mp->ssrc == 0) + mp->ssrc = ssl_random(); + mp->tt_obj.tt = &media_player_thread; mutex_init(&mp->lock); mp->kernel_idx = -1; @@ -264,7 +261,6 @@ void media_player_new(struct media_player **mpp, struct call_monologue *ml, stru else mp->seq = ssl_random(); mp->buffer_ts = ssl_random(); - mp->ssrc_out = ssrc_ctx; } /* add opts if given */ @@ -966,7 +962,7 @@ int media_player_setup(struct media_player *mp, const rtp_payload_type *src_pt, if (!mp->coder.handler) mp->coder.handler = codec_handler_make_playback(src_pt, dst_pt, mp->sync_ts, mp->media, - mp->ssrc_out->parent->h.ssrc, codec_set); + mp->ssrc, codec_set); if (!mp->coder.handler) return -1; @@ -982,7 +978,7 @@ static int __media_player_setup_internal(struct media_player *mp, const rtp_payl if (!mp->coder.handler) mp->coder.handler = codec_handler_make_media_player(src_pt, dst_pt, mp->sync_ts, mp->media, - mp->ssrc_out->parent->h.ssrc, codec_set); + mp->ssrc, codec_set); if (!mp->coder.handler) return -1; @@ -1146,6 +1142,11 @@ void media_player_set_media(struct media_player *mp, struct call_media *media) { mp->sink = media->streams.head->data; mp->crypt_handler = determine_handler(&transport_protocols[PROTO_RTP_AVP], media, true); } + if (!mp->ssrc_out || mp->ssrc_out->parent->h.ssrc != mp->ssrc) { + struct ssrc_ctx *ssrc_ctx = get_ssrc_ctx(mp->ssrc, media->ssrc_hash, SSRC_DIR_OUTPUT); + ssrc_ctx->next_rtcp = rtpe_now; + mp->ssrc_out = ssrc_ctx; + } } diff --git a/daemon/media_socket.c b/daemon/media_socket.c index f12df3f23..fa3a6d3f7 100644 --- a/daemon/media_socket.c +++ b/daemon/media_socket.c @@ -2089,7 +2089,7 @@ static const char *__stream_ssrc_inout(struct packet_stream *ps, uint32_t ssrc, ssrc_ctx_put(&list[ctx_idx]); // get new entry list[ctx_idx] = - get_ssrc_ctx(ssrc, ssrc_hash, dir, ps->media->monologue); + get_ssrc_ctx(ssrc, ssrc_hash, dir); ret = "SSRC changed"; ilog(LOG_DEBUG, "New %s SSRC for: %s%s:%d SSRC: %x%s", label, @@ -2275,7 +2275,7 @@ static void media_packet_rtp_in(struct packet_handler_ctx *phc) if (G_LIKELY(!phc->rtcp && !rtp_payload(&phc->mp.rtp, &phc->mp.payload, &phc->s))) { unkern = __stream_ssrc_in(phc->in_srtp, phc->mp.rtp->ssrc, &phc->mp.ssrc_in, - phc->mp.media->monologue->ssrc_hash); + phc->mp.media->ssrc_hash); // check the payload type // XXX redundant between SSRC handling and codec_handler stuff -> combine @@ -2305,7 +2305,7 @@ static void media_packet_rtp_in(struct packet_handler_ctx *phc) } else if (phc->rtcp && !rtcp_payload(&phc->mp.rtcp, NULL, &phc->s)) { unkern = __stream_ssrc_in(phc->in_srtp, phc->mp.rtcp->ssrc, &phc->mp.ssrc_in, - phc->mp.media->monologue->ssrc_hash); + phc->mp.media->ssrc_hash); } if (unkern) @@ -2320,12 +2320,12 @@ static void media_packet_rtp_out(struct packet_handler_ctx *phc, struct sink_han if (G_LIKELY(!phc->rtcp && phc->mp.rtp)) { unkern = __stream_ssrc_out(phc->out_srtp, phc->mp.rtp->ssrc, phc->mp.ssrc_in, - &phc->mp.ssrc_out, phc->mp.media_out->monologue->ssrc_hash, + &phc->mp.ssrc_out, phc->mp.media_out->ssrc_hash, sh->attrs.transcoding ? true : false); } else if (phc->rtcp && phc->mp.rtcp) { unkern = __stream_ssrc_out(phc->out_srtp, phc->mp.rtcp->ssrc, phc->mp.ssrc_in, - &phc->mp.ssrc_out, phc->mp.media_out->monologue->ssrc_hash, + &phc->mp.ssrc_out, phc->mp.media_out->ssrc_hash, sh->attrs.transcoding ? true : false); } diff --git a/daemon/redis.c b/daemon/redis.c index 4bfac29d1..d175d201d 100644 --- a/daemon/redis.c +++ b/daemon/redis.c @@ -112,7 +112,7 @@ static int redis_ports_release_balance = 0; // negative = releasers, positive = static int redis_check_conn(struct redis *r); static void json_restore_call(struct redis *r, const str *id, bool foreign); static int redis_connect(struct redis *r, int wait, bool resolve); -static int json_build_ssrc(struct call_monologue *ml, parser_arg arg); +static int json_build_ssrc(struct call_media *, parser_arg arg); // mutually exclusive multi-A multi-B lock @@ -1565,9 +1565,6 @@ static int redis_tags(call_t *c, struct redis_list *tags, parser_arg arg) { ml->logical_intf = get_logical_interface(NULL, ml->desired_family, 0); } - if (json_build_ssrc(ml, arg)) - return -1; - tags->ptrs[i] = ml; } @@ -1660,6 +1657,9 @@ static int json_medias(call_t *c, struct redis_list *medias, struct redis_list * /* link monologue */ med->monologue = redis_list_get_ptr(tags, &medias->rh[i], "tag"); + if (json_build_ssrc(med, arg)) + return -1; + medias->ptrs[i] = med; } @@ -1971,10 +1971,10 @@ static int json_link_maps(call_t *c, struct redis_list *maps, } static void json_build_ssrc_iter(const ng_parser_t *parser, parser_arg dict, helper_arg arg) { - struct call_monologue *ml = arg.ml; + struct call_media *md = arg.md; uint32_t ssrc = parser_get_ll(dict, "ssrc"); - struct ssrc_entry_call *se = get_ssrc(ssrc, ml->ssrc_hash); + struct ssrc_entry_call *se = get_ssrc(ssrc, md->ssrc_hash); if (!se) return; @@ -1988,15 +1988,15 @@ static void json_build_ssrc_iter(const ng_parser_t *parser, parser_arg dict, hel obj_put(&se->h); } -static int json_build_ssrc(struct call_monologue *ml, parser_arg arg) { +static int json_build_ssrc(struct call_media *md, parser_arg arg) { char tmp[2048]; - snprintf(tmp, sizeof(tmp), "ssrc_table-%u", ml->unique_id); + snprintf(tmp, sizeof(tmp), "ssrc_table-%u", md->unique_id); parser_arg list = redis_parser->dict_get_expect(arg, tmp, BENCODE_LIST); if (!list.gen) { // non-fatal for backwards compatibility return 0; } - redis_parser->list_iter(redis_parser, list, NULL, json_build_ssrc_iter, ml); + redis_parser->list_iter(redis_parser, list, NULL, json_build_ssrc_iter, md); return 0; } @@ -2634,25 +2634,6 @@ static str redis_encode_json(ng_parser_ctx_t *ctx, call_t *c, void **to_free) { struct call_media *media = ml->medias->pdata[j]; JSON_ADD_LIST_STRING("%u", media ? media->unique_id : -1); } - - // SSRC table dump - LOCK(&ml->ssrc_hash->lock); - snprintf(tmp, sizeof(tmp), "ssrc_table-%u", ml->unique_id); - parser_arg list = parser->dict_add_list_dup(root, tmp); - for (GList *m = ml->ssrc_hash->nq.head; m; m = m->next) { - struct ssrc_entry_call *se = m->data; - inner = parser->list_add_dict(list); - - JSON_SET_SIMPLE("ssrc", "%" PRIu32, se->h.ssrc); - // XXX use function for in/out - JSON_SET_SIMPLE("in_srtp_index", "%u", atomic_get_na(&se->input_ctx.stats->ext_seq)); - JSON_SET_SIMPLE("in_srtcp_index", "%u", atomic_get_na(&se->input_ctx.stats->rtcp_seq)); - JSON_SET_SIMPLE("in_payload_type", "%i", se->input_ctx.tracker.most[0]); - JSON_SET_SIMPLE("out_srtp_index", "%u", atomic_get_na(&se->output_ctx.stats->ext_seq)); - JSON_SET_SIMPLE("out_srtcp_index", "%u", atomic_get_na(&se->output_ctx.stats->rtcp_seq)); - JSON_SET_SIMPLE("out_payload_type", "%i", se->output_ctx.tracker.most[0]); - // XXX add rest of info - } } // --- for monologues.head for (__auto_type l = c->medias.head; l; l = l->next) { @@ -2730,6 +2711,25 @@ static str redis_encode_json(ng_parser_ctx_t *ctx, call_t *c, void **to_free) { pt->clock_rate, STR_FMT(&pt->encoding_parameters), STR_FMT(&pt->format_parameters), pt->bitrate, pt->ptime); } + + // SSRC table dump + LOCK(&media->ssrc_hash->lock); + snprintf(tmp, sizeof(tmp), "ssrc_table-%u", media->unique_id); + parser_arg list = parser->dict_add_list_dup(root, tmp); + for (GList *m = media->ssrc_hash->nq.head; m; m = m->next) { + struct ssrc_entry_call *se = m->data; + inner = parser->list_add_dict(list); + + JSON_SET_SIMPLE("ssrc", "%" PRIu32, se->h.ssrc); + // XXX use function for in/out + JSON_SET_SIMPLE("in_srtp_index", "%u", atomic_get_na(&se->input_ctx.stats->ext_seq)); + JSON_SET_SIMPLE("in_srtcp_index", "%u", atomic_get_na(&se->input_ctx.stats->rtcp_seq)); + JSON_SET_SIMPLE("in_payload_type", "%i", se->input_ctx.tracker.most[0]); + JSON_SET_SIMPLE("out_srtp_index", "%u", atomic_get_na(&se->output_ctx.stats->ext_seq)); + JSON_SET_SIMPLE("out_srtcp_index", "%u", atomic_get_na(&se->output_ctx.stats->rtcp_seq)); + JSON_SET_SIMPLE("out_payload_type", "%i", se->output_ctx.tracker.most[0]); + // XXX add rest of info + } } // --- for medias.head for (__auto_type l = c->endpoint_maps.head; l; l = l->next) { diff --git a/daemon/rtcp.c b/daemon/rtcp.c index 9e17f86d4..db365bebe 100644 --- a/daemon/rtcp.c +++ b/daemon/rtcp.c @@ -1303,8 +1303,8 @@ static void transcode_rr(struct rtcp_process_ctx *ctx, struct report_block *rr) return; // reverse SSRC mapping - struct ssrc_ctx *map_ctx = get_ssrc_ctx(ctx->scratch.rr.ssrc, ctx->mp->media->monologue->ssrc_hash, - SSRC_DIR_OUTPUT, ctx->mp->media->monologue); + struct ssrc_ctx *map_ctx = get_ssrc_ctx(ctx->scratch.rr.ssrc, ctx->mp->media->ssrc_hash, + SSRC_DIR_OUTPUT); rr->ssrc = htonl(map_ctx->ssrc_map_out); if (!ctx->mp->media_out) @@ -1312,8 +1312,8 @@ static void transcode_rr(struct rtcp_process_ctx *ctx, struct report_block *rr) // for reception stats struct ssrc_ctx *input_ctx = get_ssrc_ctx(map_ctx->ssrc_map_out, - ctx->mp->media_out->monologue->ssrc_hash, - SSRC_DIR_INPUT, NULL); + ctx->mp->media_out->ssrc_hash, + SSRC_DIR_INPUT); if (!input_ctx) return; @@ -1534,13 +1534,11 @@ static GString *rtcp_sender_report(struct ssrc_sender_report *ssr, return ret; } -void rtcp_receiver_reports(GQueue *out, struct ssrc_hash *hash, struct call_monologue *ml) { +static void rtcp_receiver_reports(GQueue *out, struct ssrc_hash *hash) { LOCK(&hash->lock); for (GList *l = hash->nq.head; l; l = l->next) { struct ssrc_entry_call *e = l->data; struct ssrc_ctx *i = &e->input_ctx; - if (i->ref != ml) - continue; if (!atomic64_get_na(&i->stats->packets)) continue; @@ -1574,7 +1572,7 @@ void rtcp_send_report(struct call_media *media, struct ssrc_ctx *ssrc_out) { log_info_stream_fd(ps->selected_sfd); GQueue rrs = G_QUEUE_INIT; - rtcp_receiver_reports(&rrs, media->monologue->ssrc_hash, ps->media->monologue); + rtcp_receiver_reports(&rrs, media->ssrc_hash); ilogs(rtcp, LOG_DEBUG, "Generating and sending RTCP SR for %x and up to %i source(s)", ssrc_out->parent->h.ssrc, rrs.length); diff --git a/daemon/ssrc.c b/daemon/ssrc.c index 8a469b388..286115e99 100644 --- a/daemon/ssrc.c +++ b/daemon/ssrc.c @@ -300,13 +300,11 @@ struct ssrc_hash *create_ssrc_hash_call(void) { return create_ssrc_hash_full(create_ssrc_entry_call, NULL); } -struct ssrc_ctx *get_ssrc_ctx(uint32_t ssrc, struct ssrc_hash *ht, enum ssrc_dir dir, void *ref) { +struct ssrc_ctx *get_ssrc_ctx(uint32_t ssrc, struct ssrc_hash *ht, enum ssrc_dir dir) { struct ssrc_entry *s = get_ssrc(ssrc, ht /* , NULL */); if (G_UNLIKELY(!s)) return NULL; struct ssrc_ctx *ret = ((void *) s) + dir; - if (ref) - ret->ref = ref; return ret; } @@ -324,7 +322,7 @@ static void *__do_time_report_item(struct call_media *m, size_t struct_size, siz sti->ntp_middle_bits = ntp_msw << 16 | ntp_lsw >> 16; sti->ntp_ts = ntp_ts_to_double(ntp_msw, ntp_lsw); - e = get_ssrc(ssrc, m->monologue->ssrc_hash); + e = get_ssrc(ssrc, m->ssrc_hash); if (G_UNLIKELY(!e)) { free_func(sti); return NULL; @@ -350,7 +348,7 @@ static struct ssrc_entry_call *hunt_ssrc(struct call_media *media, uint32_t ssrc for (__auto_type sub = media->media_subscriptions.head; sub; sub = sub->next) { struct media_subscription * ms = sub->data; - struct ssrc_entry_call *e = find_ssrc(ssrc, ms->monologue->ssrc_hash, NULL); + struct ssrc_entry_call *e = find_ssrc(ssrc, ms->media->ssrc_hash, NULL); if (e) return e; } @@ -451,7 +449,7 @@ void ssrc_receiver_report(struct call_media *m, stream_fd *sfd, const struct ssr int pt; long long rtt = calc_rtt(m, - .ht = m->monologue->ssrc_hash, + .ht = m->ssrc_hash, .tv = tv, .pt_p = &pt, .ssrc = rr->ssrc, @@ -459,7 +457,7 @@ void ssrc_receiver_report(struct call_media *m, stream_fd *sfd, const struct ssr .delay = rr->dlsr, .reports_queue_offset = G_STRUCT_OFFSET(struct ssrc_entry_call, sender_reports)); - struct ssrc_entry_call *other_e = get_ssrc(rr->from, m->monologue->ssrc_hash); + struct ssrc_entry_call *other_e = get_ssrc(rr->from, m->ssrc_hash); if (G_UNLIKELY(!other_e)) goto out_nl; @@ -582,7 +580,7 @@ void ssrc_receiver_dlrr(struct call_media *m, const struct ssrc_xr_dlrr *dlrr, dlrr->lrr, dlrr->dlrr); calc_rtt(m, - .ht = m->monologue->ssrc_hash, + .ht = m->ssrc_hash, .tv = tv, .pt_p = NULL, .ssrc = dlrr->ssrc, @@ -604,7 +602,7 @@ void ssrc_voip_metrics(struct call_media *m, const struct ssrc_xr_voip_metrics * vm->ext_r_factor, vm->mos_lq, vm->mos_cq, vm->rx_config, vm->jb_nom, vm->jb_max, vm->jb_abs_max); - struct ssrc_entry_call *e = get_ssrc(vm->ssrc, m->monologue->ssrc_hash); + struct ssrc_entry_call *e = get_ssrc(vm->ssrc, m->ssrc_hash); if (!e) return; e->last_rtt_xr = vm->rnd_trip_delay; diff --git a/include/call.h b/include/call.h index 3f4afe6a1..c9c794096 100644 --- a/include/call.h +++ b/include/call.h @@ -506,6 +506,7 @@ struct call_media { packet_stream_q streams; /* normally RTP + RTCP */ endpoint_map_q endpoint_maps; + struct ssrc_hash *ssrc_hash; struct codec_store codecs; struct codec_store offered_codecs; @@ -614,7 +615,6 @@ struct call_monologue { str sdp_session_uri; str sdp_session_phone; str sdp_session_email; - struct ssrc_hash *ssrc_hash; str metadata; struct janus_session *janus_session; diff --git a/include/control_ng.h b/include/control_ng.h index 0bbfb5e9d..5da8b65e7 100644 --- a/include/control_ng.h +++ b/include/control_ng.h @@ -86,6 +86,7 @@ typedef union { void (**call_fn)(call_t *); GHashTable *ht; struct call_monologue *ml; + struct call_media *md; struct ng_media *media; struct ng_codec *codec; struct rtp_payload_type *pt; diff --git a/include/media_player.h b/include/media_player.h index 22963ed5f..40f8f4908 100644 --- a/include/media_player.h +++ b/include/media_player.h @@ -81,6 +81,7 @@ struct media_player { unsigned int kernel_idx; struct media_player_media_file *media_file; + uint32_t ssrc; struct ssrc_ctx *ssrc_out; unsigned long seq; unsigned long buffer_ts; diff --git a/include/rtcp.h b/include/rtcp.h index cfc41fc33..641973584 100644 --- a/include/rtcp.h +++ b/include/rtcp.h @@ -38,7 +38,6 @@ rtcp_filter_func rtcp_avpf2avp_filter; void rtcp_init(void); -void rtcp_receiver_reports(GQueue *out, struct ssrc_hash *hash, struct call_monologue *ml); void rtcp_send_report(struct call_media *media, struct ssrc_ctx *ssrc_out); #endif diff --git a/include/ssrc.h b/include/ssrc.h index eaa849f86..a28afe7f9 100644 --- a/include/ssrc.h +++ b/include/ssrc.h @@ -43,7 +43,6 @@ struct payload_tracker { struct ssrc_ctx { struct ssrc_entry_call *parent; struct payload_tracker tracker; - void *ref; // points to the call_monologue but is opaque // XXX move entire crypto context in here? @@ -219,7 +218,7 @@ INLINE void *get_ssrc(uint32_t ssrc, struct ssrc_hash *ht) { return get_ssrc_full(ssrc, ht, NULL); } -struct ssrc_ctx *get_ssrc_ctx(uint32_t, struct ssrc_hash *, enum ssrc_dir, void *ref); // creates new entry if not found +struct ssrc_ctx *get_ssrc_ctx(uint32_t, struct ssrc_hash *, enum ssrc_dir); // creates new entry if not found void ssrc_sender_report(struct call_media *, const struct ssrc_sender_report *, const struct timeval *); diff --git a/t/test-transcode.c b/t/test-transcode.c index 2492d71e8..21c73fe14 100644 --- a/t/test-transcode.c +++ b/t/test-transcode.c @@ -261,13 +261,13 @@ static void __packet_seq_ts(const char *file, int line, struct call_media *media .call = &call, .media = media, .media_out = other_media, - .ssrc_in = get_ssrc_ctx(ssrc, media->monologue->ssrc_hash, SSRC_DIR_INPUT, NULL), + .ssrc_in = get_ssrc_ctx(ssrc, media->ssrc_hash, SSRC_DIR_INPUT), .sfd = &sfd, }; // from __stream_ssrc() if (!MEDIA_ISSET(media, TRANSCODING)) mp.ssrc_in->ssrc_map_out = ntohl(ssrc); - mp.ssrc_out = get_ssrc_ctx(mp.ssrc_in->ssrc_map_out, other_media->monologue->ssrc_hash, SSRC_DIR_OUTPUT, NULL); + mp.ssrc_out = get_ssrc_ctx(mp.ssrc_in->ssrc_map_out, other_media->ssrc_hash, SSRC_DIR_OUTPUT); payload_tracker_add(&mp.ssrc_in->tracker, pt_in & 0x7f); int packet_len = sizeof(struct rtp_header) + pl.len;