Tools / Diagnostic / Vol I

SDP Decoder

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.

Reading the protocol

v= o= s= t= are mandatory

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.

Where c= lives

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.

Static vs dynamic payload types

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.

Direction defaults to sendrecv

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.

Port 0 = stream rejected

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.

RTCP placement

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.

BUNDLE wants mid=

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.

Address family

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.