L16_mono: Add L16 monaural codec plugin as functional example
This codec plugin serves a dual purpose. First it is to add L16 codec suppport to Wireshark. Second it is an illustration of a basic codec plugin module. Change-Id: I64394dab3257ae49dece0257b16cd969503918e2 Reviewed-on: https://code.wireshark.org/review/26131 Reviewed-by: Jaap Keuter <jaap.keuter@xs4all.nl> Petri-Dish: Jaap Keuter <jaap.keuter@xs4all.nl> Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman <a.broman58@gmail.com>
This commit is contained in:
parent
b405a9f0d2
commit
0fb38879af
|
@ -1388,6 +1388,7 @@ if(ENABLE_PLUGINS)
|
|||
plugins/epan/wimaxasncp
|
||||
plugins/epan/wimaxmacphy
|
||||
plugins/wiretap/usbdump
|
||||
plugins/codecs/l16_mono
|
||||
${CUSTOM_PLUGIN_SRC_DIR}
|
||||
)
|
||||
|
||||
|
|
|
@ -2813,6 +2813,7 @@ AC_CONFIG_FILES(
|
|||
plugins/epan/wimaxasncp/Makefile
|
||||
plugins/epan/wimaxmacphy/Makefile
|
||||
plugins/wiretap/usbdump/Makefile
|
||||
plugins/codecs/l16_mono/Makefile
|
||||
_CUSTOM_PLUGIN_CONFIG_FILES_
|
||||
randpkt_core/doxygen.cfg
|
||||
randpkt_core/Makefile
|
||||
|
|
|
@ -1 +1,2 @@
|
|||
usr/lib/*/libwscodecs.so.*
|
||||
usr/lib/*/wireshark/plugins/*/codecs/*.so
|
||||
|
|
|
@ -1051,6 +1051,12 @@ SetOutPath '$INSTDIR\plugins\${VERSION_MAJOR}.${VERSION_MINOR}\wiretap'
|
|||
File "${STAGING_DIR}\plugins\${VERSION_MAJOR}.${VERSION_MINOR}\wiretap\usbdump.dll"
|
||||
SectionEnd
|
||||
|
||||
Section "Codec plugins" SecCodec
|
||||
;-------------------------------------------
|
||||
SetOutPath '$INSTDIR\plugins\${VERSION_MAJOR}.${VERSION_MINOR}\codecs'
|
||||
File "${STAGING_DIR}\plugins\${VERSION_MAJOR}.${VERSION_MINOR}\codecs\l16mono.dll"
|
||||
SectionEnd
|
||||
|
||||
Section "Configuration Profiles" SecProfiles
|
||||
;-------------------------------------------
|
||||
; This should be a function or macro
|
||||
|
|
|
@ -35,7 +35,8 @@ SUBDIRS = \
|
|||
epan/wimax \
|
||||
epan/wimaxasncp \
|
||||
epan/wimaxmacphy \
|
||||
wiretap/usbdump
|
||||
wiretap/usbdump \
|
||||
codecs/l16_mono
|
||||
|
||||
EXTRA_DIST = \
|
||||
$(_CUSTOM_EXTRA_DIST_) \
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
Author :
|
||||
Jaap Keuter <jaap.keuter@xs4all.nl>
|
|
@ -0,0 +1,68 @@
|
|||
# CMakeLists.txt
|
||||
#
|
||||
# Wireshark - Network traffic analyzer
|
||||
# By Gerald Combs <gerald@wireshark.org>
|
||||
# Copyright 1998 Gerald Combs
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||
#
|
||||
|
||||
include(WiresharkPlugin)
|
||||
|
||||
# Plugin name and version info (major minor micro extra)
|
||||
set_module_info(l16mono 0 1 0 0)
|
||||
|
||||
set(CODEC_SRC
|
||||
l16decode.c
|
||||
)
|
||||
|
||||
set(PLUGIN_FILES
|
||||
plugin.c
|
||||
${CODEC_SRC}
|
||||
)
|
||||
|
||||
set_source_files_properties(
|
||||
${PLUGIN_FILES}
|
||||
PROPERTIES
|
||||
COMPILE_FLAGS "${WERROR_COMMON_FLAGS}"
|
||||
)
|
||||
|
||||
include_directories(
|
||||
${CMAKE_SOURCE_DIR}/codec
|
||||
${CMAKE_CURRENT_SOURCE_DIR}
|
||||
)
|
||||
|
||||
register_plugin_files(plugin.c
|
||||
plugin_codec
|
||||
${CODEC_SRC}
|
||||
)
|
||||
|
||||
add_plugin_library(l16mono codecs)
|
||||
|
||||
target_link_libraries(l16mono wscodecs)
|
||||
|
||||
install_plugin(l16mono codecs)
|
||||
|
||||
file(GLOB CODEC_HEADERS RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "*.h")
|
||||
CHECKAPI(
|
||||
NAME
|
||||
l16mono
|
||||
SWITCHES
|
||||
-g abort -g termoutput -build
|
||||
SOURCES
|
||||
${CODEC_SRC}
|
||||
${CODEC_HEADERS}
|
||||
)
|
||||
|
||||
#
|
||||
# Editor modelines - http://www.wireshark.org/tools/modelines.html
|
||||
#
|
||||
# Local variables:
|
||||
# c-basic-offset: 8
|
||||
# tab-width: 8
|
||||
# indent-tabs-mode: t
|
||||
# End:
|
||||
#
|
||||
# vi: set shiftwidth=8 tabstop=8 noexpandtab:
|
||||
# :indentSize=8:tabSize=8:noTabs=false:
|
||||
#
|
|
@ -0,0 +1,48 @@
|
|||
# Makefile.am
|
||||
#
|
||||
# Wireshark - Network traffic analyzer
|
||||
# By Gerald Combs <gerald@wireshark.org>
|
||||
# Copyright 1998 Gerald Combs
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||
#
|
||||
|
||||
include $(top_srcdir)/Makefile.am.inc
|
||||
include $(top_srcdir)/plugins/codecs/Makefile.am.inc
|
||||
|
||||
# the name of the plugin
|
||||
PLUGIN_NAME = l16mono
|
||||
|
||||
PLUGIN_VERSION = 0.1.0
|
||||
|
||||
BUILT_SOURCES = \
|
||||
plugin.c
|
||||
|
||||
# Non-generated sources to be scanned for registration routines
|
||||
NONGENERATED_REGISTER_C_FILES = \
|
||||
l16decode.c
|
||||
|
||||
# Non-generated sources
|
||||
NONGENERATED_C_FILES = \
|
||||
$(NONGENERATED_REGISTER_C_FILES)
|
||||
|
||||
wiretap_plugin_LTLIBRARIES = l16mono.la
|
||||
|
||||
l16mono_la_SOURCES = \
|
||||
$(SRC_FILES) \
|
||||
$(HEADER_FILES)
|
||||
|
||||
nodist_l16mono_la_SOURCES = \
|
||||
plugin.c
|
||||
|
||||
l16mono_la_CPPFLAGS = $(AM_CPPFLAGS) $(PLUGIN_CPPFLAGS) -I$(abs_top_srcdir)/codecs
|
||||
|
||||
l16mono_la_CFLAGS = $(AM_CFLAGS) $(PLUGIN_CFLAGS) -I$(abs_top_srcdir)/codecs
|
||||
|
||||
l16mono_la_LDFLAGS = $(PLUGIN_LDFLAGS)
|
||||
|
||||
DISTCLEANFILES = \
|
||||
plugin.c
|
||||
|
||||
EXTRA_DIST = \
|
||||
CMakeLists.txt
|
|
@ -0,0 +1,3 @@
|
|||
This codec plugin serves a dual purpose.
|
||||
First it is to add L16 codec suppport to Wireshark.
|
||||
Second it is an illustration of a basic codec plugin module.
|
|
@ -0,0 +1,83 @@
|
|||
/* l16decode.c
|
||||
* 16-bit audio, mono codec
|
||||
*
|
||||
* Wireshark - Network traffic analyzer
|
||||
* By Gerald Combs <gerald@wireshark.org>
|
||||
* Copyright 1998 Gerald Combs
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <glib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "codecs/codecs.h"
|
||||
#include "ws_attributes.h"
|
||||
|
||||
void *
|
||||
codec_l16_init(void)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void
|
||||
codec_l16_release(void *ctx _U_)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
unsigned
|
||||
codec_l16_get_channels(void *ctx _U_)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
unsigned
|
||||
codec_l16_get_frequency(void *ctx _U_)
|
||||
{
|
||||
return 44100;
|
||||
}
|
||||
|
||||
size_t
|
||||
codec_l16_decode(void *ctx _U_, const void *input, size_t inputSizeBytes,
|
||||
void *output, size_t *outputSizeBytes)
|
||||
{
|
||||
const guint16 *dataIn = (const guint16 *)input;
|
||||
guint16 *dataOut = (guint16 *)output;
|
||||
size_t i;
|
||||
|
||||
if (!output || !outputSizeBytes)
|
||||
{
|
||||
return inputSizeBytes;
|
||||
}
|
||||
|
||||
for (i=0; i<inputSizeBytes/2; i++)
|
||||
{
|
||||
dataOut[i] = g_ntohs(dataIn[i]);
|
||||
}
|
||||
|
||||
*outputSizeBytes = inputSizeBytes;
|
||||
return *outputSizeBytes;
|
||||
}
|
||||
|
||||
void
|
||||
codec_register_l16(void)
|
||||
{
|
||||
register_codec("16-bit audio, monaural", codec_l16_init, codec_l16_release,
|
||||
codec_l16_get_channels, codec_l16_get_frequency, codec_l16_decode);
|
||||
}
|
||||
|
||||
/*
|
||||
* Editor modelines - http://www.wireshark.org/tools/modelines.html
|
||||
*
|
||||
* Local variables:
|
||||
* c-basic-offset: 4
|
||||
* tab-width: 8
|
||||
* indent-tabs-mode: nil
|
||||
* End:
|
||||
*
|
||||
* vi: set shiftwidth=4 tabstop=8 expandtab:
|
||||
* :indentSize=4:tabSize=8:noTabs=true:
|
||||
*/
|
|
@ -1,6 +1,6 @@
|
|||
#!/usr/bin/env python
|
||||
#
|
||||
# Looks for registration routines in the plugin dissectors,
|
||||
# Looks for registration routines in the plugins
|
||||
# and assembles C code to call all the routines.
|
||||
#
|
||||
|
||||
|
@ -13,7 +13,7 @@ import re
|
|||
#
|
||||
srcdir = sys.argv[1]
|
||||
#
|
||||
# The second argument is either "plugin" or "plugin_wtap".
|
||||
# The second argument is either "plugin", "plugin_wtap" or "plugin_codec".
|
||||
#
|
||||
registertype = sys.argv[2]
|
||||
#
|
||||
|
@ -50,6 +50,7 @@ regs = {
|
|||
'proto_reg': set(),
|
||||
'handoff_reg': set(),
|
||||
'wtap_register': set(),
|
||||
'codec_register': set(),
|
||||
}
|
||||
|
||||
# For those that don't know Python, r"" indicates a raw string,
|
||||
|
@ -60,11 +61,14 @@ handoff_regex = r"\bproto_reg_handoff_(?P<symbol>[_A-Za-z0-9]+)\s*\(\s*void\s*\)
|
|||
|
||||
wtap_reg_regex = r"\bwtap_register_(?P<symbol>[_A-Za-z0-9]+)\s*\([^;]+$"
|
||||
|
||||
codec_reg_regex = r"\bcodec_register_(?P<symbol>[_A-Za-z0-9]+)\s*\([^;]+$"
|
||||
|
||||
# This table drives the pattern-matching and symbol-harvesting
|
||||
patterns = [
|
||||
( 'proto_reg', re.compile(proto_regex, re.MULTILINE) ),
|
||||
( 'handoff_reg', re.compile(handoff_regex, re.MULTILINE) ),
|
||||
( 'wtap_register', re.compile(wtap_reg_regex, re.MULTILINE) ),
|
||||
( 'codec_register', re.compile(codec_reg_regex, re.MULTILINE) ),
|
||||
]
|
||||
|
||||
# Grep
|
||||
|
@ -83,14 +87,15 @@ for filename in filenames:
|
|||
file.close()
|
||||
|
||||
# Make sure we actually processed something
|
||||
if len(regs['proto_reg']) < 1 and len(regs['wtap_register']) < 1:
|
||||
print("No protocol registrations found")
|
||||
if (len(regs['proto_reg']) < 1 and len(regs['wtap_register']) < 1 and len(regs['codec_register']) < 1):
|
||||
print("No plugin registrations found")
|
||||
sys.exit(1)
|
||||
|
||||
# Convert the sets into sorted lists to make the output pretty
|
||||
regs['proto_reg'] = sorted(regs['proto_reg'])
|
||||
regs['handoff_reg'] = sorted(regs['handoff_reg'])
|
||||
regs['wtap_register'] = sorted(regs['wtap_register'])
|
||||
regs['codec_register'] = sorted(regs['codec_register'])
|
||||
|
||||
reg_code = ""
|
||||
|
||||
|
@ -108,9 +113,11 @@ reg_code += """
|
|||
"""
|
||||
|
||||
if registertype == "plugin":
|
||||
reg_code += "#include <epan/proto.h>\n\n"
|
||||
reg_code += "#include \"epan/proto.h\"\n\n"
|
||||
if registertype == "plugin_wtap":
|
||||
reg_code += "#include <wiretap/wtap.h>\n\n"
|
||||
reg_code += "#include \"wiretap/wtap.h\"\n\n"
|
||||
if registertype == "plugin_codec":
|
||||
reg_code += "#include \"codecs/codecs.h\"\n\n"
|
||||
|
||||
for symbol in regs['proto_reg']:
|
||||
reg_code += "void proto_register_%s(void);\n" % (symbol)
|
||||
|
@ -118,6 +125,8 @@ for symbol in regs['handoff_reg']:
|
|||
reg_code += "void proto_reg_handoff_%s(void);\n" % (symbol)
|
||||
for symbol in regs['wtap_register']:
|
||||
reg_code += "void wtap_register_%s(void);\n" % (symbol)
|
||||
for symbol in regs['codec_register']:
|
||||
reg_code += "void codec_register_%s(void);\n" % (symbol)
|
||||
|
||||
reg_code += """
|
||||
WS_DLL_PUBLIC_DEF const gchar plugin_version[] = PLUGIN_VERSION;
|
||||
|
@ -138,11 +147,16 @@ if registertype == "plugin":
|
|||
else:
|
||||
reg_code +=" plug_%s.register_handoff = NULL;\n" % (symbol)
|
||||
reg_code += " proto_register_plugin(&plug_%s);\n" % (symbol)
|
||||
else:
|
||||
if registertype == "plugin_wtap":
|
||||
for symbol in regs['wtap_register']:
|
||||
reg_code += " static wtap_plugin plug_%s;\n\n" % (symbol)
|
||||
reg_code += " plug_%s.register_wtap_module = wtap_register_%s;\n" % (symbol, symbol)
|
||||
reg_code += " wtap_register_plugin(&plug_%s);\n" % (symbol)
|
||||
if registertype == "plugin_codec":
|
||||
for symbol in regs['codec_register']:
|
||||
reg_code += " static codecs_plugin plug_%s;\n\n" % (symbol)
|
||||
reg_code += " plug_%s.register_codec_module = codec_register_%s;\n" % (symbol, symbol)
|
||||
reg_code += " codecs_register_plugin(&plug_%s);\n" % (symbol)
|
||||
|
||||
reg_code += "}\n"
|
||||
|
||||
|
|
Loading…
Reference in New Issue