diff --git a/BuildScripts/Opus/build.sh b/BuildScripts/Opus/build.sh new file mode 100755 index 0000000..05fbf6a --- /dev/null +++ b/BuildScripts/Opus/build.sh @@ -0,0 +1,128 @@ +#!/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" + + cd $OPUS_DIR + + DIST_DIR=$DIST_DIR_BASE-$ARCH + 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" + PLATFORM="${PLATFORMBASE}/iPhoneOS.platform" + IOSSDK=iPhoneOS${IOSSDK_VER} + ;; + armv7s) + EXTRA_FLAGS="--with-pic --enable-fixed-point" + EXTRA_CFLAGS="-mcpu=cortex-a9 -mfpu=neon -miphoneos-version-min=6.0" + PLATFORM="${PLATFORMBASE}/iPhoneOS.platform" + IOSSDK=iPhoneOS${IOSSDK_VER} + ;; + aarch64) + CFLAGS_ARCH="arm64" + EXTRA_FLAGS="--with-pic --enable-fixed-point" + EXTRA_CFLAGS="-miphoneos-version-min=7.1" + PLATFORM="${PLATFORMBASE}/iPhoneOS.platform" + IOSSDK=iPhoneOS${IOSSDK_VER} + ;; + x86_64) + EXTRA_FLAGS="--with-pic" + EXTRA_CFLAGS="-miphoneos-version-min=7.1" + PLATFORM="${PLATFORMBASE}/iPhoneSimulator.platform" + IOSSDK=iPhoneSimulator${IOSSDK_VER} + ;; + i386) + EXTRA_FLAGS="--with-pic" + EXTRA_CFLAGS="-miphoneos-version-min=7.1" + PLATFORM="${PLATFORMBASE}/iPhoneSimulator.platform" + IOSSDK=iPhoneSimulator${IOSSDK_VER} + ;; + *) + echo "Unsupported architecture ${ARCH}" + exit 1 + ;; + esac + + echo "Configuring opus for $ARCH..." + + ./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" + + 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" + + ./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..." + make clean + make -j$NJOB V=1 + make install + + 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 new file mode 100755 index 0000000..33c0c13 --- /dev/null +++ b/BuildScripts/Opus/combine.sh @@ -0,0 +1,51 @@ +#!/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 new file mode 100755 index 0000000..63a9f44 --- /dev/null +++ b/BuildScripts/Opus/config.sh @@ -0,0 +1,36 @@ +#!/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 new file mode 100755 index 0000000..ea263ff --- /dev/null +++ b/BuildScripts/Opus/sync.sh @@ -0,0 +1,21 @@ +#!/bin/sh + +set -e + +source config.sh + +SCRIPT_DIR=$( (cd -P $(dirname $0) && pwd) ) +DIST_DIR_BASE=${DIST_DIR_BASE:="$SCRIPT_DIR/dist"} + +git submodule update --init opus +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/build-ffmpeg.sh b/BuildScripts/build-ffmpeg.sh similarity index 100% rename from build-ffmpeg.sh rename to BuildScripts/build-ffmpeg.sh diff --git a/build-openssl.sh b/BuildScripts/build-openssl.sh similarity index 100% rename from build-openssl.sh rename to BuildScripts/build-openssl.sh diff --git a/Limelight.xcodeproj/project.pbxproj b/Limelight.xcodeproj/project.pbxproj index 4bceb21..bbc0abd 100644 --- a/Limelight.xcodeproj/project.pbxproj +++ b/Limelight.xcodeproj/project.pbxproj @@ -32,7 +32,6 @@ FB290D3A19B2C6E3004C83CF /* StreamFrameViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = FB290D2D19B2C6E3004C83CF /* StreamFrameViewController.m */; }; FB290DB719B2C870004C83CF /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = FB290DB619B2C870004C83CF /* libz.dylib */; }; FB290DB919B2C877004C83CF /* libbz2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = FB290DB819B2C877004C83CF /* libbz2.dylib */; }; - FB290DC219B2E966004C83CF /* libopus.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FB290DC119B2E966004C83CF /* libopus.a */; }; FB290DC419B2E98F004C83CF /* libxml2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = FB290DC319B2E98F004C83CF /* libxml2.dylib */; }; FB290E7919B37D81004C83CF /* MainFrame-iPad.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = FB290E7819B37D81004C83CF /* MainFrame-iPad.storyboard */; }; FB290E7B19B38036004C83CF /* MainFrame-iPhone.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = FB290E7A19B38036004C83CF /* MainFrame-iPhone.storyboard */; }; @@ -43,6 +42,7 @@ FB8945F219F5C76C00339C8A /* StreamConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = FB8945F119F5C76C00339C8A /* StreamConfiguration.m */; }; FB8945F619F626BA00339C8A /* Launch Screen.xib in Resources */ = {isa = PBXBuildFile; fileRef = FB8945F519F626BA00339C8A /* Launch Screen.xib */; }; FB8945F819F62A2B00339C8A /* store_icon_1024x1024.png in Resources */ = {isa = PBXBuildFile; fileRef = FB8945F719F62A2B00339C8A /* store_icon_1024x1024.png */; }; + FB89460219F63CB600339C8A /* libopus.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FB89460119F63CB600339C8A /* libopus.a */; }; FBAB29F219EDB08B00929691 /* MDNSManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FBAB29F119EDB08B00929691 /* MDNSManager.m */; }; FBAB29F619EDE0F800929691 /* Computer.m in Sources */ = {isa = PBXBuildFile; fileRef = FBAB29F519EDE0F800929691 /* Computer.m */; }; FBAB29FC19EE13AA00929691 /* CryptoManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FBAB29FB19EE13AA00929691 /* CryptoManager.m */; }; @@ -118,11 +118,6 @@ FB290DAB19B2C814004C83CF /* liblimelight-common.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "liblimelight-common.a"; sourceTree = ""; }; FB290DB619B2C870004C83CF /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; }; FB290DB819B2C877004C83CF /* libbz2.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libbz2.dylib; path = usr/lib/libbz2.dylib; sourceTree = SDKROOT; }; - FB290DBC19B2E966004C83CF /* opus.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = opus.h; sourceTree = ""; }; - FB290DBD19B2E966004C83CF /* opus_defines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = opus_defines.h; sourceTree = ""; }; - FB290DBE19B2E966004C83CF /* opus_multistream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = opus_multistream.h; sourceTree = ""; }; - FB290DBF19B2E966004C83CF /* opus_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = opus_types.h; sourceTree = ""; }; - FB290DC119B2E966004C83CF /* libopus.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libopus.a; sourceTree = ""; }; FB290DC319B2E98F004C83CF /* libxml2.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libxml2.dylib; path = usr/lib/libxml2.dylib; sourceTree = SDKROOT; }; FB290E7819B37D81004C83CF /* MainFrame-iPad.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = "MainFrame-iPad.storyboard"; sourceTree = SOURCE_ROOT; }; FB290E7A19B38036004C83CF /* MainFrame-iPhone.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = "MainFrame-iPhone.storyboard"; sourceTree = SOURCE_ROOT; }; @@ -137,6 +132,11 @@ FB8945F119F5C76C00339C8A /* StreamConfiguration.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = StreamConfiguration.m; sourceTree = ""; }; FB8945F519F626BA00339C8A /* Launch Screen.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = "Launch Screen.xib"; sourceTree = ""; }; FB8945F719F62A2B00339C8A /* store_icon_1024x1024.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = store_icon_1024x1024.png; sourceTree = ""; }; + FB8945FC19F63CB600339C8A /* opus.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = opus.h; sourceTree = ""; }; + FB8945FD19F63CB600339C8A /* opus_defines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = opus_defines.h; sourceTree = ""; }; + FB8945FE19F63CB600339C8A /* opus_multistream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = opus_multistream.h; sourceTree = ""; }; + FB8945FF19F63CB600339C8A /* opus_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = opus_types.h; sourceTree = ""; }; + FB89460119F63CB600339C8A /* libopus.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libopus.a; sourceTree = ""; }; FBAB29F119EDB08B00929691 /* MDNSManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MDNSManager.m; sourceTree = ""; }; FBAB29F319EDB0C400929691 /* MDNSManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MDNSManager.h; sourceTree = ""; }; FBAB29F419EDE0F800929691 /* Computer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Computer.h; sourceTree = ""; }; @@ -234,13 +234,13 @@ files = ( 98A03B5119F35AAC00861ACA /* libcrypto.a in Frameworks */, 98A03B4D19F352EB00861ACA /* liblimelight-common.a in Frameworks */, + FB89460219F63CB600339C8A /* libopus.a in Frameworks */, FBCC0E9B19EF9703009729EB /* libssl.a in Frameworks */, FB7E794419C8B71B00A15F68 /* libiconv.dylib in Frameworks */, FB290DC419B2E98F004C83CF /* libxml2.dylib in Frameworks */, FB290DB919B2C877004C83CF /* libbz2.dylib in Frameworks */, FB290DB719B2C870004C83CF /* libz.dylib in Frameworks */, FB290CF419B2C406004C83CF /* CoreGraphics.framework in Frameworks */, - FB290DC219B2E966004C83CF /* libopus.a in Frameworks */, FB290CF819B2C406004C83CF /* CoreData.framework in Frameworks */, FB290CF619B2C406004C83CF /* UIKit.framework in Frameworks */, FB290CF219B2C406004C83CF /* Foundation.framework in Frameworks */, @@ -393,9 +393,9 @@ FB290D3F19B2C814004C83CF /* libs */ = { isa = PBXGroup; children = ( + FB8945F919F63CB600339C8A /* opus */, FBCC0E4919EF9703009729EB /* openssl */, FB290DA719B2C814004C83CF /* limelight-common */, - FB290DAC19B2C814004C83CF /* opus */, ); path = libs; sourceTree = ""; @@ -425,38 +425,38 @@ path = lib; sourceTree = ""; }; - FB290DAC19B2C814004C83CF /* opus */ = { + FB8945F919F63CB600339C8A /* opus */ = { isa = PBXGroup; children = ( - FB290DBA19B2E966004C83CF /* include */, - FB290DC019B2E966004C83CF /* lib */, + FB8945FA19F63CB600339C8A /* include */, + FB89460019F63CB600339C8A /* lib */, ); path = opus; sourceTree = ""; }; - FB290DBA19B2E966004C83CF /* include */ = { + FB8945FA19F63CB600339C8A /* include */ = { isa = PBXGroup; children = ( - FB290DBB19B2E966004C83CF /* opus */, + FB8945FB19F63CB600339C8A /* opus */, ); path = include; sourceTree = ""; }; - FB290DBB19B2E966004C83CF /* opus */ = { + FB8945FB19F63CB600339C8A /* opus */ = { isa = PBXGroup; children = ( - FB290DBC19B2E966004C83CF /* opus.h */, - FB290DBD19B2E966004C83CF /* opus_defines.h */, - FB290DBE19B2E966004C83CF /* opus_multistream.h */, - FB290DBF19B2E966004C83CF /* opus_types.h */, + FB8945FC19F63CB600339C8A /* opus.h */, + FB8945FD19F63CB600339C8A /* opus_defines.h */, + FB8945FE19F63CB600339C8A /* opus_multistream.h */, + FB8945FF19F63CB600339C8A /* opus_types.h */, ); path = opus; sourceTree = ""; }; - FB290DC019B2E966004C83CF /* lib */ = { + FB89460019F63CB600339C8A /* lib */ = { isa = PBXGroup; children = ( - FB290DC119B2E966004C83CF /* libopus.a */, + FB89460119F63CB600339C8A /* libopus.a */, ); path = lib; sourceTree = ""; diff --git a/Limelight/CryptoManager.m b/Limelight/CryptoManager.m index c7ee7de..853072c 100644 --- a/Limelight/CryptoManager.m +++ b/Limelight/CryptoManager.m @@ -73,7 +73,7 @@ static NSData* p12 = nil; - (int) getEncryptSize:(NSData*)data { // the size is the length of the data ceiling to the nearest 16 bytes - return (([data length] + 15) / 16) * 16; + return (((int)[data length] + 15) / 16) * 16; } - (bool) verifySignature:(NSData *)data withSignature:(NSData*)signature andCert:(NSData*)cert { diff --git a/Limelight/MainFrameViewController.m b/Limelight/MainFrameViewController.m index fb27e89..75d7bec 100644 --- a/Limelight/MainFrameViewController.m +++ b/Limelight/MainFrameViewController.m @@ -78,8 +78,8 @@ static StreamConfiguration* streamConfig; streamConfig.host = _selectedHost.hostName; streamConfig.hostAddr = [Utils resolveHost:_selectedHost.hostName]; - int selectedConf = [self.StreamConfigs selectedRowInComponent:0]; - NSLog(@"selectedConf: %d", selectedConf); + unsigned long selectedConf = [self.StreamConfigs selectedRowInComponent:0]; + NSLog(@"selectedConf: %ld", selectedConf); switch (selectedConf) { case 0: streamConfig.width = 1280; diff --git a/libs/opus/include/opus/opus.h b/libs/opus/include/opus/opus.h index ce86038..93a53a2 100644 --- a/libs/opus/include/opus/opus.h +++ b/libs/opus/include/opus/opus.h @@ -592,6 +592,20 @@ OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_get_nb_samples(const unsigne * @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type */ OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_decoder_get_nb_samples(const OpusDecoder *dec, const unsigned char packet[], opus_int32 len) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2); + +/** Applies soft-clipping to bring a float signal within the [-1,1] range. If + * the signal is already in that range, nothing is done. If there are values + * outside of [-1,1], then the signal is clipped as smoothly as possible to + * both fit in the range and avoid creating excessive distortion in the + * process. + * @param [in,out] pcm float*: Input PCM and modified PCM + * @param [in] frame_size int Number of samples per channel to process + * @param [in] channels int: Number of channels + * @param [in,out] softclip_mem float*: State memory for the soft clipping process (one float per channel, initialized to zero) + */ +OPUS_EXPORT void opus_pcm_soft_clip(float *pcm, int frame_size, int channels, float *softclip_mem); + + /**@}*/ /** @defgroup opus_repacketizer Repacketizer @@ -897,6 +911,64 @@ OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_repacketizer_get_nb_frames(OpusRepa */ OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_repacketizer_out(OpusRepacketizer *rp, unsigned char *data, opus_int32 maxlen) OPUS_ARG_NONNULL(1); +/** Pads a given Opus packet to a larger size (possibly changing the TOC sequence). + * @param[in,out] data const unsigned char*: The buffer containing the + * packet to pad. + * @param len opus_int32: The size of the packet. + * This must be at least 1. + * @param new_len opus_int32: The desired size of the packet after padding. + * This must be at least as large as len. + * @returns an error code + * @retval #OPUS_OK \a on success. + * @retval #OPUS_BAD_ARG \a len was less than 1 or new_len was less than len. + * @retval #OPUS_INVALID_PACKET \a data did not contain a valid Opus packet. + */ +OPUS_EXPORT int opus_packet_pad(unsigned char *data, opus_int32 len, opus_int32 new_len); + +/** Remove all padding from a given Opus packet and rewrite the TOC sequence to + * minimize space usage. + * @param[in,out] data const unsigned char*: The buffer containing the + * packet to strip. + * @param len opus_int32: The size of the packet. + * This must be at least 1. + * @returns The new size of the output packet on success, or an error code + * on failure. + * @retval #OPUS_BAD_ARG \a len was less than 1. + * @retval #OPUS_INVALID_PACKET \a data did not contain a valid Opus packet. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_packet_unpad(unsigned char *data, opus_int32 len); + +/** Pads a given Opus multi-stream packet to a larger size (possibly changing the TOC sequence). + * @param[in,out] data const unsigned char*: The buffer containing the + * packet to pad. + * @param len opus_int32: The size of the packet. + * This must be at least 1. + * @param new_len opus_int32: The desired size of the packet after padding. + * This must be at least 1. + * @param nb_streams opus_int32: The number of streams (not channels) in the packet. + * This must be at least as large as len. + * @returns an error code + * @retval #OPUS_OK \a on success. + * @retval #OPUS_BAD_ARG \a len was less than 1. + * @retval #OPUS_INVALID_PACKET \a data did not contain a valid Opus packet. + */ +OPUS_EXPORT int opus_multistream_packet_pad(unsigned char *data, opus_int32 len, opus_int32 new_len, int nb_streams); + +/** Remove all padding from a given Opus multi-stream packet and rewrite the TOC sequence to + * minimize space usage. + * @param[in,out] data const unsigned char*: The buffer containing the + * packet to strip. + * @param len opus_int32: The size of the packet. + * This must be at least 1. + * @param nb_streams opus_int32: The number of streams (not channels) in the packet. + * This must be at least 1. + * @returns The new size of the output packet on success, or an error code + * on failure. + * @retval #OPUS_BAD_ARG \a len was less than 1 or new_len was less than len. + * @retval #OPUS_INVALID_PACKET \a data did not contain a valid Opus packet. + */ +OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_multistream_packet_unpad(unsigned char *data, opus_int32 len, int nb_streams); + /**@}*/ #ifdef __cplusplus diff --git a/libs/opus/include/opus/opus_defines.h b/libs/opus/include/opus/opus_defines.h index 9fa3ccb..32b7c97 100644 --- a/libs/opus/include/opus/opus_defines.h +++ b/libs/opus/include/opus/opus_defines.h @@ -46,7 +46,7 @@ extern "C" { #define OPUS_OK 0 /** One or more invalid/out of range arguments @hideinitializer*/ #define OPUS_BAD_ARG -1 -/** The mode struct passed is invalid @hideinitializer*/ +/** Not enough bytes allocated in the buffer @hideinitializer*/ #define OPUS_BUFFER_TOO_SMALL -2 /** An internal error was detected @hideinitializer*/ #define OPUS_INTERNAL_ERROR -3 @@ -98,6 +98,18 @@ extern "C" { # define OPUS_RESTRICT restrict #endif +#if (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L) ) +# if OPUS_GNUC_PREREQ(2,7) +# define OPUS_INLINE __inline__ +# elif (defined(_MSC_VER)) +# define OPUS_INLINE __inline +# else +# define OPUS_INLINE +# endif +#else +# define OPUS_INLINE inline +#endif + /**Warning attributes for opus functions * NONNULL is not used in OPUS_BUILD to avoid the compiler optimizing out * some paranoid null checks. */ @@ -148,8 +160,11 @@ extern "C" { #define OPUS_GET_GAIN_REQUEST 4045 /* Should have been 4035 */ #define OPUS_SET_LSB_DEPTH_REQUEST 4036 #define OPUS_GET_LSB_DEPTH_REQUEST 4037 - #define OPUS_GET_LAST_PACKET_DURATION_REQUEST 4039 +#define OPUS_SET_EXPERT_FRAME_DURATION_REQUEST 4040 +#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 */ @@ -157,6 +172,7 @@ extern "C" { #define __opus_check_int(x) (((void)((x) == (opus_int32)0)), (opus_int32)(x)) #define __opus_check_int_ptr(ptr) ((ptr) + ((ptr) - (opus_int32*)(ptr))) #define __opus_check_uint_ptr(ptr) ((ptr) + ((ptr) - (opus_uint32*)(ptr))) +#define __opus_check_val16_ptr(ptr) ((ptr) + ((ptr) - (opus_val16*)(ptr))) /** @endcond */ /** @defgroup opus_ctlvalues Pre-defined values for CTL interface @@ -185,6 +201,14 @@ extern "C" { #define OPUS_BANDWIDTH_SUPERWIDEBAND 1104 /**<12 kHz bandpass @hideinitializer*/ #define OPUS_BANDWIDTH_FULLBAND 1105 /**<20 kHz bandpass @hideinitializer*/ +#define OPUS_FRAMESIZE_ARG 5000 /**< Select frame size from the argument (default) */ +#define OPUS_FRAMESIZE_2_5_MS 5001 /**< Use 2.5 ms frames */ +#define OPUS_FRAMESIZE_5_MS 5002 /**< Use 5 ms frames */ +#define OPUS_FRAMESIZE_10_MS 5003 /**< Use 10 ms frames */ +#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 */ + /**@}*/ @@ -430,14 +454,6 @@ extern "C" { * @hideinitializer */ #define OPUS_GET_APPLICATION(x) OPUS_GET_APPLICATION_REQUEST, __opus_check_int_ptr(x) -/** Gets the sampling rate the encoder or decoder was initialized with. - * This simply returns the Fs value passed to opus_encoder_init() - * or opus_decoder_init(). - * @param[out] x opus_int32 *: Sampling rate of encoder or decoder. - * @hideinitializer - */ -#define OPUS_GET_SAMPLE_RATE(x) OPUS_GET_SAMPLE_RATE_REQUEST, __opus_check_int_ptr(x) - /** Gets the total samples of delay added by the entire codec. * This can be queried by the encoder and then the provided number of samples can be * skipped on from the start of the decoder's output to provide time aligned input @@ -521,10 +537,52 @@ extern "C" { * @hideinitializer */ #define OPUS_GET_LSB_DEPTH(x) OPUS_GET_LSB_DEPTH_REQUEST, __opus_check_int_ptr(x) -/** Gets the duration (in samples) of the last packet successfully decoded or concealed. - * @param[out] x opus_int32 *: Number of samples (at current sampling rate). +/** Configures the encoder's use of variable duration frames. + * When variable duration is enabled, the encoder is free to use a shorter frame + * size than the one requested in the opus_encode*() call. + * It is then the user's responsibility + * to verify how much audio was encoded by checking the ToC byte of the encoded + * packet. The part of the audio that was not encoded needs to be resent to the + * encoder for the next call. Do not use this option unless you really + * know what you are doing. + * @see OPUS_GET_EXPERT_VARIABLE_DURATION + * @param[in] x opus_int32: Allowed values: + *
+ *
OPUS_FRAMESIZE_ARG
Select frame size from the argument (default).
+ *
OPUS_FRAMESIZE_2_5_MS
Use 2.5 ms frames.
+ *
OPUS_FRAMESIZE_5_MS
Use 2.5 ms frames.
+ *
OPUS_FRAMESIZE_10_MS
Use 10 ms frames.
+ *
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.
+ *
* @hideinitializer */ -#define OPUS_GET_LAST_PACKET_DURATION(x) OPUS_GET_LAST_PACKET_DURATION_REQUEST, __opus_check_int_ptr(x) +#define OPUS_SET_EXPERT_FRAME_DURATION(x) OPUS_SET_EXPERT_FRAME_DURATION_REQUEST, __opus_check_int(x) +/** Gets the encoder's configured use of variable duration frames. + * @see OPUS_SET_EXPERT_VARIABLE_DURATION + * @param[out] x opus_int32 *: Returns one of the following values: + *
+ *
OPUS_FRAMESIZE_ARG
Select frame size from the argument (default).
+ *
OPUS_FRAMESIZE_2_5_MS
Use 2.5 ms frames.
+ *
OPUS_FRAMESIZE_5_MS
Use 2.5 ms frames.
+ *
OPUS_FRAMESIZE_10_MS
Use 10 ms frames.
+ *
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.
+ *
+ * @hideinitializer */ +#define OPUS_GET_EXPERT_FRAME_DURATION(x) OPUS_GET_EXPERT_FRAME_DURATION_REQUEST, __opus_check_int_ptr(x) + +/** If set to 1, disables almost all use of prediction, making frames almost + completely independent. This reduces quality. (default : 0) + * @hideinitializer */ +#define OPUS_SET_PREDICTION_DISABLED(x) OPUS_SET_PREDICTION_DISABLED_REQUEST, __opus_check_int(x) +/** Gets the encoder's configured prediction status. + * @hideinitializer */ +#define OPUS_GET_PREDICTION_DISABLED(x) OPUS_GET_PREDICTION_DISABLED_REQUEST, __opus_check_int_ptr(x) + /**@}*/ /** @defgroup opus_genericctls Generic CTLs @@ -578,18 +636,6 @@ extern "C" { * @hideinitializer */ #define OPUS_GET_FINAL_RANGE(x) OPUS_GET_FINAL_RANGE_REQUEST, __opus_check_uint_ptr(x) -/** Gets the pitch of the last decoded frame, if available. - * This can be used for any post-processing algorithm requiring the use of pitch, - * e.g. time stretching/shortening. If the last frame was not voiced, or if the - * pitch was not coded in the frame, then zero is returned. - * - * This CTL is only implemented for decoder instances. - * - * @param[out] x opus_int32 *: pitch period at 48 kHz (or 0 if not available) - * - * @hideinitializer */ -#define OPUS_GET_PITCH(x) OPUS_GET_PITCH_REQUEST, __opus_check_int_ptr(x) - /** Gets the encoder's configured bandpass or the decoder's last bandpass. * @see OPUS_SET_BANDWIDTH * @param[out] x opus_int32 *: Returns one of the following values: @@ -604,6 +650,14 @@ extern "C" { * @hideinitializer */ #define OPUS_GET_BANDWIDTH(x) OPUS_GET_BANDWIDTH_REQUEST, __opus_check_int_ptr(x) +/** Gets the sampling rate the encoder or decoder was initialized with. + * This simply returns the Fs value passed to opus_encoder_init() + * or opus_decoder_init(). + * @param[out] x opus_int32 *: Sampling rate of encoder or decoder. + * @hideinitializer + */ +#define OPUS_GET_SAMPLE_RATE(x) OPUS_GET_SAMPLE_RATE_REQUEST, __opus_check_int_ptr(x) + /**@}*/ /** @defgroup opus_decoderctls Decoder related CTLs @@ -628,6 +682,23 @@ extern "C" { * @hideinitializer */ #define OPUS_GET_GAIN(x) OPUS_GET_GAIN_REQUEST, __opus_check_int_ptr(x) +/** Gets the duration (in samples) of the last packet successfully decoded or concealed. + * @param[out] x opus_int32 *: Number of samples (at current sampling rate). + * @hideinitializer */ +#define OPUS_GET_LAST_PACKET_DURATION(x) OPUS_GET_LAST_PACKET_DURATION_REQUEST, __opus_check_int_ptr(x) + +/** Gets the pitch of the last decoded frame, if available. + * This can be used for any post-processing algorithm requiring the use of pitch, + * e.g. time stretching/shortening. If the last frame was not voiced, or if the + * pitch was not coded in the frame, then zero is returned. + * + * This CTL is only implemented for decoder instances. + * + * @param[out] x opus_int32 *: pitch period at 48 kHz (or 0 if not available) + * + * @hideinitializer */ +#define OPUS_GET_PITCH(x) OPUS_GET_PITCH_REQUEST, __opus_check_int_ptr(x) + /**@}*/ /** @defgroup opus_libinfo Opus library information functions diff --git a/libs/opus/lib/libopus.a b/libs/opus/lib/libopus.a index 105b68e..f84dcc5 100644 Binary files a/libs/opus/lib/libopus.a and b/libs/opus/lib/libopus.a differ diff --git a/notpadded.h264 b/notpadded.h264 deleted file mode 100644 index 8607070..0000000 Binary files a/notpadded.h264 and /dev/null differ