aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/codecs
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2023-03-21 12:26:05 +0000
committerMartin Mathieson <martin.r.mathieson@googlemail.com>2023-03-21 12:26:05 +0000
commit01c51aad3edbd1c08b881b86d91115878ea4bd53 (patch)
tree807ae412b1b6e8a5203bbe6776909cc89b854db8 /plugins/codecs
parent0e12c67b92e46b20eba45b81835fd6b9f13c570d (diff)
Add AMR codec support
Diffstat (limited to 'plugins/codecs')
-rw-r--r--plugins/codecs/amrnb/CMakeLists.txt66
-rw-r--r--plugins/codecs/amrnb/amrdecode.c95
2 files changed, 161 insertions, 0 deletions
diff --git a/plugins/codecs/amrnb/CMakeLists.txt b/plugins/codecs/amrnb/CMakeLists.txt
new file mode 100644
index 0000000000..b49314689e
--- /dev/null
+++ b/plugins/codecs/amrnb/CMakeLists.txt
@@ -0,0 +1,66 @@
+# 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(amrnb 0 1 0 0)
+
+set(CODEC_SRC
+ amrdecode.c
+)
+
+set(PLUGIN_FILES
+ plugin.c
+ ${CODEC_SRC}
+)
+
+set_source_files_properties(
+ ${PLUGIN_FILES}
+ PROPERTIES
+ COMPILE_FLAGS "${WERROR_COMMON_FLAGS}"
+)
+
+register_plugin_files(plugin.c
+ plugin_codec
+ ${CODEC_SRC}
+)
+
+add_wireshark_plugin_library(amrnb codecs)
+
+target_include_directories(amrnb PRIVATE ${CMAKE_SOURCE_DIR}/codecs)
+
+target_link_libraries(amrnb wsutil ${AMRNB_LIBRARIES})
+
+target_include_directories(amrnb SYSTEM PRIVATE ${AMRNB_INCLUDE_DIRS})
+
+install_plugin(amrnb codecs)
+
+file(GLOB CODEC_HEADERS RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "*.h")
+CHECKAPI(
+ NAME
+ amrnb
+ SWITCHES
+ SOURCES
+ ${CODEC_SRC}
+ ${CODEC_HEADERS}
+)
+
+#
+# Editor modelines - https://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:
+#
diff --git a/plugins/codecs/amrnb/amrdecode.c b/plugins/codecs/amrnb/amrdecode.c
new file mode 100644
index 0000000000..10903e0437
--- /dev/null
+++ b/plugins/codecs/amrnb/amrdecode.c
@@ -0,0 +1,95 @@
+/* amrdecode.c
+ * AMR 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 "wsutil/codecs.h"
+#include "ws_attributes.h"
+
+#include <opencore-amrnb/interf_dec.h>
+
+void codec_register_amr(void);
+
+static void *
+codec_amr_init(void)
+{
+ void *state;
+ state = Decoder_Interface_init();
+
+ return state;
+}
+
+static void
+codec_amr_release(void *state)
+{
+ Decoder_Interface_exit(state);
+}
+
+static unsigned
+codec_amr_get_channels(void *ctx _U_)
+{
+ return 1;
+}
+
+static unsigned
+codec_amr_get_frequency(void *ctx _U_)
+{
+ return 8000;
+}
+
+static size_t
+codec_amr_decode(void *state, const void *input, size_t inputSizeBytes, void *output,
+ size_t *outputSizeBytes)
+{
+ int mode;
+ unsigned packet_size;
+ static const guint8 block_size[16] = {12, 13, 15, 17, 19, 20, 26, 31, 5, 0, 0, 0, 0, 0, 0, 0};
+
+ /* First byte is CMR, second is the Payload TOC */
+ mode = (((guint8 *)input)[1] >> 3) & 0x0F;
+ packet_size = block_size[mode] + 2;
+
+ if (!output || !outputSizeBytes)
+ return 160*2;
+
+ *outputSizeBytes = 160 * 2; /* 160 frames, two byte per frame, 20ms */
+
+ /* If the size is screwed up, insert silence */
+ if (packet_size > inputSizeBytes) {
+ memset(output, 0, *outputSizeBytes);
+ return *outputSizeBytes;
+ }
+
+ Decoder_Interface_Decode(state, (const unsigned char *)input+1, (short *)output, 0);
+ return *outputSizeBytes;
+}
+
+void
+codec_register_amr(void)
+{
+ register_codec("AMR", codec_amr_init, codec_amr_release,
+ codec_amr_get_channels, codec_amr_get_frequency, codec_amr_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:
+ */