aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPau Espin Pedrol <pespin@sysmocom.de>2022-12-21 18:16:58 +0100
committerPau Espin Pedrol <pespin@sysmocom.de>2022-12-21 18:37:45 +0100
commit550aaa28dcea55a528ef7c190411caa7dc90fa4d (patch)
treed6b9f7d7f8a497baa9b1ac58beb52997cbd881dd
parent26a02deb1215fb68847b2078d97495a01fe2a857 (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.c23
1 files changed, 15 insertions, 8 deletions
diff --git a/src/amr.c b/src/amr.c
index b648d54..e4f0dd8 100644
--- a/src/amr.c
+++ b/src/amr.c
@@ -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;