diff options
-rw-r--r-- | openbsc/src/libtrau/rtp_proxy.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/openbsc/src/libtrau/rtp_proxy.c b/openbsc/src/libtrau/rtp_proxy.c index 8c982c976..26bffef98 100644 --- a/openbsc/src/libtrau/rtp_proxy.c +++ b/openbsc/src/libtrau/rtp_proxy.c @@ -147,6 +147,7 @@ static int rtp_decode(struct msgb *msg, uint32_t callref, struct msgb **data) break; case RTP_PT_GSM_HALF: msg_type = GSM_TCHH_FRAME; + payload_len++; if (payload_len != RTP_LEN_GSM_HALF) { DEBUGPC(DLMUX, "received RTP half rate frame with " "payload length != %d (len = %d)\n", @@ -187,7 +188,12 @@ static int rtp_decode(struct msgb *msg, uint32_t callref, struct msgb **data) *data0 = payload_len; } payload_out = msgb_put(new_msg, payload_len); - memcpy(payload_out, payload, payload_len); + if (rtph->payload_type == RTP_PT_GSM_HALF) { + payload_out[0] = 0; + memcpy(payload_out + 1, payload, payload_len - 1); + } else { + memcpy(payload_out, payload, payload_len); + } *data = new_msg; return 0; @@ -229,7 +235,7 @@ int rtp_send_frame(struct rtp_socket *rs, struct gsm_data_frame *frame) break; case GSM_TCHH_FRAME: payload_type = RTP_PT_GSM_HALF; - payload_len = RTP_LEN_GSM_HALF; + payload_len = RTP_LEN_GSM_HALF - 1; duration = RTP_GSM_DURATION; break; case GSM_TCH_FRAME_AMR: @@ -280,6 +286,8 @@ int rtp_send_frame(struct rtp_socket *rs, struct gsm_data_frame *frame) payload = msgb_put(msg, payload_len); if (frame->msg_type == GSM_TCH_FRAME_AMR) memcpy(payload, frame->data + 1, payload_len); + else if (frame->msg_type == GSM_TCHH_FRAME) + memcpy(payload, frame->data + 1, payload_len); else memcpy(payload, frame->data, payload_len); msgb_enqueue(&rss->tx_queue, msg); |