diff --git a/daemon/call.c b/daemon/call.c index 118799e08..fc38511c9 100644 --- a/daemon/call.c +++ b/daemon/call.c @@ -2322,6 +2322,7 @@ void codecs_offer_answer(struct call_media *media, struct call_media *other_medi codec_store_offer(&other_media->codecs, &flags->codec_offer, &sp->codecs); if (!other_media->codecs.strip_full) codec_store_offer(&other_media->codecs, &flags->codec_transcode, &sp->codecs); + codec_store_check_empty(&other_media->codecs, &sp->codecs); codec_store_accept(&other_media->codecs, &flags->codec_accept, NULL); codec_store_accept(&other_media->codecs, &flags->codec_consume, &sp->codecs); codec_store_track(&other_media->codecs, &flags->codec_mask); @@ -2351,6 +2352,7 @@ void codecs_offer_answer(struct call_media *media, struct call_media *other_medi codec_store_strip(&media->codecs, &flags->codec_mask, flags->codec_except); codec_store_offer(&media->codecs, &flags->codec_offer, &sp->codecs); codec_store_transcode(&media->codecs, &flags->codec_transcode, &sp->codecs); + codec_store_check_empty(&media->codecs, &sp->codecs); } codec_store_synthesise(&media->codecs, &other_media->codecs); @@ -2377,6 +2379,7 @@ void codecs_offer_answer(struct call_media *media, struct call_media *other_medi codec_store_populate(&other_media->codecs, &sp->codecs, flags->codec_set); codec_store_strip(&other_media->codecs, &flags->codec_strip, flags->codec_except); codec_store_offer(&other_media->codecs, &flags->codec_offer, &sp->codecs); + codec_store_check_empty(&other_media->codecs, &sp->codecs); // update callee side codec handlers again (second pass after the offer) as we // might need to update some handlers, e.g. when supplemental codecs have been diff --git a/daemon/codec.c b/daemon/codec.c index 451f66228..74300db15 100644 --- a/daemon/codec.c +++ b/daemon/codec.c @@ -3553,6 +3553,16 @@ void codec_store_populate_reuse(struct codec_store *dst, struct codec_store *src } } +void codec_store_check_empty(struct codec_store *dst, struct codec_store *src) { + if (dst->codec_prefs.length) + return; + + ilog(LOG_WARN, "Usage error: List of codecs empty. Restoring original list of codecs. " + "Results may be unexpected."); + + codec_store_populate(dst, src, NULL); +} + void codec_store_populate(struct codec_store *dst, struct codec_store *src, GHashTable *codec_set) { // start fresh struct codec_store orig_dst; diff --git a/include/codec.h b/include/codec.h index 244ec6403..dba803729 100644 --- a/include/codec.h +++ b/include/codec.h @@ -95,6 +95,7 @@ void codec_store_populate_reuse(struct codec_store *, struct codec_store *, GHas void codec_store_add_raw(struct codec_store *cs, struct rtp_payload_type *pt); void codec_store_strip(struct codec_store *, GQueue *strip, GHashTable *except); void codec_store_offer(struct codec_store *, GQueue *, struct codec_store *); +void codec_store_check_empty(struct codec_store *, struct codec_store *); void codec_store_accept(struct codec_store *, GQueue *, struct codec_store *); int codec_store_accept_one(struct codec_store *, GQueue *, bool accept_any); void codec_store_track(struct codec_store *, GQueue *); diff --git a/t/auto-daemon-tests.pl b/t/auto-daemon-tests.pl index 4d3cb08a9..6242cd6c6 100755 --- a/t/auto-daemon-tests.pl +++ b/t/auto-daemon-tests.pl @@ -40,6 +40,70 @@ my ($sock_a, $sock_b, $sock_c, $sock_d, $port_a, $port_b, $ssrc, $ssrc_b, $resp, +new_call; + +offer('GH 1373 offer', { codec => { strip => ['all'] } }, < { strip => ['all'] } }, <