Browse Source

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
pull/1776/head
Richard Fuchs 2 years ago
parent
commit
6685fb6efd
10 changed files with 94 additions and 78 deletions
  1. +9
    -9
      daemon/call.c
  2. +17
    -17
      daemon/call_interfaces.c
  3. +7
    -7
      daemon/ice.c
  4. +6
    -6
      daemon/janus.c
  5. +26
    -26
      daemon/sdp.c
  6. +5
    -5
      include/call.h
  7. +1
    -1
      include/call_interfaces.h
  8. +1
    -1
      include/ice.h
  9. +14
    -6
      include/sdp.h
  10. +8
    -0
      include/types.h

+ 9
- 9
daemon/call.c View File

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


+ 17
- 17
daemon/call_interfaces.c View File

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


+ 7
- 7
daemon/ice.c View File

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


+ 6
- 6
daemon/janus.c View File

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


+ 26
- 26
daemon/sdp.c View File

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


+ 5
- 5
include/call.h View File

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


+ 1
- 1
include/call_interfaces.h View File

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


+ 1
- 1
include/ice.h View File

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


+ 14
- 6
include/sdp.h View File

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

+ 8
- 0
include/types.h View File

@ -1,10 +1,18 @@
#ifndef __TYPES__H__
#define __TYPES__H__
#include <glib.h>
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

Loading…
Cancel
Save