From 0448e12e0d0df9fac380d0747ce57843bf7b3d3b Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Thu, 8 Dec 2022 13:27:29 -0500 Subject: [PATCH] MT#56008 use hashed string lookup in codeclib.c Change-Id: I627ac72aa994dea4b52bd3b8b9e8d587bb4c0127 --- daemon/Makefile | 2 +- lib/.ycm_extra_conf.py | 13 +- lib/codeclib.c | 341 +++++++++++++++++++++----------------- lib/common.Makefile | 2 +- recording-daemon/Makefile | 2 +- t/Makefile | 14 +- 6 files changed, 211 insertions(+), 163 deletions(-) diff --git a/daemon/Makefile b/daemon/Makefile index 2cbb81cb9..71ef31ddd 100644 --- a/daemon/Makefile +++ b/daemon/Makefile @@ -85,7 +85,7 @@ SRCS= main.c kernel.c poller.c aux.c control_tcp.c call.c control_udp.c redis.c mqtt.c janus.strhash.c LIBSRCS= loglib.c auxlib.c rtplib.c str.c socket.c streambuf.c ssllib.c dtmflib.c ifeq ($(with_transcoding),yes) -LIBSRCS+= codeclib.c resample.c +LIBSRCS+= codeclib.strhash.c resample.c endif OBJS= $(SRCS:.c=.o) $(LIBSRCS:.c=.o) diff --git a/lib/.ycm_extra_conf.py b/lib/.ycm_extra_conf.py index c189b6853..4713bbd5c 100644 --- a/lib/.ycm_extra_conf.py +++ b/lib/.ycm_extra_conf.py @@ -9,6 +9,15 @@ from clang_helpers import PrepareClangFlags # 'flags' list of compilation flags. Notice that YCM itself uses that approach. compilation_database_folder = '' +repl_tmpl = '((x)[a]?(((x)[a]<complexity = str_to_i(val, -1); - else if (!str_cmp(key, "application")) { - if (!str_cmp(val, "VOIP") || !str_cmp(val, "VoIP") || !str_cmp(val, "voip")) - opts->application = OPUS_APPLICATION_VOIP; - else if (!str_cmp(val, "audio")) - opts->application = OPUS_APPLICATION_AUDIO; - else if (!str_cmp(val, "low-delay") || !str_cmp(val, "low delay") || !str_cmp(val, "lowdelay")) - opts->application = OPUS_APPLICATION_RESTRICTED_LOWDELAY; - else - ilog(LOG_WARN | LOG_FLAG_LIMIT, "Unknown Opus application: '" STR_FORMAT "'", - STR_FMT(val)); - } - else if (!str_cmp(key, "vbr")) { - // aligned with ffmpeg vbr=0/1/2 option - opts->vbr = str_to_i(val, -1); - if (opts->vbr == 2) { - opts->vbr = 1; - opts->vbr_constraint = 1; - } - } - else if (!str_cmp(key, "packet_loss")) - opts->pl = str_to_i(val, -1); - else if (!str_cmp(key, "fec")) - opts->fec = str_to_i(val, -1); - else { - ilog(LOG_WARN | LOG_FLAG_LIMIT, "Unknown Opus encoder option encountered: '" STR_FORMAT "'", - STR_FMT(key)); - return; + switch (__csh_lookup(key)) { + case CSH_LOOKUP("complexity"): + case CSH_LOOKUP("compression_level"): + opts->complexity = str_to_i(val, -1); + break; + case CSH_LOOKUP("application"): + switch (__csh_lookup(val)) { + case CSH_LOOKUP("VOIP"): + case CSH_LOOKUP("VoIP"): + case CSH_LOOKUP("voip"): + opts->application = OPUS_APPLICATION_VOIP; + break; + case CSH_LOOKUP("audio"): + opts->application = OPUS_APPLICATION_AUDIO; + break; + case CSH_LOOKUP("low-delay"): + case CSH_LOOKUP("low delay"): + case CSH_LOOKUP("lowdelay"): + opts->application = OPUS_APPLICATION_RESTRICTED_LOWDELAY; + break; + default: + ilog(LOG_WARN | LOG_FLAG_LIMIT, "Unknown Opus application: '" + STR_FORMAT "'", STR_FMT(val)); + }; + break; + case CSH_LOOKUP("vbr"): + case CSH_LOOKUP("VBR"): + // aligned with ffmpeg vbr=0/1/2 option + opts->vbr = str_to_i(val, -1); + if (opts->vbr == 2) { + opts->vbr = 1; + opts->vbr_constraint = 1; + } + break; + case CSH_LOOKUP("packet_loss"): + case CSH_LOOKUP("packet loss"): + opts->pl = str_to_i(val, -1); + break; + case CSH_LOOKUP("fec"): + case CSH_LOOKUP("FEC"): + opts->fec = str_to_i(val, -1); + break; + default: + ilog(LOG_WARN | LOG_FLAG_LIMIT, "Unknown Opus encoder option encountered: '" + STR_FORMAT "'", STR_FMT(key)); } - } static const char *libopus_encoder_init(encoder_t *enc, const str *extra_opts) { if (enc->requested_format.channels != 1 && enc->requested_format.channels != 2) @@ -2018,12 +2033,16 @@ static struct fraction opus_select_enc_clockrate(const format_t *req_format, con } static int ilbc_format_parse(struct rtp_codec_format *f, const str *fmtp) { - if (!str_cmp(fmtp, "mode=20")) - f->parsed.ilbc.mode = 20; - else if (!str_cmp(fmtp, "mode=30")) - f->parsed.ilbc.mode = 30; - else - return -1; + switch (__csh_lookup(fmtp)) { + case CSH_LOOKUP("mode=20"): + f->parsed.ilbc.mode = 20; + break; + case CSH_LOOKUP("mode=30"): + f->parsed.ilbc.mode = 30; + break; + default: + return -1; + } f->fmtp_parsed = 1; return 0; } @@ -2216,40 +2235,43 @@ static const unsigned int amr_wb_bits_per_frame[AMR_FT_TYPES] = { static void amr_parse_format_cb(str *key, str *token, void *data) { union codec_format_options *opts = data; - if (!str_cmp(key, "octet-align")) { - if (token->len == 1 && token->s[0] == '1') - opts->amr.octet_aligned = 1; - } - else if (!str_cmp(key, "crc")) { - if (token->len == 1 && token->s[0] == '1') { - opts->amr.octet_aligned = 1; - opts->amr.crc = 1; - } - } - else if (!str_cmp(key, "robust-sorting")) { - if (token->len == 1 && token->s[0] == '1') { + switch (__csh_lookup(key)) { + case CSH_LOOKUP("octet-align"): + if (token->len == 1 && token->s[0] == '1') + opts->amr.octet_aligned = 1; + break; + case CSH_LOOKUP("crc"): + if (token->len == 1 && token->s[0] == '1') { + opts->amr.octet_aligned = 1; + opts->amr.crc = 1; + } + break; + case CSH_LOOKUP("robust-sorting"): + if (token->len == 1 && token->s[0] == '1') { + opts->amr.octet_aligned = 1; + opts->amr.robust_sorting = 1; + } + break; + case CSH_LOOKUP("interleaving"): opts->amr.octet_aligned = 1; - opts->amr.robust_sorting = 1; - } - } - else if (!str_cmp(key, "interleaving")) { - opts->amr.octet_aligned = 1; - opts->amr.interleaving = str_to_i(token, 0); - } - else if (!str_cmp(key, "mode-set")) { - str mode; - while (str_token_sep(&mode, token, ',') == 0) { - int m = str_to_i(&mode, -1); - if (m < 0 || m >= AMR_FT_TYPES) - continue; - opts->amr.mode_set |= (1 << m); - } - } - else if (!str_cmp(key, "mode-change-period")) - opts->amr.mode_change_period = str_to_i(token, 0); - else if (!str_cmp(key, "mode-change-neighbor")) { - if (token->len == 1 && token->s[0] == '1') - opts->amr.mode_change_neighbor = 1; + opts->amr.interleaving = str_to_i(token, 0); + break; + case CSH_LOOKUP("mode-set"):; + str mode; + while (str_token_sep(&mode, token, ',') == 0) { + int m = str_to_i(&mode, -1); + if (m < 0 || m >= AMR_FT_TYPES) + continue; + opts->amr.mode_set |= (1 << m); + } + break; + case CSH_LOOKUP("mode-change-period"): + opts->amr.mode_change_period = str_to_i(token, 0); + break; + case CSH_LOOKUP("mode-change-neighbor"): + if (token->len == 1 && token->s[0] == '1') + opts->amr.mode_change_neighbor = 1; + break; } } static int amr_format_parse(struct rtp_codec_format *f, const str *fmtp) { @@ -3132,42 +3154,48 @@ static unsigned int str_to_i_k(str *s) { static const char *evs_bw_strings[__EVS_BW_MAX] = { "nb", "wb", "swb", "fb" }; static void evs_parse_bw(enum evs_bw *minp, enum evs_bw *maxp, const str *token) { - if (!str_cmp(token, "nb")) - *maxp = EVS_BW_NB; - else if (!str_cmp(token, "wb")) - *maxp = EVS_BW_WB; - else if (!str_cmp(token, "swb")) - *maxp = EVS_BW_SWB; - else if (!str_cmp(token, "fb")) - *maxp = EVS_BW_FB; - else if (!str_cmp(token, "nb-wb")) { - *minp = EVS_BW_NB; - *maxp = EVS_BW_WB; - } - else if (!str_cmp(token, "nb-swb")) { - *minp = EVS_BW_NB; - *maxp = EVS_BW_SWB; - } - else if (!str_cmp(token, "nb-fb")) { - *minp = EVS_BW_NB; - *maxp = EVS_BW_FB; - } - // the ones below are not mentioned in the spec - lower bound ignored - else if (!str_cmp(token, "wb-swb")) { - *minp = EVS_BW_WB; - *maxp = EVS_BW_SWB; - } - else if (!str_cmp(token, "wb-fb")) { - *minp = EVS_BW_WB; - *maxp = EVS_BW_FB; - } - else if (!str_cmp(token, "swb-fb")) { - *minp = EVS_BW_SWB; - *maxp = EVS_BW_FB; + switch (__csh_lookup(token)) { + case CSH_LOOKUP("nb"): + *maxp = EVS_BW_NB; + break; + case CSH_LOOKUP("wb"): + *maxp = EVS_BW_WB; + break; + case CSH_LOOKUP("swb"): + *maxp = EVS_BW_SWB; + break; + case CSH_LOOKUP("fb"): + *maxp = EVS_BW_FB; + break; + case CSH_LOOKUP("nb-wb"): + *minp = EVS_BW_NB; + *maxp = EVS_BW_WB; + break; + case CSH_LOOKUP("nb-swb"): + *minp = EVS_BW_NB; + *maxp = EVS_BW_SWB; + break; + case CSH_LOOKUP("nb-fb"): + *minp = EVS_BW_NB; + *maxp = EVS_BW_FB; + break; + // the ones below are not mentioned in the spec - lower bound ignored + case CSH_LOOKUP("wb-swb"): + *minp = EVS_BW_WB; + *maxp = EVS_BW_SWB; + break; + case CSH_LOOKUP("wb-fb"): + *minp = EVS_BW_WB; + *maxp = EVS_BW_FB; + break; + case CSH_LOOKUP("swb-fb"): + *minp = EVS_BW_SWB; + *maxp = EVS_BW_FB; + break; + default: + ilog(LOG_WARN, "EVS: bandwidth selection '" STR_FORMAT "' not understood", + STR_FMT(token)); } - else - ilog(LOG_WARN, "EVS: bandwidth selection '" STR_FORMAT "' not understood", - STR_FMT(token)); } static void evs_parse_br(unsigned int *minp, unsigned int *maxp, str *token) { str min; @@ -3276,54 +3304,63 @@ static void evs_parse_format_cb(str *key, str *token, void *data) { union codec_format_options *opts = data; __auto_type o = &opts->evs; - if (!str_cmp(key, "hf-only")) { - if (token->len == 1 && token->s[0] == '1') - o->hf_only = 1; - } - else if (!str_cmp(key, "evs-mode-switch")) { - if (token->len == 1 && token->s[0] == '1') - o->amr_io = 1; - } - else if (!str_cmp(key, "dtx")) { - if (token->len == 1 && token->s[0] == '0') - o->no_dtx = 1; - } - else if (!str_cmp(key, "dtx-recv")) { - if (token->len == 1 && token->s[0] == '0') - o->no_dtx_recv = 1; - } - else if (!str_cmp(key, "cmr")) { - if (token->len == 1 && token->s[0] == '1') - o->cmr = 1; - else if (token->len == 2 && token->s[0] == '-' && token->s[1] == '1') - o->cmr = -1; - } - else if (!str_cmp(key, "br")) - evs_parse_br(&o->min_br, &o->max_br, token); - else if (!str_cmp(key, "br-send")) - evs_parse_br(&o->min_br_send, &o->max_br_send, token); - else if (!str_cmp(key, "br-recv")) - evs_parse_br(&o->min_br_recv, &o->max_br_recv, token); - else if (!str_cmp(key, "bw")) - evs_parse_bw(&o->min_bw, &o->max_bw, token); - else if (!str_cmp(key, "bw-send")) - evs_parse_bw(&o->min_bw_send, &o->max_bw_send, token); - else if (!str_cmp(key, "bw-recv")) - evs_parse_bw(&o->min_bw_recv, &o->max_bw_recv, token); - else if (!str_cmp(key, "mode-set")) { - str mode; - while (str_token_sep(&mode, token, ',') == 0) { - int m = str_to_i(&mode, -1); - if (m < 0 || m > 8) - continue; - o->mode_set |= (1 << m); - } - } - else if (!str_cmp(key, "mode-change-period")) - o->mode_change_period = str_to_i(token, 0); - else if (!str_cmp(key, "mode-change-neighbor")) { - if (token->len == 1 && token->s[0] == '1') - o->mode_change_neighbor = 1; + switch (__csh_lookup(key)) { + case CSH_LOOKUP("hf-only"): + if (token->len == 1 && token->s[0] == '1') + o->hf_only = 1; + break; + case CSH_LOOKUP("evs-mode-switch"): + if (token->len == 1 && token->s[0] == '1') + o->amr_io = 1; + break; + case CSH_LOOKUP("dtx"): + if (token->len == 1 && token->s[0] == '0') + o->no_dtx = 1; + break; + case CSH_LOOKUP("dtx-recv"): + if (token->len == 1 && token->s[0] == '0') + o->no_dtx_recv = 1; + break; + case CSH_LOOKUP("cmr"): + if (token->len == 1 && token->s[0] == '1') + o->cmr = 1; + else if (token->len == 2 && token->s[0] == '-' && token->s[1] == '1') + o->cmr = -1; + break; + case CSH_LOOKUP("br"): + evs_parse_br(&o->min_br, &o->max_br, token); + break; + case CSH_LOOKUP("br-send"): + evs_parse_br(&o->min_br_send, &o->max_br_send, token); + break; + case CSH_LOOKUP("br-recv"): + evs_parse_br(&o->min_br_recv, &o->max_br_recv, token); + break; + case CSH_LOOKUP("bw"): + evs_parse_bw(&o->min_bw, &o->max_bw, token); + break; + case CSH_LOOKUP("bw-send"): + evs_parse_bw(&o->min_bw_send, &o->max_bw_send, token); + break; + case CSH_LOOKUP("bw-recv"): + evs_parse_bw(&o->min_bw_recv, &o->max_bw_recv, token); + break; + case CSH_LOOKUP("mode-set"):; + str mode; + while (str_token_sep(&mode, token, ',') == 0) { + int m = str_to_i(&mode, -1); + if (m < 0 || m > 8) + continue; + o->mode_set |= (1 << m); + } + break; + case CSH_LOOKUP("mode-change-period"): + o->mode_change_period = str_to_i(token, 0); + break; + case CSH_LOOKUP("mode-change-neighbor"): + if (token->len == 1 && token->s[0] == '1') + o->mode_change_neighbor = 1; + break; } } static int evs_format_parse(struct rtp_codec_format *f, const str *fmtp) { diff --git a/lib/common.Makefile b/lib/common.Makefile index a24601c64..c6f0b230c 100644 --- a/lib/common.Makefile +++ b/lib/common.Makefile @@ -34,7 +34,7 @@ $(DAEMONSRCS) $(HASHSRCS): $(patsubst %,../daemon/%,$(DAEMONSRCS)) $(patsubst %, --release="$(RTPENGINE_VERSION)" \ $< $@ -resample.c codeclib.c mix.c: fix_frame_channel_layout.h +resample.c codeclib.strhash.c mix.c: fix_frame_channel_layout.h ifeq ($(with_transcoding),yes) codec.c: dtmf_rx_fillin.h diff --git a/recording-daemon/Makefile b/recording-daemon/Makefile index e5bd79653..22897cc91 100644 --- a/recording-daemon/Makefile +++ b/recording-daemon/Makefile @@ -31,7 +31,7 @@ include ../lib/g729.Makefile SRCS= epoll.c garbage.c inotify.c main.c metafile.c stream.c recaux.c packet.c \ decoder.c output.c mix.c db.c log.c forward.c tag.c poller.c -LIBSRCS= loglib.c auxlib.c rtplib.c codeclib.c resample.c str.c socket.c streambuf.c ssllib.c \ +LIBSRCS= loglib.c auxlib.c rtplib.c codeclib.strhash.c resample.c str.c socket.c streambuf.c ssllib.c \ dtmflib.c OBJS= $(SRCS:.c=.o) $(LIBSRCS:.c=.o) diff --git a/t/Makefile b/t/Makefile index 41e8b0268..160f3a313 100644 --- a/t/Makefile +++ b/t/Makefile @@ -74,7 +74,7 @@ SRCS+= spandsp_recv_fax_pcm.c spandsp_recv_fax_t38.c spandsp_send_fax_pcm.c \ ifeq ($(with_amr_tests),yes) SRCS+= test-amr-decode.c test-amr-encode.c endif -LIBSRCS+= codeclib.c resample.c socket.c streambuf.c dtmflib.c +LIBSRCS+= codeclib.strhash.c resample.c socket.c streambuf.c dtmflib.c DAEMONSRCS+= codec.c call.c ice.c kernel.c media_socket.c stun.c bencode.c poller.c \ dtls.c recording.c statistics.c rtcp.c redis.c iptables.c graphite.c \ cookie_cache.c udp_listener.c homer.c load.c cdr.c dtmf.c timerthread.c \ @@ -232,9 +232,9 @@ spandsp_recv_fax_t38: spandsp_recv_fax_t38.o spandsp_raw_fax_tests: spandsp_send_fax_pcm spandsp_recv_fax_pcm spandsp_send_fax_t38 spandsp_recv_fax_t38 -test-amr-decode: test-amr-decode-test.o $(COMMONOBJS) codeclib.o resample.o dtmflib.o +test-amr-decode: test-amr-decode-test.o $(COMMONOBJS) codeclib.strhash.o resample.o dtmflib.o -test-amr-encode: test-amr-encode-test.o $(COMMONOBJS) codeclib.o resample.o dtmflib.o +test-amr-encode: test-amr-encode-test.o $(COMMONOBJS) codeclib.strhash.o resample.o dtmflib.o test-dtmf-detect: test-dtmf-detect.o @@ -242,7 +242,7 @@ aes-crypt: aes-crypt.o $(COMMONOBJS) crypto.o aead-aes-crypt: aead-aes-crypt.o $(COMMONOBJS) crypto.o -test-stats: test-stats.o $(COMMONOBJS) codeclib.o resample.o codec.o ssrc.o call.o ice.o aux.o \ +test-stats: test-stats.o $(COMMONOBJS) codeclib.strhash.o resample.o codec.o ssrc.o call.o ice.o aux.o \ kernel.o media_socket.o stun.o bencode.o socket.o poller.o dtls.o recording.o statistics.o \ rtcp.o redis.o iptables.o graphite.o call_interfaces.strhash.o sdp.strhash.o rtp.o crypto.o \ control_ng.strhash.o graphite.o \ @@ -250,7 +250,7 @@ test-stats: test-stats.o $(COMMONOBJS) codeclib.o resample.o codec.o ssrc.o call media_player.o jitter_buffer.o dtmflib.o t38.o tcp_listener.o mqtt.o janus.strhash.o \ websocket.o cli.o -test-transcode: test-transcode.o $(COMMONOBJS) codeclib.o resample.o codec.o ssrc.o call.o ice.o aux.o \ +test-transcode: test-transcode.o $(COMMONOBJS) codeclib.strhash.o resample.o codec.o ssrc.o call.o ice.o aux.o \ kernel.o media_socket.o stun.o bencode.o socket.o poller.o dtls.o recording.o statistics.o \ rtcp.o redis.o iptables.o graphite.o call_interfaces.strhash.o sdp.strhash.o rtp.o crypto.o \ control_ng.strhash.o \ @@ -258,9 +258,9 @@ test-transcode: test-transcode.o $(COMMONOBJS) codeclib.o resample.o codec.o ssr media_player.o jitter_buffer.o dtmflib.o t38.o tcp_listener.o mqtt.o janus.strhash.o websocket.o \ cli.o -test-resample: test-resample.o $(COMMONOBJS) codeclib.o resample.o dtmflib.o +test-resample: test-resample.o $(COMMONOBJS) codeclib.strhash.o resample.o dtmflib.o -test-payload-tracker: test-payload-tracker.o $(COMMONOBJS) ssrc.o aux.o auxlib.o rtp.o crypto.o codeclib.o \ +test-payload-tracker: test-payload-tracker.o $(COMMONOBJS) ssrc.o aux.o auxlib.o rtp.o crypto.o codeclib.strhash.o \ resample.o dtmflib.o test-kernel-module: test-kernel-module.o $(COMMONOBJS) kernel.o