aboutsummaryrefslogtreecommitdiffstats
path: root/src/osmo-bts-sysmo
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2011-09-03 18:10:26 +0200
committerHarald Welte <laforge@gnumonks.org>2011-09-03 18:10:26 +0200
commit099fb3b17cf29d6d152abb4d2cf4aef76916f8a0 (patch)
treed5fcc1c0ad7e47ac9f12cebab2086fb497460d14 /src/osmo-bts-sysmo
parent716dded7731f69f6a58de15aaa6315b44784e6ce (diff)
Sysmobts L1: Implement HR codec support
We don't really know if the HR encoding is compatible with other equipment, but it _should_ follow Chapter 5.2 of ETSI TS 101 318. Please note that RFC5993 also specifies a way to encode GSM-HR into RTP, we do not try to be compatible with that. The only difference seems to be one additional TOC octet at the beginning of the payload field.
Diffstat (limited to 'src/osmo-bts-sysmo')
-rw-r--r--src/osmo-bts-sysmo/tch.c25
1 files changed, 22 insertions, 3 deletions
diff --git a/src/osmo-bts-sysmo/tch.c b/src/osmo-bts-sysmo/tch.c
index 6710edd..1225010 100644
--- a/src/osmo-bts-sysmo/tch.c
+++ b/src/osmo-bts-sysmo/tch.c
@@ -158,10 +158,18 @@ static struct msgb *l1_to_rtppayload_hr(uint8_t *l1_payload, uint8_t payload_len
struct msgb *msg = msgb_alloc_headroom(1024, 128, "L1C-to-RTP");
uint8_t *cur;
-#warning Test GSM HR
+ if (payload_len != GSM_HR_BYTES) {
+ LOGP(DL1C, LOGL_ERROR, "L1 HR frame length %u != expected %u\n",
+ payload_len, GSM_HR_BYTES);
+ return NULL;
+ }
+
cur = msgb_put(msg, GSM_HR_BYTES);
memcpy(cur, l1_payload, GSM_HR_BYTES);
+ /* reverse the bit-order of each payload byte */
+ osmo_revbytebits_buf(cur, GSM_HR_BYTES);
+
return msg;
}
@@ -174,8 +182,19 @@ static struct msgb *l1_to_rtppayload_hr(uint8_t *l1_payload, uint8_t payload_len
static int rtppayload_to_l1_hr(uint8_t *l1_payload, uint8_t *rtp_payload,
unsigned int payload_len)
{
-#warning Implement GSM HR
- return 0;
+
+ if (payload_len != GSM_HR_BYTES) {
+ LOGP(DL1C, LOGL_ERROR, "RTP HR frame length %u != expected %u\n",
+ payload_len, GSM_HR_BYTES);
+ return 0;
+ }
+
+ memcpy(l1_payload, rtp_payload, GSM_HR_BYTES);
+
+ /* reverse the bit-order of each payload byte */
+ osmo_revbytebits_buf(l1_payload, GSM_HR_BYTES);
+
+ return GSM_HR_BYTES;
}
#define AMR_TOC_QBIT 0x04