|
|
|
@ -38,7 +38,7 @@ static struct codec_handler codec_handler_stub = {
|
|
|
|
|
static GList *__delete_x_codec(GList *link, GHashTable *codecs, GHashTable *codec_names, GQueue *codecs_prefs) {
|
|
|
|
|
struct rtp_payload_type *pt = link->data;
|
|
|
|
|
|
|
|
|
|
g_hash_table_remove(codecs, &pt->payload_type);
|
|
|
|
|
g_hash_table_remove(codecs, GINT_TO_POINTER(pt->payload_type));
|
|
|
|
|
g_hash_table_remove(codec_names, &pt->encoding);
|
|
|
|
|
g_hash_table_remove(codec_names, &pt->encoding_with_params);
|
|
|
|
|
g_hash_table_remove(codec_names, &pt->encoding_with_full_params);
|
|
|
|
@ -461,7 +461,7 @@ static struct rtp_payload_type *__check_dest_codecs(struct call_media *receiver,
|
|
|
|
|
// previously enabled on the sink, but no transcoding codecs are actually present,
|
|
|
|
|
// we can disable the transcoding engine.
|
|
|
|
|
struct rtp_payload_type *recv_pt = g_hash_table_lookup(receiver->codecs_send,
|
|
|
|
|
&pt->payload_type);
|
|
|
|
|
GINT_TO_POINTER(pt->payload_type));
|
|
|
|
|
if (recv_pt && rtp_payload_type_cmp(pt, recv_pt))
|
|
|
|
|
recv_pt = NULL;
|
|
|
|
|
//ilog(LOG_DEBUG, "XXXXXXXXXXXX old flag is %i", *sink_transcoding);
|
|
|
|
@ -510,7 +510,7 @@ static void __check_send_codecs(struct call_media *receiver, struct call_media *
|
|
|
|
|
for (GList *l = sink->codecs_prefs_recv.head; l; l = l->next) {
|
|
|
|
|
struct rtp_payload_type *pt = l->data;
|
|
|
|
|
struct rtp_payload_type *recv_pt = g_hash_table_lookup(receiver->codecs_send,
|
|
|
|
|
&pt->payload_type);
|
|
|
|
|
GINT_TO_POINTER(pt->payload_type));
|
|
|
|
|
int tc_flag = 0;
|
|
|
|
|
//ilog(LOG_DEBUG, "XXXXXXXXXXXX old flag is %i", *sink_transcoding);
|
|
|
|
|
//ilog(LOG_DEBUG, "XXXXXXXXXXXX checking send codec " STR_FORMAT " is %i",
|
|
|
|
@ -591,14 +591,14 @@ static int __unused_pt_number(struct call_media *media, struct call_media *other
|
|
|
|
|
if (num < 0)
|
|
|
|
|
num = 96; // default first dynamic payload type number
|
|
|
|
|
while (1) {
|
|
|
|
|
if ((pt_match = g_hash_table_lookup(media->codecs_recv, &num)))
|
|
|
|
|
if ((pt_match = g_hash_table_lookup(media->codecs_recv, GINT_TO_POINTER(num))))
|
|
|
|
|
goto next;
|
|
|
|
|
if ((pt_match = g_hash_table_lookup(media->codecs_send, &num)))
|
|
|
|
|
if ((pt_match = g_hash_table_lookup(media->codecs_send, GINT_TO_POINTER(num))))
|
|
|
|
|
goto next;
|
|
|
|
|
if (other_media) {
|
|
|
|
|
if ((pt_match = g_hash_table_lookup(other_media->codecs_recv, &num)))
|
|
|
|
|
if ((pt_match = g_hash_table_lookup(other_media->codecs_recv, GINT_TO_POINTER(num))))
|
|
|
|
|
goto next;
|
|
|
|
|
if ((pt_match = g_hash_table_lookup(other_media->codecs_send, &num)))
|
|
|
|
|
if ((pt_match = g_hash_table_lookup(other_media->codecs_send, GINT_TO_POINTER(num))))
|
|
|
|
|
goto next;
|
|
|
|
|
}
|
|
|
|
|
// OK
|
|
|
|
@ -652,7 +652,7 @@ static int __check_receiver_codecs(struct call_media *receiver, struct call_medi
|
|
|
|
|
continue;
|
|
|
|
|
//ilog(LOG_DEBUG, "XXXXXXXXXXXX checking recv send " STR_FORMAT " %i %i", STR_FMT(&pt->encoding_with_params), pt->for_transcoding, pt->codec_def->supplemental);
|
|
|
|
|
struct rtp_payload_type *sink_pt = g_hash_table_lookup(sink->codecs_recv,
|
|
|
|
|
&pt->payload_type);
|
|
|
|
|
GINT_TO_POINTER(pt->payload_type));
|
|
|
|
|
if (sink_pt && !rtp_payload_type_cmp(pt, sink_pt))
|
|
|
|
|
continue;
|
|
|
|
|
if (pt->for_transcoding) {
|
|
|
|
@ -668,12 +668,12 @@ static int __check_receiver_codecs(struct call_media *receiver, struct call_medi
|
|
|
|
|
static void __accept_pt(struct call_media *receiver, struct call_media *sink, int payload_type,
|
|
|
|
|
int fallback_type, int accept_only_tc, GList **insert_pos)
|
|
|
|
|
{
|
|
|
|
|
struct rtp_payload_type *pt = g_hash_table_lookup(receiver->codecs_send, &payload_type);
|
|
|
|
|
struct rtp_payload_type *pt = g_hash_table_lookup(receiver->codecs_send, GINT_TO_POINTER(payload_type));
|
|
|
|
|
|
|
|
|
|
// fallback PT in case the codec handler is a dummy or a passthrough
|
|
|
|
|
// or some other internal problem
|
|
|
|
|
if (!pt && fallback_type != -1)
|
|
|
|
|
pt = g_hash_table_lookup(receiver->codecs_send, &fallback_type);
|
|
|
|
|
pt = g_hash_table_lookup(receiver->codecs_send, GINT_TO_POINTER(fallback_type));
|
|
|
|
|
if (!pt)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
@ -684,7 +684,7 @@ static void __accept_pt(struct call_media *receiver, struct call_media *sink, in
|
|
|
|
|
return;
|
|
|
|
|
//ilog(LOG_DEBUG, "XXXXXXXXXXX accept codec " STR_FORMAT " flag %i", STR_FMT(&pt->encoding_with_params), pt->for_transcoding);
|
|
|
|
|
struct rtp_payload_type *existing_pt
|
|
|
|
|
= g_hash_table_lookup(receiver->codecs_recv, &pt->payload_type);
|
|
|
|
|
= g_hash_table_lookup(receiver->codecs_recv, GINT_TO_POINTER(pt->payload_type));
|
|
|
|
|
if (existing_pt && !rtp_payload_type_cmp_nf(existing_pt, pt)) {
|
|
|
|
|
// already present.
|
|
|
|
|
// to keep the order intact, we seek the list for the position
|
|
|
|
@ -720,9 +720,10 @@ static void __accept_pt(struct call_media *receiver, struct call_media *sink, in
|
|
|
|
|
existing_pt->payload_type,
|
|
|
|
|
new_pt,
|
|
|
|
|
STR_FMT(&pt->encoding_with_params));
|
|
|
|
|
g_hash_table_steal(receiver->codecs_recv, &existing_pt->payload_type);
|
|
|
|
|
g_hash_table_steal(receiver->codecs_recv, GINT_TO_POINTER(existing_pt->payload_type));
|
|
|
|
|
existing_pt->payload_type = new_pt;
|
|
|
|
|
g_hash_table_insert(receiver->codecs_recv, &existing_pt->payload_type, existing_pt);
|
|
|
|
|
g_hash_table_insert(receiver->codecs_recv, GINT_TO_POINTER(existing_pt->payload_type),
|
|
|
|
|
existing_pt);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//ilog(LOG_DEBUG, "XXXXXXXXXXXXX offered codec %i", pt->for_transcoding);
|
|
|
|
@ -735,7 +736,7 @@ static void __accept_pt(struct call_media *receiver, struct call_media *sink, in
|
|
|
|
|
pt->for_transcoding = 1;
|
|
|
|
|
codec_touched(pt, receiver);
|
|
|
|
|
// this somewhat duplicates __rtp_payload_type_add_recv
|
|
|
|
|
g_hash_table_insert(receiver->codecs_recv, &pt->payload_type, pt);
|
|
|
|
|
g_hash_table_insert(receiver->codecs_recv, GINT_TO_POINTER(pt->payload_type), pt);
|
|
|
|
|
__rtp_payload_type_add_name(receiver->codec_names_recv, pt);
|
|
|
|
|
|
|
|
|
|
// keep supplemental codecs last
|
|
|
|
@ -1253,12 +1254,12 @@ int __supp_codec_match(struct call_media *receiver, struct call_media *sink, int
|
|
|
|
|
recv_pt = &recv_pt_stor;
|
|
|
|
|
|
|
|
|
|
// find a matching output payload type
|
|
|
|
|
*sink_pt = g_hash_table_lookup(sink->codecs_send, &pt);
|
|
|
|
|
*sink_pt = g_hash_table_lookup(sink->codecs_send, GINT_TO_POINTER(pt));
|
|
|
|
|
if (!*sink_pt)
|
|
|
|
|
return 0;
|
|
|
|
|
//ilog(LOG_DEBUG, "XXXXXXXXX sink has supp PT %i", pt);
|
|
|
|
|
// XXX should go by codec name/params, not payload type number
|
|
|
|
|
*recv_pt = g_hash_table_lookup(receiver->codecs_recv, &pt);
|
|
|
|
|
*recv_pt = g_hash_table_lookup(receiver->codecs_recv, GINT_TO_POINTER(pt));
|
|
|
|
|
if (!*recv_pt)
|
|
|
|
|
return 1;
|
|
|
|
|
//ilog(LOG_DEBUG, "XXXXXXXXX recv has supp PT %i", pt);
|
|
|
|
@ -1380,7 +1381,7 @@ void codec_handlers_update(struct call_media *receiver, struct call_media *sink,
|
|
|
|
|
if ((MEDIA_ISSET(sink, TRANSCODE) || (sink_transcoding & 0x2))
|
|
|
|
|
&& dtmf_payload_type != -1
|
|
|
|
|
&& dtmf_pt && (!reverse_dtmf_pt || reverse_dtmf_pt->for_transcoding ||
|
|
|
|
|
!g_hash_table_lookup(receiver->codecs_send, &dtmf_payload_type)))
|
|
|
|
|
!g_hash_table_lookup(receiver->codecs_send, GINT_TO_POINTER(dtmf_payload_type))))
|
|
|
|
|
pcm_dtmf_detect = 1;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -1395,7 +1396,7 @@ void codec_handlers_update(struct call_media *receiver, struct call_media *sink,
|
|
|
|
|
// (recv->recv) that wasn't originally offered (recv->send). we must eliminate
|
|
|
|
|
// those, unless we added them ourselves for transcoding.
|
|
|
|
|
struct rtp_payload_type *recv_pt =
|
|
|
|
|
g_hash_table_lookup(receiver->codecs_send, &pt->payload_type);
|
|
|
|
|
g_hash_table_lookup(receiver->codecs_send, GINT_TO_POINTER(pt->payload_type));
|
|
|
|
|
if (!recv_pt && !pt->for_transcoding) {
|
|
|
|
|
ilogs(codec, LOG_DEBUG, "Eliminating transcoded codec " STR_FORMAT,
|
|
|
|
|
STR_FMT(&pt->encoding_with_params));
|
|
|
|
@ -1459,7 +1460,7 @@ void codec_handlers_update(struct call_media *receiver, struct call_media *sink,
|
|
|
|
|
dest_pt = NULL;
|
|
|
|
|
for (GList *k = dest_codecs->head; k; k = k->next) {
|
|
|
|
|
unsigned int dest_ptype = GPOINTER_TO_UINT(k->data);
|
|
|
|
|
dest_pt = g_hash_table_lookup(sink->codecs_send, &dest_ptype);
|
|
|
|
|
dest_pt = g_hash_table_lookup(sink->codecs_send, GINT_TO_POINTER(dest_ptype));
|
|
|
|
|
if (!dest_pt)
|
|
|
|
|
continue;
|
|
|
|
|
if (dest_pt->clock_rate != pt->clock_rate ||
|
|
|
|
@ -1517,7 +1518,7 @@ transcode:;
|
|
|
|
|
// encoder. if any codec options such as bitrate were set during an offer,
|
|
|
|
|
// they're in the decoder // PT. copy them to the encoder PT.
|
|
|
|
|
struct rtp_payload_type *reverse_pt = g_hash_table_lookup(sink->codecs_recv,
|
|
|
|
|
&dest_pt->payload_type);
|
|
|
|
|
GINT_TO_POINTER(dest_pt->payload_type));
|
|
|
|
|
if (reverse_pt) {
|
|
|
|
|
if (!dest_pt->bitrate)
|
|
|
|
|
dest_pt->bitrate = reverse_pt->bitrate;
|
|
|
|
@ -3214,7 +3215,7 @@ void __rtp_payload_type_add_recv(struct call_media *media, struct rtp_payload_ty
|
|
|
|
|
// update ptime in case it was overridden
|
|
|
|
|
if (media->ptime > 0)
|
|
|
|
|
pt->ptime = media->ptime;
|
|
|
|
|
g_hash_table_insert(media->codecs_recv, &pt->payload_type, pt);
|
|
|
|
|
g_hash_table_insert(media->codecs_recv, GINT_TO_POINTER(pt->payload_type), pt);
|
|
|
|
|
__rtp_payload_type_add_name(media->codec_names_recv, pt);
|
|
|
|
|
__queue_insert_supp(&media->codecs_prefs_recv, pt, supp_check);
|
|
|
|
|
}
|
|
|
|
@ -3231,7 +3232,7 @@ void __rtp_payload_type_add_send(struct call_media *other_media,
|
|
|
|
|
// update ptime in case it was overridden
|
|
|
|
|
if (other_media->ptime > 0)
|
|
|
|
|
pt->ptime = other_media->ptime;
|
|
|
|
|
g_hash_table_insert(other_media->codecs_send, &pt->payload_type, pt);
|
|
|
|
|
g_hash_table_insert(other_media->codecs_send, GINT_TO_POINTER(pt->payload_type), pt);
|
|
|
|
|
__rtp_payload_type_add_name(other_media->codec_names_send, pt);
|
|
|
|
|
g_queue_push_tail(&other_media->codecs_prefs_send, pt);
|
|
|
|
|
}
|
|
|
|
@ -3411,7 +3412,7 @@ void codec_tracker_finish(struct call_media *media, struct call_media *other_med
|
|
|
|
|
struct rtp_payload_type *existing_pt = NULL;
|
|
|
|
|
if (existing_pts && existing_pts->length) {
|
|
|
|
|
int pt_num = GPOINTER_TO_UINT(existing_pts->head->data);
|
|
|
|
|
existing_pt = g_hash_table_lookup(media->codecs_recv, &pt_num);
|
|
|
|
|
existing_pt = g_hash_table_lookup(media->codecs_recv, GINT_TO_POINTER(pt_num));
|
|
|
|
|
}
|
|
|
|
|
struct codec_handler *existing_handler = existing_pt ? codec_handler_get(media, existing_pt->payload_type) : NULL;
|
|
|
|
|
|
|
|
|
@ -3459,7 +3460,7 @@ void codec_tracker_finish(struct call_media *media, struct call_media *other_med
|
|
|
|
|
// check DTMF
|
|
|
|
|
if (!prim_dtmf && ch->dtmf_payload_type != -1)
|
|
|
|
|
prim_dtmf = g_hash_table_lookup(other_media->codecs_recv,
|
|
|
|
|
&ch->dtmf_payload_type);
|
|
|
|
|
GINT_TO_POINTER(ch->dtmf_payload_type));
|
|
|
|
|
if (prim_dtmf) {
|
|
|
|
|
if (ch->dest_pt.payload_type == pt->payload_type) {
|
|
|
|
|
ilogs(codec, LOG_DEBUG, "Adjusting output DTMF PT for "
|
|
|
|
@ -3488,7 +3489,7 @@ void codec_tracker_finish(struct call_media *media, struct call_media *other_med
|
|
|
|
|
// check CN
|
|
|
|
|
if (!prim_cn && ch->cn_payload_type != -1)
|
|
|
|
|
prim_cn = g_hash_table_lookup(other_media->codecs_recv,
|
|
|
|
|
&ch->cn_payload_type);
|
|
|
|
|
GINT_TO_POINTER(ch->cn_payload_type));
|
|
|
|
|
if (prim_cn) {
|
|
|
|
|
if (ch->dest_pt.payload_type == pt->payload_type) {
|
|
|
|
|
ilogs(codec, LOG_DEBUG, "Adjusting output CN PT for "
|
|
|
|
|