Browse Source

MT#56008 use hashed string lookup in codeclib.c

Change-Id: I627ac72aa994dea4b52bd3b8b9e8d587bb4c0127
pull/1579/head
Richard Fuchs 3 years ago
parent
commit
0448e12e0d
6 changed files with 211 additions and 163 deletions
  1. +1
    -1
      daemon/Makefile
  2. +12
    -1
      lib/.ycm_extra_conf.py
  3. +189
    -152
      lib/codeclib.c
  4. +1
    -1
      lib/common.Makefile
  5. +1
    -1
      recording-daemon/Makefile
  6. +7
    -7
      t/Makefile

+ 1
- 1
daemon/Makefile View File

@ -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)


+ 12
- 1
lib/.ycm_extra_conf.py View File

@ -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]<<a)^!):0)'
csh_lookup_str = '!'
for num in range(30):
t_str = repl_tmpl.replace('a', str(num))
csh_lookup_str = csh_lookup_str.replace('!', t_str)
csh_lookup_str = csh_lookup_str.replace('!', '0')
# These are the compilation flags that will be used in case there's no
# compilation database set.
flags = [
@ -33,7 +42,9 @@ flags = [
'-DRE_PLUGIN_DIR="/usr/lib/rtpengine"',
'-DWITH_IPTABLES_OPTION',
'-DHAVE_BCG729',
'-O2',
'-D__csh_lookup(x)=str_hash(x)',
'-DCSH_LOOKUP(x)=' + csh_lookup_str,
'-O2',
'-fstack-protector',
'--param=ssp-buffer-size=4',
'-Wformat',


+ 189
- 152
lib/codeclib.c View File

@ -1862,37 +1862,52 @@ struct libopus_encoder_options {
static void libopus_set_enc_opts(str *key, str *val, void *p) {
struct libopus_encoder_options *opts = p;
if (!str_cmp(key, "complexity") || !str_cmp(key, "compression_level"))
opts->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) {


+ 1
- 1
lib/common.Makefile View File

@ -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


+ 1
- 1
recording-daemon/Makefile View File

@ -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)


+ 7
- 7
t/Makefile View File

@ -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


Loading…
Cancel
Save