Fork me on GitHub
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
Macros | Functions | Variables
sdp-utils.c File Reference

SDP utilities. More...

#include <string.h>
#include "sdp-utils.h"
#include "rtp.h"
#include "utils.h"
#include "debug.h"
Include dependency graph for sdp-utils.c:

Macros

#define JANUS_BUFSIZE   16384
 

Functions

void janus_sdp_destroy (janus_sdp *sdp)
 Method to destroy a Janus SDP object. More...
 
void janus_sdp_mline_destroy (janus_sdp_mline *m)
 Helper method to free a janus_sdp_mline instance. More...
 
void janus_sdp_attribute_destroy (janus_sdp_attribute *a)
 Helper method to free a janus_sdp_attribute instance. More...
 
janus_sdp_mlinejanus_sdp_mline_create (janus_sdp_mtype type, guint16 port, const char *proto, janus_sdp_mdirection direction)
 Helper method to quickly create a janus_sdp_mline instance. More...
 
janus_sdp_mlinejanus_sdp_mline_find (janus_sdp *sdp, janus_sdp_mtype type)
 Helper method to get the janus_sdp_mline associated to a media type. More...
 
janus_sdp_mlinejanus_sdp_mline_find_by_index (janus_sdp *sdp, int index)
 Helper method to get the janus_sdp_mline by its index. More...
 
int janus_sdp_mline_remove (janus_sdp *sdp, janus_sdp_mtype type)
 Helper method to remove the janus_sdp_mline associated to a media type from the SDP. More...
 
janus_sdp_attributejanus_sdp_attribute_create (const char *name, const char *value,...)
 
int janus_sdp_attribute_add_to_mline (janus_sdp_mline *mline, janus_sdp_attribute *attr)
 Helper method to add an attribute to a media line. More...
 
janus_sdp_mtype janus_sdp_parse_mtype (const char *type)
 Helper method to get a janus_sdp_mtype from a string. More...
 
const char * janus_sdp_mtype_str (janus_sdp_mtype type)
 Helper method to get the string associated to a janus_sdp_mtype value. More...
 
janus_sdp_mdirection janus_sdp_parse_mdirection (const char *direction)
 Helper method to get a janus_sdp_mdirection from a string. More...
 
const char * janus_sdp_mdirection_str (janus_sdp_mdirection direction)
 Helper method to get the string associated to a janus_sdp_mdirection value. More...
 
const char * janus_sdp_oa_type_str (janus_sdp_oa_type type)
 
janus_sdpjanus_sdp_parse (const char *sdp, char *error, size_t errlen)
 Method to parse an SDP string to a janus_sdp object. More...
 
int janus_sdp_remove_payload_type (janus_sdp *sdp, int index, int pt)
 Helper method to quickly remove all traces (m-line, rtpmap, fmtp, etc.) of a payload type. More...
 
int janus_sdp_get_codec_pt (janus_sdp *sdp, int index, const char *codec)
 Helper to get the payload type associated to a specific codec in an m-line. More...
 
const char * janus_sdp_get_codec_name (janus_sdp *sdp, int index, int pt)
 Helper to get the codec name associated to a specific payload type in an m-line. More...
 
const char * janus_sdp_get_codec_rtpmap (const char *codec)
 Helper to get the rtpmap associated to a specific codec. More...
 
char * janus_sdp_write (janus_sdp *imported)
 Method to serialize a janus_sdp object to an SDP string. More...
 
void janus_sdp_find_preferred_codec (janus_sdp *sdp, janus_sdp_mtype type, int index, const char **codec)
 Helper method to return the preferred audio or video codec in an SDP offer or answer, (where by preferred we mean the codecs we prefer ourselves, and not the m-line SDP order) as long as the m-line direction is not disabled (port=0 or direction=inactive) in the SDP. More...
 
void janus_sdp_find_first_codecs (janus_sdp *sdp, janus_sdp_mtype type, int index, const char **codec)
 Helper method to return the first audio and video codecs in an SDP offer or answer, (no matter whether we personally prefer them ourselves or not) as long as the m-line direction is not disabled (port=0 or direction=inactive) in the SDP. More...
 
