diff --git a/BuildScripts/Opus/build.sh b/BuildScripts/Opus/build.sh deleted file mode 100755 index 283dba8..0000000 --- a/BuildScripts/Opus/build.sh +++ /dev/null @@ -1,144 +0,0 @@ -#!/bin/bash - -set -e - -source config.sh - -# Number of CPUs (for make -j) -NCPU=`sysctl -n hw.ncpu` -if test x$NJOB = x; then - NJOB=$NCPU -fi - -PLATFORMBASE=$(xcode-select -print-path)"/Platforms" - -SCRIPT_DIR=$( (cd -P $(dirname $0) && pwd) ) -DIST_DIR_BASE=${DIST_DIR_BASE:="$SCRIPT_DIR/dist"} - -if [ ! -d opus ] -then - echo "opus source directory does not exist, run sync.sh" -fi - -# PATH=${SCRIPT_DIR}/gas-preprocessor/:$PATH - -for ARCH in $ARCHS -do - OPUS_DIR=opus-$ARCH - if [ ! -d $OPUS_DIR ] - then - echo "Directory $OPUS_DIR does not exist, run sync.sh" - exit 1 - fi - echo "Compiling source for $ARCH in directory $OPUS_DIR" - echo "cd $OPUS_DIR" - cd $OPUS_DIR - - DIST_DIR=$DIST_DIR_BASE-$ARCH - echo "mkdir -p $DIST_DIR" - mkdir -p $DIST_DIR - CFLAGS_ARCH=$ARCH - case $ARCH in - armv7) - EXTRA_FLAGS="--with-pic --enable-fixed-point" - EXTRA_CFLAGS="-mcpu=cortex-a8 -mfpu=neon -miphoneos-version-min=7.1" - PLATFORM="${PLATFORMBASE}/iPhoneOS.platform" - IOSSDK=iPhoneOS - ;; - armv7s) - EXTRA_FLAGS="--with-pic --enable-fixed-point" - EXTRA_CFLAGS="-mcpu=cortex-a9 -mfpu=neon -miphoneos-version-min=7.1" - PLATFORM="${PLATFORMBASE}/iPhoneOS.platform" - IOSSDK=iPhoneOS - ;; - aarch64) - CFLAGS_ARCH="arm64" - EXTRA_FLAGS="--with-pic --enable-fixed-point" - EXTRA_CFLAGS="-miphoneos-version-min=7.1" - PLATFORM="${PLATFORMBASE}/iPhoneOS.platform" - IOSSDK=iPhoneOS - ;; - x86_64) - EXTRA_FLAGS="--with-pic" - EXTRA_CFLAGS="-miphoneos-version-min=7.1" - PLATFORM="${PLATFORMBASE}/iPhoneSimulator.platform" - IOSSDK=iPhoneSimulator - ;; - i386) - EXTRA_FLAGS="--with-pic" - EXTRA_CFLAGS="-miphoneos-version-min=7.1" - PLATFORM="${PLATFORMBASE}/iPhoneSimulator.platform" - IOSSDK=iPhoneSimulator - ;; - *) - echo "Unsupported architecture ${ARCH}" - exit 1 - ;; - esac - - echo "Configuring opus for $ARCH..." - echo "./autogen.sh" - ./autogen.sh - - CFLAGS="-g -O2 -pipe -arch ${CFLAGS_ARCH} \ - -isysroot ${PLATFORM}/Developer/SDKs/${IOSSDK}.sdk \ - -I${PLATFORM}/Developer/SDKs/${IOSSDK}.sdk/usr/include \ - ${EXTRA_CFLAGS}" - LDFLAGS="-arch ${CFLAGS_ARCH} \ - -isysroot ${PLATFORM}/Developer/SDKs/${IOSSDK}.sdk \ - -L${PLATFORM}/Developer/SDKs/${IOSSDK}.sdk/usr/lib" - - echo "CFLAGS=$CFLAGS" - echo "LDFLAGS=$LDFLAGS" - - export CFLAGS - export LDFLAGS - - export CXXCPP="/usr/bin/cpp" - export CPP="$CXXCPP" - export CXX="/usr/bin/gcc" - export CC="/usr/bin/gcc" - export LD="/usr/bin/ld" - export AR="/usr/bin/ar" - export AS="/usr/bin/ls" - export NM="/usr/bin/nm" - export RANLIB="/usr/bin/ranlib" - export STRIP="/usr/bin/strip" - echo "./configure \ - --prefix=$DIST_DIR \ - --host=${ARCH}-apple-darwin \ - --with-sysroot=${PLATFORM}/Developer/SDKs/${IOSSDK}.sdk \ - --enable-static=yes \ - --enable-shared=no \ - --disable-doc \ - ${EXTRA_FLAGS}" - - ./configure \ - --prefix=$DIST_DIR \ - --host=${ARCH}-apple-darwin \ - --with-sysroot=${PLATFORM}/Developer/SDKs/${IOSSDK}.sdk \ - --enable-static=yes \ - --enable-shared=no \ - --disable-doc \ - ${EXTRA_FLAGS} - - echo "Installing opus for $ARCH..." - echo "make clean" - make clean - echo "make -j$NJOB V=1" - make -j$NJOB V=1 - echo "make install" - make install - - echo "cd $SCRIPT_DIR" - cd $SCRIPT_DIR - - if [ -d $DIST_DIR/bin ] - then - rm -rf $DIST_DIR/bin - fi - if [ -d $DIST_DIR/share ] - then - rm -rf $DIST_DIR/share - fi -done diff --git a/BuildScripts/Opus/combine.sh b/BuildScripts/Opus/combine.sh deleted file mode 100755 index 33c0c13..0000000 --- a/BuildScripts/Opus/combine.sh +++ /dev/null @@ -1,51 +0,0 @@ -#!/bin/bash - -set -e - -source config.sh - -for ARCH in $ARCHS -do - - if [ -d dist-$ARCH ] - then - MAIN_ARCH=$ARCH - fi -done - -if [ -z "$MAIN_ARCH" ] -then - echo "Please compile an architecture" - exit 1 -fi - - -OUTPUT_DIR="dist-uarch" -rm -rf $OUTPUT_DIR - -mkdir -p $OUTPUT_DIR/lib $OUTPUT_DIR/include - -for LIB in dist-$MAIN_ARCH/lib/*.a -do - LIB=`basename $LIB` - LIPO_CREATE="" - for ARCH in $ARCHS - do - LIPO_ARCH=$ARCH - if [ "$ARCH" = "aarch64" ]; - then - LIPO_ARCH="arm64" - fi - if [ -d dist-$ARCH ] - then - LIPO_CREATE="$LIPO_CREATE-arch $LIPO_ARCH dist-$ARCH/lib/$LIB " - fi - done - OUTPUT="$OUTPUT_DIR/lib/$LIB" - echo "Creating: $OUTPUT" - xcrun -sdk iphoneos lipo -create $LIPO_CREATE -output $OUTPUT - xcrun -sdk iphoneos lipo -info $OUTPUT -done - -echo "Copying headers from dist-$MAIN_ARCH..." -cp -R dist-$MAIN_ARCH/include/* $OUTPUT_DIR/include diff --git a/BuildScripts/Opus/config.sh b/BuildScripts/Opus/config.sh deleted file mode 100755 index 63a9f44..0000000 --- a/BuildScripts/Opus/config.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/bash - -OPUS_DIR="opus" -IOSSDK_VER=8.1 -ARCHS="armv7 armv7s aarch64 i386 x86_64" - -remove_arch() { - OLD_ARCHS="$ARCHS" - NEW_ARCHS="" - REMOVAL="$1" - - for ARCH in $OLD_ARCHS; do - if [ "$ARCH" != "$REMOVAL" ] ; then - NEW_ARCHS="$NEW_ARCHS $ARCH" - fi - done - - ARCHS=$NEW_ARCHS -} - -# armv7s is only supported in iOS 6.0+ -CHECK=`echo $IOSSDK_VER '>= 6.0' | bc -l` -if [ "$CHECK" = "0" ] ; then - remove_arch "armv7s" -fi - -# armv6 is not supported any more since iOS 6.0 -CHECK=`echo $IOSSDK_VER '< 6.0' | bc -l` -if [ "$CHECK" = "0" ] ; then - remove_arch "armv6" -fi - -echo 'Architectures to build:' $ARCHS - - - diff --git a/BuildScripts/Opus/sync.sh b/BuildScripts/Opus/sync.sh deleted file mode 100755 index 31f5239..0000000 --- a/BuildScripts/Opus/sync.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/sh - -set -e - -source config.sh - -SCRIPT_DIR=$( (cd -P $(dirname $0) && pwd) ) -DIST_DIR_BASE=${DIST_DIR_BASE:="$SCRIPT_DIR/dist"} - -cd opus -git checkout master -git pull origin master -cd .. - -for ARCH in $ARCHS -do - OPUS_DIR=opus-$ARCH - echo "Syncing source for $ARCH to directory $OPUS_DIR" - rsync opus/ $OPUS_DIR/ --exclude '.*' -a --delete -done diff --git a/BuildScripts/build-libopus.sh b/BuildScripts/build-libopus.sh new file mode 100755 index 0000000..ed68fc6 --- /dev/null +++ b/BuildScripts/build-libopus.sh @@ -0,0 +1,180 @@ +#!/bin/bash +# Builds libopus for iOS or tvOS. +# +# Copyright 2012 Mike Tigas +# +# Based on work by Felix Schulze on 16.12.10. +# Copyright 2010 Felix Schulze. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +########################################################################### +# Choose your libopus version and your currently-installed iOS SDK version: +# +TARGET="AppleTV" # "iPhone" +VERSION="1.3.1" +SDKVERSION="16.1" +MINVERSIONDEF="-mtvos-version-min=12.0" # "-miphoneos-version-min=12.0" + +########################################################################### +# +# Don't change anything under this line! +# +########################################################################### + +# by default, we won't build for debugging purposes +if [ "${DEBUG}" == "true" ]; then + echo "Compiling for debugging ..." + OPT_CFLAGS="-O0 -fno-inline -g" + OPT_LDFLAGS="" + OPT_CONFIG_ARGS="--enable-assertions --disable-asm" +else + OPT_CFLAGS="-Ofast -flto -g" + OPT_LDFLAGS="-flto" + OPT_CONFIG_ARGS="" +fi + + +# No need to change this since xcode build will only compile in the +# necessary bits from the libraries we create +ARCHS="x86_64 arm64" + +DEVELOPER=`xcode-select -print-path` +#DEVELOPER="/Applications/Xcode.app/Contents/Developer" + +cd "`dirname \"$0\"`" +REPOROOT=$(pwd) + +# Where we'll end up storing things in the end +OUTPUTDIR="${REPOROOT}/dependencies" +mkdir -p ${OUTPUTDIR}/include +mkdir -p ${OUTPUTDIR}/lib + + +BUILDDIR="${REPOROOT}/build" + +# where we will keep our sources and build from. +SRCDIR="${BUILDDIR}/src" +mkdir -p $SRCDIR +# where we will store intermediary builds +INTERDIR="${BUILDDIR}/built" +mkdir -p $INTERDIR + +######################################## + +cd $SRCDIR + +# Exit the script if an error happens +set -e + +if [ ! -e "${SRCDIR}/opus-${VERSION}.tar.gz" ]; then + echo "Downloading opus-${VERSION}.tar.gz" + curl -LO http://downloads.xiph.org/releases/opus/opus-${VERSION}.tar.gz +fi +echo "Using opus-${VERSION}.tar.gz" + +tar zxf opus-${VERSION}.tar.gz -C $SRCDIR +cd "${SRCDIR}/opus-${VERSION}" + +set +e # don't bail out of bash script if ccache doesn't exist +CCACHE=`which ccache` +if [ $? == "0" ]; then + echo "Building with ccache: $CCACHE" + CCACHE="${CCACHE} " +else + echo "Building without ccache" + CCACHE="" +fi +set -e # back to regular "bail out on error" mode + +export ORIGINALPATH=$PATH + +for ARCH in ${ARCHS} +do + if [ "${ARCH}" == "i386" ] || [ "${ARCH}" == "x86_64" ]; then + PLATFORM="${TARGET}Simulator" + EXTRA_CFLAGS="-arch ${ARCH}" + EXTRA_CONFIG="--host=x86_64-apple-darwin" + else + PLATFORM="${TARGET}OS" + EXTRA_CFLAGS="-arch ${ARCH}" + EXTRA_CONFIG="--host=arm-apple-darwin" + fi + + mkdir -p "${INTERDIR}/${PLATFORM}${SDKVERSION}-${ARCH}.sdk" + + ./configure --enable-float-approx --disable-shared --enable-static --with-pic --disable-extra-programs --disable-doc ${EXTRA_CONFIG} \ + --prefix="${INTERDIR}/${PLATFORM}${SDKVERSION}-${ARCH}.sdk" \ + LDFLAGS="$LDFLAGS ${OPT_LDFLAGS} -fPIE ${MINVERSIONDEF} -L${OUTPUTDIR}/lib" \ + CFLAGS="$CFLAGS ${EXTRA_CFLAGS} ${OPT_CFLAGS} -fPIE ${MINVERSIONDEF} -I${OUTPUTDIR}/include -isysroot ${DEVELOPER}/Platforms/${PLATFORM}.platform/Developer/SDKs/${PLATFORM}${SDKVERSION}.sdk" \ + + # Build the application and install it to the fake SDK intermediary dir + # we have set up. Make sure to clean up afterward because we will re-use + # this source tree to cross-compile other targets. + make -j$(nproc) + make install + make clean +done + +######################################## + +echo "Build library..." + +# These are the libs that comprise libopus. +OUTPUT_LIBS="libopus.a" +for OUTPUT_LIB in ${OUTPUT_LIBS}; do + INPUT_LIBS="" + for ARCH in ${ARCHS}; do + if [ "${ARCH}" == "i386" ] || [ "${ARCH}" == "x86_64" ]; + then + PLATFORM="${TARGET}Simulator" + else + PLATFORM="${TARGET}OS" + fi + INPUT_ARCH_LIB="${INTERDIR}/${PLATFORM}${SDKVERSION}-${ARCH}.sdk/lib/${OUTPUT_LIB}" + if [ -e $INPUT_ARCH_LIB ]; then + INPUT_LIBS="${INPUT_LIBS} ${INPUT_ARCH_LIB}" + fi + done + # Combine the three architectures into a universal library. + if [ -n "$INPUT_LIBS" ]; then + lipo -create $INPUT_LIBS \ + -output "${OUTPUTDIR}/lib/${OUTPUT_LIB}" + else + echo "$OUTPUT_LIB does not exist, skipping (are the dependencies installed?)" + fi +done + +for ARCH in ${ARCHS}; do + if [ "${ARCH}" == "i386" ] || [ "${ARCH}" == "x86_64" ]; + then + PLATFORM="${TARGET}Simulator" + else + PLATFORM="${TARGET}OS" + fi + cp -R ${INTERDIR}/${PLATFORM}${SDKVERSION}-${ARCH}.sdk/include/* ${OUTPUTDIR}/include/ + if [ $? == "0" ]; then + # We only need to copy the headers over once. (So break out of forloop + # once we get first success.) + break + fi +done + + +#################### + +echo "Building done." +echo "Cleaning up..." +rm -fr ${INTERDIR} +rm -fr "${SRCDIR}/opus-${VERSION}" +echo "Done." diff --git a/libs/opus/include/opus/opus.h b/libs/opus/include/opus/opus.h index 5be73dd..d282f21 100644 --- a/libs/opus/include/opus/opus.h +++ b/libs/opus/include/opus/opus.h @@ -531,7 +531,7 @@ OPUS_EXPORT int opus_packet_parse( const unsigned char *frames[48], opus_int16 size[48], int *payload_offset -) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4); +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(5); /** Gets the bandwidth of an Opus packet. * @param [in] data char*: Opus packet diff --git a/libs/opus/include/opus/opus_defines.h b/libs/opus/include/opus/opus_defines.h index 315412d..d141418 100644 --- a/libs/opus/include/opus/opus_defines.h +++ b/libs/opus/include/opus/opus_defines.h @@ -165,8 +165,13 @@ extern "C" { #define OPUS_GET_EXPERT_FRAME_DURATION_REQUEST 4041 #define OPUS_SET_PREDICTION_DISABLED_REQUEST 4042 #define OPUS_GET_PREDICTION_DISABLED_REQUEST 4043 - /* Don't use 4045, it's already taken by OPUS_GET_GAIN_REQUEST */ +#define OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST 4046 +#define OPUS_GET_PHASE_INVERSION_DISABLED_REQUEST 4047 +#define OPUS_GET_IN_DTX_REQUEST 4049 + +/** Defines for the presence of extended APIs. */ +#define OPUS_HAVE_OPUS_PROJECTION_H /* Macros to trigger compilation errors when the wrong types are provided to a CTL */ #define __opus_check_int(x) (((void)((x) == (opus_int32)0)), (opus_int32)(x)) @@ -208,6 +213,9 @@ extern "C" { #define OPUS_FRAMESIZE_20_MS 5004 /**< Use 20 ms frames */ #define OPUS_FRAMESIZE_40_MS 5005 /**< Use 40 ms frames */ #define OPUS_FRAMESIZE_60_MS 5006 /**< Use 60 ms frames */ +#define OPUS_FRAMESIZE_80_MS 5007 /**< Use 80 ms frames */ +#define OPUS_FRAMESIZE_100_MS 5008 /**< Use 100 ms frames */ +#define OPUS_FRAMESIZE_120_MS 5009 /**< Use 120 ms frames */ /**@}*/ @@ -566,7 +574,9 @@ extern "C" { *
OPUS_FRAMESIZE_20_MS
Use 20 ms frames.
*
OPUS_FRAMESIZE_40_MS
Use 40 ms frames.
*
OPUS_FRAMESIZE_60_MS
Use 60 ms frames.
- *
OPUS_FRAMESIZE_VARIABLE
Optimize the frame size dynamically.
+ *
OPUS_FRAMESIZE_80_MS
Use 80 ms frames.
+ *
OPUS_FRAMESIZE_100_MS
Use 100 ms frames.
+ *
OPUS_FRAMESIZE_120_MS
Use 120 ms frames.
* * @hideinitializer */ #define OPUS_SET_EXPERT_FRAME_DURATION(x) OPUS_SET_EXPERT_FRAME_DURATION_REQUEST, __opus_check_int(x) @@ -581,7 +591,9 @@ extern "C" { *
OPUS_FRAMESIZE_20_MS
Use 20 ms frames.
*
OPUS_FRAMESIZE_40_MS
Use 40 ms frames.
*
OPUS_FRAMESIZE_60_MS
Use 60 ms frames.
- *
OPUS_FRAMESIZE_VARIABLE
Optimize the frame size dynamically.
+ *
OPUS_FRAMESIZE_80_MS
Use 80 ms frames.
+ *
OPUS_FRAMESIZE_100_MS
Use 100 ms frames.
+ *
OPUS_FRAMESIZE_120_MS
Use 120 ms frames.
* * @hideinitializer */ #define OPUS_GET_EXPERT_FRAME_DURATION(x) OPUS_GET_EXPERT_FRAME_DURATION_REQUEST, __opus_check_int_ptr(x) @@ -681,6 +693,40 @@ extern "C" { */ #define OPUS_GET_SAMPLE_RATE(x) OPUS_GET_SAMPLE_RATE_REQUEST, __opus_check_int_ptr(x) +/** If set to 1, disables the use of phase inversion for intensity stereo, + * improving the quality of mono downmixes, but slightly reducing normal + * stereo quality. Disabling phase inversion in the decoder does not comply + * with RFC 6716, although it does not cause any interoperability issue and + * is expected to become part of the Opus standard once RFC 6716 is updated + * by draft-ietf-codec-opus-update. + * @see OPUS_GET_PHASE_INVERSION_DISABLED + * @param[in] x opus_int32: Allowed values: + *
+ *
0
Enable phase inversion (default).
+ *
1
Disable phase inversion.
+ *
+ * @hideinitializer */ +#define OPUS_SET_PHASE_INVERSION_DISABLED(x) OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST, __opus_check_int(x) +/** Gets the encoder's configured phase inversion status. + * @see OPUS_SET_PHASE_INVERSION_DISABLED + * @param[out] x opus_int32 *: Returns one of the following values: + *
+ *
0
Stereo phase inversion enabled (default).
+ *
1
Stereo phase inversion disabled.
+ *
+ * @hideinitializer */ +#define OPUS_GET_PHASE_INVERSION_DISABLED(x) OPUS_GET_PHASE_INVERSION_DISABLED_REQUEST, __opus_check_int_ptr(x) +/** Gets the DTX state of the encoder. + * Returns whether the last encoded frame was either a comfort noise update + * during DTX or not encoded because of DTX. + * @param[out] x opus_int32 *: Returns one of the following values: + *
+ *
0
The encoder is not in DTX.
+ *
1
The encoder is in DTX.
+ *
+ * @hideinitializer */ +#define OPUS_GET_IN_DTX(x) OPUS_GET_IN_DTX_REQUEST, __opus_check_int_ptr(x) + /**@}*/ /** @defgroup opus_decoderctls Decoder related CTLs diff --git a/libs/opus/include/opus/opus_multistream.h b/libs/opus/include/opus/opus_multistream.h index 3622e00..babcee6 100644 --- a/libs/opus/include/opus/opus_multistream.h +++ b/libs/opus/include/opus/opus_multistream.h @@ -273,7 +273,7 @@ OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusMSEncoder *opus_multistream_surround_enc unsigned char *mapping, int application, int *error -) OPUS_ARG_NONNULL(5); +) OPUS_ARG_NONNULL(4) OPUS_ARG_NONNULL(5) OPUS_ARG_NONNULL(6); /** Initialize a previously allocated multistream encoder state. * The memory pointed to by \a st must be at least the size returned by @@ -342,7 +342,7 @@ OPUS_EXPORT int opus_multistream_surround_encoder_init( int *coupled_streams, unsigned char *mapping, int application -) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(6); +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(5) OPUS_ARG_NONNULL(6) OPUS_ARG_NONNULL(7); /** Encodes a multistream Opus frame. * @param st OpusMSEncoder*: Multistream encoder state. diff --git a/libs/opus/include/opus/opus_projection.h b/libs/opus/include/opus/opus_projection.h new file mode 100644 index 0000000..9dabf4e --- /dev/null +++ b/libs/opus/include/opus/opus_projection.h @@ -0,0 +1,568 @@ +/* Copyright (c) 2017 Google Inc. + Written by Andrew Allen */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/** + * @file opus_projection.h + * @brief Opus projection reference API + */ + +#ifndef OPUS_PROJECTION_H +#define OPUS_PROJECTION_H + +#include "opus_multistream.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @cond OPUS_INTERNAL_DOC */ + +/** These are the actual encoder and decoder CTL ID numbers. + * They should not be used directly by applications.c + * In general, SETs should be even and GETs should be odd.*/ +/**@{*/ +#define OPUS_PROJECTION_GET_DEMIXING_MATRIX_GAIN_REQUEST 6001 +#define OPUS_PROJECTION_GET_DEMIXING_MATRIX_SIZE_REQUEST 6003 +#define OPUS_PROJECTION_GET_DEMIXING_MATRIX_REQUEST 6005 +/**@}*/ + + +/** @endcond */ + +/** @defgroup opus_projection_ctls Projection specific encoder and decoder CTLs + * + * These are convenience macros that are specific to the + * opus_projection_encoder_ctl() and opus_projection_decoder_ctl() + * interface. + * The CTLs from @ref opus_genericctls, @ref opus_encoderctls, + * @ref opus_decoderctls, and @ref opus_multistream_ctls may be applied to a + * projection encoder or decoder as well. + */ +/**@{*/ + +/** Gets the gain (in dB. S7.8-format) of the demixing matrix from the encoder. + * @param[out] x opus_int32 *: Returns the gain (in dB. S7.8-format) + * of the demixing matrix. + * @hideinitializer + */ +#define OPUS_PROJECTION_GET_DEMIXING_MATRIX_GAIN(x) OPUS_PROJECTION_GET_DEMIXING_MATRIX_GAIN_REQUEST, __opus_check_int_ptr(x) + + +/** Gets the size in bytes of the demixing matrix from the encoder. + * @param[out] x opus_int32 *: Returns the size in bytes of the + * demixing matrix. + * @hideinitializer + */ +#define OPUS_PROJECTION_GET_DEMIXING_MATRIX_SIZE(x) OPUS_PROJECTION_GET_DEMIXING_MATRIX_SIZE_REQUEST, __opus_check_int_ptr(x) + + +/** Copies the demixing matrix to the supplied pointer location. + * @param[out] x unsigned char *: Returns the demixing matrix to the + * supplied pointer location. + * @param y opus_int32: The size in bytes of the reserved memory at the + * pointer location. + * @hideinitializer + */ +#define OPUS_PROJECTION_GET_DEMIXING_MATRIX(x,y) OPUS_PROJECTION_GET_DEMIXING_MATRIX_REQUEST, x, __opus_check_int(y) + + +/**@}*/ + +/** Opus projection encoder state. + * This contains the complete state of a projection Opus encoder. + * It is position independent and can be freely copied. + * @see opus_projection_ambisonics_encoder_create + */ +typedef struct OpusProjectionEncoder OpusProjectionEncoder; + + +/** Opus projection decoder state. + * This contains the complete state of a projection Opus decoder. + * It is position independent and can be freely copied. + * @see opus_projection_decoder_create + * @see opus_projection_decoder_init + */ +typedef struct OpusProjectionDecoder OpusProjectionDecoder; + + +/**\name Projection encoder functions */ +/**@{*/ + +/** Gets the size of an OpusProjectionEncoder structure. + * @param channels int: The total number of input channels to encode. + * This must be no more than 255. + * @param mapping_family int: The mapping family to use for selecting + * the appropriate projection. + * @returns The size in bytes on success, or a negative error code + * (see @ref opus_errorcodes) on error. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_projection_ambisonics_encoder_get_size( + int channels, + int mapping_family +); + + +/** Allocates and initializes a projection encoder state. + * Call opus_projection_encoder_destroy() to release + * this object when finished. + * @param Fs opus_int32: Sampling rate of the input signal (in Hz). + * This must be one of 8000, 12000, 16000, + * 24000, or 48000. + * @param channels int: Number of channels in the input signal. + * This must be at most 255. + * It may be greater than the number of + * coded channels (streams + + * coupled_streams). + * @param mapping_family int: The mapping family to use for selecting + * the appropriate projection. + * @param[out] streams int *: The total number of streams that will + * be encoded from the input. + * @param[out] coupled_streams int *: Number of coupled (2 channel) + * streams that will be encoded from the input. + * @param application int: The target encoder application. + * This must be one of the following: + *
+ *
#OPUS_APPLICATION_VOIP
+ *
Process signal for improved speech intelligibility.
+ *
#OPUS_APPLICATION_AUDIO
+ *
Favor faithfulness to the original input.
+ *
#OPUS_APPLICATION_RESTRICTED_LOWDELAY
+ *
Configure the minimum possible coding delay by disabling certain modes + * of operation.
+ *
+ * @param[out] error int *: Returns #OPUS_OK on success, or an error + * code (see @ref opus_errorcodes) on + * failure. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusProjectionEncoder *opus_projection_ambisonics_encoder_create( + opus_int32 Fs, + int channels, + int mapping_family, + int *streams, + int *coupled_streams, + int application, + int *error +) OPUS_ARG_NONNULL(4) OPUS_ARG_NONNULL(5); + + +/** Initialize a previously allocated projection encoder state. + * The memory pointed to by \a st must be at least the size returned by + * opus_projection_ambisonics_encoder_get_size(). + * This is intended for applications which use their own allocator instead of + * malloc. + * To reset a previously initialized state, use the #OPUS_RESET_STATE CTL. + * @see opus_projection_ambisonics_encoder_create + * @see opus_projection_ambisonics_encoder_get_size + * @param st OpusProjectionEncoder*: Projection encoder state to initialize. + * @param Fs opus_int32: Sampling rate of the input signal (in Hz). + * This must be one of 8000, 12000, 16000, + * 24000, or 48000. + * @param channels int: Number of channels in the input signal. + * This must be at most 255. + * It may be greater than the number of + * coded channels (streams + + * coupled_streams). + * @param streams int: The total number of streams to encode from the + * input. + * This must be no more than the number of channels. + * @param coupled_streams int: Number of coupled (2 channel) streams + * to encode. + * This must be no larger than the total + * number of streams. + * Additionally, The total number of + * encoded channels (streams + + * coupled_streams) must be no + * more than the number of input channels. + * @param application int: The target encoder application. + * This must be one of the following: + *
+ *
#OPUS_APPLICATION_VOIP
+ *
Process signal for improved speech intelligibility.
+ *
#OPUS_APPLICATION_AUDIO
+ *
Favor faithfulness to the original input.
+ *
#OPUS_APPLICATION_RESTRICTED_LOWDELAY
+ *
Configure the minimum possible coding delay by disabling certain modes + * of operation.
+ *
+ * @returns #OPUS_OK on success, or an error code (see @ref opus_errorcodes) + * on failure. + */ +OPUS_EXPORT int opus_projection_ambisonics_encoder_init( + OpusProjectionEncoder *st, + opus_int32 Fs, + int channels, + int mapping_family, + int *streams, + int *coupled_streams, + int application +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(5) OPUS_ARG_NONNULL(6); + + +/** Encodes a projection Opus frame. + * @param st OpusProjectionEncoder*: Projection encoder state. + * @param[in] pcm const opus_int16*: The input signal as interleaved + * samples. + * This must contain + * frame_size*channels + * samples. + * @param frame_size int: Number of samples per channel in the input + * signal. + * This must be an Opus frame size for the + * encoder's sampling rate. + * For example, at 48 kHz the permitted values + * are 120, 240, 480, 960, 1920, and 2880. + * Passing in a duration of less than 10 ms + * (480 samples at 48 kHz) will prevent the + * encoder from using the LPC or hybrid modes. + * @param[out] data unsigned char*: Output payload. + * This must contain storage for at + * least \a max_data_bytes. + * @param [in] max_data_bytes opus_int32: Size of the allocated + * memory for the output + * payload. This may be + * used to impose an upper limit on + * the instant bitrate, but should + * not be used as the only bitrate + * control. Use #OPUS_SET_BITRATE to + * control the bitrate. + * @returns The length of the encoded packet (in bytes) on success or a + * negative error code (see @ref opus_errorcodes) on failure. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_projection_encode( + OpusProjectionEncoder *st, + const opus_int16 *pcm, + int frame_size, + unsigned char *data, + opus_int32 max_data_bytes +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4); + + +/** Encodes a projection Opus frame from floating point input. + * @param st OpusProjectionEncoder*: Projection encoder state. + * @param[in] pcm const float*: The input signal as interleaved + * samples with a normal range of + * +/-1.0. + * Samples with a range beyond +/-1.0 + * are supported but will be clipped by + * decoders using the integer API and + * should only be used if it is known + * that the far end supports extended + * dynamic range. + * This must contain + * frame_size*channels + * samples. + * @param frame_size int: Number of samples per channel in the input + * signal. + * This must be an Opus frame size for the + * encoder's sampling rate. + * For example, at 48 kHz the permitted values + * are 120, 240, 480, 960, 1920, and 2880. + * Passing in a duration of less than 10 ms + * (480 samples at 48 kHz) will prevent the + * encoder from using the LPC or hybrid modes. + * @param[out] data unsigned char*: Output payload. + * This must contain storage for at + * least \a max_data_bytes. + * @param [in] max_data_bytes opus_int32: Size of the allocated + * memory for the output + * payload. This may be + * used to impose an upper limit on + * the instant bitrate, but should + * not be used as the only bitrate + * control. Use #OPUS_SET_BITRATE to + * control the bitrate. + * @returns The length of the encoded packet (in bytes) on success or a + * negative error code (see @ref opus_errorcodes) on failure. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_projection_encode_float( + OpusProjectionEncoder *st, + const float *pcm, + int frame_size, + unsigned char *data, + opus_int32 max_data_bytes +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4); + + +/** Frees an OpusProjectionEncoder allocated by + * opus_projection_ambisonics_encoder_create(). + * @param st OpusProjectionEncoder*: Projection encoder state to be freed. + */ +OPUS_EXPORT void opus_projection_encoder_destroy(OpusProjectionEncoder *st); + + +/** Perform a CTL function on a projection Opus encoder. + * + * Generally the request and subsequent arguments are generated by a + * convenience macro. + * @param st OpusProjectionEncoder*: Projection encoder state. + * @param request This and all remaining parameters should be replaced by one + * of the convenience macros in @ref opus_genericctls, + * @ref opus_encoderctls, @ref opus_multistream_ctls, or + * @ref opus_projection_ctls + * @see opus_genericctls + * @see opus_encoderctls + * @see opus_multistream_ctls + * @see opus_projection_ctls + */ +OPUS_EXPORT int opus_projection_encoder_ctl(OpusProjectionEncoder *st, int request, ...) OPUS_ARG_NONNULL(1); + + +/**@}*/ + +/**\name Projection decoder functions */ +/**@{*/ + +/** Gets the size of an OpusProjectionDecoder structure. + * @param channels int: The total number of output channels. + * This must be no more than 255. + * @param streams int: The total number of streams coded in the + * input. + * This must be no more than 255. + * @param coupled_streams int: Number streams to decode as coupled + * (2 channel) streams. + * This must be no larger than the total + * number of streams. + * Additionally, The total number of + * coded channels (streams + + * coupled_streams) must be no + * more than 255. + * @returns The size in bytes on success, or a negative error code + * (see @ref opus_errorcodes) on error. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_projection_decoder_get_size( + int channels, + int streams, + int coupled_streams +); + + +/** Allocates and initializes a projection decoder state. + * Call opus_projection_decoder_destroy() to release + * this object when finished. + * @param Fs opus_int32: Sampling rate to decode at (in Hz). + * This must be one of 8000, 12000, 16000, + * 24000, or 48000. + * @param channels int: Number of channels to output. + * This must be at most 255. + * It may be different from the number of coded + * channels (streams + + * coupled_streams). + * @param streams int: The total number of streams coded in the + * input. + * This must be no more than 255. + * @param coupled_streams int: Number of streams to decode as coupled + * (2 channel) streams. + * This must be no larger than the total + * number of streams. + * Additionally, The total number of + * coded channels (streams + + * coupled_streams) must be no + * more than 255. + * @param[in] demixing_matrix const unsigned char[demixing_matrix_size]: Demixing matrix + * that mapping from coded channels to output channels, + * as described in @ref opus_projection and + * @ref opus_projection_ctls. + * @param demixing_matrix_size opus_int32: The size in bytes of the + * demixing matrix, as + * described in @ref + * opus_projection_ctls. + * @param[out] error int *: Returns #OPUS_OK on success, or an error + * code (see @ref opus_errorcodes) on + * failure. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusProjectionDecoder *opus_projection_decoder_create( + opus_int32 Fs, + int channels, + int streams, + int coupled_streams, + unsigned char *demixing_matrix, + opus_int32 demixing_matrix_size, + int *error +) OPUS_ARG_NONNULL(5); + + +/** Intialize a previously allocated projection decoder state object. + * The memory pointed to by \a st must be at least the size returned by + * opus_projection_decoder_get_size(). + * This is intended for applications which use their own allocator instead of + * malloc. + * To reset a previously initialized state, use the #OPUS_RESET_STATE CTL. + * @see opus_projection_decoder_create + * @see opus_projection_deocder_get_size + * @param st OpusProjectionDecoder*: Projection encoder state to initialize. + * @param Fs opus_int32: Sampling rate to decode at (in Hz). + * This must be one of 8000, 12000, 16000, + * 24000, or 48000. + * @param channels int: Number of channels to output. + * This must be at most 255. + * It may be different from the number of coded + * channels (streams + + * coupled_streams). + * @param streams int: The total number of streams coded in the + * input. + * This must be no more than 255. + * @param coupled_streams int: Number of streams to decode as coupled + * (2 channel) streams. + * This must be no larger than the total + * number of streams. + * Additionally, The total number of + * coded channels (streams + + * coupled_streams) must be no + * more than 255. + * @param[in] demixing_matrix const unsigned char[demixing_matrix_size]: Demixing matrix + * that mapping from coded channels to output channels, + * as described in @ref opus_projection and + * @ref opus_projection_ctls. + * @param demixing_matrix_size opus_int32: The size in bytes of the + * demixing matrix, as + * described in @ref + * opus_projection_ctls. + * @returns #OPUS_OK on success, or an error code (see @ref opus_errorcodes) + * on failure. + */ +OPUS_EXPORT int opus_projection_decoder_init( + OpusProjectionDecoder *st, + opus_int32 Fs, + int channels, + int streams, + int coupled_streams, + unsigned char *demixing_matrix, + opus_int32 demixing_matrix_size +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(6); + + +/** Decode a projection Opus packet. + * @param st OpusProjectionDecoder*: Projection decoder state. + * @param[in] data const unsigned char*: Input payload. + * Use a NULL + * pointer to indicate packet + * loss. + * @param len opus_int32: Number of bytes in payload. + * @param[out] pcm opus_int16*: Output signal, with interleaved + * samples. + * This must contain room for + * frame_size*channels + * samples. + * @param frame_size int: The number of samples per channel of + * available space in \a pcm. + * If this is less than the maximum packet duration + * (120 ms; 5760 for 48kHz), this function will not be capable + * of decoding some packets. In the case of PLC (data==NULL) + * or FEC (decode_fec=1), then frame_size needs to be exactly + * the duration of audio that is missing, otherwise the + * decoder will not be in the optimal state to decode the + * next incoming packet. For the PLC and FEC cases, frame_size + * must be a multiple of 2.5 ms. + * @param decode_fec int: Flag (0 or 1) to request that any in-band + * forward error correction data be decoded. + * If no such data is available, the frame is + * decoded as if it were lost. + * @returns Number of samples decoded on success or a negative error code + * (see @ref opus_errorcodes) on failure. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_projection_decode( + OpusProjectionDecoder *st, + const unsigned char *data, + opus_int32 len, + opus_int16 *pcm, + int frame_size, + int decode_fec +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4); + + +/** Decode a projection Opus packet with floating point output. + * @param st OpusProjectionDecoder*: Projection decoder state. + * @param[in] data const unsigned char*: Input payload. + * Use a NULL + * pointer to indicate packet + * loss. + * @param len opus_int32: Number of bytes in payload. + * @param[out] pcm opus_int16*: Output signal, with interleaved + * samples. + * This must contain room for + * frame_size*channels + * samples. + * @param frame_size int: The number of samples per channel of + * available space in \a pcm. + * If this is less than the maximum packet duration + * (120 ms; 5760 for 48kHz), this function will not be capable + * of decoding some packets. In the case of PLC (data==NULL) + * or FEC (decode_fec=1), then frame_size needs to be exactly + * the duration of audio that is missing, otherwise the + * decoder will not be in the optimal state to decode the + * next incoming packet. For the PLC and FEC cases, frame_size + * must be a multiple of 2.5 ms. + * @param decode_fec int: Flag (0 or 1) to request that any in-band + * forward error correction data be decoded. + * If no such data is available, the frame is + * decoded as if it were lost. + * @returns Number of samples decoded on success or a negative error code + * (see @ref opus_errorcodes) on failure. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_projection_decode_float( + OpusProjectionDecoder *st, + const unsigned char *data, + opus_int32 len, + float *pcm, + int frame_size, + int decode_fec +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4); + + +/** Perform a CTL function on a projection Opus decoder. + * + * Generally the request and subsequent arguments are generated by a + * convenience macro. + * @param st OpusProjectionDecoder*: Projection decoder state. + * @param request This and all remaining parameters should be replaced by one + * of the convenience macros in @ref opus_genericctls, + * @ref opus_decoderctls, @ref opus_multistream_ctls, or + * @ref opus_projection_ctls. + * @see opus_genericctls + * @see opus_decoderctls + * @see opus_multistream_ctls + * @see opus_projection_ctls + */ +OPUS_EXPORT int opus_projection_decoder_ctl(OpusProjectionDecoder *st, int request, ...) OPUS_ARG_NONNULL(1); + + +/** Frees an OpusProjectionDecoder allocated by + * opus_projection_decoder_create(). + * @param st OpusProjectionDecoder: Projection decoder state to be freed. + */ +OPUS_EXPORT void opus_projection_decoder_destroy(OpusProjectionDecoder *st); + + +/**@}*/ + +/**@}*/ + +#ifdef __cplusplus +} +#endif + +#endif /* OPUS_PROJECTION_H */ diff --git a/libs/opus/include/opus/opus_types.h b/libs/opus/include/opus/opus_types.h index b28e03a..7cf6755 100644 --- a/libs/opus/include/opus/opus_types.h +++ b/libs/opus/include/opus/opus_types.h @@ -33,14 +33,29 @@ #ifndef OPUS_TYPES_H #define OPUS_TYPES_H -/* Use the real stdint.h if it's there (taken from Paul Hsieh's pstdint.h) */ -#if (defined(__STDC__) && __STDC__ && __STDC_VERSION__ >= 199901L) || (defined(__GNUC__) && (defined(_STDINT_H) || defined(_STDINT_H_)) || defined (HAVE_STDINT_H)) -#include +#define opus_int int /* used for counters etc; at least 16 bits */ +#define opus_int64 long long +#define opus_int8 signed char +#define opus_uint unsigned int /* used for counters etc; at least 16 bits */ +#define opus_uint64 unsigned long long +#define opus_uint8 unsigned char + +/* Use the real stdint.h if it's there (taken from Paul Hsieh's pstdint.h) */ +#if (defined(__STDC__) && __STDC__ && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || (defined(__GNUC__) && (defined(_STDINT_H) || defined(_STDINT_H_)) || defined (HAVE_STDINT_H)) +#include +# undef opus_int64 +# undef opus_int8 +# undef opus_uint64 +# undef opus_uint8 + typedef int8_t opus_int8; + typedef uint8_t opus_uint8; typedef int16_t opus_int16; typedef uint16_t opus_uint16; typedef int32_t opus_int32; typedef uint32_t opus_uint32; + typedef int64_t opus_int64; + typedef uint64_t opus_uint64; #elif defined(_WIN32) # if defined(__CYGWIN__) @@ -148,12 +163,4 @@ #endif -#define opus_int int /* used for counters etc; at least 16 bits */ -#define opus_int64 long long -#define opus_int8 signed char - -#define opus_uint unsigned int /* used for counters etc; at least 16 bits */ -#define opus_uint64 unsigned long long -#define opus_uint8 unsigned char - #endif /* OPUS_TYPES_H */ diff --git a/libs/opus/lib/iOS/libopus.a b/libs/opus/lib/iOS/libopus.a index 84c164a..3c3bff5 100644 Binary files a/libs/opus/lib/iOS/libopus.a and b/libs/opus/lib/iOS/libopus.a differ diff --git a/libs/opus/lib/tvOS/libopus.a b/libs/opus/lib/tvOS/libopus.a index 5b2192e..3c485f6 100644 Binary files a/libs/opus/lib/tvOS/libopus.a and b/libs/opus/lib/tvOS/libopus.a differ