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.
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 SDP from a Request/Reply/Call message, a string, or bytes.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
source
|
Union[str, bytes, object]
|
A |
required |
Returns:
| Type | Description |
|---|---|
MockSdp
|
An |
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 line value (o=), or None.
Example::
s.origin # "alice 2890844526 2890844526 IN IP4 10.0.0.1"
session_name
property
¶
Session name (s=), or None.
Example::
s.session_name # "SIPhon"
connection
property
¶
Session-level connection (c=), or None.
Example::
s.connection # "IN IP4 10.0.0.1"
attrs
property
writable
¶
All session-level a= values as a list of strings.
Example::
s.attrs # ["group:BUNDLE audio video", "ice-lite"]
media
property
¶
List of media sections.
Example::
for m in s.media:
print(m.media_type, m.port)
get_attr
¶
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 (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 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
¶
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
¶
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. |
required |
Example::
s.filter_codecs(["PCMU", "PCMA"])
remove_codecs
¶
Remove codecs by name (case-insensitive).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
remove
|
list[str]
|
List of codec names to remove (e.g. |
required |
Example::
s.remove_codecs(["telephone-event"])
remove_media
¶
Remove all media sections with the given type.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
media_type
|
str
|
Media type to remove (e.g. |
required |
Example::
s.remove_media("video")
apply
¶
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 |
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)
codecs
property
¶
Codec names derived from rtpmap and static payload types.
Example::
m.codecs # ["PCMU", "PCMA", "opus"]
connection
property
¶
Media-level connection (c=), or None.
Example::
m.connection # "IN IP4 192.168.1.1"
attrs
property
writable
¶
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 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 |
required |
Example::
m.get_attr("ptime") # "20"
m.get_attr("sendrecv") # ""
m.get_attr("nonexistent") # None
set_attr
¶
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 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
¶
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