diff options
author | Vadim Yanitskiy <vyanitskiy@sysmocom.de> | 2022-05-15 14:50:45 +0300 |
---|---|---|
committer | Vadim Yanitskiy <vyanitskiy@sysmocom.de> | 2022-05-16 00:51:57 +0300 |
commit | 71e8091c9d369b5f91cd2593e84d9db8264d47b4 (patch) | |
tree | 807fade5c6c000f5ac004f6f001c5b5c7d68ae73 | |
parent | coding: use switch statement in gsm0503_tch_a[fh]s_decode_dtx() (diff) | |
download | libosmocore-71e8091c9d369b5f91cd2593e84d9db8264d47b4.tar.xz libosmocore-71e8091c9d369b5f91cd2593e84d9db8264d47b4.zip |
coding: properly handle AFS_SID_UPDATE frames in DTX mode
There are two similar values in enum gsm0503_amr_dtx_frames:
* AFS_SID_UPDATE - precursor of SID UPDATE,
* AFS_SID_UPDATE_CN - the actual SID UPDATE.
The former is internally used by libosmocoding to mark the current
frame as a precursor of the actual SID UPDATE frame - the later.
+---+---+---+---+---+---+---+---+
| _ | _ | _ | _ | a | b | c | d | AFS_SID_UPDATE
+---+---+---+---+---+---+---+---+
| a | b | c | d | _ | _ | _ | _ | AFS_SID_UPDATE_CN
+---+---+---+---+---+---+---+---+
This is required because function gsm0503_tch_afs_decode_dtx() is
invoked by TDMA scheduler on every 4th received burst, while the
burst buffer is 8 bursts wide.
Currently, whenever gsm0503_detect_afs_dtx_frame() detects an
AFS_SID_UPDATE frame, we still attempt to decode it as a speech
or data below in gsm0503_tch_afs_decode_dtx(). This is indeed
a bug, which results in unexpected BER values:
* expected BER 0/212,
* actual BER 252/448.
We should return immediately once we have detected an AFS_SID_UPDATE.
This patch fixes unexpected BER-SUB values during DTXu silence periods.
Change-Id: I813081a4c0865958eee2496fe251ae17235ac842
Related: SYS#5853
-rw-r--r-- | src/coding/gsm0503_coding.c | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/src/coding/gsm0503_coding.c b/src/coding/gsm0503_coding.c index 6f19ed92..98439e37 100644 --- a/src/coding/gsm0503_coding.c +++ b/src/coding/gsm0503_coding.c @@ -2222,6 +2222,7 @@ int gsm0503_tch_afs_decode_dtx(uint8_t *tch_data, const sbit_t *bursts, tch_amr_reassemble(tch_data, conv, 39); len = 5; goto out; + case AFS_SID_UPDATE: case AFS_ONSET: len = 0; goto out; |