MT#55283 use typed G* for subscriptions

Change-Id: Iea5b93568817a73a37c10af3fc296520b2133eda
pull/1776/head
Richard Fuchs 1 year ago
parent 7b2ba5339a
commit 8f98f69e98

@ -451,7 +451,7 @@ void kill_calls_timer(GSList *list, const char *url) {
if (!media) if (!media)
continue; continue;
for (GList *l = media->media_subscribers.head; l; l = l->next) for (__auto_type l = media->media_subscribers.head; l; l = l->next)
{ {
struct media_subscription * ms = l->data; struct media_subscription * ms = l->data;
struct call_monologue * sub_ml = ms->monologue; struct call_monologue * sub_ml = ms->monologue;
@ -602,8 +602,8 @@ struct call_media *call_media_new(call_t *call) {
med = uid_slice_alloc0(med, &call->medias.q); med = uid_slice_alloc0(med, &call->medias.q);
med->call = call; med->call = call;
codec_store_init(&med->codecs, med); codec_store_init(&med->codecs, med);
med->media_subscribers_ht = g_hash_table_new(g_direct_hash, g_direct_equal); med->media_subscribers_ht = subscription_ht_new();
med->media_subscriptions_ht = g_hash_table_new(g_direct_hash, g_direct_equal); med->media_subscriptions_ht = subscription_ht_new();
mutex_init(&med->dtmf_lock); mutex_init(&med->dtmf_lock);
return med; return med;
} }
@ -2537,7 +2537,7 @@ static void __update_init_subscribers(struct call_media *media, struct stream_pa
/* update all subscribers */ /* update all subscribers */
__reset_streams(media); __reset_streams(media);
for (GList *l = media->media_subscribers.head; l; l = l->next) for (__auto_type l = media->media_subscribers.head; l; l = l->next)
{ {
struct media_subscription * ms = l->data; struct media_subscription * ms = l->data;
struct call_media * sub_media = ms->media; struct call_media * sub_media = ms->media;
@ -2785,8 +2785,7 @@ unsigned int proto_num_ports(unsigned int sp_ports, struct call_media *media, sd
} }
static int __sub_is_transcoding(gconstpointer p, gconstpointer dummy) { static int __sub_is_transcoding(const struct media_subscription *ms, gconstpointer dummy) {
const struct media_subscription *ms = p;
return ms->attrs.transcoding ? 0 : 1; return ms->attrs.transcoding ? 0 : 1;
} }
/** /**
@ -2798,7 +2797,7 @@ static void media_update_transcoding_flag(struct call_media *media) {
ML_CLEAR(media->monologue, TRANSCODING); ML_CLEAR(media->monologue, TRANSCODING);
if (g_queue_find_custom(&media->media_subscribers, NULL, __sub_is_transcoding)) if (t_queue_find_custom(&media->media_subscribers, NULL, __sub_is_transcoding))
ML_SET(media->monologue, TRANSCODING); ML_SET(media->monologue, TRANSCODING);
} }
@ -2972,11 +2971,11 @@ error_intf:
return ERROR_NO_FREE_LOGS; return ERROR_NO_FREE_LOGS;
} }
void media_subscriptions_clear(GQueue *q) { void media_subscriptions_clear(subscription_q *q) {
g_queue_clear_full(q, media_subscription_free); t_queue_clear_full(q, media_subscription_free);
} }
static void __unsubscribe_media_link(struct call_media * which, GList * which_cm_link) static void __unsubscribe_media_link(struct call_media * which, subscription_list * which_cm_link)
{ {
struct media_subscription * ms = which_cm_link->data; struct media_subscription * ms = which_cm_link->data;
struct media_subscription * rev_ms = ms->link->data; struct media_subscription * rev_ms = ms->link->data;
@ -2987,11 +2986,11 @@ static void __unsubscribe_media_link(struct call_media * which, GList * which_cm
STR_FMT_M(&which->monologue->tag), which->index, STR_FMT_M(&which->monologue->tag), which->index,
STR_FMT_M(&from->monologue->tag), from->index); STR_FMT_M(&from->monologue->tag), from->index);
g_queue_delete_link(&from->media_subscribers, ms->link); t_queue_delete_link(&from->media_subscribers, ms->link);
g_queue_delete_link(&which->media_subscriptions, which_cm_link); t_queue_delete_link(&which->media_subscriptions, which_cm_link);
g_hash_table_remove(which->media_subscriptions_ht, ms->media); t_hash_table_remove(which->media_subscriptions_ht, ms->media);
g_hash_table_remove(from->media_subscribers_ht, rev_ms->media); t_hash_table_remove(from->media_subscribers_ht, rev_ms->media);
g_slice_free1(sizeof(*ms), ms); g_slice_free1(sizeof(*ms), ms);
g_slice_free1(sizeof(*rev_ms), rev_ms); g_slice_free1(sizeof(*rev_ms), rev_ms);
@ -3001,7 +3000,7 @@ static void __unsubscribe_media_link(struct call_media * which, GList * which_cm
*/ */
static bool __unsubscribe_media(struct call_media * which, struct call_media * from) static bool __unsubscribe_media(struct call_media * which, struct call_media * from)
{ {
GList * l = g_hash_table_lookup(which->media_subscriptions_ht, from); subscription_list * l = t_hash_table_lookup(which->media_subscriptions_ht, from);
if (!l) { if (!l) {
ilog(LOG_DEBUG, "Media with monologue tag '" STR_FORMAT_M "' (index: %d) " ilog(LOG_DEBUG, "Media with monologue tag '" STR_FORMAT_M "' (index: %d) "
@ -3020,7 +3019,7 @@ static bool __unsubscribe_media(struct call_media * which, struct call_media * f
* Deletes all offer/answer media subscriptions. * Deletes all offer/answer media subscriptions.
*/ */
static void __unsubscribe_all_offer_answer_medias(struct call_media * cm) { static void __unsubscribe_all_offer_answer_medias(struct call_media * cm) {
for (GList *l = cm->media_subscribers.head; l; ) for (__auto_type l = cm->media_subscribers.head; l; )
{ {
struct media_subscription * ms = l->data; struct media_subscription * ms = l->data;
@ -3029,7 +3028,7 @@ static void __unsubscribe_all_offer_answer_medias(struct call_media * cm) {
continue; continue;
} }
GList * next = l->next; __auto_type next = l->next;
struct call_media * other_cm = ms->media; struct call_media * other_cm = ms->media;
__unsubscribe_media(other_cm, cm); __unsubscribe_media(other_cm, cm);
@ -3044,9 +3043,9 @@ static void __unsubscribe_medias_from_all(struct call_monologue *ml) {
if (!media) if (!media)
continue; continue;
for (GList * subcription = media->media_subscriptions.head; subcription; ) for (__auto_type subcription = media->media_subscriptions.head; subcription; )
{ {
GList *next = subcription->next; __auto_type next = subcription->next;
__unsubscribe_media_link(media, subcription); __unsubscribe_media_link(media, subcription);
subcription = next; subcription = next;
} }
@ -3064,7 +3063,7 @@ static struct call_monologue * ml_medias_subscribed_to_single_ml(struct call_mon
struct call_media *media = ml->medias->pdata[i]; struct call_media *media = ml->medias->pdata[i];
if (!media) if (!media)
continue; continue;
for (GList *l = media->media_subscriptions.head; l; l = l->next) for (__auto_type l = media->media_subscriptions.head; l; l = l->next)
{ {
struct media_subscription * ms = l->data; struct media_subscription * ms = l->data;
return_ml = ms->monologue; return_ml = ms->monologue;
@ -3083,7 +3082,7 @@ static struct call_monologue * ml_medias_subscribed_to_single_ml(struct call_mon
void __add_media_subscription(struct call_media * which, struct call_media * to, void __add_media_subscription(struct call_media * which, struct call_media * to,
const struct sink_attrs *attrs) const struct sink_attrs *attrs)
{ {
if (g_hash_table_lookup(which->media_subscriptions_ht, to)) { if (t_hash_table_lookup(which->media_subscriptions_ht, to)) {
ilog(LOG_DEBUG, "Media with monologue tag '" STR_FORMAT_M "' (index: %d) is already subscribed" ilog(LOG_DEBUG, "Media with monologue tag '" STR_FORMAT_M "' (index: %d) is already subscribed"
" to media with monologue tag '" STR_FORMAT_M "' (index: %d)", " to media with monologue tag '" STR_FORMAT_M "' (index: %d)",
STR_FMT_M(&which->monologue->tag), which->index, STR_FMT_M(&which->monologue->tag), which->index,
@ -3113,19 +3112,19 @@ void __add_media_subscription(struct call_media * which, struct call_media * to,
/* keep offer-answer subscriptions first in the list */ /* keep offer-answer subscriptions first in the list */
if (!attrs || !attrs->offer_answer) { if (!attrs || !attrs->offer_answer) {
g_queue_push_tail(&which->media_subscriptions, which_ms); t_queue_push_tail(&which->media_subscriptions, which_ms);
g_queue_push_tail(&to->media_subscribers, to_rev_ms); t_queue_push_tail(&to->media_subscribers, to_rev_ms);
which_ms->link = to->media_subscribers.tail; which_ms->link = to->media_subscribers.tail;
to_rev_ms->link = which->media_subscriptions.tail; to_rev_ms->link = which->media_subscriptions.tail;
} else { } else {
g_queue_push_head(&which->media_subscriptions, which_ms); t_queue_push_head(&which->media_subscriptions, which_ms);
g_queue_push_head(&to->media_subscribers, to_rev_ms); t_queue_push_head(&to->media_subscribers, to_rev_ms);
which_ms->link = to->media_subscribers.head; which_ms->link = to->media_subscribers.head;
to_rev_ms->link = which->media_subscriptions.head; to_rev_ms->link = which->media_subscriptions.head;
} }
g_hash_table_insert(which->media_subscriptions_ht, to, to_rev_ms->link); t_hash_table_insert(which->media_subscriptions_ht, to, to_rev_ms->link);
g_hash_table_insert(to->media_subscribers_ht, which, which_ms->link); t_hash_table_insert(to->media_subscribers_ht, which, which_ms->link);
} }
/** /**
* Subscribe medias to each other. * Subscribe medias to each other.
@ -3165,8 +3164,8 @@ static void __subscribe_medias_both_ways(struct call_media * a, struct call_medi
/** /**
* Retrieve exsisting media subscriptions for a call monologue. * Retrieve exsisting media subscriptions for a call monologue.
*/ */
struct media_subscription *call_get_media_subscription(GHashTable *ht, struct call_media * cm) { struct media_subscription *call_get_media_subscription(subscription_ht ht, struct call_media * cm) {
GList * l = g_hash_table_lookup(ht, cm); subscription_list *l = t_hash_table_lookup(ht, cm);
if (!l) if (!l)
return NULL; return NULL;
return l->data; return l->data;
@ -3318,7 +3317,7 @@ static int monologue_subscribe_request1(struct call_monologue *src_ml, struct ca
} }
/* called with call->master_lock held in W */ /* called with call->master_lock held in W */
__attribute__((nonnull(1, 2, 3))) __attribute__((nonnull(1, 2, 3)))
int monologue_subscribe_request(const GQueue *srms, struct call_monologue *dst_ml, int monologue_subscribe_request(const subscription_q *srms, struct call_monologue *dst_ml,
sdp_ng_flags *flags, bool print_extra_sess_attrs) sdp_ng_flags *flags, bool print_extra_sess_attrs)
{ {
unsigned int index = 1; /* running counter for output/dst medias */ unsigned int index = 1; /* running counter for output/dst medias */
@ -3327,7 +3326,7 @@ int monologue_subscribe_request(const GQueue *srms, struct call_monologue *dst_m
__call_monologue_init_from_flags(dst_ml, flags); __call_monologue_init_from_flags(dst_ml, flags);
g_auto(GQueue) mls = G_QUEUE_INIT; /* to avoid duplications */ g_auto(GQueue) mls = G_QUEUE_INIT; /* to avoid duplications */
for (GList *sl = srms->head; sl; sl = sl->next) for (__auto_type sl = srms->head; sl; sl = sl->next)
{ {
struct media_subscription *ms = sl->data; struct media_subscription *ms = sl->data;
struct call_monologue *src_ml = ms->monologue; struct call_monologue *src_ml = ms->monologue;
@ -3363,7 +3362,7 @@ int monologue_subscribe_answer(struct call_monologue *dst_ml, sdp_ng_flags *flag
/* set src_media based on subscription (assuming it is one-to-one) /* set src_media based on subscription (assuming it is one-to-one)
* TODO: this should probably be reworked to support one-to-multi subscriptions. * TODO: this should probably be reworked to support one-to-multi subscriptions.
*/ */
GList * src_ml_media_it = dst_media->media_subscriptions.head; __auto_type src_ml_media_it = dst_media->media_subscriptions.head;
struct media_subscription * ms = src_ml_media_it->data; struct media_subscription * ms = src_ml_media_it->data;
struct call_media * src_media = ms->media; struct call_media * src_media = ms->media;
@ -3426,7 +3425,7 @@ int monologue_subscribe_answer(struct call_monologue *dst_ml, sdp_ng_flags *flag
continue; continue;
/* TODO: probably we should take care about subscribers as well? */ /* TODO: probably we should take care about subscribers as well? */
for (GList * sub = dst_media->media_subscriptions.head; sub; sub = sub->next) for (__auto_type sub = dst_media->media_subscriptions.head; sub; sub = sub->next)
{ {
struct media_subscription * ms = sub->data; struct media_subscription * ms = sub->data;
if (!g_queue_find(&mls, ms->monologue)) { if (!g_queue_find(&mls, ms->monologue)) {
@ -3454,9 +3453,9 @@ int monologue_unsubscribe(struct call_monologue *dst_ml, sdp_ng_flags *flags) {
__update_init_subscribers(media, NULL, NULL, flags->opmode); __update_init_subscribers(media, NULL, NULL, flags->opmode);
/* TODO: should we care about subscribers as well? */ /* TODO: should we care about subscribers as well? */
for (GList *l = media->media_subscriptions.head; l; ) for (__auto_type l = media->media_subscriptions.head; l; )
{ {
GList *next = l->next; __auto_type next = l->next;
struct media_subscription * ms = l->data; struct media_subscription * ms = l->data;
struct call_media * src_media = ms->media; struct call_media * src_media = ms->media;
@ -3596,7 +3595,6 @@ static void __call_cleanup(call_t *c) {
/* called lock-free, but must hold a reference to the call */ /* called lock-free, but must hold a reference to the call */
void call_destroy(call_t *c) { void call_destroy(call_t *c) {
struct packet_stream *ps=0; struct packet_stream *ps=0;
GList *ll;
struct call_monologue *ml; struct call_monologue *ml;
struct call_media *md; struct call_media *md;
GList *k; GList *k;
@ -3665,7 +3663,7 @@ void call_destroy(call_t *c) {
struct call_media *media = ml->medias->pdata[i]; struct call_media *media = ml->medias->pdata[i];
if (!media) if (!media)
continue; continue;
for (ll = media->media_subscriptions.head; ll; ll = ll->next) for (__auto_type ll = media->media_subscriptions.head; ll; ll = ll->next)
{ {
struct media_subscription * ms = ll->data; struct media_subscription * ms = ll->data;
ilog(LOG_DEBUG, "--- subscribed to media with monologue tag '" STR_FORMAT_M "' (index: %d)", ilog(LOG_DEBUG, "--- subscribed to media with monologue tag '" STR_FORMAT_M "' (index: %d)",
@ -3678,7 +3676,7 @@ void call_destroy(call_t *c) {
struct call_media *media = ml->medias->pdata[i]; struct call_media *media = ml->medias->pdata[i];
if (!media) if (!media)
continue; continue;
for (ll = media->media_subscribers.head; ll; ll = ll->next) for (__auto_type ll = media->media_subscribers.head; ll; ll = ll->next)
{ {
struct media_subscription * ms = ll->data; struct media_subscription * ms = ll->data;
ilog(LOG_DEBUG, "--- subscription for media with monologue tag '" STR_FORMAT_M "' (index: %d)", ilog(LOG_DEBUG, "--- subscription for media with monologue tag '" STR_FORMAT_M "' (index: %d)",
@ -3838,8 +3836,8 @@ int call_stream_address46(char *o, struct packet_stream *ps, enum stream_address
return ifa_addr->addr.family->af; return ifa_addr->addr.family->af;
} }
void media_subscription_free(void *p) { void media_subscription_free(struct media_subscription *p) {
g_slice_free1(sizeof(struct media_subscription), p); g_slice_free1(sizeof(*p), p);
} }
void call_media_free(struct call_media **mdp) { void call_media_free(struct call_media **mdp) {
@ -3855,10 +3853,10 @@ void call_media_free(struct call_media **mdp) {
t_queue_clear_full(&md->sdp_attributes, str_free); t_queue_clear_full(&md->sdp_attributes, str_free);
t_queue_clear_full(&md->dtmf_recv, dtmf_event_free); t_queue_clear_full(&md->dtmf_recv, dtmf_event_free);
t_queue_clear_full(&md->dtmf_send, dtmf_event_free); t_queue_clear_full(&md->dtmf_send, dtmf_event_free);
g_hash_table_destroy(md->media_subscribers_ht); t_hash_table_destroy(md->media_subscribers_ht);
g_hash_table_destroy(md->media_subscriptions_ht); t_hash_table_destroy(md->media_subscriptions_ht);
g_queue_clear_full(&md->media_subscribers, media_subscription_free); t_queue_clear_full(&md->media_subscribers, media_subscription_free);
g_queue_clear_full(&md->media_subscriptions, media_subscription_free); t_queue_clear_full(&md->media_subscriptions, media_subscription_free);
mutex_destroy(&md->dtmf_lock); mutex_destroy(&md->dtmf_lock);
g_slice_free1(sizeof(*md), md); g_slice_free1(sizeof(*md), md);
*mdp = NULL; *mdp = NULL;
@ -4170,14 +4168,14 @@ void dialogue_unconfirm(struct call_monologue *ml, const char *reason) {
struct call_media *media = ml->medias->pdata[i]; struct call_media *media = ml->medias->pdata[i];
if (!media) if (!media)
continue; continue;
for (GList *l = media->media_subscriptions.head; l; l = l->next) for (__auto_type l = media->media_subscriptions.head; l; l = l->next)
{ {
struct media_subscription * ms = l->data; struct media_subscription * ms = l->data;
if (!ms->media) if (!ms->media)
continue; continue;
__media_unconfirm(ms->media, reason); __media_unconfirm(ms->media, reason);
} }
for (GList *l = media->media_subscribers.head; l; l = l->next) for (__auto_type l = media->media_subscribers.head; l; l = l->next)
{ {
struct media_subscription * ms = l->data; struct media_subscription * ms = l->data;
if (!ms->media) if (!ms->media)
@ -4372,7 +4370,7 @@ struct media_subscription * call_media_subscribed_to_monologue(const struct call
if (!sub_media) if (!sub_media)
continue; continue;
GList * l = g_hash_table_lookup(sub_media->media_subscribers_ht, media); subscription_list *l = t_hash_table_lookup(sub_media->media_subscribers_ht, media);
if (l) if (l)
return l->data; /* found */ return l->data; /* found */
} }
@ -4394,7 +4392,7 @@ static bool call_totag_subscribed_to_monologue(const str * totag, const struct c
if (!media) if (!media)
continue; continue;
for (GList * subscriber = media->media_subscribers.head; for (__auto_type subscriber = media->media_subscribers.head;
subscriber; subscriber;
subscriber = subscriber->next) subscriber = subscriber->next)
{ {
@ -4426,7 +4424,7 @@ static bool call_viabranch_intact_monologue(const str * viabranch, struct call_m
if (!media) if (!media)
continue; continue;
for (GList * subscriber = media->media_subscribers.head; for (__auto_type subscriber = media->media_subscribers.head;
subscriber; subscriber;
subscriber = subscriber->next) subscriber = subscriber->next)
{ {
@ -4489,7 +4487,7 @@ static int call_get_monologue_new(struct call_monologue *monologues[2], call_t *
if (!media) if (!media)
continue; continue;
for (GList * subcription = media->media_subscriptions.head; subcription; subcription = subcription->next) { for (__auto_type subcription = media->media_subscriptions.head; subcription; subcription = subcription->next) {
struct media_subscription * ms = subcription->data; struct media_subscription * ms = subcription->data;
__media_unconfirm(ms->media, "signalling on existing media"); __media_unconfirm(ms->media, "signalling on existing media");
} }
@ -4530,7 +4528,7 @@ monologues_intact:
struct call_media *media = ret->medias->pdata[i]; struct call_media *media = ret->medias->pdata[i];
if (!media) if (!media)
continue; continue;
for (GList *l = media->media_subscriptions.head; l; l = l->next) for (__auto_type l = media->media_subscriptions.head; l; l = l->next)
{ {
struct media_subscription * ms = l->data; struct media_subscription * ms = l->data;
if (!ms->attrs.offer_answer) if (!ms->attrs.offer_answer)
@ -4594,7 +4592,7 @@ static int call_get_dialogue(struct call_monologue *monologues[2], call_t *call,
if (!media) if (!media)
continue; continue;
/* try to find tt in subscriptions of ft */ /* try to find tt in subscriptions of ft */
for (GList *l = media->media_subscriptions.head; l; l = l->next) for (__auto_type l = media->media_subscriptions.head; l; l = l->next)
{ {
struct media_subscription * ms = l->data; struct media_subscription * ms = l->data;
if (ms->monologue && ms->monologue == tt) if (ms->monologue && ms->monologue == tt)
@ -4701,7 +4699,7 @@ static void monologue_stop(struct call_monologue *ml, bool stop_media_subsribers
struct call_media *media = ml->medias->pdata[i]; struct call_media *media = ml->medias->pdata[i];
if (!media) if (!media)
continue; continue;
for (GList *l = media->media_subscribers.head; l; l = l->next) for (__auto_type l = media->media_subscribers.head; l; l = l->next)
{ {
struct media_subscription * ms = l->data; struct media_subscription * ms = l->data;
media_stop(ms->media); media_stop(ms->media);

@ -2342,7 +2342,7 @@ static void ng_stats_monologue(bencode_item_t *dict, const struct call_monologue
if (!media) if (!media)
continue; continue;
for (GList * subscription = media->media_subscriptions.head; for (__auto_type subscription = media->media_subscriptions.head;
subscription; subscription;
subscription = subscription->next) subscription = subscription->next)
{ {
@ -2354,7 +2354,7 @@ static void ng_stats_monologue(bencode_item_t *dict, const struct call_monologue
g_queue_push_tail(&mls_subscriptions, ms->monologue); g_queue_push_tail(&mls_subscriptions, ms->monologue);
} }
} }
for (GList * subscriber = media->media_subscribers.head; for (__auto_type subscriber = media->media_subscribers.head;
subscriber; subscriber;
subscriber = subscriber->next) subscriber = subscriber->next)
{ {
@ -2499,7 +2499,7 @@ stats:
if (!media) if (!media)
continue; continue;
for (GList * subscription = media->media_subscriptions.head; for (__auto_type subscription = media->media_subscriptions.head;
subscription; subscription;
subscription = subscription->next) subscription = subscription->next)
{ {
@ -2736,13 +2736,13 @@ static const char *media_block_match(call_t **call, struct call_monologue **mono
return NULL; return NULL;
} }
void add_media_to_sub_list(GQueue *q, struct call_media *media, struct call_monologue *ml) { void add_media_to_sub_list(subscription_q *q, struct call_media *media, struct call_monologue *ml) {
struct media_subscription *ms = g_slice_alloc0(sizeof(*ms)); struct media_subscription *ms = g_slice_alloc0(sizeof(*ms));
ms->media = media; ms->media = media;
ms->monologue = ml; ms->monologue = ml;
g_queue_push_tail(q, ms); t_queue_push_tail(q, ms);
} }
static const char *media_block_match_mult(call_t **call, GQueue *medias, static const char *media_block_match_mult(call_t **call, subscription_q *medias,
sdp_ng_flags *flags, bencode_item_t *input, enum call_opmode opmode) sdp_ng_flags *flags, bencode_item_t *input, enum call_opmode opmode)
{ {
call_ng_process_flags(flags, input, opmode); call_ng_process_flags(flags, input, opmode);
@ -3061,7 +3061,7 @@ static const char *call_block_silence_media(bencode_item_t *input, bool on_off,
if (!media) if (!media)
continue; continue;
for (GList * sub = media->media_subscribers.head; sub; sub = sub->next) for (__auto_type sub = media->media_subscribers.head; sub; sub = sub->next)
{ {
struct media_subscription * ms = sub->data; struct media_subscription * ms = sub->data;
struct call_media * other_media = ms->media; struct call_media * other_media = ms->media;
@ -3358,7 +3358,7 @@ found:
struct call_media * ms_media_sink = NULL; struct call_media * ms_media_sink = NULL;
for (GList *ll = ml_media->media_subscribers.head; ll; ll = ll->next) for (__auto_type ll = ml_media->media_subscribers.head; ll; ll = ll->next)
{ {
struct media_subscription * ms = ll->data; struct media_subscription * ms = ll->data;
ms_media_sink = ms->media; ms_media_sink = ms->media;
@ -3445,7 +3445,7 @@ const char *call_subscribe_request_ng(bencode_item_t *input, bencode_item_t *out
g_auto(sdp_ng_flags) flags; g_auto(sdp_ng_flags) flags;
char rand_buf[65]; char rand_buf[65];
g_autoptr(call_t) call = NULL; g_autoptr(call_t) call = NULL;
AUTO_CLEANUP(GQueue srms, media_subscriptions_clear) = G_QUEUE_INIT; g_auto(subscription_q) srms = TYPED_GQUEUE_INIT;
g_auto(str) sdp_out = STR_NULL; g_auto(str) sdp_out = STR_NULL;
/* get source monologue */ /* get source monologue */
@ -3530,7 +3530,7 @@ const char *call_subscribe_request_ng(bencode_item_t *input, bencode_item_t *out
media_labels = bencode_dictionary_add_dictionary(output, "media-labels"); media_labels = bencode_dictionary_add_dictionary(output, "media-labels");
} }
bencode_item_t *from_list = bencode_dictionary_add_list(output, "from-tags"); bencode_item_t *from_list = bencode_dictionary_add_list(output, "from-tags");
for (GList *l = srms.head; l; l = l->next) { for (__auto_type l = srms.head; l; l = l->next) {
struct media_subscription *ms = l->data; struct media_subscription *ms = l->data;
struct call_monologue *source_ml = ms->monologue; struct call_monologue *source_ml = ms->monologue;
bencode_list_add_str_dup(from_list, &source_ml->tag); bencode_list_add_str_dup(from_list, &source_ml->tag);

@ -87,7 +87,7 @@ void cdr_update_entry(call_t * c) {
if (!media) if (!media)
continue; continue;
for (GList * sub = media->media_subscriptions.head; sub; sub = sub->next) for (__auto_type sub = media->media_subscriptions.head; sub; sub = sub->next)
{ {
struct media_subscription * ms = sub->data; struct media_subscription * ms = sub->data;
if (!g_queue_find(&mls, ms->monologue)) { if (!g_queue_find(&mls, ms->monologue)) {

@ -651,7 +651,7 @@ static void cli_list_tag_info(struct cli_writer *cw, struct call_monologue *ml)
if (!media) if (!media)
continue; continue;
for (GList * sub = media->media_subscriptions.head; sub; sub = sub->next) for (__auto_type sub = media->media_subscriptions.head; sub; sub = sub->next)
{ {
struct media_subscription * ms = sub->data; struct media_subscription * ms = sub->data;
struct call_media * sub_media = ms->media; struct call_media * sub_media = ms->media;
@ -662,7 +662,7 @@ static void cli_list_tag_info(struct cli_writer *cw, struct call_monologue *ml)
STR_FMT_M(&ms->monologue->tag), sub_media->index); STR_FMT_M(&ms->monologue->tag), sub_media->index);
} }
for (GList * sub = media->media_subscribers.head; sub; sub = sub->next) for (__auto_type sub = media->media_subscribers.head; sub; sub = sub->next)
{ {
struct media_subscription * ms = sub->data; struct media_subscription * ms = sub->data;
struct call_media * sub_media = ms->media; struct call_media * sub_media = ms->media;

@ -4238,7 +4238,7 @@ void codec_update_all_handlers(struct call_monologue *ml) {
if (!source_media) if (!source_media)
continue; continue;
for (GList * sub = source_media->media_subscribers.head; sub; sub = sub->next) for (__auto_type sub = source_media->media_subscribers.head; sub; sub = sub->next)
{ {
struct media_subscription * ms = sub->data; struct media_subscription * ms = sub->data;
struct call_media * sink_media = ms->media; struct call_media * sink_media = ms->media;
@ -4260,7 +4260,7 @@ void codec_update_all_source_handlers(struct call_monologue *ml, const sdp_ng_fl
if (!sink_media) if (!sink_media)
continue; continue;
for (GList * sub = sink_media->media_subscriptions.head; sub; sub = sub->next) for (__auto_type sub = sink_media->media_subscriptions.head; sub; sub = sub->next)
{ {
struct media_subscription * ms = sub->data; struct media_subscription * ms = sub->data;
struct call_media * source_media = ms->media; struct call_media * source_media = ms->media;

@ -426,7 +426,7 @@ static void janus_publishers_list(JsonBuilder *builder, call_t *call, struct jan
// global janus_lock is held // global janus_lock is held
static const char *janus_videoroom_join_sub(struct janus_handle *handle, struct janus_room *room, int *retcode, static const char *janus_videoroom_join_sub(struct janus_handle *handle, struct janus_room *room, int *retcode,
uint64_t feed_id, call_t *call, GQueue *medias) uint64_t feed_id, call_t *call, subscription_q *medias)
{ {
// does the feed actually exist? get the feed handle // does the feed actually exist? get the feed handle
*retcode = 512; *retcode = 512;
@ -555,7 +555,7 @@ static const char *janus_videoroom_join(struct websocket_message *wm, struct jan
else { else {
// subscriber // subscriber
AUTO_CLEANUP(GQueue srms, media_subscriptions_clear) = G_QUEUE_INIT; g_auto(subscription_q) srms = TYPED_GQUEUE_INIT;
// get single feed ID if there is one // get single feed ID if there is one
if (json_reader_read_member(reader, "feed")) { if (json_reader_read_member(reader, "feed")) {

@ -3067,7 +3067,7 @@ out:
} }
if (phc->unkernelize_subscriptions) { if (phc->unkernelize_subscriptions) {
g_auto(GQueue) mls = G_QUEUE_INIT; /* to avoid duplications */ g_auto(GQueue) mls = G_QUEUE_INIT; /* to avoid duplications */
for (GList * sub = phc->mp.media->media_subscriptions.head; sub; sub = sub->next) for (__auto_type sub = phc->mp.media->media_subscriptions.head; sub; sub = sub->next)
{ {
struct media_subscription * ms = sub->data; struct media_subscription * ms = sub->data;

@ -1760,7 +1760,7 @@ static struct media_subscription *__find_media_subscriber(struct call_media *med
struct call_monologue * find_ml = sink->media->monologue; struct call_monologue * find_ml = sink->media->monologue;
for (GList * subscriber = media->media_subscribers.head; for (__auto_type subscriber = media->media_subscribers.head;
subscriber; subscriber;
subscriber = subscriber->next) subscriber = subscriber->next)
{ {
@ -2562,7 +2562,7 @@ char* redis_encode_json(call_t *c) {
json_builder_set_member_name(builder, tmp); json_builder_set_member_name(builder, tmp);
json_builder_begin_array(builder); json_builder_begin_array(builder);
for (GList * sub = media->media_subscriptions.head; sub; sub = sub->next) for (__auto_type sub = media->media_subscriptions.head; sub; sub = sub->next)
{ {
struct media_subscription * ms = sub->data; struct media_subscription * ms = sub->data;
JSON_ADD_STRING("%u/%u/%u/%u", JSON_ADD_STRING("%u/%u/%u/%u",

@ -267,7 +267,7 @@ static struct ssrc_entry_call *hunt_ssrc(struct call_media *media, uint32_t ssrc
if (!media) if (!media)
return NULL; return NULL;
for (GList * sub = media->media_subscriptions.head; sub; sub = sub->next) for (__auto_type sub = media->media_subscriptions.head; sub; sub = sub->next)
{ {
struct media_subscription * ms = sub->data; struct media_subscription * ms = sub->data;
struct ssrc_entry_call *e = find_ssrc(ssrc, ms->monologue->ssrc_hash); struct ssrc_entry_call *e = find_ssrc(ssrc, ms->monologue->ssrc_hash);

@ -287,6 +287,7 @@ struct rtcp_timer;
struct mqtt_timer; struct mqtt_timer;
struct janus_session; struct janus_session;
struct audio_player; struct audio_player;
struct media_subscription;
typedef bencode_buffer_t call_buffer_t; typedef bencode_buffer_t call_buffer_t;
@ -300,6 +301,9 @@ typedef bencode_buffer_t call_buffer_t;
TYPED_GHASHTABLE(codecs_ht, void, rtp_payload_type, g_direct_hash, g_direct_equal, NULL, NULL) TYPED_GHASHTABLE(codecs_ht, void, rtp_payload_type, g_direct_hash, g_direct_equal, NULL, NULL)
TYPED_GHASHTABLE(codec_names_ht, str, GQueue, str_case_hash, str_case_equal, str_free, g_queue_free) TYPED_GHASHTABLE(codec_names_ht, str, GQueue, str_case_hash, str_case_equal, str_free, g_queue_free)
TYPED_GHASHTABLE_LOOKUP_INSERT(codec_names_ht, str_free, g_queue_new) TYPED_GHASHTABLE_LOOKUP_INSERT(codec_names_ht, str_free, g_queue_new)
TYPED_GQUEUE(subscription, struct media_subscription)
TYPED_GHASHTABLE(subscription_ht, struct call_media, subscription_list, g_direct_hash, g_direct_equal, NULL, NULL)
struct codec_store { struct codec_store {
codecs_ht codecs; // int payload type -> rtp_payload_type codecs_ht codecs; // int payload type -> rtp_payload_type
@ -480,10 +484,10 @@ struct call_media {
unsigned int buffer_delay; unsigned int buffer_delay;
/* media subsriptions handling */ /* media subsriptions handling */
GHashTable * media_subscriptions_ht; /* for quick lookup of our subsriptions */ subscription_ht media_subscriptions_ht; /* for quick lookup of our subsriptions */
GHashTable * media_subscribers_ht; /* for quick lookup of medias subscribed to us */ subscription_ht media_subscribers_ht; /* for quick lookup of medias subscribed to us */
GQueue media_subscribers; /* who is subscribed to this media (sinks) */ subscription_q media_subscribers; /* who is subscribed to this media (sinks) */
GQueue media_subscriptions; /* who am I subscribed to (sources) */ subscription_q media_subscriptions; /* who am I subscribed to (sources) */
mutex_t dtmf_lock; mutex_t dtmf_lock;
unsigned long dtmf_ts; /* TS of last processed end event */ unsigned long dtmf_ts; /* TS of last processed end event */
@ -509,7 +513,7 @@ struct media_subscription {
struct call_media * media; /* media itself */ struct call_media * media; /* media itself */
struct call_monologue * monologue; /* whom media belongs to */ struct call_monologue * monologue; /* whom media belongs to */
struct sink_attrs attrs; /* attributes to passed to a sink */ struct sink_attrs attrs; /* attributes to passed to a sink */
GList * link; /* TODO: is this still really needed? */ subscription_list * link; /* TODO: is this still really needed? */
}; };
/** /**
@ -735,14 +739,15 @@ void __monologue_viabranch(struct call_monologue *ml, const str *viabranch);
struct packet_stream *__packet_stream_new(call_t *call); struct packet_stream *__packet_stream_new(call_t *call);
void __add_media_subscription(struct call_media * which, struct call_media * to, void __add_media_subscription(struct call_media * which, struct call_media * to,
const struct sink_attrs *attrs); const struct sink_attrs *attrs);
struct media_subscription *call_get_media_subscription(GHashTable *ht, struct call_media * cm); struct media_subscription *call_get_media_subscription(subscription_ht ht, struct call_media * cm);
struct media_subscription * call_media_subscribed_to_monologue(const struct call_media * media, struct media_subscription * call_media_subscribed_to_monologue(const struct call_media * media,
const struct call_monologue * monologue); const struct call_monologue * monologue);
void free_sink_handler(struct sink_handler *); void free_sink_handler(struct sink_handler *);
void __add_sink_handler(sink_handler_q *, struct packet_stream *, const struct sink_attrs *); void __add_sink_handler(sink_handler_q *, struct packet_stream *, const struct sink_attrs *);
void media_subscription_free(void *); void media_subscription_free(struct media_subscription *);
void media_subscriptions_clear(GQueue *q); void media_subscriptions_clear(subscription_q *q);
G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(subscription_q, media_subscriptions_clear)
call_t *call_get_or_create(const str *callid, bool exclusive); call_t *call_get_or_create(const str *callid, bool exclusive);
call_t *call_get_opmode(const str *callid, enum call_opmode opmode); call_t *call_get_opmode(const str *callid, enum call_opmode opmode);
@ -760,7 +765,7 @@ void codecs_offer_answer(struct call_media *media, struct call_media *other_medi
struct stream_params *sp, struct stream_params *sp,
sdp_ng_flags *flags); sdp_ng_flags *flags);
int monologue_publish(struct call_monologue *ml, sdp_streams_q *streams, sdp_ng_flags *flags); int monologue_publish(struct call_monologue *ml, sdp_streams_q *streams, sdp_ng_flags *flags);
int monologue_subscribe_request(const GQueue *srms, struct call_monologue *dst, sdp_ng_flags *flags, int monologue_subscribe_request(const subscription_q *srms, struct call_monologue *dst, sdp_ng_flags *flags,
bool print_extra_sess_attrs); bool print_extra_sess_attrs);
int monologue_subscribe_answer(struct call_monologue *dst, sdp_ng_flags *flags, int monologue_subscribe_answer(struct call_monologue *dst, sdp_ng_flags *flags,
sdp_streams_q *streams, bool print_extra_sess_attrs); sdp_streams_q *streams, bool print_extra_sess_attrs);

@ -247,7 +247,7 @@ const char *call_subscribe_request_ng(bencode_item_t *, bencode_item_t *);
const char *call_subscribe_answer_ng(ng_buffer *, bencode_item_t *, bencode_item_t *); const char *call_subscribe_answer_ng(ng_buffer *, bencode_item_t *, bencode_item_t *);
const char *call_unsubscribe_ng(bencode_item_t *, bencode_item_t *); const char *call_unsubscribe_ng(bencode_item_t *, bencode_item_t *);
void add_media_to_sub_list(GQueue *q, struct call_media *media, struct call_monologue *ml); void add_media_to_sub_list(subscription_q *q, struct call_media *media, struct call_monologue *ml);
void save_last_sdp(struct call_monologue *ml, str *sdp, sdp_sessions_q *parsed, sdp_streams_q *streams); void save_last_sdp(struct call_monologue *ml, str *sdp, sdp_sessions_q *parsed, sdp_streams_q *streams);
void call_ng_flags_init(sdp_ng_flags *out, enum call_opmode opmode); void call_ng_flags_init(sdp_ng_flags *out, enum call_opmode opmode);

Loading…
Cancel
Save