|
|
|
|
@ -623,7 +623,7 @@ static void __symmetric_codecs(struct call_media *receiver, struct call_media *s
|
|
|
|
|
// add it to the list
|
|
|
|
|
ilog(LOG_DEBUG, "Adding symmetric RTP payload type %i", pt->payload_type);
|
|
|
|
|
g_hash_table_steal(prefs_recv, GINT_TO_POINTER(pt->payload_type));
|
|
|
|
|
__rtp_payload_type_add_recv(receiver, out_pt);
|
|
|
|
|
__rtp_payload_type_add_recv(receiver, out_pt, 1);
|
|
|
|
|
// and our send leg
|
|
|
|
|
out_pt = g_hash_table_lookup(prefs_send, GINT_TO_POINTER(pt->payload_type));
|
|
|
|
|
if (out_pt) {
|
|
|
|
|
@ -648,7 +648,7 @@ static void __symmetric_codecs(struct call_media *receiver, struct call_media *s
|
|
|
|
|
if (!out_pt)
|
|
|
|
|
continue;
|
|
|
|
|
g_hash_table_steal(prefs_recv, ptype);
|
|
|
|
|
__rtp_payload_type_add_recv(receiver, out_pt);
|
|
|
|
|
__rtp_payload_type_add_recv(receiver, out_pt, 1);
|
|
|
|
|
}
|
|
|
|
|
while (prefs_send_order.length) {
|
|
|
|
|
void *ptype = g_queue_pop_head(&prefs_send_order);
|
|
|
|
|
@ -2187,12 +2187,42 @@ static void __rtp_payload_type_add_name(GHashTable *ht, struct rtp_payload_type
|
|
|
|
|
q = g_hash_table_lookup_queue_new(ht, &pt->encoding_with_params);
|
|
|
|
|
g_queue_push_tail(q, GUINT_TO_POINTER(pt->payload_type));
|
|
|
|
|
}
|
|
|
|
|
static void __queue_insert_supp(GQueue *q, struct rtp_payload_type *pt, int supp_check) {
|
|
|
|
|
// do we care at all?
|
|
|
|
|
if (!supp_check) {
|
|
|
|
|
g_queue_push_tail(q, pt);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// all new supp codecs go last
|
|
|
|
|
if (pt->codec_def && pt->codec_def->supplemental) {
|
|
|
|
|
g_queue_push_tail(q, pt);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// find the cut-off point between non-supp and supp codecs
|
|
|
|
|
GList *insert_pos = NULL; // last non-supp codec
|
|
|
|
|
for (GList *l = q->tail; l; l = l->prev) {
|
|
|
|
|
struct rtp_payload_type *ptt = l->data;
|
|
|
|
|
if (!ptt->codec_def || !ptt->codec_def->supplemental) {
|
|
|
|
|
insert_pos = l;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// do we have any non-supp codecs?
|
|
|
|
|
if (!insert_pos) {
|
|
|
|
|
g_queue_push_head(q, pt);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
g_queue_insert_after(q, insert_pos, pt);
|
|
|
|
|
}
|
|
|
|
|
// consumes 'pt'
|
|
|
|
|
void __rtp_payload_type_add_recv(struct call_media *media,
|
|
|
|
|
struct rtp_payload_type *pt)
|
|
|
|
|
struct rtp_payload_type *pt, int supp_check)
|
|
|
|
|
{
|
|
|
|
|
if (!pt)
|
|
|
|
|
return;
|
|
|
|
|
ensure_codec_def(pt, media);
|
|
|
|
|
if (proto_is_not_rtp(media->protocol)) {
|
|
|
|
|
payload_type_free(pt);
|
|
|
|
|
return;
|
|
|
|
|
@ -2202,7 +2232,7 @@ void __rtp_payload_type_add_recv(struct call_media *media,
|
|
|
|
|
pt->ptime = media->ptime;
|
|
|
|
|
g_hash_table_insert(media->codecs_recv, &pt->payload_type, pt);
|
|
|
|
|
__rtp_payload_type_add_name(media->codec_names_recv, pt);
|
|
|
|
|
g_queue_push_tail(&media->codecs_prefs_recv, pt);
|
|
|
|
|
__queue_insert_supp(&media->codecs_prefs_recv, pt, supp_check);
|
|
|
|
|
}
|
|
|
|
|
// consumes 'pt'
|
|
|
|
|
void __rtp_payload_type_add_send(struct call_media *other_media,
|
|
|
|
|
@ -2235,7 +2265,7 @@ static void __rtp_payload_type_add(struct call_media *media, struct call_media *
|
|
|
|
|
struct rtp_payload_type *pt)
|
|
|
|
|
{
|
|
|
|
|
__rtp_payload_type_add_send_dup(other_media, pt);
|
|
|
|
|
__rtp_payload_type_add_recv(media, pt);
|
|
|
|
|
__rtp_payload_type_add_recv(media, pt, 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void __payload_queue_free(void *qq) {
|
|
|
|
|
@ -2396,7 +2426,7 @@ void codec_rtp_payload_types(struct call_media *media, struct call_media *other_
|
|
|
|
|
|
|
|
|
|
ilog(LOG_DEBUG, "Codec '" STR_FORMAT "' added for transcoding with payload type %u",
|
|
|
|
|
STR_FMT(&pt->encoding_with_params), pt->payload_type);
|
|
|
|
|
__rtp_payload_type_add_recv(media, pt);
|
|
|
|
|
__rtp_payload_type_add_recv(media, pt, 1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (media->type_id == MT_AUDIO && other_media->type_id == MT_IMAGE) {
|
|
|
|
|
@ -2412,7 +2442,7 @@ void codec_rtp_payload_types(struct call_media *media, struct call_media *other_
|
|
|
|
|
if (media->t38_gateway && media->t38_gateway->pcm_player
|
|
|
|
|
&& media->t38_gateway->pcm_player->handler)
|
|
|
|
|
__rtp_payload_type_add_recv(media,
|
|
|
|
|
__rtp_payload_type_copy(&media->t38_gateway->pcm_player->handler->dest_pt));
|
|
|
|
|
__rtp_payload_type_copy(&media->t38_gateway->pcm_player->handler->dest_pt), 1);
|
|
|
|
|
}
|
|
|
|
|
else if (flags->opmode == OP_OFFER) {
|
|
|
|
|
// T.38 -> audio transcoder, initial offer, and no codecs have been given.
|
|
|
|
|
@ -2422,10 +2452,10 @@ void codec_rtp_payload_types(struct call_media *media, struct call_media *other_
|
|
|
|
|
static const str PCMA_str = STR_CONST_INIT("PCMA");
|
|
|
|
|
pt = codec_add_payload_type(&PCMU_str, media);
|
|
|
|
|
assert(pt != NULL);
|
|
|
|
|
__rtp_payload_type_add_recv(media, pt);
|
|
|
|
|
__rtp_payload_type_add_recv(media, pt, 1);
|
|
|
|
|
pt = codec_add_payload_type(&PCMA_str, media);
|
|
|
|
|
assert(pt != NULL);
|
|
|
|
|
__rtp_payload_type_add_recv(media, pt);
|
|
|
|
|
__rtp_payload_type_add_recv(media, pt, 1);
|
|
|
|
|
|
|
|
|
|
ilog(LOG_DEBUG, "Using default codecs PCMU and PCMA for T.38 gateway");
|
|
|
|
|
}
|
|
|
|
|
|