diff options
author | Harald Welte <laforge@gnumonks.org> | 2023-03-21 12:26:05 +0000 |
---|---|---|
committer | Martin Mathieson <martin.r.mathieson@googlemail.com> | 2023-03-21 12:26:05 +0000 |
commit | 01c51aad3edbd1c08b881b86d91115878ea4bd53 (patch) | |
tree | 807ae412b1b6e8a5203bbe6776909cc89b854db8 /plugins/codecs | |
parent | 0e12c67b92e46b20eba45b81835fd6b9f13c570d (diff) |
Add AMR codec support
Diffstat (limited to 'plugins/codecs')
-rw-r--r-- | plugins/codecs/amrnb/CMakeLists.txt | 66 | ||||
-rw-r--r-- | plugins/codecs/amrnb/amrdecode.c | 95 |
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: + */ |