📄 megaco_sdp.erl
字号:
encode_rtimes_repeat(Repeat) when is_list(Repeat) -> Repeat;encode_rtimes_repeat(BadRepeat) -> error({invalid_rtimes_repeat, BadRepeat}).encode_rtimes_duration(Duration) when is_list(Duration) -> Duration;encode_rtimes_duration(BadDuration) -> error({invalid_rtimes_duration, BadDuration}).encode_rtimes_list_of_offsets(LOO) when is_list(LOO) -> F = fun(Off, Acc) when is_list(Off) -> Acc ++ " " ++ Off; (BadOff, Acc) -> error({invalid_rtimes_list_of_offsets, {BadOff, Acc}}) end, lists:foldl(F, [], LOO);encode_rtimes_list_of_offsets(BadLoo) -> error({invalid_rtimes_list_of_offsets, BadLoo}). decode_pp_tzones(Value) -> ?d("decode_pp_ztimes -> entry with" "~n Value: ~p", [Value]), List = string:tokens(Value, " \t"), {ok, #megaco_sdp_z{list_of_adjustments = List}}.encode_pp_tzones(LOA) -> ?d("encode_pp_ztimes -> entry with" "~n LOA: ~p", [LOA]), Val = encode_tzones_list_of_adjustments(LOA), #'PropertyParm'{name = "z", value = [Val]}.encode_tzones_list_of_adjustments([H|T]) when is_list(H) -> F = fun(Adjustment, Acc) when is_list(Adjustment) -> Acc ++ " " ++ Adjustment; (BadAdjustment, Acc) -> error({invalid_tzones_list_of_adjustments, {BadAdjustment, Acc}}) end, lists:foldl(F, H, T);encode_tzones_list_of_adjustments(LOA) -> error({invalid_tzones_list_of_adjustments, LOA}).%% ===== Encryption Keys =====%% decode_pp_encryption_keys(Value) -> ?d("decode_pp_encryption_keys -> entry with" "~n Value: ~p", [Value]), {M, E} = case string:tokens(Value, ":") of [Method, EncryptionKey] -> ?d("decode_pp_encryption_keys -> " "~n Method: ~p" "~n EncryptionKey: ~p", [Method, EncryptionKey]), {Method, EncryptionKey}; [Method] -> ?d("decode_pp_encryption_keys -> " "~n Method: ~p", [Method]), {Method, undefined}; Err -> invalid_pp(encryption_key, Value, Err) end, M2 = case tolower(M) of "prompt" -> prompt; "clear" -> clear; "base64" -> base64; "uri" -> uri; _ -> M end, ?d("decode_pp_encryption_keys -> " "~n M2: ~p", [M2]), SDP = #megaco_sdp_k{method = M2, encryption_key = E}, {ok, SDP}. encode_pp_encryption_keys(prompt = _Method, undefined) -> ?d("encode_pp_encryption_keys(prompt) -> entry", []), #'PropertyParm'{name = "k", value = ["prompt"]};encode_pp_encryption_keys(clear = _Method, EncryptionKey) when is_list(EncryptionKey) -> ?d("encode_pp_encryption_keys(clear) -> entry with" "~n EncryptionKey: ~p", [EncryptionKey]), #'PropertyParm'{name = "k", value = ["clear:" ++ EncryptionKey]};encode_pp_encryption_keys(base64 = _Method, EncryptionKey) when is_list(EncryptionKey) -> ?d("encode_pp_encryption_keys(base64) -> entry with" "~n EncryptionKey: ~p", [EncryptionKey]), #'PropertyParm'{name = "k", value = ["base64:" ++ EncryptionKey]};encode_pp_encryption_keys(uri = _Method, EncryptionKey) when is_list(EncryptionKey) -> ?d("encode_pp_encryption_keys(uri) -> entry with" "~n EncryptionKey: ~p", [EncryptionKey]), #'PropertyParm'{name = "k", value = ["uri:" ++ EncryptionKey]};encode_pp_encryption_keys(Method, EncryptionKey) when is_list(Method) and is_list(EncryptionKey) -> ?d("encode_pp_encryption_keys -> entry with" "~n Method: ~p" "~n EncryptionKey: ~p", [Method, EncryptionKey]), #'PropertyParm'{name = "k", value = [Method ++ ":" ++ EncryptionKey]};encode_pp_encryption_keys(BadMethod, BadEK) -> error({invalid_encryption_keys, {BadMethod, BadEK}}). %% ===== Attributes =====%% decode_pp_attribute(Value) -> ?d("decode_pp_attribute -> entry with" "~n Value: ~p", [Value]), case string:tokens(Value, ":") of ["rtpmap", AttrValue] -> ?d("decode_pp_attribute -> rtpmap: " "~n AttrValue: ~p", [AttrValue]), case string:tokens(AttrValue, "\/ \t") of [PayloadStr, EncName, ClockRateStr | EncPar] -> ?d("decode_pp_attribute -> " "~n PayloadStr: ~p" "~n EncName: ~p" "~n ClockRateStr: ~p" "~n EncPar: ~p", [PayloadStr, EncName, ClockRateStr, EncPar]), Payload = s2i(PayloadStr, invalid_rtpmap_payload), ?d("decode_pp_attribute -> Payload: ~w", [Payload]), ClockRate = s2i(ClockRateStr, invalid_rtpmap_payload), ?d("decode_pp_attribute -> ClockRate: ~w", [ClockRate]), SDP = #megaco_sdp_a_rtpmap{payload_type = Payload, encoding_name = EncName, clock_rate = ClockRate, encoding_parms = EncPar}, {ok, SDP}; _ -> error({invalid_rtpmap, AttrValue}) end; ["ptime", PacketTimeStr] -> ?d("decode_pp_attribute -> ptime: " "~n PacketTimeStr: ~p", [PacketTimeStr]), PacketTime = s2i(PacketTimeStr, invalid_ptime_packet_time), ?d("decode_pp_attribute -> PacketTime: ~w", [PacketTime]), SDP = #megaco_sdp_a_ptime{packet_time = PacketTime}, {ok, SDP}; ["quality", QualityStr] -> ?d("decode_pp_attribute -> quality: " "~n QualityStr: ~p", [QualityStr]), Quality = s2i(QualityStr, invalid_quality_quality), ?d("decode_pp_attribute -> Quality: ~w", [Quality]), SDP = #megaco_sdp_a_quality{quality = Quality}, {ok, SDP}; ["fmtp", FMTP] -> ?d("decode_pp_attribute -> fmtp: " "~n FMTP: ~p", [FMTP]), case string:tokens(FMTP, " \t") of [Fmt, Param] -> ?d("decode_pp_attribute -> " "~n Fmt: ~p" "~n Param: ~p", [Fmt, Param]), SDP = #megaco_sdp_a_fmtp{format = Fmt, param = Param}, {ok, SDP}; _ -> error({invalid_fmtp, FMTP}) end; [Attr, AttrValue] -> ?d("decode_pp_attribute -> " "~n Attr: ~p" "~n AttrValue: ~p", [Attr, AttrValue]), {ok, #megaco_sdp_a{attribute = Attr, value = AttrValue}}; [Attr] -> ?d("decode_pp_attribute -> " "~n Attr: ~p", [Attr]), {ok, #megaco_sdp_a{attribute = Attr}}; Err -> invalid_pp(invalid_attribute, Value, Err) end. encode_pp_attribute_rtpmap(Payload0, EncName0, ClockRate0, EncPar0) -> ?d("encode_pp_attribute_rtpmap -> entry with" "~n Payload0: ~p" "~n EncName0: ~p" "~n ClockRate0: ~p" "~n EncPar0: ~p", [Payload0, EncName0, ClockRate0, EncPar0]), Payload = encode_rtpmap_payload(Payload0), EncName = encode_rtpmap_encoding_name(EncName0), ClockRate = encode_rtpmap_clockrate(ClockRate0), EncPar = encode_rtpmap_encoding_parms(EncPar0), Val = "rtpmap:" ++ Payload ++ " " ++ EncName ++ "/" ++ ClockRate ++ EncPar, #'PropertyParm'{name = "a", value = [Val]}.encode_rtpmap_payload(Payload) when is_integer(Payload) -> integer_to_list(Payload);encode_rtpmap_payload(BadPayload) -> error({invalid_rtpmap_payload, BadPayload}).encode_rtpmap_encoding_name(EncName) when is_list(EncName) -> EncName;encode_rtpmap_encoding_name(BadEncName) -> error({invalid_rtpmap_encoding_name, BadEncName}).encode_rtpmap_clockrate(ClockRate) when is_integer(ClockRate) -> integer_to_list(ClockRate);encode_rtpmap_clockrate(BadClockRate) -> error({invalid_rtpmap_clockrate, BadClockRate}).encode_rtpmap_encoding_parms(EncPar) when is_list(EncPar) -> F = fun(EP, Acc) when is_list(EP) -> Acc ++ "/" ++ EP; (BadEP, Acc) -> error({invalid_rtpmap_encoding_parms, {BadEP, Acc}}) end, lists:foldl(F, [], EncPar);encode_rtpmap_encoding_parms(BadEncPar) -> error({invalid_rtpmap_encoding_parms, BadEncPar}). encode_pp_attribute_ptime(PacketTime) when is_integer(PacketTime) -> ?d("encode_pp_attribute_ptime -> entry with" "~n PacketTime: ~w", [PacketTime]), #'PropertyParm'{name = "a", value = ["ptime:" ++ integer_to_list(PacketTime)]};encode_pp_attribute_ptime(BadPT) -> error({invalid_ptime_packet_time, BadPT}).encode_pp_attribute_quality(Quality) when is_integer(Quality) -> ?d("encode_pp_attribute_quality -> entry with" "~n Quality: ~w", [Quality]), #'PropertyParm'{name = "a", value = ["quality:" ++ integer_to_list(Quality)]};encode_pp_attribute_quality(BadQ) -> error({invalid_quality_quality, BadQ}).encode_pp_attribute_fmtp(Fmt0, Param0) -> ?d("encode_pp_attribute_rtpmap -> entry with" "~n Fmt0: ~p" "~n Param0: ~p", [Fmt0, Param0]), Fmt = encode_fmtp_format(Fmt0), Param = encode_fmtp_param(Param0), Val = "fmtp:" ++ Fmt ++ " " ++ Param, #'PropertyParm'{name = "a", value = [Val]}.encode_fmtp_format(Fmt) when is_list(Fmt) -> Fmt;encode_fmtp_format(BadFmt) -> error({invalid_fmtp_format, BadFmt}).encode_fmtp_param(Param) when is_list(Param) -> Param;encode_fmtp_param(BadParam) -> error({invalid_fmtp_param, BadParam}).encode_pp_attribute(Attr, undefined) when is_list(Attr) -> ?d("encode_pp_attribute_rtpmap -> entry with" "~n Attr: ~p", [Attr]), #'PropertyParm'{name = "a", value = [Attr]};encode_pp_attribute(Attr, Value) when is_list(Attr) and is_list(Value) -> ?d("encode_pp_attribute_rtpmap -> entry with" "~n Attr: ~p" "~n Value: ~p", [Attr, Value]), #'PropertyParm'{name = "a", value = [Attr ++ ":" ++ Value]};encode_pp_attribute(BadAttr, BadAttrValue) -> error({invalid_attribute, {BadAttr, BadAttrValue}}).%% ===== Media Announcements =====%% decode_pp_media_announcement(Value) -> case string:tokens(Value, " \t") of [Media0, PortInfo, Transport | FMT] -> Media = case tolower(Media0) of "audio" -> audio; "video" -> video; "application" -> application; "data" -> data; "control" -> control; _ -> Media0 end, {Port, NoOfPorts} = case string:tokens(PortInfo, "/") of [P1, NP] -> {s2i(P1, invalid_media_announcement_port), s2i(NP, invalid_media_announcement_nof_ports)}; [P2] -> {s2i(P2, invalid_media_announcement_port), undefined}; Err -> invalid_pp(mnta_port_info, Value, Err) end, SDP = #megaco_sdp_m{media = Media, port = Port, num_ports = NoOfPorts, transport = Transport, fmt_list = FMT}, {ok, SDP}; Err -> invalid_pp(media_name_transp_addr, Value, Err) end.encode_pp_media_announcement(Media0, Port0, undefined, Transport0, FMT0) -> ?d("encode_pp_media_announcement -> entry with" "~n Media0: ~p" "~n Port0: ~p" "~n Transport0: ~p" "~n FMT0: ~p", [Media0, Port0, Transport0, FMT0]), Media = encode_media_announcement_media(Media0), Port = encode_media_announcement_port(Port0), Transport = encode_media_announcement_transport(Transport0), FMT = encode_media_announcement_fmt_list(FMT0), do_encode_pp_media_announcement(Media, Port, "", Transport, FMT);encode_pp_media_announcement(Media0, Port0, NumPorts0, Transport0, FMT0) -> ?d("encode_pp_media_announcement -> entry with" "~n Media0: ~p" "~n Port0: ~p" "~n NumPorts0: ~p" "~n Transport0: ~p" "~n FMT0: ~p", [Media0, Port0, NumPorts0, Transport0, FMT0]), Media = encode_media_announcement_media(Media0), Port = encode_media_announcement_port(Port0), NumPorts = encode_media_announcement_num_port(NumPorts0), Transport = encode_media_announcement_transport(Transport0), FMT = encode_media_announcement_fmt_list(FMT0), do_encode_pp_media_announcement(Media, Port, NumPorts, Transport, FMT).do_encode_pp_media_announcement(Media, Port, NumOfPorts, Transport, FMT) -> Val = Media ++ " " ++ Port ++ NumOfPorts ++ " " ++ Transport ++ FMT, #'PropertyParm'{name = "m", value = [Val]}.encode_media_announcement_media(Media) when is_atom(Media) -> MaMedia = [audio, video, application, data, control], case lists:member(Media, MaMedia) of true -> atom_to_list(Media); false -> error({invalid_media_announcement_media, Media}) end;encode_media_announcement_media(Media) when is_list(Media) -> Media;encode_media_announcement_media(BadMedia) -> error({invalid_media_announcement_media, BadMedia}).encode_media_announcement_port(Port) when is_integer(Port) -> integer_to_list(Port);encode_media_announcement_port(BadPort) -> error({invalid_media_announcement_port, BadPort}).encode_media_announcement_num_port(NumPort) when is_integer(NumPort) -> "/" ++ integer_to_list(NumPort);encode_media_announcement_num_port(BadNumPort) -> error({invalid_media_announcement_num_port, BadNumPort}).encode_media_announcement_transport(Transport) when is_list(Transport) -> Transport;encode_media_announcement_transport(BadTransport) -> error({invalid_media_announcement_transport, BadTransport}).encode_media_announcement_fmt_list(FmtList) when is_list(FmtList) -> F = fun(FMT, Acc) when is_list(FMT) -> Acc ++ " " ++ FMT; (BadFMT, Acc) -> error({invalid_media_announcement_fmt_list, {BadFMT, Acc}}) end, lists:foldl(F, [], FmtList);encode_media_announcement_fmt_list(BadFmtList) -> error({invalid_media_announcement_fmt_list, BadFmtList}).decode_network_type(NT) when is_list(NT) -> case tolower(NT) of "in" -> in; _ -> NT end.encode_network_type(in) -> "IN";encode_network_type(NT) when is_list(NT) -> NT;encode_network_type(Bad) -> {error, {invalid_network_type, Bad}}.decode_address_type(AT) when is_list(AT) -> case tolower(AT) of "ip4" -> ip4; "ip6" -> ip6; _ -> AT end. encode_address_type(ip4) -> "IP4";encode_address_type(ip6) -> "IP6";encode_address_type(AT) when is_list(AT) -> case toupper(AT) of "IP4" -> "IP4"; "IP6" -> "IP6"; _ -> AT end;encode_address_type(Crap) -> {error, {invalid_address_type, Crap}}. s2i(S, E) -> case (catch list_to_integer(S)) of I when is_integer(I) -> I; _ -> error({E, S}) end.-define(LOWER(Char), if Char >= $A, Char =< $Z -> Char - ($A - $a); true -> Char end).tolower(Chars) -> [?LOWER(Char) || Char <- Chars].-define(UPPER(Char), if Char >= $a, Char =< $z -> Char + ($A - $a); true -> Char end).toupper(Chars) -> [?UPPER(Char) || Char <- Chars]. invalid_pp(What, Value, Error) -> {error, {invalid_PropertyParm, {What, Value, Error}}}.error(Reason) -> throw({error, Reason}).
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -