📄 sdp.c
字号:
{ int rv = sizeof(*m); STR_XTRA(rv, m->m_type_name); STR_XTRA(rv, m->m_proto_name); LST_XTRA(rv, m->m_format, list_xtra); LST_XTRA(rv, m->m_rtpmaps, rtpmap_xtra); STR_XTRA(rv, m->m_information); LST_XTRA(rv, m->m_connections, connection_xtra); LST_XTRA(rv, m->m_bandwidths, bandwidth_xtra); PTR_XTRA(rv, m->m_key, key_xtra); LST_XTRA(rv, m->m_attributes, attribute_xtra); return rv;}staticsdp_media_t *media_dup(char **pp, sdp_media_t const *src, sdp_session_t *sdp){ char *p; sdp_media_t *m; p = *pp; STRUCT_DUP(p, m, src); m->m_next = NULL; STR_DUP(p, m, src, m_type_name); STR_DUP(p, m, src, m_proto_name); LST_DUP(p, m, src, m_format, list_dup); LST_DUP(p, m, src, m_rtpmaps, rtpmap_dup); STR_DUP(p, m, src, m_information); LST_DUP(p, m, src, m_connections, connection_dup); LST_DUP(p, m, src, m_bandwidths, bandwidth_dup); PTR_DUP(p, m, src, m_key, key_dup); LST_DUP(p, m, src, m_attributes, attribute_dup); /* note! we must not implicitly use 'src->m_session' as it might point to a temporary session */ m->m_session = sdp; m->m_rejected = src->m_rejected; m->m_mode = src->m_mode; assert(p - *pp == media_xtra(src)); *pp = p; return m;}#ifdef nomorestaticint media_xtra_ex(sdp_media_t const *m, sdp_connection_t const *c){ int rv = 0; for (; m; m = m->m_next) { rv += STRUCT_ALIGN(rv); rv += sizeof(*m); STR_XTRA(rv, m->m_type_name); STR_XTRA(rv, m->m_proto_name); LST_XTRA(rv, m->m_format, list_xtra); LST_XTRA(rv, m->m_rtpmaps, rtpmap_xtra); STR_XTRA(rv, m->m_information); if (c != m->m_connections) LST_XTRA(rv, m->m_connections, connection_xtra); LST_XTRA(rv, m->m_bandwidths, bandwidth_xtra); PTR_XTRA(rv, m->m_key, key_xtra); LST_XTRA(rv, m->m_attributes, attribute_xtra); } return rv;}staticsdp_media_t *media_dup_ex(char **pp, sdp_media_t const *src, sdp_session_t *sdp, sdp_connection_t *dst_c, sdp_connection_t const *src_c){ char *p; sdp_media_t *retval = NULL, *m, **mm = &retval; int xtra = media_xtra_ex(src, src_c); p = *pp; for (; src; src = src->m_next) { p += STRUCT_ALIGN(p); STRUCT_DUP(p, m, src); m->m_next = NULL; STR_DUP(p, m, src, m_type_name); STR_DUP(p, m, src, m_proto_name); LST_DUP(p, m, src, m_format, list_dup); LST_DUP(p, m, src, m_rtpmaps, rtpmap_dup); STR_DUP(p, m, src, m_information); if (src_c != src->m_connections) LST_DUP(p, m, src, m_connections, connection_dup); else m->m_connections = dst_c; LST_DUP(p, m, src, m_bandwidths, bandwidth_dup); PTR_DUP(p, m, src, m_key, key_dup); LST_DUP(p, m, src, m_attributes, attribute_dup); /* note! we must not implicitly use 'src->m_session' as it might point to a temporary session */ m->m_session = sdp; m->m_rejected = src->m_rejected; m->m_mode = src->m_mode; assert(m); *mm = m; mm = &m->m_next; } assert(p - *pp == xtra); *pp = p; return retval;}#endifstaticint media_xtra_all(sdp_media_t const *m){ int rv = 0; for (; m; m = m->m_next) { rv += STRUCT_ALIGN(rv); rv += media_xtra(m); } return rv;}staticsdp_media_t *media_dup_all(char **pp, sdp_media_t const *src, sdp_session_t *sdp){ char *p; sdp_media_t *retval = NULL, *m, **mm = &retval; p = *pp; for (; src; src = src->m_next) { p += STRUCT_ALIGN(p); m = media_dup(&p, src, sdp); assert(m); *mm = m; mm = &m->m_next; } *pp = p; return retval;}int list_xtra(sdp_list_t const *l){ int rv = sizeof(*l); rv += strlen(l->l_text) + 1; return rv;}staticsdp_list_t *list_dup(char **pp, sdp_list_t const *src){ char *p; sdp_list_t *l; p = *pp; STRUCT_DUP(p, l, src); l->l_next = NULL; STR_DUP(p, l, src, l_text); assert(p - *pp == list_xtra(src)); *pp = p; return l;}int rtpmap_xtra(sdp_rtpmap_t const *rm){ int rv = sizeof(*rm); STR_XTRA(rv, rm->rm_encoding); STR_XTRA(rv, rm->rm_params); STR_XTRA(rv, rm->rm_fmtp); return rv;}staticsdp_rtpmap_t *rtpmap_dup(char **pp, sdp_rtpmap_t const *src){ char *p; sdp_rtpmap_t *rm; p = *pp; STRUCT_DUP(p, rm, src); rm->rm_next = NULL; STR_DUP(p, rm, src, rm_encoding); STR_DUP(p, rm, src, rm_params); STR_DUP(p, rm, src, rm_fmtp); assert(p - *pp == rtpmap_xtra(src)); *pp = p; return rm;}/** Return total size of a list, including size of all nodes */staticint list_xtra_all(xtra_f *xtra, void const *v){ int rv = 0; sdp_list_t const *l; for (l = v; l; l = l->l_next) { rv += STRUCT_ALIGN(rv); rv += xtra(l); } return rv;}staticvoid *list_dup_all(dup_f *dup, char **pp, void const *vsrc){ char *p; sdp_list_t const *src; sdp_list_t *retval = NULL, *l, **ll = &retval; p = *pp; for (src = vsrc; src; src = src->l_next) { p += STRUCT_ALIGN(p); l = dup(&p, src); assert(l); *ll = l; ll = &l->l_next; } *pp = p; return retval;}#if 0int XXX_xtra(sdp_XXX_t const *YYY){ int rv = sizeof(*YYY); rv += strlen(YYY->YYY_encoding) + 1; if (YYY->YYY_params); rv += strlen(YYY->YYY_params) + 1; return rv;}staticsdp_XXX_t *XXX_dup(char **pp, sdp_XXX_t const *src){ char *p; sdp_XXX_t *YYY; p = *pp; ASSERT_STRUCT_ALIGN(p); YYY = memcpy(p, src, src->YYY_size); p += src->YYY_size; YYY->YYY_next = NULL; ZZZ *pp = p; return YYY;}#endifstaticint session_xtra(sdp_session_t const *sdp){ int rv = sizeof(*sdp); PTR_XTRA(rv, sdp->sdp_origin, origin_xtra); STR_XTRA(rv, sdp->sdp_subject); STR_XTRA(rv, sdp->sdp_information); STR_XTRA(rv, sdp->sdp_uri); LST_XTRA(rv, sdp->sdp_emails, list_xtra); LST_XTRA(rv, sdp->sdp_phones, list_xtra); LST_XTRA(rv, sdp->sdp_connection, connection_xtra); LST_XTRA(rv, sdp->sdp_bandwidths, bandwidth_xtra); LST_XTRA(rv, sdp->sdp_time, time_xtra); PTR_XTRA(rv, sdp->sdp_key, key_xtra); LST_XTRA(rv, sdp->sdp_attributes, attribute_xtra); STR_XTRA(rv, sdp->sdp_charset); MED_XTRA_ALL(rv, sdp->sdp_media); return rv;}staticsdp_session_t *session_dup(char **pp, sdp_session_t const *src){ char *p; sdp_session_t *sdp; p = *pp; STRUCT_DUP(p, sdp, src); sdp->sdp_next = NULL; PTR_DUP(p, sdp, src, sdp_origin, origin_dup); STR_DUP(p, sdp, src, sdp_subject); STR_DUP(p, sdp, src, sdp_information); STR_DUP(p, sdp, src, sdp_uri); LST_DUP(p, sdp, src, sdp_emails, list_dup); LST_DUP(p, sdp, src, sdp_phones, list_dup); LST_DUP(p, sdp, src, sdp_connection, connection_dup); LST_DUP(p, sdp, src, sdp_bandwidths, bandwidth_dup); LST_DUP(p, sdp, src, sdp_time, time_dup); PTR_DUP(p, sdp, src, sdp_key, key_dup); LST_DUP(p, sdp, src, sdp_attributes, attribute_dup); STR_DUP(p, sdp, src, sdp_charset); MED_DUP_ALL(p, sdp, src, sdp_media); assert(p - *pp == session_xtra(src)); *pp = p; return sdp;}/**Duplicate an SDP session description. * * The function sdp_session_dup() duplicates (deeply copies) an SDP * session description燖a sdp allocating memory using memory @a home. * * @param h Memory home * @param sdp SDP session description to be duplicated * * @return * If successful, a pointer to newly allocated sdp_session_t structure is * returned, otherwise NULL is returned. */sdp_session_t *sdp_session_dup(su_home_t *h, sdp_session_t const *sdp){ SDP_DUP(session, sdp);}/* ---------------------------------------------------------------------- */staticint session_without_media_xtra(sdp_session_t const *sdp){ int rv = sizeof(*sdp); PTR_XTRA(rv, sdp->sdp_origin, origin_xtra); STR_XTRA(rv, sdp->sdp_subject); STR_XTRA(rv, sdp->sdp_information); STR_XTRA(rv, sdp->sdp_uri); LST_XTRA(rv, sdp->sdp_emails, list_xtra); LST_XTRA(rv, sdp->sdp_phones, list_xtra); LST_XTRA(rv, sdp->sdp_connection, connection_xtra); LST_XTRA(rv, sdp->sdp_bandwidths, bandwidth_xtra); LST_XTRA(rv, sdp->sdp_time, time_xtra); PTR_XTRA(rv, sdp->sdp_key, key_xtra); LST_XTRA(rv, sdp->sdp_attributes, attribute_xtra); STR_XTRA(rv, sdp->sdp_charset); return rv;}staticsdp_session_t *session_without_media_dup(char **pp, sdp_session_t const *src){ char *p; sdp_session_t *sdp; p = *pp; STRUCT_DUP(p, sdp, src); sdp->sdp_next = NULL; PTR_DUP(p, sdp, src, sdp_origin, origin_dup); STR_DUP(p, sdp, src, sdp_subject); STR_DUP(p, sdp, src, sdp_information); STR_DUP(p, sdp, src, sdp_uri); LST_DUP(p, sdp, src, sdp_emails, list_dup); LST_DUP(p, sdp, src, sdp_phones, list_dup); LST_DUP(p, sdp, src, sdp_connection, connection_dup); LST_DUP(p, sdp, src, sdp_bandwidths, bandwidth_dup); LST_DUP(p, sdp, src, sdp_time, time_dup); PTR_DUP(p, sdp, src, sdp_key, key_dup); LST_DUP(p, sdp, src, sdp_attributes, attribute_dup); STR_DUP(p, sdp, src, sdp_charset); sdp->sdp_media = NULL; assert(p - *pp == session_without_media_xtra(src)); *pp = p; return sdp;}/* SDP_DUP macro requires this */typedef sdp_session_t sdp_session_without_media_t;/**Duplicate an SDP session description without media descriptions. * * The function sdp_session_dup() duplicates (deeply copies) an SDP session * description燖a sdp allocating memory using memory @a home. It does not * copy the media descriptions, however. * * @param h memory h * @param sdp SDP session description to be duplicated * * @return * If successful, a pointer to newly allocated sdp_session_t structure is * returned, otherwise NULL is returned. */sdp_session_t *sdp_session_dup_without_media(su_home_t *h, sdp_session_t const *sdp){ SDP_DUP(session_without_media, sdp);}/* ---------------------------------------------------------------------- *//* SDP Tag classes */#include <sofia-sip/su_tag_class.h>size_t sdptag_session_xtra(tagi_t const *t, size_t offset){ sdp_session_t const *sdp = (sdp_session_t *)t->t_value; if (sdp) return STRUCT_ALIGN(offset) + session_xtra(sdp); else return 0;}tagi_t *sdptag_session_dup(tagi_t *dst, tagi_t const *src, void **bb){ sdp_session_t *sdp; sdp_session_t const *srcsdp; char *b; assert(src); assert(*bb); b = *bb; b += STRUCT_ALIGN(b); srcsdp = (sdp_session_t *)src->t_value; sdp = session_dup(&b, srcsdp); dst->t_tag = src->t_tag; dst->t_value = (tag_value_t)sdp; *bb = b; return dst + 1;}int sdptag_session_snprintf(tagi_t const *t, char b[], size_t size){ sdp_session_t const *sdp; sdp_printer_t *print; int retval; assert(t); if (!t || !t->t_value) { if (size && b) b[0] = 0; return 0; } sdp = (sdp_session_t const *)t->t_value; print = sdp_print(NULL, sdp, b, size, 0); retval = sdp_message_size(print); sdp_printer_free(print); return retval;}/** Tag class for SDP tags. @HIDE */tag_class_t sdptag_session_class[1] = {{ sizeof(sdptag_session_class), /* tc_next */ NULL, /* tc_len */ NULL, /* tc_move */ NULL, /* tc_xtra */ sdptag_session_xtra, /* tc_dup */ sdptag_session_dup, /* tc_free */ NULL, /* tc_find */ NULL, /* tc_snprintf */ sdptag_session_snprintf, /* tc_filter */ NULL /* msgtag_str_filter */, /* tc_ref_set */ t_ptr_ref_set, }};/* ---------------------------------------------------------------------- *//* Compare two string pointers */static inline int str0cmp(char const *a, char const *b){ if (a == NULL) a = ""; if (b == NULL) b = ""; return strcmp(a, b);}/* Compare two string pointers ignoring case. */static inline int str0casecmp(char const *a, char const *b){ if (a == NULL) a = ""; if (b == NULL) b = ""; return strcasecmp(a, b);}/** Compare two session descriptions */int sdp_session_cmp(sdp_session_t const *a, sdp_session_t const *b){ int rv; sdp_bandwidth_t const *ab, *bb; sdp_attribute_t const *aa, *ba; sdp_media_t const *am, *bm; if ((rv = (a != NULL) - (b != NULL))) return rv; if (a == b) return 0; if ((rv = (a->sdp_version[0] - b->sdp_version[0]))) return rv; if ((rv = sdp_origin_cmp(a->sdp_origin, b->sdp_origin))) return rv; if ((rv = str0cmp(a->sdp_subject, b->sdp_subject))) return rv; if ((rv = str0cmp(a->sdp_information, b->sdp_information))) return rv; if ((rv = str0cmp(a->sdp_uri, b->sdp_uri))) return rv; if ((rv = sdp_list_cmp(a->sdp_emails, b->sdp_emails))) return rv; if ((rv = sdp_list_cmp(a->sdp_phones, b->sdp_phones))) return rv; if ((rv = sdp_connection_cmp(a->sdp_connection, b->sdp_connection))) return rv; for (ab = a->sdp_bandwidths, bb = b->sdp_bandwidths; ab || bb; ab = ab->b_next, bb = bb->b_next) if ((rv = sdp_bandwidth_cmp(a->sdp_bandwidths, b->sdp_bandwidths))) return rv; if ((rv = sdp_time_cmp(a->sdp_time, b->sdp_time))) return rv; if ((rv = sdp_key_cmp(a->sdp_key, b->sdp_key))) return rv; for (aa = a->sdp_attributes, ba = b->sdp_attributes; aa || bb; aa = aa->a_next, ba = ba->a_next) if ((rv = sdp_attribute_cmp(aa, ba))) return rv; for (am = a->sdp_media, bm = b->sdp_media; am || bb; am = am->m_next, bm = bm->m_next) if ((rv = sdp_media_cmp(am, bm))) return rv; return 0;}/** Compare two origin fields */int sdp_origin_cmp(sdp_origin_t const *a, sdp_origin_t const *b){ int rv; int64_t rv64; if ((rv = (a != NULL) - (b != NULL))) return rv; if (a == b) return 0; if ((rv64 = ((int64_t)a->o_version - (int64_t)b->o_version))) return rv64 < 0 ? -1 : 1; if ((rv64 = ((int64_t)a->o_id - (int64_t)b->o_id))) return rv64 < 0 ? -1 : 1; if ((rv = strcasecmp(a->o_username, b->o_username))) return rv; if ((rv = strcasecmp(a->o_address->c_address, b->o_address->c_address))) return rv; return 0;}/** Compare two connection fields */int sdp_connection_cmp(sdp_connection_t const *a, sdp_connection_t const *b){ int rv; if ((rv = (a != NULL) - (b != NULL))) return rv; if (a == b) return 0; if ((rv = a->c_nettype - b->c_nettype)) return rv; if ((rv = a->c_addrtype - b->c_addrtype)) return rv; if ((rv = a->c_ttl - b->c_ttl)) return rv; if ((rv = a->c_groups - b->c_groups)) return rv; return 0;}/** Compare two bandwidth (b=) fields */int sdp_bandwidth_cmp(sdp_bandwidth_t const *a, sdp_bandwidth_t const *b){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -