comparison libsip/sdp_gen.c @ 54:9f045dcff60e

libsip: SDP generation implemented
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 08 Sep 2022 12:02:22 -0800
parents
children
comparison
equal deleted inserted replaced
53:2423f3aac4ce 54:9f045dcff60e
1 /*
2 * Here we implement generation of outgoing SDP descriptions.
3 */
4
5 #include <sys/types.h>
6 #include <sys/socket.h>
7 #include <netinet/in.h>
8 #include <arpa/inet.h>
9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <string.h>
12 #include <strings.h>
13 #include "sdp.h"
14 #include "out_msg.h"
15
16 format_sdp_in_buffer(gen, buf, lenptr)
17 struct sdp_gen *gen;
18 char *buf;
19 unsigned *lenptr;
20 {
21 char *dp, *codec_list;
22
23 dp = buf;
24 strcpy(dp, "v=0\r\n");
25 dp += 5;
26 sprintf(dp, "o=- %u %u IN IP4 %s\r\n", gen->session_id, gen->version,
27 inet_ntoa(gen->owner_ip));
28 dp = index(dp, '\0');
29 strcpy(dp, "s=-\r\n");
30 dp += 5;
31 sprintf(dp, "c=IN IP4 %s\r\n", inet_ntoa(gen->conn_ip));
32 dp = index(dp, '\0');
33 strcpy(dp, "t=0 0\r\n");
34 dp += 7;
35 switch (gen->codec_mask) {
36 case SDP_CODEC_MASK_PCMU:
37 codec_list = "0";
38 break;
39 case SDP_CODEC_MASK_PCMA:
40 codec_list = "8";
41 break;
42 case SDP_CODEC_MASK_BOTH:
43 codec_list = "0 8";
44 break;
45 case SDP_CODEC_MASK_BOTH | SDP_CODEC_MASK_PCMA_PREF:
46 codec_list = "8 0";
47 break;
48 default:
49 return(-2);
50 }
51 sprintf(dp, "m=audio %u RTP/AVP %s\r\n", gen->conn_port, codec_list);
52 dp = index(dp, '\0');
53 if (gen->codec_mask & SDP_CODEC_MASK_PCMU) {
54 strcpy(dp, "a=rtpmap:0 PCMU/8000\r\n");
55 dp += 22;
56 }
57 if (gen->codec_mask & SDP_CODEC_MASK_PCMA) {
58 strcpy(dp, "a=rtpmap:8 PCMA/8000\r\n");
59 dp += 22;
60 }
61 strcpy(dp, "a=sendrecv\r\n");
62 dp += 12;
63 strcpy(dp, "a=ptime:20\r\n");
64 dp += 12;
65 *lenptr = (dp - buf);
66 return(0);
67 }
68
69 out_msg_finish_sdp(msg, gen)
70 struct sip_msg_out *msg;
71 struct sdp_gen *gen;
72 {
73 char sdp_buf[256];
74 unsigned sdp_len;
75 int rc;
76
77 rc = format_sdp_in_buffer(gen, sdp_buf, &sdp_len);
78 if (rc < 0)
79 return rc;
80 return out_msg_finish_body(msg, sdp_buf, sdp_len);
81 }