Skip to content

SDP

The sdp namespace parses and rewrites SDP bodies — codec filtering, hold, attribute manipulation, media-section removal — then applies the result back to a message.

from siphon import sdp

s = sdp.parse(request)
s.filter_codecs(["PCMU", "PCMA"])
s.apply(request)

sdp namespace

Mock sdp namespace — SDP parser and manipulator.

Usage::

from siphon import sdp

s = sdp.parse(request)
s.media[0].set_attr("des", "qos optional local sendrecv")
s.apply(request)

parse

parse(source: Union[str, bytes, object]) -> MockSdp

Parse SDP from a Request/Reply/Call message, a string, or bytes.

Parameters:

Name Type Description Default
source Union[str, bytes, object]

A Request, Reply, Call, str, or bytes containing SDP.

required

Returns:

Type Description
MockSdp

An Sdp object for structured inspection and manipulation.

Raises:

Type Description
ValueError

If the message has no body or the body is invalid.

TypeError

If the source type is unsupported.

Example::

s = sdp.parse(request)
s = sdp.parse("v=0\r\n...")
s = sdp.parse(b"v=0\r\n...")

Parsed SDP body

Returned by sdp.parse(...).

Parsed SDP body with structured access to session and media attributes.

Example::

s = sdp.parse(request)
s.get_attr("group")            # "BUNDLE audio video"
for m in s.media:
    m.set_attr("ptime", "30")
s.apply(request)

origin property

origin: Optional[str]

Origin line value (o=), or None.

Example::

s.origin  # "alice 2890844526 2890844526 IN IP4 10.0.0.1"

session_name property

session_name: Optional[str]

Session name (s=), or None.

Example::

s.session_name  # "SIPhon"

connection property

connection: Optional[str]

Session-level connection (c=), or None.

Example::

s.connection  # "IN IP4 10.0.0.1"

attrs property writable

attrs: list[str]

All session-level a= values as a list of strings.

Example::

s.attrs  # ["group:BUNDLE audio video", "ice-lite"]

media property

media: list[MockMediaSection]

List of media sections.

Example::

for m in s.media:
    print(m.media_type, m.port)

get_attr

get_attr(name: str) -> Optional[str]

Get the value of the first session-level attribute matching name.

For a=group:BUNDLE audio video, get_attr("group") returns "BUNDLE audio video". For flag attributes like a=ice-lite, returns "". Returns None if not found.

Parameters:

Name Type Description Default
name str

Attribute name.

required

Example::

s.get_attr("group")      # "BUNDLE audio video"
s.get_attr("ice-lite")   # ""

set_attr

set_attr(name: str, value: str = '') -> None

Set (replace or append) a session-level attribute.

Parameters:

Name Type Description Default
name str

Attribute name.

required
value str

Attribute value (empty string for flags).

''

Example::

s.set_attr("group", "BUNDLE audio")
s.set_attr("ice-lite")    # flag

remove_attr

remove_attr(name: str) -> None

Remove all session-level attributes matching name.

Parameters:

Name Type Description Default
name str

Attribute name to remove.

required

Example::

s.remove_attr("ice-lite")

has_attr

has_attr(name: str) -> bool

Check whether a session-level attribute with name exists.

Parameters:

Name Type Description Default
name str

Attribute name.

required

Example::

s.has_attr("ice-lite")  # True

filter_codecs

filter_codecs(keep: list[str]) -> None

Keep only codecs whose names match the given list (case-insensitive).

Parameters:

Name Type Description Default
keep list[str]

List of codec names to keep (e.g. ["PCMU", "PCMA"]).

required

Example::

s.filter_codecs(["PCMU", "PCMA"])

remove_codecs

remove_codecs(remove: list[str]) -> None

Remove codecs by name (case-insensitive).

Parameters:

Name Type Description Default
remove list[str]

List of codec names to remove (e.g. ["G729"]).

required

Example::

s.remove_codecs(["telephone-event"])

remove_media

remove_media(media_type: str) -> None

Remove all media sections with the given type.

Parameters:

Name Type Description Default
media_type str

Media type to remove (e.g. "video").

required

Example::

s.remove_media("video")

apply

apply(target: object) -> None

Write the SDP back into a Request/Reply/Call message.

Sets the body, updates Content-Type to application/sdp.

Parameters:

Name Type Description Default
target object

A Request, Reply, or Call mock object.

required

Example::

s = sdp.parse(request)
s.media[0].set_attr("ptime", "30")
s.apply(request)

Media section

An m= section within a parsed SDP body (iterated via sdp.media).

A single media section within a parsed SDP body.

Shares state with the parent MockSdp — mutations are immediately visible from either side.

Example::

s = sdp.parse(request)
m = s.media[0]
m.port = 0              # hold
m.set_attr("ptime", "30")
s.apply(request)

media_type property

media_type: str

Media type: "audio", "video", "application", etc.

protocol property

protocol: str

Protocol: "RTP/AVP", "RTP/SAVPF", etc.

codecs property

codecs: list[str]

Codec names derived from rtpmap and static payload types.

Example::

m.codecs  # ["PCMU", "PCMA", "opus"]

connection property

connection: Optional[str]

Media-level connection (c=), or None.

Example::

m.connection  # "IN IP4 192.168.1.1"

attrs property writable

attrs: list[str]

All a= attribute values for this media section.

Returns the part after a=. Excludes rtpmap and fmtp (which are stored separately).

Example::

m.attrs  # ["sendrecv", "ptime:20", "des:qos mandatory local sendrecv"]

get_attr

get_attr(name: str) -> Optional[str]

Get the value of the first a= attribute matching name.

For a=des:qos mandatory local sendrecv, get_attr("des") returns "qos mandatory local sendrecv". For flag attributes like a=sendrecv, returns "". Returns None if not found.

Parameters:

Name Type Description Default
name str

Attribute name (part before the first :, or the flag name).

required

Example::

m.get_attr("ptime")       # "20"
m.get_attr("sendrecv")    # ""
m.get_attr("nonexistent") # None

set_attr

set_attr(name: str, value: str = '') -> None

Set (replace first or append) a media-level attribute.

set_attr("des", "qos optional local sendrecv") produces a=des:qos optional local sendrecv. set_attr("sendrecv") produces a=sendrecv (flag).

Parameters:

Name Type Description Default
name str

Attribute name.

required
value str

Attribute value (empty string for flags).

''

Example::

m.set_attr("ptime", "30")
m.set_attr("sendrecv")    # flag

remove_attr

remove_attr(name: str) -> None

Remove all a= attributes matching name.

Parameters:

Name Type Description Default
name str

Attribute name to remove.

required

Example::

m.remove_attr("des")  # removes all a=des:... lines

has_attr

has_attr(name: str) -> bool

Check whether an a= attribute with name exists.

Parameters:

Name Type Description Default
name str

Attribute name to check.

required

Example::

m.has_attr("sendrecv")  # True