FreeCalypso > hg > themwi-system-sw
view sip-manual-out/sdp_in.c @ 209:e80f158333c5
mgw: correct PCMU decoding table
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 07 May 2023 21:43:02 -0800 |
parents | d3c99b41fb04 |
children | fbfa72b114e8 |
line wrap: on
line source
/* * In this module we handle SDP responses to our INVITE. */ #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <strings.h> #include "../libsip/parse.h" #include "../libsip/sdp.h" extern char *get_single_header(); extern char *extract_to_tag(); struct sockaddr_in rtp_remote_addr; int pcma_selected, rtp_out_enable; static check_sdp_present(msg) struct sip_pkt_rx *msg; { char *hval; if (!msg->msg_body_len) return 0; hval = get_single_header(msg, "Content-Type", "c", (int *) 0); if (!hval) return 0; if (!strcasecmp(hval, "application/sdp")) return 1; else return 0; } void extract_resp_sdp(msg) struct sip_pkt_rx *msg; { struct sdp_parse sdp_parse; int rc; if (!check_sdp_present(msg)) { printf("INVITE response has no SDP!\n"); return; } rc = parse_incoming_sdp(msg->msg_body, msg->msg_body_len, &sdp_parse); if (rc < 0) { printf("SDP parse error: %d\n", rc); return; } switch (sdp_parse.codec_mask) { case SDP_CODEC_MASK_PCMU: case SDP_CODEC_MASK_BOTH: pcma_selected = 0; break; case SDP_CODEC_MASK_PCMA: case SDP_CODEC_MASK_BOTH | SDP_CODEC_MASK_PCMA_PREF: pcma_selected = 1; break; default: printf("SDP error: no supported codec\n"); return; } printf("SDP response: IP %s port %u codec %s\n", inet_ntoa(sdp_parse.ip_addr), sdp_parse.audio_port, pcma_selected ? "PCMA" : "PCMU"); rtp_remote_addr.sin_family = AF_INET; rtp_remote_addr.sin_addr = sdp_parse.ip_addr; rtp_remote_addr.sin_port = htons(sdp_parse.audio_port); rtp_out_enable = 1; assign_rtpout_ssrc(); prepare_tfo_fill(); }