<p>ipse has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/libosmo-netif/+/17997">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">amr: Fix OA to BWE conversion for SID frames.<br><br>Size of a single AMR SID frame doesn't reduce by a byte when converted<br>from octet-aligned to bandwidth-efficient mode. So old code generated<br>truncated SID frames which are 1 byte short. This patch fixes<br>the length calculation by properly counting bits.<br><br>Proper bit counting is also bringing us one small step closer to<br>properly handlig multi-frame AMR packets.<br><br>Change-Id: I9fc5fb92e9bada22a47a82fcfb0925e892e50ced<br>---<br>M include/osmocom/netif/amr.h<br>M src/amr.c<br>2 files changed, 33 insertions(+), 2 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/libosmo-netif refs/changes/97/17997/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/netif/amr.h b/include/osmocom/netif/amr.h</span><br><span>index 6e37c99..ab7b10d 100644</span><br><span>--- a/include/osmocom/netif/amr.h</span><br><span>+++ b/include/osmocom/netif/amr.h</span><br><span>@@ -93,6 +93,16 @@</span><br><span> /* NOTE: the above constant refers to the length of one AMR speech frame-block,</span><br><span>  * not counting CMR, TOC. */</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#define AMR_FT_0_LEN_BITS       95      /* 4.75 */</span><br><span style="color: hsl(120, 100%, 40%);">+#define AMR_FT_1_LEN_BITS   103     /* 5.15 */</span><br><span style="color: hsl(120, 100%, 40%);">+#define AMR_FT_2_LEN_BITS   118     /* 5.90 */</span><br><span style="color: hsl(120, 100%, 40%);">+#define AMR_FT_3_LEN_BITS   134     /* 6.70 */</span><br><span style="color: hsl(120, 100%, 40%);">+#define AMR_FT_4_LEN_BITS   148     /* 7.40 */</span><br><span style="color: hsl(120, 100%, 40%);">+#define AMR_FT_5_LEN_BITS   159     /* 7.95 */</span><br><span style="color: hsl(120, 100%, 40%);">+#define AMR_FT_6_LEN_BITS   204     /* 10.2 */</span><br><span style="color: hsl(120, 100%, 40%);">+#define AMR_FT_7_LEN_BITS   244     /* 12.2 */</span><br><span style="color: hsl(120, 100%, 40%);">+#define AMR_FT_SID_LEN_BITS 39      /* SID */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> int osmo_amr_ft_valid(uint8_t amr_ft);</span><br><span> size_t osmo_amr_bytes(uint8_t amr_cmr);</span><br><span> </span><br><span>diff --git a/src/amr.c b/src/amr.c</span><br><span>index 5609c46..c69aaff 100644</span><br><span>--- a/src/amr.c</span><br><span>+++ b/src/amr.c</span><br><span>@@ -29,6 +29,18 @@</span><br><span>  *      7         12.20      244    31</span><br><span>  */</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static size_t amr_ft_to_bits[AMR_FT_MAX] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ [AMR_FT_0]      = AMR_FT_0_LEN_BITS,</span><br><span style="color: hsl(120, 100%, 40%);">+  [AMR_FT_1]      = AMR_FT_1_LEN_BITS,</span><br><span style="color: hsl(120, 100%, 40%);">+  [AMR_FT_2]      = AMR_FT_2_LEN_BITS,</span><br><span style="color: hsl(120, 100%, 40%);">+  [AMR_FT_3]      = AMR_FT_3_LEN_BITS,</span><br><span style="color: hsl(120, 100%, 40%);">+  [AMR_FT_4]      = AMR_FT_4_LEN_BITS,</span><br><span style="color: hsl(120, 100%, 40%);">+  [AMR_FT_5]      = AMR_FT_5_LEN_BITS,</span><br><span style="color: hsl(120, 100%, 40%);">+  [AMR_FT_6]      = AMR_FT_6_LEN_BITS,</span><br><span style="color: hsl(120, 100%, 40%);">+  [AMR_FT_7]      = AMR_FT_7_LEN_BITS,</span><br><span style="color: hsl(120, 100%, 40%);">+  [AMR_FT_SID]    = AMR_FT_SID_LEN_BITS,</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static size_t amr_ft_to_bytes[AMR_FT_MAX] = {</span><br><span>        [AMR_FT_0]      = AMR_FT_0_LEN,</span><br><span>      [AMR_FT_1]      = AMR_FT_1_LEN,</span><br><span>@@ -41,6 +53,11 @@</span><br><span>         [AMR_FT_SID]    = AMR_FT_SID_LEN,</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+size_t osmo_amr_bits(uint8_t amr_ft)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  return amr_ft_to_bits[amr_ft];</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> size_t osmo_amr_bytes(uint8_t amr_ft)</span><br><span> {</span><br><span>    return amr_ft_to_bytes[amr_ft];</span><br><span>@@ -119,8 +136,10 @@</span><br><span> int osmo_amr_oa_to_bwe(uint8_t *payload, unsigned int payload_len)</span><br><span> {</span><br><span>    struct amr_hdr *oa_hdr = (struct amr_hdr *)payload;</span><br><span style="color: hsl(120, 100%, 40%);">+   unsigned int ft = oa_hdr->ft;</span><br><span>     unsigned int frame_len = payload_len - sizeof(struct amr_hdr);</span><br><span>       unsigned int i;</span><br><span style="color: hsl(120, 100%, 40%);">+       int bwe_payload_len;</span><br><span> </span><br><span>     /* This implementation is not capable to handle multi-frame</span><br><span>   * packets, so we need to make sure that the frame we operate on</span><br><span>@@ -137,8 +156,10 @@</span><br><span>              payload[i + 2] = payload[i + 2] << 6;</span><br><span>  }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   /* The overall saving is one byte! */</span><br><span style="color: hsl(0, 100%, 40%);">-   return payload_len - 1;</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Calculate new payload length */</span><br><span style="color: hsl(120, 100%, 40%);">+    bwe_payload_len = (10 + osmo_amr_bits(ft) + 7) / 8;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return bwe_payload_len;</span><br><span> }</span><br><span> </span><br><span> /*! Convert an AMR frame from bandwith-efficient mode to octet-aligned mode.</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmo-netif/+/17997">change 17997</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/libosmo-netif/+/17997"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmo-netif </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I9fc5fb92e9bada22a47a82fcfb0925e892e50ced </div>
<div style="display:none"> Gerrit-Change-Number: 17997 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: ipse <Alexander.Chemeris@gmail.com> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>