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:
Jaap Keuter 2018-02-27 08:22:25 +01:00 committed by Anders Broman
parent b405a9f0d2
commit 0fb38879af
11 changed files with 236 additions and 8 deletions

View File

@ -1388,6 +1388,7 @@ if(ENABLE_PLUGINS)
plugins/epan/wimaxasncp
plugins/epan/wimaxmacphy
plugins/wiretap/usbdump
plugins/codecs/l16_mono
${CUSTOM_PLUGIN_SRC_DIR}
)

View File

@ -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

View File

@ -1 +1,2 @@
usr/lib/*/libwscodecs.so.*
usr/lib/*/wireshark/plugins/*/codecs/*.so

View File

@ -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

View File

@ -35,7 +35,8 @@ SUBDIRS = \
epan/wimax \
epan/wimaxasncp \
epan/wimaxmacphy \
wiretap/usbdump
wiretap/usbdump \
codecs/l16_mono
EXTRA_DIST = \
$(_CUSTOM_EXTRA_DIST_) \

View File

@ -0,0 +1,2 @@
Author :
Jaap Keuter <jaap.keuter@xs4all.nl>

View File

@ -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:
#

View File

@ -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

View File

@ -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.

View File

@ -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:
*/

View File

@ -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"