From 6685fb6efda71c1e391e3e37a88a4fb91fea89e1 Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Mon, 27 Nov 2023 10:54:05 -0500 Subject: [PATCH] MT#55283 use g_auto for sdp_streams/sessions Introduce sdp_streams_q and sdp_sessions_q as their own types (typed GQueue) Change-Id: Iee99a4ccd9aba57c49d449963a7cd77f8e20adcc --- daemon/call.c | 18 +++++++------- daemon/call_interfaces.c | 34 ++++++++++++------------- daemon/ice.c | 14 +++++------ daemon/janus.c | 12 ++++----- daemon/sdp.c | 52 +++++++++++++++++++-------------------- include/call.h | 10 ++++---- include/call_interfaces.h | 2 +- include/ice.h | 2 +- include/sdp.h | 20 ++++++++++----- include/types.h | 8 ++++++ 10 files changed, 94 insertions(+), 78 deletions(-) diff --git a/daemon/call.c b/daemon/call.c index 9a5fb4c1e..8f8045c05 100644 --- a/daemon/call.c +++ b/daemon/call.c @@ -2814,7 +2814,7 @@ static void media_update_transcoding_flag(struct call_media *media) { } /* called with call->master_lock held in W */ -int monologue_offer_answer(struct call_monologue *monologues[2], GQueue *streams, +int monologue_offer_answer(struct call_monologue *monologues[2], sdp_streams_q *streams, sdp_ng_flags *flags) { struct call_media *media, *other_media; @@ -2839,7 +2839,7 @@ int monologue_offer_answer(struct call_monologue *monologues[2], GQueue *streams __C_DBG("this="STR_FORMAT" other="STR_FORMAT, STR_FMT(&monologue->tag), STR_FMT(&other_ml->tag)); - for (GList *sp_iter = streams->head; sp_iter; sp_iter = sp_iter->next) { + for (__auto_type sp_iter = streams->head; sp_iter; sp_iter = sp_iter->next) { struct stream_params *sp = sp_iter->data; __C_DBG("processing media stream #%u", sp->index); assert(sp->index > 0); @@ -3185,13 +3185,13 @@ struct media_subscription *call_get_media_subscription(GHashTable *ht, struct ca /* called with call->master_lock held in W */ __attribute__((nonnull(1, 2, 3))) -int monologue_publish(struct call_monologue *ml, GQueue *streams, sdp_ng_flags *flags) { +int monologue_publish(struct call_monologue *ml, sdp_streams_q *streams, sdp_ng_flags *flags) { __call_monologue_init_from_flags(ml, flags); if (flags->exclude_recording) ML_SET(ml, NO_RECORDING); - for (GList *l = streams->head; l; l = l->next) { + for (__auto_type l = streams->head; l; l = l->next) { struct stream_params *sp = l->data; struct call_media *media = __get_media(ml, sp, flags, 0); @@ -3260,7 +3260,7 @@ static int monologue_subscribe_request1(struct call_monologue *src_ml, struct ca if (print_extra_sess_attrs) sdp_copy_session_attributes(src_ml, dst_ml); - for (GList *l = src_ml->last_in_sdp_streams.head; l; l = l->next) { + for (__auto_type l = src_ml->last_in_sdp_streams.head; l; l = l->next) { struct stream_params *sp = l->data; struct call_media *dst_media = __get_media(dst_ml, sp, flags, (*index)++); @@ -3357,13 +3357,13 @@ int monologue_subscribe_request(const GQueue *srms, struct call_monologue *dst_m /* called with call->master_lock held in W */ __attribute__((nonnull(1, 2, 3))) -int monologue_subscribe_answer(struct call_monologue *dst_ml, sdp_ng_flags *flags, GQueue *streams, +int monologue_subscribe_answer(struct call_monologue *dst_ml, sdp_ng_flags *flags, sdp_streams_q *streams, bool print_extra_sess_attrs) { struct media_subscription *rev_ms = NULL; g_auto(GQueue) attr_mls = G_QUEUE_INIT; /* to avoid duplications */ - for (GList * l = streams->head; l; l = l->next) + for (__auto_type l = streams->head; l; l = l->next) { struct stream_params * sp = l->data; struct call_media * dst_media = __get_media(dst_ml, sp, flags, 0); @@ -3883,9 +3883,9 @@ void __monologue_free(struct call_monologue *m) { if (m->last_out_sdp) g_string_free(m->last_out_sdp, TRUE); str_free_dup(&m->last_in_sdp); - sdp_free(&m->last_in_sdp_parsed); + sdp_sessions_clear(&m->last_in_sdp_parsed); g_queue_clear_full(&m->sdp_attributes, free); - sdp_streams_free(&m->last_in_sdp_streams); + sdp_streams_clear(&m->last_in_sdp_streams); g_slice_free1(sizeof(*m), m); } diff --git a/daemon/call_interfaces.c b/daemon/call_interfaces.c index 29a5f2a3f..2311bb8f3 100644 --- a/daemon/call_interfaces.c +++ b/daemon/call_interfaces.c @@ -174,7 +174,7 @@ static str *call_update_lookup_udp(char **out, enum call_opmode opmode, const ch { struct call *c; struct call_monologue *monologues[2]; /* subscriber lists of both monologues */ - GQueue q = G_QUEUE_INIT; + sdp_streams_q q = TYPED_GQUEUE_INIT; struct stream_params sp; str *ret; int i; @@ -209,9 +209,9 @@ static str *call_update_lookup_udp(char **out, enum call_opmode opmode, const ch if (addr_parse_udp(&sp, out)) goto addr_fail; - g_queue_push_tail(&q, &sp); + t_queue_push_tail(&q, &sp); i = monologue_offer_answer(monologues, &q, NULL); - g_queue_clear(&q); + t_queue_clear(&q); if (i) goto unlock_fail; @@ -304,10 +304,10 @@ fail: } -static void streams_parse(const char *s, GQueue *q) { +static void streams_parse(const char *s, sdp_streams_q *q) { int i; i = 0; - pcre2_multi_match(streams_re, s, 4, streams_parse_func, &i, q); + pcre2_multi_match(streams_re, s, 4, streams_parse_func, &i, &q->q); } void call_unlock_release(struct call **c) { if (!*c) @@ -329,7 +329,7 @@ INLINE void call_unlock_release_update(struct call **c) { static str *call_request_lookup_tcp(char **out, enum call_opmode opmode) { struct call *c; struct call_monologue *monologues[2]; - AUTO_CLEANUP(GQueue s, sdp_streams_free) = G_QUEUE_INIT; + g_auto(sdp_streams_q) s = TYPED_GQUEUE_INIT; str *ret = NULL; GHashTable *infohash; @@ -1945,18 +1945,18 @@ static enum load_limit_reasons call_offer_session_limit(void) { } -void save_last_sdp(struct call_monologue *ml, str *sdp, GQueue *parsed, GQueue *streams) { +void save_last_sdp(struct call_monologue *ml, str *sdp, sdp_sessions_q *parsed, sdp_streams_q *streams) { str_free_dup(&ml->last_in_sdp); ml->last_in_sdp = *sdp; *sdp = STR_NULL; - sdp_free(&ml->last_in_sdp_parsed); + sdp_sessions_clear(&ml->last_in_sdp_parsed); ml->last_in_sdp_parsed = *parsed; - g_queue_init(parsed); + t_queue_init(parsed); - sdp_streams_free(&ml->last_in_sdp_streams); + sdp_streams_clear(&ml->last_in_sdp_streams); ml->last_in_sdp_streams = *streams; - g_queue_init(streams); + t_queue_init(streams); } @@ -1966,8 +1966,8 @@ static const char *call_offer_answer_ng(ng_buffer *ngbuf, bencode_item_t *input, { const char *errstr; g_auto(str) sdp = STR_NULL; - AUTO_CLEANUP(GQueue parsed, sdp_free) = G_QUEUE_INIT; - AUTO_CLEANUP(GQueue streams, sdp_streams_free) = G_QUEUE_INIT; + g_auto(sdp_sessions_q) parsed = TYPED_GQUEUE_INIT; + g_auto(sdp_streams_q) streams = TYPED_GQUEUE_INIT; AUTO_CLEANUP_NULL(struct call *call, call_unlock_release); struct call_monologue * monologues[2]; int ret; @@ -3402,8 +3402,8 @@ const char *call_publish_ng(ng_buffer *ngbuf, bencode_item_t *input, bencode_ite const endpoint_t *sin) { g_auto(sdp_ng_flags) flags; - AUTO_CLEANUP(GQueue parsed, sdp_free) = G_QUEUE_INIT; - AUTO_CLEANUP(GQueue streams, sdp_streams_free) = G_QUEUE_INIT; + g_auto(sdp_sessions_q) parsed = TYPED_GQUEUE_INIT; + g_auto(sdp_streams_q) streams = TYPED_GQUEUE_INIT; g_auto(str) sdp_in = STR_NULL; g_auto(str) sdp_out = STR_NULL; AUTO_CLEANUP_NULL(struct call *call, call_unlock_release); @@ -3591,8 +3591,8 @@ const char *call_subscribe_request_ng(bencode_item_t *input, bencode_item_t *out const char *call_subscribe_answer_ng(ng_buffer *ngbuf, bencode_item_t *input, bencode_item_t *output) { g_auto(sdp_ng_flags) flags; - AUTO_CLEANUP(GQueue parsed, sdp_free) = G_QUEUE_INIT; - AUTO_CLEANUP(GQueue streams, sdp_streams_free) = G_QUEUE_INIT; + g_auto(sdp_sessions_q) parsed = TYPED_GQUEUE_INIT; + g_auto(sdp_streams_q) streams = TYPED_GQUEUE_INIT; AUTO_CLEANUP_NULL(struct call *call, call_unlock_release); call_ng_process_flags(&flags, input, OP_REQ_ANSWER); diff --git a/daemon/ice.c b/daemon/ice.c index 2bd64d5a7..64af17b36 100644 --- a/daemon/ice.c +++ b/daemon/ice.c @@ -46,7 +46,7 @@ struct fragment_key { struct sdp_fragment { ng_buffer *ngbuf; struct timeval received; - GQueue streams; + sdp_streams_q streams; sdp_ng_flags flags; }; @@ -98,8 +98,8 @@ static GHashTable *sdp_fragments; -static void ice_update_media_streams(struct call_monologue *ml, GQueue *streams) { - for (GList *l = streams->head; l; l = l->next) { +static void ice_update_media_streams(struct call_monologue *ml, sdp_streams_q *streams) { + for (__auto_type l = streams->head; l; l = l->next) { struct stream_params *sp = l->data; struct call_media *media = NULL; @@ -142,7 +142,7 @@ static int frag_key_eq(const void *A, const void *B) { } static void fragment_free(struct sdp_fragment *frag) { - sdp_streams_free(&frag->streams); + sdp_streams_clear(&frag->streams); call_ng_free_flags(&frag->flags); obj_put(frag->ngbuf); g_slice_free1(sizeof(*frag), frag); @@ -153,7 +153,7 @@ static void fragment_key_free(void *p) { g_free(k->from_tag.s); g_slice_free1(sizeof(*k), k); } -static void queue_sdp_fragment(ng_buffer *ngbuf, GQueue *streams, sdp_ng_flags *flags) { +static void queue_sdp_fragment(ng_buffer *ngbuf, sdp_streams_q *streams, sdp_ng_flags *flags) { ilog(LOG_DEBUG, "Queuing up SDP fragment for " STR_FORMAT_M "/" STR_FORMAT_M, STR_FMT_M(&flags->call_id), STR_FMT_M(&flags->from_tag)); @@ -166,7 +166,7 @@ static void queue_sdp_fragment(ng_buffer *ngbuf, GQueue *streams, sdp_ng_flags * frag->ngbuf = obj_get(ngbuf); frag->streams = *streams; frag->flags = *flags; - g_queue_init(streams); + t_queue_init(streams); ZERO(*flags); mutex_lock(&sdp_fragments_lock); @@ -175,7 +175,7 @@ static void queue_sdp_fragment(ng_buffer *ngbuf, GQueue *streams, sdp_ng_flags * mutex_unlock(&sdp_fragments_lock); } bool trickle_ice_update(ng_buffer *ngbuf, struct call *call, sdp_ng_flags *flags, - GQueue *streams) + sdp_streams_q *streams) { if (!flags->fragment) return false; diff --git a/daemon/janus.c b/daemon/janus.c index cec5e2d8e..0d03d40bb 100644 --- a/daemon/janus.c +++ b/daemon/janus.c @@ -860,8 +860,8 @@ static const char *janus_videoroom_configure(struct websocket_message *wm, struc g_auto(str) sdp_in = STR_INIT_DUP(jsep_sdp); g_auto(sdp_ng_flags) flags; - AUTO_CLEANUP(GQueue parsed, sdp_free) = G_QUEUE_INIT; - AUTO_CLEANUP(GQueue streams, sdp_streams_free) = G_QUEUE_INIT; + g_auto(sdp_sessions_q) parsed = TYPED_GQUEUE_INIT; + g_auto(sdp_streams_q) streams = TYPED_GQUEUE_INIT; call_ng_flags_init(&flags, OP_PUBLISH); *retcode = 512; if (sdp_parse(&sdp_in, &parsed, &flags)) @@ -964,8 +964,8 @@ static const char *janus_videoroom_start(struct websocket_message *wm, struct ja g_auto(str) sdp_in = STR_INIT_DUP(jsep_sdp); g_auto(sdp_ng_flags) flags; - AUTO_CLEANUP(GQueue parsed, sdp_free) = G_QUEUE_INIT; - AUTO_CLEANUP(GQueue streams, sdp_streams_free) = G_QUEUE_INIT; + g_auto(sdp_sessions_q) parsed = TYPED_GQUEUE_INIT; + g_auto(sdp_streams_q) streams = TYPED_GQUEUE_INIT; call_ng_flags_init(&flags, OP_PUBLISH); *retcode = 512; if (sdp_parse(&sdp_in, &parsed, &flags)) @@ -1630,14 +1630,14 @@ static const char *janus_trickle(JsonReader *reader, struct janus_session *sessi *successp = "ack"; // top-level structures first, with auto cleanup - AUTO_CLEANUP(GQueue streams, sdp_streams_free) = G_QUEUE_INIT; + g_auto(sdp_streams_q) streams = TYPED_GQUEUE_INIT; g_autoptr(ng_buffer) ngbuf = ng_buffer_new(NULL); g_auto(sdp_ng_flags) flags; call_ng_flags_init(&flags, OP_OTHER); // then the contained structures, and add them in struct stream_params *sp = g_slice_alloc0(sizeof(*sp)); - g_queue_push_tail(&streams, sp); + t_queue_push_tail(&streams, sp); struct ice_candidate *cand = g_slice_alloc0(sizeof(*cand)); g_queue_push_tail(&sp->ice_candidates, cand); diff --git a/daemon/sdp.c b/daemon/sdp.c index 7ab5fe1d0..cc15a23ab 100644 --- a/daemon/sdp.c +++ b/daemon/sdp.c @@ -1211,7 +1211,7 @@ static int parse_attribute(struct sdp_attribute *a) { return ret; } -int sdp_parse(str *body, GQueue *sessions, const sdp_ng_flags *flags) { +int sdp_parse(str *body, sdp_sessions_q *sessions, const sdp_ng_flags *flags) { char *b, *end, *value, *line_end, *next_line; struct sdp_session *session = NULL; struct sdp_media *media = NULL; @@ -1269,7 +1269,7 @@ new_session: session = g_slice_alloc0(sizeof(*session)); g_queue_init(&session->media_streams); attrs_init(&session->attributes); - g_queue_push_tail(sessions, session); + t_queue_push_tail(sessions, session); media = NULL; session->s.s = b; session->rr = session->rs = -1; @@ -1387,7 +1387,7 @@ new_session: error: ilog(LOG_WARNING, "Error parsing SDP at offset %li: %s", (long) (b - body->s), errstr); - sdp_free(sessions); + sdp_sessions_clear(sessions); return -1; } @@ -1407,14 +1407,13 @@ static void media_free(void *p) { g_queue_clear_full(&media->format_list, str_slice_free); g_slice_free1(sizeof(*media), media); } -static void session_free(void *p) { - struct sdp_session *session = p; +static void session_free(struct sdp_session *session) { g_queue_clear_full(&session->media_streams, media_free); free_attributes(&session->attributes); g_slice_free1(sizeof(*session), session); } -void sdp_free(GQueue *sessions) { - g_queue_clear_full(sessions, session_free); +void sdp_sessions_clear(sdp_sessions_q *sessions) { + t_queue_clear_full(sessions, session_free); } static int fill_endpoint(struct endpoint *ep, const struct sdp_media *media, sdp_ng_flags *flags, @@ -1647,9 +1646,7 @@ static void __sdp_t38(struct stream_params *sp, struct sdp_media *media) { } -static void sp_free(void *p) { - struct stream_params *s = p; - +static void sp_free(struct stream_params *s) { codec_store_cleanup(&s->codecs); ice_candidates_free(&s->ice_candidates); crypto_params_sdes_queue_clear(&s->sdes_params); @@ -1669,7 +1666,7 @@ static void sp_free(void *p) { // the indexing to be in order and instead of requiring all sections between monologue and sdp_media // lists to be matching. // returns: discard this `sp` yes/no -static bool legacy_osrtp_accept(struct stream_params *sp, GQueue *streams, GList *media_link, +static bool legacy_osrtp_accept(struct stream_params *sp, sdp_streams_q *streams, GList *media_link, sdp_ng_flags *flags, unsigned int *num) { if (!streams->tail) @@ -1701,7 +1698,7 @@ static bool legacy_osrtp_accept(struct stream_params *sp, GQueue *streams, GList // is this a non-rejected SRTP section? if (sp->rtp_endpoint.port) { // looks ok. remove the previous one and only retain this one. mark it as such. - g_queue_pop_tail(streams); + t_queue_pop_tail(streams); sp_free(last); SP_SET(sp, LEGACY_OSRTP); @@ -1739,17 +1736,17 @@ static bool legacy_osrtp_accept(struct stream_params *sp, GQueue *streams, GList } /* XXX split this function up */ -int sdp_streams(const GQueue *sessions, GQueue *streams, sdp_ng_flags *flags) { +int sdp_streams(const sdp_sessions_q *sessions, sdp_streams_q *streams, sdp_ng_flags *flags) { struct sdp_session *session; struct sdp_media *media; struct stream_params *sp; - GList *l, *k; + GList *k; const char *errstr; unsigned int num = 0; struct sdp_attribute *attr; GQueue *attrs; - for (l = sessions->head; l; l = l->next) { + for (__auto_type l = sessions->head; l; l = l->next) { session = l->data; for (k = session->media_streams.head; k; k = k->next) { @@ -1949,7 +1946,7 @@ int sdp_streams(const GQueue *sessions, GQueue *streams, sdp_ng_flags *flags) { goto error; next: - g_queue_push_tail(streams, sp); + t_queue_push_tail(streams, sp); } } @@ -1961,8 +1958,8 @@ error: return -1; } -void sdp_streams_free(GQueue *q) { - g_queue_clear_full(q, sp_free); +void sdp_streams_clear(sdp_streams_q *q) { + t_queue_clear_full(q, sp_free); } @@ -2888,13 +2885,15 @@ static void insert_rtcp_attr(GString *s, struct packet_stream *ps, sdp_ng_flags } -static void sdp_version_replace(struct sdp_chopper *chop, GQueue *sessions, struct call_monologue *monologue) { +static void sdp_version_replace(struct sdp_chopper *chop, sdp_sessions_q *sessions, + struct call_monologue *monologue) +{ char version_str[64]; snprintf(version_str, sizeof(version_str), "%llu", monologue->sdp_version); size_t version_len = strlen(version_str); chop->offset = 0; // start from the top - for (GList *l = sessions->head; l; l = l->next) { + for (__auto_type l = sessions->head; l; l = l->next) { struct sdp_session *session = l->data; struct sdp_origin *origin = &session->origin; // update string unconditionally to keep position tracking intact @@ -2902,7 +2901,8 @@ static void sdp_version_replace(struct sdp_chopper *chop, GQueue *sessions, stru } } -static void sdp_version_check(struct sdp_chopper *chop, GQueue *sessions, struct call_monologue *monologue, +static void sdp_version_check(struct sdp_chopper *chop, sdp_sessions_q *sessions, + struct call_monologue *monologue, unsigned int force_increase) { /* We really expect only a single session here, but we treat all the same regardless, * and use the same version number on all of them */ @@ -3202,12 +3202,12 @@ error: /* called with call->master_lock held in W */ -int sdp_replace(struct sdp_chopper *chop, GQueue *sessions, struct call_monologue *monologue, +int sdp_replace(struct sdp_chopper *chop, sdp_sessions_q *sessions, struct call_monologue *monologue, sdp_ng_flags *flags, bool print_other_attrs) { struct sdp_session *session; struct sdp_media *sdp_media; - GList *l, *k, *rtp_ps_link; + GList *k, *rtp_ps_link; int sess_conn; struct call_media *call_media; struct packet_stream *ps; @@ -3215,7 +3215,7 @@ int sdp_replace(struct sdp_chopper *chop, GQueue *sessions, struct call_monologu unsigned int media_index = 0; - for (l = sessions->head; l; l = l->next) { + for (__auto_type l = sessions->head; l; l = l->next) { session = l->data; // look for first usable (non-rejected, non-empty) packet stream @@ -3503,8 +3503,8 @@ err: return -1; } -int sdp_is_duplicate(GQueue *sessions) { - for (GList *l = sessions->head; l; l = l->next) { +int sdp_is_duplicate(sdp_sessions_q *sessions) { + for (__auto_type l = sessions->head; l; l = l->next) { struct sdp_session *s = l->data; GQueue *attr_list = attr_list_get_by_id(&s->attributes, ATTR_RTPENGINE); if (!attr_list) diff --git a/include/call.h b/include/call.h index 150bee63b..796f4fd5a 100644 --- a/include/call.h +++ b/include/call.h @@ -537,8 +537,8 @@ struct call_monologue { unsigned long long sdp_session_id; unsigned long long sdp_version; str last_in_sdp; - GQueue last_in_sdp_parsed; /* last parsed `sdp_session` */ - GQueue last_in_sdp_streams; /* last parsed `stream_params` */ + sdp_sessions_q last_in_sdp_parsed; /* last parsed `sdp_session` */ + sdp_streams_q last_in_sdp_streams; /* last parsed `stream_params` */ GString *last_out_sdp; char *sdp_username; char *sdp_session_name; @@ -737,16 +737,16 @@ int call_get_mono_dialogue(struct call_monologue *monologues[2], struct call *ca struct call_monologue *call_get_monologue(struct call *call, const str *fromtag); struct call_monologue *call_get_or_create_monologue(struct call *call, const str *fromtag); struct call *call_get(const str *callid); -int monologue_offer_answer(struct call_monologue *monologues[2], GQueue *streams, sdp_ng_flags *flags); +int monologue_offer_answer(struct call_monologue *monologues[2], sdp_streams_q *streams, sdp_ng_flags *flags); __attribute__((nonnull(1, 2, 3))) void codecs_offer_answer(struct call_media *media, struct call_media *other_media, struct stream_params *sp, sdp_ng_flags *flags); -int monologue_publish(struct call_monologue *ml, GQueue *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, bool print_extra_sess_attrs); int monologue_subscribe_answer(struct call_monologue *dst, sdp_ng_flags *flags, - GQueue *streams, bool print_extra_sess_attrs); + sdp_streams_q *streams, bool print_extra_sess_attrs); int monologue_unsubscribe(struct call_monologue *dst, sdp_ng_flags *); void monologue_destroy(struct call_monologue *ml); int call_delete_branch_by_id(const str *callid, const str *branch, diff --git a/include/call_interfaces.h b/include/call_interfaces.h index 38e89e3a0..9a8f976fc 100644 --- a/include/call_interfaces.h +++ b/include/call_interfaces.h @@ -250,7 +250,7 @@ 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 save_last_sdp(struct call_monologue *ml, str *sdp, GQueue *parsed, GQueue *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_free_flags(sdp_ng_flags *flags); void call_unlock_release(struct call **c); diff --git a/include/ice.h b/include/ice.h index 1b7c8d7e8..9484fa754 100644 --- a/include/ice.h +++ b/include/ice.h @@ -171,7 +171,7 @@ int ice_response(struct stream_fd *, const endpoint_t *src, void dequeue_sdp_fragments(struct call_monologue *); bool trickle_ice_update(ng_buffer *ngbuf, struct call *call, sdp_ng_flags *flags, - GQueue *streams); + sdp_streams_q *streams); enum thread_looper_action ice_slow_timer(void); diff --git a/include/sdp.h b/include/sdp.h index f02883637..d5944e786 100644 --- a/include/sdp.h +++ b/include/sdp.h @@ -6,6 +6,7 @@ #include "str.h" #include "call.h" #include "media_socket.h" +#include "types.h" /* A structure for SDP arbitrary manipulations on all levels of SDP: * session (global), media (audio/video). Works only on `a=` lines. @@ -25,17 +26,18 @@ struct sdp_chopper { ssize_t offset; // for post-processing using chopper_replace }; + extern const str rtpe_instance_id; void sdp_init(void); -int sdp_parse(str *body, GQueue *sessions, const sdp_ng_flags *); -int sdp_streams(const GQueue *sessions, GQueue *streams, sdp_ng_flags *); -void sdp_streams_free(GQueue *); -void sdp_free(GQueue *sessions); -int sdp_replace(struct sdp_chopper *, GQueue *, struct call_monologue *, sdp_ng_flags *, +int sdp_parse(str *body, sdp_sessions_q *sessions, const sdp_ng_flags *); +int sdp_streams(const sdp_sessions_q *sessions, sdp_streams_q *streams, sdp_ng_flags *); +void sdp_streams_clear(sdp_streams_q *); +void sdp_sessions_clear(sdp_sessions_q *sessions); +int sdp_replace(struct sdp_chopper *, sdp_sessions_q *, struct call_monologue *, sdp_ng_flags *, bool print_other_attrs); -int sdp_is_duplicate(GQueue *sessions); +int sdp_is_duplicate(sdp_sessions_q *sessions); int sdp_create(str *out, struct call_monologue *, sdp_ng_flags *flags, bool print_other_sess_attrs, bool print_other_media_attrs); const char *sdp_get_sendrecv(struct call_media *media); @@ -48,10 +50,16 @@ void sdp_chopper_destroy_ret(struct sdp_chopper *chop, str *ret); void sdp_copy_session_attributes(struct call_monologue * src, struct call_monologue * dst); + +G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(sdp_streams_q, sdp_streams_clear) +G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(sdp_sessions_q, sdp_sessions_clear) + + INLINE int is_trickle_ice_address(const struct endpoint *ep) { if (is_addr_unspecified(&ep->address) && ep->port == 9) return 1; return 0; } + #endif diff --git a/include/types.h b/include/types.h index f0f4f2dbe..ee1a063c0 100644 --- a/include/types.h +++ b/include/types.h @@ -1,10 +1,18 @@ #ifndef __TYPES__H__ #define __TYPES__H__ +#include + typedef struct sdp_ng_flags sdp_ng_flags; typedef struct stats_metric stats_metric; typedef struct ng_buffer ng_buffer; #include "containers.h" +struct sdp_session; +TYPED_GQUEUE(sdp_sessions, struct sdp_session) + +struct stream_params; +TYPED_GQUEUE(sdp_streams, struct stream_params) + #endif