Skip to content

Commit f7b6a6c

Browse files
committed
MT#60347 extend allow-asymmetric-codecs
... to be operational and useful on supplemental codecs (DTMF etc) Change-Id: Ifedefb143b984e6bac49dbbd744fe4647891bc7a (cherry picked from commit abbc022)
1 parent a063873 commit f7b6a6c

File tree

4 files changed

+35
-8
lines changed

4 files changed

+35
-8
lines changed

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,10 @@ For quick access, documentation for development:
9494
* [Troubleshooting Overview](https://rtpengine.readthedocs.io/en/latest/troubleshooting.html)
9595
* [Glossary](https://rtpengine.readthedocs.io/en/latest/glossary.html)
9696

97+
# Sponsors
98+
99+
* [Dataport AöR](https://www.dataport.de/)
100+
97101
# Contribution
98102

99103
Every bit matters. Join us. Make the rtpengine community stronger.

daemon/call.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2482,7 +2482,8 @@ static void codecs_answer(struct call_media *media, struct call_media *other_med
24822482
ilogs(codec, LOG_DEBUG, "Codec answer for " STR_FORMAT " #%u",
24832483
STR_FMT(&other_media->monologue->tag),
24842484
other_media->index);
2485-
codec_store_answer(&media->codecs, &other_media->codecs, flags);
2485+
codec_store_answer(&media->codecs, &other_media->codecs, flags,
2486+
.allow_asymmetric = !!flags->allow_asymmetric_codecs);
24862487

24872488
// set up handlers
24882489
codec_handlers_update(media, other_media, .flags = flags, .sp = sp,

daemon/codec.c

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1142,7 +1142,10 @@ void __codec_handlers_update(struct call_media *receiver, struct call_media *sin
11421142
if (!sink_pt) {
11431143
// no matching/identical output codec. maybe we have the same output codec,
11441144
// but with a different payload type or a different format?
1145-
sink_pt = codec_store_find_compatible(&sink->codecs, pt);
1145+
if (!a.allow_asymmetric)
1146+
sink_pt = codec_store_find_compatible(&sink->codecs, pt);
1147+
else
1148+
sink_pt = pt;
11461149
}
11471150

11481151
if (sink_pt && !pt->codec_def->supplemental) {
@@ -1178,10 +1181,18 @@ void __codec_handlers_update(struct call_media *receiver, struct call_media *sin
11781181

11791182
sink_pt_fixed:;
11801183
// we have found a usable output codec. gather matching output supp codecs
1181-
struct rtp_payload_type *sink_dtmf_pt = __supp_payload_type(supplemental_sinks,
1182-
sink_pt->clock_rate, "telephone-event");
1183-
struct rtp_payload_type *sink_cn_pt = __supp_payload_type(supplemental_sinks,
1184-
sink_pt->clock_rate, "CN");
1184+
struct rtp_payload_type *sink_dtmf_pt = NULL;
1185+
struct rtp_payload_type *sink_cn_pt = NULL;
1186+
if (!a.allow_asymmetric) {
1187+
sink_dtmf_pt = __supp_payload_type(supplemental_sinks,
1188+
sink_pt->clock_rate, "telephone-event");
1189+
sink_cn_pt = __supp_payload_type(supplemental_sinks,
1190+
sink_pt->clock_rate, "CN");
1191+
}
1192+
else {
1193+
sink_dtmf_pt = recv_dtmf_pt;
1194+
sink_cn_pt = recv_cn_pt;
1195+
}
11851196
struct rtp_payload_type *real_sink_dtmf_pt = NULL; // for DTMF delay
11861197

11871198
// XXX synthesise missing supp codecs according to codec tracker XXX needed?
@@ -4962,6 +4973,8 @@ void __codec_store_populate(struct codec_store *dst, struct codec_store *src, st
49624973
pt->payload_type);
49634974
continue;
49644975
}
4976+
if (orig_pt->codec_def && orig_pt->codec_def->supplemental)
4977+
orig_pt = NULL;
49654978
}
49664979
ilogs(codec, LOG_DEBUG, "Adding codec " STR_FORMAT " (%i)",
49674980
STR_FMT(&pt->encoding_with_params),
@@ -5301,7 +5314,9 @@ void codec_store_transcode(struct codec_store *cs, GQueue *offer, struct codec_s
53015314
#endif
53025315
}
53035316

5304-
void codec_store_answer(struct codec_store *dst, struct codec_store *src, struct sdp_ng_flags *flags) {
5317+
void __codec_store_answer(struct codec_store *dst, struct codec_store *src, struct sdp_ng_flags *flags,
5318+
struct codec_store_args a)
5319+
{
53055320
// retain existing setup for supplemental codecs, but start fresh otherwise
53065321
struct codec_store orig_dst;
53075322
codec_store_move(&orig_dst, dst);
@@ -5408,6 +5423,8 @@ void codec_store_answer(struct codec_store *dst, struct codec_store *src, struct
54085423
// handle associated supplemental codecs
54095424
if (h->cn_payload_type != -1) {
54105425
pt = g_hash_table_lookup(orig_dst.codecs, GINT_TO_POINTER(h->cn_payload_type));
5426+
if (!pt && a.allow_asymmetric)
5427+
pt = g_hash_table_lookup(src->codecs, GINT_TO_POINTER(h->cn_payload_type));
54115428
if (!pt)
54125429
ilogs(codec, LOG_DEBUG, "CN payload type %i is missing", h->cn_payload_type);
54135430
else
@@ -5418,6 +5435,8 @@ void codec_store_answer(struct codec_store *dst, struct codec_store *src, struct
54185435
dtmf_payload_type = h->real_dtmf_payload_type;
54195436
if (dtmf_payload_type != -1) {
54205437
pt = g_hash_table_lookup(orig_dst.codecs, GINT_TO_POINTER(dtmf_payload_type));
5438+
if (!pt && a.allow_asymmetric)
5439+
pt = g_hash_table_lookup(src->codecs, GINT_TO_POINTER(dtmf_payload_type));
54215440
if (!pt)
54225441
ilogs(codec, LOG_DEBUG, "DTMF payload type %i is missing", dtmf_payload_type);
54235442
else

include/codec.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,10 @@ void codec_store_track(struct codec_store *, GQueue *);
148148
__attribute__((nonnull(1, 2, 3)))
149149
void codec_store_transcode(struct codec_store *, GQueue *, struct codec_store *);
150150
__attribute__((nonnull(1, 2, 3)))
151-
void codec_store_answer(struct codec_store *dst, struct codec_store *src, struct sdp_ng_flags *flags);
151+
void __codec_store_answer(struct codec_store *dst, struct codec_store *src, struct sdp_ng_flags *flags,
152+
struct codec_store_args);
153+
#define codec_store_answer(dst, src, flags, ...) \
154+
__codec_store_answer(dst, src, flags, (struct codec_store_args) {__VA_ARGS__})
152155
__attribute__((nonnull(1, 2)))
153156
void codec_store_synthesise(struct codec_store *dst, struct codec_store *opposite);
154157
__attribute__((nonnull(1, 2)))

0 commit comments

Comments
 (0)