RTP_Emulation: Add RtpemConfig / RTPEM_configure() call

Change-Id: Ie60b750fc009a3d8aa044e4fd450873aa19086bb
This commit is contained in:
Harald Welte 2017-12-24 21:48:33 +01:00
parent 46a38f1669
commit 3f6f48f4c1
1 changed files with 27 additions and 9 deletions

View File

@ -32,10 +32,7 @@ type component RTP_Emulation_CT {
port RTPEM_CTRL_PT CTRL;
/* configurable by user, should be fixed */
var INT7b g_tx_payload_type := 0;
var integer g_tx_samplerate_hz := 8000;
var integer g_tx_duration_ms := 20;
var BIT32_BO_LAST g_tx_ssrc := hex2bit('DEADBEEF'H);
var RtpemConfig g_cfg := c_default_cfg;
var HostName g_remote_host;
var PortNumber g_remote_port;
@ -59,12 +56,29 @@ type enumerated RtpemMode {
RTPEM_MODE_BIDIR
};
type record RtpemConfig {
INT7b tx_payload_type,
integer tx_samplerate_hz,
integer tx_duration_ms,
BIT32_BO_LAST tx_ssrc,
octetstring tx_fixed_payload optional
};
const RtpemConfig c_default_cfg := {
tx_payload_type := 0,
tx_samplerate_hz := 8000,
tx_duration_ms := 20,
tx_ssrc := '11011110101011011011111011101111'B,
tx_fixed_payload := '01020304'O
}
signature RTPEM_bind(in HostName local_host, inout PortNumber local_port);
signature RTPEM_connect(in HostName remote_host, in PortNumber remote_port);
signature RTPEM_mode(in RtpemMode mode);
signature RTPEM_configure(in RtpemConfig cfg);
type port RTPEM_CTRL_PT procedure {
inout RTPEM_bind, RTPEM_connect, RTPEM_mode;
inout RTPEM_bind, RTPEM_connect, RTPEM_mode, RTPEM_configure;
} with { extension "internal" };
template PDU_RTP ts_RTP(BIT32_BO_LAST ssrc, INT7b pt, LIN2_BO_LAST seq, uint32_t ts,
@ -84,20 +98,21 @@ template PDU_RTP ts_RTP(BIT32_BO_LAST ssrc, INT7b pt, LIN2_BO_LAST seq, uint32_t
}
private function f_tx_rtp(octetstring payload, BIT1 marker := '0'B) runs on RTP_Emulation_CT {
var PDU_RTP rtp := valueof(ts_RTP(g_tx_ssrc, g_tx_payload_type, g_tx_next_seq,
var PDU_RTP rtp := valueof(ts_RTP(g_cfg.tx_ssrc, g_cfg.tx_payload_type, g_tx_next_seq,
g_tx_next_ts, payload, marker));
RTP.send(t_RTP_Send(g_rtp_conn_id, RTP_messages_union:{rtp:=rtp}));
/* increment sequence + timestamp for next transmit */
g_tx_next_seq := g_tx_next_seq + 1;
g_tx_next_ts := g_tx_next_ts + (g_tx_samplerate_hz / (1000 / g_tx_duration_ms));
g_tx_next_ts := g_tx_next_ts + (g_cfg.tx_samplerate_hz / (1000 / g_cfg.tx_duration_ms));
}
function f_main() runs on RTP_Emulation_CT
{
var Result res;
timer T_transmit := int2float(g_tx_duration_ms)/1000.0;
timer T_transmit := int2float(g_cfg.tx_duration_ms)/1000.0;
var RTP_RecvFrom rx_rtp;
var RtpemConfig cfg;
var template RTP_RecvFrom tr := {
connId := ?,
remName := ?,
@ -174,6 +189,9 @@ function f_main() runs on RTP_Emulation_CT
g_rx_enabled := true;
}
}
[] CTRL.getcall(RTPEM_configure:{?}) -> param (cfg) {
g_cfg := cfg;
}
/* simply ignore any RTTP/RTCP if receiver not enabled */
[g_rx_enabled==false] RTP.receive(tr_rtp) { }
@ -190,7 +208,7 @@ function f_main() runs on RTP_Emulation_CT
/* transmit if timer has expired */
[] T_transmit.timeout {
/* send one RTP frame, re-start timer */
f_tx_rtp('01020304'O);
f_tx_rtp(g_cfg.tx_fixed_payload);
T_transmit.start;
}