|
|
|
|
@ -21,6 +21,60 @@
|
|
|
|
|
#include "rtplib.h"
|
|
|
|
|
#include "codec.h"
|
|
|
|
|
|
|
|
|
|
enum attr_id {
|
|
|
|
|
ATTR_OTHER = 0,
|
|
|
|
|
ATTR_RTCP,
|
|
|
|
|
ATTR_CANDIDATE,
|
|
|
|
|
ATTR_ICE,
|
|
|
|
|
ATTR_ICE_LITE,
|
|
|
|
|
ATTR_ICE_OPTIONS,
|
|
|
|
|
ATTR_ICE_UFRAG,
|
|
|
|
|
ATTR_ICE_PWD,
|
|
|
|
|
ATTR_CRYPTO,
|
|
|
|
|
ATTR_SSRC,
|
|
|
|
|
ATTR_SSRC_GROUP,
|
|
|
|
|
ATTR_INACTIVE,
|
|
|
|
|
ATTR_SENDRECV,
|
|
|
|
|
ATTR_SENDONLY,
|
|
|
|
|
ATTR_RECVONLY,
|
|
|
|
|
ATTR_RTCP_MUX,
|
|
|
|
|
ATTR_EXTMAP,
|
|
|
|
|
ATTR_GROUP,
|
|
|
|
|
ATTR_MID,
|
|
|
|
|
ATTR_FINGERPRINT,
|
|
|
|
|
ATTR_SETUP,
|
|
|
|
|
ATTR_RTPMAP,
|
|
|
|
|
ATTR_FMTP,
|
|
|
|
|
ATTR_IGNORE,
|
|
|
|
|
ATTR_RTPENGINE,
|
|
|
|
|
ATTR_PTIME,
|
|
|
|
|
ATTR_RTCP_FB,
|
|
|
|
|
ATTR_T38FAXVERSION,
|
|
|
|
|
ATTR_T38FAXUDPEC,
|
|
|
|
|
ATTR_T38FAXUDPECDEPTH,
|
|
|
|
|
ATTR_T38FAXUDPFECMAXSPAN,
|
|
|
|
|
ATTR_T38FAXMAXDATAGRAM,
|
|
|
|
|
ATTR_T38FAXMAXIFP,
|
|
|
|
|
ATTR_T38FAXFILLBITREMOVAL,
|
|
|
|
|
ATTR_T38FAXTRANSCODINGMMR,
|
|
|
|
|
ATTR_T38FAXTRANSCODINGJBIG,
|
|
|
|
|
ATTR_T38FAXRATEMANAGEMENT,
|
|
|
|
|
/* this is a block of attributes, which are only needed to carry attributes
|
|
|
|
|
* from `sdp_media` to `call_media`structure,
|
|
|
|
|
* and needs later processing in `sdp_create()`. */
|
|
|
|
|
ATTR_T38MAXBITRATE,
|
|
|
|
|
ATTR_T38FAXMAXBUFFER,
|
|
|
|
|
ATTR_XG726BITORDER,
|
|
|
|
|
ATTR_MAXPTIME,
|
|
|
|
|
ATTR_DIRECTION,
|
|
|
|
|
ATTR_LABEL,
|
|
|
|
|
ATTR_MSID,
|
|
|
|
|
ATTR_TLS_ID,
|
|
|
|
|
ATTR_END_OF_CANDIDATES,
|
|
|
|
|
};
|
|
|
|
|
// make sure g_int_hash can be used
|
|
|
|
|
static_assert(sizeof(gint) == sizeof(enum attr_id), "sizeof enum attr_id wrong");
|
|
|
|
|
|
|
|
|
|
struct network_address {
|
|
|
|
|
str network_type;
|
|
|
|
|
str address_type;
|
|
|
|
|
@ -225,57 +279,7 @@ struct sdp_attribute {
|
|
|
|
|
str key; /* "rtpmap:8" */
|
|
|
|
|
str param; /* "PCMA/8000" */
|
|
|
|
|
|
|
|
|
|
enum {
|
|
|
|
|
ATTR_OTHER = 0,
|
|
|
|
|
ATTR_RTCP,
|
|
|
|
|
ATTR_CANDIDATE,
|
|
|
|
|
ATTR_ICE,
|
|
|
|
|
ATTR_ICE_LITE,
|
|
|
|
|
ATTR_ICE_OPTIONS,
|
|
|
|
|
ATTR_ICE_UFRAG,
|
|
|
|
|
ATTR_ICE_PWD,
|
|
|
|
|
ATTR_CRYPTO,
|
|
|
|
|
ATTR_SSRC,
|
|
|
|
|
ATTR_SSRC_GROUP,
|
|
|
|
|
ATTR_INACTIVE,
|
|
|
|
|
ATTR_SENDRECV,
|
|
|
|
|
ATTR_SENDONLY,
|
|
|
|
|
ATTR_RECVONLY,
|
|
|
|
|
ATTR_RTCP_MUX,
|
|
|
|
|
ATTR_EXTMAP,
|
|
|
|
|
ATTR_GROUP,
|
|
|
|
|
ATTR_MID,
|
|
|
|
|
ATTR_FINGERPRINT,
|
|
|
|
|
ATTR_SETUP,
|
|
|
|
|
ATTR_RTPMAP,
|
|
|
|
|
ATTR_FMTP,
|
|
|
|
|
ATTR_IGNORE,
|
|
|
|
|
ATTR_RTPENGINE,
|
|
|
|
|
ATTR_PTIME,
|
|
|
|
|
ATTR_RTCP_FB,
|
|
|
|
|
ATTR_T38FAXVERSION,
|
|
|
|
|
ATTR_T38FAXUDPEC,
|
|
|
|
|
ATTR_T38FAXUDPECDEPTH,
|
|
|
|
|
ATTR_T38FAXUDPFECMAXSPAN,
|
|
|
|
|
ATTR_T38FAXMAXDATAGRAM,
|
|
|
|
|
ATTR_T38FAXMAXIFP,
|
|
|
|
|
ATTR_T38FAXFILLBITREMOVAL,
|
|
|
|
|
ATTR_T38FAXTRANSCODINGMMR,
|
|
|
|
|
ATTR_T38FAXTRANSCODINGJBIG,
|
|
|
|
|
ATTR_T38FAXRATEMANAGEMENT,
|
|
|
|
|
/* this is a block of attributes, which are only needed to carry attributes
|
|
|
|
|
* from `sdp_media` to `call_media`structure,
|
|
|
|
|
* and needs later processing in `sdp_create()`. */
|
|
|
|
|
ATTR_T38MAXBITRATE,
|
|
|
|
|
ATTR_T38FAXMAXBUFFER,
|
|
|
|
|
ATTR_XG726BITORDER,
|
|
|
|
|
ATTR_MAXPTIME,
|
|
|
|
|
ATTR_DIRECTION,
|
|
|
|
|
ATTR_LABEL,
|
|
|
|
|
ATTR_MSID,
|
|
|
|
|
ATTR_TLS_ID,
|
|
|
|
|
ATTR_END_OF_CANDIDATES,
|
|
|
|
|
} attr;
|
|
|
|
|
enum attr_id attr;
|
|
|
|
|
|
|
|
|
|
union {
|
|
|
|
|
struct attribute_rtcp rtcp;
|
|
|
|
|
@ -369,14 +373,14 @@ static void append_attr_to_gstring(GString *s, char * name, const str * value,
|
|
|
|
|
static void append_attr_int_to_gstring(GString *s, char * value, const int * additional,
|
|
|
|
|
sdp_ng_flags *flags, enum media_type media_type);
|
|
|
|
|
|
|
|
|
|
INLINE struct sdp_attribute *attr_get_by_id(struct sdp_attributes *a, int id) {
|
|
|
|
|
INLINE struct sdp_attribute *attr_get_by_id(struct sdp_attributes *a, enum attr_id id) {
|
|
|
|
|
return g_hash_table_lookup(a->id_hash, &id);
|
|
|
|
|
}
|
|
|
|
|
INLINE GQueue *attr_list_get_by_id(struct sdp_attributes *a, int id) {
|
|
|
|
|
INLINE GQueue *attr_list_get_by_id(struct sdp_attributes *a, enum attr_id id) {
|
|
|
|
|
return g_hash_table_lookup(a->id_lists_hash, &id);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static struct sdp_attribute *attr_get_by_id_m_s(struct sdp_media *m, int id) {
|
|
|
|
|
static struct sdp_attribute *attr_get_by_id_m_s(struct sdp_media *m, enum attr_id id) {
|
|
|
|
|
struct sdp_attribute *a;
|
|
|
|
|
|
|
|
|
|
a = attr_get_by_id(&m->attributes, id);
|
|
|
|
|
@ -984,7 +988,7 @@ static int parse_attribute_fmtp(struct sdp_attribute *output) {
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int parse_attribute_int(struct sdp_attribute *output, int attr_id, int defval) {
|
|
|
|
|
static int parse_attribute_int(struct sdp_attribute *output, enum attr_id attr_id, int defval) {
|
|
|
|
|
output->attr = attr_id;
|
|
|
|
|
output->i = str_to_i(&output->value, defval);
|
|
|
|
|
return 0;
|
|
|
|
|
|