MT#55283 integrate ssrc_hash into upper objects

Change-Id: Ib8f78ef6bc3028fc342fe07253ebe628af322e55
pull/1126/merge
Richard Fuchs 1 month ago
parent 954bac923b
commit 238dc9d5be

@ -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;
}

@ -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];

@ -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,

@ -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";

@ -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;
}

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

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

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

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

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

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

@ -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) {

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

@ -4,11 +4,11 @@
#include <stdint.h>
#include <stdbool.h>
#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;
};

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

Loading…
Cancel
Save