From 0918ea2c849a742001b118589a3b81be23b5a3be Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Tue, 1 Sep 2020 14:15:24 -0400 Subject: [PATCH] TT#91003 abstractise fmtp key-value parsing Change-Id: Icf5a0d68e1c3d669c395e36c3a0a57b15301e30a --- lib/codeclib.c | 110 ++++++++++++++++++++++++++++++------------------- 1 file changed, 67 insertions(+), 43 deletions(-) diff --git a/lib/codeclib.c b/lib/codeclib.c index a6f7034df..79df83636 100644 --- a/lib/codeclib.c +++ b/lib/codeclib.c @@ -1481,6 +1481,38 @@ static int ilbc_decoder_input(decoder_t *dec, const str *data, GQueue *out) { } +static void codeclib_key_value_parse(const str *instr, int need_value, + void (*cb)(str *key, str *value, void *data), void *data) +{ + if (!instr || !instr->s) + return; + + // semicolon-separated key=value + str s = *instr; + str key, value; + while (str_token_sep(&value, &s, ';') == 0) { + if (str_token(&key, &value, '=')) { + if (need_value) + continue; + value = STR_NULL; + } + + // truncate whitespace + while (key.len && key.s[0] == ' ') + str_shift(&key, 1); + while (key.len && key.s[key.len - 1] == ' ') + key.len--; + while (value.len && value.s[0] == ' ') + str_shift(&value, 1); + while (value.len && value.s[value.len - 1] == ' ') + value.len--; + + cb(&key, &value, data); + } + +} + + @@ -1549,6 +1581,40 @@ const static unsigned int amr_wb_bits_per_frame[AMR_FT_TYPES] = { 0, // invalid // 12 0, // invalid // 13 }; +static void amr_set_encdec_options_cb(str *key, str *token, void *data) { + codec_options_t *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') { + 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); + } + } + // XXX other options +} static void amr_set_encdec_options(codec_options_t *opts, const str *fmtp, const codec_def_t *def) { if (!strcmp(def->rtpname, "AMR")) { opts->amr.bits_per_frame = amr_bits_per_frame; @@ -1559,49 +1625,7 @@ static void amr_set_encdec_options(codec_options_t *opts, const str *fmtp, const opts->amr.bitrates = amr_wb_bitrates; } - if (!fmtp || !fmtp->s) - return; - - // semicolon-separated key=value - str s = *fmtp; - str token, key; - while (str_token_sep(&token, &s, ';') == 0) { - if (str_token(&key, &token, '=')) - continue; - while (key.len && key.s[0] == ' ') - str_shift(&key, 1); - - 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') { - 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); - } - } - // XXX other options - } + codeclib_key_value_parse(fmtp, 1, amr_set_encdec_options_cb, opts); } static void amr_set_enc_options(encoder_t *enc, const str *fmtp, const str *codec_opts) { amr_set_encdec_options(&enc->codec_options, fmtp, enc->def);