const char * janus_sdp_match_preferred_codec (janus_sdp_mtype type, char *codec)
 Helper method to match a codec to one of the preferred codecs. More...
 
janus_sdpjanus_sdp_new (const char *name, const char *address)
 Method to quickly generate a janus_sdp instance from a few selected fields. More...
 
janus_sdpjanus_sdp_generate_offer (const char *name, const char *address,...)
 Method to generate a janus_sdp offer, using variable arguments to dictate what to negotiate (e.g., in terms of media to offer, directions, etc.). Variable arguments are in the form of a sequence of name-value terminated by a JANUS_SDP_OA_DONE, e.g.: More...
 
int janus_sdp_generate_offer_mline (janus_sdp *offer,...)
 Method to add a single m-line to a new offer, using the same variable arguments janus_sdp_generate_offer supports. This is useful whenever you need to create a new offer, but don't know in advance how many m-lines you'll need, or it would be hard to do programmatically in a single call to janus_sdp_generate_offer. The first argument MUST be JANUS_SDP_OA_MLINE, specifying the type of the media. More...
 
janus_sdpjanus_sdp_generate_answer (janus_sdp *offer)
 Method to generate a janus_sdp answer to a provided janus_sdp offer. Notice that this doesn't address the individual m-lines: it will just create an empty response, create the corresponding m-lines, but leave them all "rejected". To answer each m-line you'll have to iterate on the offer m-lines and call janus_sdp_generate_answer_mline instead, e.g.: More...
 
int janus_sdp_generate_answer_mline (janus_sdp *offer, janus_sdp *answer, janus_sdp_mline *offered,...)
 Method to respond to a single m-line in an offer, using the same variable arguments janus_sdp_generate_offer_mline supports. The first argument MUST be JANUS_SDP_OA_MLINE, specifying the type of the media, e.g.: More...
 

Variables

const char * janus_preferred_audio_codecs []
 
uint janus_audio_codecs = sizeof(janus_preferred_audio_codecs)/sizeof(*janus_preferred_audio_codecs)
 
const char * janus_preferred_video_codecs []
 
uint janus_video_codecs = sizeof(janus_preferred_video_codecs)/sizeof(*janus_preferred_video_codecs)
 

Detailed Description

SDP utilities.

Author
Lorenzo Miniero loren.nosp@m.zo@m.nosp@m.eetec.nosp@m.ho.c.nosp@m.om

Implementation of an internal SDP representation. Allows to parse SDP strings to an internal janus_sdp object, the manipulation of such object by playing with its properties, and a serialization to an SDP string that can be passed around. Since they don't have any core dependencies, these utilities can be used by plugins as well.

Core

Macro Definition Documentation

#define JANUS_BUFSIZE   16384

Function Documentation

int janus_sdp_attribute_add_to_mline ( janus_sdp_mline mline,
janus_sdp_attribute attr 
)

Helper method to add an attribute to a media line.

Parameters
[in]mlineThe m-line to add the attribute to
[in]attrThe attribute to add
Returns
0 in case of success, -1 otherwise
janus_sdp_attribute* janus_sdp_attribute_create ( const char *  name,
const char *  value,
  ... 
)
void janus_sdp_attribute_destroy ( janus_sdp_attribute attr)

Helper method to free a janus_sdp_attribute instance.

Note
This method does not remove the attribute from the global or m-line attributes, that's up to the caller
Parameters
[in]attrThe janus_sdp_attribute instance to free
void janus_sdp_destroy ( janus_sdp sdp)

Method to destroy a Janus SDP object.

Parameters
[in]sdpThe Janus SDP object to free
void janus_sdp_find_first_codecs ( janus_sdp sdp,
janus_sdp_mtype  type,
int  index,
const char **  codec 
)

Helper method to return the first audio and video codecs in an SDP offer or answer, (no matter whether we personally prefer them ourselves or not) as long as the m-line direction is not disabled (port=0 or direction=inactive) in the SDP.

