FreeCalypso > hg > themwi-system-sw
comparison sip-manual-out/rtp.c @ 188:6aecee01cf0a
sip-manual-out: add RTP stream continuity analysis
| author | Mychaela Falconia <falcon@freecalypso.org> |
|---|---|
| date | Fri, 17 Mar 2023 01:14:57 -0800 |
| parents | 258932879f8b |
| children | 1266e024de6c |
comparison
equal
deleted
inserted
replaced
| 187:258932879f8b | 188:6aecee01cf0a |
|---|---|
| 6 | 6 |
| 7 #include <sys/types.h> | 7 #include <sys/types.h> |
| 8 #include <sys/socket.h> | 8 #include <sys/socket.h> |
| 9 #include <netinet/in.h> | 9 #include <netinet/in.h> |
| 10 #include <stdio.h> | 10 #include <stdio.h> |
| 11 #include <stdint.h> | |
| 11 #include <stdlib.h> | 12 #include <stdlib.h> |
| 12 #include <string.h> | 13 #include <string.h> |
| 13 #include <strings.h> | 14 #include <strings.h> |
| 14 #include "../include/tmgw_const.h" | 15 #include "../include/tmgw_const.h" |
| 16 #include "../include/rtp_defs.h" | |
| 15 #include "../librtpalloc/rtp_alloc_simple.h" | 17 #include "../librtpalloc/rtp_alloc_simple.h" |
| 16 | 18 |
| 17 struct sockaddr_in rtp_local_addr; | 19 struct sockaddr_in rtp_local_addr; |
| 18 int rtp_udp_fd, rtcp_udp_fd; | 20 int rtp_udp_fd, rtcp_udp_fd; |
| 19 | 21 |
| 20 static int got_some_rtp, got_some_rtcp; | 22 static int rtp_start_flag, rtp_bad_flag, rtp_ssrc_chg_flag; |
| 23 static int rtp_seq_brk_flag, rtp_seq_zero_flag, rtp_seq_neg_flag; | |
| 24 static int rtp_ts_brk_flag; | |
| 25 static uint32_t rtp_ssrc; | |
| 26 static uint32_t rtp_last_ts; | |
| 27 static uint16_t rtp_last_seq; | |
| 28 static int got_some_rtcp; | |
| 21 | 29 |
| 22 void | 30 void |
| 23 obtain_rtp_endp() | 31 obtain_rtp_endp() |
| 24 { | 32 { |
| 25 int rc; | 33 int rc; |
| 34 } | 42 } |
| 35 | 43 |
| 36 void | 44 void |
| 37 rtp_rx_select() | 45 rtp_rx_select() |
| 38 { | 46 { |
| 39 u_char buf[512]; | 47 struct rtp_packet pkt; |
| 48 struct sockaddr_in sin_from; | |
| 49 socklen_t addrlen; | |
| 50 int16_t seq_delta; | |
| 51 int32_t ts_delta; | |
| 52 int rc; | |
| 40 | 53 |
| 41 recv(rtp_udp_fd, buf, sizeof buf, 0); | 54 addrlen = sizeof(struct sockaddr_in); |
| 42 if (!got_some_rtp) { | 55 rc = recvfrom(rtp_udp_fd, &pkt, sizeof pkt, 0, |
| 43 printf("Got some RTP\n"); | 56 (struct sockaddr *) &sin_from, &addrlen); |
| 44 got_some_rtp = 1; | 57 if (rc < 0) |
| 58 return; | |
| 59 if (rc != RTP_PACKET_SIZE_PSTN) { | |
| 60 bad_rtp_pkt: if (!rtp_bad_flag) { | |
| 61 printf("Got a bad RTP packet\n"); | |
| 62 rtp_bad_flag = 1; | |
| 63 } | |
| 64 return; | |
| 65 } | |
| 66 if (pkt.v_p_x_cc != 0x80) | |
| 67 goto bad_rtp_pkt; | |
| 68 switch (pkt.m_pt & 0x7F) { | |
| 69 case PSTN_CODEC_PCMU: | |
| 70 case PSTN_CODEC_PCMA: | |
| 71 break; | |
| 72 default: | |
| 73 goto bad_rtp_pkt; | |
| 74 } | |
| 75 if (rtp_start_flag && pkt.ssrc != rtp_ssrc) { | |
| 76 if (!rtp_ssrc_chg_flag) { | |
| 77 printf("Rx RTP stream changed SSRC\n"); | |
| 78 rtp_ssrc_chg_flag = 1; | |
| 79 } | |
| 80 } else if (rtp_start_flag) { | |
| 81 seq_delta = ntohs(pkt.seq) - rtp_last_seq; | |
| 82 ts_delta = ntohl(pkt.tstamp) - rtp_last_ts; | |
| 83 if (seq_delta == 0) { | |
| 84 if (!rtp_seq_zero_flag) { | |
| 85 printf("Rx RTP seq zero increment\n"); | |
| 86 rtp_seq_zero_flag = 1; | |
| 87 } | |
| 88 return; | |
| 89 } | |
| 90 if (seq_delta < 0) { | |
| 91 if (!rtp_seq_neg_flag) { | |
| 92 printf("Rx RTP seq negative increment\n"); | |
| 93 rtp_seq_neg_flag = 1; | |
| 94 } | |
| 95 return; | |
| 96 } | |
| 97 if (seq_delta != 1) { | |
| 98 if (!rtp_seq_brk_flag) { | |
| 99 printf("Rx RTP stream seq break\n"); | |
| 100 rtp_seq_brk_flag = 1; | |
| 101 } | |
| 102 } else if (ts_delta != 160) { | |
| 103 if (!rtp_ts_brk_flag) { | |
| 104 printf("Rx RTP stream tstamp break\n"); | |
| 105 rtp_ts_brk_flag = 1; | |
| 106 } | |
| 107 } | |
| 108 } | |
| 109 rtp_ssrc = pkt.ssrc; | |
| 110 rtp_last_ts = ntohl(pkt.tstamp); | |
| 111 rtp_last_seq = ntohs(pkt.seq); | |
| 112 if (!rtp_start_flag) { | |
| 113 printf("Rx RTP stream begins with seq=%u ts=%u\n", | |
| 114 rtp_last_seq, rtp_last_ts); | |
| 115 rtp_start_flag = 1; | |
| 45 } | 116 } |
| 46 } | 117 } |
| 47 | 118 |
| 48 void | 119 void |
| 49 rtcp_rx_select() | 120 rtcp_rx_select() |
