diff --git a/library/RTP_Emulation.ttcn b/library/RTP_Emulation.ttcn index 10cf68374..e55890e9b 100644 --- a/library/RTP_Emulation.ttcn +++ b/library/RTP_Emulation.ttcn @@ -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; }