diff options
author | Anders Broman <anders.broman@ericsson.com> | 2006-08-30 19:27:54 +0000 |
---|---|---|
committer | Anders Broman <anders.broman@ericsson.com> | 2006-08-30 19:27:54 +0000 |
commit | 0ac19b7c680bac0636a682563bd5138ab25c43ce (patch) | |
tree | 024f9e8b7edff27e63fd9f15aff58544b4bf927c /plugins | |
parent | c5374442cfe216a65f2ea1264d8170de9f061427 (diff) |
From Alejandro Vaquero:
- The current "/plugin/listen_rtp" directory should be removed from the
source
svn path=/trunk/; revision=19087
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/listen_rtp/AUTHORS | 5 | ||||
-rw-r--r-- | plugins/listen_rtp/Makefile.am | 54 | ||||
-rw-r--r-- | plugins/listen_rtp/Makefile.nmake | 53 | ||||
-rw-r--r-- | plugins/listen_rtp/NEWS | 1 | ||||
-rw-r--r-- | plugins/listen_rtp/codecs/G711a/G711adecode.c | 18 | ||||
-rw-r--r-- | plugins/listen_rtp/codecs/G711a/G711adecode.h | 3 | ||||
-rw-r--r-- | plugins/listen_rtp/codecs/G711a/G711atable.h | 36 | ||||
-rw-r--r-- | plugins/listen_rtp/codecs/G711u/G711udecode.c | 18 | ||||
-rw-r--r-- | plugins/listen_rtp/codecs/G711u/G711udecode.h | 3 | ||||
-rw-r--r-- | plugins/listen_rtp/codecs/G711u/G711utable.h | 36 | ||||
-rw-r--r-- | plugins/listen_rtp/listen_rtp_plugin.c | 49 | ||||
-rw-r--r-- | plugins/listen_rtp/main_listen_rtp.c | 1857 | ||||
-rw-r--r-- | plugins/listen_rtp/main_listen_rtp.h | 29 |
13 files changed, 0 insertions, 2162 deletions
diff --git a/plugins/listen_rtp/AUTHORS b/plugins/listen_rtp/AUTHORS deleted file mode 100644 index ecabd2824f..0000000000 --- a/plugins/listen_rtp/AUTHORS +++ /dev/null @@ -1,5 +0,0 @@ -$Id$ - -Author: -Alejandro Vaquero <alejandrovaquero [AT] yahoo.com> - diff --git a/plugins/listen_rtp/Makefile.am b/plugins/listen_rtp/Makefile.am deleted file mode 100644 index a568eaad6c..0000000000 --- a/plugins/listen_rtp/Makefile.am +++ /dev/null @@ -1,54 +0,0 @@ -# Makefile.am -# Automake file for listen_rtp Ethereal plugin -# -# $Id$ -# -# Ethereal - Network traffic analyzer -# By Gerald Combs <gerald@ethereal.com> -# Copyright 1998 Gerald Combs -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# - -INCLUDES = -I$(top_srcdir) @PORTAUDIO_INCLUDES@ - -plugindir = @plugindir@ - -plugin_LTLIBRARIES = listen_rtp.la - -listen_rtp_la_SOURCES = \ - listen_rtp_plugin.c \ - main_listen_rtp.c \ - main_listen_rtp.h \ - codecs/G711a/G711adecode.c codecs/G711a/G711adecode.h \ - codecs/G711u/G711udecode.c codecs/G711u/G711udecode.h - -listen_rtp_la_LDFLAGS = -module -avoid-version -listen_rtp_la_LIBADD = @PLUGIN_LIBS@ @PORTAUDIO_LIBS@ - -# Libs must be cleared, or else libtool won't create a shared module. -# If your module needs to be linked against any particular libraries, -# add them here. -LIBS = - -CLEANFILES = \ - listen_rtp \ - *~ - -MAINTAINERCLEANFILES = \ - Makefile.in - -EXTRA_DIST = \ - Makefile.nmake diff --git a/plugins/listen_rtp/Makefile.nmake b/plugins/listen_rtp/Makefile.nmake deleted file mode 100644 index 68debf962e..0000000000 --- a/plugins/listen_rtp/Makefile.nmake +++ /dev/null @@ -1,53 +0,0 @@ -# -# $Id$ -# - -include ..\..\config.nmake -include <win32.mak> - -PA_CFLAGS=/I$(PORTAUDIO_DIR)\pa_common -WIN_LIBS=winmm.lib - -############### no need to modify below this line ######### - -CFLAGS=/DHAVE_CONFIG_H /I../.. /I../../wiretap $(GTK2_CFLAGS) $(GLIB_CFLAGS) \ - /I$(PCAP_DIR)\include -D_U_="" $(LOCAL_CFLAGS) $(PA_CFLAGS) - -PACFLAGS = -c /Zi /W1 /Od $(PA_CFLAGS) - -.c.obj:: - $(CC) $(CFLAGS) -Fdlisten_rtp.pdb -c $< - -LDFLAGS = /NOLOGO /INCREMENTAL:no /MACHINE:I386 $(LOCAL_LDFLAGS) - -!IFDEF ENABLE_LIBWIRESHARK -LINK_PLUGIN_WITH=..\..\epan\libwireshark.lib -CFLAGS=/DHAVE_WIN32_LIBWIRESHARK_LIB /D_NEED_VAR_IMPORT_ $(CFLAGS) - -OBJECTS=listen_rtp_plugin.obj main_listen_rtp.obj pa_lib.obj pa_win_wmme.obj \ - G711udecode.obj G711adecode.obj - -listen_rtp.dll listen_rtp.exp listen_rtp.lib : $(OBJECTS) $(LINK_PLUGIN_WITH) - link -dll /out:listen_rtp.dll $(LDFLAGS) $(OBJECTS) $(LINK_PLUGIN_WITH) \ - $(GLIB_LIBS) $(GTK2_LIBS) $(WIN_LIBS) - -!ENDIF - -pa_lib.obj: $(PORTAUDIO_DIR)\pa_common\pa_lib.c - $(CC) $(PACFLAGS) $(PORTAUDIO_DIR)\pa_common\pa_lib.c -o $@ - -pa_win_wmme.obj: $(PORTAUDIO_DIR)\pa_win_wmme\pa_win_wmme.c - $(CC) $(PACFLAGS) $(PORTAUDIO_DIR)\pa_win_wmme\pa_win_wmme.c -o $@ - -G711adecode.obj: codecs\G711a\G711adecode.c codecs\G711a\G711adecode.h codecs\G711a\G711atable.h - $(CC) $(CFLAGS) -c /Zi /W1 /Od codecs\G711a\G711adecode.c -o $@ - -G711udecode.obj: codecs\G711u\G711udecode.c codecs\G711u\G711udecode.h codecs\G711u\G711utable.h - $(CC) $(CFLAGS) -c /Zi /W1 /Od codecs\G711u\G711udecode.c -o $@ - -clean: - rm -f $(OBJECTS) listen_rtp.dll listen_rtp.exp listen_rtp.lib *.pdb - -distclean: clean - -maintainer-clean: distclean diff --git a/plugins/listen_rtp/NEWS b/plugins/listen_rtp/NEWS deleted file mode 100644 index 055c8729cd..0000000000 --- a/plugins/listen_rtp/NEWS +++ /dev/null @@ -1 +0,0 @@ -$Id$ diff --git a/plugins/listen_rtp/codecs/G711a/G711adecode.c b/plugins/listen_rtp/codecs/G711a/G711adecode.c deleted file mode 100644 index 644c24d9a9..0000000000 --- a/plugins/listen_rtp/codecs/G711a/G711adecode.c +++ /dev/null @@ -1,18 +0,0 @@ -#include <glib.h> -#include "G711adecode.h" -#include "G711atable.h" - -int -decodeG711a(void *input, int inputSizeBytes, void *output, int *outputSizeBytes) -{ - guint8 *dataIn = (guint8 *)input; - gint16 *dataOut = (gint16 *)output; - int i; - - for (i=0; i<inputSizeBytes; i++) - { - dataOut[i] = alaw_exp_table[dataIn[i]]; - } - *outputSizeBytes = inputSizeBytes * 2; - return 0; -} diff --git a/plugins/listen_rtp/codecs/G711a/G711adecode.h b/plugins/listen_rtp/codecs/G711a/G711adecode.h deleted file mode 100644 index 779203a212..0000000000 --- a/plugins/listen_rtp/codecs/G711a/G711adecode.h +++ /dev/null @@ -1,3 +0,0 @@ - -decodeG711a(void *input, int inputSizeBytes, void *output, int *outputSizeBytes); - diff --git a/plugins/listen_rtp/codecs/G711a/G711atable.h b/plugins/listen_rtp/codecs/G711a/G711atable.h deleted file mode 100644 index b4ce633bc6..0000000000 --- a/plugins/listen_rtp/codecs/G711a/G711atable.h +++ /dev/null @@ -1,36 +0,0 @@ - - -gint16 alaw_exp_table[256] = { - -5504, -5248, -6016, -5760, -4480, -4224, -4992, -4736, - -7552, -7296, -8064, -7808, -6528, -6272, -7040, -6784, - -2752, -2624, -3008, -2880, -2240, -2112, -2496, -2368, - -3776, -3648, -4032, -3904, -3264, -3136, -3520, -3392, - -22016,-20992,-24064,-23040,-17920,-16896,-19968,-18944, - -30208,-29184,-32256,-31232,-26112,-25088,-28160,-27136, - -11008,-10496,-12032,-11520, -8960, -8448, -9984, -9472, - -15104,-14592,-16128,-15616,-13056,-12544,-14080,-13568, - -344, -328, -376, -360, -280, -264, -312, -296, - -472, -456, -504, -488, -408, -392, -440, -424, - -88, -72, -120, -104, -24, -8, -56, -40, - -216, -200, -248, -232, -152, -136, -184, -168, - -1376, -1312, -1504, -1440, -1120, -1056, -1248, -1184, - -1888, -1824, -2016, -1952, -1632, -1568, -1760, -1696, - -688, -656, -752, -720, -560, -528, -624, -592, - -944, -912, -1008, -976, -816, -784, -880, -848, - 5504, 5248, 6016, 5760, 4480, 4224, 4992, 4736, - 7552, 7296, 8064, 7808, 6528, 6272, 7040, 6784, - 2752, 2624, 3008, 2880, 2240, 2112, 2496, 2368, - 3776, 3648, 4032, 3904, 3264, 3136, 3520, 3392, - 22016, 20992, 24064, 23040, 17920, 16896, 19968, 18944, - 30208, 29184, 32256, 31232, 26112, 25088, 28160, 27136, - 11008, 10496, 12032, 11520, 8960, 8448, 9984, 9472, - 15104, 14592, 16128, 15616, 13056, 12544, 14080, 13568, - 344, 328, 376, 360, 280, 264, 312, 296, - 472, 456, 504, 488, 408, 392, 440, 424, - 88, 72, 120, 104, 24, 8, 56, 40, - 216, 200, 248, 232, 152, 136, 184, 168, - 1376, 1312, 1504, 1440, 1120, 1056, 1248, 1184, - 1888, 1824, 2016, 1952, 1632, 1568, 1760, 1696, - 688, 656, 752, 720, 560, 528, 624, 592, - 944, 912, 1008, 976, 816, 784, 880, 848}; - diff --git a/plugins/listen_rtp/codecs/G711u/G711udecode.c b/plugins/listen_rtp/codecs/G711u/G711udecode.c deleted file mode 100644 index 67f2ed62ab..0000000000 --- a/plugins/listen_rtp/codecs/G711u/G711udecode.c +++ /dev/null @@ -1,18 +0,0 @@ -#include <glib.h> -#include "G711udecode.h" -#include "G711utable.h" - -int -decodeG711u(void *input, int inputSizeBytes, void *output, int *outputSizeBytes) -{ - guint8 *dataIn = (guint8 *)input; - gint16 *dataOut = (gint16 *)output; - int i; - - for (i=0; i<inputSizeBytes; i++) - { - dataOut[i] = ulaw_exp_table[dataIn[i]]; - } - *outputSizeBytes = inputSizeBytes * 2; - return 0; -} diff --git a/plugins/listen_rtp/codecs/G711u/G711udecode.h b/plugins/listen_rtp/codecs/G711u/G711udecode.h deleted file mode 100644 index 0cd55a9a09..0000000000 --- a/plugins/listen_rtp/codecs/G711u/G711udecode.h +++ /dev/null @@ -1,3 +0,0 @@ - -decodeG711u(void *input, int inputSizeBytes, void *output, int *outputSizeBytes); - diff --git a/plugins/listen_rtp/codecs/G711u/G711utable.h b/plugins/listen_rtp/codecs/G711u/G711utable.h deleted file mode 100644 index 83401331c7..0000000000 --- a/plugins/listen_rtp/codecs/G711u/G711utable.h +++ /dev/null @@ -1,36 +0,0 @@ - - -gint16 ulaw_exp_table[256] = { - -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}; - diff --git a/plugins/listen_rtp/listen_rtp_plugin.c b/plugins/listen_rtp/listen_rtp_plugin.c deleted file mode 100644 index b65e8f67b7..0000000000 --- a/plugins/listen_rtp/listen_rtp_plugin.c +++ /dev/null @@ -1,49 +0,0 @@ -/* listen_rtp_plugin.c -* Listen RTP plugin registration file -* Automatically generated by make_stat_tree_registration.pl -* -* $Id$ -* -* Ethereal - Network traffic analyzer -* By Gerald Combs <gerald@ethereal.com> -* Copyright 1998 Gerald Combs -* -* This program is free software; you can redistribute it and/or -* modify it under the terms of the GNU General Public License -* as published by the Free Software Foundation; either version 2 -* of the License, or (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program; if not, write to the Free Software -* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -#ifndef ENABLE_STATIC -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <gmodule.h> - -#include <epan/stats_tree.h> - -#include "main_listen_rtp.h" - -G_MODULE_EXPORT const gchar version[] = "0.1"; - -G_MODULE_EXPORT void plugin_register(void) -{ - proto_register_listen_rtp(); -} - -G_MODULE_EXPORT void plugin_reg_handoff(void) -{ - proto_reg_handoff_listen_rtp(); -} -#endif - diff --git a/plugins/listen_rtp/main_listen_rtp.c b/plugins/listen_rtp/main_listen_rtp.c deleted file mode 100644 index a659687f95..0000000000 --- a/plugins/listen_rtp/main_listen_rtp.c +++ /dev/null @@ -1,1857 +0,0 @@ -/* main_listen_rtp.c -* Listen RTP -* -* (c) 2006, Alejandro Vaquero <alejandrovaquero@yahoo.com> -* -* Here is a summary on how this listen RTP works: -* - The VoipCalls will call add_rtp_packet() every time there is an RTP packet -* - add_rtp_packet() will add the RTP packet in a RTP stream struct, and create the RTP stream if it is the -* first RTP in the stream. -* - Each new RTP stream will be added to a list of RTP stream, called rtp_streams_list -* - When the user clicks "Listen" in the VoipCall dialoge, listen_rtp_init() is called. -* - listen_rtp_init() create the main dialog, and it calls: -* + mark_rtp_stream_to_play() to mark the RTP streams that needs to be displayed. These are the RTP stream -* that match the selected calls in the VoipCall dlg. -* + decode_rtp_stream() this will decode the RTP packets in each RTP stream, and will also create -* the RTP channles. An RTP channel is a group of RTP stream that have in common the source and destination -* IP and UPD ports. The RTP channels is what the user will listen in one of the two Audio channles. -* The RTP channels are stored in the hash table rtp_channels_hash -* + add_channel_to_window() will create and add the Audio graphic representation in the main window -* - When the user click the check box to listen one of the Audio channels, the structure rtp_channels is filled -* to play one or two RTP channels (a max of two channels can be listened at a given moment) -* -* -* -* $Id$ -* -* Wireshark - Network traffic analyzer -* By Gerald Combs <gerald@wireshark.org> -* Copyright 1999 Gerald Combs -* -* This program is free software; you can redistribute it and/or -* modify it under the terms of the GNU General Public License -* as published by the Free Software Foundation; either version 2 -* of the License, or (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program; if not, write to the Free Software -* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <epan/stats_tree.h> -#include <epan/addr_resolv.h> -#include <string.h> -#include <glib.h> -#include <gtk/gtk.h> -#include "globals.h" -#include "portaudio.h" -#include "simple_dialog.h" -#include "../../gtk/gui_utils.h" -#include "../../gtk/dlg_utils.h" -#include "../../gtk/compat_macros.h" - -#include "../../gtk/graph_analysis.h" -#include "../../gtk/voip_calls_dlg.h" -#include "../../gtk/voip_calls.h" -#include "../../gtk/gtkglobals.h" - - -#include <epan/dissectors/packet-rtp.h> - -#include "main_listen_rtp.h" -#include "codecs/G711a/G711adecode.h" -#include "codecs/G711u/G711udecode.h" -#include "main_listen_rtp.h" -#include <math.h> - -/*define this symbol to compile with G729 and G723 codecs*/ -/*#define HAVE_G729_G723 1*/ - -#ifdef HAVE_G729_G723 -#include "codecs/G729/G729decode.h" -#include "codecs/G723/G723decode.h" -#endif - -static gboolean initialized = FALSE; - -static int proto_listen_rtp = -1; -voip_calls_tapinfo_t *voip_calls = NULL; - -/* Hash table with all the RTP streams */ -static GHashTable* rtp_streams_hash = NULL; - -/* List with all the RTP streams (this is used to decode them as it is sorted)*/ -static GList* rtp_streams_list = NULL; - -/* the window */ -static GtkWidget *listen_rtp_dlg_w; -static GtkWidget *channels_vb; -static GtkWidget *main_scrolled_window = NULL; -static GtkWidget *jitter_spinner; -static GtkWidget *bt_decode; -static GtkWidget *bt_play; -static GtkWidget *bt_pause; -static GtkWidget *bt_stop; -static GtkWidget *progress_bar; -static GtkWidget *info_bar; -static GtkWidget *stat_hbox; - -static guint32 total_packets; -static guint32 total_frames; -static guint32 progbar_count; - -static int new_jitter_buff; - -/* a hash table with the RTP streams to play per audio channel */ -static GHashTable *rtp_channels_hash = NULL; - -/* Port Audio staff */ -#define SAMPLE_RATE (8000) -#define NUM_CHANNELS (2) - -#define PA_SAMPLE_TYPE paInt16 -typedef gint16 SAMPLE; -#define SAMPLE_SILENCE (0) -#define FRAMES_PER_BUFFER (512) - -typedef struct _sample_t { - SAMPLE val; - guint8 status; -} sample_t; - -#define S_NORMAL 0 -#define S_DROP_BY_JITT 1 -#define S_WRONG_SEQ 2 - -/* Display channels constants */ -#define MULT 80 -#define CHANNEL_WIDTH 500 -#define CHANNEL_HEIGHT 100 -#define MAX_TIME_LABEL 10 -#define HEIGHT_TIME_LABEL 18 -#define MAX_NUM_COL_CONV 10 - -PortAudioStream *pa_stream; - -/* defines a RTP stream */ -typedef struct _rtp_stream_info { - address src_addr; - guint16 src_port; - address dest_addr; - guint16 dest_port; - guint32 ssrc; - guint32 first_frame_number; /* first RTP frame for the stream */ - double start_time; /* RTP stream start time in ms */ - gboolean play; - guint16 call_num; - GList* rtp_packets_list; /* List of RTP packets in the stream */ - guint32 num_packets; -} rtp_stream_info_t; - - -/* defines the RTP streams to be played in an audio channel */ -typedef struct _rtp_channel_info { - double start_time; /* RTP stream start time in ms */ - double end_time; /* RTP stream end time in ms */ - GArray *samples; /* the array with decoded audio */ - guint16 call_num; - gboolean selected; - guint32 frame_index; - guint32 drop_by_jitter_buff; - guint32 out_of_seq; - guint32 max_frame_index; - GtkWidget *check_bt; - GtkWidget *separator; - GtkWidget *scroll_window; - GtkWidget *draw_area; - GdkPixmap *pixmap; - GtkAdjustment *h_scrollbar_adjustment; - GdkPixbuf* cursor_pixbuf; - PaTimestamp cursor_prev; - GdkGC *bg_gc[MAX_NUM_COL_CONV+1]; - gboolean cursor_catch; - rtp_stream_info_t *first_stream; /* This is the first RTP stream in the channel */ - guint32 num_packets; -} rtp_channel_info_t; - -/* defines a RTP packet */ -typedef struct _rtp_packet { - struct _rtp_info *info; /* the RTP dissected info */ - double arrive_offset; /* arrive offset time since the begining of the stream in ms */ -/* const guint8* payload_data; */ - guint8* payload_data; -} rtp_packet_t; - -/* defines the two RTP channels to be played */ -typedef struct _rtp_play_channles { - rtp_channel_info_t* rci[2]; /* Channels to be played */ - guint32 start_index[2]; - guint32 end_index[2]; - int channel; - guint32 max_frame_index; - guint32 frame_index; - gboolean pause; - gboolean stop; - gint32 pause_duration; - PaTimestamp out_diff_time; -} rtp_play_channles_t; - -/* The two RTP channles to play */ -static rtp_play_channles_t *rtp_channels = NULL; - - -/****************************************************************************/ -static void -rtp_key_destroy(gchar *key) -{ - g_free(key); - key = NULL; -} - -/****************************************************************************/ -static void -rtp_channel_value_destroy(rtp_channel_info_t *rci) -{ - g_array_free(rci->samples, TRUE); - g_free(rci); - rci = NULL; -} - -/****************************************************************************/ -static void -rtp_stream_value_destroy(rtp_stream_info_t *rsi) -{ - GList* rtp_packets_list; - rtp_packet_t *rp; - - rtp_packets_list = g_list_first(rsi->rtp_packets_list); - while (rtp_packets_list) - { - rp = rtp_packets_list->data; - - g_free(rp->info); - g_free(rp->payload_data); - g_free(rp); - rp = NULL; - - rtp_packets_list = g_list_next(rtp_packets_list); - } - g_free(rsi); - rsi = NULL; -} - -/****************************************************************************/ -static void -set_sensitive_check_bt(gchar *key _U_ , rtp_channel_info_t *rci, guint *stop _U_ ) -{ - gtk_widget_set_sensitive(rci->check_bt, !(*stop)); -} - -/****************************************************************************/ -static void -bt_state(gboolean decode, gboolean play, gboolean pause, gboolean stop) -{ - gboolean new_jitter_value = FALSE; - gboolean false_val = FALSE; - - gtk_widget_set_sensitive(bt_decode, decode); - gtk_widget_set_sensitive(jitter_spinner, decode); - - if (new_jitter_buff != (int) gtk_spin_button_get_value((GtkSpinButton * )jitter_spinner)) { - new_jitter_value = TRUE; - } - - /* set the sensitive state of play only if there is a channel selected */ - if ( play && (rtp_channels->rci[0] || rtp_channels->rci[1]) && !new_jitter_value) { - gtk_widget_set_sensitive(bt_play, TRUE); - } else { - gtk_widget_set_sensitive(bt_play, FALSE); - } - - if (!new_jitter_value) { - gtk_widget_set_sensitive(bt_pause, pause); - gtk_widget_set_sensitive(bt_stop, stop); - - /* Set sensitive to the check buttons based on the STOP state */ - g_hash_table_foreach( rtp_channels_hash, (GHFunc)set_sensitive_check_bt, &stop); - } else { - gtk_widget_set_sensitive(bt_pause, FALSE); - gtk_widget_set_sensitive(bt_stop, FALSE); - - g_hash_table_foreach( rtp_channels_hash, (GHFunc)set_sensitive_check_bt, &false_val); - } -} - -/****************************************************************************/ -static void -add_rtp_packet(struct _rtp_info *rtp_info, packet_info *pinfo) -{ - rtp_stream_info_t *stream_info = NULL; - rtp_packet_t *new_rtp_packet; - GString *key_str = NULL; - - /* create the the streams hash if it doen't exist */ - if (!rtp_streams_hash) - rtp_streams_hash = g_hash_table_new_full( g_str_hash, g_str_equal, rtp_key_destroy, rtp_stream_value_destroy); - - /* Create a hash key to lookup in the RTP streams hash table - * uses: src_ip:src_port dst_ip:dst_port ssrc - */ - key_str = g_string_new(""); - g_string_printf(key_str, "%s:%d %s:%d %d", get_addr_name(&(pinfo->src)), - pinfo->srcport, get_addr_name(&(pinfo->dst)), - pinfo->destport, rtp_info->info_sync_src ); - - /* lookup for this rtp packet in the stream hash table*/ - stream_info = g_hash_table_lookup( rtp_streams_hash, key_str->str); - - /* if it is not in the hash table, create a new stream */ - if (stream_info==NULL) { - stream_info = g_malloc(sizeof(rtp_stream_info_t)); - COPY_ADDRESS(&(stream_info->src_addr), &(pinfo->src)); - stream_info->src_port = pinfo->srcport; - COPY_ADDRESS(&(stream_info->dest_addr), &(pinfo->dst)); - stream_info->dest_port = pinfo->destport; - stream_info->ssrc = rtp_info->info_sync_src; - stream_info->rtp_packets_list = NULL; - stream_info->first_frame_number = pinfo->fd->num; - stream_info->start_time = nstime_to_msec(&pinfo->fd->rel_ts); - stream_info->call_num = 0; - stream_info->play = FALSE; - stream_info->num_packets = 0; - - g_hash_table_insert(rtp_streams_hash, g_strdup(key_str->str), stream_info); - - /* Add the element to the List too. The List is used to decode the packets because it is sordted */ - rtp_streams_list = g_list_append(rtp_streams_list, stream_info); - } - - /* increment the number of packets in this stream, this is used for the progress bar and statistics*/ - stream_info->num_packets++; - - /* Add the RTP packet to the list */ - new_rtp_packet = g_malloc(sizeof(rtp_packet_t)); - new_rtp_packet->info = g_malloc(sizeof(struct _rtp_info)); - - memcpy(new_rtp_packet->info, rtp_info, sizeof(struct _rtp_info)); - new_rtp_packet->arrive_offset = nstime_to_msec(&pinfo->fd->rel_ts) - stream_info->start_time; - /* copy the RTP payload to the rtp_packet to be decoded later */ - if (rtp_info->info_payload_len) { - new_rtp_packet->payload_data = g_malloc(rtp_info->info_payload_len); - memcpy(new_rtp_packet->payload_data, &(rtp_info->info_data[rtp_info->info_payload_offset]), rtp_info->info_payload_len); - } else { - new_rtp_packet->payload_data = NULL; - } - - stream_info->rtp_packets_list = g_list_append(stream_info->rtp_packets_list, new_rtp_packet); - - g_string_free(key_str, TRUE); -} - -/****************************************************************************/ -/* Mark the RTP stream to be played. Use the voip_calls graph to see if the - * setup_frame is there and then if the associated voip_call is selected. - */ -static void -mark_rtp_stream_to_play(gchar *key _U_ , rtp_stream_info_t *rsi, gpointer ptr _U_) -{ - GList* graph_list; - graph_analysis_item_t *graph_item; - GList* voip_calls_list; - voip_calls_info_t *tmp_voip_call; - - /* Reset the "to be play" value because the user can close and reopen the Listen RTP window - * and the streams are nor reset in that case - */ - rsi->play = FALSE; - - /* and associate the RTP stream with a call using the first RTP in the stream*/ - graph_list = g_list_first(voip_calls->graph_analysis->list); - while (graph_list) - { - graph_item = graph_list->data; - if (rsi->first_frame_number == graph_item->frame_num) { - rsi->call_num = graph_item->conv_num; - /* if it is in the graph list, then check if the voip_call is selected */ - voip_calls_list = g_list_first(voip_calls->strinfo_list); - while (voip_calls_list) - { - tmp_voip_call = voip_calls_list->data; - if ( (tmp_voip_call->call_num == rsi->call_num) && (tmp_voip_call->selected == TRUE) ) { - rsi->play = TRUE; - total_packets += rsi->num_packets; - break; - } - voip_calls_list = g_list_next(voip_calls_list); - } - break; - } - graph_list = g_list_next(graph_list); - } -} - - -/****************************************************************************/ -/* Decode a RTP packet - * Return the number of decoded bytes - */ -static int -decode_rtp_packet(rtp_packet_t *rp, rtp_channel_info_t *rci, SAMPLE **out_buff) -{ - unsigned int payload_type; - SAMPLE *tmp_buff = NULL; - int decoded_bytes = 0; - - if ((rp->payload_data == NULL) || (rp->info->info_payload_len == 0) ) { - return 0; - } - - payload_type = rp->info->info_payload_type; - switch (payload_type) { - case 0: /* G711 Ulaw */ - tmp_buff = malloc(sizeof(SAMPLE) * rp->info->info_payload_len * 1); - decodeG711u(rp->payload_data, rp->info->info_payload_len, - tmp_buff, &decoded_bytes); - break; - case 8: /* G711 Alaw */ - tmp_buff = malloc(sizeof(SAMPLE) * rp->info->info_payload_len * 1); - decodeG711a(rp->payload_data, rp->info->info_payload_len, - tmp_buff, &decoded_bytes); - break; -#ifdef HAVE_G729_G723 - case 18: /* G729 */ - tmp_buff = malloc(sizeof(SAMPLE) * rp->info->info_payload_len * 8); /* G729 8kbps => 64kbps/8kbps = 8 */ - decodeG729(rp->payload_data, rp->info->info_payload_len, - tmp_buff, &decoded_bytes); - break; - case 4: /* G723 */ - - if (rp->info->info_payload_len%24 == 0) /* G723 High 6.4kbps */ - tmp_buff = malloc(sizeof(SAMPLE) * rp->info->info_payload_len * 10); /* G723 High 64kbps/6.4kbps = 10 */ - else if (rp->info->info_payload_len%20 == 0) /* G723 Low 5.3kbps */ - tmp_buff = malloc(sizeof(SAMPLE) * rp->info->info_payload_len * 13); /* G723 High 64kbps/5.3kbps = 13 */ - else { - return 0; - } - decodeG723(rp->payload_data, rp->info->info_payload_len, - tmp_buff, &decoded_bytes); - break; -#endif - } - - *out_buff = tmp_buff; - return decoded_bytes; -} - -/****************************************************************************/ -void -update_progress_bar(gfloat percentage) -{ - - gtk_progress_bar_update(GTK_PROGRESS_BAR(progress_bar), percentage); - - /* Force gtk to redraw the window before starting decoding the packet */ - while (gtk_events_pending()) - gtk_main_iteration(); -} - -/****************************************************************************/ -/* Decode the RTP streams and add them to the RTP channels struct - */ -static void -decode_rtp_stream(rtp_stream_info_t *rsi, gpointer ptr _U_) -{ - GString *key_str = NULL; - rtp_channel_info_t *rci; - gboolean first = TRUE; - GList* rtp_packets_list; - rtp_packet_t *rp; - - int i; - double rtp_time; - double rtp_time_prev; - double arrive_time; - double arrive_time_prev; - double start_time; - double start_rtp_time; - double diff; - double pack_period; - double total_time; - double total_time_prev; - gint32 silence_frames; - int seq; - double delay; - double prev_diff; - double mean_delay; - double variation; - int decoded_bytes; - int decoded_bytes_prev; - int jitter_buff; - SAMPLE *out_buff = NULL; - sample_t silence; - sample_t sample; - guint8 status; - guint32 start_timestamp; - - guint32 progbar_nextstep; - int progbar_quantum; - gfloat progbar_val; - - silence.val = 0; - silence.status = S_NORMAL; - - /* skip it if we are not going to play it */ - if (rsi->play == FALSE) { - return; - } - - /* get the static jitter buffer from the spinner gui */ - jitter_buff = (int) gtk_spin_button_get_value((GtkSpinButton * )jitter_spinner); - - /* Create a hash key to lookup in the RTP channels hash - * uses: src_ip:src_port dst_ip:dst_port call_num - */ - key_str = g_string_new(""); - g_string_printf(key_str, "%s:%d %s:%d %d", get_addr_name(&(rsi->src_addr)), - rsi->src_port, get_addr_name(&(rsi->dest_addr)), - rsi->dest_port, rsi->call_num ); - - /* create the rtp_channels_hash table if it doesn't exist */ - if (!rtp_channels_hash) { - rtp_channels_hash = g_hash_table_new_full( g_str_hash, g_str_equal, rtp_key_destroy, rtp_channel_value_destroy); - } - - /* lookup for this stream in the channel hash table */ - rci = g_hash_table_lookup( rtp_channels_hash, key_str->str); - - /* ..if it is not in the hash, create an entry */ - if (rci == NULL) { - rci = malloc(sizeof(rtp_channel_info_t)); - rci->call_num = rsi->call_num; - rci->start_time = rsi->start_time; - rci->end_time = rsi->start_time; - rci->selected = FALSE; - rci->frame_index = 0; - rci->drop_by_jitter_buff = 0; - rci->out_of_seq = 0; - rci->max_frame_index = 0; - rci->samples = g_array_new (FALSE, FALSE, sizeof(sample_t)); - rci->check_bt = NULL; - rci->separator = NULL; - rci->draw_area = NULL; - rci->pixmap = NULL; - rci->h_scrollbar_adjustment = NULL; - rci->cursor_pixbuf = NULL; - rci->cursor_prev = 0; - rci->cursor_catch = FALSE; - rci->first_stream = rsi; - rci->num_packets = rsi->num_packets; - g_hash_table_insert(rtp_channels_hash, g_strdup(key_str->str), rci); - } else { - /* Add silence between the two streams if needed */ - silence_frames = (gint32)( ((rsi->start_time - rci->end_time)/1000)*SAMPLE_RATE ); - for (i = 0; i< silence_frames; i++) { - g_array_append_val(rci->samples, silence); - } - rci->num_packets += rsi->num_packets; - } - - /* decode the RTP stream */ - first = TRUE; - rtp_time = 0; - decoded_bytes = 0; - decoded_bytes_prev = 0; - silence_frames = 0; - arrive_time = start_time = 0; - arrive_time_prev = 0; - pack_period = 0; - total_time = 0; - total_time_prev = 0; - seq = 0; - delay = 0; - prev_diff = 0; - mean_delay = 0; - variation = 0; - start_timestamp = 0; - - /* we update the progress bar 100 times */ - progbar_quantum = total_packets/100; - progbar_nextstep = progbar_count; - - status = S_NORMAL; - - rtp_packets_list = g_list_first(rsi->rtp_packets_list); - while (rtp_packets_list) - { - - if (progbar_count >= progbar_nextstep) { - g_assert(total_packets > 0); - - progbar_val = (gfloat) progbar_count / total_packets; - - update_progress_bar(progbar_val); - - progbar_nextstep += progbar_quantum; - } - - - rp = rtp_packets_list->data; - if (first == TRUE) { - start_timestamp = rp->info->info_timestamp; /* defined start_timestmp to avoid overflow in timestamp. TODO: handle the timestamp correctly */ - start_rtp_time = 0; - rtp_time_prev = start_rtp_time; - first = FALSE; - seq = rp->info->info_seq_num - 1; - } - - decoded_bytes = decode_rtp_packet(rp, rci, &out_buff); - if (decoded_bytes == 0) { - seq = rp->info->info_seq_num; - } - - rtp_time = (double)(rp->info->info_timestamp-start_timestamp)/SAMPLE_RATE - start_rtp_time; - arrive_time = (double)rp->arrive_offset/1000 - start_time; - - if (rp->info->info_seq_num != seq+1){ - rci->out_of_seq++; - status = S_WRONG_SEQ; - } - seq = rp->info->info_seq_num; - - diff = arrive_time - rtp_time; - - delay = diff - prev_diff; - prev_diff = diff; - if (delay<0) delay = -delay; - - if (diff<0) diff = -diff; - - total_time = (double)rp->arrive_offset/1000; - - printf("seq = %d arr = %f abs_diff = %f index = %d tim = %f ji=%d jb=%f\n",rp->info->info_seq_num, - total_time, diff, rci->samples->len, ((double)rci->samples->len/8000 - total_time)*1000, 0, - (mean_delay + 4*variation)*1000); - fflush(stdout); - - /* if the jitter buffer was exceded */ - if ( diff*1000 > jitter_buff ) { - printf("Packet drop by jitter buffer exceded\n"); - rci->drop_by_jitter_buff++; - status = S_DROP_BY_JITT; - - /* if there was a silence period (more than two packetization period) resync the source */ - if ( (rtp_time - rtp_time_prev) > pack_period*2 ){ - printf("Resync...\n"); - - silence_frames = (gint32)((arrive_time - arrive_time_prev)*SAMPLE_RATE - decoded_bytes_prev/2); - for (i = 0; i< silence_frames; i++) { - silence.status = status; - g_array_append_val(rci->samples, silence); - - /* only mark the fisrt in the silence that has the previos problem (S_DROP_BY_JITT or S_WRONG_SEQ ) */ - status = S_NORMAL; - } - - decoded_bytes_prev = 0; - start_timestamp = rp->info->info_timestamp; /* defined start_timestmp to avoid overflow in timestamp. TODO: handle the timestamp correctly */ - start_rtp_time = 0; - start_time = (double)rp->arrive_offset/1000; - rtp_time_prev = 0; - } - } else { - /* Add silence if it is necessary */ - silence_frames = (gint32)((rtp_time - rtp_time_prev)*SAMPLE_RATE - decoded_bytes_prev/2); - for (i = 0; i< silence_frames; i++) { - silence.status = status; - g_array_append_val(rci->samples, silence); - - /* only mark the fisrt in the silence that has the previos problem (S_DROP_BY_JITT or S_WRONG_SEQ ) */ - status = S_NORMAL; - } - - status = S_NORMAL; - - /* Add the audio */ - for (i = 0; i< (decoded_bytes/2); i++) { - sample.val = out_buff[i]; - sample.status = status; - g_array_append_val(rci->samples, sample); - } - - rtp_time_prev = rtp_time; - pack_period = (double)(decoded_bytes/2)/SAMPLE_RATE; - decoded_bytes_prev = decoded_bytes; - arrive_time_prev = arrive_time; - - } - - rtp_packets_list = g_list_next (rtp_packets_list); - progbar_count++; - } - rci->max_frame_index = rci->samples->len; - rci->end_time = rci->start_time + ((double)rci->samples->len/SAMPLE_RATE)*1000; - - g_string_free(key_str, TRUE); -} - -/****************************************************************************/ -static gint -h_scrollbar_changed(GtkWidget *widget _U_, gpointer user_data) -{ - rtp_channel_info_t *rci = (rtp_channel_info_t *)user_data; - rci->cursor_catch = TRUE; - return TRUE; -} - -static gboolean draw_cursors(gpointer *data); - -/****************************************************************************/ -static void -stop_channels() -{ - PaError err; - GtkWidget *dialog; - - /* we should never be here if we are already in STOP */ - if(rtp_channels->stop){ - exit(10); - } - - rtp_channels->stop = TRUE; - /* force a draw_cursor to stop it */ - draw_cursors(NULL); - - err = Pa_StopStream(pa_stream); - - if( err != paNoError ) { - dialog = gtk_message_dialog_new ((GtkWindow *) listen_rtp_dlg_w, - GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR,GTK_BUTTONS_CLOSE, - "Can not Stop Stream in PortAduio Library.\n Error: %s", Pa_GetErrorText( err )); - gtk_dialog_run (GTK_DIALOG (dialog)); - gtk_widget_destroy (dialog); - return; - } - - rtp_channels->start_index[0] = 0; - rtp_channels->start_index[1] = 0; - rtp_channels->end_index[0] = 0; - rtp_channels->end_index[1] = 0; - rtp_channels->max_frame_index = 0; - rtp_channels->frame_index = 0; - rtp_channels->pause = FALSE; - rtp_channels->pause_duration = 0; - rtp_channels->stop = TRUE; - rtp_channels->out_diff_time = 10000; - - if (rtp_channels->rci[0]) rtp_channels->rci[0]->frame_index = 0; - if (rtp_channels->rci[1]) rtp_channels->rci[1]->frame_index = 0; - - /* set the sensitive state of the buttons (decode, play, pause, stop) */ - bt_state(TRUE, TRUE, FALSE, FALSE); - -} - -/****************************************************************************/ -/* Draw a cursor in a channel graph - */ -static void -draw_channel_cursor(rtp_channel_info_t *rci, guint32 start_index) -{ - PaTimestamp index; - int i; - - if (!rci) return; - - index = Pa_StreamTime( pa_stream ) - rtp_channels->pause_duration - rtp_channels->out_diff_time - start_index; - - - /* If we finished playing both channels, then stop them */ - if ( (rtp_channels && (!rtp_channels->stop) && (!rtp_channels->pause)) && (index > rtp_channels->max_frame_index) ) { - stop_channels(); - return; - } - - /* If only this channel finished, then return */ - if (index > rci->max_frame_index) { - return; - } - - /* draw the previous saved pixbuf line */ - if (rci->cursor_pixbuf) { - - gdk_draw_pixbuf(rci->pixmap, NULL, rci->cursor_pixbuf, 0, 0, (int) (rci->cursor_prev/MULT), 0, -1, -1, GDK_RGB_DITHER_NONE, 0 ,0); - - gdk_draw_drawable(rci->draw_area->window, - rci->draw_area->style->fg_gc[GTK_WIDGET_STATE(rci->draw_area)], - rci->pixmap, - (int) (rci->cursor_prev/MULT), 0, - (int) (rci->cursor_prev/MULT), 0, - 1, rci->draw_area->allocation.height-HEIGHT_TIME_LABEL); - - g_object_unref(rci->cursor_pixbuf); - } - - rci->cursor_pixbuf = gdk_pixbuf_get_from_drawable(NULL, rci->pixmap, NULL, (int) (index/MULT), 0, 0, 0, 1, rci->draw_area->allocation.height-HEIGHT_TIME_LABEL); - - gdk_draw_line(rci->pixmap, rci->draw_area->style->black_gc, - (int) (index/MULT), - 0, - (int) (index/MULT), - rci->draw_area->allocation.height-HEIGHT_TIME_LABEL); - - gdk_draw_drawable(rci->draw_area->window, - rci->draw_area->style->fg_gc[GTK_WIDGET_STATE(rci->draw_area)], - rci->pixmap, - (int) (index/MULT), 0, - (int) (index/MULT), 0, - 1, rci->draw_area->allocation.height-HEIGHT_TIME_LABEL); - - /* Disconnect the scroll bar "value" signal to not be called */ - SIGNAL_DISCONNECT_BY_FUNC(rci->h_scrollbar_adjustment, h_scrollbar_changed, rci); - - /* Move the horizontal scroll bar */ -/* if ( (rci->cursor_prev/MULT < (rci->h_scrollbar_adjustment->value+rci->h_scrollbar_adjustment->page_increment)) && - (index/MULT >= (rci->h_scrollbar_adjustment->value+rci->h_scrollbar_adjustment->page_increment)) ){ - for (i=1; i<10; i++) { - rci->h_scrollbar_adjustment->value += rci->h_scrollbar_adjustment->page_size/10; - gtk_adjustment_value_changed(rci->h_scrollbar_adjustment); - } - - } -*/ - if (!rci->cursor_catch) { - if (index/MULT < rci->h_scrollbar_adjustment->page_size/2) { - rci->h_scrollbar_adjustment->value = rci->h_scrollbar_adjustment->lower; - } else if (index/MULT > (rci->h_scrollbar_adjustment->upper - rci->h_scrollbar_adjustment->page_size/2)) { - rci->h_scrollbar_adjustment->value = rci->h_scrollbar_adjustment->upper - rci->h_scrollbar_adjustment->page_size; - } else { - rci->h_scrollbar_adjustment->value = index/MULT - rci->h_scrollbar_adjustment->page_size/2; - } - - gtk_adjustment_value_changed(rci->h_scrollbar_adjustment); - } else if ( (rci->cursor_prev/MULT < (rci->h_scrollbar_adjustment->value+rci->h_scrollbar_adjustment->page_increment)) && - (index/MULT >= (rci->h_scrollbar_adjustment->value+rci->h_scrollbar_adjustment->page_increment)) ){ - rci->cursor_catch = FALSE; - for (i=1; i<10; i++) { - rci->h_scrollbar_adjustment->value = min(rci->h_scrollbar_adjustment->upper-rci->h_scrollbar_adjustment->page_size, rci->h_scrollbar_adjustment->value + (rci->h_scrollbar_adjustment->page_size/20)); - gtk_adjustment_value_changed(rci->h_scrollbar_adjustment); - } - - } - - - /* Connect back the "value" scroll signal */ - SIGNAL_CONNECT(rci->h_scrollbar_adjustment, "value_changed", h_scrollbar_changed, rci); - - -/* if (index/MULT < rci->h_scrollbar_adjustment->page_increment) { - rci->h_scrollbar_adjustment->value = rci->h_scrollbar_adjustment->lower; - } else if (index/MULT > (rci->h_scrollbar_adjustment->upper - rci->h_scrollbar_adjustment->page_size + rci->h_scrollbar_adjustment->page_increment)) { - rci->h_scrollbar_adjustment->value = rci->h_scrollbar_adjustment->upper - rci->h_scrollbar_adjustment->page_size; - } else { - if ( (index/MULT < rci->h_scrollbar_adjustment->value) || (index/MULT > (rci->h_scrollbar_adjustment->value+rci->h_scrollbar_adjustment->page_increment)) ){ - rci->h_scrollbar_adjustment->value = index/MULT; - } - } -*/ - -/* if (index/MULT < rci->h_scrollbar_adjustment->page_size/2) { - rci->h_scrollbar_adjustment->value = rci->h_scrollbar_adjustment->lower; - } else if (index/MULT > (rci->h_scrollbar_adjustment->upper - rci->h_scrollbar_adjustment->page_size/2)) { - rci->h_scrollbar_adjustment->value = rci->h_scrollbar_adjustment->upper - rci->h_scrollbar_adjustment->page_size; - } else { - rci->h_scrollbar_adjustment->value = index/MULT - rci->h_scrollbar_adjustment->page_size/2; - } -*/ -/* gtk_adjustment_value_changed(rci->h_scrollbar_adjustment); -*/ - rci->cursor_prev = index; -} - -/****************************************************************************/ -/* Move and draw the cursor in the graph - */ -static gboolean -draw_cursors(gpointer *data) -{ - static GdkPixbuf* pixbuf = NULL; - static PaTimestamp prev; - - if (!rtp_channels) return FALSE; - - /* Draw and move each of the two channels */ - draw_channel_cursor(rtp_channels->rci[0], rtp_channels->start_index[0]); - draw_channel_cursor(rtp_channels->rci[1], rtp_channels->start_index[1]); - - if ((rtp_channels->stop) || (rtp_channels->pause)) return FALSE; - - return TRUE; -} - -/****************************************************************************/ -void -init_rtp_channels_vals() -{ - rtp_play_channles_t *rpci = rtp_channels; - - /* if we only have one channel to play, we just use the info from that channel */ - if (rpci->rci[0] == NULL) { - rpci->max_frame_index = rpci->rci[1]->max_frame_index; - rpci->start_index[0] = rpci->max_frame_index; - rpci->start_index[1] = 0; - rpci->end_index[0] = rpci->max_frame_index; - rpci->end_index[1] = rpci->max_frame_index; - } else if (rpci->rci[1] == NULL) { - rpci->max_frame_index = rpci->rci[0]->max_frame_index; - rpci->start_index[1] = rpci->max_frame_index; - rpci->start_index[0] = 0; - rpci->end_index[0] = rpci->max_frame_index; - rpci->end_index[1] = rpci->max_frame_index; - - /* if the two channels are to be played, then we need to sync both based on the start/end time of each one */ - } else { - rpci->max_frame_index = (guint32)(SAMPLE_RATE/1000) * (guint32)(max(rpci->rci[0]->end_time, rpci->rci[1]->end_time) - - (guint32)min(rpci->rci[0]->start_time, rpci->rci[1]->start_time)); - - if (rpci->rci[0]->start_time < rpci->rci[1]->start_time) { - rpci->start_index[0] = 0; - rpci->start_index[1] = (guint32)(SAMPLE_RATE/1000) * (guint32)(rpci->rci[1]->start_time - rpci->rci[0]->start_time); - } else { - rpci->start_index[1] = 0; - rpci->start_index[0] = (guint32)(SAMPLE_RATE/1000) * (guint32)(rpci->rci[0]->start_time - rpci->rci[1]->start_time); - } - - if (rpci->rci[0]->end_time < rpci->rci[1]->end_time) { - rpci->end_index[0] = rpci->max_frame_index - ((guint32)(SAMPLE_RATE/1000) * (guint32)(rpci->rci[1]->end_time - rpci->rci[0]->end_time)); - rpci->end_index[1] = rpci->max_frame_index; - } else { - rpci->end_index[1] = rpci->max_frame_index - ((guint32)(SAMPLE_RATE/1000) * (guint32)(rpci->rci[0]->end_time - rpci->rci[1]->end_time)); - rpci->end_index[0] = rpci->max_frame_index; - } - } -} - - -/****************************************************************************/ -/* This routine will be called by the PortAudio engine when audio is needed. - * It may called at interrupt level on some machines so don't do anything - * that could mess up the system like calling malloc() or free(). - */ -static int paCallback( void *inputBuffer, void *outputBuffer, - unsigned long framesPerBuffer, - PaTimestamp outTime, void *userData) -{ - rtp_play_channles_t *rpci = (rtp_play_channles_t*)userData; - SAMPLE *wptr = (SAMPLE*)outputBuffer; - sample_t sample; - unsigned int i; - int finished; - unsigned int framesLeft; - int framesToPlay; - - /* if it is pasued, we keep the stream running but with silence only */ - if (rtp_channels->pause) { - for(i=0; i<framesPerBuffer; i++ ) { - *wptr++ = 0; - *wptr++ = 0; - } - rtp_channels->pause_duration += framesPerBuffer; - return 0; - } - - rpci->out_diff_time = outTime - Pa_StreamTime(pa_stream) ; - - - /* set the values if this is the first time */ - if (rpci->max_frame_index == 0) { - init_rtp_channels_vals(); - - } - - framesLeft = rpci->max_frame_index - rpci->frame_index; - - (void) inputBuffer; /* Prevent unused variable warnings. */ - (void) outTime; - - if( framesLeft < framesPerBuffer ) - { - framesToPlay = framesLeft; - finished = 1; - } - else - { - framesToPlay = framesPerBuffer; - finished = 0; - } - - for( i=0; i<(unsigned int)framesToPlay; i++ ) - { - if (rpci->rci[0] && ( (rpci->frame_index >= rpci->start_index[0]) && (rpci->frame_index <= rpci->end_index[0]) )) { - sample = g_array_index(rpci->rci[0]->samples, sample_t, rpci->rci[0]->frame_index++); - *wptr++ = sample.val; - } else { - *wptr++ = 0; - } - - if (rpci->rci[1] && ( (rpci->frame_index >= rpci->start_index[1]) && (rpci->frame_index <= rpci->end_index[1]) )) { - sample = g_array_index(rpci->rci[1]->samples, sample_t, rpci->rci[1]->frame_index++); - *wptr++ = sample.val; - } else { - *wptr++ = 0; - } - } - for( ; i<framesPerBuffer; i++ ) - { - *wptr++ = 0; - *wptr++ = 0; - } - rpci->frame_index += framesToPlay; - - return finished; -} - -/****************************************************************************/ -static void -on_bt_check_clicked(GtkButton *button _U_, gpointer user_data _U_) -{ - rtp_channel_info_t *rci = user_data; - - if (rci->selected) { - if (rtp_channels->rci[0] == rci) { - rtp_channels->rci[0] = NULL; - rtp_channels->channel = 0; - } else { - rtp_channels->rci[1] = NULL; - rtp_channels->channel = 1; - } - } else { - /* if there are already both channels selected, unselect the old one */ - if (rtp_channels->rci[rtp_channels->channel]) { - /* we disconnect the signal temporarly to avoid been called back */ - SIGNAL_DISCONNECT_BY_FUNC(rtp_channels->rci[rtp_channels->channel]->check_bt, on_bt_check_clicked, rtp_channels->rci[rtp_channels->channel]); - gtk_toggle_button_set_active((GtkToggleButton *)rtp_channels->rci[rtp_channels->channel]->check_bt, FALSE); - SIGNAL_CONNECT(rtp_channels->rci[rtp_channels->channel]->check_bt, "clicked", on_bt_check_clicked, rtp_channels->rci[rtp_channels->channel]); - rtp_channels->rci[rtp_channels->channel]->selected = FALSE; - } - - rtp_channels->rci[rtp_channels->channel] = rci; - rtp_channels->channel = !(rtp_channels->channel); - } - - rci->selected = !(rci->selected); - - /* set the sensitive state of the buttons (decode, play, pause, stop) */ - bt_state(TRUE, TRUE, FALSE, FALSE); -} - -/****************************************************************************/ -static void channel_draw(rtp_channel_info_t* rci) -{ - int i,j; - sample_t sample; - SAMPLE min, max; - PangoLayout *small_layout; - guint32 label_width, label_height; - char label_string[MAX_TIME_LABEL]; - double offset; - guint32 progbar_nextstep; - int progbar_quantum; - gfloat progbar_val; - guint status; - GdkGC *gc; - GdkGC *red_gc; - GdkColor red_color = {0, 65535, 0, 0}; - - if (GDK_IS_DRAWABLE(rci->pixmap)) { - /* Clear out old plot */ - gdk_draw_rectangle(rci->pixmap, - rci->bg_gc[1+rci->call_num%MAX_NUM_COL_CONV], - TRUE, - 0, 0, - rci->draw_area->allocation.width, - rci->draw_area->allocation.height); - - small_layout = gtk_widget_create_pango_layout(rci->draw_area, label_string); - pango_layout_set_font_description(small_layout, pango_font_description_from_string("Helvetica,Sans,Bold 7")); - - /* calculated the pixel offset to display integer seconds */ - offset = ((double)rci->start_time/1000 - floor((double)rci->start_time/1000))*SAMPLE_RATE/MULT; - - gdk_draw_line(rci->pixmap, rci->draw_area->style->black_gc, - 0, - rci->draw_area->allocation.height-HEIGHT_TIME_LABEL, - rci->draw_area->allocation.width, - rci->draw_area->allocation.height-HEIGHT_TIME_LABEL); - - /* we update the progress bar 100 times */ - progbar_quantum = (total_frames/MULT)/100; - progbar_nextstep = progbar_count; - - red_gc = gdk_gc_new(rci->draw_area->window); - gdk_gc_set_rgb_fg_color(red_gc, &red_color); - - for (i=0; i< min(rci->draw_area->allocation.width,(gint)(rci->samples->len/MULT)); i++) { - sample.val = 0; - status = S_NORMAL; - max=(SAMPLE)0xFFFF; - min=(SAMPLE)0x7FFF; - - if (progbar_count >= progbar_nextstep) { - g_assert(total_frames > 0); - - progbar_val = (gfloat) progbar_count / (total_frames/MULT); - - update_progress_bar(progbar_val); - - progbar_nextstep += progbar_quantum; - } - - for (j=0; j<MULT; j++) { - sample = g_array_index(rci->samples, sample_t, i*MULT+j); - max = max(max, sample.val); - min = min(min, sample.val); - if (sample.status == S_DROP_BY_JITT) status = S_DROP_BY_JITT; - } - - if (status == S_DROP_BY_JITT) { - gc = red_gc; - } else { - gc = rci->draw_area->style->black_gc; - } - - gdk_draw_line(rci->pixmap, gc, - i, - (gint)(( (0x7FFF+min) * (rci->draw_area->allocation.height-HEIGHT_TIME_LABEL))/0xFFFF), - i, - (gint)(( (0x7FFF+max) * (rci->draw_area->allocation.height-HEIGHT_TIME_LABEL))/0xFFFF)); - - /*draw the time label and grid */ - if ( !((i*MULT)%(SAMPLE_RATE)) ) { - gdk_draw_line(rci->pixmap, rci->draw_area->style->black_gc, - (int) (i - offset), - rci->draw_area->allocation.height-HEIGHT_TIME_LABEL, - (int) (i - offset), - rci->draw_area->allocation.height-HEIGHT_TIME_LABEL+4); - - g_snprintf(label_string, MAX_TIME_LABEL, "%.0f", floor(rci->start_time/1000) + i*MULT/SAMPLE_RATE); - - pango_layout_set_text(small_layout, label_string, -1); - pango_layout_get_pixel_size(small_layout, &label_width, &label_height); - gdk_draw_layout(rci->pixmap, - rci->draw_area->style->black_gc, - (int) (i - offset - label_width/2), - rci->draw_area->allocation.height - label_height, - small_layout); - /* draw the 1/2 sec grid */ - } else if ( !((i*MULT)%(SAMPLE_RATE/2)) ) { - gdk_draw_line(rci->pixmap, rci->draw_area->style->black_gc, - (int) (i - offset), - rci->draw_area->allocation.height-HEIGHT_TIME_LABEL, - (int) (i - offset), - rci->draw_area->allocation.height-HEIGHT_TIME_LABEL+2); - - } - - progbar_count++; - } - } - -} -/****************************************************************************/ -static gint expose_event_channels(GtkWidget *widget, GdkEventExpose *event) -{ - rtp_channel_info_t *rci; - - rci=(rtp_channel_info_t *)OBJECT_GET_DATA(widget, "rtp_channel_info_t"); - if(!rci){ - exit(10); - } - - if (GDK_IS_DRAWABLE(widget->window)) - gdk_draw_drawable(widget->window, - widget->style->fg_gc[GTK_WIDGET_STATE(widget)], - rci->pixmap, - event->area.x, event->area.y, - event->area.x, event->area.y, - event->area.width, event->area.height); - - return FALSE; -} - -/****************************************************************************/ -static gint -configure_event_channels(GtkWidget *widget, GdkEventConfigure *event _U_) -{ - rtp_channel_info_t *rci; - int i; - - /* the first calor is blue to highlight the selected item - * the other collors are the same as in the Voip Graph analysys - * to match the same calls - */ - static GdkColor col[MAX_NUM_COL_CONV+1] = { - {0, 0x00FF, 0x00FF, 0xFFFF}, - {0, 0x33FF, 0xFFFF, 0x33FF}, - {0, 0x00FF, 0xCCFF, 0xCCFF}, - {0, 0x66FF, 0xFFFF, 0xFFFF}, - {0, 0x99FF, 0x66FF, 0xFFFF}, - {0, 0xFFFF, 0xFFFF, 0x33FF}, - {0, 0xCCFF, 0x99FF, 0xFFFF}, - {0, 0xCCFF, 0xFFFF, 0x33FF}, - {0, 0xFFFF, 0xCCFF, 0xCCFF}, - {0, 0xFFFF, 0x99FF, 0x66FF}, - {0, 0xFFFF, 0xFFFF, 0x99FF} - }; - - rci=(rtp_channel_info_t *)OBJECT_GET_DATA(widget, "rtp_channel_info_t"); - if(!rci){ - exit(10); - } - - if(rci->pixmap){ - g_object_unref(rci->pixmap); - rci->pixmap=NULL; - } - - rci->pixmap = gdk_pixmap_new(widget->window, - widget->allocation.width, - widget->allocation.height, - -1); - - if ( GDK_IS_DRAWABLE(rci->pixmap) ) - gdk_draw_rectangle(rci->pixmap, - widget->style->white_gc, - TRUE, - 0, 0, - widget->allocation.width, - widget->allocation.height); - - /* create gcs for the background color of each channel */ - for (i=0; i<MAX_NUM_COL_CONV+1; i++){ - rci->bg_gc[i]=gdk_gc_new(rci->pixmap); - gdk_gc_set_rgb_fg_color(rci->bg_gc[i], &col[i]); - } - - channel_draw(rci); - - return TRUE; -} - -/****************************************************************************/ -static gint -button_press_event_channel(GtkWidget *widget, GdkEventButton *event _U_) -{ - rtp_channel_info_t *rci; - int this_channel; - guint32 prev_index; - - rci=(rtp_channel_info_t *)OBJECT_GET_DATA(widget, "rtp_channel_info_t"); - if(!rci){ - exit(10); - } - - if (!rci->selected) { - - /* only select a new channels if we are in STOP */ - if (!rtp_channels->stop) return 0; - - /* if there are already both channels selected, unselect the old one */ - if (rtp_channels->rci[rtp_channels->channel]) { - /* we disconnect the signal temporarly to avoid been called back */ - SIGNAL_DISCONNECT_BY_FUNC(rtp_channels->rci[rtp_channels->channel]->check_bt, on_bt_check_clicked, rtp_channels->rci[rtp_channels->channel]); - gtk_toggle_button_set_active((GtkToggleButton *) rtp_channels->rci[rtp_channels->channel]->check_bt, FALSE); - SIGNAL_CONNECT(rtp_channels->rci[rtp_channels->channel]->check_bt, "clicked", on_bt_check_clicked, rtp_channels->rci[rtp_channels->channel]); - rtp_channels->rci[rtp_channels->channel]->selected = FALSE; - } - - /* we disconnect the signal temporarly to avoid been called back */ - SIGNAL_DISCONNECT_BY_FUNC(rci->check_bt, on_bt_check_clicked, rci); - gtk_toggle_button_set_active((GtkToggleButton *) rci->check_bt, TRUE); - SIGNAL_CONNECT(rci->check_bt, "clicked", on_bt_check_clicked, rci); - - rtp_channels->rci[rtp_channels->channel] = rci; - rtp_channels->channel = !(rtp_channels->channel); - rci->selected = TRUE; - - /* set the sensitive state of the buttons (decode, play, pause, stop) */ - bt_state(TRUE, TRUE, FALSE, FALSE); - } - - if (rci == rtp_channels->rci[0]) { - this_channel = 0; - } else { - this_channel = 1; - } - - rci->frame_index = (unsigned int) (event->x * MULT); - - prev_index = rtp_channels->frame_index; - rtp_channels->frame_index = rtp_channels->start_index[this_channel] + rci->frame_index; - rtp_channels->pause_duration += prev_index - rtp_channels->frame_index; - - - - /* change the index in the other channel if selected, according with the index position */ - if (rtp_channels->rci[!this_channel]) { - init_rtp_channels_vals(); - - if (rtp_channels->frame_index < rtp_channels->start_index[!this_channel]) { - rtp_channels->rci[!this_channel]->frame_index = 0; - } else if (rtp_channels->frame_index > rtp_channels->end_index[!this_channel]) { - rtp_channels->rci[!this_channel]->frame_index = rtp_channels->rci[!this_channel]->max_frame_index; - } else { - rtp_channels->rci[!this_channel]->frame_index = rtp_channels->frame_index - rtp_channels->start_index[!this_channel]; - } - } else { - init_rtp_channels_vals(); - } - - rtp_channels->out_diff_time = 0; - - rci->cursor_catch = TRUE; - - /* redraw the cusrsor */ - draw_cursors(NULL); - - return TRUE; -} - -/****************************************************************************/ -static void -/*add_channel_to_window(gchar *key _U_ , rtp_channel_info_t *rci, gpointer ptr _U_ ) */ -add_channel_to_window(gchar *key _U_ , rtp_channel_info_t *rci, guint *counter _U_ ) -{ - GString *label = NULL; - GtkWidget *viewport; - - - /* create the channel draw area */ - rci->draw_area=gtk_drawing_area_new(); - - rci->scroll_window=gtk_scrolled_window_new(NULL, NULL); - - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (rci->scroll_window), GTK_POLICY_ALWAYS, GTK_POLICY_NEVER); - rci->h_scrollbar_adjustment = gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(rci->scroll_window)); - - - gtk_widget_set_size_request(rci->draw_area, (gint)(rci->samples->len/MULT), CHANNEL_HEIGHT); - - - viewport = gtk_viewport_new(rci->h_scrollbar_adjustment, gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(rci->scroll_window))); - gtk_container_add(GTK_CONTAINER(viewport), rci->draw_area); - gtk_container_add(GTK_CONTAINER(rci->scroll_window), viewport); - gtk_viewport_set_shadow_type(GTK_VIEWPORT(viewport), GTK_SHADOW_NONE); - OBJECT_SET_DATA(rci->draw_area, "rtp_channel_info_t", rci); - gtk_widget_add_events (rci->draw_area, GDK_BUTTON_PRESS_MASK); - GTK_WIDGET_SET_FLAGS(rci->draw_area, GTK_CAN_FOCUS); - gtk_widget_grab_focus(rci->draw_area); - - gtk_box_pack_start(GTK_BOX (channels_vb), rci->scroll_window, FALSE, FALSE, 0); - - /* signals needed to handle backing pixmap */ - SIGNAL_CONNECT(rci->draw_area, "expose_event", expose_event_channels, NULL); - SIGNAL_CONNECT(rci->draw_area, "configure_event", configure_event_channels, rci); - gtk_widget_add_events (rci->draw_area, GDK_BUTTON_PRESS_MASK); - SIGNAL_CONNECT(rci->draw_area, "button_press_event", button_press_event_channel, rci); - SIGNAL_CONNECT(rci->h_scrollbar_adjustment, "value_changed", h_scrollbar_changed, rci); - - - label = g_string_new(""); - g_string_printf(label, "From %s:%d to %s:%d Duration:%.2f Drop by Jitter Buff:%d(%.1f%%) Out of Seq: %d(%.1f%%)", get_addr_name(&(rci->first_stream->src_addr)), - rci->first_stream->src_port, get_addr_name(&(rci->first_stream->dest_addr)), rci->first_stream->dest_port, - (double)rci->samples->len/SAMPLE_RATE, rci->drop_by_jitter_buff, (double)rci->drop_by_jitter_buff * 100 / (double)rci->num_packets - , rci->out_of_seq, (double)rci->out_of_seq * 100 / (double)rci->num_packets); - - rci->check_bt = gtk_check_button_new_with_label(label->str); - gtk_box_pack_start(GTK_BOX (channels_vb), rci->check_bt, FALSE, FALSE, 1); - - /* Create the Separator if it is not the last one */ - (*counter)++; - if (*counter < g_hash_table_size(rtp_channels_hash)) { - rci->separator = gtk_hseparator_new(); - gtk_box_pack_start(GTK_BOX (channels_vb), rci->separator, FALSE, FALSE, 5); - } - - SIGNAL_CONNECT(rci->check_bt, "clicked", on_bt_check_clicked, rci); - - g_string_free(label, TRUE); -} - -/****************************************************************************/ -static void -count_channel_frames(gchar *key _U_ , rtp_channel_info_t *rci, gpointer ptr _U_ ) -{ - total_frames += rci->samples->len; -} - -/****************************************************************************/ -static void -play_channels() -{ - PaError err; - GtkWidget *dialog; - - /* we should never be here if we are in PLAY and !PAUSE */ - if(!rtp_channels->stop && !rtp_channels->pause){ - exit(10); - } - - /* if we are in PAUSE change the sate */ - if (rtp_channels->pause) { - rtp_channels->pause = FALSE; - /* set the sensitive state of the buttons (decode, play, pause, stop) */ - bt_state(FALSE, FALSE, TRUE, TRUE); - - /* if not PAUSE, then start to PLAY */ - } else { - err = Pa_OpenStream( - &pa_stream, - paNoDevice, /* default input device */ - 0, /* no input */ - PA_SAMPLE_TYPE, /* 16 bit Integer input */ - NULL, - Pa_GetDefaultOutputDeviceID(), - NUM_CHANNELS, /* Stereo output */ - PA_SAMPLE_TYPE, /* 16 bit Integer output */ - NULL, - SAMPLE_RATE, - FRAMES_PER_BUFFER, - 0, /* number of buffers, if zero then use default minimum */ - paClipOff, /* we won't output out of range samples so don't bother clipping them */ - paCallback, - rtp_channels ); - - if( err != paNoError ) { - dialog = gtk_message_dialog_new ((GtkWindow *) listen_rtp_dlg_w, - GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR,GTK_BUTTONS_CLOSE, - "Can not Open Stream in PortAduio Library.\n Error: %s", Pa_GetErrorText( err )); - gtk_dialog_run (GTK_DIALOG (dialog)); - gtk_widget_destroy (dialog); - return; - } - - err = Pa_StartStream( pa_stream ); - if( err != paNoError ) { - dialog = gtk_message_dialog_new ((GtkWindow *) listen_rtp_dlg_w, - GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR,GTK_BUTTONS_CLOSE, - "Can not Start Stream in PortAduio Library.\n Error: %s", Pa_GetErrorText( err )); - gtk_dialog_run (GTK_DIALOG (dialog)); - gtk_widget_destroy (dialog); - return; - } - - rtp_channels->stop = FALSE; - - /* set the sensitive state of the buttons (decode, play, pause, stop) */ - bt_state(FALSE, FALSE, TRUE, TRUE); - } - - /* Draw the cursor in the graph */ - g_timeout_add_full(G_PRIORITY_DEFAULT_IDLE, MULT*1000/SAMPLE_RATE, draw_cursors, NULL, NULL); - -} - -/****************************************************************************/ -static void -pause_channels() -{ - rtp_channels->pause = !(rtp_channels->pause); - - /* reactivate the cusrosr display if no in pause */ - if (!rtp_channels->pause) { - /* Draw the cursor in the graph */ - g_timeout_add_full(G_PRIORITY_DEFAULT_IDLE, MULT*1000/SAMPLE_RATE, draw_cursors, NULL, NULL); - } - - /* set the sensitive state of the buttons (decode, play, pause, stop) */ - bt_state(FALSE, TRUE, FALSE, TRUE); -} - -/****************************************************************************/ -static void -reset_rtp_channels() -{ - rtp_channels->channel = 0; - rtp_channels->rci[0] = NULL; - rtp_channels->rci[1] = NULL; - rtp_channels->start_index[0] = 0; - rtp_channels->start_index[1] = 0; - rtp_channels->end_index[0] = 0; - rtp_channels->end_index[1] = 0; - rtp_channels->max_frame_index = 0; - rtp_channels->frame_index = 0; - rtp_channels->pause = FALSE; - rtp_channels->pause_duration = 0; - rtp_channels->stop = TRUE; - rtp_channels->out_diff_time = 10000; -} - -/****************************************************************************/ -static void -remove_channel_to_window(gchar *key _U_ , rtp_channel_info_t *rci, gpointer ptr _U_ ) -{ - g_object_unref(rci->pixmap); - gtk_widget_destroy(rci->draw_area); - gtk_widget_destroy(rci->scroll_window); - gtk_widget_destroy(rci->check_bt); - gtk_widget_destroy(rci->separator); -} - -/****************************************************************************/ -static void -reset_channels() -{ - - /* Remove the channels from the main window if there are there */ - g_hash_table_foreach( rtp_channels_hash, (GHFunc)remove_channel_to_window, NULL); - - - /* destroy the rtp channels hash table */ - if (rtp_channels_hash) { - g_hash_table_destroy(rtp_channels_hash); - rtp_channels_hash = NULL; - } - - if (rtp_channels) { - reset_rtp_channels(); - } -} - -/****************************************************************************/ -static void -reset_listen_rtp() -{ - /* Destroy the rtp channels */ - reset_channels(); - - /* destroy the rtp streams hash table */ - if (rtp_streams_hash) { - g_hash_table_destroy(rtp_streams_hash); - rtp_streams_hash = NULL; - } - - /* destroy the rtp streams list */ - if (rtp_streams_list) { - g_list_free (rtp_streams_list); - rtp_streams_list = NULL; - } - -} - -/****************************************************************************/ -static void -decode_streams() -{ - guint statusbar_context; - guint counter; - - /* set the sensitive state of the buttons (decode, play, pause, stop) */ - bt_state(FALSE, FALSE, FALSE, FALSE); - - reset_channels(); - - progress_bar = gtk_progress_bar_new(); - WIDGET_SET_SIZE(progress_bar, 100, -1); - gtk_box_pack_start(GTK_BOX (stat_hbox), progress_bar, FALSE, FALSE, 2); - gtk_widget_show(progress_bar); - statusbar_context = gtk_statusbar_get_context_id((GtkStatusbar *) info_bar, "main"); - gtk_statusbar_push((GtkStatusbar *) info_bar, statusbar_context, " Decoding RTP packets..."); - - gtk_statusbar_set_has_resize_grip(GTK_STATUSBAR(info_bar), FALSE); - - /* reset the number of packet to be decoded, this is used for the progress bar */ - total_packets = 0; - /* reset the Progress Bar count */ - progbar_count = 0; - - /* Mark the RTP streams to be played using the selected VoipCalls*/ - g_hash_table_foreach( rtp_streams_hash, (GHFunc)mark_rtp_stream_to_play, NULL); - - /* Decode the RTP streams and add them to the RTP channels to be played */ - g_list_foreach( rtp_streams_list, (GFunc)decode_rtp_stream, NULL); - - /* reset the number of frames to be displayed, this is used for the progress bar */ - total_frames = 0; - /* Count the frames in all the RTP channels */ - g_hash_table_foreach( rtp_channels_hash, (GHFunc)count_channel_frames, NULL); - - /* reset the Progress Bar count again for the progress of creating the channels view */ - progbar_count = 0; - gtk_statusbar_pop((GtkStatusbar *) info_bar, statusbar_context); - gtk_statusbar_push((GtkStatusbar *) info_bar, statusbar_context, " Creating channels view..."); - - /* Display the RTP channels in the window */ - counter = 0; - g_hash_table_foreach( rtp_channels_hash, (GHFunc)add_channel_to_window, &counter); - - /* Resize the main scroll window to display no more than 5 channels, otherwise the scroll bar need to be used */ - WIDGET_SET_SIZE(main_scrolled_window, CHANNEL_WIDTH, - min(g_hash_table_size(rtp_channels_hash), 5) * (CHANNEL_HEIGHT+60)); - - gtk_widget_show_all(main_scrolled_window); - - gtk_widget_destroy(progress_bar); - gtk_statusbar_set_has_resize_grip(GTK_STATUSBAR(info_bar), TRUE); - gtk_statusbar_pop((GtkStatusbar *) info_bar, statusbar_context); - - /* blank the status label */ - gtk_statusbar_pop((GtkStatusbar *) info_bar, statusbar_context); - - /* set the sensitive state of the buttons (decode, play, pause, stop) */ - bt_state(TRUE, FALSE, FALSE, FALSE); - - /* get the static jitter buffer from the spinner gui */ - new_jitter_buff = (int) gtk_spin_button_get_value((GtkSpinButton * )jitter_spinner); - -} - -/****************************************************************************/ -static void -on_bt_decode_clicked(GtkButton *button _U_, gpointer user_data _U_) -{ - decode_streams(); -} - -/****************************************************************************/ -static void -on_bt_play_clicked(GtkButton *button _U_, gpointer user_data _U_) -{ - play_channels(); -} - -/****************************************************************************/ -static void -on_bt_pause_clicked(GtkButton *button _U_, gpointer user_data _U_) -{ - pause_channels(); -} - -/****************************************************************************/ -static void -on_bt_stop_clicked(GtkButton *button _U_, gpointer user_data _U_) -{ - stop_channels(); -} - -/****************************************************************************/ -static void -listen_rtp_on_destroy(GtkObject *object _U_, gpointer user_data _U_) -{ - /* Stop the channels if necesary */ - if(rtp_channels && (!rtp_channels->stop)){ - stop_channels(); - } - - /* Destroy the rtp channels */ - reset_channels(); - - g_free(rtp_channels); - rtp_channels = NULL; - - initialized = FALSE; - - gtk_widget_destroy(listen_rtp_dlg_w); - main_scrolled_window = NULL; - listen_rtp_dlg_w = NULL; -} - -/****************************************************************************/ -static void -jitter_spinner_value_changed (GtkSpinButton *spinner, gpointer user_data _U_) -{ - /* set the sensitive state of the buttons (decode, play, pause, stop) */ - bt_state(TRUE, TRUE, FALSE, FALSE); -} - -/****************************************************************************/ -static void listen_rtp_dlg_create() -{ - GtkWidget *main_vb; - GtkWidget *hbuttonbox; - GtkWidget *h_jitter_buttons_box; - GtkWidget *bt_close; - GtkAdjustment *jitter_spinner_adj; - GtkWidget *label; - - GtkTooltips *tooltips = gtk_tooltips_new(); - - listen_rtp_dlg_w=gtk_window_new(GTK_WINDOW_TOPLEVEL); - - gtk_window_set_title(GTK_WINDOW(listen_rtp_dlg_w), "Wireshark: Listen RTP"); - gtk_window_set_position(GTK_WINDOW(listen_rtp_dlg_w), GTK_WIN_POS_NONE); - - gtk_window_set_default_size(GTK_WINDOW(listen_rtp_dlg_w), 400, 50); - - main_vb = gtk_vbox_new (FALSE, 0); - gtk_container_add(GTK_CONTAINER(listen_rtp_dlg_w), main_vb); - gtk_container_set_border_width (GTK_CONTAINER (main_vb), 2); - - main_scrolled_window=gtk_scrolled_window_new(NULL, NULL); - gtk_container_set_border_width (GTK_CONTAINER (main_scrolled_window), 4); - WIDGET_SET_SIZE(main_scrolled_window, CHANNEL_WIDTH, 0); - - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (main_scrolled_window), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); - gtk_container_add(GTK_CONTAINER(main_vb), main_scrolled_window); - - channels_vb = gtk_vbox_new (FALSE, 0); - gtk_container_set_border_width (GTK_CONTAINER (channels_vb), 2); - gtk_scrolled_window_add_with_viewport((GtkScrolledWindow *) main_scrolled_window, channels_vb); - - h_jitter_buttons_box = gtk_hbox_new (FALSE, 0); - gtk_container_set_border_width (GTK_CONTAINER (h_jitter_buttons_box), 10); - gtk_box_pack_start (GTK_BOX(main_vb), h_jitter_buttons_box, FALSE, FALSE, 0); - label = gtk_label_new("Jitter buffer [ms] "); - gtk_box_pack_start(GTK_BOX(h_jitter_buttons_box), label, FALSE, FALSE, 0); - - jitter_spinner_adj = (GtkAdjustment *) gtk_adjustment_new (50, 0, 500, 5, 10, 10); - jitter_spinner = gtk_spin_button_new (jitter_spinner_adj, 5, 0); - gtk_box_pack_start(GTK_BOX(h_jitter_buttons_box), jitter_spinner, FALSE, FALSE, 0); - gtk_tooltips_set_tip (tooltips, jitter_spinner, "The simulated jitter buffer in [ms]", NULL); - SIGNAL_CONNECT(GTK_OBJECT (jitter_spinner_adj), "value_changed", (GtkSignalFunc) jitter_spinner_value_changed, NULL); - - /* button row */ - hbuttonbox = gtk_hbutton_box_new (); - gtk_box_pack_start (GTK_BOX (h_jitter_buttons_box), hbuttonbox, TRUE, TRUE, 0); - gtk_button_box_set_layout (GTK_BUTTON_BOX (hbuttonbox), GTK_BUTTONBOX_SPREAD); - gtk_button_box_set_spacing (GTK_BUTTON_BOX (hbuttonbox), 30); - - bt_decode = gtk_button_new_with_label("Decode"); - gtk_container_add(GTK_CONTAINER(hbuttonbox), bt_decode); - SIGNAL_CONNECT(bt_decode, "clicked", on_bt_decode_clicked, NULL); - gtk_tooltips_set_tip (tooltips, bt_decode, "Decode the RTP stream(s)", NULL); - - bt_play = gtk_button_new_with_label("Play"); - gtk_container_add(GTK_CONTAINER(hbuttonbox), bt_play); - SIGNAL_CONNECT(bt_play, "clicked", on_bt_play_clicked, NULL); - gtk_tooltips_set_tip (tooltips, bt_play, "Play the RTP channel(s)", NULL); - - bt_pause = gtk_button_new_with_label("Pause"); - gtk_container_add(GTK_CONTAINER(hbuttonbox), bt_pause); - SIGNAL_CONNECT(bt_pause, "clicked", on_bt_pause_clicked, NULL); - gtk_tooltips_set_tip (tooltips, bt_pause, "Pause the RTP channel(s)", NULL); - - bt_stop = gtk_button_new_with_label("Stop"); - gtk_container_add(GTK_CONTAINER(hbuttonbox), bt_stop); - SIGNAL_CONNECT(bt_stop, "clicked", on_bt_stop_clicked, NULL); - gtk_tooltips_set_tip (tooltips, bt_stop, "Stop the RTP channel(s)", NULL); - - bt_close = BUTTON_NEW_FROM_STOCK(GTK_STOCK_CLOSE); - gtk_container_add (GTK_CONTAINER (hbuttonbox), bt_close); - GTK_WIDGET_SET_FLAGS(bt_close, GTK_CAN_DEFAULT); - gtk_tooltips_set_tip (tooltips, bt_close, "Close this dialog", NULL); - - SIGNAL_CONNECT(bt_close, "clicked", listen_rtp_on_destroy, NULL); - SIGNAL_CONNECT(listen_rtp_dlg_w, "destroy", listen_rtp_on_destroy, NULL); - - /* button row */ - hbuttonbox = gtk_hbutton_box_new (); - - /* Filter/status hbox */ - stat_hbox = gtk_hbox_new(FALSE, 1); - gtk_container_border_width(GTK_CONTAINER(stat_hbox), 0); - - /* statusbar */ - info_bar = gtk_statusbar_new(); - gtk_statusbar_set_has_resize_grip(GTK_STATUSBAR(info_bar), TRUE); - - gtk_box_pack_start(GTK_BOX(stat_hbox), info_bar, TRUE, TRUE, 0); - - /* statusbar hbox */ - gtk_box_pack_start(GTK_BOX(main_vb), stat_hbox, FALSE, TRUE, 0); - - /* set the sensitive state of the buttons (decode, play, pause, stop) */ - bt_state(TRUE, FALSE, FALSE, FALSE); - - gtk_widget_show_all(listen_rtp_dlg_w); - - /* Force gtk to redraw the window before starting decoding the packet */ - while (g_main_context_iteration(NULL, FALSE)); -} - -/****************************************************************************/ -static void -listen_rtp_init(voip_calls_tapinfo_t *voip_calls_tap) -{ - PaError err; - GtkWidget *dialog; - - if (initialized) return; - initialized = TRUE; - - voip_calls = voip_calls_tap; - err = Pa_Initialize(); - if( err != paNoError ) { - dialog = gtk_message_dialog_new ((GtkWindow *) listen_rtp_dlg_w, - GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR,GTK_BUTTONS_CLOSE, - "Can not Initialize the PortAduio Library.\n Error: %s", Pa_GetErrorText( err )); - gtk_dialog_run (GTK_DIALOG (dialog)); - gtk_widget_destroy (dialog); - initialized = FALSE; - return; - } - - new_jitter_buff = -1; - -#ifdef HAVE_G729_G723 - /* Initialize the G729 and G723 decoders */ - initG723(); - initG729(); -#endif - - if (!rtp_channels) { - rtp_channels = g_malloc(sizeof(rtp_play_channles_t)); - } - - reset_rtp_channels(); - - /* create the dialog window */ - listen_rtp_dlg_create(); - -} - -/****************************************************************************/ -/* this function will be called using a pseudo dissector, so based on the parameters passed will do: - * voip_calls_tap=rtp=pinfo=NULL -> Reset and close the window if open (called when retapping or close) - * voip_calls_tap != NULL -> listen_rtp_dlg_create (this is called when the user click "listen" in the VoIP calls) - * rtp and pinfo != NULL -> every time there is an RTP packet tap by the VoipCalls - */ -static void listen_rtp_main(voip_calls_tapinfo_t *voip_calls_tap,struct _rtp_info *rtp_info, packet_info *pinfo) -{ - /* Init the pa and create the Dialog */ - if (voip_calls_tap) { - listen_rtp_init(voip_calls_tap); - return; - } - - /* This is a RTP packet to be added */ - if( rtp_info && pinfo) { - add_rtp_packet(rtp_info, pinfo); - return; - } - - /* All three parameters are NULL, so it is a Reset */ - reset_listen_rtp(); -} - -/****************************************************************************/ -extern void proto_reg_handoff_listen_rtp(void) -{ - GString* tap_error = NULL; -} - -/****************************************************************************/ -void proto_register_listen_rtp(void) { - - proto_listen_rtp = proto_register_protocol("Listen RTP", "ListenRTP", "listenrtp"); - register_dissector("listenrtp", listen_rtp_main, proto_listen_rtp); -} - diff --git a/plugins/listen_rtp/main_listen_rtp.h b/plugins/listen_rtp/main_listen_rtp.h deleted file mode 100644 index 2a290afdee..0000000000 --- a/plugins/listen_rtp/main_listen_rtp.h +++ /dev/null @@ -1,29 +0,0 @@ -/* pinfo_stats_tree.h -* Stats tree for ethernet frames -* -* (c) 2006, Alejandro Vaquero <alejandrovaquero@yahoo.com> -* -* $Id$ -* -* Ethereal - Network traffic analyzer -* By Gerald Combs <gerald@ethereal.com> -* Copyright 1998 Gerald Combs -* -* This program is free software; you can redistribute it and/or -* modify it under the terms of the GNU General Public License -* as published by the Free Software Foundation; either version 2 -* of the License, or (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program; if not, write to the Free Software -* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -extern void proto_register_listen_rtp(void); -extern void proto_reg_handoff_listen_rtp(void); - |