aboutsummaryrefslogtreecommitdiffstats
path: root/codecs
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2013-12-02 08:30:29 +0000
committerGuy Harris <guy@alum.mit.edu>2013-12-02 08:30:29 +0000
commit0cc1545d05be6f655c950904b1da776190f3af16 (patch)
treeb82725615b527304bfb2e9e7d9f3b6dfc50ce7fd /codecs
parentbaf569188ac49ad38912b82d23ff241321cd654f (diff)
Move most of the plugin code from epan to wsutil and remove all
knowledge of particular types of plugins. Instead, let particular types of plugins register with the common plugin code, giving a name and a routine to recognize that type of plugin. In particular applications, only process the relevant plugin types. Add a Makefile.common to the codecs directory. svn path=/trunk/; revision=53710
Diffstat (limited to 'codecs')
-rw-r--r--codecs/Makefile.am41
-rw-r--r--codecs/Makefile.common41
-rw-r--r--codecs/Makefile.nmake27
-rw-r--r--codecs/codecs.c73
-rw-r--r--codecs/codecs.h20
5 files changed, 167 insertions, 35 deletions
diff --git a/codecs/Makefile.am b/codecs/Makefile.am
index 73f9612864..1ce407f129 100644
--- a/codecs/Makefile.am
+++ b/codecs/Makefile.am
@@ -1,10 +1,10 @@
# Makefile.am
-# Automake file for the codecs for Wireshark
+# Automake file for the libcodec library for Wireshark
#
# $Id$
#
# Wireshark - Network traffic analyzer
-# By Gerald Combs <gerald@xxxxxxxxxxxxx>
+# By Gerald Combs <gerald@wireshark.org>
# Copyright 1998 Gerald Combs
#
# This program is free software; you can redistribute it and/or
@@ -21,6 +21,9 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+include Makefile.common
+include ../Makefile.am.inc
+
if HAVE_WARNINGS_AS_ERRORS
AM_CFLAGS = -Werror
endif
@@ -28,31 +31,27 @@ endif
noinst_LIBRARIES = libcodec.a
CLEANFILES = \
- libcodec.a \
- *~
+ libcodec.a \
+ *~
MAINTAINERCLEANFILES = \
- Makefile.in
+ Makefile.in
+# All sources that should be put in the source distribution tarball
libcodec_a_SOURCES = \
- codecs.c codecs.h \
- G711a/G711adecode.c G711a/G711adecode.h G711a/G711atable.h \
- G711u/G711udecode.c G711u/G711udecode.h G711u/G711utable.h \
- G722/G722decode.c G722/G722decode.h \
- G726/G726decode.c G726/G726decode.h \
- sbc/sbc.c sbc/sbc.h
+ $(LIBCODEC_SRC) \
+ $(noinst_HEADERS)
libcodec_a_DEPENDENCIES =
-EXTRA_DIST = \
- Makefile.nmake \
- CMakeLists.txt
+# Common headers
+AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/wiretap
-checkapi:
+checkapi:
$(PERL) ../tools/checkAPIs.pl -g abort -g termoutput -build \
- codecs.c \
- G711a/G711adecode.c \
- G711u/G711udecode.c \
- G722/G722decode.c \
- G726/G726decode.c \
- sbc/sbc.c
+ $(LIBCODEC_SRC)
+
+EXTRA_DIST = \
+ CMakeLists.txt \
+ Makefile.common \
+ Makefile.nmake
diff --git a/codecs/Makefile.common b/codecs/Makefile.common
new file mode 100644
index 0000000000..42009472c0
--- /dev/null
+++ b/codecs/Makefile.common
@@ -0,0 +1,41 @@
+# Makefile.common
+# Contains the stuff from Makefile.am and Makefile.nmake that is
+# a) common to both files and
+# b) portable between both files
+#
+# $Id$
+#
+# Wireshark - Network traffic analyzer
+# By Gerald Combs <gerald@wireshark.org>
+# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+
+LIBCODEC_SRC = \
+ codecs.c \
+ G711a/G711adecode.c \
+ G711u/G711udecode.c \
+ G722/G722decode.c \
+ G726/G726decode.c \
+ sbc/sbc.c
+
+noinst_HEADERS = \
+ codecs.h \
+ G711a/G711adecode.h G711a/G711atable.h \
+ G711u/G711udecode.h G711u/G711utable.h \
+ G722/G722decode.h \
+ G726/G726decode.h \
+ sbc/sbc.h
+
diff --git a/codecs/Makefile.nmake b/codecs/Makefile.nmake
index 821cd5c00a..d2cbc4e35e 100644
--- a/codecs/Makefile.nmake
+++ b/codecs/Makefile.nmake
@@ -4,6 +4,7 @@
# $Id$
include ..\config.nmake
+include ..\Makefile.nmake.inc
############### no need to modify below this line #########
@@ -11,9 +12,16 @@ CFLAGS=/I.. $(WARNINGS_ARE_ERRORS) $(STANDARD_CFLAGS) \
$(GLIB_CFLAGS)
.c.obj::
- $(CC) $(CFLAGS) -Fd.\ -c $<
+ $(CC) $(CFLAGS) -Fd.\ -c $<
-CODEC_OBJECTS= \
+include Makefile.common
+
+# if you add files here, be sure to include them also in Makefile.am EXTRA_DIST
+# XXX - if the codec files weren't in subdirectories, we could just do
+# LIBCODEC_OBJECTS = $(LIBCODEC_SRC:.c=.obj), and wouldn't need rules
+# for each of the codecs below
+#
+LIBCODEC_OBJECTS= \
codecs.obj \
G711udecode.obj \
G711adecode.obj \
@@ -21,10 +29,8 @@ CODEC_OBJECTS= \
G726decode.obj \
sbc.obj
-
-codecs.lib : $(CODEC_OBJECTS)
- link /lib /out:codecs.lib $(CODEC_OBJECTS)
-
+codecs.lib : $(LIBCODEC_OBJECTS)
+ link /lib /out:codecs.lib $(LIBCODEC_OBJECTS)
codecs.obj: codecs.c codecs.h
$(CC) $(CFLAGS) -Fd.\ -c codecs.c /Fo%|fF.obj
@@ -45,7 +51,7 @@ sbc.obj: sbc\sbc.c sbc\sbc.h
$(CC) $(CFLAGS) -Fd.\ -c sbc\sbc.c /Fo%|fF.obj
clean:
- rm -f $(CODEC_OBJECTS) codecs.lib *.pdb *.sbr
+ rm -f $(LIBCODEC_OBJECTS) codecs.lib *.pdb *.sbr
distclean: clean
@@ -53,9 +59,4 @@ maintainer-clean: distclean
checkapi:
$(PERL) ../tools/checkAPIs.pl -g abort -g termoutput -build \
- codecs.c \
- G711a/G711adecode.c \
- G711u/G711udecode.c \
- G722/G722decode.c \
- G726/G726decode.c \
- sbc/sbc.c
+ $(LIBCODEC_SRC)
diff --git a/codecs/codecs.c b/codecs/codecs.c
index 0cb397f99b..abe3eaa714 100644
--- a/codecs/codecs.c
+++ b/codecs/codecs.c
@@ -22,9 +22,82 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
+#include "config.h"
+
#include <glib.h>
#include "codecs.h"
+#ifdef HAVE_PLUGINS
+
+#include <gmodule.h>
+
+#include <wsutil/plugins.h>
+
+/*
+ * List of codec plugins.
+ */
+typedef struct {
+ void (*register_codec_module)(void); /* routine to call to register a codec */
+} codec_plugin;
+
+static GSList *codec_plugins = NULL;
+
+/*
+ * Callback for each plugin found.
+ */
+static gboolean
+check_for_codec_plugin(GModule *handle)
+{
+ gpointer gp;
+ void (*register_codec_module)(void);
+ codec_plugin *plugin;
+
+ /*
+ * Do we have a register_codec_module routine?
+ */
+ if (!g_module_symbol(handle, "register_codec_module", &gp)) {
+ /* No, so this isn't a codec plugin. */
+ return FALSE;
+ }
+
+ /*
+ * Yes - this plugin includes one or more codecs.
+ */
+ register_codec_module = (void (*)(void))gp;
+
+ /*
+ * Add this one to the list of codec plugins.
+ */
+ plugin = (codec_plugin *)g_malloc(sizeof (codec_plugin));
+ plugin->register_codec_module = register_codec_module;
+ codec_plugins = g_slist_append(codec_plugins, plugin);
+ return TRUE;
+}
+
+void
+codec_register_plugin_types(void)
+{
+ add_plugin_type("codec", check_for_codec_plugin);
+}
+
+static void
+register_codec_plugin(gpointer data, gpointer user_data _U_)
+{
+ codec_plugin *plugin = (codec_plugin *)data;
+
+ (plugin->register_codec_module)();
+}
+
+/*
+ * For all codec plugins, call their register routines.
+ */
+void
+register_all_codecs(void)
+{
+ g_slist_foreach(codec_plugins, register_codec_plugin, NULL);
+}
+#endif /* HAVE_PLUGINS */
+
struct codec_handle {
const char *name;
codec_init_fn init_fn;
diff --git a/codecs/codecs.h b/codecs/codecs.h
index 9231fe8455..f293e26f2d 100644
--- a/codecs/codecs.h
+++ b/codecs/codecs.h
@@ -25,6 +25,20 @@
#ifndef _CODECS_H_
#define _CODECS_H_
+#include "config.h"
+
+#include <epan/epan.h>
+#include "ws_symbol_export.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#ifdef HAVE_PLUGINS
+extern void codec_register_plugin_types(void);
+extern void register_all_codecs(void);
+#endif
+
struct codec_handle;
typedef struct codec_handle *codec_handle_t;
@@ -38,4 +52,8 @@ extern void *codec_init(codec_handle_t codec);
extern void codec_release(codec_handle_t codec, void *context);
extern int codec_decode(codec_handle_t codec, void *context, const void *input, int inputSizeBytes, void *output, int *outputSizeBytes);
-#endif
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* _CODECS_H_ */