From 8f0063695e6eae2cc1e7736d5d9e1d96e4ba2731 Mon Sep 17 00:00:00 2001 From: Torrey Searle Date: Wed, 16 May 2018 16:45:58 +0200 Subject: [PATCH] add support for dtmf rtp events into rtpdump --- rtpdump.1 | 5 +++++ rtpdump.c | 36 +++++++++++++++++++++++++++++++++--- 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/rtpdump.1 b/rtpdump.1 index 387a26a..7bfb98a 100644 --- a/rtpdump.1 +++ b/rtpdump.1 @@ -40,6 +40,7 @@ .Op Fl o Ar outfile .Op Fl t Ar minutes .Op Fl x Ar bytes +.Op Fl d Ar event_payload_id .Oo Ar address Oc Ns / Ns Ar port .Sh DESCRIPTION .Nm @@ -176,6 +177,10 @@ This is only applicable for the and .Cm hex formats. +.It Fl d Ar event_payload_id +Consider the dynamic payload id +.Ar event_payload_id +as the payload id for RTP Events .El .Sh EXAMPLES .Bd -literal diff --git a/rtpdump.c b/rtpdump.c index 82a4a9c..ad6fdc7 100644 --- a/rtpdump.c +++ b/rtpdump.c @@ -118,12 +118,14 @@ static struct { { NULL, 0, 0 } }; +int dyn_payload_rtpevent = 101; /* Default payload type for RTPEvent packets */ + static void usage(const char *argv0) { fprintf(stderr, "usage: %s " "[-F hex|ascii|rtcp|short|payload|dump|header] " "[-f infile] [-o outfile] [-t minutes] [-x bytes] " - "[address]/port > file\n", argv0); + "[-d event_payload_id] [address]/port > file\n", argv0); } @@ -309,6 +311,7 @@ static int parse_data(FILE *out, char *buf, int len) rtp_hdr_ext_t *ext; int i, ext_len; int hlen = 0; + char *payload_data = NULL; /* Show vat format packets. */ if (r->version == 0) { @@ -334,6 +337,29 @@ static int parse_data(FILE *out, char *buf, int len) for (i = 0; i < r->cc; i++) { fprintf(out, "csrc[%d]=0x%0lx ", i, r->csrc[i]); } + + /* Check if it is an RTPEvent Packet */ + if (dyn_payload_rtpevent == r->pt) + { + + payload_data = (char*)buf + 12 + (r->cc*4); + if (payload_data[0] == 10) + { + + payload_data[0] = '*'; + } + else if (payload_data[0] == 11) + { + payload_data[0] = '#'; + } + else + { + payload_data[0] += '0'; + } + fprintf(out, "dtmf=%c duration=%dms end=%d ", payload_data[0], ntohs(*(short*)(payload_data+2))/8,(payload_data[1]>>7)&0x1); + + } + if (r->x) { /* header extension */ ext = (rtp_hdr_ext_t *)((char *)buf + hlen); ext_len = ntohs(ext->len); @@ -577,7 +603,6 @@ void packet_handler(FILE *out, t_format format, int trunc, double dnow = tdbl(&now); int hlen; /* header length */ int offset; - switch(format) { case F_header: offset = (dnow - dstart) * 1000; @@ -684,7 +709,7 @@ int main(int argc, char *argv[]) extern double tdbl(struct timeval *); startupSocket(); - while ((c = getopt(argc, argv, "F:f:o:t:x:h")) != EOF) { + while ((c = getopt(argc, argv, "F:f:o:t:x:d:h")) != EOF) { switch(c) { /* output format */ case 'F': @@ -727,6 +752,11 @@ int main(int argc, char *argv[]) trunc = atoi(optarg); break; + /* Dynamic Payload Type for RTPEVENT packets */ + case 'd': + dyn_payload_rtpevent = atoi(optarg); + break; + case '?': case 'h': usage(argv[0]);