PCAP To SIP and RTP
From CDYNE Wiki for Web Services
This program with full C# source code allows you to dump the calls captured in Tethereal, Ethereal, or Wireshark. You will have the sound files to play Incoming, Outgoing, and Combined audio. The program demonstrates the use of ULAW to Signed Linear functions and Signed Linear to ULAW.
Contents |
Downloads
- media:PcapToSIP_RTP.zip - Download the Executable (Should also run under MONO in Linux)
- media:PcapToSIP_RTP_source.zip - Download the Source code in C#
How to use this
- Dump packets to a pcap file. (You can also use the graphical Ethereal or Wireshark-Preferred)
tshark -w myoutput.pcap
- On a Windows box (or Linux with the MONO PROJECT installed) after the capture
pcaptosip_rtp myoutput.pcap
- Listen to the Sound files in the folder made by pcaptosip_rtp
CDYNE's use
We use this to debug some of our Phone Notify service calls. We can call into a VOIP system and check how notify performs with answering machines and more.
Code Examples of Routines used in PCAP to SIP/RTP
Example 1 - ULAW and Signed Linear Conversion
private static byte linear2ulaw(short pcm_val) /*2's complement(16-bit range)*/ { short mask; short seg; byte uval; /* Get the sign and the magnitude of the value. */ pcm_val = (short)((int)pcm_val >> 2); if (pcm_val < 0) { pcm_val = (short)-pcm_val; mask = 0x7F; } else { mask = 0xFF; } if (pcm_val > 8159) pcm_val = 8159; /* clip the magnitude */ pcm_val += 0x84 >> 2; /* Convert the scaled magnitude to segment number. */ seg = search(pcm_val, seg_end, 8); /* * Combine the sign, segment, quantization bits; * and complement the code word. */ if (seg >= 8) /* out of range, return maximum value. */ return (byte)(0x7F ^ mask); else { uval = (byte)((seg << 4) | ((pcm_val >> (seg + 1)) & 0xF)); return ((byte)(uval ^ mask)); } } static short search( short val, short[] table, short size) { short i; for (i = 0; i < size; i++) { if (val <= table[i]) return (i); } return (size); } static short[] seg_end = { 0x3F, 0x7F, 0xFF, 0x1FF, 0x3FF, 0x7FF, 0xFFF, 0x1FFF }; private static Int16[] ULAW_TO_LINEAR_16_BIT = new Int16[]{ -32124, -31100, -30076, -29052, -28028, -27004, -25980, -24956, -23932, -22908, -21884, -20860, -19836, -18812, -17788, -16764, -15996, -15484, -14972, -14460, -13948, -13436, -12924, -12412, -11900, -11388, -10876, -10364, -9852, -9340, -8828, -8316, -7932, -7676, -7420, -7164, -6908, -6652, -6396, -6140, -5884, -5628, -5372, -5116, -4860, -4604, -4348, -4092, -3900, -3772, -3644, -3516, -3388, -3260, -3132, -3004, -2876, -2748, -2620, -2492, -2364, -2236, -2108, -1980, -1884, -1820, -1756, -1692, -1628, -1564, -1500, -1436, -1372, -1308, -1244, -1180, -1116, -1052, -988, -924, -876, -844, -812, -780, -748, -716, -684, -652, -620, -588, -556, -524, -492, -460, -428, -396, -372, -356, -340, -324, -308, -292, -276, -260, -244, -228, -212, -196, -180, -164, -148, -132, -120, -112, -104, -96, -88, -80, -72, -64, -56, -48, -40, -32, -24, -16, -8, 0, 32124, 31100, 30076, 29052, 28028, 27004, 25980, 24956, 23932, 22908, 21884, 20860, 19836, 18812, 17788, 16764, 15996, 15484, 14972, 14460, 13948, 13436, 12924, 12412, 11900, 11388, 10876, 10364, 9852, 9340, 8828, 8316, 7932, 7676, 7420, 7164, 6908, 6652, 6396, 6140, 5884, 5628, 5372, 5116, 4860, 4604, 4348, 4092, 3900, 3772, 3644, 3516, 3388, 3260, 3132, 3004, 2876, 2748, 2620, 2492, 2364, 2236, 2108, 1980, 1884, 1820, 1756, 1692, 1628, 1564, 1500, 1436, 1372, 1308, 1244, 1180, 1116, 1052, 988, 924, 876, 844, 812, 780, 748, 716, 684, 652, 620, 588, 556, 524, 492, 460, 428, 396, 372, 356, 340, 324, 308, 292, 276, 260, 244, 228, 212, 196, 180, 164, 148, 132, 120, 112, 104, 96, 88, 80, 72, 64, 56, 48, 40, 32, 24, 16, 8, 0}; }
Example 2 - Byte Array to Structure
static void ByteArrayToStructure(byte[] bytearray, ref object obj) { int len = Marshal.SizeOf(obj); IntPtr i = Marshal.AllocHGlobal(len); Marshal.Copy(bytearray, 0, i, len); obj = Marshal.PtrToStructure(i, obj.GetType()); Marshal.FreeHGlobal(i); }
Example 3 - Structure to Byte Array
static byte[] StructureToByteArray(object obj) { int len = Marshal.SizeOf(obj); byte[] arr = new byte[len]; IntPtr ptr = Marshal.AllocHGlobal(len); Marshal.StructureToPtr(obj, ptr, true); Marshal.Copy(ptr, arr, 0, len); Marshal.FreeHGlobal(ptr); return arr; }
