Session level
Fields that apply to every media stream below unless a
stream overrides them. v= and o=
and s= and t= are required;
c= can live here or per-stream but must be
reachable from every m=.
Paste a raw SDP body — or paste the whole SIP INVITE /
200 OK and the decoder will pull the body out
for you. Get the session-level fields, every m=
stream broken out with its codecs and direction, and a
quick-read verdict that flags the usual reasons negotiation
fails: missing rtpmap for a dynamic payload type,
port 0 streams, conflicting c= scope, address
family mismatches.
Everything runs in your browser. The text you paste is never sent to any server — no network requests, no analytics on input content, no logging. Safe to use on real production traces.
Fields that apply to every media stream below unless a
stream overrides them. v= and o=
and s= and t= are required;
c= can live here or per-stream but must be
reachable from every m=.
One card per m= line. Each card shows the
transport (port, protocol), the codec list with their
rtpmap + fmtp bindings, direction,
RTCP placement, and any BUNDLE / ICE / DTLS attributes
attached to the stream.
Structural problems the parser flagged. Hard errors break negotiation; warnings will negotiate but are still worth a second look.
v=0 declares SDP version (still 0 in 2026). o= is the origin: username sess-id sess-version nettype addrtype unicast-address. s= is the session name — can be a single space or "-" when none. t=0 0 means "permanent" — fine for SIP calls.
The connection line c=IN IP4 host can sit at session
level (applies to every m=) or per-stream
(overrides session-level). RFC 4566 §5.7 says it must be
reachable from every stream — i.e. either session-level
or a per-stream c=. The decoder flags missing
reachability as a hard error.
PTs 0–34 are statically assigned by RFC 3551 (PCMU=0,
GSM=3, PCMA=8, G722=9, G729=18, comfort noise=13, etc.) — no
rtpmap needed. PTs 96–127 are dynamic and
must carry an a=rtpmap for the
far end to know what they mean. Missing rtpmap on a dynamic PT is
the most common reason a leg goes silent.
If a stream has no sendrecv/sendonly/recvonly/inactive attribute, RFC 3264 says treat it as sendrecv. The decoder still calls this out — most working SDPs are explicit, and silent reliance on the default tends to mask intent.
RFC 3264 §6 says a port of 0 in an answer rejects that media stream — the m= line stays for index alignment with the offer but the stream is not used. In an offer, port 0 is unusual and the decoder flags it.
By default RTCP runs on RTP port + 1. a=rtcp:<port>
(RFC 3605) lets you override. a=rtcp-mux (RFC 5761)
folds RTCP onto the RTP port — common in WebRTC / SBCs but
still rare on legacy SIP gear. The decoder shows whichever
applies per stream.
a=group:BUNDLE multiplexes multiple streams on one
transport. Each stream it references must carry an
a=mid: matching one of the BUNDLE tokens — the
decoder flags BUNDLE tokens that don't resolve to a stream.
c=IN IP4 … vs c=IN IP6 … must
match the family of any address inside a=candidate,
a=rtcp, or downstream PIDF-LO. Mixed families are
a frequent cause of one-way audio when a half-IPv6 SBC sits
between two IPv4 endpoints.