diff --git a/daemon/call.c b/daemon/call.c index c52c7c8f2..5c6a5b882 100644 --- a/daemon/call.c +++ b/daemon/call.c @@ -669,7 +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(); + ssrc_hash_call_init(&med->ssrc_hash); return med; } @@ -4182,7 +4182,7 @@ void call_destroy(call_t *c) { atomic64_get_na(&ps->stats_out->errors)); } - for (k = md->ssrc_hash->nq.head; k; k = k->next) { + for (k = md->ssrc_hash.nq.head; k; k = k->next) { struct ssrc_entry_call *se = k->data; // stats output only - no cleanups @@ -4300,7 +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); + ssrc_hash_destroy(&md->ssrc_hash); g_free(md); *mdp = NULL; } diff --git a/daemon/call_interfaces.c b/daemon/call_interfaces.c index 590654811..4dc4f2201 100644 --- a/daemon/call_interfaces.c +++ b/daemon/call_interfaces.c @@ -64,7 +64,7 @@ static void call_ng_flags_list(const ng_parser_t *, parser_arg list, void (*item_callback)(const ng_parser_t *, parser_arg, helper_arg), helper_arg); static void call_ng_flags_esc_str_list(str *s, unsigned int, helper_arg); -static void ng_stats_ssrc(const ng_parser_t *parser, parser_arg dict, struct ssrc_hash *ht); +static void ng_stats_ssrc(const ng_parser_t *parser, parser_arg dict, const struct ssrc_hash *ht); static str *str_dup_escape(const str *s); static void call_set_dtmf_block(call_t *call, struct call_monologue *monologue, sdp_ng_flags *flags); @@ -2888,7 +2888,7 @@ 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); + ng_stats_ssrc(parser, ssrc, &m->ssrc_hash); stats: for (auto_iter(l, m->streams.head); l; l = l->next) { @@ -3030,7 +3030,7 @@ static void ng_stats_ssrc_mos_entry_dict_avg(const ng_parser_t *parser, parser_a parser->dict_add_int(subent, "samples", div); } -static void ng_stats_ssrc(const ng_parser_t *parser, parser_arg dict, struct ssrc_hash *ht) { +static void ng_stats_ssrc(const ng_parser_t *parser, parser_arg dict, const struct ssrc_hash *ht) { for (GList *l = ht->nq.head; l; l = l->next) { struct ssrc_entry_call *se = l->data; char tmp[12]; diff --git a/daemon/codec.c b/daemon/codec.c index d1e0965bb..32d28beec 100644 --- a/daemon/codec.c +++ b/daemon/codec.c @@ -415,8 +415,8 @@ static void __handler_shutdown(struct codec_handler *handler) { __transform_handler_shutdown(handler->transform); handler->tcc = NULL; obj_release(handler->transform); - ssrc_hash_foreach(handler->ssrc_hash, __ssrc_handler_stop, NULL); - free_ssrc_hash(&handler->ssrc_hash); + ssrc_hash_foreach(&handler->ssrc_hash, __ssrc_handler_stop, NULL); + ssrc_hash_destroy(&handler->ssrc_hash); if (handler->delay_buffer) { __delay_buffer_shutdown(handler->delay_buffer, true); delay_buffer_stop(&handler->delay_buffer); @@ -496,7 +496,7 @@ static void __make_passthrough(struct codec_handler *handler, int dtmf_pt, int c handler->kernelize = true; } rtp_payload_type_copy(&handler->dest_pt, &handler->source_pt); - handler->ssrc_hash = create_ssrc_hash_full(__ssrc_handler_new, handler); + ssrc_hash_full_init(&handler->ssrc_hash, __ssrc_handler_new, handler); handler->dtmf_payload_type = dtmf_pt; handler->cn_payload_type = cn_pt; handler->passthrough = true; @@ -608,8 +608,7 @@ static const char *__make_transform_handler(struct codec_handler *handler) { } } - if (!handler->ssrc_hash) - handler->ssrc_hash = create_ssrc_hash_full(__ssrc_handler_new, handler); + ssrc_hash_full_init(&handler->ssrc_hash, __ssrc_handler_new, handler); if (!tfh) { ilogs(codec, LOG_DEBUG, "Creating new transform handler"); @@ -802,7 +801,7 @@ reset: if (err[0] != '\0') ilogs(codec, LOG_ERR, "Failed to set up transform handler: %s", err); - handler->ssrc_hash = create_ssrc_hash_full(ssrc_handler_new_func, handler); + ssrc_hash_full_init(&handler->ssrc_hash, ssrc_handler_new_func, handler); ilogs(codec, LOG_DEBUG, "Created transcode context for " STR_FORMAT "/" STR_FORMAT " (%i) -> " STR_FORMAT "/" STR_FORMAT " (%i) with DTMF output %i and CN output %i", @@ -814,8 +813,8 @@ reset: dest->payload_type, dtmf_payload_type, cn_payload_type); - if (handler->ssrc_hash->precreat - && ((struct codec_ssrc_handler *) handler->ssrc_hash->precreat)->chain) + if (handler->ssrc_hash.precreat + && ((struct codec_ssrc_handler *) handler->ssrc_hash.precreat)->chain) { handler->stats_chain_suffix = " (GPU)"; handler->stats_chain_suffix_brief = "_gpu"; @@ -823,7 +822,7 @@ reset: __handler_stats_entry(handler); - ssrc_hash_foreach(handler->media->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); @@ -2182,20 +2181,12 @@ static int __handler_func_sequencer(struct media_packet *mp, struct transcode_pa { struct codec_handler *h = packet->handler; - if (G_UNLIKELY(!h->ssrc_hash)) { - if (!packet->packet_func || !h->input_handler->ssrc_hash) { - h->handler_func(h, mp); - __transcode_packet_free(packet); - return 0; - } - } - struct ssrc_ctx *ssrc_in = mp->ssrc_in; struct ssrc_entry_call *ssrc_in_p = ssrc_in->parent; struct ssrc_ctx *ssrc_out = mp->ssrc_out; struct ssrc_entry_call *ssrc_out_p = ssrc_out->parent; - struct codec_ssrc_handler *ch = get_ssrc(ssrc_in_p->h.ssrc, h->ssrc_hash); + struct codec_ssrc_handler *ch = get_ssrc(ssrc_in_p->h.ssrc, &h->ssrc_hash); if (G_UNLIKELY(!ch)) { __transcode_packet_free(packet); return 0; @@ -2215,7 +2206,7 @@ static int __handler_func_sequencer(struct media_packet *mp, struct transcode_pa atomic64_inc_na(&mp->sfd->local_intf->stats->in.packets); atomic64_add_na(&mp->sfd->local_intf->stats->in.bytes, mp->payload.len); - struct codec_ssrc_handler *input_ch = get_ssrc(ssrc_in_p->h.ssrc, h->input_handler->ssrc_hash); + struct codec_ssrc_handler *input_ch = get_ssrc(ssrc_in_p->h.ssrc, &h->input_handler->ssrc_hash); if (packet->bypass_seq) { // bypass sequencer @@ -2328,10 +2319,10 @@ static int __handler_func_sequencer(struct media_packet *mp, struct transcode_pa h = packet->handler; obj_release(ch); obj_release(input_ch); - ch = get_ssrc(ssrc_in_p->h.ssrc, h->ssrc_hash); + ch = get_ssrc(ssrc_in_p->h.ssrc, &h->ssrc_hash); if (G_UNLIKELY(!ch)) goto next; - input_ch = get_ssrc(ssrc_in_p->h.ssrc, h->input_handler->ssrc_hash); + input_ch = get_ssrc(ssrc_in_p->h.ssrc, &h->input_handler->ssrc_hash); if (G_UNLIKELY(!input_ch)) { obj_release(ch); goto next; @@ -2489,7 +2480,7 @@ static struct codec_ssrc_handler *__output_ssrc_handler(struct codec_ssrc_handle // our encoder is in a different codec handler ilogs(transcoding, LOG_DEBUG, "Switching context from decoder to encoder"); handler = handler->output_handler; - struct codec_ssrc_handler *new_ch = get_ssrc(mp->ssrc_in->parent->h.ssrc, handler->ssrc_hash); + struct codec_ssrc_handler *new_ch = get_ssrc(mp->ssrc_in->parent->h.ssrc, &handler->ssrc_hash); if (G_UNLIKELY(!new_ch)) { ilogs(transcoding, LOG_ERR | LOG_FLAG_LIMIT, "Switched from input to output codec context, but no codec handler present"); @@ -2978,7 +2969,7 @@ static int handler_func_passthrough_ssrc(struct codec_handler *h, struct media_p // check for DTMF injection if (h->dtmf_payload_type != -1) { - struct codec_ssrc_handler *ch = get_ssrc(mp->ssrc_in->parent->h.ssrc, h->ssrc_hash); + struct codec_ssrc_handler *ch = get_ssrc(mp->ssrc_in->parent->h.ssrc, &h->ssrc_hash); if (ch) { uint64_t ts64 = ntohl(mp->rtp->timestamp); @@ -4055,7 +4046,7 @@ static void __dtx_buffer_restart(void *p, void *arg) { __dtx_setup(ch); } static void __dtx_restart(struct codec_handler *h) { - ssrc_hash_foreach(h->ssrc_hash, __dtx_buffer_restart, NULL); + ssrc_hash_foreach(&h->ssrc_hash, __dtx_buffer_restart, NULL); } static void __delay_buffer_setup(struct delay_buffer **dbufp, struct codec_handler *h, call_t *call, unsigned int delay) @@ -4106,7 +4097,7 @@ void codec_handlers_stop(codec_handlers_q *q, struct call_media *sink) { delay_buffer_stop(&h->delay_buffer); } - ssrc_hash_foreach(h->ssrc_hash, __ssrc_handler_stop, NULL); + ssrc_hash_foreach(&h->ssrc_hash, __ssrc_handler_stop, NULL); __transform_handler_shutdown(h->transform); } } @@ -4977,7 +4968,7 @@ static int handler_func_inject_dtmf(struct codec_handler *h, struct media_packet h->input_handler = __input_handler(h, mp); h->output_handler = h->input_handler; - struct codec_ssrc_handler *ch = get_ssrc(mp->ssrc_in->parent->h.ssrc, h->ssrc_hash); + struct codec_ssrc_handler *ch = get_ssrc(mp->ssrc_in->parent->h.ssrc, &h->ssrc_hash); if (!ch) return 0; decoder_input_data(ch->decoder, &mp->payload, mp->rtp->timestamp, diff --git a/daemon/dtmf.c b/daemon/dtmf.c index ad6280d06..f4a6818c7 100644 --- a/daemon/dtmf.c +++ b/daemon/dtmf.c @@ -731,7 +731,7 @@ static const char *dtmf_inject_pcm(struct call_media *media, struct call_media * struct ssrc_ctx *ssrc_out = get_ssrc_ctx(sh->attrs.transcoding ? ssrc_in->ssrc_map_out : ssrc_in->parent->h.ssrc, - sink_media->ssrc_hash, SSRC_DIR_OUTPUT); + &sink_media->ssrc_hash, SSRC_DIR_OUTPUT); if (!ssrc_out) return "No output SSRC context present"; // XXX generate stream @@ -826,7 +826,7 @@ const char *dtmf_inject(struct call_media *media, int code, int volume, int dura // skip DTMF PTs if (pt == ch_pt) continue; - if (ch->output_handler && ch->output_handler->ssrc_hash) // context switch if we have multiple inputs going to one output + if (ch->output_handler) // context switch if we have multiple inputs going to one output ch = ch->output_handler; ilog(LOG_DEBUG, "DTMF injection: Using PT %i/%i -> %i (%i), SSRC %" PRIx32, @@ -836,9 +836,7 @@ const char *dtmf_inject(struct call_media *media, int code, int volume, int dura ch_pt, ssrc_in->parent->h.ssrc); - if (!ch->ssrc_hash) - continue; - csh = get_ssrc(ssrc_in->parent->h.ssrc, ch->ssrc_hash); + csh = get_ssrc(ssrc_in->parent->h.ssrc, &ch->ssrc_hash); if (!csh) continue; break; @@ -848,8 +846,6 @@ const char *dtmf_inject(struct call_media *media, int code, int volume, int dura return "No RTP payload type found to be in use"; // XXX generate stream if (!ch) return "No matching codec handler"; - if (!ch->ssrc_hash) - return "No suitable codec handler present"; if (!csh) return "No matching codec SSRC handler"; diff --git a/daemon/media_player.c b/daemon/media_player.c index bf24a8cba..00d40265b 100644 --- a/daemon/media_player.c +++ b/daemon/media_player.c @@ -1143,7 +1143,7 @@ void media_player_set_media(struct media_player *mp, struct call_media *media) { 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); + 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 fa3a6d3f7..92ab97686 100644 --- a/daemon/media_socket.c +++ b/daemon/media_socket.c @@ -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->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->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->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->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 d175d201d..ec3668fb8 100644 --- a/daemon/redis.c +++ b/daemon/redis.c @@ -1974,7 +1974,7 @@ static void json_build_ssrc_iter(const ng_parser_t *parser, parser_arg dict, hel struct call_media *md = arg.md; uint32_t ssrc = parser_get_ll(dict, "ssrc"); - struct ssrc_entry_call *se = get_ssrc(ssrc, md->ssrc_hash); + struct ssrc_entry_call *se = get_ssrc(ssrc, &md->ssrc_hash); if (!se) return; @@ -2713,10 +2713,10 @@ static str redis_encode_json(ng_parser_ctx_t *ctx, call_t *c, void **to_free) { } // SSRC table dump - LOCK(&media->ssrc_hash->lock); + 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) { + 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); diff --git a/daemon/rtcp.c b/daemon/rtcp.c index db365bebe..d662d0cf2 100644 --- a/daemon/rtcp.c +++ b/daemon/rtcp.c @@ -1303,7 +1303,7 @@ 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->ssrc_hash, + 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); @@ -1312,7 +1312,7 @@ 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->ssrc_hash, + &ctx->mp->media_out->ssrc_hash, SSRC_DIR_INPUT); if (!input_ctx) return; @@ -1572,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->ssrc_hash); + 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 286115e99..a0ba2c526 100644 --- a/daemon/ssrc.c +++ b/daemon/ssrc.c @@ -205,7 +205,7 @@ static void *find_ssrc(uint32_t ssrc, struct ssrc_hash *ht, unsigned int *iters) void *get_ssrc_full(uint32_t ssrc, struct ssrc_hash *ht, bool *created) { struct ssrc_entry *ent; - if (!ht) + if (!ht->create_func) return NULL; while (true) { @@ -257,18 +257,18 @@ void *get_ssrc_full(uint32_t ssrc, struct ssrc_hash *ht, bool *created) { return ent; } } -void free_ssrc_hash(struct ssrc_hash **ht) { - if (!*ht) - return; - for (GList *l = (*ht)->nq.head; l;) { +void ssrc_hash_destroy(struct ssrc_hash *ht) { + for (GList *l = ht->nq.head; l;) { GList *next = l->next; ssrc_entry_put(l->data); l = next; } - if ((*ht)->precreat) - obj_put((struct ssrc_entry *) (*ht)->precreat); - g_free(*ht); - *ht = NULL; + if (ht->precreat) + obj_put((struct ssrc_entry *) ht->precreat); + ht->precreat = NULL; + g_queue_init(&ht->nq); + ht->create_func = NULL; + mutex_destroy(&ht->lock); } void ssrc_hash_foreach(struct ssrc_hash *sh, void (*f)(void *, void *), void *ptr) { if (!sh) @@ -283,21 +283,18 @@ void ssrc_hash_foreach(struct ssrc_hash *sh, void (*f)(void *, void *), void *pt } -struct ssrc_hash *create_ssrc_hash_full_fast(ssrc_create_func_t cfunc, void *uptr) { - struct ssrc_hash *ret; - ret = g_new0(__typeof(*ret), 1); - mutex_init(&ret->lock); - ret->create_func = cfunc; - ret->uptr = uptr; - return ret; +void ssrc_hash_full_fast_init(struct ssrc_hash *sh, ssrc_create_func_t cfunc, void *uptr) { + mutex_init(&sh->lock); + sh->create_func = cfunc; + sh->uptr = uptr; } -struct ssrc_hash *create_ssrc_hash_full(ssrc_create_func_t cfunc, void *uptr) { - struct ssrc_hash *ret = create_ssrc_hash_full_fast(cfunc, uptr); - ret->precreat = cfunc(uptr); // because object creation might be slow - return ret; +void ssrc_hash_full_init(struct ssrc_hash *sh, ssrc_create_func_t cfunc, void *uptr) { + ssrc_hash_destroy(sh); + ssrc_hash_full_fast_init(sh, cfunc, uptr); + sh->precreat = cfunc(uptr); // because object creation might be slow } -struct ssrc_hash *create_ssrc_hash_call(void) { - return create_ssrc_hash_full(create_ssrc_entry_call, NULL); +void ssrc_hash_call_init(struct ssrc_hash *sh) { + ssrc_hash_full_init(sh, create_ssrc_entry_call, NULL); } struct ssrc_ctx *get_ssrc_ctx(uint32_t ssrc, struct ssrc_hash *ht, enum ssrc_dir dir) { @@ -322,7 +319,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->ssrc_hash); + e = get_ssrc(ssrc, &m->ssrc_hash); if (G_UNLIKELY(!e)) { free_func(sti); return NULL; @@ -348,7 +345,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->media->ssrc_hash, NULL); + struct ssrc_entry_call *e = find_ssrc(ssrc, &ms->media->ssrc_hash, NULL); if (e) return e; } @@ -449,7 +446,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->ssrc_hash, + .ht = &m->ssrc_hash, .tv = tv, .pt_p = &pt, .ssrc = rr->ssrc, @@ -457,7 +454,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->ssrc_hash); + struct ssrc_entry_call *other_e = get_ssrc(rr->from, &m->ssrc_hash); if (G_UNLIKELY(!other_e)) goto out_nl; @@ -580,7 +577,7 @@ void ssrc_receiver_dlrr(struct call_media *m, const struct ssrc_xr_dlrr *dlrr, dlrr->lrr, dlrr->dlrr); calc_rtt(m, - .ht = m->ssrc_hash, + .ht = &m->ssrc_hash, .tv = tv, .pt_p = NULL, .ssrc = dlrr->ssrc, @@ -602,7 +599,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->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 c9c794096..d4bd8b208 100644 --- a/include/call.h +++ b/include/call.h @@ -297,6 +297,7 @@ enum block_dtmf_mode { #include "dtls.h" #include "dtmf.h" #include "arena.h" +#include "ssrc.h" struct control_stream; @@ -306,7 +307,6 @@ struct rtpengine_srtp; struct local_interface; struct call_monologue; struct ice_agent; -struct ssrc_hash; struct codec_handler; struct media_player; struct send_timer; @@ -506,7 +506,7 @@ struct call_media { packet_stream_q streams; /* normally RTP + RTCP */ endpoint_map_q endpoint_maps; - struct ssrc_hash *ssrc_hash; + struct ssrc_hash ssrc_hash; struct codec_store codecs; struct codec_store offered_codecs; diff --git a/include/codec.h b/include/codec.h index 08e2f4ee7..16975cac6 100644 --- a/include/codec.h +++ b/include/codec.h @@ -11,11 +11,11 @@ #include "rtplib.h" #include "timerthread.h" #include "types.h" +#include "ssrc.h" struct call_media; struct codec_handler; struct media_packet; -struct ssrc_hash; struct codec_ssrc_handler; struct rtp_header; struct stream_params; @@ -62,7 +62,7 @@ struct codec_handler { size_t payload_len; // for short-packet blocking - struct ssrc_hash *ssrc_hash; + struct ssrc_hash ssrc_hash; struct codec_handler *input_handler; // == main handler for supp codecs struct codec_handler *output_handler; // == self, or other PT handler struct call_media *media; diff --git a/include/ssrc.h b/include/ssrc.h index a28afe7f9..008dee8d4 100644 --- a/include/ssrc.h +++ b/include/ssrc.h @@ -206,12 +206,12 @@ struct crtt_args { -void free_ssrc_hash(struct ssrc_hash **); +void ssrc_hash_destroy(struct ssrc_hash *); void ssrc_hash_foreach(struct ssrc_hash *, void (*)(void *, void *), void *); -struct ssrc_hash *create_ssrc_hash_full(ssrc_create_func_t, void *uptr); // pre-creates one object -struct ssrc_hash *create_ssrc_hash_full_fast(ssrc_create_func_t, void *uptr); // doesn't pre-create object +void ssrc_hash_full_init(struct ssrc_hash *, ssrc_create_func_t, void *uptr); // pre-creates one object +void ssrc_hash_full_fast_init(struct ssrc_hash *, ssrc_create_func_t, void *uptr); // doesn't pre-create object -struct ssrc_hash *create_ssrc_hash_call(void); +void ssrc_hash_call_init(struct ssrc_hash *); void *get_ssrc_full(uint32_t, struct ssrc_hash *, bool *created); // creates new entry if not found INLINE void *get_ssrc(uint32_t ssrc, struct ssrc_hash *ht) { diff --git a/lib/mix_buffer.c b/lib/mix_buffer.c index bbd6806c1..bd12e919e 100644 --- a/lib/mix_buffer.c +++ b/lib/mix_buffer.c @@ -270,7 +270,7 @@ bool mix_buffer_write_delay(struct mix_buffer *mb, uint32_t ssrc, const void *bu LOCK(&mb->lock); bool created; - g_autoptr(mix_buffer_ssrc_source) src = get_ssrc_full(ssrc, mb->ssrc_hash, &created); + g_autoptr(mix_buffer_ssrc_source) src = get_ssrc_full(ssrc, &mb->ssrc_hash, &created); if (!src) return false; if (created) @@ -340,7 +340,7 @@ bool mix_buffer_init_active(struct mix_buffer *mb, enum AVSampleFormat fmt, unsi mb->delay = delay; mb->active = active; - mb->ssrc_hash = create_ssrc_hash_full_fast(mix_buffer_ssrc_new, mb); + ssrc_hash_full_init(&mb->ssrc_hash, mix_buffer_ssrc_new, mb); return true; } @@ -348,7 +348,7 @@ bool mix_buffer_init_active(struct mix_buffer *mb, enum AVSampleFormat fmt, unsi void mix_buffer_destroy(struct mix_buffer *mb) { g_free(mb->buf.v); - free_ssrc_hash(&mb->ssrc_hash); + ssrc_hash_destroy(&mb->ssrc_hash); mutex_destroy(&mb->lock); } diff --git a/lib/mix_buffer.h b/lib/mix_buffer.h index f4d8ac009..b302ad30d 100644 --- a/lib/mix_buffer.h +++ b/lib/mix_buffer.h @@ -4,11 +4,11 @@ #include #include #include "helpers.h" +#include "ssrc.h" enum AVSampleFormat; struct mix_buffer_impl; -struct ssrc_hash; /* @@ -55,7 +55,7 @@ struct mix_buffer { // implementation details const struct mix_buffer_impl *impl; unsigned int sample_size_channels; // = sample_size * channels - struct ssrc_hash *ssrc_hash; + struct ssrc_hash ssrc_hash; }; diff --git a/t/test-transcode.c b/t/test-transcode.c index 21c73fe14..014902536 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->ssrc_hash, SSRC_DIR_INPUT), + .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->ssrc_hash, SSRC_DIR_OUTPUT); + 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;