From 6136c719da4ec9b96c01adb4b0fd7f01af171688 Mon Sep 17 00:00:00 2001 From: Lin Sun Date: Tue, 29 Sep 2020 12:33:06 +0800 Subject: [PATCH] RTP: opus playback It's possible to play opus payload with libopus (https://opus-codec.org/). Closes #16882. Helped-by: Pascal Quantin Signed-off-by: Lin Sun Signed-off-by: Yuanzhi Li --- CMakeLists.txt | 18 +++++ CMakeOptions.txt | 1 + cmake/modules/FindOPUS.cmake | 57 ++++++++++++++++ cmakeconfig.h.in | 3 + docbook/release-notes.adoc | 1 + packaging/nsis/CMakeLists.txt | 2 +- packaging/nsis/wireshark.nsi | 1 + packaging/rpm/wireshark.spec.in | 9 +++ packaging/wix/CMakeLists.txt | 4 +- packaging/wix/Plugins.wxi | 6 +- plugins/codecs/opus_dec/CMakeLists.txt | 70 +++++++++++++++++++ plugins/codecs/opus_dec/opusdecode.c | 95 ++++++++++++++++++++++++++ tools/debian-setup.sh | 4 ++ tools/macos-setup.sh | 53 ++++++++++++++ tools/rpm-setup.sh | 3 + tools/win-setup.ps1 | 7 +- 16 files changed, 328 insertions(+), 6 deletions(-) create mode 100644 cmake/modules/FindOPUS.cmake create mode 100644 plugins/codecs/opus_dec/CMakeLists.txt create mode 100644 plugins/codecs/opus_dec/opusdecode.c diff --git a/CMakeLists.txt b/CMakeLists.txt index ccdac86879..f1534eab14 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1173,6 +1173,8 @@ ws_find_package(BCG729 ENABLE_BCG729 HAVE_BCG729) ws_find_package(ILBC ENABLE_ILBC HAVE_ILBC) +ws_find_package(OPUS ENABLE_OPUS HAVE_OPUS) + # CMake 3.9 and below used 'LIBXML2_LIBRARIES' as the name of the cache entry # storing the find_library result. Transfer it to the new cache variable such # that reset_find_package can detect and clear outdated cache variables. @@ -1494,6 +1496,11 @@ if(ENABLE_PLUGINS) plugins/codecs/iLBC ) endif() + if(OPUS_FOUND) + list(APPEND PLUGIN_SRC_DIRS + plugins/codecs/opus_dec + ) + endif() if(SBC_FOUND) list(APPEND PLUGIN_SRC_DIRS plugins/codecs/sbc @@ -1613,6 +1620,11 @@ set_package_properties(ILBC PROPERTIES URL "https://github.com/TimothyGu/libilbc" PURPOSE "Support for iLBC codec in RTP player" ) +set_package_properties(OPUS PROPERTIES + DESCRIPTION "opus decoder" + URL "https://opus-codec.org/" + PURPOSE "Support for opus codec in RTP player" +) set_package_properties(LIBXML2 PROPERTIES DESCRIPTION "XML parsing library" URL "http://xmlsoft.org/" @@ -1907,6 +1919,9 @@ if(WIN32) if (ILBC_FOUND) list (APPEND OPTIONAL_DLLS "${ILBC_DLL_DIR}/${ILBC_DLL}") endif(ILBC_FOUND) + if (OPUS_FOUND) + list (APPEND OPTIONAL_DLLS "${OPUS_DLL_DIR}/${OPUS_DLL}") + endif(OPUS_FOUND) if (LIBXML2_FOUND) foreach( _dll ${LIBXML2_DLLS} ) list (APPEND OPTIONAL_DLLS "${LIBXML2_DLL_DIR}/${_dll}") @@ -3037,6 +3052,9 @@ if(RPMBUILD_EXECUTABLE) if (ILBC_FOUND) list(APPEND _rpmbuild_with_args --with ilbc) endif() + if (OPUS_FOUND) + list(APPEND _rpmbuild_with_args --with opus) + endif() if (LIBXML2_FOUND) list(APPEND _rpmbuild_with_args --with libxml2) endif() diff --git a/CMakeOptions.txt b/CMakeOptions.txt index 81a330548f..143df081e8 100644 --- a/CMakeOptions.txt +++ b/CMakeOptions.txt @@ -99,6 +99,7 @@ option(ENABLE_SPANDSP "Build with G.722/G.726 codecs support in RTP Player" O option(ENABLE_BCG729 "Build with G.729 codec support in RTP Player" ON) option(ENABLE_ILBC "Build with iLBC codec support in RTP Player" ON) option(ENABLE_LIBXML2 "Build with libxml2 support" ON) +option(ENABLE_OPUS "Build with opus support" ON) # How to install set(DUMPCAP_INSTALL_OPTION "normal" CACHE STRING "Permissions to install") diff --git a/cmake/modules/FindOPUS.cmake b/cmake/modules/FindOPUS.cmake new file mode 100644 index 0000000000..436911d8e5 --- /dev/null +++ b/cmake/modules/FindOPUS.cmake @@ -0,0 +1,57 @@ +# Find the system's opus includes and library +# +# OPUS_INCLUDE_DIRS - where to find opus.h +# OPUS_LIBRARIES - List of libraries when using opus +# OPUS_FOUND - True if opus found +# OPUS_DLL_DIR - (Windows) Path to the opus DLL +# OPUS_DLL - (Windows) Name of the opus DLL + +include( FindWSWinLibs ) +FindWSWinLibs( "opus-.*" "OPUS_HINTS" ) + +if (NOT WIN32) + find_package(PkgConfig) + pkg_search_module(OPUS opus) +endif() + +find_path(OPUS_INCLUDE_DIR + NAMES opus/opus.h + HINTS + "${OPUS_INCLUDE_DIRS}" + "${OPUS_HINTS}/include" + PATHS /usr/local/include /usr/include +) + +find_library(OPUS_LIBRARY + NAMES opus + HINTS + "${OPUS_LIBRARY_DIRS}" + "${OPUS_HINTS}/lib" + PATHS /usr/local/lib /usr/lib +) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(OPUS DEFAULT_MSG OPUS_LIBRARY OPUS_INCLUDE_DIR) + +if( OPUS_FOUND ) + set( OPUS_INCLUDE_DIRS ${OPUS_INCLUDE_DIR} ) + set( OPUS_LIBRARIES ${OPUS_LIBRARY} ) + if (WIN32) + set ( OPUS_DLL_DIR "${OPUS_HINTS}/bin" + CACHE PATH "Path to opus DLL" + ) + file( GLOB _opus_dll RELATIVE "${OPUS_DLL_DIR}" + "${OPUS_DLL_DIR}/opus.dll" + ) + set ( OPUS_DLL ${_opus_dll} + # We're storing filenames only. Should we use STRING instead? + CACHE FILEPATH "opus DLL file name" + ) + mark_as_advanced( OPUS_DLL_DIR OPUS_DLL ) + endif() +else() + set( OPUS_INCLUDE_DIRS ) + set( OPUS_LIBRARIES ) +endif() + +mark_as_advanced( OPUS_LIBRARIES OPUS_INCLUDE_DIRS ) diff --git a/cmakeconfig.h.in b/cmakeconfig.h.in index b1c466c989..f276a775b0 100644 --- a/cmakeconfig.h.in +++ b/cmakeconfig.h.in @@ -235,6 +235,9 @@ /* Define to 1 if you have the ilbc library. */ #cmakedefine HAVE_ILBC 1 +/* Define to 1 if you have the opus library. */ +#cmakedefine HAVE_OPUS 1 + /* Define to 1 if you have the speexdsp library. */ #cmakedefine HAVE_SPEEXDSP 1 diff --git a/docbook/release-notes.adoc b/docbook/release-notes.adoc index 050fe72a2e..346ac28742 100644 --- a/docbook/release-notes.adoc +++ b/docbook/release-notes.adoc @@ -50,6 +50,7 @@ The following features are new (or have been significantly updated) since versio * Dissectors based on Protobuf can register themselves to a new 'protobuf_field' dissector table, which is keyed with the full names of fields, for further parsing fields of BYTES or STRING type. * Wireshark is able to decode, play, and save iLBC payload on platforms where the https://github.com/TimothyGu/libilbc[iLBC library] is available. +* Wireshark is able to decode, play, and save opus payload on platforms where the https://opus-codec.org/[opus library] is available. * “Decode As” entries can now be copied from other profiles using a button in the dialog. * sshdump can now be copied to multiple instances. Each instance will show up a different interface and will have its own profile. * The main window now supports a packet diagram view, which shows each packet as a textbook-style diagram. diff --git a/packaging/nsis/CMakeLists.txt b/packaging/nsis/CMakeLists.txt index d01841eee9..87a35a75db 100644 --- a/packaging/nsis/CMakeLists.txt +++ b/packaging/nsis/CMakeLists.txt @@ -150,7 +150,7 @@ foreach(_dll ${CARES_DLL} ${GCRYPT_DLLS} ${GNUTLS_DLLS} ${KERBEROS_DLLS} ${LIBSSH_DLL} ${LUA_DLL} ${LZ4_DLL} ${NGHTTP2_DLL} ${SBC_DLL} ${SMI_DLL} ${SNAPPY_DLL} ${SPANDSP_DLL} ${BCG729_DLL} ${LIBXML2_DLLS} ${WINSPARKLE_DLL} - ${ZLIB_DLL} ${BROTLI_DLLS} ${ZSTD_DLL} ${ILBC_DLL} + ${ZLIB_DLL} ${BROTLI_DLLS} ${ZSTD_DLL} ${ILBC_DLL} ${OPUS_DLL} # Needed for mmdbresolve ${MAXMINDDB_DLL} ) diff --git a/packaging/nsis/wireshark.nsi b/packaging/nsis/wireshark.nsi index d99eca2675..f96a14a574 100644 --- a/packaging/nsis/wireshark.nsi +++ b/packaging/nsis/wireshark.nsi @@ -1058,6 +1058,7 @@ File "${STAGING_DIR}\plugins\${VERSION_MAJOR}.${VERSION_MINOR}\codecs\g729.dll" File "${STAGING_DIR}\plugins\${VERSION_MAJOR}.${VERSION_MINOR}\codecs\l16mono.dll" File "${STAGING_DIR}\plugins\${VERSION_MAJOR}.${VERSION_MINOR}\codecs\sbc.dll" File "${STAGING_DIR}\plugins\${VERSION_MAJOR}.${VERSION_MINOR}\codecs\ilbc.dll" +File "${STAGING_DIR}\plugins\${VERSION_MAJOR}.${VERSION_MINOR}\codecs\opus_dec.dll" SectionEnd Section "Configuration Profiles" SecProfiles diff --git a/packaging/rpm/wireshark.spec.in b/packaging/rpm/wireshark.spec.in index 61e42be0c8..6ca197818d 100644 --- a/packaging/rpm/wireshark.spec.in +++ b/packaging/rpm/wireshark.spec.in @@ -21,6 +21,7 @@ %bcond_with brotli %bcond_with zstd %bcond_with ilbc +%bcond_with opus # Set at most one of these two: # Note that setcap requires rpmbuild 4.7.0 or later. @@ -350,6 +351,11 @@ cmake3 \ %else -DENABLE_ILBC=OFF \ %endif +%if %{with opus} + -DENABLE_OPUS=ON \ +%else + -DENABLE_OPUS=OFF \ +%endif %if %{with ninja} # Older RPM-based distributions used ninja-build in order to prevent a collision with @@ -507,6 +513,9 @@ update-mime-database %{_datadir}/mime &> /dev/null || : %{_libdir}/pkgconfig/wireshark.pc %changelog +* Tue Sep 29 2020 Lin Sun +- Added opus codec as an option + * Sun Jan 19 2020 Jiri Novak - Added ilbc codec as an option diff --git a/packaging/wix/CMakeLists.txt b/packaging/wix/CMakeLists.txt index eb625ebc10..b50975f431 100644 --- a/packaging/wix/CMakeLists.txt +++ b/packaging/wix/CMakeLists.txt @@ -135,7 +135,7 @@ foreach(_dll ${CARES_DLL} ${GCRYPT_DLLS} ${GNUTLS_DLLS} ${KERBEROS_DLLS} ${LIBSSH_DLL} ${LUA_DLL} ${LZ4_DLL} ${NGHTTP2_DLL} ${SBC_DLL} ${SMI_DLL} ${SNAPPY_DLL} ${SPANDSP_DLL} ${BCG729_DLL} ${LIBXML2_DLLS} ${WINSPARKLE_DLL} - ${ZLIB_DLL} ${BROTLI_DLLS} ${ZSTD_DLL} ${ILBC_DLL} + ${ZLIB_DLL} ${BROTLI_DLLS} ${ZSTD_DLL} ${ILBC_DLL} ${OPUS_DLL} # Required for mmdbresolve ${MAXMINDDB_DLL} ) @@ -174,7 +174,7 @@ foreach(_dll ${CARES_DLL} ${GCRYPT_DLLS} ${GNUTLS_DLLS} ${KERBEROS_DLLS} ${LIBSSH_DLL} ${LUA_DLL} ${LZ4_DLL} ${NGHTTP2_DLL} ${SBC_DLL} ${SMI_DLL} ${SNAPPY_DLL} ${SPANDSP_DLL} ${BCG729_DLL} ${LIBXML2_DLLS} ${WINSPARKLE_DLL} - ${ZLIB_DLL} ${BROTLI_DLLS} ${ZSTD_DLL} ${ILBC_DLL} + ${ZLIB_DLL} ${BROTLI_DLLS} ${ZSTD_DLL} ${ILBC_DLL} ${OPUS_DLL} # mmdbresolve ${MAXMINDDB_DLL} ) diff --git a/packaging/wix/Plugins.wxi b/packaging/wix/Plugins.wxi index 384acd7e1d..e6dfd04fa0 100644 --- a/packaging/wix/Plugins.wxi +++ b/packaging/wix/Plugins.wxi @@ -1,4 +1,4 @@ - + @@ -129,6 +129,9 @@ + + + @@ -140,6 +143,7 @@ + diff --git a/plugins/codecs/opus_dec/CMakeLists.txt b/plugins/codecs/opus_dec/CMakeLists.txt new file mode 100644 index 0000000000..aee83a33c9 --- /dev/null +++ b/plugins/codecs/opus_dec/CMakeLists.txt @@ -0,0 +1,70 @@ +# CMakeLists.txt +# +# Wireshark - Network traffic analyzer +# By Gerald Combs +# 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(opus_dec 0 1 0 0) + +set(CODEC_SRC + opusdecode.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}/codecs + ${CMAKE_CURRENT_SOURCE_DIR} +) + +register_plugin_files(plugin.c + plugin_codec + ${CODEC_SRC} +) + +add_plugin_library(opus_dec codecs) + +target_link_libraries(opus_dec wsutil ${OPUS_LIBRARIES}) + +target_include_directories(opus_dec SYSTEM PRIVATE ${OPUS_INCLUDE_DIRS}) + +install_plugin(opus_dec codecs) + +file(GLOB CODEC_HEADERS RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "*.h") +CHECKAPI( + NAME + opus + SWITCHES + -g abort -g termoutput + 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/opus_dec/opusdecode.c b/plugins/codecs/opus_dec/opusdecode.c new file mode 100644 index 0000000000..d4d9d34a79 --- /dev/null +++ b/plugins/codecs/opus_dec/opusdecode.c @@ -0,0 +1,95 @@ +/* opusdecode.c + * opus codec + * + * Wireshark - Network traffic analyzer + * By Gerald Combs + * Copyright 1998 Gerald Combs + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" +#include +#include "opus/opus.h" + +#include "wsutil/codecs.h" +#include "ws_attributes.h" + +static void * +codec_opus_init(void) +{ + OpusDecoder *state; + int err = OPUS_INTERNAL_ERROR; + /* always use maximum 48000 to cover all 8k/12k/16k/24k/48k */ + state = opus_decoder_create(48000, 1, &err); + return state; +} + +static void +codec_opus_release(void *ctx) +{ + OpusDecoder* state = (OpusDecoder*)ctx; + if (!state) { + return; /* out-of-memory; */ + } + opus_decoder_destroy(state); +} + +static unsigned +codec_opus_get_channels(void *ctx _U_) +{ + return 1; +} + +static unsigned +codec_opus_get_frequency(void *ctx _U_) +{ + /* although can set kinds of fs, but we set 48K now */ + return 48000; +} + +static size_t +codec_opus_decode(void *ctx , const void *input, size_t inputSizeBytes, + void *output, size_t *outputSizeBytes ) +{ + OpusDecoder *state = (OpusDecoder *)ctx; + + if (!ctx) { + return 0; /* out-of-memory */ + } + // reserve space for the first time + if (!output || !outputSizeBytes) { + return 1920; + } + const unsigned char *data = (const unsigned char *)input; + opus_int32 len= (opus_int32)inputSizeBytes; + opus_int16 *pcm = (opus_int16*)(output); + int frame_size = 960; + int ret = opus_decode(state, data, len, pcm, frame_size, 0); + + if (ret < 0) { + return 0; + } + *outputSizeBytes = ret * 2; + return *outputSizeBytes; +} + +void +codec_register_opus(void) +{ + register_codec("opus", codec_opus_init, codec_opus_release, + codec_opus_get_channels, codec_opus_get_frequency, codec_opus_decode); +} + +/* + * Editor modelines - https://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: + */ diff --git a/tools/debian-setup.sh b/tools/debian-setup.sh index 333e0f474b..29812ff5a8 100755 --- a/tools/debian-setup.sh +++ b/tools/debian-setup.sh @@ -159,6 +159,10 @@ echo "libsystemd-dev is unavailable" add_package ADDITIONAL_LIST libilbc-dev || echo "libilbc-dev is unavailable" +# opus library libopus-dev +add_package ADDITIONAL_LIST libopus-dev || + echo "libopus-dev is unavailable" + # softhsm2 2.0.0: Ubuntu 16.04 # softhsm2 2.2.0: Debian >= jessie-backports, Ubuntu 18.04 # softhsm2 >= 2.4.0: Debian >= buster, Ubuntu >= 18.10 diff --git a/tools/macos-setup.sh b/tools/macos-setup.sh index 3b3486b06e..cc8183c646 100755 --- a/tools/macos-setup.sh +++ b/tools/macos-setup.sh @@ -170,6 +170,7 @@ if [ "$SPANDSP_VERSION" ]; then fi BCG729_VERSION=1.0.2 ILBC_VERSION=2.0.2 +OPUS_VERSION=1.3.1 PYTHON3_VERSION=3.7.1 BROTLI_VERSION=1.0.7 # minizip @@ -1776,6 +1777,42 @@ uninstall_ilbc() { fi } +install_opus() { + if [ "$OPUS_VERSION" -a ! -f opus-$OPUS_VERSION-done ] ; then + echo "Downloading, building, and installing opus:" + [ -f opus-$OPUS_VERSION.tar.gz ] || curl -L -O https://archive.mozilla.org/pub/opus/opus-$OPUS_VERSION.tar.gz || exit 1 + $no_build && echo "Skipping installation" && return + gzcat opus-$OPUS_VERSION.tar.gz | tar xf - || exit 1 + cd opus-$OPUS_VERSION + CFLAGS="$CFLAGS $VERSION_MIN_FLAGS $SDKFLAGS" CXXFLAGS="$CXXFLAGS $VERSION_MIN_FLAGS $SDKFLAGS" LDFLAGS="$LDFLAGS $VERSION_MIN_FLAGS $SDKFLAGS" ./configure || exit 1 + make $MAKE_BUILD_OPTS || exit 1 + $DO_MAKE_INSTALL || exit 1 + cd .. + touch opus-$OPUS_VERSION-done + fi +} + +uninstall_opus() { + if [ ! -z "$installed_opus_version" ] ; then + echo "Uninstalling opus:" + cd opus-$installed_opus_version + $DO_MAKE_UNINSTALL || exit 1 + make distclean || exit 1 + cd .. + rm opus-$installed_opus_version-done + + if [ "$#" -eq 1 -a "$1" = "-r" ] ; then + # + # Get rid of the previously downloaded and unpacked version. + # + rm -rf opus-$installed_opus_version + rm -rf opus-$installed_opus_version.tar.gz + fi + + installed_opus_version="" + fi +} + install_python3() { local macver=10.9 if [[ $DARWIN_MAJOR_VERSION -lt 13 ]]; then @@ -1987,6 +2024,17 @@ install_all() { uninstall_ilbc -r fi + if [ -n "$installed_opus_version" ] \ + && [ "$installed_opus_version" != "$OPUS_VERSION" ] ; then + echo "Installed opus version is $installed_opus_version" + if [ -z "$OPUS_VERSION" ] ; then + echo "opus is not requested" + else + echo "Requested opus version is $OPUS_VERSION" + fi + uninstall_opus -r + fi + if [ ! -z "$installed_spandsp_version" -a \ "$installed_spandsp_version" != "$SPANDSP_VERSION" ] ; then echo "Installed SpanDSP version is $installed_spandsp_version" @@ -2475,6 +2523,8 @@ install_all() { install_ilbc + install_opus + install_python3 install_brotli @@ -2506,6 +2556,8 @@ uninstall_all() { uninstall_python3 + uninstall_opus + uninstall_ilbc uninstall_bcg729 @@ -2714,6 +2766,7 @@ then installed_speexdsp_version=`ls speexdsp-*-done 2>/dev/null | sed 's/speexdsp-\(.*\)-done/\1/'` installed_bcg729_version=`ls bcg729-*-done 2>/dev/null | sed 's/bcg729-\(.*\)-done/\1/'` installed_ilbc_version=`ls ilbc-*-done 2>/dev/null | sed 's/ilbc-\(.*\)-done/\1/'` + installed_opus_version=`ls opus-*-done 2>/dev/null | sed 's/opus-\(.*\)-done/\1/'` installed_python3_version=`ls python3-*-done 2>/dev/null | sed 's/python3-\(.*\)-done/\1/'` installed_brotli_version=`ls brotli-*-done 2>/dev/null | sed 's/brotli-\(.*\)-done/\1/'` installed_minizip_version=`ls minizip-*-done 2>/dev/null | sed 's/minizip-\(.*\)-done/\1/'` diff --git a/tools/rpm-setup.sh b/tools/rpm-setup.sh index bc4cd5a150..132320028d 100755 --- a/tools/rpm-setup.sh +++ b/tools/rpm-setup.sh @@ -217,6 +217,9 @@ echo "libnl3/libnl are unavailable" >&2 add_package ADDITIONAL_LIST ilbc-devel || echo "ilbc is unavailable" >&2 +add_package ADDITIONAL_LIST opus-devel || + echo "opus is unavailable" >&2 + ACTUAL_LIST=$BASIC_LIST # Now arrange for optional support libraries diff --git a/tools/win-setup.ps1 b/tools/win-setup.ps1 index a6b3214323..8040656c63 100644 --- a/tools/win-setup.ps1 +++ b/tools/win-setup.ps1 @@ -69,8 +69,8 @@ Param( # trouble instead of trying to catch exceptions everywhere. $ErrorActionPreference = "Stop" -$Win64CurrentTag = "2020-09-27" -$Win32CurrentTag = "2020-09-27" +$Win64CurrentTag = "2020-09-30" +$Win32CurrentTag = "2020-09-30" # Archive file / SHA256 $Win64Archives = @{ @@ -90,6 +90,7 @@ $Win64Archives = @{ "MaxMindDB-1.3.2-win64ws.zip" = "9025c43e9b21ff0bfbaf206b8ed96e2920ef1434107f789e4c7c0c1d8b508952"; "minizip-1.2.11-4-win64ws.zip" = "dd6bf24e2d946465ad19aa4f8c38e0db91da6585887935de68011982cd6fb2cb"; "nghttp2-1.39.2-win64ws.zip" = "a53f4074bffd919539d90c8d0cde2ea6a10a383f14e38b706e7e70e55476e6bf"; + "opus-1.3.1-3-win64ws.zip" = "1f7a55a6d2d7215dffa4a43bca8ca05024bd4ba1ac3d0d0c405fd38b09cc2205"; "sbc-1.3-1-win64ws.zip" = "08cef6898c421277a6582ef3225d8820f74a037cbd5b6e673a4d8f4593ce80a1"; "snappy-1.1.3-1-win64ws.zip" = "692a15e70f2cdeca621988a46e936d3651e7feb5176981f2656a5e913c394bcc"; "spandsp-0.0.6-1-win64ws.zip" = "0e46c61a5a8dca562c36e88a8962a50c1ec1a9fcf89dd05996dac5a79e454527"; @@ -115,6 +116,7 @@ $Win32Archives = @{ "MaxMindDB-1.3.2-win32ws.zip" = "5c8b4bf3092da8fad6edb005a5283c6a74b7e115a50da010953eed77d33c11b7"; "minizip-1.2.11-4-win32ws.zip" = "41e113930902c2519c4644e8307a0cc51c5855e001e1e69768c48deb376142d0"; "nghttp2-1.39.2-win32ws.zip" = "b511260befc210c1d6d0e920e5f5c47b9e6a21baee6e9874ef12a92093abd245"; + "opus-1.3.1-3-win32ws.zip" = "9700b14c8945fcfed2188b806a2ee7e8628922c22569a4c5183075f3dc133177"; "sbc-1.3-1-win32ws.zip" = "ad37825e9ace4b849a5442c08f1ed7e30634e6b774bba4307fb86f35f82e71ba"; "snappy-1.1.3-1-win32ws.zip" = "2508ef7c5d27655c356d7b86a00ac887fc178eab5df63595b8793953dae5c379"; "spandsp-0.0.6-1-win32ws.zip" = "3c25f2f4d641d4257ec9922f6db77346a8eed2e360e7d0e27b828ade19c4705b"; @@ -176,6 +178,7 @@ $CleanupItems = @( "MaxMindDB-1.3.2-win??ws" "minizip-*-win??ws" "nghttp2-*-win??ws" + "opus-1.3.1-?-win??ws" "portaudio_v19" "portaudio_v19_2" "sbc-1.3-win??ws"