📄 sdp_print.c
字号:
const char *nettype; const char *addrtype; switch (c->c_nettype) { case sdp_net_x: nettype = NULL; break; case sdp_net_in: nettype = "IN "; break; default: printing_error(p, "unknown nettype %u", c->c_nettype); return; } switch (c->c_addrtype) { case sdp_addr_x: addrtype = NULL; break; case sdp_addr_ip4: nettype = "IN "; addrtype = "IP4 "; break; case sdp_addr_ip6: nettype = "IN "; addrtype = "IP6 "; break; default: printing_error(p, "unknown address type %u", c->c_addrtype); return; } if (c->c_address == NULL) { printing_error(p, "missing address"); return; } if (nettype && addrtype) sdp_printf(p, "%s%s%s", nettype, addrtype, c->c_address); else if (nettype) sdp_printf(p, "%s%s%s", nettype, c->c_address); else sdp_printf(p, "%s", c->c_address); if (c->c_mcast || c->c_ttl) { sdp_printf(p, "/%u", c->c_ttl); if (c->c_groups > 1) sdp_printf(p, "/%u", c->c_groups); } sdp_printf(p, CRLF);}static void print_bandwidths(sdp_printer_t *p, sdp_bandwidth_t const *b){ for (; b ; b = b->b_next) { char const *name; switch (b->b_modifier) { case sdp_bw_ct: name = "CT"; break; case sdp_bw_as: name = "AS"; break; default: name = b->b_modifier_name; break; } sdp_printf(p, "b=%s:%lu" CRLF, name, b->b_value); }}static void print_time(sdp_printer_t *p, sdp_time_t const *t){ if (t || p->pr_strict) sdp_printf(p, "t=%lu %lu" CRLF, t ? t->t_start : 0L, t ? t->t_stop : 0L);}static void print_repeat(sdp_printer_t *p, sdp_repeat_t const *r){ int i; sdp_printf(p, "r="); print_typed_time(p, r->r_interval); sdp_printf(p, " "); print_typed_time(p, r->r_duration); for (i = 0; i < r->r_number_of_offsets; i++) { sdp_printf(p, " "); print_typed_time(p, r->r_offsets[i]); } sdp_printf(p, CRLF);}static void print_zone(sdp_printer_t *p, sdp_zone_t const *z){ int i; sdp_printf(p, "z="); for (i = 0; i < z->z_number_of_adjustments; i++) { int negative = z->z_adjustments[i].z_offset < 0L; sdp_printf(p, "%s%lu %s", i > 0 ? " " : "", z->z_adjustments[i].z_at, negative ? "-" : ""); if (negative) print_typed_time(p, -z->z_adjustments[i].z_offset); else print_typed_time(p, z->z_adjustments[i].z_offset); } sdp_printf(p, CRLF);}static void print_typed_time(sdp_printer_t *p, unsigned long t){ if (t % 60 || t == 0) { sdp_printf(p, "%lu", t); } else { t /= 60; if (t % 60) { sdp_printf(p, "%lum", t); /* minutes */ } else { t /= 60; if (t % 24) { sdp_printf(p, "%luh", t); /* hours */ } else { t /= 24; sdp_printf(p, "%lud", t); /* days */ } } }}static void print_key(sdp_printer_t *p, sdp_key_t const *k){ const char *method; int have_material = k->k_material != NULL; switch (k->k_method) { case sdp_key_x: method = k->k_method_name; break; case sdp_key_clear: method = "clear"; break; case sdp_key_base64: method = "base64"; break; case sdp_key_uri: method = "uri"; break; case sdp_key_prompt: method = "prompt"; break; default: printing_error(p, "unknown key method (%d)", k->k_method); return; } sdp_printf(p, "k=%s%s%s" CRLF, method, have_material ? ":" : "", have_material ? k->k_material : "");}static void print_attributes(sdp_printer_t *p, sdp_attribute_t const *a){ for (;a; a = a->a_next) { char const *name = a->a_name; char const *value = a->a_value; sdp_printf(p, "a=%s%s%s" CRLF, name, value ? ":" : "", value ? value : ""); }}static void print_attributes_without_mode(sdp_printer_t *p, sdp_attribute_t const *a){ for (;a; a = a->a_next) { char const *name = a->a_name; char const *value = a->a_value; if (strcasecmp(name, "inactive") == 0 || strcasecmp(name, "sendonly") == 0 || strcasecmp(name, "recvonly") == 0 || strcasecmp(name, "sendrecv") == 0) continue; sdp_printf(p, "a=%s%s%s" CRLF, name, value ? ":" : "", value ? value : ""); }}static void print_charset(sdp_printer_t *p, sdp_text_t *charset){ sdp_printf(p, "a=charset%s%s" CRLF, charset ? ":" : "", charset ? charset : "");}static void print_media(sdp_printer_t *p, sdp_session_t const *sdp, sdp_media_t const *m){ char const *media, *proto; sdp_rtpmap_t *rm; sdp_mode_t session_mode = sdp_sendrecv; if (!p->pr_mode_manual) session_mode = sdp_attribute_mode(sdp->sdp_attributes, sdp_sendrecv); for (;m ; m = m->m_next) { switch (m->m_type) { case sdp_media_audio: media = "audio"; break; case sdp_media_video: media = "video"; break; case sdp_media_application: media = "application"; break; case sdp_media_data: media = "data"; break; case sdp_media_control: media = "control"; break; case sdp_media_message: media = "message"; break; case sdp_media_image : media = "image"; break; default: media = m->m_type_name; } switch (m->m_proto) { case sdp_proto_tcp: proto = "tcp"; break; case sdp_proto_udp: proto = "udp"; break; case sdp_proto_rtp: proto = "RTP/AVP"; break; case sdp_proto_srtp: proto = "RTP/SAVP"; break; case sdp_proto_udptl: proto = "UDPTL"; break; case sdp_proto_tls: proto = "tls"; break; default: proto = m->m_proto_name; break; } if (m->m_number_of_ports <= 1) sdp_printf(p, "m=%s %u %s", media, m->m_port, proto); else sdp_printf(p, "m=%s %u/%u %s", media, m->m_port, m->m_number_of_ports, proto); if (m->m_rtpmaps) { for (rm = m->m_rtpmaps; rm; rm = rm->rm_next) { if (rm->rm_any) sdp_printf(p, " *"); else sdp_printf(p, " %u", (unsigned)rm->rm_pt); } } else if (m->m_format) { sdp_list_t *l = m->m_format; for (; l; l = l->l_next) sdp_printf(p, " %s", l->l_text); } else { sdp_printf(p, " 19"); /* SDP syntax requires at least one format. 19 is used by nobody, right?. */ } sdp_printf(p, CRLF); if (m->m_information) print_information(p, m->m_information); if (m->m_connections)#ifdef nomore if (m->m_connections != sdp->sdp_connection)#endif print_connection_list(p, m->m_connections); if (m->m_bandwidths) print_bandwidths(p, m->m_bandwidths); if (m->m_key) print_key(p, m->m_key); for (rm = m->m_rtpmaps; rm; rm = rm->rm_next) { if (!rm->rm_predef || p->pr_all_rtpmaps) sdp_printf(p, "a=rtpmap:%u %s/%lu%s%s" CRLF, rm->rm_pt, rm->rm_encoding, rm->rm_rate, rm->rm_params ? "/" : "", rm->rm_params ? rm->rm_params : ""); if (rm->rm_fmtp) sdp_printf(p, "a=fmtp:%u %s" CRLF, rm->rm_pt, rm->rm_fmtp); } if (!p->pr_mode_manual && !m->m_rejected && (m->m_mode != (unsigned int)session_mode || p->pr_mode_always)) { switch (m->m_mode) { case sdp_inactive: sdp_printf(p, "a=inactive" CRLF); break; case sdp_sendonly: sdp_printf(p, "a=sendonly" CRLF); break; case sdp_recvonly: sdp_printf(p, "a=recvonly" CRLF); break; case sdp_sendrecv: sdp_printf(p, "a=sendrecv" CRLF); break; default: break; } } if (p->pr_mode_manual) print_attributes(p, m->m_attributes); else print_attributes_without_mode(p, m->m_attributes); }}static void print_text_list(sdp_printer_t *p, const char *fmt, sdp_list_t const *l){ for (;l; l = l->l_next) { sdp_printf(p, fmt, l->l_text); }}static void printing_error(sdp_printer_t *p, const char *fmt, ...){ va_list ap; if (p->pr_ok) { int n; va_start(ap, fmt); n = vsnprintf(p->pr_buffer, p->pr_bsiz, fmt, ap); va_end(ap); } p->pr_ok = 0;}static void sdp_printf(sdp_printer_t *p, const char *fmt, ...){ va_list ap; while (p->pr_ok) { int n; va_start(ap, fmt); n = vsnprintf(p->pr_buffer + p->pr_used, p->pr_bsiz - p->pr_used, fmt, ap); va_end(ap); if (n > -1 && (size_t)n < p->pr_bsiz - p->pr_used) { p->pr_used += n; break; } else { if (p->pr_owns_buffer) { p->pr_buffer = su_realloc(p->pr_home, p->pr_buffer, 2 * p->pr_bsiz); if (p->pr_buffer) { p->pr_bsiz = 2 * p->pr_bsiz; continue; } p->pr_owns_buffer = 0; } else if (p->pr_may_realloc) { char *buffer; size_t size; if (p->pr_bsiz < SDP_BLOCK) size = SDP_BLOCK; else size = 2 * p->pr_bsiz; buffer = su_alloc(p->pr_home, size); if (buffer) { p->pr_owns_buffer = 1; p->pr_buffer = memcpy(buffer, p->pr_buffer, p->pr_bsiz); p->pr_bsiz = size; continue; } } p->pr_ok = 0; p->pr_buffer = "Memory exhausted"; } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -