Loading ccsrc/Protocols/Sip/sip_codec_message_body.cc +60 −7 Original line number Original line Diff line number Diff line Loading @@ -32,7 +32,7 @@ int sip_codec_message_body::encode (const LibSip__MessageBodyTypes::MessageBody& return -1; return -1; } } loggers::get_instance().log_msg("<<< sip_codec_message_body::encode: Failed to encode SDP message: ", data); loggers::get_instance().log_msg("<<< sip_codec_message_body::encode: ", data); return 0; return 0; } } Loading Loading @@ -146,12 +146,41 @@ int sip_codec_message_body::encode_message_body_sdp(const LibSip__SDPTypes::SDP_ for ( ; i < l.lengthof(); i++) { for ( ; i < l.lengthof(); i++) { const LibSip__SDPTypes::SDP__media__desc m = l[i]; const LibSip__SDPTypes::SDP__media__desc m = l[i]; loggers::get_instance().log_msg("sip_codec_message_body::encode_message_body_sdp: media: ", m); loggers::get_instance().log_msg("sip_codec_message_body::encode_message_body_sdp: media: ", m); // Mandatory fields if (m.media__field().ports().num__of__ports().is_present()) { if (m.media__field().ports().num__of__ports().is_present()) { int i = static_cast<const INTEGER&>(*m.media__field().ports().num__of__ports().get_opt_value()); int p = static_cast<const INTEGER&>(*m.media__field().ports().num__of__ports().get_opt_value()); ::sdp_message_m_media_add(*p_sdp_body, (char*)::strdup(static_cast<const char*>(m.media__field().media())), (char*)::strdup(std::to_string(m.media__field().ports().port__number()).c_str()), (char*)::strdup(std::to_string(i).c_str()), (char*)::strdup(static_cast<const char*>(m.media__field().transport()))); ::sdp_message_m_media_add(*p_sdp_body, (char*)::strdup(static_cast<const char*>(m.media__field().media())), (char*)::strdup(std::to_string(m.media__field().ports().port__number()).c_str()), (char*)::strdup(std::to_string(p).c_str()), (char*)::strdup(static_cast<const char*>(m.media__field().transport()))); } else { } else { ::sdp_message_m_media_add(*p_sdp_body, (char*)::strdup(static_cast<const char*>(m.media__field().media())), (char*)::strdup(std::to_string(m.media__field().ports().port__number()).c_str()), NULL, (char*)::strdup(static_cast<const char*>(m.media__field().transport()))); ::sdp_message_m_media_add(*p_sdp_body, (char*)::strdup(static_cast<const char*>(m.media__field().media())), (char*)::strdup(std::to_string(m.media__field().ports().port__number()).c_str()), NULL, (char*)::strdup(static_cast<const char*>(m.media__field().transport()))); } } // Attribute list, a loggers::get_instance().log_msg("sip_codec_message_body::encode_message_body_sdp: attributes: ", m.attributes()); if (m.attributes().is_present()) { const LibSip__SDPTypes::SDP__attribute__list& al = static_cast<const LibSip__SDPTypes::SDP__attribute__list&>(*m.attributes().get_opt_value()); for (int k = 0; k < al.lengthof(); k++) { const LibSip__SDPTypes::SDP__attribute a = al[k]; loggers::get_instance().log_msg("sip_codec_message_body::encode_message_body_sdp: attribute: ", a); if (a.ischosen(LibSip__SDPTypes::SDP__attribute::ALT_rtpmap)) { std::string strp("rtpmap:"); strp += static_cast<const char*>(a.rtpmap().payload__type()); std::string str(static_cast<const char*>(a.rtpmap().codec().encoding())); str += " "; str += a.rtpmap().codec().clockrate(); if (a.rtpmap().codec().parameters().is_present()) { str += "/"; str += static_cast<const char*>(static_cast<const CHARSTRING&>(*a.rtpmap().codec().parameters().get_opt_value())); } loggers::get_instance().log("sip_codec_message_body::encode_message_body_sdp: attribute: media #%d: encode %s - %s", i, strp.c_str(), str.c_str()); ::sdp_message_a_attribute_add(*p_sdp_body, i, (char*)::strdup(strp.c_str()), (char*)::strdup(str.c_str())); } else if (a.ischosen(LibSip__SDPTypes::SDP__attribute::ALT_maxptime)) { std::string str("maxptime:"); str += static_cast<const char*>(a.maxptime().attr__value()); ::sdp_message_a_attribute_add(*p_sdp_body, i, (char*)::strdup(str.c_str()), NULL); } else { loggers::get_instance().warning("sip_codec_message_body::encode_message_body_sdp: attribute not processed"); } } // End of 'for' statement } } // End of 'for' statement } // End of 'for' statement ::sdp_message_endof_media(*p_sdp_body, i); ::sdp_message_endof_media(*p_sdp_body, i); } } Loading @@ -166,6 +195,7 @@ int sip_codec_message_body::encode_message_body_sdp(const LibSip__SDPTypes::SDP_ if (a.ischosen(LibSip__SDPTypes::SDP__attribute::ALT_rtpmap)) { if (a.ischosen(LibSip__SDPTypes::SDP__attribute::ALT_rtpmap)) { std::string str("rtpmap:"); std::string str("rtpmap:"); str += static_cast<const char*>(a.rtpmap().codec().encoding()); str += static_cast<const char*>(a.rtpmap().codec().encoding()); str += " "; str += a.rtpmap().codec().clockrate(); str += a.rtpmap().codec().clockrate(); if (a.rtpmap().codec().parameters().is_present()) { if (a.rtpmap().codec().parameters().is_present()) { str += "/"; str += "/"; Loading @@ -181,6 +211,17 @@ int sip_codec_message_body::encode_message_body_sdp(const LibSip__SDPTypes::SDP_ } } } // End of 'for' statement } // End of 'for' statement } } // Bandwith, b loggers::get_instance().log_msg("sip_codec_message_body::encode_message_body_sdp: Bandwith: ", p_sdp_message.bandwidth()); if (p_sdp_message.bandwidth().is_present()) { const LibSip__SDPTypes::SDP__bandwidth__list& l = static_cast<const LibSip__SDPTypes::SDP__bandwidth__list&>(*p_sdp_message.bandwidth().get_opt_value()); int i = 0; for ( ; i < l.lengthof(); i++) { const LibSip__SDPTypes::SDP__bandwidth b = l[i]; loggers::get_instance().log_msg("sip_codec_message_body::encode_message_body_sdp: bandwidth: ", b); ::sdp_message_b_bandwidth_add(*p_sdp_body, i, (char*)::strdup(static_cast<const char*>(b.modifier())), (char*)::strdup(std::to_string(b.bandwidth()).c_str())); } // End of 'for' statement } // TODO To be continued // TODO To be continued loggers::get_instance().log("<<< sip_codec_message_body::encode_message_body_sdp"); loggers::get_instance().log("<<< sip_codec_message_body::encode_message_body_sdp"); Loading Loading @@ -364,15 +405,27 @@ void sip_codec_message_body::decode_message_body(const osip_message_t* p_sip_mes loggers::get_instance().warning("sip_codec_message_body::decode_message_body: No attributes in sdp"); loggers::get_instance().warning("sip_codec_message_body::decode_message_body: No attributes in sdp"); sdp_header.attributes().set_to_omit(); sdp_header.attributes().set_to_omit(); } } // Bandwith, b i = 0; sdp_bandwidth_t* b; if ((b = ::sdp_message_bandwidth_get(sdp, 0, i)) != nullptr) { LibSip__SDPTypes::SDP__bandwidth__list l; do { loggers::get_instance().log("sip_codec_message_body::decode_message_body: Bandwidths#%d: '%s'='%s'", i, b->b_bwtype, b->b_bandwidth); LibSip__SDPTypes::SDP__bandwidth a(b->b_bwtype, INTEGER(std::stoi(b->b_bandwidth))); loggers::get_instance().log_msg("sip_codec_message_body::decode_message_body_sdp: Bandwith: ", a); l[i] = a; i += 1; } while((b = ::sdp_message_bandwidth_get(sdp, 0, i)) != nullptr); sdp_header.bandwidth() = OPTIONAL<LibSip__SDPTypes::SDP__bandwidth__list>(l); } else { sdp_header.bandwidth().set_to_omit(); } // TODO // TODO sdp_header.uri().set_to_omit(); sdp_header.uri().set_to_omit(); sdp_header.phone__numbers().set_to_omit(); sdp_header.phone__numbers().set_to_omit(); sdp_header.connection().set_to_omit(); sdp_header.connection().set_to_omit(); // Bandwidth // sdp_bandwidth_t* b = ::sdp_message_bandwidth_get(sdp, i, j); sdp_header.bandwidth().set_to_omit(); sdp_header.timezone__adjustments().set_to_omit(); sdp_header.timezone__adjustments().set_to_omit(); sdp_header.key().set_to_omit(); sdp_header.key().set_to_omit(); Loading etc/AtsNg112/AtsNg112.cfg +2 −2 Original line number Original line Diff line number Diff line Loading @@ -44,8 +44,8 @@ system.httpPort.params := "HTTP(codecs=lost:lost_codec;held:held_codec)/TCP(debu #system.httpPort.params := "HTTP(codecs=lost:lost_codec;held:held_codec)/TCP(debug=1,server=ecrf.gridgears.io,use_ssl=1)" #system.httpPort.params := "HTTP(codecs=lost:lost_codec;held:held_codec)/TCP(debug=1,server=ecrf.gridgears.io,use_ssl=1)" # SIP # SIP Caller.SIPP.params := "SIP/UDP(dst_ip=192.168.0.4,dst_port=5060,src_port=5060)" Caller.SIPP.params := "SIP/UDP(dst_ip=192.168.0.4,dst_port=5060,src_port=5060)" Psap.SIPP.params := "SIP/UDP(dst_ip=192.168.43.4,dst_port=5060,src_port=5060)" Psap.SIPP.params := "SIP/UDP(dst_ip=192.168.43.4,dst_port=5060,src_port=5061)" CallTaker.SIPP.params := "SIP/UDP(dst_ip=192.168.0.4,dst_port=5060,src_port=5060)" CallTaker.SIPP.params := "SIP/UDP(dst_ip=192.168.0.4,dst_port=5060,src_port=5062)" [DEFINE] [DEFINE] # In this section you can create macro definitions, # In this section you can create macro definitions, Loading ttcn/AtsNg112/AtsNg112_TestCases.ttcn +7 −7 Original line number Original line Diff line number Diff line Loading @@ -2221,11 +2221,11 @@ module AtsNg112_TestCases { f_prepare_SDP(1, 2); // 1: PCMU f_prepare_SDP(1, 2); // 1: PCMU f_append_media( f_append_media( vc_sdp_local, vc_sdp_local, m_mediaFieldBandwdthAttributes( m_media( m_media_field(c_video, 20002, "RTP/AVP", "31"), m_media_field(c_video, 20002, "RTP/AVP", "31") -, ) {m_attribute_base({"31", {"H261", "90000", omit}})} ); )); f_append_media_attribute(vc_sdp_local, { rtpmap := {"31", {"H261", "90000", omit} } } ); f_SendINVITE(m_INVITE_Request_IMS(vc_requestUri, f_SendINVITE(m_INVITE_Request_IMS(vc_requestUri, vc_callId, vc_callId, vc_cSeq, vc_cSeq, Loading @@ -2236,7 +2236,7 @@ module AtsNg112_TestCases { -, -, -, -, -, -, -, -, -, -, m_MBody_SDP(vc_sdp_local) m_MBody_SDP(vc_sdp_local) )); )); f_awaitingOkResponse(vc_cSeq); f_awaitingResponseIgnore100Trying(mw_Response_Base(c_statusLine200, vc_callId, vc_cSeq)); f_selfOrClientSyncAndVerdictTestBody(c_prDone, e_success); f_selfOrClientSyncAndVerdictTestBody(c_prDone, e_success); // test body // test body Loading ttcn/patch_sip_titan/LibSip_Steps.ttcn +4 −2 Original line number Original line Diff line number Diff line Loading @@ -2373,9 +2373,11 @@ module LibSip_Steps { inout SDP_Message p_sdp, inout SDP_Message p_sdp, in SDP_attribute p_att in SDP_attribute p_att ) { ) { var integer v_mn; var integer v_mn := 0; if (isvalue(p_sdp.media_list)) { if (isvalue(p_sdp.media_list)) { if(ispresent(p_sdp.media_list[0].attributes)) { v_mn := lengthof(p_sdp.media_list[0].attributes); v_mn := lengthof(p_sdp.media_list[0].attributes); } p_sdp.media_list[0].attributes[v_mn] := p_att; p_sdp.media_list[0].attributes[v_mn] := p_att; } } } } Loading Loading
ccsrc/Protocols/Sip/sip_codec_message_body.cc +60 −7 Original line number Original line Diff line number Diff line Loading @@ -32,7 +32,7 @@ int sip_codec_message_body::encode (const LibSip__MessageBodyTypes::MessageBody& return -1; return -1; } } loggers::get_instance().log_msg("<<< sip_codec_message_body::encode: Failed to encode SDP message: ", data); loggers::get_instance().log_msg("<<< sip_codec_message_body::encode: ", data); return 0; return 0; } } Loading Loading @@ -146,12 +146,41 @@ int sip_codec_message_body::encode_message_body_sdp(const LibSip__SDPTypes::SDP_ for ( ; i < l.lengthof(); i++) { for ( ; i < l.lengthof(); i++) { const LibSip__SDPTypes::SDP__media__desc m = l[i]; const LibSip__SDPTypes::SDP__media__desc m = l[i]; loggers::get_instance().log_msg("sip_codec_message_body::encode_message_body_sdp: media: ", m); loggers::get_instance().log_msg("sip_codec_message_body::encode_message_body_sdp: media: ", m); // Mandatory fields if (m.media__field().ports().num__of__ports().is_present()) { if (m.media__field().ports().num__of__ports().is_present()) { int i = static_cast<const INTEGER&>(*m.media__field().ports().num__of__ports().get_opt_value()); int p = static_cast<const INTEGER&>(*m.media__field().ports().num__of__ports().get_opt_value()); ::sdp_message_m_media_add(*p_sdp_body, (char*)::strdup(static_cast<const char*>(m.media__field().media())), (char*)::strdup(std::to_string(m.media__field().ports().port__number()).c_str()), (char*)::strdup(std::to_string(i).c_str()), (char*)::strdup(static_cast<const char*>(m.media__field().transport()))); ::sdp_message_m_media_add(*p_sdp_body, (char*)::strdup(static_cast<const char*>(m.media__field().media())), (char*)::strdup(std::to_string(m.media__field().ports().port__number()).c_str()), (char*)::strdup(std::to_string(p).c_str()), (char*)::strdup(static_cast<const char*>(m.media__field().transport()))); } else { } else { ::sdp_message_m_media_add(*p_sdp_body, (char*)::strdup(static_cast<const char*>(m.media__field().media())), (char*)::strdup(std::to_string(m.media__field().ports().port__number()).c_str()), NULL, (char*)::strdup(static_cast<const char*>(m.media__field().transport()))); ::sdp_message_m_media_add(*p_sdp_body, (char*)::strdup(static_cast<const char*>(m.media__field().media())), (char*)::strdup(std::to_string(m.media__field().ports().port__number()).c_str()), NULL, (char*)::strdup(static_cast<const char*>(m.media__field().transport()))); } } // Attribute list, a loggers::get_instance().log_msg("sip_codec_message_body::encode_message_body_sdp: attributes: ", m.attributes()); if (m.attributes().is_present()) { const LibSip__SDPTypes::SDP__attribute__list& al = static_cast<const LibSip__SDPTypes::SDP__attribute__list&>(*m.attributes().get_opt_value()); for (int k = 0; k < al.lengthof(); k++) { const LibSip__SDPTypes::SDP__attribute a = al[k]; loggers::get_instance().log_msg("sip_codec_message_body::encode_message_body_sdp: attribute: ", a); if (a.ischosen(LibSip__SDPTypes::SDP__attribute::ALT_rtpmap)) { std::string strp("rtpmap:"); strp += static_cast<const char*>(a.rtpmap().payload__type()); std::string str(static_cast<const char*>(a.rtpmap().codec().encoding())); str += " "; str += a.rtpmap().codec().clockrate(); if (a.rtpmap().codec().parameters().is_present()) { str += "/"; str += static_cast<const char*>(static_cast<const CHARSTRING&>(*a.rtpmap().codec().parameters().get_opt_value())); } loggers::get_instance().log("sip_codec_message_body::encode_message_body_sdp: attribute: media #%d: encode %s - %s", i, strp.c_str(), str.c_str()); ::sdp_message_a_attribute_add(*p_sdp_body, i, (char*)::strdup(strp.c_str()), (char*)::strdup(str.c_str())); } else if (a.ischosen(LibSip__SDPTypes::SDP__attribute::ALT_maxptime)) { std::string str("maxptime:"); str += static_cast<const char*>(a.maxptime().attr__value()); ::sdp_message_a_attribute_add(*p_sdp_body, i, (char*)::strdup(str.c_str()), NULL); } else { loggers::get_instance().warning("sip_codec_message_body::encode_message_body_sdp: attribute not processed"); } } // End of 'for' statement } } // End of 'for' statement } // End of 'for' statement ::sdp_message_endof_media(*p_sdp_body, i); ::sdp_message_endof_media(*p_sdp_body, i); } } Loading @@ -166,6 +195,7 @@ int sip_codec_message_body::encode_message_body_sdp(const LibSip__SDPTypes::SDP_ if (a.ischosen(LibSip__SDPTypes::SDP__attribute::ALT_rtpmap)) { if (a.ischosen(LibSip__SDPTypes::SDP__attribute::ALT_rtpmap)) { std::string str("rtpmap:"); std::string str("rtpmap:"); str += static_cast<const char*>(a.rtpmap().codec().encoding()); str += static_cast<const char*>(a.rtpmap().codec().encoding()); str += " "; str += a.rtpmap().codec().clockrate(); str += a.rtpmap().codec().clockrate(); if (a.rtpmap().codec().parameters().is_present()) { if (a.rtpmap().codec().parameters().is_present()) { str += "/"; str += "/"; Loading @@ -181,6 +211,17 @@ int sip_codec_message_body::encode_message_body_sdp(const LibSip__SDPTypes::SDP_ } } } // End of 'for' statement } // End of 'for' statement } } // Bandwith, b loggers::get_instance().log_msg("sip_codec_message_body::encode_message_body_sdp: Bandwith: ", p_sdp_message.bandwidth()); if (p_sdp_message.bandwidth().is_present()) { const LibSip__SDPTypes::SDP__bandwidth__list& l = static_cast<const LibSip__SDPTypes::SDP__bandwidth__list&>(*p_sdp_message.bandwidth().get_opt_value()); int i = 0; for ( ; i < l.lengthof(); i++) { const LibSip__SDPTypes::SDP__bandwidth b = l[i]; loggers::get_instance().log_msg("sip_codec_message_body::encode_message_body_sdp: bandwidth: ", b); ::sdp_message_b_bandwidth_add(*p_sdp_body, i, (char*)::strdup(static_cast<const char*>(b.modifier())), (char*)::strdup(std::to_string(b.bandwidth()).c_str())); } // End of 'for' statement } // TODO To be continued // TODO To be continued loggers::get_instance().log("<<< sip_codec_message_body::encode_message_body_sdp"); loggers::get_instance().log("<<< sip_codec_message_body::encode_message_body_sdp"); Loading Loading @@ -364,15 +405,27 @@ void sip_codec_message_body::decode_message_body(const osip_message_t* p_sip_mes loggers::get_instance().warning("sip_codec_message_body::decode_message_body: No attributes in sdp"); loggers::get_instance().warning("sip_codec_message_body::decode_message_body: No attributes in sdp"); sdp_header.attributes().set_to_omit(); sdp_header.attributes().set_to_omit(); } } // Bandwith, b i = 0; sdp_bandwidth_t* b; if ((b = ::sdp_message_bandwidth_get(sdp, 0, i)) != nullptr) { LibSip__SDPTypes::SDP__bandwidth__list l; do { loggers::get_instance().log("sip_codec_message_body::decode_message_body: Bandwidths#%d: '%s'='%s'", i, b->b_bwtype, b->b_bandwidth); LibSip__SDPTypes::SDP__bandwidth a(b->b_bwtype, INTEGER(std::stoi(b->b_bandwidth))); loggers::get_instance().log_msg("sip_codec_message_body::decode_message_body_sdp: Bandwith: ", a); l[i] = a; i += 1; } while((b = ::sdp_message_bandwidth_get(sdp, 0, i)) != nullptr); sdp_header.bandwidth() = OPTIONAL<LibSip__SDPTypes::SDP__bandwidth__list>(l); } else { sdp_header.bandwidth().set_to_omit(); } // TODO // TODO sdp_header.uri().set_to_omit(); sdp_header.uri().set_to_omit(); sdp_header.phone__numbers().set_to_omit(); sdp_header.phone__numbers().set_to_omit(); sdp_header.connection().set_to_omit(); sdp_header.connection().set_to_omit(); // Bandwidth // sdp_bandwidth_t* b = ::sdp_message_bandwidth_get(sdp, i, j); sdp_header.bandwidth().set_to_omit(); sdp_header.timezone__adjustments().set_to_omit(); sdp_header.timezone__adjustments().set_to_omit(); sdp_header.key().set_to_omit(); sdp_header.key().set_to_omit(); Loading
etc/AtsNg112/AtsNg112.cfg +2 −2 Original line number Original line Diff line number Diff line Loading @@ -44,8 +44,8 @@ system.httpPort.params := "HTTP(codecs=lost:lost_codec;held:held_codec)/TCP(debu #system.httpPort.params := "HTTP(codecs=lost:lost_codec;held:held_codec)/TCP(debug=1,server=ecrf.gridgears.io,use_ssl=1)" #system.httpPort.params := "HTTP(codecs=lost:lost_codec;held:held_codec)/TCP(debug=1,server=ecrf.gridgears.io,use_ssl=1)" # SIP # SIP Caller.SIPP.params := "SIP/UDP(dst_ip=192.168.0.4,dst_port=5060,src_port=5060)" Caller.SIPP.params := "SIP/UDP(dst_ip=192.168.0.4,dst_port=5060,src_port=5060)" Psap.SIPP.params := "SIP/UDP(dst_ip=192.168.43.4,dst_port=5060,src_port=5060)" Psap.SIPP.params := "SIP/UDP(dst_ip=192.168.43.4,dst_port=5060,src_port=5061)" CallTaker.SIPP.params := "SIP/UDP(dst_ip=192.168.0.4,dst_port=5060,src_port=5060)" CallTaker.SIPP.params := "SIP/UDP(dst_ip=192.168.0.4,dst_port=5060,src_port=5062)" [DEFINE] [DEFINE] # In this section you can create macro definitions, # In this section you can create macro definitions, Loading
ttcn/AtsNg112/AtsNg112_TestCases.ttcn +7 −7 Original line number Original line Diff line number Diff line Loading @@ -2221,11 +2221,11 @@ module AtsNg112_TestCases { f_prepare_SDP(1, 2); // 1: PCMU f_prepare_SDP(1, 2); // 1: PCMU f_append_media( f_append_media( vc_sdp_local, vc_sdp_local, m_mediaFieldBandwdthAttributes( m_media( m_media_field(c_video, 20002, "RTP/AVP", "31"), m_media_field(c_video, 20002, "RTP/AVP", "31") -, ) {m_attribute_base({"31", {"H261", "90000", omit}})} ); )); f_append_media_attribute(vc_sdp_local, { rtpmap := {"31", {"H261", "90000", omit} } } ); f_SendINVITE(m_INVITE_Request_IMS(vc_requestUri, f_SendINVITE(m_INVITE_Request_IMS(vc_requestUri, vc_callId, vc_callId, vc_cSeq, vc_cSeq, Loading @@ -2236,7 +2236,7 @@ module AtsNg112_TestCases { -, -, -, -, -, -, -, -, -, -, m_MBody_SDP(vc_sdp_local) m_MBody_SDP(vc_sdp_local) )); )); f_awaitingOkResponse(vc_cSeq); f_awaitingResponseIgnore100Trying(mw_Response_Base(c_statusLine200, vc_callId, vc_cSeq)); f_selfOrClientSyncAndVerdictTestBody(c_prDone, e_success); f_selfOrClientSyncAndVerdictTestBody(c_prDone, e_success); // test body // test body Loading
ttcn/patch_sip_titan/LibSip_Steps.ttcn +4 −2 Original line number Original line Diff line number Diff line Loading @@ -2373,9 +2373,11 @@ module LibSip_Steps { inout SDP_Message p_sdp, inout SDP_Message p_sdp, in SDP_attribute p_att in SDP_attribute p_att ) { ) { var integer v_mn; var integer v_mn := 0; if (isvalue(p_sdp.media_list)) { if (isvalue(p_sdp.media_list)) { if(ispresent(p_sdp.media_list[0].attributes)) { v_mn := lengthof(p_sdp.media_list[0].attributes); v_mn := lengthof(p_sdp.media_list[0].attributes); } p_sdp.media_list[0].attributes[v_mn] := p_att; p_sdp.media_list[0].attributes[v_mn] := p_att; } } } } Loading