– Kamailio SIP Server –

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
development:sdp-parsing [2011/08/15 14:07]
109.254.49.8
development:sdp-parsing [2012/03/22 13:33] (current)
80.250.1.245 removed spam
Line 1: Line 1:
 +<​code>​
 +/*
 + * by Ovidiu Sas (work in progress)
 + */
 +</​code>​
 +
 +===== How to use the API =====
 +
 +Here's an example on how to use the API provided by the OpenSER SDP parser:
 +
 +First of all, we need to include the header file:
 +
 +<​code>​
 +#include "​../​../​parser/​sdp/​sdp.h"​
 +</​code>​
 +
 +Using the API:
 +
 +<​code>​
 +/*
 + * This is my method inside a module that handles the given sip message.
 + */
 +void my_method(struct sip_msg* msg)
 +{
 +    sdp_session_cell_t *session;
 +
 +    if (msg == NULL) {
 +        LM_ERR("​null msg\n"​);​
 +        return;
 +    }
 +
 +    /* Check for SDP. */
 +    if (0 == parse_sdp(msg)) {
 +        LM_DBG("​we have SDP!\n"​);​
 +        /* Let's print the content of SDP via a DBG log.
 +         * Check openser logs to see the output.
 +         */
 +
 +        /* initializing pointer to the first session
 +         * and start iterating through sessions.
 +         */
 +        session = msg->​sdp->​sessions;​
 +        while (session) {
 +            print_sdp_session(session);​
 +            session = session->​next;​
 +        }
 +    }
 +}
 +</​code>​
 +
 +
 +===== How to decipher the SDP =====
 +
 +Here's an example of a parsed SDP:
 +
 +<​code>​
 +Content-Type:​ multipart / mixed;​boundary=unique-boundary-1
 +Content-Length: ​ 346
 +
 +Content-Type:​ application/​SDP.
 +Content-Disposition:​ session
 +
 +v=0
 +o=user1 53655765 2353687637 IN IP4 10.11.10.148
 +s=-
 +c=IN IP4 10.11.10.148
 +t=0 0
 +m=audio 6002 RTP/AVP 0 1 18
 +a=rtpmap:0 PCMU/8000
 +a=inactive
 +
 +--unique-boundary-1
 +--unique-boundary-1
 +Content-Type:​ application/​text
 +
 +Hello
 +
 +--unique-boundary-1--
 +</​code>​
 +
 +And now the parsed structure.
 +
 +Here are the debug logs:
 +<​code>​
 +DBG:​core:​print_sdp_session:​ ..session[0]:​0x8174e50=>​(nil) '​session'​ (1)=>​0x8174e70
 +DBG:​core:​print_sdp_session:​ ....stream[0]:​0x8174e70=>​(nil) {0x817ce18} '​audio'​ '​6002'​ '​RTP/​AVP'​ '0 1 18' (3)=>​0x817cdd8
 +DBG:​core:​print_sdp_session:​ ......payload[2]:​0x817cdd8=>​0x8174ef8 p_payload_attr[2]:​0x817cdd8 '​18'​ ''​ ''​ ''​ ''​ ''​
 +DBG:​core:​print_sdp_session:​ ......payload[1]:​0x8174ef8=>​0x8174eb8 p_payload_attr[1]:​0x8174ef8 '​1'​ ''​ ''​ ''​ ''​ ''​
 +DBG:​core:​print_sdp_session:​ ......payload[0]:​0x8174eb8=>​(nil) p_payload_attr[0]:​0x8174eb8 '​0'​ '​PCMU'​ '​8000'​ ''​ '​inactive'​ ''​
 +</​code>​
 +
 +And how to decipher them:
 +We have one session. ​ The session has one stream. ​ The stream has three payloads:
 +* [b]session[0][/​b] with the Content-Disposition header set to "​[b]session[/​b]"​.
 +** [b]stream[0][/​b] identified by the "​[b]m=[/​b]"​ line with the following parameters:
 +*** type: [b]audio[/​b]
 +*** port: [b]6002[/b]
 +*** transport: [b]RTP/​AVP[/​b]
 +*** payloads: [b]0 1 18[/b]
 +**** [b]payload[0][/​b] identified by id "​[b]0[/​b]"​ with the following attributes:
 +***** codec name: [b]PCMU[/b]
 +***** sample rate: [b]8000[/b]
 +***** attribute: [b]inactive[/​b]
 +**** [b]payload[1][/​b] identified by id "​[b]1[/​b]"​ with the following attributes:
 +**** [b]payload[2][/​b]identified by id "​[b]18[/​b]"​ with the following attributes: