falconia has uploaded this change for review. ( https://gerrit.osmocom.org/c/libosmo-abis/+/41478?usp=email )
Change subject: trau_frame: fix de/encoding of TRAU-AMR-8k-6k7 format ......................................................................
trau_frame: fix de/encoding of TRAU-AMR-8k-6k7 format
There exist 3 TRAU frame types (distinguished by sync pattern) for AMR on 8 kbit/s subslots: Low, 6k7 and 7k4. osmo_trau_frame_encode() and osmo_trau_frame_decode_8k() APIs support all 3 TRAU-AMR-8k frame types since the original 2020 implementation - however, encoding and decoding of 6k7 format was incorrect. Fix it.
Correctness of the new implementation is verified by unit tests added with the next patch in this series.
Change-Id: Ibb98b0c189ced5248dca217384ca34b6a5f8b210 --- M src/trau/trau_frame.c 1 file changed, 11 insertions(+), 11 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/libosmo-abis refs/changes/78/41478/1
diff --git a/src/trau/trau_frame.c b/src/trau/trau_frame.c index 896bc20..d8541c5 100644 --- a/src/trau/trau_frame.c +++ b/src/trau/trau_frame.c @@ -1045,15 +1045,15 @@ /* D8 .. D11 */ memcpy(fr->d_bits + d_idx, trau_bits + 2 * 8 + 4, 4); d_idx += 4; - /* D12 .. D39 */ - for (i = 3; i < 7; i++) { + /* D12 .. D32 */ + for (i = 3; i < 6; i++) { int offset = i * 8; - memcpy(fr->d_bits + d_idx, trau_bits + offset + 2, 7); + memcpy(fr->d_bits + d_idx, trau_bits + offset + 1, 7); d_idx += 7; }
- /* D40 .. D137 */ - for (i = 7; i < 20; i+= 2) { + /* D33 .. D137 */ + for (i = 6; i < 20; i += 2) { int offset = i * 8; memcpy(fr->d_bits + d_idx, trau_bits + offset + 1, 15); d_idx += 15; @@ -1074,7 +1074,7 @@ trau_bits[3 * 8] = 1; trau_bits[4 * 8] = 1; trau_bits[5 * 8] = 0; - for (i = 5; i < 20; i += 2) + for (i = 6; i < 20; i += 2) trau_bits[i * 8] = 1;
/* D1 .. D7 */ @@ -1085,15 +1085,15 @@ /* D8 .. D11 */ memcpy(trau_bits + 2 * 8 + 4, fr->d_bits + d_idx, 4); d_idx += 4; - /* D12 .. D39 */ - for (i = 3; i < 7; i++) { + /* D12 .. D32 */ + for (i = 3; i < 6; i++) { int offset = i * 8; - memcpy(trau_bits + offset + 2, fr->d_bits + d_idx, 7); + memcpy(trau_bits + offset + 1, fr->d_bits + d_idx, 7); d_idx += 7; }
- /* D40 .. D137 */ - for (i = 7; i < 20; i+= 2) { + /* D33 .. D137 */ + for (i = 6; i < 20; i += 2) { int offset = i * 8; memcpy(trau_bits + offset + 1, fr->d_bits + d_idx, 15); d_idx += 15;