|
|
|
@ -13,10 +13,9 @@ struct poller *rtpe_poller;
|
|
|
|
GString *dtmf_logs;
|
|
|
|
GString *dtmf_logs;
|
|
|
|
|
|
|
|
|
|
|
|
static str *sdup(char *s) {
|
|
|
|
static str *sdup(char *s) {
|
|
|
|
str *r = g_slice_alloc(sizeof(*r));
|
|
|
|
str r;
|
|
|
|
char *d = strdup(s);
|
|
|
|
str_init(&r, s);
|
|
|
|
str_init(r, d);
|
|
|
|
return str_dup(&r);
|
|
|
|
return r;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
static void queue_dump(GString *s, GQueue *q) {
|
|
|
|
static void queue_dump(GString *s, GQueue *q) {
|
|
|
|
for (GList *l = q->head; l; l = l->next) {
|
|
|
|
for (GList *l = q->head; l; l = l->next) {
|
|
|
|
@ -67,9 +66,10 @@ static void __start(const char *file, int line) {
|
|
|
|
media_B->monologue = &ml_B;
|
|
|
|
media_B->monologue = &ml_B;
|
|
|
|
media_B->protocol = &transport_protocols[PROTO_RTP_AVP];
|
|
|
|
media_B->protocol = &transport_protocols[PROTO_RTP_AVP];
|
|
|
|
g_queue_init(&rtp_types); // parsed from received SDP
|
|
|
|
g_queue_init(&rtp_types); // parsed from received SDP
|
|
|
|
flags.codec_strip = g_hash_table_new_full(str_hash, str_equal, str_slice_free, NULL);
|
|
|
|
flags.codec_strip = g_hash_table_new_full(str_case_hash, str_case_equal, free, NULL);
|
|
|
|
flags.codec_mask = g_hash_table_new_full(str_hash, str_equal, str_slice_free, NULL);
|
|
|
|
flags.codec_mask = g_hash_table_new_full(str_case_hash, str_case_equal, free, NULL);
|
|
|
|
flags.codec_set = g_hash_table_new_full(str_hash, str_equal, str_slice_free, NULL);
|
|
|
|
flags.codec_except = g_hash_table_new_full(str_case_hash, str_case_equal, free, NULL);
|
|
|
|
|
|
|
|
flags.codec_set = g_hash_table_new_full(str_case_hash, str_case_equal, free, free);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#define transcode(codec) g_queue_push_tail(&flags.codec_transcode, sdup(#codec))
|
|
|
|
#define transcode(codec) g_queue_push_tail(&flags.codec_transcode, sdup(#codec))
|
|
|
|
@ -83,7 +83,7 @@ static void codec_set(char *c) {
|
|
|
|
str splitter = s;
|
|
|
|
str splitter = s;
|
|
|
|
|
|
|
|
|
|
|
|
while (1) {
|
|
|
|
while (1) {
|
|
|
|
g_hash_table_replace(flags.codec_set, str_slice_dup(&splitter), str_slice_dup(&s));
|
|
|
|
g_hash_table_replace(flags.codec_set, str_dup(&splitter), str_dup(&s));
|
|
|
|
char *c = memrchr(splitter.s, '/', splitter.len);
|
|
|
|
char *c = memrchr(splitter.s, '/', splitter.len);
|
|
|
|
if (!c)
|
|
|
|
if (!c)
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
@ -107,16 +107,22 @@ static void __sdp_pt_fmt(int num, str codec, int clockrate, str full_codec, str
|
|
|
|
|
|
|
|
|
|
|
|
static void offer(void) {
|
|
|
|
static void offer(void) {
|
|
|
|
printf("offer\n");
|
|
|
|
printf("offer\n");
|
|
|
|
|
|
|
|
codec_tracker_init(media_B);
|
|
|
|
codec_rtp_payload_types(media_B, media_A, &rtp_types, &flags);
|
|
|
|
codec_rtp_payload_types(media_B, media_A, &rtp_types, &flags);
|
|
|
|
codec_handlers_update(media_B, media_A, &flags, NULL);
|
|
|
|
codec_handlers_update(media_B, media_A, &flags, NULL);
|
|
|
|
|
|
|
|
codec_tracker_finish(media_B);
|
|
|
|
g_queue_clear(&rtp_types);
|
|
|
|
g_queue_clear(&rtp_types);
|
|
|
|
memset(&flags, 0, sizeof(flags));
|
|
|
|
memset(&flags, 0, sizeof(flags));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void answer(void) {
|
|
|
|
static void answer(void) {
|
|
|
|
printf("answer\n");
|
|
|
|
printf("answer\n");
|
|
|
|
|
|
|
|
codec_tracker_init(media_A);
|
|
|
|
codec_rtp_payload_types(media_A, media_B, &rtp_types, &flags);
|
|
|
|
codec_rtp_payload_types(media_A, media_B, &rtp_types, &flags);
|
|
|
|
codec_handlers_update(media_A, media_B, &flags, NULL);
|
|
|
|
codec_handlers_update(media_A, media_B, &flags, NULL);
|
|
|
|
|
|
|
|
codec_tracker_finish(media_A);
|
|
|
|
|
|
|
|
g_queue_clear(&rtp_types);
|
|
|
|
|
|
|
|
memset(&flags, 0, sizeof(flags));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#define expect(side, dir, codecs) \
|
|
|
|
#define expect(side, dir, codecs) \
|
|
|
|
|