diff --git a/library/AMR_Types.ttcn b/library/AMR_Types.ttcn index b4f044df8..5586a202d 100644 --- a/library/AMR_Types.ttcn +++ b/library/AMR_Types.ttcn @@ -33,7 +33,13 @@ type enumerated AMRFT { const integer c_AMRFT_len[9] := {12, 13, 15, 17, 19, 20, 26, 31, 5}; function f_amrft_payload_len(INT4b amr_ft) return integer { - return c_AMRFT_len[amr_ft]; + return c_AMRFT_len[amr_ft]; +} + +const integer c_AMRFT_bits_len[9] := {95, 103, 118, 134, 148, 159, 204, 244, 39}; + +function f_amrft_payload_bits_len(INT4b amr_ft) return integer { + return c_AMRFT_bits_len[amr_ft]; } type record RTP_AMR_Hdr { diff --git a/library/OSMUX_Emulation.ttcn b/library/OSMUX_Emulation.ttcn index c6999ded9..4538fdffa 100644 --- a/library/OSMUX_Emulation.ttcn +++ b/library/OSMUX_Emulation.ttcn @@ -374,12 +374,20 @@ private function f_txhandle_cid_add(OsmuxTxHandle hdl) runs on OSMUX_Emulation_C log2str("No Space in TxHandleList for ", hdl.cid)); } +/* Generate correctly-sized AMR payload based on amr_ft, using tx_fixed_payload as a fill pattern. */ function f_osmux_gen_expected_rx_rtp_payload(INT4b amr_ft, octetstring tx_fixed_payload) return octetstring { + var integer payload_len_bits; var integer payload_len; + var bitstring payload_truncated_bits; var octetstring payload_truncated; - var integer i; + + /* Generate the AMR payload as a bitstring, since some formats don't end up in octet boundary: */ + payload_len_bits := f_amrft_payload_bits_len(amr_ft); + payload_truncated_bits := substr(oct2bit(tx_fixed_payload), 0, payload_len_bits); + + /* Now convert it as an octet string filling final padding with zeroes: */ payload_len := f_amrft_payload_len(amr_ft); - payload_truncated := substr(tx_fixed_payload, 0, payload_len); + payload_truncated := bit2oct(f_pad_bit(payload_truncated_bits, payload_len*8, '0'B)); return payload_truncated; }