diff options
author | Pau Espin Pedrol <pespin@sysmocom.de> | 2022-12-21 18:16:58 +0100 |
---|---|---|
committer | Pau Espin Pedrol <pespin@sysmocom.de> | 2022-12-21 18:37:45 +0100 |
commit | 550aaa28dcea55a528ef7c190411caa7dc90fa4d (patch) | |
tree | d6b9f7d7f8a497baa9b1ac58beb52997cbd881dd | |
parent | 26a02deb1215fb68847b2078d97495a01fe2a857 (diff) |
amr: use struct bwe_hdr in osmo_amr_bwe_to_oa()
The header conversion is now much clearer. Take the chance to delay the
memset(buf) after the checks.
Change-Id: I5042dc628ac70eca62b4980f4acae991dd976528
-rw-r--r-- | src/amr.c | 23 |
1 files changed, 15 insertions, 8 deletions
@@ -203,11 +203,14 @@ int osmo_amr_bwe_to_oa(uint8_t *payload, unsigned int payload_len, { uint8_t buf[256]; /* The header is only valid after shifting first two bytes to OA mode */ + struct amr_hdr_bwe *bwe_hdr = (struct amr_hdr_bwe *)payload; struct amr_hdr *oa_hdr; unsigned int i; unsigned int oa_payload_len; + uint8_t ft; - memset(buf, 0, sizeof(buf)); + if (payload_len < sizeof(struct amr_hdr_bwe)) + return -1; if (payload_len + 1 > payload_maxlen) return -1; @@ -215,15 +218,19 @@ int osmo_amr_bwe_to_oa(uint8_t *payload, unsigned int payload_len, if (payload_len + 1 > sizeof(buf)) return -1; - buf[0] = payload[0] & 0xf0; - buf[1] = payload[0] << 4; - buf[1] |= (payload[1] >> 4) & 0x0c; + ft = (bwe_hdr->ft_hi << 1) | bwe_hdr->ft_lo; + if (!osmo_amr_ft_valid(ft)) + return -1; - /* Calculate new payload length */ + memset(buf, 0, sizeof(buf)); oa_hdr = (struct amr_hdr *)buf; - if (!osmo_amr_ft_valid(oa_hdr->ft)) - return -1; - oa_payload_len = 2 + osmo_amr_bytes(oa_hdr->ft); + oa_hdr->cmr = bwe_hdr->cmr; + oa_hdr->f = bwe_hdr->f; + oa_hdr->ft = ft; + oa_hdr->q = bwe_hdr->q; + + /* Calculate new payload length */ + oa_payload_len = 2 + osmo_amr_bytes(ft); for (i = 2; i < oa_payload_len - 1; i++) { buf[i] = payload[i - 1] << 2; |