<p>laforge has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/libosmocore/+/18246">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">codec: Add functions for AMR s->d bits and d->s bits<br><br>These functions implement re-ordering of bits as per TS 06.90 / 26.101<br>based on the already existing tables we've had in libosmocoding.<br><br>Change-Id: Ia4ac2aea2e96f9185f082a07ca64dfc5276efb46<br>---<br>M include/osmocom/codec/codec.h<br>M src/codec/gsm690.c<br>2 files changed, 100 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/46/18246/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/codec/codec.h b/include/osmocom/codec/codec.h</span><br><span>index 6a1bf9f..cceedc5 100644</span><br><span>--- a/include/osmocom/codec/codec.h</span><br><span>+++ b/include/osmocom/codec/codec.h</span><br><span>@@ -6,6 +6,7 @@</span><br><span> #include <stdbool.h></span><br><span> </span><br><span> #include <osmocom/core/utils.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/bits.h></span><br><span> </span><br><span> /* TS 101318 Chapter 5.1: 260 bits + 4bit sig */</span><br><span> #define GSM_FR_BYTES 33</span><br><span>@@ -51,6 +52,9 @@</span><br><span>        AMR_GOOD = 1</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+int osmo_amr_s_to_d(ubit_t *out, const ubit_t *in, uint16_t n_bits, enum osmo_amr_type amr_mode);</span><br><span style="color: hsl(120, 100%, 40%);">+int osmo_amr_d_to_s(ubit_t *out, const ubit_t *in, uint16_t n_bits, enum osmo_amr_type amr_mode);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*! Check if given AMR Frame Type is a speech frame</span><br><span>  *  \param[in] ft AMR Frame Type</span><br><span>  *  \returns true if AMR with given Frame Type contains voice, false otherwise</span><br><span>diff --git a/src/codec/gsm690.c b/src/codec/gsm690.c</span><br><span>index 8ab1df1..c01bd5f 100644</span><br><span>--- a/src/codec/gsm690.c</span><br><span>+++ b/src/codec/gsm690.c</span><br><span>@@ -2,6 +2,7 @@</span><br><span>  * GSM 06.90 - GSM AMR Codec. */</span><br><span> /*</span><br><span>  * (C) 2010 Sylvain Munaut <tnt@246tNt.com></span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2020 Harald Welte <laforge@gnumonks.org></span><br><span>  *</span><br><span>  * All Rights Reserved</span><br><span>  *</span><br><span>@@ -29,6 +30,7 @@</span><br><span> #include <stdlib.h></span><br><span> </span><br><span> #include <osmocom/core/utils.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/bits.h></span><br><span> #include <osmocom/codec/codec.h></span><br><span> /*</span><br><span>  * These table map between the raw encoder parameter output and</span><br><span>@@ -216,6 +218,100 @@</span><br><span>        92,  31,  52,  65,  86,</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+struct ts26101_reorder_table {</span><br><span style="color: hsl(120, 100%, 40%);">+    /*! Table as per TS 26.101 Annex B to compute d-bits from s-bits */</span><br><span style="color: hsl(120, 100%, 40%);">+   const uint16_t *s_to_d;</span><br><span style="color: hsl(120, 100%, 40%);">+       /*! size of table */</span><br><span style="color: hsl(120, 100%, 40%);">+  uint8_t len;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static const struct ts26101_reorder_table ts26101_reorder_tables[8] = {</span><br><span style="color: hsl(120, 100%, 40%);">+   [AMR_4_75] = {</span><br><span style="color: hsl(120, 100%, 40%);">+                .s_to_d = gsm690_4_75_bitorder,</span><br><span style="color: hsl(120, 100%, 40%);">+               .len = ARRAY_SIZE(gsm690_4_75_bitorder),</span><br><span style="color: hsl(120, 100%, 40%);">+      },</span><br><span style="color: hsl(120, 100%, 40%);">+    [AMR_5_15] = {</span><br><span style="color: hsl(120, 100%, 40%);">+                .s_to_d = gsm690_5_15_bitorder,</span><br><span style="color: hsl(120, 100%, 40%);">+               .len = ARRAY_SIZE(gsm690_5_15_bitorder),</span><br><span style="color: hsl(120, 100%, 40%);">+      },</span><br><span style="color: hsl(120, 100%, 40%);">+    [AMR_5_90] = {</span><br><span style="color: hsl(120, 100%, 40%);">+                .s_to_d = gsm690_5_9_bitorder,</span><br><span style="color: hsl(120, 100%, 40%);">+                .len = ARRAY_SIZE(gsm690_5_9_bitorder),</span><br><span style="color: hsl(120, 100%, 40%);">+       },</span><br><span style="color: hsl(120, 100%, 40%);">+    [AMR_6_70] = {</span><br><span style="color: hsl(120, 100%, 40%);">+                .s_to_d = gsm690_6_7_bitorder,</span><br><span style="color: hsl(120, 100%, 40%);">+                .len = ARRAY_SIZE(gsm690_6_7_bitorder),</span><br><span style="color: hsl(120, 100%, 40%);">+       },</span><br><span style="color: hsl(120, 100%, 40%);">+    [AMR_7_40] = {</span><br><span style="color: hsl(120, 100%, 40%);">+                .s_to_d = gsm690_7_4_bitorder,</span><br><span style="color: hsl(120, 100%, 40%);">+                .len = ARRAY_SIZE(gsm690_7_4_bitorder),</span><br><span style="color: hsl(120, 100%, 40%);">+       },</span><br><span style="color: hsl(120, 100%, 40%);">+    [AMR_7_95] = {</span><br><span style="color: hsl(120, 100%, 40%);">+                .s_to_d = gsm690_7_95_bitorder,</span><br><span style="color: hsl(120, 100%, 40%);">+               .len = ARRAY_SIZE(gsm690_7_95_bitorder),</span><br><span style="color: hsl(120, 100%, 40%);">+      },</span><br><span style="color: hsl(120, 100%, 40%);">+    [AMR_10_2] = {</span><br><span style="color: hsl(120, 100%, 40%);">+                .s_to_d = gsm690_10_2_bitorder,</span><br><span style="color: hsl(120, 100%, 40%);">+               .len = ARRAY_SIZE(gsm690_10_2_bitorder),</span><br><span style="color: hsl(120, 100%, 40%);">+      },</span><br><span style="color: hsl(120, 100%, 40%);">+    [AMR_12_2] = {</span><br><span style="color: hsl(120, 100%, 40%);">+                .s_to_d = gsm690_12_2_bitorder,</span><br><span style="color: hsl(120, 100%, 40%);">+               .len = ARRAY_SIZE(gsm690_12_2_bitorder),</span><br><span style="color: hsl(120, 100%, 40%);">+      },</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*! Convert from S-bits (codec output) to d-bits.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[out] out user-provided output buffer for generated unpacked d-bits</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] in input buffer for unpacked s-bits</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] n_bits number of bits (in both in and out)</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] AMR mode (0..7) */</span><br><span style="color: hsl(120, 100%, 40%);">+int osmo_amr_s_to_d(ubit_t *out, const ubit_t *in, uint16_t n_bits, enum osmo_amr_type amr_mode)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     const struct ts26101_reorder_table *tbl;</span><br><span style="color: hsl(120, 100%, 40%);">+      int i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      if (amr_mode >= ARRAY_SIZE(ts26101_reorder_tables))</span><br><span style="color: hsl(120, 100%, 40%);">+                return -ENODEV;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     tbl = &ts26101_reorder_tables[amr_mode];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (n_bits >= tbl->len)</span><br><span style="color: hsl(120, 100%, 40%);">+         return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     for (i = 0; i < n_bits; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+             uint16_t n = tbl->s_to_d[i];</span><br><span style="color: hsl(120, 100%, 40%);">+               out[i] = in[n];</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return n_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*! Convert from d-bits to s-bits (codec input).</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[out] out user-provided output buffer for generated unpacked s-bits</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] in input buffer for unpacked d-bits</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] n_bits number of bits (in both in and out)</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] AMR mode (0..7) */</span><br><span style="color: hsl(120, 100%, 40%);">+int osmo_amr_d_to_s(ubit_t *out, const ubit_t *in, uint16_t n_bits, enum osmo_amr_type amr_mode)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   const struct ts26101_reorder_table *tbl;</span><br><span style="color: hsl(120, 100%, 40%);">+      int i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      if (amr_mode >= ARRAY_SIZE(ts26101_reorder_tables))</span><br><span style="color: hsl(120, 100%, 40%);">+                return -ENODEV;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     tbl = &ts26101_reorder_tables[amr_mode];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (n_bits >= tbl->len)</span><br><span style="color: hsl(120, 100%, 40%);">+         return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     for (i = 0; i < n_bits; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+             uint16_t n = tbl->s_to_d[i];</span><br><span style="color: hsl(120, 100%, 40%);">+               out[n] = in[i];</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return n_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* See also RFC 4867 ยง3.6, Table 1, Column "Total speech bits" */</span><br><span> static const uint8_t amr_len_by_ft[16] = {</span><br><span>    12, 13, 15, 17, 19, 20, 26, 31, 5,  0,  0,  0,  0,  0,  0,  0</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmocore/+/18246">change 18246</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/libosmocore/+/18246"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmocore </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Ia4ac2aea2e96f9185f082a07ca64dfc5276efb46 </div>
<div style="display:none"> Gerrit-Change-Number: 18246 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>