FreeCalypso > hg > sipout-test-utils
view test-voice/sdp_in.c @ 16:4f81b959a5f5
sipout-test-voice: implement PCMU GSM uplink catcher
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Mon, 13 May 2024 22:10:25 -0800 |
parents | 35c0d9f03c0a |
children |
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 got_sdp_answer, 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)) 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); got_sdp_answer = 1; } void invite_200_rtpout() { if (!got_sdp_answer) { printf("INVITE response has no SDP!\n"); return; } rtp_out_enable = 1; assign_rtpout_ssrc(); init_pcm_fill_octet(); prepare_tfo_fill(); }