Note
The codec arguments is input/output, and it'll be set to a static value in janus_preferred_audio_codecs and janus_preferred_video_codecs, so don't free it.
Parameters
[in]sdpThe Janus SDP object to parse
[in]typeWhether we're looking at an audio or video codec
[in]indexThe m-line to refer to (use -1 for the first m-line that matches)
[out]codecThe audio or video codec that was found
void janus_sdp_find_preferred_codec ( janus_sdp sdp,
janus_sdp_mtype  type,
int  index,
const char **  codec 
)

Helper method to return the preferred audio or video codec in an SDP offer or answer, (where by preferred we mean the codecs we prefer ourselves, and not the m-line SDP order) as long as the m-line direction is not disabled (port=0 or direction=inactive) in the SDP.

Note
The codec arguments is input/output, and it'll be set to a static value in janus_preferred_audio_codecs or janus_preferred_video_codecs, so don't free it.
Parameters
[in]sdpThe Janus SDP object to parse
[in]typeWhether we're looking at an audio or video codec
[in]indexThe m-line to refer to (use -1 for the first m-line that matches)
[out]codecThe audio or video codec that was found
janus_sdp* janus_sdp_generate_answer ( janus_sdp offer)

Method to generate a janus_sdp answer to a provided janus_sdp offer. Notice that this doesn't address the individual m-lines: it will just create an empty response, create the corresponding m-lines, but leave them all "rejected". To answer each m-line you'll have to iterate on the offer m-lines and call janus_sdp_generate_answer_mline instead, e.g.:

       janus_sdp *answer = janus_sdp_generate_answer(offer);
       GList *temp = offer->m_lines;
       while(temp) {
        janus_sdp_mline *m = (janus_sdp_mline *)temp->data;
        janus_sdp_generate_answer_mline(offer, answer, m,
                [..]
                JANUS_SDP_OA_DONE);
        temp = temp->next;
       }
Parameters
[in]offerThe Janus SDP offer to respond to
Returns
A pointer to a janus_sdp object, if successful, NULL otherwise
int janus_sdp_generate_answer_mline ( janus_sdp offer,
janus_sdp answer,
janus_sdp_mline offered,
  ... 
)

Method to respond to a single m-line in an offer, using the same variable arguments janus_sdp_generate_offer_mline supports. The first argument MUST be JANUS_SDP_OA_MLINE, specifying the type of the media, e.g.:

       janus_sdp_generate_answer_mline(offer, answer, offer_mline,
        JANUS_SDP_OA_MLINE, JANUS_SDP_AUDIO,
                JANUS_SDP_OA_CODEC, "opus",
                JANUS_SDP_OA_DIRECTION, JANUS_SDP_RECVONLY,
        JANUS_SDP_OA_DONE);

to respond to an offered m-line with recvonly audio and use Opus.

Parameters
[in]offerThe Janus SDP offer
[in]answerThe Janus SDP answer to add the new m-line to
[in]offeredThe Janus SDP m-line from the offer to respond to
Returns
0 if successful, a negative integer othwerwise
janus_sdp* janus_sdp_generate_offer ( const char *  name,
const char *  address,
  ... 
)

Method to generate a janus_sdp offer, using variable arguments to dictate what to negotiate (e.g., in terms of media to offer, directions, etc.). Variable arguments are in the form of a sequence of name-value terminated by a JANUS_SDP_OA_DONE, e.g.:

       janus_sdp *offer = janus_sdp_generate_offer("My session", "127.0.0.1",
        JANUS_SDP_OA_MLINE, JANUS_SDP_AUDIO,
                JANUS_SDP_OA_PT, 100,
                JANUS_SDP_OA_DIRECTION, JANUS_SDP_SENDONLY,
                JANUS_SDP_OA_CODEC, "opus",
        JANUS_SDP_OA_MLINE, JANUS_SDP_VIDEO,
                JANUS_SDP_OA_PT, 101,
                JANUS_SDP_OA_DIRECTION, JANUS_SDP_RECVONLY,
                JANUS_SDP_OA_CODEC, "vp8",
        JANUS_SDP_OA_DONE);

