diff --git a/daemon/codec.c b/daemon/codec.c index 9579a5a93..506730f2c 100644 --- a/daemon/codec.c +++ b/daemon/codec.c @@ -622,14 +622,16 @@ static struct rtp_payload_type *codec_make_payload_type(const str *codec, struct const codec_def_t *dec = codec_find(codec); if (!dec) return NULL; - const struct rtp_payload_type *rfc_pt = rtp_get_rfc_codec(codec); - if (!rfc_pt) - return codec_make_dynamic_payload_type(dec, call); - - struct rtp_payload_type *ret = __rtp_payload_type_copy(rfc_pt); - ret->codec_def = dec; + if (dec->rfc_payload_type >= 0) { + const struct rtp_payload_type *rfc_pt = rtp_get_rfc_payload_type(dec->rfc_payload_type); + if (rfc_pt) { + struct rtp_payload_type *ret = __rtp_payload_type_copy(rfc_pt); + ret->codec_def = dec; + return ret; + } + } + return codec_make_dynamic_payload_type(dec, call); - return ret; } diff --git a/lib/codeclib.c b/lib/codeclib.c index 0c24607f1..99b261321 100644 --- a/lib/codeclib.c +++ b/lib/codeclib.c @@ -7,6 +7,7 @@ #include "log.h" #include "loglib.h" #include "resample.h" +#include "rtplib.h" @@ -556,6 +557,12 @@ void codeclib_init() { str_init(&def->rtpname_str, (char *) def->rtpname); assert(g_hash_table_lookup(codecs_ht, &def->rtpname_str) == NULL); g_hash_table_insert(codecs_ht, &def->rtpname_str, def); + + const struct rtp_payload_type *pt = rtp_get_rfc_codec(&def->rtpname_str); + if (pt) + def->rfc_payload_type = pt->payload_type; + else + def->rfc_payload_type = -1; } } diff --git a/lib/codeclib.h b/lib/codeclib.h index 885d92198..336053653 100644 --- a/lib/codeclib.h +++ b/lib/codeclib.h @@ -40,7 +40,9 @@ struct codec_def_s { const int default_ptime; packetizer_f * const packetizer; const int bits_per_sample; + str rtpname_str; + int rfc_payload_type; }; struct format_s { diff --git a/lib/rtplib.c b/lib/rtplib.c index baccb0996..cab180bc8 100644 --- a/lib/rtplib.c +++ b/lib/rtplib.c @@ -130,7 +130,7 @@ const struct rtp_payload_type *rtp_get_rfc_payload_type(unsigned int type) { return rtp_pt; } -// XXX use hash table +// for one-time init only - better use rtp_get_rfc_payload_type(codec_def->rfc_payload_type) const struct rtp_payload_type *rtp_get_rfc_codec(const str *codec) { for (int i = 0; i < num_rfc_rtp_payload_types; i++) { if (!rfc_rtp_payload_types[i].encoding.s)