From dd3e27b502dae357ba0f67bfe0109389b2b266ee Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Fri, 9 Oct 2020 13:18:31 -0400 Subject: [PATCH] TT#92250 rtpengine: support new codec flags Adds explicit support for codec-set and codec-except. Also eliminates code redundancy. Change-Id: If9f3c0cd8e2f309671771807e289234bae8997a4 --- debian/patches/series | 1 + .../sipwise/rtpengine-codec-set-except.patch | 98 +++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 debian/patches/sipwise/rtpengine-codec-set-except.patch diff --git a/debian/patches/series b/debian/patches/series index 8a71a22b6..9ad401546 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -43,6 +43,7 @@ sipwise/pua_dialoginfo-local_identity_dlg_var.patch sipwise/pua_dialoginfo-use-lock-when-use_puburi_avps-is-set.patch sipwise/dialplan-don-t-stop-loading-rules-on-error.patch sipwise/cfgt-skip-tm-vars-T_.patch +sipwise/rtpengine-codec-set-except.patch ### active development sipwise/lcr-stopper_mode-parameter.patch # diff --git a/debian/patches/sipwise/rtpengine-codec-set-except.patch b/debian/patches/sipwise/rtpengine-codec-set-except.patch new file mode 100644 index 000000000..147520d47 --- /dev/null +++ b/debian/patches/sipwise/rtpengine-codec-set-except.patch @@ -0,0 +1,98 @@ +--- a/src/modules/rtpengine/rtpengine.c ++++ b/src/modules/rtpengine/rtpengine.c +@@ -119,7 +119,8 @@ + int via, to, packetize, transport, directional; + bencode_item_t *dict, *flags, *direction, *replace, *rtcp_mux, *sdes, + *t38, +- *codec, *codec_strip, *codec_offer, *codec_transcode, *codec_mask; ++ *codec, *codec_strip, *codec_offer, *codec_transcode, *codec_mask, ++ *codec_set, *codec_except; + str call_id, from_tag, to_tag; + }; + +@@ -2082,6 +2083,29 @@ + [0x06] = "UDP/TLS/RTP/SAVPF", + }; + ++static int parse_codec_flag(struct ng_flags_parse *ng_flags, const str *key, const str *val, ++ const char *cmp1, const char *cmp2, ++ bencode_item_t **dictp) ++{ ++ str s; ++ ++ if (!str_key_val_prefix(key, cmp1, val, &s)) { ++ if (!cmp2) ++ return 0; ++ if (!str_key_val_prefix(key, cmp2, val, &s)) ++ return 0; ++ } ++ ++ if (!*dictp) { ++ *dictp = bencode_list(ng_flags->dict->buffer); ++ bencode_dictionary_add(ng_flags->codec, "transcode", ++ *dictp); ++ } ++ bencode_list_add_str(*dictp, &s); ++ ++ return 1; ++} ++ + static int parse_flags(struct ng_flags_parse *ng_flags, struct sip_msg *msg, enum rtpe_operation *op, + const char *flags_str) + { +@@ -2135,47 +2159,18 @@ + goto next; + } + +- if (str_key_val_prefix(&key, "transcode", &val, &s) +- || str_key_val_prefix(&key, "codec-transcode", &val, &s)) +- { +- if (!ng_flags->codec_transcode) { +- ng_flags->codec_transcode = bencode_list(ng_flags->dict->buffer); +- bencode_dictionary_add(ng_flags->codec, "transcode", +- ng_flags->codec_transcode); +- } +- bencode_list_add_str(ng_flags->codec_transcode, &s); ++ if (parse_codec_flag(ng_flags, &key, &val, "transcode", "codec-transcode", &ng_flags->codec_transcode)) + goto next; +- } +- +- if (str_key_val_prefix(&key, "codec-strip", &val, &s)) { +- if (!ng_flags->codec_strip) { +- ng_flags->codec_strip = bencode_list(ng_flags->dict->buffer); +- bencode_dictionary_add(ng_flags->codec, "strip", +- ng_flags->codec_strip); +- } +- bencode_list_add_str(ng_flags->codec_strip, &s); ++ if (parse_codec_flag(ng_flags, &key, &val, "codec-strip", NULL, &ng_flags->codec_strip)) + goto next; +- } +- +- if (str_key_val_prefix(&key, "codec-offer", &val, &s)) { +- if (!ng_flags->codec_offer) { +- ng_flags->codec_offer = bencode_list(ng_flags->dict->buffer); +- bencode_dictionary_add(ng_flags->codec, "offer", +- ng_flags->codec_offer); +- } +- bencode_list_add_str(ng_flags->codec_offer, &s); ++ if (parse_codec_flag(ng_flags, &key, &val, "codec-offer", NULL, &ng_flags->codec_offer)) + goto next; +- } +- +- if (str_key_val_prefix(&key, "codec-mask", &val, &s)) { +- if (!ng_flags->codec_mask) { +- ng_flags->codec_mask = bencode_list(ng_flags->dict->buffer); +- bencode_dictionary_add(ng_flags->codec, "mask", +- ng_flags->codec_mask); +- } +- bencode_list_add_str(ng_flags->codec_mask, &s); ++ if (parse_codec_flag(ng_flags, &key, &val, "codec-mask", NULL, &ng_flags->codec_mask)) ++ goto next; ++ if (parse_codec_flag(ng_flags, &key, &val, "codec-set", NULL, &ng_flags->codec_set)) ++ goto next; ++ if (parse_codec_flag(ng_flags, &key, &val, "codec-except", NULL, &ng_flags->codec_except)) + goto next; +- } + + /* check for specially handled items */ + switch (key.len) {