to offer a sendonly Opus audio stream being offered with 100 as payload type, and a recvonly VP8 video stream with 101 as payload type. Refer to the property names in the header file for a complete list of how you can drive the offer. Other media streams can be added, as long as you prefix/specify them with JANUS_SDP_OA_MLINE as done here. The default, if not specified, is to not offer anything, meaning it will be up to you to add m-lines subsequently.

Parameters
[in]nameThe session name (if NULL, a default value will be set)
[in]addressThe IP to set in o= and c= fields (if NULL, a default value will be set)
Returns
A pointer to a janus_sdp object, if successful, NULL otherwise
int janus_sdp_generate_offer_mline ( janus_sdp offer,
  ... 
)

Method to add a single m-line to a new offer, using the same variable arguments janus_sdp_generate_offer supports. This is useful whenever you need to create a new offer, but don't know in advance how many m-lines you'll need, or it would be hard to do programmatically in a single call to janus_sdp_generate_offer. The first argument MUST be JANUS_SDP_OA_MLINE, specifying the type of the media.

Note
In case case you add audio and don't specify anything else, the default is to use Opus and payload type 111. For video, the default is VP8 and payload type 96. The default media direction is sendrecv.
Parameters
[in]offerThe Janus SDP offer to add the new m-line to
Returns
0 if successful, a negative integer othwerwise
const char* janus_sdp_get_codec_name ( janus_sdp sdp,
int  index,
int  pt 
)

Helper to get the codec name associated to a specific payload type in an m-line.

Parameters
sdpThe Janus SDP instance to process
indexThe m-line to refer to (use -1 for the first m-line that matches)
ptThe payload type to find
Returns
The codec name, if found, or NULL otherwise
int janus_sdp_get_codec_pt ( janus_sdp sdp,
int  index,
const char *  codec 
)

Helper to get the payload type associated to a specific codec in an m-line.

Parameters
sdpThe Janus SDP instance to process
indexThe m-line to refer to (use -1 for the first m-line that matches)
codecThe codec to find, as a string
Returns
The payload type, if found, or -1 otherwise
const char* janus_sdp_get_codec_rtpmap ( const char *  codec)

Helper to get the rtpmap associated to a specific codec.

Parameters
codecThe codec name, as a string (e.g., "opus")
Returns
The rtpmap value, if found (e.g., "opus/48000/2"), or NULL otherwise
const char* janus_sdp_match_preferred_codec ( janus_sdp_mtype  type,
char *  codec 
)

Helper method to match a codec to one of the preferred codecs.

Note
Don't free the returned value, as it's a constant value
Parameters
[in]typeThe type of media to match
[in]codecThe codec to match
Returns
The codec, if found, or NULL otherwise
const char* janus_sdp_mdirection_str ( janus_sdp_mdirection  direction)

Helper method to get the string associated to a janus_sdp_mdirection value.

Parameters
[in]directionThe direction to stringify
Returns
The direction as a string, if valid, or NULL otherwise
janus_sdp_mline* janus_sdp_mline_create ( janus_sdp_mtype  type,
guint16  port,
const char *  proto,
janus_sdp_mdirection  direction 
)

Helper method to quickly create a janus_sdp_mline instance.

Note
The type_str property of the new m-line is created automatically depending on the provided type attribute. If type is JANUS_SDP_OTHER, though, type_str will NOT we allocated, and will be up to the caller.
Parameters
[in]typeType of the media (audio/video/application) as a janus_sdp_mtype
[in]portPort to advertise
[in]protoProfile to advertise
[in]directionDirection of the media as a janus_sdp_direction
Returns
A pointer to a valid janus_sdp_mline instance, if successfull, NULL otherwise
void janus_sdp_mline_destroy ( janus_sdp_mline mline)

Helper method to free a janus_sdp_mline instance.

Note
This method does not remove the m-line from the janus_sdp instance, that's up to the caller
Parameters
[in]mlineThe janus_sdp_mline instance to free
janus_sdp_mline* janus_sdp_mline_find ( janus_sdp sdp,
janus_sdp_mtype  type 
)

Helper method to get the janus_sdp_mline associated to a media type.

