diff options
author | Benny Prijono <bennylp@teluu.com> | 2006-02-02 19:16:07 +0000 |
---|---|---|
committer | Benny Prijono <bennylp@teluu.com> | 2006-02-02 19:16:07 +0000 |
commit | 5125fc4191998ab13529ee59706f95116fc1725a (patch) | |
tree | e1f9b4fe1c3c3a1a734e099333c7107678065df9 /pjmedia/include | |
parent | 6cbba81e8937d6793705608e7e68e83ec950dd2a (diff) |
Added SDP negotiator and changed SDP structs (tested)
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@129 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjmedia/include')
-rw-r--r-- | pjmedia/include/pjmedia.h | 5 | ||||
-rw-r--r-- | pjmedia/include/pjmedia/errno.h | 250 | ||||
-rw-r--r-- | pjmedia/include/pjmedia/sdp.h | 499 | ||||
-rw-r--r-- | pjmedia/include/pjmedia/sdp_neg.h | 214 | ||||
-rw-r--r-- | pjmedia/include/pjmedia/types.h | 67 |
5 files changed, 868 insertions, 167 deletions
diff --git a/pjmedia/include/pjmedia.h b/pjmedia/include/pjmedia.h index b0310f24..7587b73e 100644 --- a/pjmedia/include/pjmedia.h +++ b/pjmedia/include/pjmedia.h @@ -19,14 +19,17 @@ #ifndef __PJMEDIA_H__ #define __PJMEDIA_H__ +#include <pjmedia/types.h> +#include <pjmedia/errno.h> #include <pjmedia/codec.h> #include <pjmedia/jbuf.h> #include <pjmedia/mediamgr.h> #include <pjmedia/rtcp.h> #include <pjmedia/rtp.h> -#include <pjmedia/session.h> +//#include <pjmedia/session.h> #include <pjmedia/sound.h> #include <pjmedia/sdp.h> +#include <pjmedia/sdp_neg.h> #endif /* __PJMEDIA_H__ */ diff --git a/pjmedia/include/pjmedia/errno.h b/pjmedia/include/pjmedia/errno.h new file mode 100644 index 00000000..1fe045e0 --- /dev/null +++ b/pjmedia/include/pjmedia/errno.h @@ -0,0 +1,250 @@ +/* $Id$ */ +/* + * Copyright (C) 2003-2006 Benny Prijono <benny@prijono.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifndef __PJMEDIA_ERRNO_H__ +#define __PJMEDIA_ERRNO_H__ + +#include <pj/errno.h> + +PJ_BEGIN_DECL + + +/** + * Guidelines on error message length. + */ +#define PJMEDIA_ERR_MSG_SIZE 64 + +/** + * Get error message for the specified error code. + * + * @param status The error code. + * @param buffer The buffer where to put the error message. + * @param bufsize Size of the buffer. + * + * @return The error message as NULL terminated string, + * wrapped with pj_str_t. + */ +PJ_DECL(pj_str_t) pjmedia_strerror( pj_status_t status, char *buffer, + pj_size_t bufsize); + + +/** + * Start of error code relative to PJ_ERRNO_START_USER. + */ +#define PJMEDIA_ERRNO_START (PJ_ERRNO_START_USER + PJ_ERRNO_SPACE_SIZE) + + +/************************************************************ + * GENERIC/GENERAL PJMEDIA ERRORS + ***********************************************************/ +/** + * @hideinitializer + * General/unknown PJMEDIA error. + */ +#define PJMEDIA_ERROR (PJMEDIA_ERRNO_START+1) /* 220001 */ + + +/************************************************************ + * SDP ERRORS + ***********************************************************/ +/** + * @hideinitializer + * Generic invalid SDP descriptor. + */ +#define PJMEDIA_SDP_EINSDP (PJMEDIA_ERRNO_START+20) /* 220020 */ +/** + * @hideinitializer + * Invalid SDP version. + */ +#define PJMEDIA_SDP_EINVER (PJMEDIA_ERRNO_START+21) /* 220021 */ +/** + * @hideinitializer + * Invalid SDP origin (o=) line. + */ +#define PJMEDIA_SDP_EINORIGIN (PJMEDIA_ERRNO_START+22) /* 220022 */ +/** + * @hideinitializer + * Invalid SDP time (t=) line. + */ +#define PJMEDIA_SDP_EINTIME (PJMEDIA_ERRNO_START+23) /* 220023 */ +/** + * @hideinitializer + * Empty SDP subject/name (s=) line. + */ +#define PJMEDIA_SDP_EINNAME (PJMEDIA_ERRNO_START+24) /* 220024 */ +/** + * @hideinitializer + * Invalid SDP connection info (c=) line. + */ +#define PJMEDIA_SDP_EINCONN (PJMEDIA_ERRNO_START+25) /* 220025 */ +/** + * @hideinitializer + * Missing SDP connection info line. + */ +#define PJMEDIA_SDP_EMISSINGCONN (PJMEDIA_ERRNO_START+26) /* 220026 */ +/** + * @hideinitializer + * Invalid attribute (a=) line. + */ +#define PJMEDIA_SDP_EINATTR (PJMEDIA_ERRNO_START+27) /* 220027 */ +/** + * @hideinitializer + * Invalid rtpmap attribute. + */ +#define PJMEDIA_SDP_EINRTPMAP (PJMEDIA_ERRNO_START+28) /* 220028 */ +/** + * @hideinitializer + * rtpmap attribute is too long. + */ +#define PJMEDIA_SDP_ERTPMAPTOOLONG (PJMEDIA_ERRNO_START+29) /* 220029 */ +/** + * @hideinitializer + * rtpmap is missing for dynamic payload type. + */ +#define PJMEDIA_SDP_EMISSINGRTPMAP (PJMEDIA_ERRNO_START+30) /* 220030 */ +/** + * @hideinitializer + * Invalid SDP media (m=) line. + */ +#define PJMEDIA_SDP_EINMEDIA (PJMEDIA_ERRNO_START+31) /* 220031 */ +/** + * @hideinitializer + * No payload format in the media stream. + */ +#define PJMEDIA_SDP_ENOFMT (PJMEDIA_ERRNO_START+32) /* 220032 */ +/** + * @hideinitializer + * Invalid payload type in media. + */ +#define PJMEDIA_SDP_EINPT (PJMEDIA_ERRNO_START+33) /* 220033 */ +/** + * @hideinitializer + * Invalid fmtp attribute. + */ +#define PJMEDIA_SDP_EINFMTP (PJMEDIA_ERRNO_START+34) /* 220034 */ + + +/************************************************************ + * SDP NEGOTIATOR ERRORS + ***********************************************************/ +/** + * @hideinitializer + * Invalid state to perform the specified operation. + */ +#define PJMEDIA_SDPNEG_EINSTATE (PJMEDIA_ERRNO_START+40) /* 220040 */ +/** + * @hideinitializer + * No currently active SDP. + */ +#define PJMEDIA_SDPNEG_ENOACTIVE (PJMEDIA_ERRNO_START+41) /* 220041 */ +/** + * @hideinitializer + * Media count mismatch in offer and answer. + */ +#define PJMEDIA_SDPNEG_EMISMEDIA (PJMEDIA_ERRNO_START+42) /* 220042 */ +/** + * @hideinitializer + * Media type is different in the remote answer. + */ +#define PJMEDIA_SDPNEG_EINVANSMEDIA (PJMEDIA_ERRNO_START+43) /* 220043 */ +/** + * @hideinitializer + * Transport type is different in the remote answer. + */ +#define PJMEDIA_SDPNEG_EINVANSTP (PJMEDIA_ERRNO_START+44) /* 220044 */ +/** + * @hideinitializer + * No common media payload is provided in the answer. + */ +#define PJMEDIA_SDPNEG_EANSNOMEDIA (PJMEDIA_ERRNO_START+45) /* 220045 */ + + +/************************************************************ + * SDP COMPARISON STATUS + ***********************************************************/ +/** + * @hideinitializer + * SDP media stream not equal. + */ +#define PJMEDIA_SDP_EMEDIANOTEQUAL (PJMEDIA_ERRNO_START+60) /* 220060 */ +/** + * @hideinitializer + * Port number in SDP media descriptor not equal. + */ +#define PJMEDIA_SDP_EPORTNOTEQUAL (PJMEDIA_ERRNO_START+61) /* 220061 */ +/** + * @hideinitializer + * Transport in SDP media descriptor not equal. + */ +#define PJMEDIA_SDP_ETPORTNOTEQUAL (PJMEDIA_ERRNO_START+62) /* 220062 */ +/** + * @hideinitializer + * Media format in SDP media descriptor not equal. + */ +#define PJMEDIA_SDP_EFORMATNOTEQUAL (PJMEDIA_ERRNO_START+63) /* 220063 */ +/** + * @hideinitializer + * SDP connection description not equal. + */ +#define PJMEDIA_SDP_ECONNNOTEQUAL (PJMEDIA_ERRNO_START+64) /* 220064 */ +/** + * @hideinitializer + * SDP attributes not equal. + */ +#define PJMEDIA_SDP_EATTRNOTEQUAL (PJMEDIA_ERRNO_START+65) /* 220065 */ +/** + * @hideinitializer + * SDP media direction not equal. + */ +#define PJMEDIA_SDP_EDIRNOTEQUAL (PJMEDIA_ERRNO_START+66) /* 220066 */ +/** + * @hideinitializer + * SDP fmtp attribute not equal. + */ +#define PJMEDIA_SDP_EFMTPNOTEQUAL (PJMEDIA_ERRNO_START+67) /* 220067 */ +/** + * @hideinitializer + * SDP ftpmap attribute not equal. + */ +#define PJMEDIA_SDP_ERTPMAPNOTEQUAL (PJMEDIA_ERRNO_START+68) /* 220068 */ +/** + * @hideinitializer + * SDP session descriptor not equal. + */ +#define PJMEDIA_SDP_ESESSNOTEQUAL (PJMEDIA_ERRNO_START+69) /* 220069 */ +/** + * @hideinitializer + * SDP origin not equal. + */ +#define PJMEDIA_SDP_EORIGINNOTEQUAL (PJMEDIA_ERRNO_START+70) /* 220070 */ +/** + * @hideinitializer + * SDP name/subject not equal. + */ +#define PJMEDIA_SDP_ENAMENOTEQUAL (PJMEDIA_ERRNO_START+71) /* 220071 */ +/** + * @hideinitializer + * SDP time not equal. + */ +#define PJMEDIA_SDP_ETIMENOTEQUAL (PJMEDIA_ERRNO_START+72) /* 220072 */ + + +PJ_END_DECL + +#endif /* __PJMEDIA_ERRNO_H__ */ + diff --git a/pjmedia/include/pjmedia/sdp.h b/pjmedia/include/pjmedia/sdp.h index 1b45744c..71f00817 100644 --- a/pjmedia/include/pjmedia/sdp.h +++ b/pjmedia/include/pjmedia/sdp.h @@ -16,8 +16,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#ifndef __PJSDP_SDP_H__ -#define __PJSDP_SDP_H__ +#ifndef __PJMEDIA_SDP_H__ +#define __PJMEDIA_SDP_H__ /** * @defgroup PJSDP SDP Library @@ -35,7 +35,7 @@ * print back the structure as SDP message. */ -#include <pj/types.h> +#include <pjmedia/types.h> PJ_BEGIN_DECL @@ -43,160 +43,222 @@ PJ_BEGIN_DECL #define PJSDP_MAX_ATTR 32 #define PJSDP_MAX_MEDIA 16 -/** - * This enumeration describes the attribute type. + +/**************************************************************************** + * SDP ATTRIBUTES + **************************************************************************** + */ + +/** + * SDP generic attribute. */ -typedef enum pjsdp_attr_type_e +struct pjmedia_sdp_attr { - PJSDP_ATTR_RTPMAP, - PJSDP_ATTR_CAT, - PJSDP_ATTR_KEYWORDS, - PJSDP_ATTR_TOOL, - PJSDP_ATTR_PTIME, - PJSDP_ATTR_RECV_ONLY, - PJSDP_ATTR_SEND_ONLY, - PJSDP_ATTR_SEND_RECV, - PJSDP_ATTR_ORIENT, - PJSDP_ATTR_TYPE, - PJSDP_ATTR_CHARSET, - PJSDP_ATTR_SDP_LANG, - PJSDP_ATTR_LANG, - PJSDP_ATTR_FRAME_RATE, - PJSDP_ATTR_QUALITY, - PJSDP_ATTR_FMTP, - PJSDP_ATTR_INACTIVE, - PJSDP_ATTR_GENERIC, - PJSDP_END_OF_ATTR, -} pjsdp_attr_type_e; + pj_str_t name; /**< Attribute name. */ + pj_str_t value; /**< Attribute value. */ +}; /** - * This structure keeps the common attributes that all 'descendants' - * will have. + * Create SDP attribute. + * + * @param pool Pool to create the attribute. + * @param name Attribute name. + * @param value Optional attribute value. + * + * @return The new SDP attribute. */ -typedef struct pjsdp_attr -{ - pjsdp_attr_type_e type; /**< Attribute type. */ -} pjsdp_attr; +PJ_DECL(pjmedia_sdp_attr*) pjmedia_sdp_attr_create(pj_pool_t *pool, + const char *name, + const pj_str_t *value); +/** + * Clone attribute + * + * @param pool Pool to be used. + * @param attr The attribute to clone. + * + * @return New attribute as cloned from the attribute. + */ +PJ_DECL(pjmedia_sdp_attr*) pjmedia_sdp_attr_clone(pj_pool_t *pool, + const pjmedia_sdp_attr*attr); -/** - * This is the structure to represent generic attribute which has a - * string value. +/** + * Find the first attribute with the specified type. + * + * @param count Number of attributes in the array. + * @param attr_array Array of attributes. + * @param name Attribute name to find. + * @param fmt Optional string to indicate which payload format + * to find for rtpmap and fmt attributes. + * + * @return The specified attribute, or NULL if it can't be found. + * + * @see pjmedia_sdp_attr_find2, pjmedia_sdp_media_find_attr */ -typedef struct pjsdp_attr_string -{ - pjsdp_attr_type_e type; - pj_str_t value; -} pjsdp_attr_string; +PJ_DECL(pjmedia_sdp_attr*) +pjmedia_sdp_attr_find(unsigned count, + const pjmedia_sdp_attr *const attr_array[], + const pj_str_t *name, const pj_str_t *fmt); +/** + * Find the first attribute with the specified type. + * + * @param count Number of attributes in the array. + * @param attr_array Array of attributes. + * @param name Attribute name to find. + * @param fmt Optional string to indicate which payload format + * to find for rtpmap and fmt attributes. + * + * @return The specified attribute, or NULL if it can't be found. + * + * @see pjmedia_sdp_attr_find, pjmedia_sdp_media_find_attr2 + */ +PJ_DECL(pjmedia_sdp_attr*) +pjmedia_sdp_attr_find2(unsigned count, + const pjmedia_sdp_attr *const attr_array[], + const char *name, const pj_str_t *fmt); /** - * This is the structure to represent generic SDP attribute which has - * a numeric value. + * Add a new attribute to array of attributes. + * + * @param count Number of attributes in the array. + * @param attr_array Array of attributes. + * @param attr The attribute to add. + * + * @return PJ_SUCCESS or the error code. + * + * @see pjmedia_sdp_media_add_attr */ -typedef struct pjsdp_attr_num -{ - pjsdp_attr_type_e type; - pj_uint32_t value; -} pjsdp_attr_num; - +PJ_DECL(pj_status_t) pjmedia_sdp_attr_add(unsigned *count, + pjmedia_sdp_attr *attr_array[], + pjmedia_sdp_attr *attr); /** - * SDP \a rtpmap attribute. + * Remove all attributes with the specified name when they present. + * + * @param count Number of attributes in the array. + * @param attr_array Array of attributes. + * @param name Attribute name to find. + * + * @return Number of attributes removed. + * + * @see pjmedia_sdp_media_remove_all_attr */ -typedef struct pjsdp_rtpmap_attr -{ - pjsdp_attr_type_e type; - unsigned payload_type; - pj_str_t encoding_name; - unsigned clock_rate; - pj_str_t parameter; -} pjsdp_rtpmap_attr; +PJ_DECL(unsigned) pjmedia_sdp_attr_remove_all(unsigned *count, + pjmedia_sdp_attr *attr_array[], + const char *name); /** - * SDP \a fmtp attribute. + * Remove the specified attribute from the attribute array. + * + * @param count Number of attributes in the array. + * @param attr_array Array of attributes. + * @param name Attribute name to find. + * + * @return PJ_SUCCESS when attribute has been removed, or + * PJ_ENOTFOUND when the attribute can not be found. + * + * @see pjmedia_sdp_media_remove_attr */ -typedef struct pjsdp_fmtp_attr -{ - pjsdp_attr_type_e type; - pj_str_t format; - pj_str_t param; -} pjsdp_fmtp_attr; +PJ_DECL(pj_status_t) pjmedia_sdp_attr_remove(unsigned *count, + pjmedia_sdp_attr *attr_array[], + pjmedia_sdp_attr *attr); -/** - * SDP generic attribute. +/** + * SDP \a rtpmap attribute. */ -typedef struct pjsdp_generic_attr +struct pjmedia_sdp_rtpmap { - pjsdp_attr_type_e type; - pj_str_t name; - pj_str_t value; -} pjsdp_generic_attr; - - -/** SDP \a cat attribute. */ -typedef struct pjsdp_attr_string pjsdp_cat_attr; - -/** SDP \a keywds attribute. */ -typedef struct pjsdp_attr_string pjsdp_keywds_attr; - -/** SDP \a tool attribute. */ -typedef struct pjsdp_attr_string pjsdp_tool_attr; - -/** SDP \a ptime attribute. */ -typedef struct pjsdp_attr_num pjsdp_ptime_attr; + pj_str_t pt; /**< Payload type. */ + pj_str_t enc_name; /**< Encoding name. */ + unsigned clock_rate; /**< Clock rate. */ + pj_str_t param; /**< Parameter. */ +}; -/** SDP \a recvonly attribute. */ -typedef struct pjsdp_attr pjsdp_recv_only_attr; -/** SDP \a sendonly attribute. */ -typedef struct pjsdp_attr pjsdp_send_only_attr; - -/** SDP \a sendrecv attribute. */ -typedef struct pjsdp_attr pjsdp_send_recv_attr; +/** + * Convert generic attribute to SDP rtpmap. + * + * @param pool Pool used to create the rtpmap attribute. + * @param attr Generic attribute to be converted to rtpmap, which + * name must be "rtpmap". + * @param p_rtpmap Pointer to receive SDP rtpmap attribute. + * + * @return PJ_SUCCESS on success. + */ +PJ_DECL(pj_status_t) pjmedia_sdp_attr_to_rtpmap(pj_pool_t *pool, + const pjmedia_sdp_attr *attr, + pjmedia_sdp_rtpmap **p_rtpmap); -/** SDP \a orient attribute. */ -typedef struct pjsdp_attr_string pjsdp_orient_attr; -/** SDP \a type attribute. */ -typedef struct pjsdp_attr_string pjsdp_type_attr; +/** + * Get the rtpmap representation of the same SDP attribute. + * + * @param attr Generic attribute to be converted to rtpmap, which + * name must be "rtpmap". + * @param rtpmap SDP rtpmap attribute to be initialized. + * + * @return PJ_SUCCESS on success. + */ +PJ_DECL(pj_status_t) pjmedia_sdp_attr_get_rtpmap(const pjmedia_sdp_attr *attr, + pjmedia_sdp_rtpmap *rtpmap); -/** SDP \a charset attribute. */ -typedef struct pjsdp_attr_string pjsdp_charset_attr; -/** SDP \a sdplang attribute. */ -typedef struct pjsdp_attr_string pjsdp_sdp_lang_attr; +/** + * Convert rtpmap attribute to generic attribute. + * + * @param pool Pool to be used. + * @param rtpmap The rtpmap attribute. + * @param p_attr Pointer to receive the generic SDP attribute. + * + * @return PJ_SUCCESS on success. + */ +PJ_DECL(pj_status_t) pjmedia_sdp_rtpmap_to_attr(pj_pool_t *pool, + const pjmedia_sdp_rtpmap *rtpmap, + pjmedia_sdp_attr **p_attr); -/** SDP \a lang attribute. */ -typedef struct pjsdp_attr_string pjsdp_lang_attr; -/** SDP \a framerate attribute. */ -typedef struct pjsdp_attr_string pjsdp_frame_rate_attr; +/** + * SDP \a fmtp attribute. + */ +struct pjmedia_sdp_fmtp +{ + pj_str_t fmt; /**< Format type. */ + pj_str_t fmt_param; /**< Format specific parameter. */ +}; -/** SDP \a quality attribute. */ -typedef struct pjsdp_attr_num pjsdp_quality_attr; -/** SDP \a inactive attribute. */ -typedef struct pjsdp_attr pjsdp_inactive_attr; +/** + * Get the fmtp representation of the same SDP attribute. + * + * @param attr Generic attribute to be converted to fmtp, which + * name must be "fmtp". + * @param fmtp SDP fmtp attribute to be initialized. + * + * @return PJ_SUCCESS on success. + */ +PJ_DECL(pj_status_t) pjmedia_sdp_attr_get_fmtp(const pjmedia_sdp_attr *attr, + pjmedia_sdp_fmtp *fmtp); -/** Clone attribute */ -PJ_DECL(pjsdp_attr*) pjsdp_attr_clone (pj_pool_t *pool, const pjsdp_attr *rhs); -/** Find attribute */ -PJ_DECL(const pjsdp_attr*) pjsdp_attr_find (int count, const pjsdp_attr *attr_array[], int type); +/**************************************************************************** + * SDP CONNECTION INFO + **************************************************************************** + */ /** * SDP connection info. */ -typedef struct pjsdp_conn_info +struct pjmedia_sdp_conn { - pj_str_t net_type; - pj_str_t addr_type; - pj_str_t addr; -} pjsdp_conn_info; + pj_str_t net_type; /**< Network type ("IN"). */ + pj_str_t addr_type; /**< Address type ("IP4", "IP6"). */ + pj_str_t addr; /**< The address. */ +}; + /** *Clone connection info. @@ -206,29 +268,37 @@ typedef struct pjsdp_conn_info * * @return the new connection info. */ -PJ_DECL(pjsdp_conn_info*) pjsdp_conn_info_clone (pj_pool_t *pool, - const pjsdp_conn_info *rhs); +PJ_DECL(pjmedia_sdp_conn*) pjmedia_sdp_conn_clone(pj_pool_t *pool, + const pjmedia_sdp_conn *rhs); + + + +/**************************************************************************** + * SDP MEDIA INFO/LINE + **************************************************************************** + */ /** * SDP media description. */ -typedef struct pjsdp_media_desc +struct pjmedia_sdp_media { struct { - pj_str_t media; - pj_uint16_t port; - unsigned port_count; - pj_str_t transport; - unsigned fmt_count; - pj_str_t fmt[PJSDP_MAX_FMT]; + pj_str_t media; /**< Media type ("audio", "video") */ + pj_uint16_t port; /**< Port number. */ + unsigned port_count; /**< Port count, used only when >2 */ + pj_str_t transport; /**< Transport ("RTP/AVP") */ + unsigned fmt_count; /**< Number of formats. */ + pj_str_t fmt[PJSDP_MAX_FMT]; /**< Media formats. */ } desc; - pjsdp_conn_info *conn; - unsigned attr_count; - pjsdp_attr *attr[PJSDP_MAX_ATTR]; + pjmedia_sdp_conn *conn; /**< Optional connection info. */ + unsigned attr_count; /**< Number of attributes. */ + pjmedia_sdp_attr*attr[PJSDP_MAX_ATTR]; /**< Attributes. */ + +}; -} pjsdp_media_desc; /** * Clone SDP media description. @@ -238,63 +308,127 @@ typedef struct pjsdp_media_desc * * @return a new media description. */ -PJ_DECL(pjsdp_media_desc*) pjsdp_media_desc_clone (pj_pool_t *pool, - const pjsdp_media_desc *rhs); +PJ_DECL(pjmedia_sdp_media*) +pjmedia_sdp_media_clone( pj_pool_t *pool, + const pjmedia_sdp_media *rhs); -/** - * Check if the media description has the specified attribute. +/** + * Find the first occurence of the specified attribute name. * * @param m The SDP media description. - * @param attr_type The attribute type. + * @param name Attribute name to find. + * @param fmt Optional payload format type to find in the + * attribute list. The payload format type will be + * compared for attributes such as rtpmap and fmtp. * - * @return nonzero if true. + * @return The first instance of the specified attribute or NULL. */ -PJ_DECL(pj_bool_t) pjsdp_media_desc_has_attr (const pjsdp_media_desc *m, - pjsdp_attr_type_e attr_type); +PJ_DECL(pjmedia_sdp_attr*) +pjmedia_sdp_media_find_attr(const pjmedia_sdp_media *m, + const pj_str_t *name, const pj_str_t *fmt); -/** - * Find rtpmap attribute for the specified payload type. + +/** + * Find the first occurence of the specified attribute name. + * + * @param m The SDP media description. + * @param name Attribute name to find. + * @param fmt Optional payload format type to find in the + * attribute list. The payload format type will be + * compared for attributes such as rtpmap and fmtp. + * + * @return The first instance of the specified attribute or NULL. + */ +PJ_DECL(pjmedia_sdp_attr*) +pjmedia_sdp_media_find_attr2(const pjmedia_sdp_media *m, + const char *name, const pj_str_t *fmt); + +/** + * Add new attribute to the media descriptor. * - * @param m The SDP media description. - * @param pt RTP payload type. + * @param m The SDP media description. + * @param name Attribute to add. + * + * @return PJ_SUCCESS or the appropriate error code. + */ +PJ_DECL(pj_status_t) pjmedia_sdp_media_add_attr(pjmedia_sdp_media *m, + pjmedia_sdp_attr *attr); + +/** + * Remove all attributes with the specified name. + * + * @param m The SDP media description. + * @param name Attribute name to remove. * - * @return the SDP rtpmap attribute for the payload type, or NULL if not found. + * @return The number of attributes removed. + */ +PJ_DECL(unsigned) +pjmedia_sdp_media_remove_all_attr(pjmedia_sdp_media *m, + const char *name); + + +/** + * Remove the occurence of the specified attribute. + */ +PJ_DECL(pj_status_t) +pjmedia_sdp_media_remove_attr(pjmedia_sdp_media *m, + pjmedia_sdp_attr *attr); + + +/** + * Compare two SDP media for equality. + * + * @param sd1 The first SDP media to compare. + * @param sd2 The second SDP media to compare. + * @param option Comparison option. + * + * @return PJ_SUCCESS when both SDP medias are equal. + */ +PJ_DECL(pj_status_t) pjmedia_sdp_media_cmp(const pjmedia_sdp_media *sd1, + const pjmedia_sdp_media *sd2, + unsigned option); + + + +/**************************************************************************** + * SDP SESSION DESCRIPTION + **************************************************************************** */ -PJ_DECL(const pjsdp_rtpmap_attr*) -pjsdp_media_desc_find_rtpmap (const pjsdp_media_desc *m, unsigned pt); /** * This structure describes SDP session description. */ -typedef struct pjsdp_session_desc +struct pjmedia_sdp_session { + /** Origin (o= line) */ struct { - pj_str_t user; - pj_uint32_t id; - pj_uint32_t version; - pj_str_t net_type; - pj_str_t addr_type; - pj_str_t addr; + pj_str_t user; /**< User */ + pj_uint32_t id; /**< Session ID */ + pj_uint32_t version; /**< Session version */ + pj_str_t net_type; /**< Network type ("IN") */ + pj_str_t addr_type; /**< Address type ("IP4", "IP6") */ + pj_str_t addr; /**< The address. */ } origin; - pj_str_t name; - pjsdp_conn_info *conn; + pj_str_t name; /**< Subject line (s=) */ + pjmedia_sdp_conn *conn; /**< Connection line (c=) */ + /** Session time (t= line) */ struct { - pj_uint32_t start; - pj_uint32_t stop; + pj_uint32_t start; /**< Start time. */ + pj_uint32_t stop; /**< Stop time. */ } time; - unsigned attr_count; - pjsdp_attr *attr[PJSDP_MAX_ATTR]; + unsigned attr_count; /**< Number of attributes. */ + pjmedia_sdp_attr *attr[PJSDP_MAX_ATTR]; /**< Attributes array. */ - unsigned media_count; - pjsdp_media_desc *media[PJSDP_MAX_MEDIA]; + unsigned media_count; /**< Number of media. */ + pjmedia_sdp_media *media[PJSDP_MAX_MEDIA]; /**< Media array. */ -} pjsdp_session_desc; +}; /** @@ -306,8 +440,9 @@ typedef struct pjsdp_session_desc * * @return SDP session description. */ -PJ_DECL(pjsdp_session_desc*) pjsdp_parse( char *buf, pj_size_t len, - pj_pool_t *pool); +PJ_DECL(pj_status_t) pjmedia_sdp_parse( pj_pool_t *pool, + char *buf, pj_size_t len, + pjmedia_sdp_session **p_sdp ); /** * Print SDP description to a buffer. @@ -318,15 +453,47 @@ PJ_DECL(pjsdp_session_desc*) pjsdp_parse( char *buf, pj_size_t len, * * @return the length printed, or -1. */ -PJ_DECL(int) pjsdp_print( const pjsdp_session_desc *desc, - char *buf, pj_size_t size); +PJ_DECL(int) pjmedia_sdp_print( const pjmedia_sdp_session *desc, + char *buf, pj_size_t size); /** - * @} + * Validate SDP descriptor. */ +PJ_DECL(pj_status_t) pjmedia_sdp_validate(const pjmedia_sdp_session *sdp); + + +/** + * Clone SDP session. + * + * @param pool The pool used to clone the session. + * @param sess The SDP session to clone. + * + * @return New SDP session. + */ +PJ_DECL(pjmedia_sdp_session*) +pjmedia_sdp_session_clone( pj_pool_t *pool, + const pjmedia_sdp_session *sess); + + +/** + * Compare two SDP session for equality. + * + * @param sd1 The first SDP session to compare. + * @param sd2 The second SDP session to compare. + * + * @return PJ_SUCCESS when both SDPs are equal. + */ +PJ_DECL(pj_status_t) pjmedia_sdp_session_cmp(const pjmedia_sdp_session *sd1, + const pjmedia_sdp_session *sd2, + unsigned option); + PJ_END_DECL -#endif /* __PJSDP_SDP_H__ */ +/** + * @} + */ + +#endif /* __PJMEDIA_SDP_H__ */ diff --git a/pjmedia/include/pjmedia/sdp_neg.h b/pjmedia/include/pjmedia/sdp_neg.h new file mode 100644 index 00000000..7d0cc086 --- /dev/null +++ b/pjmedia/include/pjmedia/sdp_neg.h @@ -0,0 +1,214 @@ +/* $Id$ */ +/* + * Copyright (C) 2003-2006 Benny Prijono <benny@prijono.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifndef __PJMEDIA_SDP_NEG_H__ +#define __PJMEDIA_SDP_NEG_H__ + + +/** + * @defgroup PJSDP SDP Library + */ +/** + * @file sdp_neg.h + * @brief SDP negotiator header file. + */ +/** + * @defgroup PJ_SDP_NEG SDP Negotiator. + * @ingroup PJSDP + * @{ + *. + */ + +#include <pjmedia/types.h> + +PJ_BEGIN_DECL + +/** + * This enumeration describes SDP negotiation state. + */ +enum pjmedia_sdp_neg_state +{ + /** + * This is the state of SDP negoator before it is initialized. + */ + PJMEDIA_SDP_NEG_STATE_NULL, + + /** + * This state occurs when SDP negotiator has sent our offer to remote and + * it is waiting for answer. + */ + PJMEDIA_SDP_NEG_STATE_LOCAL_OFFER, + + /** + * This state occurs when an offer (either local or remote) has been + * provided with answer. The SDP negotiator is ready to negotiate both + * session descriptors. + */ + PJMEDIA_SDP_NEG_STATE_WAIT_NEGO, + + /** + * This state occurs when SDP negotiation has completed, either + * successfully or not. + */ + PJMEDIA_SDP_NEG_STATE_DONE, +}; + +/* Negotiator state: + * + * reinit_local_offer() + * modify_local_offer() + * create_w_local_offer() +-------------+ tx_local_offer() + * /------------------------->| LOCAL_OFFER |<----------------------\ + * | +-------------+ | + * | | | + * | rx_remote_answer() | | + * | V | + * +--+---+ +-----------+ negotiate() +------+ + * + NULL |------------------------>| WAIT_NEGO |-------------------->| DONE | + * +------+ create_w_remote_offer() +-----------+ +------+ + * A | + * | rx_remote_offer() | + * \-----------------------------/ + */ + +/** + * Create the SDP negotiator with local offer. The SDP negotiator then + * will move to PJMEDIA_SDP_NEG_STATE_LOCAL_OFFER state, where it waits + * until it receives answer from remote. When SDP answer from remote is + * received, application should call #pjmedia_sdp_neg_rx_remote_answer(). + * + * After calling this function, application should send the local SDP offer + * to remote party and wait for SDP answer. + */ +PJ_DECL(pj_status_t) +pjmedia_sdp_neg_create_w_local_offer( pj_pool_t *pool, + const pjmedia_sdp_session *local, + pjmedia_sdp_neg **p_neg); + +/** + * Initialize the SDP negotiator with both local and remote offer. + * Application normally calls this function when it receives initial offer + * from remote. Application must also provide initial local offer when + * calling this function. After this function is called, the SDP negotiator + * state will move to PJMEDIA_SDP_NEG_STATE_WAIT_NEGO, and the negotiation + * function can be called. + */ +PJ_DECL(pj_status_t) +pjmedia_sdp_neg_create_w_remote_offer(pj_pool_t *pool, + const pjmedia_sdp_session *local, + const pjmedia_sdp_session *remote, + pjmedia_sdp_neg **p_neg); + +/** + * Get SDP negotiator state. + */ +PJ_DECL(pjmedia_sdp_neg_state) +pjmedia_sdp_neg_get_state( pjmedia_sdp_neg *neg ); + +/** + * Get the currently active local SDP. Application can only call this + * function after negotiation has been done, or otherwise there won't be + * active SDPs. Calling this function will not change the state of the + * negotiator. + */ +PJ_DECL(pj_status_t) +pjmedia_sdp_neg_get_local( pjmedia_sdp_neg *neg, + const pjmedia_sdp_session **local); + +/** + * Get the currently active remote SDP. Application can only call this + * function after negotiation has been done, or otherwise there won't be + * active SDPs. Calling this function will not change the state of the + * negotiator. + */ +PJ_DECL(pj_status_t) +pjmedia_sdp_neg_get_remote( pjmedia_sdp_neg *neg, + const pjmedia_sdp_session **remote); + + +/** + * Completely replaces local offer with new SDP. After calling + * This function can only be called in state PJMEDIA_SDP_NEG_STATE_DONE. + * this function, application can send the modified offer to remote. + * The negotiator state will move to PJMEDIA_SDP_NEG_STATE_LOCAL_OFFER, + * where it waits for SDP answer from remote. + */ +PJ_DECL(pj_status_t) +pjmedia_sdp_neg_modify_local_offer( pj_pool_t *pool, + pjmedia_sdp_neg *neg, + const pjmedia_sdp_session *local); + +/** + * Negotiate local and remote answer. Before calling this function, the + * SDP negotiator must be in PJMEDIA_SDP_NEG_STATE_WAIT_NEGO state. + * After calling this function, the negotiator state will move to + * PJMEDIA_SDP_NEG_STATE_DONE. + */ +PJ_DECL(pj_status_t) pjmedia_sdp_neg_negotiate( pj_pool_t *pool, + pjmedia_sdp_neg *neg, + pj_bool_t allow_asym); + + +/** + * This function can only be called in PJMEDIA_SDP_NEG_STATE_DONE state. + * Application calls this function to retrieve currently active + * local SDP to be sent to remote. The negotiator state will then move + * to PJMEDIA_SDP_NEG_STATE_LOCAL_OFFER, where it waits for SDP answer + * from remote. + */ +PJ_DECL(pj_status_t) +pjmedia_sdp_neg_tx_local_offer( pj_pool_t *pool, + pjmedia_sdp_neg *neg, + const pjmedia_sdp_session **offer); + +/** + * This function can only be called in PJMEDIA_SDP_NEG_STATE_DONE state. + * Application calls this function when it receives SDP offer from remote. + * After this function is called, the negotiator state will move to + * PJMEDIA_SDP_NEG_STATE_WAIT_NEGO, and application can call the + * negotiation function #pjmedia_sdp_neg_negotiate(). + */ +PJ_DECL(pj_status_t) +pjmedia_sdp_neg_rx_remote_offer( pj_pool_t *pool, + pjmedia_sdp_neg *neg, + const pjmedia_sdp_session *remote); + + +/** + * This function can only be called in PJMEDIA_SDP_NEG_STATE_LOCAL_OFFER + * state. Application calls this function when it receives SDP answer + * from remote. After this function is called, the negotiator state will + * move to PJMEDIA_SDP_NEG_STATE_WAIT_NEGO, and application can call the + * negotiation function #pjmedia_sdp_neg_negotiate(). + */ +PJ_DECL(pj_status_t) +pjmedia_sdp_neg_rx_remote_answer( pj_pool_t *pool, + pjmedia_sdp_neg *neg, + const pjmedia_sdp_session *remote); + + + +PJ_END_DECL + +/** + * @} + */ + + +#endif /* __PJMEDIA_SDP_NEG_H__ */ + diff --git a/pjmedia/include/pjmedia/types.h b/pjmedia/include/pjmedia/types.h new file mode 100644 index 00000000..217a001b --- /dev/null +++ b/pjmedia/include/pjmedia/types.h @@ -0,0 +1,67 @@ +/* $Id$ */ +/* + * Copyright (C) 2003-2006 Benny Prijono <benny@prijono.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifndef __PJMEDIA_TYPES_H__ +#define __PJMEDIA_TYPES_H__ + +#include <pj/types.h> + + +/** + * Forward declaration for SDP attribute (sdp.h) + */ +typedef struct pjmedia_sdp_attr pjmedia_sdp_attr; + +/** + * Forward declaration for SDP rtpmap attribute (sdp.h) + */ +typedef struct pjmedia_sdp_rtpmap pjmedia_sdp_rtpmap; + +/** + * Forward declaration for SDP fmtp attribute (sdp.h) + */ +typedef struct pjmedia_sdp_fmtp pjmedia_sdp_fmtp; + +/** + * Forward declaration for SDP connection info (sdp.h) + */ +typedef struct pjmedia_sdp_conn pjmedia_sdp_conn; + +/** + * Forward declaration for SDP media line (sdp.h) + */ +typedef struct pjmedia_sdp_media pjmedia_sdp_media; + +/** + * Forward declaration for SDP session (sdp.h) + */ +typedef struct pjmedia_sdp_session pjmedia_sdp_session; + +/** + * Forward declaration for SDP negotiator state (sdp_neg.h). + */ +typedef enum pjmedia_sdp_neg_state pjmedia_sdp_neg_state; + +/** + * Forward declaration for SDP negotiator (sdp_neg.h). + */ +typedef struct pjmedia_sdp_neg pjmedia_sdp_neg; + + +#endif /* __PJMEDIA_TYPES_H__ */ + |