%% ``The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
%% compliance with the License. You should have received a copy of the
%% Erlang Public License along with this software. If not, it can be
%% retrieved via the world wide web at http://www.erlang.org/.
%%
%% Software distributed under the License is distributed on an "AS IS"
%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
%% the License for the specific language governing rights and limitations
%% under the License.
%%
%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
%% AB. All Rights Reserved.''
%%
%% $Id$
%%
%%----------------------------------------------------------------------
%% Purpose:
%%----------------------------------------------------------------------
%%
%%
%% Explanaition of the fields in the SDP body
%% (See RFC 4566 for the complete decription)
%%
%% Session descriptions
%%
%% v protocol version
%% o owner/creator and session identifier
%% s session name (optional)
%% i session information (optional)
%% u URI of description (optional)
%% e email address (optional)
%% p phone number (optional)
%% c connection information (optional)
%% b bandwidth information (optional)
%% One or more time descriptions ("t=" and "r=" lines; see below)
%% z time zone adjustment (optional)
%% k encryption key (optional)
%% a zero or more session attribute lines (optional)
%% Zero or more media descriptions
%%
%% Time descriptions
%%
%% t time the session is active
%% r zero or more repeat times (optional)
%%
%% Media descriptions, if present
%%
%% m media name and transport address
%% i media title (optional)
%% c connection information - optional if included at session-level
%% b bandwidth information (optional)
%% k encryption key (optional)
%% a zero or more media attribute lines (optional)
%%
%%
%% An example SDP description is:
%%
%% v=0
%% o=jdoe 2890844526 2890842807 IN IP4 10.47.16.5
%% s=SDP Seminar
%% i=A Seminar on the session description protocol
%% u=http://www.example.com/seminars/sdp.pdf
%% [email protected] (Jane Doe)
%% c=IN IP4 224.2.17.12/127
%% t=2873397496 2873404696
%% a=recvonly
%% m=audio 49170 RTP/AVP 0
%% m=video 51372 RTP/AVP 99
%% a=rtpmap:99 h263-1998/90000
%%
%%
%%----------------------------------------------------------------------
-ifndef(megaco_sdp_).
-define(megaco_sdp_, true).
%% ===================================================================
%%
%% Protocol Version ("v=")
%%
%% v=0
%%
%% The "v=" field gives the version of the Session Description
%% Protocol. This memo defines version 0. There is no minor version
%% number
%%
-record(megaco_sdp_v, {
version % integer()
}
).
%% ===================================================================
%%
%% Origin ("o=")
%%
%% o=<username> <sess-id> <sess-version> <nettype> <addrtype>
%% <unicast-address>
%%
%% The "o=" field gives the originator of the session (their username
%% and the address of the user's host) plus a session id and session
%% version number:
%%
%% <username> is the user's login on the originating host, or it is
%% "-" if the originating host does not support the concept of
%% user IDs. The <username> MUST NOT contain spaces.
%%
%% <sess-id> is a numeric string such that the tuple of <username>,
%% <sess-id>, <nettype>, <addrtype> and <unicast-address> form a
%% globally unique identifier for the session. The method of
%% <sess-id> allocation is up to the creating tool, but it has
%% been suggested that a Network Time Protocol (NTP)
%% timestamp be used to ensure uniqueness [13].
%%
%% <sess-version> is a version number for this announcement. Its
%% usage is up to the creating tool, so long as <sess-version>
%% is increased when a modification is made to the session data.
%% Again, it is RECOMMENDED that an NTP format timestamp is used
%%
%% <nettype> is a text string giving the type of network.
%% Initially "IN" is defined to have the meaning "Internet", but
%% other values MAY be registered in the future (see Section 8
%% of RFC 4566).
%%
%% <addrtype> is a text string giving the type of the address that
%% follows. Initially "IP4" and "IP6" are defined, but other
%% values MAY be registered in the future (see Section 8
%% of RFC 4566).
%%
%% <unicast-address> is the address of the machine from which the
%% session was created. For an address type of IP4, this is
%% either the fully qualified domain name of the machine or the
%% dotted-decimal representation of the IP version 4 address of
%% the machine. For an address type of IP6, this is either the
%% fully qualified domain name of the machine or the compressed
%% textual representation of the IP version 6 address of the
%% machine. For both IP4 and IP6, the fully qualified domain name
%% is the form that SHOULD be given unless this is unavailable,
%% in which case the globally unique address MAY be substituted.
%% A local IP address MUST NOT be used in any context where the
%% SDP description might leave the scope in which the address is
%% meaningful (for example, a local address MUST NOT be included
%% in an application-level referral that might leave the scope).
%%
%% In general, the "o=" field serves as a globally unique identifier
%% for this version of this session description, and the subfields
%% excepting the version taken together identify the session
%% irrespective of any modifications.
%%
%% For privacy reasons, it is sometimes desirable to obfuscate the
%% username and IP address of the session originator. If this is a
%% concern, an arbitrary <username> and private <unicast-address> MAY be
%% chosen to populate the "o=" field, provided that these are selected
%% in a manner that does not affect the global uniqueness of the field.
%%
%%
-record(megaco_sdp_o, {
user_name, % <username> string()
session_id, % <sess-id> integer()
version, % <sess-version> integer()
network_type = in, % <nettype> in | string()
address_type = ip4, % <addrtype> ip4 | ip6 | string()
address % <unicast-address> string()
}
).
%% ===================================================================
%%
%% Session Name ("s=")
%%
%% s=<session name>
%%
%% The "s=" field is the textual session name. There MUST be one and
%% only one "s=" field per session description. The "s=" field MUST
%% NOT be empty and SHOULD contain ISO 10646 characters (but see also
%% the "a=charset" attribute). If a session has no meaningful name,
%% the value "s= " SHOULD be used (i.e., a single space as the session
%% name).
%%
-record(megaco_sdp_s, {
name % string()
}
).
%% ===================================================================
%%
%% Session and Media Information ("i=")
%%
%% i=<session description>
%%
%% The "i=" field provides textual information about the session.
%% There MUST be at most one session-level "i=" field per session
%% description, and at most one "i=" field per media. If the
%% "a=charset" attribute is present, it specifies the character set
%% used in the "i=" field. If the "a=charset" attribute is not
%% present, the "i=" field MUST contain ISO 10646 characters in
%% UTF-8 encoding.
%%
%% A single "i=" field MAY also be used for each media definition.
%% In media definitions, "i=" fields are primarily intended for
%% labelling media streams. As such, they are most likely to be
%% useful when a single session has more than one distinct media
%% stream of the same media type. An example would be two different
%% whiteboards, one for slides and one for feedback and questions.
%%
%% The "i=" field is intended to provide a free-form human-readable
%% description of the session or the purpose of a media stream. It
%% is not suitable for parsing by automata.
%%
-record(megaco_sdp_i, {
session_descriptor % string()
}
).
%% ===================================================================
%%
%% URI ("u=")
%%
%% u=<URI>
%%
%% A URI is a Uniform Resource Identifier as used by WWW clients [7].
%% The URI should be a pointer to additional information about the
%% session. This field is OPTIONAL, but if it is present it MUST be
%% specified before the first media field. No more than one URI field
%% is allowed per session description.
%%
-record(megaco_sdp_u, {
uri % string()
}
).
%% ===================================================================
%%
%% Email Address and Phone Number ("e=" and "p=")
%%
%% e=<email address>
%% p=<phone number>
%%
%% The "e=" and "p=" lines specify contact information for the person
%% responsible for the conference. This is not necessarily the same
%% person that created the conference announcement.
%%
%% Inclusion of an email address or phone number is OPTIONAL. Note
%% that the previous version of SDP specified that either an email
%% field or a phone field MUST be specified, but this was widely
%% ignored. The change brings the specification into line with
%% common usage.
%%
%% If an email address or phone number is present, it MUST be
%% specified before the first media field. More than one email or
%% phone field can be given for a session description.
%%
%% Phone numbers SHOULD be given in the form of an international
%% public telecommunication number (see ITU-T Recommendation E.164)
%% preceded by a "+". Spaces and hyphens may be used to split up a
%% phone field to aid readability if desired. For example:
%%
%% p=+1 617 555-6011
%%
%% Both email addresses and phone numbers can have an OPTIONAL free
%% text string associated with them, normally giving the name of the
%% person who may be contacted. This MUST be enclosed in parentheses
%% if it is present. For example:
%%
%% [email protected] (Jane Doe)
%%
%% The alternative RFC 2822 [29] name quoting convention is also
%% allowed for both email addresses and phone numbers. For example:
%%
%% e=Jane Doe <[email protected]>
%%
%% The free text string SHOULD be in the ISO-10646 character set with
%% UTF-8 encoding, or alternatively in ISO-8859-1 or other encodings
%% if the appropriate session-level "a=charset" attribute is set.
%%
-record(megaco_sdp_e, {
email % string()
}
).
-record(megaco_sdp_p, {
phone_number % string()
}
).
%% ===================================================================
%%
%% Connection Data ("c=")
%%
%% c=<nettype> <addrtype> <connection-address>
%%
%% The "c=" field contains connection data.
%%
%% A session description MUST contain either at least one "c=" field
%% in each media description or a single "c=" field at the session
%% level. It MAY contain a single session-level "c=" field and
%% additional "c=" field(s) per media description, in which case the
%% per-media values override the session-level settings for the
%% respective media.
%%
%% The first sub-field ("<nettype>") is the network type, which is a
%% text string giving the type of network. Initially, "IN" is
%% defined to have the meaning "Internet", but other values MAY be
%% registered in the future (see Section 8 of RFC 4566).
%%
%% The second sub-field ("<addrtype>") is the address type. This
%% allows SDP to be used for sessions that are not IP based. This
%% memo only defines IP4 and IP6, but other values MAY be registered
%% in the future (see Section 8 of RFC 4566).
%%
%% The third sub-field ("<connection-address>") is the connection
%% address. OPTIONAL sub-fields MAY be added after the connection
%% address depending on the value of the <addrtype> field.
%%
%% When the <addrtype> is IP4 and IP6, the connection address is
%% defined as follows:
%%
%% o If the session is multicast, the connection address will be an
%% IP multicast group address. If the session is not multicast,
%% then the connection address contains the unicast IP address of
%% the expected data source or data relay or data sink as
%% determined by additional attribute fields. It is not expected
%% that unicast addresses will be given in a session description
%% that is communicated by a multicast announcement, though this
%% is not prohibited.
%%
%% o Sessions using an IPv4 multicast connection address MUST also
%% have a time to live (TTL) value present in addition to the
%% multicast address. The TTL and the address together define the
%% scope with which multicast packets sent in this conference will
%% be sent. TTL values MUST be in the range 0-255. Although the
%% TTL MUST be specified, its use to scope multicast traffic is
%% deprecated; applications SHOULD use an administratively scoped
%% address instead.
%%
%% The TTL for the session is appended to the address using a slash
%% as a separator. An example is:
%%
%% c=IN IP4 224.2.36.42/127
%%
%% IPv6 multicast does not use TTL scoping, and hence the TTL value
%% MUST NOT be present for IPv6 multicast. It is expected that IPv6
%% scoped addresses will be used to limit the scope of conferences.
%%
%% Hierarchical or layered encoding schemes are data streams where
%% the encoding from a single media source is split into a number of
%% layers. The receiver can choose the desired quality (and hence
%% bandwidth) by only subscribing to a subset of these layers. Such
%% layered encodings are normally transmitted in multiple multicast
%% groups to allow multicast pruning. This technique keeps unwanted
%% traffic from sites only requiring certain levels of the hierarchy.
%% For applications requiring multiple multicast groups, we allow the
%% following notation to be used for the connection address:
%%
%% <base multicast address>[/<ttl>]/<number of addresses>
%%
%% If the number of addresses is not given, it is assumed to be one.
%% Multicast addresses so assigned are contiguously allocated above
%% the base address, so that, for example:
%%
%% c=IN IP4 224.2.1.1/127/3
%%
%% would state that addresses 224.2.1.1, 224.2.1.2, and 224.2.1.3 are
%% to be used at a TTL of 127. This is semantically identical to
%% including multiple "c=" lines in a media description:
%%
%% c=IN IP4 224.2.1.1/127
%% c=IN IP4 224.2.1.2/127
%% c=IN IP4 224.2.1.3/127
%%
%% Similarly, an IPv6 example would be:
%%
%% c=IN IP6 FF15::101/3
%%
%% which is semantically equivalent to:
%%
%% c=IN IP6 FF15::101
%% c=IN IP6 FF15::102
%% c=IN IP6 FF15::103
%%
%% (remembering that the TTL field is not present in IPv6 multicast).
%%
%% Multiple addresses or "c=" lines MAY be specified on a per-media
%% basis only if they provide multicast addresses for different layers
%% in a hierarchical or layered encoding scheme. They MUST NOT be
%% specified for a session-level "c=" field.
%%
%% The slash notation for multiple addresses described above MUST NOT
%% be used for IP unicast addresses.
%%
-record(megaco_sdp_c, {
network_type = in, % <nettype> in | string()
address_type = ip4, % <addrtype> ip4 | ip6 | string()
connection_addr % <connection-address> string() | conn_addr()
}).
%% Only if address type = ip4
%% conn_addr() -> #megaco_sdp_c_conn_addr{}
-record(megaco_sdp_c_conn_addr, {
base, % <base multicast address> string()
ttl, % <ttl> integer()
num_of % <number of addresses> undefined | integer()
}).
%% ===================================================================
%%
%% Bandwidth ("b=")
%%
%% b=<bwtype>:<bandwidth>
%%
%% This OPTIONAL field denotes the proposed bandwidth to be used by
%% the session or media. The <bwtype> is an alphanumeric modifier
%% giving the meaning of the <bandwidth> figure. Two values are
%% defined in this specification, but other values MAY be registered
%% in the future (see Section 8 of RFC 4566 and [21], [25]):
%%
%% CT If the bandwidth of a session or media in a session is
%% different from the bandwidth implicit from the scope, a
%% "b=CT:..." line SHOULD be supplied for the session giving the
%% proposed upper limit to the bandwidth used (the "conference
%% total" bandwidth). The primary purpose of this is to give an
%% approximate idea as to whether two or more sessions can coexist
%% simultaneously. When using the CT modifier with RTP, if
%% several RTP sessions are part of the conference, the conference
%% total refers to total bandwidth of all RTP sessions.
%%
%% AS The bandwidth is interpreted to be application specific (it
%% will be the application's concept of maximum bandwidth).
%% Normally, this will coincide with what is set on the
%% application's "maximum bandwidth" control if applicable. For
%% RTP-based applications, AS gives the RTP "session bandwidth"
%% as defined in Section 6.2 of [19].
%%
%% Note that CT gives a total bandwidth figure for all the media at
%% all sites. AS gives a bandwidth figure for a single media at a
%% single site, although there may be many sites sending
%% simultaneously.
%%
%% A prefix "X-" is defined for <bwtype> names. This is intended
%% for experimental purposes only. For example:
%%
%% b=X-YZ:128
%%
%% Use of the "X-" prefix is NOT RECOMMENDED: instead new modifiers
%% SHOULD be registered with IANA in the standard namespace. SDP
%% parsers MUST ignore bandwidth fields with unknown modifiers.
%% Modifiers MUST be alphanumeric and, although no length limit is
%% given, it is recommended that they be short.
%%
%% The <bandwidth> is interpreted as kilobits per second by default.
%% The definition of a new <bwtype> modifier MAY specify that the
%% bandwidth is to be interpreted in some alternative unit (the "CT"
%% and "AS" modifiers defined in this memo use the default units).
%%
%% bwtype() -> ct | as | string()
-record(megaco_sdp_b, {
bwtype, % bwtype()
bandwidth % integer()
}).
%% ===================================================================
%%
%% Times ("t=")
%%
%% t=<start time> <stop time>
%%
%% The "t=" lines specify the start and stop times for a session.
%% Multiple "t=" lines MAY be used if a session is active at
%% multiple irregularly spaced times; each additional "t=" line
%% specifies an additional period of time for which the session will
%% be active. If the session is active at regular times, an "r="
%% line (see below) should be used in addition to, and following, a
%% "t=" line -- in which case the "t=" line specifies the start and
%% stop times of the repeat sequence.
%%
%% The first and second sub-fields give the start and stop times,
%% respectively, for the session. These values are the decimal
%% representation of Network Time Protocol (NTP) time values in
%% seconds since 1900 [13]. To convert these values to UNIX time,
%% subtract decimal 2208988800.
%%
%% NTP timestamps are elsewhere represented by 64-bit values, which
%% wrap sometime in the year 2036. Since SDP uses an arbitrary length
%% decimal representation, this should not cause an issue (SDP
%% timestamps MUST continue counting seconds since 1900, NTP will use
%% the value modulo the 64-bit limit).
%%
%% If the <stop-time> is set to zero, then the session is not bounded,
%% though it will not become active until after the <start-time>. If
%% the <start-time> is also zero, the session is regarded as
%% permanent.
%%
%% User interfaces SHOULD strongly discourage the creation of
%% unbounded and permanent sessions as they give no information about
%% when the session is actually going to terminate, and so make
%% scheduling difficult.
%%
%% The general assumption may be made, when displaying unbounded
%% sessions that have not timed out to the user, that an unbounded
%% session will only be active until half an hour from the current
%% time or the session start time, whichever is the later. If
%% behaviour other than this is required, an end-time SHOULD be given
%% and modified as appropriate when new information becomes available
%% about when the session should really end.
%%
%% Permanent sessions may be shown to the user as never being active
%% unless there are associated repeat times that state precisely when
%% the session will be active.
%%
-record(megaco_sdp_t, {
start, % integer()
stop % integer()
}).
%% ===================================================================
%%
%% Repeat Times ("r=")
%%
%% r=<repeat interval> <active duration> <offsets from start-time>
%%
%% "r=" fields specify repeat times for a session. For example, if a
%% session is active at 10am on Monday and 11am on Tuesday for one
%% hour each week for three months, then the <start-time> in the
%% corresponding "t=" field would be the NTP representation of 10am
%% on the first Monday, the <repeat interval> would be 1 week, the
%% <active duration> would be 1 hour, and the offsets would be zero
%% and 25 hours. The corresponding "t=" field stop time would be
%% the NTP representation of the end of the last session three months
%% later. By default, all fields are in seconds, so the "r=" and
%% "t=" fields might be the following:
%%
%% t=3034423619 3042462419
%% r=604800 3600 0 90000
%%
%% To make description more compact, times may also be given in units
%% of days, hours, or minutes. The syntax for these is a number
%% immediately followed by a single case-sensitive character.
%% Fractional units are not allowed -- a smaller unit should be used
%% instead. The following unit specification characters are allowed:
%%
%% d - days (86400 seconds)
%% h - hours (3600 seconds)
%% m - minutes (60 seconds)
%% s - seconds (allowed for completeness)
%%
%% Thus, the above session announcement could also have been written:
%%
%% r=7d 1h 0 25h
%%
%% Monthly and yearly repeats cannot be directly specified with a
%% single SDP repeat time; instead, separate "t=" fields should be
%% used to explicitly list the session times.
%%
-record(megaco_sdp_r, {
repeat_interval, % string()
active_duration, % string()
list_of_offsets % [ string() ]
}
).
%% ===================================================================
%%
%% Time Zones ("z=")
%%
%% z=<adjustment time> <offset> <adjustment time> <offset> ....
%%
%% To schedule a repeated session that spans a change from daylight
%% saving time to standard time or vice versa, it is necessary to
%% specify offsets from the base time. This is required because
%% different time zones change time at different times of day,
%% different countries change to or from daylight saving time on
%% different dates, and some countries do not have daylight saving
%% time at all.
%%
%% Thus, in order to schedule a session that is at the same time
%% winter and summer, it must be possible to specify unambiguously by
%% whose time zone a session is scheduled. To simplify this task for
%% receivers, we allow the sender to specify the NTP time that a time
%% zone adjustment happens and the offset from the time when the
%% session was first scheduled. The "z=" field allows the sender to
%% specify a list of these adjustment times and offsets from the base
%% time.
%%
%% An example might be the following:
%%
%% z=2882844526 -1h 2898848070 0
%%
%% This specifies that at time 2882844526, the time base by which the
%% session's repeat times are calculated is shifted back by 1 hour,
%% and that at time 2898848070, the session's original time base is
%% restored. Adjustments are always relative to the specified start
%% time -- they are not cumulative. Adjustments apply to all "t="
%% and "r=" lines in a session description.
%%
%% If a session is likely to last several years, it is expected that
%% the session announcement will be modified periodically rather than
%% transmit several years' worth of adjustments in one session
%% announcement.
%%
%% adjustment() -> #megaco_sdp_z_adjustement{}
-record(megaco_sdp_z, {
list_of_adjustments % [ adjustment() ]
}
).
-record(megaco_sdp_z_adjustement, {
time, % string()
offset % string()
}
).
%% ===================================================================
%%
%% Encryption Keys ("k=")
%%
%% k=<method>
%% k=<method>:<encryption key>
%%
%% If transported over a secure and trusted channel, the Session
%% Description Protocol MAY be used to convey encryption keys. A
%% simple mechanism for key exchange is provided by the key field
%% ("k="), although this is primarily supported for compatibility
%% with older implementations and its use is NOT RECOMMENDED. Work
%% is in progress to define new key exchange mechanisms for use with
%% SDP [27] [28], and it is expected that new applications will use
%% those mechanisms. A key field is permitted before the first media
%% entry (in which case it applies to all media in the session), or
%% for each media entry as required. The format of keys and their
%% usage are outside the scope of this document, and the key field
%% provides no way to indicate the encryption algorithm to be used,
%% key type, or other information about the key: this is assumed to
%% be provided by the higher-level protocol using SDP. If there is
%% a need to convey this information within SDP, the extensions
%% mentioned previously SHOULD be used. Many security protocols
%% require two keys: one for confidentiality, another for integrity.
%% This specification does not support transfer of two keys.
%%
%% The method indicates the mechanism to be used to obtain a usable
%% key by external means, or from the encoded encryption key given.
%% The following methods are defined:
%%
%% k=clear:<encryption key>
%%
%% The encryption key is included untransformed in this key
%% field. This method MUST NOT be used unless it can be
%% guaranteed that the SDP is conveyed over a secure channel.
%% The encryption key is interpreted as text according to the
%% charset attribute; use the "k=base64:" method to convey
%% characters that are otherwise prohibited in SDP.
%%
%% k=base64:<encoded encryption key>
%%
%% The encryption key is included in this key field but has
%% been base64 encoded [12] because it includes characters
%% that are prohibited in SDP. This method MUST NOT be used
%% unless it can be guaranteed that the SDP is conveyed over
%% a secure channel.
%%
%% k=uri:<URI to obtain key>
%%
%% A Uniform Resource Identifier is included in the key field.
%% The URI refers to the data containing the key, and may
%% require additional authentication before the key can be
%% returned. When a request is made to the given URI, the
%% reply should specify the encoding for the key. The URI is
%% often an Secure Socket Layer/Transport Layer Security
%% (SSL/TLS)-protected HTTP URI ("https:"), although this is
%% not required.
%%
%% k=prompt
%%
%% No key is included in this SDP description, but the session
%% or media stream referred to by this key field is encrypted.
%% The user should be prompted for the key when attempting to
%% join the session, and this user-supplied key should then be
%% used to decrypt the media streams. The use of
%% user-specified keys is NOT RECOMMENDED, since such keys tend
%% to have weak security properties.
%%
%% The key field MUST NOT be used unless it can be guaranteed that
%% the SDP is conveyed over a secure and trusted channel. An example
%% of such a channel might be SDP embedded inside an S/MIME message
%% or a TLS-protected HTTP session. It is important to ensure that
%% the secure channel is with the party that is authorised to join the
%% session, not an intermediary: if a caching proxy server is used, it
%% is important to ensure that the proxy is either trusted or unable
%% to access the SDP.
%%
%% method() -> clear | base64 | uri | prompt
-record(megaco_sdp_k, {
method, % method() | string()
encryption_key % undefined | string()
}
).
%% ===================================================================
%%
%% Attributes ("a=")
%%
%% a=<attribute>
%% a=<attribute>:<value>
%%
%% Attributes are the primary means for extending SDP. Attributes
%% may be defined to be used as "session-level" attributes,
%% "media-level" attributes, or both.
%%
%% A media description may have any number of attributes ("a="
%% fields) that are media specific. These are referred to as
%% "media-level" attributes and add information about the media
%% stream. Attribute fields can also be added before the first
%% media field; these "session-level" attributes convey additional
%% information that applies to the conference as a whole rather than
%% to individual media.
%%
%% Attribute fields may be of two forms:
%%
%% o A property attribute is simply of the form "a=<flag>". These
%% are binary attributes, and the presence of the attribute
%% conveys that the attribute is a property of the session. An
%% example might be "a=recvonly".
%%
%% o A value attribute is of the form "a=<attribute>:<value>". For
%% example, a whiteboard could have the value attribute "a=orient:
%% landscape"
%%
%% Attribute interpretation depends on the media tool being invoked.
%% Thus receivers of session descriptions should be configurable in
%% their interpretation of session descriptions in general and of
%% attributes in particular.
%%
%% Attribute names MUST use the US-ASCII subset of ISO-10646/UTF-8.
%%
%% Attribute values are octet strings, and MAY use any octet value
%% except 0x00 (Nul), 0x0A (LF), and 0x0D (CR). By default,
%% attribute values are to be interpreted as in ISO-10646 character
%% set with UTF-8 encoding. Unlike other text fields, attribute
%% values are NOT normally affected by the "charset" attribute as
%% this would make comparisons against known values problematic.
%% However, when an attribute is defined, it can be defined to be
%% charset dependent, in which case its value should be interpreted
%% in the session charset rather than in ISO-10646.
%%
%% Attributes MUST be registered with IANA (see Section 8 of RFC
%% 4566). If an attribute is received that is not understood, it
%% MUST be ignored by the receiver.
%%
%% SDP Attributes
%%
%% The following attributes are defined. Since application writers
%% may add new attributes as they are required, this list is not
%% exhaustive. Registration procedures for new attributes are defined
%% in Section 8.2.4 of RFC 4566.
%%
%% a=cat:<category>
%%
%% This attribute gives the dot-separated hierarchical category
%% of the session. This is to enable a receiver to filter
%% unwanted sessions by category. There is no central registry
%% of categories. It is a session-level attribute, and it is
%% not dependent on charset.
%%
%% a=keywds:<keywords>
%%
%% Like the cat attribute, this is to assist identifying wanted
%% sessions at the receiver. This allows a receiver to select
%% interesting session based on keywords describing the purpose
%% of the session; there is no central registry of keywords. It
%% is a session-level attribute. It is a charset-dependent
%% attribute, meaning that its value should be interpreted in the
%% charset specified for the session description if one is
%% specified, or by default in ISO 10646/UTF-8.
%%
%% a=tool:<name and version of tool>
%%
%% This gives the name and version number of the tool used to
%% create the session description. It is a session-level
%% attribute, and it is not dependent on charset.
%%
%% a=ptime:<packet time>
%%
%% This gives the length of time in milliseconds represented by
%% the media in a packet. This is probably only meaningful for
%% audio data, but may be used with other media types if it
%% makes sense. It should not be necessary to know ptime to
%% decode RTP or vat audio, and it is intended as a
%% recommendation for the encoding/packetisation of audio. It
%% is a media-level attribute, and it is not dependent on charset.
%%
%% a=maxptime:<maximum packet time>
%%
%% This gives the maximum amount of media that can be encapsulated
%% in each packet, expressed as time in milliseconds. The time
%% SHALL be calculated as the sum of the time the media present in
%% the packet represents. For frame-based codecs, the time SHOULD
%% be an integer multiple of the frame size. This attribute is
%% probably only meaningful for audio data, but may be used with
%% other media types if it makes sense. It is a media-level
%% attribute, and it is not dependent on charset. Note that this
%% attribute was introduced after RFC 2327, and non-updated
%% implementations will ignore this attribute.
%%
%% a=rtpmap:<payload type> <encoding name>/<clock rate> [/<encoding
%% parameters>]
%%
%% This attribute maps from an RTP payload type number (as used in
%% an "m=" line) to an encoding name denoting the payload format
%% to be used. It also provides information on the clock rate and
%% encoding parameters. It is a media-level attribute that is not
%% dependent on charset.
%%
%% Although an RTP profile may make static assignments of payload
%% type numbers to payload formats, it is more common for that
%% assignment to be done dynamically using "a=rtpmap:" attributes.
%% As an example of a static payload type, consider u-law PCM
%% coded single-channel audio sampled at 8 kHz. This is
%% completely defined in the RTP Audio/Video profile as payload
%% type 0, so there is no need for an "a=rtpmap:" attribute, and
%% the media for such a stream sent to UDP port 49232 can be
%% specified as:
%%
%% m=audio 49232 RTP/AVP 0
%%
%% An example of a dynamic payload type is 16-bit linear encoded
%% stereo audio sampled at 16 kHz. If we wish to use the dynamic
%% RTP/AVP payload type 98 for this stream, additional
%% information is required to decode it:
%%
%% m=audio 49232 RTP/AVP 98
%% a=rtpmap:98 L16/16000/2
%%
%% Up to one rtpmap attribute can be defined for each media
%% format specified. Thus, we might have the following:
%%
%% m=audio 49230 RTP/AVP 96 97 98
%% a=rtpmap:96 L8/8000
%% a=rtpmap:97 L16/8000
%% a=rtpmap:98 L16/11025/2
%%
%% RTP profiles that specify the use of dynamic payload types
%% MUST define the set of valid encoding names and/or a means to
%% register encoding names if that profile is to be used with
%% SDP. The "RTP/AVP" and "RTP/SAVP" profiles use media subtypes
%% for encoding names, under the top-level media type denoted in
%% the "m=" line. In the example above, the media types are
%% "audio/l8" and "audio/l16".
%%
%% For audio streams, <encoding parameters> indicates the number
%% of audio channels. This parameter is OPTIONAL and may be
%% omitted if the number of channels is one, provided that no
%% additional parameters are needed.
%%
%% For video streams, no encoding parameters are currently
%% specified.
%%
%% Additional encoding parameters MAY be defined in the future,
%% but codec-specific parameters SHOULD NOT be added.
%% Parameters added to an "a=rtpmap:" attribute SHOULD only be
%% those required for a session directory to make the choice of
%% appropriate media to participate in a session. Codec-specific
%% parameters should be added in other attributes (for example,
%% "a=fmtp:").
%%
%% Note: RTP audio formats typically do not include information
%% about the number of samples per packet. If a non-default (as
%% defined in the RTP Audio/Video Profile) packetisation is
%% required, the "ptime" attribute is used as given above.
%%
%% a=recvonly
%%
%% This specifies that the tools should be started in
%% receive-only mode where applicable. It can be either a
%% session- or media-level attribute, and it is not dependent
%% on charset. Note that recvonly applies to the media only,
%% not to any associated control protocol (e.g., an RTP-based
%% system in recvonly mode SHOULD still send RTCP packets).
%%
%% a=sendrecv
%%
%% This specifies that the tools should be started in send and
%% receive mode. This is necessary for interactive conferences
%% with tools that default to receive-only mode. It can be
%% either a session or media-level attribute, and it is not
%% dependent on charset.
%%
%% If none of the attributes "sendonly", "recvonly", "inactive",
%% and "sendrecv" is present, "sendrecv" SHOULD be assumed as
%% the default for sessions that are not of the conference type
%% "broadcast" or "H332" (see below).
%%
%% a=sendonly
%%
%% This specifies that the tools should be started in send-only
%% mode. An example may be where a different unicast address is
%% to be used for a traffic destination than for a traffic
%% source. In such a case, two media descriptions may be used,
%% one sendonly and one recvonly. It can be either a session-
%% or media-level attribute, but would normally only be used as
%% a media attribute. It is not dependent on charset. Note
%% that sendonly applies only to the media, and any associated
%% control protocol (e.g., RTCP) SHOULD still be received and
%% processed as normal.
%%
%% a=inactive
%%
%% This specifies that the tools should be started in inactive
%% mode. This is necessary for interactive conferences where
%% users can put other users on hold. No media is sent over an
%% inactive media stream. Note that an RTP-based system SHOULD
%% still send RTCP, even if started inactive. It can be either
%% a session or media-level attribute, and it is not dependent
%% on charset.
%%
%% a=orient:<orientation>
%%
%% Normally this is only used for a whiteboard or presentation
%% tool. It specifies the orientation of a the workspace on
%% the screen. It is a media-level attribute. Permitted
%% values are "portrait", "landscape", and "seascape"
%% (upside-down landscape). It is not dependent on charset.
%%
%% a=type:<conference type>
%%
%% This specifies the type of the conference. Suggested
%% values are "broadcast", "meeting", "moderated", "test", and
%% "H332". "recvonly" should be the default for
%% "type:broadcast" sessions, "type:meeting" should imply
%% "sendrecv", and "type:moderated" should indicate the use of
%% a floor control tool and that the media tools are started
%% so as to mute new sites joining the conference.
%%
%% Specifying the attribute "type:H332" indicates that this
%% loosely coupled session is part of an H.332 session as
%% defined in the ITU H.332 specification [26]. Media tools
%% should be started "recvonly".
%%
%% Specifying the attribute "type:test" is suggested as a hint
%% that, unless explicitly requested otherwise, receivers can
%% safely avoid displaying this session description to users.
%%
%% The type attribute is a session-level attribute, and it is
%% not dependent on charset.
%%
%% a=charset:<character set>
%%
%% This specifies the character set to be used to display the
%% session name and information data. By default, the
%% ISO-10646 character set in UTF-8 encoding is used. If a
%% more compact representation is required, other character
%% sets may be used. For example, the ISO 8859-1 is specified
%% with the following SDP attribute:
%%
%% a=charset:ISO-8859-1
%%
%% This is a session-level attribute and is not dependent on
%% charset. The charset specified MUST be one of those
%% registered with IANA, such as ISO-8859-1. The character
%% set identifier is a US-ASCII string and MUST be compared
%% against the IANA identifiers using a case-insensitive
%% comparison. If the identifier is not recognised or not
%% supported, all strings that are affected by it SHOULD be
%% regarded as octet strings.
%%
%% Note that a character set specified MUST still prohibit
%% the use of bytes 0x00 (Nul), 0x0A (LF), and 0x0d (CR).
%% Character sets requiring the use of these characters MUST
%% define a quoting mechanism that prevents these bytes from
%% appearing within text fields.
%%
%% a=sdplang:<language tag>
%%
%% This can be a session-level attribute or a media-level
%% attribute. As a session-level attribute, it specifies the
%% language for the session description. As a media-level
%% attribute, it specifies the language for any media-level
%% SDP information field associated with that media. Multiple
%% sdplang attributes can be provided either at session or
%% media level if multiple languages in the session description
%% or media use multiple languages, in which case the order of
%% the attributes indicates the order of importance of the
%% various languages in the session or media from most important
%% to least important.
%%
%% In general, sending session descriptions consisting of
%% multiple languages is discouraged. Instead, multiple
%% descriptions SHOULD be sent describing the session, one in
%% each language. However, this is not possible with all
%% transport mechanisms, and so multiple sdplang attributes
%% are allowed although NOT RECOMMENDED.
%%
%% The "sdplang" attribute value must be a single RFC 3066
%% language tag in US-ASCII [9]. It is not dependent on the
%% charset attribute. An "sdplang" attribute SHOULD be
%% specified when a session is of sufficient scope to cross
%% geographic boundaries where the language of recipients
%% cannot be assumed, or where the session is in a different
%% language from the locally assumed norm.
%%
%% a=lang:<language tag>
%%
%% This can be a session-level attribute or a media-level
%% attribute. As a session-level attribute, it specifies the
%% default language for the session being described. As a
%% media-level attribute, it specifies the language for that
%% media, overriding any session-level language specified.
%% Multiple lang attributes can be provided either at session
%% or media level if the session description or media use
%% multiple languages, in which case the order of the
%% attributes indicates the order of importance of the various
%% languages in the session or media from most important to
%% least important.
%%
%% The "lang" attribute value must be a single RFC 3066
%% language tag in US-ASCII [9]. It is not dependent on the
%% charset attribute. A "lang" attribute SHOULD be specified
%% when a session is of sufficient scope to cross geographic
%% boundaries where the language of recipients cannot be
%% assumed, or where the session is in a different language
%% from the locally assumed norm.
%%
%% a=framerate:<frame rate>
%%
%% This gives the maximum video frame rate in frames/sec.
%% It is intended as a recommendation for the encoding of
%% video data. Decimal representations of fractional values
%% using the notation "<integer>.<fraction>" are allowed. It
%% is a media-level attribute, defined only for video media,
%% and it is not dependent on charset.
%%
%% a=quality:<quality>
%%
%% This gives a suggestion for the quality of the encoding
%% as an integer value. The intention of the quality
%% attribute for video is to specify a non-default trade-off
%% between frame-rate and still-image quality. For video,
%% the value is in the range 0 to 10, with the following
%% suggested meaning:
%%
%% 10 - the best still-image quality the compression
%% scheme can give.
%% 5 - the default behaviour given no quality suggestion.
%% 0 - the worst still-image quality the codec designer
%% thinks is still usable.
%%
%% It is a media-level attribute, and it is not dependent on
%% charset.
%%
%% a=fmtp:<format> <format specific parameters>
%%
%% This attribute allows parameters that are specific to a
%% particular format to be conveyed in a way that SDP does
%% not have to understand them. The format must be one of
%% the formats specified for the media. Format-specific
%% parameters may be any set of parameters required to be
%% conveyed by SDP and given unchanged to the media tool that
%% will use this format. At most one instance of this
%% attribute is allowed for each format.
%%
%% It is a media-level attribute, and it is not dependent on
%% charset.
%%
%% a=<attribute>
%% a=<attribute>:<value>
-record(megaco_sdp_a, {
attribute, % string()
value % undefined | string()
}
).
%% a=cat:<category>
-record(megaco_sdp_a_cat, {
category % string()
}
).
%% a=keywds:<keywords>
-record(megaco_sdp_a_keywds, {
keywords % string()
}
).
%% a=tool:<name and version of tool>
-record(megaco_sdp_a_tool, {
name_and_version % string()
}
).
%% a=ptime:<packet time>
-record(megaco_sdp_a_ptime, {
packet_time % integer()
}
).
%% a=maxptime:<maximum packet time>
-record(megaco_sdp_a_maxptime, {
maximum_packet_time % integer()
}
).
%% a=rtpmap:<payload type> <encoding name>/<clock rate> [/<encoding parameters>]
-record(megaco_sdp_a_rtpmap, {
payload_type, % <payload type> integer()
encoding_name, % <encoding name> string()
clock_rate, % <clock rate> integer()
encoding_parms = [] % <encoding parameters> [ string() ]
}
).
%% a=orient:<orientation>
%% orientation() -> portrait | landscape | seascape
-record(megaco_sdp_a_orient, {
orientation % orientation()
}
).
%% a=type:<conference type>
-record(megaco_sdp_a_type, {
conf_type % string()
}
).
%% a=charset:<character set>
-record(megaco_sdp_a_charset, {
char_set % string()
}
).
%% a=sdplang:<language tag>
-record(megaco_sdp_a_sdplang, {
tag % string()
}
).
%% a=lang:<language tag>
-record(megaco_sdp_a_lang, {
tag % string()
}
).
%% a=framerate:<frame rate>
-record(megaco_sdp_a_framerate, {
frame_rate % string()
}
).
%% a=quality:<quality>
-record(megaco_sdp_a_quality, {
quality % integer()
}
).
%% a=fmtp:<format> <format specific parameters>
-record(megaco_sdp_a_fmtp, {
format, % string()
param % string()
}
).
%% ===================================================================
%%
%% Media Announcements ("m=")
%%
%% m=<media> <port> <proto> <fmt> ...
%%
%% A session description may contain a number of media descriptions.
%% Each media description starts with an "m=" field and is terminated
%% by either the next "m=" field or by the end of the session
%% description. A media field has several sub-fields:
%%
%% <media> is the media type. Currently defined media are "audio",
%% "video", "text", "application", and "message", although this
%% list may be extended in the future (see Section 8 of RFC 4566).
%%
%% <port> is the transport port to which the media stream is sent.
%% The meaning of the transport port depends on the network being
%% used as specified in the relevant "c=" field, and on the
%% transport protocol defined in the <proto> sub-field of the
%% media field. Other ports used by the media application (such as
%% the RTP Control Protocol (RTCP) port [19]) MAY be derived
%% algorithmically from the base media port or MAY be specified in
%% a separate attribute (for example, "a=rtcp:" as defined in
%% [22]).
%%
%% If non-contiguous ports are used or if they don't follow the
%% parity rule of even RTP ports and odd RTCP ports, the "a=rtcp:"
%% attribute MUST be used. Applications that are requested to send
%% media to a <port> that is odd and where the "a=rtcp:" is present
%% MUST NOT subtract 1 from the RTP port: that is, they MUST send
%% the RTP to the port indicated in <port> and send the RTCP to the
%% port indicated in the "a=rtcp" attribute.
%%
%% For applications where hierarchically encoded streams are being
%% sent to a unicast address, it may be necessary to specify
%% multiple transport ports. This is done using a similar notation
%% to that used for IP multicast addresses in the "c=" field:
%%
%% m=<media> <port>/<number of ports> <proto> <fmt> ...
%%
%% In such a case, the ports used depend on the transport protocol.
%% For RTP, the default is that only the even-numbered ports are
%% used for data with the corresponding one-higher odd ports used
%% for the RTCP belonging to the RTP session, and the
%% <number of ports> denoting the number of RTP sessions. For
%% example:
%%
%% m=video 49170/2 RTP/AVP 31
%%
%% would specify that ports 49170 and 49171 form one RTP/RTCP pair
%% and 49172 and 49173 form the second RTP/RTCP pair. RTP/AVP is
%% the transport protocol and 31 is the format (see below). If
%% non-contiguous ports are required, they must be signalled using
%% a separate attribute (for example, "a=rtcp:" as defined in
%% [22]).
%%
%% If multiple addresses are specified in the "c=" field and
%% multiple ports are specified in the "m=" field, a one-to-one
%% mapping from port to the corresponding address is implied. For
%% example:
%%
%% c=IN IP4 224.2.1.1/127/2
%% m=video 49170/2 RTP/AVP 31
%%
%% would imply that address 224.2.1.1 is used with ports 49170
%% and 49171, and address 224.2.1.2 is used with ports 49172 and
%% 49173.
%%
%% The semantics of multiple "m=" lines using the same transport
%% address are undefined. This implies that, unlike limited past
%% practice, there is no implicit grouping defined by such means
%% and an explicit grouping framework (for example, [18]) should
%% instead be used to express the intended semantics.
%%
%% <proto> is the transport protocol. The meaning of the transport
%% protocol is dependent on the address type field in the
%% relevant "c=" field. Thus a "c=" field of IP4 indicates that
%% the transport protocol runs over IP4. The following transport
%% protocols are defined, but may be extended through
%% registration of new protocols with IANA (see Section 8 of RFC
%% 4566):
%%
%% * udp: denotes an unspecified protocol running over UDP.
%%
%% * RTP/AVP: denotes RTP [19] used under the RTP Profile for
%% Audio and Video Conferences with Minimal Control [20]
%% running over UDP.
%%
%% * RTP/SAVP: denotes the Secure Real-time Transport Protocol
%% [23] running over UDP.
%%
%% The main reason to specify the transport protocol in addition
%% to the media format is that the same standard media formats
%% may be carried over different transport protocols even when
%% the network protocol is the same -- a historical example is
%% vat Pulse Code Modulation (PCM) audio and RTP PCM audio;
%% another might be TCP/RTP PCM audio. In addition, relays and
%% monitoring tools that are transport-protocol-specific but
%% format-independent are possible.
%%
%% <fmt> is a media format description. The fourth and any
%% subsequent sub-fields describe the format of the media. The
%% interpretation of the media format depends on the value of
%% the <proto> sub-field.
%%
%% If the <proto> sub-field is "RTP/AVP" or "RTP/SAVP" the <fmt>
%% sub-fields contain RTP payload type numbers. When a list of
%% payload type numbers is given, this implies that all of these
%% payload formats MAY be used in the session, but the first of
%% these formats SHOULD be used as the default format for the
%% session. For dynamic payload type assignments the "a=rtpmap:"
%% attribute (see Section 6 of RFC 4566) SHOULD be used to map
%% from an RTP payload type number to a media encoding name that
%% identifies the payload format. The "a=fmtp:" attribute MAY
%% be used to specify format parameters (see Section 6 of RFC
%% 4566).
%%
%% If the <proto> sub-field is "udp" the <fmt> sub-fields MUST
%% reference a media type describing the format under the
%% "audio", "video", "text", "application", or "message"
%% top-level media types. The media type registration SHOULD
%% define the packet format for use with UDP transport.
%%
%% For media using other transport protocols, the <fmt> field is
%% protocol specific. Rules for interpretation of the <fmt> sub-
%% field MUST be defined when registering new protocols (see
%% Section 8.2.2 of RFC 4566).
%%
%% ma_media() -> audio | video | application | data | control
-record(megaco_sdp_m, {
media, % ma_media() | string()
port, % integer()
num_ports, % undefined | integer()
transport, % string()
fmt_list = [] % [ string() ]
}).
%% ===================================================================
%%
%% References
%%
%% Normative References
%%
%% [1] Mockapetris, P., "Domain names - concepts and facilities", STD
%% 13, RFC 1034, November 1987.
%%
%% [2] Mockapetris, P., "Domain names - implementation and
%% specification", STD 13, RFC 1035, November 1987.
%%
%% [3] Bradner, S., "Key words for use in RFCs to Indicate Requirement
%% Levels", BCP 14, RFC 2119, March 1997.
%%
%% [4] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax
%% Specifications: ABNF", RFC 4234, October 2005.
%%
%% [5] Yergeau, F., "UTF-8, a transformation format of ISO 10646", STD
%% 63, RFC 3629, November 2003.
%%
%% [6] Handley, M. and V. Jacobson, "SDP: Session Description
%% Protocol", RFC 2327, April 1998.
%%
%% [7] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform
%% Resource Identifier (URI): Generic Syntax", STD 66, RFC 3986,
%% January 2005.
%%
%% [8] Narten, T. and H. Alvestrand, "Guidelines for Writing an IANA
%% Considerations Section in RFCs", BCP 26, RFC 2434, October
%% 1998.
%%
%% [9] Alvestrand, H., "Tags for the Identification of Languages", BCP
%% 47, RFC 3066, January 2001.
%%
%% [10] Olson, S., Camarillo, G., and A. Roach, "Support for IPv6 in
%% Session Description Protocol (SDP)", RFC 3266, June 2002.
%%
%% [11] Faltstrom, P., Hoffman, P., and A. Costello,
%% "Internationalizing Domain Names in Applications (IDNA)", RFC
%% 3490, March 2003.
%%
%% [12] Josefsson, S., "The Base16, Base32, and Base64 Data Encodings",
%% RFC 3548, July 2003.
%%
%%
%% Informative References
%%
%% [13] Mills, D., "Network Time Protocol (Version 3) Specification,
%% Implementation", RFC 1305, March 1992.
%%
%% [14] Handley, M., Perkins, C., and E. Whelan, "Session Announcement
%% Protocol", RFC 2974, October 2000.
%%
%% [15] Rosenberg, J., Schulzrinne, H., Camarillo, G., Johnston, A.,
%% Peterson, J., Sparks, R., Handley, M., and E. Schooler, "SIP:
%% Session Initiation Protocol", RFC 3261, June 2002.
%%
%% [16] Schulzrinne, H., Rao, A., and R. Lanphier, "Real Time Streaming
%% Protocol (RTSP)", RFC 2326, April 1998.
%%
%% [17] Rosenberg, J. and H. Schulzrinne, "An Offer/Answer Model with
%% Session Description Protocol (SDP)", RFC 3264, June 2002.
%%
%% [18] Camarillo, G., Eriksson, G., Holler, J., and H. Schulzrinne,
%% "Grouping of Media Lines in the Session Description Protocol
%% (SDP)", RFC 3388, December 2002.
%%
%% [19] Schulzrinne, H., Casner, S., Frederick, R., and V. Jacobson,
%% "RTP: A Transport Protocol for Real-Time Applications", STD 64,
%% RFC 3550, July 2003.
%%
%% [20] Schulzrinne, H. and S. Casner, "RTP Profile for Audio and Video
%% Conferences with Minimal Control", STD 65, RFC 3551, July 2003.
%%
%% [21] Casner, S., "Session Description Protocol (SDP) Bandwidth
%% Modifiers for RTP Control Protocol (RTCP) Bandwidth", RFC 3556,
%% July 2003.
%%
%% [22] Huitema, C., "Real Time Control Protocol (RTCP) attribute in
%% Session Description Protocol (SDP)", RFC 3605, October 2003.
%%
%% [23] Baugher, M., McGrew, D., Naslund, M., Carrara, E., and K.
%% Norrman, "The Secure Real-time Transport Protocol (SRTP)", RFC
%% 3711, March 2004.
%%
%% [24] Rosenberg, J., Schulzrinne, H., and P. Kyzivat, "Indicating
%% User Agent Capabilities in the Session Initiation Protocol
%% (SIP)", RFC 3840, August 2004.
%%
%% [25] Westerlund, M., "A Transport Independent Bandwidth Modifier for
%% the Session Description Protocol (SDP)", RFC 3890, September
%% 2004.
%%
%% [26] International Telecommunication Union, "H.323 extended for
%% loosely coupled conferences", ITU Recommendation H.332,
%% September 1998.
%%
%% [27] Arkko, J., Carrara, E., Lindholm, F., Naslund, M., and K.
%% Norrman, "Key Management Extensions for Session Description
%% Protocol (SDP) and Real Time Streaming Protocol (RTSP)", RFC
%% 4567, July 2006.
%%
%% [28] Andreasen, F., Baugher, M., and D. Wing, "Session Description
%% Protocol (SDP) Security Descriptions for Media Streams", RFC
%% 4568, July 2006.
%%
%% [29] Resnick, P., "Internet Message Format", RFC 2822, April 2001.
%%
%% [30] Hinden, R. and S. Deering, "IP Version 6 Addressing
%% Architecture", RFC 2373, July 1998.
%%
%% [31] Freed, N. and J. Klensin, "Media Type Specifications and
%% Registration Procedures", BCP 13, RFC 4288, December 2005.
%%
-endif.