Note
This currently returns the first m-line of the specified type it finds: as such, it's only here for backwards compatibility with plugins not doing multistream.
Parameters
[in]sdpThe Janus SDP object to search
[in]typeThe type of media to search
Returns
The janus_sdp_mline instance, if found, or NULL otherwise
janus_sdp_mline* janus_sdp_mline_find_by_index ( janus_sdp sdp,
int  index 
)

Helper method to get the janus_sdp_mline by its index.

Parameters
[in]sdpThe Janus SDP object to search
[in]indexThe index of the m-line in the SDP
Returns
The janus_sdp_mline instance, if found, or NULL otherwise
int janus_sdp_mline_remove ( janus_sdp sdp,
janus_sdp_mtype  type 
)

Helper method to remove the janus_sdp_mline associated to a media type from the SDP.

Note
This currently removes the first m-line of the specified type it finds: as such, it's only here for backwards compatibility with plugins not doing multistream.
Parameters
[in]sdpThe Janus SDP object to modify
[in]typeThe type of media to remove
Returns
0 if successful, a negative integer otherwise
const char* janus_sdp_mtype_str ( janus_sdp_mtype  type)

Helper method to get the string associated to a janus_sdp_mtype value.

Parameters
[in]typeThe type to stringify
Returns
The type as a string, if valid, or NULL otherwise
janus_sdp* janus_sdp_new ( const char *  name,
const char *  address 
)

Method to quickly generate a janus_sdp instance from a few selected fields.

Note
This allocates the o_addr, s_name and c_addr properties: if you want to replace them, don't forget to g_free the original pointers first.
Parameters
[in]nameThe session name (if NULL, a default value will be set)
[in]addressThe IP to set in o= and c= fields (if NULL, a default value will be set)
Returns
A pointer to a janus_sdp object, if successful, NULL otherwise
const char* janus_sdp_oa_type_str ( janus_sdp_oa_type  type)
janus_sdp* janus_sdp_parse ( const char *  sdp,
char *  error,
size_t  errlen 
)

Method to parse an SDP string to a janus_sdp object.

Parameters
[in]sdpThe SDP string to parse
[in,out]errorBuffer to receive a reason for an error, if any
[in]errlenThe length of the error buffer
Returns
A pointer to a janus_sdp object, if successful, NULL otherwise; in case of errors, if provided the error string is filled with a reason
janus_sdp_mdirection janus_sdp_parse_mdirection ( const char *  direction)

Helper method to get a janus_sdp_mdirection from a string.

Parameters
[in]directionThe direction to parse as a string (e.g., "sendrecv")
Returns
The corresponding janus_sdp_mdirection value
janus_sdp_mtype janus_sdp_parse_mtype ( const char *  type)

Helper method to get a janus_sdp_mtype from a string.

Parameters
[in]typeThe type to parse as a string (e.g., "audio")
Returns
The corresponding janus_sdp_mtype value
int janus_sdp_remove_payload_type ( janus_sdp sdp,
int  index,
int  pt 
)

Helper method to quickly remove all traces (m-line, rtpmap, fmtp, etc.) of a payload type.

Parameters
[in]sdpThe janus_sdp object to remove the payload type from
[in]indexThe m-line to remove the payload type from (use -1 for the first m-line that matches)
[in]ptThe payload type to remove
Returns
0 in case of success, a negative integer otherwise
char* janus_sdp_write ( janus_sdp sdp)

Method to serialize a janus_sdp object to an SDP string.

Parameters
[in]sdpThe janus_sdp object to serialize
Returns
A pointer to a string with the serialized SDP, if successful, NULL otherwise

Variable Documentation

uint janus_audio_codecs = sizeof(janus_preferred_audio_codecs)/sizeof(*janus_preferred_audio_codecs)
const char* janus_preferred_audio_codecs[]
Initial value:
= {
"opus", "pcmu", "pcma", "g722", "isac16", "isac32"
}
const char* janus_preferred_video_codecs[]
Initial value:
= {
"vp8", "vp9", "h264"
}
uint janus_video_codecs = sizeof(janus_preferred_video_codecs)/sizeof(*janus_preferred_video_codecs)