bts-{sysmo,oc2g,lc15}: Fix RTP of AMR SID_FIRST_P1
When we receive a SID_FIRST_P1 frame from the PHY (during AMR/HR DTXu), we must generate a SID frame on the RTP side. The existing code * ignored that the Amr_SidFirstP1 PHYIF message actually contains the RTP payload * manually generated the same content using osmo_amr_rtp_enc() * forgot to prefix that with the AMR CMR+TOC * in the end, sent a completely broken (too short) AMR SID frame over RTP Let's fix this by simply using the 7-byte RTP payload with CMR+TOC that the PHY is providing to us. Change-Id: I90479efcc002d497648a71e73847af54e6208358 Related: OS#5944
This commit is contained in:
parent
a563640f86
commit
bb3ed23e71
|
@ -360,7 +360,7 @@ int l1if_tch_rx(struct gsm_bts_trx *trx, uint8_t chan_nr, struct msgb *l1p_msg)
|
||||||
{
|
{
|
||||||
GsmL1_Prim_t *l1p = msgb_l1prim(l1p_msg);
|
GsmL1_Prim_t *l1p = msgb_l1prim(l1p_msg);
|
||||||
GsmL1_PhDataInd_t *data_ind = &l1p->u.phDataInd;
|
GsmL1_PhDataInd_t *data_ind = &l1p->u.phDataInd;
|
||||||
uint8_t *payload, payload_type, payload_len, sid_first[9] = { 0 };
|
uint8_t *payload, payload_type, payload_len;
|
||||||
struct msgb *rmsg = NULL;
|
struct msgb *rmsg = NULL;
|
||||||
struct gsm_lchan *lchan = &trx->ts[L1SAP_CHAN2TS(chan_nr)].lchan[l1sap_chan2ss(chan_nr)];
|
struct gsm_lchan *lchan = &trx->ts[L1SAP_CHAN2TS(chan_nr)].lchan[l1sap_chan2ss(chan_nr)];
|
||||||
|
|
||||||
|
@ -450,14 +450,8 @@ int l1if_tch_rx(struct gsm_bts_trx *trx, uint8_t chan_nr, struct msgb *l1p_msg)
|
||||||
rmsg = l1_to_rtppayload_efr(payload, payload_len, lchan);
|
rmsg = l1_to_rtppayload_efr(payload, payload_len, lchan);
|
||||||
break;
|
break;
|
||||||
case GsmL1_TchPlType_Amr:
|
case GsmL1_TchPlType_Amr:
|
||||||
rmsg = l1_to_rtppayload_amr(payload, payload_len, lchan);
|
|
||||||
break;
|
|
||||||
case GsmL1_TchPlType_Amr_SidFirstP1:
|
case GsmL1_TchPlType_Amr_SidFirstP1:
|
||||||
memcpy(sid_first, payload, payload_len);
|
rmsg = l1_to_rtppayload_amr(payload, payload_len, lchan);
|
||||||
int len = osmo_amr_rtp_enc(sid_first, 0, AMR_SID, AMR_GOOD);
|
|
||||||
if (len < 0)
|
|
||||||
return 0;
|
|
||||||
rmsg = l1_to_rtppayload_amr(sid_first, len, lchan);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -360,7 +360,7 @@ int l1if_tch_rx(struct gsm_bts_trx *trx, uint8_t chan_nr, struct msgb *l1p_msg)
|
||||||
{
|
{
|
||||||
GsmL1_Prim_t *l1p = msgb_l1prim(l1p_msg);
|
GsmL1_Prim_t *l1p = msgb_l1prim(l1p_msg);
|
||||||
GsmL1_PhDataInd_t *data_ind = &l1p->u.phDataInd;
|
GsmL1_PhDataInd_t *data_ind = &l1p->u.phDataInd;
|
||||||
uint8_t *payload, payload_type, payload_len, sid_first[9] = { 0 };
|
uint8_t *payload, payload_type, payload_len;
|
||||||
struct msgb *rmsg = NULL;
|
struct msgb *rmsg = NULL;
|
||||||
struct gsm_lchan *lchan = &trx->ts[L1SAP_CHAN2TS(chan_nr)].lchan[l1sap_chan2ss(chan_nr)];
|
struct gsm_lchan *lchan = &trx->ts[L1SAP_CHAN2TS(chan_nr)].lchan[l1sap_chan2ss(chan_nr)];
|
||||||
|
|
||||||
|
@ -460,14 +460,8 @@ int l1if_tch_rx(struct gsm_bts_trx *trx, uint8_t chan_nr, struct msgb *l1p_msg)
|
||||||
rmsg = l1_to_rtppayload_efr(payload, payload_len, lchan);
|
rmsg = l1_to_rtppayload_efr(payload, payload_len, lchan);
|
||||||
break;
|
break;
|
||||||
case GsmL1_TchPlType_Amr:
|
case GsmL1_TchPlType_Amr:
|
||||||
rmsg = l1_to_rtppayload_amr(payload, payload_len, lchan);
|
|
||||||
break;
|
|
||||||
case GsmL1_TchPlType_Amr_SidFirstP1:
|
case GsmL1_TchPlType_Amr_SidFirstP1:
|
||||||
memcpy(sid_first, payload, payload_len);
|
rmsg = l1_to_rtppayload_amr(payload, payload_len, lchan);
|
||||||
int len = osmo_amr_rtp_enc(sid_first, 0, AMR_SID, AMR_GOOD);
|
|
||||||
if (len < 0)
|
|
||||||
return 0;
|
|
||||||
rmsg = l1_to_rtppayload_amr(sid_first, len, lchan);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -505,7 +505,7 @@ int l1if_tch_rx(struct gsm_bts_trx *trx, uint8_t chan_nr, struct msgb *l1p_msg)
|
||||||
{
|
{
|
||||||
GsmL1_Prim_t *l1p = msgb_l1prim(l1p_msg);
|
GsmL1_Prim_t *l1p = msgb_l1prim(l1p_msg);
|
||||||
GsmL1_PhDataInd_t *data_ind = &l1p->u.phDataInd;
|
GsmL1_PhDataInd_t *data_ind = &l1p->u.phDataInd;
|
||||||
uint8_t *payload, payload_type, payload_len, sid_first[9] = { 0 };
|
uint8_t *payload, payload_type, payload_len;
|
||||||
struct msgb *rmsg = NULL;
|
struct msgb *rmsg = NULL;
|
||||||
struct gsm_lchan *lchan = &trx->ts[L1SAP_CHAN2TS(chan_nr)].lchan[l1sap_chan2ss(chan_nr)];
|
struct gsm_lchan *lchan = &trx->ts[L1SAP_CHAN2TS(chan_nr)].lchan[l1sap_chan2ss(chan_nr)];
|
||||||
|
|
||||||
|
@ -602,14 +602,8 @@ int l1if_tch_rx(struct gsm_bts_trx *trx, uint8_t chan_nr, struct msgb *l1p_msg)
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case GsmL1_TchPlType_Amr:
|
case GsmL1_TchPlType_Amr:
|
||||||
rmsg = l1_to_rtppayload_amr(payload, payload_len, lchan);
|
|
||||||
break;
|
|
||||||
case GsmL1_TchPlType_Amr_SidFirstP1:
|
case GsmL1_TchPlType_Amr_SidFirstP1:
|
||||||
memcpy(sid_first, payload, payload_len);
|
rmsg = l1_to_rtppayload_amr(payload, payload_len, lchan);
|
||||||
int len = osmo_amr_rtp_enc(sid_first, 0, AMR_SID, AMR_GOOD);
|
|
||||||
if (len < 0)
|
|
||||||
return 0;
|
|
||||||
rmsg = l1_to_rtppayload_amr(sid_first, len, lchan);
|
|
||||||
break;
|
break;
|
||||||
/* FIXME: what about GsmL1_TchPlType_Amr_SidBad? not well documented. */
|
/* FIXME: what about GsmL1_TchPlType_Amr_SidBad? not well documented. */
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue