Implemented Opus decoder and tag reader
This commit is contained in:
parent
ba69558a99
commit
525e296cc7
360 changed files with 157618 additions and 1 deletions
|
@ -147,6 +147,7 @@
|
||||||
56DB08550D67185300453B6A /* NSArray+CogSort.m in Sources */ = {isa = PBXBuildFile; fileRef = 56DB08540D67185300453B6A /* NSArray+CogSort.m */; };
|
56DB08550D67185300453B6A /* NSArray+CogSort.m in Sources */ = {isa = PBXBuildFile; fileRef = 56DB08540D67185300453B6A /* NSArray+CogSort.m */; };
|
||||||
8359009D17FF06570060F3ED /* ArchiveSource.bundle in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8359FF3117FEF35D0060F3ED /* ArchiveSource.bundle */; };
|
8359009D17FF06570060F3ED /* ArchiveSource.bundle in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8359FF3117FEF35D0060F3ED /* ArchiveSource.bundle */; };
|
||||||
8360EF6D17F92E56005208A4 /* HighlyComplete.bundle in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8360EF0517F92B24005208A4 /* HighlyComplete.bundle */; };
|
8360EF6D17F92E56005208A4 /* HighlyComplete.bundle in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8360EF0517F92B24005208A4 /* HighlyComplete.bundle */; };
|
||||||
|
8375B36517FFEF130092A79F /* Opus.bundle in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8375B05717FFEA410092A79F /* Opus.bundle */; };
|
||||||
83BCB8DE17FC971300760340 /* WMA.bundle in CopyFiles */ = {isa = PBXBuildFile; fileRef = B09E94350D747F7B0064F138 /* WMA.bundle */; };
|
83BCB8DE17FC971300760340 /* WMA.bundle in CopyFiles */ = {isa = PBXBuildFile; fileRef = B09E94350D747F7B0064F138 /* WMA.bundle */; };
|
||||||
8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; };
|
8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; };
|
||||||
8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; };
|
8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; };
|
||||||
|
@ -424,6 +425,27 @@
|
||||||
remoteGlobalIDString = 8360EEE417F92AC8005208A4;
|
remoteGlobalIDString = 8360EEE417F92AC8005208A4;
|
||||||
remoteInfo = HighlyComplete;
|
remoteInfo = HighlyComplete;
|
||||||
};
|
};
|
||||||
|
8375B05617FFEA410092A79F /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = 8375B05117FFEA400092A79F /* Opus.xcodeproj */;
|
||||||
|
proxyType = 2;
|
||||||
|
remoteGlobalIDString = 8375B03C17FFEA400092A79F;
|
||||||
|
remoteInfo = Opus;
|
||||||
|
};
|
||||||
|
8375B36117FFEF010092A79F /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = 8359FF2C17FEF35C0060F3ED /* ArchiveSource.xcodeproj */;
|
||||||
|
proxyType = 1;
|
||||||
|
remoteGlobalIDString = 8359FF1617FEF35C0060F3ED;
|
||||||
|
remoteInfo = ArchiveSource;
|
||||||
|
};
|
||||||
|
8375B36317FFEF010092A79F /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = 8375B05117FFEA400092A79F /* Opus.xcodeproj */;
|
||||||
|
proxyType = 1;
|
||||||
|
remoteGlobalIDString = 8375B03B17FFEA400092A79F;
|
||||||
|
remoteInfo = Opus;
|
||||||
|
};
|
||||||
83BCB8D817FC96F800760340 /* PBXContainerItemProxy */ = {
|
83BCB8D817FC96F800760340 /* PBXContainerItemProxy */ = {
|
||||||
isa = PBXContainerItemProxy;
|
isa = PBXContainerItemProxy;
|
||||||
containerPortal = 8360EF0017F92B23005208A4 /* HighlyComplete.xcodeproj */;
|
containerPortal = 8360EF0017F92B23005208A4 /* HighlyComplete.xcodeproj */;
|
||||||
|
@ -491,6 +513,7 @@
|
||||||
dstPath = "";
|
dstPath = "";
|
||||||
dstSubfolderSpec = 13;
|
dstSubfolderSpec = 13;
|
||||||
files = (
|
files = (
|
||||||
|
8375B36517FFEF130092A79F /* Opus.bundle in CopyFiles */,
|
||||||
8359009D17FF06570060F3ED /* ArchiveSource.bundle in CopyFiles */,
|
8359009D17FF06570060F3ED /* ArchiveSource.bundle in CopyFiles */,
|
||||||
83BCB8DE17FC971300760340 /* WMA.bundle in CopyFiles */,
|
83BCB8DE17FC971300760340 /* WMA.bundle in CopyFiles */,
|
||||||
8360EF6D17F92E56005208A4 /* HighlyComplete.bundle in CopyFiles */,
|
8360EF6D17F92E56005208A4 /* HighlyComplete.bundle in CopyFiles */,
|
||||||
|
@ -741,6 +764,7 @@
|
||||||
56DB08540D67185300453B6A /* NSArray+CogSort.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSArray+CogSort.m"; path = "Spotlight/NSArray+CogSort.m"; sourceTree = "<group>"; };
|
56DB08540D67185300453B6A /* NSArray+CogSort.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSArray+CogSort.m"; path = "Spotlight/NSArray+CogSort.m"; sourceTree = "<group>"; };
|
||||||
8359FF2C17FEF35C0060F3ED /* ArchiveSource.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = ArchiveSource.xcodeproj; path = Plugins/ArchiveSource/ArchiveSource.xcodeproj; sourceTree = "<group>"; };
|
8359FF2C17FEF35C0060F3ED /* ArchiveSource.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = ArchiveSource.xcodeproj; path = Plugins/ArchiveSource/ArchiveSource.xcodeproj; sourceTree = "<group>"; };
|
||||||
8360EF0017F92B23005208A4 /* HighlyComplete.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = HighlyComplete.xcodeproj; path = Plugins/HighlyComplete/HighlyComplete.xcodeproj; sourceTree = "<group>"; };
|
8360EF0017F92B23005208A4 /* HighlyComplete.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = HighlyComplete.xcodeproj; path = Plugins/HighlyComplete/HighlyComplete.xcodeproj; sourceTree = "<group>"; };
|
||||||
|
8375B05117FFEA400092A79F /* Opus.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Opus.xcodeproj; path = Plugins/Opus/Opus.xcodeproj; sourceTree = "<group>"; };
|
||||||
8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
|
8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
|
||||||
8E07AB760AAC930B00A4B32F /* PreferencesController.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = PreferencesController.h; path = Preferences/PreferencesController.h; sourceTree = "<group>"; };
|
8E07AB760AAC930B00A4B32F /* PreferencesController.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = PreferencesController.h; path = Preferences/PreferencesController.h; sourceTree = "<group>"; };
|
||||||
8E07AB770AAC930B00A4B32F /* PreferencesController.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; name = PreferencesController.m; path = Preferences/PreferencesController.m; sourceTree = "<group>"; };
|
8E07AB770AAC930B00A4B32F /* PreferencesController.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; name = PreferencesController.m; path = Preferences/PreferencesController.m; sourceTree = "<group>"; };
|
||||||
|
@ -1024,6 +1048,7 @@
|
||||||
17C808710C3BD167005707C4 /* FileSource.xcodeproj */,
|
17C808710C3BD167005707C4 /* FileSource.xcodeproj */,
|
||||||
17C808660C3BD0F8005707C4 /* CoreAudio.xcodeproj */,
|
17C808660C3BD0F8005707C4 /* CoreAudio.xcodeproj */,
|
||||||
8359FF2C17FEF35C0060F3ED /* ArchiveSource.xcodeproj */,
|
8359FF2C17FEF35C0060F3ED /* ArchiveSource.xcodeproj */,
|
||||||
|
8375B05117FFEA400092A79F /* Opus.xcodeproj */,
|
||||||
);
|
);
|
||||||
name = PlugIns;
|
name = PlugIns;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
|
@ -1364,6 +1389,14 @@
|
||||||
name = Products;
|
name = Products;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
8375B05217FFEA400092A79F /* Products */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
8375B05717FFEA410092A79F /* Opus.bundle */,
|
||||||
|
);
|
||||||
|
name = Products;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
8E07AAEA0AAC90DC00A4B32F /* Preferences */ = {
|
8E07AAEA0AAC90DC00A4B32F /* Preferences */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
@ -1493,6 +1526,8 @@
|
||||||
buildRules = (
|
buildRules = (
|
||||||
);
|
);
|
||||||
dependencies = (
|
dependencies = (
|
||||||
|
8375B36217FFEF010092A79F /* PBXTargetDependency */,
|
||||||
|
8375B36417FFEF010092A79F /* PBXTargetDependency */,
|
||||||
83BCB8DD17FC96FC00760340 /* PBXTargetDependency */,
|
83BCB8DD17FC96FC00760340 /* PBXTargetDependency */,
|
||||||
83BCB8D917FC96F800760340 /* PBXTargetDependency */,
|
83BCB8D917FC96F800760340 /* PBXTargetDependency */,
|
||||||
17C8097E0C3BD1F5005707C4 /* PBXTargetDependency */,
|
17C8097E0C3BD1F5005707C4 /* PBXTargetDependency */,
|
||||||
|
@ -1610,6 +1645,10 @@
|
||||||
ProductGroup = 17C8089F0C3BD1AB005707C4 /* Products */;
|
ProductGroup = 17C8089F0C3BD1AB005707C4 /* Products */;
|
||||||
ProjectRef = 17C8089E0C3BD1AB005707C4 /* Musepack.xcodeproj */;
|
ProjectRef = 17C8089E0C3BD1AB005707C4 /* Musepack.xcodeproj */;
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
ProductGroup = 8375B05217FFEA400092A79F /* Products */;
|
||||||
|
ProjectRef = 8375B05117FFEA400092A79F /* Opus.xcodeproj */;
|
||||||
|
},
|
||||||
{
|
{
|
||||||
ProductGroup = 8E8D41C30CBB0DA000135C1B /* Products */;
|
ProductGroup = 8E8D41C30CBB0DA000135C1B /* Products */;
|
||||||
ProjectRef = 8E8D41C20CBB0DA000135C1B /* Pls.xcodeproj */;
|
ProjectRef = 8E8D41C20CBB0DA000135C1B /* Pls.xcodeproj */;
|
||||||
|
@ -1776,6 +1815,13 @@
|
||||||
remoteRef = 8360EF0417F92B24005208A4 /* PBXContainerItemProxy */;
|
remoteRef = 8360EF0417F92B24005208A4 /* PBXContainerItemProxy */;
|
||||||
sourceTree = BUILT_PRODUCTS_DIR;
|
sourceTree = BUILT_PRODUCTS_DIR;
|
||||||
};
|
};
|
||||||
|
8375B05717FFEA410092A79F /* Opus.bundle */ = {
|
||||||
|
isa = PBXReferenceProxy;
|
||||||
|
fileType = wrapper.cfbundle;
|
||||||
|
path = Opus.bundle;
|
||||||
|
remoteRef = 8375B05617FFEA410092A79F /* PBXContainerItemProxy */;
|
||||||
|
sourceTree = BUILT_PRODUCTS_DIR;
|
||||||
|
};
|
||||||
8E8D40870CBB036600135C1B /* M3u.bundle */ = {
|
8E8D40870CBB036600135C1B /* M3u.bundle */ = {
|
||||||
isa = PBXReferenceProxy;
|
isa = PBXReferenceProxy;
|
||||||
fileType = wrapper.cfbundle;
|
fileType = wrapper.cfbundle;
|
||||||
|
@ -2037,6 +2083,16 @@
|
||||||
name = General;
|
name = General;
|
||||||
targetProxy = 17F5623A0C3BD9280019975C /* PBXContainerItemProxy */;
|
targetProxy = 17F5623A0C3BD9280019975C /* PBXContainerItemProxy */;
|
||||||
};
|
};
|
||||||
|
8375B36217FFEF010092A79F /* PBXTargetDependency */ = {
|
||||||
|
isa = PBXTargetDependency;
|
||||||
|
name = ArchiveSource;
|
||||||
|
targetProxy = 8375B36117FFEF010092A79F /* PBXContainerItemProxy */;
|
||||||
|
};
|
||||||
|
8375B36417FFEF010092A79F /* PBXTargetDependency */ = {
|
||||||
|
isa = PBXTargetDependency;
|
||||||
|
name = Opus;
|
||||||
|
targetProxy = 8375B36317FFEF010092A79F /* PBXContainerItemProxy */;
|
||||||
|
};
|
||||||
83BCB8D917FC96F800760340 /* PBXTargetDependency */ = {
|
83BCB8D917FC96F800760340 /* PBXTargetDependency */ = {
|
||||||
isa = PBXTargetDependency;
|
isa = PBXTargetDependency;
|
||||||
name = HighlyComplete;
|
name = HighlyComplete;
|
||||||
|
|
1226
Frameworks/Opus/Opus.xcodeproj/project.pbxproj
Normal file
1226
Frameworks/Opus/Opus.xcodeproj/project.pbxproj
Normal file
File diff suppressed because it is too large
Load diff
30
Frameworks/Opus/Opus/Opus-Info.plist
Normal file
30
Frameworks/Opus/Opus/Opus-Info.plist
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleDevelopmentRegion</key>
|
||||||
|
<string>English</string>
|
||||||
|
<key>CFBundleExecutable</key>
|
||||||
|
<string>${EXECUTABLE_NAME}</string>
|
||||||
|
<key>CFBundleIconFile</key>
|
||||||
|
<string></string>
|
||||||
|
<key>CFBundleIdentifier</key>
|
||||||
|
<string>NoWork-Inc.${PRODUCT_NAME:rfc1034identifier}</string>
|
||||||
|
<key>CFBundleInfoDictionaryVersion</key>
|
||||||
|
<string>6.0</string>
|
||||||
|
<key>CFBundleName</key>
|
||||||
|
<string>${PRODUCT_NAME}</string>
|
||||||
|
<key>CFBundlePackageType</key>
|
||||||
|
<string>FMWK</string>
|
||||||
|
<key>CFBundleShortVersionString</key>
|
||||||
|
<string>1.0</string>
|
||||||
|
<key>CFBundleSignature</key>
|
||||||
|
<string>????</string>
|
||||||
|
<key>CFBundleVersion</key>
|
||||||
|
<string>1</string>
|
||||||
|
<key>NSHumanReadableCopyright</key>
|
||||||
|
<string>Copyright © 2013 Christopher Snowhill. All rights reserved.</string>
|
||||||
|
<key>NSPrincipalClass</key>
|
||||||
|
<string></string>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
2
Frameworks/Opus/Opus/en.lproj/InfoPlist.strings
Normal file
2
Frameworks/Opus/Opus/en.lproj/InfoPlist.strings
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
/* Localized versions of Info.plist keys */
|
||||||
|
|
6
Frameworks/Opus/Opus/opus/AUTHORS
Normal file
6
Frameworks/Opus/Opus/opus/AUTHORS
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
Jean-Marc Valin (jmvalin@jmvalin.ca)
|
||||||
|
Koen Vos (koenvos74@gmail.com)
|
||||||
|
Timothy Terriberry (tterribe@xiph.org)
|
||||||
|
Karsten Vandborg Sorensen (karsten.vandborg.sorensen@skype.net)
|
||||||
|
Soren Skak Jensen (ssjensen@gn.com)
|
||||||
|
Gregory Maxwell (greg@xiph.org)
|
44
Frameworks/Opus/Opus/opus/COPYING
Normal file
44
Frameworks/Opus/Opus/opus/COPYING
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
Copyright 2001-2011 Xiph.Org, Skype Limited, Octasic,
|
||||||
|
Jean-Marc Valin, Timothy B. Terriberry,
|
||||||
|
CSIRO, Gregory Maxwell, Mark Borgerding,
|
||||||
|
Erik de Castro Lopo
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
- Neither the name of Internet Society, IETF or IETF Trust, nor the
|
||||||
|
names of specific contributors, may be used to endorse or promote
|
||||||
|
products derived from this software without specific prior written
|
||||||
|
permission.
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
Opus is subject to the royalty-free patent licenses which are
|
||||||
|
specified at:
|
||||||
|
|
||||||
|
Xiph.Org Foundation:
|
||||||
|
https://datatracker.ietf.org/ipr/1524/
|
||||||
|
|
||||||
|
Microsoft Corporation:
|
||||||
|
https://datatracker.ietf.org/ipr/1914/
|
||||||
|
|
||||||
|
Broadcom Corporation:
|
||||||
|
https://datatracker.ietf.org/ipr/1526/
|
0
Frameworks/Opus/Opus/opus/ChangeLog
Normal file
0
Frameworks/Opus/Opus/opus/ChangeLog
Normal file
1
Frameworks/Opus/Opus/opus/INSTALL
Normal file
1
Frameworks/Opus/Opus/opus/INSTALL
Normal file
|
@ -0,0 +1 @@
|
||||||
|
See README file for details
|
185
Frameworks/Opus/Opus/opus/Makefile.am
Normal file
185
Frameworks/Opus/Opus/opus/Makefile.am
Normal file
|
@ -0,0 +1,185 @@
|
||||||
|
AUTOMAKE_OPTIONS = subdir-objects
|
||||||
|
|
||||||
|
lib_LTLIBRARIES = libopus.la
|
||||||
|
|
||||||
|
DIST_SUBDIRS = doc
|
||||||
|
|
||||||
|
INCLUDES = -I$(top_srcdir)/include -I$(top_srcdir)/celt -I$(top_srcdir)/silk -I$(top_srcdir)/silk/float -I$(top_srcdir)/silk/fixed
|
||||||
|
|
||||||
|
include celt_sources.mk
|
||||||
|
include silk_sources.mk
|
||||||
|
include opus_sources.mk
|
||||||
|
|
||||||
|
if FIXED_POINT
|
||||||
|
SILK_SOURCES += $(SILK_SOURCES_FIXED)
|
||||||
|
else
|
||||||
|
SILK_SOURCES += $(SILK_SOURCES_FLOAT)
|
||||||
|
endif
|
||||||
|
|
||||||
|
include celt_headers.mk
|
||||||
|
include silk_headers.mk
|
||||||
|
include opus_headers.mk
|
||||||
|
|
||||||
|
libopus_la_SOURCES = $(CELT_SOURCES) $(SILK_SOURCES) $(OPUS_SOURCES)
|
||||||
|
libopus_la_LDFLAGS = -no-undefined -version-info @OPUS_LT_CURRENT@:@OPUS_LT_REVISION@:@OPUS_LT_AGE@
|
||||||
|
|
||||||
|
pkginclude_HEADERS = include/opus.h include/opus_multistream.h include/opus_types.h include/opus_defines.h
|
||||||
|
|
||||||
|
noinst_HEADERS = $(OPUS_HEAD) $(SILK_HEAD) $(CELT_HEAD)
|
||||||
|
|
||||||
|
noinst_PROGRAMS = opus_demo repacketizer_demo opus_compare tests/test_opus_api tests/test_opus_encode tests/test_opus_decode celt/tests/test_unit_cwrs32 celt/tests/test_unit_dft celt/tests/test_unit_entropy celt/tests/test_unit_laplace celt/tests/test_unit_mathops celt/tests/test_unit_mdct celt/tests/test_unit_rotation celt/tests/test_unit_types
|
||||||
|
|
||||||
|
TESTS = celt/tests/test_unit_types celt/tests/test_unit_mathops celt/tests/test_unit_entropy celt/tests/test_unit_laplace celt/tests/test_unit_dft celt/tests/test_unit_mdct celt/tests/test_unit_rotation celt/tests/test_unit_cwrs32 tests/test_opus_api tests/test_opus_decode tests/test_opus_encode
|
||||||
|
|
||||||
|
opus_demo_SOURCES = src/opus_demo.c
|
||||||
|
|
||||||
|
opus_demo_LDADD = libopus.la -lm
|
||||||
|
|
||||||
|
repacketizer_demo_SOURCES = src/repacketizer_demo.c
|
||||||
|
|
||||||
|
repacketizer_demo_LDADD = libopus.la -lm
|
||||||
|
|
||||||
|
opus_compare_SOURCES = src/opus_compare.c
|
||||||
|
opus_compare_LDADD = -lm
|
||||||
|
|
||||||
|
tests_test_opus_api_SOURCES = tests/test_opus_api.c tests/test_opus_common.h
|
||||||
|
tests_test_opus_api_LDADD = libopus.la -lm
|
||||||
|
|
||||||
|
tests_test_opus_encode_SOURCES = tests/test_opus_encode.c tests/test_opus_common.h
|
||||||
|
tests_test_opus_encode_LDADD = libopus.la -lm
|
||||||
|
|
||||||
|
tests_test_opus_decode_SOURCES = tests/test_opus_decode.c tests/test_opus_common.h
|
||||||
|
tests_test_opus_decode_LDADD = libopus.la -lm
|
||||||
|
|
||||||
|
celt_tests_test_unit_cwrs32_SOURCES = celt/tests/test_unit_cwrs32.c
|
||||||
|
celt_tests_test_unit_cwrs32_LDADD = -lm
|
||||||
|
|
||||||
|
celt_tests_test_unit_dft_SOURCES = celt/tests/test_unit_dft.c
|
||||||
|
celt_tests_test_unit_dft_LDADD = -lm
|
||||||
|
|
||||||
|
celt_tests_test_unit_entropy_SOURCES = celt/tests/test_unit_entropy.c
|
||||||
|
celt_tests_test_unit_entropy_LDADD = -lm
|
||||||
|
|
||||||
|
celt_tests_test_unit_laplace_SOURCES = celt/tests/test_unit_laplace.c
|
||||||
|
celt_tests_test_unit_laplace_LDADD = -lm
|
||||||
|
|
||||||
|
celt_tests_test_unit_mathops_SOURCES = celt/tests/test_unit_mathops.c
|
||||||
|
celt_tests_test_unit_mathops_LDADD = -lm
|
||||||
|
|
||||||
|
celt_tests_test_unit_mdct_SOURCES = celt/tests/test_unit_mdct.c
|
||||||
|
celt_tests_test_unit_mdct_LDADD = -lm
|
||||||
|
|
||||||
|
celt_tests_test_unit_rotation_SOURCES = celt/tests/test_unit_rotation.c
|
||||||
|
celt_tests_test_unit_rotation_LDADD = -lm
|
||||||
|
|
||||||
|
celt_tests_test_unit_types_SOURCES = celt/tests/test_unit_types.c
|
||||||
|
celt_tests_test_unit_types_LDADD = -lm
|
||||||
|
|
||||||
|
if CUSTOM_MODES
|
||||||
|
pkginclude_HEADERS += include/opus_custom.h
|
||||||
|
noinst_PROGRAMS += opus_custom_demo
|
||||||
|
opus_custom_demo_SOURCES = celt/opus_custom_demo.c
|
||||||
|
opus_custom_demo_LDADD = libopus.la -lm
|
||||||
|
endif
|
||||||
|
|
||||||
|
EXTRA_DIST = version.mk \
|
||||||
|
opus.pc.in \
|
||||||
|
opus-uninstalled.pc.in \
|
||||||
|
opus.m4 \
|
||||||
|
Makefile.unix \
|
||||||
|
tests/run_vectors.sh \
|
||||||
|
opus.sln \
|
||||||
|
celt/celt.vcxproj \
|
||||||
|
celt/celt.vcxproj.filters \
|
||||||
|
src/opus_demo.vcxproj \
|
||||||
|
src/opus.vcxproj \
|
||||||
|
src/opus.vcxproj.filters \
|
||||||
|
src/opus_demo.vcxproj.filters \
|
||||||
|
tests/test_opus_decode.vcxproj.filters \
|
||||||
|
tests/test_opus_decode.vcxproj \
|
||||||
|
tests/test_opus_encode.vcxproj.filters \
|
||||||
|
tests/test_opus_encode.vcxproj \
|
||||||
|
tests/test_opus_api.vcxproj.filters \
|
||||||
|
tests/test_opus_api.vcxproj \
|
||||||
|
silk/float/silk_float.vcxproj.filters \
|
||||||
|
silk/float/silk_float.vcxproj \
|
||||||
|
silk/fixed/silk_fixed.vcxproj.filters \
|
||||||
|
silk/fixed/silk_fixed.vcxproj \
|
||||||
|
silk/silk_common.vcxproj \
|
||||||
|
silk/silk_common.vcxproj.filters \
|
||||||
|
win32/genversion.bat \
|
||||||
|
win32/config.h
|
||||||
|
|
||||||
|
pkgconfigdir = $(libdir)/pkgconfig
|
||||||
|
pkgconfig_DATA = opus.pc
|
||||||
|
|
||||||
|
m4datadir = $(datadir)/aclocal
|
||||||
|
m4data_DATA = opus.m4
|
||||||
|
|
||||||
|
# Targets to build and install just the library without the docs
|
||||||
|
opus check-opus install-opus: export NO_DOXYGEN = 1
|
||||||
|
|
||||||
|
opus: all
|
||||||
|
check-opus: check
|
||||||
|
install-opus: install
|
||||||
|
|
||||||
|
|
||||||
|
# Or just the docs
|
||||||
|
docs:
|
||||||
|
( cd doc && $(MAKE) $(AM_MAKEFLAGS) )
|
||||||
|
|
||||||
|
install-docs:
|
||||||
|
( cd doc && $(MAKE) $(AM_MAKEFLAGS) install )
|
||||||
|
|
||||||
|
|
||||||
|
# Or everything (by default)
|
||||||
|
all-local:
|
||||||
|
@[ -n "$(NO_DOXYGEN)" ] || ( cd doc && $(MAKE) $(AM_MAKEFLAGS) )
|
||||||
|
|
||||||
|
install-data-local:
|
||||||
|
@[ -n "$(NO_DOXYGEN)" ] || ( cd doc && $(MAKE) $(AM_MAKEFLAGS) install )
|
||||||
|
|
||||||
|
clean-local:
|
||||||
|
-( cd doc && $(MAKE) $(AM_MAKEFLAGS) clean )
|
||||||
|
|
||||||
|
uninstall-local:
|
||||||
|
( cd doc && $(MAKE) $(AM_MAKEFLAGS) uninstall )
|
||||||
|
|
||||||
|
|
||||||
|
# We check this every time make is run, with configure.ac being touched to
|
||||||
|
# trigger an update of the build system files if update_version changes the
|
||||||
|
# current PACKAGE_VERSION (or if package_version was modified manually by a
|
||||||
|
# user with either AUTO_UPDATE=no or no update_version script present - the
|
||||||
|
# latter being the normal case for tarball releases).
|
||||||
|
#
|
||||||
|
# We can't just add the package_version file to CONFIGURE_DEPENDENCIES since
|
||||||
|
# simply running autoconf will not actually regenerate configure for us when
|
||||||
|
# the content of that file changes (due to autoconf dependency checking not
|
||||||
|
# knowing about that without us creating yet another file for it to include).
|
||||||
|
#
|
||||||
|
# The MAKECMDGOALS check is a gnu-make'ism, but will degrade 'gracefully' for
|
||||||
|
# makes that don't support it. The only loss of functionality is not forcing
|
||||||
|
# an update of package_version for `make dist` if AUTO_UPDATE=no, but that is
|
||||||
|
# unlikely to be a real problem for any real user.
|
||||||
|
$(top_srcdir)/configure.ac: force
|
||||||
|
@case "$(MAKECMDGOALS)" in \
|
||||||
|
dist-hook) exit 0 ;; \
|
||||||
|
dist-* | dist | distcheck | distclean) _arg=release ;; \
|
||||||
|
esac; \
|
||||||
|
if ! $(top_srcdir)/update_version $$_arg 2> /dev/null; then \
|
||||||
|
if [ ! -e $(top_srcdir)/package_version ]; then \
|
||||||
|
echo 'PACKAGE_VERSION="unknown"' > $(top_srcdir)/package_version; \
|
||||||
|
fi; \
|
||||||
|
. $(top_srcdir)/package_version || exit 1; \
|
||||||
|
[ "$(PACKAGE_VERSION)" != "$$PACKAGE_VERSION" ] || exit 0; \
|
||||||
|
fi; \
|
||||||
|
touch $@
|
||||||
|
|
||||||
|
force:
|
||||||
|
|
||||||
|
# Create a minimal package_version file when make dist is run.
|
||||||
|
dist-hook:
|
||||||
|
echo 'PACKAGE_VERSION="$(PACKAGE_VERSION)"' > $(top_distdir)/package_version
|
||||||
|
|
||||||
|
|
||||||
|
.PHONY: opus check-opus install-opus docs install-docs
|
2595
Frameworks/Opus/Opus/opus/Makefile.in
Normal file
2595
Frameworks/Opus/Opus/opus/Makefile.in
Normal file
File diff suppressed because it is too large
Load diff
130
Frameworks/Opus/Opus/opus/Makefile.unix
Normal file
130
Frameworks/Opus/Opus/opus/Makefile.unix
Normal file
|
@ -0,0 +1,130 @@
|
||||||
|
#################### COMPILE OPTIONS #######################
|
||||||
|
|
||||||
|
# Uncomment this for fixed-point build
|
||||||
|
#FIXED_POINT=1
|
||||||
|
|
||||||
|
# It is strongly recommended to uncomment one of these
|
||||||
|
# VAR_ARRAYS: Use C99 variable-length arrays for stack allocation
|
||||||
|
# USE_ALLOCA: Use alloca() for stack allocation
|
||||||
|
# If none is defined, then the fallback is a non-threadsafe global array
|
||||||
|
CFLAGS := -DUSE_ALLOCA $(CFLAGS)
|
||||||
|
#CFLAGS := -DVAR_ARRAYS $(CFLAGS)
|
||||||
|
|
||||||
|
# These options affect performance
|
||||||
|
# HAVE_LRINTF: Use C99 intrinsics to speed up float-to-int conversion
|
||||||
|
# inline: Don't use the 'inline' keyword (for ANSI C compilers)
|
||||||
|
# restrict: Don't use the 'restrict' keyword (for pre-C99 compilers)
|
||||||
|
#CFLAGS := -DHAVE_LRINTF $(CFLAGS)
|
||||||
|
#CFLAGS := -Dinline= $(CFLAGS)
|
||||||
|
CFLAGS := -Drestrict= $(CFLAGS)
|
||||||
|
|
||||||
|
###################### END OF OPTIONS ######################
|
||||||
|
|
||||||
|
-include package_version
|
||||||
|
|
||||||
|
include silk_sources.mk
|
||||||
|
include celt_sources.mk
|
||||||
|
include opus_sources.mk
|
||||||
|
|
||||||
|
ifdef FIXED_POINT
|
||||||
|
SILK_SOURCES += $(SILK_SOURCES_FIXED)
|
||||||
|
else
|
||||||
|
SILK_SOURCES += $(SILK_SOURCES_FLOAT)
|
||||||
|
endif
|
||||||
|
|
||||||
|
EXESUFFIX =
|
||||||
|
LIBPREFIX = lib
|
||||||
|
LIBSUFFIX = .a
|
||||||
|
OBJSUFFIX = .o
|
||||||
|
|
||||||
|
CC = $(TOOLCHAIN_PREFIX)cc$(TOOLCHAIN_SUFFIX)
|
||||||
|
AR = $(TOOLCHAIN_PREFIX)ar
|
||||||
|
RANLIB = $(TOOLCHAIN_PREFIX)ranlib
|
||||||
|
CP = $(TOOLCHAIN_PREFIX)cp
|
||||||
|
|
||||||
|
cppflags-from-defines = $(addprefix -D,$(1))
|
||||||
|
cppflags-from-includes = $(addprefix -I,$(1))
|
||||||
|
ldflags-from-ldlibdirs = $(addprefix -L,$(1))
|
||||||
|
ldlibs-from-libs = $(addprefix -l,$(1))
|
||||||
|
|
||||||
|
WARNINGS = -Wall -W -Wstrict-prototypes -Wextra -Wcast-align -Wnested-externs -Wshadow
|
||||||
|
CFLAGS += -O2 -g $(WARNINGS) -DOPUS_BUILD
|
||||||
|
CINCLUDES = include silk celt
|
||||||
|
|
||||||
|
ifdef FIXED_POINT
|
||||||
|
CFLAGS += -DFIXED_POINT=1 -DDISABLE_FLOAT_API
|
||||||
|
CINCLUDES += silk/fixed
|
||||||
|
else
|
||||||
|
CINCLUDES += silk/float
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
LIBS = m
|
||||||
|
|
||||||
|
LDLIBDIRS = ./
|
||||||
|
|
||||||
|
CFLAGS += $(call cppflags-from-defines,$(CDEFINES))
|
||||||
|
CFLAGS += $(call cppflags-from-includes,$(CINCLUDES))
|
||||||
|
LDFLAGS += $(call ldflags-from-ldlibdirs,$(LDLIBDIRS))
|
||||||
|
LDLIBS += $(call ldlibs-from-libs,$(LIBS))
|
||||||
|
|
||||||
|
COMPILE.c.cmdline = $(CC) -c $(CFLAGS) -o $@ $<
|
||||||
|
LINK.o = $(CC) $(LDPREFLAGS) $(LDFLAGS)
|
||||||
|
LINK.o.cmdline = $(LINK.o) $^ $(LDLIBS) -o $@$(EXESUFFIX)
|
||||||
|
|
||||||
|
ARCHIVE.cmdline = $(AR) $(ARFLAGS) $@ $^ && $(RANLIB) $@
|
||||||
|
|
||||||
|
%$(OBJSUFFIX):%.c
|
||||||
|
$(COMPILE.c.cmdline)
|
||||||
|
|
||||||
|
%$(OBJSUFFIX):%.cpp
|
||||||
|
$(COMPILE.cpp.cmdline)
|
||||||
|
|
||||||
|
# Directives
|
||||||
|
|
||||||
|
|
||||||
|
# Variable definitions
|
||||||
|
LIB_NAME = opus
|
||||||
|
TARGET = $(LIBPREFIX)$(LIB_NAME)$(LIBSUFFIX)
|
||||||
|
|
||||||
|
SRCS_C = $(SILK_SOURCES) $(CELT_SOURCES) $(OPUS_SOURCES)
|
||||||
|
|
||||||
|
OBJS := $(patsubst %.c,%$(OBJSUFFIX),$(SRCS_C))
|
||||||
|
|
||||||
|
OPUSDEMO_SRCS_C = src/opus_demo.c
|
||||||
|
OPUSDEMO_OBJS := $(patsubst %.c,%$(OBJSUFFIX),$(OPUSDEMO_SRCS_C))
|
||||||
|
|
||||||
|
OPUSCOMPARE_SRCS_C = src/opus_compare.c
|
||||||
|
OPUSCOMPARE_OBJS := $(patsubst %.c,%$(OBJSUFFIX),$(OPUSCOMPARE_SRCS_C))
|
||||||
|
|
||||||
|
# Rules
|
||||||
|
all: lib opus_demo opus_compare
|
||||||
|
|
||||||
|
lib: $(TARGET)
|
||||||
|
|
||||||
|
$(TARGET): $(OBJS)
|
||||||
|
$(ARCHIVE.cmdline)
|
||||||
|
|
||||||
|
opus_demo$(EXESUFFIX): $(OPUSDEMO_OBJS) $(TARGET)
|
||||||
|
$(LINK.o.cmdline)
|
||||||
|
|
||||||
|
opus_compare$(EXESUFFIX): $(OPUSCOMPARE_OBJS)
|
||||||
|
$(LINK.o.cmdline)
|
||||||
|
|
||||||
|
celt/celt.o: CFLAGS += -DPACKAGE_VERSION='$(PACKAGE_VERSION)'
|
||||||
|
celt/celt.o: package_version
|
||||||
|
|
||||||
|
package_version: force
|
||||||
|
@if [ -x ./update_version ]; then \
|
||||||
|
./update_version || true; \
|
||||||
|
elif [ ! -e ./package_version ]; then \
|
||||||
|
echo 'PACKAGE_VERSION="unknown"' > ./package_version; \
|
||||||
|
fi
|
||||||
|
|
||||||
|
force:
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f opus_demo$(EXESUFFIX) opus_compare$(EXESUFFIX) $(TARGET) \
|
||||||
|
$(OBJS) $(OPUSDEMO_OBJS) $(OPUSCOMPARE_OBJS)
|
||||||
|
|
||||||
|
.PHONY: all lib clean
|
0
Frameworks/Opus/Opus/opus/NEWS
Normal file
0
Frameworks/Opus/Opus/opus/NEWS
Normal file
142
Frameworks/Opus/Opus/opus/README
Normal file
142
Frameworks/Opus/Opus/opus/README
Normal file
|
@ -0,0 +1,142 @@
|
||||||
|
== Opus audio codec ==
|
||||||
|
|
||||||
|
Opus is a codec for interactive speech and audio transmission over the Internet.
|
||||||
|
|
||||||
|
Opus can handle a wide range of interactive audio applications, including
|
||||||
|
Voice over IP, videoconferencing, in-game chat, and even remote live music
|
||||||
|
performances. It can scale from low bit-rate narrowband speech to very high
|
||||||
|
quality stereo music.
|
||||||
|
|
||||||
|
Opus, when coupled with an appropriate container format, is also suitable
|
||||||
|
for non-realtime stored-file applications such as music distribution, game
|
||||||
|
soundtracks, portable music players, jukeboxes, and other applications that
|
||||||
|
have historically used high latency formats such as MP3, AAC, or Vorbis.
|
||||||
|
|
||||||
|
Opus is specified by IETF RFC 6716:
|
||||||
|
http://tools.ietf.org/html/rfc6716
|
||||||
|
|
||||||
|
The Opus format and this implementation of it are subject to the royalty-
|
||||||
|
free patent and copyright licenses specified in the file COPYING.
|
||||||
|
|
||||||
|
This package implements a shared library for encoding and decoding raw Opus
|
||||||
|
bitstreams. Raw Opus bitstreams should be used over RTP according to
|
||||||
|
http://tools.ietf.org/html/draft-spittka-payload-rtp-opus
|
||||||
|
|
||||||
|
The package also includes a number of test tools used for testing the
|
||||||
|
correct operation of the library. The bitstreams read/written by these
|
||||||
|
tools should not be used for Opus file distribution: They include
|
||||||
|
additional debugging data and cannot support seeking.
|
||||||
|
|
||||||
|
Opus stored in files should use the Ogg encapsulation for Opus which is
|
||||||
|
described at:
|
||||||
|
http://wiki.xiph.org/OggOpus
|
||||||
|
|
||||||
|
An opus-tools package is available which provides encoding and decoding of
|
||||||
|
Ogg encapsulated Opus files and includes a number of useful features.
|
||||||
|
|
||||||
|
Opus-tools can be found at:
|
||||||
|
https://git.xiph.org/?p=opus-tools.git
|
||||||
|
or on the main Opus website:
|
||||||
|
http://opus-codec.org/
|
||||||
|
|
||||||
|
== Compiling libopus ==
|
||||||
|
|
||||||
|
To build from a distribution tarball, you only need to do the following:
|
||||||
|
|
||||||
|
% ./configure
|
||||||
|
% make
|
||||||
|
|
||||||
|
To build from the git repository, the following steps are necessary:
|
||||||
|
|
||||||
|
1) Clone the repository:
|
||||||
|
|
||||||
|
% git clone git://git.opus-codec.org/opus.git
|
||||||
|
% cd opus
|
||||||
|
|
||||||
|
2) Compiling the source
|
||||||
|
|
||||||
|
% ./autogen.sh
|
||||||
|
% ./configure
|
||||||
|
% make
|
||||||
|
|
||||||
|
3) Install the codec libraries (optional)
|
||||||
|
|
||||||
|
% sudo make install
|
||||||
|
|
||||||
|
Once you have compiled the codec, there will be a opus_demo executable
|
||||||
|
in the top directory.
|
||||||
|
|
||||||
|
Usage: opus_demo [-e] <application> <sampling rate (Hz)> <channels (1/2)>
|
||||||
|
<bits per second> [options] <input> <output>
|
||||||
|
opus_demo -d <sampling rate (Hz)> <channels (1/2)> [options]
|
||||||
|
<input> <output>
|
||||||
|
|
||||||
|
mode: voip | audio | restricted-lowdelay
|
||||||
|
options:
|
||||||
|
-e : only runs the encoder (output the bit-stream)
|
||||||
|
-d : only runs the decoder (reads the bit-stream as input)
|
||||||
|
-cbr : enable constant bitrate; default: variable bitrate
|
||||||
|
-cvbr : enable constrained variable bitrate; default:
|
||||||
|
unconstrained
|
||||||
|
-bandwidth <NB|MB|WB|SWB|FB>
|
||||||
|
: audio bandwidth (from narrowband to fullband);
|
||||||
|
default: sampling rate
|
||||||
|
-framesize <2.5|5|10|20|40|60>
|
||||||
|
: frame size in ms; default: 20
|
||||||
|
-max_payload <bytes>
|
||||||
|
: maximum payload size in bytes, default: 1024
|
||||||
|
-complexity <comp>
|
||||||
|
: complexity, 0 (lowest) ... 10 (highest); default: 10
|
||||||
|
-inbandfec : enable SILK inband FEC
|
||||||
|
-forcemono : force mono encoding, even for stereo input
|
||||||
|
-dtx : enable SILK DTX
|
||||||
|
-loss <perc> : simulate packet loss, in percent (0-100); default: 0
|
||||||
|
|
||||||
|
input and output are little-endian signed 16-bit PCM files or opus
|
||||||
|
bitstreams with simple opus_demo proprietary framing.
|
||||||
|
|
||||||
|
== Testing ==
|
||||||
|
|
||||||
|
This package includes a collection of automated unit and system tests
|
||||||
|
which SHOULD be run after compiling the package especially the first
|
||||||
|
time it is run on a new platform.
|
||||||
|
|
||||||
|
To run the integrated tests:
|
||||||
|
% make check
|
||||||
|
|
||||||
|
There is also collection of standard test vectors which are not
|
||||||
|
included in this package for size reasons but can be obtained from:
|
||||||
|
http://opus-codec.org/testvectors/opus_testvectors.tar.gz
|
||||||
|
|
||||||
|
To run compare the code to these test vectors:
|
||||||
|
|
||||||
|
% curl -O http://opus-codec.org/testvectors/opus_testvectors.tar.gz
|
||||||
|
% tar -zxf opus_testvectors.tar.gz
|
||||||
|
% ./tests/run_vectors.sh ./ opus_testvectors 48000
|
||||||
|
|
||||||
|
== Portability notes ==
|
||||||
|
|
||||||
|
This implementation uses floating-point by default but can be compiled to
|
||||||
|
use only fixed-point arithmetic by setting --enable-fixed-point (if using
|
||||||
|
autoconf) or by defining the FIXED_POINT macro (if building manually).
|
||||||
|
The fixed point implementation has somewhat lower audio quality and is
|
||||||
|
slower on platforms with fast FPUs, it is normally only used in embedded
|
||||||
|
environments.
|
||||||
|
|
||||||
|
The implementation can be compiled with either a C89 or a C99 compiler.
|
||||||
|
While it does not rely on any _undefined behavior_ as defined by C89 or
|
||||||
|
C99, it relies on common _implementation-defined behavior_ for two's
|
||||||
|
complement architectures:
|
||||||
|
|
||||||
|
o Right shifts of negative values are consistent with two's
|
||||||
|
complement arithmetic, so that a>>b is equivalent to
|
||||||
|
floor(a/(2^b)),
|
||||||
|
|
||||||
|
o For conversion to a signed integer of N bits, the value is reduced
|
||||||
|
modulo 2^N to be within range of the type,
|
||||||
|
|
||||||
|
o The result of integer division of a negative value is truncated
|
||||||
|
towards zero, and
|
||||||
|
|
||||||
|
o The compiler provides a 64-bit integer type (a C99 requirement
|
||||||
|
which is supported by most C89 compilers).
|
1108
Frameworks/Opus/Opus/opus/aclocal.m4
vendored
Normal file
1108
Frameworks/Opus/Opus/opus/aclocal.m4
vendored
Normal file
File diff suppressed because it is too large
Load diff
175
Frameworks/Opus/Opus/opus/celt/_kiss_fft_guts.h
Normal file
175
Frameworks/Opus/Opus/opus/celt/_kiss_fft_guts.h
Normal file
|
@ -0,0 +1,175 @@
|
||||||
|
/*Copyright (c) 2003-2004, Mark Borgerding
|
||||||
|
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
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.*/
|
||||||
|
|
||||||
|
#ifndef KISS_FFT_GUTS_H
|
||||||
|
#define KISS_FFT_GUTS_H
|
||||||
|
|
||||||
|
#define MIN(a,b) ((a)<(b) ? (a):(b))
|
||||||
|
#define MAX(a,b) ((a)>(b) ? (a):(b))
|
||||||
|
|
||||||
|
/* kiss_fft.h
|
||||||
|
defines kiss_fft_scalar as either short or a float type
|
||||||
|
and defines
|
||||||
|
typedef struct { kiss_fft_scalar r; kiss_fft_scalar i; }kiss_fft_cpx; */
|
||||||
|
#include "kiss_fft.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
Explanation of macros dealing with complex math:
|
||||||
|
|
||||||
|
C_MUL(m,a,b) : m = a*b
|
||||||
|
C_FIXDIV( c , div ) : if a fixed point impl., c /= div. noop otherwise
|
||||||
|
C_SUB( res, a,b) : res = a - b
|
||||||
|
C_SUBFROM( res , a) : res -= a
|
||||||
|
C_ADDTO( res , a) : res += a
|
||||||
|
* */
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
#include "arch.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define SAMP_MAX 2147483647
|
||||||
|
#define TWID_MAX 32767
|
||||||
|
#define TRIG_UPSCALE 1
|
||||||
|
|
||||||
|
#define SAMP_MIN -SAMP_MAX
|
||||||
|
|
||||||
|
|
||||||
|
# define S_MUL(a,b) MULT16_32_Q15(b, a)
|
||||||
|
|
||||||
|
# define C_MUL(m,a,b) \
|
||||||
|
do{ (m).r = SUB32(S_MUL((a).r,(b).r) , S_MUL((a).i,(b).i)); \
|
||||||
|
(m).i = ADD32(S_MUL((a).r,(b).i) , S_MUL((a).i,(b).r)); }while(0)
|
||||||
|
|
||||||
|
# define C_MULC(m,a,b) \
|
||||||
|
do{ (m).r = ADD32(S_MUL((a).r,(b).r) , S_MUL((a).i,(b).i)); \
|
||||||
|
(m).i = SUB32(S_MUL((a).i,(b).r) , S_MUL((a).r,(b).i)); }while(0)
|
||||||
|
|
||||||
|
# define C_MUL4(m,a,b) \
|
||||||
|
do{ (m).r = SHR32(SUB32(S_MUL((a).r,(b).r) , S_MUL((a).i,(b).i)),2); \
|
||||||
|
(m).i = SHR32(ADD32(S_MUL((a).r,(b).i) , S_MUL((a).i,(b).r)),2); }while(0)
|
||||||
|
|
||||||
|
# define C_MULBYSCALAR( c, s ) \
|
||||||
|
do{ (c).r = S_MUL( (c).r , s ) ;\
|
||||||
|
(c).i = S_MUL( (c).i , s ) ; }while(0)
|
||||||
|
|
||||||
|
# define DIVSCALAR(x,k) \
|
||||||
|
(x) = S_MUL( x, (TWID_MAX-((k)>>1))/(k)+1 )
|
||||||
|
|
||||||
|
# define C_FIXDIV(c,div) \
|
||||||
|
do { DIVSCALAR( (c).r , div); \
|
||||||
|
DIVSCALAR( (c).i , div); }while (0)
|
||||||
|
|
||||||
|
#define C_ADD( res, a,b)\
|
||||||
|
do {(res).r=ADD32((a).r,(b).r); (res).i=ADD32((a).i,(b).i); \
|
||||||
|
}while(0)
|
||||||
|
#define C_SUB( res, a,b)\
|
||||||
|
do {(res).r=SUB32((a).r,(b).r); (res).i=SUB32((a).i,(b).i); \
|
||||||
|
}while(0)
|
||||||
|
#define C_ADDTO( res , a)\
|
||||||
|
do {(res).r = ADD32((res).r, (a).r); (res).i = ADD32((res).i,(a).i);\
|
||||||
|
}while(0)
|
||||||
|
|
||||||
|
#define C_SUBFROM( res , a)\
|
||||||
|
do {(res).r = ADD32((res).r,(a).r); (res).i = SUB32((res).i,(a).i); \
|
||||||
|
}while(0)
|
||||||
|
|
||||||
|
#else /* not FIXED_POINT*/
|
||||||
|
|
||||||
|
# define S_MUL(a,b) ( (a)*(b) )
|
||||||
|
#define C_MUL(m,a,b) \
|
||||||
|
do{ (m).r = (a).r*(b).r - (a).i*(b).i;\
|
||||||
|
(m).i = (a).r*(b).i + (a).i*(b).r; }while(0)
|
||||||
|
#define C_MULC(m,a,b) \
|
||||||
|
do{ (m).r = (a).r*(b).r + (a).i*(b).i;\
|
||||||
|
(m).i = (a).i*(b).r - (a).r*(b).i; }while(0)
|
||||||
|
|
||||||
|
#define C_MUL4(m,a,b) C_MUL(m,a,b)
|
||||||
|
|
||||||
|
# define C_FIXDIV(c,div) /* NOOP */
|
||||||
|
# define C_MULBYSCALAR( c, s ) \
|
||||||
|
do{ (c).r *= (s);\
|
||||||
|
(c).i *= (s); }while(0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef CHECK_OVERFLOW_OP
|
||||||
|
# define CHECK_OVERFLOW_OP(a,op,b) /* noop */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef C_ADD
|
||||||
|
#define C_ADD( res, a,b)\
|
||||||
|
do { \
|
||||||
|
CHECK_OVERFLOW_OP((a).r,+,(b).r)\
|
||||||
|
CHECK_OVERFLOW_OP((a).i,+,(b).i)\
|
||||||
|
(res).r=(a).r+(b).r; (res).i=(a).i+(b).i; \
|
||||||
|
}while(0)
|
||||||
|
#define C_SUB( res, a,b)\
|
||||||
|
do { \
|
||||||
|
CHECK_OVERFLOW_OP((a).r,-,(b).r)\
|
||||||
|
CHECK_OVERFLOW_OP((a).i,-,(b).i)\
|
||||||
|
(res).r=(a).r-(b).r; (res).i=(a).i-(b).i; \
|
||||||
|
}while(0)
|
||||||
|
#define C_ADDTO( res , a)\
|
||||||
|
do { \
|
||||||
|
CHECK_OVERFLOW_OP((res).r,+,(a).r)\
|
||||||
|
CHECK_OVERFLOW_OP((res).i,+,(a).i)\
|
||||||
|
(res).r += (a).r; (res).i += (a).i;\
|
||||||
|
}while(0)
|
||||||
|
|
||||||
|
#define C_SUBFROM( res , a)\
|
||||||
|
do {\
|
||||||
|
CHECK_OVERFLOW_OP((res).r,-,(a).r)\
|
||||||
|
CHECK_OVERFLOW_OP((res).i,-,(a).i)\
|
||||||
|
(res).r -= (a).r; (res).i -= (a).i; \
|
||||||
|
}while(0)
|
||||||
|
#endif /* C_ADD defined */
|
||||||
|
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
/*# define KISS_FFT_COS(phase) TRIG_UPSCALE*floor(MIN(32767,MAX(-32767,.5+32768 * cos (phase))))
|
||||||
|
# define KISS_FFT_SIN(phase) TRIG_UPSCALE*floor(MIN(32767,MAX(-32767,.5+32768 * sin (phase))))*/
|
||||||
|
# define KISS_FFT_COS(phase) floor(.5+TWID_MAX*cos (phase))
|
||||||
|
# define KISS_FFT_SIN(phase) floor(.5+TWID_MAX*sin (phase))
|
||||||
|
# define HALF_OF(x) ((x)>>1)
|
||||||
|
#elif defined(USE_SIMD)
|
||||||
|
# define KISS_FFT_COS(phase) _mm_set1_ps( cos(phase) )
|
||||||
|
# define KISS_FFT_SIN(phase) _mm_set1_ps( sin(phase) )
|
||||||
|
# define HALF_OF(x) ((x)*_mm_set1_ps(.5f))
|
||||||
|
#else
|
||||||
|
# define KISS_FFT_COS(phase) (kiss_fft_scalar) cos(phase)
|
||||||
|
# define KISS_FFT_SIN(phase) (kiss_fft_scalar) sin(phase)
|
||||||
|
# define HALF_OF(x) ((x)*.5f)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define kf_cexp(x,phase) \
|
||||||
|
do{ \
|
||||||
|
(x)->r = KISS_FFT_COS(phase);\
|
||||||
|
(x)->i = KISS_FFT_SIN(phase);\
|
||||||
|
}while(0)
|
||||||
|
|
||||||
|
#define kf_cexp2(x,phase) \
|
||||||
|
do{ \
|
||||||
|
(x)->r = TRIG_UPSCALE*celt_cos_norm((phase));\
|
||||||
|
(x)->i = TRIG_UPSCALE*celt_cos_norm((phase)-32768);\
|
||||||
|
}while(0)
|
||||||
|
|
||||||
|
#endif /* KISS_FFT_GUTS_H */
|
209
Frameworks/Opus/Opus/opus/celt/arch.h
Normal file
209
Frameworks/Opus/Opus/opus/celt/arch.h
Normal file
|
@ -0,0 +1,209 @@
|
||||||
|
/* Copyright (c) 2003-2008 Jean-Marc Valin
|
||||||
|
Copyright (c) 2007-2008 CSIRO
|
||||||
|
Copyright (c) 2007-2009 Xiph.Org Foundation
|
||||||
|
Written by Jean-Marc Valin */
|
||||||
|
/**
|
||||||
|
@file arch.h
|
||||||
|
@brief Various architecture definitions for CELT
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef ARCH_H
|
||||||
|
#define ARCH_H
|
||||||
|
|
||||||
|
#include "opus_types.h"
|
||||||
|
|
||||||
|
# if !defined(__GNUC_PREREQ)
|
||||||
|
# if defined(__GNUC__)&&defined(__GNUC_MINOR__)
|
||||||
|
# define __GNUC_PREREQ(_maj,_min) \
|
||||||
|
((__GNUC__<<16)+__GNUC_MINOR__>=((_maj)<<16)+(_min))
|
||||||
|
# else
|
||||||
|
# define __GNUC_PREREQ(_maj,_min) 0
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#define CELT_SIG_SCALE 32768.f
|
||||||
|
|
||||||
|
#define celt_fatal(str) _celt_fatal(str, __FILE__, __LINE__);
|
||||||
|
#ifdef ENABLE_ASSERTIONS
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__attribute__((noreturn))
|
||||||
|
#endif
|
||||||
|
static inline void _celt_fatal(const char *str, const char *file, int line)
|
||||||
|
{
|
||||||
|
fprintf (stderr, "Fatal (internal) error in %s, line %d: %s\n", file, line, str);
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
#define celt_assert(cond) {if (!(cond)) {celt_fatal("assertion failed: " #cond);}}
|
||||||
|
#define celt_assert2(cond, message) {if (!(cond)) {celt_fatal("assertion failed: " #cond "\n" message);}}
|
||||||
|
#else
|
||||||
|
#define celt_assert(cond)
|
||||||
|
#define celt_assert2(cond, message)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define IMUL32(a,b) ((a)*(b))
|
||||||
|
|
||||||
|
#define ABS(x) ((x) < 0 ? (-(x)) : (x)) /**< Absolute integer value. */
|
||||||
|
#define ABS16(x) ((x) < 0 ? (-(x)) : (x)) /**< Absolute 16-bit value. */
|
||||||
|
#define MIN16(a,b) ((a) < (b) ? (a) : (b)) /**< Minimum 16-bit value. */
|
||||||
|
#define MAX16(a,b) ((a) > (b) ? (a) : (b)) /**< Maximum 16-bit value. */
|
||||||
|
#define ABS32(x) ((x) < 0 ? (-(x)) : (x)) /**< Absolute 32-bit value. */
|
||||||
|
#define MIN32(a,b) ((a) < (b) ? (a) : (b)) /**< Minimum 32-bit value. */
|
||||||
|
#define MAX32(a,b) ((a) > (b) ? (a) : (b)) /**< Maximum 32-bit value. */
|
||||||
|
#define IMIN(a,b) ((a) < (b) ? (a) : (b)) /**< Minimum int value. */
|
||||||
|
#define IMAX(a,b) ((a) > (b) ? (a) : (b)) /**< Maximum int value. */
|
||||||
|
#define UADD32(a,b) ((a)+(b))
|
||||||
|
#define USUB32(a,b) ((a)-(b))
|
||||||
|
|
||||||
|
#define PRINT_MIPS(file)
|
||||||
|
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
|
||||||
|
typedef opus_int16 opus_val16;
|
||||||
|
typedef opus_int32 opus_val32;
|
||||||
|
|
||||||
|
typedef opus_val32 celt_sig;
|
||||||
|
typedef opus_val16 celt_norm;
|
||||||
|
typedef opus_val32 celt_ener;
|
||||||
|
|
||||||
|
#define Q15ONE 32767
|
||||||
|
|
||||||
|
#define SIG_SHIFT 12
|
||||||
|
|
||||||
|
#define NORM_SCALING 16384
|
||||||
|
|
||||||
|
#define DB_SHIFT 10
|
||||||
|
|
||||||
|
#define EPSILON 1
|
||||||
|
#define VERY_LARGE16 ((opus_val16)32767)
|
||||||
|
#define Q15_ONE ((opus_val16)32767)
|
||||||
|
|
||||||
|
#define SCALEIN(a) (a)
|
||||||
|
#define SCALEOUT(a) (a)
|
||||||
|
|
||||||
|
#ifdef FIXED_DEBUG
|
||||||
|
#include "fixed_debug.h"
|
||||||
|
#else
|
||||||
|
|
||||||
|
#include "fixed_generic.h"
|
||||||
|
|
||||||
|
#ifdef ARM5E_ASM
|
||||||
|
#include "fixed_arm5e.h"
|
||||||
|
#elif defined (ARM4_ASM)
|
||||||
|
#include "fixed_arm4.h"
|
||||||
|
#elif defined (BFIN_ASM)
|
||||||
|
#include "fixed_bfin.h"
|
||||||
|
#elif defined (TI_C5X_ASM)
|
||||||
|
#include "fixed_c5x.h"
|
||||||
|
#elif defined (TI_C6X_ASM)
|
||||||
|
#include "fixed_c6x.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#else /* FIXED_POINT */
|
||||||
|
|
||||||
|
typedef float opus_val16;
|
||||||
|
typedef float opus_val32;
|
||||||
|
|
||||||
|
typedef float celt_sig;
|
||||||
|
typedef float celt_norm;
|
||||||
|
typedef float celt_ener;
|
||||||
|
|
||||||
|
#define Q15ONE 1.0f
|
||||||
|
|
||||||
|
#define NORM_SCALING 1.f
|
||||||
|
|
||||||
|
#define EPSILON 1e-15f
|
||||||
|
#define VERY_LARGE16 1e15f
|
||||||
|
#define Q15_ONE ((opus_val16)1.f)
|
||||||
|
|
||||||
|
#define QCONST16(x,bits) (x)
|
||||||
|
#define QCONST32(x,bits) (x)
|
||||||
|
|
||||||
|
#define NEG16(x) (-(x))
|
||||||
|
#define NEG32(x) (-(x))
|
||||||
|
#define EXTRACT16(x) (x)
|
||||||
|
#define EXTEND32(x) (x)
|
||||||
|
#define SHR16(a,shift) (a)
|
||||||
|
#define SHL16(a,shift) (a)
|
||||||
|
#define SHR32(a,shift) (a)
|
||||||
|
#define SHL32(a,shift) (a)
|
||||||
|
#define PSHR32(a,shift) (a)
|
||||||
|
#define VSHR32(a,shift) (a)
|
||||||
|
|
||||||
|
#define PSHR(a,shift) (a)
|
||||||
|
#define SHR(a,shift) (a)
|
||||||
|
#define SHL(a,shift) (a)
|
||||||
|
#define SATURATE(x,a) (x)
|
||||||
|
|
||||||
|
#define ROUND16(a,shift) (a)
|
||||||
|
#define HALF16(x) (.5f*(x))
|
||||||
|
#define HALF32(x) (.5f*(x))
|
||||||
|
|
||||||
|
#define ADD16(a,b) ((a)+(b))
|
||||||
|
#define SUB16(a,b) ((a)-(b))
|
||||||
|
#define ADD32(a,b) ((a)+(b))
|
||||||
|
#define SUB32(a,b) ((a)-(b))
|
||||||
|
#define MULT16_16_16(a,b) ((a)*(b))
|
||||||
|
#define MULT16_16(a,b) ((opus_val32)(a)*(opus_val32)(b))
|
||||||
|
#define MAC16_16(c,a,b) ((c)+(opus_val32)(a)*(opus_val32)(b))
|
||||||
|
|
||||||
|
#define MULT16_32_Q15(a,b) ((a)*(b))
|
||||||
|
#define MULT16_32_Q16(a,b) ((a)*(b))
|
||||||
|
|
||||||
|
#define MULT32_32_Q31(a,b) ((a)*(b))
|
||||||
|
|
||||||
|
#define MAC16_32_Q15(c,a,b) ((c)+(a)*(b))
|
||||||
|
|
||||||
|
#define MULT16_16_Q11_32(a,b) ((a)*(b))
|
||||||
|
#define MULT16_16_Q13(a,b) ((a)*(b))
|
||||||
|
#define MULT16_16_Q14(a,b) ((a)*(b))
|
||||||
|
#define MULT16_16_Q15(a,b) ((a)*(b))
|
||||||
|
#define MULT16_16_P15(a,b) ((a)*(b))
|
||||||
|
#define MULT16_16_P13(a,b) ((a)*(b))
|
||||||
|
#define MULT16_16_P14(a,b) ((a)*(b))
|
||||||
|
#define MULT16_32_P16(a,b) ((a)*(b))
|
||||||
|
|
||||||
|
#define DIV32_16(a,b) (((opus_val32)(a))/(opus_val16)(b))
|
||||||
|
#define DIV32(a,b) (((opus_val32)(a))/(opus_val32)(b))
|
||||||
|
|
||||||
|
#define SCALEIN(a) ((a)*CELT_SIG_SCALE)
|
||||||
|
#define SCALEOUT(a) ((a)*(1/CELT_SIG_SCALE))
|
||||||
|
|
||||||
|
#endif /* !FIXED_POINT */
|
||||||
|
|
||||||
|
#ifndef GLOBAL_STACK_SIZE
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
#define GLOBAL_STACK_SIZE 100000
|
||||||
|
#else
|
||||||
|
#define GLOBAL_STACK_SIZE 100000
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* ARCH_H */
|
1302
Frameworks/Opus/Opus/opus/celt/bands.c
Normal file
1302
Frameworks/Opus/Opus/opus/celt/bands.c
Normal file
File diff suppressed because it is too large
Load diff
95
Frameworks/Opus/Opus/opus/celt/bands.h
Normal file
95
Frameworks/Opus/Opus/opus/celt/bands.h
Normal file
|
@ -0,0 +1,95 @@
|
||||||
|
/* Copyright (c) 2007-2008 CSIRO
|
||||||
|
Copyright (c) 2007-2009 Xiph.Org Foundation
|
||||||
|
Copyright (c) 2008-2009 Gregory Maxwell
|
||||||
|
Written by Jean-Marc Valin and Gregory Maxwell */
|
||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BANDS_H
|
||||||
|
#define BANDS_H
|
||||||
|
|
||||||
|
#include "arch.h"
|
||||||
|
#include "modes.h"
|
||||||
|
#include "entenc.h"
|
||||||
|
#include "entdec.h"
|
||||||
|
#include "rate.h"
|
||||||
|
|
||||||
|
/** Compute the amplitude (sqrt energy) in each of the bands
|
||||||
|
* @param m Mode data
|
||||||
|
* @param X Spectrum
|
||||||
|
* @param bands Square root of the energy for each band (returned)
|
||||||
|
*/
|
||||||
|
void compute_band_energies(const CELTMode *m, const celt_sig *X, celt_ener *bandE, int end, int C, int M);
|
||||||
|
|
||||||
|
/*void compute_noise_energies(const CELTMode *m, const celt_sig *X, const opus_val16 *tonality, celt_ener *bandE);*/
|
||||||
|
|
||||||
|
/** Normalise each band of X such that the energy in each band is
|
||||||
|
equal to 1
|
||||||
|
* @param m Mode data
|
||||||
|
* @param X Spectrum (returned normalised)
|
||||||
|
* @param bands Square root of the energy for each band
|
||||||
|
*/
|
||||||
|
void normalise_bands(const CELTMode *m, const celt_sig * OPUS_RESTRICT freq, celt_norm * OPUS_RESTRICT X, const celt_ener *bandE, int end, int C, int M);
|
||||||
|
|
||||||
|
/** Denormalise each band of X to restore full amplitude
|
||||||
|
* @param m Mode data
|
||||||
|
* @param X Spectrum (returned de-normalised)
|
||||||
|
* @param bands Square root of the energy for each band
|
||||||
|
*/
|
||||||
|
void denormalise_bands(const CELTMode *m, const celt_norm * OPUS_RESTRICT X, celt_sig * OPUS_RESTRICT freq, const celt_ener *bandE, int end, int C, int M);
|
||||||
|
|
||||||
|
#define SPREAD_NONE (0)
|
||||||
|
#define SPREAD_LIGHT (1)
|
||||||
|
#define SPREAD_NORMAL (2)
|
||||||
|
#define SPREAD_AGGRESSIVE (3)
|
||||||
|
|
||||||
|
int spreading_decision(const CELTMode *m, celt_norm *X, int *average,
|
||||||
|
int last_decision, int *hf_average, int *tapset_decision, int update_hf,
|
||||||
|
int end, int C, int M);
|
||||||
|
|
||||||
|
#ifdef MEASURE_NORM_MSE
|
||||||
|
void measure_norm_mse(const CELTMode *m, float *X, float *X0, float *bandE, float *bandE0, int M, int N, int C);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void haar1(celt_norm *X, int N0, int stride);
|
||||||
|
|
||||||
|
/** Quantisation/encoding of the residual spectrum
|
||||||
|
* @param m Mode data
|
||||||
|
* @param X Residual (normalised)
|
||||||
|
* @param total_bits Total number of bits that can be used for the frame (including the ones already spent)
|
||||||
|
* @param enc Entropy encoder
|
||||||
|
*/
|
||||||
|
void quant_all_bands(int encode, const CELTMode *m, int start, int end,
|
||||||
|
celt_norm * X, celt_norm * Y, unsigned char *collapse_masks, const celt_ener *bandE, int *pulses,
|
||||||
|
int time_domain, int fold, int dual_stereo, int intensity, int *tf_res,
|
||||||
|
opus_int32 total_bits, opus_int32 balance, ec_ctx *ec, int M, int codedBands, opus_uint32 *seed);
|
||||||
|
|
||||||
|
void anti_collapse(const CELTMode *m, celt_norm *X_, unsigned char *collapse_masks, int LM, int C, int size,
|
||||||
|
int start, int end, opus_val16 *logE, opus_val16 *prev1logE,
|
||||||
|
opus_val16 *prev2logE, int *pulses, opus_uint32 seed);
|
||||||
|
|
||||||
|
opus_uint32 celt_lcg_rand(opus_uint32 seed);
|
||||||
|
|
||||||
|
#endif /* BANDS_H */
|
2913
Frameworks/Opus/Opus/opus/celt/celt.c
Normal file
2913
Frameworks/Opus/Opus/opus/celt/celt.c
Normal file
File diff suppressed because it is too large
Load diff
117
Frameworks/Opus/Opus/opus/celt/celt.h
Normal file
117
Frameworks/Opus/Opus/opus/celt/celt.h
Normal file
|
@ -0,0 +1,117 @@
|
||||||
|
/* Copyright (c) 2007-2008 CSIRO
|
||||||
|
Copyright (c) 2007-2009 Xiph.Org Foundation
|
||||||
|
Copyright (c) 2008 Gregory Maxwell
|
||||||
|
Written by Jean-Marc Valin and Gregory Maxwell */
|
||||||
|
/**
|
||||||
|
@file celt.h
|
||||||
|
@brief Contains all the functions for encoding and decoding audio
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef CELT_H
|
||||||
|
#define CELT_H
|
||||||
|
|
||||||
|
#include "opus_types.h"
|
||||||
|
#include "opus_defines.h"
|
||||||
|
#include "opus_custom.h"
|
||||||
|
#include "entenc.h"
|
||||||
|
#include "entdec.h"
|
||||||
|
#include "arch.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define CELTEncoder OpusCustomEncoder
|
||||||
|
#define CELTDecoder OpusCustomDecoder
|
||||||
|
#define CELTMode OpusCustomMode
|
||||||
|
|
||||||
|
#define _celt_check_mode_ptr_ptr(ptr) ((ptr) + ((ptr) - (const CELTMode**)(ptr)))
|
||||||
|
|
||||||
|
/* Encoder/decoder Requests */
|
||||||
|
|
||||||
|
#define CELT_SET_PREDICTION_REQUEST 10002
|
||||||
|
/** Controls the use of interframe prediction.
|
||||||
|
0=Independent frames
|
||||||
|
1=Short term interframe prediction allowed
|
||||||
|
2=Long term prediction allowed
|
||||||
|
*/
|
||||||
|
#define CELT_SET_PREDICTION(x) CELT_SET_PREDICTION_REQUEST, __opus_check_int(x)
|
||||||
|
|
||||||
|
#define CELT_SET_INPUT_CLIPPING_REQUEST 10004
|
||||||
|
#define CELT_SET_INPUT_CLIPPING(x) CELT_SET_INPUT_CLIPPING_REQUEST, __opus_check_int(x)
|
||||||
|
|
||||||
|
#define CELT_GET_AND_CLEAR_ERROR_REQUEST 10007
|
||||||
|
#define CELT_GET_AND_CLEAR_ERROR(x) CELT_GET_AND_CLEAR_ERROR_REQUEST, __opus_check_int_ptr(x)
|
||||||
|
|
||||||
|
#define CELT_SET_CHANNELS_REQUEST 10008
|
||||||
|
#define CELT_SET_CHANNELS(x) CELT_SET_CHANNELS_REQUEST, __opus_check_int(x)
|
||||||
|
|
||||||
|
|
||||||
|
/* Internal */
|
||||||
|
#define CELT_SET_START_BAND_REQUEST 10010
|
||||||
|
#define CELT_SET_START_BAND(x) CELT_SET_START_BAND_REQUEST, __opus_check_int(x)
|
||||||
|
|
||||||
|
#define CELT_SET_END_BAND_REQUEST 10012
|
||||||
|
#define CELT_SET_END_BAND(x) CELT_SET_END_BAND_REQUEST, __opus_check_int(x)
|
||||||
|
|
||||||
|
#define CELT_GET_MODE_REQUEST 10015
|
||||||
|
/** Get the CELTMode used by an encoder or decoder */
|
||||||
|
#define CELT_GET_MODE(x) CELT_GET_MODE_REQUEST, _celt_check_mode_ptr_ptr(x)
|
||||||
|
|
||||||
|
#define CELT_SET_SIGNALLING_REQUEST 10016
|
||||||
|
#define CELT_SET_SIGNALLING(x) CELT_SET_SIGNALLING_REQUEST, __opus_check_int(x)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Encoder stuff */
|
||||||
|
|
||||||
|
int celt_encoder_get_size(int channels);
|
||||||
|
|
||||||
|
int celt_encode_with_ec(OpusCustomEncoder * OPUS_RESTRICT st, const opus_val16 * pcm, int frame_size, unsigned char *compressed, int nbCompressedBytes, ec_enc *enc);
|
||||||
|
|
||||||
|
int celt_encoder_init(CELTEncoder *st, opus_int32 sampling_rate, int channels);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Decoder stuff */
|
||||||
|
|
||||||
|
int celt_decoder_get_size(int channels);
|
||||||
|
|
||||||
|
|
||||||
|
int celt_decoder_init(CELTDecoder *st, opus_int32 sampling_rate, int channels);
|
||||||
|
|
||||||
|
int celt_decode_with_ec(OpusCustomDecoder * OPUS_RESTRICT st, const unsigned char *data, int len, opus_val16 * OPUS_RESTRICT pcm, int frame_size, ec_dec *dec);
|
||||||
|
|
||||||
|
#define celt_encoder_ctl opus_custom_encoder_ctl
|
||||||
|
#define celt_decoder_ctl opus_custom_decoder_ctl
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* CELT_H */
|
237
Frameworks/Opus/Opus/opus/celt/celt.vcxproj
Normal file
237
Frameworks/Opus/Opus/opus/celt/celt.vcxproj
Normal file
|
@ -0,0 +1,237 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Debug|x64">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|Win32">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|x64">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
</ItemGroup>
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<ProjectGuid>{245603E3-F580-41A5-9632-B25FE3372CBF}</ProjectGuid>
|
||||||
|
<Keyword>Win32Proj</Keyword>
|
||||||
|
<RootNamespace>celt</RootNamespace>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
|
<ImportGroup Label="ExtensionSettings">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<PropertyGroup Label="UserMacros" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<CustomBuildBeforeTargets>
|
||||||
|
</CustomBuildBeforeTargets>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<PrecompiledHeader>
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<PreprocessorDefinitions>HAVE_CONFIG_H;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<AdditionalIncludeDirectories>../win32;../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Windows</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
</Link>
|
||||||
|
<PreBuildEvent>
|
||||||
|
<Command>"$(ProjectDir)..\win32\genversion.bat" "$(ProjectDir)..\win32\version.h" OPUS_VERSION</Command>
|
||||||
|
<Message>Generating version.h</Message>
|
||||||
|
</PreBuildEvent>
|
||||||
|
<CustomBuildStep>
|
||||||
|
<Command>
|
||||||
|
</Command>
|
||||||
|
</CustomBuildStep>
|
||||||
|
<CustomBuildStep>
|
||||||
|
<Outputs>
|
||||||
|
</Outputs>
|
||||||
|
</CustomBuildStep>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<PrecompiledHeader>
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<PreprocessorDefinitions>HAVE_CONFIG_H;WIN32;WIN64;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<AdditionalIncludeDirectories>../win32;../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Windows</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
</Link>
|
||||||
|
<PreBuildEvent>
|
||||||
|
<Command>"$(ProjectDir)..\win32\genversion.bat" "$(ProjectDir)..\win32\version.h" OPUS_VERSION</Command>
|
||||||
|
<Message>Generating version.h</Message>
|
||||||
|
</PreBuildEvent>
|
||||||
|
<CustomBuildStep>
|
||||||
|
<Command>
|
||||||
|
</Command>
|
||||||
|
</CustomBuildStep>
|
||||||
|
<CustomBuildStep>
|
||||||
|
<Outputs>
|
||||||
|
</Outputs>
|
||||||
|
</CustomBuildStep>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<PrecompiledHeader>
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<PreprocessorDefinitions>HAVE_CONFIG_H;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<AdditionalIncludeDirectories>../win32;../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Windows</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
</Link>
|
||||||
|
<PreBuildEvent>
|
||||||
|
<Command>"$(ProjectDir)..\win32\genversion.bat" "$(ProjectDir)..\win32\version.h" OPUS_VERSION</Command>
|
||||||
|
<Message>Generating version.h</Message>
|
||||||
|
</PreBuildEvent>
|
||||||
|
<CustomBuildStep>
|
||||||
|
<Command>
|
||||||
|
</Command>
|
||||||
|
</CustomBuildStep>
|
||||||
|
<CustomBuildStep>
|
||||||
|
<Outputs>
|
||||||
|
</Outputs>
|
||||||
|
</CustomBuildStep>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<PrecompiledHeader>
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<PreprocessorDefinitions>HAVE_CONFIG_H;WIN32;WIN64;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<AdditionalIncludeDirectories>../win32;../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Windows</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
</Link>
|
||||||
|
<PreBuildEvent>
|
||||||
|
<Command>"$(ProjectDir)..\win32\genversion.bat" "$(ProjectDir)..\win32\version.h" OPUS_VERSION</Command>
|
||||||
|
<Message>Generating version.h</Message>
|
||||||
|
</PreBuildEvent>
|
||||||
|
<CustomBuildStep>
|
||||||
|
<Command>
|
||||||
|
</Command>
|
||||||
|
</CustomBuildStep>
|
||||||
|
<CustomBuildStep>
|
||||||
|
<Outputs>
|
||||||
|
</Outputs>
|
||||||
|
</CustomBuildStep>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="..\win32\config.h" />
|
||||||
|
<ClInclude Include="arch.h" />
|
||||||
|
<ClInclude Include="bands.h" />
|
||||||
|
<ClInclude Include="celt.h" />
|
||||||
|
<ClInclude Include="cwrs.h" />
|
||||||
|
<ClInclude Include="ecintrin.h" />
|
||||||
|
<ClInclude Include="entcode.h" />
|
||||||
|
<ClInclude Include="entdec.h" />
|
||||||
|
<ClInclude Include="entenc.h" />
|
||||||
|
<ClInclude Include="fixed_debug.h" />
|
||||||
|
<ClInclude Include="fixed_generic.h" />
|
||||||
|
<ClInclude Include="float_cast.h" />
|
||||||
|
<ClInclude Include="kiss_fft.h" />
|
||||||
|
<ClInclude Include="laplace.h" />
|
||||||
|
<ClInclude Include="mathops.h" />
|
||||||
|
<ClInclude Include="mdct.h" />
|
||||||
|
<ClInclude Include="modes.h" />
|
||||||
|
<ClInclude Include="os_support.h" />
|
||||||
|
<ClInclude Include="pitch.h" />
|
||||||
|
<ClInclude Include="celt_lpc.h" />
|
||||||
|
<ClInclude Include="quant_bands.h" />
|
||||||
|
<ClInclude Include="rate.h" />
|
||||||
|
<ClInclude Include="stack_alloc.h" />
|
||||||
|
<ClInclude Include="vq.h" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="bands.c" />
|
||||||
|
<ClCompile Include="celt.c" />
|
||||||
|
<ClCompile Include="cwrs.c" />
|
||||||
|
<ClCompile Include="entcode.c" />
|
||||||
|
<ClCompile Include="entdec.c" />
|
||||||
|
<ClCompile Include="entenc.c" />
|
||||||
|
<ClCompile Include="kiss_fft.c" />
|
||||||
|
<ClCompile Include="laplace.c" />
|
||||||
|
<ClCompile Include="mathops.c" />
|
||||||
|
<ClCompile Include="mdct.c" />
|
||||||
|
<ClCompile Include="modes.c" />
|
||||||
|
<ClCompile Include="pitch.c" />
|
||||||
|
<ClCompile Include="celt_lpc.c" />
|
||||||
|
<ClCompile Include="quant_bands.c" />
|
||||||
|
<ClCompile Include="rate.c" />
|
||||||
|
<ClCompile Include="vq.c" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
<ImportGroup Label="ExtensionTargets">
|
||||||
|
</ImportGroup>
|
||||||
|
</Project>
|
141
Frameworks/Opus/Opus/opus/celt/celt.vcxproj.filters
Normal file
141
Frameworks/Opus/Opus/opus/celt/celt.vcxproj.filters
Normal file
|
@ -0,0 +1,141 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup>
|
||||||
|
<Filter Include="Source Files">
|
||||||
|
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||||
|
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Header Files">
|
||||||
|
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||||
|
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Resource Files">
|
||||||
|
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||||
|
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||||
|
</Filter>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="arch.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="bands.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="celt.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="cwrs.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="ecintrin.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="entcode.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="entdec.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="entenc.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="fixed_debug.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="fixed_generic.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="float_cast.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="kiss_fft.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="laplace.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="mathops.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="mdct.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="modes.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="os_support.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="pitch.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="celt_lpc.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="quant_bands.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="rate.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="stack_alloc.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="vq.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\win32\config.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="bands.c">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="celt.c">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="cwrs.c">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="entcode.c">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="entdec.c">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="entenc.c">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="kiss_fft.c">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="laplace.c">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="mdct.c">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="modes.c">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="pitch.c">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="celt_lpc.c">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="quant_bands.c">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="rate.c">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="vq.c">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="mathops.c">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
188
Frameworks/Opus/Opus/opus/celt/celt_lpc.c
Normal file
188
Frameworks/Opus/Opus/opus/celt/celt_lpc.c
Normal file
|
@ -0,0 +1,188 @@
|
||||||
|
/* Copyright (c) 2009-2010 Xiph.Org Foundation
|
||||||
|
Written by Jean-Marc Valin */
|
||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "celt_lpc.h"
|
||||||
|
#include "stack_alloc.h"
|
||||||
|
#include "mathops.h"
|
||||||
|
|
||||||
|
void _celt_lpc(
|
||||||
|
opus_val16 *_lpc, /* out: [0...p-1] LPC coefficients */
|
||||||
|
const opus_val32 *ac, /* in: [0...p] autocorrelation values */
|
||||||
|
int p
|
||||||
|
)
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
opus_val32 r;
|
||||||
|
opus_val32 error = ac[0];
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
opus_val32 lpc[LPC_ORDER];
|
||||||
|
#else
|
||||||
|
float *lpc = _lpc;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
for (i = 0; i < p; i++)
|
||||||
|
lpc[i] = 0;
|
||||||
|
if (ac[0] != 0)
|
||||||
|
{
|
||||||
|
for (i = 0; i < p; i++) {
|
||||||
|
/* Sum up this iteration's reflection coefficient */
|
||||||
|
opus_val32 rr = 0;
|
||||||
|
for (j = 0; j < i; j++)
|
||||||
|
rr += MULT32_32_Q31(lpc[j],ac[i - j]);
|
||||||
|
rr += SHR32(ac[i + 1],3);
|
||||||
|
r = -frac_div32(SHL32(rr,3), error);
|
||||||
|
/* Update LPC coefficients and total error */
|
||||||
|
lpc[i] = SHR32(r,3);
|
||||||
|
for (j = 0; j < (i+1)>>1; j++)
|
||||||
|
{
|
||||||
|
opus_val32 tmp1, tmp2;
|
||||||
|
tmp1 = lpc[j];
|
||||||
|
tmp2 = lpc[i-1-j];
|
||||||
|
lpc[j] = tmp1 + MULT32_32_Q31(r,tmp2);
|
||||||
|
lpc[i-1-j] = tmp2 + MULT32_32_Q31(r,tmp1);
|
||||||
|
}
|
||||||
|
|
||||||
|
error = error - MULT32_32_Q31(MULT32_32_Q31(r,r),error);
|
||||||
|
/* Bail out once we get 30 dB gain */
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
if (error<SHR32(ac[0],10))
|
||||||
|
break;
|
||||||
|
#else
|
||||||
|
if (error<.001f*ac[0])
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
for (i=0;i<p;i++)
|
||||||
|
_lpc[i] = ROUND16(lpc[i],16);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void celt_fir(const opus_val16 *x,
|
||||||
|
const opus_val16 *num,
|
||||||
|
opus_val16 *y,
|
||||||
|
int N,
|
||||||
|
int ord,
|
||||||
|
opus_val16 *mem)
|
||||||
|
{
|
||||||
|
int i,j;
|
||||||
|
|
||||||
|
for (i=0;i<N;i++)
|
||||||
|
{
|
||||||
|
opus_val32 sum = SHL32(EXTEND32(x[i]), SIG_SHIFT);
|
||||||
|
for (j=0;j<ord;j++)
|
||||||
|
{
|
||||||
|
sum += MULT16_16(num[j],mem[j]);
|
||||||
|
}
|
||||||
|
for (j=ord-1;j>=1;j--)
|
||||||
|
{
|
||||||
|
mem[j]=mem[j-1];
|
||||||
|
}
|
||||||
|
mem[0] = x[i];
|
||||||
|
y[i] = ROUND16(sum, SIG_SHIFT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void celt_iir(const opus_val32 *x,
|
||||||
|
const opus_val16 *den,
|
||||||
|
opus_val32 *y,
|
||||||
|
int N,
|
||||||
|
int ord,
|
||||||
|
opus_val16 *mem)
|
||||||
|
{
|
||||||
|
int i,j;
|
||||||
|
for (i=0;i<N;i++)
|
||||||
|
{
|
||||||
|
opus_val32 sum = x[i];
|
||||||
|
for (j=0;j<ord;j++)
|
||||||
|
{
|
||||||
|
sum -= MULT16_16(den[j],mem[j]);
|
||||||
|
}
|
||||||
|
for (j=ord-1;j>=1;j--)
|
||||||
|
{
|
||||||
|
mem[j]=mem[j-1];
|
||||||
|
}
|
||||||
|
mem[0] = ROUND16(sum,SIG_SHIFT);
|
||||||
|
y[i] = sum;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void _celt_autocorr(
|
||||||
|
const opus_val16 *x, /* in: [0...n-1] samples x */
|
||||||
|
opus_val32 *ac, /* out: [0...lag-1] ac values */
|
||||||
|
const opus_val16 *window,
|
||||||
|
int overlap,
|
||||||
|
int lag,
|
||||||
|
int n
|
||||||
|
)
|
||||||
|
{
|
||||||
|
opus_val32 d;
|
||||||
|
int i;
|
||||||
|
VARDECL(opus_val16, xx);
|
||||||
|
SAVE_STACK;
|
||||||
|
ALLOC(xx, n, opus_val16);
|
||||||
|
celt_assert(n>0);
|
||||||
|
celt_assert(overlap>=0);
|
||||||
|
for (i=0;i<n;i++)
|
||||||
|
xx[i] = x[i];
|
||||||
|
for (i=0;i<overlap;i++)
|
||||||
|
{
|
||||||
|
xx[i] = MULT16_16_Q15(x[i],window[i]);
|
||||||
|
xx[n-i-1] = MULT16_16_Q15(x[n-i-1],window[i]);
|
||||||
|
}
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
{
|
||||||
|
opus_val32 ac0=0;
|
||||||
|
int shift;
|
||||||
|
for(i=0;i<n;i++)
|
||||||
|
ac0 += SHR32(MULT16_16(xx[i],xx[i]),9);
|
||||||
|
ac0 += 1+n;
|
||||||
|
|
||||||
|
shift = celt_ilog2(ac0)-30+10;
|
||||||
|
shift = (shift+1)/2;
|
||||||
|
for(i=0;i<n;i++)
|
||||||
|
xx[i] = VSHR32(xx[i], shift);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
while (lag>=0)
|
||||||
|
{
|
||||||
|
for (i = lag, d = 0; i < n; i++)
|
||||||
|
d += xx[i] * xx[i-lag];
|
||||||
|
ac[lag] = d;
|
||||||
|
/*printf ("%f ", ac[lag]);*/
|
||||||
|
lag--;
|
||||||
|
}
|
||||||
|
/*printf ("\n");*/
|
||||||
|
ac[0] += 10;
|
||||||
|
|
||||||
|
RESTORE_STACK;
|
||||||
|
}
|
53
Frameworks/Opus/Opus/opus/celt/celt_lpc.h
Normal file
53
Frameworks/Opus/Opus/opus/celt/celt_lpc.h
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
/* Copyright (c) 2009-2010 Xiph.Org Foundation
|
||||||
|
Written by Jean-Marc Valin */
|
||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef PLC_H
|
||||||
|
#define PLC_H
|
||||||
|
|
||||||
|
#include "arch.h"
|
||||||
|
|
||||||
|
#define LPC_ORDER 24
|
||||||
|
|
||||||
|
void _celt_lpc(opus_val16 *_lpc, const opus_val32 *ac, int p);
|
||||||
|
|
||||||
|
void celt_fir(const opus_val16 *x,
|
||||||
|
const opus_val16 *num,
|
||||||
|
opus_val16 *y,
|
||||||
|
int N,
|
||||||
|
int ord,
|
||||||
|
opus_val16 *mem);
|
||||||
|
|
||||||
|
void celt_iir(const opus_val32 *x,
|
||||||
|
const opus_val16 *den,
|
||||||
|
opus_val32 *y,
|
||||||
|
int N,
|
||||||
|
int ord,
|
||||||
|
opus_val16 *mem);
|
||||||
|
|
||||||
|
void _celt_autocorr(const opus_val16 *x, opus_val32 *ac, const opus_val16 *window, int overlap, int lag, int n);
|
||||||
|
|
||||||
|
#endif /* PLC_H */
|
645
Frameworks/Opus/Opus/opus/celt/cwrs.c
Normal file
645
Frameworks/Opus/Opus/opus/celt/cwrs.c
Normal file
|
@ -0,0 +1,645 @@
|
||||||
|
/* Copyright (c) 2007-2008 CSIRO
|
||||||
|
Copyright (c) 2007-2009 Xiph.Org Foundation
|
||||||
|
Copyright (c) 2007-2009 Timothy B. Terriberry
|
||||||
|
Written by Timothy B. Terriberry and Jean-Marc Valin */
|
||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "os_support.h"
|
||||||
|
#include "cwrs.h"
|
||||||
|
#include "mathops.h"
|
||||||
|
#include "arch.h"
|
||||||
|
|
||||||
|
#ifdef CUSTOM_MODES
|
||||||
|
|
||||||
|
/*Guaranteed to return a conservatively large estimate of the binary logarithm
|
||||||
|
with frac bits of fractional precision.
|
||||||
|
Tested for all possible 32-bit inputs with frac=4, where the maximum
|
||||||
|
overestimation is 0.06254243 bits.*/
|
||||||
|
int log2_frac(opus_uint32 val, int frac)
|
||||||
|
{
|
||||||
|
int l;
|
||||||
|
l=EC_ILOG(val);
|
||||||
|
if(val&(val-1)){
|
||||||
|
/*This is (val>>l-16), but guaranteed to round up, even if adding a bias
|
||||||
|
before the shift would cause overflow (e.g., for 0xFFFFxxxx).
|
||||||
|
Doesn't work for val=0, but that case fails the test above.*/
|
||||||
|
if(l>16)val=((val-1)>>(l-16))+1;
|
||||||
|
else val<<=16-l;
|
||||||
|
l=(l-1)<<frac;
|
||||||
|
/*Note that we always need one iteration, since the rounding up above means
|
||||||
|
that we might need to adjust the integer part of the logarithm.*/
|
||||||
|
do{
|
||||||
|
int b;
|
||||||
|
b=(int)(val>>16);
|
||||||
|
l+=b<<frac;
|
||||||
|
val=(val+b)>>b;
|
||||||
|
val=(val*val+0x7FFF)>>15;
|
||||||
|
}
|
||||||
|
while(frac-->0);
|
||||||
|
/*If val is not exactly 0x8000, then we have to round up the remainder.*/
|
||||||
|
return l+(val>0x8000);
|
||||||
|
}
|
||||||
|
/*Exact powers of two require no rounding.*/
|
||||||
|
else return (l-1)<<frac;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef SMALL_FOOTPRINT
|
||||||
|
|
||||||
|
#define MASK32 (0xFFFFFFFF)
|
||||||
|
|
||||||
|
/*INV_TABLE[i] holds the multiplicative inverse of (2*i+1) mod 2**32.*/
|
||||||
|
static const opus_uint32 INV_TABLE[53]={
|
||||||
|
0x00000001,0xAAAAAAAB,0xCCCCCCCD,0xB6DB6DB7,
|
||||||
|
0x38E38E39,0xBA2E8BA3,0xC4EC4EC5,0xEEEEEEEF,
|
||||||
|
0xF0F0F0F1,0x286BCA1B,0x3CF3CF3D,0xE9BD37A7,
|
||||||
|
0xC28F5C29,0x684BDA13,0x4F72C235,0xBDEF7BDF,
|
||||||
|
0x3E0F83E1,0x8AF8AF8B,0x914C1BAD,0x96F96F97,
|
||||||
|
0xC18F9C19,0x2FA0BE83,0xA4FA4FA5,0x677D46CF,
|
||||||
|
0x1A1F58D1,0xFAFAFAFB,0x8C13521D,0x586FB587,
|
||||||
|
0xB823EE09,0xA08AD8F3,0xC10C9715,0xBEFBEFBF,
|
||||||
|
0xC0FC0FC1,0x07A44C6B,0xA33F128D,0xE327A977,
|
||||||
|
0xC7E3F1F9,0x962FC963,0x3F2B3885,0x613716AF,
|
||||||
|
0x781948B1,0x2B2E43DB,0xFCFCFCFD,0x6FD0EB67,
|
||||||
|
0xFA3F47E9,0xD2FD2FD3,0x3F4FD3F5,0xD4E25B9F,
|
||||||
|
0x5F02A3A1,0xBF5A814B,0x7C32B16D,0xD3431B57,
|
||||||
|
0xD8FD8FD9,
|
||||||
|
};
|
||||||
|
|
||||||
|
/*Computes (_a*_b-_c)/(2*_d+1) when the quotient is known to be exact.
|
||||||
|
_a, _b, _c, and _d may be arbitrary so long as the arbitrary precision result
|
||||||
|
fits in 32 bits, but currently the table for multiplicative inverses is only
|
||||||
|
valid for _d<=52.*/
|
||||||
|
static inline opus_uint32 imusdiv32odd(opus_uint32 _a,opus_uint32 _b,
|
||||||
|
opus_uint32 _c,int _d){
|
||||||
|
celt_assert(_d<=52);
|
||||||
|
return (_a*_b-_c)*INV_TABLE[_d]&MASK32;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*Computes (_a*_b-_c)/_d when the quotient is known to be exact.
|
||||||
|
_d does not actually have to be even, but imusdiv32odd will be faster when
|
||||||
|
it's odd, so you should use that instead.
|
||||||
|
_a and _d are assumed to be small (e.g., _a*_d fits in 32 bits; currently the
|
||||||
|
table for multiplicative inverses is only valid for _d<=54).
|
||||||
|
_b and _c may be arbitrary so long as the arbitrary precision reuslt fits in
|
||||||
|
32 bits.*/
|
||||||
|
static inline opus_uint32 imusdiv32even(opus_uint32 _a,opus_uint32 _b,
|
||||||
|
opus_uint32 _c,int _d){
|
||||||
|
opus_uint32 inv;
|
||||||
|
int mask;
|
||||||
|
int shift;
|
||||||
|
int one;
|
||||||
|
celt_assert(_d>0);
|
||||||
|
celt_assert(_d<=54);
|
||||||
|
shift=EC_ILOG(_d^(_d-1));
|
||||||
|
inv=INV_TABLE[(_d-1)>>shift];
|
||||||
|
shift--;
|
||||||
|
one=1<<shift;
|
||||||
|
mask=one-1;
|
||||||
|
return (_a*(_b>>shift)-(_c>>shift)+
|
||||||
|
((_a*(_b&mask)+one-(_c&mask))>>shift)-1)*inv&MASK32;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* SMALL_FOOTPRINT */
|
||||||
|
|
||||||
|
/*Although derived separately, the pulse vector coding scheme is equivalent to
|
||||||
|
a Pyramid Vector Quantizer \cite{Fis86}.
|
||||||
|
Some additional notes about an early version appear at
|
||||||
|
http://people.xiph.org/~tterribe/notes/cwrs.html, but the codebook ordering
|
||||||
|
and the definitions of some terms have evolved since that was written.
|
||||||
|
|
||||||
|
The conversion from a pulse vector to an integer index (encoding) and back
|
||||||
|
(decoding) is governed by two related functions, V(N,K) and U(N,K).
|
||||||
|
|
||||||
|
V(N,K) = the number of combinations, with replacement, of N items, taken K
|
||||||
|
at a time, when a sign bit is added to each item taken at least once (i.e.,
|
||||||
|
the number of N-dimensional unit pulse vectors with K pulses).
|
||||||
|
One way to compute this is via
|
||||||
|
V(N,K) = K>0 ? sum(k=1...K,2**k*choose(N,k)*choose(K-1,k-1)) : 1,
|
||||||
|
where choose() is the binomial function.
|
||||||
|
A table of values for N<10 and K<10 looks like:
|
||||||
|
V[10][10] = {
|
||||||
|
{1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||||
|
{1, 2, 2, 2, 2, 2, 2, 2, 2, 2},
|
||||||
|
{1, 4, 8, 12, 16, 20, 24, 28, 32, 36},
|
||||||
|
{1, 6, 18, 38, 66, 102, 146, 198, 258, 326},
|
||||||
|
{1, 8, 32, 88, 192, 360, 608, 952, 1408, 1992},
|
||||||
|
{1, 10, 50, 170, 450, 1002, 1970, 3530, 5890, 9290},
|
||||||
|
{1, 12, 72, 292, 912, 2364, 5336, 10836, 20256, 35436},
|
||||||
|
{1, 14, 98, 462, 1666, 4942, 12642, 28814, 59906, 115598},
|
||||||
|
{1, 16, 128, 688, 2816, 9424, 27008, 68464, 157184, 332688},
|
||||||
|
{1, 18, 162, 978, 4482, 16722, 53154, 148626, 374274, 864146}
|
||||||
|
};
|
||||||
|
|
||||||
|
U(N,K) = the number of such combinations wherein N-1 objects are taken at
|
||||||
|
most K-1 at a time.
|
||||||
|
This is given by
|
||||||
|
U(N,K) = sum(k=0...K-1,V(N-1,k))
|
||||||
|
= K>0 ? (V(N-1,K-1) + V(N,K-1))/2 : 0.
|
||||||
|
The latter expression also makes clear that U(N,K) is half the number of such
|
||||||
|
combinations wherein the first object is taken at least once.
|
||||||
|
Although it may not be clear from either of these definitions, U(N,K) is the
|
||||||
|
natural function to work with when enumerating the pulse vector codebooks,
|
||||||
|
not V(N,K).
|
||||||
|
U(N,K) is not well-defined for N=0, but with the extension
|
||||||
|
U(0,K) = K>0 ? 0 : 1,
|
||||||
|
the function becomes symmetric: U(N,K) = U(K,N), with a similar table:
|
||||||
|
U[10][10] = {
|
||||||
|
{1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||||
|
{0, 1, 1, 1, 1, 1, 1, 1, 1, 1},
|
||||||
|
{0, 1, 3, 5, 7, 9, 11, 13, 15, 17},
|
||||||
|
{0, 1, 5, 13, 25, 41, 61, 85, 113, 145},
|
||||||
|
{0, 1, 7, 25, 63, 129, 231, 377, 575, 833},
|
||||||
|
{0, 1, 9, 41, 129, 321, 681, 1289, 2241, 3649},
|
||||||
|
{0, 1, 11, 61, 231, 681, 1683, 3653, 7183, 13073},
|
||||||
|
{0, 1, 13, 85, 377, 1289, 3653, 8989, 19825, 40081},
|
||||||
|
{0, 1, 15, 113, 575, 2241, 7183, 19825, 48639, 108545},
|
||||||
|
{0, 1, 17, 145, 833, 3649, 13073, 40081, 108545, 265729}
|
||||||
|
};
|
||||||
|
|
||||||
|
With this extension, V(N,K) may be written in terms of U(N,K):
|
||||||
|
V(N,K) = U(N,K) + U(N,K+1)
|
||||||
|
for all N>=0, K>=0.
|
||||||
|
Thus U(N,K+1) represents the number of combinations where the first element
|
||||||
|
is positive or zero, and U(N,K) represents the number of combinations where
|
||||||
|
it is negative.
|
||||||
|
With a large enough table of U(N,K) values, we could write O(N) encoding
|
||||||
|
and O(min(N*log(K),N+K)) decoding routines, but such a table would be
|
||||||
|
prohibitively large for small embedded devices (K may be as large as 32767
|
||||||
|
for small N, and N may be as large as 200).
|
||||||
|
|
||||||
|
Both functions obey the same recurrence relation:
|
||||||
|
V(N,K) = V(N-1,K) + V(N,K-1) + V(N-1,K-1),
|
||||||
|
U(N,K) = U(N-1,K) + U(N,K-1) + U(N-1,K-1),
|
||||||
|
for all N>0, K>0, with different initial conditions at N=0 or K=0.
|
||||||
|
This allows us to construct a row of one of the tables above given the
|
||||||
|
previous row or the next row.
|
||||||
|
Thus we can derive O(NK) encoding and decoding routines with O(K) memory
|
||||||
|
using only addition and subtraction.
|
||||||
|
|
||||||
|
When encoding, we build up from the U(2,K) row and work our way forwards.
|
||||||
|
When decoding, we need to start at the U(N,K) row and work our way backwards,
|
||||||
|
which requires a means of computing U(N,K).
|
||||||
|
U(N,K) may be computed from two previous values with the same N:
|
||||||
|
U(N,K) = ((2*N-1)*U(N,K-1) - U(N,K-2))/(K-1) + U(N,K-2)
|
||||||
|
for all N>1, and since U(N,K) is symmetric, a similar relation holds for two
|
||||||
|
previous values with the same K:
|
||||||
|
U(N,K>1) = ((2*K-1)*U(N-1,K) - U(N-2,K))/(N-1) + U(N-2,K)
|
||||||
|
for all K>1.
|
||||||
|
This allows us to construct an arbitrary row of the U(N,K) table by starting
|
||||||
|
with the first two values, which are constants.
|
||||||
|
This saves roughly 2/3 the work in our O(NK) decoding routine, but costs O(K)
|
||||||
|
multiplications.
|
||||||
|
Similar relations can be derived for V(N,K), but are not used here.
|
||||||
|
|
||||||
|
For N>0 and K>0, U(N,K) and V(N,K) take on the form of an (N-1)-degree
|
||||||
|
polynomial for fixed N.
|
||||||
|
The first few are
|
||||||
|
U(1,K) = 1,
|
||||||
|
U(2,K) = 2*K-1,
|
||||||
|
U(3,K) = (2*K-2)*K+1,
|
||||||
|
U(4,K) = (((4*K-6)*K+8)*K-3)/3,
|
||||||
|
U(5,K) = ((((2*K-4)*K+10)*K-8)*K+3)/3,
|
||||||
|
and
|
||||||
|
V(1,K) = 2,
|
||||||
|
V(2,K) = 4*K,
|
||||||
|
V(3,K) = 4*K*K+2,
|
||||||
|
V(4,K) = 8*(K*K+2)*K/3,
|
||||||
|
V(5,K) = ((4*K*K+20)*K*K+6)/3,
|
||||||
|
for all K>0.
|
||||||
|
This allows us to derive O(N) encoding and O(N*log(K)) decoding routines for
|
||||||
|
small N (and indeed decoding is also O(N) for N<3).
|
||||||
|
|
||||||
|
@ARTICLE{Fis86,
|
||||||
|
author="Thomas R. Fischer",
|
||||||
|
title="A Pyramid Vector Quantizer",
|
||||||
|
journal="IEEE Transactions on Information Theory",
|
||||||
|
volume="IT-32",
|
||||||
|
number=4,
|
||||||
|
pages="568--583",
|
||||||
|
month=Jul,
|
||||||
|
year=1986
|
||||||
|
}*/
|
||||||
|
|
||||||
|
#ifndef SMALL_FOOTPRINT
|
||||||
|
/*Compute U(2,_k).
|
||||||
|
Note that this may be called with _k=32768 (maxK[2]+1).*/
|
||||||
|
static inline unsigned ucwrs2(unsigned _k){
|
||||||
|
celt_assert(_k>0);
|
||||||
|
return _k+(_k-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*Compute V(2,_k).*/
|
||||||
|
static inline opus_uint32 ncwrs2(int _k){
|
||||||
|
celt_assert(_k>0);
|
||||||
|
return 4*(opus_uint32)_k;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*Compute U(3,_k).
|
||||||
|
Note that this may be called with _k=32768 (maxK[3]+1).*/
|
||||||
|
static inline opus_uint32 ucwrs3(unsigned _k){
|
||||||
|
celt_assert(_k>0);
|
||||||
|
return (2*(opus_uint32)_k-2)*_k+1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*Compute V(3,_k).*/
|
||||||
|
static inline opus_uint32 ncwrs3(int _k){
|
||||||
|
celt_assert(_k>0);
|
||||||
|
return 2*(2*(unsigned)_k*(opus_uint32)_k+1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*Compute U(4,_k).*/
|
||||||
|
static inline opus_uint32 ucwrs4(int _k){
|
||||||
|
celt_assert(_k>0);
|
||||||
|
return imusdiv32odd(2*_k,(2*_k-3)*(opus_uint32)_k+4,3,1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*Compute V(4,_k).*/
|
||||||
|
static inline opus_uint32 ncwrs4(int _k){
|
||||||
|
celt_assert(_k>0);
|
||||||
|
return ((_k*(opus_uint32)_k+2)*_k)/3<<3;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* SMALL_FOOTPRINT */
|
||||||
|
|
||||||
|
/*Computes the next row/column of any recurrence that obeys the relation
|
||||||
|
u[i][j]=u[i-1][j]+u[i][j-1]+u[i-1][j-1].
|
||||||
|
_ui0 is the base case for the new row/column.*/
|
||||||
|
static inline void unext(opus_uint32 *_ui,unsigned _len,opus_uint32 _ui0){
|
||||||
|
opus_uint32 ui1;
|
||||||
|
unsigned j;
|
||||||
|
/*This do-while will overrun the array if we don't have storage for at least
|
||||||
|
2 values.*/
|
||||||
|
j=1; do {
|
||||||
|
ui1=UADD32(UADD32(_ui[j],_ui[j-1]),_ui0);
|
||||||
|
_ui[j-1]=_ui0;
|
||||||
|
_ui0=ui1;
|
||||||
|
} while (++j<_len);
|
||||||
|
_ui[j-1]=_ui0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*Computes the previous row/column of any recurrence that obeys the relation
|
||||||
|
u[i-1][j]=u[i][j]-u[i][j-1]-u[i-1][j-1].
|
||||||
|
_ui0 is the base case for the new row/column.*/
|
||||||
|
static inline void uprev(opus_uint32 *_ui,unsigned _n,opus_uint32 _ui0){
|
||||||
|
opus_uint32 ui1;
|
||||||
|
unsigned j;
|
||||||
|
/*This do-while will overrun the array if we don't have storage for at least
|
||||||
|
2 values.*/
|
||||||
|
j=1; do {
|
||||||
|
ui1=USUB32(USUB32(_ui[j],_ui[j-1]),_ui0);
|
||||||
|
_ui[j-1]=_ui0;
|
||||||
|
_ui0=ui1;
|
||||||
|
} while (++j<_n);
|
||||||
|
_ui[j-1]=_ui0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*Compute V(_n,_k), as well as U(_n,0..._k+1).
|
||||||
|
_u: On exit, _u[i] contains U(_n,i) for i in [0..._k+1].*/
|
||||||
|
static opus_uint32 ncwrs_urow(unsigned _n,unsigned _k,opus_uint32 *_u){
|
||||||
|
opus_uint32 um2;
|
||||||
|
unsigned len;
|
||||||
|
unsigned k;
|
||||||
|
len=_k+2;
|
||||||
|
/*We require storage at least 3 values (e.g., _k>0).*/
|
||||||
|
celt_assert(len>=3);
|
||||||
|
_u[0]=0;
|
||||||
|
_u[1]=um2=1;
|
||||||
|
#ifndef SMALL_FOOTPRINT
|
||||||
|
/*_k>52 doesn't work in the false branch due to the limits of INV_TABLE,
|
||||||
|
but _k isn't tested here because k<=52 for n=7*/
|
||||||
|
if(_n<=6)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
/*If _n==0, _u[0] should be 1 and the rest should be 0.*/
|
||||||
|
/*If _n==1, _u[i] should be 1 for i>1.*/
|
||||||
|
celt_assert(_n>=2);
|
||||||
|
/*If _k==0, the following do-while loop will overflow the buffer.*/
|
||||||
|
celt_assert(_k>0);
|
||||||
|
k=2;
|
||||||
|
do _u[k]=(k<<1)-1;
|
||||||
|
while(++k<len);
|
||||||
|
for(k=2;k<_n;k++)unext(_u+1,_k+1,1);
|
||||||
|
}
|
||||||
|
#ifndef SMALL_FOOTPRINT
|
||||||
|
else{
|
||||||
|
opus_uint32 um1;
|
||||||
|
opus_uint32 n2m1;
|
||||||
|
_u[2]=n2m1=um1=(_n<<1)-1;
|
||||||
|
for(k=3;k<len;k++){
|
||||||
|
/*U(N,K) = ((2*N-1)*U(N,K-1)-U(N,K-2))/(K-1) + U(N,K-2)*/
|
||||||
|
_u[k]=um2=imusdiv32even(n2m1,um1,um2,k-1)+um2;
|
||||||
|
if(++k>=len)break;
|
||||||
|
_u[k]=um1=imusdiv32odd(n2m1,um2,um1,(k-1)>>1)+um1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* SMALL_FOOTPRINT */
|
||||||
|
return _u[_k]+_u[_k+1];
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef SMALL_FOOTPRINT
|
||||||
|
|
||||||
|
/*Returns the _i'th combination of _k elements (at most 32767) chosen from a
|
||||||
|
set of size 1 with associated sign bits.
|
||||||
|
_y: Returns the vector of pulses.*/
|
||||||
|
static inline void cwrsi1(int _k,opus_uint32 _i,int *_y){
|
||||||
|
int s;
|
||||||
|
s=-(int)_i;
|
||||||
|
_y[0]=(_k+s)^s;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*Returns the _i'th combination of _k elements (at most 32767) chosen from a
|
||||||
|
set of size 2 with associated sign bits.
|
||||||
|
_y: Returns the vector of pulses.*/
|
||||||
|
static inline void cwrsi2(int _k,opus_uint32 _i,int *_y){
|
||||||
|
opus_uint32 p;
|
||||||
|
int s;
|
||||||
|
int yj;
|
||||||
|
p=ucwrs2(_k+1U);
|
||||||
|
s=-(_i>=p);
|
||||||
|
_i-=p&s;
|
||||||
|
yj=_k;
|
||||||
|
_k=(_i+1)>>1;
|
||||||
|
p=_k?ucwrs2(_k):0;
|
||||||
|
_i-=p;
|
||||||
|
yj-=_k;
|
||||||
|
_y[0]=(yj+s)^s;
|
||||||
|
cwrsi1(_k,_i,_y+1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*Returns the _i'th combination of _k elements (at most 32767) chosen from a
|
||||||
|
set of size 3 with associated sign bits.
|
||||||
|
_y: Returns the vector of pulses.*/
|
||||||
|
static void cwrsi3(int _k,opus_uint32 _i,int *_y){
|
||||||
|
opus_uint32 p;
|
||||||
|
int s;
|
||||||
|
int yj;
|
||||||
|
p=ucwrs3(_k+1U);
|
||||||
|
s=-(_i>=p);
|
||||||
|
_i-=p&s;
|
||||||
|
yj=_k;
|
||||||
|
/*Finds the maximum _k such that ucwrs3(_k)<=_i (tested for all
|
||||||
|
_i<2147418113=U(3,32768)).*/
|
||||||
|
_k=_i>0?(isqrt32(2*_i-1)+1)>>1:0;
|
||||||
|
p=_k?ucwrs3(_k):0;
|
||||||
|
_i-=p;
|
||||||
|
yj-=_k;
|
||||||
|
_y[0]=(yj+s)^s;
|
||||||
|
cwrsi2(_k,_i,_y+1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*Returns the _i'th combination of _k elements (at most 1172) chosen from a set
|
||||||
|
of size 4 with associated sign bits.
|
||||||
|
_y: Returns the vector of pulses.*/
|
||||||
|
static void cwrsi4(int _k,opus_uint32 _i,int *_y){
|
||||||
|
opus_uint32 p;
|
||||||
|
int s;
|
||||||
|
int yj;
|
||||||
|
int kl;
|
||||||
|
int kr;
|
||||||
|
p=ucwrs4(_k+1);
|
||||||
|
s=-(_i>=p);
|
||||||
|
_i-=p&s;
|
||||||
|
yj=_k;
|
||||||
|
/*We could solve a cubic for k here, but the form of the direct solution does
|
||||||
|
not lend itself well to exact integer arithmetic.
|
||||||
|
Instead we do a binary search on U(4,K).*/
|
||||||
|
kl=0;
|
||||||
|
kr=_k;
|
||||||
|
for(;;){
|
||||||
|
_k=(kl+kr)>>1;
|
||||||
|
p=_k?ucwrs4(_k):0;
|
||||||
|
if(p<_i){
|
||||||
|
if(_k>=kr)break;
|
||||||
|
kl=_k+1;
|
||||||
|
}
|
||||||
|
else if(p>_i)kr=_k-1;
|
||||||
|
else break;
|
||||||
|
}
|
||||||
|
_i-=p;
|
||||||
|
yj-=_k;
|
||||||
|
_y[0]=(yj+s)^s;
|
||||||
|
cwrsi3(_k,_i,_y+1);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* SMALL_FOOTPRINT */
|
||||||
|
|
||||||
|
/*Returns the _i'th combination of _k elements chosen from a set of size _n
|
||||||
|
with associated sign bits.
|
||||||
|
_y: Returns the vector of pulses.
|
||||||
|
_u: Must contain entries [0..._k+1] of row _n of U() on input.
|
||||||
|
Its contents will be destructively modified.*/
|
||||||
|
static void cwrsi(int _n,int _k,opus_uint32 _i,int *_y,opus_uint32 *_u){
|
||||||
|
int j;
|
||||||
|
celt_assert(_n>0);
|
||||||
|
j=0;
|
||||||
|
do{
|
||||||
|
opus_uint32 p;
|
||||||
|
int s;
|
||||||
|
int yj;
|
||||||
|
p=_u[_k+1];
|
||||||
|
s=-(_i>=p);
|
||||||
|
_i-=p&s;
|
||||||
|
yj=_k;
|
||||||
|
p=_u[_k];
|
||||||
|
while(p>_i)p=_u[--_k];
|
||||||
|
_i-=p;
|
||||||
|
yj-=_k;
|
||||||
|
_y[j]=(yj+s)^s;
|
||||||
|
uprev(_u,_k+2,0);
|
||||||
|
}
|
||||||
|
while(++j<_n);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*Returns the index of the given combination of K elements chosen from a set
|
||||||
|
of size 1 with associated sign bits.
|
||||||
|
_y: The vector of pulses, whose sum of absolute values is K.
|
||||||
|
_k: Returns K.*/
|
||||||
|
static inline opus_uint32 icwrs1(const int *_y,int *_k){
|
||||||
|
*_k=abs(_y[0]);
|
||||||
|
return _y[0]<0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef SMALL_FOOTPRINT
|
||||||
|
|
||||||
|
/*Returns the index of the given combination of K elements chosen from a set
|
||||||
|
of size 2 with associated sign bits.
|
||||||
|
_y: The vector of pulses, whose sum of absolute values is K.
|
||||||
|
_k: Returns K.*/
|
||||||
|
static inline opus_uint32 icwrs2(const int *_y,int *_k){
|
||||||
|
opus_uint32 i;
|
||||||
|
int k;
|
||||||
|
i=icwrs1(_y+1,&k);
|
||||||
|
i+=k?ucwrs2(k):0;
|
||||||
|
k+=abs(_y[0]);
|
||||||
|
if(_y[0]<0)i+=ucwrs2(k+1U);
|
||||||
|
*_k=k;
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*Returns the index of the given combination of K elements chosen from a set
|
||||||
|
of size 3 with associated sign bits.
|
||||||
|
_y: The vector of pulses, whose sum of absolute values is K.
|
||||||
|
_k: Returns K.*/
|
||||||
|
static inline opus_uint32 icwrs3(const int *_y,int *_k){
|
||||||
|
opus_uint32 i;
|
||||||
|
int k;
|
||||||
|
i=icwrs2(_y+1,&k);
|
||||||
|
i+=k?ucwrs3(k):0;
|
||||||
|
k+=abs(_y[0]);
|
||||||
|
if(_y[0]<0)i+=ucwrs3(k+1U);
|
||||||
|
*_k=k;
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*Returns the index of the given combination of K elements chosen from a set
|
||||||
|
of size 4 with associated sign bits.
|
||||||
|
_y: The vector of pulses, whose sum of absolute values is K.
|
||||||
|
_k: Returns K.*/
|
||||||
|
static inline opus_uint32 icwrs4(const int *_y,int *_k){
|
||||||
|
opus_uint32 i;
|
||||||
|
int k;
|
||||||
|
i=icwrs3(_y+1,&k);
|
||||||
|
i+=k?ucwrs4(k):0;
|
||||||
|
k+=abs(_y[0]);
|
||||||
|
if(_y[0]<0)i+=ucwrs4(k+1);
|
||||||
|
*_k=k;
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* SMALL_FOOTPRINT */
|
||||||
|
|
||||||
|
/*Returns the index of the given combination of K elements chosen from a set
|
||||||
|
of size _n with associated sign bits.
|
||||||
|
_y: The vector of pulses, whose sum of absolute values must be _k.
|
||||||
|
_nc: Returns V(_n,_k).*/
|
||||||
|
static inline opus_uint32 icwrs(int _n,int _k,opus_uint32 *_nc,const int *_y,
|
||||||
|
opus_uint32 *_u){
|
||||||
|
opus_uint32 i;
|
||||||
|
int j;
|
||||||
|
int k;
|
||||||
|
/*We can't unroll the first two iterations of the loop unless _n>=2.*/
|
||||||
|
celt_assert(_n>=2);
|
||||||
|
_u[0]=0;
|
||||||
|
for(k=1;k<=_k+1;k++)_u[k]=(k<<1)-1;
|
||||||
|
i=icwrs1(_y+_n-1,&k);
|
||||||
|
j=_n-2;
|
||||||
|
i+=_u[k];
|
||||||
|
k+=abs(_y[j]);
|
||||||
|
if(_y[j]<0)i+=_u[k+1];
|
||||||
|
while(j-->0){
|
||||||
|
unext(_u,_k+2,0);
|
||||||
|
i+=_u[k];
|
||||||
|
k+=abs(_y[j]);
|
||||||
|
if(_y[j]<0)i+=_u[k+1];
|
||||||
|
}
|
||||||
|
*_nc=_u[k]+_u[k+1];
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef CUSTOM_MODES
|
||||||
|
void get_required_bits(opus_int16 *_bits,int _n,int _maxk,int _frac){
|
||||||
|
int k;
|
||||||
|
/*_maxk==0 => there's nothing to do.*/
|
||||||
|
celt_assert(_maxk>0);
|
||||||
|
_bits[0]=0;
|
||||||
|
if (_n==1)
|
||||||
|
{
|
||||||
|
for (k=1;k<=_maxk;k++)
|
||||||
|
_bits[k] = 1<<_frac;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
VARDECL(opus_uint32,u);
|
||||||
|
SAVE_STACK;
|
||||||
|
ALLOC(u,_maxk+2U,opus_uint32);
|
||||||
|
ncwrs_urow(_n,_maxk,u);
|
||||||
|
for(k=1;k<=_maxk;k++)
|
||||||
|
_bits[k]=log2_frac(u[k]+u[k+1],_frac);
|
||||||
|
RESTORE_STACK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* CUSTOM_MODES */
|
||||||
|
|
||||||
|
void encode_pulses(const int *_y,int _n,int _k,ec_enc *_enc){
|
||||||
|
opus_uint32 i;
|
||||||
|
celt_assert(_k>0);
|
||||||
|
#ifndef SMALL_FOOTPRINT
|
||||||
|
switch(_n){
|
||||||
|
case 2:{
|
||||||
|
i=icwrs2(_y,&_k);
|
||||||
|
ec_enc_uint(_enc,i,ncwrs2(_k));
|
||||||
|
}break;
|
||||||
|
case 3:{
|
||||||
|
i=icwrs3(_y,&_k);
|
||||||
|
ec_enc_uint(_enc,i,ncwrs3(_k));
|
||||||
|
}break;
|
||||||
|
case 4:{
|
||||||
|
i=icwrs4(_y,&_k);
|
||||||
|
ec_enc_uint(_enc,i,ncwrs4(_k));
|
||||||
|
}break;
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
VARDECL(opus_uint32,u);
|
||||||
|
opus_uint32 nc;
|
||||||
|
SAVE_STACK;
|
||||||
|
ALLOC(u,_k+2U,opus_uint32);
|
||||||
|
i=icwrs(_n,_k,&nc,_y,u);
|
||||||
|
ec_enc_uint(_enc,i,nc);
|
||||||
|
RESTORE_STACK;
|
||||||
|
#ifndef SMALL_FOOTPRINT
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void decode_pulses(int *_y,int _n,int _k,ec_dec *_dec)
|
||||||
|
{
|
||||||
|
celt_assert(_k>0);
|
||||||
|
#ifndef SMALL_FOOTPRINT
|
||||||
|
switch(_n){
|
||||||
|
case 2:cwrsi2(_k,ec_dec_uint(_dec,ncwrs2(_k)),_y);break;
|
||||||
|
case 3:cwrsi3(_k,ec_dec_uint(_dec,ncwrs3(_k)),_y);break;
|
||||||
|
case 4:cwrsi4(_k,ec_dec_uint(_dec,ncwrs4(_k)),_y);break;
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
VARDECL(opus_uint32,u);
|
||||||
|
SAVE_STACK;
|
||||||
|
ALLOC(u,_k+2U,opus_uint32);
|
||||||
|
cwrsi(_n,_k,ec_dec_uint(_dec,ncwrs_urow(_n,_k,u)),_y,u);
|
||||||
|
RESTORE_STACK;
|
||||||
|
#ifndef SMALL_FOOTPRINT
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
48
Frameworks/Opus/Opus/opus/celt/cwrs.h
Normal file
48
Frameworks/Opus/Opus/opus/celt/cwrs.h
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
/* Copyright (c) 2007-2008 CSIRO
|
||||||
|
Copyright (c) 2007-2009 Xiph.Org Foundation
|
||||||
|
Copyright (c) 2007-2009 Timothy B. Terriberry
|
||||||
|
Written by Timothy B. Terriberry and Jean-Marc Valin */
|
||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef CWRS_H
|
||||||
|
#define CWRS_H
|
||||||
|
|
||||||
|
#include "arch.h"
|
||||||
|
#include "stack_alloc.h"
|
||||||
|
#include "entenc.h"
|
||||||
|
#include "entdec.h"
|
||||||
|
|
||||||
|
#ifdef CUSTOM_MODES
|
||||||
|
int log2_frac(opus_uint32 val, int frac);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void get_required_bits(opus_int16 *bits, int N, int K, int frac);
|
||||||
|
|
||||||
|
void encode_pulses(const int *_y, int N, int K, ec_enc *enc);
|
||||||
|
|
||||||
|
void decode_pulses(int *_y, int N, int K, ec_dec *dec);
|
||||||
|
|
||||||
|
#endif /* CWRS_H */
|
87
Frameworks/Opus/Opus/opus/celt/ecintrin.h
Normal file
87
Frameworks/Opus/Opus/opus/celt/ecintrin.h
Normal file
|
@ -0,0 +1,87 @@
|
||||||
|
/* Copyright (c) 2003-2008 Timothy B. Terriberry
|
||||||
|
Copyright (c) 2008 Xiph.Org Foundation */
|
||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*Some common macros for potential platform-specific optimization.*/
|
||||||
|
#include "opus_types.h"
|
||||||
|
#include <math.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include "arch.h"
|
||||||
|
#if !defined(_ecintrin_H)
|
||||||
|
# define _ecintrin_H (1)
|
||||||
|
|
||||||
|
/*Some specific platforms may have optimized intrinsic or inline assembly
|
||||||
|
versions of these functions which can substantially improve performance.
|
||||||
|
We define macros for them to allow easy incorporation of these non-ANSI
|
||||||
|
features.*/
|
||||||
|
|
||||||
|
/*Modern gcc (4.x) can compile the naive versions of min and max with cmov if
|
||||||
|
given an appropriate architecture, but the branchless bit-twiddling versions
|
||||||
|
are just as fast, and do not require any special target architecture.
|
||||||
|
Earlier gcc versions (3.x) compiled both code to the same assembly
|
||||||
|
instructions, because of the way they represented ((_b)>(_a)) internally.*/
|
||||||
|
# define EC_MINI(_a,_b) ((_a)+(((_b)-(_a))&-((_b)<(_a))))
|
||||||
|
|
||||||
|
/*Count leading zeros.
|
||||||
|
This macro should only be used for implementing ec_ilog(), if it is defined.
|
||||||
|
All other code should use EC_ILOG() instead.*/
|
||||||
|
#if defined(_MSC_VER) && (_MSC_VER >= 1400)
|
||||||
|
# include <intrin.h>
|
||||||
|
/*In _DEBUG mode this is not an intrinsic by default.*/
|
||||||
|
# pragma intrinsic(_BitScanReverse)
|
||||||
|
|
||||||
|
static __inline int ec_bsr(unsigned long _x){
|
||||||
|
unsigned long ret;
|
||||||
|
_BitScanReverse(&ret,_x);
|
||||||
|
return (int)ret;
|
||||||
|
}
|
||||||
|
# define EC_CLZ0 (1)
|
||||||
|
# define EC_CLZ(_x) (-ec_bsr(_x))
|
||||||
|
#elif defined(ENABLE_TI_DSPLIB)
|
||||||
|
# include "dsplib.h"
|
||||||
|
# define EC_CLZ0 (31)
|
||||||
|
# define EC_CLZ(_x) (_lnorm(_x))
|
||||||
|
#elif __GNUC_PREREQ(3,4)
|
||||||
|
# if INT_MAX>=2147483647
|
||||||
|
# define EC_CLZ0 ((int)sizeof(unsigned)*CHAR_BIT)
|
||||||
|
# define EC_CLZ(_x) (__builtin_clz(_x))
|
||||||
|
# elif LONG_MAX>=2147483647L
|
||||||
|
# define EC_CLZ0 ((int)sizeof(unsigned long)*CHAR_BIT)
|
||||||
|
# define EC_CLZ(_x) (__builtin_clzl(_x))
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(EC_CLZ)
|
||||||
|
/*Note that __builtin_clz is not defined when _x==0, according to the gcc
|
||||||
|
documentation (and that of the BSR instruction that implements it on x86).
|
||||||
|
The majority of the time we can never pass it zero.
|
||||||
|
When we need to, it can be special cased.*/
|
||||||
|
# define EC_ILOG(_x) (EC_CLZ0-EC_CLZ(_x))
|
||||||
|
#else
|
||||||
|
int ec_ilog(opus_uint32 _v);
|
||||||
|
# define EC_ILOG(_x) (ec_ilog(_x))
|
||||||
|
#endif
|
||||||
|
#endif
|
93
Frameworks/Opus/Opus/opus/celt/entcode.c
Normal file
93
Frameworks/Opus/Opus/opus/celt/entcode.c
Normal file
|
@ -0,0 +1,93 @@
|
||||||
|
/* Copyright (c) 2001-2011 Timothy B. Terriberry
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "entcode.h"
|
||||||
|
#include "arch.h"
|
||||||
|
|
||||||
|
#if !defined(EC_CLZ)
|
||||||
|
/*This is a fallback for systems where we don't know how to access
|
||||||
|
a BSR or CLZ instruction (see ecintrin.h).
|
||||||
|
If you are optimizing Opus on a new platform and it has a native CLZ or
|
||||||
|
BZR (e.g. cell, MIPS, x86, etc) then making it available to Opus will be
|
||||||
|
an easy performance win.*/
|
||||||
|
int ec_ilog(opus_uint32 _v){
|
||||||
|
/*On a Pentium M, this branchless version tested as the fastest on
|
||||||
|
1,000,000,000 random 32-bit integers, edging out a similar version with
|
||||||
|
branches, and a 256-entry LUT version.*/
|
||||||
|
int ret;
|
||||||
|
int m;
|
||||||
|
ret=!!_v;
|
||||||
|
m=!!(_v&0xFFFF0000)<<4;
|
||||||
|
_v>>=m;
|
||||||
|
ret|=m;
|
||||||
|
m=!!(_v&0xFF00)<<3;
|
||||||
|
_v>>=m;
|
||||||
|
ret|=m;
|
||||||
|
m=!!(_v&0xF0)<<2;
|
||||||
|
_v>>=m;
|
||||||
|
ret|=m;
|
||||||
|
m=!!(_v&0xC)<<1;
|
||||||
|
_v>>=m;
|
||||||
|
ret|=m;
|
||||||
|
ret+=!!(_v&0x2);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
opus_uint32 ec_tell_frac(ec_ctx *_this){
|
||||||
|
opus_uint32 nbits;
|
||||||
|
opus_uint32 r;
|
||||||
|
int l;
|
||||||
|
int i;
|
||||||
|
/*To handle the non-integral number of bits still left in the encoder/decoder
|
||||||
|
state, we compute the worst-case number of bits of val that must be
|
||||||
|
encoded to ensure that the value is inside the range for any possible
|
||||||
|
subsequent bits.
|
||||||
|
The computation here is independent of val itself (the decoder does not
|
||||||
|
even track that value), even though the real number of bits used after
|
||||||
|
ec_enc_done() may be 1 smaller if rng is a power of two and the
|
||||||
|
corresponding trailing bits of val are all zeros.
|
||||||
|
If we did try to track that special case, then coding a value with a
|
||||||
|
probability of 1/(1<<n) might sometimes appear to use more than n bits.
|
||||||
|
This may help explain the surprising result that a newly initialized
|
||||||
|
encoder or decoder claims to have used 1 bit.*/
|
||||||
|
nbits=_this->nbits_total<<BITRES;
|
||||||
|
l=EC_ILOG(_this->rng);
|
||||||
|
r=_this->rng>>(l-16);
|
||||||
|
for(i=BITRES;i-->0;){
|
||||||
|
int b;
|
||||||
|
r=r*r>>15;
|
||||||
|
b=(int)(r>>16);
|
||||||
|
l=l<<1|b;
|
||||||
|
r>>=b;
|
||||||
|
}
|
||||||
|
return nbits-l;
|
||||||
|
}
|
116
Frameworks/Opus/Opus/opus/celt/entcode.h
Normal file
116
Frameworks/Opus/Opus/opus/celt/entcode.h
Normal file
|
@ -0,0 +1,116 @@
|
||||||
|
/* Copyright (c) 2001-2011 Timothy B. Terriberry
|
||||||
|
Copyright (c) 2008-2009 Xiph.Org Foundation */
|
||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "opus_types.h"
|
||||||
|
|
||||||
|
#if !defined(_entcode_H)
|
||||||
|
# define _entcode_H (1)
|
||||||
|
# include <limits.h>
|
||||||
|
# include <stddef.h>
|
||||||
|
# include "ecintrin.h"
|
||||||
|
|
||||||
|
/*OPT: ec_window must be at least 32 bits, but if you have fast arithmetic on a
|
||||||
|
larger type, you can speed up the decoder by using it here.*/
|
||||||
|
typedef opus_uint32 ec_window;
|
||||||
|
typedef struct ec_ctx ec_ctx;
|
||||||
|
typedef struct ec_ctx ec_enc;
|
||||||
|
typedef struct ec_ctx ec_dec;
|
||||||
|
|
||||||
|
# define EC_WINDOW_SIZE ((int)sizeof(ec_window)*CHAR_BIT)
|
||||||
|
|
||||||
|
/*The number of bits to use for the range-coded part of unsigned integers.*/
|
||||||
|
# define EC_UINT_BITS (8)
|
||||||
|
|
||||||
|
/*The resolution of fractional-precision bit usage measurements, i.e.,
|
||||||
|
3 => 1/8th bits.*/
|
||||||
|
# define BITRES 3
|
||||||
|
|
||||||
|
/*The entropy encoder/decoder context.
|
||||||
|
We use the same structure for both, so that common functions like ec_tell()
|
||||||
|
can be used on either one.*/
|
||||||
|
struct ec_ctx{
|
||||||
|
/*Buffered input/output.*/
|
||||||
|
unsigned char *buf;
|
||||||
|
/*The size of the buffer.*/
|
||||||
|
opus_uint32 storage;
|
||||||
|
/*The offset at which the last byte containing raw bits was read/written.*/
|
||||||
|
opus_uint32 end_offs;
|
||||||
|
/*Bits that will be read from/written at the end.*/
|
||||||
|
ec_window end_window;
|
||||||
|
/*Number of valid bits in end_window.*/
|
||||||
|
int nend_bits;
|
||||||
|
/*The total number of whole bits read/written.
|
||||||
|
This does not include partial bits currently in the range coder.*/
|
||||||
|
int nbits_total;
|
||||||
|
/*The offset at which the next range coder byte will be read/written.*/
|
||||||
|
opus_uint32 offs;
|
||||||
|
/*The number of values in the current range.*/
|
||||||
|
opus_uint32 rng;
|
||||||
|
/*In the decoder: the difference between the top of the current range and
|
||||||
|
the input value, minus one.
|
||||||
|
In the encoder: the low end of the current range.*/
|
||||||
|
opus_uint32 val;
|
||||||
|
/*In the decoder: the saved normalization factor from ec_decode().
|
||||||
|
In the encoder: the number of oustanding carry propagating symbols.*/
|
||||||
|
opus_uint32 ext;
|
||||||
|
/*A buffered input/output symbol, awaiting carry propagation.*/
|
||||||
|
int rem;
|
||||||
|
/*Nonzero if an error occurred.*/
|
||||||
|
int error;
|
||||||
|
};
|
||||||
|
|
||||||
|
static inline opus_uint32 ec_range_bytes(ec_ctx *_this){
|
||||||
|
return _this->offs;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline unsigned char *ec_get_buffer(ec_ctx *_this){
|
||||||
|
return _this->buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int ec_get_error(ec_ctx *_this){
|
||||||
|
return _this->error;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*Returns the number of bits "used" by the encoded or decoded symbols so far.
|
||||||
|
This same number can be computed in either the encoder or the decoder, and is
|
||||||
|
suitable for making coding decisions.
|
||||||
|
Return: The number of bits.
|
||||||
|
This will always be slightly larger than the exact value (e.g., all
|
||||||
|
rounding error is in the positive direction).*/
|
||||||
|
static inline int ec_tell(ec_ctx *_this){
|
||||||
|
return _this->nbits_total-EC_ILOG(_this->rng);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*Returns the number of bits "used" by the encoded or decoded symbols so far.
|
||||||
|
This same number can be computed in either the encoder or the decoder, and is
|
||||||
|
suitable for making coding decisions.
|
||||||
|
Return: The number of bits scaled by 2**BITRES.
|
||||||
|
This will always be slightly larger than the exact value (e.g., all
|
||||||
|
rounding error is in the positive direction).*/
|
||||||
|
opus_uint32 ec_tell_frac(ec_ctx *_this);
|
||||||
|
|
||||||
|
#endif
|
245
Frameworks/Opus/Opus/opus/celt/entdec.c
Normal file
245
Frameworks/Opus/Opus/opus/celt/entdec.c
Normal file
|
@ -0,0 +1,245 @@
|
||||||
|
/* Copyright (c) 2001-2011 Timothy B. Terriberry
|
||||||
|
Copyright (c) 2008-2009 Xiph.Org Foundation */
|
||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
#include "os_support.h"
|
||||||
|
#include "arch.h"
|
||||||
|
#include "entdec.h"
|
||||||
|
#include "mfrngcod.h"
|
||||||
|
|
||||||
|
/*A range decoder.
|
||||||
|
This is an entropy decoder based upon \cite{Mar79}, which is itself a
|
||||||
|
rediscovery of the FIFO arithmetic code introduced by \cite{Pas76}.
|
||||||
|
It is very similar to arithmetic encoding, except that encoding is done with
|
||||||
|
digits in any base, instead of with bits, and so it is faster when using
|
||||||
|
larger bases (i.e.: a byte).
|
||||||
|
The author claims an average waste of $\frac{1}{2}\log_b(2b)$ bits, where $b$
|
||||||
|
is the base, longer than the theoretical optimum, but to my knowledge there
|
||||||
|
is no published justification for this claim.
|
||||||
|
This only seems true when using near-infinite precision arithmetic so that
|
||||||
|
the process is carried out with no rounding errors.
|
||||||
|
|
||||||
|
An excellent description of implementation details is available at
|
||||||
|
http://www.arturocampos.com/ac_range.html
|
||||||
|
A recent work \cite{MNW98} which proposes several changes to arithmetic
|
||||||
|
encoding for efficiency actually re-discovers many of the principles
|
||||||
|
behind range encoding, and presents a good theoretical analysis of them.
|
||||||
|
|
||||||
|
End of stream is handled by writing out the smallest number of bits that
|
||||||
|
ensures that the stream will be correctly decoded regardless of the value of
|
||||||
|
any subsequent bits.
|
||||||
|
ec_tell() can be used to determine how many bits were needed to decode
|
||||||
|
all the symbols thus far; other data can be packed in the remaining bits of
|
||||||
|
the input buffer.
|
||||||
|
@PHDTHESIS{Pas76,
|
||||||
|
author="Richard Clark Pasco",
|
||||||
|
title="Source coding algorithms for fast data compression",
|
||||||
|
school="Dept. of Electrical Engineering, Stanford University",
|
||||||
|
address="Stanford, CA",
|
||||||
|
month=May,
|
||||||
|
year=1976
|
||||||
|
}
|
||||||
|
@INPROCEEDINGS{Mar79,
|
||||||
|
author="Martin, G.N.N.",
|
||||||
|
title="Range encoding: an algorithm for removing redundancy from a digitised
|
||||||
|
message",
|
||||||
|
booktitle="Video & Data Recording Conference",
|
||||||
|
year=1979,
|
||||||
|
address="Southampton",
|
||||||
|
month=Jul
|
||||||
|
}
|
||||||
|
@ARTICLE{MNW98,
|
||||||
|
author="Alistair Moffat and Radford Neal and Ian H. Witten",
|
||||||
|
title="Arithmetic Coding Revisited",
|
||||||
|
journal="{ACM} Transactions on Information Systems",
|
||||||
|
year=1998,
|
||||||
|
volume=16,
|
||||||
|
number=3,
|
||||||
|
pages="256--294",
|
||||||
|
month=Jul,
|
||||||
|
URL="http://www.stanford.edu/class/ee398/handouts/papers/Moffat98ArithmCoding.pdf"
|
||||||
|
}*/
|
||||||
|
|
||||||
|
static int ec_read_byte(ec_dec *_this){
|
||||||
|
return _this->offs<_this->storage?_this->buf[_this->offs++]:0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ec_read_byte_from_end(ec_dec *_this){
|
||||||
|
return _this->end_offs<_this->storage?
|
||||||
|
_this->buf[_this->storage-++(_this->end_offs)]:0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*Normalizes the contents of val and rng so that rng lies entirely in the
|
||||||
|
high-order symbol.*/
|
||||||
|
static void ec_dec_normalize(ec_dec *_this){
|
||||||
|
/*If the range is too small, rescale it and input some bits.*/
|
||||||
|
while(_this->rng<=EC_CODE_BOT){
|
||||||
|
int sym;
|
||||||
|
_this->nbits_total+=EC_SYM_BITS;
|
||||||
|
_this->rng<<=EC_SYM_BITS;
|
||||||
|
/*Use up the remaining bits from our last symbol.*/
|
||||||
|
sym=_this->rem;
|
||||||
|
/*Read the next value from the input.*/
|
||||||
|
_this->rem=ec_read_byte(_this);
|
||||||
|
/*Take the rest of the bits we need from this new symbol.*/
|
||||||
|
sym=(sym<<EC_SYM_BITS|_this->rem)>>(EC_SYM_BITS-EC_CODE_EXTRA);
|
||||||
|
/*And subtract them from val, capped to be less than EC_CODE_TOP.*/
|
||||||
|
_this->val=((_this->val<<EC_SYM_BITS)+(EC_SYM_MAX&~sym))&(EC_CODE_TOP-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ec_dec_init(ec_dec *_this,unsigned char *_buf,opus_uint32 _storage){
|
||||||
|
_this->buf=_buf;
|
||||||
|
_this->storage=_storage;
|
||||||
|
_this->end_offs=0;
|
||||||
|
_this->end_window=0;
|
||||||
|
_this->nend_bits=0;
|
||||||
|
/*This is the offset from which ec_tell() will subtract partial bits.
|
||||||
|
The final value after the ec_dec_normalize() call will be the same as in
|
||||||
|
the encoder, but we have to compensate for the bits that are added there.*/
|
||||||
|
_this->nbits_total=EC_CODE_BITS+1
|
||||||
|
-((EC_CODE_BITS-EC_CODE_EXTRA)/EC_SYM_BITS)*EC_SYM_BITS;
|
||||||
|
_this->offs=0;
|
||||||
|
_this->rng=1U<<EC_CODE_EXTRA;
|
||||||
|
_this->rem=ec_read_byte(_this);
|
||||||
|
_this->val=_this->rng-1-(_this->rem>>(EC_SYM_BITS-EC_CODE_EXTRA));
|
||||||
|
_this->error=0;
|
||||||
|
/*Normalize the interval.*/
|
||||||
|
ec_dec_normalize(_this);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned ec_decode(ec_dec *_this,unsigned _ft){
|
||||||
|
unsigned s;
|
||||||
|
_this->ext=_this->rng/_ft;
|
||||||
|
s=(unsigned)(_this->val/_this->ext);
|
||||||
|
return _ft-EC_MINI(s+1,_ft);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned ec_decode_bin(ec_dec *_this,unsigned _bits){
|
||||||
|
unsigned s;
|
||||||
|
_this->ext=_this->rng>>_bits;
|
||||||
|
s=(unsigned)(_this->val/_this->ext);
|
||||||
|
return (1U<<_bits)-EC_MINI(s+1U,1U<<_bits);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ec_dec_update(ec_dec *_this,unsigned _fl,unsigned _fh,unsigned _ft){
|
||||||
|
opus_uint32 s;
|
||||||
|
s=IMUL32(_this->ext,_ft-_fh);
|
||||||
|
_this->val-=s;
|
||||||
|
_this->rng=_fl>0?IMUL32(_this->ext,_fh-_fl):_this->rng-s;
|
||||||
|
ec_dec_normalize(_this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*The probability of having a "one" is 1/(1<<_logp).*/
|
||||||
|
int ec_dec_bit_logp(ec_dec *_this,unsigned _logp){
|
||||||
|
opus_uint32 r;
|
||||||
|
opus_uint32 d;
|
||||||
|
opus_uint32 s;
|
||||||
|
int ret;
|
||||||
|
r=_this->rng;
|
||||||
|
d=_this->val;
|
||||||
|
s=r>>_logp;
|
||||||
|
ret=d<s;
|
||||||
|
if(!ret)_this->val=d-s;
|
||||||
|
_this->rng=ret?s:r-s;
|
||||||
|
ec_dec_normalize(_this);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ec_dec_icdf(ec_dec *_this,const unsigned char *_icdf,unsigned _ftb){
|
||||||
|
opus_uint32 r;
|
||||||
|
opus_uint32 d;
|
||||||
|
opus_uint32 s;
|
||||||
|
opus_uint32 t;
|
||||||
|
int ret;
|
||||||
|
s=_this->rng;
|
||||||
|
d=_this->val;
|
||||||
|
r=s>>_ftb;
|
||||||
|
ret=-1;
|
||||||
|
do{
|
||||||
|
t=s;
|
||||||
|
s=IMUL32(r,_icdf[++ret]);
|
||||||
|
}
|
||||||
|
while(d<s);
|
||||||
|
_this->val=d-s;
|
||||||
|
_this->rng=t-s;
|
||||||
|
ec_dec_normalize(_this);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
opus_uint32 ec_dec_uint(ec_dec *_this,opus_uint32 _ft){
|
||||||
|
unsigned ft;
|
||||||
|
unsigned s;
|
||||||
|
int ftb;
|
||||||
|
/*In order to optimize EC_ILOG(), it is undefined for the value 0.*/
|
||||||
|
celt_assert(_ft>1);
|
||||||
|
_ft--;
|
||||||
|
ftb=EC_ILOG(_ft);
|
||||||
|
if(ftb>EC_UINT_BITS){
|
||||||
|
opus_uint32 t;
|
||||||
|
ftb-=EC_UINT_BITS;
|
||||||
|
ft=(unsigned)(_ft>>ftb)+1;
|
||||||
|
s=ec_decode(_this,ft);
|
||||||
|
ec_dec_update(_this,s,s+1,ft);
|
||||||
|
t=(opus_uint32)s<<ftb|ec_dec_bits(_this,ftb);
|
||||||
|
if(t<=_ft)return t;
|
||||||
|
_this->error=1;
|
||||||
|
return _ft;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
_ft++;
|
||||||
|
s=ec_decode(_this,(unsigned)_ft);
|
||||||
|
ec_dec_update(_this,s,s+1,(unsigned)_ft);
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
opus_uint32 ec_dec_bits(ec_dec *_this,unsigned _bits){
|
||||||
|
ec_window window;
|
||||||
|
int available;
|
||||||
|
opus_uint32 ret;
|
||||||
|
window=_this->end_window;
|
||||||
|
available=_this->nend_bits;
|
||||||
|
if((unsigned)available<_bits){
|
||||||
|
do{
|
||||||
|
window|=(ec_window)ec_read_byte_from_end(_this)<<available;
|
||||||
|
available+=EC_SYM_BITS;
|
||||||
|
}
|
||||||
|
while(available<=EC_WINDOW_SIZE-EC_SYM_BITS);
|
||||||
|
}
|
||||||
|
ret=(opus_uint32)window&(((opus_uint32)1<<_bits)-1U);
|
||||||
|
window>>=_bits;
|
||||||
|
available-=_bits;
|
||||||
|
_this->end_window=window;
|
||||||
|
_this->nend_bits=available;
|
||||||
|
_this->nbits_total+=_bits;
|
||||||
|
return ret;
|
||||||
|
}
|
100
Frameworks/Opus/Opus/opus/celt/entdec.h
Normal file
100
Frameworks/Opus/Opus/opus/celt/entdec.h
Normal file
|
@ -0,0 +1,100 @@
|
||||||
|
/* Copyright (c) 2001-2011 Timothy B. Terriberry
|
||||||
|
Copyright (c) 2008-2009 Xiph.Org Foundation */
|
||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if !defined(_entdec_H)
|
||||||
|
# define _entdec_H (1)
|
||||||
|
# include <limits.h>
|
||||||
|
# include "entcode.h"
|
||||||
|
|
||||||
|
/*Initializes the decoder.
|
||||||
|
_buf: The input buffer to use.
|
||||||
|
Return: 0 on success, or a negative value on error.*/
|
||||||
|
void ec_dec_init(ec_dec *_this,unsigned char *_buf,opus_uint32 _storage);
|
||||||
|
|
||||||
|
/*Calculates the cumulative frequency for the next symbol.
|
||||||
|
This can then be fed into the probability model to determine what that
|
||||||
|
symbol is, and the additional frequency information required to advance to
|
||||||
|
the next symbol.
|
||||||
|
This function cannot be called more than once without a corresponding call to
|
||||||
|
ec_dec_update(), or decoding will not proceed correctly.
|
||||||
|
_ft: The total frequency of the symbols in the alphabet the next symbol was
|
||||||
|
encoded with.
|
||||||
|
Return: A cumulative frequency representing the encoded symbol.
|
||||||
|
If the cumulative frequency of all the symbols before the one that
|
||||||
|
was encoded was fl, and the cumulative frequency of all the symbols
|
||||||
|
up to and including the one encoded is fh, then the returned value
|
||||||
|
will fall in the range [fl,fh).*/
|
||||||
|
unsigned ec_decode(ec_dec *_this,unsigned _ft);
|
||||||
|
|
||||||
|
/*Equivalent to ec_decode() with _ft==1<<_bits.*/
|
||||||
|
unsigned ec_decode_bin(ec_dec *_this,unsigned _bits);
|
||||||
|
|
||||||
|
/*Advance the decoder past the next symbol using the frequency information the
|
||||||
|
symbol was encoded with.
|
||||||
|
Exactly one call to ec_decode() must have been made so that all necessary
|
||||||
|
intermediate calculations are performed.
|
||||||
|
_fl: The cumulative frequency of all symbols that come before the symbol
|
||||||
|
decoded.
|
||||||
|
_fh: The cumulative frequency of all symbols up to and including the symbol
|
||||||
|
decoded.
|
||||||
|
Together with _fl, this defines the range [_fl,_fh) in which the value
|
||||||
|
returned above must fall.
|
||||||
|
_ft: The total frequency of the symbols in the alphabet the symbol decoded
|
||||||
|
was encoded in.
|
||||||
|
This must be the same as passed to the preceding call to ec_decode().*/
|
||||||
|
void ec_dec_update(ec_dec *_this,unsigned _fl,unsigned _fh,unsigned _ft);
|
||||||
|
|
||||||
|
/* Decode a bit that has a 1/(1<<_logp) probability of being a one */
|
||||||
|
int ec_dec_bit_logp(ec_dec *_this,unsigned _logp);
|
||||||
|
|
||||||
|
/*Decodes a symbol given an "inverse" CDF table.
|
||||||
|
No call to ec_dec_update() is necessary after this call.
|
||||||
|
_icdf: The "inverse" CDF, such that symbol s falls in the range
|
||||||
|
[s>0?ft-_icdf[s-1]:0,ft-_icdf[s]), where ft=1<<_ftb.
|
||||||
|
The values must be monotonically non-increasing, and the last value
|
||||||
|
must be 0.
|
||||||
|
_ftb: The number of bits of precision in the cumulative distribution.
|
||||||
|
Return: The decoded symbol s.*/
|
||||||
|
int ec_dec_icdf(ec_dec *_this,const unsigned char *_icdf,unsigned _ftb);
|
||||||
|
|
||||||
|
/*Extracts a raw unsigned integer with a non-power-of-2 range from the stream.
|
||||||
|
The bits must have been encoded with ec_enc_uint().
|
||||||
|
No call to ec_dec_update() is necessary after this call.
|
||||||
|
_ft: The number of integers that can be decoded (one more than the max).
|
||||||
|
This must be at least one, and no more than 2**32-1.
|
||||||
|
Return: The decoded bits.*/
|
||||||
|
opus_uint32 ec_dec_uint(ec_dec *_this,opus_uint32 _ft);
|
||||||
|
|
||||||
|
/*Extracts a sequence of raw bits from the stream.
|
||||||
|
The bits must have been encoded with ec_enc_bits().
|
||||||
|
No call to ec_dec_update() is necessary after this call.
|
||||||
|
_ftb: The number of bits to extract.
|
||||||
|
This must be between 0 and 25, inclusive.
|
||||||
|
Return: The decoded bits.*/
|
||||||
|
opus_uint32 ec_dec_bits(ec_dec *_this,unsigned _ftb);
|
||||||
|
|
||||||
|
#endif
|
294
Frameworks/Opus/Opus/opus/celt/entenc.c
Normal file
294
Frameworks/Opus/Opus/opus/celt/entenc.c
Normal file
|
@ -0,0 +1,294 @@
|
||||||
|
/* Copyright (c) 2001-2011 Timothy B. Terriberry
|
||||||
|
Copyright (c) 2008-2009 Xiph.Org Foundation */
|
||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined(HAVE_CONFIG_H)
|
||||||
|
# include "config.h"
|
||||||
|
#endif
|
||||||
|
#include "os_support.h"
|
||||||
|
#include "arch.h"
|
||||||
|
#include "entenc.h"
|
||||||
|
#include "mfrngcod.h"
|
||||||
|
|
||||||
|
/*A range encoder.
|
||||||
|
See entdec.c and the references for implementation details \cite{Mar79,MNW98}.
|
||||||
|
|
||||||
|
@INPROCEEDINGS{Mar79,
|
||||||
|
author="Martin, G.N.N.",
|
||||||
|
title="Range encoding: an algorithm for removing redundancy from a digitised
|
||||||
|
message",
|
||||||
|
booktitle="Video \& Data Recording Conference",
|
||||||
|
year=1979,
|
||||||
|
address="Southampton",
|
||||||
|
month=Jul
|
||||||
|
}
|
||||||
|
@ARTICLE{MNW98,
|
||||||
|
author="Alistair Moffat and Radford Neal and Ian H. Witten",
|
||||||
|
title="Arithmetic Coding Revisited",
|
||||||
|
journal="{ACM} Transactions on Information Systems",
|
||||||
|
year=1998,
|
||||||
|
volume=16,
|
||||||
|
number=3,
|
||||||
|
pages="256--294",
|
||||||
|
month=Jul,
|
||||||
|
URL="http://www.stanford.edu/class/ee398/handouts/papers/Moffat98ArithmCoding.pdf"
|
||||||
|
}*/
|
||||||
|
|
||||||
|
static int ec_write_byte(ec_enc *_this,unsigned _value){
|
||||||
|
if(_this->offs+_this->end_offs>=_this->storage)return -1;
|
||||||
|
_this->buf[_this->offs++]=(unsigned char)_value;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ec_write_byte_at_end(ec_enc *_this,unsigned _value){
|
||||||
|
if(_this->offs+_this->end_offs>=_this->storage)return -1;
|
||||||
|
_this->buf[_this->storage-++(_this->end_offs)]=(unsigned char)_value;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*Outputs a symbol, with a carry bit.
|
||||||
|
If there is a potential to propagate a carry over several symbols, they are
|
||||||
|
buffered until it can be determined whether or not an actual carry will
|
||||||
|
occur.
|
||||||
|
If the counter for the buffered symbols overflows, then the stream becomes
|
||||||
|
undecodable.
|
||||||
|
This gives a theoretical limit of a few billion symbols in a single packet on
|
||||||
|
32-bit systems.
|
||||||
|
The alternative is to truncate the range in order to force a carry, but
|
||||||
|
requires similar carry tracking in the decoder, needlessly slowing it down.*/
|
||||||
|
static void ec_enc_carry_out(ec_enc *_this,int _c){
|
||||||
|
if(_c!=EC_SYM_MAX){
|
||||||
|
/*No further carry propagation possible, flush buffer.*/
|
||||||
|
int carry;
|
||||||
|
carry=_c>>EC_SYM_BITS;
|
||||||
|
/*Don't output a byte on the first write.
|
||||||
|
This compare should be taken care of by branch-prediction thereafter.*/
|
||||||
|
if(_this->rem>=0)_this->error|=ec_write_byte(_this,_this->rem+carry);
|
||||||
|
if(_this->ext>0){
|
||||||
|
unsigned sym;
|
||||||
|
sym=(EC_SYM_MAX+carry)&EC_SYM_MAX;
|
||||||
|
do _this->error|=ec_write_byte(_this,sym);
|
||||||
|
while(--(_this->ext)>0);
|
||||||
|
}
|
||||||
|
_this->rem=_c&EC_SYM_MAX;
|
||||||
|
}
|
||||||
|
else _this->ext++;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ec_enc_normalize(ec_enc *_this){
|
||||||
|
/*If the range is too small, output some bits and rescale it.*/
|
||||||
|
while(_this->rng<=EC_CODE_BOT){
|
||||||
|
ec_enc_carry_out(_this,(int)(_this->val>>EC_CODE_SHIFT));
|
||||||
|
/*Move the next-to-high-order symbol into the high-order position.*/
|
||||||
|
_this->val=(_this->val<<EC_SYM_BITS)&(EC_CODE_TOP-1);
|
||||||
|
_this->rng<<=EC_SYM_BITS;
|
||||||
|
_this->nbits_total+=EC_SYM_BITS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ec_enc_init(ec_enc *_this,unsigned char *_buf,opus_uint32 _size){
|
||||||
|
_this->buf=_buf;
|
||||||
|
_this->end_offs=0;
|
||||||
|
_this->end_window=0;
|
||||||
|
_this->nend_bits=0;
|
||||||
|
/*This is the offset from which ec_tell() will subtract partial bits.*/
|
||||||
|
_this->nbits_total=EC_CODE_BITS+1;
|
||||||
|
_this->offs=0;
|
||||||
|
_this->rng=EC_CODE_TOP;
|
||||||
|
_this->rem=-1;
|
||||||
|
_this->val=0;
|
||||||
|
_this->ext=0;
|
||||||
|
_this->storage=_size;
|
||||||
|
_this->error=0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ec_encode(ec_enc *_this,unsigned _fl,unsigned _fh,unsigned _ft){
|
||||||
|
opus_uint32 r;
|
||||||
|
r=_this->rng/_ft;
|
||||||
|
if(_fl>0){
|
||||||
|
_this->val+=_this->rng-IMUL32(r,(_ft-_fl));
|
||||||
|
_this->rng=IMUL32(r,(_fh-_fl));
|
||||||
|
}
|
||||||
|
else _this->rng-=IMUL32(r,(_ft-_fh));
|
||||||
|
ec_enc_normalize(_this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ec_encode_bin(ec_enc *_this,unsigned _fl,unsigned _fh,unsigned _bits){
|
||||||
|
opus_uint32 r;
|
||||||
|
r=_this->rng>>_bits;
|
||||||
|
if(_fl>0){
|
||||||
|
_this->val+=_this->rng-IMUL32(r,((1U<<_bits)-_fl));
|
||||||
|
_this->rng=IMUL32(r,(_fh-_fl));
|
||||||
|
}
|
||||||
|
else _this->rng-=IMUL32(r,((1U<<_bits)-_fh));
|
||||||
|
ec_enc_normalize(_this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*The probability of having a "one" is 1/(1<<_logp).*/
|
||||||
|
void ec_enc_bit_logp(ec_enc *_this,int _val,unsigned _logp){
|
||||||
|
opus_uint32 r;
|
||||||
|
opus_uint32 s;
|
||||||
|
opus_uint32 l;
|
||||||
|
r=_this->rng;
|
||||||
|
l=_this->val;
|
||||||
|
s=r>>_logp;
|
||||||
|
r-=s;
|
||||||
|
if(_val)_this->val=l+r;
|
||||||
|
_this->rng=_val?s:r;
|
||||||
|
ec_enc_normalize(_this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ec_enc_icdf(ec_enc *_this,int _s,const unsigned char *_icdf,unsigned _ftb){
|
||||||
|
opus_uint32 r;
|
||||||
|
r=_this->rng>>_ftb;
|
||||||
|
if(_s>0){
|
||||||
|
_this->val+=_this->rng-IMUL32(r,_icdf[_s-1]);
|
||||||
|
_this->rng=IMUL32(r,_icdf[_s-1]-_icdf[_s]);
|
||||||
|
}
|
||||||
|
else _this->rng-=IMUL32(r,_icdf[_s]);
|
||||||
|
ec_enc_normalize(_this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ec_enc_uint(ec_enc *_this,opus_uint32 _fl,opus_uint32 _ft){
|
||||||
|
unsigned ft;
|
||||||
|
unsigned fl;
|
||||||
|
int ftb;
|
||||||
|
/*In order to optimize EC_ILOG(), it is undefined for the value 0.*/
|
||||||
|
celt_assert(_ft>1);
|
||||||
|
_ft--;
|
||||||
|
ftb=EC_ILOG(_ft);
|
||||||
|
if(ftb>EC_UINT_BITS){
|
||||||
|
ftb-=EC_UINT_BITS;
|
||||||
|
ft=(_ft>>ftb)+1;
|
||||||
|
fl=(unsigned)(_fl>>ftb);
|
||||||
|
ec_encode(_this,fl,fl+1,ft);
|
||||||
|
ec_enc_bits(_this,_fl&(((opus_uint32)1<<ftb)-1U),ftb);
|
||||||
|
}
|
||||||
|
else ec_encode(_this,_fl,_fl+1,_ft+1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ec_enc_bits(ec_enc *_this,opus_uint32 _fl,unsigned _bits){
|
||||||
|
ec_window window;
|
||||||
|
int used;
|
||||||
|
window=_this->end_window;
|
||||||
|
used=_this->nend_bits;
|
||||||
|
celt_assert(_bits>0);
|
||||||
|
if(used+_bits>EC_WINDOW_SIZE){
|
||||||
|
do{
|
||||||
|
_this->error|=ec_write_byte_at_end(_this,(unsigned)window&EC_SYM_MAX);
|
||||||
|
window>>=EC_SYM_BITS;
|
||||||
|
used-=EC_SYM_BITS;
|
||||||
|
}
|
||||||
|
while(used>=EC_SYM_BITS);
|
||||||
|
}
|
||||||
|
window|=(ec_window)_fl<<used;
|
||||||
|
used+=_bits;
|
||||||
|
_this->end_window=window;
|
||||||
|
_this->nend_bits=used;
|
||||||
|
_this->nbits_total+=_bits;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ec_enc_patch_initial_bits(ec_enc *_this,unsigned _val,unsigned _nbits){
|
||||||
|
int shift;
|
||||||
|
unsigned mask;
|
||||||
|
celt_assert(_nbits<=EC_SYM_BITS);
|
||||||
|
shift=EC_SYM_BITS-_nbits;
|
||||||
|
mask=((1<<_nbits)-1)<<shift;
|
||||||
|
if(_this->offs>0){
|
||||||
|
/*The first byte has been finalized.*/
|
||||||
|
_this->buf[0]=(unsigned char)((_this->buf[0]&~mask)|_val<<shift);
|
||||||
|
}
|
||||||
|
else if(_this->rem>=0){
|
||||||
|
/*The first byte is still awaiting carry propagation.*/
|
||||||
|
_this->rem=(_this->rem&~mask)|_val<<shift;
|
||||||
|
}
|
||||||
|
else if(_this->rng<=(EC_CODE_TOP>>_nbits)){
|
||||||
|
/*The renormalization loop has never been run.*/
|
||||||
|
_this->val=(_this->val&~((opus_uint32)mask<<EC_CODE_SHIFT))|
|
||||||
|
(opus_uint32)_val<<(EC_CODE_SHIFT+shift);
|
||||||
|
}
|
||||||
|
/*The encoder hasn't even encoded _nbits of data yet.*/
|
||||||
|
else _this->error=-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ec_enc_shrink(ec_enc *_this,opus_uint32 _size){
|
||||||
|
celt_assert(_this->offs+_this->end_offs<=_size);
|
||||||
|
OPUS_MOVE(_this->buf+_size-_this->end_offs,
|
||||||
|
_this->buf+_this->storage-_this->end_offs,_this->end_offs);
|
||||||
|
_this->storage=_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ec_enc_done(ec_enc *_this){
|
||||||
|
ec_window window;
|
||||||
|
int used;
|
||||||
|
opus_uint32 msk;
|
||||||
|
opus_uint32 end;
|
||||||
|
int l;
|
||||||
|
/*We output the minimum number of bits that ensures that the symbols encoded
|
||||||
|
thus far will be decoded correctly regardless of the bits that follow.*/
|
||||||
|
l=EC_CODE_BITS-EC_ILOG(_this->rng);
|
||||||
|
msk=(EC_CODE_TOP-1)>>l;
|
||||||
|
end=(_this->val+msk)&~msk;
|
||||||
|
if((end|msk)>=_this->val+_this->rng){
|
||||||
|
l++;
|
||||||
|
msk>>=1;
|
||||||
|
end=(_this->val+msk)&~msk;
|
||||||
|
}
|
||||||
|
while(l>0){
|
||||||
|
ec_enc_carry_out(_this,(int)(end>>EC_CODE_SHIFT));
|
||||||
|
end=(end<<EC_SYM_BITS)&(EC_CODE_TOP-1);
|
||||||
|
l-=EC_SYM_BITS;
|
||||||
|
}
|
||||||
|
/*If we have a buffered byte flush it into the output buffer.*/
|
||||||
|
if(_this->rem>=0||_this->ext>0)ec_enc_carry_out(_this,0);
|
||||||
|
/*If we have buffered extra bits, flush them as well.*/
|
||||||
|
window=_this->end_window;
|
||||||
|
used=_this->nend_bits;
|
||||||
|
while(used>=EC_SYM_BITS){
|
||||||
|
_this->error|=ec_write_byte_at_end(_this,(unsigned)window&EC_SYM_MAX);
|
||||||
|
window>>=EC_SYM_BITS;
|
||||||
|
used-=EC_SYM_BITS;
|
||||||
|
}
|
||||||
|
/*Clear any excess space and add any remaining extra bits to the last byte.*/
|
||||||
|
if(!_this->error){
|
||||||
|
OPUS_CLEAR(_this->buf+_this->offs,
|
||||||
|
_this->storage-_this->offs-_this->end_offs);
|
||||||
|
if(used>0){
|
||||||
|
/*If there's no range coder data at all, give up.*/
|
||||||
|
if(_this->end_offs>=_this->storage)_this->error=-1;
|
||||||
|
else{
|
||||||
|
l=-l;
|
||||||
|
/*If we've busted, don't add too many extra bits to the last byte; it
|
||||||
|
would corrupt the range coder data, and that's more important.*/
|
||||||
|
if(_this->offs+_this->end_offs>=_this->storage&&l<used){
|
||||||
|
window&=(1<<l)-1;
|
||||||
|
_this->error=-1;
|
||||||
|
}
|
||||||
|
_this->buf[_this->storage-_this->end_offs-1]|=(unsigned char)window;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
110
Frameworks/Opus/Opus/opus/celt/entenc.h
Normal file
110
Frameworks/Opus/Opus/opus/celt/entenc.h
Normal file
|
@ -0,0 +1,110 @@
|
||||||
|
/* Copyright (c) 2001-2011 Timothy B. Terriberry
|
||||||
|
Copyright (c) 2008-2009 Xiph.Org Foundation */
|
||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if !defined(_entenc_H)
|
||||||
|
# define _entenc_H (1)
|
||||||
|
# include <stddef.h>
|
||||||
|
# include "entcode.h"
|
||||||
|
|
||||||
|
/*Initializes the encoder.
|
||||||
|
_buf: The buffer to store output bytes in.
|
||||||
|
_size: The size of the buffer, in chars.*/
|
||||||
|
void ec_enc_init(ec_enc *_this,unsigned char *_buf,opus_uint32 _size);
|
||||||
|
/*Encodes a symbol given its frequency information.
|
||||||
|
The frequency information must be discernable by the decoder, assuming it
|
||||||
|
has read only the previous symbols from the stream.
|
||||||
|
It is allowable to change the frequency information, or even the entire
|
||||||
|
source alphabet, so long as the decoder can tell from the context of the
|
||||||
|
previously encoded information that it is supposed to do so as well.
|
||||||
|
_fl: The cumulative frequency of all symbols that come before the one to be
|
||||||
|
encoded.
|
||||||
|
_fh: The cumulative frequency of all symbols up to and including the one to
|
||||||
|
be encoded.
|
||||||
|
Together with _fl, this defines the range [_fl,_fh) in which the
|
||||||
|
decoded value will fall.
|
||||||
|
_ft: The sum of the frequencies of all the symbols*/
|
||||||
|
void ec_encode(ec_enc *_this,unsigned _fl,unsigned _fh,unsigned _ft);
|
||||||
|
|
||||||
|
/*Equivalent to ec_encode() with _ft==1<<_bits.*/
|
||||||
|
void ec_encode_bin(ec_enc *_this,unsigned _fl,unsigned _fh,unsigned _bits);
|
||||||
|
|
||||||
|
/* Encode a bit that has a 1/(1<<_logp) probability of being a one */
|
||||||
|
void ec_enc_bit_logp(ec_enc *_this,int _val,unsigned _logp);
|
||||||
|
|
||||||
|
/*Encodes a symbol given an "inverse" CDF table.
|
||||||
|
_s: The index of the symbol to encode.
|
||||||
|
_icdf: The "inverse" CDF, such that symbol _s falls in the range
|
||||||
|
[_s>0?ft-_icdf[_s-1]:0,ft-_icdf[_s]), where ft=1<<_ftb.
|
||||||
|
The values must be monotonically non-increasing, and the last value
|
||||||
|
must be 0.
|
||||||
|
_ftb: The number of bits of precision in the cumulative distribution.*/
|
||||||
|
void ec_enc_icdf(ec_enc *_this,int _s,const unsigned char *_icdf,unsigned _ftb);
|
||||||
|
|
||||||
|
/*Encodes a raw unsigned integer in the stream.
|
||||||
|
_fl: The integer to encode.
|
||||||
|
_ft: The number of integers that can be encoded (one more than the max).
|
||||||
|
This must be at least one, and no more than 2**32-1.*/
|
||||||
|
void ec_enc_uint(ec_enc *_this,opus_uint32 _fl,opus_uint32 _ft);
|
||||||
|
|
||||||
|
/*Encodes a sequence of raw bits in the stream.
|
||||||
|
_fl: The bits to encode.
|
||||||
|
_ftb: The number of bits to encode.
|
||||||
|
This must be between 1 and 25, inclusive.*/
|
||||||
|
void ec_enc_bits(ec_enc *_this,opus_uint32 _fl,unsigned _ftb);
|
||||||
|
|
||||||
|
/*Overwrites a few bits at the very start of an existing stream, after they
|
||||||
|
have already been encoded.
|
||||||
|
This makes it possible to have a few flags up front, where it is easy for
|
||||||
|
decoders to access them without parsing the whole stream, even if their
|
||||||
|
values are not determined until late in the encoding process, without having
|
||||||
|
to buffer all the intermediate symbols in the encoder.
|
||||||
|
In order for this to work, at least _nbits bits must have already been
|
||||||
|
encoded using probabilities that are an exact power of two.
|
||||||
|
The encoder can verify the number of encoded bits is sufficient, but cannot
|
||||||
|
check this latter condition.
|
||||||
|
_val: The bits to encode (in the least _nbits significant bits).
|
||||||
|
They will be decoded in order from most-significant to least.
|
||||||
|
_nbits: The number of bits to overwrite.
|
||||||
|
This must be no more than 8.*/
|
||||||
|
void ec_enc_patch_initial_bits(ec_enc *_this,unsigned _val,unsigned _nbits);
|
||||||
|
|
||||||
|
/*Compacts the data to fit in the target size.
|
||||||
|
This moves up the raw bits at the end of the current buffer so they are at
|
||||||
|
the end of the new buffer size.
|
||||||
|
The caller must ensure that the amount of data that's already been written
|
||||||
|
will fit in the new size.
|
||||||
|
_size: The number of bytes in the new buffer.
|
||||||
|
This must be large enough to contain the bits already written, and
|
||||||
|
must be no larger than the existing size.*/
|
||||||
|
void ec_enc_shrink(ec_enc *_this,opus_uint32 _size);
|
||||||
|
|
||||||
|
/*Indicates that there are no more symbols to encode.
|
||||||
|
All reamining output bytes are flushed to the output buffer.
|
||||||
|
ec_enc_init() must be called before the encoder can be used again.*/
|
||||||
|
void ec_enc_done(ec_enc *_this);
|
||||||
|
|
||||||
|
#endif
|
763
Frameworks/Opus/Opus/opus/celt/fixed_debug.h
Normal file
763
Frameworks/Opus/Opus/opus/celt/fixed_debug.h
Normal file
|
@ -0,0 +1,763 @@
|
||||||
|
/* Copyright (C) 2003-2008 Jean-Marc Valin
|
||||||
|
Copyright (C) 2007-2012 Xiph.Org Foundation */
|
||||||
|
/**
|
||||||
|
@file fixed_debug.h
|
||||||
|
@brief Fixed-point operations with debugging
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef FIXED_DEBUG_H
|
||||||
|
#define FIXED_DEBUG_H
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#ifdef CELT_C
|
||||||
|
#include "opus_defines.h"
|
||||||
|
OPUS_EXPORT opus_int64 celt_mips=0;
|
||||||
|
#else
|
||||||
|
extern opus_int64 celt_mips;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define MULT16_16SU(a,b) ((opus_val32)(opus_val16)(a)*(opus_val32)(opus_uint16)(b))
|
||||||
|
#define MULT32_32_Q31(a,b) ADD32(ADD32(SHL32(MULT16_16(SHR32((a),16),SHR((b),16)),1), SHR32(MULT16_16SU(SHR32((a),16),((b)&0x0000ffff)),15)), SHR32(MULT16_16SU(SHR32((b),16),((a)&0x0000ffff)),15))
|
||||||
|
|
||||||
|
/** 16x32 multiplication, followed by a 16-bit shift right. Results fits in 32 bits */
|
||||||
|
#define MULT16_32_Q16(a,b) ADD32(MULT16_16((a),SHR32((b),16)), SHR32(MULT16_16SU((a),((b)&0x0000ffff)),16))
|
||||||
|
|
||||||
|
#define MULT16_32_P16(a,b) MULT16_32_PX(a,b,16)
|
||||||
|
|
||||||
|
#define QCONST16(x,bits) ((opus_val16)(.5+(x)*(((opus_val32)1)<<(bits))))
|
||||||
|
#define QCONST32(x,bits) ((opus_val32)(.5+(x)*(((opus_val32)1)<<(bits))))
|
||||||
|
|
||||||
|
#define VERIFY_SHORT(x) ((x)<=32767&&(x)>=-32768)
|
||||||
|
#define VERIFY_INT(x) ((x)<=2147483647LL&&(x)>=-2147483648LL)
|
||||||
|
#define VERIFY_UINT(x) ((x)<=(2147483647LLU<<1))
|
||||||
|
|
||||||
|
#define SHR(a,b) SHR32(a,b)
|
||||||
|
#define PSHR(a,b) PSHR32(a,b)
|
||||||
|
|
||||||
|
static inline short NEG16(int x)
|
||||||
|
{
|
||||||
|
int res;
|
||||||
|
if (!VERIFY_SHORT(x))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "NEG16: input is not short: %d\n", (int)x);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
res = -x;
|
||||||
|
if (!VERIFY_SHORT(res))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "NEG16: output is not short: %d\n", (int)res);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
celt_mips++;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
static inline int NEG32(opus_int64 x)
|
||||||
|
{
|
||||||
|
opus_int64 res;
|
||||||
|
if (!VERIFY_INT(x))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "NEG16: input is not int: %d\n", (int)x);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
res = -x;
|
||||||
|
if (!VERIFY_INT(res))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "NEG16: output is not int: %d\n", (int)res);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
celt_mips+=2;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define EXTRACT16(x) EXTRACT16_(x, __FILE__, __LINE__)
|
||||||
|
static inline short EXTRACT16_(int x, char *file, int line)
|
||||||
|
{
|
||||||
|
int res;
|
||||||
|
if (!VERIFY_SHORT(x))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "EXTRACT16: input is not short: %d in %s: line %d\n", x, file, line);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
res = x;
|
||||||
|
celt_mips++;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define EXTEND32(x) EXTEND32_(x, __FILE__, __LINE__)
|
||||||
|
static inline int EXTEND32_(int x, char *file, int line)
|
||||||
|
{
|
||||||
|
int res;
|
||||||
|
if (!VERIFY_SHORT(x))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "EXTEND32: input is not short: %d in %s: line %d\n", x, file, line);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
res = x;
|
||||||
|
celt_mips++;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define SHR16(a, shift) SHR16_(a, shift, __FILE__, __LINE__)
|
||||||
|
static inline short SHR16_(int a, int shift, char *file, int line)
|
||||||
|
{
|
||||||
|
int res;
|
||||||
|
if (!VERIFY_SHORT(a) || !VERIFY_SHORT(shift))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "SHR16: inputs are not short: %d >> %d in %s: line %d\n", a, shift, file, line);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
res = a>>shift;
|
||||||
|
if (!VERIFY_SHORT(res))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "SHR16: output is not short: %d in %s: line %d\n", res, file, line);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
celt_mips++;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
#define SHL16(a, shift) SHL16_(a, shift, __FILE__, __LINE__)
|
||||||
|
static inline short SHL16_(int a, int shift, char *file, int line)
|
||||||
|
{
|
||||||
|
int res;
|
||||||
|
if (!VERIFY_SHORT(a) || !VERIFY_SHORT(shift))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "SHL16: inputs are not short: %d %d in %s: line %d\n", a, shift, file, line);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
res = a<<shift;
|
||||||
|
if (!VERIFY_SHORT(res))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "SHL16: output is not short: %d in %s: line %d\n", res, file, line);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
celt_mips++;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int SHR32(opus_int64 a, int shift)
|
||||||
|
{
|
||||||
|
opus_int64 res;
|
||||||
|
if (!VERIFY_INT(a) || !VERIFY_SHORT(shift))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "SHR32: inputs are not int: %d %d\n", (int)a, shift);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
res = a>>shift;
|
||||||
|
if (!VERIFY_INT(res))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "SHR32: output is not int: %d\n", (int)res);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
celt_mips+=2;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
#define SHL32(a, shift) SHL32_(a, shift, __FILE__, __LINE__)
|
||||||
|
static inline int SHL32_(opus_int64 a, int shift, char *file, int line)
|
||||||
|
{
|
||||||
|
opus_int64 res;
|
||||||
|
if (!VERIFY_INT(a) || !VERIFY_SHORT(shift))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "SHL32: inputs are not int: %lld %d in %s: line %d\n", a, shift, file, line);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
res = a<<shift;
|
||||||
|
if (!VERIFY_INT(res))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "SHL32: output is not int: %lld<<%d = %lld in %s: line %d\n", a, shift, res, file, line);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
celt_mips+=2;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define PSHR32(a,shift) (celt_mips--,SHR32(ADD32((a),(((opus_val32)(1)<<((shift))>>1))),shift))
|
||||||
|
#define VSHR32(a, shift) (((shift)>0) ? SHR32(a, shift) : SHL32(a, -(shift)))
|
||||||
|
|
||||||
|
#define ROUND16(x,a) (celt_mips--,EXTRACT16(PSHR32((x),(a))))
|
||||||
|
#define HALF16(x) (SHR16(x,1))
|
||||||
|
#define HALF32(x) (SHR32(x,1))
|
||||||
|
|
||||||
|
//#define SHR(a,shift) ((a) >> (shift))
|
||||||
|
//#define SHL(a,shift) ((a) << (shift))
|
||||||
|
|
||||||
|
#define ADD16(a, b) ADD16_(a, b, __FILE__, __LINE__)
|
||||||
|
static inline short ADD16_(int a, int b, char *file, int line)
|
||||||
|
{
|
||||||
|
int res;
|
||||||
|
if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "ADD16: inputs are not short: %d %d in %s: line %d\n", a, b, file, line);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
res = a+b;
|
||||||
|
if (!VERIFY_SHORT(res))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "ADD16: output is not short: %d+%d=%d in %s: line %d\n", a,b,res, file, line);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
celt_mips++;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define SUB16(a, b) SUB16_(a, b, __FILE__, __LINE__)
|
||||||
|
static inline short SUB16_(int a, int b, char *file, int line)
|
||||||
|
{
|
||||||
|
int res;
|
||||||
|
if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "SUB16: inputs are not short: %d %d in %s: line %d\n", a, b, file, line);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
res = a-b;
|
||||||
|
if (!VERIFY_SHORT(res))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "SUB16: output is not short: %d in %s: line %d\n", res, file, line);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
celt_mips++;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define ADD32(a, b) ADD32_(a, b, __FILE__, __LINE__)
|
||||||
|
static inline int ADD32_(opus_int64 a, opus_int64 b, char *file, int line)
|
||||||
|
{
|
||||||
|
opus_int64 res;
|
||||||
|
if (!VERIFY_INT(a) || !VERIFY_INT(b))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "ADD32: inputs are not int: %d %d in %s: line %d\n", (int)a, (int)b, file, line);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
res = a+b;
|
||||||
|
if (!VERIFY_INT(res))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "ADD32: output is not int: %d in %s: line %d\n", (int)res, file, line);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
celt_mips+=2;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define SUB32(a, b) SUB32_(a, b, __FILE__, __LINE__)
|
||||||
|
static inline int SUB32_(opus_int64 a, opus_int64 b, char *file, int line)
|
||||||
|
{
|
||||||
|
opus_int64 res;
|
||||||
|
if (!VERIFY_INT(a) || !VERIFY_INT(b))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "SUB32: inputs are not int: %d %d in %s: line %d\n", (int)a, (int)b, file, line);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
res = a-b;
|
||||||
|
if (!VERIFY_INT(res))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "SUB32: output is not int: %d in %s: line %d\n", (int)res, file, line);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
celt_mips+=2;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef UADD32
|
||||||
|
#define UADD32(a, b) UADD32_(a, b, __FILE__, __LINE__)
|
||||||
|
static inline unsigned int UADD32_(opus_uint64 a, opus_uint64 b, char *file, int line)
|
||||||
|
{
|
||||||
|
opus_uint64 res;
|
||||||
|
if (!VERIFY_UINT(a) || !VERIFY_UINT(b))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "UADD32: inputs are not uint32: %llu %llu in %s: line %d\n", a, b, file, line);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
res = a+b;
|
||||||
|
if (!VERIFY_UINT(res))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "UADD32: output is not uint32: %llu in %s: line %d\n", res, file, line);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
celt_mips+=2;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef USUB32
|
||||||
|
#define USUB32(a, b) USUB32_(a, b, __FILE__, __LINE__)
|
||||||
|
static inline unsigned int USUB32_(opus_uint64 a, opus_uint64 b, char *file, int line)
|
||||||
|
{
|
||||||
|
opus_uint64 res;
|
||||||
|
if (!VERIFY_UINT(a) || !VERIFY_UINT(b))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "USUB32: inputs are not uint32: %llu %llu in %s: line %d\n", a, b, file, line);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
if (a<b)
|
||||||
|
{
|
||||||
|
fprintf (stderr, "USUB32: inputs underflow: %llu < %llu in %s: line %d\n", a, b, file, line);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
res = a-b;
|
||||||
|
if (!VERIFY_UINT(res))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "USUB32: output is not uint32: %llu - %llu = %llu in %s: line %d\n", a, b, res, file, line);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
celt_mips+=2;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* result fits in 16 bits */
|
||||||
|
static inline short MULT16_16_16(int a, int b)
|
||||||
|
{
|
||||||
|
int res;
|
||||||
|
if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "MULT16_16_16: inputs are not short: %d %d\n", a, b);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
res = a*b;
|
||||||
|
if (!VERIFY_SHORT(res))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "MULT16_16_16: output is not short: %d\n", res);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
celt_mips++;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define MULT16_16(a, b) MULT16_16_(a, b, __FILE__, __LINE__)
|
||||||
|
static inline int MULT16_16_(int a, int b, char *file, int line)
|
||||||
|
{
|
||||||
|
opus_int64 res;
|
||||||
|
if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "MULT16_16: inputs are not short: %d %d in %s: line %d\n", a, b, file, line);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
res = ((opus_int64)a)*b;
|
||||||
|
if (!VERIFY_INT(res))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "MULT16_16: output is not int: %d in %s: line %d\n", (int)res, file, line);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
celt_mips++;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define MAC16_16(c,a,b) (celt_mips-=2,ADD32((c),MULT16_16((a),(b))))
|
||||||
|
|
||||||
|
#define MULT16_32_QX(a, b, Q) MULT16_32_QX_(a, b, Q, __FILE__, __LINE__)
|
||||||
|
static inline int MULT16_32_QX_(int a, opus_int64 b, int Q, char *file, int line)
|
||||||
|
{
|
||||||
|
opus_int64 res;
|
||||||
|
if (!VERIFY_SHORT(a) || !VERIFY_INT(b))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "MULT16_32_Q%d: inputs are not short+int: %d %d in %s: line %d\n", Q, (int)a, (int)b, file, line);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
if (ABS32(b)>=((opus_val32)(1)<<(15+Q)))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "MULT16_32_Q%d: second operand too large: %d %d in %s: line %d\n", Q, (int)a, (int)b, file, line);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
res = (((opus_int64)a)*(opus_int64)b) >> Q;
|
||||||
|
if (!VERIFY_INT(res))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "MULT16_32_Q%d: output is not int: %d*%d=%d in %s: line %d\n", Q, (int)a, (int)b,(int)res, file, line);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
if (Q==15)
|
||||||
|
celt_mips+=3;
|
||||||
|
else
|
||||||
|
celt_mips+=4;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define MULT16_32_PX(a, b, Q) MULT16_32_PX_(a, b, Q, __FILE__, __LINE__)
|
||||||
|
static inline int MULT16_32_PX_(int a, opus_int64 b, int Q, char *file, int line)
|
||||||
|
{
|
||||||
|
opus_int64 res;
|
||||||
|
if (!VERIFY_SHORT(a) || !VERIFY_INT(b))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "MULT16_32_P%d: inputs are not short+int: %d %d in %s: line %d\n\n", Q, (int)a, (int)b, file, line);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
if (ABS32(b)>=((opus_int64)(1)<<(15+Q)))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "MULT16_32_Q%d: second operand too large: %d %d in %s: line %d\n\n", Q, (int)a, (int)b,file, line);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
res = ((((opus_int64)a)*(opus_int64)b) + (((opus_val32)(1)<<Q)>>1))>> Q;
|
||||||
|
if (!VERIFY_INT(res))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "MULT16_32_P%d: output is not int: %d*%d=%d in %s: line %d\n\n", Q, (int)a, (int)b,(int)res, file, line);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
if (Q==15)
|
||||||
|
celt_mips+=4;
|
||||||
|
else
|
||||||
|
celt_mips+=5;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define MULT16_32_Q15(a,b) MULT16_32_QX(a,b,15)
|
||||||
|
#define MAC16_32_Q15(c,a,b) (celt_mips-=2,ADD32((c),MULT16_32_Q15((a),(b))))
|
||||||
|
|
||||||
|
static inline int SATURATE(int a, int b)
|
||||||
|
{
|
||||||
|
if (a>b)
|
||||||
|
a=b;
|
||||||
|
if (a<-b)
|
||||||
|
a = -b;
|
||||||
|
celt_mips+=3;
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int MULT16_16_Q11_32(int a, int b)
|
||||||
|
{
|
||||||
|
opus_int64 res;
|
||||||
|
if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "MULT16_16_Q11: inputs are not short: %d %d\n", a, b);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
res = ((opus_int64)a)*b;
|
||||||
|
res >>= 11;
|
||||||
|
if (!VERIFY_INT(res))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "MULT16_16_Q11: output is not short: %d*%d=%d\n", (int)a, (int)b, (int)res);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
celt_mips+=3;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
static inline short MULT16_16_Q13(int a, int b)
|
||||||
|
{
|
||||||
|
opus_int64 res;
|
||||||
|
if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "MULT16_16_Q13: inputs are not short: %d %d\n", a, b);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
res = ((opus_int64)a)*b;
|
||||||
|
res >>= 13;
|
||||||
|
if (!VERIFY_SHORT(res))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "MULT16_16_Q13: output is not short: %d*%d=%d\n", a, b, (int)res);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
celt_mips+=3;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
static inline short MULT16_16_Q14(int a, int b)
|
||||||
|
{
|
||||||
|
opus_int64 res;
|
||||||
|
if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "MULT16_16_Q14: inputs are not short: %d %d\n", a, b);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
res = ((opus_int64)a)*b;
|
||||||
|
res >>= 14;
|
||||||
|
if (!VERIFY_SHORT(res))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "MULT16_16_Q14: output is not short: %d\n", (int)res);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
celt_mips+=3;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define MULT16_16_Q15(a, b) MULT16_16_Q15_(a, b, __FILE__, __LINE__)
|
||||||
|
static inline short MULT16_16_Q15_(int a, int b, char *file, int line)
|
||||||
|
{
|
||||||
|
opus_int64 res;
|
||||||
|
if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "MULT16_16_Q15: inputs are not short: %d %d in %s: line %d\n", a, b, file, line);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
res = ((opus_int64)a)*b;
|
||||||
|
res >>= 15;
|
||||||
|
if (!VERIFY_SHORT(res))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "MULT16_16_Q15: output is not short: %d in %s: line %d\n", (int)res, file, line);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
celt_mips+=1;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline short MULT16_16_P13(int a, int b)
|
||||||
|
{
|
||||||
|
opus_int64 res;
|
||||||
|
if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "MULT16_16_P13: inputs are not short: %d %d\n", a, b);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
res = ((opus_int64)a)*b;
|
||||||
|
res += 4096;
|
||||||
|
if (!VERIFY_INT(res))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "MULT16_16_P13: overflow: %d*%d=%d\n", a, b, (int)res);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
res >>= 13;
|
||||||
|
if (!VERIFY_SHORT(res))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "MULT16_16_P13: output is not short: %d*%d=%d\n", a, b, (int)res);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
celt_mips+=4;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
static inline short MULT16_16_P14(int a, int b)
|
||||||
|
{
|
||||||
|
opus_int64 res;
|
||||||
|
if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "MULT16_16_P14: inputs are not short: %d %d\n", a, b);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
res = ((opus_int64)a)*b;
|
||||||
|
res += 8192;
|
||||||
|
if (!VERIFY_INT(res))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "MULT16_16_P14: overflow: %d*%d=%d\n", a, b, (int)res);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
res >>= 14;
|
||||||
|
if (!VERIFY_SHORT(res))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "MULT16_16_P14: output is not short: %d*%d=%d\n", a, b, (int)res);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
celt_mips+=4;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
static inline short MULT16_16_P15(int a, int b)
|
||||||
|
{
|
||||||
|
opus_int64 res;
|
||||||
|
if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "MULT16_16_P15: inputs are not short: %d %d\n", a, b);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
res = ((opus_int64)a)*b;
|
||||||
|
res += 16384;
|
||||||
|
if (!VERIFY_INT(res))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "MULT16_16_P15: overflow: %d*%d=%d\n", a, b, (int)res);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
res >>= 15;
|
||||||
|
if (!VERIFY_SHORT(res))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "MULT16_16_P15: output is not short: %d*%d=%d\n", a, b, (int)res);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
celt_mips+=2;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define DIV32_16(a, b) DIV32_16_(a, b, __FILE__, __LINE__)
|
||||||
|
|
||||||
|
static inline int DIV32_16_(opus_int64 a, opus_int64 b, char *file, int line)
|
||||||
|
{
|
||||||
|
opus_int64 res;
|
||||||
|
if (b==0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "DIV32_16: divide by zero: %d/%d in %s: line %d\n", (int)a, (int)b, file, line);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (!VERIFY_INT(a) || !VERIFY_SHORT(b))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "DIV32_16: inputs are not int/short: %d %d in %s: line %d\n", (int)a, (int)b, file, line);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
res = a/b;
|
||||||
|
if (!VERIFY_SHORT(res))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "DIV32_16: output is not short: %d / %d = %d in %s: line %d\n", (int)a,(int)b,(int)res, file, line);
|
||||||
|
if (res>32767)
|
||||||
|
res = 32767;
|
||||||
|
if (res<-32768)
|
||||||
|
res = -32768;
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
celt_mips+=35;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define DIV32(a, b) DIV32_(a, b, __FILE__, __LINE__)
|
||||||
|
static inline int DIV32_(opus_int64 a, opus_int64 b, char *file, int line)
|
||||||
|
{
|
||||||
|
opus_int64 res;
|
||||||
|
if (b==0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "DIV32: divide by zero: %d/%d in %s: line %d\n", (int)a, (int)b, file, line);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!VERIFY_INT(a) || !VERIFY_INT(b))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "DIV32: inputs are not int/short: %d %d in %s: line %d\n", (int)a, (int)b, file, line);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
res = a/b;
|
||||||
|
if (!VERIFY_INT(res))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "DIV32: output is not int: %d in %s: line %d\n", (int)res, file, line);
|
||||||
|
#ifdef FIXED_DEBUG_ASSERT
|
||||||
|
celt_assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
celt_mips+=70;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef PRINT_MIPS
|
||||||
|
#define PRINT_MIPS(file) do {fprintf (file, "total complexity = %llu MIPS\n", celt_mips);} while (0);
|
||||||
|
|
||||||
|
#endif
|
129
Frameworks/Opus/Opus/opus/celt/fixed_generic.h
Normal file
129
Frameworks/Opus/Opus/opus/celt/fixed_generic.h
Normal file
|
@ -0,0 +1,129 @@
|
||||||
|
/* Copyright (C) 2007-2009 Xiph.Org Foundation
|
||||||
|
Copyright (C) 2003-2008 Jean-Marc Valin
|
||||||
|
Copyright (C) 2007-2008 CSIRO */
|
||||||
|
/**
|
||||||
|
@file fixed_generic.h
|
||||||
|
@brief Generic fixed-point operations
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef FIXED_GENERIC_H
|
||||||
|
#define FIXED_GENERIC_H
|
||||||
|
|
||||||
|
/** Multiply a 16-bit signed value by a 16-bit unsigned value. The result is a 32-bit signed value */
|
||||||
|
#define MULT16_16SU(a,b) ((opus_val32)(opus_val16)(a)*(opus_val32)(opus_uint16)(b))
|
||||||
|
|
||||||
|
/** 16x32 multiplication, followed by a 16-bit shift right. Results fits in 32 bits */
|
||||||
|
#define MULT16_32_Q16(a,b) ADD32(MULT16_16((a),SHR((b),16)), SHR(MULT16_16SU((a),((b)&0x0000ffff)),16))
|
||||||
|
|
||||||
|
/** 16x32 multiplication, followed by a 16-bit shift right (round-to-nearest). Results fits in 32 bits */
|
||||||
|
#define MULT16_32_P16(a,b) ADD32(MULT16_16((a),SHR((b),16)), PSHR(MULT16_16((a),((b)&0x0000ffff)),16))
|
||||||
|
|
||||||
|
/** 16x32 multiplication, followed by a 15-bit shift right. Results fits in 32 bits */
|
||||||
|
#define MULT16_32_Q15(a,b) ADD32(SHL(MULT16_16((a),SHR((b),16)),1), SHR(MULT16_16SU((a),((b)&0x0000ffff)),15))
|
||||||
|
|
||||||
|
/** 32x32 multiplication, followed by a 31-bit shift right. Results fits in 32 bits */
|
||||||
|
#define MULT32_32_Q31(a,b) ADD32(ADD32(SHL(MULT16_16(SHR((a),16),SHR((b),16)),1), SHR(MULT16_16SU(SHR((a),16),((b)&0x0000ffff)),15)), SHR(MULT16_16SU(SHR((b),16),((a)&0x0000ffff)),15))
|
||||||
|
|
||||||
|
/** Compile-time conversion of float constant to 16-bit value */
|
||||||
|
#define QCONST16(x,bits) ((opus_val16)(.5+(x)*(((opus_val32)1)<<(bits))))
|
||||||
|
|
||||||
|
/** Compile-time conversion of float constant to 32-bit value */
|
||||||
|
#define QCONST32(x,bits) ((opus_val32)(.5+(x)*(((opus_val32)1)<<(bits))))
|
||||||
|
|
||||||
|
/** Negate a 16-bit value */
|
||||||
|
#define NEG16(x) (-(x))
|
||||||
|
/** Negate a 32-bit value */
|
||||||
|
#define NEG32(x) (-(x))
|
||||||
|
|
||||||
|
/** Change a 32-bit value into a 16-bit value. The value is assumed to fit in 16-bit, otherwise the result is undefined */
|
||||||
|
#define EXTRACT16(x) ((opus_val16)(x))
|
||||||
|
/** Change a 16-bit value into a 32-bit value */
|
||||||
|
#define EXTEND32(x) ((opus_val32)(x))
|
||||||
|
|
||||||
|
/** Arithmetic shift-right of a 16-bit value */
|
||||||
|
#define SHR16(a,shift) ((a) >> (shift))
|
||||||
|
/** Arithmetic shift-left of a 16-bit value */
|
||||||
|
#define SHL16(a,shift) ((opus_int16)((opus_uint16)(a)<<(shift)))
|
||||||
|
/** Arithmetic shift-right of a 32-bit value */
|
||||||
|
#define SHR32(a,shift) ((a) >> (shift))
|
||||||
|
/** Arithmetic shift-left of a 32-bit value */
|
||||||
|
#define SHL32(a,shift) ((opus_int32)((opus_uint32)(a)<<(shift)))
|
||||||
|
|
||||||
|
/** 32-bit arithmetic shift right with rounding-to-nearest instead of rounding down */
|
||||||
|
#define PSHR32(a,shift) (SHR32((a)+((EXTEND32(1)<<((shift))>>1)),shift))
|
||||||
|
/** 32-bit arithmetic shift right where the argument can be negative */
|
||||||
|
#define VSHR32(a, shift) (((shift)>0) ? SHR32(a, shift) : SHL32(a, -(shift)))
|
||||||
|
|
||||||
|
/** "RAW" macros, should not be used outside of this header file */
|
||||||
|
#define SHR(a,shift) ((a) >> (shift))
|
||||||
|
#define SHL(a,shift) SHL32(a,shift)
|
||||||
|
#define PSHR(a,shift) (SHR((a)+((EXTEND32(1)<<((shift))>>1)),shift))
|
||||||
|
#define SATURATE(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x)))
|
||||||
|
|
||||||
|
/** Shift by a and round-to-neareast 32-bit value. Result is a 16-bit value */
|
||||||
|
#define ROUND16(x,a) (EXTRACT16(PSHR32((x),(a))))
|
||||||
|
/** Divide by two */
|
||||||
|
#define HALF16(x) (SHR16(x,1))
|
||||||
|
#define HALF32(x) (SHR32(x,1))
|
||||||
|
|
||||||
|
/** Add two 16-bit values */
|
||||||
|
#define ADD16(a,b) ((opus_val16)((opus_val16)(a)+(opus_val16)(b)))
|
||||||
|
/** Subtract two 16-bit values */
|
||||||
|
#define SUB16(a,b) ((opus_val16)(a)-(opus_val16)(b))
|
||||||
|
/** Add two 32-bit values */
|
||||||
|
#define ADD32(a,b) ((opus_val32)(a)+(opus_val32)(b))
|
||||||
|
/** Subtract two 32-bit values */
|
||||||
|
#define SUB32(a,b) ((opus_val32)(a)-(opus_val32)(b))
|
||||||
|
|
||||||
|
/** 16x16 multiplication where the result fits in 16 bits */
|
||||||
|
#define MULT16_16_16(a,b) ((((opus_val16)(a))*((opus_val16)(b))))
|
||||||
|
|
||||||
|
/* (opus_val32)(opus_val16) gives TI compiler a hint that it's 16x16->32 multiply */
|
||||||
|
/** 16x16 multiplication where the result fits in 32 bits */
|
||||||
|
#define MULT16_16(a,b) (((opus_val32)(opus_val16)(a))*((opus_val32)(opus_val16)(b)))
|
||||||
|
|
||||||
|
/** 16x16 multiply-add where the result fits in 32 bits */
|
||||||
|
#define MAC16_16(c,a,b) (ADD32((c),MULT16_16((a),(b))))
|
||||||
|
/** 16x32 multiply-add, followed by a 15-bit shift right. Results fits in 32 bits */
|
||||||
|
#define MAC16_32_Q15(c,a,b) ADD32(c,ADD32(MULT16_16((a),SHR((b),15)), SHR(MULT16_16((a),((b)&0x00007fff)),15)))
|
||||||
|
|
||||||
|
#define MULT16_16_Q11_32(a,b) (SHR(MULT16_16((a),(b)),11))
|
||||||
|
#define MULT16_16_Q13(a,b) (SHR(MULT16_16((a),(b)),13))
|
||||||
|
#define MULT16_16_Q14(a,b) (SHR(MULT16_16((a),(b)),14))
|
||||||
|
#define MULT16_16_Q15(a,b) (SHR(MULT16_16((a),(b)),15))
|
||||||
|
|
||||||
|
#define MULT16_16_P13(a,b) (SHR(ADD32(4096,MULT16_16((a),(b))),13))
|
||||||
|
#define MULT16_16_P14(a,b) (SHR(ADD32(8192,MULT16_16((a),(b))),14))
|
||||||
|
#define MULT16_16_P15(a,b) (SHR(ADD32(16384,MULT16_16((a),(b))),15))
|
||||||
|
|
||||||
|
/** Divide a 32-bit value by a 16-bit value. Result fits in 16 bits */
|
||||||
|
#define DIV32_16(a,b) ((opus_val16)(((opus_val32)(a))/((opus_val16)(b))))
|
||||||
|
|
||||||
|
/** Divide a 32-bit value by a 32-bit value. Result fits in 32 bits */
|
||||||
|
#define DIV32(a,b) (((opus_val32)(a))/((opus_val32)(b)))
|
||||||
|
|
||||||
|
#endif
|
140
Frameworks/Opus/Opus/opus/celt/float_cast.h
Normal file
140
Frameworks/Opus/Opus/opus/celt/float_cast.h
Normal file
|
@ -0,0 +1,140 @@
|
||||||
|
/* Copyright (C) 2001 Erik de Castro Lopo <erikd AT mega-nerd DOT com> */
|
||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Version 1.1 */
|
||||||
|
|
||||||
|
#ifndef FLOAT_CAST_H
|
||||||
|
#define FLOAT_CAST_H
|
||||||
|
|
||||||
|
|
||||||
|
#include "arch.h"
|
||||||
|
|
||||||
|
/*============================================================================
|
||||||
|
** On Intel Pentium processors (especially PIII and probably P4), converting
|
||||||
|
** from float to int is very slow. To meet the C specs, the code produced by
|
||||||
|
** most C compilers targeting Pentium needs to change the FPU rounding mode
|
||||||
|
** before the float to int conversion is performed.
|
||||||
|
**
|
||||||
|
** Changing the FPU rounding mode causes the FPU pipeline to be flushed. It
|
||||||
|
** is this flushing of the pipeline which is so slow.
|
||||||
|
**
|
||||||
|
** Fortunately the ISO C99 specifications define the functions lrint, lrintf,
|
||||||
|
** llrint and llrintf which fix this problem as a side effect.
|
||||||
|
**
|
||||||
|
** On Unix-like systems, the configure process should have detected the
|
||||||
|
** presence of these functions. If they weren't found we have to replace them
|
||||||
|
** here with a standard C cast.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
** The C99 prototypes for lrint and lrintf are as follows:
|
||||||
|
**
|
||||||
|
** long int lrintf (float x) ;
|
||||||
|
** long int lrint (double x) ;
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* The presence of the required functions are detected during the configure
|
||||||
|
** process and the values HAVE_LRINT and HAVE_LRINTF are set accordingly in
|
||||||
|
** the config.h file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if (HAVE_LRINTF)
|
||||||
|
|
||||||
|
/* These defines enable functionality introduced with the 1999 ISO C
|
||||||
|
** standard. They must be defined before the inclusion of math.h to
|
||||||
|
** engage them. If optimisation is enabled, these functions will be
|
||||||
|
** inlined. With optimisation switched off, you have to link in the
|
||||||
|
** maths library using -lm.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define _ISOC9X_SOURCE 1
|
||||||
|
#define _ISOC99_SOURCE 1
|
||||||
|
|
||||||
|
#define __USE_ISOC9X 1
|
||||||
|
#define __USE_ISOC99 1
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#define float2int(x) lrintf(x)
|
||||||
|
|
||||||
|
#elif (defined(HAVE_LRINT))
|
||||||
|
|
||||||
|
#define _ISOC9X_SOURCE 1
|
||||||
|
#define _ISOC99_SOURCE 1
|
||||||
|
|
||||||
|
#define __USE_ISOC9X 1
|
||||||
|
#define __USE_ISOC99 1
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#define float2int(x) lrint(x)
|
||||||
|
|
||||||
|
#elif (defined(_MSC_VER) && _MSC_VER >= 1400) && (defined (WIN64) || defined (_WIN64))
|
||||||
|
#include <xmmintrin.h>
|
||||||
|
|
||||||
|
__inline long int float2int(float value)
|
||||||
|
{
|
||||||
|
return _mm_cvtss_si32(_mm_load_ss(&value));
|
||||||
|
}
|
||||||
|
#elif (defined(_MSC_VER) && _MSC_VER >= 1400) && (defined (WIN32) || defined (_WIN32))
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
/* Win32 doesn't seem to have these functions.
|
||||||
|
** Therefore implement inline versions of these functions here.
|
||||||
|
*/
|
||||||
|
|
||||||
|
__inline long int
|
||||||
|
float2int (float flt)
|
||||||
|
{ int intgr;
|
||||||
|
|
||||||
|
_asm
|
||||||
|
{ fld flt
|
||||||
|
fistp intgr
|
||||||
|
} ;
|
||||||
|
|
||||||
|
return intgr ;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#if (defined(__GNUC__) && defined(__STDC__) && __STDC__ && __STDC_VERSION__ >= 199901L)
|
||||||
|
/* supported by gcc in C99 mode, but not by all other compilers */
|
||||||
|
#warning "Don't have the functions lrint() and lrintf ()."
|
||||||
|
#warning "Replacing these functions with a standard C cast."
|
||||||
|
#endif /* __STDC_VERSION__ >= 199901L */
|
||||||
|
#include <math.h>
|
||||||
|
#define float2int(flt) ((int)(floor(.5+flt)))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef DISABLE_FLOAT_API
|
||||||
|
static inline opus_int16 FLOAT2INT16(float x)
|
||||||
|
{
|
||||||
|
x = x*CELT_SIG_SCALE;
|
||||||
|
x = MAX32(x, -32768);
|
||||||
|
x = MIN32(x, 32767);
|
||||||
|
return (opus_int16)float2int(x);
|
||||||
|
}
|
||||||
|
#endif /* DISABLE_FLOAT_API */
|
||||||
|
|
||||||
|
#endif /* FLOAT_CAST_H */
|
722
Frameworks/Opus/Opus/opus/celt/kiss_fft.c
Normal file
722
Frameworks/Opus/Opus/opus/celt/kiss_fft.c
Normal file
|
@ -0,0 +1,722 @@
|
||||||
|
/*Copyright (c) 2003-2004, Mark Borgerding
|
||||||
|
Lots of modifications by Jean-Marc Valin
|
||||||
|
Copyright (c) 2005-2007, Xiph.Org Foundation
|
||||||
|
Copyright (c) 2008, Xiph.Org Foundation, CSIRO
|
||||||
|
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
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.*/
|
||||||
|
|
||||||
|
/* This code is originally from Mark Borgerding's KISS-FFT but has been
|
||||||
|
heavily modified to better suit Opus */
|
||||||
|
|
||||||
|
#ifndef SKIP_CONFIG_H
|
||||||
|
# ifdef HAVE_CONFIG_H
|
||||||
|
# include "config.h"
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "_kiss_fft_guts.h"
|
||||||
|
#include "arch.h"
|
||||||
|
#include "os_support.h"
|
||||||
|
#include "mathops.h"
|
||||||
|
#include "stack_alloc.h"
|
||||||
|
#include "os_support.h"
|
||||||
|
|
||||||
|
/* The guts header contains all the multiplication and addition macros that are defined for
|
||||||
|
complex numbers. It also delares the kf_ internal functions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void kf_bfly2(
|
||||||
|
kiss_fft_cpx * Fout,
|
||||||
|
const size_t fstride,
|
||||||
|
const kiss_fft_state *st,
|
||||||
|
int m,
|
||||||
|
int N,
|
||||||
|
int mm
|
||||||
|
)
|
||||||
|
{
|
||||||
|
kiss_fft_cpx * Fout2;
|
||||||
|
const kiss_twiddle_cpx * tw1;
|
||||||
|
int i,j;
|
||||||
|
kiss_fft_cpx * Fout_beg = Fout;
|
||||||
|
for (i=0;i<N;i++)
|
||||||
|
{
|
||||||
|
Fout = Fout_beg + i*mm;
|
||||||
|
Fout2 = Fout + m;
|
||||||
|
tw1 = st->twiddles;
|
||||||
|
for(j=0;j<m;j++)
|
||||||
|
{
|
||||||
|
kiss_fft_cpx t;
|
||||||
|
Fout->r = SHR32(Fout->r, 1);Fout->i = SHR32(Fout->i, 1);
|
||||||
|
Fout2->r = SHR32(Fout2->r, 1);Fout2->i = SHR32(Fout2->i, 1);
|
||||||
|
C_MUL (t, *Fout2 , *tw1);
|
||||||
|
tw1 += fstride;
|
||||||
|
C_SUB( *Fout2 , *Fout , t );
|
||||||
|
C_ADDTO( *Fout , t );
|
||||||
|
++Fout2;
|
||||||
|
++Fout;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ki_bfly2(
|
||||||
|
kiss_fft_cpx * Fout,
|
||||||
|
const size_t fstride,
|
||||||
|
const kiss_fft_state *st,
|
||||||
|
int m,
|
||||||
|
int N,
|
||||||
|
int mm
|
||||||
|
)
|
||||||
|
{
|
||||||
|
kiss_fft_cpx * Fout2;
|
||||||
|
const kiss_twiddle_cpx * tw1;
|
||||||
|
kiss_fft_cpx t;
|
||||||
|
int i,j;
|
||||||
|
kiss_fft_cpx * Fout_beg = Fout;
|
||||||
|
for (i=0;i<N;i++)
|
||||||
|
{
|
||||||
|
Fout = Fout_beg + i*mm;
|
||||||
|
Fout2 = Fout + m;
|
||||||
|
tw1 = st->twiddles;
|
||||||
|
for(j=0;j<m;j++)
|
||||||
|
{
|
||||||
|
C_MULC (t, *Fout2 , *tw1);
|
||||||
|
tw1 += fstride;
|
||||||
|
C_SUB( *Fout2 , *Fout , t );
|
||||||
|
C_ADDTO( *Fout , t );
|
||||||
|
++Fout2;
|
||||||
|
++Fout;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void kf_bfly4(
|
||||||
|
kiss_fft_cpx * Fout,
|
||||||
|
const size_t fstride,
|
||||||
|
const kiss_fft_state *st,
|
||||||
|
int m,
|
||||||
|
int N,
|
||||||
|
int mm
|
||||||
|
)
|
||||||
|
{
|
||||||
|
const kiss_twiddle_cpx *tw1,*tw2,*tw3;
|
||||||
|
kiss_fft_cpx scratch[6];
|
||||||
|
const size_t m2=2*m;
|
||||||
|
const size_t m3=3*m;
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
kiss_fft_cpx * Fout_beg = Fout;
|
||||||
|
for (i=0;i<N;i++)
|
||||||
|
{
|
||||||
|
Fout = Fout_beg + i*mm;
|
||||||
|
tw3 = tw2 = tw1 = st->twiddles;
|
||||||
|
for (j=0;j<m;j++)
|
||||||
|
{
|
||||||
|
C_MUL4(scratch[0],Fout[m] , *tw1 );
|
||||||
|
C_MUL4(scratch[1],Fout[m2] , *tw2 );
|
||||||
|
C_MUL4(scratch[2],Fout[m3] , *tw3 );
|
||||||
|
|
||||||
|
Fout->r = PSHR32(Fout->r, 2);
|
||||||
|
Fout->i = PSHR32(Fout->i, 2);
|
||||||
|
C_SUB( scratch[5] , *Fout, scratch[1] );
|
||||||
|
C_ADDTO(*Fout, scratch[1]);
|
||||||
|
C_ADD( scratch[3] , scratch[0] , scratch[2] );
|
||||||
|
C_SUB( scratch[4] , scratch[0] , scratch[2] );
|
||||||
|
Fout[m2].r = PSHR32(Fout[m2].r, 2);
|
||||||
|
Fout[m2].i = PSHR32(Fout[m2].i, 2);
|
||||||
|
C_SUB( Fout[m2], *Fout, scratch[3] );
|
||||||
|
tw1 += fstride;
|
||||||
|
tw2 += fstride*2;
|
||||||
|
tw3 += fstride*3;
|
||||||
|
C_ADDTO( *Fout , scratch[3] );
|
||||||
|
|
||||||
|
Fout[m].r = scratch[5].r + scratch[4].i;
|
||||||
|
Fout[m].i = scratch[5].i - scratch[4].r;
|
||||||
|
Fout[m3].r = scratch[5].r - scratch[4].i;
|
||||||
|
Fout[m3].i = scratch[5].i + scratch[4].r;
|
||||||
|
++Fout;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ki_bfly4(
|
||||||
|
kiss_fft_cpx * Fout,
|
||||||
|
const size_t fstride,
|
||||||
|
const kiss_fft_state *st,
|
||||||
|
int m,
|
||||||
|
int N,
|
||||||
|
int mm
|
||||||
|
)
|
||||||
|
{
|
||||||
|
const kiss_twiddle_cpx *tw1,*tw2,*tw3;
|
||||||
|
kiss_fft_cpx scratch[6];
|
||||||
|
const size_t m2=2*m;
|
||||||
|
const size_t m3=3*m;
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
kiss_fft_cpx * Fout_beg = Fout;
|
||||||
|
for (i=0;i<N;i++)
|
||||||
|
{
|
||||||
|
Fout = Fout_beg + i*mm;
|
||||||
|
tw3 = tw2 = tw1 = st->twiddles;
|
||||||
|
for (j=0;j<m;j++)
|
||||||
|
{
|
||||||
|
C_MULC(scratch[0],Fout[m] , *tw1 );
|
||||||
|
C_MULC(scratch[1],Fout[m2] , *tw2 );
|
||||||
|
C_MULC(scratch[2],Fout[m3] , *tw3 );
|
||||||
|
|
||||||
|
C_SUB( scratch[5] , *Fout, scratch[1] );
|
||||||
|
C_ADDTO(*Fout, scratch[1]);
|
||||||
|
C_ADD( scratch[3] , scratch[0] , scratch[2] );
|
||||||
|
C_SUB( scratch[4] , scratch[0] , scratch[2] );
|
||||||
|
C_SUB( Fout[m2], *Fout, scratch[3] );
|
||||||
|
tw1 += fstride;
|
||||||
|
tw2 += fstride*2;
|
||||||
|
tw3 += fstride*3;
|
||||||
|
C_ADDTO( *Fout , scratch[3] );
|
||||||
|
|
||||||
|
Fout[m].r = scratch[5].r - scratch[4].i;
|
||||||
|
Fout[m].i = scratch[5].i + scratch[4].r;
|
||||||
|
Fout[m3].r = scratch[5].r + scratch[4].i;
|
||||||
|
Fout[m3].i = scratch[5].i - scratch[4].r;
|
||||||
|
++Fout;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef RADIX_TWO_ONLY
|
||||||
|
|
||||||
|
static void kf_bfly3(
|
||||||
|
kiss_fft_cpx * Fout,
|
||||||
|
const size_t fstride,
|
||||||
|
const kiss_fft_state *st,
|
||||||
|
int m,
|
||||||
|
int N,
|
||||||
|
int mm
|
||||||
|
)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
size_t k;
|
||||||
|
const size_t m2 = 2*m;
|
||||||
|
const kiss_twiddle_cpx *tw1,*tw2;
|
||||||
|
kiss_fft_cpx scratch[5];
|
||||||
|
kiss_twiddle_cpx epi3;
|
||||||
|
|
||||||
|
kiss_fft_cpx * Fout_beg = Fout;
|
||||||
|
epi3 = st->twiddles[fstride*m];
|
||||||
|
for (i=0;i<N;i++)
|
||||||
|
{
|
||||||
|
Fout = Fout_beg + i*mm;
|
||||||
|
tw1=tw2=st->twiddles;
|
||||||
|
k=m;
|
||||||
|
do {
|
||||||
|
C_FIXDIV(*Fout,3); C_FIXDIV(Fout[m],3); C_FIXDIV(Fout[m2],3);
|
||||||
|
|
||||||
|
C_MUL(scratch[1],Fout[m] , *tw1);
|
||||||
|
C_MUL(scratch[2],Fout[m2] , *tw2);
|
||||||
|
|
||||||
|
C_ADD(scratch[3],scratch[1],scratch[2]);
|
||||||
|
C_SUB(scratch[0],scratch[1],scratch[2]);
|
||||||
|
tw1 += fstride;
|
||||||
|
tw2 += fstride*2;
|
||||||
|
|
||||||
|
Fout[m].r = Fout->r - HALF_OF(scratch[3].r);
|
||||||
|
Fout[m].i = Fout->i - HALF_OF(scratch[3].i);
|
||||||
|
|
||||||
|
C_MULBYSCALAR( scratch[0] , epi3.i );
|
||||||
|
|
||||||
|
C_ADDTO(*Fout,scratch[3]);
|
||||||
|
|
||||||
|
Fout[m2].r = Fout[m].r + scratch[0].i;
|
||||||
|
Fout[m2].i = Fout[m].i - scratch[0].r;
|
||||||
|
|
||||||
|
Fout[m].r -= scratch[0].i;
|
||||||
|
Fout[m].i += scratch[0].r;
|
||||||
|
|
||||||
|
++Fout;
|
||||||
|
} while(--k);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ki_bfly3(
|
||||||
|
kiss_fft_cpx * Fout,
|
||||||
|
const size_t fstride,
|
||||||
|
const kiss_fft_state *st,
|
||||||
|
int m,
|
||||||
|
int N,
|
||||||
|
int mm
|
||||||
|
)
|
||||||
|
{
|
||||||
|
int i, k;
|
||||||
|
const size_t m2 = 2*m;
|
||||||
|
const kiss_twiddle_cpx *tw1,*tw2;
|
||||||
|
kiss_fft_cpx scratch[5];
|
||||||
|
kiss_twiddle_cpx epi3;
|
||||||
|
|
||||||
|
kiss_fft_cpx * Fout_beg = Fout;
|
||||||
|
epi3 = st->twiddles[fstride*m];
|
||||||
|
for (i=0;i<N;i++)
|
||||||
|
{
|
||||||
|
Fout = Fout_beg + i*mm;
|
||||||
|
tw1=tw2=st->twiddles;
|
||||||
|
k=m;
|
||||||
|
do{
|
||||||
|
|
||||||
|
C_MULC(scratch[1],Fout[m] , *tw1);
|
||||||
|
C_MULC(scratch[2],Fout[m2] , *tw2);
|
||||||
|
|
||||||
|
C_ADD(scratch[3],scratch[1],scratch[2]);
|
||||||
|
C_SUB(scratch[0],scratch[1],scratch[2]);
|
||||||
|
tw1 += fstride;
|
||||||
|
tw2 += fstride*2;
|
||||||
|
|
||||||
|
Fout[m].r = Fout->r - HALF_OF(scratch[3].r);
|
||||||
|
Fout[m].i = Fout->i - HALF_OF(scratch[3].i);
|
||||||
|
|
||||||
|
C_MULBYSCALAR( scratch[0] , -epi3.i );
|
||||||
|
|
||||||
|
C_ADDTO(*Fout,scratch[3]);
|
||||||
|
|
||||||
|
Fout[m2].r = Fout[m].r + scratch[0].i;
|
||||||
|
Fout[m2].i = Fout[m].i - scratch[0].r;
|
||||||
|
|
||||||
|
Fout[m].r -= scratch[0].i;
|
||||||
|
Fout[m].i += scratch[0].r;
|
||||||
|
|
||||||
|
++Fout;
|
||||||
|
}while(--k);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void kf_bfly5(
|
||||||
|
kiss_fft_cpx * Fout,
|
||||||
|
const size_t fstride,
|
||||||
|
const kiss_fft_state *st,
|
||||||
|
int m,
|
||||||
|
int N,
|
||||||
|
int mm
|
||||||
|
)
|
||||||
|
{
|
||||||
|
kiss_fft_cpx *Fout0,*Fout1,*Fout2,*Fout3,*Fout4;
|
||||||
|
int i, u;
|
||||||
|
kiss_fft_cpx scratch[13];
|
||||||
|
const kiss_twiddle_cpx * twiddles = st->twiddles;
|
||||||
|
const kiss_twiddle_cpx *tw;
|
||||||
|
kiss_twiddle_cpx ya,yb;
|
||||||
|
kiss_fft_cpx * Fout_beg = Fout;
|
||||||
|
|
||||||
|
ya = twiddles[fstride*m];
|
||||||
|
yb = twiddles[fstride*2*m];
|
||||||
|
tw=st->twiddles;
|
||||||
|
|
||||||
|
for (i=0;i<N;i++)
|
||||||
|
{
|
||||||
|
Fout = Fout_beg + i*mm;
|
||||||
|
Fout0=Fout;
|
||||||
|
Fout1=Fout0+m;
|
||||||
|
Fout2=Fout0+2*m;
|
||||||
|
Fout3=Fout0+3*m;
|
||||||
|
Fout4=Fout0+4*m;
|
||||||
|
|
||||||
|
for ( u=0; u<m; ++u ) {
|
||||||
|
C_FIXDIV( *Fout0,5); C_FIXDIV( *Fout1,5); C_FIXDIV( *Fout2,5); C_FIXDIV( *Fout3,5); C_FIXDIV( *Fout4,5);
|
||||||
|
scratch[0] = *Fout0;
|
||||||
|
|
||||||
|
C_MUL(scratch[1] ,*Fout1, tw[u*fstride]);
|
||||||
|
C_MUL(scratch[2] ,*Fout2, tw[2*u*fstride]);
|
||||||
|
C_MUL(scratch[3] ,*Fout3, tw[3*u*fstride]);
|
||||||
|
C_MUL(scratch[4] ,*Fout4, tw[4*u*fstride]);
|
||||||
|
|
||||||
|
C_ADD( scratch[7],scratch[1],scratch[4]);
|
||||||
|
C_SUB( scratch[10],scratch[1],scratch[4]);
|
||||||
|
C_ADD( scratch[8],scratch[2],scratch[3]);
|
||||||
|
C_SUB( scratch[9],scratch[2],scratch[3]);
|
||||||
|
|
||||||
|
Fout0->r += scratch[7].r + scratch[8].r;
|
||||||
|
Fout0->i += scratch[7].i + scratch[8].i;
|
||||||
|
|
||||||
|
scratch[5].r = scratch[0].r + S_MUL(scratch[7].r,ya.r) + S_MUL(scratch[8].r,yb.r);
|
||||||
|
scratch[5].i = scratch[0].i + S_MUL(scratch[7].i,ya.r) + S_MUL(scratch[8].i,yb.r);
|
||||||
|
|
||||||
|
scratch[6].r = S_MUL(scratch[10].i,ya.i) + S_MUL(scratch[9].i,yb.i);
|
||||||
|
scratch[6].i = -S_MUL(scratch[10].r,ya.i) - S_MUL(scratch[9].r,yb.i);
|
||||||
|
|
||||||
|
C_SUB(*Fout1,scratch[5],scratch[6]);
|
||||||
|
C_ADD(*Fout4,scratch[5],scratch[6]);
|
||||||
|
|
||||||
|
scratch[11].r = scratch[0].r + S_MUL(scratch[7].r,yb.r) + S_MUL(scratch[8].r,ya.r);
|
||||||
|
scratch[11].i = scratch[0].i + S_MUL(scratch[7].i,yb.r) + S_MUL(scratch[8].i,ya.r);
|
||||||
|
scratch[12].r = - S_MUL(scratch[10].i,yb.i) + S_MUL(scratch[9].i,ya.i);
|
||||||
|
scratch[12].i = S_MUL(scratch[10].r,yb.i) - S_MUL(scratch[9].r,ya.i);
|
||||||
|
|
||||||
|
C_ADD(*Fout2,scratch[11],scratch[12]);
|
||||||
|
C_SUB(*Fout3,scratch[11],scratch[12]);
|
||||||
|
|
||||||
|
++Fout0;++Fout1;++Fout2;++Fout3;++Fout4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ki_bfly5(
|
||||||
|
kiss_fft_cpx * Fout,
|
||||||
|
const size_t fstride,
|
||||||
|
const kiss_fft_state *st,
|
||||||
|
int m,
|
||||||
|
int N,
|
||||||
|
int mm
|
||||||
|
)
|
||||||
|
{
|
||||||
|
kiss_fft_cpx *Fout0,*Fout1,*Fout2,*Fout3,*Fout4;
|
||||||
|
int i, u;
|
||||||
|
kiss_fft_cpx scratch[13];
|
||||||
|
const kiss_twiddle_cpx * twiddles = st->twiddles;
|
||||||
|
const kiss_twiddle_cpx *tw;
|
||||||
|
kiss_twiddle_cpx ya,yb;
|
||||||
|
kiss_fft_cpx * Fout_beg = Fout;
|
||||||
|
|
||||||
|
ya = twiddles[fstride*m];
|
||||||
|
yb = twiddles[fstride*2*m];
|
||||||
|
tw=st->twiddles;
|
||||||
|
|
||||||
|
for (i=0;i<N;i++)
|
||||||
|
{
|
||||||
|
Fout = Fout_beg + i*mm;
|
||||||
|
Fout0=Fout;
|
||||||
|
Fout1=Fout0+m;
|
||||||
|
Fout2=Fout0+2*m;
|
||||||
|
Fout3=Fout0+3*m;
|
||||||
|
Fout4=Fout0+4*m;
|
||||||
|
|
||||||
|
for ( u=0; u<m; ++u ) {
|
||||||
|
scratch[0] = *Fout0;
|
||||||
|
|
||||||
|
C_MULC(scratch[1] ,*Fout1, tw[u*fstride]);
|
||||||
|
C_MULC(scratch[2] ,*Fout2, tw[2*u*fstride]);
|
||||||
|
C_MULC(scratch[3] ,*Fout3, tw[3*u*fstride]);
|
||||||
|
C_MULC(scratch[4] ,*Fout4, tw[4*u*fstride]);
|
||||||
|
|
||||||
|
C_ADD( scratch[7],scratch[1],scratch[4]);
|
||||||
|
C_SUB( scratch[10],scratch[1],scratch[4]);
|
||||||
|
C_ADD( scratch[8],scratch[2],scratch[3]);
|
||||||
|
C_SUB( scratch[9],scratch[2],scratch[3]);
|
||||||
|
|
||||||
|
Fout0->r += scratch[7].r + scratch[8].r;
|
||||||
|
Fout0->i += scratch[7].i + scratch[8].i;
|
||||||
|
|
||||||
|
scratch[5].r = scratch[0].r + S_MUL(scratch[7].r,ya.r) + S_MUL(scratch[8].r,yb.r);
|
||||||
|
scratch[5].i = scratch[0].i + S_MUL(scratch[7].i,ya.r) + S_MUL(scratch[8].i,yb.r);
|
||||||
|
|
||||||
|
scratch[6].r = -S_MUL(scratch[10].i,ya.i) - S_MUL(scratch[9].i,yb.i);
|
||||||
|
scratch[6].i = S_MUL(scratch[10].r,ya.i) + S_MUL(scratch[9].r,yb.i);
|
||||||
|
|
||||||
|
C_SUB(*Fout1,scratch[5],scratch[6]);
|
||||||
|
C_ADD(*Fout4,scratch[5],scratch[6]);
|
||||||
|
|
||||||
|
scratch[11].r = scratch[0].r + S_MUL(scratch[7].r,yb.r) + S_MUL(scratch[8].r,ya.r);
|
||||||
|
scratch[11].i = scratch[0].i + S_MUL(scratch[7].i,yb.r) + S_MUL(scratch[8].i,ya.r);
|
||||||
|
scratch[12].r = S_MUL(scratch[10].i,yb.i) - S_MUL(scratch[9].i,ya.i);
|
||||||
|
scratch[12].i = -S_MUL(scratch[10].r,yb.i) + S_MUL(scratch[9].r,ya.i);
|
||||||
|
|
||||||
|
C_ADD(*Fout2,scratch[11],scratch[12]);
|
||||||
|
C_SUB(*Fout3,scratch[11],scratch[12]);
|
||||||
|
|
||||||
|
++Fout0;++Fout1;++Fout2;++Fout3;++Fout4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef CUSTOM_MODES
|
||||||
|
|
||||||
|
static
|
||||||
|
void compute_bitrev_table(
|
||||||
|
int Fout,
|
||||||
|
opus_int16 *f,
|
||||||
|
const size_t fstride,
|
||||||
|
int in_stride,
|
||||||
|
opus_int16 * factors,
|
||||||
|
const kiss_fft_state *st
|
||||||
|
)
|
||||||
|
{
|
||||||
|
const int p=*factors++; /* the radix */
|
||||||
|
const int m=*factors++; /* stage's fft length/p */
|
||||||
|
|
||||||
|
/*printf ("fft %d %d %d %d %d %d\n", p*m, m, p, s2, fstride*in_stride, N);*/
|
||||||
|
if (m==1)
|
||||||
|
{
|
||||||
|
int j;
|
||||||
|
for (j=0;j<p;j++)
|
||||||
|
{
|
||||||
|
*f = Fout+j;
|
||||||
|
f += fstride*in_stride;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
int j;
|
||||||
|
for (j=0;j<p;j++)
|
||||||
|
{
|
||||||
|
compute_bitrev_table( Fout , f, fstride*p, in_stride, factors,st);
|
||||||
|
f += fstride*in_stride;
|
||||||
|
Fout += m;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* facbuf is populated by p1,m1,p2,m2, ...
|
||||||
|
where
|
||||||
|
p[i] * m[i] = m[i-1]
|
||||||
|
m0 = n */
|
||||||
|
static
|
||||||
|
int kf_factor(int n,opus_int16 * facbuf)
|
||||||
|
{
|
||||||
|
int p=4;
|
||||||
|
|
||||||
|
/*factor out powers of 4, powers of 2, then any remaining primes */
|
||||||
|
do {
|
||||||
|
while (n % p) {
|
||||||
|
switch (p) {
|
||||||
|
case 4: p = 2; break;
|
||||||
|
case 2: p = 3; break;
|
||||||
|
default: p += 2; break;
|
||||||
|
}
|
||||||
|
if (p>32000 || (opus_int32)p*(opus_int32)p > n)
|
||||||
|
p = n; /* no more factors, skip to end */
|
||||||
|
}
|
||||||
|
n /= p;
|
||||||
|
#ifdef RADIX_TWO_ONLY
|
||||||
|
if (p!=2 && p != 4)
|
||||||
|
#else
|
||||||
|
if (p>5)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
*facbuf++ = p;
|
||||||
|
*facbuf++ = n;
|
||||||
|
} while (n > 1);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void compute_twiddles(kiss_twiddle_cpx *twiddles, int nfft)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
for (i=0;i<nfft;++i) {
|
||||||
|
opus_val32 phase = -i;
|
||||||
|
kf_cexp2(twiddles+i, DIV32(SHL32(phase,17),nfft));
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
for (i=0;i<nfft;++i) {
|
||||||
|
const double pi=3.14159265358979323846264338327;
|
||||||
|
double phase = ( -2*pi /nfft ) * i;
|
||||||
|
kf_cexp(twiddles+i, phase );
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* Allocates all necessary storage space for the fft and ifft.
|
||||||
|
* The return value is a contiguous block of memory. As such,
|
||||||
|
* It can be freed with free().
|
||||||
|
* */
|
||||||
|
kiss_fft_state *opus_fft_alloc_twiddles(int nfft,void * mem,size_t * lenmem, const kiss_fft_state *base)
|
||||||
|
{
|
||||||
|
kiss_fft_state *st=NULL;
|
||||||
|
size_t memneeded = sizeof(struct kiss_fft_state); /* twiddle factors*/
|
||||||
|
|
||||||
|
if ( lenmem==NULL ) {
|
||||||
|
st = ( kiss_fft_state*)KISS_FFT_MALLOC( memneeded );
|
||||||
|
}else{
|
||||||
|
if (mem != NULL && *lenmem >= memneeded)
|
||||||
|
st = (kiss_fft_state*)mem;
|
||||||
|
*lenmem = memneeded;
|
||||||
|
}
|
||||||
|
if (st) {
|
||||||
|
opus_int16 *bitrev;
|
||||||
|
kiss_twiddle_cpx *twiddles;
|
||||||
|
|
||||||
|
st->nfft=nfft;
|
||||||
|
#ifndef FIXED_POINT
|
||||||
|
st->scale = 1.f/nfft;
|
||||||
|
#endif
|
||||||
|
if (base != NULL)
|
||||||
|
{
|
||||||
|
st->twiddles = base->twiddles;
|
||||||
|
st->shift = 0;
|
||||||
|
while (nfft<<st->shift != base->nfft && st->shift < 32)
|
||||||
|
st->shift++;
|
||||||
|
if (st->shift>=32)
|
||||||
|
goto fail;
|
||||||
|
} else {
|
||||||
|
st->twiddles = twiddles = (kiss_twiddle_cpx*)KISS_FFT_MALLOC(sizeof(kiss_twiddle_cpx)*nfft);
|
||||||
|
compute_twiddles(twiddles, nfft);
|
||||||
|
st->shift = -1;
|
||||||
|
}
|
||||||
|
if (!kf_factor(nfft,st->factors))
|
||||||
|
{
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* bitrev */
|
||||||
|
st->bitrev = bitrev = (opus_int16*)KISS_FFT_MALLOC(sizeof(opus_int16)*nfft);
|
||||||
|
if (st->bitrev==NULL)
|
||||||
|
goto fail;
|
||||||
|
compute_bitrev_table(0, bitrev, 1,1, st->factors,st);
|
||||||
|
}
|
||||||
|
return st;
|
||||||
|
fail:
|
||||||
|
opus_fft_free(st);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
kiss_fft_state *opus_fft_alloc(int nfft,void * mem,size_t * lenmem )
|
||||||
|
{
|
||||||
|
return opus_fft_alloc_twiddles(nfft, mem, lenmem, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void opus_fft_free(const kiss_fft_state *cfg)
|
||||||
|
{
|
||||||
|
if (cfg)
|
||||||
|
{
|
||||||
|
opus_free((opus_int16*)cfg->bitrev);
|
||||||
|
if (cfg->shift < 0)
|
||||||
|
opus_free((kiss_twiddle_cpx*)cfg->twiddles);
|
||||||
|
opus_free((kiss_fft_state*)cfg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* CUSTOM_MODES */
|
||||||
|
|
||||||
|
void opus_fft(const kiss_fft_state *st,const kiss_fft_cpx *fin,kiss_fft_cpx *fout)
|
||||||
|
{
|
||||||
|
int m2, m;
|
||||||
|
int p;
|
||||||
|
int L;
|
||||||
|
int fstride[MAXFACTORS];
|
||||||
|
int i;
|
||||||
|
int shift;
|
||||||
|
|
||||||
|
/* st->shift can be -1 */
|
||||||
|
shift = st->shift>0 ? st->shift : 0;
|
||||||
|
|
||||||
|
celt_assert2 (fin != fout, "In-place FFT not supported");
|
||||||
|
/* Bit-reverse the input */
|
||||||
|
for (i=0;i<st->nfft;i++)
|
||||||
|
{
|
||||||
|
fout[st->bitrev[i]] = fin[i];
|
||||||
|
#ifndef FIXED_POINT
|
||||||
|
fout[st->bitrev[i]].r *= st->scale;
|
||||||
|
fout[st->bitrev[i]].i *= st->scale;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
fstride[0] = 1;
|
||||||
|
L=0;
|
||||||
|
do {
|
||||||
|
p = st->factors[2*L];
|
||||||
|
m = st->factors[2*L+1];
|
||||||
|
fstride[L+1] = fstride[L]*p;
|
||||||
|
L++;
|
||||||
|
} while(m!=1);
|
||||||
|
m = st->factors[2*L-1];
|
||||||
|
for (i=L-1;i>=0;i--)
|
||||||
|
{
|
||||||
|
if (i!=0)
|
||||||
|
m2 = st->factors[2*i-1];
|
||||||
|
else
|
||||||
|
m2 = 1;
|
||||||
|
switch (st->factors[2*i])
|
||||||
|
{
|
||||||
|
case 2:
|
||||||
|
kf_bfly2(fout,fstride[i]<<shift,st,m, fstride[i], m2);
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
kf_bfly4(fout,fstride[i]<<shift,st,m, fstride[i], m2);
|
||||||
|
break;
|
||||||
|
#ifndef RADIX_TWO_ONLY
|
||||||
|
case 3:
|
||||||
|
kf_bfly3(fout,fstride[i]<<shift,st,m, fstride[i], m2);
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
kf_bfly5(fout,fstride[i]<<shift,st,m, fstride[i], m2);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
m = m2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void opus_ifft(const kiss_fft_state *st,const kiss_fft_cpx *fin,kiss_fft_cpx *fout)
|
||||||
|
{
|
||||||
|
int m2, m;
|
||||||
|
int p;
|
||||||
|
int L;
|
||||||
|
int fstride[MAXFACTORS];
|
||||||
|
int i;
|
||||||
|
int shift;
|
||||||
|
|
||||||
|
/* st->shift can be -1 */
|
||||||
|
shift = st->shift>0 ? st->shift : 0;
|
||||||
|
celt_assert2 (fin != fout, "In-place FFT not supported");
|
||||||
|
/* Bit-reverse the input */
|
||||||
|
for (i=0;i<st->nfft;i++)
|
||||||
|
fout[st->bitrev[i]] = fin[i];
|
||||||
|
|
||||||
|
fstride[0] = 1;
|
||||||
|
L=0;
|
||||||
|
do {
|
||||||
|
p = st->factors[2*L];
|
||||||
|
m = st->factors[2*L+1];
|
||||||
|
fstride[L+1] = fstride[L]*p;
|
||||||
|
L++;
|
||||||
|
} while(m!=1);
|
||||||
|
m = st->factors[2*L-1];
|
||||||
|
for (i=L-1;i>=0;i--)
|
||||||
|
{
|
||||||
|
if (i!=0)
|
||||||
|
m2 = st->factors[2*i-1];
|
||||||
|
else
|
||||||
|
m2 = 1;
|
||||||
|
switch (st->factors[2*i])
|
||||||
|
{
|
||||||
|
case 2:
|
||||||
|
ki_bfly2(fout,fstride[i]<<shift,st,m, fstride[i], m2);
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
ki_bfly4(fout,fstride[i]<<shift,st,m, fstride[i], m2);
|
||||||
|
break;
|
||||||
|
#ifndef RADIX_TWO_ONLY
|
||||||
|
case 3:
|
||||||
|
ki_bfly3(fout,fstride[i]<<shift,st,m, fstride[i], m2);
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
ki_bfly5(fout,fstride[i]<<shift,st,m, fstride[i], m2);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
m = m2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
139
Frameworks/Opus/Opus/opus/celt/kiss_fft.h
Normal file
139
Frameworks/Opus/Opus/opus/celt/kiss_fft.h
Normal file
|
@ -0,0 +1,139 @@
|
||||||
|
/*Copyright (c) 2003-2004, Mark Borgerding
|
||||||
|
Lots of modifications by Jean-Marc Valin
|
||||||
|
Copyright (c) 2005-2007, Xiph.Org Foundation
|
||||||
|
Copyright (c) 2008, Xiph.Org Foundation, CSIRO
|
||||||
|
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
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.*/
|
||||||
|
|
||||||
|
#ifndef KISS_FFT_H
|
||||||
|
#define KISS_FFT_H
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include "arch.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef USE_SIMD
|
||||||
|
# include <xmmintrin.h>
|
||||||
|
# define kiss_fft_scalar __m128
|
||||||
|
#define KISS_FFT_MALLOC(nbytes) memalign(16,nbytes)
|
||||||
|
#else
|
||||||
|
#define KISS_FFT_MALLOC opus_alloc
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
#include "arch.h"
|
||||||
|
|
||||||
|
# define kiss_fft_scalar opus_int32
|
||||||
|
# define kiss_twiddle_scalar opus_int16
|
||||||
|
|
||||||
|
|
||||||
|
#else
|
||||||
|
# ifndef kiss_fft_scalar
|
||||||
|
/* default is float */
|
||||||
|
# define kiss_fft_scalar float
|
||||||
|
# define kiss_twiddle_scalar float
|
||||||
|
# define KF_SUFFIX _celt_single
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
kiss_fft_scalar r;
|
||||||
|
kiss_fft_scalar i;
|
||||||
|
}kiss_fft_cpx;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
kiss_twiddle_scalar r;
|
||||||
|
kiss_twiddle_scalar i;
|
||||||
|
}kiss_twiddle_cpx;
|
||||||
|
|
||||||
|
#define MAXFACTORS 8
|
||||||
|
/* e.g. an fft of length 128 has 4 factors
|
||||||
|
as far as kissfft is concerned
|
||||||
|
4*4*4*2
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef struct kiss_fft_state{
|
||||||
|
int nfft;
|
||||||
|
#ifndef FIXED_POINT
|
||||||
|
kiss_fft_scalar scale;
|
||||||
|
#endif
|
||||||
|
int shift;
|
||||||
|
opus_int16 factors[2*MAXFACTORS];
|
||||||
|
const opus_int16 *bitrev;
|
||||||
|
const kiss_twiddle_cpx *twiddles;
|
||||||
|
} kiss_fft_state;
|
||||||
|
|
||||||
|
/*typedef struct kiss_fft_state* kiss_fft_cfg;*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* opus_fft_alloc
|
||||||
|
*
|
||||||
|
* Initialize a FFT (or IFFT) algorithm's cfg/state buffer.
|
||||||
|
*
|
||||||
|
* typical usage: kiss_fft_cfg mycfg=opus_fft_alloc(1024,0,NULL,NULL);
|
||||||
|
*
|
||||||
|
* The return value from fft_alloc is a cfg buffer used internally
|
||||||
|
* by the fft routine or NULL.
|
||||||
|
*
|
||||||
|
* If lenmem is NULL, then opus_fft_alloc will allocate a cfg buffer using malloc.
|
||||||
|
* The returned value should be free()d when done to avoid memory leaks.
|
||||||
|
*
|
||||||
|
* The state can be placed in a user supplied buffer 'mem':
|
||||||
|
* If lenmem is not NULL and mem is not NULL and *lenmem is large enough,
|
||||||
|
* then the function places the cfg in mem and the size used in *lenmem
|
||||||
|
* and returns mem.
|
||||||
|
*
|
||||||
|
* If lenmem is not NULL and ( mem is NULL or *lenmem is not large enough),
|
||||||
|
* then the function returns NULL and places the minimum cfg
|
||||||
|
* buffer size in *lenmem.
|
||||||
|
* */
|
||||||
|
|
||||||
|
kiss_fft_state *opus_fft_alloc_twiddles(int nfft,void * mem,size_t * lenmem, const kiss_fft_state *base);
|
||||||
|
|
||||||
|
kiss_fft_state *opus_fft_alloc(int nfft,void * mem,size_t * lenmem);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* opus_fft(cfg,in_out_buf)
|
||||||
|
*
|
||||||
|
* Perform an FFT on a complex input buffer.
|
||||||
|
* for a forward FFT,
|
||||||
|
* fin should be f[0] , f[1] , ... ,f[nfft-1]
|
||||||
|
* fout will be F[0] , F[1] , ... ,F[nfft-1]
|
||||||
|
* Note that each element is complex and can be accessed like
|
||||||
|
f[k].r and f[k].i
|
||||||
|
* */
|
||||||
|
void opus_fft(const kiss_fft_state *cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout);
|
||||||
|
void opus_ifft(const kiss_fft_state *cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout);
|
||||||
|
|
||||||
|
void opus_fft_free(const kiss_fft_state *cfg);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
134
Frameworks/Opus/Opus/opus/celt/laplace.c
Normal file
134
Frameworks/Opus/Opus/opus/celt/laplace.c
Normal file
|
@ -0,0 +1,134 @@
|
||||||
|
/* Copyright (c) 2007 CSIRO
|
||||||
|
Copyright (c) 2007-2009 Xiph.Org Foundation
|
||||||
|
Written by Jean-Marc Valin */
|
||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "laplace.h"
|
||||||
|
#include "mathops.h"
|
||||||
|
|
||||||
|
/* The minimum probability of an energy delta (out of 32768). */
|
||||||
|
#define LAPLACE_LOG_MINP (0)
|
||||||
|
#define LAPLACE_MINP (1<<LAPLACE_LOG_MINP)
|
||||||
|
/* The minimum number of guaranteed representable energy deltas (in one
|
||||||
|
direction). */
|
||||||
|
#define LAPLACE_NMIN (16)
|
||||||
|
|
||||||
|
/* When called, decay is positive and at most 11456. */
|
||||||
|
static unsigned ec_laplace_get_freq1(unsigned fs0, int decay)
|
||||||
|
{
|
||||||
|
unsigned ft;
|
||||||
|
ft = 32768 - LAPLACE_MINP*(2*LAPLACE_NMIN) - fs0;
|
||||||
|
return ft*(opus_int32)(16384-decay)>>15;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ec_laplace_encode(ec_enc *enc, int *value, unsigned fs, int decay)
|
||||||
|
{
|
||||||
|
unsigned fl;
|
||||||
|
int val = *value;
|
||||||
|
fl = 0;
|
||||||
|
if (val)
|
||||||
|
{
|
||||||
|
int s;
|
||||||
|
int i;
|
||||||
|
s = -(val<0);
|
||||||
|
val = (val+s)^s;
|
||||||
|
fl = fs;
|
||||||
|
fs = ec_laplace_get_freq1(fs, decay);
|
||||||
|
/* Search the decaying part of the PDF.*/
|
||||||
|
for (i=1; fs > 0 && i < val; i++)
|
||||||
|
{
|
||||||
|
fs *= 2;
|
||||||
|
fl += fs+2*LAPLACE_MINP;
|
||||||
|
fs = (fs*(opus_int32)decay)>>15;
|
||||||
|
}
|
||||||
|
/* Everything beyond that has probability LAPLACE_MINP. */
|
||||||
|
if (!fs)
|
||||||
|
{
|
||||||
|
int di;
|
||||||
|
int ndi_max;
|
||||||
|
ndi_max = (32768-fl+LAPLACE_MINP-1)>>LAPLACE_LOG_MINP;
|
||||||
|
ndi_max = (ndi_max-s)>>1;
|
||||||
|
di = IMIN(val - i, ndi_max - 1);
|
||||||
|
fl += (2*di+1+s)*LAPLACE_MINP;
|
||||||
|
fs = IMIN(LAPLACE_MINP, 32768-fl);
|
||||||
|
*value = (i+di+s)^s;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fs += LAPLACE_MINP;
|
||||||
|
fl += fs&~s;
|
||||||
|
}
|
||||||
|
celt_assert(fl+fs<=32768);
|
||||||
|
celt_assert(fs>0);
|
||||||
|
}
|
||||||
|
ec_encode_bin(enc, fl, fl+fs, 15);
|
||||||
|
}
|
||||||
|
|
||||||
|
int ec_laplace_decode(ec_dec *dec, unsigned fs, int decay)
|
||||||
|
{
|
||||||
|
int val=0;
|
||||||
|
unsigned fl;
|
||||||
|
unsigned fm;
|
||||||
|
fm = ec_decode_bin(dec, 15);
|
||||||
|
fl = 0;
|
||||||
|
if (fm >= fs)
|
||||||
|
{
|
||||||
|
val++;
|
||||||
|
fl = fs;
|
||||||
|
fs = ec_laplace_get_freq1(fs, decay)+LAPLACE_MINP;
|
||||||
|
/* Search the decaying part of the PDF.*/
|
||||||
|
while(fs > LAPLACE_MINP && fm >= fl+2*fs)
|
||||||
|
{
|
||||||
|
fs *= 2;
|
||||||
|
fl += fs;
|
||||||
|
fs = ((fs-2*LAPLACE_MINP)*(opus_int32)decay)>>15;
|
||||||
|
fs += LAPLACE_MINP;
|
||||||
|
val++;
|
||||||
|
}
|
||||||
|
/* Everything beyond that has probability LAPLACE_MINP. */
|
||||||
|
if (fs <= LAPLACE_MINP)
|
||||||
|
{
|
||||||
|
int di;
|
||||||
|
di = (fm-fl)>>(LAPLACE_LOG_MINP+1);
|
||||||
|
val += di;
|
||||||
|
fl += 2*di*LAPLACE_MINP;
|
||||||
|
}
|
||||||
|
if (fm < fl+fs)
|
||||||
|
val = -val;
|
||||||
|
else
|
||||||
|
fl += fs;
|
||||||
|
}
|
||||||
|
celt_assert(fl<32768);
|
||||||
|
celt_assert(fs>0);
|
||||||
|
celt_assert(fl<=fm);
|
||||||
|
celt_assert(fm<IMIN(fl+fs,32768));
|
||||||
|
ec_dec_update(dec, fl, IMIN(fl+fs,32768), 32768);
|
||||||
|
return val;
|
||||||
|
}
|
48
Frameworks/Opus/Opus/opus/celt/laplace.h
Normal file
48
Frameworks/Opus/Opus/opus/celt/laplace.h
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
/* Copyright (c) 2007 CSIRO
|
||||||
|
Copyright (c) 2007-2009 Xiph.Org Foundation
|
||||||
|
Written by Jean-Marc Valin */
|
||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "entenc.h"
|
||||||
|
#include "entdec.h"
|
||||||
|
|
||||||
|
/** Encode a value that is assumed to be the realisation of a
|
||||||
|
Laplace-distributed random process
|
||||||
|
@param enc Entropy encoder state
|
||||||
|
@param value Value to encode
|
||||||
|
@param fs Probability of 0, multiplied by 32768
|
||||||
|
@param decay Probability of the value +/- 1, multiplied by 16384
|
||||||
|
*/
|
||||||
|
void ec_laplace_encode(ec_enc *enc, int *value, unsigned fs, int decay);
|
||||||
|
|
||||||
|
/** Decode a value that is assumed to be the realisation of a
|
||||||
|
Laplace-distributed random process
|
||||||
|
@param dec Entropy decoder state
|
||||||
|
@param fs Probability of 0, multiplied by 32768
|
||||||
|
@param decay Probability of the value +/- 1, multiplied by 16384
|
||||||
|
@return Value decoded
|
||||||
|
*/
|
||||||
|
int ec_laplace_decode(ec_dec *dec, unsigned fs, int decay);
|
206
Frameworks/Opus/Opus/opus/celt/mathops.c
Normal file
206
Frameworks/Opus/Opus/opus/celt/mathops.c
Normal file
|
@ -0,0 +1,206 @@
|
||||||
|
/* Copyright (c) 2002-2008 Jean-Marc Valin
|
||||||
|
Copyright (c) 2007-2008 CSIRO
|
||||||
|
Copyright (c) 2007-2009 Xiph.Org Foundation
|
||||||
|
Written by Jean-Marc Valin */
|
||||||
|
/**
|
||||||
|
@file mathops.h
|
||||||
|
@brief Various math functions
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "mathops.h"
|
||||||
|
|
||||||
|
/*Compute floor(sqrt(_val)) with exact arithmetic.
|
||||||
|
This has been tested on all possible 32-bit inputs.*/
|
||||||
|
unsigned isqrt32(opus_uint32 _val){
|
||||||
|
unsigned b;
|
||||||
|
unsigned g;
|
||||||
|
int bshift;
|
||||||
|
/*Uses the second method from
|
||||||
|
http://www.azillionmonkeys.com/qed/sqroot.html
|
||||||
|
The main idea is to search for the largest binary digit b such that
|
||||||
|
(g+b)*(g+b) <= _val, and add it to the solution g.*/
|
||||||
|
g=0;
|
||||||
|
bshift=(EC_ILOG(_val)-1)>>1;
|
||||||
|
b=1U<<bshift;
|
||||||
|
do{
|
||||||
|
opus_uint32 t;
|
||||||
|
t=(((opus_uint32)g<<1)+b)<<bshift;
|
||||||
|
if(t<=_val){
|
||||||
|
g+=b;
|
||||||
|
_val-=t;
|
||||||
|
}
|
||||||
|
b>>=1;
|
||||||
|
bshift--;
|
||||||
|
}
|
||||||
|
while(bshift>=0);
|
||||||
|
return g;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
|
||||||
|
opus_val32 frac_div32(opus_val32 a, opus_val32 b)
|
||||||
|
{
|
||||||
|
opus_val16 rcp;
|
||||||
|
opus_val32 result, rem;
|
||||||
|
int shift = celt_ilog2(b)-29;
|
||||||
|
a = VSHR32(a,shift);
|
||||||
|
b = VSHR32(b,shift);
|
||||||
|
/* 16-bit reciprocal */
|
||||||
|
rcp = ROUND16(celt_rcp(ROUND16(b,16)),3);
|
||||||
|
result = MULT16_32_Q15(rcp, a);
|
||||||
|
rem = PSHR32(a,2)-MULT32_32_Q31(result, b);
|
||||||
|
result = ADD32(result, SHL32(MULT16_32_Q15(rcp, rem),2));
|
||||||
|
if (result >= 536870912) /* 2^29 */
|
||||||
|
return 2147483647; /* 2^31 - 1 */
|
||||||
|
else if (result <= -536870912) /* -2^29 */
|
||||||
|
return -2147483647; /* -2^31 */
|
||||||
|
else
|
||||||
|
return SHL32(result, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Reciprocal sqrt approximation in the range [0.25,1) (Q16 in, Q14 out) */
|
||||||
|
opus_val16 celt_rsqrt_norm(opus_val32 x)
|
||||||
|
{
|
||||||
|
opus_val16 n;
|
||||||
|
opus_val16 r;
|
||||||
|
opus_val16 r2;
|
||||||
|
opus_val16 y;
|
||||||
|
/* Range of n is [-16384,32767] ([-0.5,1) in Q15). */
|
||||||
|
n = x-32768;
|
||||||
|
/* Get a rough initial guess for the root.
|
||||||
|
The optimal minimax quadratic approximation (using relative error) is
|
||||||
|
r = 1.437799046117536+n*(-0.823394375837328+n*0.4096419668459485).
|
||||||
|
Coefficients here, and the final result r, are Q14.*/
|
||||||
|
r = ADD16(23557, MULT16_16_Q15(n, ADD16(-13490, MULT16_16_Q15(n, 6713))));
|
||||||
|
/* We want y = x*r*r-1 in Q15, but x is 32-bit Q16 and r is Q14.
|
||||||
|
We can compute the result from n and r using Q15 multiplies with some
|
||||||
|
adjustment, carefully done to avoid overflow.
|
||||||
|
Range of y is [-1564,1594]. */
|
||||||
|
r2 = MULT16_16_Q15(r, r);
|
||||||
|
y = SHL16(SUB16(ADD16(MULT16_16_Q15(r2, n), r2), 16384), 1);
|
||||||
|
/* Apply a 2nd-order Householder iteration: r += r*y*(y*0.375-0.5).
|
||||||
|
This yields the Q14 reciprocal square root of the Q16 x, with a maximum
|
||||||
|
relative error of 1.04956E-4, a (relative) RMSE of 2.80979E-5, and a
|
||||||
|
peak absolute error of 2.26591/16384. */
|
||||||
|
return ADD16(r, MULT16_16_Q15(r, MULT16_16_Q15(y,
|
||||||
|
SUB16(MULT16_16_Q15(y, 12288), 16384))));
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Sqrt approximation (QX input, QX/2 output) */
|
||||||
|
opus_val32 celt_sqrt(opus_val32 x)
|
||||||
|
{
|
||||||
|
int k;
|
||||||
|
opus_val16 n;
|
||||||
|
opus_val32 rt;
|
||||||
|
static const opus_val16 C[5] = {23175, 11561, -3011, 1699, -664};
|
||||||
|
if (x==0)
|
||||||
|
return 0;
|
||||||
|
k = (celt_ilog2(x)>>1)-7;
|
||||||
|
x = VSHR32(x, 2*k);
|
||||||
|
n = x-32768;
|
||||||
|
rt = ADD16(C[0], MULT16_16_Q15(n, ADD16(C[1], MULT16_16_Q15(n, ADD16(C[2],
|
||||||
|
MULT16_16_Q15(n, ADD16(C[3], MULT16_16_Q15(n, (C[4])))))))));
|
||||||
|
rt = VSHR32(rt,7-k);
|
||||||
|
return rt;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define L1 32767
|
||||||
|
#define L2 -7651
|
||||||
|
#define L3 8277
|
||||||
|
#define L4 -626
|
||||||
|
|
||||||
|
static inline opus_val16 _celt_cos_pi_2(opus_val16 x)
|
||||||
|
{
|
||||||
|
opus_val16 x2;
|
||||||
|
|
||||||
|
x2 = MULT16_16_P15(x,x);
|
||||||
|
return ADD16(1,MIN16(32766,ADD32(SUB16(L1,x2), MULT16_16_P15(x2, ADD32(L2, MULT16_16_P15(x2, ADD32(L3, MULT16_16_P15(L4, x2
|
||||||
|
))))))));
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef L1
|
||||||
|
#undef L2
|
||||||
|
#undef L3
|
||||||
|
#undef L4
|
||||||
|
|
||||||
|
opus_val16 celt_cos_norm(opus_val32 x)
|
||||||
|
{
|
||||||
|
x = x&0x0001ffff;
|
||||||
|
if (x>SHL32(EXTEND32(1), 16))
|
||||||
|
x = SUB32(SHL32(EXTEND32(1), 17),x);
|
||||||
|
if (x&0x00007fff)
|
||||||
|
{
|
||||||
|
if (x<SHL32(EXTEND32(1), 15))
|
||||||
|
{
|
||||||
|
return _celt_cos_pi_2(EXTRACT16(x));
|
||||||
|
} else {
|
||||||
|
return NEG32(_celt_cos_pi_2(EXTRACT16(65536-x)));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (x&0x0000ffff)
|
||||||
|
return 0;
|
||||||
|
else if (x&0x0001ffff)
|
||||||
|
return -32767;
|
||||||
|
else
|
||||||
|
return 32767;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Reciprocal approximation (Q15 input, Q16 output) */
|
||||||
|
opus_val32 celt_rcp(opus_val32 x)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
opus_val16 n;
|
||||||
|
opus_val16 r;
|
||||||
|
celt_assert2(x>0, "celt_rcp() only defined for positive values");
|
||||||
|
i = celt_ilog2(x);
|
||||||
|
/* n is Q15 with range [0,1). */
|
||||||
|
n = VSHR32(x,i-15)-32768;
|
||||||
|
/* Start with a linear approximation:
|
||||||
|
r = 1.8823529411764706-0.9411764705882353*n.
|
||||||
|
The coefficients and the result are Q14 in the range [15420,30840].*/
|
||||||
|
r = ADD16(30840, MULT16_16_Q15(-15420, n));
|
||||||
|
/* Perform two Newton iterations:
|
||||||
|
r -= r*((r*n)-1.Q15)
|
||||||
|
= r*((r*n)+(r-1.Q15)). */
|
||||||
|
r = SUB16(r, MULT16_16_Q15(r,
|
||||||
|
ADD16(MULT16_16_Q15(r, n), ADD16(r, -32768))));
|
||||||
|
/* We subtract an extra 1 in the second iteration to avoid overflow; it also
|
||||||
|
neatly compensates for truncation error in the rest of the process. */
|
||||||
|
r = SUB16(r, ADD16(1, MULT16_16_Q15(r,
|
||||||
|
ADD16(MULT16_16_Q15(r, n), ADD16(r, -32768)))));
|
||||||
|
/* r is now the Q15 solution to 2/(n+1), with a maximum relative error
|
||||||
|
of 7.05346E-5, a (relative) RMSE of 2.14418E-5, and a peak absolute
|
||||||
|
error of 1.24665/32768. */
|
||||||
|
return VSHR32(EXTEND32(r),i-16);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
241
Frameworks/Opus/Opus/opus/celt/mathops.h
Normal file
241
Frameworks/Opus/Opus/opus/celt/mathops.h
Normal file
|
@ -0,0 +1,241 @@
|
||||||
|
/* Copyright (c) 2002-2008 Jean-Marc Valin
|
||||||
|
Copyright (c) 2007-2008 CSIRO
|
||||||
|
Copyright (c) 2007-2009 Xiph.Org Foundation
|
||||||
|
Written by Jean-Marc Valin */
|
||||||
|
/**
|
||||||
|
@file mathops.h
|
||||||
|
@brief Various math functions
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef MATHOPS_H
|
||||||
|
#define MATHOPS_H
|
||||||
|
|
||||||
|
#include "arch.h"
|
||||||
|
#include "entcode.h"
|
||||||
|
#include "os_support.h"
|
||||||
|
|
||||||
|
/* Multiplies two 16-bit fractional values. Bit-exactness of this macro is important */
|
||||||
|
#define FRAC_MUL16(a,b) ((16384+((opus_int32)(opus_int16)(a)*(opus_int16)(b)))>>15)
|
||||||
|
|
||||||
|
unsigned isqrt32(opus_uint32 _val);
|
||||||
|
|
||||||
|
#ifndef FIXED_POINT
|
||||||
|
|
||||||
|
#define PI 3.141592653f
|
||||||
|
#define celt_sqrt(x) ((float)sqrt(x))
|
||||||
|
#define celt_rsqrt(x) (1.f/celt_sqrt(x))
|
||||||
|
#define celt_rsqrt_norm(x) (celt_rsqrt(x))
|
||||||
|
#define celt_cos_norm(x) ((float)cos((.5f*PI)*(x)))
|
||||||
|
#define celt_rcp(x) (1.f/(x))
|
||||||
|
#define celt_div(a,b) ((a)/(b))
|
||||||
|
#define frac_div32(a,b) ((float)(a)/(b))
|
||||||
|
|
||||||
|
#ifdef FLOAT_APPROX
|
||||||
|
|
||||||
|
/* Note: This assumes radix-2 floating point with the exponent at bits 23..30 and an offset of 127
|
||||||
|
denorm, +/- inf and NaN are *not* handled */
|
||||||
|
|
||||||
|
/** Base-2 log approximation (log2(x)). */
|
||||||
|
static inline float celt_log2(float x)
|
||||||
|
{
|
||||||
|
int integer;
|
||||||
|
float frac;
|
||||||
|
union {
|
||||||
|
float f;
|
||||||
|
opus_uint32 i;
|
||||||
|
} in;
|
||||||
|
in.f = x;
|
||||||
|
integer = (in.i>>23)-127;
|
||||||
|
in.i -= integer<<23;
|
||||||
|
frac = in.f - 1.5f;
|
||||||
|
frac = -0.41445418f + frac*(0.95909232f
|
||||||
|
+ frac*(-0.33951290f + frac*0.16541097f));
|
||||||
|
return 1+integer+frac;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Base-2 exponential approximation (2^x). */
|
||||||
|
static inline float celt_exp2(float x)
|
||||||
|
{
|
||||||
|
int integer;
|
||||||
|
float frac;
|
||||||
|
union {
|
||||||
|
float f;
|
||||||
|
opus_uint32 i;
|
||||||
|
} res;
|
||||||
|
integer = floor(x);
|
||||||
|
if (integer < -50)
|
||||||
|
return 0;
|
||||||
|
frac = x-integer;
|
||||||
|
/* K0 = 1, K1 = log(2), K2 = 3-4*log(2), K3 = 3*log(2) - 2 */
|
||||||
|
res.f = 0.99992522f + frac * (0.69583354f
|
||||||
|
+ frac * (0.22606716f + 0.078024523f*frac));
|
||||||
|
res.i = (res.i + (integer<<23)) & 0x7fffffff;
|
||||||
|
return res.f;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
#define celt_log2(x) ((float)(1.442695040888963387*log(x)))
|
||||||
|
#define celt_exp2(x) ((float)exp(0.6931471805599453094*(x)))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
|
||||||
|
#include "os_support.h"
|
||||||
|
|
||||||
|
#ifndef OVERRIDE_CELT_ILOG2
|
||||||
|
/** Integer log in base2. Undefined for zero and negative numbers */
|
||||||
|
static inline opus_int16 celt_ilog2(opus_int32 x)
|
||||||
|
{
|
||||||
|
celt_assert2(x>0, "celt_ilog2() only defined for strictly positive numbers");
|
||||||
|
return EC_ILOG(x)-1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef OVERRIDE_CELT_MAXABS16
|
||||||
|
static inline opus_val32 celt_maxabs16(const opus_val16 *x, int len)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
opus_val16 maxval = 0;
|
||||||
|
opus_val16 minval = 0;
|
||||||
|
for (i=0;i<len;i++)
|
||||||
|
{
|
||||||
|
maxval = MAX16(maxval, x[i]);
|
||||||
|
minval = MIN16(minval, x[i]);
|
||||||
|
}
|
||||||
|
return MAX32(EXTEND32(maxval),-EXTEND32(minval));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef OVERRIDE_CELT_MAXABS32
|
||||||
|
static inline opus_val32 celt_maxabs32(opus_val32 *x, int len)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
opus_val32 maxval = 0;
|
||||||
|
for (i=0;i<len;i++)
|
||||||
|
maxval = MAX32(maxval, ABS32(x[i]));
|
||||||
|
return maxval;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** Integer log in base2. Defined for zero, but not for negative numbers */
|
||||||
|
static inline opus_int16 celt_zlog2(opus_val32 x)
|
||||||
|
{
|
||||||
|
return x <= 0 ? 0 : celt_ilog2(x);
|
||||||
|
}
|
||||||
|
|
||||||
|
opus_val16 celt_rsqrt_norm(opus_val32 x);
|
||||||
|
|
||||||
|
opus_val32 celt_sqrt(opus_val32 x);
|
||||||
|
|
||||||
|
opus_val16 celt_cos_norm(opus_val32 x);
|
||||||
|
|
||||||
|
static inline opus_val16 celt_log2(opus_val32 x)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
opus_val16 n, frac;
|
||||||
|
/* -0.41509302963303146, 0.9609890551383969, -0.31836011537636605,
|
||||||
|
0.15530808010959576, -0.08556153059057618 */
|
||||||
|
static const opus_val16 C[5] = {-6801+(1<<(13-DB_SHIFT)), 15746, -5217, 2545, -1401};
|
||||||
|
if (x==0)
|
||||||
|
return -32767;
|
||||||
|
i = celt_ilog2(x);
|
||||||
|
n = VSHR32(x,i-15)-32768-16384;
|
||||||
|
frac = ADD16(C[0], MULT16_16_Q15(n, ADD16(C[1], MULT16_16_Q15(n, ADD16(C[2], MULT16_16_Q15(n, ADD16(C[3], MULT16_16_Q15(n, C[4]))))))));
|
||||||
|
return SHL16(i-13,DB_SHIFT)+SHR16(frac,14-DB_SHIFT);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
K0 = 1
|
||||||
|
K1 = log(2)
|
||||||
|
K2 = 3-4*log(2)
|
||||||
|
K3 = 3*log(2) - 2
|
||||||
|
*/
|
||||||
|
#define D0 16383
|
||||||
|
#define D1 22804
|
||||||
|
#define D2 14819
|
||||||
|
#define D3 10204
|
||||||
|
/** Base-2 exponential approximation (2^x). (Q10 input, Q16 output) */
|
||||||
|
static inline opus_val32 celt_exp2(opus_val16 x)
|
||||||
|
{
|
||||||
|
int integer;
|
||||||
|
opus_val16 frac;
|
||||||
|
integer = SHR16(x,10);
|
||||||
|
if (integer>14)
|
||||||
|
return 0x7f000000;
|
||||||
|
else if (integer < -15)
|
||||||
|
return 0;
|
||||||
|
frac = SHL16(x-SHL16(integer,10),4);
|
||||||
|
frac = ADD16(D0, MULT16_16_Q15(frac, ADD16(D1, MULT16_16_Q15(frac, ADD16(D2 , MULT16_16_Q15(D3,frac))))));
|
||||||
|
return VSHR32(EXTEND32(frac), -integer-2);
|
||||||
|
}
|
||||||
|
|
||||||
|
opus_val32 celt_rcp(opus_val32 x);
|
||||||
|
|
||||||
|
#define celt_div(a,b) MULT32_32_Q31((opus_val32)(a),celt_rcp(b))
|
||||||
|
|
||||||
|
opus_val32 frac_div32(opus_val32 a, opus_val32 b);
|
||||||
|
|
||||||
|
#define M1 32767
|
||||||
|
#define M2 -21
|
||||||
|
#define M3 -11943
|
||||||
|
#define M4 4936
|
||||||
|
|
||||||
|
/* Atan approximation using a 4th order polynomial. Input is in Q15 format
|
||||||
|
and normalized by pi/4. Output is in Q15 format */
|
||||||
|
static inline opus_val16 celt_atan01(opus_val16 x)
|
||||||
|
{
|
||||||
|
return MULT16_16_P15(x, ADD32(M1, MULT16_16_P15(x, ADD32(M2, MULT16_16_P15(x, ADD32(M3, MULT16_16_P15(M4, x)))))));
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef M1
|
||||||
|
#undef M2
|
||||||
|
#undef M3
|
||||||
|
#undef M4
|
||||||
|
|
||||||
|
/* atan2() approximation valid for positive input values */
|
||||||
|
static inline opus_val16 celt_atan2p(opus_val16 y, opus_val16 x)
|
||||||
|
{
|
||||||
|
if (y < x)
|
||||||
|
{
|
||||||
|
opus_val32 arg;
|
||||||
|
arg = celt_div(SHL32(EXTEND32(y),15),x);
|
||||||
|
if (arg >= 32767)
|
||||||
|
arg = 32767;
|
||||||
|
return SHR16(celt_atan01(EXTRACT16(arg)),1);
|
||||||
|
} else {
|
||||||
|
opus_val32 arg;
|
||||||
|
arg = celt_div(SHL32(EXTEND32(x),15),y);
|
||||||
|
if (arg >= 32767)
|
||||||
|
arg = 32767;
|
||||||
|
return 25736-SHR16(celt_atan01(EXTRACT16(arg)),1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* FIXED_POINT */
|
||||||
|
#endif /* MATHOPS_H */
|
332
Frameworks/Opus/Opus/opus/celt/mdct.c
Normal file
332
Frameworks/Opus/Opus/opus/celt/mdct.c
Normal file
|
@ -0,0 +1,332 @@
|
||||||
|
/* Copyright (c) 2007-2008 CSIRO
|
||||||
|
Copyright (c) 2007-2008 Xiph.Org Foundation
|
||||||
|
Written by Jean-Marc Valin */
|
||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* This is a simple MDCT implementation that uses a N/4 complex FFT
|
||||||
|
to do most of the work. It should be relatively straightforward to
|
||||||
|
plug in pretty much and FFT here.
|
||||||
|
|
||||||
|
This replaces the Vorbis FFT (and uses the exact same API), which
|
||||||
|
was a bit too messy and that was ending up duplicating code
|
||||||
|
(might as well use the same FFT everywhere).
|
||||||
|
|
||||||
|
The algorithm is similar to (and inspired from) Fabrice Bellard's
|
||||||
|
MDCT implementation in FFMPEG, but has differences in signs, ordering
|
||||||
|
and scaling in many places.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SKIP_CONFIG_H
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "mdct.h"
|
||||||
|
#include "kiss_fft.h"
|
||||||
|
#include "_kiss_fft_guts.h"
|
||||||
|
#include <math.h>
|
||||||
|
#include "os_support.h"
|
||||||
|
#include "mathops.h"
|
||||||
|
#include "stack_alloc.h"
|
||||||
|
|
||||||
|
#ifdef CUSTOM_MODES
|
||||||
|
|
||||||
|
int clt_mdct_init(mdct_lookup *l,int N, int maxshift)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int N4;
|
||||||
|
kiss_twiddle_scalar *trig;
|
||||||
|
#if defined(FIXED_POINT)
|
||||||
|
int N2=N>>1;
|
||||||
|
#endif
|
||||||
|
l->n = N;
|
||||||
|
N4 = N>>2;
|
||||||
|
l->maxshift = maxshift;
|
||||||
|
for (i=0;i<=maxshift;i++)
|
||||||
|
{
|
||||||
|
if (i==0)
|
||||||
|
l->kfft[i] = opus_fft_alloc(N>>2>>i, 0, 0);
|
||||||
|
else
|
||||||
|
l->kfft[i] = opus_fft_alloc_twiddles(N>>2>>i, 0, 0, l->kfft[0]);
|
||||||
|
#ifndef ENABLE_TI_DSPLIB55
|
||||||
|
if (l->kfft[i]==NULL)
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
l->trig = trig = (kiss_twiddle_scalar*)opus_alloc((N4+1)*sizeof(kiss_twiddle_scalar));
|
||||||
|
if (l->trig==NULL)
|
||||||
|
return 0;
|
||||||
|
/* We have enough points that sine isn't necessary */
|
||||||
|
#if defined(FIXED_POINT)
|
||||||
|
for (i=0;i<=N4;i++)
|
||||||
|
trig[i] = TRIG_UPSCALE*celt_cos_norm(DIV32(ADD32(SHL32(EXTEND32(i),17),N2),N));
|
||||||
|
#else
|
||||||
|
for (i=0;i<=N4;i++)
|
||||||
|
trig[i] = (kiss_twiddle_scalar)cos(2*PI*i/N);
|
||||||
|
#endif
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void clt_mdct_clear(mdct_lookup *l)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i=0;i<=l->maxshift;i++)
|
||||||
|
opus_fft_free(l->kfft[i]);
|
||||||
|
opus_free((kiss_twiddle_scalar*)l->trig);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* CUSTOM_MODES */
|
||||||
|
|
||||||
|
/* Forward MDCT trashes the input array */
|
||||||
|
void clt_mdct_forward(const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_scalar * OPUS_RESTRICT out,
|
||||||
|
const opus_val16 *window, int overlap, int shift, int stride)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int N, N2, N4;
|
||||||
|
kiss_twiddle_scalar sine;
|
||||||
|
VARDECL(kiss_fft_scalar, f);
|
||||||
|
SAVE_STACK;
|
||||||
|
N = l->n;
|
||||||
|
N >>= shift;
|
||||||
|
N2 = N>>1;
|
||||||
|
N4 = N>>2;
|
||||||
|
ALLOC(f, N2, kiss_fft_scalar);
|
||||||
|
/* sin(x) ~= x here */
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
sine = TRIG_UPSCALE*(QCONST16(0.7853981f, 15)+N2)/N;
|
||||||
|
#else
|
||||||
|
sine = (kiss_twiddle_scalar)2*PI*(.125f)/N;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Consider the input to be composed of four blocks: [a, b, c, d] */
|
||||||
|
/* Window, shuffle, fold */
|
||||||
|
{
|
||||||
|
/* Temp pointers to make it really clear to the compiler what we're doing */
|
||||||
|
const kiss_fft_scalar * OPUS_RESTRICT xp1 = in+(overlap>>1);
|
||||||
|
const kiss_fft_scalar * OPUS_RESTRICT xp2 = in+N2-1+(overlap>>1);
|
||||||
|
kiss_fft_scalar * OPUS_RESTRICT yp = f;
|
||||||
|
const opus_val16 * OPUS_RESTRICT wp1 = window+(overlap>>1);
|
||||||
|
const opus_val16 * OPUS_RESTRICT wp2 = window+(overlap>>1)-1;
|
||||||
|
for(i=0;i<(overlap>>2);i++)
|
||||||
|
{
|
||||||
|
/* Real part arranged as -d-cR, Imag part arranged as -b+aR*/
|
||||||
|
*yp++ = MULT16_32_Q15(*wp2, xp1[N2]) + MULT16_32_Q15(*wp1,*xp2);
|
||||||
|
*yp++ = MULT16_32_Q15(*wp1, *xp1) - MULT16_32_Q15(*wp2, xp2[-N2]);
|
||||||
|
xp1+=2;
|
||||||
|
xp2-=2;
|
||||||
|
wp1+=2;
|
||||||
|
wp2-=2;
|
||||||
|
}
|
||||||
|
wp1 = window;
|
||||||
|
wp2 = window+overlap-1;
|
||||||
|
for(;i<N4-(overlap>>2);i++)
|
||||||
|
{
|
||||||
|
/* Real part arranged as a-bR, Imag part arranged as -c-dR */
|
||||||
|
*yp++ = *xp2;
|
||||||
|
*yp++ = *xp1;
|
||||||
|
xp1+=2;
|
||||||
|
xp2-=2;
|
||||||
|
}
|
||||||
|
for(;i<N4;i++)
|
||||||
|
{
|
||||||
|
/* Real part arranged as a-bR, Imag part arranged as -c-dR */
|
||||||
|
*yp++ = -MULT16_32_Q15(*wp1, xp1[-N2]) + MULT16_32_Q15(*wp2, *xp2);
|
||||||
|
*yp++ = MULT16_32_Q15(*wp2, *xp1) + MULT16_32_Q15(*wp1, xp2[N2]);
|
||||||
|
xp1+=2;
|
||||||
|
xp2-=2;
|
||||||
|
wp1+=2;
|
||||||
|
wp2-=2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Pre-rotation */
|
||||||
|
{
|
||||||
|
kiss_fft_scalar * OPUS_RESTRICT yp = f;
|
||||||
|
const kiss_twiddle_scalar *t = &l->trig[0];
|
||||||
|
for(i=0;i<N4;i++)
|
||||||
|
{
|
||||||
|
kiss_fft_scalar re, im, yr, yi;
|
||||||
|
re = yp[0];
|
||||||
|
im = yp[1];
|
||||||
|
yr = -S_MUL(re,t[i<<shift]) - S_MUL(im,t[(N4-i)<<shift]);
|
||||||
|
yi = -S_MUL(im,t[i<<shift]) + S_MUL(re,t[(N4-i)<<shift]);
|
||||||
|
/* works because the cos is nearly one */
|
||||||
|
*yp++ = yr + S_MUL(yi,sine);
|
||||||
|
*yp++ = yi - S_MUL(yr,sine);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* N/4 complex FFT, down-scales by 4/N */
|
||||||
|
opus_fft(l->kfft[shift], (kiss_fft_cpx *)f, (kiss_fft_cpx *)in);
|
||||||
|
|
||||||
|
/* Post-rotate */
|
||||||
|
{
|
||||||
|
/* Temp pointers to make it really clear to the compiler what we're doing */
|
||||||
|
const kiss_fft_scalar * OPUS_RESTRICT fp = in;
|
||||||
|
kiss_fft_scalar * OPUS_RESTRICT yp1 = out;
|
||||||
|
kiss_fft_scalar * OPUS_RESTRICT yp2 = out+stride*(N2-1);
|
||||||
|
const kiss_twiddle_scalar *t = &l->trig[0];
|
||||||
|
/* Temp pointers to make it really clear to the compiler what we're doing */
|
||||||
|
for(i=0;i<N4;i++)
|
||||||
|
{
|
||||||
|
kiss_fft_scalar yr, yi;
|
||||||
|
yr = S_MUL(fp[1],t[(N4-i)<<shift]) + S_MUL(fp[0],t[i<<shift]);
|
||||||
|
yi = S_MUL(fp[0],t[(N4-i)<<shift]) - S_MUL(fp[1],t[i<<shift]);
|
||||||
|
/* works because the cos is nearly one */
|
||||||
|
*yp1 = yr - S_MUL(yi,sine);
|
||||||
|
*yp2 = yi + S_MUL(yr,sine);;
|
||||||
|
fp += 2;
|
||||||
|
yp1 += 2*stride;
|
||||||
|
yp2 -= 2*stride;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
RESTORE_STACK;
|
||||||
|
}
|
||||||
|
|
||||||
|
void clt_mdct_backward(const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_scalar * OPUS_RESTRICT out,
|
||||||
|
const opus_val16 * OPUS_RESTRICT window, int overlap, int shift, int stride)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int N, N2, N4;
|
||||||
|
kiss_twiddle_scalar sine;
|
||||||
|
VARDECL(kiss_fft_scalar, f);
|
||||||
|
VARDECL(kiss_fft_scalar, f2);
|
||||||
|
SAVE_STACK;
|
||||||
|
N = l->n;
|
||||||
|
N >>= shift;
|
||||||
|
N2 = N>>1;
|
||||||
|
N4 = N>>2;
|
||||||
|
ALLOC(f, N2, kiss_fft_scalar);
|
||||||
|
ALLOC(f2, N2, kiss_fft_scalar);
|
||||||
|
/* sin(x) ~= x here */
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
sine = TRIG_UPSCALE*(QCONST16(0.7853981f, 15)+N2)/N;
|
||||||
|
#else
|
||||||
|
sine = (kiss_twiddle_scalar)2*PI*(.125f)/N;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Pre-rotate */
|
||||||
|
{
|
||||||
|
/* Temp pointers to make it really clear to the compiler what we're doing */
|
||||||
|
const kiss_fft_scalar * OPUS_RESTRICT xp1 = in;
|
||||||
|
const kiss_fft_scalar * OPUS_RESTRICT xp2 = in+stride*(N2-1);
|
||||||
|
kiss_fft_scalar * OPUS_RESTRICT yp = f2;
|
||||||
|
const kiss_twiddle_scalar *t = &l->trig[0];
|
||||||
|
for(i=0;i<N4;i++)
|
||||||
|
{
|
||||||
|
kiss_fft_scalar yr, yi;
|
||||||
|
yr = -S_MUL(*xp2, t[i<<shift]) + S_MUL(*xp1,t[(N4-i)<<shift]);
|
||||||
|
yi = -S_MUL(*xp2, t[(N4-i)<<shift]) - S_MUL(*xp1,t[i<<shift]);
|
||||||
|
/* works because the cos is nearly one */
|
||||||
|
*yp++ = yr - S_MUL(yi,sine);
|
||||||
|
*yp++ = yi + S_MUL(yr,sine);
|
||||||
|
xp1+=2*stride;
|
||||||
|
xp2-=2*stride;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Inverse N/4 complex FFT. This one should *not* downscale even in fixed-point */
|
||||||
|
opus_ifft(l->kfft[shift], (kiss_fft_cpx *)f2, (kiss_fft_cpx *)f);
|
||||||
|
|
||||||
|
/* Post-rotate */
|
||||||
|
{
|
||||||
|
kiss_fft_scalar * OPUS_RESTRICT fp = f;
|
||||||
|
const kiss_twiddle_scalar *t = &l->trig[0];
|
||||||
|
|
||||||
|
for(i=0;i<N4;i++)
|
||||||
|
{
|
||||||
|
kiss_fft_scalar re, im, yr, yi;
|
||||||
|
re = fp[0];
|
||||||
|
im = fp[1];
|
||||||
|
/* We'd scale up by 2 here, but instead it's done when mixing the windows */
|
||||||
|
yr = S_MUL(re,t[i<<shift]) - S_MUL(im,t[(N4-i)<<shift]);
|
||||||
|
yi = S_MUL(im,t[i<<shift]) + S_MUL(re,t[(N4-i)<<shift]);
|
||||||
|
/* works because the cos is nearly one */
|
||||||
|
*fp++ = yr - S_MUL(yi,sine);
|
||||||
|
*fp++ = yi + S_MUL(yr,sine);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* De-shuffle the components for the middle of the window only */
|
||||||
|
{
|
||||||
|
const kiss_fft_scalar * OPUS_RESTRICT fp1 = f;
|
||||||
|
const kiss_fft_scalar * OPUS_RESTRICT fp2 = f+N2-1;
|
||||||
|
kiss_fft_scalar * OPUS_RESTRICT yp = f2;
|
||||||
|
for(i = 0; i < N4; i++)
|
||||||
|
{
|
||||||
|
*yp++ =-*fp1;
|
||||||
|
*yp++ = *fp2;
|
||||||
|
fp1 += 2;
|
||||||
|
fp2 -= 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
out -= (N2-overlap)>>1;
|
||||||
|
/* Mirror on both sides for TDAC */
|
||||||
|
{
|
||||||
|
kiss_fft_scalar * OPUS_RESTRICT fp1 = f2+N4-1;
|
||||||
|
kiss_fft_scalar * OPUS_RESTRICT xp1 = out+N2-1;
|
||||||
|
kiss_fft_scalar * OPUS_RESTRICT yp1 = out+N4-overlap/2;
|
||||||
|
const opus_val16 * OPUS_RESTRICT wp1 = window;
|
||||||
|
const opus_val16 * OPUS_RESTRICT wp2 = window+overlap-1;
|
||||||
|
for(i = 0; i< N4-overlap/2; i++)
|
||||||
|
{
|
||||||
|
*xp1 = *fp1;
|
||||||
|
xp1--;
|
||||||
|
fp1--;
|
||||||
|
}
|
||||||
|
for(; i < N4; i++)
|
||||||
|
{
|
||||||
|
kiss_fft_scalar x1;
|
||||||
|
x1 = *fp1--;
|
||||||
|
*yp1++ +=-MULT16_32_Q15(*wp1, x1);
|
||||||
|
*xp1-- += MULT16_32_Q15(*wp2, x1);
|
||||||
|
wp1++;
|
||||||
|
wp2--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{
|
||||||
|
kiss_fft_scalar * OPUS_RESTRICT fp2 = f2+N4;
|
||||||
|
kiss_fft_scalar * OPUS_RESTRICT xp2 = out+N2;
|
||||||
|
kiss_fft_scalar * OPUS_RESTRICT yp2 = out+N-1-(N4-overlap/2);
|
||||||
|
const opus_val16 * OPUS_RESTRICT wp1 = window;
|
||||||
|
const opus_val16 * OPUS_RESTRICT wp2 = window+overlap-1;
|
||||||
|
for(i = 0; i< N4-overlap/2; i++)
|
||||||
|
{
|
||||||
|
*xp2 = *fp2;
|
||||||
|
xp2++;
|
||||||
|
fp2++;
|
||||||
|
}
|
||||||
|
for(; i < N4; i++)
|
||||||
|
{
|
||||||
|
kiss_fft_scalar x2;
|
||||||
|
x2 = *fp2++;
|
||||||
|
*yp2-- = MULT16_32_Q15(*wp1, x2);
|
||||||
|
*xp2++ = MULT16_32_Q15(*wp2, x2);
|
||||||
|
wp1++;
|
||||||
|
wp2--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
RESTORE_STACK;
|
||||||
|
}
|
70
Frameworks/Opus/Opus/opus/celt/mdct.h
Normal file
70
Frameworks/Opus/Opus/opus/celt/mdct.h
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
/* Copyright (c) 2007-2008 CSIRO
|
||||||
|
Copyright (c) 2007-2008 Xiph.Org Foundation
|
||||||
|
Written by Jean-Marc Valin */
|
||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* This is a simple MDCT implementation that uses a N/4 complex FFT
|
||||||
|
to do most of the work. It should be relatively straightforward to
|
||||||
|
plug in pretty much and FFT here.
|
||||||
|
|
||||||
|
This replaces the Vorbis FFT (and uses the exact same API), which
|
||||||
|
was a bit too messy and that was ending up duplicating code
|
||||||
|
(might as well use the same FFT everywhere).
|
||||||
|
|
||||||
|
The algorithm is similar to (and inspired from) Fabrice Bellard's
|
||||||
|
MDCT implementation in FFMPEG, but has differences in signs, ordering
|
||||||
|
and scaling in many places.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef MDCT_H
|
||||||
|
#define MDCT_H
|
||||||
|
|
||||||
|
#include "opus_defines.h"
|
||||||
|
#include "kiss_fft.h"
|
||||||
|
#include "arch.h"
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int n;
|
||||||
|
int maxshift;
|
||||||
|
const kiss_fft_state *kfft[4];
|
||||||
|
const kiss_twiddle_scalar * OPUS_RESTRICT trig;
|
||||||
|
} mdct_lookup;
|
||||||
|
|
||||||
|
int clt_mdct_init(mdct_lookup *l,int N, int maxshift);
|
||||||
|
void clt_mdct_clear(mdct_lookup *l);
|
||||||
|
|
||||||
|
/** Compute a forward MDCT and scale by 4/N, trashes the input array */
|
||||||
|
void clt_mdct_forward(const mdct_lookup *l, kiss_fft_scalar *in,
|
||||||
|
kiss_fft_scalar * OPUS_RESTRICT out,
|
||||||
|
const opus_val16 *window, int overlap, int shift, int stride);
|
||||||
|
|
||||||
|
/** Compute a backward MDCT (no scaling) and performs weighted overlap-add
|
||||||
|
(scales implicitly by 1/2) */
|
||||||
|
void clt_mdct_backward(const mdct_lookup *l, kiss_fft_scalar *in,
|
||||||
|
kiss_fft_scalar * OPUS_RESTRICT out,
|
||||||
|
const opus_val16 * OPUS_RESTRICT window, int overlap, int shift, int stride);
|
||||||
|
|
||||||
|
#endif
|
48
Frameworks/Opus/Opus/opus/celt/mfrngcod.h
Normal file
48
Frameworks/Opus/Opus/opus/celt/mfrngcod.h
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
/* Copyright (c) 2001-2008 Timothy B. Terriberry
|
||||||
|
Copyright (c) 2008-2009 Xiph.Org Foundation */
|
||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if !defined(_mfrngcode_H)
|
||||||
|
# define _mfrngcode_H (1)
|
||||||
|
# include "entcode.h"
|
||||||
|
|
||||||
|
/*Constants used by the entropy encoder/decoder.*/
|
||||||
|
|
||||||
|
/*The number of bits to output at a time.*/
|
||||||
|
# define EC_SYM_BITS (8)
|
||||||
|
/*The total number of bits in each of the state registers.*/
|
||||||
|
# define EC_CODE_BITS (32)
|
||||||
|
/*The maximum symbol value.*/
|
||||||
|
# define EC_SYM_MAX ((1U<<EC_SYM_BITS)-1)
|
||||||
|
/*Bits to shift by to move a symbol into the high-order position.*/
|
||||||
|
# define EC_CODE_SHIFT (EC_CODE_BITS-EC_SYM_BITS-1)
|
||||||
|
/*Carry bit of the high-order range symbol.*/
|
||||||
|
# define EC_CODE_TOP (((opus_uint32)1U)<<(EC_CODE_BITS-1))
|
||||||
|
/*Low-order bit of the high-order range symbol.*/
|
||||||
|
# define EC_CODE_BOT (EC_CODE_TOP>>EC_SYM_BITS)
|
||||||
|
/*The number of bits available for the last, partial symbol in the code field.*/
|
||||||
|
# define EC_CODE_EXTRA ((EC_CODE_BITS-2)%EC_SYM_BITS+1)
|
||||||
|
#endif
|
430
Frameworks/Opus/Opus/opus/celt/modes.c
Normal file
430
Frameworks/Opus/Opus/opus/celt/modes.c
Normal file
|
@ -0,0 +1,430 @@
|
||||||
|
/* Copyright (c) 2007-2008 CSIRO
|
||||||
|
Copyright (c) 2007-2009 Xiph.Org Foundation
|
||||||
|
Copyright (c) 2008 Gregory Maxwell
|
||||||
|
Written by Jean-Marc Valin and Gregory Maxwell */
|
||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "celt.h"
|
||||||
|
#include "modes.h"
|
||||||
|
#include "rate.h"
|
||||||
|
#include "os_support.h"
|
||||||
|
#include "stack_alloc.h"
|
||||||
|
#include "quant_bands.h"
|
||||||
|
|
||||||
|
static const opus_int16 eband5ms[] = {
|
||||||
|
/*0 200 400 600 800 1k 1.2 1.4 1.6 2k 2.4 2.8 3.2 4k 4.8 5.6 6.8 8k 9.6 12k 15.6 */
|
||||||
|
0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 34, 40, 48, 60, 78, 100
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Alternate tuning (partially derived from Vorbis) */
|
||||||
|
#define BITALLOC_SIZE 11
|
||||||
|
/* Bit allocation table in units of 1/32 bit/sample (0.1875 dB SNR) */
|
||||||
|
static const unsigned char band_allocation[] = {
|
||||||
|
/*0 200 400 600 800 1k 1.2 1.4 1.6 2k 2.4 2.8 3.2 4k 4.8 5.6 6.8 8k 9.6 12k 15.6 */
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
90, 80, 75, 69, 63, 56, 49, 40, 34, 29, 20, 18, 10, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
110,100, 90, 84, 78, 71, 65, 58, 51, 45, 39, 32, 26, 20, 12, 0, 0, 0, 0, 0, 0,
|
||||||
|
118,110,103, 93, 86, 80, 75, 70, 65, 59, 53, 47, 40, 31, 23, 15, 4, 0, 0, 0, 0,
|
||||||
|
126,119,112,104, 95, 89, 83, 78, 72, 66, 60, 54, 47, 39, 32, 25, 17, 12, 1, 0, 0,
|
||||||
|
134,127,120,114,103, 97, 91, 85, 78, 72, 66, 60, 54, 47, 41, 35, 29, 23, 16, 10, 1,
|
||||||
|
144,137,130,124,113,107,101, 95, 88, 82, 76, 70, 64, 57, 51, 45, 39, 33, 26, 15, 1,
|
||||||
|
152,145,138,132,123,117,111,105, 98, 92, 86, 80, 74, 67, 61, 55, 49, 43, 36, 20, 1,
|
||||||
|
162,155,148,142,133,127,121,115,108,102, 96, 90, 84, 77, 71, 65, 59, 53, 46, 30, 1,
|
||||||
|
172,165,158,152,143,137,131,125,118,112,106,100, 94, 87, 81, 75, 69, 63, 56, 45, 20,
|
||||||
|
200,200,200,200,200,200,200,200,198,193,188,183,178,173,168,163,158,153,148,129,104,
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifndef CUSTOM_MODES_ONLY
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
#include "static_modes_fixed.h"
|
||||||
|
#else
|
||||||
|
#include "static_modes_float.h"
|
||||||
|
#endif
|
||||||
|
#endif /* CUSTOM_MODES_ONLY */
|
||||||
|
|
||||||
|
#ifndef M_PI
|
||||||
|
#define M_PI 3.141592653
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CUSTOM_MODES
|
||||||
|
|
||||||
|
/* Defining 25 critical bands for the full 0-20 kHz audio bandwidth
|
||||||
|
Taken from http://ccrma.stanford.edu/~jos/bbt/Bark_Frequency_Scale.html */
|
||||||
|
#define BARK_BANDS 25
|
||||||
|
static const opus_int16 bark_freq[BARK_BANDS+1] = {
|
||||||
|
0, 100, 200, 300, 400,
|
||||||
|
510, 630, 770, 920, 1080,
|
||||||
|
1270, 1480, 1720, 2000, 2320,
|
||||||
|
2700, 3150, 3700, 4400, 5300,
|
||||||
|
6400, 7700, 9500, 12000, 15500,
|
||||||
|
20000};
|
||||||
|
|
||||||
|
static opus_int16 *compute_ebands(opus_int32 Fs, int frame_size, int res, int *nbEBands)
|
||||||
|
{
|
||||||
|
opus_int16 *eBands;
|
||||||
|
int i, j, lin, low, high, nBark, offset=0;
|
||||||
|
|
||||||
|
/* All modes that have 2.5 ms short blocks use the same definition */
|
||||||
|
if (Fs == 400*(opus_int32)frame_size)
|
||||||
|
{
|
||||||
|
*nbEBands = sizeof(eband5ms)/sizeof(eband5ms[0])-1;
|
||||||
|
eBands = opus_alloc(sizeof(opus_int16)*(*nbEBands+1));
|
||||||
|
for (i=0;i<*nbEBands+1;i++)
|
||||||
|
eBands[i] = eband5ms[i];
|
||||||
|
return eBands;
|
||||||
|
}
|
||||||
|
/* Find the number of critical bands supported by our sampling rate */
|
||||||
|
for (nBark=1;nBark<BARK_BANDS;nBark++)
|
||||||
|
if (bark_freq[nBark+1]*2 >= Fs)
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* Find where the linear part ends (i.e. where the spacing is more than min_width */
|
||||||
|
for (lin=0;lin<nBark;lin++)
|
||||||
|
if (bark_freq[lin+1]-bark_freq[lin] >= res)
|
||||||
|
break;
|
||||||
|
|
||||||
|
low = (bark_freq[lin]+res/2)/res;
|
||||||
|
high = nBark-lin;
|
||||||
|
*nbEBands = low+high;
|
||||||
|
eBands = opus_alloc(sizeof(opus_int16)*(*nbEBands+2));
|
||||||
|
|
||||||
|
if (eBands==NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
/* Linear spacing (min_width) */
|
||||||
|
for (i=0;i<low;i++)
|
||||||
|
eBands[i] = i;
|
||||||
|
if (low>0)
|
||||||
|
offset = eBands[low-1]*res - bark_freq[lin-1];
|
||||||
|
/* Spacing follows critical bands */
|
||||||
|
for (i=0;i<high;i++)
|
||||||
|
{
|
||||||
|
int target = bark_freq[lin+i];
|
||||||
|
/* Round to an even value */
|
||||||
|
eBands[i+low] = (target+offset/2+res)/(2*res)*2;
|
||||||
|
offset = eBands[i+low]*res - target;
|
||||||
|
}
|
||||||
|
/* Enforce the minimum spacing at the boundary */
|
||||||
|
for (i=0;i<*nbEBands;i++)
|
||||||
|
if (eBands[i] < i)
|
||||||
|
eBands[i] = i;
|
||||||
|
/* Round to an even value */
|
||||||
|
eBands[*nbEBands] = (bark_freq[nBark]+res)/(2*res)*2;
|
||||||
|
if (eBands[*nbEBands] > frame_size)
|
||||||
|
eBands[*nbEBands] = frame_size;
|
||||||
|
for (i=1;i<*nbEBands-1;i++)
|
||||||
|
{
|
||||||
|
if (eBands[i+1]-eBands[i] < eBands[i]-eBands[i-1])
|
||||||
|
{
|
||||||
|
eBands[i] -= (2*eBands[i]-eBands[i-1]-eBands[i+1])/2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Remove any empty bands. */
|
||||||
|
for (i=j=0;i<*nbEBands;i++)
|
||||||
|
if(eBands[i+1]>eBands[j])
|
||||||
|
eBands[++j]=eBands[i+1];
|
||||||
|
*nbEBands=j;
|
||||||
|
|
||||||
|
for (i=1;i<*nbEBands;i++)
|
||||||
|
{
|
||||||
|
/* Every band must be smaller than the last band. */
|
||||||
|
celt_assert(eBands[i]-eBands[i-1]<=eBands[*nbEBands]-eBands[*nbEBands-1]);
|
||||||
|
/* Each band must be no larger than twice the size of the previous one. */
|
||||||
|
celt_assert(eBands[i+1]-eBands[i]<=2*(eBands[i]-eBands[i-1]));
|
||||||
|
}
|
||||||
|
|
||||||
|
return eBands;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void compute_allocation_table(CELTMode *mode)
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
unsigned char *allocVectors;
|
||||||
|
int maxBands = sizeof(eband5ms)/sizeof(eband5ms[0])-1;
|
||||||
|
|
||||||
|
mode->nbAllocVectors = BITALLOC_SIZE;
|
||||||
|
allocVectors = opus_alloc(sizeof(unsigned char)*(BITALLOC_SIZE*mode->nbEBands));
|
||||||
|
if (allocVectors==NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* Check for standard mode */
|
||||||
|
if (mode->Fs == 400*(opus_int32)mode->shortMdctSize)
|
||||||
|
{
|
||||||
|
for (i=0;i<BITALLOC_SIZE*mode->nbEBands;i++)
|
||||||
|
allocVectors[i] = band_allocation[i];
|
||||||
|
mode->allocVectors = allocVectors;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* If not the standard mode, interpolate */
|
||||||
|
/* Compute per-codec-band allocation from per-critical-band matrix */
|
||||||
|
for (i=0;i<BITALLOC_SIZE;i++)
|
||||||
|
{
|
||||||
|
for (j=0;j<mode->nbEBands;j++)
|
||||||
|
{
|
||||||
|
int k;
|
||||||
|
for (k=0;k<maxBands;k++)
|
||||||
|
{
|
||||||
|
if (400*(opus_int32)eband5ms[k] > mode->eBands[j]*(opus_int32)mode->Fs/mode->shortMdctSize)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (k>maxBands-1)
|
||||||
|
allocVectors[i*mode->nbEBands+j] = band_allocation[i*maxBands + maxBands-1];
|
||||||
|
else {
|
||||||
|
opus_int32 a0, a1;
|
||||||
|
a1 = mode->eBands[j]*(opus_int32)mode->Fs/mode->shortMdctSize - 400*(opus_int32)eband5ms[k-1];
|
||||||
|
a0 = 400*(opus_int32)eband5ms[k] - mode->eBands[j]*(opus_int32)mode->Fs/mode->shortMdctSize;
|
||||||
|
allocVectors[i*mode->nbEBands+j] = (a0*band_allocation[i*maxBands+k-1]
|
||||||
|
+ a1*band_allocation[i*maxBands+k])/(a0+a1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*printf ("\n");
|
||||||
|
for (i=0;i<BITALLOC_SIZE;i++)
|
||||||
|
{
|
||||||
|
for (j=0;j<mode->nbEBands;j++)
|
||||||
|
printf ("%d ", allocVectors[i*mode->nbEBands+j]);
|
||||||
|
printf ("\n");
|
||||||
|
}
|
||||||
|
exit(0);*/
|
||||||
|
|
||||||
|
mode->allocVectors = allocVectors;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* CUSTOM_MODES */
|
||||||
|
|
||||||
|
CELTMode *opus_custom_mode_create(opus_int32 Fs, int frame_size, int *error)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
#ifdef CUSTOM_MODES
|
||||||
|
CELTMode *mode=NULL;
|
||||||
|
int res;
|
||||||
|
opus_val16 *window;
|
||||||
|
opus_int16 *logN;
|
||||||
|
int LM;
|
||||||
|
ALLOC_STACK;
|
||||||
|
#if !defined(VAR_ARRAYS) && !defined(USE_ALLOCA)
|
||||||
|
if (global_stack==NULL)
|
||||||
|
goto failure;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef CUSTOM_MODES_ONLY
|
||||||
|
for (i=0;i<TOTAL_MODES;i++)
|
||||||
|
{
|
||||||
|
int j;
|
||||||
|
for (j=0;j<4;j++)
|
||||||
|
{
|
||||||
|
if (Fs == static_mode_list[i]->Fs &&
|
||||||
|
(frame_size<<j) == static_mode_list[i]->shortMdctSize*static_mode_list[i]->nbShortMdcts)
|
||||||
|
{
|
||||||
|
if (error)
|
||||||
|
*error = OPUS_OK;
|
||||||
|
return (CELTMode*)static_mode_list[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* CUSTOM_MODES_ONLY */
|
||||||
|
|
||||||
|
#ifndef CUSTOM_MODES
|
||||||
|
if (error)
|
||||||
|
*error = OPUS_BAD_ARG;
|
||||||
|
return NULL;
|
||||||
|
#else
|
||||||
|
|
||||||
|
/* The good thing here is that permutation of the arguments will automatically be invalid */
|
||||||
|
|
||||||
|
if (Fs < 8000 || Fs > 96000)
|
||||||
|
{
|
||||||
|
if (error)
|
||||||
|
*error = OPUS_BAD_ARG;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if (frame_size < 40 || frame_size > 1024 || frame_size%2!=0)
|
||||||
|
{
|
||||||
|
if (error)
|
||||||
|
*error = OPUS_BAD_ARG;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
/* Frames of less than 1ms are not supported. */
|
||||||
|
if ((opus_int32)frame_size*1000 < Fs)
|
||||||
|
{
|
||||||
|
if (error)
|
||||||
|
*error = OPUS_BAD_ARG;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((opus_int32)frame_size*75 >= Fs && (frame_size%16)==0)
|
||||||
|
{
|
||||||
|
LM = 3;
|
||||||
|
} else if ((opus_int32)frame_size*150 >= Fs && (frame_size%8)==0)
|
||||||
|
{
|
||||||
|
LM = 2;
|
||||||
|
} else if ((opus_int32)frame_size*300 >= Fs && (frame_size%4)==0)
|
||||||
|
{
|
||||||
|
LM = 1;
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
LM = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Shorts longer than 3.3ms are not supported. */
|
||||||
|
if ((opus_int32)(frame_size>>LM)*300 > Fs)
|
||||||
|
{
|
||||||
|
if (error)
|
||||||
|
*error = OPUS_BAD_ARG;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
mode = opus_alloc(sizeof(CELTMode));
|
||||||
|
if (mode==NULL)
|
||||||
|
goto failure;
|
||||||
|
mode->Fs = Fs;
|
||||||
|
|
||||||
|
/* Pre/de-emphasis depends on sampling rate. The "standard" pre-emphasis
|
||||||
|
is defined as A(z) = 1 - 0.85*z^-1 at 48 kHz. Other rates should
|
||||||
|
approximate that. */
|
||||||
|
if(Fs < 12000) /* 8 kHz */
|
||||||
|
{
|
||||||
|
mode->preemph[0] = QCONST16(0.3500061035f, 15);
|
||||||
|
mode->preemph[1] = -QCONST16(0.1799926758f, 15);
|
||||||
|
mode->preemph[2] = QCONST16(0.2719968125f, SIG_SHIFT); /* exact 1/preemph[3] */
|
||||||
|
mode->preemph[3] = QCONST16(3.6765136719f, 13);
|
||||||
|
} else if(Fs < 24000) /* 16 kHz */
|
||||||
|
{
|
||||||
|
mode->preemph[0] = QCONST16(0.6000061035f, 15);
|
||||||
|
mode->preemph[1] = -QCONST16(0.1799926758f, 15);
|
||||||
|
mode->preemph[2] = QCONST16(0.4424998650f, SIG_SHIFT); /* exact 1/preemph[3] */
|
||||||
|
mode->preemph[3] = QCONST16(2.2598876953f, 13);
|
||||||
|
} else if(Fs < 40000) /* 32 kHz */
|
||||||
|
{
|
||||||
|
mode->preemph[0] = QCONST16(0.7799987793f, 15);
|
||||||
|
mode->preemph[1] = -QCONST16(0.1000061035f, 15);
|
||||||
|
mode->preemph[2] = QCONST16(0.7499771125f, SIG_SHIFT); /* exact 1/preemph[3] */
|
||||||
|
mode->preemph[3] = QCONST16(1.3333740234f, 13);
|
||||||
|
} else /* 48 kHz */
|
||||||
|
{
|
||||||
|
mode->preemph[0] = QCONST16(0.8500061035f, 15);
|
||||||
|
mode->preemph[1] = QCONST16(0.0f, 15);
|
||||||
|
mode->preemph[2] = QCONST16(1.f, SIG_SHIFT);
|
||||||
|
mode->preemph[3] = QCONST16(1.f, 13);
|
||||||
|
}
|
||||||
|
|
||||||
|
mode->maxLM = LM;
|
||||||
|
mode->nbShortMdcts = 1<<LM;
|
||||||
|
mode->shortMdctSize = frame_size/mode->nbShortMdcts;
|
||||||
|
res = (mode->Fs+mode->shortMdctSize)/(2*mode->shortMdctSize);
|
||||||
|
|
||||||
|
mode->eBands = compute_ebands(Fs, mode->shortMdctSize, res, &mode->nbEBands);
|
||||||
|
if (mode->eBands==NULL)
|
||||||
|
goto failure;
|
||||||
|
|
||||||
|
mode->effEBands = mode->nbEBands;
|
||||||
|
while (mode->eBands[mode->effEBands] > mode->shortMdctSize)
|
||||||
|
mode->effEBands--;
|
||||||
|
|
||||||
|
/* Overlap must be divisible by 4 */
|
||||||
|
mode->overlap = ((mode->shortMdctSize>>2)<<2);
|
||||||
|
|
||||||
|
compute_allocation_table(mode);
|
||||||
|
if (mode->allocVectors==NULL)
|
||||||
|
goto failure;
|
||||||
|
|
||||||
|
window = (opus_val16*)opus_alloc(mode->overlap*sizeof(opus_val16));
|
||||||
|
if (window==NULL)
|
||||||
|
goto failure;
|
||||||
|
|
||||||
|
#ifndef FIXED_POINT
|
||||||
|
for (i=0;i<mode->overlap;i++)
|
||||||
|
window[i] = Q15ONE*sin(.5*M_PI* sin(.5*M_PI*(i+.5)/mode->overlap) * sin(.5*M_PI*(i+.5)/mode->overlap));
|
||||||
|
#else
|
||||||
|
for (i=0;i<mode->overlap;i++)
|
||||||
|
window[i] = MIN32(32767,floor(.5+32768.*sin(.5*M_PI* sin(.5*M_PI*(i+.5)/mode->overlap) * sin(.5*M_PI*(i+.5)/mode->overlap))));
|
||||||
|
#endif
|
||||||
|
mode->window = window;
|
||||||
|
|
||||||
|
logN = (opus_int16*)opus_alloc(mode->nbEBands*sizeof(opus_int16));
|
||||||
|
if (logN==NULL)
|
||||||
|
goto failure;
|
||||||
|
|
||||||
|
for (i=0;i<mode->nbEBands;i++)
|
||||||
|
logN[i] = log2_frac(mode->eBands[i+1]-mode->eBands[i], BITRES);
|
||||||
|
mode->logN = logN;
|
||||||
|
|
||||||
|
compute_pulse_cache(mode, mode->maxLM);
|
||||||
|
|
||||||
|
if (clt_mdct_init(&mode->mdct, 2*mode->shortMdctSize*mode->nbShortMdcts,
|
||||||
|
mode->maxLM) == 0)
|
||||||
|
goto failure;
|
||||||
|
|
||||||
|
if (error)
|
||||||
|
*error = OPUS_OK;
|
||||||
|
|
||||||
|
return mode;
|
||||||
|
failure:
|
||||||
|
if (error)
|
||||||
|
*error = OPUS_ALLOC_FAIL;
|
||||||
|
if (mode!=NULL)
|
||||||
|
opus_custom_mode_destroy(mode);
|
||||||
|
return NULL;
|
||||||
|
#endif /* !CUSTOM_MODES */
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef CUSTOM_MODES
|
||||||
|
void opus_custom_mode_destroy(CELTMode *mode)
|
||||||
|
{
|
||||||
|
if (mode == NULL)
|
||||||
|
return;
|
||||||
|
#ifndef CUSTOM_MODES_ONLY
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i=0;i<TOTAL_MODES;i++)
|
||||||
|
{
|
||||||
|
if (mode == static_mode_list[i])
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* CUSTOM_MODES_ONLY */
|
||||||
|
opus_free((opus_int16*)mode->eBands);
|
||||||
|
opus_free((opus_int16*)mode->allocVectors);
|
||||||
|
|
||||||
|
opus_free((opus_val16*)mode->window);
|
||||||
|
opus_free((opus_int16*)mode->logN);
|
||||||
|
|
||||||
|
opus_free((opus_int16*)mode->cache.index);
|
||||||
|
opus_free((unsigned char*)mode->cache.bits);
|
||||||
|
opus_free((unsigned char*)mode->cache.caps);
|
||||||
|
clt_mdct_clear(&mode->mdct);
|
||||||
|
|
||||||
|
opus_free((CELTMode *)mode);
|
||||||
|
}
|
||||||
|
#endif
|
83
Frameworks/Opus/Opus/opus/celt/modes.h
Normal file
83
Frameworks/Opus/Opus/opus/celt/modes.h
Normal file
|
@ -0,0 +1,83 @@
|
||||||
|
/* Copyright (c) 2007-2008 CSIRO
|
||||||
|
Copyright (c) 2007-2009 Xiph.Org Foundation
|
||||||
|
Copyright (c) 2008 Gregory Maxwell
|
||||||
|
Written by Jean-Marc Valin and Gregory Maxwell */
|
||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef MODES_H
|
||||||
|
#define MODES_H
|
||||||
|
|
||||||
|
#include "opus_types.h"
|
||||||
|
#include "celt.h"
|
||||||
|
#include "arch.h"
|
||||||
|
#include "mdct.h"
|
||||||
|
#include "entenc.h"
|
||||||
|
#include "entdec.h"
|
||||||
|
|
||||||
|
#define MAX_PERIOD 1024
|
||||||
|
|
||||||
|
#ifndef OVERLAP
|
||||||
|
#define OVERLAP(mode) ((mode)->overlap)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef FRAMESIZE
|
||||||
|
#define FRAMESIZE(mode) ((mode)->mdctSize)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int size;
|
||||||
|
const opus_int16 *index;
|
||||||
|
const unsigned char *bits;
|
||||||
|
const unsigned char *caps;
|
||||||
|
} PulseCache;
|
||||||
|
|
||||||
|
/** Mode definition (opaque)
|
||||||
|
@brief Mode definition
|
||||||
|
*/
|
||||||
|
struct OpusCustomMode {
|
||||||
|
opus_int32 Fs;
|
||||||
|
int overlap;
|
||||||
|
|
||||||
|
int nbEBands;
|
||||||
|
int effEBands;
|
||||||
|
opus_val16 preemph[4];
|
||||||
|
const opus_int16 *eBands; /**< Definition for each "pseudo-critical band" */
|
||||||
|
|
||||||
|
int maxLM;
|
||||||
|
int nbShortMdcts;
|
||||||
|
int shortMdctSize;
|
||||||
|
|
||||||
|
int nbAllocVectors; /**< Number of lines in the matrix below */
|
||||||
|
const unsigned char *allocVectors; /**< Number of bits in each band for several rates */
|
||||||
|
const opus_int16 *logN;
|
||||||
|
|
||||||
|
const opus_val16 *window;
|
||||||
|
mdct_lookup mdct;
|
||||||
|
PulseCache cache;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
210
Frameworks/Opus/Opus/opus/celt/opus_custom_demo.c
Normal file
210
Frameworks/Opus/Opus/opus/celt/opus_custom_demo.c
Normal file
|
@ -0,0 +1,210 @@
|
||||||
|
/* Copyright (c) 2007-2008 CSIRO
|
||||||
|
Copyright (c) 2007-2009 Xiph.Org Foundation
|
||||||
|
Written by Jean-Marc Valin */
|
||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "opus_custom.h"
|
||||||
|
#include "arch.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#define MAX_PACKET 1275
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
int err;
|
||||||
|
char *inFile, *outFile;
|
||||||
|
FILE *fin, *fout;
|
||||||
|
OpusCustomMode *mode=NULL;
|
||||||
|
OpusCustomEncoder *enc;
|
||||||
|
OpusCustomDecoder *dec;
|
||||||
|
int len;
|
||||||
|
opus_int32 frame_size, channels, rate;
|
||||||
|
int bytes_per_packet;
|
||||||
|
unsigned char data[MAX_PACKET];
|
||||||
|
int complexity;
|
||||||
|
#if !(defined (FIXED_POINT) && !defined(CUSTOM_MODES)) && defined(RESYNTH)
|
||||||
|
int i;
|
||||||
|
double rmsd = 0;
|
||||||
|
#endif
|
||||||
|
int count = 0;
|
||||||
|
opus_int32 skip;
|
||||||
|
opus_int16 *in, *out;
|
||||||
|
if (argc != 9 && argc != 8 && argc != 7)
|
||||||
|
{
|
||||||
|
fprintf (stderr, "Usage: test_opus_custom <rate> <channels> <frame size> "
|
||||||
|
" <bytes per packet> [<complexity> [packet loss rate]] "
|
||||||
|
"<input> <output>\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
rate = (opus_int32)atol(argv[1]);
|
||||||
|
channels = atoi(argv[2]);
|
||||||
|
frame_size = atoi(argv[3]);
|
||||||
|
mode = opus_custom_mode_create(rate, frame_size, NULL);
|
||||||
|
if (mode == NULL)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "failed to create a mode\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
bytes_per_packet = atoi(argv[4]);
|
||||||
|
if (bytes_per_packet < 0 || bytes_per_packet > MAX_PACKET)
|
||||||
|
{
|
||||||
|
fprintf (stderr, "bytes per packet must be between 0 and %d\n",
|
||||||
|
MAX_PACKET);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
inFile = argv[argc-2];
|
||||||
|
fin = fopen(inFile, "rb");
|
||||||
|
if (!fin)
|
||||||
|
{
|
||||||
|
fprintf (stderr, "Could not open input file %s\n", argv[argc-2]);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
outFile = argv[argc-1];
|
||||||
|
fout = fopen(outFile, "wb+");
|
||||||
|
if (!fout)
|
||||||
|
{
|
||||||
|
fprintf (stderr, "Could not open output file %s\n", argv[argc-1]);
|
||||||
|
fclose(fin);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
enc = opus_custom_encoder_create(mode, channels, &err);
|
||||||
|
if (err != 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Failed to create the encoder: %s\n", opus_strerror(err));
|
||||||
|
fclose(fin);
|
||||||
|
fclose(fout);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
dec = opus_custom_decoder_create(mode, channels, &err);
|
||||||
|
if (err != 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Failed to create the decoder: %s\n", opus_strerror(err));
|
||||||
|
fclose(fin);
|
||||||
|
fclose(fout);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
opus_custom_decoder_ctl(dec, OPUS_GET_LOOKAHEAD(&skip));
|
||||||
|
|
||||||
|
if (argc>7)
|
||||||
|
{
|
||||||
|
complexity=atoi(argv[5]);
|
||||||
|
opus_custom_encoder_ctl(enc,OPUS_SET_COMPLEXITY(complexity));
|
||||||
|
}
|
||||||
|
|
||||||
|
in = (opus_int16*)malloc(frame_size*channels*sizeof(opus_int16));
|
||||||
|
out = (opus_int16*)malloc(frame_size*channels*sizeof(opus_int16));
|
||||||
|
|
||||||
|
while (!feof(fin))
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
err = fread(in, sizeof(short), frame_size*channels, fin);
|
||||||
|
if (feof(fin))
|
||||||
|
break;
|
||||||
|
len = opus_custom_encode(enc, in, frame_size, data, bytes_per_packet);
|
||||||
|
if (len <= 0)
|
||||||
|
fprintf (stderr, "opus_custom_encode() failed: %s\n", opus_strerror(len));
|
||||||
|
|
||||||
|
/* This is for simulating bit errors */
|
||||||
|
#if 0
|
||||||
|
int errors = 0;
|
||||||
|
int eid = 0;
|
||||||
|
/* This simulates random bit error */
|
||||||
|
for (i=0;i<len*8;i++)
|
||||||
|
{
|
||||||
|
if (rand()%atoi(argv[8])==0)
|
||||||
|
{
|
||||||
|
if (i<64)
|
||||||
|
{
|
||||||
|
errors++;
|
||||||
|
eid = i;
|
||||||
|
}
|
||||||
|
data[i/8] ^= 1<<(7-(i%8));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (errors == 1)
|
||||||
|
data[eid/8] ^= 1<<(7-(eid%8));
|
||||||
|
else if (errors%2 == 1)
|
||||||
|
data[rand()%8] ^= 1<<rand()%8;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if 1 /* Set to zero to use the encoder's output instead */
|
||||||
|
/* This is to simulate packet loss */
|
||||||
|
if (argc==9 && rand()%1000<atoi(argv[argc-3]))
|
||||||
|
/*if (errors && (errors%2==0))*/
|
||||||
|
ret = opus_custom_decode(dec, NULL, len, out, frame_size);
|
||||||
|
else
|
||||||
|
ret = opus_custom_decode(dec, data, len, out, frame_size);
|
||||||
|
if (ret < 0)
|
||||||
|
fprintf(stderr, "opus_custom_decode() failed: %s\n", opus_strerror(ret));
|
||||||
|
#else
|
||||||
|
for (i=0;i<ret*channels;i++)
|
||||||
|
out[i] = in[i];
|
||||||
|
#endif
|
||||||
|
#if !(defined (FIXED_POINT) && !defined(CUSTOM_MODES)) && defined(RESYNTH)
|
||||||
|
for (i=0;i<ret*channels;i++)
|
||||||
|
{
|
||||||
|
rmsd += (in[i]-out[i])*1.0*(in[i]-out[i]);
|
||||||
|
/*out[i] -= in[i];*/
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
count++;
|
||||||
|
fwrite(out+skip*channels, sizeof(short), (ret-skip)*channels, fout);
|
||||||
|
skip = 0;
|
||||||
|
}
|
||||||
|
PRINT_MIPS(stderr);
|
||||||
|
|
||||||
|
opus_custom_encoder_destroy(enc);
|
||||||
|
opus_custom_decoder_destroy(dec);
|
||||||
|
fclose(fin);
|
||||||
|
fclose(fout);
|
||||||
|
opus_custom_mode_destroy(mode);
|
||||||
|
free(in);
|
||||||
|
free(out);
|
||||||
|
#if !(defined (FIXED_POINT) && !defined(CUSTOM_MODES)) && defined(RESYNTH)
|
||||||
|
if (rmsd > 0)
|
||||||
|
{
|
||||||
|
rmsd = sqrt(rmsd/(1.0*frame_size*channels*count));
|
||||||
|
fprintf (stderr, "Error: encoder doesn't match decoder\n");
|
||||||
|
fprintf (stderr, "RMS mismatch is %f\n", rmsd);
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
fprintf (stderr, "Encoder matches decoder!!\n");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
89
Frameworks/Opus/Opus/opus/celt/os_support.h
Normal file
89
Frameworks/Opus/Opus/opus/celt/os_support.h
Normal file
|
@ -0,0 +1,89 @@
|
||||||
|
/* Copyright (C) 2007 Jean-Marc Valin
|
||||||
|
|
||||||
|
File: os_support.h
|
||||||
|
This is the (tiny) OS abstraction layer. Aside from math.h, this is the
|
||||||
|
only place where system headers are allowed.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are
|
||||||
|
met:
|
||||||
|
|
||||||
|
1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
2. 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 AUTHOR ``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 AUTHOR 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef OS_SUPPORT_H
|
||||||
|
#define OS_SUPPORT_H
|
||||||
|
|
||||||
|
#ifdef CUSTOM_SUPPORT
|
||||||
|
# include "custom_support.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
/** Opus wrapper for malloc(). To do your own dynamic allocation, all you need to do is replace this function and opus_free */
|
||||||
|
#ifndef OVERRIDE_OPUS_ALLOC
|
||||||
|
static inline void *opus_alloc (size_t size)
|
||||||
|
{
|
||||||
|
return malloc(size);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** Same as celt_alloc(), except that the area is only needed inside a CELT call (might cause problem with wideband though) */
|
||||||
|
#ifndef OVERRIDE_OPUS_ALLOC_SCRATCH
|
||||||
|
static inline void *opus_alloc_scratch (size_t size)
|
||||||
|
{
|
||||||
|
/* Scratch space doesn't need to be cleared */
|
||||||
|
return opus_alloc(size);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** Opus wrapper for free(). To do your own dynamic allocation, all you need to do is replace this function and opus_alloc */
|
||||||
|
#ifndef OVERRIDE_OPUS_FREE
|
||||||
|
static inline void opus_free (void *ptr)
|
||||||
|
{
|
||||||
|
free(ptr);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** Copy n bytes of memory from src to dst. The 0* term provides compile-time type checking */
|
||||||
|
#ifndef OVERRIDE_OPUS_COPY
|
||||||
|
#define OPUS_COPY(dst, src, n) (memcpy((dst), (src), (n)*sizeof(*(dst)) + 0*((dst)-(src)) ))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** Copy n bytes of memory from src to dst, allowing overlapping regions. The 0* term
|
||||||
|
provides compile-time type checking */
|
||||||
|
#ifndef OVERRIDE_OPUS_MOVE
|
||||||
|
#define OPUS_MOVE(dst, src, n) (memmove((dst), (src), (n)*sizeof(*(dst)) + 0*((dst)-(src)) ))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** Set n elements of dst to zero, starting at address s */
|
||||||
|
#ifndef OVERRIDE_OPUS_CLEAR
|
||||||
|
#define OPUS_CLEAR(dst, n) (memset((dst), 0, (n)*sizeof(*(dst))))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*#ifdef __GNUC__
|
||||||
|
#pragma GCC poison printf sprintf
|
||||||
|
#pragma GCC poison malloc free realloc calloc
|
||||||
|
#endif*/
|
||||||
|
|
||||||
|
#endif /* OS_SUPPORT_H */
|
||||||
|
|
410
Frameworks/Opus/Opus/opus/celt/pitch.c
Normal file
410
Frameworks/Opus/Opus/opus/celt/pitch.c
Normal file
|
@ -0,0 +1,410 @@
|
||||||
|
/* Copyright (c) 2007-2008 CSIRO
|
||||||
|
Copyright (c) 2007-2009 Xiph.Org Foundation
|
||||||
|
Written by Jean-Marc Valin */
|
||||||
|
/**
|
||||||
|
@file pitch.c
|
||||||
|
@brief Pitch analysis
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "pitch.h"
|
||||||
|
#include "os_support.h"
|
||||||
|
#include "modes.h"
|
||||||
|
#include "stack_alloc.h"
|
||||||
|
#include "mathops.h"
|
||||||
|
#include "celt_lpc.h"
|
||||||
|
|
||||||
|
static void find_best_pitch(opus_val32 *xcorr, opus_val16 *y, int len,
|
||||||
|
int max_pitch, int *best_pitch
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
, int yshift, opus_val32 maxcorr
|
||||||
|
#endif
|
||||||
|
)
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
opus_val32 Syy=1;
|
||||||
|
opus_val16 best_num[2];
|
||||||
|
opus_val32 best_den[2];
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
int xshift;
|
||||||
|
|
||||||
|
xshift = celt_ilog2(maxcorr)-14;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
best_num[0] = -1;
|
||||||
|
best_num[1] = -1;
|
||||||
|
best_den[0] = 0;
|
||||||
|
best_den[1] = 0;
|
||||||
|
best_pitch[0] = 0;
|
||||||
|
best_pitch[1] = 1;
|
||||||
|
for (j=0;j<len;j++)
|
||||||
|
Syy = ADD32(Syy, SHR32(MULT16_16(y[j],y[j]), yshift));
|
||||||
|
for (i=0;i<max_pitch;i++)
|
||||||
|
{
|
||||||
|
if (xcorr[i]>0)
|
||||||
|
{
|
||||||
|
opus_val16 num;
|
||||||
|
opus_val32 xcorr16;
|
||||||
|
xcorr16 = EXTRACT16(VSHR32(xcorr[i], xshift));
|
||||||
|
#ifndef FIXED_POINT
|
||||||
|
/* Considering the range of xcorr16, this should avoid both underflows
|
||||||
|
and overflows (inf) when squaring xcorr16 */
|
||||||
|
xcorr16 *= 1e-12f;
|
||||||
|
#endif
|
||||||
|
num = MULT16_16_Q15(xcorr16,xcorr16);
|
||||||
|
if (MULT16_32_Q15(num,best_den[1]) > MULT16_32_Q15(best_num[1],Syy))
|
||||||
|
{
|
||||||
|
if (MULT16_32_Q15(num,best_den[0]) > MULT16_32_Q15(best_num[0],Syy))
|
||||||
|
{
|
||||||
|
best_num[1] = best_num[0];
|
||||||
|
best_den[1] = best_den[0];
|
||||||
|
best_pitch[1] = best_pitch[0];
|
||||||
|
best_num[0] = num;
|
||||||
|
best_den[0] = Syy;
|
||||||
|
best_pitch[0] = i;
|
||||||
|
} else {
|
||||||
|
best_num[1] = num;
|
||||||
|
best_den[1] = Syy;
|
||||||
|
best_pitch[1] = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Syy += SHR32(MULT16_16(y[i+len],y[i+len]),yshift) - SHR32(MULT16_16(y[i],y[i]),yshift);
|
||||||
|
Syy = MAX32(1, Syy);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void pitch_downsample(celt_sig * OPUS_RESTRICT x[], opus_val16 * OPUS_RESTRICT x_lp,
|
||||||
|
int len, int C)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
opus_val32 ac[5];
|
||||||
|
opus_val16 tmp=Q15ONE;
|
||||||
|
opus_val16 lpc[4], mem[4]={0,0,0,0};
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
int shift;
|
||||||
|
opus_val32 maxabs = celt_maxabs32(x[0], len);
|
||||||
|
if (C==2)
|
||||||
|
{
|
||||||
|
opus_val32 maxabs_1 = celt_maxabs32(x[1], len);
|
||||||
|
maxabs = MAX32(maxabs, maxabs_1);
|
||||||
|
}
|
||||||
|
if (maxabs<1)
|
||||||
|
maxabs=1;
|
||||||
|
shift = celt_ilog2(maxabs)-10;
|
||||||
|
if (shift<0)
|
||||||
|
shift=0;
|
||||||
|
if (C==2)
|
||||||
|
shift++;
|
||||||
|
#endif
|
||||||
|
for (i=1;i<len>>1;i++)
|
||||||
|
x_lp[i] = SHR32(HALF32(HALF32(x[0][(2*i-1)]+x[0][(2*i+1)])+x[0][2*i]), shift);
|
||||||
|
x_lp[0] = SHR32(HALF32(HALF32(x[0][1])+x[0][0]), shift);
|
||||||
|
if (C==2)
|
||||||
|
{
|
||||||
|
for (i=1;i<len>>1;i++)
|
||||||
|
x_lp[i] += SHR32(HALF32(HALF32(x[1][(2*i-1)]+x[1][(2*i+1)])+x[1][2*i]), shift);
|
||||||
|
x_lp[0] += SHR32(HALF32(HALF32(x[1][1])+x[1][0]), shift);
|
||||||
|
}
|
||||||
|
|
||||||
|
_celt_autocorr(x_lp, ac, NULL, 0,
|
||||||
|
4, len>>1);
|
||||||
|
|
||||||
|
/* Noise floor -40 dB */
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
ac[0] += SHR32(ac[0],13);
|
||||||
|
#else
|
||||||
|
ac[0] *= 1.0001f;
|
||||||
|
#endif
|
||||||
|
/* Lag windowing */
|
||||||
|
for (i=1;i<=4;i++)
|
||||||
|
{
|
||||||
|
/*ac[i] *= exp(-.5*(2*M_PI*.002*i)*(2*M_PI*.002*i));*/
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
ac[i] -= MULT16_32_Q15(2*i*i, ac[i]);
|
||||||
|
#else
|
||||||
|
ac[i] -= ac[i]*(.008f*i)*(.008f*i);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
_celt_lpc(lpc, ac, 4);
|
||||||
|
for (i=0;i<4;i++)
|
||||||
|
{
|
||||||
|
tmp = MULT16_16_Q15(QCONST16(.9f,15), tmp);
|
||||||
|
lpc[i] = MULT16_16_Q15(lpc[i], tmp);
|
||||||
|
}
|
||||||
|
celt_fir(x_lp, lpc, x_lp, len>>1, 4, mem);
|
||||||
|
|
||||||
|
mem[0]=0;
|
||||||
|
lpc[0]=QCONST16(.8f,12);
|
||||||
|
celt_fir(x_lp, lpc, x_lp, len>>1, 1, mem);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void pitch_search(const opus_val16 * OPUS_RESTRICT x_lp, opus_val16 * OPUS_RESTRICT y,
|
||||||
|
int len, int max_pitch, int *pitch)
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
int lag;
|
||||||
|
int best_pitch[2]={0,0};
|
||||||
|
VARDECL(opus_val16, x_lp4);
|
||||||
|
VARDECL(opus_val16, y_lp4);
|
||||||
|
VARDECL(opus_val32, xcorr);
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
opus_val32 maxcorr=1;
|
||||||
|
opus_val32 xmax, ymax;
|
||||||
|
int shift=0;
|
||||||
|
#endif
|
||||||
|
int offset;
|
||||||
|
|
||||||
|
SAVE_STACK;
|
||||||
|
|
||||||
|
celt_assert(len>0);
|
||||||
|
celt_assert(max_pitch>0);
|
||||||
|
lag = len+max_pitch;
|
||||||
|
|
||||||
|
ALLOC(x_lp4, len>>2, opus_val16);
|
||||||
|
ALLOC(y_lp4, lag>>2, opus_val16);
|
||||||
|
ALLOC(xcorr, max_pitch>>1, opus_val32);
|
||||||
|
|
||||||
|
/* Downsample by 2 again */
|
||||||
|
for (j=0;j<len>>2;j++)
|
||||||
|
x_lp4[j] = x_lp[2*j];
|
||||||
|
for (j=0;j<lag>>2;j++)
|
||||||
|
y_lp4[j] = y[2*j];
|
||||||
|
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
xmax = celt_maxabs16(x_lp4, len>>2);
|
||||||
|
ymax = celt_maxabs16(y_lp4, lag>>2);
|
||||||
|
shift = celt_ilog2(MAX32(1, MAX32(xmax, ymax)))-11;
|
||||||
|
if (shift>0)
|
||||||
|
{
|
||||||
|
for (j=0;j<len>>2;j++)
|
||||||
|
x_lp4[j] = SHR16(x_lp4[j], shift);
|
||||||
|
for (j=0;j<lag>>2;j++)
|
||||||
|
y_lp4[j] = SHR16(y_lp4[j], shift);
|
||||||
|
/* Use double the shift for a MAC */
|
||||||
|
shift *= 2;
|
||||||
|
} else {
|
||||||
|
shift = 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Coarse search with 4x decimation */
|
||||||
|
|
||||||
|
for (i=0;i<max_pitch>>2;i++)
|
||||||
|
{
|
||||||
|
opus_val32 sum = 0;
|
||||||
|
for (j=0;j<len>>2;j++)
|
||||||
|
sum = MAC16_16(sum, x_lp4[j],y_lp4[i+j]);
|
||||||
|
xcorr[i] = MAX32(-1, sum);
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
maxcorr = MAX32(maxcorr, sum);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
find_best_pitch(xcorr, y_lp4, len>>2, max_pitch>>2, best_pitch
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
, 0, maxcorr
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
|
||||||
|
/* Finer search with 2x decimation */
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
maxcorr=1;
|
||||||
|
#endif
|
||||||
|
for (i=0;i<max_pitch>>1;i++)
|
||||||
|
{
|
||||||
|
opus_val32 sum=0;
|
||||||
|
xcorr[i] = 0;
|
||||||
|
if (abs(i-2*best_pitch[0])>2 && abs(i-2*best_pitch[1])>2)
|
||||||
|
continue;
|
||||||
|
for (j=0;j<len>>1;j++)
|
||||||
|
sum += SHR32(MULT16_16(x_lp[j],y[i+j]), shift);
|
||||||
|
xcorr[i] = MAX32(-1, sum);
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
maxcorr = MAX32(maxcorr, sum);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
find_best_pitch(xcorr, y, len>>1, max_pitch>>1, best_pitch
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
, shift+1, maxcorr
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
|
||||||
|
/* Refine by pseudo-interpolation */
|
||||||
|
if (best_pitch[0]>0 && best_pitch[0]<(max_pitch>>1)-1)
|
||||||
|
{
|
||||||
|
opus_val32 a, b, c;
|
||||||
|
a = xcorr[best_pitch[0]-1];
|
||||||
|
b = xcorr[best_pitch[0]];
|
||||||
|
c = xcorr[best_pitch[0]+1];
|
||||||
|
if ((c-a) > MULT16_32_Q15(QCONST16(.7f,15),b-a))
|
||||||
|
offset = 1;
|
||||||
|
else if ((a-c) > MULT16_32_Q15(QCONST16(.7f,15),b-c))
|
||||||
|
offset = -1;
|
||||||
|
else
|
||||||
|
offset = 0;
|
||||||
|
} else {
|
||||||
|
offset = 0;
|
||||||
|
}
|
||||||
|
*pitch = 2*best_pitch[0]-offset;
|
||||||
|
|
||||||
|
RESTORE_STACK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const int second_check[16] = {0, 0, 3, 2, 3, 2, 5, 2, 3, 2, 3, 2, 5, 2, 3, 2};
|
||||||
|
opus_val16 remove_doubling(opus_val16 *x, int maxperiod, int minperiod,
|
||||||
|
int N, int *T0_, int prev_period, opus_val16 prev_gain)
|
||||||
|
{
|
||||||
|
int k, i, T, T0;
|
||||||
|
opus_val16 g, g0;
|
||||||
|
opus_val16 pg;
|
||||||
|
opus_val32 xy,xx,yy;
|
||||||
|
opus_val32 xcorr[3];
|
||||||
|
opus_val32 best_xy, best_yy;
|
||||||
|
int offset;
|
||||||
|
int minperiod0;
|
||||||
|
|
||||||
|
minperiod0 = minperiod;
|
||||||
|
maxperiod /= 2;
|
||||||
|
minperiod /= 2;
|
||||||
|
*T0_ /= 2;
|
||||||
|
prev_period /= 2;
|
||||||
|
N /= 2;
|
||||||
|
x += maxperiod;
|
||||||
|
if (*T0_>=maxperiod)
|
||||||
|
*T0_=maxperiod-1;
|
||||||
|
|
||||||
|
T = T0 = *T0_;
|
||||||
|
xx=xy=yy=0;
|
||||||
|
for (i=0;i<N;i++)
|
||||||
|
{
|
||||||
|
xy = MAC16_16(xy, x[i], x[i-T0]);
|
||||||
|
xx = MAC16_16(xx, x[i], x[i]);
|
||||||
|
yy = MAC16_16(yy, x[i-T0],x[i-T0]);
|
||||||
|
}
|
||||||
|
best_xy = xy;
|
||||||
|
best_yy = yy;
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
{
|
||||||
|
opus_val32 x2y2;
|
||||||
|
int sh, t;
|
||||||
|
x2y2 = 1+HALF32(MULT32_32_Q31(xx,yy));
|
||||||
|
sh = celt_ilog2(x2y2)>>1;
|
||||||
|
t = VSHR32(x2y2, 2*(sh-7));
|
||||||
|
g = g0 = VSHR32(MULT16_32_Q15(celt_rsqrt_norm(t), xy),sh+1);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
g = g0 = xy/celt_sqrt(1+xx*yy);
|
||||||
|
#endif
|
||||||
|
/* Look for any pitch at T/k */
|
||||||
|
for (k=2;k<=15;k++)
|
||||||
|
{
|
||||||
|
int T1, T1b;
|
||||||
|
opus_val16 g1;
|
||||||
|
opus_val16 cont=0;
|
||||||
|
T1 = (2*T0+k)/(2*k);
|
||||||
|
if (T1 < minperiod)
|
||||||
|
break;
|
||||||
|
/* Look for another strong correlation at T1b */
|
||||||
|
if (k==2)
|
||||||
|
{
|
||||||
|
if (T1+T0>maxperiod)
|
||||||
|
T1b = T0;
|
||||||
|
else
|
||||||
|
T1b = T0+T1;
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
T1b = (2*second_check[k]*T0+k)/(2*k);
|
||||||
|
}
|
||||||
|
xy=yy=0;
|
||||||
|
for (i=0;i<N;i++)
|
||||||
|
{
|
||||||
|
xy = MAC16_16(xy, x[i], x[i-T1]);
|
||||||
|
yy = MAC16_16(yy, x[i-T1], x[i-T1]);
|
||||||
|
|
||||||
|
xy = MAC16_16(xy, x[i], x[i-T1b]);
|
||||||
|
yy = MAC16_16(yy, x[i-T1b], x[i-T1b]);
|
||||||
|
}
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
{
|
||||||
|
opus_val32 x2y2;
|
||||||
|
int sh, t;
|
||||||
|
x2y2 = 1+MULT32_32_Q31(xx,yy);
|
||||||
|
sh = celt_ilog2(x2y2)>>1;
|
||||||
|
t = VSHR32(x2y2, 2*(sh-7));
|
||||||
|
g1 = VSHR32(MULT16_32_Q15(celt_rsqrt_norm(t), xy),sh+1);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
g1 = xy/celt_sqrt(1+2.f*xx*1.f*yy);
|
||||||
|
#endif
|
||||||
|
if (abs(T1-prev_period)<=1)
|
||||||
|
cont = prev_gain;
|
||||||
|
else if (abs(T1-prev_period)<=2 && 5*k*k < T0)
|
||||||
|
cont = HALF32(prev_gain);
|
||||||
|
else
|
||||||
|
cont = 0;
|
||||||
|
if (g1 > QCONST16(.3f,15) + MULT16_16_Q15(QCONST16(.4f,15),g0)-cont)
|
||||||
|
{
|
||||||
|
best_xy = xy;
|
||||||
|
best_yy = yy;
|
||||||
|
T = T1;
|
||||||
|
g = g1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
best_xy = MAX32(0, best_xy);
|
||||||
|
if (best_yy <= best_xy)
|
||||||
|
pg = Q15ONE;
|
||||||
|
else
|
||||||
|
pg = SHR32(frac_div32(best_xy,best_yy+1),16);
|
||||||
|
|
||||||
|
for (k=0;k<3;k++)
|
||||||
|
{
|
||||||
|
int T1 = T+k-1;
|
||||||
|
xy = 0;
|
||||||
|
for (i=0;i<N;i++)
|
||||||
|
xy = MAC16_16(xy, x[i], x[i-T1]);
|
||||||
|
xcorr[k] = xy;
|
||||||
|
}
|
||||||
|
if ((xcorr[2]-xcorr[0]) > MULT16_32_Q15(QCONST16(.7f,15),xcorr[1]-xcorr[0]))
|
||||||
|
offset = 1;
|
||||||
|
else if ((xcorr[0]-xcorr[2]) > MULT16_32_Q15(QCONST16(.7f,15),xcorr[1]-xcorr[2]))
|
||||||
|
offset = -1;
|
||||||
|
else
|
||||||
|
offset = 0;
|
||||||
|
if (pg > g)
|
||||||
|
pg = g;
|
||||||
|
*T0_ = 2*T+offset;
|
||||||
|
|
||||||
|
if (*T0_<minperiod0)
|
||||||
|
*T0_=minperiod0;
|
||||||
|
return pg;
|
||||||
|
}
|
48
Frameworks/Opus/Opus/opus/celt/pitch.h
Normal file
48
Frameworks/Opus/Opus/opus/celt/pitch.h
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
/* Copyright (c) 2007-2008 CSIRO
|
||||||
|
Copyright (c) 2007-2009 Xiph.Org Foundation
|
||||||
|
Written by Jean-Marc Valin */
|
||||||
|
/**
|
||||||
|
@file pitch.h
|
||||||
|
@brief Pitch analysis
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef PITCH_H
|
||||||
|
#define PITCH_H
|
||||||
|
|
||||||
|
#include "modes.h"
|
||||||
|
|
||||||
|
void pitch_downsample(celt_sig * OPUS_RESTRICT x[], opus_val16 * OPUS_RESTRICT x_lp,
|
||||||
|
int len, int C);
|
||||||
|
|
||||||
|
void pitch_search(const opus_val16 * OPUS_RESTRICT x_lp, opus_val16 * OPUS_RESTRICT y,
|
||||||
|
int len, int max_pitch, int *pitch);
|
||||||
|
|
||||||
|
opus_val16 remove_doubling(opus_val16 *x, int maxperiod, int minperiod,
|
||||||
|
int N, int *T0, int prev_period, opus_val16 prev_gain);
|
||||||
|
|
||||||
|
#endif
|
570
Frameworks/Opus/Opus/opus/celt/quant_bands.c
Normal file
570
Frameworks/Opus/Opus/opus/celt/quant_bands.c
Normal file
|
@ -0,0 +1,570 @@
|
||||||
|
/* Copyright (c) 2007-2008 CSIRO
|
||||||
|
Copyright (c) 2007-2009 Xiph.Org Foundation
|
||||||
|
Written by Jean-Marc Valin */
|
||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "quant_bands.h"
|
||||||
|
#include "laplace.h"
|
||||||
|
#include <math.h>
|
||||||
|
#include "os_support.h"
|
||||||
|
#include "arch.h"
|
||||||
|
#include "mathops.h"
|
||||||
|
#include "stack_alloc.h"
|
||||||
|
#include "rate.h"
|
||||||
|
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
/* Mean energy in each band quantized in Q6 */
|
||||||
|
static const signed char eMeans[25] = {
|
||||||
|
103,100, 92, 85, 81,
|
||||||
|
77, 72, 70, 78, 75,
|
||||||
|
73, 71, 78, 74, 69,
|
||||||
|
72, 70, 74, 76, 71,
|
||||||
|
60, 60, 60, 60, 60
|
||||||
|
};
|
||||||
|
#else
|
||||||
|
/* Mean energy in each band quantized in Q6 and converted back to float */
|
||||||
|
static const opus_val16 eMeans[25] = {
|
||||||
|
6.437500f, 6.250000f, 5.750000f, 5.312500f, 5.062500f,
|
||||||
|
4.812500f, 4.500000f, 4.375000f, 4.875000f, 4.687500f,
|
||||||
|
4.562500f, 4.437500f, 4.875000f, 4.625000f, 4.312500f,
|
||||||
|
4.500000f, 4.375000f, 4.625000f, 4.750000f, 4.437500f,
|
||||||
|
3.750000f, 3.750000f, 3.750000f, 3.750000f, 3.750000f
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
/* prediction coefficients: 0.9, 0.8, 0.65, 0.5 */
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
static const opus_val16 pred_coef[4] = {29440, 26112, 21248, 16384};
|
||||||
|
static const opus_val16 beta_coef[4] = {30147, 22282, 12124, 6554};
|
||||||
|
static const opus_val16 beta_intra = 4915;
|
||||||
|
#else
|
||||||
|
static const opus_val16 pred_coef[4] = {29440/32768., 26112/32768., 21248/32768., 16384/32768.};
|
||||||
|
static const opus_val16 beta_coef[4] = {30147/32768., 22282/32768., 12124/32768., 6554/32768.};
|
||||||
|
static const opus_val16 beta_intra = 4915/32768.;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*Parameters of the Laplace-like probability models used for the coarse energy.
|
||||||
|
There is one pair of parameters for each frame size, prediction type
|
||||||
|
(inter/intra), and band number.
|
||||||
|
The first number of each pair is the probability of 0, and the second is the
|
||||||
|
decay rate, both in Q8 precision.*/
|
||||||
|
static const unsigned char e_prob_model[4][2][42] = {
|
||||||
|
/*120 sample frames.*/
|
||||||
|
{
|
||||||
|
/*Inter*/
|
||||||
|
{
|
||||||
|
72, 127, 65, 129, 66, 128, 65, 128, 64, 128, 62, 128, 64, 128,
|
||||||
|
64, 128, 92, 78, 92, 79, 92, 78, 90, 79, 116, 41, 115, 40,
|
||||||
|
114, 40, 132, 26, 132, 26, 145, 17, 161, 12, 176, 10, 177, 11
|
||||||
|
},
|
||||||
|
/*Intra*/
|
||||||
|
{
|
||||||
|
24, 179, 48, 138, 54, 135, 54, 132, 53, 134, 56, 133, 55, 132,
|
||||||
|
55, 132, 61, 114, 70, 96, 74, 88, 75, 88, 87, 74, 89, 66,
|
||||||
|
91, 67, 100, 59, 108, 50, 120, 40, 122, 37, 97, 43, 78, 50
|
||||||
|
}
|
||||||
|
},
|
||||||
|
/*240 sample frames.*/
|
||||||
|
{
|
||||||
|
/*Inter*/
|
||||||
|
{
|
||||||
|
83, 78, 84, 81, 88, 75, 86, 74, 87, 71, 90, 73, 93, 74,
|
||||||
|
93, 74, 109, 40, 114, 36, 117, 34, 117, 34, 143, 17, 145, 18,
|
||||||
|
146, 19, 162, 12, 165, 10, 178, 7, 189, 6, 190, 8, 177, 9
|
||||||
|
},
|
||||||
|
/*Intra*/
|
||||||
|
{
|
||||||
|
23, 178, 54, 115, 63, 102, 66, 98, 69, 99, 74, 89, 71, 91,
|
||||||
|
73, 91, 78, 89, 86, 80, 92, 66, 93, 64, 102, 59, 103, 60,
|
||||||
|
104, 60, 117, 52, 123, 44, 138, 35, 133, 31, 97, 38, 77, 45
|
||||||
|
}
|
||||||
|
},
|
||||||
|
/*480 sample frames.*/
|
||||||
|
{
|
||||||
|
/*Inter*/
|
||||||
|
{
|
||||||
|
61, 90, 93, 60, 105, 42, 107, 41, 110, 45, 116, 38, 113, 38,
|
||||||
|
112, 38, 124, 26, 132, 27, 136, 19, 140, 20, 155, 14, 159, 16,
|
||||||
|
158, 18, 170, 13, 177, 10, 187, 8, 192, 6, 175, 9, 159, 10
|
||||||
|
},
|
||||||
|
/*Intra*/
|
||||||
|
{
|
||||||
|
21, 178, 59, 110, 71, 86, 75, 85, 84, 83, 91, 66, 88, 73,
|
||||||
|
87, 72, 92, 75, 98, 72, 105, 58, 107, 54, 115, 52, 114, 55,
|
||||||
|
112, 56, 129, 51, 132, 40, 150, 33, 140, 29, 98, 35, 77, 42
|
||||||
|
}
|
||||||
|
},
|
||||||
|
/*960 sample frames.*/
|
||||||
|
{
|
||||||
|
/*Inter*/
|
||||||
|
{
|
||||||
|
42, 121, 96, 66, 108, 43, 111, 40, 117, 44, 123, 32, 120, 36,
|
||||||
|
119, 33, 127, 33, 134, 34, 139, 21, 147, 23, 152, 20, 158, 25,
|
||||||
|
154, 26, 166, 21, 173, 16, 184, 13, 184, 10, 150, 13, 139, 15
|
||||||
|
},
|
||||||
|
/*Intra*/
|
||||||
|
{
|
||||||
|
22, 178, 63, 114, 74, 82, 84, 83, 92, 82, 103, 62, 96, 72,
|
||||||
|
96, 67, 101, 73, 107, 72, 113, 55, 118, 52, 125, 52, 118, 52,
|
||||||
|
117, 55, 135, 49, 137, 39, 157, 32, 145, 29, 97, 33, 77, 40
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static const unsigned char small_energy_icdf[3]={2,1,0};
|
||||||
|
|
||||||
|
static opus_val32 loss_distortion(const opus_val16 *eBands, opus_val16 *oldEBands, int start, int end, int len, int C)
|
||||||
|
{
|
||||||
|
int c, i;
|
||||||
|
opus_val32 dist = 0;
|
||||||
|
c=0; do {
|
||||||
|
for (i=start;i<end;i++)
|
||||||
|
{
|
||||||
|
opus_val16 d = SUB16(SHR16(eBands[i+c*len], 3), SHR16(oldEBands[i+c*len], 3));
|
||||||
|
dist = MAC16_16(dist, d,d);
|
||||||
|
}
|
||||||
|
} while (++c<C);
|
||||||
|
return MIN32(200,SHR32(dist,2*DB_SHIFT-6));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int quant_coarse_energy_impl(const CELTMode *m, int start, int end,
|
||||||
|
const opus_val16 *eBands, opus_val16 *oldEBands,
|
||||||
|
opus_int32 budget, opus_int32 tell,
|
||||||
|
const unsigned char *prob_model, opus_val16 *error, ec_enc *enc,
|
||||||
|
int C, int LM, int intra, opus_val16 max_decay)
|
||||||
|
{
|
||||||
|
int i, c;
|
||||||
|
int badness = 0;
|
||||||
|
opus_val32 prev[2] = {0,0};
|
||||||
|
opus_val16 coef;
|
||||||
|
opus_val16 beta;
|
||||||
|
|
||||||
|
if (tell+3 <= budget)
|
||||||
|
ec_enc_bit_logp(enc, intra, 3);
|
||||||
|
if (intra)
|
||||||
|
{
|
||||||
|
coef = 0;
|
||||||
|
beta = beta_intra;
|
||||||
|
} else {
|
||||||
|
beta = beta_coef[LM];
|
||||||
|
coef = pred_coef[LM];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Encode at a fixed coarse resolution */
|
||||||
|
for (i=start;i<end;i++)
|
||||||
|
{
|
||||||
|
c=0;
|
||||||
|
do {
|
||||||
|
int bits_left;
|
||||||
|
int qi, qi0;
|
||||||
|
opus_val32 q;
|
||||||
|
opus_val16 x;
|
||||||
|
opus_val32 f, tmp;
|
||||||
|
opus_val16 oldE;
|
||||||
|
opus_val16 decay_bound;
|
||||||
|
x = eBands[i+c*m->nbEBands];
|
||||||
|
oldE = MAX16(-QCONST16(9.f,DB_SHIFT), oldEBands[i+c*m->nbEBands]);
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
f = SHL32(EXTEND32(x),7) - PSHR32(MULT16_16(coef,oldE), 8) - prev[c];
|
||||||
|
/* Rounding to nearest integer here is really important! */
|
||||||
|
qi = (f+QCONST32(.5f,DB_SHIFT+7))>>(DB_SHIFT+7);
|
||||||
|
decay_bound = EXTRACT16(MAX32(-QCONST16(28.f,DB_SHIFT),
|
||||||
|
SUB32((opus_val32)oldEBands[i+c*m->nbEBands],max_decay)));
|
||||||
|
#else
|
||||||
|
f = x-coef*oldE-prev[c];
|
||||||
|
/* Rounding to nearest integer here is really important! */
|
||||||
|
qi = (int)floor(.5f+f);
|
||||||
|
decay_bound = MAX16(-QCONST16(28.f,DB_SHIFT), oldEBands[i+c*m->nbEBands]) - max_decay;
|
||||||
|
#endif
|
||||||
|
/* Prevent the energy from going down too quickly (e.g. for bands
|
||||||
|
that have just one bin) */
|
||||||
|
if (qi < 0 && x < decay_bound)
|
||||||
|
{
|
||||||
|
qi += (int)SHR16(SUB16(decay_bound,x), DB_SHIFT);
|
||||||
|
if (qi > 0)
|
||||||
|
qi = 0;
|
||||||
|
}
|
||||||
|
qi0 = qi;
|
||||||
|
/* If we don't have enough bits to encode all the energy, just assume
|
||||||
|
something safe. */
|
||||||
|
tell = ec_tell(enc);
|
||||||
|
bits_left = budget-tell-3*C*(end-i);
|
||||||
|
if (i!=start && bits_left < 30)
|
||||||
|
{
|
||||||
|
if (bits_left < 24)
|
||||||
|
qi = IMIN(1, qi);
|
||||||
|
if (bits_left < 16)
|
||||||
|
qi = IMAX(-1, qi);
|
||||||
|
}
|
||||||
|
if (budget-tell >= 15)
|
||||||
|
{
|
||||||
|
int pi;
|
||||||
|
pi = 2*IMIN(i,20);
|
||||||
|
ec_laplace_encode(enc, &qi,
|
||||||
|
prob_model[pi]<<7, prob_model[pi+1]<<6);
|
||||||
|
}
|
||||||
|
else if(budget-tell >= 2)
|
||||||
|
{
|
||||||
|
qi = IMAX(-1, IMIN(qi, 1));
|
||||||
|
ec_enc_icdf(enc, 2*qi^-(qi<0), small_energy_icdf, 2);
|
||||||
|
}
|
||||||
|
else if(budget-tell >= 1)
|
||||||
|
{
|
||||||
|
qi = IMIN(0, qi);
|
||||||
|
ec_enc_bit_logp(enc, -qi, 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
qi = -1;
|
||||||
|
error[i+c*m->nbEBands] = PSHR32(f,7) - SHL16(qi,DB_SHIFT);
|
||||||
|
badness += abs(qi0-qi);
|
||||||
|
q = (opus_val32)SHL32(EXTEND32(qi),DB_SHIFT);
|
||||||
|
|
||||||
|
tmp = PSHR32(MULT16_16(coef,oldE),8) + prev[c] + SHL32(q,7);
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
tmp = MAX32(-QCONST32(28.f, DB_SHIFT+7), tmp);
|
||||||
|
#endif
|
||||||
|
oldEBands[i+c*m->nbEBands] = PSHR32(tmp, 7);
|
||||||
|
prev[c] = prev[c] + SHL32(q,7) - MULT16_16(beta,PSHR32(q,8));
|
||||||
|
} while (++c < C);
|
||||||
|
}
|
||||||
|
return badness;
|
||||||
|
}
|
||||||
|
|
||||||
|
void quant_coarse_energy(const CELTMode *m, int start, int end, int effEnd,
|
||||||
|
const opus_val16 *eBands, opus_val16 *oldEBands, opus_uint32 budget,
|
||||||
|
opus_val16 *error, ec_enc *enc, int C, int LM, int nbAvailableBytes,
|
||||||
|
int force_intra, opus_val32 *delayedIntra, int two_pass, int loss_rate)
|
||||||
|
{
|
||||||
|
int intra;
|
||||||
|
opus_val16 max_decay;
|
||||||
|
VARDECL(opus_val16, oldEBands_intra);
|
||||||
|
VARDECL(opus_val16, error_intra);
|
||||||
|
ec_enc enc_start_state;
|
||||||
|
opus_uint32 tell;
|
||||||
|
int badness1=0;
|
||||||
|
opus_int32 intra_bias;
|
||||||
|
opus_val32 new_distortion;
|
||||||
|
SAVE_STACK;
|
||||||
|
|
||||||
|
intra = force_intra || (!two_pass && *delayedIntra>2*C*(end-start) && nbAvailableBytes > (end-start)*C);
|
||||||
|
intra_bias = (opus_int32)((budget**delayedIntra*loss_rate)/(C*512));
|
||||||
|
new_distortion = loss_distortion(eBands, oldEBands, start, effEnd, m->nbEBands, C);
|
||||||
|
|
||||||
|
tell = ec_tell(enc);
|
||||||
|
if (tell+3 > budget)
|
||||||
|
two_pass = intra = 0;
|
||||||
|
|
||||||
|
/* Encode the global flags using a simple probability model
|
||||||
|
(first symbols in the stream) */
|
||||||
|
|
||||||
|
max_decay = QCONST16(16.f,DB_SHIFT);
|
||||||
|
if (end-start>10)
|
||||||
|
{
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
max_decay = MIN32(max_decay, SHL32(EXTEND32(nbAvailableBytes),DB_SHIFT-3));
|
||||||
|
#else
|
||||||
|
max_decay = MIN32(max_decay, .125f*nbAvailableBytes);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
enc_start_state = *enc;
|
||||||
|
|
||||||
|
ALLOC(oldEBands_intra, C*m->nbEBands, opus_val16);
|
||||||
|
ALLOC(error_intra, C*m->nbEBands, opus_val16);
|
||||||
|
OPUS_COPY(oldEBands_intra, oldEBands, C*m->nbEBands);
|
||||||
|
|
||||||
|
if (two_pass || intra)
|
||||||
|
{
|
||||||
|
badness1 = quant_coarse_energy_impl(m, start, end, eBands, oldEBands_intra, budget,
|
||||||
|
tell, e_prob_model[LM][1], error_intra, enc, C, LM, 1, max_decay);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!intra)
|
||||||
|
{
|
||||||
|
unsigned char *intra_buf;
|
||||||
|
ec_enc enc_intra_state;
|
||||||
|
opus_int32 tell_intra;
|
||||||
|
opus_uint32 nstart_bytes;
|
||||||
|
opus_uint32 nintra_bytes;
|
||||||
|
int badness2;
|
||||||
|
VARDECL(unsigned char, intra_bits);
|
||||||
|
|
||||||
|
tell_intra = ec_tell_frac(enc);
|
||||||
|
|
||||||
|
enc_intra_state = *enc;
|
||||||
|
|
||||||
|
nstart_bytes = ec_range_bytes(&enc_start_state);
|
||||||
|
nintra_bytes = ec_range_bytes(&enc_intra_state);
|
||||||
|
intra_buf = ec_get_buffer(&enc_intra_state) + nstart_bytes;
|
||||||
|
ALLOC(intra_bits, nintra_bytes-nstart_bytes, unsigned char);
|
||||||
|
/* Copy bits from intra bit-stream */
|
||||||
|
OPUS_COPY(intra_bits, intra_buf, nintra_bytes - nstart_bytes);
|
||||||
|
|
||||||
|
*enc = enc_start_state;
|
||||||
|
|
||||||
|
badness2 = quant_coarse_energy_impl(m, start, end, eBands, oldEBands, budget,
|
||||||
|
tell, e_prob_model[LM][intra], error, enc, C, LM, 0, max_decay);
|
||||||
|
|
||||||
|
if (two_pass && (badness1 < badness2 || (badness1 == badness2 && ((opus_int32)ec_tell_frac(enc))+intra_bias > tell_intra)))
|
||||||
|
{
|
||||||
|
*enc = enc_intra_state;
|
||||||
|
/* Copy intra bits to bit-stream */
|
||||||
|
OPUS_COPY(intra_buf, intra_bits, nintra_bytes - nstart_bytes);
|
||||||
|
OPUS_COPY(oldEBands, oldEBands_intra, C*m->nbEBands);
|
||||||
|
OPUS_COPY(error, error_intra, C*m->nbEBands);
|
||||||
|
intra = 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
OPUS_COPY(oldEBands, oldEBands_intra, C*m->nbEBands);
|
||||||
|
OPUS_COPY(error, error_intra, C*m->nbEBands);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (intra)
|
||||||
|
*delayedIntra = new_distortion;
|
||||||
|
else
|
||||||
|
*delayedIntra = ADD32(MULT16_32_Q15(MULT16_16_Q15(pred_coef[LM], pred_coef[LM]),*delayedIntra),
|
||||||
|
new_distortion);
|
||||||
|
|
||||||
|
RESTORE_STACK;
|
||||||
|
}
|
||||||
|
|
||||||
|
void quant_fine_energy(const CELTMode *m, int start, int end, opus_val16 *oldEBands, opus_val16 *error, int *fine_quant, ec_enc *enc, int C)
|
||||||
|
{
|
||||||
|
int i, c;
|
||||||
|
|
||||||
|
/* Encode finer resolution */
|
||||||
|
for (i=start;i<end;i++)
|
||||||
|
{
|
||||||
|
opus_int16 frac = 1<<fine_quant[i];
|
||||||
|
if (fine_quant[i] <= 0)
|
||||||
|
continue;
|
||||||
|
c=0;
|
||||||
|
do {
|
||||||
|
int q2;
|
||||||
|
opus_val16 offset;
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
/* Has to be without rounding */
|
||||||
|
q2 = (error[i+c*m->nbEBands]+QCONST16(.5f,DB_SHIFT))>>(DB_SHIFT-fine_quant[i]);
|
||||||
|
#else
|
||||||
|
q2 = (int)floor((error[i+c*m->nbEBands]+.5f)*frac);
|
||||||
|
#endif
|
||||||
|
if (q2 > frac-1)
|
||||||
|
q2 = frac-1;
|
||||||
|
if (q2<0)
|
||||||
|
q2 = 0;
|
||||||
|
ec_enc_bits(enc, q2, fine_quant[i]);
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
offset = SUB16(SHR32(SHL32(EXTEND32(q2),DB_SHIFT)+QCONST16(.5f,DB_SHIFT),fine_quant[i]),QCONST16(.5f,DB_SHIFT));
|
||||||
|
#else
|
||||||
|
offset = (q2+.5f)*(1<<(14-fine_quant[i]))*(1.f/16384) - .5f;
|
||||||
|
#endif
|
||||||
|
oldEBands[i+c*m->nbEBands] += offset;
|
||||||
|
error[i+c*m->nbEBands] -= offset;
|
||||||
|
/*printf ("%f ", error[i] - offset);*/
|
||||||
|
} while (++c < C);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void quant_energy_finalise(const CELTMode *m, int start, int end, opus_val16 *oldEBands, opus_val16 *error, int *fine_quant, int *fine_priority, int bits_left, ec_enc *enc, int C)
|
||||||
|
{
|
||||||
|
int i, prio, c;
|
||||||
|
|
||||||
|
/* Use up the remaining bits */
|
||||||
|
for (prio=0;prio<2;prio++)
|
||||||
|
{
|
||||||
|
for (i=start;i<end && bits_left>=C ;i++)
|
||||||
|
{
|
||||||
|
if (fine_quant[i] >= MAX_FINE_BITS || fine_priority[i]!=prio)
|
||||||
|
continue;
|
||||||
|
c=0;
|
||||||
|
do {
|
||||||
|
int q2;
|
||||||
|
opus_val16 offset;
|
||||||
|
q2 = error[i+c*m->nbEBands]<0 ? 0 : 1;
|
||||||
|
ec_enc_bits(enc, q2, 1);
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
offset = SHR16(SHL16(q2,DB_SHIFT)-QCONST16(.5f,DB_SHIFT),fine_quant[i]+1);
|
||||||
|
#else
|
||||||
|
offset = (q2-.5f)*(1<<(14-fine_quant[i]-1))*(1.f/16384);
|
||||||
|
#endif
|
||||||
|
oldEBands[i+c*m->nbEBands] += offset;
|
||||||
|
bits_left--;
|
||||||
|
} while (++c < C);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void unquant_coarse_energy(const CELTMode *m, int start, int end, opus_val16 *oldEBands, int intra, ec_dec *dec, int C, int LM)
|
||||||
|
{
|
||||||
|
const unsigned char *prob_model = e_prob_model[LM][intra];
|
||||||
|
int i, c;
|
||||||
|
opus_val32 prev[2] = {0, 0};
|
||||||
|
opus_val16 coef;
|
||||||
|
opus_val16 beta;
|
||||||
|
opus_int32 budget;
|
||||||
|
opus_int32 tell;
|
||||||
|
|
||||||
|
if (intra)
|
||||||
|
{
|
||||||
|
coef = 0;
|
||||||
|
beta = beta_intra;
|
||||||
|
} else {
|
||||||
|
beta = beta_coef[LM];
|
||||||
|
coef = pred_coef[LM];
|
||||||
|
}
|
||||||
|
|
||||||
|
budget = dec->storage*8;
|
||||||
|
|
||||||
|
/* Decode at a fixed coarse resolution */
|
||||||
|
for (i=start;i<end;i++)
|
||||||
|
{
|
||||||
|
c=0;
|
||||||
|
do {
|
||||||
|
int qi;
|
||||||
|
opus_val32 q;
|
||||||
|
opus_val32 tmp;
|
||||||
|
/* It would be better to express this invariant as a
|
||||||
|
test on C at function entry, but that isn't enough
|
||||||
|
to make the static analyzer happy. */
|
||||||
|
celt_assert(c<2);
|
||||||
|
tell = ec_tell(dec);
|
||||||
|
if(budget-tell>=15)
|
||||||
|
{
|
||||||
|
int pi;
|
||||||
|
pi = 2*IMIN(i,20);
|
||||||
|
qi = ec_laplace_decode(dec,
|
||||||
|
prob_model[pi]<<7, prob_model[pi+1]<<6);
|
||||||
|
}
|
||||||
|
else if(budget-tell>=2)
|
||||||
|
{
|
||||||
|
qi = ec_dec_icdf(dec, small_energy_icdf, 2);
|
||||||
|
qi = (qi>>1)^-(qi&1);
|
||||||
|
}
|
||||||
|
else if(budget-tell>=1)
|
||||||
|
{
|
||||||
|
qi = -ec_dec_bit_logp(dec, 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
qi = -1;
|
||||||
|
q = (opus_val32)SHL32(EXTEND32(qi),DB_SHIFT);
|
||||||
|
|
||||||
|
oldEBands[i+c*m->nbEBands] = MAX16(-QCONST16(9.f,DB_SHIFT), oldEBands[i+c*m->nbEBands]);
|
||||||
|
tmp = PSHR32(MULT16_16(coef,oldEBands[i+c*m->nbEBands]),8) + prev[c] + SHL32(q,7);
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
tmp = MAX32(-QCONST32(28.f, DB_SHIFT+7), tmp);
|
||||||
|
#endif
|
||||||
|
oldEBands[i+c*m->nbEBands] = PSHR32(tmp, 7);
|
||||||
|
prev[c] = prev[c] + SHL32(q,7) - MULT16_16(beta,PSHR32(q,8));
|
||||||
|
} while (++c < C);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void unquant_fine_energy(const CELTMode *m, int start, int end, opus_val16 *oldEBands, int *fine_quant, ec_dec *dec, int C)
|
||||||
|
{
|
||||||
|
int i, c;
|
||||||
|
/* Decode finer resolution */
|
||||||
|
for (i=start;i<end;i++)
|
||||||
|
{
|
||||||
|
if (fine_quant[i] <= 0)
|
||||||
|
continue;
|
||||||
|
c=0;
|
||||||
|
do {
|
||||||
|
int q2;
|
||||||
|
opus_val16 offset;
|
||||||
|
q2 = ec_dec_bits(dec, fine_quant[i]);
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
offset = SUB16(SHR32(SHL32(EXTEND32(q2),DB_SHIFT)+QCONST16(.5f,DB_SHIFT),fine_quant[i]),QCONST16(.5f,DB_SHIFT));
|
||||||
|
#else
|
||||||
|
offset = (q2+.5f)*(1<<(14-fine_quant[i]))*(1.f/16384) - .5f;
|
||||||
|
#endif
|
||||||
|
oldEBands[i+c*m->nbEBands] += offset;
|
||||||
|
} while (++c < C);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void unquant_energy_finalise(const CELTMode *m, int start, int end, opus_val16 *oldEBands, int *fine_quant, int *fine_priority, int bits_left, ec_dec *dec, int C)
|
||||||
|
{
|
||||||
|
int i, prio, c;
|
||||||
|
|
||||||
|
/* Use up the remaining bits */
|
||||||
|
for (prio=0;prio<2;prio++)
|
||||||
|
{
|
||||||
|
for (i=start;i<end && bits_left>=C ;i++)
|
||||||
|
{
|
||||||
|
if (fine_quant[i] >= MAX_FINE_BITS || fine_priority[i]!=prio)
|
||||||
|
continue;
|
||||||
|
c=0;
|
||||||
|
do {
|
||||||
|
int q2;
|
||||||
|
opus_val16 offset;
|
||||||
|
q2 = ec_dec_bits(dec, 1);
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
offset = SHR16(SHL16(q2,DB_SHIFT)-QCONST16(.5f,DB_SHIFT),fine_quant[i]+1);
|
||||||
|
#else
|
||||||
|
offset = (q2-.5f)*(1<<(14-fine_quant[i]-1))*(1.f/16384);
|
||||||
|
#endif
|
||||||
|
oldEBands[i+c*m->nbEBands] += offset;
|
||||||
|
bits_left--;
|
||||||
|
} while (++c < C);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void log2Amp(const CELTMode *m, int start, int end,
|
||||||
|
celt_ener *eBands, const opus_val16 *oldEBands, int C)
|
||||||
|
{
|
||||||
|
int c, i;
|
||||||
|
c=0;
|
||||||
|
do {
|
||||||
|
for (i=0;i<start;i++)
|
||||||
|
eBands[i+c*m->nbEBands] = 0;
|
||||||
|
for (;i<end;i++)
|
||||||
|
{
|
||||||
|
opus_val16 lg = ADD16(oldEBands[i+c*m->nbEBands],
|
||||||
|
SHL16((opus_val16)eMeans[i],6));
|
||||||
|
eBands[i+c*m->nbEBands] = PSHR32(celt_exp2(lg),4);
|
||||||
|
}
|
||||||
|
for (;i<m->nbEBands;i++)
|
||||||
|
eBands[i+c*m->nbEBands] = 0;
|
||||||
|
} while (++c < C);
|
||||||
|
}
|
||||||
|
|
||||||
|
void amp2Log2(const CELTMode *m, int effEnd, int end,
|
||||||
|
celt_ener *bandE, opus_val16 *bandLogE, int C)
|
||||||
|
{
|
||||||
|
int c, i;
|
||||||
|
c=0;
|
||||||
|
do {
|
||||||
|
for (i=0;i<effEnd;i++)
|
||||||
|
bandLogE[i+c*m->nbEBands] =
|
||||||
|
celt_log2(SHL32(bandE[i+c*m->nbEBands],2))
|
||||||
|
- SHL16((opus_val16)eMeans[i],6);
|
||||||
|
for (i=effEnd;i<end;i++)
|
||||||
|
bandLogE[c*m->nbEBands+i] = -QCONST16(14.f,DB_SHIFT);
|
||||||
|
} while (++c < C);
|
||||||
|
}
|
60
Frameworks/Opus/Opus/opus/celt/quant_bands.h
Normal file
60
Frameworks/Opus/Opus/opus/celt/quant_bands.h
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
/* Copyright (c) 2007-2008 CSIRO
|
||||||
|
Copyright (c) 2007-2009 Xiph.Org Foundation
|
||||||
|
Written by Jean-Marc Valin */
|
||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef QUANT_BANDS
|
||||||
|
#define QUANT_BANDS
|
||||||
|
|
||||||
|
#include "arch.h"
|
||||||
|
#include "modes.h"
|
||||||
|
#include "entenc.h"
|
||||||
|
#include "entdec.h"
|
||||||
|
#include "mathops.h"
|
||||||
|
|
||||||
|
void amp2Log2(const CELTMode *m, int effEnd, int end,
|
||||||
|
celt_ener *bandE, opus_val16 *bandLogE, int C);
|
||||||
|
|
||||||
|
void log2Amp(const CELTMode *m, int start, int end,
|
||||||
|
celt_ener *eBands, const opus_val16 *oldEBands, int C);
|
||||||
|
|
||||||
|
void quant_coarse_energy(const CELTMode *m, int start, int end, int effEnd,
|
||||||
|
const opus_val16 *eBands, opus_val16 *oldEBands, opus_uint32 budget,
|
||||||
|
opus_val16 *error, ec_enc *enc, int C, int LM,
|
||||||
|
int nbAvailableBytes, int force_intra, opus_val32 *delayedIntra,
|
||||||
|
int two_pass, int loss_rate);
|
||||||
|
|
||||||
|
void quant_fine_energy(const CELTMode *m, int start, int end, opus_val16 *oldEBands, opus_val16 *error, int *fine_quant, ec_enc *enc, int C);
|
||||||
|
|
||||||
|
void quant_energy_finalise(const CELTMode *m, int start, int end, opus_val16 *oldEBands, opus_val16 *error, int *fine_quant, int *fine_priority, int bits_left, ec_enc *enc, int C);
|
||||||
|
|
||||||
|
void unquant_coarse_energy(const CELTMode *m, int start, int end, opus_val16 *oldEBands, int intra, ec_dec *dec, int C, int LM);
|
||||||
|
|
||||||
|
void unquant_fine_energy(const CELTMode *m, int start, int end, opus_val16 *oldEBands, int *fine_quant, ec_dec *dec, int C);
|
||||||
|
|
||||||
|
void unquant_energy_finalise(const CELTMode *m, int start, int end, opus_val16 *oldEBands, int *fine_quant, int *fine_priority, int bits_left, ec_dec *dec, int C);
|
||||||
|
|
||||||
|
#endif /* QUANT_BANDS */
|
638
Frameworks/Opus/Opus/opus/celt/rate.c
Normal file
638
Frameworks/Opus/Opus/opus/celt/rate.c
Normal file
|
@ -0,0 +1,638 @@
|
||||||
|
/* Copyright (c) 2007-2008 CSIRO
|
||||||
|
Copyright (c) 2007-2009 Xiph.Org Foundation
|
||||||
|
Written by Jean-Marc Valin */
|
||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include "modes.h"
|
||||||
|
#include "cwrs.h"
|
||||||
|
#include "arch.h"
|
||||||
|
#include "os_support.h"
|
||||||
|
|
||||||
|
#include "entcode.h"
|
||||||
|
#include "rate.h"
|
||||||
|
|
||||||
|
static const unsigned char LOG2_FRAC_TABLE[24]={
|
||||||
|
0,
|
||||||
|
8,13,
|
||||||
|
16,19,21,23,
|
||||||
|
24,26,27,28,29,30,31,32,
|
||||||
|
32,33,34,34,35,36,36,37,37
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef CUSTOM_MODES
|
||||||
|
|
||||||
|
/*Determines if V(N,K) fits in a 32-bit unsigned integer.
|
||||||
|
N and K are themselves limited to 15 bits.*/
|
||||||
|
static int fits_in32(int _n, int _k)
|
||||||
|
{
|
||||||
|
static const opus_int16 maxN[15] = {
|
||||||
|
32767, 32767, 32767, 1476, 283, 109, 60, 40,
|
||||||
|
29, 24, 20, 18, 16, 14, 13};
|
||||||
|
static const opus_int16 maxK[15] = {
|
||||||
|
32767, 32767, 32767, 32767, 1172, 238, 95, 53,
|
||||||
|
36, 27, 22, 18, 16, 15, 13};
|
||||||
|
if (_n>=14)
|
||||||
|
{
|
||||||
|
if (_k>=14)
|
||||||
|
return 0;
|
||||||
|
else
|
||||||
|
return _n <= maxN[_k];
|
||||||
|
} else {
|
||||||
|
return _k <= maxK[_n];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void compute_pulse_cache(CELTMode *m, int LM)
|
||||||
|
{
|
||||||
|
int C;
|
||||||
|
int i;
|
||||||
|
int j;
|
||||||
|
int curr=0;
|
||||||
|
int nbEntries=0;
|
||||||
|
int entryN[100], entryK[100], entryI[100];
|
||||||
|
const opus_int16 *eBands = m->eBands;
|
||||||
|
PulseCache *cache = &m->cache;
|
||||||
|
opus_int16 *cindex;
|
||||||
|
unsigned char *bits;
|
||||||
|
unsigned char *cap;
|
||||||
|
|
||||||
|
cindex = (opus_int16 *)opus_alloc(sizeof(cache->index[0])*m->nbEBands*(LM+2));
|
||||||
|
cache->index = cindex;
|
||||||
|
|
||||||
|
/* Scan for all unique band sizes */
|
||||||
|
for (i=0;i<=LM+1;i++)
|
||||||
|
{
|
||||||
|
for (j=0;j<m->nbEBands;j++)
|
||||||
|
{
|
||||||
|
int k;
|
||||||
|
int N = (eBands[j+1]-eBands[j])<<i>>1;
|
||||||
|
cindex[i*m->nbEBands+j] = -1;
|
||||||
|
/* Find other bands that have the same size */
|
||||||
|
for (k=0;k<=i;k++)
|
||||||
|
{
|
||||||
|
int n;
|
||||||
|
for (n=0;n<m->nbEBands && (k!=i || n<j);n++)
|
||||||
|
{
|
||||||
|
if (N == (eBands[n+1]-eBands[n])<<k>>1)
|
||||||
|
{
|
||||||
|
cindex[i*m->nbEBands+j] = cindex[k*m->nbEBands+n];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (cache->index[i*m->nbEBands+j] == -1 && N!=0)
|
||||||
|
{
|
||||||
|
int K;
|
||||||
|
entryN[nbEntries] = N;
|
||||||
|
K = 0;
|
||||||
|
while (fits_in32(N,get_pulses(K+1)) && K<MAX_PSEUDO)
|
||||||
|
K++;
|
||||||
|
entryK[nbEntries] = K;
|
||||||
|
cindex[i*m->nbEBands+j] = curr;
|
||||||
|
entryI[nbEntries] = curr;
|
||||||
|
|
||||||
|
curr += K+1;
|
||||||
|
nbEntries++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bits = (unsigned char *)opus_alloc(sizeof(unsigned char)*curr);
|
||||||
|
cache->bits = bits;
|
||||||
|
cache->size = curr;
|
||||||
|
/* Compute the cache for all unique sizes */
|
||||||
|
for (i=0;i<nbEntries;i++)
|
||||||
|
{
|
||||||
|
unsigned char *ptr = bits+entryI[i];
|
||||||
|
opus_int16 tmp[MAX_PULSES+1];
|
||||||
|
get_required_bits(tmp, entryN[i], get_pulses(entryK[i]), BITRES);
|
||||||
|
for (j=1;j<=entryK[i];j++)
|
||||||
|
ptr[j] = tmp[get_pulses(j)]-1;
|
||||||
|
ptr[0] = entryK[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Compute the maximum rate for each band at which we'll reliably use as
|
||||||
|
many bits as we ask for. */
|
||||||
|
cache->caps = cap = (unsigned char *)opus_alloc(sizeof(cache->caps[0])*(LM+1)*2*m->nbEBands);
|
||||||
|
for (i=0;i<=LM;i++)
|
||||||
|
{
|
||||||
|
for (C=1;C<=2;C++)
|
||||||
|
{
|
||||||
|
for (j=0;j<m->nbEBands;j++)
|
||||||
|
{
|
||||||
|
int N0;
|
||||||
|
int max_bits;
|
||||||
|
N0 = m->eBands[j+1]-m->eBands[j];
|
||||||
|
/* N=1 bands only have a sign bit and fine bits. */
|
||||||
|
if (N0<<i == 1)
|
||||||
|
max_bits = C*(1+MAX_FINE_BITS)<<BITRES;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const unsigned char *pcache;
|
||||||
|
opus_int32 num;
|
||||||
|
opus_int32 den;
|
||||||
|
int LM0;
|
||||||
|
int N;
|
||||||
|
int offset;
|
||||||
|
int ndof;
|
||||||
|
int qb;
|
||||||
|
int k;
|
||||||
|
LM0 = 0;
|
||||||
|
/* Even-sized bands bigger than N=2 can be split one more time.
|
||||||
|
As of commit 44203907 all bands >1 are even, including custom modes.*/
|
||||||
|
if (N0 > 2)
|
||||||
|
{
|
||||||
|
N0>>=1;
|
||||||
|
LM0--;
|
||||||
|
}
|
||||||
|
/* N0=1 bands can't be split down to N<2. */
|
||||||
|
else if (N0 <= 1)
|
||||||
|
{
|
||||||
|
LM0=IMIN(i,1);
|
||||||
|
N0<<=LM0;
|
||||||
|
}
|
||||||
|
/* Compute the cost for the lowest-level PVQ of a fully split
|
||||||
|
band. */
|
||||||
|
pcache = bits + cindex[(LM0+1)*m->nbEBands+j];
|
||||||
|
max_bits = pcache[pcache[0]]+1;
|
||||||
|
/* Add in the cost of coding regular splits. */
|
||||||
|
N = N0;
|
||||||
|
for(k=0;k<i-LM0;k++){
|
||||||
|
max_bits <<= 1;
|
||||||
|
/* Offset the number of qtheta bits by log2(N)/2
|
||||||
|
+ QTHETA_OFFSET compared to their "fair share" of
|
||||||
|
total/N */
|
||||||
|
offset = ((m->logN[j]+((LM0+k)<<BITRES))>>1)-QTHETA_OFFSET;
|
||||||
|
/* The number of qtheta bits we'll allocate if the remainder
|
||||||
|
is to be max_bits.
|
||||||
|
The average measured cost for theta is 0.89701 times qb,
|
||||||
|
approximated here as 459/512. */
|
||||||
|
num=459*(opus_int32)((2*N-1)*offset+max_bits);
|
||||||
|
den=((opus_int32)(2*N-1)<<9)-459;
|
||||||
|
qb = IMIN((num+(den>>1))/den, 57);
|
||||||
|
celt_assert(qb >= 0);
|
||||||
|
max_bits += qb;
|
||||||
|
N <<= 1;
|
||||||
|
}
|
||||||
|
/* Add in the cost of a stereo split, if necessary. */
|
||||||
|
if (C==2)
|
||||||
|
{
|
||||||
|
max_bits <<= 1;
|
||||||
|
offset = ((m->logN[j]+(i<<BITRES))>>1)-(N==2?QTHETA_OFFSET_TWOPHASE:QTHETA_OFFSET);
|
||||||
|
ndof = 2*N-1-(N==2);
|
||||||
|
/* The average measured cost for theta with the step PDF is
|
||||||
|
0.95164 times qb, approximated here as 487/512. */
|
||||||
|
num = (N==2?512:487)*(opus_int32)(max_bits+ndof*offset);
|
||||||
|
den = ((opus_int32)ndof<<9)-(N==2?512:487);
|
||||||
|
qb = IMIN((num+(den>>1))/den, (N==2?64:61));
|
||||||
|
celt_assert(qb >= 0);
|
||||||
|
max_bits += qb;
|
||||||
|
}
|
||||||
|
/* Add the fine bits we'll use. */
|
||||||
|
/* Compensate for the extra DoF in stereo */
|
||||||
|
ndof = C*N + ((C==2 && N>2) ? 1 : 0);
|
||||||
|
/* Offset the number of fine bits by log2(N)/2 + FINE_OFFSET
|
||||||
|
compared to their "fair share" of total/N */
|
||||||
|
offset = ((m->logN[j] + (i<<BITRES))>>1)-FINE_OFFSET;
|
||||||
|
/* N=2 is the only point that doesn't match the curve */
|
||||||
|
if (N==2)
|
||||||
|
offset += 1<<BITRES>>2;
|
||||||
|
/* The number of fine bits we'll allocate if the remainder is
|
||||||
|
to be max_bits. */
|
||||||
|
num = max_bits+ndof*offset;
|
||||||
|
den = (ndof-1)<<BITRES;
|
||||||
|
qb = IMIN((num+(den>>1))/den, MAX_FINE_BITS);
|
||||||
|
celt_assert(qb >= 0);
|
||||||
|
max_bits += C*qb<<BITRES;
|
||||||
|
}
|
||||||
|
max_bits = (4*max_bits/(C*((m->eBands[j+1]-m->eBands[j])<<i)))-64;
|
||||||
|
celt_assert(max_bits >= 0);
|
||||||
|
celt_assert(max_bits < 256);
|
||||||
|
*cap++ = (unsigned char)max_bits;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* CUSTOM_MODES */
|
||||||
|
|
||||||
|
#define ALLOC_STEPS 6
|
||||||
|
|
||||||
|
static inline int interp_bits2pulses(const CELTMode *m, int start, int end, int skip_start,
|
||||||
|
const int *bits1, const int *bits2, const int *thresh, const int *cap, opus_int32 total, opus_int32 *_balance,
|
||||||
|
int skip_rsv, int *intensity, int intensity_rsv, int *dual_stereo, int dual_stereo_rsv, int *bits,
|
||||||
|
int *ebits, int *fine_priority, int C, int LM, ec_ctx *ec, int encode, int prev)
|
||||||
|
{
|
||||||
|
opus_int32 psum;
|
||||||
|
int lo, hi;
|
||||||
|
int i, j;
|
||||||
|
int logM;
|
||||||
|
int stereo;
|
||||||
|
int codedBands=-1;
|
||||||
|
int alloc_floor;
|
||||||
|
opus_int32 left, percoeff;
|
||||||
|
int done;
|
||||||
|
opus_int32 balance;
|
||||||
|
SAVE_STACK;
|
||||||
|
|
||||||
|
alloc_floor = C<<BITRES;
|
||||||
|
stereo = C>1;
|
||||||
|
|
||||||
|
logM = LM<<BITRES;
|
||||||
|
lo = 0;
|
||||||
|
hi = 1<<ALLOC_STEPS;
|
||||||
|
for (i=0;i<ALLOC_STEPS;i++)
|
||||||
|
{
|
||||||
|
int mid = (lo+hi)>>1;
|
||||||
|
psum = 0;
|
||||||
|
done = 0;
|
||||||
|
for (j=end;j-->start;)
|
||||||
|
{
|
||||||
|
int tmp = bits1[j] + (mid*(opus_int32)bits2[j]>>ALLOC_STEPS);
|
||||||
|
if (tmp >= thresh[j] || done)
|
||||||
|
{
|
||||||
|
done = 1;
|
||||||
|
/* Don't allocate more than we can actually use */
|
||||||
|
psum += IMIN(tmp, cap[j]);
|
||||||
|
} else {
|
||||||
|
if (tmp >= alloc_floor)
|
||||||
|
psum += alloc_floor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (psum > total)
|
||||||
|
hi = mid;
|
||||||
|
else
|
||||||
|
lo = mid;
|
||||||
|
}
|
||||||
|
psum = 0;
|
||||||
|
/*printf ("interp bisection gave %d\n", lo);*/
|
||||||
|
done = 0;
|
||||||
|
for (j=end;j-->start;)
|
||||||
|
{
|
||||||
|
int tmp = bits1[j] + (lo*bits2[j]>>ALLOC_STEPS);
|
||||||
|
if (tmp < thresh[j] && !done)
|
||||||
|
{
|
||||||
|
if (tmp >= alloc_floor)
|
||||||
|
tmp = alloc_floor;
|
||||||
|
else
|
||||||
|
tmp = 0;
|
||||||
|
} else
|
||||||
|
done = 1;
|
||||||
|
/* Don't allocate more than we can actually use */
|
||||||
|
tmp = IMIN(tmp, cap[j]);
|
||||||
|
bits[j] = tmp;
|
||||||
|
psum += tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Decide which bands to skip, working backwards from the end. */
|
||||||
|
for (codedBands=end;;codedBands--)
|
||||||
|
{
|
||||||
|
int band_width;
|
||||||
|
int band_bits;
|
||||||
|
int rem;
|
||||||
|
j = codedBands-1;
|
||||||
|
/* Never skip the first band, nor a band that has been boosted by
|
||||||
|
dynalloc.
|
||||||
|
In the first case, we'd be coding a bit to signal we're going to waste
|
||||||
|
all the other bits.
|
||||||
|
In the second case, we'd be coding a bit to redistribute all the bits
|
||||||
|
we just signaled should be cocentrated in this band. */
|
||||||
|
if (j<=skip_start)
|
||||||
|
{
|
||||||
|
/* Give the bit we reserved to end skipping back. */
|
||||||
|
total += skip_rsv;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/*Figure out how many left-over bits we would be adding to this band.
|
||||||
|
This can include bits we've stolen back from higher, skipped bands.*/
|
||||||
|
left = total-psum;
|
||||||
|
percoeff = left/(m->eBands[codedBands]-m->eBands[start]);
|
||||||
|
left -= (m->eBands[codedBands]-m->eBands[start])*percoeff;
|
||||||
|
rem = IMAX(left-(m->eBands[j]-m->eBands[start]),0);
|
||||||
|
band_width = m->eBands[codedBands]-m->eBands[j];
|
||||||
|
band_bits = (int)(bits[j] + percoeff*band_width + rem);
|
||||||
|
/*Only code a skip decision if we're above the threshold for this band.
|
||||||
|
Otherwise it is force-skipped.
|
||||||
|
This ensures that we have enough bits to code the skip flag.*/
|
||||||
|
if (band_bits >= IMAX(thresh[j], alloc_floor+(1<<BITRES)))
|
||||||
|
{
|
||||||
|
if (encode)
|
||||||
|
{
|
||||||
|
/*This if() block is the only part of the allocation function that
|
||||||
|
is not a mandatory part of the bitstream: any bands we choose to
|
||||||
|
skip here must be explicitly signaled.*/
|
||||||
|
/*Choose a threshold with some hysteresis to keep bands from
|
||||||
|
fluctuating in and out.*/
|
||||||
|
#ifdef FUZZING
|
||||||
|
if ((rand()&0x1) == 0)
|
||||||
|
#else
|
||||||
|
if (codedBands<=start+2 || band_bits > ((j<prev?7:9)*band_width<<LM<<BITRES)>>4)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
ec_enc_bit_logp(ec, 1, 1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
ec_enc_bit_logp(ec, 0, 1);
|
||||||
|
} else if (ec_dec_bit_logp(ec, 1)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/*We used a bit to skip this band.*/
|
||||||
|
psum += 1<<BITRES;
|
||||||
|
band_bits -= 1<<BITRES;
|
||||||
|
}
|
||||||
|
/*Reclaim the bits originally allocated to this band.*/
|
||||||
|
psum -= bits[j]+intensity_rsv;
|
||||||
|
if (intensity_rsv > 0)
|
||||||
|
intensity_rsv = LOG2_FRAC_TABLE[j-start];
|
||||||
|
psum += intensity_rsv;
|
||||||
|
if (band_bits >= alloc_floor)
|
||||||
|
{
|
||||||
|
/*If we have enough for a fine energy bit per channel, use it.*/
|
||||||
|
psum += alloc_floor;
|
||||||
|
bits[j] = alloc_floor;
|
||||||
|
} else {
|
||||||
|
/*Otherwise this band gets nothing at all.*/
|
||||||
|
bits[j] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
celt_assert(codedBands > start);
|
||||||
|
/* Code the intensity and dual stereo parameters. */
|
||||||
|
if (intensity_rsv > 0)
|
||||||
|
{
|
||||||
|
if (encode)
|
||||||
|
{
|
||||||
|
*intensity = IMIN(*intensity, codedBands);
|
||||||
|
ec_enc_uint(ec, *intensity-start, codedBands+1-start);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
*intensity = start+ec_dec_uint(ec, codedBands+1-start);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
*intensity = 0;
|
||||||
|
if (*intensity <= start)
|
||||||
|
{
|
||||||
|
total += dual_stereo_rsv;
|
||||||
|
dual_stereo_rsv = 0;
|
||||||
|
}
|
||||||
|
if (dual_stereo_rsv > 0)
|
||||||
|
{
|
||||||
|
if (encode)
|
||||||
|
ec_enc_bit_logp(ec, *dual_stereo, 1);
|
||||||
|
else
|
||||||
|
*dual_stereo = ec_dec_bit_logp(ec, 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
*dual_stereo = 0;
|
||||||
|
|
||||||
|
/* Allocate the remaining bits */
|
||||||
|
left = total-psum;
|
||||||
|
percoeff = left/(m->eBands[codedBands]-m->eBands[start]);
|
||||||
|
left -= (m->eBands[codedBands]-m->eBands[start])*percoeff;
|
||||||
|
for (j=start;j<codedBands;j++)
|
||||||
|
bits[j] += ((int)percoeff*(m->eBands[j+1]-m->eBands[j]));
|
||||||
|
for (j=start;j<codedBands;j++)
|
||||||
|
{
|
||||||
|
int tmp = (int)IMIN(left, m->eBands[j+1]-m->eBands[j]);
|
||||||
|
bits[j] += tmp;
|
||||||
|
left -= tmp;
|
||||||
|
}
|
||||||
|
/*for (j=0;j<end;j++)printf("%d ", bits[j]);printf("\n");*/
|
||||||
|
|
||||||
|
balance = 0;
|
||||||
|
for (j=start;j<codedBands;j++)
|
||||||
|
{
|
||||||
|
int N0, N, den;
|
||||||
|
int offset;
|
||||||
|
int NClogN;
|
||||||
|
opus_int32 excess, bit;
|
||||||
|
|
||||||
|
celt_assert(bits[j] >= 0);
|
||||||
|
N0 = m->eBands[j+1]-m->eBands[j];
|
||||||
|
N=N0<<LM;
|
||||||
|
bit = (opus_int32)bits[j]+balance;
|
||||||
|
|
||||||
|
if (N>1)
|
||||||
|
{
|
||||||
|
excess = MAX32(bit-cap[j],0);
|
||||||
|
bits[j] = bit-excess;
|
||||||
|
|
||||||
|
/* Compensate for the extra DoF in stereo */
|
||||||
|
den=(C*N+ ((C==2 && N>2 && !*dual_stereo && j<*intensity) ? 1 : 0));
|
||||||
|
|
||||||
|
NClogN = den*(m->logN[j] + logM);
|
||||||
|
|
||||||
|
/* Offset for the number of fine bits by log2(N)/2 + FINE_OFFSET
|
||||||
|
compared to their "fair share" of total/N */
|
||||||
|
offset = (NClogN>>1)-den*FINE_OFFSET;
|
||||||
|
|
||||||
|
/* N=2 is the only point that doesn't match the curve */
|
||||||
|
if (N==2)
|
||||||
|
offset += den<<BITRES>>2;
|
||||||
|
|
||||||
|
/* Changing the offset for allocating the second and third
|
||||||
|
fine energy bit */
|
||||||
|
if (bits[j] + offset < den*2<<BITRES)
|
||||||
|
offset += NClogN>>2;
|
||||||
|
else if (bits[j] + offset < den*3<<BITRES)
|
||||||
|
offset += NClogN>>3;
|
||||||
|
|
||||||
|
/* Divide with rounding */
|
||||||
|
ebits[j] = IMAX(0, (bits[j] + offset + (den<<(BITRES-1))) / (den<<BITRES));
|
||||||
|
|
||||||
|
/* Make sure not to bust */
|
||||||
|
if (C*ebits[j] > (bits[j]>>BITRES))
|
||||||
|
ebits[j] = bits[j] >> stereo >> BITRES;
|
||||||
|
|
||||||
|
/* More than that is useless because that's about as far as PVQ can go */
|
||||||
|
ebits[j] = IMIN(ebits[j], MAX_FINE_BITS);
|
||||||
|
|
||||||
|
/* If we rounded down or capped this band, make it a candidate for the
|
||||||
|
final fine energy pass */
|
||||||
|
fine_priority[j] = ebits[j]*(den<<BITRES) >= bits[j]+offset;
|
||||||
|
|
||||||
|
/* Remove the allocated fine bits; the rest are assigned to PVQ */
|
||||||
|
bits[j] -= C*ebits[j]<<BITRES;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
/* For N=1, all bits go to fine energy except for a single sign bit */
|
||||||
|
excess = MAX32(0,bit-(C<<BITRES));
|
||||||
|
bits[j] = bit-excess;
|
||||||
|
ebits[j] = 0;
|
||||||
|
fine_priority[j] = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Fine energy can't take advantage of the re-balancing in
|
||||||
|
quant_all_bands().
|
||||||
|
Instead, do the re-balancing here.*/
|
||||||
|
if(excess > 0)
|
||||||
|
{
|
||||||
|
int extra_fine;
|
||||||
|
int extra_bits;
|
||||||
|
extra_fine = IMIN(excess>>(stereo+BITRES),MAX_FINE_BITS-ebits[j]);
|
||||||
|
ebits[j] += extra_fine;
|
||||||
|
extra_bits = extra_fine*C<<BITRES;
|
||||||
|
fine_priority[j] = extra_bits >= excess-balance;
|
||||||
|
excess -= extra_bits;
|
||||||
|
}
|
||||||
|
balance = excess;
|
||||||
|
|
||||||
|
celt_assert(bits[j] >= 0);
|
||||||
|
celt_assert(ebits[j] >= 0);
|
||||||
|
}
|
||||||
|
/* Save any remaining bits over the cap for the rebalancing in
|
||||||
|
quant_all_bands(). */
|
||||||
|
*_balance = balance;
|
||||||
|
|
||||||
|
/* The skipped bands use all their bits for fine energy. */
|
||||||
|
for (;j<end;j++)
|
||||||
|
{
|
||||||
|
ebits[j] = bits[j] >> stereo >> BITRES;
|
||||||
|
celt_assert(C*ebits[j]<<BITRES == bits[j]);
|
||||||
|
bits[j] = 0;
|
||||||
|
fine_priority[j] = ebits[j]<1;
|
||||||
|
}
|
||||||
|
RESTORE_STACK;
|
||||||
|
return codedBands;
|
||||||
|
}
|
||||||
|
|
||||||
|
int compute_allocation(const CELTMode *m, int start, int end, const int *offsets, const int *cap, int alloc_trim, int *intensity, int *dual_stereo,
|
||||||
|
opus_int32 total, opus_int32 *balance, int *pulses, int *ebits, int *fine_priority, int C, int LM, ec_ctx *ec, int encode, int prev)
|
||||||
|
{
|
||||||
|
int lo, hi, len, j;
|
||||||
|
int codedBands;
|
||||||
|
int skip_start;
|
||||||
|
int skip_rsv;
|
||||||
|
int intensity_rsv;
|
||||||
|
int dual_stereo_rsv;
|
||||||
|
VARDECL(int, bits1);
|
||||||
|
VARDECL(int, bits2);
|
||||||
|
VARDECL(int, thresh);
|
||||||
|
VARDECL(int, trim_offset);
|
||||||
|
SAVE_STACK;
|
||||||
|
|
||||||
|
total = IMAX(total, 0);
|
||||||
|
len = m->nbEBands;
|
||||||
|
skip_start = start;
|
||||||
|
/* Reserve a bit to signal the end of manually skipped bands. */
|
||||||
|
skip_rsv = total >= 1<<BITRES ? 1<<BITRES : 0;
|
||||||
|
total -= skip_rsv;
|
||||||
|
/* Reserve bits for the intensity and dual stereo parameters. */
|
||||||
|
intensity_rsv = dual_stereo_rsv = 0;
|
||||||
|
if (C==2)
|
||||||
|
{
|
||||||
|
intensity_rsv = LOG2_FRAC_TABLE[end-start];
|
||||||
|
if (intensity_rsv>total)
|
||||||
|
intensity_rsv = 0;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
total -= intensity_rsv;
|
||||||
|
dual_stereo_rsv = total>=1<<BITRES ? 1<<BITRES : 0;
|
||||||
|
total -= dual_stereo_rsv;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ALLOC(bits1, len, int);
|
||||||
|
ALLOC(bits2, len, int);
|
||||||
|
ALLOC(thresh, len, int);
|
||||||
|
ALLOC(trim_offset, len, int);
|
||||||
|
|
||||||
|
for (j=start;j<end;j++)
|
||||||
|
{
|
||||||
|
/* Below this threshold, we're sure not to allocate any PVQ bits */
|
||||||
|
thresh[j] = IMAX((C)<<BITRES, (3*(m->eBands[j+1]-m->eBands[j])<<LM<<BITRES)>>4);
|
||||||
|
/* Tilt of the allocation curve */
|
||||||
|
trim_offset[j] = C*(m->eBands[j+1]-m->eBands[j])*(alloc_trim-5-LM)*(end-j-1)
|
||||||
|
*(1<<(LM+BITRES))>>6;
|
||||||
|
/* Giving less resolution to single-coefficient bands because they get
|
||||||
|
more benefit from having one coarse value per coefficient*/
|
||||||
|
if ((m->eBands[j+1]-m->eBands[j])<<LM==1)
|
||||||
|
trim_offset[j] -= C<<BITRES;
|
||||||
|
}
|
||||||
|
lo = 1;
|
||||||
|
hi = m->nbAllocVectors - 1;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
int done = 0;
|
||||||
|
int psum = 0;
|
||||||
|
int mid = (lo+hi) >> 1;
|
||||||
|
for (j=end;j-->start;)
|
||||||
|
{
|
||||||
|
int bitsj;
|
||||||
|
int N = m->eBands[j+1]-m->eBands[j];
|
||||||
|
bitsj = C*N*m->allocVectors[mid*len+j]<<LM>>2;
|
||||||
|
if (bitsj > 0)
|
||||||
|
bitsj = IMAX(0, bitsj + trim_offset[j]);
|
||||||
|
bitsj += offsets[j];
|
||||||
|
if (bitsj >= thresh[j] || done)
|
||||||
|
{
|
||||||
|
done = 1;
|
||||||
|
/* Don't allocate more than we can actually use */
|
||||||
|
psum += IMIN(bitsj, cap[j]);
|
||||||
|
} else {
|
||||||
|
if (bitsj >= C<<BITRES)
|
||||||
|
psum += C<<BITRES;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (psum > total)
|
||||||
|
hi = mid - 1;
|
||||||
|
else
|
||||||
|
lo = mid + 1;
|
||||||
|
/*printf ("lo = %d, hi = %d\n", lo, hi);*/
|
||||||
|
}
|
||||||
|
while (lo <= hi);
|
||||||
|
hi = lo--;
|
||||||
|
/*printf ("interp between %d and %d\n", lo, hi);*/
|
||||||
|
for (j=start;j<end;j++)
|
||||||
|
{
|
||||||
|
int bits1j, bits2j;
|
||||||
|
int N = m->eBands[j+1]-m->eBands[j];
|
||||||
|
bits1j = C*N*m->allocVectors[lo*len+j]<<LM>>2;
|
||||||
|
bits2j = hi>=m->nbAllocVectors ?
|
||||||
|
cap[j] : C*N*m->allocVectors[hi*len+j]<<LM>>2;
|
||||||
|
if (bits1j > 0)
|
||||||
|
bits1j = IMAX(0, bits1j + trim_offset[j]);
|
||||||
|
if (bits2j > 0)
|
||||||
|
bits2j = IMAX(0, bits2j + trim_offset[j]);
|
||||||
|
if (lo > 0)
|
||||||
|
bits1j += offsets[j];
|
||||||
|
bits2j += offsets[j];
|
||||||
|
if (offsets[j]>0)
|
||||||
|
skip_start = j;
|
||||||
|
bits2j = IMAX(0,bits2j-bits1j);
|
||||||
|
bits1[j] = bits1j;
|
||||||
|
bits2[j] = bits2j;
|
||||||
|
}
|
||||||
|
codedBands = interp_bits2pulses(m, start, end, skip_start, bits1, bits2, thresh, cap,
|
||||||
|
total, balance, skip_rsv, intensity, intensity_rsv, dual_stereo, dual_stereo_rsv,
|
||||||
|
pulses, ebits, fine_priority, C, LM, ec, encode, prev);
|
||||||
|
RESTORE_STACK;
|
||||||
|
return codedBands;
|
||||||
|
}
|
||||||
|
|
101
Frameworks/Opus/Opus/opus/celt/rate.h
Normal file
101
Frameworks/Opus/Opus/opus/celt/rate.h
Normal file
|
@ -0,0 +1,101 @@
|
||||||
|
/* Copyright (c) 2007-2008 CSIRO
|
||||||
|
Copyright (c) 2007-2009 Xiph.Org Foundation
|
||||||
|
Written by Jean-Marc Valin */
|
||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef RATE_H
|
||||||
|
#define RATE_H
|
||||||
|
|
||||||
|
#define MAX_PSEUDO 40
|
||||||
|
#define LOG_MAX_PSEUDO 6
|
||||||
|
|
||||||
|
#define MAX_PULSES 128
|
||||||
|
|
||||||
|
#define MAX_FINE_BITS 8
|
||||||
|
|
||||||
|
#define FINE_OFFSET 21
|
||||||
|
#define QTHETA_OFFSET 4
|
||||||
|
#define QTHETA_OFFSET_TWOPHASE 16
|
||||||
|
|
||||||
|
#include "cwrs.h"
|
||||||
|
#include "modes.h"
|
||||||
|
|
||||||
|
void compute_pulse_cache(CELTMode *m, int LM);
|
||||||
|
|
||||||
|
static inline int get_pulses(int i)
|
||||||
|
{
|
||||||
|
return i<8 ? i : (8 + (i&7)) << ((i>>3)-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int bits2pulses(const CELTMode *m, int band, int LM, int bits)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int lo, hi;
|
||||||
|
const unsigned char *cache;
|
||||||
|
|
||||||
|
LM++;
|
||||||
|
cache = m->cache.bits + m->cache.index[LM*m->nbEBands+band];
|
||||||
|
|
||||||
|
lo = 0;
|
||||||
|
hi = cache[0];
|
||||||
|
bits--;
|
||||||
|
for (i=0;i<LOG_MAX_PSEUDO;i++)
|
||||||
|
{
|
||||||
|
int mid = (lo+hi+1)>>1;
|
||||||
|
/* OPT: Make sure this is implemented with a conditional move */
|
||||||
|
if ((int)cache[mid] >= bits)
|
||||||
|
hi = mid;
|
||||||
|
else
|
||||||
|
lo = mid;
|
||||||
|
}
|
||||||
|
if (bits- (lo == 0 ? -1 : (int)cache[lo]) <= (int)cache[hi]-bits)
|
||||||
|
return lo;
|
||||||
|
else
|
||||||
|
return hi;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int pulses2bits(const CELTMode *m, int band, int LM, int pulses)
|
||||||
|
{
|
||||||
|
const unsigned char *cache;
|
||||||
|
|
||||||
|
LM++;
|
||||||
|
cache = m->cache.bits + m->cache.index[LM*m->nbEBands+band];
|
||||||
|
return pulses == 0 ? 0 : cache[pulses]+1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Compute the pulse allocation, i.e. how many pulses will go in each
|
||||||
|
* band.
|
||||||
|
@param m mode
|
||||||
|
@param offsets Requested increase or decrease in the number of bits for
|
||||||
|
each band
|
||||||
|
@param total Number of bands
|
||||||
|
@param pulses Number of pulses per band (returned)
|
||||||
|
@return Total number of bits allocated
|
||||||
|
*/
|
||||||
|
int compute_allocation(const CELTMode *m, int start, int end, const int *offsets, const int *cap, int alloc_trim, int *intensity, int *dual_stero,
|
||||||
|
opus_int32 total, opus_int32 *balance, int *pulses, int *ebits, int *fine_priority, int C, int LM, ec_ctx *ec, int encode, int prev);
|
||||||
|
|
||||||
|
#endif
|
149
Frameworks/Opus/Opus/opus/celt/stack_alloc.h
Normal file
149
Frameworks/Opus/Opus/opus/celt/stack_alloc.h
Normal file
|
@ -0,0 +1,149 @@
|
||||||
|
/* Copyright (C) 2002-2003 Jean-Marc Valin
|
||||||
|
Copyright (C) 2007-2009 Xiph.Org Foundation */
|
||||||
|
/**
|
||||||
|
@file stack_alloc.h
|
||||||
|
@brief Temporary memory allocation on stack
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef STACK_ALLOC_H
|
||||||
|
#define STACK_ALLOC_H
|
||||||
|
|
||||||
|
#if (!defined (VAR_ARRAYS) && !defined (USE_ALLOCA) && !defined (NONTHREADSAFE_PSEUDOSTACK))
|
||||||
|
#error "Opus requires one of VAR_ARRAYS, USE_ALLOCA, or NONTHREADSAFE_PSEUDOSTACK be defined to select the temporary allocation mode."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef USE_ALLOCA
|
||||||
|
# ifdef WIN32
|
||||||
|
# include <malloc.h>
|
||||||
|
# else
|
||||||
|
# ifdef HAVE_ALLOCA_H
|
||||||
|
# include <alloca.h>
|
||||||
|
# else
|
||||||
|
# include <stdlib.h>
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @def ALIGN(stack, size)
|
||||||
|
*
|
||||||
|
* Aligns the stack to a 'size' boundary
|
||||||
|
*
|
||||||
|
* @param stack Stack
|
||||||
|
* @param size New size boundary
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @def PUSH(stack, size, type)
|
||||||
|
*
|
||||||
|
* Allocates 'size' elements of type 'type' on the stack
|
||||||
|
*
|
||||||
|
* @param stack Stack
|
||||||
|
* @param size Number of elements
|
||||||
|
* @param type Type of element
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @def VARDECL(var)
|
||||||
|
*
|
||||||
|
* Declare variable on stack
|
||||||
|
*
|
||||||
|
* @param var Variable to declare
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @def ALLOC(var, size, type)
|
||||||
|
*
|
||||||
|
* Allocate 'size' elements of 'type' on stack
|
||||||
|
*
|
||||||
|
* @param var Name of variable to allocate
|
||||||
|
* @param size Number of elements
|
||||||
|
* @param type Type of element
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined(VAR_ARRAYS)
|
||||||
|
|
||||||
|
#define VARDECL(type, var)
|
||||||
|
#define ALLOC(var, size, type) type var[size]
|
||||||
|
#define SAVE_STACK
|
||||||
|
#define RESTORE_STACK
|
||||||
|
#define ALLOC_STACK
|
||||||
|
|
||||||
|
#elif defined(USE_ALLOCA)
|
||||||
|
|
||||||
|
#define VARDECL(type, var) type *var
|
||||||
|
|
||||||
|
# ifdef WIN32
|
||||||
|
# define ALLOC(var, size, type) var = ((type*)_alloca(sizeof(type)*(size)))
|
||||||
|
# else
|
||||||
|
# define ALLOC(var, size, type) var = ((type*)alloca(sizeof(type)*(size)))
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#define SAVE_STACK
|
||||||
|
#define RESTORE_STACK
|
||||||
|
#define ALLOC_STACK
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#ifdef CELT_C
|
||||||
|
char *global_stack=0;
|
||||||
|
#else
|
||||||
|
extern char *global_stack;
|
||||||
|
#endif /* CELT_C */
|
||||||
|
|
||||||
|
#ifdef ENABLE_VALGRIND
|
||||||
|
|
||||||
|
#include <valgrind/memcheck.h>
|
||||||
|
|
||||||
|
#ifdef CELT_C
|
||||||
|
char *global_stack_top=0;
|
||||||
|
#else
|
||||||
|
extern char *global_stack_top;
|
||||||
|
#endif /* CELT_C */
|
||||||
|
|
||||||
|
#define ALIGN(stack, size) ((stack) += ((size) - (long)(stack)) & ((size) - 1))
|
||||||
|
#define PUSH(stack, size, type) (VALGRIND_MAKE_MEM_NOACCESS(stack, global_stack_top-stack),ALIGN((stack),sizeof(type)/sizeof(char)),VALGRIND_MAKE_MEM_UNDEFINED(stack, ((size)*sizeof(type)/sizeof(char))),(stack)+=(2*(size)*sizeof(type)/sizeof(char)),(type*)((stack)-(2*(size)*sizeof(type)/sizeof(char))))
|
||||||
|
#define RESTORE_STACK ((global_stack = _saved_stack),VALGRIND_MAKE_MEM_NOACCESS(global_stack, global_stack_top-global_stack))
|
||||||
|
#define ALLOC_STACK char *_saved_stack; ((global_stack = (global_stack==0) ? ((global_stack_top=opus_alloc_scratch(GLOBAL_STACK_SIZE*2)+(GLOBAL_STACK_SIZE*2))-(GLOBAL_STACK_SIZE*2)) : global_stack),VALGRIND_MAKE_MEM_NOACCESS(global_stack, global_stack_top-global_stack)); _saved_stack = global_stack;
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#define ALIGN(stack, size) ((stack) += ((size) - (long)(stack)) & ((size) - 1))
|
||||||
|
#define PUSH(stack, size, type) (ALIGN((stack),sizeof(type)/sizeof(char)),(stack)+=(size)*(sizeof(type)/sizeof(char)),(type*)((stack)-(size)*(sizeof(type)/sizeof(char))))
|
||||||
|
#define RESTORE_STACK (global_stack = _saved_stack)
|
||||||
|
#define ALLOC_STACK char *_saved_stack; (global_stack = (global_stack==0) ? opus_alloc_scratch(GLOBAL_STACK_SIZE) : global_stack); _saved_stack = global_stack;
|
||||||
|
|
||||||
|
#endif /* ENABLE_VALGRIND */
|
||||||
|
|
||||||
|
#include "os_support.h"
|
||||||
|
#define VARDECL(type, var) type *var
|
||||||
|
#define ALLOC(var, size, type) var = PUSH(global_stack, size, type)
|
||||||
|
#define SAVE_STACK char *_saved_stack = global_stack;
|
||||||
|
|
||||||
|
#endif /* VAR_ARRAYS */
|
||||||
|
|
||||||
|
#endif /* STACK_ALLOC_H */
|
595
Frameworks/Opus/Opus/opus/celt/static_modes_fixed.h
Normal file
595
Frameworks/Opus/Opus/opus/celt/static_modes_fixed.h
Normal file
|
@ -0,0 +1,595 @@
|
||||||
|
/* The contents of this file was automatically generated by dump_modes.c
|
||||||
|
with arguments: 48000 960
|
||||||
|
It contains static definitions for some pre-defined modes. */
|
||||||
|
#include "modes.h"
|
||||||
|
#include "rate.h"
|
||||||
|
|
||||||
|
#ifndef DEF_WINDOW120
|
||||||
|
#define DEF_WINDOW120
|
||||||
|
static const opus_val16 window120[120] = {
|
||||||
|
2, 20, 55, 108, 178,
|
||||||
|
266, 372, 494, 635, 792,
|
||||||
|
966, 1157, 1365, 1590, 1831,
|
||||||
|
2089, 2362, 2651, 2956, 3276,
|
||||||
|
3611, 3961, 4325, 4703, 5094,
|
||||||
|
5499, 5916, 6346, 6788, 7241,
|
||||||
|
7705, 8179, 8663, 9156, 9657,
|
||||||
|
10167, 10684, 11207, 11736, 12271,
|
||||||
|
12810, 13353, 13899, 14447, 14997,
|
||||||
|
15547, 16098, 16648, 17197, 17744,
|
||||||
|
18287, 18827, 19363, 19893, 20418,
|
||||||
|
20936, 21447, 21950, 22445, 22931,
|
||||||
|
23407, 23874, 24330, 24774, 25208,
|
||||||
|
25629, 26039, 26435, 26819, 27190,
|
||||||
|
27548, 27893, 28224, 28541, 28845,
|
||||||
|
29135, 29411, 29674, 29924, 30160,
|
||||||
|
30384, 30594, 30792, 30977, 31151,
|
||||||
|
31313, 31463, 31602, 31731, 31849,
|
||||||
|
31958, 32057, 32148, 32229, 32303,
|
||||||
|
32370, 32429, 32481, 32528, 32568,
|
||||||
|
32604, 32634, 32661, 32683, 32701,
|
||||||
|
32717, 32729, 32740, 32748, 32754,
|
||||||
|
32758, 32762, 32764, 32766, 32767,
|
||||||
|
32767, 32767, 32767, 32767, 32767,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef DEF_LOGN400
|
||||||
|
#define DEF_LOGN400
|
||||||
|
static const opus_int16 logN400[21] = {
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 16, 16, 16, 21, 21, 24, 29, 34, 36, };
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef DEF_PULSE_CACHE50
|
||||||
|
#define DEF_PULSE_CACHE50
|
||||||
|
static const opus_int16 cache_index50[105] = {
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 41, 41, 41,
|
||||||
|
82, 82, 123, 164, 200, 222, 0, 0, 0, 0, 0, 0, 0, 0, 41,
|
||||||
|
41, 41, 41, 123, 123, 123, 164, 164, 240, 266, 283, 295, 41, 41, 41,
|
||||||
|
41, 41, 41, 41, 41, 123, 123, 123, 123, 240, 240, 240, 266, 266, 305,
|
||||||
|
318, 328, 336, 123, 123, 123, 123, 123, 123, 123, 123, 240, 240, 240, 240,
|
||||||
|
305, 305, 305, 318, 318, 343, 351, 358, 364, 240, 240, 240, 240, 240, 240,
|
||||||
|
240, 240, 305, 305, 305, 305, 343, 343, 343, 351, 351, 370, 376, 382, 387,
|
||||||
|
};
|
||||||
|
static const unsigned char cache_bits50[392] = {
|
||||||
|
40, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
||||||
|
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
||||||
|
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 40, 15, 23, 28,
|
||||||
|
31, 34, 36, 38, 39, 41, 42, 43, 44, 45, 46, 47, 47, 49, 50,
|
||||||
|
51, 52, 53, 54, 55, 55, 57, 58, 59, 60, 61, 62, 63, 63, 65,
|
||||||
|
66, 67, 68, 69, 70, 71, 71, 40, 20, 33, 41, 48, 53, 57, 61,
|
||||||
|
64, 66, 69, 71, 73, 75, 76, 78, 80, 82, 85, 87, 89, 91, 92,
|
||||||
|
94, 96, 98, 101, 103, 105, 107, 108, 110, 112, 114, 117, 119, 121, 123,
|
||||||
|
124, 126, 128, 40, 23, 39, 51, 60, 67, 73, 79, 83, 87, 91, 94,
|
||||||
|
97, 100, 102, 105, 107, 111, 115, 118, 121, 124, 126, 129, 131, 135, 139,
|
||||||
|
142, 145, 148, 150, 153, 155, 159, 163, 166, 169, 172, 174, 177, 179, 35,
|
||||||
|
28, 49, 65, 78, 89, 99, 107, 114, 120, 126, 132, 136, 141, 145, 149,
|
||||||
|
153, 159, 165, 171, 176, 180, 185, 189, 192, 199, 205, 211, 216, 220, 225,
|
||||||
|
229, 232, 239, 245, 251, 21, 33, 58, 79, 97, 112, 125, 137, 148, 157,
|
||||||
|
166, 174, 182, 189, 195, 201, 207, 217, 227, 235, 243, 251, 17, 35, 63,
|
||||||
|
86, 106, 123, 139, 152, 165, 177, 187, 197, 206, 214, 222, 230, 237, 250,
|
||||||
|
25, 31, 55, 75, 91, 105, 117, 128, 138, 146, 154, 161, 168, 174, 180,
|
||||||
|
185, 190, 200, 208, 215, 222, 229, 235, 240, 245, 255, 16, 36, 65, 89,
|
||||||
|
110, 128, 144, 159, 173, 185, 196, 207, 217, 226, 234, 242, 250, 11, 41,
|
||||||
|
74, 103, 128, 151, 172, 191, 209, 225, 241, 255, 9, 43, 79, 110, 138,
|
||||||
|
163, 186, 207, 227, 246, 12, 39, 71, 99, 123, 144, 164, 182, 198, 214,
|
||||||
|
228, 241, 253, 9, 44, 81, 113, 142, 168, 192, 214, 235, 255, 7, 49,
|
||||||
|
90, 127, 160, 191, 220, 247, 6, 51, 95, 134, 170, 203, 234, 7, 47,
|
||||||
|
87, 123, 155, 184, 212, 237, 6, 52, 97, 137, 174, 208, 240, 5, 57,
|
||||||
|
106, 151, 192, 231, 5, 59, 111, 158, 202, 243, 5, 55, 103, 147, 187,
|
||||||
|
224, 5, 60, 113, 161, 206, 248, 4, 65, 122, 175, 224, 4, 67, 127,
|
||||||
|
182, 234, };
|
||||||
|
static const unsigned char cache_caps50[168] = {
|
||||||
|
224, 224, 224, 224, 224, 224, 224, 224, 160, 160, 160, 160, 185, 185, 185,
|
||||||
|
178, 178, 168, 134, 61, 37, 224, 224, 224, 224, 224, 224, 224, 224, 240,
|
||||||
|
240, 240, 240, 207, 207, 207, 198, 198, 183, 144, 66, 40, 160, 160, 160,
|
||||||
|
160, 160, 160, 160, 160, 185, 185, 185, 185, 193, 193, 193, 183, 183, 172,
|
||||||
|
138, 64, 38, 240, 240, 240, 240, 240, 240, 240, 240, 207, 207, 207, 207,
|
||||||
|
204, 204, 204, 193, 193, 180, 143, 66, 40, 185, 185, 185, 185, 185, 185,
|
||||||
|
185, 185, 193, 193, 193, 193, 193, 193, 193, 183, 183, 172, 138, 65, 39,
|
||||||
|
207, 207, 207, 207, 207, 207, 207, 207, 204, 204, 204, 204, 201, 201, 201,
|
||||||
|
188, 188, 176, 141, 66, 40, 193, 193, 193, 193, 193, 193, 193, 193, 193,
|
||||||
|
193, 193, 193, 194, 194, 194, 184, 184, 173, 139, 65, 39, 204, 204, 204,
|
||||||
|
204, 204, 204, 204, 204, 201, 201, 201, 201, 198, 198, 198, 187, 187, 175,
|
||||||
|
140, 66, 40, };
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef FFT_TWIDDLES48000_960
|
||||||
|
#define FFT_TWIDDLES48000_960
|
||||||
|
static const kiss_twiddle_cpx fft_twiddles48000_960[480] = {
|
||||||
|
{32767, 0}, {32766, -429},
|
||||||
|
{32757, -858}, {32743, -1287},
|
||||||
|
{32724, -1715}, {32698, -2143},
|
||||||
|
{32667, -2570}, {32631, -2998},
|
||||||
|
{32588, -3425}, {32541, -3851},
|
||||||
|
{32488, -4277}, {32429, -4701},
|
||||||
|
{32364, -5125}, {32295, -5548},
|
||||||
|
{32219, -5971}, {32138, -6393},
|
||||||
|
{32051, -6813}, {31960, -7231},
|
||||||
|
{31863, -7650}, {31760, -8067},
|
||||||
|
{31652, -8481}, {31539, -8895},
|
||||||
|
{31419, -9306}, {31294, -9716},
|
||||||
|
{31165, -10126}, {31030, -10532},
|
||||||
|
{30889, -10937}, {30743, -11340},
|
||||||
|
{30592, -11741}, {30436, -12141},
|
||||||
|
{30274, -12540}, {30107, -12935},
|
||||||
|
{29936, -13328}, {29758, -13718},
|
||||||
|
{29577, -14107}, {29390, -14493},
|
||||||
|
{29197, -14875}, {29000, -15257},
|
||||||
|
{28797, -15635}, {28590, -16010},
|
||||||
|
{28379, -16384}, {28162, -16753},
|
||||||
|
{27940, -17119}, {27714, -17484},
|
||||||
|
{27482, -17845}, {27246, -18205},
|
||||||
|
{27006, -18560}, {26760, -18911},
|
||||||
|
{26510, -19260}, {26257, -19606},
|
||||||
|
{25997, -19947}, {25734, -20286},
|
||||||
|
{25466, -20621}, {25194, -20952},
|
||||||
|
{24918, -21281}, {24637, -21605},
|
||||||
|
{24353, -21926}, {24063, -22242},
|
||||||
|
{23770, -22555}, {23473, -22865},
|
||||||
|
{23171, -23171}, {22866, -23472},
|
||||||
|
{22557, -23769}, {22244, -24063},
|
||||||
|
{21927, -24352}, {21606, -24636},
|
||||||
|
{21282, -24917}, {20954, -25194},
|
||||||
|
{20622, -25465}, {20288, -25733},
|
||||||
|
{19949, -25997}, {19607, -26255},
|
||||||
|
{19261, -26509}, {18914, -26760},
|
||||||
|
{18561, -27004}, {18205, -27246},
|
||||||
|
{17846, -27481}, {17485, -27713},
|
||||||
|
{17122, -27940}, {16755, -28162},
|
||||||
|
{16385, -28378}, {16012, -28590},
|
||||||
|
{15636, -28797}, {15258, -28999},
|
||||||
|
{14878, -29197}, {14494, -29389},
|
||||||
|
{14108, -29576}, {13720, -29757},
|
||||||
|
{13329, -29934}, {12937, -30107},
|
||||||
|
{12540, -30274}, {12142, -30435},
|
||||||
|
{11744, -30592}, {11342, -30743},
|
||||||
|
{10939, -30889}, {10534, -31030},
|
||||||
|
{10127, -31164}, {9718, -31294},
|
||||||
|
{9307, -31418}, {8895, -31537},
|
||||||
|
{8482, -31652}, {8067, -31759},
|
||||||
|
{7650, -31862}, {7233, -31960},
|
||||||
|
{6815, -32051}, {6393, -32138},
|
||||||
|
{5973, -32219}, {5549, -32294},
|
||||||
|
{5127, -32364}, {4703, -32429},
|
||||||
|
{4278, -32487}, {3852, -32541},
|
||||||
|
{3426, -32588}, {2999, -32630},
|
||||||
|
{2572, -32667}, {2144, -32698},
|
||||||
|
{1716, -32724}, {1287, -32742},
|
||||||
|
{860, -32757}, {430, -32766},
|
||||||
|
{0, -32767}, {-429, -32766},
|
||||||
|
{-858, -32757}, {-1287, -32743},
|
||||||
|
{-1715, -32724}, {-2143, -32698},
|
||||||
|
{-2570, -32667}, {-2998, -32631},
|
||||||
|
{-3425, -32588}, {-3851, -32541},
|
||||||
|
{-4277, -32488}, {-4701, -32429},
|
||||||
|
{-5125, -32364}, {-5548, -32295},
|
||||||
|
{-5971, -32219}, {-6393, -32138},
|
||||||
|
{-6813, -32051}, {-7231, -31960},
|
||||||
|
{-7650, -31863}, {-8067, -31760},
|
||||||
|
{-8481, -31652}, {-8895, -31539},
|
||||||
|
{-9306, -31419}, {-9716, -31294},
|
||||||
|
{-10126, -31165}, {-10532, -31030},
|
||||||
|
{-10937, -30889}, {-11340, -30743},
|
||||||
|
{-11741, -30592}, {-12141, -30436},
|
||||||
|
{-12540, -30274}, {-12935, -30107},
|
||||||
|
{-13328, -29936}, {-13718, -29758},
|
||||||
|
{-14107, -29577}, {-14493, -29390},
|
||||||
|
{-14875, -29197}, {-15257, -29000},
|
||||||
|
{-15635, -28797}, {-16010, -28590},
|
||||||
|
{-16384, -28379}, {-16753, -28162},
|
||||||
|
{-17119, -27940}, {-17484, -27714},
|
||||||
|
{-17845, -27482}, {-18205, -27246},
|
||||||
|
{-18560, -27006}, {-18911, -26760},
|
||||||
|
{-19260, -26510}, {-19606, -26257},
|
||||||
|
{-19947, -25997}, {-20286, -25734},
|
||||||
|
{-20621, -25466}, {-20952, -25194},
|
||||||
|
{-21281, -24918}, {-21605, -24637},
|
||||||
|
{-21926, -24353}, {-22242, -24063},
|
||||||
|
{-22555, -23770}, {-22865, -23473},
|
||||||
|
{-23171, -23171}, {-23472, -22866},
|
||||||
|
{-23769, -22557}, {-24063, -22244},
|
||||||
|
{-24352, -21927}, {-24636, -21606},
|
||||||
|
{-24917, -21282}, {-25194, -20954},
|
||||||
|
{-25465, -20622}, {-25733, -20288},
|
||||||
|
{-25997, -19949}, {-26255, -19607},
|
||||||
|
{-26509, -19261}, {-26760, -18914},
|
||||||
|
{-27004, -18561}, {-27246, -18205},
|
||||||
|
{-27481, -17846}, {-27713, -17485},
|
||||||
|
{-27940, -17122}, {-28162, -16755},
|
||||||
|
{-28378, -16385}, {-28590, -16012},
|
||||||
|
{-28797, -15636}, {-28999, -15258},
|
||||||
|
{-29197, -14878}, {-29389, -14494},
|
||||||
|
{-29576, -14108}, {-29757, -13720},
|
||||||
|
{-29934, -13329}, {-30107, -12937},
|
||||||
|
{-30274, -12540}, {-30435, -12142},
|
||||||
|
{-30592, -11744}, {-30743, -11342},
|
||||||
|
{-30889, -10939}, {-31030, -10534},
|
||||||
|
{-31164, -10127}, {-31294, -9718},
|
||||||
|
{-31418, -9307}, {-31537, -8895},
|
||||||
|
{-31652, -8482}, {-31759, -8067},
|
||||||
|
{-31862, -7650}, {-31960, -7233},
|
||||||
|
{-32051, -6815}, {-32138, -6393},
|
||||||
|
{-32219, -5973}, {-32294, -5549},
|
||||||
|
{-32364, -5127}, {-32429, -4703},
|
||||||
|
{-32487, -4278}, {-32541, -3852},
|
||||||
|
{-32588, -3426}, {-32630, -2999},
|
||||||
|
{-32667, -2572}, {-32698, -2144},
|
||||||
|
{-32724, -1716}, {-32742, -1287},
|
||||||
|
{-32757, -860}, {-32766, -430},
|
||||||
|
{-32767, 0}, {-32766, 429},
|
||||||
|
{-32757, 858}, {-32743, 1287},
|
||||||
|
{-32724, 1715}, {-32698, 2143},
|
||||||
|
{-32667, 2570}, {-32631, 2998},
|
||||||
|
{-32588, 3425}, {-32541, 3851},
|
||||||
|
{-32488, 4277}, {-32429, 4701},
|
||||||
|
{-32364, 5125}, {-32295, 5548},
|
||||||
|
{-32219, 5971}, {-32138, 6393},
|
||||||
|
{-32051, 6813}, {-31960, 7231},
|
||||||
|
{-31863, 7650}, {-31760, 8067},
|
||||||
|
{-31652, 8481}, {-31539, 8895},
|
||||||
|
{-31419, 9306}, {-31294, 9716},
|
||||||
|
{-31165, 10126}, {-31030, 10532},
|
||||||
|
{-30889, 10937}, {-30743, 11340},
|
||||||
|
{-30592, 11741}, {-30436, 12141},
|
||||||
|
{-30274, 12540}, {-30107, 12935},
|
||||||
|
{-29936, 13328}, {-29758, 13718},
|
||||||
|
{-29577, 14107}, {-29390, 14493},
|
||||||
|
{-29197, 14875}, {-29000, 15257},
|
||||||
|
{-28797, 15635}, {-28590, 16010},
|
||||||
|
{-28379, 16384}, {-28162, 16753},
|
||||||
|
{-27940, 17119}, {-27714, 17484},
|
||||||
|
{-27482, 17845}, {-27246, 18205},
|
||||||
|
{-27006, 18560}, {-26760, 18911},
|
||||||
|
{-26510, 19260}, {-26257, 19606},
|
||||||
|
{-25997, 19947}, {-25734, 20286},
|
||||||
|
{-25466, 20621}, {-25194, 20952},
|
||||||
|
{-24918, 21281}, {-24637, 21605},
|
||||||
|
{-24353, 21926}, {-24063, 22242},
|
||||||
|
{-23770, 22555}, {-23473, 22865},
|
||||||
|
{-23171, 23171}, {-22866, 23472},
|
||||||
|
{-22557, 23769}, {-22244, 24063},
|
||||||
|
{-21927, 24352}, {-21606, 24636},
|
||||||
|
{-21282, 24917}, {-20954, 25194},
|
||||||
|
{-20622, 25465}, {-20288, 25733},
|
||||||
|
{-19949, 25997}, {-19607, 26255},
|
||||||
|
{-19261, 26509}, {-18914, 26760},
|
||||||
|
{-18561, 27004}, {-18205, 27246},
|
||||||
|
{-17846, 27481}, {-17485, 27713},
|
||||||
|
{-17122, 27940}, {-16755, 28162},
|
||||||
|
{-16385, 28378}, {-16012, 28590},
|
||||||
|
{-15636, 28797}, {-15258, 28999},
|
||||||
|
{-14878, 29197}, {-14494, 29389},
|
||||||
|
{-14108, 29576}, {-13720, 29757},
|
||||||
|
{-13329, 29934}, {-12937, 30107},
|
||||||
|
{-12540, 30274}, {-12142, 30435},
|
||||||
|
{-11744, 30592}, {-11342, 30743},
|
||||||
|
{-10939, 30889}, {-10534, 31030},
|
||||||
|
{-10127, 31164}, {-9718, 31294},
|
||||||
|
{-9307, 31418}, {-8895, 31537},
|
||||||
|
{-8482, 31652}, {-8067, 31759},
|
||||||
|
{-7650, 31862}, {-7233, 31960},
|
||||||
|
{-6815, 32051}, {-6393, 32138},
|
||||||
|
{-5973, 32219}, {-5549, 32294},
|
||||||
|
{-5127, 32364}, {-4703, 32429},
|
||||||
|
{-4278, 32487}, {-3852, 32541},
|
||||||
|
{-3426, 32588}, {-2999, 32630},
|
||||||
|
{-2572, 32667}, {-2144, 32698},
|
||||||
|
{-1716, 32724}, {-1287, 32742},
|
||||||
|
{-860, 32757}, {-430, 32766},
|
||||||
|
{0, 32767}, {429, 32766},
|
||||||
|
{858, 32757}, {1287, 32743},
|
||||||
|
{1715, 32724}, {2143, 32698},
|
||||||
|
{2570, 32667}, {2998, 32631},
|
||||||
|
{3425, 32588}, {3851, 32541},
|
||||||
|
{4277, 32488}, {4701, 32429},
|
||||||
|
{5125, 32364}, {5548, 32295},
|
||||||
|
{5971, 32219}, {6393, 32138},
|
||||||
|
{6813, 32051}, {7231, 31960},
|
||||||
|
{7650, 31863}, {8067, 31760},
|
||||||
|
{8481, 31652}, {8895, 31539},
|
||||||
|
{9306, 31419}, {9716, 31294},
|
||||||
|
{10126, 31165}, {10532, 31030},
|
||||||
|
{10937, 30889}, {11340, 30743},
|
||||||
|
{11741, 30592}, {12141, 30436},
|
||||||
|
{12540, 30274}, {12935, 30107},
|
||||||
|
{13328, 29936}, {13718, 29758},
|
||||||
|
{14107, 29577}, {14493, 29390},
|
||||||
|
{14875, 29197}, {15257, 29000},
|
||||||
|
{15635, 28797}, {16010, 28590},
|
||||||
|
{16384, 28379}, {16753, 28162},
|
||||||
|
{17119, 27940}, {17484, 27714},
|
||||||
|
{17845, 27482}, {18205, 27246},
|
||||||
|
{18560, 27006}, {18911, 26760},
|
||||||
|
{19260, 26510}, {19606, 26257},
|
||||||
|
{19947, 25997}, {20286, 25734},
|
||||||
|
{20621, 25466}, {20952, 25194},
|
||||||
|
{21281, 24918}, {21605, 24637},
|
||||||
|
{21926, 24353}, {22242, 24063},
|
||||||
|
{22555, 23770}, {22865, 23473},
|
||||||
|
{23171, 23171}, {23472, 22866},
|
||||||
|
{23769, 22557}, {24063, 22244},
|
||||||
|
{24352, 21927}, {24636, 21606},
|
||||||
|
{24917, 21282}, {25194, 20954},
|
||||||
|
{25465, 20622}, {25733, 20288},
|
||||||
|
{25997, 19949}, {26255, 19607},
|
||||||
|
{26509, 19261}, {26760, 18914},
|
||||||
|
{27004, 18561}, {27246, 18205},
|
||||||
|
{27481, 17846}, {27713, 17485},
|
||||||
|
{27940, 17122}, {28162, 16755},
|
||||||
|
{28378, 16385}, {28590, 16012},
|
||||||
|
{28797, 15636}, {28999, 15258},
|
||||||
|
{29197, 14878}, {29389, 14494},
|
||||||
|
{29576, 14108}, {29757, 13720},
|
||||||
|
{29934, 13329}, {30107, 12937},
|
||||||
|
{30274, 12540}, {30435, 12142},
|
||||||
|
{30592, 11744}, {30743, 11342},
|
||||||
|
{30889, 10939}, {31030, 10534},
|
||||||
|
{31164, 10127}, {31294, 9718},
|
||||||
|
{31418, 9307}, {31537, 8895},
|
||||||
|
{31652, 8482}, {31759, 8067},
|
||||||
|
{31862, 7650}, {31960, 7233},
|
||||||
|
{32051, 6815}, {32138, 6393},
|
||||||
|
{32219, 5973}, {32294, 5549},
|
||||||
|
{32364, 5127}, {32429, 4703},
|
||||||
|
{32487, 4278}, {32541, 3852},
|
||||||
|
{32588, 3426}, {32630, 2999},
|
||||||
|
{32667, 2572}, {32698, 2144},
|
||||||
|
{32724, 1716}, {32742, 1287},
|
||||||
|
{32757, 860}, {32766, 430},
|
||||||
|
};
|
||||||
|
#ifndef FFT_BITREV480
|
||||||
|
#define FFT_BITREV480
|
||||||
|
static const opus_int16 fft_bitrev480[480] = {
|
||||||
|
0, 120, 240, 360, 30, 150, 270, 390, 60, 180, 300, 420, 90, 210, 330,
|
||||||
|
450, 15, 135, 255, 375, 45, 165, 285, 405, 75, 195, 315, 435, 105, 225,
|
||||||
|
345, 465, 5, 125, 245, 365, 35, 155, 275, 395, 65, 185, 305, 425, 95,
|
||||||
|
215, 335, 455, 20, 140, 260, 380, 50, 170, 290, 410, 80, 200, 320, 440,
|
||||||
|
110, 230, 350, 470, 10, 130, 250, 370, 40, 160, 280, 400, 70, 190, 310,
|
||||||
|
430, 100, 220, 340, 460, 25, 145, 265, 385, 55, 175, 295, 415, 85, 205,
|
||||||
|
325, 445, 115, 235, 355, 475, 1, 121, 241, 361, 31, 151, 271, 391, 61,
|
||||||
|
181, 301, 421, 91, 211, 331, 451, 16, 136, 256, 376, 46, 166, 286, 406,
|
||||||
|
76, 196, 316, 436, 106, 226, 346, 466, 6, 126, 246, 366, 36, 156, 276,
|
||||||
|
396, 66, 186, 306, 426, 96, 216, 336, 456, 21, 141, 261, 381, 51, 171,
|
||||||
|
291, 411, 81, 201, 321, 441, 111, 231, 351, 471, 11, 131, 251, 371, 41,
|
||||||
|
161, 281, 401, 71, 191, 311, 431, 101, 221, 341, 461, 26, 146, 266, 386,
|
||||||
|
56, 176, 296, 416, 86, 206, 326, 446, 116, 236, 356, 476, 2, 122, 242,
|
||||||
|
362, 32, 152, 272, 392, 62, 182, 302, 422, 92, 212, 332, 452, 17, 137,
|
||||||
|
257, 377, 47, 167, 287, 407, 77, 197, 317, 437, 107, 227, 347, 467, 7,
|
||||||
|
127, 247, 367, 37, 157, 277, 397, 67, 187, 307, 427, 97, 217, 337, 457,
|
||||||
|
22, 142, 262, 382, 52, 172, 292, 412, 82, 202, 322, 442, 112, 232, 352,
|
||||||
|
472, 12, 132, 252, 372, 42, 162, 282, 402, 72, 192, 312, 432, 102, 222,
|
||||||
|
342, 462, 27, 147, 267, 387, 57, 177, 297, 417, 87, 207, 327, 447, 117,
|
||||||
|
237, 357, 477, 3, 123, 243, 363, 33, 153, 273, 393, 63, 183, 303, 423,
|
||||||
|
93, 213, 333, 453, 18, 138, 258, 378, 48, 168, 288, 408, 78, 198, 318,
|
||||||
|
438, 108, 228, 348, 468, 8, 128, 248, 368, 38, 158, 278, 398, 68, 188,
|
||||||
|
308, 428, 98, 218, 338, 458, 23, 143, 263, 383, 53, 173, 293, 413, 83,
|
||||||
|
203, 323, 443, 113, 233, 353, 473, 13, 133, 253, 373, 43, 163, 283, 403,
|
||||||
|
73, 193, 313, 433, 103, 223, 343, 463, 28, 148, 268, 388, 58, 178, 298,
|
||||||
|
418, 88, 208, 328, 448, 118, 238, 358, 478, 4, 124, 244, 364, 34, 154,
|
||||||
|
274, 394, 64, 184, 304, 424, 94, 214, 334, 454, 19, 139, 259, 379, 49,
|
||||||
|
169, 289, 409, 79, 199, 319, 439, 109, 229, 349, 469, 9, 129, 249, 369,
|
||||||
|
39, 159, 279, 399, 69, 189, 309, 429, 99, 219, 339, 459, 24, 144, 264,
|
||||||
|
384, 54, 174, 294, 414, 84, 204, 324, 444, 114, 234, 354, 474, 14, 134,
|
||||||
|
254, 374, 44, 164, 284, 404, 74, 194, 314, 434, 104, 224, 344, 464, 29,
|
||||||
|
149, 269, 389, 59, 179, 299, 419, 89, 209, 329, 449, 119, 239, 359, 479,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef FFT_BITREV240
|
||||||
|
#define FFT_BITREV240
|
||||||
|
static const opus_int16 fft_bitrev240[240] = {
|
||||||
|
0, 60, 120, 180, 15, 75, 135, 195, 30, 90, 150, 210, 45, 105, 165,
|
||||||
|
225, 5, 65, 125, 185, 20, 80, 140, 200, 35, 95, 155, 215, 50, 110,
|
||||||
|
170, 230, 10, 70, 130, 190, 25, 85, 145, 205, 40, 100, 160, 220, 55,
|
||||||
|
115, 175, 235, 1, 61, 121, 181, 16, 76, 136, 196, 31, 91, 151, 211,
|
||||||
|
46, 106, 166, 226, 6, 66, 126, 186, 21, 81, 141, 201, 36, 96, 156,
|
||||||
|
216, 51, 111, 171, 231, 11, 71, 131, 191, 26, 86, 146, 206, 41, 101,
|
||||||
|
161, 221, 56, 116, 176, 236, 2, 62, 122, 182, 17, 77, 137, 197, 32,
|
||||||
|
92, 152, 212, 47, 107, 167, 227, 7, 67, 127, 187, 22, 82, 142, 202,
|
||||||
|
37, 97, 157, 217, 52, 112, 172, 232, 12, 72, 132, 192, 27, 87, 147,
|
||||||
|
207, 42, 102, 162, 222, 57, 117, 177, 237, 3, 63, 123, 183, 18, 78,
|
||||||
|
138, 198, 33, 93, 153, 213, 48, 108, 168, 228, 8, 68, 128, 188, 23,
|
||||||
|
83, 143, 203, 38, 98, 158, 218, 53, 113, 173, 233, 13, 73, 133, 193,
|
||||||
|
28, 88, 148, 208, 43, 103, 163, 223, 58, 118, 178, 238, 4, 64, 124,
|
||||||
|
184, 19, 79, 139, 199, 34, 94, 154, 214, 49, 109, 169, 229, 9, 69,
|
||||||
|
129, 189, 24, 84, 144, 204, 39, 99, 159, 219, 54, 114, 174, 234, 14,
|
||||||
|
74, 134, 194, 29, 89, 149, 209, 44, 104, 164, 224, 59, 119, 179, 239,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef FFT_BITREV120
|
||||||
|
#define FFT_BITREV120
|
||||||
|
static const opus_int16 fft_bitrev120[120] = {
|
||||||
|
0, 30, 60, 90, 15, 45, 75, 105, 5, 35, 65, 95, 20, 50, 80,
|
||||||
|
110, 10, 40, 70, 100, 25, 55, 85, 115, 1, 31, 61, 91, 16, 46,
|
||||||
|
76, 106, 6, 36, 66, 96, 21, 51, 81, 111, 11, 41, 71, 101, 26,
|
||||||
|
56, 86, 116, 2, 32, 62, 92, 17, 47, 77, 107, 7, 37, 67, 97,
|
||||||
|
22, 52, 82, 112, 12, 42, 72, 102, 27, 57, 87, 117, 3, 33, 63,
|
||||||
|
93, 18, 48, 78, 108, 8, 38, 68, 98, 23, 53, 83, 113, 13, 43,
|
||||||
|
73, 103, 28, 58, 88, 118, 4, 34, 64, 94, 19, 49, 79, 109, 9,
|
||||||
|
39, 69, 99, 24, 54, 84, 114, 14, 44, 74, 104, 29, 59, 89, 119,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef FFT_BITREV60
|
||||||
|
#define FFT_BITREV60
|
||||||
|
static const opus_int16 fft_bitrev60[60] = {
|
||||||
|
0, 15, 30, 45, 5, 20, 35, 50, 10, 25, 40, 55, 1, 16, 31,
|
||||||
|
46, 6, 21, 36, 51, 11, 26, 41, 56, 2, 17, 32, 47, 7, 22,
|
||||||
|
37, 52, 12, 27, 42, 57, 3, 18, 33, 48, 8, 23, 38, 53, 13,
|
||||||
|
28, 43, 58, 4, 19, 34, 49, 9, 24, 39, 54, 14, 29, 44, 59,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef FFT_STATE48000_960_0
|
||||||
|
#define FFT_STATE48000_960_0
|
||||||
|
static const kiss_fft_state fft_state48000_960_0 = {
|
||||||
|
480, /* nfft */
|
||||||
|
-1, /* shift */
|
||||||
|
{4, 120, 4, 30, 2, 15, 3, 5, 5, 1, 0, 0, 0, 0, 0, 0, }, /* factors */
|
||||||
|
fft_bitrev480, /* bitrev */
|
||||||
|
fft_twiddles48000_960, /* bitrev */
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef FFT_STATE48000_960_1
|
||||||
|
#define FFT_STATE48000_960_1
|
||||||
|
static const kiss_fft_state fft_state48000_960_1 = {
|
||||||
|
240, /* nfft */
|
||||||
|
1, /* shift */
|
||||||
|
{4, 60, 4, 15, 3, 5, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, }, /* factors */
|
||||||
|
fft_bitrev240, /* bitrev */
|
||||||
|
fft_twiddles48000_960, /* bitrev */
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef FFT_STATE48000_960_2
|
||||||
|
#define FFT_STATE48000_960_2
|
||||||
|
static const kiss_fft_state fft_state48000_960_2 = {
|
||||||
|
120, /* nfft */
|
||||||
|
2, /* shift */
|
||||||
|
{4, 30, 2, 15, 3, 5, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, }, /* factors */
|
||||||
|
fft_bitrev120, /* bitrev */
|
||||||
|
fft_twiddles48000_960, /* bitrev */
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef FFT_STATE48000_960_3
|
||||||
|
#define FFT_STATE48000_960_3
|
||||||
|
static const kiss_fft_state fft_state48000_960_3 = {
|
||||||
|
60, /* nfft */
|
||||||
|
3, /* shift */
|
||||||
|
{4, 15, 3, 5, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* factors */
|
||||||
|
fft_bitrev60, /* bitrev */
|
||||||
|
fft_twiddles48000_960, /* bitrev */
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MDCT_TWIDDLES960
|
||||||
|
#define MDCT_TWIDDLES960
|
||||||
|
static const opus_val16 mdct_twiddles960[481] = {
|
||||||
|
32767, 32767, 32767, 32767, 32766,
|
||||||
|
32763, 32762, 32759, 32757, 32753,
|
||||||
|
32751, 32747, 32743, 32738, 32733,
|
||||||
|
32729, 32724, 32717, 32711, 32705,
|
||||||
|
32698, 32690, 32683, 32676, 32667,
|
||||||
|
32658, 32650, 32640, 32631, 32620,
|
||||||
|
32610, 32599, 32588, 32577, 32566,
|
||||||
|
32554, 32541, 32528, 32515, 32502,
|
||||||
|
32487, 32474, 32459, 32444, 32429,
|
||||||
|
32413, 32397, 32381, 32364, 32348,
|
||||||
|
32331, 32313, 32294, 32277, 32257,
|
||||||
|
32239, 32219, 32200, 32180, 32159,
|
||||||
|
32138, 32118, 32096, 32074, 32051,
|
||||||
|
32029, 32006, 31984, 31960, 31936,
|
||||||
|
31912, 31888, 31863, 31837, 31812,
|
||||||
|
31786, 31760, 31734, 31707, 31679,
|
||||||
|
31652, 31624, 31596, 31567, 31539,
|
||||||
|
31508, 31479, 31450, 31419, 31388,
|
||||||
|
31357, 31326, 31294, 31262, 31230,
|
||||||
|
31198, 31164, 31131, 31097, 31063,
|
||||||
|
31030, 30994, 30959, 30924, 30889,
|
||||||
|
30853, 30816, 30779, 30743, 30705,
|
||||||
|
30668, 30629, 30592, 30553, 30515,
|
||||||
|
30475, 30435, 30396, 30356, 30315,
|
||||||
|
30274, 30233, 30191, 30149, 30107,
|
||||||
|
30065, 30022, 29979, 29936, 29891,
|
||||||
|
29847, 29803, 29758, 29713, 29668,
|
||||||
|
29622, 29577, 29529, 29483, 29436,
|
||||||
|
29390, 29341, 29293, 29246, 29197,
|
||||||
|
29148, 29098, 29050, 29000, 28949,
|
||||||
|
28899, 28848, 28797, 28746, 28694,
|
||||||
|
28642, 28590, 28537, 28485, 28432,
|
||||||
|
28378, 28324, 28271, 28217, 28162,
|
||||||
|
28106, 28051, 27995, 27940, 27884,
|
||||||
|
27827, 27770, 27713, 27657, 27598,
|
||||||
|
27540, 27481, 27423, 27365, 27305,
|
||||||
|
27246, 27187, 27126, 27066, 27006,
|
||||||
|
26945, 26883, 26822, 26760, 26698,
|
||||||
|
26636, 26574, 26510, 26448, 26383,
|
||||||
|
26320, 26257, 26191, 26127, 26062,
|
||||||
|
25997, 25931, 25866, 25800, 25734,
|
||||||
|
25667, 25601, 25533, 25466, 25398,
|
||||||
|
25330, 25262, 25194, 25125, 25056,
|
||||||
|
24987, 24917, 24848, 24778, 24707,
|
||||||
|
24636, 24566, 24495, 24424, 24352,
|
||||||
|
24280, 24208, 24135, 24063, 23990,
|
||||||
|
23917, 23842, 23769, 23695, 23622,
|
||||||
|
23546, 23472, 23398, 23322, 23246,
|
||||||
|
23171, 23095, 23018, 22942, 22866,
|
||||||
|
22788, 22711, 22634, 22557, 22478,
|
||||||
|
22400, 22322, 22244, 22165, 22085,
|
||||||
|
22006, 21927, 21846, 21766, 21687,
|
||||||
|
21606, 21524, 21443, 21363, 21282,
|
||||||
|
21199, 21118, 21035, 20954, 20870,
|
||||||
|
20788, 20705, 20621, 20538, 20455,
|
||||||
|
20371, 20286, 20202, 20118, 20034,
|
||||||
|
19947, 19863, 19777, 19692, 19606,
|
||||||
|
19520, 19434, 19347, 19260, 19174,
|
||||||
|
19088, 18999, 18911, 18825, 18737,
|
||||||
|
18648, 18560, 18472, 18384, 18294,
|
||||||
|
18205, 18116, 18025, 17936, 17846,
|
||||||
|
17757, 17666, 17576, 17485, 17395,
|
||||||
|
17303, 17212, 17122, 17030, 16937,
|
||||||
|
16846, 16755, 16662, 16569, 16477,
|
||||||
|
16385, 16291, 16198, 16105, 16012,
|
||||||
|
15917, 15824, 15730, 15636, 15541,
|
||||||
|
15447, 15352, 15257, 15162, 15067,
|
||||||
|
14973, 14875, 14781, 14685, 14589,
|
||||||
|
14493, 14396, 14300, 14204, 14107,
|
||||||
|
14010, 13914, 13815, 13718, 13621,
|
||||||
|
13524, 13425, 13328, 13230, 13133,
|
||||||
|
13033, 12935, 12836, 12738, 12638,
|
||||||
|
12540, 12441, 12341, 12241, 12142,
|
||||||
|
12044, 11943, 11843, 11744, 11643,
|
||||||
|
11542, 11442, 11342, 11241, 11139,
|
||||||
|
11039, 10939, 10836, 10736, 10635,
|
||||||
|
10534, 10431, 10330, 10228, 10127,
|
||||||
|
10024, 9921, 9820, 9718, 9614,
|
||||||
|
9512, 9410, 9306, 9204, 9101,
|
||||||
|
8998, 8895, 8791, 8689, 8585,
|
||||||
|
8481, 8377, 8274, 8171, 8067,
|
||||||
|
7962, 7858, 7753, 7650, 7545,
|
||||||
|
7441, 7336, 7231, 7129, 7023,
|
||||||
|
6917, 6813, 6709, 6604, 6498,
|
||||||
|
6393, 6288, 6182, 6077, 5973,
|
||||||
|
5867, 5760, 5656, 5549, 5445,
|
||||||
|
5339, 5232, 5127, 5022, 4914,
|
||||||
|
4809, 4703, 4596, 4490, 4384,
|
||||||
|
4278, 4171, 4065, 3958, 3852,
|
||||||
|
3745, 3640, 3532, 3426, 3318,
|
||||||
|
3212, 3106, 2998, 2891, 2786,
|
||||||
|
2679, 2570, 2465, 2358, 2251,
|
||||||
|
2143, 2037, 1929, 1823, 1715,
|
||||||
|
1609, 1501, 1393, 1287, 1180,
|
||||||
|
1073, 964, 858, 751, 644,
|
||||||
|
535, 429, 322, 214, 107,
|
||||||
|
0, };
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static const CELTMode mode48000_960_120 = {
|
||||||
|
48000, /* Fs */
|
||||||
|
120, /* overlap */
|
||||||
|
21, /* nbEBands */
|
||||||
|
21, /* effEBands */
|
||||||
|
{27853, 0, 4096, 8192, }, /* preemph */
|
||||||
|
eband5ms, /* eBands */
|
||||||
|
3, /* maxLM */
|
||||||
|
8, /* nbShortMdcts */
|
||||||
|
120, /* shortMdctSize */
|
||||||
|
11, /* nbAllocVectors */
|
||||||
|
band_allocation, /* allocVectors */
|
||||||
|
logN400, /* logN */
|
||||||
|
window120, /* window */
|
||||||
|
{1920, 3, {&fft_state48000_960_0, &fft_state48000_960_1, &fft_state48000_960_2, &fft_state48000_960_3, }, mdct_twiddles960}, /* mdct */
|
||||||
|
{392, cache_index50, cache_bits50, cache_caps50}, /* cache */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* List of all the available modes */
|
||||||
|
#define TOTAL_MODES 1
|
||||||
|
static const CELTMode * const static_mode_list[TOTAL_MODES] = {
|
||||||
|
&mode48000_960_120,
|
||||||
|
};
|
599
Frameworks/Opus/Opus/opus/celt/static_modes_float.h
Normal file
599
Frameworks/Opus/Opus/opus/celt/static_modes_float.h
Normal file
|
@ -0,0 +1,599 @@
|
||||||
|
/* The contents of this file was automatically generated by dump_modes.c
|
||||||
|
with arguments: 48000 960
|
||||||
|
It contains static definitions for some pre-defined modes. */
|
||||||
|
#include "modes.h"
|
||||||
|
#include "rate.h"
|
||||||
|
|
||||||
|
#ifndef DEF_WINDOW120
|
||||||
|
#define DEF_WINDOW120
|
||||||
|
static const opus_val16 window120[120] = {
|
||||||
|
6.7286966e-05f, 0.00060551348f, 0.0016815970f, 0.0032947962f, 0.0054439943f,
|
||||||
|
0.0081276923f, 0.011344001f, 0.015090633f, 0.019364886f, 0.024163635f,
|
||||||
|
0.029483315f, 0.035319905f, 0.041668911f, 0.048525347f, 0.055883718f,
|
||||||
|
0.063737999f, 0.072081616f, 0.080907428f, 0.090207705f, 0.099974111f,
|
||||||
|
0.11019769f, 0.12086883f, 0.13197729f, 0.14351214f, 0.15546177f,
|
||||||
|
0.16781389f, 0.18055550f, 0.19367290f, 0.20715171f, 0.22097682f,
|
||||||
|
0.23513243f, 0.24960208f, 0.26436860f, 0.27941419f, 0.29472040f,
|
||||||
|
0.31026818f, 0.32603788f, 0.34200931f, 0.35816177f, 0.37447407f,
|
||||||
|
0.39092462f, 0.40749142f, 0.42415215f, 0.44088423f, 0.45766484f,
|
||||||
|
0.47447104f, 0.49127978f, 0.50806798f, 0.52481261f, 0.54149077f,
|
||||||
|
0.55807973f, 0.57455701f, 0.59090049f, 0.60708841f, 0.62309951f,
|
||||||
|
0.63891306f, 0.65450896f, 0.66986776f, 0.68497077f, 0.69980010f,
|
||||||
|
0.71433873f, 0.72857055f, 0.74248043f, 0.75605424f, 0.76927895f,
|
||||||
|
0.78214257f, 0.79463430f, 0.80674445f, 0.81846456f, 0.82978733f,
|
||||||
|
0.84070669f, 0.85121779f, 0.86131698f, 0.87100183f, 0.88027111f,
|
||||||
|
0.88912479f, 0.89756398f, 0.90559094f, 0.91320904f, 0.92042270f,
|
||||||
|
0.92723738f, 0.93365955f, 0.93969656f, 0.94535671f, 0.95064907f,
|
||||||
|
0.95558353f, 0.96017067f, 0.96442171f, 0.96834849f, 0.97196334f,
|
||||||
|
0.97527906f, 0.97830883f, 0.98106616f, 0.98356480f, 0.98581869f,
|
||||||
|
0.98784191f, 0.98964856f, 0.99125274f, 0.99266849f, 0.99390969f,
|
||||||
|
0.99499004f, 0.99592297f, 0.99672162f, 0.99739874f, 0.99796667f,
|
||||||
|
0.99843728f, 0.99882195f, 0.99913147f, 0.99937606f, 0.99956527f,
|
||||||
|
0.99970802f, 0.99981248f, 0.99988613f, 0.99993565f, 0.99996697f,
|
||||||
|
0.99998518f, 0.99999457f, 0.99999859f, 0.99999982f, 1.0000000f,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef DEF_LOGN400
|
||||||
|
#define DEF_LOGN400
|
||||||
|
static const opus_int16 logN400[21] = {
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 16, 16, 16, 21, 21, 24, 29, 34, 36, };
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef DEF_PULSE_CACHE50
|
||||||
|
#define DEF_PULSE_CACHE50
|
||||||
|
static const opus_int16 cache_index50[105] = {
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 41, 41, 41,
|
||||||
|
82, 82, 123, 164, 200, 222, 0, 0, 0, 0, 0, 0, 0, 0, 41,
|
||||||
|
41, 41, 41, 123, 123, 123, 164, 164, 240, 266, 283, 295, 41, 41, 41,
|
||||||
|
41, 41, 41, 41, 41, 123, 123, 123, 123, 240, 240, 240, 266, 266, 305,
|
||||||
|
318, 328, 336, 123, 123, 123, 123, 123, 123, 123, 123, 240, 240, 240, 240,
|
||||||
|
305, 305, 305, 318, 318, 343, 351, 358, 364, 240, 240, 240, 240, 240, 240,
|
||||||
|
240, 240, 305, 305, 305, 305, 343, 343, 343, 351, 351, 370, 376, 382, 387,
|
||||||
|
};
|
||||||
|
static const unsigned char cache_bits50[392] = {
|
||||||
|
40, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
||||||
|
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
||||||
|
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 40, 15, 23, 28,
|
||||||
|
31, 34, 36, 38, 39, 41, 42, 43, 44, 45, 46, 47, 47, 49, 50,
|
||||||
|
51, 52, 53, 54, 55, 55, 57, 58, 59, 60, 61, 62, 63, 63, 65,
|
||||||
|
66, 67, 68, 69, 70, 71, 71, 40, 20, 33, 41, 48, 53, 57, 61,
|
||||||
|
64, 66, 69, 71, 73, 75, 76, 78, 80, 82, 85, 87, 89, 91, 92,
|
||||||
|
94, 96, 98, 101, 103, 105, 107, 108, 110, 112, 114, 117, 119, 121, 123,
|
||||||
|
124, 126, 128, 40, 23, 39, 51, 60, 67, 73, 79, 83, 87, 91, 94,
|
||||||
|
97, 100, 102, 105, 107, 111, 115, 118, 121, 124, 126, 129, 131, 135, 139,
|
||||||
|
142, 145, 148, 150, 153, 155, 159, 163, 166, 169, 172, 174, 177, 179, 35,
|
||||||
|
28, 49, 65, 78, 89, 99, 107, 114, 120, 126, 132, 136, 141, 145, 149,
|
||||||
|
153, 159, 165, 171, 176, 180, 185, 189, 192, 199, 205, 211, 216, 220, 225,
|
||||||
|
229, 232, 239, 245, 251, 21, 33, 58, 79, 97, 112, 125, 137, 148, 157,
|
||||||
|
166, 174, 182, 189, 195, 201, 207, 217, 227, 235, 243, 251, 17, 35, 63,
|
||||||
|
86, 106, 123, 139, 152, 165, 177, 187, 197, 206, 214, 222, 230, 237, 250,
|
||||||
|
25, 31, 55, 75, 91, 105, 117, 128, 138, 146, 154, 161, 168, 174, 180,
|
||||||
|
185, 190, 200, 208, 215, 222, 229, 235, 240, 245, 255, 16, 36, 65, 89,
|
||||||
|
110, 128, 144, 159, 173, 185, 196, 207, 217, 226, 234, 242, 250, 11, 41,
|
||||||
|
74, 103, 128, 151, 172, 191, 209, 225, 241, 255, 9, 43, 79, 110, 138,
|
||||||
|
163, 186, 207, 227, 246, 12, 39, 71, 99, 123, 144, 164, 182, 198, 214,
|
||||||
|
228, 241, 253, 9, 44, 81, 113, 142, 168, 192, 214, 235, 255, 7, 49,
|
||||||
|
90, 127, 160, 191, 220, 247, 6, 51, 95, 134, 170, 203, 234, 7, 47,
|
||||||
|
87, 123, 155, 184, 212, 237, 6, 52, 97, 137, 174, 208, 240, 5, 57,
|
||||||
|
106, 151, 192, 231, 5, 59, 111, 158, 202, 243, 5, 55, 103, 147, 187,
|
||||||
|
224, 5, 60, 113, 161, 206, 248, 4, 65, 122, 175, 224, 4, 67, 127,
|
||||||
|
182, 234, };
|
||||||
|
static const unsigned char cache_caps50[168] = {
|
||||||
|
224, 224, 224, 224, 224, 224, 224, 224, 160, 160, 160, 160, 185, 185, 185,
|
||||||
|
178, 178, 168, 134, 61, 37, 224, 224, 224, 224, 224, 224, 224, 224, 240,
|
||||||
|
240, 240, 240, 207, 207, 207, 198, 198, 183, 144, 66, 40, 160, 160, 160,
|
||||||
|
160, 160, 160, 160, 160, 185, 185, 185, 185, 193, 193, 193, 183, 183, 172,
|
||||||
|
138, 64, 38, 240, 240, 240, 240, 240, 240, 240, 240, 207, 207, 207, 207,
|
||||||
|
204, 204, 204, 193, 193, 180, 143, 66, 40, 185, 185, 185, 185, 185, 185,
|
||||||
|
185, 185, 193, 193, 193, 193, 193, 193, 193, 183, 183, 172, 138, 65, 39,
|
||||||
|
207, 207, 207, 207, 207, 207, 207, 207, 204, 204, 204, 204, 201, 201, 201,
|
||||||
|
188, 188, 176, 141, 66, 40, 193, 193, 193, 193, 193, 193, 193, 193, 193,
|
||||||
|
193, 193, 193, 194, 194, 194, 184, 184, 173, 139, 65, 39, 204, 204, 204,
|
||||||
|
204, 204, 204, 204, 204, 201, 201, 201, 201, 198, 198, 198, 187, 187, 175,
|
||||||
|
140, 66, 40, };
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef FFT_TWIDDLES48000_960
|
||||||
|
#define FFT_TWIDDLES48000_960
|
||||||
|
static const kiss_twiddle_cpx fft_twiddles48000_960[480] = {
|
||||||
|
{1.0000000f, -0.0000000f}, {0.99991433f, -0.013089596f},
|
||||||
|
{0.99965732f, -0.026176948f}, {0.99922904f, -0.039259816f},
|
||||||
|
{0.99862953f, -0.052335956f}, {0.99785892f, -0.065403129f},
|
||||||
|
{0.99691733f, -0.078459096f}, {0.99580493f, -0.091501619f},
|
||||||
|
{0.99452190f, -0.10452846f}, {0.99306846f, -0.11753740f},
|
||||||
|
{0.99144486f, -0.13052619f}, {0.98965139f, -0.14349262f},
|
||||||
|
{0.98768834f, -0.15643447f}, {0.98555606f, -0.16934950f},
|
||||||
|
{0.98325491f, -0.18223553f}, {0.98078528f, -0.19509032f},
|
||||||
|
{0.97814760f, -0.20791169f}, {0.97534232f, -0.22069744f},
|
||||||
|
{0.97236992f, -0.23344536f}, {0.96923091f, -0.24615329f},
|
||||||
|
{0.96592583f, -0.25881905f}, {0.96245524f, -0.27144045f},
|
||||||
|
{0.95881973f, -0.28401534f}, {0.95501994f, -0.29654157f},
|
||||||
|
{0.95105652f, -0.30901699f}, {0.94693013f, -0.32143947f},
|
||||||
|
{0.94264149f, -0.33380686f}, {0.93819134f, -0.34611706f},
|
||||||
|
{0.93358043f, -0.35836795f}, {0.92880955f, -0.37055744f},
|
||||||
|
{0.92387953f, -0.38268343f}, {0.91879121f, -0.39474386f},
|
||||||
|
{0.91354546f, -0.40673664f}, {0.90814317f, -0.41865974f},
|
||||||
|
{0.90258528f, -0.43051110f}, {0.89687274f, -0.44228869f},
|
||||||
|
{0.89100652f, -0.45399050f}, {0.88498764f, -0.46561452f},
|
||||||
|
{0.87881711f, -0.47715876f}, {0.87249601f, -0.48862124f},
|
||||||
|
{0.86602540f, -0.50000000f}, {0.85940641f, -0.51129309f},
|
||||||
|
{0.85264016f, -0.52249856f}, {0.84572782f, -0.53361452f},
|
||||||
|
{0.83867057f, -0.54463904f}, {0.83146961f, -0.55557023f},
|
||||||
|
{0.82412619f, -0.56640624f}, {0.81664156f, -0.57714519f},
|
||||||
|
{0.80901699f, -0.58778525f}, {0.80125381f, -0.59832460f},
|
||||||
|
{0.79335334f, -0.60876143f}, {0.78531693f, -0.61909395f},
|
||||||
|
{0.77714596f, -0.62932039f}, {0.76884183f, -0.63943900f},
|
||||||
|
{0.76040597f, -0.64944805f}, {0.75183981f, -0.65934582f},
|
||||||
|
{0.74314483f, -0.66913061f}, {0.73432251f, -0.67880075f},
|
||||||
|
{0.72537437f, -0.68835458f}, {0.71630194f, -0.69779046f},
|
||||||
|
{0.70710678f, -0.70710678f}, {0.69779046f, -0.71630194f},
|
||||||
|
{0.68835458f, -0.72537437f}, {0.67880075f, -0.73432251f},
|
||||||
|
{0.66913061f, -0.74314483f}, {0.65934582f, -0.75183981f},
|
||||||
|
{0.64944805f, -0.76040597f}, {0.63943900f, -0.76884183f},
|
||||||
|
{0.62932039f, -0.77714596f}, {0.61909395f, -0.78531693f},
|
||||||
|
{0.60876143f, -0.79335334f}, {0.59832460f, -0.80125381f},
|
||||||
|
{0.58778525f, -0.80901699f}, {0.57714519f, -0.81664156f},
|
||||||
|
{0.56640624f, -0.82412619f}, {0.55557023f, -0.83146961f},
|
||||||
|
{0.54463904f, -0.83867057f}, {0.53361452f, -0.84572782f},
|
||||||
|
{0.52249856f, -0.85264016f}, {0.51129309f, -0.85940641f},
|
||||||
|
{0.50000000f, -0.86602540f}, {0.48862124f, -0.87249601f},
|
||||||
|
{0.47715876f, -0.87881711f}, {0.46561452f, -0.88498764f},
|
||||||
|
{0.45399050f, -0.89100652f}, {0.44228869f, -0.89687274f},
|
||||||
|
{0.43051110f, -0.90258528f}, {0.41865974f, -0.90814317f},
|
||||||
|
{0.40673664f, -0.91354546f}, {0.39474386f, -0.91879121f},
|
||||||
|
{0.38268343f, -0.92387953f}, {0.37055744f, -0.92880955f},
|
||||||
|
{0.35836795f, -0.93358043f}, {0.34611706f, -0.93819134f},
|
||||||
|
{0.33380686f, -0.94264149f}, {0.32143947f, -0.94693013f},
|
||||||
|
{0.30901699f, -0.95105652f}, {0.29654157f, -0.95501994f},
|
||||||
|
{0.28401534f, -0.95881973f}, {0.27144045f, -0.96245524f},
|
||||||
|
{0.25881905f, -0.96592583f}, {0.24615329f, -0.96923091f},
|
||||||
|
{0.23344536f, -0.97236992f}, {0.22069744f, -0.97534232f},
|
||||||
|
{0.20791169f, -0.97814760f}, {0.19509032f, -0.98078528f},
|
||||||
|
{0.18223553f, -0.98325491f}, {0.16934950f, -0.98555606f},
|
||||||
|
{0.15643447f, -0.98768834f}, {0.14349262f, -0.98965139f},
|
||||||
|
{0.13052619f, -0.99144486f}, {0.11753740f, -0.99306846f},
|
||||||
|
{0.10452846f, -0.99452190f}, {0.091501619f, -0.99580493f},
|
||||||
|
{0.078459096f, -0.99691733f}, {0.065403129f, -0.99785892f},
|
||||||
|
{0.052335956f, -0.99862953f}, {0.039259816f, -0.99922904f},
|
||||||
|
{0.026176948f, -0.99965732f}, {0.013089596f, -0.99991433f},
|
||||||
|
{6.1230318e-17f, -1.0000000f}, {-0.013089596f, -0.99991433f},
|
||||||
|
{-0.026176948f, -0.99965732f}, {-0.039259816f, -0.99922904f},
|
||||||
|
{-0.052335956f, -0.99862953f}, {-0.065403129f, -0.99785892f},
|
||||||
|
{-0.078459096f, -0.99691733f}, {-0.091501619f, -0.99580493f},
|
||||||
|
{-0.10452846f, -0.99452190f}, {-0.11753740f, -0.99306846f},
|
||||||
|
{-0.13052619f, -0.99144486f}, {-0.14349262f, -0.98965139f},
|
||||||
|
{-0.15643447f, -0.98768834f}, {-0.16934950f, -0.98555606f},
|
||||||
|
{-0.18223553f, -0.98325491f}, {-0.19509032f, -0.98078528f},
|
||||||
|
{-0.20791169f, -0.97814760f}, {-0.22069744f, -0.97534232f},
|
||||||
|
{-0.23344536f, -0.97236992f}, {-0.24615329f, -0.96923091f},
|
||||||
|
{-0.25881905f, -0.96592583f}, {-0.27144045f, -0.96245524f},
|
||||||
|
{-0.28401534f, -0.95881973f}, {-0.29654157f, -0.95501994f},
|
||||||
|
{-0.30901699f, -0.95105652f}, {-0.32143947f, -0.94693013f},
|
||||||
|
{-0.33380686f, -0.94264149f}, {-0.34611706f, -0.93819134f},
|
||||||
|
{-0.35836795f, -0.93358043f}, {-0.37055744f, -0.92880955f},
|
||||||
|
{-0.38268343f, -0.92387953f}, {-0.39474386f, -0.91879121f},
|
||||||
|
{-0.40673664f, -0.91354546f}, {-0.41865974f, -0.90814317f},
|
||||||
|
{-0.43051110f, -0.90258528f}, {-0.44228869f, -0.89687274f},
|
||||||
|
{-0.45399050f, -0.89100652f}, {-0.46561452f, -0.88498764f},
|
||||||
|
{-0.47715876f, -0.87881711f}, {-0.48862124f, -0.87249601f},
|
||||||
|
{-0.50000000f, -0.86602540f}, {-0.51129309f, -0.85940641f},
|
||||||
|
{-0.52249856f, -0.85264016f}, {-0.53361452f, -0.84572782f},
|
||||||
|
{-0.54463904f, -0.83867057f}, {-0.55557023f, -0.83146961f},
|
||||||
|
{-0.56640624f, -0.82412619f}, {-0.57714519f, -0.81664156f},
|
||||||
|
{-0.58778525f, -0.80901699f}, {-0.59832460f, -0.80125381f},
|
||||||
|
{-0.60876143f, -0.79335334f}, {-0.61909395f, -0.78531693f},
|
||||||
|
{-0.62932039f, -0.77714596f}, {-0.63943900f, -0.76884183f},
|
||||||
|
{-0.64944805f, -0.76040597f}, {-0.65934582f, -0.75183981f},
|
||||||
|
{-0.66913061f, -0.74314483f}, {-0.67880075f, -0.73432251f},
|
||||||
|
{-0.68835458f, -0.72537437f}, {-0.69779046f, -0.71630194f},
|
||||||
|
{-0.70710678f, -0.70710678f}, {-0.71630194f, -0.69779046f},
|
||||||
|
{-0.72537437f, -0.68835458f}, {-0.73432251f, -0.67880075f},
|
||||||
|
{-0.74314483f, -0.66913061f}, {-0.75183981f, -0.65934582f},
|
||||||
|
{-0.76040597f, -0.64944805f}, {-0.76884183f, -0.63943900f},
|
||||||
|
{-0.77714596f, -0.62932039f}, {-0.78531693f, -0.61909395f},
|
||||||
|
{-0.79335334f, -0.60876143f}, {-0.80125381f, -0.59832460f},
|
||||||
|
{-0.80901699f, -0.58778525f}, {-0.81664156f, -0.57714519f},
|
||||||
|
{-0.82412619f, -0.56640624f}, {-0.83146961f, -0.55557023f},
|
||||||
|
{-0.83867057f, -0.54463904f}, {-0.84572782f, -0.53361452f},
|
||||||
|
{-0.85264016f, -0.52249856f}, {-0.85940641f, -0.51129309f},
|
||||||
|
{-0.86602540f, -0.50000000f}, {-0.87249601f, -0.48862124f},
|
||||||
|
{-0.87881711f, -0.47715876f}, {-0.88498764f, -0.46561452f},
|
||||||
|
{-0.89100652f, -0.45399050f}, {-0.89687274f, -0.44228869f},
|
||||||
|
{-0.90258528f, -0.43051110f}, {-0.90814317f, -0.41865974f},
|
||||||
|
{-0.91354546f, -0.40673664f}, {-0.91879121f, -0.39474386f},
|
||||||
|
{-0.92387953f, -0.38268343f}, {-0.92880955f, -0.37055744f},
|
||||||
|
{-0.93358043f, -0.35836795f}, {-0.93819134f, -0.34611706f},
|
||||||
|
{-0.94264149f, -0.33380686f}, {-0.94693013f, -0.32143947f},
|
||||||
|
{-0.95105652f, -0.30901699f}, {-0.95501994f, -0.29654157f},
|
||||||
|
{-0.95881973f, -0.28401534f}, {-0.96245524f, -0.27144045f},
|
||||||
|
{-0.96592583f, -0.25881905f}, {-0.96923091f, -0.24615329f},
|
||||||
|
{-0.97236992f, -0.23344536f}, {-0.97534232f, -0.22069744f},
|
||||||
|
{-0.97814760f, -0.20791169f}, {-0.98078528f, -0.19509032f},
|
||||||
|
{-0.98325491f, -0.18223553f}, {-0.98555606f, -0.16934950f},
|
||||||
|
{-0.98768834f, -0.15643447f}, {-0.98965139f, -0.14349262f},
|
||||||
|
{-0.99144486f, -0.13052619f}, {-0.99306846f, -0.11753740f},
|
||||||
|
{-0.99452190f, -0.10452846f}, {-0.99580493f, -0.091501619f},
|
||||||
|
{-0.99691733f, -0.078459096f}, {-0.99785892f, -0.065403129f},
|
||||||
|
{-0.99862953f, -0.052335956f}, {-0.99922904f, -0.039259816f},
|
||||||
|
{-0.99965732f, -0.026176948f}, {-0.99991433f, -0.013089596f},
|
||||||
|
{-1.0000000f, -1.2246064e-16f}, {-0.99991433f, 0.013089596f},
|
||||||
|
{-0.99965732f, 0.026176948f}, {-0.99922904f, 0.039259816f},
|
||||||
|
{-0.99862953f, 0.052335956f}, {-0.99785892f, 0.065403129f},
|
||||||
|
{-0.99691733f, 0.078459096f}, {-0.99580493f, 0.091501619f},
|
||||||
|
{-0.99452190f, 0.10452846f}, {-0.99306846f, 0.11753740f},
|
||||||
|
{-0.99144486f, 0.13052619f}, {-0.98965139f, 0.14349262f},
|
||||||
|
{-0.98768834f, 0.15643447f}, {-0.98555606f, 0.16934950f},
|
||||||
|
{-0.98325491f, 0.18223553f}, {-0.98078528f, 0.19509032f},
|
||||||
|
{-0.97814760f, 0.20791169f}, {-0.97534232f, 0.22069744f},
|
||||||
|
{-0.97236992f, 0.23344536f}, {-0.96923091f, 0.24615329f},
|
||||||
|
{-0.96592583f, 0.25881905f}, {-0.96245524f, 0.27144045f},
|
||||||
|
{-0.95881973f, 0.28401534f}, {-0.95501994f, 0.29654157f},
|
||||||
|
{-0.95105652f, 0.30901699f}, {-0.94693013f, 0.32143947f},
|
||||||
|
{-0.94264149f, 0.33380686f}, {-0.93819134f, 0.34611706f},
|
||||||
|
{-0.93358043f, 0.35836795f}, {-0.92880955f, 0.37055744f},
|
||||||
|
{-0.92387953f, 0.38268343f}, {-0.91879121f, 0.39474386f},
|
||||||
|
{-0.91354546f, 0.40673664f}, {-0.90814317f, 0.41865974f},
|
||||||
|
{-0.90258528f, 0.43051110f}, {-0.89687274f, 0.44228869f},
|
||||||
|
{-0.89100652f, 0.45399050f}, {-0.88498764f, 0.46561452f},
|
||||||
|
{-0.87881711f, 0.47715876f}, {-0.87249601f, 0.48862124f},
|
||||||
|
{-0.86602540f, 0.50000000f}, {-0.85940641f, 0.51129309f},
|
||||||
|
{-0.85264016f, 0.52249856f}, {-0.84572782f, 0.53361452f},
|
||||||
|
{-0.83867057f, 0.54463904f}, {-0.83146961f, 0.55557023f},
|
||||||
|
{-0.82412619f, 0.56640624f}, {-0.81664156f, 0.57714519f},
|
||||||
|
{-0.80901699f, 0.58778525f}, {-0.80125381f, 0.59832460f},
|
||||||
|
{-0.79335334f, 0.60876143f}, {-0.78531693f, 0.61909395f},
|
||||||
|
{-0.77714596f, 0.62932039f}, {-0.76884183f, 0.63943900f},
|
||||||
|
{-0.76040597f, 0.64944805f}, {-0.75183981f, 0.65934582f},
|
||||||
|
{-0.74314483f, 0.66913061f}, {-0.73432251f, 0.67880075f},
|
||||||
|
{-0.72537437f, 0.68835458f}, {-0.71630194f, 0.69779046f},
|
||||||
|
{-0.70710678f, 0.70710678f}, {-0.69779046f, 0.71630194f},
|
||||||
|
{-0.68835458f, 0.72537437f}, {-0.67880075f, 0.73432251f},
|
||||||
|
{-0.66913061f, 0.74314483f}, {-0.65934582f, 0.75183981f},
|
||||||
|
{-0.64944805f, 0.76040597f}, {-0.63943900f, 0.76884183f},
|
||||||
|
{-0.62932039f, 0.77714596f}, {-0.61909395f, 0.78531693f},
|
||||||
|
{-0.60876143f, 0.79335334f}, {-0.59832460f, 0.80125381f},
|
||||||
|
{-0.58778525f, 0.80901699f}, {-0.57714519f, 0.81664156f},
|
||||||
|
{-0.56640624f, 0.82412619f}, {-0.55557023f, 0.83146961f},
|
||||||
|
{-0.54463904f, 0.83867057f}, {-0.53361452f, 0.84572782f},
|
||||||
|
{-0.52249856f, 0.85264016f}, {-0.51129309f, 0.85940641f},
|
||||||
|
{-0.50000000f, 0.86602540f}, {-0.48862124f, 0.87249601f},
|
||||||
|
{-0.47715876f, 0.87881711f}, {-0.46561452f, 0.88498764f},
|
||||||
|
{-0.45399050f, 0.89100652f}, {-0.44228869f, 0.89687274f},
|
||||||
|
{-0.43051110f, 0.90258528f}, {-0.41865974f, 0.90814317f},
|
||||||
|
{-0.40673664f, 0.91354546f}, {-0.39474386f, 0.91879121f},
|
||||||
|
{-0.38268343f, 0.92387953f}, {-0.37055744f, 0.92880955f},
|
||||||
|
{-0.35836795f, 0.93358043f}, {-0.34611706f, 0.93819134f},
|
||||||
|
{-0.33380686f, 0.94264149f}, {-0.32143947f, 0.94693013f},
|
||||||
|
{-0.30901699f, 0.95105652f}, {-0.29654157f, 0.95501994f},
|
||||||
|
{-0.28401534f, 0.95881973f}, {-0.27144045f, 0.96245524f},
|
||||||
|
{-0.25881905f, 0.96592583f}, {-0.24615329f, 0.96923091f},
|
||||||
|
{-0.23344536f, 0.97236992f}, {-0.22069744f, 0.97534232f},
|
||||||
|
{-0.20791169f, 0.97814760f}, {-0.19509032f, 0.98078528f},
|
||||||
|
{-0.18223553f, 0.98325491f}, {-0.16934950f, 0.98555606f},
|
||||||
|
{-0.15643447f, 0.98768834f}, {-0.14349262f, 0.98965139f},
|
||||||
|
{-0.13052619f, 0.99144486f}, {-0.11753740f, 0.99306846f},
|
||||||
|
{-0.10452846f, 0.99452190f}, {-0.091501619f, 0.99580493f},
|
||||||
|
{-0.078459096f, 0.99691733f}, {-0.065403129f, 0.99785892f},
|
||||||
|
{-0.052335956f, 0.99862953f}, {-0.039259816f, 0.99922904f},
|
||||||
|
{-0.026176948f, 0.99965732f}, {-0.013089596f, 0.99991433f},
|
||||||
|
{-1.8369095e-16f, 1.0000000f}, {0.013089596f, 0.99991433f},
|
||||||
|
{0.026176948f, 0.99965732f}, {0.039259816f, 0.99922904f},
|
||||||
|
{0.052335956f, 0.99862953f}, {0.065403129f, 0.99785892f},
|
||||||
|
{0.078459096f, 0.99691733f}, {0.091501619f, 0.99580493f},
|
||||||
|
{0.10452846f, 0.99452190f}, {0.11753740f, 0.99306846f},
|
||||||
|
{0.13052619f, 0.99144486f}, {0.14349262f, 0.98965139f},
|
||||||
|
{0.15643447f, 0.98768834f}, {0.16934950f, 0.98555606f},
|
||||||
|
{0.18223553f, 0.98325491f}, {0.19509032f, 0.98078528f},
|
||||||
|
{0.20791169f, 0.97814760f}, {0.22069744f, 0.97534232f},
|
||||||
|
{0.23344536f, 0.97236992f}, {0.24615329f, 0.96923091f},
|
||||||
|
{0.25881905f, 0.96592583f}, {0.27144045f, 0.96245524f},
|
||||||
|
{0.28401534f, 0.95881973f}, {0.29654157f, 0.95501994f},
|
||||||
|
{0.30901699f, 0.95105652f}, {0.32143947f, 0.94693013f},
|
||||||
|
{0.33380686f, 0.94264149f}, {0.34611706f, 0.93819134f},
|
||||||
|
{0.35836795f, 0.93358043f}, {0.37055744f, 0.92880955f},
|
||||||
|
{0.38268343f, 0.92387953f}, {0.39474386f, 0.91879121f},
|
||||||
|
{0.40673664f, 0.91354546f}, {0.41865974f, 0.90814317f},
|
||||||
|
{0.43051110f, 0.90258528f}, {0.44228869f, 0.89687274f},
|
||||||
|
{0.45399050f, 0.89100652f}, {0.46561452f, 0.88498764f},
|
||||||
|
{0.47715876f, 0.87881711f}, {0.48862124f, 0.87249601f},
|
||||||
|
{0.50000000f, 0.86602540f}, {0.51129309f, 0.85940641f},
|
||||||
|
{0.52249856f, 0.85264016f}, {0.53361452f, 0.84572782f},
|
||||||
|
{0.54463904f, 0.83867057f}, {0.55557023f, 0.83146961f},
|
||||||
|
{0.56640624f, 0.82412619f}, {0.57714519f, 0.81664156f},
|
||||||
|
{0.58778525f, 0.80901699f}, {0.59832460f, 0.80125381f},
|
||||||
|
{0.60876143f, 0.79335334f}, {0.61909395f, 0.78531693f},
|
||||||
|
{0.62932039f, 0.77714596f}, {0.63943900f, 0.76884183f},
|
||||||
|
{0.64944805f, 0.76040597f}, {0.65934582f, 0.75183981f},
|
||||||
|
{0.66913061f, 0.74314483f}, {0.67880075f, 0.73432251f},
|
||||||
|
{0.68835458f, 0.72537437f}, {0.69779046f, 0.71630194f},
|
||||||
|
{0.70710678f, 0.70710678f}, {0.71630194f, 0.69779046f},
|
||||||
|
{0.72537437f, 0.68835458f}, {0.73432251f, 0.67880075f},
|
||||||
|
{0.74314483f, 0.66913061f}, {0.75183981f, 0.65934582f},
|
||||||
|
{0.76040597f, 0.64944805f}, {0.76884183f, 0.63943900f},
|
||||||
|
{0.77714596f, 0.62932039f}, {0.78531693f, 0.61909395f},
|
||||||
|
{0.79335334f, 0.60876143f}, {0.80125381f, 0.59832460f},
|
||||||
|
{0.80901699f, 0.58778525f}, {0.81664156f, 0.57714519f},
|
||||||
|
{0.82412619f, 0.56640624f}, {0.83146961f, 0.55557023f},
|
||||||
|
{0.83867057f, 0.54463904f}, {0.84572782f, 0.53361452f},
|
||||||
|
{0.85264016f, 0.52249856f}, {0.85940641f, 0.51129309f},
|
||||||
|
{0.86602540f, 0.50000000f}, {0.87249601f, 0.48862124f},
|
||||||
|
{0.87881711f, 0.47715876f}, {0.88498764f, 0.46561452f},
|
||||||
|
{0.89100652f, 0.45399050f}, {0.89687274f, 0.44228869f},
|
||||||
|
{0.90258528f, 0.43051110f}, {0.90814317f, 0.41865974f},
|
||||||
|
{0.91354546f, 0.40673664f}, {0.91879121f, 0.39474386f},
|
||||||
|
{0.92387953f, 0.38268343f}, {0.92880955f, 0.37055744f},
|
||||||
|
{0.93358043f, 0.35836795f}, {0.93819134f, 0.34611706f},
|
||||||
|
{0.94264149f, 0.33380686f}, {0.94693013f, 0.32143947f},
|
||||||
|
{0.95105652f, 0.30901699f}, {0.95501994f, 0.29654157f},
|
||||||
|
{0.95881973f, 0.28401534f}, {0.96245524f, 0.27144045f},
|
||||||
|
{0.96592583f, 0.25881905f}, {0.96923091f, 0.24615329f},
|
||||||
|
{0.97236992f, 0.23344536f}, {0.97534232f, 0.22069744f},
|
||||||
|
{0.97814760f, 0.20791169f}, {0.98078528f, 0.19509032f},
|
||||||
|
{0.98325491f, 0.18223553f}, {0.98555606f, 0.16934950f},
|
||||||
|
{0.98768834f, 0.15643447f}, {0.98965139f, 0.14349262f},
|
||||||
|
{0.99144486f, 0.13052619f}, {0.99306846f, 0.11753740f},
|
||||||
|
{0.99452190f, 0.10452846f}, {0.99580493f, 0.091501619f},
|
||||||
|
{0.99691733f, 0.078459096f}, {0.99785892f, 0.065403129f},
|
||||||
|
{0.99862953f, 0.052335956f}, {0.99922904f, 0.039259816f},
|
||||||
|
{0.99965732f, 0.026176948f}, {0.99991433f, 0.013089596f},
|
||||||
|
};
|
||||||
|
#ifndef FFT_BITREV480
|
||||||
|
#define FFT_BITREV480
|
||||||
|
static const opus_int16 fft_bitrev480[480] = {
|
||||||
|
0, 120, 240, 360, 30, 150, 270, 390, 60, 180, 300, 420, 90, 210, 330,
|
||||||
|
450, 15, 135, 255, 375, 45, 165, 285, 405, 75, 195, 315, 435, 105, 225,
|
||||||
|
345, 465, 5, 125, 245, 365, 35, 155, 275, 395, 65, 185, 305, 425, 95,
|
||||||
|
215, 335, 455, 20, 140, 260, 380, 50, 170, 290, 410, 80, 200, 320, 440,
|
||||||
|
110, 230, 350, 470, 10, 130, 250, 370, 40, 160, 280, 400, 70, 190, 310,
|
||||||
|
430, 100, 220, 340, 460, 25, 145, 265, 385, 55, 175, 295, 415, 85, 205,
|
||||||
|
325, 445, 115, 235, 355, 475, 1, 121, 241, 361, 31, 151, 271, 391, 61,
|
||||||
|
181, 301, 421, 91, 211, 331, 451, 16, 136, 256, 376, 46, 166, 286, 406,
|
||||||
|
76, 196, 316, 436, 106, 226, 346, 466, 6, 126, 246, 366, 36, 156, 276,
|
||||||
|
396, 66, 186, 306, 426, 96, 216, 336, 456, 21, 141, 261, 381, 51, 171,
|
||||||
|
291, 411, 81, 201, 321, 441, 111, 231, 351, 471, 11, 131, 251, 371, 41,
|
||||||
|
161, 281, 401, 71, 191, 311, 431, 101, 221, 341, 461, 26, 146, 266, 386,
|
||||||
|
56, 176, 296, 416, 86, 206, 326, 446, 116, 236, 356, 476, 2, 122, 242,
|
||||||
|
362, 32, 152, 272, 392, 62, 182, 302, 422, 92, 212, 332, 452, 17, 137,
|
||||||
|
257, 377, 47, 167, 287, 407, 77, 197, 317, 437, 107, 227, 347, 467, 7,
|
||||||
|
127, 247, 367, 37, 157, 277, 397, 67, 187, 307, 427, 97, 217, 337, 457,
|
||||||
|
22, 142, 262, 382, 52, 172, 292, 412, 82, 202, 322, 442, 112, 232, 352,
|
||||||
|
472, 12, 132, 252, 372, 42, 162, 282, 402, 72, 192, 312, 432, 102, 222,
|
||||||
|
342, 462, 27, 147, 267, 387, 57, 177, 297, 417, 87, 207, 327, 447, 117,
|
||||||
|
237, 357, 477, 3, 123, 243, 363, 33, 153, 273, 393, 63, 183, 303, 423,
|
||||||
|
93, 213, 333, 453, 18, 138, 258, 378, 48, 168, 288, 408, 78, 198, 318,
|
||||||
|
438, 108, 228, 348, 468, 8, 128, 248, 368, 38, 158, 278, 398, 68, 188,
|
||||||
|
308, 428, 98, 218, 338, 458, 23, 143, 263, 383, 53, 173, 293, 413, 83,
|
||||||
|
203, 323, 443, 113, 233, 353, 473, 13, 133, 253, 373, 43, 163, 283, 403,
|
||||||
|
73, 193, 313, 433, 103, 223, 343, 463, 28, 148, 268, 388, 58, 178, 298,
|
||||||
|
418, 88, 208, 328, 448, 118, 238, 358, 478, 4, 124, 244, 364, 34, 154,
|
||||||
|
274, 394, 64, 184, 304, 424, 94, 214, 334, 454, 19, 139, 259, 379, 49,
|
||||||
|
169, 289, 409, 79, 199, 319, 439, 109, 229, 349, 469, 9, 129, 249, 369,
|
||||||
|
39, 159, 279, 399, 69, 189, 309, 429, 99, 219, 339, 459, 24, 144, 264,
|
||||||
|
384, 54, 174, 294, 414, 84, 204, 324, 444, 114, 234, 354, 474, 14, 134,
|
||||||
|
254, 374, 44, 164, 284, 404, 74, 194, 314, 434, 104, 224, 344, 464, 29,
|
||||||
|
149, 269, 389, 59, 179, 299, 419, 89, 209, 329, 449, 119, 239, 359, 479,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef FFT_BITREV240
|
||||||
|
#define FFT_BITREV240
|
||||||
|
static const opus_int16 fft_bitrev240[240] = {
|
||||||
|
0, 60, 120, 180, 15, 75, 135, 195, 30, 90, 150, 210, 45, 105, 165,
|
||||||
|
225, 5, 65, 125, 185, 20, 80, 140, 200, 35, 95, 155, 215, 50, 110,
|
||||||
|
170, 230, 10, 70, 130, 190, 25, 85, 145, 205, 40, 100, 160, 220, 55,
|
||||||
|
115, 175, 235, 1, 61, 121, 181, 16, 76, 136, 196, 31, 91, 151, 211,
|
||||||
|
46, 106, 166, 226, 6, 66, 126, 186, 21, 81, 141, 201, 36, 96, 156,
|
||||||
|
216, 51, 111, 171, 231, 11, 71, 131, 191, 26, 86, 146, 206, 41, 101,
|
||||||
|
161, 221, 56, 116, 176, 236, 2, 62, 122, 182, 17, 77, 137, 197, 32,
|
||||||
|
92, 152, 212, 47, 107, 167, 227, 7, 67, 127, 187, 22, 82, 142, 202,
|
||||||
|
37, 97, 157, 217, 52, 112, 172, 232, 12, 72, 132, 192, 27, 87, 147,
|
||||||
|
207, 42, 102, 162, 222, 57, 117, 177, 237, 3, 63, 123, 183, 18, 78,
|
||||||
|
138, 198, 33, 93, 153, 213, 48, 108, 168, 228, 8, 68, 128, 188, 23,
|
||||||
|
83, 143, 203, 38, 98, 158, 218, 53, 113, 173, 233, 13, 73, 133, 193,
|
||||||
|
28, 88, 148, 208, 43, 103, 163, 223, 58, 118, 178, 238, 4, 64, 124,
|
||||||
|
184, 19, 79, 139, 199, 34, 94, 154, 214, 49, 109, 169, 229, 9, 69,
|
||||||
|
129, 189, 24, 84, 144, 204, 39, 99, 159, 219, 54, 114, 174, 234, 14,
|
||||||
|
74, 134, 194, 29, 89, 149, 209, 44, 104, 164, 224, 59, 119, 179, 239,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef FFT_BITREV120
|
||||||
|
#define FFT_BITREV120
|
||||||
|
static const opus_int16 fft_bitrev120[120] = {
|
||||||
|
0, 30, 60, 90, 15, 45, 75, 105, 5, 35, 65, 95, 20, 50, 80,
|
||||||
|
110, 10, 40, 70, 100, 25, 55, 85, 115, 1, 31, 61, 91, 16, 46,
|
||||||
|
76, 106, 6, 36, 66, 96, 21, 51, 81, 111, 11, 41, 71, 101, 26,
|
||||||
|
56, 86, 116, 2, 32, 62, 92, 17, 47, 77, 107, 7, 37, 67, 97,
|
||||||
|
22, 52, 82, 112, 12, 42, 72, 102, 27, 57, 87, 117, 3, 33, 63,
|
||||||
|
93, 18, 48, 78, 108, 8, 38, 68, 98, 23, 53, 83, 113, 13, 43,
|
||||||
|
73, 103, 28, 58, 88, 118, 4, 34, 64, 94, 19, 49, 79, 109, 9,
|
||||||
|
39, 69, 99, 24, 54, 84, 114, 14, 44, 74, 104, 29, 59, 89, 119,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef FFT_BITREV60
|
||||||
|
#define FFT_BITREV60
|
||||||
|
static const opus_int16 fft_bitrev60[60] = {
|
||||||
|
0, 15, 30, 45, 5, 20, 35, 50, 10, 25, 40, 55, 1, 16, 31,
|
||||||
|
46, 6, 21, 36, 51, 11, 26, 41, 56, 2, 17, 32, 47, 7, 22,
|
||||||
|
37, 52, 12, 27, 42, 57, 3, 18, 33, 48, 8, 23, 38, 53, 13,
|
||||||
|
28, 43, 58, 4, 19, 34, 49, 9, 24, 39, 54, 14, 29, 44, 59,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef FFT_STATE48000_960_0
|
||||||
|
#define FFT_STATE48000_960_0
|
||||||
|
static const kiss_fft_state fft_state48000_960_0 = {
|
||||||
|
480, /* nfft */
|
||||||
|
0.002083333f, /* scale */
|
||||||
|
-1, /* shift */
|
||||||
|
{4, 120, 4, 30, 2, 15, 3, 5, 5, 1, 0, 0, 0, 0, 0, 0, }, /* factors */
|
||||||
|
fft_bitrev480, /* bitrev */
|
||||||
|
fft_twiddles48000_960, /* bitrev */
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef FFT_STATE48000_960_1
|
||||||
|
#define FFT_STATE48000_960_1
|
||||||
|
static const kiss_fft_state fft_state48000_960_1 = {
|
||||||
|
240, /* nfft */
|
||||||
|
0.004166667f, /* scale */
|
||||||
|
1, /* shift */
|
||||||
|
{4, 60, 4, 15, 3, 5, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, }, /* factors */
|
||||||
|
fft_bitrev240, /* bitrev */
|
||||||
|
fft_twiddles48000_960, /* bitrev */
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef FFT_STATE48000_960_2
|
||||||
|
#define FFT_STATE48000_960_2
|
||||||
|
static const kiss_fft_state fft_state48000_960_2 = {
|
||||||
|
120, /* nfft */
|
||||||
|
0.008333333f, /* scale */
|
||||||
|
2, /* shift */
|
||||||
|
{4, 30, 2, 15, 3, 5, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, }, /* factors */
|
||||||
|
fft_bitrev120, /* bitrev */
|
||||||
|
fft_twiddles48000_960, /* bitrev */
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef FFT_STATE48000_960_3
|
||||||
|
#define FFT_STATE48000_960_3
|
||||||
|
static const kiss_fft_state fft_state48000_960_3 = {
|
||||||
|
60, /* nfft */
|
||||||
|
0.016666667f, /* scale */
|
||||||
|
3, /* shift */
|
||||||
|
{4, 15, 3, 5, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* factors */
|
||||||
|
fft_bitrev60, /* bitrev */
|
||||||
|
fft_twiddles48000_960, /* bitrev */
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MDCT_TWIDDLES960
|
||||||
|
#define MDCT_TWIDDLES960
|
||||||
|
static const opus_val16 mdct_twiddles960[481] = {
|
||||||
|
1.0000000f, 0.99999465f, 0.99997858f, 0.99995181f, 0.99991433f,
|
||||||
|
0.99986614f, 0.99980724f, 0.99973764f, 0.99965732f, 0.99956631f,
|
||||||
|
0.99946459f, 0.99935216f, 0.99922904f, 0.99909521f, 0.99895068f,
|
||||||
|
0.99879546f, 0.99862953f, 0.99845292f, 0.99826561f, 0.99806761f,
|
||||||
|
0.99785892f, 0.99763955f, 0.99740949f, 0.99716875f, 0.99691733f,
|
||||||
|
0.99665524f, 0.99638247f, 0.99609903f, 0.99580493f, 0.99550016f,
|
||||||
|
0.99518473f, 0.99485864f, 0.99452190f, 0.99417450f, 0.99381646f,
|
||||||
|
0.99344778f, 0.99306846f, 0.99267850f, 0.99227791f, 0.99186670f,
|
||||||
|
0.99144486f, 0.99101241f, 0.99056934f, 0.99011566f, 0.98965139f,
|
||||||
|
0.98917651f, 0.98869104f, 0.98819498f, 0.98768834f, 0.98717112f,
|
||||||
|
0.98664333f, 0.98610497f, 0.98555606f, 0.98499659f, 0.98442657f,
|
||||||
|
0.98384600f, 0.98325491f, 0.98265328f, 0.98204113f, 0.98141846f,
|
||||||
|
0.98078528f, 0.98014159f, 0.97948742f, 0.97882275f, 0.97814760f,
|
||||||
|
0.97746197f, 0.97676588f, 0.97605933f, 0.97534232f, 0.97461487f,
|
||||||
|
0.97387698f, 0.97312866f, 0.97236992f, 0.97160077f, 0.97082121f,
|
||||||
|
0.97003125f, 0.96923091f, 0.96842019f, 0.96759909f, 0.96676764f,
|
||||||
|
0.96592582f, 0.96507367f, 0.96421118f, 0.96333837f, 0.96245523f,
|
||||||
|
0.96156180f, 0.96065806f, 0.95974403f, 0.95881973f, 0.95788517f,
|
||||||
|
0.95694034f, 0.95598526f, 0.95501995f, 0.95404440f, 0.95305864f,
|
||||||
|
0.95206267f, 0.95105651f, 0.95004016f, 0.94901364f, 0.94797697f,
|
||||||
|
0.94693013f, 0.94587315f, 0.94480604f, 0.94372882f, 0.94264149f,
|
||||||
|
0.94154406f, 0.94043656f, 0.93931897f, 0.93819133f, 0.93705365f,
|
||||||
|
0.93590592f, 0.93474818f, 0.93358042f, 0.93240268f, 0.93121493f,
|
||||||
|
0.93001722f, 0.92880955f, 0.92759193f, 0.92636438f, 0.92512690f,
|
||||||
|
0.92387953f, 0.92262225f, 0.92135509f, 0.92007809f, 0.91879121f,
|
||||||
|
0.91749449f, 0.91618795f, 0.91487161f, 0.91354545f, 0.91220952f,
|
||||||
|
0.91086382f, 0.90950836f, 0.90814316f, 0.90676824f, 0.90538363f,
|
||||||
|
0.90398929f, 0.90258528f, 0.90117161f, 0.89974828f, 0.89831532f,
|
||||||
|
0.89687273f, 0.89542055f, 0.89395877f, 0.89248742f, 0.89100652f,
|
||||||
|
0.88951606f, 0.88801610f, 0.88650661f, 0.88498764f, 0.88345918f,
|
||||||
|
0.88192125f, 0.88037390f, 0.87881711f, 0.87725090f, 0.87567531f,
|
||||||
|
0.87409035f, 0.87249599f, 0.87089232f, 0.86927933f, 0.86765699f,
|
||||||
|
0.86602540f, 0.86438453f, 0.86273437f, 0.86107503f, 0.85940641f,
|
||||||
|
0.85772862f, 0.85604161f, 0.85434547f, 0.85264014f, 0.85092572f,
|
||||||
|
0.84920218f, 0.84746955f, 0.84572781f, 0.84397704f, 0.84221721f,
|
||||||
|
0.84044838f, 0.83867056f, 0.83688375f, 0.83508799f, 0.83328325f,
|
||||||
|
0.83146961f, 0.82964704f, 0.82781562f, 0.82597530f, 0.82412620f,
|
||||||
|
0.82226820f, 0.82040144f, 0.81852589f, 0.81664154f, 0.81474847f,
|
||||||
|
0.81284665f, 0.81093620f, 0.80901698f, 0.80708914f, 0.80515262f,
|
||||||
|
0.80320752f, 0.80125378f, 0.79929149f, 0.79732067f, 0.79534125f,
|
||||||
|
0.79335335f, 0.79135691f, 0.78935204f, 0.78733867f, 0.78531691f,
|
||||||
|
0.78328674f, 0.78124818f, 0.77920122f, 0.77714595f, 0.77508232f,
|
||||||
|
0.77301043f, 0.77093026f, 0.76884183f, 0.76674517f, 0.76464026f,
|
||||||
|
0.76252720f, 0.76040593f, 0.75827656f, 0.75613907f, 0.75399349f,
|
||||||
|
0.75183978f, 0.74967807f, 0.74750833f, 0.74533054f, 0.74314481f,
|
||||||
|
0.74095112f, 0.73874950f, 0.73653993f, 0.73432251f, 0.73209718f,
|
||||||
|
0.72986405f, 0.72762307f, 0.72537438f, 0.72311787f, 0.72085359f,
|
||||||
|
0.71858162f, 0.71630192f, 0.71401459f, 0.71171956f, 0.70941701f,
|
||||||
|
0.70710677f, 0.70478900f, 0.70246363f, 0.70013079f, 0.69779041f,
|
||||||
|
0.69544260f, 0.69308738f, 0.69072466f, 0.68835458f, 0.68597709f,
|
||||||
|
0.68359229f, 0.68120013f, 0.67880072f, 0.67639404f, 0.67398011f,
|
||||||
|
0.67155892f, 0.66913059f, 0.66669509f, 0.66425240f, 0.66180265f,
|
||||||
|
0.65934581f, 0.65688191f, 0.65441092f, 0.65193298f, 0.64944801f,
|
||||||
|
0.64695613f, 0.64445727f, 0.64195160f, 0.63943902f, 0.63691954f,
|
||||||
|
0.63439328f, 0.63186019f, 0.62932037f, 0.62677377f, 0.62422055f,
|
||||||
|
0.62166055f, 0.61909394f, 0.61652065f, 0.61394081f, 0.61135435f,
|
||||||
|
0.60876139f, 0.60616195f, 0.60355593f, 0.60094349f, 0.59832457f,
|
||||||
|
0.59569929f, 0.59306758f, 0.59042957f, 0.58778523f, 0.58513460f,
|
||||||
|
0.58247766f, 0.57981452f, 0.57714518f, 0.57446961f, 0.57178793f,
|
||||||
|
0.56910013f, 0.56640624f, 0.56370623f, 0.56100023f, 0.55828818f,
|
||||||
|
0.55557020f, 0.55284627f, 0.55011641f, 0.54738067f, 0.54463901f,
|
||||||
|
0.54189157f, 0.53913828f, 0.53637921f, 0.53361450f, 0.53084398f,
|
||||||
|
0.52806787f, 0.52528601f, 0.52249852f, 0.51970543f, 0.51690688f,
|
||||||
|
0.51410279f, 0.51129310f, 0.50847793f, 0.50565732f, 0.50283139f,
|
||||||
|
0.49999997f, 0.49716321f, 0.49432122f, 0.49147383f, 0.48862118f,
|
||||||
|
0.48576340f, 0.48290042f, 0.48003216f, 0.47715876f, 0.47428025f,
|
||||||
|
0.47139677f, 0.46850813f, 0.46561448f, 0.46271584f, 0.45981235f,
|
||||||
|
0.45690383f, 0.45399042f, 0.45107214f, 0.44814915f, 0.44522124f,
|
||||||
|
0.44228868f, 0.43935137f, 0.43640926f, 0.43346247f, 0.43051104f,
|
||||||
|
0.42755511f, 0.42459449f, 0.42162932f, 0.41865964f, 0.41568558f,
|
||||||
|
0.41270697f, 0.40972393f, 0.40673661f, 0.40374494f, 0.40074884f,
|
||||||
|
0.39774844f, 0.39474390f, 0.39173501f, 0.38872193f, 0.38570469f,
|
||||||
|
0.38268343f, 0.37965796f, 0.37662842f, 0.37359496f, 0.37055739f,
|
||||||
|
0.36751585f, 0.36447038f, 0.36142122f, 0.35836797f, 0.35531089f,
|
||||||
|
0.35225000f, 0.34918544f, 0.34611704f, 0.34304493f, 0.33996926f,
|
||||||
|
0.33688983f, 0.33380680f, 0.33072019f, 0.32763015f, 0.32453650f,
|
||||||
|
0.32143936f, 0.31833890f, 0.31523503f, 0.31212767f, 0.30901696f,
|
||||||
|
0.30590306f, 0.30278577f, 0.29966524f, 0.29654150f, 0.29341470f,
|
||||||
|
0.29028464f, 0.28715147f, 0.28401522f, 0.28087605f, 0.27773376f,
|
||||||
|
0.27458861f, 0.27144052f, 0.26828940f, 0.26513541f, 0.26197859f,
|
||||||
|
0.25881907f, 0.25565666f, 0.25249152f, 0.24932367f, 0.24615327f,
|
||||||
|
0.24298012f, 0.23980436f, 0.23662604f, 0.23344530f, 0.23026206f,
|
||||||
|
0.22707623f, 0.22388809f, 0.22069744f, 0.21750443f, 0.21430908f,
|
||||||
|
0.21111156f, 0.20791165f, 0.20470953f, 0.20150520f, 0.19829884f,
|
||||||
|
0.19509024f, 0.19187955f, 0.18866692f, 0.18545227f, 0.18223552f,
|
||||||
|
0.17901681f, 0.17579631f, 0.17257380f, 0.16934945f, 0.16612328f,
|
||||||
|
0.16289546f, 0.15966577f, 0.15643437f, 0.15320141f, 0.14996669f,
|
||||||
|
0.14673037f, 0.14349260f, 0.14025329f, 0.13701235f, 0.13376995f,
|
||||||
|
0.13052612f, 0.12728101f, 0.12403442f, 0.12078650f, 0.11753740f,
|
||||||
|
0.11428693f, 0.11103523f, 0.10778234f, 0.10452842f, 0.10127326f,
|
||||||
|
0.098017137f, 0.094759842f, 0.091501652f, 0.088242363f, 0.084982129f,
|
||||||
|
0.081721103f, 0.078459084f, 0.075196224f, 0.071932560f, 0.068668243f,
|
||||||
|
0.065403073f, 0.062137201f, 0.058870665f, 0.055603617f, 0.052335974f,
|
||||||
|
0.049067651f, 0.045798921f, 0.042529582f, 0.039259788f, 0.035989573f,
|
||||||
|
0.032719092f, 0.029448142f, 0.026176876f, 0.022905329f, 0.019633657f,
|
||||||
|
0.016361655f, 0.013089478f, 0.0098171604f, 0.0065449764f, 0.0032724839f,
|
||||||
|
-4.3711390e-08f, };
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static const CELTMode mode48000_960_120 = {
|
||||||
|
48000, /* Fs */
|
||||||
|
120, /* overlap */
|
||||||
|
21, /* nbEBands */
|
||||||
|
21, /* effEBands */
|
||||||
|
{0.85000610f, 0.0000000f, 1.0000000f, 1.0000000f, }, /* preemph */
|
||||||
|
eband5ms, /* eBands */
|
||||||
|
3, /* maxLM */
|
||||||
|
8, /* nbShortMdcts */
|
||||||
|
120, /* shortMdctSize */
|
||||||
|
11, /* nbAllocVectors */
|
||||||
|
band_allocation, /* allocVectors */
|
||||||
|
logN400, /* logN */
|
||||||
|
window120, /* window */
|
||||||
|
{1920, 3, {&fft_state48000_960_0, &fft_state48000_960_1, &fft_state48000_960_2, &fft_state48000_960_3, }, mdct_twiddles960}, /* mdct */
|
||||||
|
{392, cache_index50, cache_bits50, cache_caps50}, /* cache */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* List of all the available modes */
|
||||||
|
#define TOTAL_MODES 1
|
||||||
|
static const CELTMode * const static_mode_list[TOTAL_MODES] = {
|
||||||
|
&mode48000_960_120,
|
||||||
|
};
|
223
Frameworks/Opus/Opus/opus/celt/tests/test_unit_cwrs32.c
Normal file
223
Frameworks/Opus/Opus/opus/celt/tests/test_unit_cwrs32.c
Normal file
|
@ -0,0 +1,223 @@
|
||||||
|
/* Copyright (c) 2008-2011 Xiph.Org Foundation, Mozilla Corporation,
|
||||||
|
Gregory Maxwell
|
||||||
|
Written by Jean-Marc Valin, Gregory Maxwell, and Timothy B. Terriberry */
|
||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#ifndef CUSTOM_MODES
|
||||||
|
#define CUSTOM_MODES
|
||||||
|
#else
|
||||||
|
#define TEST_CUSTOM_MODES
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define CELT_C
|
||||||
|
#include "stack_alloc.h"
|
||||||
|
#include "entenc.c"
|
||||||
|
#include "entdec.c"
|
||||||
|
#include "entcode.c"
|
||||||
|
#include "cwrs.c"
|
||||||
|
#include "mathops.c"
|
||||||
|
#include "rate.h"
|
||||||
|
|
||||||
|
#define NMAX (240)
|
||||||
|
#define KMAX (128)
|
||||||
|
|
||||||
|
#ifdef TEST_CUSTOM_MODES
|
||||||
|
|
||||||
|
#define NDIMS (46)
|
||||||
|
static const int pn[NDIMS]={
|
||||||
|
2, 3, 4, 5, 6, 7, 8, 9, 10,
|
||||||
|
11, 12, 13, 14, 15, 16, 18, 20, 22,
|
||||||
|
24, 26, 28, 30, 32, 36, 40, 44, 48,
|
||||||
|
52, 56, 60, 64, 72, 80, 88, 96, 104,
|
||||||
|
112, 120, 128, 144, 160, 176, 192, 208, 224,
|
||||||
|
240
|
||||||
|
};
|
||||||
|
static const int pkmax[NDIMS]={
|
||||||
|
128, 128, 128, 128, 88, 52, 36, 26, 22,
|
||||||
|
18, 16, 15, 13, 12, 12, 11, 10, 9,
|
||||||
|
9, 8, 8, 7, 7, 7, 7, 6, 6,
|
||||||
|
6, 6, 6, 5, 5, 5, 5, 5, 5,
|
||||||
|
4, 4, 4, 4, 4, 4, 4, 4, 4,
|
||||||
|
4
|
||||||
|
};
|
||||||
|
|
||||||
|
#else /* TEST_CUSTOM_MODES */
|
||||||
|
|
||||||
|
#define NDIMS (22)
|
||||||
|
static const int pn[NDIMS]={
|
||||||
|
2, 3, 4, 6, 8, 9, 11, 12, 16,
|
||||||
|
18, 22, 24, 32, 36, 44, 48, 64, 72,
|
||||||
|
88, 96, 144, 176
|
||||||
|
};
|
||||||
|
static const int pkmax[NDIMS]={
|
||||||
|
128, 128, 128, 88, 36, 26, 18, 16, 12,
|
||||||
|
11, 9, 9, 7, 7, 6, 6, 5, 5,
|
||||||
|
5, 5, 4, 4
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int main(void){
|
||||||
|
int t;
|
||||||
|
int n;
|
||||||
|
ALLOC_STACK;
|
||||||
|
for(t=0;t<NDIMS;t++){
|
||||||
|
int pseudo;
|
||||||
|
n=pn[t];
|
||||||
|
for(pseudo=1;pseudo<41;pseudo++)
|
||||||
|
{
|
||||||
|
int k;
|
||||||
|
opus_uint32 uu[KMAX+2U];
|
||||||
|
opus_uint32 inc;
|
||||||
|
opus_uint32 nc;
|
||||||
|
opus_uint32 i;
|
||||||
|
k=get_pulses(pseudo);
|
||||||
|
if (k>pkmax[t])break;
|
||||||
|
printf("Testing CWRS with N=%i, K=%i...\n",n,k);
|
||||||
|
nc=ncwrs_urow(n,k,uu);
|
||||||
|
inc=nc/20000;
|
||||||
|
if(inc<1)inc=1;
|
||||||
|
for(i=0;i<nc;i+=inc){
|
||||||
|
opus_uint32 u[KMAX+2U];
|
||||||
|
int y[NMAX];
|
||||||
|
int sy;
|
||||||
|
int yy[5];
|
||||||
|
opus_uint32 v;
|
||||||
|
opus_uint32 ii;
|
||||||
|
int kk;
|
||||||
|
int j;
|
||||||
|
memcpy(u,uu,(k+2U)*sizeof(*u));
|
||||||
|
cwrsi(n,k,i,y,u);
|
||||||
|
sy=0;
|
||||||
|
for(j=0;j<n;j++)sy+=ABS(y[j]);
|
||||||
|
if(sy!=k){
|
||||||
|
fprintf(stderr,"N=%d Pulse count mismatch in cwrsi (%d!=%d).\n",
|
||||||
|
n,sy,k);
|
||||||
|
return 99;
|
||||||
|
}
|
||||||
|
/*printf("%6u of %u:",i,nc);
|
||||||
|
for(j=0;j<n;j++)printf(" %+3i",y[j]);
|
||||||
|
printf(" ->");*/
|
||||||
|
ii=icwrs(n,k,&v,y,u);
|
||||||
|
if(ii!=i){
|
||||||
|
fprintf(stderr,"Combination-index mismatch (%lu!=%lu).\n",
|
||||||
|
(long)ii,(long)i);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if(v!=nc){
|
||||||
|
fprintf(stderr,"Combination count mismatch (%lu!=%lu).\n",
|
||||||
|
(long)v,(long)nc);
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
#ifndef SMALL_FOOTPRINT
|
||||||
|
if(n==2){
|
||||||
|
cwrsi2(k,i,yy);
|
||||||
|
for(j=0;j<2;j++)if(yy[j]!=y[j]){
|
||||||
|
fprintf(stderr,"N=2 pulse vector mismatch ({%i,%i}!={%i,%i}).\n",
|
||||||
|
yy[0],yy[1],y[0],y[1]);
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
|
ii=icwrs2(yy,&kk);
|
||||||
|
if(ii!=i){
|
||||||
|
fprintf(stderr,"N=2 combination-index mismatch (%lu!=%lu).\n",
|
||||||
|
(long)ii,(long)i);
|
||||||
|
return 4;
|
||||||
|
}
|
||||||
|
if(kk!=k){
|
||||||
|
fprintf(stderr,"N=2 pulse count mismatch (%i,%i).\n",kk,k);
|
||||||
|
return 5;
|
||||||
|
}
|
||||||
|
v=ncwrs2(k);
|
||||||
|
if(v!=nc){
|
||||||
|
fprintf(stderr,"N=2 combination count mismatch (%lu,%lu).\n",
|
||||||
|
(long)v,(long)nc);
|
||||||
|
return 6;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(n==3){
|
||||||
|
cwrsi3(k,i,yy);
|
||||||
|
for(j=0;j<3;j++)if(yy[j]!=y[j]){
|
||||||
|
fprintf(stderr,"N=3 pulse vector mismatch "
|
||||||
|
"({%i,%i,%i}!={%i,%i,%i}).\n",yy[0],yy[1],yy[2],y[0],y[1],y[2]);
|
||||||
|
return 7;
|
||||||
|
}
|
||||||
|
ii=icwrs3(yy,&kk);
|
||||||
|
if(ii!=i){
|
||||||
|
fprintf(stderr,"N=3 combination-index mismatch (%lu!=%lu).\n",
|
||||||
|
(long)ii,(long)i);
|
||||||
|
return 8;
|
||||||
|
}
|
||||||
|
if(kk!=k){
|
||||||
|
fprintf(stderr,"N=3 pulse count mismatch (%i!=%i).\n",kk,k);
|
||||||
|
return 9;
|
||||||
|
}
|
||||||
|
v=ncwrs3(k);
|
||||||
|
if(v!=nc){
|
||||||
|
fprintf(stderr,"N=3 combination count mismatch (%lu!=%lu).\n",
|
||||||
|
(long)v,(long)nc);
|
||||||
|
return 10;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(n==4){
|
||||||
|
cwrsi4(k,i,yy);
|
||||||
|
for(j=0;j<4;j++)if(yy[j]!=y[j]){
|
||||||
|
fprintf(stderr,"N=4 pulse vector mismatch "
|
||||||
|
"({%i,%i,%i,%i}!={%i,%i,%i,%i}.\n",
|
||||||
|
yy[0],yy[1],yy[2],yy[3],y[0],y[1],y[2],y[3]);
|
||||||
|
return 11;
|
||||||
|
}
|
||||||
|
ii=icwrs4(yy,&kk);
|
||||||
|
if(ii!=i){
|
||||||
|
fprintf(stderr,"N=4 combination-index mismatch (%lu!=%lu).\n",
|
||||||
|
(long)ii,(long)i);
|
||||||
|
return 12;
|
||||||
|
}
|
||||||
|
if(kk!=k){
|
||||||
|
fprintf(stderr,"N=4 pulse count mismatch (%i!=%i).\n",kk,k);
|
||||||
|
return 13;
|
||||||
|
}
|
||||||
|
v=ncwrs4(k);
|
||||||
|
if(v!=nc){
|
||||||
|
fprintf(stderr,"N=4 combination count mismatch (%lu!=%lu).\n",
|
||||||
|
(long)v,(long)nc);
|
||||||
|
return 14;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* SMALL_FOOTPRINT */
|
||||||
|
/*printf(" %6u\n",i);*/
|
||||||
|
}
|
||||||
|
/*printf("\n");*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
164
Frameworks/Opus/Opus/opus/celt/tests/test_unit_dft.c
Normal file
164
Frameworks/Opus/Opus/opus/celt/tests/test_unit_dft.c
Normal file
|
@ -0,0 +1,164 @@
|
||||||
|
/* Copyright (c) 2008 Xiph.Org Foundation
|
||||||
|
Written by Jean-Marc Valin */
|
||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define SKIP_CONFIG_H
|
||||||
|
|
||||||
|
#ifndef CUSTOM_MODES
|
||||||
|
#define CUSTOM_MODES
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#define CELT_C
|
||||||
|
#include "stack_alloc.h"
|
||||||
|
#include "kiss_fft.h"
|
||||||
|
#include "kiss_fft.c"
|
||||||
|
#include "mathops.c"
|
||||||
|
#include "entcode.c"
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef M_PI
|
||||||
|
#define M_PI 3.141592653
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
void check(kiss_fft_cpx * in,kiss_fft_cpx * out,int nfft,int isinverse)
|
||||||
|
{
|
||||||
|
int bin,k;
|
||||||
|
double errpow=0,sigpow=0, snr;
|
||||||
|
|
||||||
|
for (bin=0;bin<nfft;++bin) {
|
||||||
|
double ansr = 0;
|
||||||
|
double ansi = 0;
|
||||||
|
double difr;
|
||||||
|
double difi;
|
||||||
|
|
||||||
|
for (k=0;k<nfft;++k) {
|
||||||
|
double phase = -2*M_PI*bin*k/nfft;
|
||||||
|
double re = cos(phase);
|
||||||
|
double im = sin(phase);
|
||||||
|
if (isinverse)
|
||||||
|
im = -im;
|
||||||
|
|
||||||
|
if (!isinverse)
|
||||||
|
{
|
||||||
|
re /= nfft;
|
||||||
|
im /= nfft;
|
||||||
|
}
|
||||||
|
|
||||||
|
ansr += in[k].r * re - in[k].i * im;
|
||||||
|
ansi += in[k].r * im + in[k].i * re;
|
||||||
|
}
|
||||||
|
/*printf ("%d %d ", (int)ansr, (int)ansi);*/
|
||||||
|
difr = ansr - out[bin].r;
|
||||||
|
difi = ansi - out[bin].i;
|
||||||
|
errpow += difr*difr + difi*difi;
|
||||||
|
sigpow += ansr*ansr+ansi*ansi;
|
||||||
|
}
|
||||||
|
snr = 10*log10(sigpow/errpow);
|
||||||
|
printf("nfft=%d inverse=%d,snr = %f\n",nfft,isinverse,snr );
|
||||||
|
if (snr<60) {
|
||||||
|
printf( "** poor snr: %f ** \n", snr);
|
||||||
|
ret = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void test1d(int nfft,int isinverse)
|
||||||
|
{
|
||||||
|
size_t buflen = sizeof(kiss_fft_cpx)*nfft;
|
||||||
|
|
||||||
|
kiss_fft_cpx * in = (kiss_fft_cpx*)malloc(buflen);
|
||||||
|
kiss_fft_cpx * out= (kiss_fft_cpx*)malloc(buflen);
|
||||||
|
kiss_fft_state *cfg = opus_fft_alloc(nfft,0,0);
|
||||||
|
int k;
|
||||||
|
|
||||||
|
for (k=0;k<nfft;++k) {
|
||||||
|
in[k].r = (rand() % 32767) - 16384;
|
||||||
|
in[k].i = (rand() % 32767) - 16384;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (k=0;k<nfft;++k) {
|
||||||
|
in[k].r *= 32768;
|
||||||
|
in[k].i *= 32768;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isinverse)
|
||||||
|
{
|
||||||
|
for (k=0;k<nfft;++k) {
|
||||||
|
in[k].r /= nfft;
|
||||||
|
in[k].i /= nfft;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*for (k=0;k<nfft;++k) printf("%d %d ", in[k].r, in[k].i);printf("\n");*/
|
||||||
|
|
||||||
|
if (isinverse)
|
||||||
|
opus_ifft(cfg,in,out);
|
||||||
|
else
|
||||||
|
opus_fft(cfg,in,out);
|
||||||
|
|
||||||
|
/*for (k=0;k<nfft;++k) printf("%d %d ", out[k].r, out[k].i);printf("\n");*/
|
||||||
|
|
||||||
|
check(in,out,nfft,isinverse);
|
||||||
|
|
||||||
|
free(in);
|
||||||
|
free(out);
|
||||||
|
free(cfg);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc,char ** argv)
|
||||||
|
{
|
||||||
|
ALLOC_STACK;
|
||||||
|
if (argc>1) {
|
||||||
|
int k;
|
||||||
|
for (k=1;k<argc;++k) {
|
||||||
|
test1d(atoi(argv[k]),0);
|
||||||
|
test1d(atoi(argv[k]),1);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
test1d(32,0);
|
||||||
|
test1d(32,1);
|
||||||
|
test1d(128,0);
|
||||||
|
test1d(128,1);
|
||||||
|
test1d(256,0);
|
||||||
|
test1d(256,1);
|
||||||
|
#ifndef RADIX_TWO_ONLY
|
||||||
|
test1d(36,0);
|
||||||
|
test1d(36,1);
|
||||||
|
test1d(50,0);
|
||||||
|
test1d(50,1);
|
||||||
|
test1d(120,0);
|
||||||
|
test1d(120,1);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
382
Frameworks/Opus/Opus/opus/celt/tests/test_unit_entropy.c
Normal file
382
Frameworks/Opus/Opus/opus/celt/tests/test_unit_entropy.c
Normal file
|
@ -0,0 +1,382 @@
|
||||||
|
/* Copyright (c) 2007-2011 Xiph.Org Foundation, Mozilla Corporation,
|
||||||
|
Gregory Maxwell
|
||||||
|
Written by Jean-Marc Valin, Gregory Maxwell, and Timothy B. Terriberry */
|
||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include "entcode.h"
|
||||||
|
#include "entenc.h"
|
||||||
|
#include "entdec.h"
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "entenc.c"
|
||||||
|
#include "entdec.c"
|
||||||
|
#include "entcode.c"
|
||||||
|
|
||||||
|
#ifndef M_LOG2E
|
||||||
|
# define M_LOG2E 1.4426950408889634074
|
||||||
|
#endif
|
||||||
|
#define DATA_SIZE 10000000
|
||||||
|
#define DATA_SIZE2 10000
|
||||||
|
|
||||||
|
int main(int _argc,char **_argv){
|
||||||
|
ec_enc enc;
|
||||||
|
ec_dec dec;
|
||||||
|
long nbits;
|
||||||
|
long nbits2;
|
||||||
|
double entropy;
|
||||||
|
int ft;
|
||||||
|
int ftb;
|
||||||
|
int sz;
|
||||||
|
int i;
|
||||||
|
int ret;
|
||||||
|
unsigned int sym;
|
||||||
|
unsigned int seed;
|
||||||
|
unsigned char *ptr;
|
||||||
|
const char *env_seed;
|
||||||
|
ret=0;
|
||||||
|
entropy=0;
|
||||||
|
if (_argc > 2) {
|
||||||
|
fprintf(stderr, "Usage: %s [<seed>]\n", _argv[0]);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
env_seed = getenv("SEED");
|
||||||
|
if (_argc > 1)
|
||||||
|
seed = atoi(_argv[1]);
|
||||||
|
else if (env_seed)
|
||||||
|
seed = atoi(env_seed);
|
||||||
|
else
|
||||||
|
seed = time(NULL);
|
||||||
|
/*Testing encoding of raw bit values.*/
|
||||||
|
ptr = (unsigned char *)malloc(DATA_SIZE);
|
||||||
|
ec_enc_init(&enc,ptr, DATA_SIZE);
|
||||||
|
for(ft=2;ft<1024;ft++){
|
||||||
|
for(i=0;i<ft;i++){
|
||||||
|
entropy+=log(ft)*M_LOG2E;
|
||||||
|
ec_enc_uint(&enc,i,ft);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*Testing encoding of raw bit values.*/
|
||||||
|
for(ftb=1;ftb<16;ftb++){
|
||||||
|
for(i=0;i<(1<<ftb);i++){
|
||||||
|
entropy+=ftb;
|
||||||
|
nbits=ec_tell(&enc);
|
||||||
|
ec_enc_bits(&enc,i,ftb);
|
||||||
|
nbits2=ec_tell(&enc);
|
||||||
|
if(nbits2-nbits!=ftb){
|
||||||
|
fprintf(stderr,"Used %li bits to encode %i bits directly.\n",
|
||||||
|
nbits2-nbits,ftb);
|
||||||
|
ret=-1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
nbits=ec_tell_frac(&enc);
|
||||||
|
ec_enc_done(&enc);
|
||||||
|
fprintf(stderr,
|
||||||
|
"Encoded %0.2lf bits of entropy to %0.2lf bits (%0.3lf%% wasted).\n",
|
||||||
|
entropy,ldexp(nbits,-3),100*(nbits-ldexp(entropy,3))/nbits);
|
||||||
|
fprintf(stderr,"Packed to %li bytes.\n",(long)ec_range_bytes(&enc));
|
||||||
|
ec_dec_init(&dec,ptr,DATA_SIZE);
|
||||||
|
for(ft=2;ft<1024;ft++){
|
||||||
|
for(i=0;i<ft;i++){
|
||||||
|
sym=ec_dec_uint(&dec,ft);
|
||||||
|
if(sym!=(unsigned)i){
|
||||||
|
fprintf(stderr,"Decoded %i instead of %i with ft of %i.\n",sym,i,ft);
|
||||||
|
ret=-1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for(ftb=1;ftb<16;ftb++){
|
||||||
|
for(i=0;i<(1<<ftb);i++){
|
||||||
|
sym=ec_dec_bits(&dec,ftb);
|
||||||
|
if(sym!=(unsigned)i){
|
||||||
|
fprintf(stderr,"Decoded %i instead of %i with ftb of %i.\n",sym,i,ftb);
|
||||||
|
ret=-1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
nbits2=ec_tell_frac(&dec);
|
||||||
|
if(nbits!=nbits2){
|
||||||
|
fprintf(stderr,
|
||||||
|
"Reported number of bits used was %0.2lf, should be %0.2lf.\n",
|
||||||
|
ldexp(nbits2,-3),ldexp(nbits,-3));
|
||||||
|
ret=-1;
|
||||||
|
}
|
||||||
|
/*Testing an encoder bust prefers range coder data over raw bits.
|
||||||
|
This isn't a general guarantee, will only work for data that is buffered in
|
||||||
|
the encoder state and not yet stored in the user buffer, and should never
|
||||||
|
get used in practice.
|
||||||
|
It's mostly here for code coverage completeness.*/
|
||||||
|
/*Start with a 16-bit buffer.*/
|
||||||
|
ec_enc_init(&enc,ptr,2);
|
||||||
|
/*Write 7 raw bits.*/
|
||||||
|
ec_enc_bits(&enc,0x55,7);
|
||||||
|
/*Write 12.3 bits of range coder data.*/
|
||||||
|
ec_enc_uint(&enc,1,2);
|
||||||
|
ec_enc_uint(&enc,1,3);
|
||||||
|
ec_enc_uint(&enc,1,4);
|
||||||
|
ec_enc_uint(&enc,1,5);
|
||||||
|
ec_enc_uint(&enc,2,6);
|
||||||
|
ec_enc_uint(&enc,6,7);
|
||||||
|
ec_enc_done(&enc);
|
||||||
|
ec_dec_init(&dec,ptr,2);
|
||||||
|
if(!enc.error
|
||||||
|
/*The raw bits should have been overwritten by the range coder data.*/
|
||||||
|
||ec_dec_bits(&dec,7)!=0x05
|
||||||
|
/*And all the range coder data should have been encoded correctly.*/
|
||||||
|
||ec_dec_uint(&dec,2)!=1
|
||||||
|
||ec_dec_uint(&dec,3)!=1
|
||||||
|
||ec_dec_uint(&dec,4)!=1
|
||||||
|
||ec_dec_uint(&dec,5)!=1
|
||||||
|
||ec_dec_uint(&dec,6)!=2
|
||||||
|
||ec_dec_uint(&dec,7)!=6){
|
||||||
|
fprintf(stderr,"Encoder bust overwrote range coder data with raw bits.\n");
|
||||||
|
ret=-1;
|
||||||
|
}
|
||||||
|
srand(seed);
|
||||||
|
fprintf(stderr,"Testing random streams... Random seed: %u (%.4X)\n", seed, rand() % 65536);
|
||||||
|
for(i=0;i<409600;i++){
|
||||||
|
unsigned *data;
|
||||||
|
unsigned *tell;
|
||||||
|
unsigned tell_bits;
|
||||||
|
int j;
|
||||||
|
int zeros;
|
||||||
|
ft=rand()/((RAND_MAX>>(rand()%11U))+1U)+10;
|
||||||
|
sz=rand()/((RAND_MAX>>(rand()%9U))+1U);
|
||||||
|
data=(unsigned *)malloc(sz*sizeof(*data));
|
||||||
|
tell=(unsigned *)malloc((sz+1)*sizeof(*tell));
|
||||||
|
ec_enc_init(&enc,ptr,DATA_SIZE2);
|
||||||
|
zeros = rand()%13==0;
|
||||||
|
tell[0]=ec_tell_frac(&enc);
|
||||||
|
for(j=0;j<sz;j++){
|
||||||
|
if (zeros)
|
||||||
|
data[j]=0;
|
||||||
|
else
|
||||||
|
data[j]=rand()%ft;
|
||||||
|
ec_enc_uint(&enc,data[j],ft);
|
||||||
|
tell[j+1]=ec_tell_frac(&enc);
|
||||||
|
}
|
||||||
|
if (rand()%2==0)
|
||||||
|
while(ec_tell(&enc)%8 != 0)
|
||||||
|
ec_enc_uint(&enc, rand()%2, 2);
|
||||||
|
tell_bits = ec_tell(&enc);
|
||||||
|
ec_enc_done(&enc);
|
||||||
|
if(tell_bits!=(unsigned)ec_tell(&enc)){
|
||||||
|
fprintf(stderr,"ec_tell() changed after ec_enc_done(): %i instead of %i (Random seed: %u)\n",
|
||||||
|
ec_tell(&enc),tell_bits,seed);
|
||||||
|
ret=-1;
|
||||||
|
}
|
||||||
|
if ((tell_bits+7)/8 < ec_range_bytes(&enc))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "ec_tell() lied, there's %i bytes instead of %d (Random seed: %u)\n",
|
||||||
|
ec_range_bytes(&enc), (tell_bits+7)/8,seed);
|
||||||
|
ret=-1;
|
||||||
|
}
|
||||||
|
ec_dec_init(&dec,ptr,DATA_SIZE2);
|
||||||
|
if(ec_tell_frac(&dec)!=tell[0]){
|
||||||
|
fprintf(stderr,
|
||||||
|
"Tell mismatch between encoder and decoder at symbol %i: %i instead of %i (Random seed: %u).\n",
|
||||||
|
0,ec_tell_frac(&dec),tell[0],seed);
|
||||||
|
}
|
||||||
|
for(j=0;j<sz;j++){
|
||||||
|
sym=ec_dec_uint(&dec,ft);
|
||||||
|
if(sym!=data[j]){
|
||||||
|
fprintf(stderr,
|
||||||
|
"Decoded %i instead of %i with ft of %i at position %i of %i (Random seed: %u).\n",
|
||||||
|
sym,data[j],ft,j,sz,seed);
|
||||||
|
ret=-1;
|
||||||
|
}
|
||||||
|
if(ec_tell_frac(&dec)!=tell[j+1]){
|
||||||
|
fprintf(stderr,
|
||||||
|
"Tell mismatch between encoder and decoder at symbol %i: %i instead of %i (Random seed: %u).\n",
|
||||||
|
j+1,ec_tell_frac(&dec),tell[j+1],seed);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(tell);
|
||||||
|
free(data);
|
||||||
|
}
|
||||||
|
/*Test compatibility between multiple different encode/decode routines.*/
|
||||||
|
for(i=0;i<409600;i++){
|
||||||
|
unsigned *logp1;
|
||||||
|
unsigned *data;
|
||||||
|
unsigned *tell;
|
||||||
|
unsigned *enc_method;
|
||||||
|
int j;
|
||||||
|
sz=rand()/((RAND_MAX>>(rand()%9U))+1U);
|
||||||
|
logp1=(unsigned *)malloc(sz*sizeof(*logp1));
|
||||||
|
data=(unsigned *)malloc(sz*sizeof(*data));
|
||||||
|
tell=(unsigned *)malloc((sz+1)*sizeof(*tell));
|
||||||
|
enc_method=(unsigned *)malloc(sz*sizeof(*enc_method));
|
||||||
|
ec_enc_init(&enc,ptr,DATA_SIZE2);
|
||||||
|
tell[0]=ec_tell_frac(&enc);
|
||||||
|
for(j=0;j<sz;j++){
|
||||||
|
data[j]=rand()/((RAND_MAX>>1)+1);
|
||||||
|
logp1[j]=(rand()%15)+1;
|
||||||
|
enc_method[j]=rand()/((RAND_MAX>>2)+1);
|
||||||
|
switch(enc_method[j]){
|
||||||
|
case 0:{
|
||||||
|
ec_encode(&enc,data[j]?(1<<logp1[j])-1:0,
|
||||||
|
(1<<logp1[j])-(data[j]?0:1),1<<logp1[j]);
|
||||||
|
}break;
|
||||||
|
case 1:{
|
||||||
|
ec_encode_bin(&enc,data[j]?(1<<logp1[j])-1:0,
|
||||||
|
(1<<logp1[j])-(data[j]?0:1),logp1[j]);
|
||||||
|
}break;
|
||||||
|
case 2:{
|
||||||
|
ec_enc_bit_logp(&enc,data[j],logp1[j]);
|
||||||
|
}break;
|
||||||
|
case 3:{
|
||||||
|
unsigned char icdf[2];
|
||||||
|
icdf[0]=1;
|
||||||
|
icdf[1]=0;
|
||||||
|
ec_enc_icdf(&enc,data[j],icdf,logp1[j]);
|
||||||
|
}break;
|
||||||
|
}
|
||||||
|
tell[j+1]=ec_tell_frac(&enc);
|
||||||
|
}
|
||||||
|
ec_enc_done(&enc);
|
||||||
|
if((ec_tell(&enc)+7U)/8U<ec_range_bytes(&enc)){
|
||||||
|
fprintf(stderr,"tell() lied, there's %i bytes instead of %d (Random seed: %u)\n",
|
||||||
|
ec_range_bytes(&enc),(ec_tell(&enc)+7)/8,seed);
|
||||||
|
ret=-1;
|
||||||
|
}
|
||||||
|
ec_dec_init(&dec,ptr,DATA_SIZE2);
|
||||||
|
if(ec_tell_frac(&dec)!=tell[0]){
|
||||||
|
fprintf(stderr,
|
||||||
|
"Tell mismatch between encoder and decoder at symbol %i: %i instead of %i (Random seed: %u).\n",
|
||||||
|
0,ec_tell_frac(&dec),tell[0],seed);
|
||||||
|
}
|
||||||
|
for(j=0;j<sz;j++){
|
||||||
|
int fs;
|
||||||
|
int dec_method;
|
||||||
|
dec_method=rand()/((RAND_MAX>>2)+1);
|
||||||
|
switch(dec_method){
|
||||||
|
case 0:{
|
||||||
|
fs=ec_decode(&dec,1<<logp1[j]);
|
||||||
|
sym=fs>=(1<<logp1[j])-1;
|
||||||
|
ec_dec_update(&dec,sym?(1<<logp1[j])-1:0,
|
||||||
|
(1<<logp1[j])-(sym?0:1),1<<logp1[j]);
|
||||||
|
}break;
|
||||||
|
case 1:{
|
||||||
|
fs=ec_decode_bin(&dec,logp1[j]);
|
||||||
|
sym=fs>=(1<<logp1[j])-1;
|
||||||
|
ec_dec_update(&dec,sym?(1<<logp1[j])-1:0,
|
||||||
|
(1<<logp1[j])-(sym?0:1),1<<logp1[j]);
|
||||||
|
}break;
|
||||||
|
case 2:{
|
||||||
|
sym=ec_dec_bit_logp(&dec,logp1[j]);
|
||||||
|
}break;
|
||||||
|
case 3:{
|
||||||
|
unsigned char icdf[2];
|
||||||
|
icdf[0]=1;
|
||||||
|
icdf[1]=0;
|
||||||
|
sym=ec_dec_icdf(&dec,icdf,logp1[j]);
|
||||||
|
}break;
|
||||||
|
}
|
||||||
|
if(sym!=data[j]){
|
||||||
|
fprintf(stderr,
|
||||||
|
"Decoded %i instead of %i with logp1 of %i at position %i of %i (Random seed: %u).\n",
|
||||||
|
sym,data[j],logp1[j],j,sz,seed);
|
||||||
|
fprintf(stderr,"Encoding method: %i, decoding method: %i\n",
|
||||||
|
enc_method[j],dec_method);
|
||||||
|
ret=-1;
|
||||||
|
}
|
||||||
|
if(ec_tell_frac(&dec)!=tell[j+1]){
|
||||||
|
fprintf(stderr,
|
||||||
|
"Tell mismatch between encoder and decoder at symbol %i: %i instead of %i (Random seed: %u).\n",
|
||||||
|
j+1,ec_tell_frac(&dec),tell[j+1],seed);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(enc_method);
|
||||||
|
free(tell);
|
||||||
|
free(data);
|
||||||
|
free(logp1);
|
||||||
|
}
|
||||||
|
ec_enc_init(&enc,ptr,DATA_SIZE2);
|
||||||
|
ec_enc_bit_logp(&enc,0,1);
|
||||||
|
ec_enc_bit_logp(&enc,0,1);
|
||||||
|
ec_enc_bit_logp(&enc,0,1);
|
||||||
|
ec_enc_bit_logp(&enc,0,1);
|
||||||
|
ec_enc_bit_logp(&enc,0,2);
|
||||||
|
ec_enc_patch_initial_bits(&enc,3,2);
|
||||||
|
if(enc.error){
|
||||||
|
fprintf(stderr,"patch_initial_bits failed");
|
||||||
|
ret=-1;
|
||||||
|
}
|
||||||
|
ec_enc_patch_initial_bits(&enc,0,5);
|
||||||
|
if(!enc.error){
|
||||||
|
fprintf(stderr,"patch_initial_bits didn't fail when it should have");
|
||||||
|
ret=-1;
|
||||||
|
}
|
||||||
|
ec_enc_done(&enc);
|
||||||
|
if(ec_range_bytes(&enc)!=1||ptr[0]!=192){
|
||||||
|
fprintf(stderr,"Got %d when expecting 192 for patch_initial_bits",ptr[0]);
|
||||||
|
ret=-1;
|
||||||
|
}
|
||||||
|
ec_enc_init(&enc,ptr,DATA_SIZE2);
|
||||||
|
ec_enc_bit_logp(&enc,0,1);
|
||||||
|
ec_enc_bit_logp(&enc,0,1);
|
||||||
|
ec_enc_bit_logp(&enc,1,6);
|
||||||
|
ec_enc_bit_logp(&enc,0,2);
|
||||||
|
ec_enc_patch_initial_bits(&enc,0,2);
|
||||||
|
if(enc.error){
|
||||||
|
fprintf(stderr,"patch_initial_bits failed");
|
||||||
|
ret=-1;
|
||||||
|
}
|
||||||
|
ec_enc_done(&enc);
|
||||||
|
if(ec_range_bytes(&enc)!=2||ptr[0]!=63){
|
||||||
|
fprintf(stderr,"Got %d when expecting 63 for patch_initial_bits",ptr[0]);
|
||||||
|
ret=-1;
|
||||||
|
}
|
||||||
|
ec_enc_init(&enc,ptr,2);
|
||||||
|
ec_enc_bit_logp(&enc,0,2);
|
||||||
|
for(i=0;i<48;i++){
|
||||||
|
ec_enc_bits(&enc,0,1);
|
||||||
|
}
|
||||||
|
ec_enc_done(&enc);
|
||||||
|
if(!enc.error){
|
||||||
|
fprintf(stderr,"Raw bits overfill didn't fail when it should have");
|
||||||
|
ret=-1;
|
||||||
|
}
|
||||||
|
ec_enc_init(&enc,ptr,2);
|
||||||
|
for(i=0;i<17;i++){
|
||||||
|
ec_enc_bits(&enc,0,1);
|
||||||
|
}
|
||||||
|
ec_enc_done(&enc);
|
||||||
|
if(!enc.error){
|
||||||
|
fprintf(stderr,"17 raw bits encoded in two bytes");
|
||||||
|
ret=-1;
|
||||||
|
}
|
||||||
|
free(ptr);
|
||||||
|
return ret;
|
||||||
|
}
|
92
Frameworks/Opus/Opus/opus/celt/tests/test_unit_laplace.c
Normal file
92
Frameworks/Opus/Opus/opus/celt/tests/test_unit_laplace.c
Normal file
|
@ -0,0 +1,92 @@
|
||||||
|
/* Copyright (c) 2008-2011 Xiph.Org Foundation, Mozilla Corporation
|
||||||
|
Written by Jean-Marc Valin and Timothy B. Terriberry */
|
||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "laplace.h"
|
||||||
|
#define CELT_C
|
||||||
|
#include "stack_alloc.h"
|
||||||
|
|
||||||
|
#include "entenc.c"
|
||||||
|
#include "entdec.c"
|
||||||
|
#include "entcode.c"
|
||||||
|
#include "laplace.c"
|
||||||
|
|
||||||
|
#define DATA_SIZE 40000
|
||||||
|
|
||||||
|
int ec_laplace_get_start_freq(int decay)
|
||||||
|
{
|
||||||
|
opus_uint32 ft = 32768 - LAPLACE_MINP*(2*LAPLACE_NMIN+1);
|
||||||
|
int fs = (ft*(16384-decay))/(16384+decay);
|
||||||
|
return fs+LAPLACE_MINP;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int ret = 0;
|
||||||
|
ec_enc enc;
|
||||||
|
ec_dec dec;
|
||||||
|
unsigned char *ptr;
|
||||||
|
int val[10000], decay[10000];
|
||||||
|
ALLOC_STACK;
|
||||||
|
ptr = (unsigned char *)malloc(DATA_SIZE);
|
||||||
|
ec_enc_init(&enc,ptr,DATA_SIZE);
|
||||||
|
|
||||||
|
val[0] = 3; decay[0] = 6000;
|
||||||
|
val[1] = 0; decay[1] = 5800;
|
||||||
|
val[2] = -1; decay[2] = 5600;
|
||||||
|
for (i=3;i<10000;i++)
|
||||||
|
{
|
||||||
|
val[i] = rand()%15-7;
|
||||||
|
decay[i] = rand()%11000+5000;
|
||||||
|
}
|
||||||
|
for (i=0;i<10000;i++)
|
||||||
|
ec_laplace_encode(&enc, &val[i],
|
||||||
|
ec_laplace_get_start_freq(decay[i]), decay[i]);
|
||||||
|
|
||||||
|
ec_enc_done(&enc);
|
||||||
|
|
||||||
|
ec_dec_init(&dec,ec_get_buffer(&enc),ec_range_bytes(&enc));
|
||||||
|
|
||||||
|
for (i=0;i<10000;i++)
|
||||||
|
{
|
||||||
|
int d = ec_laplace_decode(&dec,
|
||||||
|
ec_laplace_get_start_freq(decay[i]), decay[i]);
|
||||||
|
if (d != val[i])
|
||||||
|
{
|
||||||
|
fprintf (stderr, "Got %d instead of %d\n", d, val[i]);
|
||||||
|
ret = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
273
Frameworks/Opus/Opus/opus/celt/tests/test_unit_mathops.c
Normal file
273
Frameworks/Opus/Opus/opus/celt/tests/test_unit_mathops.c
Normal file
|
@ -0,0 +1,273 @@
|
||||||
|
/* Copyright (c) 2008-2011 Xiph.Org Foundation, Mozilla Corporation,
|
||||||
|
Gregory Maxwell
|
||||||
|
Written by Jean-Marc Valin, Gregory Maxwell, and Timothy B. Terriberry */
|
||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef CUSTOM_MODES
|
||||||
|
#define CUSTOM_MODES
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define CELT_C
|
||||||
|
|
||||||
|
#include "mathops.c"
|
||||||
|
#include "entenc.c"
|
||||||
|
#include "entdec.c"
|
||||||
|
#include "entcode.c"
|
||||||
|
#include "bands.c"
|
||||||
|
#include "vq.c"
|
||||||
|
#include "cwrs.c"
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
#define WORD "%d"
|
||||||
|
#else
|
||||||
|
#define WORD "%f"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
void testdiv(void)
|
||||||
|
{
|
||||||
|
opus_int32 i;
|
||||||
|
for (i=1;i<=327670;i++)
|
||||||
|
{
|
||||||
|
double prod;
|
||||||
|
opus_val32 val;
|
||||||
|
val = celt_rcp(i);
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
prod = (1./32768./65526.)*val*i;
|
||||||
|
#else
|
||||||
|
prod = val*i;
|
||||||
|
#endif
|
||||||
|
if (fabs(prod-1) > .00025)
|
||||||
|
{
|
||||||
|
fprintf (stderr, "div failed: 1/%d="WORD" (product = %f)\n", i, val, prod);
|
||||||
|
ret = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void testsqrt(void)
|
||||||
|
{
|
||||||
|
opus_int32 i;
|
||||||
|
for (i=1;i<=1000000000;i++)
|
||||||
|
{
|
||||||
|
double ratio;
|
||||||
|
opus_val16 val;
|
||||||
|
val = celt_sqrt(i);
|
||||||
|
ratio = val/sqrt(i);
|
||||||
|
if (fabs(ratio - 1) > .0005 && fabs(val-sqrt(i)) > 2)
|
||||||
|
{
|
||||||
|
fprintf (stderr, "sqrt failed: sqrt(%d)="WORD" (ratio = %f)\n", i, val, ratio);
|
||||||
|
ret = 1;
|
||||||
|
}
|
||||||
|
i+= i>>10;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void testbitexactcos(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
opus_int32 min_d,max_d,last,chk;
|
||||||
|
chk=max_d=0;
|
||||||
|
last=min_d=32767;
|
||||||
|
for(i=64;i<=16320;i++)
|
||||||
|
{
|
||||||
|
opus_int32 d;
|
||||||
|
opus_int32 q=bitexact_cos(i);
|
||||||
|
chk ^= q*i;
|
||||||
|
d = last - q;
|
||||||
|
if (d>max_d)max_d=d;
|
||||||
|
if (d<min_d)min_d=d;
|
||||||
|
last = q;
|
||||||
|
}
|
||||||
|
if ((chk!=89408644)||(max_d!=5)||(min_d!=0)||(bitexact_cos(64)!=32767)||
|
||||||
|
(bitexact_cos(16320)!=200)||(bitexact_cos(8192)!=23171))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "bitexact_cos failed\n");
|
||||||
|
ret = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void testbitexactlog2tan(void)
|
||||||
|
{
|
||||||
|
int i,fail;
|
||||||
|
opus_int32 min_d,max_d,last,chk;
|
||||||
|
fail=chk=max_d=0;
|
||||||
|
last=min_d=15059;
|
||||||
|
for(i=64;i<8193;i++)
|
||||||
|
{
|
||||||
|
opus_int32 d;
|
||||||
|
opus_int32 mid=bitexact_cos(i);
|
||||||
|
opus_int32 side=bitexact_cos(16384-i);
|
||||||
|
opus_int32 q=bitexact_log2tan(mid,side);
|
||||||
|
chk ^= q*i;
|
||||||
|
d = last - q;
|
||||||
|
if (q!=-1*bitexact_log2tan(side,mid))
|
||||||
|
fail = 1;
|
||||||
|
if (d>max_d)max_d=d;
|
||||||
|
if (d<min_d)min_d=d;
|
||||||
|
last = q;
|
||||||
|
}
|
||||||
|
if ((chk!=15821257)||(max_d!=61)||(min_d!=-2)||fail||
|
||||||
|
(bitexact_log2tan(32767,200)!=15059)||(bitexact_log2tan(30274,12540)!=2611)||
|
||||||
|
(bitexact_log2tan(23171,23171)!=0))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "bitexact_log2tan failed\n");
|
||||||
|
ret = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef FIXED_POINT
|
||||||
|
void testlog2(void)
|
||||||
|
{
|
||||||
|
float x;
|
||||||
|
for (x=0.001;x<1677700.0;x+=(x/8.0))
|
||||||
|
{
|
||||||
|
float error = fabs((1.442695040888963387*log(x))-celt_log2(x));
|
||||||
|
if (error>0.0009)
|
||||||
|
{
|
||||||
|
fprintf (stderr, "celt_log2 failed: fabs((1.442695040888963387*log(x))-celt_log2(x))>0.001 (x = %f, error = %f)\n", x,error);
|
||||||
|
ret = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void testexp2(void)
|
||||||
|
{
|
||||||
|
float x;
|
||||||
|
for (x=-11.0;x<24.0;x+=0.0007)
|
||||||
|
{
|
||||||
|
float error = fabs(x-(1.442695040888963387*log(celt_exp2(x))));
|
||||||
|
if (error>0.0002)
|
||||||
|
{
|
||||||
|
fprintf (stderr, "celt_exp2 failed: fabs(x-(1.442695040888963387*log(celt_exp2(x))))>0.0005 (x = %f, error = %f)\n", x,error);
|
||||||
|
ret = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void testexp2log2(void)
|
||||||
|
{
|
||||||
|
float x;
|
||||||
|
for (x=-11.0;x<24.0;x+=0.0007)
|
||||||
|
{
|
||||||
|
float error = fabs(x-(celt_log2(celt_exp2(x))));
|
||||||
|
if (error>0.001)
|
||||||
|
{
|
||||||
|
fprintf (stderr, "celt_log2/celt_exp2 failed: fabs(x-(celt_log2(celt_exp2(x))))>0.001 (x = %f, error = %f)\n", x,error);
|
||||||
|
ret = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
void testlog2(void)
|
||||||
|
{
|
||||||
|
opus_val32 x;
|
||||||
|
for (x=8;x<1073741824;x+=(x>>3))
|
||||||
|
{
|
||||||
|
float error = fabs((1.442695040888963387*log(x/16384.0))-celt_log2(x)/1024.0);
|
||||||
|
if (error>0.003)
|
||||||
|
{
|
||||||
|
fprintf (stderr, "celt_log2 failed: x = %ld, error = %f\n", (long)x,error);
|
||||||
|
ret = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void testexp2(void)
|
||||||
|
{
|
||||||
|
opus_val16 x;
|
||||||
|
for (x=-32768;x<15360;x++)
|
||||||
|
{
|
||||||
|
float error1 = fabs(x/1024.0-(1.442695040888963387*log(celt_exp2(x)/65536.0)));
|
||||||
|
float error2 = fabs(exp(0.6931471805599453094*x/1024.0)-celt_exp2(x)/65536.0);
|
||||||
|
if (error1>0.0002&&error2>0.00004)
|
||||||
|
{
|
||||||
|
fprintf (stderr, "celt_exp2 failed: x = "WORD", error1 = %f, error2 = %f\n", x,error1,error2);
|
||||||
|
ret = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void testexp2log2(void)
|
||||||
|
{
|
||||||
|
opus_val32 x;
|
||||||
|
for (x=8;x<65536;x+=(x>>3))
|
||||||
|
{
|
||||||
|
float error = fabs(x-0.25*celt_exp2(celt_log2(x)))/16384;
|
||||||
|
if (error>0.004)
|
||||||
|
{
|
||||||
|
fprintf (stderr, "celt_log2/celt_exp2 failed: fabs(x-(celt_exp2(celt_log2(x))))>0.001 (x = %ld, error = %f)\n", (long)x,error);
|
||||||
|
ret = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void testilog2(void)
|
||||||
|
{
|
||||||
|
opus_val32 x;
|
||||||
|
for (x=1;x<=268435455;x+=127)
|
||||||
|
{
|
||||||
|
opus_val32 lg;
|
||||||
|
opus_val32 y;
|
||||||
|
|
||||||
|
lg = celt_ilog2(x);
|
||||||
|
if (lg<0 || lg>=31)
|
||||||
|
{
|
||||||
|
printf("celt_ilog2 failed: 0<=celt_ilog2(x)<31 (x = %d, celt_ilog2(x) = %d)\n",x,lg);
|
||||||
|
ret = 1;
|
||||||
|
}
|
||||||
|
y = 1<<lg;
|
||||||
|
|
||||||
|
if (x<y || (x>>1)>=y)
|
||||||
|
{
|
||||||
|
printf("celt_ilog2 failed: 2**celt_ilog2(x)<=x<2**(celt_ilog2(x)+1) (x = %d, 2**celt_ilog2(x) = %d)\n",x,y);
|
||||||
|
ret = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
testbitexactcos();
|
||||||
|
testbitexactlog2tan();
|
||||||
|
testdiv();
|
||||||
|
testsqrt();
|
||||||
|
testlog2();
|
||||||
|
testexp2();
|
||||||
|
testexp2log2();
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
testilog2();
|
||||||
|
#endif
|
||||||
|
return ret;
|
||||||
|
}
|
195
Frameworks/Opus/Opus/opus/celt/tests/test_unit_mdct.c
Normal file
195
Frameworks/Opus/Opus/opus/celt/tests/test_unit_mdct.c
Normal file
|
@ -0,0 +1,195 @@
|
||||||
|
/* Copyright (c) 2008-2011 Xiph.Org Foundation
|
||||||
|
Written by Jean-Marc Valin */
|
||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define SKIP_CONFIG_H
|
||||||
|
|
||||||
|
#ifndef CUSTOM_MODES
|
||||||
|
#define CUSTOM_MODES
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#define CELT_C
|
||||||
|
#include "mdct.h"
|
||||||
|
#include "stack_alloc.h"
|
||||||
|
|
||||||
|
#include "kiss_fft.c"
|
||||||
|
#include "mdct.c"
|
||||||
|
#include "mathops.c"
|
||||||
|
#include "entcode.c"
|
||||||
|
|
||||||
|
#ifndef M_PI
|
||||||
|
#define M_PI 3.141592653
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int ret = 0;
|
||||||
|
void check(kiss_fft_scalar * in,kiss_fft_scalar * out,int nfft,int isinverse)
|
||||||
|
{
|
||||||
|
int bin,k;
|
||||||
|
double errpow=0,sigpow=0;
|
||||||
|
double snr;
|
||||||
|
for (bin=0;bin<nfft/2;++bin) {
|
||||||
|
double ansr = 0;
|
||||||
|
double difr;
|
||||||
|
|
||||||
|
for (k=0;k<nfft;++k) {
|
||||||
|
double phase = 2*M_PI*(k+.5+.25*nfft)*(bin+.5)/nfft;
|
||||||
|
double re = cos(phase);
|
||||||
|
|
||||||
|
re /= nfft/4;
|
||||||
|
|
||||||
|
ansr += in[k] * re;
|
||||||
|
}
|
||||||
|
/*printf ("%f %f\n", ansr, out[bin]);*/
|
||||||
|
difr = ansr - out[bin];
|
||||||
|
errpow += difr*difr;
|
||||||
|
sigpow += ansr*ansr;
|
||||||
|
}
|
||||||
|
snr = 10*log10(sigpow/errpow);
|
||||||
|
printf("nfft=%d inverse=%d,snr = %f\n",nfft,isinverse,snr );
|
||||||
|
if (snr<60) {
|
||||||
|
printf( "** poor snr: %f **\n", snr);
|
||||||
|
ret = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void check_inv(kiss_fft_scalar * in,kiss_fft_scalar * out,int nfft,int isinverse)
|
||||||
|
{
|
||||||
|
int bin,k;
|
||||||
|
double errpow=0,sigpow=0;
|
||||||
|
double snr;
|
||||||
|
for (bin=0;bin<nfft;++bin) {
|
||||||
|
double ansr = 0;
|
||||||
|
double difr;
|
||||||
|
|
||||||
|
for (k=0;k<nfft/2;++k) {
|
||||||
|
double phase = 2*M_PI*(bin+.5+.25*nfft)*(k+.5)/nfft;
|
||||||
|
double re = cos(phase);
|
||||||
|
|
||||||
|
/*re *= 2;*/
|
||||||
|
|
||||||
|
ansr += in[k] * re;
|
||||||
|
}
|
||||||
|
/*printf ("%f %f\n", ansr, out[bin]);*/
|
||||||
|
difr = ansr - out[bin];
|
||||||
|
errpow += difr*difr;
|
||||||
|
sigpow += ansr*ansr;
|
||||||
|
}
|
||||||
|
snr = 10*log10(sigpow/errpow);
|
||||||
|
printf("nfft=%d inverse=%d,snr = %f\n",nfft,isinverse,snr );
|
||||||
|
if (snr<60) {
|
||||||
|
printf( "** poor snr: %f **\n", snr);
|
||||||
|
ret = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void test1d(int nfft,int isinverse)
|
||||||
|
{
|
||||||
|
mdct_lookup cfg;
|
||||||
|
size_t buflen = sizeof(kiss_fft_scalar)*nfft;
|
||||||
|
|
||||||
|
kiss_fft_scalar * in = (kiss_fft_scalar*)malloc(buflen);
|
||||||
|
kiss_fft_scalar * in_copy = (kiss_fft_scalar*)malloc(buflen);
|
||||||
|
kiss_fft_scalar * out= (kiss_fft_scalar*)malloc(buflen);
|
||||||
|
opus_val16 * window= (opus_val16*)malloc(sizeof(opus_val16)*nfft/2);
|
||||||
|
int k;
|
||||||
|
|
||||||
|
clt_mdct_init(&cfg, nfft, 0);
|
||||||
|
for (k=0;k<nfft;++k) {
|
||||||
|
in[k] = (rand() % 32768) - 16384;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (k=0;k<nfft/2;++k) {
|
||||||
|
window[k] = Q15ONE;
|
||||||
|
}
|
||||||
|
for (k=0;k<nfft;++k) {
|
||||||
|
in[k] *= 32768;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isinverse)
|
||||||
|
{
|
||||||
|
for (k=0;k<nfft;++k) {
|
||||||
|
in[k] /= nfft;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (k=0;k<nfft;++k)
|
||||||
|
in_copy[k] = in[k];
|
||||||
|
/*for (k=0;k<nfft;++k) printf("%d %d ", in[k].r, in[k].i);printf("\n");*/
|
||||||
|
|
||||||
|
if (isinverse)
|
||||||
|
{
|
||||||
|
for (k=0;k<nfft;++k)
|
||||||
|
out[k] = 0;
|
||||||
|
clt_mdct_backward(&cfg,in,out, window, nfft/2, 0, 1);
|
||||||
|
check_inv(in,out,nfft,isinverse);
|
||||||
|
} else {
|
||||||
|
clt_mdct_forward(&cfg,in,out,window, nfft/2, 0, 1);
|
||||||
|
check(in_copy,out,nfft,isinverse);
|
||||||
|
}
|
||||||
|
/*for (k=0;k<nfft;++k) printf("%d %d ", out[k].r, out[k].i);printf("\n");*/
|
||||||
|
|
||||||
|
|
||||||
|
free(in);
|
||||||
|
free(out);
|
||||||
|
clt_mdct_clear(&cfg);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc,char ** argv)
|
||||||
|
{
|
||||||
|
ALLOC_STACK;
|
||||||
|
if (argc>1) {
|
||||||
|
int k;
|
||||||
|
for (k=1;k<argc;++k) {
|
||||||
|
test1d(atoi(argv[k]),0);
|
||||||
|
test1d(atoi(argv[k]),1);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
test1d(32,0);
|
||||||
|
test1d(32,1);
|
||||||
|
test1d(256,0);
|
||||||
|
test1d(256,1);
|
||||||
|
test1d(512,0);
|
||||||
|
test1d(512,1);
|
||||||
|
#ifndef RADIX_TWO_ONLY
|
||||||
|
test1d(40,0);
|
||||||
|
test1d(40,1);
|
||||||
|
test1d(120,0);
|
||||||
|
test1d(120,1);
|
||||||
|
test1d(240,0);
|
||||||
|
test1d(240,1);
|
||||||
|
test1d(480,0);
|
||||||
|
test1d(480,1);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
90
Frameworks/Opus/Opus/opus/celt/tests/test_unit_rotation.c
Normal file
90
Frameworks/Opus/Opus/opus/celt/tests/test_unit_rotation.c
Normal file
|
@ -0,0 +1,90 @@
|
||||||
|
/* Copyright (c) 2008-2011 Xiph.Org Foundation
|
||||||
|
Written by Jean-Marc Valin */
|
||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef CUSTOM_MODES
|
||||||
|
#define CUSTOM_MODES
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define CELT_C
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "vq.c"
|
||||||
|
#include "cwrs.c"
|
||||||
|
#include "entcode.c"
|
||||||
|
#include "entenc.c"
|
||||||
|
#include "entdec.c"
|
||||||
|
#include "mathops.c"
|
||||||
|
#include "bands.h"
|
||||||
|
#include <math.h>
|
||||||
|
#define MAX_SIZE 100
|
||||||
|
|
||||||
|
int ret=0;
|
||||||
|
void test_rotation(int N, int K)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
double err = 0, ener = 0, snr, snr0;
|
||||||
|
opus_val16 x0[MAX_SIZE];
|
||||||
|
opus_val16 x1[MAX_SIZE];
|
||||||
|
for (i=0;i<N;i++)
|
||||||
|
x1[i] = x0[i] = rand()%32767-16384;
|
||||||
|
exp_rotation(x1, N, 1, 1, K, SPREAD_NORMAL);
|
||||||
|
for (i=0;i<N;i++)
|
||||||
|
{
|
||||||
|
err += (x0[i]-(double)x1[i])*(x0[i]-(double)x1[i]);
|
||||||
|
ener += x0[i]*(double)x0[i];
|
||||||
|
}
|
||||||
|
snr0 = 20*log10(ener/err);
|
||||||
|
err = ener = 0;
|
||||||
|
exp_rotation(x1, N, -1, 1, K, SPREAD_NORMAL);
|
||||||
|
for (i=0;i<N;i++)
|
||||||
|
{
|
||||||
|
err += (x0[i]-(double)x1[i])*(x0[i]-(double)x1[i]);
|
||||||
|
ener += x0[i]*(double)x0[i];
|
||||||
|
}
|
||||||
|
snr = 20*log10(ener/err);
|
||||||
|
printf ("SNR for size %d (%d pulses) is %f (was %f without inverse)\n", N, K, snr, snr0);
|
||||||
|
if (snr < 60 || snr0 > 20)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "FAIL!\n");
|
||||||
|
ret = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
ALLOC_STACK;
|
||||||
|
test_rotation(15, 3);
|
||||||
|
test_rotation(23, 5);
|
||||||
|
test_rotation(50, 3);
|
||||||
|
test_rotation(80, 1);
|
||||||
|
return ret;
|
||||||
|
}
|
50
Frameworks/Opus/Opus/opus/celt/tests/test_unit_types.c
Normal file
50
Frameworks/Opus/Opus/opus/celt/tests/test_unit_types.c
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
/* Copyright (c) 2008-2011 Xiph.Org Foundation
|
||||||
|
Written by Jean-Marc Valin */
|
||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "opus_types.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
opus_int16 i = 1;
|
||||||
|
i <<= 14;
|
||||||
|
if (i>>14 != 1)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "opus_int16 isn't 16 bits\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (sizeof(opus_int16)*2 != sizeof(opus_int32))
|
||||||
|
{
|
||||||
|
fprintf(stderr, "16*2 != 32\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
415
Frameworks/Opus/Opus/opus/celt/vq.c
Normal file
415
Frameworks/Opus/Opus/opus/celt/vq.c
Normal file
|
@ -0,0 +1,415 @@
|
||||||
|
/* Copyright (c) 2007-2008 CSIRO
|
||||||
|
Copyright (c) 2007-2009 Xiph.Org Foundation
|
||||||
|
Written by Jean-Marc Valin */
|
||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "mathops.h"
|
||||||
|
#include "cwrs.h"
|
||||||
|
#include "vq.h"
|
||||||
|
#include "arch.h"
|
||||||
|
#include "os_support.h"
|
||||||
|
#include "bands.h"
|
||||||
|
#include "rate.h"
|
||||||
|
|
||||||
|
static void exp_rotation1(celt_norm *X, int len, int stride, opus_val16 c, opus_val16 s)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
celt_norm *Xptr;
|
||||||
|
Xptr = X;
|
||||||
|
for (i=0;i<len-stride;i++)
|
||||||
|
{
|
||||||
|
celt_norm x1, x2;
|
||||||
|
x1 = Xptr[0];
|
||||||
|
x2 = Xptr[stride];
|
||||||
|
Xptr[stride] = EXTRACT16(SHR32(MULT16_16(c,x2) + MULT16_16(s,x1), 15));
|
||||||
|
*Xptr++ = EXTRACT16(SHR32(MULT16_16(c,x1) - MULT16_16(s,x2), 15));
|
||||||
|
}
|
||||||
|
Xptr = &X[len-2*stride-1];
|
||||||
|
for (i=len-2*stride-1;i>=0;i--)
|
||||||
|
{
|
||||||
|
celt_norm x1, x2;
|
||||||
|
x1 = Xptr[0];
|
||||||
|
x2 = Xptr[stride];
|
||||||
|
Xptr[stride] = EXTRACT16(SHR32(MULT16_16(c,x2) + MULT16_16(s,x1), 15));
|
||||||
|
*Xptr-- = EXTRACT16(SHR32(MULT16_16(c,x1) - MULT16_16(s,x2), 15));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void exp_rotation(celt_norm *X, int len, int dir, int stride, int K, int spread)
|
||||||
|
{
|
||||||
|
static const int SPREAD_FACTOR[3]={15,10,5};
|
||||||
|
int i;
|
||||||
|
opus_val16 c, s;
|
||||||
|
opus_val16 gain, theta;
|
||||||
|
int stride2=0;
|
||||||
|
int factor;
|
||||||
|
|
||||||
|
if (2*K>=len || spread==SPREAD_NONE)
|
||||||
|
return;
|
||||||
|
factor = SPREAD_FACTOR[spread-1];
|
||||||
|
|
||||||
|
gain = celt_div((opus_val32)MULT16_16(Q15_ONE,len),(opus_val32)(len+factor*K));
|
||||||
|
theta = HALF16(MULT16_16_Q15(gain,gain));
|
||||||
|
|
||||||
|
c = celt_cos_norm(EXTEND32(theta));
|
||||||
|
s = celt_cos_norm(EXTEND32(SUB16(Q15ONE,theta))); /* sin(theta) */
|
||||||
|
|
||||||
|
if (len>=8*stride)
|
||||||
|
{
|
||||||
|
stride2 = 1;
|
||||||
|
/* This is just a simple (equivalent) way of computing sqrt(len/stride) with rounding.
|
||||||
|
It's basically incrementing long as (stride2+0.5)^2 < len/stride. */
|
||||||
|
while ((stride2*stride2+stride2)*stride + (stride>>2) < len)
|
||||||
|
stride2++;
|
||||||
|
}
|
||||||
|
/*NOTE: As a minor optimization, we could be passing around log2(B), not B, for both this and for
|
||||||
|
extract_collapse_mask().*/
|
||||||
|
len /= stride;
|
||||||
|
for (i=0;i<stride;i++)
|
||||||
|
{
|
||||||
|
if (dir < 0)
|
||||||
|
{
|
||||||
|
if (stride2)
|
||||||
|
exp_rotation1(X+i*len, len, stride2, s, c);
|
||||||
|
exp_rotation1(X+i*len, len, 1, c, s);
|
||||||
|
} else {
|
||||||
|
exp_rotation1(X+i*len, len, 1, c, -s);
|
||||||
|
if (stride2)
|
||||||
|
exp_rotation1(X+i*len, len, stride2, s, -c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Takes the pitch vector and the decoded residual vector, computes the gain
|
||||||
|
that will give ||p+g*y||=1 and mixes the residual with the pitch. */
|
||||||
|
static void normalise_residual(int * OPUS_RESTRICT iy, celt_norm * OPUS_RESTRICT X,
|
||||||
|
int N, opus_val32 Ryy, opus_val16 gain)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
int k;
|
||||||
|
#endif
|
||||||
|
opus_val32 t;
|
||||||
|
opus_val16 g;
|
||||||
|
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
k = celt_ilog2(Ryy)>>1;
|
||||||
|
#endif
|
||||||
|
t = VSHR32(Ryy, 2*(k-7));
|
||||||
|
g = MULT16_16_P15(celt_rsqrt_norm(t),gain);
|
||||||
|
|
||||||
|
i=0;
|
||||||
|
do
|
||||||
|
X[i] = EXTRACT16(PSHR32(MULT16_16(g, iy[i]), k+1));
|
||||||
|
while (++i < N);
|
||||||
|
}
|
||||||
|
|
||||||
|
static unsigned extract_collapse_mask(int *iy, int N, int B)
|
||||||
|
{
|
||||||
|
unsigned collapse_mask;
|
||||||
|
int N0;
|
||||||
|
int i;
|
||||||
|
if (B<=1)
|
||||||
|
return 1;
|
||||||
|
/*NOTE: As a minor optimization, we could be passing around log2(B), not B, for both this and for
|
||||||
|
exp_rotation().*/
|
||||||
|
N0 = N/B;
|
||||||
|
collapse_mask = 0;
|
||||||
|
i=0; do {
|
||||||
|
int j;
|
||||||
|
j=0; do {
|
||||||
|
collapse_mask |= (iy[i*N0+j]!=0)<<i;
|
||||||
|
} while (++j<N0);
|
||||||
|
} while (++i<B);
|
||||||
|
return collapse_mask;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned alg_quant(celt_norm *X, int N, int K, int spread, int B, ec_enc *enc
|
||||||
|
#ifdef RESYNTH
|
||||||
|
, opus_val16 gain
|
||||||
|
#endif
|
||||||
|
)
|
||||||
|
{
|
||||||
|
VARDECL(celt_norm, y);
|
||||||
|
VARDECL(int, iy);
|
||||||
|
VARDECL(opus_val16, signx);
|
||||||
|
int i, j;
|
||||||
|
opus_val16 s;
|
||||||
|
int pulsesLeft;
|
||||||
|
opus_val32 sum;
|
||||||
|
opus_val32 xy;
|
||||||
|
opus_val16 yy;
|
||||||
|
unsigned collapse_mask;
|
||||||
|
SAVE_STACK;
|
||||||
|
|
||||||
|
celt_assert2(K>0, "alg_quant() needs at least one pulse");
|
||||||
|
celt_assert2(N>1, "alg_quant() needs at least two dimensions");
|
||||||
|
|
||||||
|
ALLOC(y, N, celt_norm);
|
||||||
|
ALLOC(iy, N, int);
|
||||||
|
ALLOC(signx, N, opus_val16);
|
||||||
|
|
||||||
|
exp_rotation(X, N, 1, B, K, spread);
|
||||||
|
|
||||||
|
/* Get rid of the sign */
|
||||||
|
sum = 0;
|
||||||
|
j=0; do {
|
||||||
|
if (X[j]>0)
|
||||||
|
signx[j]=1;
|
||||||
|
else {
|
||||||
|
signx[j]=-1;
|
||||||
|
X[j]=-X[j];
|
||||||
|
}
|
||||||
|
iy[j] = 0;
|
||||||
|
y[j] = 0;
|
||||||
|
} while (++j<N);
|
||||||
|
|
||||||
|
xy = yy = 0;
|
||||||
|
|
||||||
|
pulsesLeft = K;
|
||||||
|
|
||||||
|
/* Do a pre-search by projecting on the pyramid */
|
||||||
|
if (K > (N>>1))
|
||||||
|
{
|
||||||
|
opus_val16 rcp;
|
||||||
|
j=0; do {
|
||||||
|
sum += X[j];
|
||||||
|
} while (++j<N);
|
||||||
|
|
||||||
|
/* If X is too small, just replace it with a pulse at 0 */
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
if (sum <= K)
|
||||||
|
#else
|
||||||
|
/* Prevents infinities and NaNs from causing too many pulses
|
||||||
|
to be allocated. 64 is an approximation of infinity here. */
|
||||||
|
if (!(sum > EPSILON && sum < 64))
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
X[0] = QCONST16(1.f,14);
|
||||||
|
j=1; do
|
||||||
|
X[j]=0;
|
||||||
|
while (++j<N);
|
||||||
|
sum = QCONST16(1.f,14);
|
||||||
|
}
|
||||||
|
rcp = EXTRACT16(MULT16_32_Q16(K-1, celt_rcp(sum)));
|
||||||
|
j=0; do {
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
/* It's really important to round *towards zero* here */
|
||||||
|
iy[j] = MULT16_16_Q15(X[j],rcp);
|
||||||
|
#else
|
||||||
|
iy[j] = (int)floor(rcp*X[j]);
|
||||||
|
#endif
|
||||||
|
y[j] = (celt_norm)iy[j];
|
||||||
|
yy = MAC16_16(yy, y[j],y[j]);
|
||||||
|
xy = MAC16_16(xy, X[j],y[j]);
|
||||||
|
y[j] *= 2;
|
||||||
|
pulsesLeft -= iy[j];
|
||||||
|
} while (++j<N);
|
||||||
|
}
|
||||||
|
celt_assert2(pulsesLeft>=1, "Allocated too many pulses in the quick pass");
|
||||||
|
|
||||||
|
/* This should never happen, but just in case it does (e.g. on silence)
|
||||||
|
we fill the first bin with pulses. */
|
||||||
|
#ifdef FIXED_POINT_DEBUG
|
||||||
|
celt_assert2(pulsesLeft<=N+3, "Not enough pulses in the quick pass");
|
||||||
|
#endif
|
||||||
|
if (pulsesLeft > N+3)
|
||||||
|
{
|
||||||
|
opus_val16 tmp = (opus_val16)pulsesLeft;
|
||||||
|
yy = MAC16_16(yy, tmp, tmp);
|
||||||
|
yy = MAC16_16(yy, tmp, y[0]);
|
||||||
|
iy[0] += pulsesLeft;
|
||||||
|
pulsesLeft=0;
|
||||||
|
}
|
||||||
|
|
||||||
|
s = 1;
|
||||||
|
for (i=0;i<pulsesLeft;i++)
|
||||||
|
{
|
||||||
|
int best_id;
|
||||||
|
opus_val32 best_num = -VERY_LARGE16;
|
||||||
|
opus_val16 best_den = 0;
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
int rshift;
|
||||||
|
#endif
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
rshift = 1+celt_ilog2(K-pulsesLeft+i+1);
|
||||||
|
#endif
|
||||||
|
best_id = 0;
|
||||||
|
/* The squared magnitude term gets added anyway, so we might as well
|
||||||
|
add it outside the loop */
|
||||||
|
yy = ADD32(yy, 1);
|
||||||
|
j=0;
|
||||||
|
do {
|
||||||
|
opus_val16 Rxy, Ryy;
|
||||||
|
/* Temporary sums of the new pulse(s) */
|
||||||
|
Rxy = EXTRACT16(SHR32(ADD32(xy, EXTEND32(X[j])),rshift));
|
||||||
|
/* We're multiplying y[j] by two so we don't have to do it here */
|
||||||
|
Ryy = ADD16(yy, y[j]);
|
||||||
|
|
||||||
|
/* Approximate score: we maximise Rxy/sqrt(Ryy) (we're guaranteed that
|
||||||
|
Rxy is positive because the sign is pre-computed) */
|
||||||
|
Rxy = MULT16_16_Q15(Rxy,Rxy);
|
||||||
|
/* The idea is to check for num/den >= best_num/best_den, but that way
|
||||||
|
we can do it without any division */
|
||||||
|
/* OPT: Make sure to use conditional moves here */
|
||||||
|
if (MULT16_16(best_den, Rxy) > MULT16_16(Ryy, best_num))
|
||||||
|
{
|
||||||
|
best_den = Ryy;
|
||||||
|
best_num = Rxy;
|
||||||
|
best_id = j;
|
||||||
|
}
|
||||||
|
} while (++j<N);
|
||||||
|
|
||||||
|
/* Updating the sums of the new pulse(s) */
|
||||||
|
xy = ADD32(xy, EXTEND32(X[best_id]));
|
||||||
|
/* We're multiplying y[j] by two so we don't have to do it here */
|
||||||
|
yy = ADD16(yy, y[best_id]);
|
||||||
|
|
||||||
|
/* Only now that we've made the final choice, update y/iy */
|
||||||
|
/* Multiplying y[j] by 2 so we don't have to do it everywhere else */
|
||||||
|
y[best_id] += 2*s;
|
||||||
|
iy[best_id]++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Put the original sign back */
|
||||||
|
j=0;
|
||||||
|
do {
|
||||||
|
X[j] = MULT16_16(signx[j],X[j]);
|
||||||
|
if (signx[j] < 0)
|
||||||
|
iy[j] = -iy[j];
|
||||||
|
} while (++j<N);
|
||||||
|
encode_pulses(iy, N, K, enc);
|
||||||
|
|
||||||
|
#ifdef RESYNTH
|
||||||
|
normalise_residual(iy, X, N, yy, gain);
|
||||||
|
exp_rotation(X, N, -1, B, K, spread);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
collapse_mask = extract_collapse_mask(iy, N, B);
|
||||||
|
RESTORE_STACK;
|
||||||
|
return collapse_mask;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Decode pulse vector and combine the result with the pitch vector to produce
|
||||||
|
the final normalised signal in the current band. */
|
||||||
|
unsigned alg_unquant(celt_norm *X, int N, int K, int spread, int B,
|
||||||
|
ec_dec *dec, opus_val16 gain)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
opus_val32 Ryy;
|
||||||
|
unsigned collapse_mask;
|
||||||
|
VARDECL(int, iy);
|
||||||
|
SAVE_STACK;
|
||||||
|
|
||||||
|
celt_assert2(K>0, "alg_unquant() needs at least one pulse");
|
||||||
|
celt_assert2(N>1, "alg_unquant() needs at least two dimensions");
|
||||||
|
ALLOC(iy, N, int);
|
||||||
|
decode_pulses(iy, N, K, dec);
|
||||||
|
Ryy = 0;
|
||||||
|
i=0;
|
||||||
|
do {
|
||||||
|
Ryy = MAC16_16(Ryy, iy[i], iy[i]);
|
||||||
|
} while (++i < N);
|
||||||
|
normalise_residual(iy, X, N, Ryy, gain);
|
||||||
|
exp_rotation(X, N, -1, B, K, spread);
|
||||||
|
collapse_mask = extract_collapse_mask(iy, N, B);
|
||||||
|
RESTORE_STACK;
|
||||||
|
return collapse_mask;
|
||||||
|
}
|
||||||
|
|
||||||
|
void renormalise_vector(celt_norm *X, int N, opus_val16 gain)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
int k;
|
||||||
|
#endif
|
||||||
|
opus_val32 E = EPSILON;
|
||||||
|
opus_val16 g;
|
||||||
|
opus_val32 t;
|
||||||
|
celt_norm *xptr = X;
|
||||||
|
for (i=0;i<N;i++)
|
||||||
|
{
|
||||||
|
E = MAC16_16(E, *xptr, *xptr);
|
||||||
|
xptr++;
|
||||||
|
}
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
k = celt_ilog2(E)>>1;
|
||||||
|
#endif
|
||||||
|
t = VSHR32(E, 2*(k-7));
|
||||||
|
g = MULT16_16_P15(celt_rsqrt_norm(t),gain);
|
||||||
|
|
||||||
|
xptr = X;
|
||||||
|
for (i=0;i<N;i++)
|
||||||
|
{
|
||||||
|
*xptr = EXTRACT16(PSHR32(MULT16_16(g, *xptr), k+1));
|
||||||
|
xptr++;
|
||||||
|
}
|
||||||
|
/*return celt_sqrt(E);*/
|
||||||
|
}
|
||||||
|
|
||||||
|
int stereo_itheta(celt_norm *X, celt_norm *Y, int stereo, int N)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int itheta;
|
||||||
|
opus_val16 mid, side;
|
||||||
|
opus_val32 Emid, Eside;
|
||||||
|
|
||||||
|
Emid = Eside = EPSILON;
|
||||||
|
if (stereo)
|
||||||
|
{
|
||||||
|
for (i=0;i<N;i++)
|
||||||
|
{
|
||||||
|
celt_norm m, s;
|
||||||
|
m = ADD16(SHR16(X[i],1),SHR16(Y[i],1));
|
||||||
|
s = SUB16(SHR16(X[i],1),SHR16(Y[i],1));
|
||||||
|
Emid = MAC16_16(Emid, m, m);
|
||||||
|
Eside = MAC16_16(Eside, s, s);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (i=0;i<N;i++)
|
||||||
|
{
|
||||||
|
celt_norm m, s;
|
||||||
|
m = X[i];
|
||||||
|
s = Y[i];
|
||||||
|
Emid = MAC16_16(Emid, m, m);
|
||||||
|
Eside = MAC16_16(Eside, s, s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mid = celt_sqrt(Emid);
|
||||||
|
side = celt_sqrt(Eside);
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
/* 0.63662 = 2/pi */
|
||||||
|
itheta = MULT16_16_Q15(QCONST16(0.63662f,15),celt_atan2p(side, mid));
|
||||||
|
#else
|
||||||
|
itheta = (int)floor(.5f+16384*0.63662f*atan2(side,mid));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return itheta;
|
||||||
|
}
|
73
Frameworks/Opus/Opus/opus/celt/vq.h
Normal file
73
Frameworks/Opus/Opus/opus/celt/vq.h
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
/* Copyright (c) 2007-2008 CSIRO
|
||||||
|
Copyright (c) 2007-2009 Xiph.Org Foundation
|
||||||
|
Written by Jean-Marc Valin */
|
||||||
|
/**
|
||||||
|
@file vq.h
|
||||||
|
@brief Vector quantisation of the residual
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef VQ_H
|
||||||
|
#define VQ_H
|
||||||
|
|
||||||
|
#include "entenc.h"
|
||||||
|
#include "entdec.h"
|
||||||
|
#include "modes.h"
|
||||||
|
|
||||||
|
/** Algebraic pulse-vector quantiser. The signal x is replaced by the sum of
|
||||||
|
* the pitch and a combination of pulses such that its norm is still equal
|
||||||
|
* to 1. This is the function that will typically require the most CPU.
|
||||||
|
* @param x Residual signal to quantise/encode (returns quantised version)
|
||||||
|
* @param W Perceptual weight to use when optimising (currently unused)
|
||||||
|
* @param N Number of samples to encode
|
||||||
|
* @param K Number of pulses to use
|
||||||
|
* @param p Pitch vector (it is assumed that p+x is a unit vector)
|
||||||
|
* @param enc Entropy encoder state
|
||||||
|
* @ret A mask indicating which blocks in the band received pulses
|
||||||
|
*/
|
||||||
|
unsigned alg_quant(celt_norm *X, int N, int K, int spread, int B,
|
||||||
|
ec_enc *enc
|
||||||
|
#ifdef RESYNTH
|
||||||
|
, opus_val16 gain
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
|
||||||
|
/** Algebraic pulse decoder
|
||||||
|
* @param x Decoded normalised spectrum (returned)
|
||||||
|
* @param N Number of samples to decode
|
||||||
|
* @param K Number of pulses to use
|
||||||
|
* @param p Pitch vector (automatically added to x)
|
||||||
|
* @param dec Entropy decoder state
|
||||||
|
* @ret A mask indicating which blocks in the band received pulses
|
||||||
|
*/
|
||||||
|
unsigned alg_unquant(celt_norm *X, int N, int K, int spread, int B,
|
||||||
|
ec_dec *dec, opus_val16 gain);
|
||||||
|
|
||||||
|
void renormalise_vector(celt_norm *X, int N, opus_val16 gain);
|
||||||
|
|
||||||
|
int stereo_itheta(celt_norm *X, celt_norm *Y, int stereo, int N);
|
||||||
|
|
||||||
|
#endif /* VQ_H */
|
31
Frameworks/Opus/Opus/opus/celt_headers.mk
Normal file
31
Frameworks/Opus/Opus/opus/celt_headers.mk
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
CELT_HEAD = \
|
||||||
|
celt/arch.h \
|
||||||
|
celt/bands.h \
|
||||||
|
celt/celt.h \
|
||||||
|
include/opus_types.h \
|
||||||
|
include/opus_defines.h \
|
||||||
|
include/opus_custom.h \
|
||||||
|
celt/cwrs.h \
|
||||||
|
celt/ecintrin.h \
|
||||||
|
celt/entcode.h \
|
||||||
|
celt/entdec.h \
|
||||||
|
celt/entenc.h \
|
||||||
|
celt/fixed_debug.h \
|
||||||
|
celt/fixed_generic.h \
|
||||||
|
celt/float_cast.h \
|
||||||
|
celt/_kiss_fft_guts.h \
|
||||||
|
celt/kiss_fft.h \
|
||||||
|
celt/laplace.h \
|
||||||
|
celt/mathops.h \
|
||||||
|
celt/mdct.h \
|
||||||
|
celt/mfrngcod.h \
|
||||||
|
celt/modes.h \
|
||||||
|
celt/os_support.h \
|
||||||
|
celt/pitch.h \
|
||||||
|
celt/celt_lpc.h \
|
||||||
|
celt/quant_bands.h \
|
||||||
|
celt/rate.h \
|
||||||
|
celt/stack_alloc.h \
|
||||||
|
celt/vq.h \
|
||||||
|
celt/static_modes_float.h \
|
||||||
|
celt/static_modes_fixed.h
|
16
Frameworks/Opus/Opus/opus/celt_sources.mk
Normal file
16
Frameworks/Opus/Opus/opus/celt_sources.mk
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
CELT_SOURCES = celt/bands.c \
|
||||||
|
celt/celt.c \
|
||||||
|
celt/cwrs.c \
|
||||||
|
celt/entcode.c \
|
||||||
|
celt/entdec.c \
|
||||||
|
celt/entenc.c \
|
||||||
|
celt/kiss_fft.c \
|
||||||
|
celt/laplace.c \
|
||||||
|
celt/mathops.c \
|
||||||
|
celt/mdct.c \
|
||||||
|
celt/modes.c \
|
||||||
|
celt/pitch.c \
|
||||||
|
celt/celt_lpc.c \
|
||||||
|
celt/quant_bands.c \
|
||||||
|
celt/rate.c \
|
||||||
|
celt/vq.c
|
343
Frameworks/Opus/Opus/opus/compile
Executable file
343
Frameworks/Opus/Opus/opus/compile
Executable file
|
@ -0,0 +1,343 @@
|
||||||
|
#! /bin/sh
|
||||||
|
# Wrapper for compilers which do not understand '-c -o'.
|
||||||
|
|
||||||
|
scriptversion=2012-03-05.13; # UTC
|
||||||
|
|
||||||
|
# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2009, 2010, 2012 Free
|
||||||
|
# Software Foundation, Inc.
|
||||||
|
# Written by Tom Tromey <tromey@cygnus.com>.
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
# any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# As a special exception to the GNU General Public License, if you
|
||||||
|
# distribute this file as part of a program that contains a
|
||||||
|
# configuration script generated by Autoconf, you may include it under
|
||||||
|
# the same distribution terms that you use for the rest of that program.
|
||||||
|
|
||||||
|
# This file is maintained in Automake, please report
|
||||||
|
# bugs to <bug-automake@gnu.org> or send patches to
|
||||||
|
# <automake-patches@gnu.org>.
|
||||||
|
|
||||||
|
nl='
|
||||||
|
'
|
||||||
|
|
||||||
|
# We need space, tab and new line, in precisely that order. Quoting is
|
||||||
|
# there to prevent tools from complaining about whitespace usage.
|
||||||
|
IFS=" "" $nl"
|
||||||
|
|
||||||
|
file_conv=
|
||||||
|
|
||||||
|
# func_file_conv build_file lazy
|
||||||
|
# Convert a $build file to $host form and store it in $file
|
||||||
|
# Currently only supports Windows hosts. If the determined conversion
|
||||||
|
# type is listed in (the comma separated) LAZY, no conversion will
|
||||||
|
# take place.
|
||||||
|
func_file_conv ()
|
||||||
|
{
|
||||||
|
file=$1
|
||||||
|
case $file in
|
||||||
|
/ | /[!/]*) # absolute file, and not a UNC file
|
||||||
|
if test -z "$file_conv"; then
|
||||||
|
# lazily determine how to convert abs files
|
||||||
|
case `uname -s` in
|
||||||
|
MINGW*)
|
||||||
|
file_conv=mingw
|
||||||
|
;;
|
||||||
|
CYGWIN*)
|
||||||
|
file_conv=cygwin
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
file_conv=wine
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
case $file_conv/,$2, in
|
||||||
|
*,$file_conv,*)
|
||||||
|
;;
|
||||||
|
mingw/*)
|
||||||
|
file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
|
||||||
|
;;
|
||||||
|
cygwin/*)
|
||||||
|
file=`cygpath -m "$file" || echo "$file"`
|
||||||
|
;;
|
||||||
|
wine/*)
|
||||||
|
file=`winepath -w "$file" || echo "$file"`
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
# func_cl_dashL linkdir
|
||||||
|
# Make cl look for libraries in LINKDIR
|
||||||
|
func_cl_dashL ()
|
||||||
|
{
|
||||||
|
func_file_conv "$1"
|
||||||
|
if test -z "$lib_path"; then
|
||||||
|
lib_path=$file
|
||||||
|
else
|
||||||
|
lib_path="$lib_path;$file"
|
||||||
|
fi
|
||||||
|
linker_opts="$linker_opts -LIBPATH:$file"
|
||||||
|
}
|
||||||
|
|
||||||
|
# func_cl_dashl library
|
||||||
|
# Do a library search-path lookup for cl
|
||||||
|
func_cl_dashl ()
|
||||||
|
{
|
||||||
|
lib=$1
|
||||||
|
found=no
|
||||||
|
save_IFS=$IFS
|
||||||
|
IFS=';'
|
||||||
|
for dir in $lib_path $LIB
|
||||||
|
do
|
||||||
|
IFS=$save_IFS
|
||||||
|
if $shared && test -f "$dir/$lib.dll.lib"; then
|
||||||
|
found=yes
|
||||||
|
lib=$dir/$lib.dll.lib
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
if test -f "$dir/$lib.lib"; then
|
||||||
|
found=yes
|
||||||
|
lib=$dir/$lib.lib
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
IFS=$save_IFS
|
||||||
|
|
||||||
|
if test "$found" != yes; then
|
||||||
|
lib=$lib.lib
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# func_cl_wrapper cl arg...
|
||||||
|
# Adjust compile command to suit cl
|
||||||
|
func_cl_wrapper ()
|
||||||
|
{
|
||||||
|
# Assume a capable shell
|
||||||
|
lib_path=
|
||||||
|
shared=:
|
||||||
|
linker_opts=
|
||||||
|
for arg
|
||||||
|
do
|
||||||
|
if test -n "$eat"; then
|
||||||
|
eat=
|
||||||
|
else
|
||||||
|
case $1 in
|
||||||
|
-o)
|
||||||
|
# configure might choose to run compile as 'compile cc -o foo foo.c'.
|
||||||
|
eat=1
|
||||||
|
case $2 in
|
||||||
|
*.o | *.[oO][bB][jJ])
|
||||||
|
func_file_conv "$2"
|
||||||
|
set x "$@" -Fo"$file"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
func_file_conv "$2"
|
||||||
|
set x "$@" -Fe"$file"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
-I)
|
||||||
|
eat=1
|
||||||
|
func_file_conv "$2" mingw
|
||||||
|
set x "$@" -I"$file"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-I*)
|
||||||
|
func_file_conv "${1#-I}" mingw
|
||||||
|
set x "$@" -I"$file"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-l)
|
||||||
|
eat=1
|
||||||
|
func_cl_dashl "$2"
|
||||||
|
set x "$@" "$lib"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-l*)
|
||||||
|
func_cl_dashl "${1#-l}"
|
||||||
|
set x "$@" "$lib"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-L)
|
||||||
|
eat=1
|
||||||
|
func_cl_dashL "$2"
|
||||||
|
;;
|
||||||
|
-L*)
|
||||||
|
func_cl_dashL "${1#-L}"
|
||||||
|
;;
|
||||||
|
-static)
|
||||||
|
shared=false
|
||||||
|
;;
|
||||||
|
-Wl,*)
|
||||||
|
arg=${1#-Wl,}
|
||||||
|
save_ifs="$IFS"; IFS=','
|
||||||
|
for flag in $arg; do
|
||||||
|
IFS="$save_ifs"
|
||||||
|
linker_opts="$linker_opts $flag"
|
||||||
|
done
|
||||||
|
IFS="$save_ifs"
|
||||||
|
;;
|
||||||
|
-Xlinker)
|
||||||
|
eat=1
|
||||||
|
linker_opts="$linker_opts $2"
|
||||||
|
;;
|
||||||
|
-*)
|
||||||
|
set x "$@" "$1"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
|
||||||
|
func_file_conv "$1"
|
||||||
|
set x "$@" -Tp"$file"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
|
||||||
|
func_file_conv "$1" mingw
|
||||||
|
set x "$@" "$file"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
set x "$@" "$1"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
if test -n "$linker_opts"; then
|
||||||
|
linker_opts="-link$linker_opts"
|
||||||
|
fi
|
||||||
|
exec "$@" $linker_opts
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
eat=
|
||||||
|
|
||||||
|
case $1 in
|
||||||
|
'')
|
||||||
|
echo "$0: No command. Try '$0 --help' for more information." 1>&2
|
||||||
|
exit 1;
|
||||||
|
;;
|
||||||
|
-h | --h*)
|
||||||
|
cat <<\EOF
|
||||||
|
Usage: compile [--help] [--version] PROGRAM [ARGS]
|
||||||
|
|
||||||
|
Wrapper for compilers which do not understand '-c -o'.
|
||||||
|
Remove '-o dest.o' from ARGS, run PROGRAM with the remaining
|
||||||
|
arguments, and rename the output as expected.
|
||||||
|
|
||||||
|
If you are trying to build a whole package this is not the
|
||||||
|
right script to run: please start by reading the file 'INSTALL'.
|
||||||
|
|
||||||
|
Report bugs to <bug-automake@gnu.org>.
|
||||||
|
EOF
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
-v | --v*)
|
||||||
|
echo "compile $scriptversion"
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
cl | *[/\\]cl | cl.exe | *[/\\]cl.exe )
|
||||||
|
func_cl_wrapper "$@" # Doesn't return...
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
ofile=
|
||||||
|
cfile=
|
||||||
|
|
||||||
|
for arg
|
||||||
|
do
|
||||||
|
if test -n "$eat"; then
|
||||||
|
eat=
|
||||||
|
else
|
||||||
|
case $1 in
|
||||||
|
-o)
|
||||||
|
# configure might choose to run compile as 'compile cc -o foo foo.c'.
|
||||||
|
# So we strip '-o arg' only if arg is an object.
|
||||||
|
eat=1
|
||||||
|
case $2 in
|
||||||
|
*.o | *.obj)
|
||||||
|
ofile=$2
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
set x "$@" -o "$2"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
*.c)
|
||||||
|
cfile=$1
|
||||||
|
set x "$@" "$1"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
set x "$@" "$1"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
if test -z "$ofile" || test -z "$cfile"; then
|
||||||
|
# If no '-o' option was seen then we might have been invoked from a
|
||||||
|
# pattern rule where we don't need one. That is ok -- this is a
|
||||||
|
# normal compilation that the losing compiler can handle. If no
|
||||||
|
# '.c' file was seen then we are probably linking. That is also
|
||||||
|
# ok.
|
||||||
|
exec "$@"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Name of file we expect compiler to create.
|
||||||
|
cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
|
||||||
|
|
||||||
|
# Create the lock directory.
|
||||||
|
# Note: use '[/\\:.-]' here to ensure that we don't use the same name
|
||||||
|
# that we are using for the .o file. Also, base the name on the expected
|
||||||
|
# object file name, since that is what matters with a parallel build.
|
||||||
|
lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
|
||||||
|
while true; do
|
||||||
|
if mkdir "$lockdir" >/dev/null 2>&1; then
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
# FIXME: race condition here if user kills between mkdir and trap.
|
||||||
|
trap "rmdir '$lockdir'; exit 1" 1 2 15
|
||||||
|
|
||||||
|
# Run the compile.
|
||||||
|
"$@"
|
||||||
|
ret=$?
|
||||||
|
|
||||||
|
if test -f "$cofile"; then
|
||||||
|
test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
|
||||||
|
elif test -f "${cofile}bj"; then
|
||||||
|
test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
|
||||||
|
fi
|
||||||
|
|
||||||
|
rmdir "$lockdir"
|
||||||
|
exit $ret
|
||||||
|
|
||||||
|
# Local Variables:
|
||||||
|
# mode: shell-script
|
||||||
|
# sh-indentation: 2
|
||||||
|
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||||
|
# time-stamp-start: "scriptversion="
|
||||||
|
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||||
|
# time-stamp-time-zone: "UTC"
|
||||||
|
# time-stamp-end: "; # UTC"
|
||||||
|
# End:
|
1530
Frameworks/Opus/Opus/opus/config.guess
vendored
Executable file
1530
Frameworks/Opus/Opus/opus/config.guess
vendored
Executable file
File diff suppressed because it is too large
Load diff
44
Frameworks/Opus/Opus/opus/config.h
Normal file
44
Frameworks/Opus/Opus/opus/config.h
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
/***********************************************************************
|
||||||
|
Copyright (c) 2011, Skype Limited. All rights reserved.
|
||||||
|
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.
|
||||||
|
- Neither the name of Internet Society, IETF or IETF Trust, nor the
|
||||||
|
names of specific contributors, may be used to endorse or promote
|
||||||
|
products derived from this software without specific prior written
|
||||||
|
permission.
|
||||||
|
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.
|
||||||
|
***********************************************************************/
|
||||||
|
|
||||||
|
#ifndef CONFIG_H
|
||||||
|
#define CONFIG_H
|
||||||
|
|
||||||
|
#define inline __inline
|
||||||
|
|
||||||
|
#define USE_ALLOCA 1
|
||||||
|
|
||||||
|
/* Comment out the next line for floating-point code */
|
||||||
|
/*#define FIXED_POINT 1 */
|
||||||
|
|
||||||
|
#define OPUS_BUILD 1
|
||||||
|
|
||||||
|
#include "version.h"
|
||||||
|
|
||||||
|
#define __MACOSX__
|
||||||
|
|
||||||
|
#endif CONFIG_H
|
136
Frameworks/Opus/Opus/opus/config.h.in
Normal file
136
Frameworks/Opus/Opus/opus/config.h.in
Normal file
|
@ -0,0 +1,136 @@
|
||||||
|
/* config.h.in. Generated from configure.ac by autoheader. */
|
||||||
|
|
||||||
|
/* Custom modes */
|
||||||
|
#undef CUSTOM_MODES
|
||||||
|
|
||||||
|
/* Assertions */
|
||||||
|
#undef ENABLE_ASSERTIONS
|
||||||
|
|
||||||
|
/* Debug fixed-point implementation */
|
||||||
|
#undef FIXED_DEBUG
|
||||||
|
|
||||||
|
/* Compile as fixed-point (for machines without a fast enough FPU) */
|
||||||
|
#undef FIXED_POINT
|
||||||
|
|
||||||
|
/* Float approximations */
|
||||||
|
#undef FLOAT_APPROX
|
||||||
|
|
||||||
|
/* Fuzzing */
|
||||||
|
#undef FUZZING
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <alloca.h> header file. */
|
||||||
|
#undef HAVE_ALLOCA_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <dlfcn.h> header file. */
|
||||||
|
#undef HAVE_DLFCN_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <getopt.h> header file. */
|
||||||
|
#undef HAVE_GETOPT_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <inttypes.h> header file. */
|
||||||
|
#undef HAVE_INTTYPES_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `lrint' function. */
|
||||||
|
#undef HAVE_LRINT
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `lrintf' function. */
|
||||||
|
#undef HAVE_LRINTF
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <memory.h> header file. */
|
||||||
|
#undef HAVE_MEMORY_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <stdint.h> header file. */
|
||||||
|
#undef HAVE_STDINT_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <stdlib.h> header file. */
|
||||||
|
#undef HAVE_STDLIB_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <strings.h> header file. */
|
||||||
|
#undef HAVE_STRINGS_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <string.h> header file. */
|
||||||
|
#undef HAVE_STRING_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <sys/stat.h> header file. */
|
||||||
|
#undef HAVE_SYS_STAT_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <sys/types.h> header file. */
|
||||||
|
#undef HAVE_SYS_TYPES_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <unistd.h> header file. */
|
||||||
|
#undef HAVE_UNISTD_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `__malloc_hook' function. */
|
||||||
|
#undef HAVE___MALLOC_HOOK
|
||||||
|
|
||||||
|
/* Define to the sub-directory in which libtool stores uninstalled libraries.
|
||||||
|
*/
|
||||||
|
#undef LT_OBJDIR
|
||||||
|
|
||||||
|
/* Define to 1 if your C compiler doesn't accept -c and -o together. */
|
||||||
|
#undef NO_MINUS_C_MINUS_O
|
||||||
|
|
||||||
|
/* This is a build of OPUS */
|
||||||
|
#undef OPUS_BUILD
|
||||||
|
|
||||||
|
/* Define to the address where bug reports for this package should be sent. */
|
||||||
|
#undef PACKAGE_BUGREPORT
|
||||||
|
|
||||||
|
/* Define to the full name of this package. */
|
||||||
|
#undef PACKAGE_NAME
|
||||||
|
|
||||||
|
/* Define to the full name and version of this package. */
|
||||||
|
#undef PACKAGE_STRING
|
||||||
|
|
||||||
|
/* Define to the one symbol short name of this package. */
|
||||||
|
#undef PACKAGE_TARNAME
|
||||||
|
|
||||||
|
/* Define to the home page for this package. */
|
||||||
|
#undef PACKAGE_URL
|
||||||
|
|
||||||
|
/* Define to the version of this package. */
|
||||||
|
#undef PACKAGE_VERSION
|
||||||
|
|
||||||
|
/* The size of `int', as computed by sizeof. */
|
||||||
|
#undef SIZEOF_INT
|
||||||
|
|
||||||
|
/* The size of `long', as computed by sizeof. */
|
||||||
|
#undef SIZEOF_LONG
|
||||||
|
|
||||||
|
/* The size of `long long', as computed by sizeof. */
|
||||||
|
#undef SIZEOF_LONG_LONG
|
||||||
|
|
||||||
|
/* The size of `short', as computed by sizeof. */
|
||||||
|
#undef SIZEOF_SHORT
|
||||||
|
|
||||||
|
/* Define to 1 if you have the ANSI C header files. */
|
||||||
|
#undef STDC_HEADERS
|
||||||
|
|
||||||
|
/* Make use of alloca */
|
||||||
|
#undef USE_ALLOCA
|
||||||
|
|
||||||
|
/* Use C99 variable-size arrays */
|
||||||
|
#undef VAR_ARRAYS
|
||||||
|
|
||||||
|
/* Define to empty if `const' does not conform to ANSI C. */
|
||||||
|
#undef const
|
||||||
|
|
||||||
|
/* Define to `__inline__' or `__inline' if that's what the C compiler
|
||||||
|
calls it, or to nothing if 'inline' is not supported under any name. */
|
||||||
|
#ifndef __cplusplus
|
||||||
|
#undef inline
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Define to the equivalent of the C99 'restrict' keyword, or to
|
||||||
|
nothing if this is not supported. Do not define if restrict is
|
||||||
|
supported directly. */
|
||||||
|
#undef restrict
|
||||||
|
/* Work around a bug in Sun C++: it does not support _Restrict or
|
||||||
|
__restrict__, even though the corresponding Sun C compiler ends up with
|
||||||
|
"#define restrict _Restrict" or "#define restrict __restrict__" in the
|
||||||
|
previous line. Perhaps some future version of Sun C++ will work with
|
||||||
|
restrict; if so, hopefully it defines __RESTRICT like Sun C does. */
|
||||||
|
#if defined __SUNPRO_CC && !defined __RESTRICT
|
||||||
|
# define _Restrict
|
||||||
|
# define __restrict__
|
||||||
|
#endif
|
1773
Frameworks/Opus/Opus/opus/config.sub
vendored
Executable file
1773
Frameworks/Opus/Opus/opus/config.sub
vendored
Executable file
File diff suppressed because it is too large
Load diff
15007
Frameworks/Opus/Opus/opus/configure
vendored
Executable file
15007
Frameworks/Opus/Opus/opus/configure
vendored
Executable file
File diff suppressed because it is too large
Load diff
292
Frameworks/Opus/Opus/opus/configure.ac
Normal file
292
Frameworks/Opus/Opus/opus/configure.ac
Normal file
|
@ -0,0 +1,292 @@
|
||||||
|
dnl Process this file with autoconf to produce a configure script. -*-m4-*-
|
||||||
|
|
||||||
|
dnl The package_version file will be automatically synced to the git revision
|
||||||
|
dnl by the update_version script when configured in the repository, but will
|
||||||
|
dnl remain constant in tarball releases unless it is manually edited.
|
||||||
|
m4_define([CURRENT_VERSION],
|
||||||
|
m4_esyscmd([ if test -e package_version || ./update_version; then
|
||||||
|
. ./package_version
|
||||||
|
printf "$PACKAGE_VERSION"
|
||||||
|
else
|
||||||
|
printf "unknown"
|
||||||
|
fi ]))
|
||||||
|
|
||||||
|
AC_INIT([opus],[CURRENT_VERSION],[opus@xiph.org])
|
||||||
|
|
||||||
|
AC_CONFIG_SRCDIR(src/opus_encoder.c)
|
||||||
|
|
||||||
|
dnl enable silent rules on automake 1.11 and later
|
||||||
|
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
|
||||||
|
|
||||||
|
|
||||||
|
# For libtool.
|
||||||
|
dnl Please update these for releases.
|
||||||
|
OPUS_LT_CURRENT=4
|
||||||
|
OPUS_LT_REVISION=0
|
||||||
|
OPUS_LT_AGE=4
|
||||||
|
|
||||||
|
AC_SUBST(OPUS_LT_CURRENT)
|
||||||
|
AC_SUBST(OPUS_LT_REVISION)
|
||||||
|
AC_SUBST(OPUS_LT_AGE)
|
||||||
|
|
||||||
|
AM_INIT_AUTOMAKE([no-define])
|
||||||
|
AM_MAINTAINER_MODE([enable])
|
||||||
|
|
||||||
|
AC_CANONICAL_HOST
|
||||||
|
AC_MINGW32
|
||||||
|
AM_PROG_LIBTOOL
|
||||||
|
AM_PROG_CC_C_O
|
||||||
|
|
||||||
|
AC_PROG_CC_C99
|
||||||
|
AC_C_CONST
|
||||||
|
AC_C_INLINE
|
||||||
|
|
||||||
|
#Use a hacked up version of autoconf's AC_C_RESTRICT because it's not
|
||||||
|
#strong enough a test to detect old buggy versions of GCC (e.g. 2.95.3)
|
||||||
|
AC_CACHE_CHECK([for C/C++ restrict keyword], ac_cv_c_restrict,
|
||||||
|
[ac_cv_c_restrict=no
|
||||||
|
# The order here caters to the fact that C++ does not require restrict.
|
||||||
|
for ac_kw in __restrict __restrict__ _Restrict restrict; do
|
||||||
|
AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
|
||||||
|
[[typedef int * int_ptr;
|
||||||
|
int foo (int_ptr $ac_kw ip, int * $ac_kw baz[]) {
|
||||||
|
return ip[0];
|
||||||
|
}]],
|
||||||
|
[[int s[1];
|
||||||
|
int * $ac_kw t = s;
|
||||||
|
t[0] = 0;
|
||||||
|
return foo(t, (void *)0)]])],
|
||||||
|
[ac_cv_c_restrict=$ac_kw])
|
||||||
|
test "$ac_cv_c_restrict" != no && break
|
||||||
|
done
|
||||||
|
])
|
||||||
|
AH_VERBATIM([restrict],
|
||||||
|
[/* Define to the equivalent of the C99 'restrict' keyword, or to
|
||||||
|
nothing if this is not supported. Do not define if restrict is
|
||||||
|
supported directly. */
|
||||||
|
#undef restrict
|
||||||
|
/* Work around a bug in Sun C++: it does not support _Restrict or
|
||||||
|
__restrict__, even though the corresponding Sun C compiler ends up with
|
||||||
|
"#define restrict _Restrict" or "#define restrict __restrict__" in the
|
||||||
|
previous line. Perhaps some future version of Sun C++ will work with
|
||||||
|
restrict; if so, hopefully it defines __RESTRICT like Sun C does. */
|
||||||
|
#if defined __SUNPRO_CC && !defined __RESTRICT
|
||||||
|
# define _Restrict
|
||||||
|
# define __restrict__
|
||||||
|
#endif])
|
||||||
|
case $ac_cv_c_restrict in
|
||||||
|
restrict) ;;
|
||||||
|
no) AC_DEFINE([restrict], []) ;;
|
||||||
|
*) AC_DEFINE_UNQUOTED([restrict], [$ac_cv_c_restrict]) ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
AC_DEFINE([OPUS_BUILD], [], [This is a build of OPUS])
|
||||||
|
|
||||||
|
AC_MSG_CHECKING(for C99 variable-size arrays)
|
||||||
|
AC_TRY_COMPILE( [], [static int x; char a[++x]; a[sizeof a - 1] = 0; int N; return a[0];],
|
||||||
|
[has_var_arrays=yes;AC_DEFINE([VAR_ARRAYS], [], [Use C99 variable-size arrays])
|
||||||
|
],
|
||||||
|
has_var_arrays=no
|
||||||
|
)
|
||||||
|
AC_MSG_RESULT($has_var_arrays)
|
||||||
|
|
||||||
|
AC_CHECK_HEADERS([alloca.h getopt.h])
|
||||||
|
AC_MSG_CHECKING(for alloca)
|
||||||
|
AC_TRY_COMPILE( [#include <alloca.h>], [
|
||||||
|
int foo=10;
|
||||||
|
int *array = alloca(foo);
|
||||||
|
],
|
||||||
|
[
|
||||||
|
has_alloca=yes;
|
||||||
|
if test x$has_var_arrays = "xno" ; then
|
||||||
|
AC_DEFINE([USE_ALLOCA], [], [Make use of alloca])
|
||||||
|
fi
|
||||||
|
],
|
||||||
|
has_alloca=no
|
||||||
|
)
|
||||||
|
AC_MSG_RESULT($has_alloca)
|
||||||
|
|
||||||
|
AC_CHECK_FUNC(exp,[fp_libm_not_needed=yes;LIBM=],[fp_libm_not_needed=dunno])
|
||||||
|
if test x"$fp_libm_not_needed" = xdunno; then
|
||||||
|
AC_CHECK_LIB([m], [exp], [LIBS="-lm $LIBS"; LIBM="-lm"],[LIBM=])
|
||||||
|
fi
|
||||||
|
AC_SUBST([LIBM])
|
||||||
|
|
||||||
|
has_float_approx=no
|
||||||
|
#case "$host_cpu" in
|
||||||
|
#i[[3456]]86 | x86_64 | powerpc64 | powerpc32 | ia64)
|
||||||
|
# has_float_approx=yes
|
||||||
|
# ;;
|
||||||
|
#esac
|
||||||
|
|
||||||
|
ac_enable_fixed="no";
|
||||||
|
ac_enable_float="yes";
|
||||||
|
AC_ARG_ENABLE(fixed-point, [ --enable-fixed-point compile without floating point (for machines without a fast enough FPU)],
|
||||||
|
[if test "$enableval" = yes; then
|
||||||
|
ac_enable_fixed="yes";
|
||||||
|
ac_enable_float="no";
|
||||||
|
AC_DEFINE([FIXED_POINT], [1], [Compile as fixed-point (for machines without a fast enough FPU)])
|
||||||
|
fi])
|
||||||
|
|
||||||
|
ac_enable_fixed_debug="no"
|
||||||
|
AC_ARG_ENABLE(fixed-point-debug, [ --enable-fixed-point-debug debug fixed-point implementation],
|
||||||
|
[if test "$enableval" = yes; then
|
||||||
|
ac_enable_fixed_debug="yes"
|
||||||
|
AC_DEFINE([FIXED_DEBUG], , [Debug fixed-point implementation])
|
||||||
|
fi])
|
||||||
|
|
||||||
|
ac_enable_custom_modes="no"
|
||||||
|
AC_ARG_ENABLE(custom-modes, [ --enable-custom-modes enable non-Opus modes, e.g. 44.1 kHz & 2^n frames],
|
||||||
|
[if test "$enableval" = yes; then
|
||||||
|
ac_enable_custom_modes="yes"
|
||||||
|
AC_DEFINE([CUSTOM_MODES], , [Custom modes])
|
||||||
|
fi])
|
||||||
|
|
||||||
|
float_approx=$has_float_approx
|
||||||
|
AC_ARG_ENABLE(float-approx, [ --enable-float-approx enable fast approximations for floating point],
|
||||||
|
[ if test "$enableval" = yes; then
|
||||||
|
AC_WARN([Floating point approximations are not supported on all platforms.])
|
||||||
|
float_approx=yes
|
||||||
|
else
|
||||||
|
float_approx=no
|
||||||
|
fi], [ float_approx=$has_float_approx ])
|
||||||
|
|
||||||
|
if test "x${float_approx}" = "xyes"; then
|
||||||
|
AC_DEFINE([FLOAT_APPROX], , [Float approximations])
|
||||||
|
fi
|
||||||
|
|
||||||
|
ac_enable_assertions="no"
|
||||||
|
AC_ARG_ENABLE(assertions, [ --enable-assertions enable additional software error checking],
|
||||||
|
[if test "$enableval" = yes; then
|
||||||
|
ac_enable_assertions="yes"
|
||||||
|
AC_DEFINE([ENABLE_ASSERTIONS], , [Assertions])
|
||||||
|
fi])
|
||||||
|
|
||||||
|
ac_enable_fuzzing="no"
|
||||||
|
AC_ARG_ENABLE(fuzzing, [ --enable-fuzzing causes the encoder to make random decisions],
|
||||||
|
[if test "$enableval" = yes; then
|
||||||
|
ac_enable_fuzzing="yes"
|
||||||
|
AC_DEFINE([FUZZING], , [Fuzzing])
|
||||||
|
fi])
|
||||||
|
|
||||||
|
ac_enable_doc="yes"
|
||||||
|
AC_ARG_ENABLE([doc],
|
||||||
|
AS_HELP_STRING([--disable-doc], [Do not build API documentation]),
|
||||||
|
[ac_enable_doc=$enableval])
|
||||||
|
AC_CHECK_PROG(HAVE_DOXYGEN, [doxygen], [yes], [no])
|
||||||
|
if test "$HAVE_DOXYGEN" != "yes" -o "$ac_enable_doc" != "yes"; then
|
||||||
|
HAVE_DOXYGEN="false"
|
||||||
|
ac_enable_doc="no"
|
||||||
|
fi
|
||||||
|
AM_CONDITIONAL(HAVE_DOXYGEN, [test $HAVE_DOXYGEN = yes])
|
||||||
|
|
||||||
|
saved_CFLAGS="$CFLAGS"
|
||||||
|
CFLAGS="$CFLAGS -fvisibility=hidden"
|
||||||
|
AC_MSG_CHECKING([if ${CC} supports -fvisibility=hidden])
|
||||||
|
AC_COMPILE_IFELSE([AC_LANG_SOURCE([char foo;])],
|
||||||
|
[ AC_MSG_RESULT([yes])
|
||||||
|
SYMBOL_VISIBILITY="-fvisibility=hidden" ],
|
||||||
|
AC_MSG_RESULT([no]))
|
||||||
|
CFLAGS="$saved_CFLAGS $SYMBOL_VISIBILITY"
|
||||||
|
AC_SUBST(SYMBOL_VISIBILITY)
|
||||||
|
|
||||||
|
CFLAGS="$CFLAGS -W"
|
||||||
|
|
||||||
|
saved_CFLAGS="$CFLAGS"
|
||||||
|
CFLAGS="$CFLAGS -Wall -Wextra -Wcast-align -Wnested-externs -Wshadow -Wstrict-prototypes"
|
||||||
|
AC_MSG_CHECKING([if ${CC} supports -Wall -Wextra -Wcast-align -Wnested-externs -Wshadow -Wstrict-prototypes])
|
||||||
|
AC_COMPILE_IFELSE([AC_LANG_SOURCE([char foo;])],
|
||||||
|
[ AC_MSG_RESULT([yes])
|
||||||
|
EXTRA_WARNS="-Wall -Wextra -Wcast-align -Wnested-externs -Wshadow -Wstrict-prototypes" ],
|
||||||
|
AC_MSG_RESULT([no]))
|
||||||
|
CFLAGS="$saved_CFLAGS $EXTRA_WARNS"
|
||||||
|
|
||||||
|
AC_CHECK_FUNCS([lrintf])
|
||||||
|
AC_CHECK_FUNCS([lrint])
|
||||||
|
AC_CHECK_FUNCS([__malloc_hook])
|
||||||
|
|
||||||
|
AC_CHECK_SIZEOF(short)
|
||||||
|
AC_CHECK_SIZEOF(int)
|
||||||
|
AC_CHECK_SIZEOF(long)
|
||||||
|
AC_CHECK_SIZEOF(long long)
|
||||||
|
|
||||||
|
if test x$has_char16 = "xyes" ; then
|
||||||
|
case 1 in
|
||||||
|
$ac_cv_sizeof_short) SIZE16="short";;
|
||||||
|
$ac_cv_sizeof_int) SIZE16="int";;
|
||||||
|
esac
|
||||||
|
else
|
||||||
|
case 2 in
|
||||||
|
$ac_cv_sizeof_short) SIZE16="short";;
|
||||||
|
$ac_cv_sizeof_int) SIZE16="int";;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test x$has_char16 = "xyes" ; then
|
||||||
|
case 2 in
|
||||||
|
$ac_cv_sizeof_int) SIZE32="int";;
|
||||||
|
$ac_cv_sizeof_long) SIZE32="long";;
|
||||||
|
$ac_cv_sizeof_short) SIZE32="short";;
|
||||||
|
esac
|
||||||
|
else
|
||||||
|
case 4 in
|
||||||
|
$ac_cv_sizeof_int) SIZE32="int";;
|
||||||
|
$ac_cv_sizeof_long) SIZE32="long";;
|
||||||
|
$ac_cv_sizeof_short) SIZE32="short";;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
AC_SUBST(SIZE16)
|
||||||
|
AC_SUBST(SIZE32)
|
||||||
|
|
||||||
|
AM_CONDITIONAL([FIXED_POINT], [test x$ac_enable_fixed = xyes])
|
||||||
|
AM_CONDITIONAL([CUSTOM_MODES], [test x$ac_enable_custom_modes = xyes])
|
||||||
|
|
||||||
|
dnl subsitutions for the pkg-config files
|
||||||
|
if test x$ac_enable_float = xyes; then
|
||||||
|
PC_BUILD="floating-point"
|
||||||
|
PC_LIBM=$LIBM
|
||||||
|
else
|
||||||
|
PC_BUILD="fixed-point"
|
||||||
|
PC_LIBM=
|
||||||
|
fi
|
||||||
|
dnl opus_custom requires libm as well
|
||||||
|
if test x$ac_enable_custom_modes = xyes; then
|
||||||
|
PC_BUILD="${PC_BUILD}, custom modes"
|
||||||
|
PC_LIBM=$LIBM
|
||||||
|
fi
|
||||||
|
AC_SUBST([PC_BUILD])
|
||||||
|
AC_SUBST([PC_LIBM])
|
||||||
|
|
||||||
|
|
||||||
|
AC_CONFIG_FILES([Makefile opus.pc opus-uninstalled.pc
|
||||||
|
doc/Makefile doc/Doxyfile])
|
||||||
|
AC_CONFIG_HEADERS([config.h])
|
||||||
|
|
||||||
|
AC_OUTPUT
|
||||||
|
|
||||||
|
AC_MSG_RESULT([
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
$PACKAGE_NAME $PACKAGE_VERSION: Automatic configuration OK.
|
||||||
|
|
||||||
|
Compiler support:
|
||||||
|
|
||||||
|
C99 var arrays: ................ ${has_var_arrays}
|
||||||
|
C99 lrintf: .................... ${ac_cv_func_lrintf}
|
||||||
|
Alloca: ........................ ${has_alloca}
|
||||||
|
|
||||||
|
General configuration:
|
||||||
|
|
||||||
|
Floating point support: ........ ${ac_enable_float}
|
||||||
|
Fast float approximations: ..... ${float_approx}
|
||||||
|
Fixed point debugging: ......... ${ac_enable_fixed_debug}
|
||||||
|
Custom modes: .................. ${ac_enable_custom_modes}
|
||||||
|
Assertion checking: ............ ${ac_enable_assertions}
|
||||||
|
Fuzzing: ....................... ${ac_enable_fuzzing}
|
||||||
|
|
||||||
|
API documentation: ............. ${ac_enable_doc}
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
])
|
||||||
|
|
||||||
|
echo "Type \"make; make install\" to compile and install";
|
||||||
|
echo "Type \"make check\" to run the test suite";
|
708
Frameworks/Opus/Opus/opus/depcomp
Executable file
708
Frameworks/Opus/Opus/opus/depcomp
Executable file
|
@ -0,0 +1,708 @@
|
||||||
|
#! /bin/sh
|
||||||
|
# depcomp - compile a program generating dependencies as side-effects
|
||||||
|
|
||||||
|
scriptversion=2012-03-27.16; # UTC
|
||||||
|
|
||||||
|
# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010,
|
||||||
|
# 2011, 2012 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
# any later version.
|
||||||
|
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# As a special exception to the GNU General Public License, if you
|
||||||
|
# distribute this file as part of a program that contains a
|
||||||
|
# configuration script generated by Autoconf, you may include it under
|
||||||
|
# the same distribution terms that you use for the rest of that program.
|
||||||
|
|
||||||
|
# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
|
||||||
|
|
||||||
|
case $1 in
|
||||||
|
'')
|
||||||
|
echo "$0: No command. Try '$0 --help' for more information." 1>&2
|
||||||
|
exit 1;
|
||||||
|
;;
|
||||||
|
-h | --h*)
|
||||||
|
cat <<\EOF
|
||||||
|
Usage: depcomp [--help] [--version] PROGRAM [ARGS]
|
||||||
|
|
||||||
|
Run PROGRAMS ARGS to compile a file, generating dependencies
|
||||||
|
as side-effects.
|
||||||
|
|
||||||
|
Environment variables:
|
||||||
|
depmode Dependency tracking mode.
|
||||||
|
source Source file read by 'PROGRAMS ARGS'.
|
||||||
|
object Object file output by 'PROGRAMS ARGS'.
|
||||||
|
DEPDIR directory where to store dependencies.
|
||||||
|
depfile Dependency file to output.
|
||||||
|
tmpdepfile Temporary file to use when outputting dependencies.
|
||||||
|
libtool Whether libtool is used (yes/no).
|
||||||
|
|
||||||
|
Report bugs to <bug-automake@gnu.org>.
|
||||||
|
EOF
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
-v | --v*)
|
||||||
|
echo "depcomp $scriptversion"
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# A tabulation character.
|
||||||
|
tab=' '
|
||||||
|
# A newline character.
|
||||||
|
nl='
|
||||||
|
'
|
||||||
|
|
||||||
|
if test -z "$depmode" || test -z "$source" || test -z "$object"; then
|
||||||
|
echo "depcomp: Variables source, object and depmode must be set" 1>&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
|
||||||
|
depfile=${depfile-`echo "$object" |
|
||||||
|
sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
|
||||||
|
tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
|
||||||
|
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
|
||||||
|
# Some modes work just like other modes, but use different flags. We
|
||||||
|
# parameterize here, but still list the modes in the big case below,
|
||||||
|
# to make depend.m4 easier to write. Note that we *cannot* use a case
|
||||||
|
# here, because this file can only contain one case statement.
|
||||||
|
if test "$depmode" = hp; then
|
||||||
|
# HP compiler uses -M and no extra arg.
|
||||||
|
gccflag=-M
|
||||||
|
depmode=gcc
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "$depmode" = dashXmstdout; then
|
||||||
|
# This is just like dashmstdout with a different argument.
|
||||||
|
dashmflag=-xM
|
||||||
|
depmode=dashmstdout
|
||||||
|
fi
|
||||||
|
|
||||||
|
cygpath_u="cygpath -u -f -"
|
||||||
|
if test "$depmode" = msvcmsys; then
|
||||||
|
# This is just like msvisualcpp but w/o cygpath translation.
|
||||||
|
# Just convert the backslash-escaped backslashes to single forward
|
||||||
|
# slashes to satisfy depend.m4
|
||||||
|
cygpath_u='sed s,\\\\,/,g'
|
||||||
|
depmode=msvisualcpp
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "$depmode" = msvc7msys; then
|
||||||
|
# This is just like msvc7 but w/o cygpath translation.
|
||||||
|
# Just convert the backslash-escaped backslashes to single forward
|
||||||
|
# slashes to satisfy depend.m4
|
||||||
|
cygpath_u='sed s,\\\\,/,g'
|
||||||
|
depmode=msvc7
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "$depmode" = xlc; then
|
||||||
|
# IBM C/C++ Compilers xlc/xlC can output gcc-like dependency informations.
|
||||||
|
gccflag=-qmakedep=gcc,-MF
|
||||||
|
depmode=gcc
|
||||||
|
fi
|
||||||
|
|
||||||
|
case "$depmode" in
|
||||||
|
gcc3)
|
||||||
|
## gcc 3 implements dependency tracking that does exactly what
|
||||||
|
## we want. Yay! Note: for some reason libtool 1.4 doesn't like
|
||||||
|
## it if -MD -MP comes after the -MF stuff. Hmm.
|
||||||
|
## Unfortunately, FreeBSD c89 acceptance of flags depends upon
|
||||||
|
## the command line argument order; so add the flags where they
|
||||||
|
## appear in depend2.am. Note that the slowdown incurred here
|
||||||
|
## affects only configure: in makefiles, %FASTDEP% shortcuts this.
|
||||||
|
for arg
|
||||||
|
do
|
||||||
|
case $arg in
|
||||||
|
-c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
|
||||||
|
*) set fnord "$@" "$arg" ;;
|
||||||
|
esac
|
||||||
|
shift # fnord
|
||||||
|
shift # $arg
|
||||||
|
done
|
||||||
|
"$@"
|
||||||
|
stat=$?
|
||||||
|
if test $stat -eq 0; then :
|
||||||
|
else
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
mv "$tmpdepfile" "$depfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
gcc)
|
||||||
|
## There are various ways to get dependency output from gcc. Here's
|
||||||
|
## why we pick this rather obscure method:
|
||||||
|
## - Don't want to use -MD because we'd like the dependencies to end
|
||||||
|
## up in a subdir. Having to rename by hand is ugly.
|
||||||
|
## (We might end up doing this anyway to support other compilers.)
|
||||||
|
## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
|
||||||
|
## -MM, not -M (despite what the docs say).
|
||||||
|
## - Using -M directly means running the compiler twice (even worse
|
||||||
|
## than renaming).
|
||||||
|
if test -z "$gccflag"; then
|
||||||
|
gccflag=-MD,
|
||||||
|
fi
|
||||||
|
"$@" -Wp,"$gccflag$tmpdepfile"
|
||||||
|
stat=$?
|
||||||
|
if test $stat -eq 0; then :
|
||||||
|
else
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
rm -f "$depfile"
|
||||||
|
echo "$object : \\" > "$depfile"
|
||||||
|
alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
|
||||||
|
## The second -e expression handles DOS-style file names with drive letters.
|
||||||
|
sed -e 's/^[^:]*: / /' \
|
||||||
|
-e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
|
||||||
|
## This next piece of magic avoids the "deleted header file" problem.
|
||||||
|
## The problem is that when a header file which appears in a .P file
|
||||||
|
## is deleted, the dependency causes make to die (because there is
|
||||||
|
## typically no way to rebuild the header). We avoid this by adding
|
||||||
|
## dummy dependencies for each header file. Too bad gcc doesn't do
|
||||||
|
## this for us directly.
|
||||||
|
tr ' ' "$nl" < "$tmpdepfile" |
|
||||||
|
## Some versions of gcc put a space before the ':'. On the theory
|
||||||
|
## that the space means something, we add a space to the output as
|
||||||
|
## well. hp depmode also adds that space, but also prefixes the VPATH
|
||||||
|
## to the object. Take care to not repeat it in the output.
|
||||||
|
## Some versions of the HPUX 10.20 sed can't process this invocation
|
||||||
|
## correctly. Breaking it into two sed invocations is a workaround.
|
||||||
|
sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
|
||||||
|
| sed -e 's/$/ :/' >> "$depfile"
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
hp)
|
||||||
|
# This case exists only to let depend.m4 do its work. It works by
|
||||||
|
# looking at the text of this script. This case will never be run,
|
||||||
|
# since it is checked for above.
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
|
||||||
|
sgi)
|
||||||
|
if test "$libtool" = yes; then
|
||||||
|
"$@" "-Wp,-MDupdate,$tmpdepfile"
|
||||||
|
else
|
||||||
|
"$@" -MDupdate "$tmpdepfile"
|
||||||
|
fi
|
||||||
|
stat=$?
|
||||||
|
if test $stat -eq 0; then :
|
||||||
|
else
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
rm -f "$depfile"
|
||||||
|
|
||||||
|
if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files
|
||||||
|
echo "$object : \\" > "$depfile"
|
||||||
|
|
||||||
|
# Clip off the initial element (the dependent). Don't try to be
|
||||||
|
# clever and replace this with sed code, as IRIX sed won't handle
|
||||||
|
# lines with more than a fixed number of characters (4096 in
|
||||||
|
# IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines;
|
||||||
|
# the IRIX cc adds comments like '#:fec' to the end of the
|
||||||
|
# dependency line.
|
||||||
|
tr ' ' "$nl" < "$tmpdepfile" \
|
||||||
|
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
|
||||||
|
tr "$nl" ' ' >> "$depfile"
|
||||||
|
echo >> "$depfile"
|
||||||
|
|
||||||
|
# The second pass generates a dummy entry for each header file.
|
||||||
|
tr ' ' "$nl" < "$tmpdepfile" \
|
||||||
|
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
|
||||||
|
>> "$depfile"
|
||||||
|
else
|
||||||
|
# The sourcefile does not contain any dependencies, so just
|
||||||
|
# store a dummy comment line, to avoid errors with the Makefile
|
||||||
|
# "include basename.Plo" scheme.
|
||||||
|
echo "#dummy" > "$depfile"
|
||||||
|
fi
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
xlc)
|
||||||
|
# This case exists only to let depend.m4 do its work. It works by
|
||||||
|
# looking at the text of this script. This case will never be run,
|
||||||
|
# since it is checked for above.
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
|
||||||
|
aix)
|
||||||
|
# The C for AIX Compiler uses -M and outputs the dependencies
|
||||||
|
# in a .u file. In older versions, this file always lives in the
|
||||||
|
# current directory. Also, the AIX compiler puts '$object:' at the
|
||||||
|
# start of each line; $object doesn't have directory information.
|
||||||
|
# Version 6 uses the directory in both cases.
|
||||||
|
dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
|
||||||
|
test "x$dir" = "x$object" && dir=
|
||||||
|
base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
|
||||||
|
if test "$libtool" = yes; then
|
||||||
|
tmpdepfile1=$dir$base.u
|
||||||
|
tmpdepfile2=$base.u
|
||||||
|
tmpdepfile3=$dir.libs/$base.u
|
||||||
|
"$@" -Wc,-M
|
||||||
|
else
|
||||||
|
tmpdepfile1=$dir$base.u
|
||||||
|
tmpdepfile2=$dir$base.u
|
||||||
|
tmpdepfile3=$dir$base.u
|
||||||
|
"$@" -M
|
||||||
|
fi
|
||||||
|
stat=$?
|
||||||
|
|
||||||
|
if test $stat -eq 0; then :
|
||||||
|
else
|
||||||
|
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
|
||||||
|
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
||||||
|
do
|
||||||
|
test -f "$tmpdepfile" && break
|
||||||
|
done
|
||||||
|
if test -f "$tmpdepfile"; then
|
||||||
|
# Each line is of the form 'foo.o: dependent.h'.
|
||||||
|
# Do two passes, one to just change these to
|
||||||
|
# '$object: dependent.h' and one to simply 'dependent.h:'.
|
||||||
|
sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
|
||||||
|
sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
|
||||||
|
else
|
||||||
|
# The sourcefile does not contain any dependencies, so just
|
||||||
|
# store a dummy comment line, to avoid errors with the Makefile
|
||||||
|
# "include basename.Plo" scheme.
|
||||||
|
echo "#dummy" > "$depfile"
|
||||||
|
fi
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
icc)
|
||||||
|
# Intel's C compiler anf tcc (Tiny C Compiler) understand '-MD -MF file'.
|
||||||
|
# However on
|
||||||
|
# $CC -MD -MF foo.d -c -o sub/foo.o sub/foo.c
|
||||||
|
# ICC 7.0 will fill foo.d with something like
|
||||||
|
# foo.o: sub/foo.c
|
||||||
|
# foo.o: sub/foo.h
|
||||||
|
# which is wrong. We want
|
||||||
|
# sub/foo.o: sub/foo.c
|
||||||
|
# sub/foo.o: sub/foo.h
|
||||||
|
# sub/foo.c:
|
||||||
|
# sub/foo.h:
|
||||||
|
# ICC 7.1 will output
|
||||||
|
# foo.o: sub/foo.c sub/foo.h
|
||||||
|
# and will wrap long lines using '\':
|
||||||
|
# foo.o: sub/foo.c ... \
|
||||||
|
# sub/foo.h ... \
|
||||||
|
# ...
|
||||||
|
# tcc 0.9.26 (FIXME still under development at the moment of writing)
|
||||||
|
# will emit a similar output, but also prepend the continuation lines
|
||||||
|
# with horizontal tabulation characters.
|
||||||
|
"$@" -MD -MF "$tmpdepfile"
|
||||||
|
stat=$?
|
||||||
|
if test $stat -eq 0; then :
|
||||||
|
else
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
rm -f "$depfile"
|
||||||
|
# Each line is of the form 'foo.o: dependent.h',
|
||||||
|
# or 'foo.o: dep1.h dep2.h \', or ' dep3.h dep4.h \'.
|
||||||
|
# Do two passes, one to just change these to
|
||||||
|
# '$object: dependent.h' and one to simply 'dependent.h:'.
|
||||||
|
sed -e "s/^[ $tab][ $tab]*/ /" -e "s,^[^:]*:,$object :," \
|
||||||
|
< "$tmpdepfile" > "$depfile"
|
||||||
|
sed '
|
||||||
|
s/[ '"$tab"'][ '"$tab"']*/ /g
|
||||||
|
s/^ *//
|
||||||
|
s/ *\\*$//
|
||||||
|
s/^[^:]*: *//
|
||||||
|
/^$/d
|
||||||
|
/:$/d
|
||||||
|
s/$/ :/
|
||||||
|
' < "$tmpdepfile" >> "$depfile"
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
hp2)
|
||||||
|
# The "hp" stanza above does not work with aCC (C++) and HP's ia64
|
||||||
|
# compilers, which have integrated preprocessors. The correct option
|
||||||
|
# to use with these is +Maked; it writes dependencies to a file named
|
||||||
|
# 'foo.d', which lands next to the object file, wherever that
|
||||||
|
# happens to be.
|
||||||
|
# Much of this is similar to the tru64 case; see comments there.
|
||||||
|
dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
|
||||||
|
test "x$dir" = "x$object" && dir=
|
||||||
|
base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
|
||||||
|
if test "$libtool" = yes; then
|
||||||
|
tmpdepfile1=$dir$base.d
|
||||||
|
tmpdepfile2=$dir.libs/$base.d
|
||||||
|
"$@" -Wc,+Maked
|
||||||
|
else
|
||||||
|
tmpdepfile1=$dir$base.d
|
||||||
|
tmpdepfile2=$dir$base.d
|
||||||
|
"$@" +Maked
|
||||||
|
fi
|
||||||
|
stat=$?
|
||||||
|
if test $stat -eq 0; then :
|
||||||
|
else
|
||||||
|
rm -f "$tmpdepfile1" "$tmpdepfile2"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
|
||||||
|
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
|
||||||
|
do
|
||||||
|
test -f "$tmpdepfile" && break
|
||||||
|
done
|
||||||
|
if test -f "$tmpdepfile"; then
|
||||||
|
sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
|
||||||
|
# Add 'dependent.h:' lines.
|
||||||
|
sed -ne '2,${
|
||||||
|
s/^ *//
|
||||||
|
s/ \\*$//
|
||||||
|
s/$/:/
|
||||||
|
p
|
||||||
|
}' "$tmpdepfile" >> "$depfile"
|
||||||
|
else
|
||||||
|
echo "#dummy" > "$depfile"
|
||||||
|
fi
|
||||||
|
rm -f "$tmpdepfile" "$tmpdepfile2"
|
||||||
|
;;
|
||||||
|
|
||||||
|
tru64)
|
||||||
|
# The Tru64 compiler uses -MD to generate dependencies as a side
|
||||||
|
# effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
|
||||||
|
# At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
|
||||||
|
# dependencies in 'foo.d' instead, so we check for that too.
|
||||||
|
# Subdirectories are respected.
|
||||||
|
dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
|
||||||
|
test "x$dir" = "x$object" && dir=
|
||||||
|
base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
|
||||||
|
|
||||||
|
if test "$libtool" = yes; then
|
||||||
|
# With Tru64 cc, shared objects can also be used to make a
|
||||||
|
# static library. This mechanism is used in libtool 1.4 series to
|
||||||
|
# handle both shared and static libraries in a single compilation.
|
||||||
|
# With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
|
||||||
|
#
|
||||||
|
# With libtool 1.5 this exception was removed, and libtool now
|
||||||
|
# generates 2 separate objects for the 2 libraries. These two
|
||||||
|
# compilations output dependencies in $dir.libs/$base.o.d and
|
||||||
|
# in $dir$base.o.d. We have to check for both files, because
|
||||||
|
# one of the two compilations can be disabled. We should prefer
|
||||||
|
# $dir$base.o.d over $dir.libs/$base.o.d because the latter is
|
||||||
|
# automatically cleaned when .libs/ is deleted, while ignoring
|
||||||
|
# the former would cause a distcleancheck panic.
|
||||||
|
tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4
|
||||||
|
tmpdepfile2=$dir$base.o.d # libtool 1.5
|
||||||
|
tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5
|
||||||
|
tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504
|
||||||
|
"$@" -Wc,-MD
|
||||||
|
else
|
||||||
|
tmpdepfile1=$dir$base.o.d
|
||||||
|
tmpdepfile2=$dir$base.d
|
||||||
|
tmpdepfile3=$dir$base.d
|
||||||
|
tmpdepfile4=$dir$base.d
|
||||||
|
"$@" -MD
|
||||||
|
fi
|
||||||
|
|
||||||
|
stat=$?
|
||||||
|
if test $stat -eq 0; then :
|
||||||
|
else
|
||||||
|
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
|
||||||
|
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
|
||||||
|
do
|
||||||
|
test -f "$tmpdepfile" && break
|
||||||
|
done
|
||||||
|
if test -f "$tmpdepfile"; then
|
||||||
|
sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
|
||||||
|
sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
|
||||||
|
else
|
||||||
|
echo "#dummy" > "$depfile"
|
||||||
|
fi
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
msvc7)
|
||||||
|
if test "$libtool" = yes; then
|
||||||
|
showIncludes=-Wc,-showIncludes
|
||||||
|
else
|
||||||
|
showIncludes=-showIncludes
|
||||||
|
fi
|
||||||
|
"$@" $showIncludes > "$tmpdepfile"
|
||||||
|
stat=$?
|
||||||
|
grep -v '^Note: including file: ' "$tmpdepfile"
|
||||||
|
if test "$stat" = 0; then :
|
||||||
|
else
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
rm -f "$depfile"
|
||||||
|
echo "$object : \\" > "$depfile"
|
||||||
|
# The first sed program below extracts the file names and escapes
|
||||||
|
# backslashes for cygpath. The second sed program outputs the file
|
||||||
|
# name when reading, but also accumulates all include files in the
|
||||||
|
# hold buffer in order to output them again at the end. This only
|
||||||
|
# works with sed implementations that can handle large buffers.
|
||||||
|
sed < "$tmpdepfile" -n '
|
||||||
|
/^Note: including file: *\(.*\)/ {
|
||||||
|
s//\1/
|
||||||
|
s/\\/\\\\/g
|
||||||
|
p
|
||||||
|
}' | $cygpath_u | sort -u | sed -n '
|
||||||
|
s/ /\\ /g
|
||||||
|
s/\(.*\)/'"$tab"'\1 \\/p
|
||||||
|
s/.\(.*\) \\/\1:/
|
||||||
|
H
|
||||||
|
$ {
|
||||||
|
s/.*/'"$tab"'/
|
||||||
|
G
|
||||||
|
p
|
||||||
|
}' >> "$depfile"
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
msvc7msys)
|
||||||
|
# This case exists only to let depend.m4 do its work. It works by
|
||||||
|
# looking at the text of this script. This case will never be run,
|
||||||
|
# since it is checked for above.
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
|
||||||
|
#nosideeffect)
|
||||||
|
# This comment above is used by automake to tell side-effect
|
||||||
|
# dependency tracking mechanisms from slower ones.
|
||||||
|
|
||||||
|
dashmstdout)
|
||||||
|
# Important note: in order to support this mode, a compiler *must*
|
||||||
|
# always write the preprocessed file to stdout, regardless of -o.
|
||||||
|
"$@" || exit $?
|
||||||
|
|
||||||
|
# Remove the call to Libtool.
|
||||||
|
if test "$libtool" = yes; then
|
||||||
|
while test "X$1" != 'X--mode=compile'; do
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
shift
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Remove '-o $object'.
|
||||||
|
IFS=" "
|
||||||
|
for arg
|
||||||
|
do
|
||||||
|
case $arg in
|
||||||
|
-o)
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
$object)
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
set fnord "$@" "$arg"
|
||||||
|
shift # fnord
|
||||||
|
shift # $arg
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
test -z "$dashmflag" && dashmflag=-M
|
||||||
|
# Require at least two characters before searching for ':'
|
||||||
|
# in the target name. This is to cope with DOS-style filenames:
|
||||||
|
# a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
|
||||||
|
"$@" $dashmflag |
|
||||||
|
sed 's:^['"$tab"' ]*[^:'"$tab"' ][^:][^:]*\:['"$tab"' ]*:'"$object"'\: :' > "$tmpdepfile"
|
||||||
|
rm -f "$depfile"
|
||||||
|
cat < "$tmpdepfile" > "$depfile"
|
||||||
|
tr ' ' "$nl" < "$tmpdepfile" | \
|
||||||
|
## Some versions of the HPUX 10.20 sed can't process this invocation
|
||||||
|
## correctly. Breaking it into two sed invocations is a workaround.
|
||||||
|
sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
dashXmstdout)
|
||||||
|
# This case only exists to satisfy depend.m4. It is never actually
|
||||||
|
# run, as this mode is specially recognized in the preamble.
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
|
||||||
|
makedepend)
|
||||||
|
"$@" || exit $?
|
||||||
|
# Remove any Libtool call
|
||||||
|
if test "$libtool" = yes; then
|
||||||
|
while test "X$1" != 'X--mode=compile'; do
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
shift
|
||||||
|
fi
|
||||||
|
# X makedepend
|
||||||
|
shift
|
||||||
|
cleared=no eat=no
|
||||||
|
for arg
|
||||||
|
do
|
||||||
|
case $cleared in
|
||||||
|
no)
|
||||||
|
set ""; shift
|
||||||
|
cleared=yes ;;
|
||||||
|
esac
|
||||||
|
if test $eat = yes; then
|
||||||
|
eat=no
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
case "$arg" in
|
||||||
|
-D*|-I*)
|
||||||
|
set fnord "$@" "$arg"; shift ;;
|
||||||
|
# Strip any option that makedepend may not understand. Remove
|
||||||
|
# the object too, otherwise makedepend will parse it as a source file.
|
||||||
|
-arch)
|
||||||
|
eat=yes ;;
|
||||||
|
-*|$object)
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
set fnord "$@" "$arg"; shift ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
obj_suffix=`echo "$object" | sed 's/^.*\././'`
|
||||||
|
touch "$tmpdepfile"
|
||||||
|
${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
|
||||||
|
rm -f "$depfile"
|
||||||
|
# makedepend may prepend the VPATH from the source file name to the object.
|
||||||
|
# No need to regex-escape $object, excess matching of '.' is harmless.
|
||||||
|
sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
|
||||||
|
sed '1,2d' "$tmpdepfile" | tr ' ' "$nl" | \
|
||||||
|
## Some versions of the HPUX 10.20 sed can't process this invocation
|
||||||
|
## correctly. Breaking it into two sed invocations is a workaround.
|
||||||
|
sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
|
||||||
|
rm -f "$tmpdepfile" "$tmpdepfile".bak
|
||||||
|
;;
|
||||||
|
|
||||||
|
cpp)
|
||||||
|
# Important note: in order to support this mode, a compiler *must*
|
||||||
|
# always write the preprocessed file to stdout.
|
||||||
|
"$@" || exit $?
|
||||||
|
|
||||||
|
# Remove the call to Libtool.
|
||||||
|
if test "$libtool" = yes; then
|
||||||
|
while test "X$1" != 'X--mode=compile'; do
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
shift
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Remove '-o $object'.
|
||||||
|
IFS=" "
|
||||||
|
for arg
|
||||||
|
do
|
||||||
|
case $arg in
|
||||||
|
-o)
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
$object)
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
set fnord "$@" "$arg"
|
||||||
|
shift # fnord
|
||||||
|
shift # $arg
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
"$@" -E |
|
||||||
|
sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
|
||||||
|
-e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
|
||||||
|
sed '$ s: \\$::' > "$tmpdepfile"
|
||||||
|
rm -f "$depfile"
|
||||||
|
echo "$object : \\" > "$depfile"
|
||||||
|
cat < "$tmpdepfile" >> "$depfile"
|
||||||
|
sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
msvisualcpp)
|
||||||
|
# Important note: in order to support this mode, a compiler *must*
|
||||||
|
# always write the preprocessed file to stdout.
|
||||||
|
"$@" || exit $?
|
||||||
|
|
||||||
|
# Remove the call to Libtool.
|
||||||
|
if test "$libtool" = yes; then
|
||||||
|
while test "X$1" != 'X--mode=compile'; do
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
shift
|
||||||
|
fi
|
||||||
|
|
||||||
|
IFS=" "
|
||||||
|
for arg
|
||||||
|
do
|
||||||
|
case "$arg" in
|
||||||
|
-o)
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
$object)
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
"-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
|
||||||
|
set fnord "$@"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
set fnord "$@" "$arg"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
"$@" -E 2>/dev/null |
|
||||||
|
sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
|
||||||
|
rm -f "$depfile"
|
||||||
|
echo "$object : \\" > "$depfile"
|
||||||
|
sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
|
||||||
|
echo "$tab" >> "$depfile"
|
||||||
|
sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
msvcmsys)
|
||||||
|
# This case exists only to let depend.m4 do its work. It works by
|
||||||
|
# looking at the text of this script. This case will never be run,
|
||||||
|
# since it is checked for above.
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
|
||||||
|
none)
|
||||||
|
exec "$@"
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
echo "Unknown depmode $depmode" 1>&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
exit 0
|
||||||
|
|
||||||
|
# Local Variables:
|
||||||
|
# mode: shell-script
|
||||||
|
# sh-indentation: 2
|
||||||
|
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||||
|
# time-stamp-start: "scriptversion="
|
||||||
|
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||||
|
# time-stamp-time-zone: "UTC"
|
||||||
|
# time-stamp-end: "; # UTC"
|
||||||
|
# End:
|
1724
Frameworks/Opus/Opus/opus/doc/Doxyfile.in
Normal file
1724
Frameworks/Opus/Opus/opus/doc/Doxyfile.in
Normal file
File diff suppressed because it is too large
Load diff
43
Frameworks/Opus/Opus/opus/doc/Makefile.am
Normal file
43
Frameworks/Opus/Opus/opus/doc/Makefile.am
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
## Process this file with automake to produce Makefile.in
|
||||||
|
|
||||||
|
DOCINPUTS = $(top_srcdir)/include/opus.h \
|
||||||
|
$(top_srcdir)/include/opus_multistream.h \
|
||||||
|
$(top_srcdir)/include/opus_defines.h \
|
||||||
|
$(top_srcdir)/include/opus_types.h \
|
||||||
|
$(top_srcdir)/include/opus_custom.h \
|
||||||
|
$(top_srcdir)/doc/header.html \
|
||||||
|
$(top_srcdir)/doc/footer.html \
|
||||||
|
$(top_srcdir)/doc/customdoxygen.css
|
||||||
|
|
||||||
|
EXTRA_DIST = customdoxygen.css Doxyfile.in footer.html header.html opus_logo.svg
|
||||||
|
|
||||||
|
|
||||||
|
if HAVE_DOXYGEN
|
||||||
|
|
||||||
|
all-local: doxygen-build.stamp
|
||||||
|
|
||||||
|
doxygen-build.stamp: Doxyfile $(DOCINPUTS)
|
||||||
|
doxygen
|
||||||
|
touch $@
|
||||||
|
|
||||||
|
install-data-local:
|
||||||
|
$(INSTALL) -d $(DESTDIR)$(docdir)/html/search
|
||||||
|
for f in `find html -type f \! -name "installdox"`; do \
|
||||||
|
$(INSTALL_DATA) $$f $(DESTDIR)$(docdir)/$$f; \
|
||||||
|
done
|
||||||
|
|
||||||
|
$(INSTALL) -d $(DESTDIR)$(mandir)/man3
|
||||||
|
cd man && find man3 -type f -name opus_*.3 \
|
||||||
|
-exec $(INSTALL_DATA) \{} $(DESTDIR)$(mandir)/man3 \;
|
||||||
|
|
||||||
|
clean-local:
|
||||||
|
$(RM) -r html
|
||||||
|
$(RM) -r latex
|
||||||
|
$(RM) -r man
|
||||||
|
$(RM) doxygen-build.stamp
|
||||||
|
|
||||||
|
uninstall-local:
|
||||||
|
$(RM) -r $(DESTDIR)$(docdir)/html
|
||||||
|
$(RM) $(DESTDIR)$(mandir)/man3/opus_*.3 $(DESTDIR)$(mandir)/man3/opus.h.3
|
||||||
|
|
||||||
|
endif
|
442
Frameworks/Opus/Opus/opus/doc/Makefile.in
Normal file
442
Frameworks/Opus/Opus/opus/doc/Makefile.in
Normal file
|
@ -0,0 +1,442 @@
|
||||||
|
# Makefile.in generated by automake 1.11.6 from Makefile.am.
|
||||||
|
# @configure_input@
|
||||||
|
|
||||||
|
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
|
||||||
|
# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
|
||||||
|
# Foundation, Inc.
|
||||||
|
# This Makefile.in is free software; the Free Software Foundation
|
||||||
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
# with or without modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
||||||
|
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||||
|
# PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
@SET_MAKE@
|
||||||
|
VPATH = @srcdir@
|
||||||
|
am__make_dryrun = \
|
||||||
|
{ \
|
||||||
|
am__dry=no; \
|
||||||
|
case $$MAKEFLAGS in \
|
||||||
|
*\\[\ \ ]*) \
|
||||||
|
echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
|
||||||
|
| grep '^AM OK$$' >/dev/null || am__dry=yes;; \
|
||||||
|
*) \
|
||||||
|
for am__flg in $$MAKEFLAGS; do \
|
||||||
|
case $$am__flg in \
|
||||||
|
*=*|--*) ;; \
|
||||||
|
*n*) am__dry=yes; break;; \
|
||||||
|
esac; \
|
||||||
|
done;; \
|
||||||
|
esac; \
|
||||||
|
test $$am__dry = yes; \
|
||||||
|
}
|
||||||
|
pkgdatadir = $(datadir)/@PACKAGE@
|
||||||
|
pkgincludedir = $(includedir)/@PACKAGE@
|
||||||
|
pkglibdir = $(libdir)/@PACKAGE@
|
||||||
|
pkglibexecdir = $(libexecdir)/@PACKAGE@
|
||||||
|
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
|
||||||
|
install_sh_DATA = $(install_sh) -c -m 644
|
||||||
|
install_sh_PROGRAM = $(install_sh) -c
|
||||||
|
install_sh_SCRIPT = $(install_sh) -c
|
||||||
|
INSTALL_HEADER = $(INSTALL_DATA)
|
||||||
|
transform = $(program_transform_name)
|
||||||
|
NORMAL_INSTALL = :
|
||||||
|
PRE_INSTALL = :
|
||||||
|
POST_INSTALL = :
|
||||||
|
NORMAL_UNINSTALL = :
|
||||||
|
PRE_UNINSTALL = :
|
||||||
|
POST_UNINSTALL = :
|
||||||
|
build_triplet = @build@
|
||||||
|
host_triplet = @host@
|
||||||
|
subdir = doc
|
||||||
|
DIST_COMMON = $(srcdir)/Doxyfile.in $(srcdir)/Makefile.am \
|
||||||
|
$(srcdir)/Makefile.in
|
||||||
|
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||||
|
am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
|
||||||
|
$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
|
||||||
|
$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
|
||||||
|
$(top_srcdir)/configure.ac
|
||||||
|
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||||
|
$(ACLOCAL_M4)
|
||||||
|
mkinstalldirs = $(install_sh) -d
|
||||||
|
CONFIG_HEADER = $(top_builddir)/config.h
|
||||||
|
CONFIG_CLEAN_FILES = Doxyfile
|
||||||
|
CONFIG_CLEAN_VPATH_FILES =
|
||||||
|
AM_V_GEN = $(am__v_GEN_@AM_V@)
|
||||||
|
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
|
||||||
|
am__v_GEN_0 = @echo " GEN " $@;
|
||||||
|
AM_V_at = $(am__v_at_@AM_V@)
|
||||||
|
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
|
||||||
|
am__v_at_0 = @
|
||||||
|
SOURCES =
|
||||||
|
DIST_SOURCES =
|
||||||
|
am__can_run_installinfo = \
|
||||||
|
case $$AM_UPDATE_INFO_DIR in \
|
||||||
|
n|no|NO) false;; \
|
||||||
|
*) (install-info --version) >/dev/null 2>&1;; \
|
||||||
|
esac
|
||||||
|
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||||
|
ACLOCAL = @ACLOCAL@
|
||||||
|
AMTAR = @AMTAR@
|
||||||
|
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
|
||||||
|
AR = @AR@
|
||||||
|
AUTOCONF = @AUTOCONF@
|
||||||
|
AUTOHEADER = @AUTOHEADER@
|
||||||
|
AUTOMAKE = @AUTOMAKE@
|
||||||
|
AWK = @AWK@
|
||||||
|
CC = @CC@
|
||||||
|
CCDEPMODE = @CCDEPMODE@
|
||||||
|
CFLAGS = @CFLAGS@
|
||||||
|
CPP = @CPP@
|
||||||
|
CPPFLAGS = @CPPFLAGS@
|
||||||
|
CYGPATH_W = @CYGPATH_W@
|
||||||
|
DEFS = @DEFS@
|
||||||
|
DEPDIR = @DEPDIR@
|
||||||
|
DLLTOOL = @DLLTOOL@
|
||||||
|
DSYMUTIL = @DSYMUTIL@
|
||||||
|
DUMPBIN = @DUMPBIN@
|
||||||
|
ECHO_C = @ECHO_C@
|
||||||
|
ECHO_N = @ECHO_N@
|
||||||
|
ECHO_T = @ECHO_T@
|
||||||
|
EGREP = @EGREP@
|
||||||
|
EXEEXT = @EXEEXT@
|
||||||
|
FGREP = @FGREP@
|
||||||
|
GREP = @GREP@
|
||||||
|
HAVE_DOXYGEN = @HAVE_DOXYGEN@
|
||||||
|
INSTALL = @INSTALL@
|
||||||
|
INSTALL_DATA = @INSTALL_DATA@
|
||||||
|
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||||
|
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||||
|
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||||
|
LD = @LD@
|
||||||
|
LDFLAGS = @LDFLAGS@
|
||||||
|
LIBM = @LIBM@
|
||||||
|
LIBOBJS = @LIBOBJS@
|
||||||
|
LIBS = @LIBS@
|
||||||
|
LIBTOOL = @LIBTOOL@
|
||||||
|
LIPO = @LIPO@
|
||||||
|
LN_S = @LN_S@
|
||||||
|
LTLIBOBJS = @LTLIBOBJS@
|
||||||
|
MAINT = @MAINT@
|
||||||
|
MAKEINFO = @MAKEINFO@
|
||||||
|
MANIFEST_TOOL = @MANIFEST_TOOL@
|
||||||
|
MKDIR_P = @MKDIR_P@
|
||||||
|
NM = @NM@
|
||||||
|
NMEDIT = @NMEDIT@
|
||||||
|
OBJDUMP = @OBJDUMP@
|
||||||
|
OBJEXT = @OBJEXT@
|
||||||
|
OPUS_LT_AGE = @OPUS_LT_AGE@
|
||||||
|
OPUS_LT_CURRENT = @OPUS_LT_CURRENT@
|
||||||
|
OPUS_LT_REVISION = @OPUS_LT_REVISION@
|
||||||
|
OTOOL = @OTOOL@
|
||||||
|
OTOOL64 = @OTOOL64@
|
||||||
|
PACKAGE = @PACKAGE@
|
||||||
|
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
||||||
|
PACKAGE_NAME = @PACKAGE_NAME@
|
||||||
|
PACKAGE_STRING = @PACKAGE_STRING@
|
||||||
|
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
||||||
|
PACKAGE_URL = @PACKAGE_URL@
|
||||||
|
PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||||
|
PATH_SEPARATOR = @PATH_SEPARATOR@
|
||||||
|
PC_BUILD = @PC_BUILD@
|
||||||
|
PC_LIBM = @PC_LIBM@
|
||||||
|
RANLIB = @RANLIB@
|
||||||
|
SED = @SED@
|
||||||
|
SET_MAKE = @SET_MAKE@
|
||||||
|
SHELL = @SHELL@
|
||||||
|
SIZE16 = @SIZE16@
|
||||||
|
SIZE32 = @SIZE32@
|
||||||
|
STRIP = @STRIP@
|
||||||
|
SYMBOL_VISIBILITY = @SYMBOL_VISIBILITY@
|
||||||
|
VERSION = @VERSION@
|
||||||
|
abs_builddir = @abs_builddir@
|
||||||
|
abs_srcdir = @abs_srcdir@
|
||||||
|
abs_top_builddir = @abs_top_builddir@
|
||||||
|
abs_top_srcdir = @abs_top_srcdir@
|
||||||
|
ac_ct_AR = @ac_ct_AR@
|
||||||
|
ac_ct_CC = @ac_ct_CC@
|
||||||
|
ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
|
||||||
|
am__include = @am__include@
|
||||||
|
am__leading_dot = @am__leading_dot@
|
||||||
|
am__quote = @am__quote@
|
||||||
|
am__tar = @am__tar@
|
||||||
|
am__untar = @am__untar@
|
||||||
|
bindir = @bindir@
|
||||||
|
build = @build@
|
||||||
|
build_alias = @build_alias@
|
||||||
|
build_cpu = @build_cpu@
|
||||||
|
build_os = @build_os@
|
||||||
|
build_vendor = @build_vendor@
|
||||||
|
builddir = @builddir@
|
||||||
|
datadir = @datadir@
|
||||||
|
datarootdir = @datarootdir@
|
||||||
|
docdir = @docdir@
|
||||||
|
dvidir = @dvidir@
|
||||||
|
exec_prefix = @exec_prefix@
|
||||||
|
host = @host@
|
||||||
|
host_alias = @host_alias@
|
||||||
|
host_cpu = @host_cpu@
|
||||||
|
host_os = @host_os@
|
||||||
|
host_vendor = @host_vendor@
|
||||||
|
htmldir = @htmldir@
|
||||||
|
includedir = @includedir@
|
||||||
|
infodir = @infodir@
|
||||||
|
install_sh = @install_sh@
|
||||||
|
libdir = @libdir@
|
||||||
|
libexecdir = @libexecdir@
|
||||||
|
localedir = @localedir@
|
||||||
|
localstatedir = @localstatedir@
|
||||||
|
mandir = @mandir@
|
||||||
|
mkdir_p = @mkdir_p@
|
||||||
|
oldincludedir = @oldincludedir@
|
||||||
|
pdfdir = @pdfdir@
|
||||||
|
prefix = @prefix@
|
||||||
|
program_transform_name = @program_transform_name@
|
||||||
|
psdir = @psdir@
|
||||||
|
sbindir = @sbindir@
|
||||||
|
sharedstatedir = @sharedstatedir@
|
||||||
|
srcdir = @srcdir@
|
||||||
|
sysconfdir = @sysconfdir@
|
||||||
|
target_alias = @target_alias@
|
||||||
|
top_build_prefix = @top_build_prefix@
|
||||||
|
top_builddir = @top_builddir@
|
||||||
|
top_srcdir = @top_srcdir@
|
||||||
|
DOCINPUTS = $(top_srcdir)/include/opus.h \
|
||||||
|
$(top_srcdir)/include/opus_multistream.h \
|
||||||
|
$(top_srcdir)/include/opus_defines.h \
|
||||||
|
$(top_srcdir)/include/opus_types.h \
|
||||||
|
$(top_srcdir)/include/opus_custom.h \
|
||||||
|
$(top_srcdir)/doc/header.html \
|
||||||
|
$(top_srcdir)/doc/footer.html \
|
||||||
|
$(top_srcdir)/doc/customdoxygen.css
|
||||||
|
|
||||||
|
EXTRA_DIST = customdoxygen.css Doxyfile.in footer.html header.html opus_logo.svg
|
||||||
|
all: all-am
|
||||||
|
|
||||||
|
.SUFFIXES:
|
||||||
|
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
|
||||||
|
@for dep in $?; do \
|
||||||
|
case '$(am__configure_deps)' in \
|
||||||
|
*$$dep*) \
|
||||||
|
( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
|
||||||
|
&& { if test -f $@; then exit 0; else break; fi; }; \
|
||||||
|
exit 1;; \
|
||||||
|
esac; \
|
||||||
|
done; \
|
||||||
|
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/Makefile'; \
|
||||||
|
$(am__cd) $(top_srcdir) && \
|
||||||
|
$(AUTOMAKE) --gnu doc/Makefile
|
||||||
|
.PRECIOUS: Makefile
|
||||||
|
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||||
|
@case '$?' in \
|
||||||
|
*config.status*) \
|
||||||
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
|
||||||
|
*) \
|
||||||
|
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
|
||||||
|
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
|
||||||
|
esac;
|
||||||
|
|
||||||
|
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
||||||
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||||
|
|
||||||
|
$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
|
||||||
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||||
|
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
|
||||||
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||||
|
$(am__aclocal_m4_deps):
|
||||||
|
Doxyfile: $(top_builddir)/config.status $(srcdir)/Doxyfile.in
|
||||||
|
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
|
||||||
|
|
||||||
|
mostlyclean-libtool:
|
||||||
|
-rm -f *.lo
|
||||||
|
|
||||||
|
clean-libtool:
|
||||||
|
-rm -rf .libs _libs
|
||||||
|
tags: TAGS
|
||||||
|
TAGS:
|
||||||
|
|
||||||
|
ctags: CTAGS
|
||||||
|
CTAGS:
|
||||||
|
|
||||||
|
|
||||||
|
distdir: $(DISTFILES)
|
||||||
|
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||||
|
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||||
|
list='$(DISTFILES)'; \
|
||||||
|
dist_files=`for file in $$list; do echo $$file; done | \
|
||||||
|
sed -e "s|^$$srcdirstrip/||;t" \
|
||||||
|
-e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
|
||||||
|
case $$dist_files in \
|
||||||
|
*/*) $(MKDIR_P) `echo "$$dist_files" | \
|
||||||
|
sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
|
||||||
|
sort -u` ;; \
|
||||||
|
esac; \
|
||||||
|
for file in $$dist_files; do \
|
||||||
|
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
|
||||||
|
if test -d $$d/$$file; then \
|
||||||
|
dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
|
||||||
|
if test -d "$(distdir)/$$file"; then \
|
||||||
|
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
||||||
|
fi; \
|
||||||
|
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
|
||||||
|
cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
|
||||||
|
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
||||||
|
fi; \
|
||||||
|
cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
|
||||||
|
else \
|
||||||
|
test -f "$(distdir)/$$file" \
|
||||||
|
|| cp -p $$d/$$file "$(distdir)/$$file" \
|
||||||
|
|| exit 1; \
|
||||||
|
fi; \
|
||||||
|
done
|
||||||
|
check-am: all-am
|
||||||
|
check: check-am
|
||||||
|
@HAVE_DOXYGEN_FALSE@all-local:
|
||||||
|
all-am: Makefile all-local
|
||||||
|
installdirs:
|
||||||
|
install: install-am
|
||||||
|
install-exec: install-exec-am
|
||||||
|
install-data: install-data-am
|
||||||
|
uninstall: uninstall-am
|
||||||
|
|
||||||
|
install-am: all-am
|
||||||
|
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
|
||||||
|
|
||||||
|
installcheck: installcheck-am
|
||||||
|
install-strip:
|
||||||
|
if test -z '$(STRIP)'; then \
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||||
|
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||||
|
install; \
|
||||||
|
else \
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||||
|
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||||
|
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
|
||||||
|
fi
|
||||||
|
mostlyclean-generic:
|
||||||
|
|
||||||
|
clean-generic:
|
||||||
|
|
||||||
|
distclean-generic:
|
||||||
|
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
||||||
|
-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
|
||||||
|
|
||||||
|
maintainer-clean-generic:
|
||||||
|
@echo "This command is intended for maintainers to use"
|
||||||
|
@echo "it deletes files that may require special tools to rebuild."
|
||||||
|
@HAVE_DOXYGEN_FALSE@uninstall-local:
|
||||||
|
@HAVE_DOXYGEN_FALSE@install-data-local:
|
||||||
|
@HAVE_DOXYGEN_FALSE@clean-local:
|
||||||
|
clean: clean-am
|
||||||
|
|
||||||
|
clean-am: clean-generic clean-libtool clean-local mostlyclean-am
|
||||||
|
|
||||||
|
distclean: distclean-am
|
||||||
|
-rm -f Makefile
|
||||||
|
distclean-am: clean-am distclean-generic
|
||||||
|
|
||||||
|
dvi: dvi-am
|
||||||
|
|
||||||
|
dvi-am:
|
||||||
|
|
||||||
|
html: html-am
|
||||||
|
|
||||||
|
html-am:
|
||||||
|
|
||||||
|
info: info-am
|
||||||
|
|
||||||
|
info-am:
|
||||||
|
|
||||||
|
install-data-am: install-data-local
|
||||||
|
|
||||||
|
install-dvi: install-dvi-am
|
||||||
|
|
||||||
|
install-dvi-am:
|
||||||
|
|
||||||
|
install-exec-am:
|
||||||
|
|
||||||
|
install-html: install-html-am
|
||||||
|
|
||||||
|
install-html-am:
|
||||||
|
|
||||||
|
install-info: install-info-am
|
||||||
|
|
||||||
|
install-info-am:
|
||||||
|
|
||||||
|
install-man:
|
||||||
|
|
||||||
|
install-pdf: install-pdf-am
|
||||||
|
|
||||||
|
install-pdf-am:
|
||||||
|
|
||||||
|
install-ps: install-ps-am
|
||||||
|
|
||||||
|
install-ps-am:
|
||||||
|
|
||||||
|
installcheck-am:
|
||||||
|
|
||||||
|
maintainer-clean: maintainer-clean-am
|
||||||
|
-rm -f Makefile
|
||||||
|
maintainer-clean-am: distclean-am maintainer-clean-generic
|
||||||
|
|
||||||
|
mostlyclean: mostlyclean-am
|
||||||
|
|
||||||
|
mostlyclean-am: mostlyclean-generic mostlyclean-libtool
|
||||||
|
|
||||||
|
pdf: pdf-am
|
||||||
|
|
||||||
|
pdf-am:
|
||||||
|
|
||||||
|
ps: ps-am
|
||||||
|
|
||||||
|
ps-am:
|
||||||
|
|
||||||
|
uninstall-am: uninstall-local
|
||||||
|
|
||||||
|
.MAKE: install-am install-strip
|
||||||
|
|
||||||
|
.PHONY: all all-am all-local check check-am clean clean-generic \
|
||||||
|
clean-libtool clean-local distclean distclean-generic \
|
||||||
|
distclean-libtool distdir dvi dvi-am html html-am info info-am \
|
||||||
|
install install-am install-data install-data-am \
|
||||||
|
install-data-local install-dvi install-dvi-am install-exec \
|
||||||
|
install-exec-am install-html install-html-am install-info \
|
||||||
|
install-info-am install-man install-pdf install-pdf-am \
|
||||||
|
install-ps install-ps-am install-strip installcheck \
|
||||||
|
installcheck-am installdirs maintainer-clean \
|
||||||
|
maintainer-clean-generic mostlyclean mostlyclean-generic \
|
||||||
|
mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \
|
||||||
|
uninstall-local
|
||||||
|
|
||||||
|
|
||||||
|
@HAVE_DOXYGEN_TRUE@all-local: doxygen-build.stamp
|
||||||
|
|
||||||
|
@HAVE_DOXYGEN_TRUE@doxygen-build.stamp: Doxyfile $(DOCINPUTS)
|
||||||
|
@HAVE_DOXYGEN_TRUE@ doxygen
|
||||||
|
@HAVE_DOXYGEN_TRUE@ touch $@
|
||||||
|
|
||||||
|
@HAVE_DOXYGEN_TRUE@install-data-local:
|
||||||
|
@HAVE_DOXYGEN_TRUE@ $(INSTALL) -d $(DESTDIR)$(docdir)/html/search
|
||||||
|
@HAVE_DOXYGEN_TRUE@ for f in `find html -type f \! -name "installdox"`; do \
|
||||||
|
@HAVE_DOXYGEN_TRUE@ $(INSTALL_DATA) $$f $(DESTDIR)$(docdir)/$$f; \
|
||||||
|
@HAVE_DOXYGEN_TRUE@ done
|
||||||
|
|
||||||
|
@HAVE_DOXYGEN_TRUE@ $(INSTALL) -d $(DESTDIR)$(mandir)/man3
|
||||||
|
@HAVE_DOXYGEN_TRUE@ cd man && find man3 -type f -name opus_*.3 \
|
||||||
|
@HAVE_DOXYGEN_TRUE@ -exec $(INSTALL_DATA) \{} $(DESTDIR)$(mandir)/man3 \;
|
||||||
|
|
||||||
|
@HAVE_DOXYGEN_TRUE@clean-local:
|
||||||
|
@HAVE_DOXYGEN_TRUE@ $(RM) -r html
|
||||||
|
@HAVE_DOXYGEN_TRUE@ $(RM) -r latex
|
||||||
|
@HAVE_DOXYGEN_TRUE@ $(RM) -r man
|
||||||
|
@HAVE_DOXYGEN_TRUE@ $(RM) doxygen-build.stamp
|
||||||
|
|
||||||
|
@HAVE_DOXYGEN_TRUE@uninstall-local:
|
||||||
|
@HAVE_DOXYGEN_TRUE@ $(RM) -r $(DESTDIR)$(docdir)/html
|
||||||
|
@HAVE_DOXYGEN_TRUE@ $(RM) $(DESTDIR)$(mandir)/man3/opus_*.3 $(DESTDIR)$(mandir)/man3/opus.h.3
|
||||||
|
|
||||||
|
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
||||||
|
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||||
|
.NOEXPORT:
|
1012
Frameworks/Opus/Opus/opus/doc/customdoxygen.css
Normal file
1012
Frameworks/Opus/Opus/opus/doc/customdoxygen.css
Normal file
File diff suppressed because it is too large
Load diff
20
Frameworks/Opus/Opus/opus/doc/footer.html
Normal file
20
Frameworks/Opus/Opus/opus/doc/footer.html
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
<!--BEGIN GENERATE_TREEVIEW-->
|
||||||
|
<li class="footer">$generatedby
|
||||||
|
<a href="http://www.doxygen.org/index.html">
|
||||||
|
<img class="footer" src="doxygen.png" alt="doxygen"/></a> $doxygenversion </li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<!--END GENERATE_TREEVIEW-->
|
||||||
|
<!--BEGIN !GENERATE_TREEVIEW-->
|
||||||
|
<hr class="footer"/>
|
||||||
|
<table width="100%"><tbody><tr><td>
|
||||||
|
For more information visit the <a href="http://opus-codec.org">Opus Website</a>.
|
||||||
|
</td><td><address class="footer"><small>
|
||||||
|
©$year<br/>
|
||||||
|
$generatedby <a href="http://www.doxygen.org/index.html">
|
||||||
|
<!--<img class="footer" src="$relpath$doxygen.png" alt="doxygen"/>-->doxygen
|
||||||
|
</a> $doxygenversion
|
||||||
|
</small></address></tr></tbody></table>
|
||||||
|
<!--END !GENERATE_TREEVIEW-->
|
||||||
|
</body>
|
||||||
|
</html>
|
54
Frameworks/Opus/Opus/opus/doc/header.html
Normal file
54
Frameworks/Opus/Opus/opus/doc/header.html
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
|
||||||
|
<!--BEGIN PROJECT_NAME--><title>$projectname: $title</title><!--END PROJECT_NAME-->
|
||||||
|
<!--BEGIN !PROJECT_NAME--><title>$title</title><!--END !PROJECT_NAME-->
|
||||||
|
<link href="$relpath$tabs.css" rel="stylesheet" type="text/css"/>
|
||||||
|
<link href="$relpath$customdoxygen.css" rel="stylesheet" type="text/css" />
|
||||||
|
$treeview
|
||||||
|
$search
|
||||||
|
$mathjax
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="top"><!-- do not remove this div! -->
|
||||||
|
|
||||||
|
<!--BEGIN TITLEAREA-->
|
||||||
|
<div id="titlearea">
|
||||||
|
<table cellspacing="0" cellpadding="0">
|
||||||
|
<tbody>
|
||||||
|
<tr style="height: 64px;">
|
||||||
|
<!--BEGIN PROJECT_LOGO-->
|
||||||
|
<td id="projectlogo"><img alt="Logo" src="$relpath$$projectlogo"/></td>
|
||||||
|
<!--END PROJECT_LOGO-->
|
||||||
|
<!--BEGIN PROJECT_NAME-->
|
||||||
|
<td style="padding-left: 0.5em;">
|
||||||
|
<div id="projectname"><img src="opus_logo.svg" width=112 height=64 alt="Opus"/><!--$projectname--></div>
|
||||||
|
</td>
|
||||||
|
<td><table style="padding-left: 0.5em;" cellspacing="0" cellpadding="0"><tbody>
|
||||||
|
<tr><td>
|
||||||
|
<!--BEGIN PROJECT_BRIEF--><div id="projectbrief">$projectbrief</div><!--END PROJECT_BRIEF-->
|
||||||
|
</td></tr>
|
||||||
|
<td><!--BEGIN PROJECT_NUMBER--><span id="projectnumber">$projectnumber</span><!--END PROJECT_NUMBER-->
|
||||||
|
</td></tr>
|
||||||
|
</table>
|
||||||
|
</td>
|
||||||
|
<!--END PROJECT_NAME-->
|
||||||
|
<!--BEGIN !PROJECT_NAME-->
|
||||||
|
<!--BEGIN PROJECT_BRIEF-->
|
||||||
|
<td style="padding-left: 0.5em;">
|
||||||
|
<div id="projectbrief">$projectbrief</div>
|
||||||
|
</td>
|
||||||
|
<!--END PROJECT_BRIEF-->
|
||||||
|
<!--END !PROJECT_NAME-->
|
||||||
|
<!--BEGIN DISABLE_INDEX-->
|
||||||
|
<!--BEGIN SEARCHENGINE-->
|
||||||
|
<td>$searchbox</td>
|
||||||
|
<!--END SEARCHENGINE-->
|
||||||
|
<!--END DISABLE_INDEX-->
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<!--END TITLEAREA-->
|
157
Frameworks/Opus/Opus/opus/doc/opus_logo.svg
Normal file
157
Frameworks/Opus/Opus/opus/doc/opus_logo.svg
Normal file
|
@ -0,0 +1,157 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
version="1.1"
|
||||||
|
x="0px"
|
||||||
|
y="0px"
|
||||||
|
width="360"
|
||||||
|
height="205"
|
||||||
|
viewBox="-72 -23.757 360 205"
|
||||||
|
overflow="visible"
|
||||||
|
enable-background="new -72 -23.757 504 252"
|
||||||
|
xml:space="preserve"
|
||||||
|
id="svg2"
|
||||||
|
style="overflow:visible">
|
||||||
|
<defs
|
||||||
|
id="defs4">
|
||||||
|
<linearGradient
|
||||||
|
xlink:href="#SVGID_1_"
|
||||||
|
id="linearGradient3027"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="194.53169"
|
||||||
|
y1="95.107399"
|
||||||
|
x2="194.53169"
|
||||||
|
y2="9.9475983e-14" /><linearGradient
|
||||||
|
xlink:href="#SVGID_2_"
|
||||||
|
id="linearGradient3029"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="229.61819"
|
||||||
|
y1="116.208"
|
||||||
|
x2="229.61819"
|
||||||
|
y2="164.46291" /><linearGradient
|
||||||
|
xlink:href="#SVGID_3_"
|
||||||
|
id="linearGradient3031"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="43.9897"
|
||||||
|
y1="115.4395"
|
||||||
|
x2="43.9897"
|
||||||
|
y2="165.2314" /><linearGradient
|
||||||
|
xlink:href="#SVGID_4_"
|
||||||
|
id="linearGradient3033"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="311.2847"
|
||||||
|
y1="115.7188"
|
||||||
|
x2="311.2847"
|
||||||
|
y2="165.2822" /><linearGradient
|
||||||
|
xlink:href="#SVGID_5_"
|
||||||
|
id="linearGradient3035"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="129.1987"
|
||||||
|
y1="115.5791"
|
||||||
|
x2="129.1987"
|
||||||
|
y2="204.4863" /></defs>
|
||||||
|
<linearGradient
|
||||||
|
id="SVGID_1_"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="194.53169"
|
||||||
|
y1="95.107399"
|
||||||
|
x2="194.53169"
|
||||||
|
y2="9.9475983e-14">
|
||||||
|
<stop
|
||||||
|
offset="0.0056"
|
||||||
|
style="stop-color:#8E8E8E"
|
||||||
|
id="stop7" />
|
||||||
|
<stop
|
||||||
|
offset="1"
|
||||||
|
style="stop-color:#B5B5B5"
|
||||||
|
id="stop9" />
|
||||||
|
</linearGradient>
|
||||||
|
|
||||||
|
<linearGradient
|
||||||
|
id="SVGID_2_"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="229.61819"
|
||||||
|
y1="116.208"
|
||||||
|
x2="229.61819"
|
||||||
|
y2="164.46291">
|
||||||
|
<stop
|
||||||
|
offset="0.0056"
|
||||||
|
style="stop-color:#494748"
|
||||||
|
id="stop14" />
|
||||||
|
<stop
|
||||||
|
offset="1"
|
||||||
|
style="stop-color:#000000"
|
||||||
|
id="stop16" />
|
||||||
|
</linearGradient>
|
||||||
|
|
||||||
|
<linearGradient
|
||||||
|
id="SVGID_3_"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="43.9897"
|
||||||
|
y1="115.4395"
|
||||||
|
x2="43.9897"
|
||||||
|
y2="165.2314">
|
||||||
|
<stop
|
||||||
|
offset="0.0056"
|
||||||
|
style="stop-color:#494748"
|
||||||
|
id="stop21" />
|
||||||
|
<stop
|
||||||
|
offset="1"
|
||||||
|
style="stop-color:#000000"
|
||||||
|
id="stop23" />
|
||||||
|
</linearGradient>
|
||||||
|
|
||||||
|
<linearGradient
|
||||||
|
id="SVGID_4_"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="311.2847"
|
||||||
|
y1="115.7188"
|
||||||
|
x2="311.2847"
|
||||||
|
y2="165.2822">
|
||||||
|
<stop
|
||||||
|
offset="0.0056"
|
||||||
|
style="stop-color:#494748"
|
||||||
|
id="stop28" />
|
||||||
|
<stop
|
||||||
|
offset="1"
|
||||||
|
style="stop-color:#000000"
|
||||||
|
id="stop30" />
|
||||||
|
</linearGradient>
|
||||||
|
|
||||||
|
<linearGradient
|
||||||
|
id="SVGID_5_"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="129.1987"
|
||||||
|
y1="115.5791"
|
||||||
|
x2="129.1987"
|
||||||
|
y2="204.4863">
|
||||||
|
<stop
|
||||||
|
offset="0.0056"
|
||||||
|
style="stop-color:#494748"
|
||||||
|
id="stop35" />
|
||||||
|
<stop
|
||||||
|
offset="1"
|
||||||
|
style="stop-color:#000000"
|
||||||
|
id="stop37" />
|
||||||
|
</linearGradient>
|
||||||
|
<g
|
||||||
|
id="g3020"
|
||||||
|
transform="translate(-72.001783,-23.243)"><path
|
||||||
|
id="path11"
|
||||||
|
d="M 257.355,13.996 C 249.943,7.826 238.533,3.695 223.153,1.588 l -11.302,35.935 c -0.244,1.318 -0.664,2.815 -1.315,4.54 -1.153,2.883 -2.542,5.258 -4.174,7.127 -1.634,1.874 -3.463,3.335 -5.489,4.4 -2.028,1.059 -4.232,1.79 -6.614,2.193 -2.382,0.4 -4.847,0.526 -7.393,0.378 -2.549,-0.148 -4.717,-0.495 -6.501,-1.042 -1.786,-0.546 -3.428,-1.452 -4.925,-2.72 -1.107,-1.245 -1.751,-2.878 -1.927,-4.902 -0.177,-2.024 0.313,-4.527 1.471,-7.509 1.035,-2.592 2.345,-4.852 3.933,-6.771 1.587,-1.921 3.443,-3.411 5.565,-4.467 2.027,-1.059 4.206,-1.768 6.539,-2.125 2.327,-0.354 4.915,-0.448 7.756,-0.283 2.352,0.139 4.542,0.485 6.574,1.048 0.964,0.265 1.808,0.613 2.542,1.033 L 216.57,0.832 c -2.142,-0.202 -4.333,-0.379 -6.609,-0.51 -21.901,-1.279 -40.308,1.251 -55.229,7.576 -14.918,6.33 -24.865,15.715 -29.833,28.154 -1.491,3.814 -2.292,7.408 -2.41,10.785 l -0.01,-0.005 c -1.426,24.463 14.295,38.245 24.007,44.373 3.897,2.609 7.362,3.901 7.362,3.901 l 4.451,-14.225 1.316,-3.496 c 5.859,1.108 12.375,1.879 19.573,2.298 22.053,1.286 40.539,-1.232 55.458,-7.564 14.916,-6.325 24.78,-15.638 29.591,-27.942 4.806,-12.295 2.514,-22.357 -6.882,-30.181 z"
|
||||||
|
style="fill:url(#linearGradient3027)"/><path
|
||||||
|
id="path18"
|
||||||
|
d="m 269.531,139.499 c -2.511,7.718 -8.23,13.807 -17.156,18.27 -8.926,4.463 -20.223,6.694 -33.891,6.694 -13.484,0 -23.292,-2.208 -29.43,-6.626 -6.136,-4.415 -7.904,-10.528 -5.299,-18.338 l 7.53,-23.291 h 25.663 l -7.252,23.151 c -0.931,2.883 -1.232,5.278 -0.906,7.183 0.326,1.907 1.046,3.417 2.162,4.533 1.394,1.113 2.95,1.88 4.672,2.299 1.72,0.419 3.788,0.629 6.207,0.629 2.417,0 4.742,-0.255 6.974,-0.769 2.231,-0.51 4.275,-1.323 6.138,-2.438 1.858,-1.116 3.508,-2.602 4.951,-4.463 1.44,-1.859 2.626,-4.186 3.557,-6.974 l 7.532,-23.151 h 25.663 l -7.115,23.291 z"
|
||||||
|
style="fill:url(#linearGradient3029)"/><path
|
||||||
|
id="path25"
|
||||||
|
d="m 86.875,140.404 c 2.51,-7.717 0.743,-13.808 -5.301,-18.271 -6.044,-4.463 -15.899,-6.694 -29.567,-6.694 -13.483,0 -24.686,2.21 -33.611,6.625 -8.928,4.417 -14.693,10.53 -17.295,18.34 -2.51,7.72 -0.722,13.786 5.37,18.201 6.089,4.418 15.922,6.626 29.498,6.626 13.575,0 24.826,-2.208 33.753,-6.626 8.924,-4.415 14.642,-10.481 17.153,-18.201 z m -26.082,0.14 c -0.931,2.978 -2.069,5.3 -3.417,6.974 -1.349,1.675 -3.046,3.116 -5.09,4.323 -1.768,1.116 -3.765,1.883 -5.997,2.302 -2.232,0.419 -4.463,0.627 -6.696,0.627 -2.697,0 -4.999,-0.23 -6.903,-0.696 -1.907,-0.465 -3.417,-1.256 -4.533,-2.371 -1.21,-1.116 -1.906,-2.626 -2.092,-4.533 -0.188,-1.904 0.14,-4.114 0.977,-6.625 0.929,-2.88 2.161,-5.275 3.696,-7.183 1.534,-1.904 3.229,-3.417 5.09,-4.533 2.138,-1.115 4.206,-1.882 6.207,-2.301 1.999,-0.419 4.207,-0.627 6.625,-0.627 2.416,0 4.603,0.257 6.555,0.767 1.953,0.512 3.486,1.325 4.603,2.44 1.115,1.116 1.789,2.605 2.021,4.463 0.231,1.86 -0.117,4.185 -1.046,6.973 z"
|
||||||
|
style="fill:url(#linearGradient3031)"/><path
|
||||||
|
id="path32"
|
||||||
|
d="m 310.14,126.807 c 2.928,-0.698 9.041,-1.046 18.339,-1.046 4.833,0 9.506,0.487 14.018,1.465 4.508,0.976 9.042,2.209 13.598,3.696 L 360,119.066 c -2.698,-0.744 -6.625,-1.487 -11.787,-2.231 -5.159,-0.744 -10.669,-1.116 -16.526,-1.116 -17.574,0 -30.405,1.513 -38.493,4.533 -8.089,3.022 -12.879,6.812 -14.366,11.366 -1.115,3.44 -0.348,6.346 2.302,8.717 2.65,2.371 7.322,4.115 14.016,5.229 2.511,0.467 6.624,0.838 12.343,1.117 5.718,0.279 9.46,0.557 11.228,0.836 3.717,0.373 6.205,0.837 7.461,1.396 1.254,0.558 1.695,1.394 1.325,2.511 -0.467,1.303 -1.976,2.279 -4.533,2.928 -2.559,0.652 -6.3,0.977 -11.227,0.977 -0.77,0 -1.513,-0.003 -2.241,-0.007 -1.846,-0.101 -3.858,-0.272 -5.791,-0.476 -2.06,-0.22 -4.118,-0.485 -6.162,-0.795 -4.089,-0.62 -8.132,-1.419 -12.058,-2.439 -3.921,-1.022 -7.734,-2.267 -11.26,-3.813 -0.474,-0.208 -0.932,-0.433 -1.394,-0.654 -2.476,3.979 -5.905,7.451 -10.27,10.396 2.259,1.085 4.539,1.976 6.807,2.742 4.52,1.506 9.034,2.52 13.525,3.266 4.494,0.741 8.969,1.203 13.431,1.472 2.231,0.133 4.459,0.215 6.691,0.248 1.966,0.026 3.882,0.02 5.902,-0.045 12.216,-0.072 22.318,-1.53 30.294,-4.386 8.18,-2.929 13.062,-6.81 14.644,-11.645 1.116,-3.349 0.441,-6.138 -2.021,-8.369 -2.466,-2.231 -6.813,-3.857 -13.041,-4.882 -2.883,-0.371 -5.768,-0.719 -8.647,-1.046 -2.884,-0.324 -5.533,-0.628 -7.951,-0.906 -9.577,-0.65 -14.924,-1.255 -16.039,-1.813 -1.116,-0.558 -1.488,-1.394 -1.116,-2.511 0.467,-1.209 2.164,-2.163 5.094,-2.859 z"
|
||||||
|
style="fill:url(#linearGradient3033)"/><path
|
||||||
|
id="path39"
|
||||||
|
d="m 172.838,122.204 c -6.091,-4.415 -15.924,-6.625 -29.499,-6.625 -13.577,0 -24.826,2.21 -33.751,6.625 -8.926,4.417 -14.4,10.415 -16.911,18.131 l -0.105,0.349 -12.692,39.19 c -5.26,17.631 17.526,24.612 17.526,24.612 l 7.58,-24.612 0.656,-2.106 c 0.592,-1.982 1.192,-3.964 1.781,-5.948 l 1.686,-5.531 c 0.603,-1.832 1.207,-3.662 1.85,-5.481 l 3.979,-10.875 1.993,-5.436 1.429,-3.718 c 0.051,-0.172 0.099,-0.339 0.155,-0.514 0.836,-2.509 1.953,-4.718 3.347,-6.624 1.396,-1.904 3.069,-3.417 5.021,-4.533 1.859,-1.115 3.882,-1.904 6.067,-2.371 2.183,-0.464 4.625,-0.696 7.322,-0.696 2.231,0 4.325,0.208 6.277,0.627 1.952,0.419 3.438,1.186 4.463,2.301 1.301,1.209 2.068,2.65 2.3,4.323 0.231,1.675 -0.117,3.999 -1.046,6.974 -0.931,2.79 -2.116,5.116 -3.557,6.974 -1.442,1.862 -3.091,3.348 -4.951,4.464 -1.861,1.115 -3.905,1.931 -6.136,2.44 -2.231,0.512 -4.558,0.767 -6.973,0.767 -2.419,0 -4.487,-0.208 -6.207,-0.627 -1.721,-0.419 -3.326,-1.186 -4.812,-2.302 -0.112,-0.112 -0.201,-0.247 -0.305,-0.366 l -3.674,10.658 c -0.206,0.613 -0.403,1.228 -0.601,1.842 3.479,0.708 7.507,1.13 12.111,1.256 13.668,0 24.965,-2.231 33.893,-6.694 8.926,-4.464 14.643,-10.552 17.154,-18.271 2.511,-7.719 0.718,-13.786 -5.37,-18.203 z"
|
||||||
|
style="fill:url(#linearGradient3035)"/></g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 8.4 KiB |
906
Frameworks/Opus/Opus/opus/include/opus.h
Normal file
906
Frameworks/Opus/Opus/opus/include/opus.h
Normal file
|
@ -0,0 +1,906 @@
|
||||||
|
/* Copyright (c) 2010-2011 Xiph.Org Foundation, Skype Limited
|
||||||
|
Written by Jean-Marc Valin and Koen Vos */
|
||||||
|
/*
|
||||||
|
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.h
|
||||||
|
* @brief Opus reference implementation API
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef OPUS_H
|
||||||
|
#define OPUS_H
|
||||||
|
|
||||||
|
#include "opus_types.h"
|
||||||
|
#include "opus_defines.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @mainpage Opus
|
||||||
|
*
|
||||||
|
* The Opus codec is designed for interactive speech and audio transmission over the Internet.
|
||||||
|
* It is designed by the IETF Codec Working Group and incorporates technology from
|
||||||
|
* Skype's SILK codec and Xiph.Org's CELT codec.
|
||||||
|
*
|
||||||
|
* The Opus codec is designed to handle a wide range of interactive audio applications,
|
||||||
|
* including Voice over IP, videoconferencing, in-game chat, and even remote live music
|
||||||
|
* performances. It can scale from low bit-rate narrowband speech to very high quality
|
||||||
|
* stereo music. Its main features are:
|
||||||
|
|
||||||
|
* @li Sampling rates from 8 to 48 kHz
|
||||||
|
* @li Bit-rates from 6 kb/s to 510 kb/s
|
||||||
|
* @li Support for both constant bit-rate (CBR) and variable bit-rate (VBR)
|
||||||
|
* @li Audio bandwidth from narrowband to full-band
|
||||||
|
* @li Support for speech and music
|
||||||
|
* @li Support for mono and stereo
|
||||||
|
* @li Support for multichannel (up to 255 channels)
|
||||||
|
* @li Frame sizes from 2.5 ms to 60 ms
|
||||||
|
* @li Good loss robustness and packet loss concealment (PLC)
|
||||||
|
* @li Floating point and fixed-point implementation
|
||||||
|
*
|
||||||
|
* Documentation sections:
|
||||||
|
* @li @ref opus_encoder
|
||||||
|
* @li @ref opus_decoder
|
||||||
|
* @li @ref opus_repacketizer
|
||||||
|
* @li @ref opus_multistream
|
||||||
|
* @li @ref opus_libinfo
|
||||||
|
* @li @ref opus_custom
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup opus_encoder Opus Encoder
|
||||||
|
* @{
|
||||||
|
*
|
||||||
|
* @brief This page describes the process and functions used to encode Opus.
|
||||||
|
*
|
||||||
|
* Since Opus is a stateful codec, the encoding process starts with creating an encoder
|
||||||
|
* state. This can be done with:
|
||||||
|
*
|
||||||
|
* @code
|
||||||
|
* int error;
|
||||||
|
* OpusEncoder *enc;
|
||||||
|
* enc = opus_encoder_create(Fs, channels, application, &error);
|
||||||
|
* @endcode
|
||||||
|
*
|
||||||
|
* From this point, @c enc can be used for encoding an audio stream. An encoder state
|
||||||
|
* @b must @b not be used for more than one stream at the same time. Similarly, the encoder
|
||||||
|
* state @b must @b not be re-initialized for each frame.
|
||||||
|
*
|
||||||
|
* While opus_encoder_create() allocates memory for the state, it's also possible
|
||||||
|
* to initialize pre-allocated memory:
|
||||||
|
*
|
||||||
|
* @code
|
||||||
|
* int size;
|
||||||
|
* int error;
|
||||||
|
* OpusEncoder *enc;
|
||||||
|
* size = opus_encoder_get_size(channels);
|
||||||
|
* enc = malloc(size);
|
||||||
|
* error = opus_encoder_init(enc, Fs, channels, application);
|
||||||
|
* @endcode
|
||||||
|
*
|
||||||
|
* where opus_encoder_get_size() returns the required size for the encoder state. Note that
|
||||||
|
* future versions of this code may change the size, so no assuptions should be made about it.
|
||||||
|
*
|
||||||
|
* The encoder state is always continuous in memory and only a shallow copy is sufficient
|
||||||
|
* to copy it (e.g. memcpy())
|
||||||
|
*
|
||||||
|
* It is possible to change some of the encoder's settings using the opus_encoder_ctl()
|
||||||
|
* interface. All these settings already default to the recommended value, so they should
|
||||||
|
* only be changed when necessary. The most common settings one may want to change are:
|
||||||
|
*
|
||||||
|
* @code
|
||||||
|
* opus_encoder_ctl(enc, OPUS_SET_BITRATE(bitrate));
|
||||||
|
* opus_encoder_ctl(enc, OPUS_SET_COMPLEXITY(complexity));
|
||||||
|
* opus_encoder_ctl(enc, OPUS_SET_SIGNAL(signal_type));
|
||||||
|
* @endcode
|
||||||
|
*
|
||||||
|
* where
|
||||||
|
*
|
||||||
|
* @arg bitrate is in bits per second (b/s)
|
||||||
|
* @arg complexity is a value from 1 to 10, where 1 is the lowest complexity and 10 is the highest
|
||||||
|
* @arg signal_type is either OPUS_AUTO (default), OPUS_SIGNAL_VOICE, or OPUS_SIGNAL_MUSIC
|
||||||
|
*
|
||||||
|
* See @ref opus_encoderctls and @ref opus_genericctls for a complete list of parameters that can be set or queried. Most parameters can be set or changed at any time during a stream.
|
||||||
|
*
|
||||||
|
* To encode a frame, opus_encode() or opus_encode_float() must be called with exactly one frame (2.5, 5, 10, 20, 40 or 60 ms) of audio data:
|
||||||
|
* @code
|
||||||
|
* len = opus_encode(enc, audio_frame, frame_size, packet, max_packet);
|
||||||
|
* @endcode
|
||||||
|
*
|
||||||
|
* where
|
||||||
|
* <ul>
|
||||||
|
* <li>audio_frame is the audio data in opus_int16 (or float for opus_encode_float())</li>
|
||||||
|
* <li>frame_size is the duration of the frame in samples (per channel)</li>
|
||||||
|
* <li>packet is the byte array to which the compressed data is written</li>
|
||||||
|
* <li>max_packet is the maximum number of bytes that can be written in the packet (4000 bytes is recommended).
|
||||||
|
* Do not use max_packet to control VBR target bitrate, instead use the #OPUS_SET_BITRATE CTL.</li>
|
||||||
|
* </ul>
|
||||||
|
*
|
||||||
|
* opus_encode() and opus_encode_float() return the number of bytes actually written to the packet.
|
||||||
|
* The return value <b>can be negative</b>, which indicates that an error has occurred. If the return value
|
||||||
|
* is 1 byte, then the packet does not need to be transmitted (DTX).
|
||||||
|
*
|
||||||
|
* Once the encoder state if no longer needed, it can be destroyed with
|
||||||
|
*
|
||||||
|
* @code
|
||||||
|
* opus_encoder_destroy(enc);
|
||||||
|
* @endcode
|
||||||
|
*
|
||||||
|
* If the encoder was created with opus_encoder_init() rather than opus_encoder_create(),
|
||||||
|
* then no action is required aside from potentially freeing the memory that was manually
|
||||||
|
* allocated for it (calling free(enc) for the example above)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** Opus encoder state.
|
||||||
|
* This contains the complete state of an Opus encoder.
|
||||||
|
* It is position independent and can be freely copied.
|
||||||
|
* @see opus_encoder_create,opus_encoder_init
|
||||||
|
*/
|
||||||
|
typedef struct OpusEncoder OpusEncoder;
|
||||||
|
|
||||||
|
/** Gets the size of an <code>OpusEncoder</code> structure.
|
||||||
|
* @param[in] channels <tt>int</tt>: Number of channels.
|
||||||
|
* This must be 1 or 2.
|
||||||
|
* @returns The size in bytes.
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_encoder_get_size(int channels);
|
||||||
|
|
||||||
|
/**
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** Allocates and initializes an encoder state.
|
||||||
|
* There are three coding modes:
|
||||||
|
*
|
||||||
|
* @ref OPUS_APPLICATION_VOIP gives best quality at a given bitrate for voice
|
||||||
|
* signals. It enhances the input signal by high-pass filtering and
|
||||||
|
* emphasizing formants and harmonics. Optionally it includes in-band
|
||||||
|
* forward error correction to protect against packet loss. Use this
|
||||||
|
* mode for typical VoIP applications. Because of the enhancement,
|
||||||
|
* even at high bitrates the output may sound different from the input.
|
||||||
|
*
|
||||||
|
* @ref OPUS_APPLICATION_AUDIO gives best quality at a given bitrate for most
|
||||||
|
* non-voice signals like music. Use this mode for music and mixed
|
||||||
|
* (music/voice) content, broadcast, and applications requiring less
|
||||||
|
* than 15 ms of coding delay.
|
||||||
|
*
|
||||||
|
* @ref OPUS_APPLICATION_RESTRICTED_LOWDELAY configures low-delay mode that
|
||||||
|
* disables the speech-optimized mode in exchange for slightly reduced delay.
|
||||||
|
* This mode can only be set on an newly initialized or freshly reset encoder
|
||||||
|
* because it changes the codec delay.
|
||||||
|
*
|
||||||
|
* This is useful when the caller knows that the speech-optimized modes will not be needed (use with caution).
|
||||||
|
* @param [in] Fs <tt>opus_int32</tt>: Sampling rate of input signal (Hz)
|
||||||
|
* This must be one of 8000, 12000, 16000,
|
||||||
|
* 24000, or 48000.
|
||||||
|
* @param [in] channels <tt>int</tt>: Number of channels (1 or 2) in input signal
|
||||||
|
* @param [in] application <tt>int</tt>: Coding mode (@ref OPUS_APPLICATION_VOIP/@ref OPUS_APPLICATION_AUDIO/@ref OPUS_APPLICATION_RESTRICTED_LOWDELAY)
|
||||||
|
* @param [out] error <tt>int*</tt>: @ref opus_errorcodes
|
||||||
|
* @note Regardless of the sampling rate and number channels selected, the Opus encoder
|
||||||
|
* can switch to a lower audio bandwidth or number of channels if the bitrate
|
||||||
|
* selected is too low. This also means that it is safe to always use 48 kHz stereo input
|
||||||
|
* and let the encoder optimize the encoding.
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusEncoder *opus_encoder_create(
|
||||||
|
opus_int32 Fs,
|
||||||
|
int channels,
|
||||||
|
int application,
|
||||||
|
int *error
|
||||||
|
);
|
||||||
|
|
||||||
|
/** Initializes a previously allocated encoder state
|
||||||
|
* The memory pointed to by st must be at least the size returned by opus_encoder_get_size().
|
||||||
|
* This is intended for applications which use their own allocator instead of malloc.
|
||||||
|
* @see opus_encoder_create(),opus_encoder_get_size()
|
||||||
|
* To reset a previously initialized state, use the #OPUS_RESET_STATE CTL.
|
||||||
|
* @param [in] st <tt>OpusEncoder*</tt>: Encoder state
|
||||||
|
* @param [in] Fs <tt>opus_int32</tt>: Sampling rate of input signal (Hz)
|
||||||
|
* This must be one of 8000, 12000, 16000,
|
||||||
|
* 24000, or 48000.
|
||||||
|
* @param [in] channels <tt>int</tt>: Number of channels (1 or 2) in input signal
|
||||||
|
* @param [in] application <tt>int</tt>: Coding mode (OPUS_APPLICATION_VOIP/OPUS_APPLICATION_AUDIO/OPUS_APPLICATION_RESTRICTED_LOWDELAY)
|
||||||
|
* @retval #OPUS_OK Success or @ref opus_errorcodes
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT int opus_encoder_init(
|
||||||
|
OpusEncoder *st,
|
||||||
|
opus_int32 Fs,
|
||||||
|
int channels,
|
||||||
|
int application
|
||||||
|
) OPUS_ARG_NONNULL(1);
|
||||||
|
|
||||||
|
/** Encodes an Opus frame.
|
||||||
|
* @param [in] st <tt>OpusEncoder*</tt>: Encoder state
|
||||||
|
* @param [in] pcm <tt>opus_int16*</tt>: Input signal (interleaved if 2 channels). length is frame_size*channels*sizeof(opus_int16)
|
||||||
|
* @param [in] frame_size <tt>int</tt>: 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 <tt>unsigned char*</tt>: Output payload.
|
||||||
|
* This must contain storage for at
|
||||||
|
* least \a max_data_bytes.
|
||||||
|
* @param [in] max_data_bytes <tt>opus_int32</tt>: 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 opus_int32 opus_encode(
|
||||||
|
OpusEncoder *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 an Opus frame from floating point input.
|
||||||
|
* @param [in] st <tt>OpusEncoder*</tt>: Encoder state
|
||||||
|
* @param [in] pcm <tt>float*</tt>: Input in float format (interleaved if 2 channels), 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.
|
||||||
|
* length is frame_size*channels*sizeof(float)
|
||||||
|
* @param [in] frame_size <tt>int</tt>: 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 <tt>unsigned char*</tt>: Output payload.
|
||||||
|
* This must contain storage for at
|
||||||
|
* least \a max_data_bytes.
|
||||||
|
* @param [in] max_data_bytes <tt>opus_int32</tt>: 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 opus_int32 opus_encode_float(
|
||||||
|
OpusEncoder *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 <code>OpusEncoder</code> allocated by opus_encoder_create().
|
||||||
|
* @param[in] st <tt>OpusEncoder*</tt>: State to be freed.
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT void opus_encoder_destroy(OpusEncoder *st);
|
||||||
|
|
||||||
|
/** Perform a CTL function on an Opus encoder.
|
||||||
|
*
|
||||||
|
* Generally the request and subsequent arguments are generated
|
||||||
|
* by a convenience macro.
|
||||||
|
* @param st <tt>OpusEncoder*</tt>: Encoder state.
|
||||||
|
* @param request This and all remaining parameters should be replaced by one
|
||||||
|
* of the convenience macros in @ref opus_genericctls or
|
||||||
|
* @ref opus_encoderctls.
|
||||||
|
* @see opus_genericctls
|
||||||
|
* @see opus_encoderctls
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT int opus_encoder_ctl(OpusEncoder *st, int request, ...) OPUS_ARG_NONNULL(1);
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
/** @defgroup opus_decoder Opus Decoder
|
||||||
|
* @{
|
||||||
|
*
|
||||||
|
* @brief This page describes the process and functions used to decode Opus.
|
||||||
|
*
|
||||||
|
* The decoding process also starts with creating a decoder
|
||||||
|
* state. This can be done with:
|
||||||
|
* @code
|
||||||
|
* int error;
|
||||||
|
* OpusDecoder *dec;
|
||||||
|
* dec = opus_decoder_create(Fs, channels, &error);
|
||||||
|
* @endcode
|
||||||
|
* where
|
||||||
|
* @li Fs is the sampling rate and must be 8000, 12000, 16000, 24000, or 48000
|
||||||
|
* @li channels is the number of channels (1 or 2)
|
||||||
|
* @li error will hold the error code in case of failure (or #OPUS_OK on success)
|
||||||
|
* @li the return value is a newly created decoder state to be used for decoding
|
||||||
|
*
|
||||||
|
* While opus_decoder_create() allocates memory for the state, it's also possible
|
||||||
|
* to initialize pre-allocated memory:
|
||||||
|
* @code
|
||||||
|
* int size;
|
||||||
|
* int error;
|
||||||
|
* OpusDecoder *dec;
|
||||||
|
* size = opus_decoder_get_size(channels);
|
||||||
|
* dec = malloc(size);
|
||||||
|
* error = opus_decoder_init(dec, Fs, channels);
|
||||||
|
* @endcode
|
||||||
|
* where opus_decoder_get_size() returns the required size for the decoder state. Note that
|
||||||
|
* future versions of this code may change the size, so no assuptions should be made about it.
|
||||||
|
*
|
||||||
|
* The decoder state is always continuous in memory and only a shallow copy is sufficient
|
||||||
|
* to copy it (e.g. memcpy())
|
||||||
|
*
|
||||||
|
* To decode a frame, opus_decode() or opus_decode_float() must be called with a packet of compressed audio data:
|
||||||
|
* @code
|
||||||
|
* frame_size = opus_decode(dec, packet, len, decoded, max_size, 0);
|
||||||
|
* @endcode
|
||||||
|
* where
|
||||||
|
*
|
||||||
|
* @li packet is the byte array containing the compressed data
|
||||||
|
* @li len is the exact number of bytes contained in the packet
|
||||||
|
* @li decoded is the decoded audio data in opus_int16 (or float for opus_decode_float())
|
||||||
|
* @li max_size is the max duration of the frame in samples (per channel) that can fit into the decoded_frame array
|
||||||
|
*
|
||||||
|
* opus_decode() and opus_decode_float() return the number of samples (per channel) decoded from the packet.
|
||||||
|
* If that value is negative, then an error has occurred. This can occur if the packet is corrupted or if the audio
|
||||||
|
* buffer is too small to hold the decoded audio.
|
||||||
|
*
|
||||||
|
* Opus is a stateful codec with overlapping blocks and as a result Opus
|
||||||
|
* packets are not coded independently of each other. Packets must be
|
||||||
|
* passed into the decoder serially and in the correct order for a correct
|
||||||
|
* decode. Lost packets can be replaced with loss concealment by calling
|
||||||
|
* the decoder with a null pointer and zero length for the missing packet.
|
||||||
|
*
|
||||||
|
* A single codec state may only be accessed from a single thread at
|
||||||
|
* a time and any required locking must be performed by the caller. Separate
|
||||||
|
* streams must be decoded with separate decoder states and can be decoded
|
||||||
|
* in parallel unless the library was compiled with NONTHREADSAFE_PSEUDOSTACK
|
||||||
|
* defined.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** Opus decoder state.
|
||||||
|
* This contains the complete state of an Opus decoder.
|
||||||
|
* It is position independent and can be freely copied.
|
||||||
|
* @see opus_decoder_create,opus_decoder_init
|
||||||
|
*/
|
||||||
|
typedef struct OpusDecoder OpusDecoder;
|
||||||
|
|
||||||
|
/** Gets the size of an <code>OpusDecoder</code> structure.
|
||||||
|
* @param [in] channels <tt>int</tt>: Number of channels.
|
||||||
|
* This must be 1 or 2.
|
||||||
|
* @returns The size in bytes.
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_decoder_get_size(int channels);
|
||||||
|
|
||||||
|
/** Allocates and initializes a decoder state.
|
||||||
|
* @param [in] Fs <tt>opus_int32</tt>: Sample rate to decode at (Hz).
|
||||||
|
* This must be one of 8000, 12000, 16000,
|
||||||
|
* 24000, or 48000.
|
||||||
|
* @param [in] channels <tt>int</tt>: Number of channels (1 or 2) to decode
|
||||||
|
* @param [out] error <tt>int*</tt>: #OPUS_OK Success or @ref opus_errorcodes
|
||||||
|
*
|
||||||
|
* Internally Opus stores data at 48000 Hz, so that should be the default
|
||||||
|
* value for Fs. However, the decoder can efficiently decode to buffers
|
||||||
|
* at 8, 12, 16, and 24 kHz so if for some reason the caller cannot use
|
||||||
|
* data at the full sample rate, or knows the compressed data doesn't
|
||||||
|
* use the full frequency range, it can request decoding at a reduced
|
||||||
|
* rate. Likewise, the decoder is capable of filling in either mono or
|
||||||
|
* interleaved stereo pcm buffers, at the caller's request.
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusDecoder *opus_decoder_create(
|
||||||
|
opus_int32 Fs,
|
||||||
|
int channels,
|
||||||
|
int *error
|
||||||
|
);
|
||||||
|
|
||||||
|
/** Initializes a previously allocated decoder state.
|
||||||
|
* The state must be at least the size returned by opus_decoder_get_size().
|
||||||
|
* This is intended for applications which use their own allocator instead of malloc. @see opus_decoder_create,opus_decoder_get_size
|
||||||
|
* To reset a previously initialized state, use the #OPUS_RESET_STATE CTL.
|
||||||
|
* @param [in] st <tt>OpusDecoder*</tt>: Decoder state.
|
||||||
|
* @param [in] Fs <tt>opus_int32</tt>: Sampling rate to decode to (Hz).
|
||||||
|
* This must be one of 8000, 12000, 16000,
|
||||||
|
* 24000, or 48000.
|
||||||
|
* @param [in] channels <tt>int</tt>: Number of channels (1 or 2) to decode
|
||||||
|
* @retval #OPUS_OK Success or @ref opus_errorcodes
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT int opus_decoder_init(
|
||||||
|
OpusDecoder *st,
|
||||||
|
opus_int32 Fs,
|
||||||
|
int channels
|
||||||
|
) OPUS_ARG_NONNULL(1);
|
||||||
|
|
||||||
|
/** Decode an Opus packet.
|
||||||
|
* @param [in] st <tt>OpusDecoder*</tt>: Decoder state
|
||||||
|
* @param [in] data <tt>char*</tt>: Input payload. Use a NULL pointer to indicate packet loss
|
||||||
|
* @param [in] len <tt>opus_int32</tt>: Number of bytes in payload*
|
||||||
|
* @param [out] pcm <tt>opus_int16*</tt>: Output signal (interleaved if 2 channels). length
|
||||||
|
* is frame_size*channels*sizeof(opus_int16)
|
||||||
|
* @param [in] frame_size Number of samples per channel of available space in \a pcm.
|
||||||
|
* If this is less than the maximum packet duration (120ms; 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 <b>must</b> be a multiple of 2.5 ms.
|
||||||
|
* @param [in] decode_fec <tt>int</tt>: 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 decoded samples or @ref opus_errorcodes
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_decode(
|
||||||
|
OpusDecoder *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 an Opus packet with floating point output.
|
||||||
|
* @param [in] st <tt>OpusDecoder*</tt>: Decoder state
|
||||||
|
* @param [in] data <tt>char*</tt>: Input payload. Use a NULL pointer to indicate packet loss
|
||||||
|
* @param [in] len <tt>opus_int32</tt>: Number of bytes in payload
|
||||||
|
* @param [out] pcm <tt>float*</tt>: Output signal (interleaved if 2 channels). length
|
||||||
|
* is frame_size*channels*sizeof(float)
|
||||||
|
* @param [in] frame_size Number of samples per channel of available space in \a pcm.
|
||||||
|
* If this is less than the maximum packet duration (120ms; 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 <b>must</b> be a multiple of 2.5 ms.
|
||||||
|
* @param [in] decode_fec <tt>int</tt>: 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 decoded samples or @ref opus_errorcodes
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_decode_float(
|
||||||
|
OpusDecoder *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 an Opus decoder.
|
||||||
|
*
|
||||||
|
* Generally the request and subsequent arguments are generated
|
||||||
|
* by a convenience macro.
|
||||||
|
* @param st <tt>OpusDecoder*</tt>: Decoder state.
|
||||||
|
* @param request This and all remaining parameters should be replaced by one
|
||||||
|
* of the convenience macros in @ref opus_genericctls or
|
||||||
|
* @ref opus_decoderctls.
|
||||||
|
* @see opus_genericctls
|
||||||
|
* @see opus_decoderctls
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT int opus_decoder_ctl(OpusDecoder *st, int request, ...) OPUS_ARG_NONNULL(1);
|
||||||
|
|
||||||
|
/** Frees an <code>OpusDecoder</code> allocated by opus_decoder_create().
|
||||||
|
* @param[in] st <tt>OpusDecoder*</tt>: State to be freed.
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT void opus_decoder_destroy(OpusDecoder *st);
|
||||||
|
|
||||||
|
/** Parse an opus packet into one or more frames.
|
||||||
|
* Opus_decode will perform this operation internally so most applications do
|
||||||
|
* not need to use this function.
|
||||||
|
* This function does not copy the frames, the returned pointers are pointers into
|
||||||
|
* the input packet.
|
||||||
|
* @param [in] data <tt>char*</tt>: Opus packet to be parsed
|
||||||
|
* @param [in] len <tt>opus_int32</tt>: size of data
|
||||||
|
* @param [out] out_toc <tt>char*</tt>: TOC pointer
|
||||||
|
* @param [out] frames <tt>char*[48]</tt> encapsulated frames
|
||||||
|
* @param [out] size <tt>opus_int16[48]</tt> sizes of the encapsulated frames
|
||||||
|
* @param [out] payload_offset <tt>int*</tt>: returns the position of the payload within the packet (in bytes)
|
||||||
|
* @returns number of frames
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT int opus_packet_parse(
|
||||||
|
const unsigned char *data,
|
||||||
|
opus_int32 len,
|
||||||
|
unsigned char *out_toc,
|
||||||
|
const unsigned char *frames[48],
|
||||||
|
opus_int16 size[48],
|
||||||
|
int *payload_offset
|
||||||
|
) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4);
|
||||||
|
|
||||||
|
/** Gets the bandwidth of an Opus packet.
|
||||||
|
* @param [in] data <tt>char*</tt>: Opus packet
|
||||||
|
* @retval OPUS_BANDWIDTH_NARROWBAND Narrowband (4kHz bandpass)
|
||||||
|
* @retval OPUS_BANDWIDTH_MEDIUMBAND Mediumband (6kHz bandpass)
|
||||||
|
* @retval OPUS_BANDWIDTH_WIDEBAND Wideband (8kHz bandpass)
|
||||||
|
* @retval OPUS_BANDWIDTH_SUPERWIDEBAND Superwideband (12kHz bandpass)
|
||||||
|
* @retval OPUS_BANDWIDTH_FULLBAND Fullband (20kHz bandpass)
|
||||||
|
* @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_get_bandwidth(const unsigned char *data) OPUS_ARG_NONNULL(1);
|
||||||
|
|
||||||
|
/** Gets the number of samples per frame from an Opus packet.
|
||||||
|
* @param [in] data <tt>char*</tt>: Opus packet.
|
||||||
|
* This must contain at least one byte of
|
||||||
|
* data.
|
||||||
|
* @param [in] Fs <tt>opus_int32</tt>: Sampling rate in Hz.
|
||||||
|
* This must be a multiple of 400, or
|
||||||
|
* inaccurate results will be returned.
|
||||||
|
* @returns Number of samples per frame.
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_get_samples_per_frame(const unsigned char *data, opus_int32 Fs) OPUS_ARG_NONNULL(1);
|
||||||
|
|
||||||
|
/** Gets the number of channels from an Opus packet.
|
||||||
|
* @param [in] data <tt>char*</tt>: Opus packet
|
||||||
|
* @returns Number of channels
|
||||||
|
* @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_get_nb_channels(const unsigned char *data) OPUS_ARG_NONNULL(1);
|
||||||
|
|
||||||
|
/** Gets the number of frames in an Opus packet.
|
||||||
|
* @param [in] packet <tt>char*</tt>: Opus packet
|
||||||
|
* @param [in] len <tt>opus_int32</tt>: Length of packet
|
||||||
|
* @returns Number of frames
|
||||||
|
* @retval OPUS_BAD_ARG Insufficient data was passed to the function
|
||||||
|
* @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_get_nb_frames(const unsigned char packet[], opus_int32 len) OPUS_ARG_NONNULL(1);
|
||||||
|
|
||||||
|
/** Gets the number of samples of an Opus packet.
|
||||||
|
* @param [in] packet <tt>char*</tt>: Opus packet
|
||||||
|
* @param [in] len <tt>opus_int32</tt>: Length of packet
|
||||||
|
* @param [in] Fs <tt>opus_int32</tt>: Sampling rate in Hz.
|
||||||
|
* This must be a multiple of 400, or
|
||||||
|
* inaccurate results will be returned.
|
||||||
|
* @returns Number of samples
|
||||||
|
* @retval OPUS_BAD_ARG Insufficient data was passed to the function
|
||||||
|
* @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_get_nb_samples(const unsigned char packet[], opus_int32 len, opus_int32 Fs) OPUS_ARG_NONNULL(1);
|
||||||
|
|
||||||
|
/** Gets the number of samples of an Opus packet.
|
||||||
|
* @param [in] dec <tt>OpusDecoder*</tt>: Decoder state
|
||||||
|
* @param [in] packet <tt>char*</tt>: Opus packet
|
||||||
|
* @param [in] len <tt>opus_int32</tt>: Length of packet
|
||||||
|
* @returns Number of samples
|
||||||
|
* @retval OPUS_BAD_ARG Insufficient data was passed to the function
|
||||||
|
* @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);
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
/** @defgroup opus_repacketizer Repacketizer
|
||||||
|
* @{
|
||||||
|
*
|
||||||
|
* The repacketizer can be used to merge multiple Opus packets into a single
|
||||||
|
* packet or alternatively to split Opus packets that have previously been
|
||||||
|
* merged. Splitting valid Opus packets is always guaranteed to succeed,
|
||||||
|
* whereas merging valid packets only succeeds if all frames have the same
|
||||||
|
* mode, bandwidth, and frame size, and when the total duration of the merged
|
||||||
|
* packet is no more than 120 ms.
|
||||||
|
* The repacketizer currently only operates on elementary Opus
|
||||||
|
* streams. It will not manipualte multistream packets successfully, except in
|
||||||
|
* the degenerate case where they consist of data from a single stream.
|
||||||
|
*
|
||||||
|
* The repacketizing process starts with creating a repacketizer state, either
|
||||||
|
* by calling opus_repacketizer_create() or by allocating the memory yourself,
|
||||||
|
* e.g.,
|
||||||
|
* @code
|
||||||
|
* OpusRepacketizer *rp;
|
||||||
|
* rp = (OpusRepacketizer*)malloc(opus_repacketizer_get_size());
|
||||||
|
* if (rp != NULL)
|
||||||
|
* opus_repacketizer_init(rp);
|
||||||
|
* @endcode
|
||||||
|
*
|
||||||
|
* Then the application should submit packets with opus_repacketizer_cat(),
|
||||||
|
* extract new packets with opus_repacketizer_out() or
|
||||||
|
* opus_repacketizer_out_range(), and then reset the state for the next set of
|
||||||
|
* input packets via opus_repacketizer_init().
|
||||||
|
*
|
||||||
|
* For example, to split a sequence of packets into individual frames:
|
||||||
|
* @code
|
||||||
|
* unsigned char *data;
|
||||||
|
* int len;
|
||||||
|
* while (get_next_packet(&data, &len))
|
||||||
|
* {
|
||||||
|
* unsigned char out[1276];
|
||||||
|
* opus_int32 out_len;
|
||||||
|
* int nb_frames;
|
||||||
|
* int err;
|
||||||
|
* int i;
|
||||||
|
* err = opus_repacketizer_cat(rp, data, len);
|
||||||
|
* if (err != OPUS_OK)
|
||||||
|
* {
|
||||||
|
* release_packet(data);
|
||||||
|
* return err;
|
||||||
|
* }
|
||||||
|
* nb_frames = opus_repacketizer_get_nb_frames(rp);
|
||||||
|
* for (i = 0; i < nb_frames; i++)
|
||||||
|
* {
|
||||||
|
* out_len = opus_repacketizer_out_range(rp, i, i+1, out, sizeof(out));
|
||||||
|
* if (out_len < 0)
|
||||||
|
* {
|
||||||
|
* release_packet(data);
|
||||||
|
* return (int)out_len;
|
||||||
|
* }
|
||||||
|
* output_next_packet(out, out_len);
|
||||||
|
* }
|
||||||
|
* opus_repacketizer_init(rp);
|
||||||
|
* release_packet(data);
|
||||||
|
* }
|
||||||
|
* @endcode
|
||||||
|
*
|
||||||
|
* Alternatively, to combine a sequence of frames into packets that each
|
||||||
|
* contain up to <code>TARGET_DURATION_MS</code> milliseconds of data:
|
||||||
|
* @code
|
||||||
|
* // The maximum number of packets with duration TARGET_DURATION_MS occurs
|
||||||
|
* // when the frame size is 2.5 ms, for a total of (TARGET_DURATION_MS*2/5)
|
||||||
|
* // packets.
|
||||||
|
* unsigned char *data[(TARGET_DURATION_MS*2/5)+1];
|
||||||
|
* opus_int32 len[(TARGET_DURATION_MS*2/5)+1];
|
||||||
|
* int nb_packets;
|
||||||
|
* unsigned char out[1277*(TARGET_DURATION_MS*2/2)];
|
||||||
|
* opus_int32 out_len;
|
||||||
|
* int prev_toc;
|
||||||
|
* nb_packets = 0;
|
||||||
|
* while (get_next_packet(data+nb_packets, len+nb_packets))
|
||||||
|
* {
|
||||||
|
* int nb_frames;
|
||||||
|
* int err;
|
||||||
|
* nb_frames = opus_packet_get_nb_frames(data[nb_packets], len[nb_packets]);
|
||||||
|
* if (nb_frames < 1)
|
||||||
|
* {
|
||||||
|
* release_packets(data, nb_packets+1);
|
||||||
|
* return nb_frames;
|
||||||
|
* }
|
||||||
|
* nb_frames += opus_repacketizer_get_nb_frames(rp);
|
||||||
|
* // If adding the next packet would exceed our target, or it has an
|
||||||
|
* // incompatible TOC sequence, output the packets we already have before
|
||||||
|
* // submitting it.
|
||||||
|
* // N.B., The nb_packets > 0 check ensures we've submitted at least one
|
||||||
|
* // packet since the last call to opus_repacketizer_init(). Otherwise a
|
||||||
|
* // single packet longer than TARGET_DURATION_MS would cause us to try to
|
||||||
|
* // output an (invalid) empty packet. It also ensures that prev_toc has
|
||||||
|
* // been set to a valid value. Additionally, len[nb_packets] > 0 is
|
||||||
|
* // guaranteed by the call to opus_packet_get_nb_frames() above, so the
|
||||||
|
* // reference to data[nb_packets][0] should be valid.
|
||||||
|
* if (nb_packets > 0 && (
|
||||||
|
* ((prev_toc & 0xFC) != (data[nb_packets][0] & 0xFC)) ||
|
||||||
|
* opus_packet_get_samples_per_frame(data[nb_packets], 48000)*nb_frames >
|
||||||
|
* TARGET_DURATION_MS*48))
|
||||||
|
* {
|
||||||
|
* out_len = opus_repacketizer_out(rp, out, sizeof(out));
|
||||||
|
* if (out_len < 0)
|
||||||
|
* {
|
||||||
|
* release_packets(data, nb_packets+1);
|
||||||
|
* return (int)out_len;
|
||||||
|
* }
|
||||||
|
* output_next_packet(out, out_len);
|
||||||
|
* opus_repacketizer_init(rp);
|
||||||
|
* release_packets(data, nb_packets);
|
||||||
|
* data[0] = data[nb_packets];
|
||||||
|
* len[0] = len[nb_packets];
|
||||||
|
* nb_packets = 0;
|
||||||
|
* }
|
||||||
|
* err = opus_repacketizer_cat(rp, data[nb_packets], len[nb_packets]);
|
||||||
|
* if (err != OPUS_OK)
|
||||||
|
* {
|
||||||
|
* release_packets(data, nb_packets+1);
|
||||||
|
* return err;
|
||||||
|
* }
|
||||||
|
* prev_toc = data[nb_packets][0];
|
||||||
|
* nb_packets++;
|
||||||
|
* }
|
||||||
|
* // Output the final, partial packet.
|
||||||
|
* if (nb_packets > 0)
|
||||||
|
* {
|
||||||
|
* out_len = opus_repacketizer_out(rp, out, sizeof(out));
|
||||||
|
* release_packets(data, nb_packets);
|
||||||
|
* if (out_len < 0)
|
||||||
|
* return (int)out_len;
|
||||||
|
* output_next_packet(out, out_len);
|
||||||
|
* }
|
||||||
|
* @endcode
|
||||||
|
*
|
||||||
|
* An alternate way of merging packets is to simply call opus_repacketizer_cat()
|
||||||
|
* unconditionally until it fails. At that point, the merged packet can be
|
||||||
|
* obtained with opus_repacketizer_out() and the input packet for which
|
||||||
|
* opus_repacketizer_cat() needs to be re-added to a newly reinitialized
|
||||||
|
* repacketizer state.
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef struct OpusRepacketizer OpusRepacketizer;
|
||||||
|
|
||||||
|
/** Gets the size of an <code>OpusRepacketizer</code> structure.
|
||||||
|
* @returns The size in bytes.
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_repacketizer_get_size(void);
|
||||||
|
|
||||||
|
/** (Re)initializes a previously allocated repacketizer state.
|
||||||
|
* The state must be at least the size returned by opus_repacketizer_get_size().
|
||||||
|
* This can be used for applications which use their own allocator instead of
|
||||||
|
* malloc().
|
||||||
|
* It must also be called to reset the queue of packets waiting to be
|
||||||
|
* repacketized, which is necessary if the maximum packet duration of 120 ms
|
||||||
|
* is reached or if you wish to submit packets with a different Opus
|
||||||
|
* configuration (coding mode, audio bandwidth, frame size, or channel count).
|
||||||
|
* Failure to do so will prevent a new packet from being added with
|
||||||
|
* opus_repacketizer_cat().
|
||||||
|
* @see opus_repacketizer_create
|
||||||
|
* @see opus_repacketizer_get_size
|
||||||
|
* @see opus_repacketizer_cat
|
||||||
|
* @param rp <tt>OpusRepacketizer*</tt>: The repacketizer state to
|
||||||
|
* (re)initialize.
|
||||||
|
* @returns A pointer to the same repacketizer state that was passed in.
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT OpusRepacketizer *opus_repacketizer_init(OpusRepacketizer *rp) OPUS_ARG_NONNULL(1);
|
||||||
|
|
||||||
|
/** Allocates memory and initializes the new repacketizer with
|
||||||
|
* opus_repacketizer_init().
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusRepacketizer *opus_repacketizer_create(void);
|
||||||
|
|
||||||
|
/** Frees an <code>OpusRepacketizer</code> allocated by
|
||||||
|
* opus_repacketizer_create().
|
||||||
|
* @param[in] rp <tt>OpusRepacketizer*</tt>: State to be freed.
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT void opus_repacketizer_destroy(OpusRepacketizer *rp);
|
||||||
|
|
||||||
|
/** Add a packet to the current repacketizer state.
|
||||||
|
* This packet must match the configuration of any packets already submitted
|
||||||
|
* for repacketization since the last call to opus_repacketizer_init().
|
||||||
|
* This means that it must have the same coding mode, audio bandwidth, frame
|
||||||
|
* size, and channel count.
|
||||||
|
* This can be checked in advance by examining the top 6 bits of the first
|
||||||
|
* byte of the packet, and ensuring they match the top 6 bits of the first
|
||||||
|
* byte of any previously submitted packet.
|
||||||
|
* The total duration of audio in the repacketizer state also must not exceed
|
||||||
|
* 120 ms, the maximum duration of a single packet, after adding this packet.
|
||||||
|
*
|
||||||
|
* The contents of the current repacketizer state can be extracted into new
|
||||||
|
* packets using opus_repacketizer_out() or opus_repacketizer_out_range().
|
||||||
|
*
|
||||||
|
* In order to add a packet with a different configuration or to add more
|
||||||
|
* audio beyond 120 ms, you must clear the repacketizer state by calling
|
||||||
|
* opus_repacketizer_init().
|
||||||
|
* If a packet is too large to add to the current repacketizer state, no part
|
||||||
|
* of it is added, even if it contains multiple frames, some of which might
|
||||||
|
* fit.
|
||||||
|
* If you wish to be able to add parts of such packets, you should first use
|
||||||
|
* another repacketizer to split the packet into pieces and add them
|
||||||
|
* individually.
|
||||||
|
* @see opus_repacketizer_out_range
|
||||||
|
* @see opus_repacketizer_out
|
||||||
|
* @see opus_repacketizer_init
|
||||||
|
* @param rp <tt>OpusRepacketizer*</tt>: The repacketizer state to which to
|
||||||
|
* add the packet.
|
||||||
|
* @param[in] data <tt>const unsigned char*</tt>: The packet data.
|
||||||
|
* The application must ensure
|
||||||
|
* this pointer remains valid
|
||||||
|
* until the next call to
|
||||||
|
* opus_repacketizer_init() or
|
||||||
|
* opus_repacketizer_destroy().
|
||||||
|
* @param len <tt>opus_int32</tt>: The number of bytes in the packet data.
|
||||||
|
* @returns An error code indicating whether or not the operation succeeded.
|
||||||
|
* @retval #OPUS_OK The packet's contents have been added to the repacketizer
|
||||||
|
* state.
|
||||||
|
* @retval #OPUS_INVALID_PACKET The packet did not have a valid TOC sequence,
|
||||||
|
* the packet's TOC sequence was not compatible
|
||||||
|
* with previously submitted packets (because
|
||||||
|
* the coding mode, audio bandwidth, frame size,
|
||||||
|
* or channel count did not match), or adding
|
||||||
|
* this packet would increase the total amount of
|
||||||
|
* audio stored in the repacketizer state to more
|
||||||
|
* than 120 ms.
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT int opus_repacketizer_cat(OpusRepacketizer *rp, const unsigned char *data, opus_int32 len) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2);
|
||||||
|
|
||||||
|
|
||||||
|
/** Construct a new packet from data previously submitted to the repacketizer
|
||||||
|
* state via opus_repacketizer_cat().
|
||||||
|
* @param rp <tt>OpusRepacketizer*</tt>: The repacketizer state from which to
|
||||||
|
* construct the new packet.
|
||||||
|
* @param begin <tt>int</tt>: The index of the first frame in the current
|
||||||
|
* repacketizer state to include in the output.
|
||||||
|
* @param end <tt>int</tt>: One past the index of the last frame in the
|
||||||
|
* current repacketizer state to include in the
|
||||||
|
* output.
|
||||||
|
* @param[out] data <tt>const unsigned char*</tt>: The buffer in which to
|
||||||
|
* store the output packet.
|
||||||
|
* @param maxlen <tt>opus_int32</tt>: The maximum number of bytes to store in
|
||||||
|
* the output buffer. In order to guarantee
|
||||||
|
* success, this should be at least
|
||||||
|
* <code>1276</code> for a single frame,
|
||||||
|
* or for multiple frames,
|
||||||
|
* <code>1277*(end-begin)</code>.
|
||||||
|
* However, <code>1*(end-begin)</code> plus
|
||||||
|
* the size of all packet data submitted to
|
||||||
|
* the repacketizer since the last call to
|
||||||
|
* opus_repacketizer_init() or
|
||||||
|
* opus_repacketizer_create() is also
|
||||||
|
* sufficient, and possibly much smaller.
|
||||||
|
* @returns The total size of the output packet on success, or an error code
|
||||||
|
* on failure.
|
||||||
|
* @retval #OPUS_BAD_ARG <code>[begin,end)</code> was an invalid range of
|
||||||
|
* frames (begin < 0, begin >= end, or end >
|
||||||
|
* opus_repacketizer_get_nb_frames()).
|
||||||
|
* @retval #OPUS_BUFFER_TOO_SMALL \a maxlen was insufficient to contain the
|
||||||
|
* complete output packet.
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_repacketizer_out_range(OpusRepacketizer *rp, int begin, int end, unsigned char *data, opus_int32 maxlen) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4);
|
||||||
|
|
||||||
|
/** Return the total number of frames contained in packet data submitted to
|
||||||
|
* the repacketizer state so far via opus_repacketizer_cat() since the last
|
||||||
|
* call to opus_repacketizer_init() or opus_repacketizer_create().
|
||||||
|
* This defines the valid range of packets that can be extracted with
|
||||||
|
* opus_repacketizer_out_range() or opus_repacketizer_out().
|
||||||
|
* @param rp <tt>OpusRepacketizer*</tt>: The repacketizer state containing the
|
||||||
|
* frames.
|
||||||
|
* @returns The total number of frames contained in the packet data submitted
|
||||||
|
* to the repacketizer state.
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_repacketizer_get_nb_frames(OpusRepacketizer *rp) OPUS_ARG_NONNULL(1);
|
||||||
|
|
||||||
|
/** Construct a new packet from data previously submitted to the repacketizer
|
||||||
|
* state via opus_repacketizer_cat().
|
||||||
|
* This is a convenience routine that returns all the data submitted so far
|
||||||
|
* in a single packet.
|
||||||
|
* It is equivalent to calling
|
||||||
|
* @code
|
||||||
|
* opus_repacketizer_out_range(rp, 0, opus_repacketizer_get_nb_frames(rp),
|
||||||
|
* data, maxlen)
|
||||||
|
* @endcode
|
||||||
|
* @param rp <tt>OpusRepacketizer*</tt>: The repacketizer state from which to
|
||||||
|
* construct the new packet.
|
||||||
|
* @param[out] data <tt>const unsigned char*</tt>: The buffer in which to
|
||||||
|
* store the output packet.
|
||||||
|
* @param maxlen <tt>opus_int32</tt>: The maximum number of bytes to store in
|
||||||
|
* the output buffer. In order to guarantee
|
||||||
|
* success, this should be at least
|
||||||
|
* <code>1277*opus_repacketizer_get_nb_frames(rp)</code>.
|
||||||
|
* However,
|
||||||
|
* <code>1*opus_repacketizer_get_nb_frames(rp)</code>
|
||||||
|
* plus the size of all packet data
|
||||||
|
* submitted to the repacketizer since the
|
||||||
|
* last call to opus_repacketizer_init() or
|
||||||
|
* opus_repacketizer_create() is also
|
||||||
|
* sufficient, and possibly much smaller.
|
||||||
|
* @returns The total size of the output packet on success, or an error code
|
||||||
|
* on failure.
|
||||||
|
* @retval #OPUS_BUFFER_TOO_SMALL \a maxlen was insufficient to contain the
|
||||||
|
* complete output packet.
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_repacketizer_out(OpusRepacketizer *rp, unsigned char *data, opus_int32 maxlen) OPUS_ARG_NONNULL(1);
|
||||||
|
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* OPUS_H */
|
329
Frameworks/Opus/Opus/opus/include/opus_custom.h
Normal file
329
Frameworks/Opus/Opus/opus/include/opus_custom.h
Normal file
|
@ -0,0 +1,329 @@
|
||||||
|
/* Copyright (c) 2007-2008 CSIRO
|
||||||
|
Copyright (c) 2007-2009 Xiph.Org Foundation
|
||||||
|
Copyright (c) 2008-2012 Gregory Maxwell
|
||||||
|
Written by Jean-Marc Valin and Gregory Maxwell */
|
||||||
|
/*
|
||||||
|
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_custom.h
|
||||||
|
@brief Opus-Custom reference implementation API
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef OPUS_CUSTOM_H
|
||||||
|
#define OPUS_CUSTOM_H
|
||||||
|
|
||||||
|
#include "opus_defines.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CUSTOM_MODES
|
||||||
|
#define OPUS_CUSTOM_EXPORT OPUS_EXPORT
|
||||||
|
#define OPUS_CUSTOM_EXPORT_STATIC OPUS_EXPORT
|
||||||
|
#else
|
||||||
|
#define OPUS_CUSTOM_EXPORT
|
||||||
|
#ifdef CELT_C
|
||||||
|
#define OPUS_CUSTOM_EXPORT_STATIC static inline
|
||||||
|
#else
|
||||||
|
#define OPUS_CUSTOM_EXPORT_STATIC
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** @defgroup opus_custom Opus Custom
|
||||||
|
* @{
|
||||||
|
* Opus Custom is an optional part of the Opus specification and
|
||||||
|
* reference implementation which uses a distinct API from the regular
|
||||||
|
* API and supports frame sizes that are not normally supported.\ Use
|
||||||
|
* of Opus Custom is discouraged for all but very special applications
|
||||||
|
* for which a frame size different from 2.5, 5, 10, or 20 ms is needed
|
||||||
|
* (for either complexity or latency reasons) and where interoperability
|
||||||
|
* is less important.
|
||||||
|
*
|
||||||
|
* In addition to the interoperability limitations the use of Opus custom
|
||||||
|
* disables a substantial chunk of the codec and generally lowers the
|
||||||
|
* quality available at a given bitrate. Normally when an application needs
|
||||||
|
* a different frame size from the codec it should buffer to match the
|
||||||
|
* sizes but this adds a small amount of delay which may be important
|
||||||
|
* in some very low latency applications. Some transports (especially
|
||||||
|
* constant rate RF transports) may also work best with frames of
|
||||||
|
* particular durations.
|
||||||
|
*
|
||||||
|
* Libopus only supports custom modes if they are enabled at compile time.
|
||||||
|
*
|
||||||
|
* The Opus Custom API is similar to the regular API but the
|
||||||
|
* @ref opus_encoder_create and @ref opus_decoder_create calls take
|
||||||
|
* an additional mode parameter which is a structure produced by
|
||||||
|
* a call to @ref opus_custom_mode_create. Both the encoder and decoder
|
||||||
|
* must create a mode using the same sample rate (fs) and frame size
|
||||||
|
* (frame size) so these parameters must either be signaled out of band
|
||||||
|
* or fixed in a particular implementation.
|
||||||
|
*
|
||||||
|
* Similar to regular Opus the custom modes support on the fly frame size
|
||||||
|
* switching, but the sizes available depend on the particular frame size in
|
||||||
|
* use. For some initial frame sizes on a single on the fly size is available.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** Contains the state of an encoder. One encoder state is needed
|
||||||
|
for each stream. It is initialized once at the beginning of the
|
||||||
|
stream. Do *not* re-initialize the state for every frame.
|
||||||
|
@brief Encoder state
|
||||||
|
*/
|
||||||
|
typedef struct OpusCustomEncoder OpusCustomEncoder;
|
||||||
|
|
||||||
|
/** State of the decoder. One decoder state is needed for each stream.
|
||||||
|
It is initialized once at the beginning of the stream. Do *not*
|
||||||
|
re-initialize the state for every frame.
|
||||||
|
@brief Decoder state
|
||||||
|
*/
|
||||||
|
typedef struct OpusCustomDecoder OpusCustomDecoder;
|
||||||
|
|
||||||
|
/** The mode contains all the information necessary to create an
|
||||||
|
encoder. Both the encoder and decoder need to be initialized
|
||||||
|
with exactly the same mode, otherwise the output will be
|
||||||
|
corrupted.
|
||||||
|
@brief Mode configuration
|
||||||
|
*/
|
||||||
|
typedef struct OpusCustomMode OpusCustomMode;
|
||||||
|
|
||||||
|
/** Creates a new mode struct. This will be passed to an encoder or
|
||||||
|
* decoder. The mode MUST NOT BE DESTROYED until the encoders and
|
||||||
|
* decoders that use it are destroyed as well.
|
||||||
|
* @param [in] Fs <tt>int</tt>: Sampling rate (8000 to 96000 Hz)
|
||||||
|
* @param [in] frame_size <tt>int</tt>: Number of samples (per channel) to encode in each
|
||||||
|
* packet (64 - 1024, prime factorization must contain zero or more 2s, 3s, or 5s and no other primes)
|
||||||
|
* @param [out] error <tt>int*</tt>: Returned error code (if NULL, no error will be returned)
|
||||||
|
* @return A newly created mode
|
||||||
|
*/
|
||||||
|
OPUS_CUSTOM_EXPORT OPUS_WARN_UNUSED_RESULT OpusCustomMode *opus_custom_mode_create(opus_int32 Fs, int frame_size, int *error);
|
||||||
|
|
||||||
|
/** Destroys a mode struct. Only call this after all encoders and
|
||||||
|
* decoders using this mode are destroyed as well.
|
||||||
|
* @param [in] mode <tt>OpusCustomMode*</tt>: Mode to be freed.
|
||||||
|
*/
|
||||||
|
OPUS_CUSTOM_EXPORT void opus_custom_mode_destroy(OpusCustomMode *mode);
|
||||||
|
|
||||||
|
/* Encoder */
|
||||||
|
/** Gets the size of an OpusCustomEncoder structure.
|
||||||
|
* @param [in] mode <tt>OpusCustomMode *</tt>: Mode configuration
|
||||||
|
* @param [in] channels <tt>int</tt>: Number of channels
|
||||||
|
* @returns size
|
||||||
|
*/
|
||||||
|
OPUS_CUSTOM_EXPORT_STATIC OPUS_WARN_UNUSED_RESULT int opus_custom_encoder_get_size(
|
||||||
|
const OpusCustomMode *mode,
|
||||||
|
int channels
|
||||||
|
) OPUS_ARG_NONNULL(1);
|
||||||
|
|
||||||
|
/** Creates a new encoder state. Each stream needs its own encoder
|
||||||
|
* state (can't be shared across simultaneous streams).
|
||||||
|
* @param [in] mode <tt>OpusCustomMode*</tt>: Contains all the information about the characteristics of
|
||||||
|
* the stream (must be the same characteristics as used for the
|
||||||
|
* decoder)
|
||||||
|
* @param [in] channels <tt>int</tt>: Number of channels
|
||||||
|
* @param [out] error <tt>int*</tt>: Returns an error code
|
||||||
|
* @return Newly created encoder state.
|
||||||
|
*/
|
||||||
|
OPUS_CUSTOM_EXPORT OPUS_WARN_UNUSED_RESULT OpusCustomEncoder *opus_custom_encoder_create(
|
||||||
|
const OpusCustomMode *mode,
|
||||||
|
int channels,
|
||||||
|
int *error
|
||||||
|
) OPUS_ARG_NONNULL(1);
|
||||||
|
|
||||||
|
/** Initializes a previously allocated encoder state
|
||||||
|
* The memory pointed to by st must be the size returned by opus_custom_encoder_get_size.
|
||||||
|
* This is intended for applications which use their own allocator instead of malloc.
|
||||||
|
* @see opus_custom_encoder_create(),opus_custom_encoder_get_size()
|
||||||
|
* To reset a previously initialized state use the OPUS_RESET_STATE CTL.
|
||||||
|
* @param [in] st <tt>OpusCustomEncoder*</tt>: Encoder state
|
||||||
|
* @param [in] mode <tt>OpusCustomMode *</tt>: Contains all the information about the characteristics of
|
||||||
|
* the stream (must be the same characteristics as used for the
|
||||||
|
* decoder)
|
||||||
|
* @param [in] channels <tt>int</tt>: Number of channels
|
||||||
|
* @return OPUS_OK Success or @ref opus_errorcodes
|
||||||
|
*/
|
||||||
|
OPUS_CUSTOM_EXPORT_STATIC int opus_custom_encoder_init(
|
||||||
|
OpusCustomEncoder *st,
|
||||||
|
const OpusCustomMode *mode,
|
||||||
|
int channels
|
||||||
|
) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2);
|
||||||
|
|
||||||
|
/** Destroys a an encoder state.
|
||||||
|
* @param[in] st <tt>OpusCustomEncoder*</tt>: State to be freed.
|
||||||
|
*/
|
||||||
|
OPUS_CUSTOM_EXPORT void opus_custom_encoder_destroy(OpusCustomEncoder *st);
|
||||||
|
|
||||||
|
/** Encodes a frame of audio.
|
||||||
|
* @param [in] st <tt>OpusCustomEncoder*</tt>: Encoder state
|
||||||
|
* @param [in] pcm <tt>float*</tt>: PCM audio in float format, 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. There must be exactly
|
||||||
|
* frame_size samples per channel.
|
||||||
|
* @param [in] frame_size <tt>int</tt>: Number of samples per frame of input signal
|
||||||
|
* @param [out] compressed <tt>char *</tt>: The compressed data is written here. This may not alias pcm and must be at least maxCompressedBytes long.
|
||||||
|
* @param [in] maxCompressedBytes <tt>int</tt>: Maximum number of bytes to use for compressing the frame
|
||||||
|
* (can change from one frame to another)
|
||||||
|
* @return Number of bytes written to "compressed".
|
||||||
|
* If negative, an error has occurred (see error codes). It is IMPORTANT that
|
||||||
|
* the length returned be somehow transmitted to the decoder. Otherwise, no
|
||||||
|
* decoding is possible.
|
||||||
|
*/
|
||||||
|
OPUS_CUSTOM_EXPORT OPUS_WARN_UNUSED_RESULT int opus_custom_encode_float(
|
||||||
|
OpusCustomEncoder *st,
|
||||||
|
const float *pcm,
|
||||||
|
int frame_size,
|
||||||
|
unsigned char *compressed,
|
||||||
|
int maxCompressedBytes
|
||||||
|
) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4);
|
||||||
|
|
||||||
|
/** Encodes a frame of audio.
|
||||||
|
* @param [in] st <tt>OpusCustomEncoder*</tt>: Encoder state
|
||||||
|
* @param [in] pcm <tt>opus_int16*</tt>: PCM audio in signed 16-bit format (native endian).
|
||||||
|
* There must be exactly frame_size samples per channel.
|
||||||
|
* @param [in] frame_size <tt>int</tt>: Number of samples per frame of input signal
|
||||||
|
* @param [out] compressed <tt>char *</tt>: The compressed data is written here. This may not alias pcm and must be at least maxCompressedBytes long.
|
||||||
|
* @param [in] maxCompressedBytes <tt>int</tt>: Maximum number of bytes to use for compressing the frame
|
||||||
|
* (can change from one frame to another)
|
||||||
|
* @return Number of bytes written to "compressed".
|
||||||
|
* If negative, an error has occurred (see error codes). It is IMPORTANT that
|
||||||
|
* the length returned be somehow transmitted to the decoder. Otherwise, no
|
||||||
|
* decoding is possible.
|
||||||
|
*/
|
||||||
|
OPUS_CUSTOM_EXPORT OPUS_WARN_UNUSED_RESULT int opus_custom_encode(
|
||||||
|
OpusCustomEncoder *st,
|
||||||
|
const opus_int16 *pcm,
|
||||||
|
int frame_size,
|
||||||
|
unsigned char *compressed,
|
||||||
|
int maxCompressedBytes
|
||||||
|
) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4);
|
||||||
|
|
||||||
|
/** Perform a CTL function on an Opus custom encoder.
|
||||||
|
*
|
||||||
|
* Generally the request and subsequent arguments are generated
|
||||||
|
* by a convenience macro.
|
||||||
|
* @see opus_encoderctls
|
||||||
|
*/
|
||||||
|
OPUS_CUSTOM_EXPORT int opus_custom_encoder_ctl(OpusCustomEncoder * OPUS_RESTRICT st, int request, ...) OPUS_ARG_NONNULL(1);
|
||||||
|
|
||||||
|
/* Decoder */
|
||||||
|
|
||||||
|
/** Gets the size of an OpusCustomDecoder structure.
|
||||||
|
* @param [in] mode <tt>OpusCustomMode *</tt>: Mode configuration
|
||||||
|
* @param [in] channels <tt>int</tt>: Number of channels
|
||||||
|
* @returns size
|
||||||
|
*/
|
||||||
|
OPUS_CUSTOM_EXPORT_STATIC OPUS_WARN_UNUSED_RESULT int opus_custom_decoder_get_size(
|
||||||
|
const OpusCustomMode *mode,
|
||||||
|
int channels
|
||||||
|
) OPUS_ARG_NONNULL(1);
|
||||||
|
|
||||||
|
/** Creates a new decoder state. Each stream needs its own decoder state (can't
|
||||||
|
* be shared across simultaneous streams).
|
||||||
|
* @param [in] mode <tt>OpusCustomMode</tt>: Contains all the information about the characteristics of the
|
||||||
|
* stream (must be the same characteristics as used for the encoder)
|
||||||
|
* @param [in] channels <tt>int</tt>: Number of channels
|
||||||
|
* @param [out] error <tt>int*</tt>: Returns an error code
|
||||||
|
* @return Newly created decoder state.
|
||||||
|
*/
|
||||||
|
OPUS_CUSTOM_EXPORT OPUS_WARN_UNUSED_RESULT OpusCustomDecoder *opus_custom_decoder_create(
|
||||||
|
const OpusCustomMode *mode,
|
||||||
|
int channels,
|
||||||
|
int *error
|
||||||
|
) OPUS_ARG_NONNULL(1);
|
||||||
|
|
||||||
|
/** Initializes a previously allocated decoder state
|
||||||
|
* The memory pointed to by st must be the size returned by opus_custom_decoder_get_size.
|
||||||
|
* This is intended for applications which use their own allocator instead of malloc.
|
||||||
|
* @see opus_custom_decoder_create(),opus_custom_decoder_get_size()
|
||||||
|
* To reset a previously initialized state use the OPUS_RESET_STATE CTL.
|
||||||
|
* @param [in] st <tt>OpusCustomDecoder*</tt>: Decoder state
|
||||||
|
* @param [in] mode <tt>OpusCustomMode *</tt>: Contains all the information about the characteristics of
|
||||||
|
* the stream (must be the same characteristics as used for the
|
||||||
|
* encoder)
|
||||||
|
* @param [in] channels <tt>int</tt>: Number of channels
|
||||||
|
* @return OPUS_OK Success or @ref opus_errorcodes
|
||||||
|
*/
|
||||||
|
OPUS_CUSTOM_EXPORT_STATIC int opus_custom_decoder_init(
|
||||||
|
OpusCustomDecoder *st,
|
||||||
|
const OpusCustomMode *mode,
|
||||||
|
int channels
|
||||||
|
) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2);
|
||||||
|
|
||||||
|
/** Destroys a an decoder state.
|
||||||
|
* @param[in] st <tt>OpusCustomDecoder*</tt>: State to be freed.
|
||||||
|
*/
|
||||||
|
OPUS_CUSTOM_EXPORT void opus_custom_decoder_destroy(OpusCustomDecoder *st);
|
||||||
|
|
||||||
|
/** Decode an opus custom frame with floating point output
|
||||||
|
* @param [in] st <tt>OpusCustomDecoder*</tt>: Decoder state
|
||||||
|
* @param [in] data <tt>char*</tt>: Input payload. Use a NULL pointer to indicate packet loss
|
||||||
|
* @param [in] len <tt>int</tt>: Number of bytes in payload
|
||||||
|
* @param [out] pcm <tt>float*</tt>: Output signal (interleaved if 2 channels). length
|
||||||
|
* is frame_size*channels*sizeof(float)
|
||||||
|
* @param [in] frame_size Number of samples per channel of available space in *pcm.
|
||||||
|
* @returns Number of decoded samples or @ref opus_errorcodes
|
||||||
|
*/
|
||||||
|
OPUS_CUSTOM_EXPORT OPUS_WARN_UNUSED_RESULT int opus_custom_decode_float(
|
||||||
|
OpusCustomDecoder *st,
|
||||||
|
const unsigned char *data,
|
||||||
|
int len,
|
||||||
|
float *pcm,
|
||||||
|
int frame_size
|
||||||
|
) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4);
|
||||||
|
|
||||||
|
/** Decode an opus custom frame
|
||||||
|
* @param [in] st <tt>OpusCustomDecoder*</tt>: Decoder state
|
||||||
|
* @param [in] data <tt>char*</tt>: Input payload. Use a NULL pointer to indicate packet loss
|
||||||
|
* @param [in] len <tt>int</tt>: Number of bytes in payload
|
||||||
|
* @param [out] pcm <tt>opus_int16*</tt>: Output signal (interleaved if 2 channels). length
|
||||||
|
* is frame_size*channels*sizeof(opus_int16)
|
||||||
|
* @param [in] frame_size Number of samples per channel of available space in *pcm.
|
||||||
|
* @returns Number of decoded samples or @ref opus_errorcodes
|
||||||
|
*/
|
||||||
|
OPUS_CUSTOM_EXPORT OPUS_WARN_UNUSED_RESULT int opus_custom_decode(
|
||||||
|
OpusCustomDecoder *st,
|
||||||
|
const unsigned char *data,
|
||||||
|
int len,
|
||||||
|
opus_int16 *pcm,
|
||||||
|
int frame_size
|
||||||
|
) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4);
|
||||||
|
|
||||||
|
/** Perform a CTL function on an Opus custom decoder.
|
||||||
|
*
|
||||||
|
* Generally the request and subsequent arguments are generated
|
||||||
|
* by a convenience macro.
|
||||||
|
* @see opus_genericctls
|
||||||
|
*/
|
||||||
|
OPUS_CUSTOM_EXPORT int opus_custom_decoder_ctl(OpusCustomDecoder * OPUS_RESTRICT st, int request, ...) OPUS_ARG_NONNULL(1);
|
||||||
|
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* OPUS_CUSTOM_H */
|
655
Frameworks/Opus/Opus/opus/include/opus_defines.h
Normal file
655
Frameworks/Opus/Opus/opus/include/opus_defines.h
Normal file
|
@ -0,0 +1,655 @@
|
||||||
|
/* Copyright (c) 2010-2011 Xiph.Org Foundation, Skype Limited
|
||||||
|
Written by Jean-Marc Valin and Koen Vos */
|
||||||
|
/*
|
||||||
|
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_defines.h
|
||||||
|
* @brief Opus reference implementation constants
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef OPUS_DEFINES_H
|
||||||
|
#define OPUS_DEFINES_H
|
||||||
|
|
||||||
|
#include "opus_types.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** @defgroup opus_errorcodes Error codes
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/** No error @hideinitializer*/
|
||||||
|
#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*/
|
||||||
|
#define OPUS_BUFFER_TOO_SMALL -2
|
||||||
|
/** An internal error was detected @hideinitializer*/
|
||||||
|
#define OPUS_INTERNAL_ERROR -3
|
||||||
|
/** The compressed data passed is corrupted @hideinitializer*/
|
||||||
|
#define OPUS_INVALID_PACKET -4
|
||||||
|
/** Invalid/unsupported request number @hideinitializer*/
|
||||||
|
#define OPUS_UNIMPLEMENTED -5
|
||||||
|
/** An encoder or decoder structure is invalid or already freed @hideinitializer*/
|
||||||
|
#define OPUS_INVALID_STATE -6
|
||||||
|
/** Memory allocation has failed @hideinitializer*/
|
||||||
|
#define OPUS_ALLOC_FAIL -7
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
/** @cond OPUS_INTERNAL_DOC */
|
||||||
|
/**Export control for opus functions */
|
||||||
|
|
||||||
|
#ifndef OPUS_EXPORT
|
||||||
|
# if defined(WIN32)
|
||||||
|
# ifdef OPUS_BUILD
|
||||||
|
# define OPUS_EXPORT __declspec(dllexport)
|
||||||
|
# else
|
||||||
|
# define OPUS_EXPORT
|
||||||
|
# endif
|
||||||
|
# elif defined(__GNUC__) && defined(OPUS_BUILD)
|
||||||
|
# define OPUS_EXPORT __attribute__ ((visibility ("default")))
|
||||||
|
# else
|
||||||
|
# define OPUS_EXPORT
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
# if !defined(OPUS_GNUC_PREREQ)
|
||||||
|
# if defined(__GNUC__)&&defined(__GNUC_MINOR__)
|
||||||
|
# define OPUS_GNUC_PREREQ(_maj,_min) \
|
||||||
|
((__GNUC__<<16)+__GNUC_MINOR__>=((_maj)<<16)+(_min))
|
||||||
|
# else
|
||||||
|
# define OPUS_GNUC_PREREQ(_maj,_min) 0
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#if (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L) )
|
||||||
|
# if OPUS_GNUC_PREREQ(3,0)
|
||||||
|
# define OPUS_RESTRICT __restrict__
|
||||||
|
# elif (defined(_MSC_VER) && _MSC_VER >= 1400)
|
||||||
|
# define OPUS_RESTRICT __restrict
|
||||||
|
# else
|
||||||
|
# define OPUS_RESTRICT
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# define OPUS_RESTRICT restrict
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**Warning attributes for opus functions
|
||||||
|
* NONNULL is not used in OPUS_BUILD to avoid the compiler optimizing out
|
||||||
|
* some paranoid null checks. */
|
||||||
|
#if defined(__GNUC__) && OPUS_GNUC_PREREQ(3, 4)
|
||||||
|
# define OPUS_WARN_UNUSED_RESULT __attribute__ ((__warn_unused_result__))
|
||||||
|
#else
|
||||||
|
# define OPUS_WARN_UNUSED_RESULT
|
||||||
|
#endif
|
||||||
|
#if !defined(OPUS_BUILD) && defined(__GNUC__) && OPUS_GNUC_PREREQ(3, 4)
|
||||||
|
# define OPUS_ARG_NONNULL(_x) __attribute__ ((__nonnull__(_x)))
|
||||||
|
#else
|
||||||
|
# define OPUS_ARG_NONNULL(_x)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** These are the actual Encoder CTL ID numbers.
|
||||||
|
* They should not be used directly by applications.
|
||||||
|
* In general, SETs should be even and GETs should be odd.*/
|
||||||
|
#define OPUS_SET_APPLICATION_REQUEST 4000
|
||||||
|
#define OPUS_GET_APPLICATION_REQUEST 4001
|
||||||
|
#define OPUS_SET_BITRATE_REQUEST 4002
|
||||||
|
#define OPUS_GET_BITRATE_REQUEST 4003
|
||||||
|
#define OPUS_SET_MAX_BANDWIDTH_REQUEST 4004
|
||||||
|
#define OPUS_GET_MAX_BANDWIDTH_REQUEST 4005
|
||||||
|
#define OPUS_SET_VBR_REQUEST 4006
|
||||||
|
#define OPUS_GET_VBR_REQUEST 4007
|
||||||
|
#define OPUS_SET_BANDWIDTH_REQUEST 4008
|
||||||
|
#define OPUS_GET_BANDWIDTH_REQUEST 4009
|
||||||
|
#define OPUS_SET_COMPLEXITY_REQUEST 4010
|
||||||
|
#define OPUS_GET_COMPLEXITY_REQUEST 4011
|
||||||
|
#define OPUS_SET_INBAND_FEC_REQUEST 4012
|
||||||
|
#define OPUS_GET_INBAND_FEC_REQUEST 4013
|
||||||
|
#define OPUS_SET_PACKET_LOSS_PERC_REQUEST 4014
|
||||||
|
#define OPUS_GET_PACKET_LOSS_PERC_REQUEST 4015
|
||||||
|
#define OPUS_SET_DTX_REQUEST 4016
|
||||||
|
#define OPUS_GET_DTX_REQUEST 4017
|
||||||
|
#define OPUS_SET_VBR_CONSTRAINT_REQUEST 4020
|
||||||
|
#define OPUS_GET_VBR_CONSTRAINT_REQUEST 4021
|
||||||
|
#define OPUS_SET_FORCE_CHANNELS_REQUEST 4022
|
||||||
|
#define OPUS_GET_FORCE_CHANNELS_REQUEST 4023
|
||||||
|
#define OPUS_SET_SIGNAL_REQUEST 4024
|
||||||
|
#define OPUS_GET_SIGNAL_REQUEST 4025
|
||||||
|
#define OPUS_GET_LOOKAHEAD_REQUEST 4027
|
||||||
|
/* #define OPUS_RESET_STATE 4028 */
|
||||||
|
#define OPUS_GET_SAMPLE_RATE_REQUEST 4029
|
||||||
|
#define OPUS_GET_FINAL_RANGE_REQUEST 4031
|
||||||
|
#define OPUS_GET_PITCH_REQUEST 4033
|
||||||
|
#define OPUS_SET_GAIN_REQUEST 4034
|
||||||
|
#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
|
||||||
|
|
||||||
|
/* Don't use 4045, it's already taken by OPUS_GET_GAIN_REQUEST */
|
||||||
|
|
||||||
|
/* 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))
|
||||||
|
#define __opus_check_int_ptr(ptr) ((ptr) + ((ptr) - (opus_int32*)(ptr)))
|
||||||
|
#define __opus_check_uint_ptr(ptr) ((ptr) + ((ptr) - (opus_uint32*)(ptr)))
|
||||||
|
/** @endcond */
|
||||||
|
|
||||||
|
/** @defgroup opus_ctlvalues Pre-defined values for CTL interface
|
||||||
|
* @see opus_genericctls, opus_encoderctls
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/* Values for the various encoder CTLs */
|
||||||
|
#define OPUS_AUTO -1000 /**<Auto/default setting @hideinitializer*/
|
||||||
|
#define OPUS_BITRATE_MAX -1 /**<Maximum bitrate @hideinitializer*/
|
||||||
|
|
||||||
|
/** Best for most VoIP/videoconference applications where listening quality and intelligibility matter most
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_APPLICATION_VOIP 2048
|
||||||
|
/** Best for broadcast/high-fidelity application where the decoded audio should be as close as possible to the input
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_APPLICATION_AUDIO 2049
|
||||||
|
/** Only use when lowest-achievable latency is what matters most. Voice-optimized modes cannot be used.
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_APPLICATION_RESTRICTED_LOWDELAY 2051
|
||||||
|
|
||||||
|
#define OPUS_SIGNAL_VOICE 3001 /**< Signal being encoded is voice */
|
||||||
|
#define OPUS_SIGNAL_MUSIC 3002 /**< Signal being encoded is music */
|
||||||
|
#define OPUS_BANDWIDTH_NARROWBAND 1101 /**< 4 kHz bandpass @hideinitializer*/
|
||||||
|
#define OPUS_BANDWIDTH_MEDIUMBAND 1102 /**< 6 kHz bandpass @hideinitializer*/
|
||||||
|
#define OPUS_BANDWIDTH_WIDEBAND 1103 /**< 8 kHz bandpass @hideinitializer*/
|
||||||
|
#define OPUS_BANDWIDTH_SUPERWIDEBAND 1104 /**<12 kHz bandpass @hideinitializer*/
|
||||||
|
#define OPUS_BANDWIDTH_FULLBAND 1105 /**<20 kHz bandpass @hideinitializer*/
|
||||||
|
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup opus_encoderctls Encoder related CTLs
|
||||||
|
*
|
||||||
|
* These are convenience macros for use with the \c opus_encode_ctl
|
||||||
|
* interface. They are used to generate the appropriate series of
|
||||||
|
* arguments for that call, passing the correct type, size and so
|
||||||
|
* on as expected for each particular request.
|
||||||
|
*
|
||||||
|
* Some usage examples:
|
||||||
|
*
|
||||||
|
* @code
|
||||||
|
* int ret;
|
||||||
|
* ret = opus_encoder_ctl(enc_ctx, OPUS_SET_BANDWIDTH(OPUS_AUTO));
|
||||||
|
* if (ret != OPUS_OK) return ret;
|
||||||
|
*
|
||||||
|
* opus_int32 rate;
|
||||||
|
* opus_encoder_ctl(enc_ctx, OPUS_GET_BANDWIDTH(&rate));
|
||||||
|
*
|
||||||
|
* opus_encoder_ctl(enc_ctx, OPUS_RESET_STATE);
|
||||||
|
* @endcode
|
||||||
|
*
|
||||||
|
* @see opus_genericctls, opus_encoder
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** Configures the encoder's computational complexity.
|
||||||
|
* The supported range is 0-10 inclusive with 10 representing the highest complexity.
|
||||||
|
* @see OPUS_GET_COMPLEXITY
|
||||||
|
* @param[in] x <tt>opus_int32</tt>: Allowed values: 0-10, inclusive.
|
||||||
|
*
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_SET_COMPLEXITY(x) OPUS_SET_COMPLEXITY_REQUEST, __opus_check_int(x)
|
||||||
|
/** Gets the encoder's complexity configuration.
|
||||||
|
* @see OPUS_SET_COMPLEXITY
|
||||||
|
* @param[out] x <tt>opus_int32 *</tt>: Returns a value in the range 0-10,
|
||||||
|
* inclusive.
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_GET_COMPLEXITY(x) OPUS_GET_COMPLEXITY_REQUEST, __opus_check_int_ptr(x)
|
||||||
|
|
||||||
|
/** Configures the bitrate in the encoder.
|
||||||
|
* Rates from 500 to 512000 bits per second are meaningful, as well as the
|
||||||
|
* special values #OPUS_AUTO and #OPUS_BITRATE_MAX.
|
||||||
|
* The value #OPUS_BITRATE_MAX can be used to cause the codec to use as much
|
||||||
|
* rate as it can, which is useful for controlling the rate by adjusting the
|
||||||
|
* output buffer size.
|
||||||
|
* @see OPUS_GET_BITRATE
|
||||||
|
* @param[in] x <tt>opus_int32</tt>: Bitrate in bits per second. The default
|
||||||
|
* is determined based on the number of
|
||||||
|
* channels and the input sampling rate.
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_SET_BITRATE(x) OPUS_SET_BITRATE_REQUEST, __opus_check_int(x)
|
||||||
|
/** Gets the encoder's bitrate configuration.
|
||||||
|
* @see OPUS_SET_BITRATE
|
||||||
|
* @param[out] x <tt>opus_int32 *</tt>: Returns the bitrate in bits per second.
|
||||||
|
* The default is determined based on the
|
||||||
|
* number of channels and the input
|
||||||
|
* sampling rate.
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_GET_BITRATE(x) OPUS_GET_BITRATE_REQUEST, __opus_check_int_ptr(x)
|
||||||
|
|
||||||
|
/** Enables or disables variable bitrate (VBR) in the encoder.
|
||||||
|
* The configured bitrate may not be met exactly because frames must
|
||||||
|
* be an integer number of bytes in length.
|
||||||
|
* @warning Only the MDCT mode of Opus can provide hard CBR behavior.
|
||||||
|
* @see OPUS_GET_VBR
|
||||||
|
* @see OPUS_SET_VBR_CONSTRAINT
|
||||||
|
* @param[in] x <tt>opus_int32</tt>: Allowed values:
|
||||||
|
* <dl>
|
||||||
|
* <dt>0</dt><dd>Hard CBR. For LPC/hybrid modes at very low bit-rate, this can
|
||||||
|
* cause noticeable quality degradation.</dd>
|
||||||
|
* <dt>1</dt><dd>VBR (default). The exact type of VBR is controlled by
|
||||||
|
* #OPUS_SET_VBR_CONSTRAINT.</dd>
|
||||||
|
* </dl>
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_SET_VBR(x) OPUS_SET_VBR_REQUEST, __opus_check_int(x)
|
||||||
|
/** Determine if variable bitrate (VBR) is enabled in the encoder.
|
||||||
|
* @see OPUS_SET_VBR
|
||||||
|
* @see OPUS_GET_VBR_CONSTRAINT
|
||||||
|
* @param[out] x <tt>opus_int32 *</tt>: Returns one of the following values:
|
||||||
|
* <dl>
|
||||||
|
* <dt>0</dt><dd>Hard CBR.</dd>
|
||||||
|
* <dt>1</dt><dd>VBR (default). The exact type of VBR may be retrieved via
|
||||||
|
* #OPUS_GET_VBR_CONSTRAINT.</dd>
|
||||||
|
* </dl>
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_GET_VBR(x) OPUS_GET_VBR_REQUEST, __opus_check_int_ptr(x)
|
||||||
|
|
||||||
|
/** Enables or disables constrained VBR in the encoder.
|
||||||
|
* This setting is ignored when the encoder is in CBR mode.
|
||||||
|
* @warning Only the MDCT mode of Opus currently heeds the constraint.
|
||||||
|
* Speech mode ignores it completely, hybrid mode may fail to obey it
|
||||||
|
* if the LPC layer uses more bitrate than the constraint would have
|
||||||
|
* permitted.
|
||||||
|
* @see OPUS_GET_VBR_CONSTRAINT
|
||||||
|
* @see OPUS_SET_VBR
|
||||||
|
* @param[in] x <tt>opus_int32</tt>: Allowed values:
|
||||||
|
* <dl>
|
||||||
|
* <dt>0</dt><dd>Unconstrained VBR.</dd>
|
||||||
|
* <dt>1</dt><dd>Constrained VBR (default). This creates a maximum of one
|
||||||
|
* frame of buffering delay assuming a transport with a
|
||||||
|
* serialization speed of the nominal bitrate.</dd>
|
||||||
|
* </dl>
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_SET_VBR_CONSTRAINT(x) OPUS_SET_VBR_CONSTRAINT_REQUEST, __opus_check_int(x)
|
||||||
|
/** Determine if constrained VBR is enabled in the encoder.
|
||||||
|
* @see OPUS_SET_VBR_CONSTRAINT
|
||||||
|
* @see OPUS_GET_VBR
|
||||||
|
* @param[out] x <tt>opus_int32 *</tt>: Returns one of the following values:
|
||||||
|
* <dl>
|
||||||
|
* <dt>0</dt><dd>Unconstrained VBR.</dd>
|
||||||
|
* <dt>1</dt><dd>Constrained VBR (default).</dd>
|
||||||
|
* </dl>
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_GET_VBR_CONSTRAINT(x) OPUS_GET_VBR_CONSTRAINT_REQUEST, __opus_check_int_ptr(x)
|
||||||
|
|
||||||
|
/** Configures mono/stereo forcing in the encoder.
|
||||||
|
* This can force the encoder to produce packets encoded as either mono or
|
||||||
|
* stereo, regardless of the format of the input audio. This is useful when
|
||||||
|
* the caller knows that the input signal is currently a mono source embedded
|
||||||
|
* in a stereo stream.
|
||||||
|
* @see OPUS_GET_FORCE_CHANNELS
|
||||||
|
* @param[in] x <tt>opus_int32</tt>: Allowed values:
|
||||||
|
* <dl>
|
||||||
|
* <dt>#OPUS_AUTO</dt><dd>Not forced (default)</dd>
|
||||||
|
* <dt>1</dt> <dd>Forced mono</dd>
|
||||||
|
* <dt>2</dt> <dd>Forced stereo</dd>
|
||||||
|
* </dl>
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_SET_FORCE_CHANNELS(x) OPUS_SET_FORCE_CHANNELS_REQUEST, __opus_check_int(x)
|
||||||
|
/** Gets the encoder's forced channel configuration.
|
||||||
|
* @see OPUS_SET_FORCE_CHANNELS
|
||||||
|
* @param[out] x <tt>opus_int32 *</tt>:
|
||||||
|
* <dl>
|
||||||
|
* <dt>#OPUS_AUTO</dt><dd>Not forced (default)</dd>
|
||||||
|
* <dt>1</dt> <dd>Forced mono</dd>
|
||||||
|
* <dt>2</dt> <dd>Forced stereo</dd>
|
||||||
|
* </dl>
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_GET_FORCE_CHANNELS(x) OPUS_GET_FORCE_CHANNELS_REQUEST, __opus_check_int_ptr(x)
|
||||||
|
|
||||||
|
/** Configures the maximum bandpass that the encoder will select automatically.
|
||||||
|
* Applications should normally use this instead of #OPUS_SET_BANDWIDTH
|
||||||
|
* (leaving that set to the default, #OPUS_AUTO). This allows the
|
||||||
|
* application to set an upper bound based on the type of input it is
|
||||||
|
* providing, but still gives the encoder the freedom to reduce the bandpass
|
||||||
|
* when the bitrate becomes too low, for better overall quality.
|
||||||
|
* @see OPUS_GET_MAX_BANDWIDTH
|
||||||
|
* @param[in] x <tt>opus_int32</tt>: Allowed values:
|
||||||
|
* <dl>
|
||||||
|
* <dt>OPUS_BANDWIDTH_NARROWBAND</dt> <dd>4 kHz passband</dd>
|
||||||
|
* <dt>OPUS_BANDWIDTH_MEDIUMBAND</dt> <dd>6 kHz passband</dd>
|
||||||
|
* <dt>OPUS_BANDWIDTH_WIDEBAND</dt> <dd>8 kHz passband</dd>
|
||||||
|
* <dt>OPUS_BANDWIDTH_SUPERWIDEBAND</dt><dd>12 kHz passband</dd>
|
||||||
|
* <dt>OPUS_BANDWIDTH_FULLBAND</dt> <dd>20 kHz passband (default)</dd>
|
||||||
|
* </dl>
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_SET_MAX_BANDWIDTH(x) OPUS_SET_MAX_BANDWIDTH_REQUEST, __opus_check_int(x)
|
||||||
|
|
||||||
|
/** Gets the encoder's configured maximum allowed bandpass.
|
||||||
|
* @see OPUS_SET_MAX_BANDWIDTH
|
||||||
|
* @param[out] x <tt>opus_int32 *</tt>: Allowed values:
|
||||||
|
* <dl>
|
||||||
|
* <dt>#OPUS_BANDWIDTH_NARROWBAND</dt> <dd>4 kHz passband</dd>
|
||||||
|
* <dt>#OPUS_BANDWIDTH_MEDIUMBAND</dt> <dd>6 kHz passband</dd>
|
||||||
|
* <dt>#OPUS_BANDWIDTH_WIDEBAND</dt> <dd>8 kHz passband</dd>
|
||||||
|
* <dt>#OPUS_BANDWIDTH_SUPERWIDEBAND</dt><dd>12 kHz passband</dd>
|
||||||
|
* <dt>#OPUS_BANDWIDTH_FULLBAND</dt> <dd>20 kHz passband (default)</dd>
|
||||||
|
* </dl>
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_GET_MAX_BANDWIDTH(x) OPUS_GET_MAX_BANDWIDTH_REQUEST, __opus_check_int_ptr(x)
|
||||||
|
|
||||||
|
/** Sets the encoder's bandpass to a specific value.
|
||||||
|
* This prevents the encoder from automatically selecting the bandpass based
|
||||||
|
* on the available bitrate. If an application knows the bandpass of the input
|
||||||
|
* audio it is providing, it should normally use #OPUS_SET_MAX_BANDWIDTH
|
||||||
|
* instead, which still gives the encoder the freedom to reduce the bandpass
|
||||||
|
* when the bitrate becomes too low, for better overall quality.
|
||||||
|
* @see OPUS_GET_BANDWIDTH
|
||||||
|
* @param[in] x <tt>opus_int32</tt>: Allowed values:
|
||||||
|
* <dl>
|
||||||
|
* <dt>#OPUS_AUTO</dt> <dd>(default)</dd>
|
||||||
|
* <dt>#OPUS_BANDWIDTH_NARROWBAND</dt> <dd>4 kHz passband</dd>
|
||||||
|
* <dt>#OPUS_BANDWIDTH_MEDIUMBAND</dt> <dd>6 kHz passband</dd>
|
||||||
|
* <dt>#OPUS_BANDWIDTH_WIDEBAND</dt> <dd>8 kHz passband</dd>
|
||||||
|
* <dt>#OPUS_BANDWIDTH_SUPERWIDEBAND</dt><dd>12 kHz passband</dd>
|
||||||
|
* <dt>#OPUS_BANDWIDTH_FULLBAND</dt> <dd>20 kHz passband</dd>
|
||||||
|
* </dl>
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_SET_BANDWIDTH(x) OPUS_SET_BANDWIDTH_REQUEST, __opus_check_int(x)
|
||||||
|
|
||||||
|
/** Configures the type of signal being encoded.
|
||||||
|
* This is a hint which helps the encoder's mode selection.
|
||||||
|
* @see OPUS_GET_SIGNAL
|
||||||
|
* @param[in] x <tt>opus_int32</tt>: Allowed values:
|
||||||
|
* <dl>
|
||||||
|
* <dt>#OPUS_AUTO</dt> <dd>(default)</dd>
|
||||||
|
* <dt>#OPUS_SIGNAL_VOICE</dt><dd>Bias thresholds towards choosing LPC or Hybrid modes.</dd>
|
||||||
|
* <dt>#OPUS_SIGNAL_MUSIC</dt><dd>Bias thresholds towards choosing MDCT modes.</dd>
|
||||||
|
* </dl>
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_SET_SIGNAL(x) OPUS_SET_SIGNAL_REQUEST, __opus_check_int(x)
|
||||||
|
/** Gets the encoder's configured signal type.
|
||||||
|
* @see OPUS_SET_SIGNAL
|
||||||
|
* @param[out] x <tt>opus_int32 *</tt>: Returns one of the following values:
|
||||||
|
* <dl>
|
||||||
|
* <dt>#OPUS_AUTO</dt> <dd>(default)</dd>
|
||||||
|
* <dt>#OPUS_SIGNAL_VOICE</dt><dd>Bias thresholds towards choosing LPC or Hybrid modes.</dd>
|
||||||
|
* <dt>#OPUS_SIGNAL_MUSIC</dt><dd>Bias thresholds towards choosing MDCT modes.</dd>
|
||||||
|
* </dl>
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_GET_SIGNAL(x) OPUS_GET_SIGNAL_REQUEST, __opus_check_int_ptr(x)
|
||||||
|
|
||||||
|
|
||||||
|
/** Configures the encoder's intended application.
|
||||||
|
* The initial value is a mandatory argument to the encoder_create function.
|
||||||
|
* @see OPUS_GET_APPLICATION
|
||||||
|
* @param[in] x <tt>opus_int32</tt>: Returns one of the following values:
|
||||||
|
* <dl>
|
||||||
|
* <dt>#OPUS_APPLICATION_VOIP</dt>
|
||||||
|
* <dd>Process signal for improved speech intelligibility.</dd>
|
||||||
|
* <dt>#OPUS_APPLICATION_AUDIO</dt>
|
||||||
|
* <dd>Favor faithfulness to the original input.</dd>
|
||||||
|
* <dt>#OPUS_APPLICATION_RESTRICTED_LOWDELAY</dt>
|
||||||
|
* <dd>Configure the minimum possible coding delay by disabling certain modes
|
||||||
|
* of operation.</dd>
|
||||||
|
* </dl>
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_SET_APPLICATION(x) OPUS_SET_APPLICATION_REQUEST, __opus_check_int(x)
|
||||||
|
/** Gets the encoder's configured application.
|
||||||
|
* @see OPUS_SET_APPLICATION
|
||||||
|
* @param[out] x <tt>opus_int32 *</tt>: Returns one of the following values:
|
||||||
|
* <dl>
|
||||||
|
* <dt>#OPUS_APPLICATION_VOIP</dt>
|
||||||
|
* <dd>Process signal for improved speech intelligibility.</dd>
|
||||||
|
* <dt>#OPUS_APPLICATION_AUDIO</dt>
|
||||||
|
* <dd>Favor faithfulness to the original input.</dd>
|
||||||
|
* <dt>#OPUS_APPLICATION_RESTRICTED_LOWDELAY</dt>
|
||||||
|
* <dd>Configure the minimum possible coding delay by disabling certain modes
|
||||||
|
* of operation.</dd>
|
||||||
|
* </dl>
|
||||||
|
* @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 <code>Fs</code> value passed to opus_encoder_init()
|
||||||
|
* or opus_decoder_init().
|
||||||
|
* @param[out] x <tt>opus_int32 *</tt>: 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
|
||||||
|
* and output. From the perspective of a decoding application the real data begins this many
|
||||||
|
* samples late.
|
||||||
|
*
|
||||||
|
* The decoder contribution to this delay is identical for all decoders, but the
|
||||||
|
* encoder portion of the delay may vary from implementation to implementation,
|
||||||
|
* version to version, or even depend on the encoder's initial configuration.
|
||||||
|
* Applications needing delay compensation should call this CTL rather than
|
||||||
|
* hard-coding a value.
|
||||||
|
* @param[out] x <tt>opus_int32 *</tt>: Number of lookahead samples
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_GET_LOOKAHEAD(x) OPUS_GET_LOOKAHEAD_REQUEST, __opus_check_int_ptr(x)
|
||||||
|
|
||||||
|
/** Configures the encoder's use of inband forward error correction (FEC).
|
||||||
|
* @note This is only applicable to the LPC layer
|
||||||
|
* @see OPUS_GET_INBAND_FEC
|
||||||
|
* @param[in] x <tt>opus_int32</tt>: Allowed values:
|
||||||
|
* <dl>
|
||||||
|
* <dt>0</dt><dd>Disable inband FEC (default).</dd>
|
||||||
|
* <dt>1</dt><dd>Enable inband FEC.</dd>
|
||||||
|
* </dl>
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_SET_INBAND_FEC(x) OPUS_SET_INBAND_FEC_REQUEST, __opus_check_int(x)
|
||||||
|
/** Gets encoder's configured use of inband forward error correction.
|
||||||
|
* @see OPUS_SET_INBAND_FEC
|
||||||
|
* @param[out] x <tt>opus_int32 *</tt>: Returns one of the following values:
|
||||||
|
* <dl>
|
||||||
|
* <dt>0</dt><dd>Inband FEC disabled (default).</dd>
|
||||||
|
* <dt>1</dt><dd>Inband FEC enabled.</dd>
|
||||||
|
* </dl>
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_GET_INBAND_FEC(x) OPUS_GET_INBAND_FEC_REQUEST, __opus_check_int_ptr(x)
|
||||||
|
|
||||||
|
/** Configures the encoder's expected packet loss percentage.
|
||||||
|
* Higher values with trigger progressively more loss resistant behavior in the encoder
|
||||||
|
* at the expense of quality at a given bitrate in the lossless case, but greater quality
|
||||||
|
* under loss.
|
||||||
|
* @see OPUS_GET_PACKET_LOSS_PERC
|
||||||
|
* @param[in] x <tt>opus_int32</tt>: Loss percentage in the range 0-100, inclusive (default: 0).
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_SET_PACKET_LOSS_PERC(x) OPUS_SET_PACKET_LOSS_PERC_REQUEST, __opus_check_int(x)
|
||||||
|
/** Gets the encoder's configured packet loss percentage.
|
||||||
|
* @see OPUS_SET_PACKET_LOSS_PERC
|
||||||
|
* @param[out] x <tt>opus_int32 *</tt>: Returns the configured loss percentage
|
||||||
|
* in the range 0-100, inclusive (default: 0).
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_GET_PACKET_LOSS_PERC(x) OPUS_GET_PACKET_LOSS_PERC_REQUEST, __opus_check_int_ptr(x)
|
||||||
|
|
||||||
|
/** Configures the encoder's use of discontinuous transmission (DTX).
|
||||||
|
* @note This is only applicable to the LPC layer
|
||||||
|
* @see OPUS_GET_DTX
|
||||||
|
* @param[in] x <tt>opus_int32</tt>: Allowed values:
|
||||||
|
* <dl>
|
||||||
|
* <dt>0</dt><dd>Disable DTX (default).</dd>
|
||||||
|
* <dt>1</dt><dd>Enabled DTX.</dd>
|
||||||
|
* </dl>
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_SET_DTX(x) OPUS_SET_DTX_REQUEST, __opus_check_int(x)
|
||||||
|
/** Gets encoder's configured use of discontinuous transmission.
|
||||||
|
* @see OPUS_SET_DTX
|
||||||
|
* @param[out] x <tt>opus_int32 *</tt>: Returns one of the following values:
|
||||||
|
* <dl>
|
||||||
|
* <dt>0</dt><dd>DTX disabled (default).</dd>
|
||||||
|
* <dt>1</dt><dd>DTX enabled.</dd>
|
||||||
|
* </dl>
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_GET_DTX(x) OPUS_GET_DTX_REQUEST, __opus_check_int_ptr(x)
|
||||||
|
/** Configures the depth of signal being encoded.
|
||||||
|
* This is a hint which helps the encoder identify silence and near-silence.
|
||||||
|
* @see OPUS_GET_LSB_DEPTH
|
||||||
|
* @param[in] x <tt>opus_int32</tt>: Input precision in bits, between 8 and 24
|
||||||
|
* (default: 24).
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_SET_LSB_DEPTH(x) OPUS_SET_LSB_DEPTH_REQUEST, __opus_check_int(x)
|
||||||
|
/** Gets the encoder's configured signal depth.
|
||||||
|
* @see OPUS_SET_LSB_DEPTH
|
||||||
|
* @param[out] x <tt>opus_int32 *</tt>: Input precision in bits, between 8 and
|
||||||
|
* 24 (default: 24).
|
||||||
|
* @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 <tt>opus_int32 *</tt>: 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)
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
/** @defgroup opus_genericctls Generic CTLs
|
||||||
|
*
|
||||||
|
* These macros are used with the \c opus_decoder_ctl and
|
||||||
|
* \c opus_encoder_ctl calls to generate a particular
|
||||||
|
* request.
|
||||||
|
*
|
||||||
|
* When called on an \c OpusDecoder they apply to that
|
||||||
|
* particular decoder instance. When called on an
|
||||||
|
* \c OpusEncoder they apply to the corresponding setting
|
||||||
|
* on that encoder instance, if present.
|
||||||
|
*
|
||||||
|
* Some usage examples:
|
||||||
|
*
|
||||||
|
* @code
|
||||||
|
* int ret;
|
||||||
|
* opus_int32 pitch;
|
||||||
|
* ret = opus_decoder_ctl(dec_ctx, OPUS_GET_PITCH(&pitch));
|
||||||
|
* if (ret == OPUS_OK) return ret;
|
||||||
|
*
|
||||||
|
* opus_encoder_ctl(enc_ctx, OPUS_RESET_STATE);
|
||||||
|
* opus_decoder_ctl(dec_ctx, OPUS_RESET_STATE);
|
||||||
|
*
|
||||||
|
* opus_int32 enc_bw, dec_bw;
|
||||||
|
* opus_encoder_ctl(enc_ctx, OPUS_GET_BANDWIDTH(&enc_bw));
|
||||||
|
* opus_decoder_ctl(dec_ctx, OPUS_GET_BANDWIDTH(&dec_bw));
|
||||||
|
* if (enc_bw != dec_bw) {
|
||||||
|
* printf("packet bandwidth mismatch!\n");
|
||||||
|
* }
|
||||||
|
* @endcode
|
||||||
|
*
|
||||||
|
* @see opus_encoder, opus_decoder_ctl, opus_encoder_ctl, opus_decoderctls, opus_encoderctls
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** Resets the codec state to be equivalent to a freshly initialized state.
|
||||||
|
* This should be called when switching streams in order to prevent
|
||||||
|
* the back to back decoding from giving different results from
|
||||||
|
* one at a time decoding.
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_RESET_STATE 4028
|
||||||
|
|
||||||
|
/** Gets the final state of the codec's entropy coder.
|
||||||
|
* This is used for testing purposes,
|
||||||
|
* The encoder and decoder state should be identical after coding a payload
|
||||||
|
* (assuming no data corruption or software bugs)
|
||||||
|
*
|
||||||
|
* @param[out] x <tt>opus_uint32 *</tt>: Entropy coder state
|
||||||
|
*
|
||||||
|
* @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 <tt>opus_int32 *</tt>: 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 <tt>opus_int32 *</tt>: Returns one of the following values:
|
||||||
|
* <dl>
|
||||||
|
* <dt>#OPUS_AUTO</dt> <dd>(default)</dd>
|
||||||
|
* <dt>#OPUS_BANDWIDTH_NARROWBAND</dt> <dd>4 kHz passband</dd>
|
||||||
|
* <dt>#OPUS_BANDWIDTH_MEDIUMBAND</dt> <dd>6 kHz passband</dd>
|
||||||
|
* <dt>#OPUS_BANDWIDTH_WIDEBAND</dt> <dd>8 kHz passband</dd>
|
||||||
|
* <dt>#OPUS_BANDWIDTH_SUPERWIDEBAND</dt><dd>12 kHz passband</dd>
|
||||||
|
* <dt>#OPUS_BANDWIDTH_FULLBAND</dt> <dd>20 kHz passband</dd>
|
||||||
|
* </dl>
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_GET_BANDWIDTH(x) OPUS_GET_BANDWIDTH_REQUEST, __opus_check_int_ptr(x)
|
||||||
|
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
/** @defgroup opus_decoderctls Decoder related CTLs
|
||||||
|
* @see opus_genericctls, opus_encoderctls, opus_decoder
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** Configures decoder gain adjustment.
|
||||||
|
* Scales the decoded output by a factor specified in Q8 dB units.
|
||||||
|
* This has a maximum range of -32768 to 32767 inclusive, and returns
|
||||||
|
* OPUS_BAD_ARG otherwise. The default is zero indicating no adjustment.
|
||||||
|
* This setting survives decoder reset.
|
||||||
|
*
|
||||||
|
* gain = pow(10, x/(20.0*256))
|
||||||
|
*
|
||||||
|
* @param[in] x <tt>opus_int32</tt>: Amount to scale PCM signal by in Q8 dB units.
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_SET_GAIN(x) OPUS_SET_GAIN_REQUEST, __opus_check_int(x)
|
||||||
|
/** Gets the decoder's configured gain adjustment. @see OPUS_SET_GAIN
|
||||||
|
*
|
||||||
|
* @param[out] x <tt>opus_int32 *</tt>: Amount to scale PCM signal by in Q8 dB units.
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_GET_GAIN(x) OPUS_GET_GAIN_REQUEST, __opus_check_int_ptr(x)
|
||||||
|
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
/** @defgroup opus_libinfo Opus library information functions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** Converts an opus error code into a human readable string.
|
||||||
|
*
|
||||||
|
* @param[in] error <tt>int</tt>: Error number
|
||||||
|
* @returns Error string
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT const char *opus_strerror(int error);
|
||||||
|
|
||||||
|
/** Gets the libopus version string.
|
||||||
|
*
|
||||||
|
* @returns Version string
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT const char *opus_get_version_string(void);
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* OPUS_DEFINES_H */
|
660
Frameworks/Opus/Opus/opus/include/opus_multistream.h
Normal file
660
Frameworks/Opus/Opus/opus/include/opus_multistream.h
Normal file
|
@ -0,0 +1,660 @@
|
||||||
|
/* Copyright (c) 2011 Xiph.Org Foundation
|
||||||
|
Written by Jean-Marc Valin */
|
||||||
|
/*
|
||||||
|
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_multistream.h
|
||||||
|
* @brief Opus reference implementation multistream API
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef OPUS_MULTISTREAM_H
|
||||||
|
#define OPUS_MULTISTREAM_H
|
||||||
|
|
||||||
|
#include "opus.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** @cond OPUS_INTERNAL_DOC */
|
||||||
|
|
||||||
|
/** Macros to trigger compilation errors when the wrong types are provided to a
|
||||||
|
* CTL. */
|
||||||
|
/**@{*/
|
||||||
|
#define __opus_check_encstate_ptr(ptr) ((ptr) + ((ptr) - (OpusEncoder**)(ptr)))
|
||||||
|
#define __opus_check_decstate_ptr(ptr) ((ptr) + ((ptr) - (OpusDecoder**)(ptr)))
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
/** These are the actual encoder and decoder CTL ID numbers.
|
||||||
|
* They should not be used directly by applications.
|
||||||
|
* In general, SETs should be even and GETs should be odd.*/
|
||||||
|
/**@{*/
|
||||||
|
#define OPUS_MULTISTREAM_GET_ENCODER_STATE_REQUEST 5120
|
||||||
|
#define OPUS_MULTISTREAM_GET_DECODER_STATE_REQUEST 5122
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
/** @endcond */
|
||||||
|
|
||||||
|
/** @defgroup opus_multistream_ctls Multistream specific encoder and decoder CTLs
|
||||||
|
*
|
||||||
|
* These are convenience macros that are specific to the
|
||||||
|
* opus_multistream_encoder_ctl() and opus_multistream_decoder_ctl()
|
||||||
|
* interface.
|
||||||
|
* The CTLs from @ref opus_genericctls, @ref opus_encoderctls, and
|
||||||
|
* @ref opus_decoderctls may be applied to a multistream encoder or decoder as
|
||||||
|
* well.
|
||||||
|
* In addition, you may retrieve the encoder or decoder state for an specific
|
||||||
|
* stream via #OPUS_MULTISTREAM_GET_ENCODER_STATE or
|
||||||
|
* #OPUS_MULTISTREAM_GET_DECODER_STATE and apply CTLs to it individually.
|
||||||
|
*/
|
||||||
|
/**@{*/
|
||||||
|
|
||||||
|
/** Gets the encoder state for an individual stream of a multistream encoder.
|
||||||
|
* @param[in] x <tt>opus_int32</tt>: The index of the stream whose encoder you
|
||||||
|
* wish to retrieve.
|
||||||
|
* This must be non-negative and less than
|
||||||
|
* the <code>streams</code> parameter used
|
||||||
|
* to initialize the encoder.
|
||||||
|
* @param[out] y <tt>OpusEncoder**</tt>: Returns a pointer to the given
|
||||||
|
* encoder state.
|
||||||
|
* @retval OPUS_BAD_ARG The index of the requested stream was out of range.
|
||||||
|
* @hideinitializer
|
||||||
|
*/
|
||||||
|
#define OPUS_MULTISTREAM_GET_ENCODER_STATE(x,y) OPUS_MULTISTREAM_GET_ENCODER_STATE_REQUEST, __opus_check_int(x), __opus_check_encstate_ptr(y)
|
||||||
|
|
||||||
|
/** Gets the decoder state for an individual stream of a multistream decoder.
|
||||||
|
* @param[in] x <tt>opus_int32</tt>: The index of the stream whose decoder you
|
||||||
|
* wish to retrieve.
|
||||||
|
* This must be non-negative and less than
|
||||||
|
* the <code>streams</code> parameter used
|
||||||
|
* to initialize the decoder.
|
||||||
|
* @param[out] y <tt>OpusDecoder**</tt>: Returns a pointer to the given
|
||||||
|
* decoder state.
|
||||||
|
* @retval OPUS_BAD_ARG The index of the requested stream was out of range.
|
||||||
|
* @hideinitializer
|
||||||
|
*/
|
||||||
|
#define OPUS_MULTISTREAM_GET_DECODER_STATE(x,y) OPUS_MULTISTREAM_GET_DECODER_STATE_REQUEST, __opus_check_int(x), __opus_check_decstate_ptr(y)
|
||||||
|
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
/** @defgroup opus_multistream Opus Multistream API
|
||||||
|
* @{
|
||||||
|
*
|
||||||
|
* The multistream API allows individual Opus streams to be combined into a
|
||||||
|
* single packet, enabling support for up to 255 channels. Unlike an
|
||||||
|
* elementary Opus stream, the encoder and decoder must negotiate the channel
|
||||||
|
* configuration before the decoder can successfully interpret the data in the
|
||||||
|
* packets produced by the encoder. Some basic information, such as packet
|
||||||
|
* duration, can be computed without any special negotiation.
|
||||||
|
*
|
||||||
|
* The format for multistream Opus packets is defined in the
|
||||||
|
* <a href="http://tools.ietf.org/html/draft-terriberry-oggopus">Ogg
|
||||||
|
* encapsulation specification</a> and is based on the self-delimited Opus
|
||||||
|
* framing described in Appendix B of <a href="http://tools.ietf.org/html/rfc6716">RFC 6716</a>.
|
||||||
|
* Normal Opus packets are just a degenerate case of multistream Opus packets,
|
||||||
|
* and can be encoded or decoded with the multistream API by setting
|
||||||
|
* <code>streams</code> to <code>1</code> when initializing the encoder or
|
||||||
|
* decoder.
|
||||||
|
*
|
||||||
|
* Multistream Opus streams can contain up to 255 elementary Opus streams.
|
||||||
|
* These may be either "uncoupled" or "coupled", indicating that the decoder
|
||||||
|
* is configured to decode them to either 1 or 2 channels, respectively.
|
||||||
|
* The streams are ordered so that all coupled streams appear at the
|
||||||
|
* beginning.
|
||||||
|
*
|
||||||
|
* A <code>mapping</code> table defines which decoded channel <code>i</code>
|
||||||
|
* should be used for each input/output (I/O) channel <code>j</code>. This table is
|
||||||
|
* typically provided as an unsigned char array.
|
||||||
|
* Let <code>i = mapping[j]</code> be the index for I/O channel <code>j</code>.
|
||||||
|
* If <code>i < 2*coupled_streams</code>, then I/O channel <code>j</code> is
|
||||||
|
* encoded as the left channel of stream <code>(i/2)</code> if <code>i</code>
|
||||||
|
* is even, or as the right channel of stream <code>(i/2)</code> if
|
||||||
|
* <code>i</code> is odd. Otherwise, I/O channel <code>j</code> is encoded as
|
||||||
|
* mono in stream <code>(i - coupled_streams)</code>, unless it has the special
|
||||||
|
* value 255, in which case it is omitted from the encoding entirely (the
|
||||||
|
* decoder will reproduce it as silence). Each value <code>i</code> must either
|
||||||
|
* be the special value 255 or be less than <code>streams + coupled_streams</code>.
|
||||||
|
*
|
||||||
|
* The output channels specified by the encoder
|
||||||
|
* should use the
|
||||||
|
* <a href="http://www.xiph.org/vorbis/doc/Vorbis_I_spec.html#x1-800004.3.9">Vorbis
|
||||||
|
* channel ordering</a>. A decoder may wish to apply an additional permutation
|
||||||
|
* to the mapping the encoder used to achieve a different output channel
|
||||||
|
* order (e.g. for outputing in WAV order).
|
||||||
|
*
|
||||||
|
* Each multistream packet contains an Opus packet for each stream, and all of
|
||||||
|
* the Opus packets in a single multistream packet must have the same
|
||||||
|
* duration. Therefore the duration of a multistream packet can be extracted
|
||||||
|
* from the TOC sequence of the first stream, which is located at the
|
||||||
|
* beginning of the packet, just like an elementary Opus stream:
|
||||||
|
*
|
||||||
|
* @code
|
||||||
|
* int nb_samples;
|
||||||
|
* int nb_frames;
|
||||||
|
* nb_frames = opus_packet_get_nb_frames(data, len);
|
||||||
|
* if (nb_frames < 1)
|
||||||
|
* return nb_frames;
|
||||||
|
* nb_samples = opus_packet_get_samples_per_frame(data, 48000) * nb_frames;
|
||||||
|
* @endcode
|
||||||
|
*
|
||||||
|
* The general encoding and decoding process proceeds exactly the same as in
|
||||||
|
* the normal @ref opus_encoder and @ref opus_decoder APIs.
|
||||||
|
* See their documentation for an overview of how to use the corresponding
|
||||||
|
* multistream functions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** Opus multistream encoder state.
|
||||||
|
* This contains the complete state of a multistream Opus encoder.
|
||||||
|
* It is position independent and can be freely copied.
|
||||||
|
* @see opus_multistream_encoder_create
|
||||||
|
* @see opus_multistream_encoder_init
|
||||||
|
*/
|
||||||
|
typedef struct OpusMSEncoder OpusMSEncoder;
|
||||||
|
|
||||||
|
/** Opus multistream decoder state.
|
||||||
|
* This contains the complete state of a multistream Opus decoder.
|
||||||
|
* It is position independent and can be freely copied.
|
||||||
|
* @see opus_multistream_decoder_create
|
||||||
|
* @see opus_multistream_decoder_init
|
||||||
|
*/
|
||||||
|
typedef struct OpusMSDecoder OpusMSDecoder;
|
||||||
|
|
||||||
|
/**\name Multistream encoder functions */
|
||||||
|
/**@{*/
|
||||||
|
|
||||||
|
/** Gets the size of an OpusMSEncoder structure.
|
||||||
|
* @param streams <tt>int</tt>: The total number of streams to encode from the
|
||||||
|
* input.
|
||||||
|
* This must be no more than 255.
|
||||||
|
* @param coupled_streams <tt>int</tt>: 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 (<code>streams +
|
||||||
|
* coupled_streams</code>) 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_multistream_encoder_get_size(
|
||||||
|
int streams,
|
||||||
|
int coupled_streams
|
||||||
|
);
|
||||||
|
|
||||||
|
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_multistream_surround_encoder_get_size(
|
||||||
|
int channels,
|
||||||
|
int mapping_family
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
/** Allocates and initializes a multistream encoder state.
|
||||||
|
* Call opus_multistream_encoder_destroy() to release
|
||||||
|
* this object when finished.
|
||||||
|
* @param Fs <tt>opus_int32</tt>: Sampling rate of the input signal (in Hz).
|
||||||
|
* This must be one of 8000, 12000, 16000,
|
||||||
|
* 24000, or 48000.
|
||||||
|
* @param channels <tt>int</tt>: Number of channels in the input signal.
|
||||||
|
* This must be at most 255.
|
||||||
|
* It may be greater than the number of
|
||||||
|
* coded channels (<code>streams +
|
||||||
|
* coupled_streams</code>).
|
||||||
|
* @param streams <tt>int</tt>: The total number of streams to encode from the
|
||||||
|
* input.
|
||||||
|
* This must be no more than the number of channels.
|
||||||
|
* @param coupled_streams <tt>int</tt>: 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 (<code>streams +
|
||||||
|
* coupled_streams</code>) must be no
|
||||||
|
* more than the number of input channels.
|
||||||
|
* @param[in] mapping <code>const unsigned char[channels]</code>: Mapping from
|
||||||
|
* encoded channels to input channels, as described in
|
||||||
|
* @ref opus_multistream. As an extra constraint, the
|
||||||
|
* multistream encoder does not allow encoding coupled
|
||||||
|
* streams for which one channel is unused since this
|
||||||
|
* is never a good idea.
|
||||||
|
* @param application <tt>int</tt>: The target encoder application.
|
||||||
|
* This must be one of the following:
|
||||||
|
* <dl>
|
||||||
|
* <dt>#OPUS_APPLICATION_VOIP</dt>
|
||||||
|
* <dd>Process signal for improved speech intelligibility.</dd>
|
||||||
|
* <dt>#OPUS_APPLICATION_AUDIO</dt>
|
||||||
|
* <dd>Favor faithfulness to the original input.</dd>
|
||||||
|
* <dt>#OPUS_APPLICATION_RESTRICTED_LOWDELAY</dt>
|
||||||
|
* <dd>Configure the minimum possible coding delay by disabling certain modes
|
||||||
|
* of operation.</dd>
|
||||||
|
* </dl>
|
||||||
|
* @param[out] error <tt>int *</tt>: Returns #OPUS_OK on success, or an error
|
||||||
|
* code (see @ref opus_errorcodes) on
|
||||||
|
* failure.
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusMSEncoder *opus_multistream_encoder_create(
|
||||||
|
opus_int32 Fs,
|
||||||
|
int channels,
|
||||||
|
int streams,
|
||||||
|
int coupled_streams,
|
||||||
|
const unsigned char *mapping,
|
||||||
|
int application,
|
||||||
|
int *error
|
||||||
|
) OPUS_ARG_NONNULL(5);
|
||||||
|
|
||||||
|
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusMSEncoder *opus_multistream_surround_encoder_create(
|
||||||
|
opus_int32 Fs,
|
||||||
|
int channels,
|
||||||
|
int mapping_family,
|
||||||
|
int *streams,
|
||||||
|
int *coupled_streams,
|
||||||
|
unsigned char *mapping,
|
||||||
|
int application,
|
||||||
|
int *error
|
||||||
|
) OPUS_ARG_NONNULL(5);
|
||||||
|
|
||||||
|
/** Initialize a previously allocated multistream encoder state.
|
||||||
|
* The memory pointed to by \a st must be at least the size returned by
|
||||||
|
* opus_multistream_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_multistream_encoder_create
|
||||||
|
* @see opus_multistream_encoder_get_size
|
||||||
|
* @param st <tt>OpusMSEncoder*</tt>: Multistream encoder state to initialize.
|
||||||
|
* @param Fs <tt>opus_int32</tt>: Sampling rate of the input signal (in Hz).
|
||||||
|
* This must be one of 8000, 12000, 16000,
|
||||||
|
* 24000, or 48000.
|
||||||
|
* @param channels <tt>int</tt>: Number of channels in the input signal.
|
||||||
|
* This must be at most 255.
|
||||||
|
* It may be greater than the number of
|
||||||
|
* coded channels (<code>streams +
|
||||||
|
* coupled_streams</code>).
|
||||||
|
* @param streams <tt>int</tt>: The total number of streams to encode from the
|
||||||
|
* input.
|
||||||
|
* This must be no more than the number of channels.
|
||||||
|
* @param coupled_streams <tt>int</tt>: 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 (<code>streams +
|
||||||
|
* coupled_streams</code>) must be no
|
||||||
|
* more than the number of input channels.
|
||||||
|
* @param[in] mapping <code>const unsigned char[channels]</code>: Mapping from
|
||||||
|
* encoded channels to input channels, as described in
|
||||||
|
* @ref opus_multistream. As an extra constraint, the
|
||||||
|
* multistream encoder does not allow encoding coupled
|
||||||
|
* streams for which one channel is unused since this
|
||||||
|
* is never a good idea.
|
||||||
|
* @param application <tt>int</tt>: The target encoder application.
|
||||||
|
* This must be one of the following:
|
||||||
|
* <dl>
|
||||||
|
* <dt>#OPUS_APPLICATION_VOIP</dt>
|
||||||
|
* <dd>Process signal for improved speech intelligibility.</dd>
|
||||||
|
* <dt>#OPUS_APPLICATION_AUDIO</dt>
|
||||||
|
* <dd>Favor faithfulness to the original input.</dd>
|
||||||
|
* <dt>#OPUS_APPLICATION_RESTRICTED_LOWDELAY</dt>
|
||||||
|
* <dd>Configure the minimum possible coding delay by disabling certain modes
|
||||||
|
* of operation.</dd>
|
||||||
|
* </dl>
|
||||||
|
* @returns #OPUS_OK on success, or an error code (see @ref opus_errorcodes)
|
||||||
|
* on failure.
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT int opus_multistream_encoder_init(
|
||||||
|
OpusMSEncoder *st,
|
||||||
|
opus_int32 Fs,
|
||||||
|
int channels,
|
||||||
|
int streams,
|
||||||
|
int coupled_streams,
|
||||||
|
const unsigned char *mapping,
|
||||||
|
int application
|
||||||
|
) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(6);
|
||||||
|
|
||||||
|
OPUS_EXPORT int opus_multistream_surround_encoder_init(
|
||||||
|
OpusMSEncoder *st,
|
||||||
|
opus_int32 Fs,
|
||||||
|
int channels,
|
||||||
|
int mapping_family,
|
||||||
|
int *streams,
|
||||||
|
int *coupled_streams,
|
||||||
|
unsigned char *mapping,
|
||||||
|
int application
|
||||||
|
) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(6);
|
||||||
|
|
||||||
|
/** Encodes a multistream Opus frame.
|
||||||
|
* @param st <tt>OpusMSEncoder*</tt>: Multistream encoder state.
|
||||||
|
* @param[in] pcm <tt>const opus_int16*</tt>: The input signal as interleaved
|
||||||
|
* samples.
|
||||||
|
* This must contain
|
||||||
|
* <code>frame_size*channels</code>
|
||||||
|
* samples.
|
||||||
|
* @param frame_size <tt>int</tt>: 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 <tt>unsigned char*</tt>: Output payload.
|
||||||
|
* This must contain storage for at
|
||||||
|
* least \a max_data_bytes.
|
||||||
|
* @param [in] max_data_bytes <tt>opus_int32</tt>: 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_multistream_encode(
|
||||||
|
OpusMSEncoder *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 multistream Opus frame from floating point input.
|
||||||
|
* @param st <tt>OpusMSEncoder*</tt>: Multistream encoder state.
|
||||||
|
* @param[in] pcm <tt>const float*</tt>: 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
|
||||||
|
* <code>frame_size*channels</code>
|
||||||
|
* samples.
|
||||||
|
* @param frame_size <tt>int</tt>: 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 <tt>unsigned char*</tt>: Output payload.
|
||||||
|
* This must contain storage for at
|
||||||
|
* least \a max_data_bytes.
|
||||||
|
* @param [in] max_data_bytes <tt>opus_int32</tt>: 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_multistream_encode_float(
|
||||||
|
OpusMSEncoder *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 <code>OpusMSEncoder</code> allocated by
|
||||||
|
* opus_multistream_encoder_create().
|
||||||
|
* @param st <tt>OpusMSEncoder*</tt>: Multistream encoder state to be freed.
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT void opus_multistream_encoder_destroy(OpusMSEncoder *st);
|
||||||
|
|
||||||
|
/** Perform a CTL function on a multistream Opus encoder.
|
||||||
|
*
|
||||||
|
* Generally the request and subsequent arguments are generated by a
|
||||||
|
* convenience macro.
|
||||||
|
* @param st <tt>OpusMSEncoder*</tt>: Multistream 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, or @ref opus_multistream_ctls.
|
||||||
|
* @see opus_genericctls
|
||||||
|
* @see opus_encoderctls
|
||||||
|
* @see opus_multistream_ctls
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT int opus_multistream_encoder_ctl(OpusMSEncoder *st, int request, ...) OPUS_ARG_NONNULL(1);
|
||||||
|
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
/**\name Multistream decoder functions */
|
||||||
|
/**@{*/
|
||||||
|
|
||||||
|
/** Gets the size of an <code>OpusMSDecoder</code> structure.
|
||||||
|
* @param streams <tt>int</tt>: The total number of streams coded in the
|
||||||
|
* input.
|
||||||
|
* This must be no more than 255.
|
||||||
|
* @param coupled_streams <tt>int</tt>: 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 (<code>streams +
|
||||||
|
* coupled_streams</code>) 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_multistream_decoder_get_size(
|
||||||
|
int streams,
|
||||||
|
int coupled_streams
|
||||||
|
);
|
||||||
|
|
||||||
|
/** Allocates and initializes a multistream decoder state.
|
||||||
|
* Call opus_multistream_decoder_destroy() to release
|
||||||
|
* this object when finished.
|
||||||
|
* @param Fs <tt>opus_int32</tt>: Sampling rate to decode at (in Hz).
|
||||||
|
* This must be one of 8000, 12000, 16000,
|
||||||
|
* 24000, or 48000.
|
||||||
|
* @param channels <tt>int</tt>: Number of channels to output.
|
||||||
|
* This must be at most 255.
|
||||||
|
* It may be different from the number of coded
|
||||||
|
* channels (<code>streams +
|
||||||
|
* coupled_streams</code>).
|
||||||
|
* @param streams <tt>int</tt>: The total number of streams coded in the
|
||||||
|
* input.
|
||||||
|
* This must be no more than 255.
|
||||||
|
* @param coupled_streams <tt>int</tt>: 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 (<code>streams +
|
||||||
|
* coupled_streams</code>) must be no
|
||||||
|
* more than 255.
|
||||||
|
* @param[in] mapping <code>const unsigned char[channels]</code>: Mapping from
|
||||||
|
* coded channels to output channels, as described in
|
||||||
|
* @ref opus_multistream.
|
||||||
|
* @param[out] error <tt>int *</tt>: Returns #OPUS_OK on success, or an error
|
||||||
|
* code (see @ref opus_errorcodes) on
|
||||||
|
* failure.
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusMSDecoder *opus_multistream_decoder_create(
|
||||||
|
opus_int32 Fs,
|
||||||
|
int channels,
|
||||||
|
int streams,
|
||||||
|
int coupled_streams,
|
||||||
|
const unsigned char *mapping,
|
||||||
|
int *error
|
||||||
|
) OPUS_ARG_NONNULL(5);
|
||||||
|
|
||||||
|
/** Intialize a previously allocated decoder state object.
|
||||||
|
* The memory pointed to by \a st must be at least the size returned by
|
||||||
|
* opus_multistream_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_multistream_decoder_create
|
||||||
|
* @see opus_multistream_deocder_get_size
|
||||||
|
* @param st <tt>OpusMSEncoder*</tt>: Multistream encoder state to initialize.
|
||||||
|
* @param Fs <tt>opus_int32</tt>: Sampling rate to decode at (in Hz).
|
||||||
|
* This must be one of 8000, 12000, 16000,
|
||||||
|
* 24000, or 48000.
|
||||||
|
* @param channels <tt>int</tt>: Number of channels to output.
|
||||||
|
* This must be at most 255.
|
||||||
|
* It may be different from the number of coded
|
||||||
|
* channels (<code>streams +
|
||||||
|
* coupled_streams</code>).
|
||||||
|
* @param streams <tt>int</tt>: The total number of streams coded in the
|
||||||
|
* input.
|
||||||
|
* This must be no more than 255.
|
||||||
|
* @param coupled_streams <tt>int</tt>: 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 (<code>streams +
|
||||||
|
* coupled_streams</code>) must be no
|
||||||
|
* more than 255.
|
||||||
|
* @param[in] mapping <code>const unsigned char[channels]</code>: Mapping from
|
||||||
|
* coded channels to output channels, as described in
|
||||||
|
* @ref opus_multistream.
|
||||||
|
* @returns #OPUS_OK on success, or an error code (see @ref opus_errorcodes)
|
||||||
|
* on failure.
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT int opus_multistream_decoder_init(
|
||||||
|
OpusMSDecoder *st,
|
||||||
|
opus_int32 Fs,
|
||||||
|
int channels,
|
||||||
|
int streams,
|
||||||
|
int coupled_streams,
|
||||||
|
const unsigned char *mapping
|
||||||
|
) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(6);
|
||||||
|
|
||||||
|
/** Decode a multistream Opus packet.
|
||||||
|
* @param st <tt>OpusMSDecoder*</tt>: Multistream decoder state.
|
||||||
|
* @param[in] data <tt>const unsigned char*</tt>: Input payload.
|
||||||
|
* Use a <code>NULL</code>
|
||||||
|
* pointer to indicate packet
|
||||||
|
* loss.
|
||||||
|
* @param len <tt>opus_int32</tt>: Number of bytes in payload.
|
||||||
|
* @param[out] pcm <tt>opus_int16*</tt>: Output signal, with interleaved
|
||||||
|
* samples.
|
||||||
|
* This must contain room for
|
||||||
|
* <code>frame_size*channels</code>
|
||||||
|
* samples.
|
||||||
|
* @param frame_size <tt>int</tt>: 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
|
||||||
|
* <b>must</b> be a multiple of 2.5 ms.
|
||||||
|
* @param decode_fec <tt>int</tt>: 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_multistream_decode(
|
||||||
|
OpusMSDecoder *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 multistream Opus packet with floating point output.
|
||||||
|
* @param st <tt>OpusMSDecoder*</tt>: Multistream decoder state.
|
||||||
|
* @param[in] data <tt>const unsigned char*</tt>: Input payload.
|
||||||
|
* Use a <code>NULL</code>
|
||||||
|
* pointer to indicate packet
|
||||||
|
* loss.
|
||||||
|
* @param len <tt>opus_int32</tt>: Number of bytes in payload.
|
||||||
|
* @param[out] pcm <tt>opus_int16*</tt>: Output signal, with interleaved
|
||||||
|
* samples.
|
||||||
|
* This must contain room for
|
||||||
|
* <code>frame_size*channels</code>
|
||||||
|
* samples.
|
||||||
|
* @param frame_size <tt>int</tt>: 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
|
||||||
|
* <b>must</b> be a multiple of 2.5 ms.
|
||||||
|
* @param decode_fec <tt>int</tt>: 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_multistream_decode_float(
|
||||||
|
OpusMSDecoder *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 multistream Opus decoder.
|
||||||
|
*
|
||||||
|
* Generally the request and subsequent arguments are generated by a
|
||||||
|
* convenience macro.
|
||||||
|
* @param st <tt>OpusMSDecoder*</tt>: Multistream 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, or @ref opus_multistream_ctls.
|
||||||
|
* @see opus_genericctls
|
||||||
|
* @see opus_decoderctls
|
||||||
|
* @see opus_multistream_ctls
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT int opus_multistream_decoder_ctl(OpusMSDecoder *st, int request, ...) OPUS_ARG_NONNULL(1);
|
||||||
|
|
||||||
|
/** Frees an <code>OpusMSDecoder</code> allocated by
|
||||||
|
* opus_multistream_decoder_create().
|
||||||
|
* @param st <tt>OpusMSDecoder</tt>: Multistream decoder state to be freed.
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT void opus_multistream_decoder_destroy(OpusMSDecoder *st);
|
||||||
|
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* OPUS_MULTISTREAM_H */
|
159
Frameworks/Opus/Opus/opus/include/opus_types.h
Normal file
159
Frameworks/Opus/Opus/opus/include/opus_types.h
Normal file
|
@ -0,0 +1,159 @@
|
||||||
|
/* (C) COPYRIGHT 1994-2002 Xiph.Org Foundation */
|
||||||
|
/* Modified by Jean-Marc Valin */
|
||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
/* opus_types.h based on ogg_types.h from libogg */
|
||||||
|
|
||||||
|
/**
|
||||||
|
@file opus_types.h
|
||||||
|
@brief Opus reference implementation types
|
||||||
|
*/
|
||||||
|
#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 <stdint.h>
|
||||||
|
|
||||||
|
typedef int16_t opus_int16;
|
||||||
|
typedef uint16_t opus_uint16;
|
||||||
|
typedef int32_t opus_int32;
|
||||||
|
typedef uint32_t opus_uint32;
|
||||||
|
#elif defined(_WIN32)
|
||||||
|
|
||||||
|
# if defined(__CYGWIN__)
|
||||||
|
# include <_G_config.h>
|
||||||
|
typedef _G_int32_t opus_int32;
|
||||||
|
typedef _G_uint32_t opus_uint32;
|
||||||
|
typedef _G_int16 opus_int16;
|
||||||
|
typedef _G_uint16 opus_uint16;
|
||||||
|
# elif defined(__MINGW32__)
|
||||||
|
typedef short opus_int16;
|
||||||
|
typedef unsigned short opus_uint16;
|
||||||
|
typedef int opus_int32;
|
||||||
|
typedef unsigned int opus_uint32;
|
||||||
|
# elif defined(__MWERKS__)
|
||||||
|
typedef int opus_int32;
|
||||||
|
typedef unsigned int opus_uint32;
|
||||||
|
typedef short opus_int16;
|
||||||
|
typedef unsigned short opus_uint16;
|
||||||
|
# else
|
||||||
|
/* MSVC/Borland */
|
||||||
|
typedef __int32 opus_int32;
|
||||||
|
typedef unsigned __int32 opus_uint32;
|
||||||
|
typedef __int16 opus_int16;
|
||||||
|
typedef unsigned __int16 opus_uint16;
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#elif defined(__MACOS__)
|
||||||
|
|
||||||
|
# include <sys/types.h>
|
||||||
|
typedef SInt16 opus_int16;
|
||||||
|
typedef UInt16 opus_uint16;
|
||||||
|
typedef SInt32 opus_int32;
|
||||||
|
typedef UInt32 opus_uint32;
|
||||||
|
|
||||||
|
#elif (defined(__APPLE__) && defined(__MACH__)) /* MacOS X Framework build */
|
||||||
|
|
||||||
|
# include <sys/types.h>
|
||||||
|
typedef int16_t opus_int16;
|
||||||
|
typedef u_int16_t opus_uint16;
|
||||||
|
typedef int32_t opus_int32;
|
||||||
|
typedef u_int32_t opus_uint32;
|
||||||
|
|
||||||
|
#elif defined(__BEOS__)
|
||||||
|
|
||||||
|
/* Be */
|
||||||
|
# include <inttypes.h>
|
||||||
|
typedef int16 opus_int16;
|
||||||
|
typedef u_int16 opus_uint16;
|
||||||
|
typedef int32_t opus_int32;
|
||||||
|
typedef u_int32_t opus_uint32;
|
||||||
|
|
||||||
|
#elif defined (__EMX__)
|
||||||
|
|
||||||
|
/* OS/2 GCC */
|
||||||
|
typedef short opus_int16;
|
||||||
|
typedef unsigned short opus_uint16;
|
||||||
|
typedef int opus_int32;
|
||||||
|
typedef unsigned int opus_uint32;
|
||||||
|
|
||||||
|
#elif defined (DJGPP)
|
||||||
|
|
||||||
|
/* DJGPP */
|
||||||
|
typedef short opus_int16;
|
||||||
|
typedef unsigned short opus_uint16;
|
||||||
|
typedef int opus_int32;
|
||||||
|
typedef unsigned int opus_uint32;
|
||||||
|
|
||||||
|
#elif defined(R5900)
|
||||||
|
|
||||||
|
/* PS2 EE */
|
||||||
|
typedef int opus_int32;
|
||||||
|
typedef unsigned opus_uint32;
|
||||||
|
typedef short opus_int16;
|
||||||
|
typedef unsigned short opus_uint16;
|
||||||
|
|
||||||
|
#elif defined(__SYMBIAN32__)
|
||||||
|
|
||||||
|
/* Symbian GCC */
|
||||||
|
typedef signed short opus_int16;
|
||||||
|
typedef unsigned short opus_uint16;
|
||||||
|
typedef signed int opus_int32;
|
||||||
|
typedef unsigned int opus_uint32;
|
||||||
|
|
||||||
|
#elif defined(CONFIG_TI_C54X) || defined (CONFIG_TI_C55X)
|
||||||
|
|
||||||
|
typedef short opus_int16;
|
||||||
|
typedef unsigned short opus_uint16;
|
||||||
|
typedef long opus_int32;
|
||||||
|
typedef unsigned long opus_uint32;
|
||||||
|
|
||||||
|
#elif defined(CONFIG_TI_C6X)
|
||||||
|
|
||||||
|
typedef short opus_int16;
|
||||||
|
typedef unsigned short opus_uint16;
|
||||||
|
typedef int opus_int32;
|
||||||
|
typedef unsigned int opus_uint32;
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/* Give up, take a reasonable guess */
|
||||||
|
typedef short opus_int16;
|
||||||
|
typedef unsigned short opus_uint16;
|
||||||
|
typedef int opus_int32;
|
||||||
|
typedef unsigned int opus_uint32;
|
||||||
|
|
||||||
|
#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 */
|
527
Frameworks/Opus/Opus/opus/install-sh
Executable file
527
Frameworks/Opus/Opus/opus/install-sh
Executable file
|
@ -0,0 +1,527 @@
|
||||||
|
#!/bin/sh
|
||||||
|
# install - install a program, script, or datafile
|
||||||
|
|
||||||
|
scriptversion=2011-01-19.21; # UTC
|
||||||
|
|
||||||
|
# This originates from X11R5 (mit/util/scripts/install.sh), which was
|
||||||
|
# later released in X11R6 (xc/config/util/install.sh) with the
|
||||||
|
# following copyright and license.
|
||||||
|
#
|
||||||
|
# Copyright (C) 1994 X Consortium
|
||||||
|
#
|
||||||
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
# of this software and associated documentation files (the "Software"), to
|
||||||
|
# deal in the Software without restriction, including without limitation the
|
||||||
|
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||||
|
# sell copies of the Software, and to permit persons to whom the Software is
|
||||||
|
# furnished to do so, subject to the following conditions:
|
||||||
|
#
|
||||||
|
# The above copyright notice and this permission notice shall be included in
|
||||||
|
# all copies or substantial portions of the Software.
|
||||||
|
#
|
||||||
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||||
|
# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
|
||||||
|
# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
#
|
||||||
|
# Except as contained in this notice, the name of the X Consortium shall not
|
||||||
|
# be used in advertising or otherwise to promote the sale, use or other deal-
|
||||||
|
# ings in this Software without prior written authorization from the X Consor-
|
||||||
|
# tium.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# FSF changes to this file are in the public domain.
|
||||||
|
#
|
||||||
|
# Calling this script install-sh is preferred over install.sh, to prevent
|
||||||
|
# `make' implicit rules from creating a file called install from it
|
||||||
|
# when there is no Makefile.
|
||||||
|
#
|
||||||
|
# This script is compatible with the BSD install script, but was written
|
||||||
|
# from scratch.
|
||||||
|
|
||||||
|
nl='
|
||||||
|
'
|
||||||
|
IFS=" "" $nl"
|
||||||
|
|
||||||
|
# set DOITPROG to echo to test this script
|
||||||
|
|
||||||
|
# Don't use :- since 4.3BSD and earlier shells don't like it.
|
||||||
|
doit=${DOITPROG-}
|
||||||
|
if test -z "$doit"; then
|
||||||
|
doit_exec=exec
|
||||||
|
else
|
||||||
|
doit_exec=$doit
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Put in absolute file names if you don't have them in your path;
|
||||||
|
# or use environment vars.
|
||||||
|
|
||||||
|
chgrpprog=${CHGRPPROG-chgrp}
|
||||||
|
chmodprog=${CHMODPROG-chmod}
|
||||||
|
chownprog=${CHOWNPROG-chown}
|
||||||
|
cmpprog=${CMPPROG-cmp}
|
||||||
|
cpprog=${CPPROG-cp}
|
||||||
|
mkdirprog=${MKDIRPROG-mkdir}
|
||||||
|
mvprog=${MVPROG-mv}
|
||||||
|
rmprog=${RMPROG-rm}
|
||||||
|
stripprog=${STRIPPROG-strip}
|
||||||
|
|
||||||
|
posix_glob='?'
|
||||||
|
initialize_posix_glob='
|
||||||
|
test "$posix_glob" != "?" || {
|
||||||
|
if (set -f) 2>/dev/null; then
|
||||||
|
posix_glob=
|
||||||
|
else
|
||||||
|
posix_glob=:
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
'
|
||||||
|
|
||||||
|
posix_mkdir=
|
||||||
|
|
||||||
|
# Desired mode of installed file.
|
||||||
|
mode=0755
|
||||||
|
|
||||||
|
chgrpcmd=
|
||||||
|
chmodcmd=$chmodprog
|
||||||
|
chowncmd=
|
||||||
|
mvcmd=$mvprog
|
||||||
|
rmcmd="$rmprog -f"
|
||||||
|
stripcmd=
|
||||||
|
|
||||||
|
src=
|
||||||
|
dst=
|
||||||
|
dir_arg=
|
||||||
|
dst_arg=
|
||||||
|
|
||||||
|
copy_on_change=false
|
||||||
|
no_target_directory=
|
||||||
|
|
||||||
|
usage="\
|
||||||
|
Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
|
||||||
|
or: $0 [OPTION]... SRCFILES... DIRECTORY
|
||||||
|
or: $0 [OPTION]... -t DIRECTORY SRCFILES...
|
||||||
|
or: $0 [OPTION]... -d DIRECTORIES...
|
||||||
|
|
||||||
|
In the 1st form, copy SRCFILE to DSTFILE.
|
||||||
|
In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
|
||||||
|
In the 4th, create DIRECTORIES.
|
||||||
|
|
||||||
|
Options:
|
||||||
|
--help display this help and exit.
|
||||||
|
--version display version info and exit.
|
||||||
|
|
||||||
|
-c (ignored)
|
||||||
|
-C install only if different (preserve the last data modification time)
|
||||||
|
-d create directories instead of installing files.
|
||||||
|
-g GROUP $chgrpprog installed files to GROUP.
|
||||||
|
-m MODE $chmodprog installed files to MODE.
|
||||||
|
-o USER $chownprog installed files to USER.
|
||||||
|
-s $stripprog installed files.
|
||||||
|
-t DIRECTORY install into DIRECTORY.
|
||||||
|
-T report an error if DSTFILE is a directory.
|
||||||
|
|
||||||
|
Environment variables override the default commands:
|
||||||
|
CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
|
||||||
|
RMPROG STRIPPROG
|
||||||
|
"
|
||||||
|
|
||||||
|
while test $# -ne 0; do
|
||||||
|
case $1 in
|
||||||
|
-c) ;;
|
||||||
|
|
||||||
|
-C) copy_on_change=true;;
|
||||||
|
|
||||||
|
-d) dir_arg=true;;
|
||||||
|
|
||||||
|
-g) chgrpcmd="$chgrpprog $2"
|
||||||
|
shift;;
|
||||||
|
|
||||||
|
--help) echo "$usage"; exit $?;;
|
||||||
|
|
||||||
|
-m) mode=$2
|
||||||
|
case $mode in
|
||||||
|
*' '* | *' '* | *'
|
||||||
|
'* | *'*'* | *'?'* | *'['*)
|
||||||
|
echo "$0: invalid mode: $mode" >&2
|
||||||
|
exit 1;;
|
||||||
|
esac
|
||||||
|
shift;;
|
||||||
|
|
||||||
|
-o) chowncmd="$chownprog $2"
|
||||||
|
shift;;
|
||||||
|
|
||||||
|
-s) stripcmd=$stripprog;;
|
||||||
|
|
||||||
|
-t) dst_arg=$2
|
||||||
|
# Protect names problematic for `test' and other utilities.
|
||||||
|
case $dst_arg in
|
||||||
|
-* | [=\(\)!]) dst_arg=./$dst_arg;;
|
||||||
|
esac
|
||||||
|
shift;;
|
||||||
|
|
||||||
|
-T) no_target_directory=true;;
|
||||||
|
|
||||||
|
--version) echo "$0 $scriptversion"; exit $?;;
|
||||||
|
|
||||||
|
--) shift
|
||||||
|
break;;
|
||||||
|
|
||||||
|
-*) echo "$0: invalid option: $1" >&2
|
||||||
|
exit 1;;
|
||||||
|
|
||||||
|
*) break;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
|
||||||
|
# When -d is used, all remaining arguments are directories to create.
|
||||||
|
# When -t is used, the destination is already specified.
|
||||||
|
# Otherwise, the last argument is the destination. Remove it from $@.
|
||||||
|
for arg
|
||||||
|
do
|
||||||
|
if test -n "$dst_arg"; then
|
||||||
|
# $@ is not empty: it contains at least $arg.
|
||||||
|
set fnord "$@" "$dst_arg"
|
||||||
|
shift # fnord
|
||||||
|
fi
|
||||||
|
shift # arg
|
||||||
|
dst_arg=$arg
|
||||||
|
# Protect names problematic for `test' and other utilities.
|
||||||
|
case $dst_arg in
|
||||||
|
-* | [=\(\)!]) dst_arg=./$dst_arg;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test $# -eq 0; then
|
||||||
|
if test -z "$dir_arg"; then
|
||||||
|
echo "$0: no input file specified." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
# It's OK to call `install-sh -d' without argument.
|
||||||
|
# This can happen when creating conditional directories.
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -z "$dir_arg"; then
|
||||||
|
do_exit='(exit $ret); exit $ret'
|
||||||
|
trap "ret=129; $do_exit" 1
|
||||||
|
trap "ret=130; $do_exit" 2
|
||||||
|
trap "ret=141; $do_exit" 13
|
||||||
|
trap "ret=143; $do_exit" 15
|
||||||
|
|
||||||
|
# Set umask so as not to create temps with too-generous modes.
|
||||||
|
# However, 'strip' requires both read and write access to temps.
|
||||||
|
case $mode in
|
||||||
|
# Optimize common cases.
|
||||||
|
*644) cp_umask=133;;
|
||||||
|
*755) cp_umask=22;;
|
||||||
|
|
||||||
|
*[0-7])
|
||||||
|
if test -z "$stripcmd"; then
|
||||||
|
u_plus_rw=
|
||||||
|
else
|
||||||
|
u_plus_rw='% 200'
|
||||||
|
fi
|
||||||
|
cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
|
||||||
|
*)
|
||||||
|
if test -z "$stripcmd"; then
|
||||||
|
u_plus_rw=
|
||||||
|
else
|
||||||
|
u_plus_rw=,u+rw
|
||||||
|
fi
|
||||||
|
cp_umask=$mode$u_plus_rw;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
for src
|
||||||
|
do
|
||||||
|
# Protect names problematic for `test' and other utilities.
|
||||||
|
case $src in
|
||||||
|
-* | [=\(\)!]) src=./$src;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if test -n "$dir_arg"; then
|
||||||
|
dst=$src
|
||||||
|
dstdir=$dst
|
||||||
|
test -d "$dstdir"
|
||||||
|
dstdir_status=$?
|
||||||
|
else
|
||||||
|
|
||||||
|
# Waiting for this to be detected by the "$cpprog $src $dsttmp" command
|
||||||
|
# might cause directories to be created, which would be especially bad
|
||||||
|
# if $src (and thus $dsttmp) contains '*'.
|
||||||
|
if test ! -f "$src" && test ! -d "$src"; then
|
||||||
|
echo "$0: $src does not exist." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -z "$dst_arg"; then
|
||||||
|
echo "$0: no destination specified." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
dst=$dst_arg
|
||||||
|
|
||||||
|
# If destination is a directory, append the input filename; won't work
|
||||||
|
# if double slashes aren't ignored.
|
||||||
|
if test -d "$dst"; then
|
||||||
|
if test -n "$no_target_directory"; then
|
||||||
|
echo "$0: $dst_arg: Is a directory" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
dstdir=$dst
|
||||||
|
dst=$dstdir/`basename "$src"`
|
||||||
|
dstdir_status=0
|
||||||
|
else
|
||||||
|
# Prefer dirname, but fall back on a substitute if dirname fails.
|
||||||
|
dstdir=`
|
||||||
|
(dirname "$dst") 2>/dev/null ||
|
||||||
|
expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
|
||||||
|
X"$dst" : 'X\(//\)[^/]' \| \
|
||||||
|
X"$dst" : 'X\(//\)$' \| \
|
||||||
|
X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
|
||||||
|
echo X"$dst" |
|
||||||
|
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
|
||||||
|
s//\1/
|
||||||
|
q
|
||||||
|
}
|
||||||
|
/^X\(\/\/\)[^/].*/{
|
||||||
|
s//\1/
|
||||||
|
q
|
||||||
|
}
|
||||||
|
/^X\(\/\/\)$/{
|
||||||
|
s//\1/
|
||||||
|
q
|
||||||
|
}
|
||||||
|
/^X\(\/\).*/{
|
||||||
|
s//\1/
|
||||||
|
q
|
||||||
|
}
|
||||||
|
s/.*/./; q'
|
||||||
|
`
|
||||||
|
|
||||||
|
test -d "$dstdir"
|
||||||
|
dstdir_status=$?
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
obsolete_mkdir_used=false
|
||||||
|
|
||||||
|
if test $dstdir_status != 0; then
|
||||||
|
case $posix_mkdir in
|
||||||
|
'')
|
||||||
|
# Create intermediate dirs using mode 755 as modified by the umask.
|
||||||
|
# This is like FreeBSD 'install' as of 1997-10-28.
|
||||||
|
umask=`umask`
|
||||||
|
case $stripcmd.$umask in
|
||||||
|
# Optimize common cases.
|
||||||
|
*[2367][2367]) mkdir_umask=$umask;;
|
||||||
|
.*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
|
||||||
|
|
||||||
|
*[0-7])
|
||||||
|
mkdir_umask=`expr $umask + 22 \
|
||||||
|
- $umask % 100 % 40 + $umask % 20 \
|
||||||
|
- $umask % 10 % 4 + $umask % 2
|
||||||
|
`;;
|
||||||
|
*) mkdir_umask=$umask,go-w;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# With -d, create the new directory with the user-specified mode.
|
||||||
|
# Otherwise, rely on $mkdir_umask.
|
||||||
|
if test -n "$dir_arg"; then
|
||||||
|
mkdir_mode=-m$mode
|
||||||
|
else
|
||||||
|
mkdir_mode=
|
||||||
|
fi
|
||||||
|
|
||||||
|
posix_mkdir=false
|
||||||
|
case $umask in
|
||||||
|
*[123567][0-7][0-7])
|
||||||
|
# POSIX mkdir -p sets u+wx bits regardless of umask, which
|
||||||
|
# is incompatible with FreeBSD 'install' when (umask & 300) != 0.
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
|
||||||
|
trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
|
||||||
|
|
||||||
|
if (umask $mkdir_umask &&
|
||||||
|
exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
|
||||||
|
then
|
||||||
|
if test -z "$dir_arg" || {
|
||||||
|
# Check for POSIX incompatibilities with -m.
|
||||||
|
# HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
|
||||||
|
# other-writeable bit of parent directory when it shouldn't.
|
||||||
|
# FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
|
||||||
|
ls_ld_tmpdir=`ls -ld "$tmpdir"`
|
||||||
|
case $ls_ld_tmpdir in
|
||||||
|
d????-?r-*) different_mode=700;;
|
||||||
|
d????-?--*) different_mode=755;;
|
||||||
|
*) false;;
|
||||||
|
esac &&
|
||||||
|
$mkdirprog -m$different_mode -p -- "$tmpdir" && {
|
||||||
|
ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
|
||||||
|
test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
then posix_mkdir=:
|
||||||
|
fi
|
||||||
|
rmdir "$tmpdir/d" "$tmpdir"
|
||||||
|
else
|
||||||
|
# Remove any dirs left behind by ancient mkdir implementations.
|
||||||
|
rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
|
||||||
|
fi
|
||||||
|
trap '' 0;;
|
||||||
|
esac;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if
|
||||||
|
$posix_mkdir && (
|
||||||
|
umask $mkdir_umask &&
|
||||||
|
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
|
||||||
|
)
|
||||||
|
then :
|
||||||
|
else
|
||||||
|
|
||||||
|
# The umask is ridiculous, or mkdir does not conform to POSIX,
|
||||||
|
# or it failed possibly due to a race condition. Create the
|
||||||
|
# directory the slow way, step by step, checking for races as we go.
|
||||||
|
|
||||||
|
case $dstdir in
|
||||||
|
/*) prefix='/';;
|
||||||
|
[-=\(\)!]*) prefix='./';;
|
||||||
|
*) prefix='';;
|
||||||
|
esac
|
||||||
|
|
||||||
|
eval "$initialize_posix_glob"
|
||||||
|
|
||||||
|
oIFS=$IFS
|
||||||
|
IFS=/
|
||||||
|
$posix_glob set -f
|
||||||
|
set fnord $dstdir
|
||||||
|
shift
|
||||||
|
$posix_glob set +f
|
||||||
|
IFS=$oIFS
|
||||||
|
|
||||||
|
prefixes=
|
||||||
|
|
||||||
|
for d
|
||||||
|
do
|
||||||
|
test X"$d" = X && continue
|
||||||
|
|
||||||
|
prefix=$prefix$d
|
||||||
|
if test -d "$prefix"; then
|
||||||
|
prefixes=
|
||||||
|
else
|
||||||
|
if $posix_mkdir; then
|
||||||
|
(umask=$mkdir_umask &&
|
||||||
|
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
|
||||||
|
# Don't fail if two instances are running concurrently.
|
||||||
|
test -d "$prefix" || exit 1
|
||||||
|
else
|
||||||
|
case $prefix in
|
||||||
|
*\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
|
||||||
|
*) qprefix=$prefix;;
|
||||||
|
esac
|
||||||
|
prefixes="$prefixes '$qprefix'"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
prefix=$prefix/
|
||||||
|
done
|
||||||
|
|
||||||
|
if test -n "$prefixes"; then
|
||||||
|
# Don't fail if two instances are running concurrently.
|
||||||
|
(umask $mkdir_umask &&
|
||||||
|
eval "\$doit_exec \$mkdirprog $prefixes") ||
|
||||||
|
test -d "$dstdir" || exit 1
|
||||||
|
obsolete_mkdir_used=true
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -n "$dir_arg"; then
|
||||||
|
{ test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
|
||||||
|
{ test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
|
||||||
|
{ test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
|
||||||
|
test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
|
||||||
|
else
|
||||||
|
|
||||||
|
# Make a couple of temp file names in the proper directory.
|
||||||
|
dsttmp=$dstdir/_inst.$$_
|
||||||
|
rmtmp=$dstdir/_rm.$$_
|
||||||
|
|
||||||
|
# Trap to clean up those temp files at exit.
|
||||||
|
trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
|
||||||
|
|
||||||
|
# Copy the file name to the temp name.
|
||||||
|
(umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
|
||||||
|
|
||||||
|
# and set any options; do chmod last to preserve setuid bits.
|
||||||
|
#
|
||||||
|
# If any of these fail, we abort the whole thing. If we want to
|
||||||
|
# ignore errors from any of these, just make sure not to ignore
|
||||||
|
# errors from the above "$doit $cpprog $src $dsttmp" command.
|
||||||
|
#
|
||||||
|
{ test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
|
||||||
|
{ test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
|
||||||
|
{ test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
|
||||||
|
{ test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
|
||||||
|
|
||||||
|
# If -C, don't bother to copy if it wouldn't change the file.
|
||||||
|
if $copy_on_change &&
|
||||||
|
old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
|
||||||
|
new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
|
||||||
|
|
||||||
|
eval "$initialize_posix_glob" &&
|
||||||
|
$posix_glob set -f &&
|
||||||
|
set X $old && old=:$2:$4:$5:$6 &&
|
||||||
|
set X $new && new=:$2:$4:$5:$6 &&
|
||||||
|
$posix_glob set +f &&
|
||||||
|
|
||||||
|
test "$old" = "$new" &&
|
||||||
|
$cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
|
||||||
|
then
|
||||||
|
rm -f "$dsttmp"
|
||||||
|
else
|
||||||
|
# Rename the file to the real destination.
|
||||||
|
$doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
|
||||||
|
|
||||||
|
# The rename failed, perhaps because mv can't rename something else
|
||||||
|
# to itself, or perhaps because mv is so ancient that it does not
|
||||||
|
# support -f.
|
||||||
|
{
|
||||||
|
# Now remove or move aside any old file at destination location.
|
||||||
|
# We try this two ways since rm can't unlink itself on some
|
||||||
|
# systems and the destination file might be busy for other
|
||||||
|
# reasons. In this case, the final cleanup might fail but the new
|
||||||
|
# file should still install successfully.
|
||||||
|
{
|
||||||
|
test ! -f "$dst" ||
|
||||||
|
$doit $rmcmd -f "$dst" 2>/dev/null ||
|
||||||
|
{ $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
|
||||||
|
{ $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
|
||||||
|
} ||
|
||||||
|
{ echo "$0: cannot unlink or rename $dst" >&2
|
||||||
|
(exit 1); exit 1
|
||||||
|
}
|
||||||
|
} &&
|
||||||
|
|
||||||
|
# Now rename the file to the real destination.
|
||||||
|
$doit $mvcmd "$dsttmp" "$dst"
|
||||||
|
}
|
||||||
|
fi || exit 1
|
||||||
|
|
||||||
|
trap '' 0
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Local variables:
|
||||||
|
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||||
|
# time-stamp-start: "scriptversion="
|
||||||
|
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||||
|
# time-stamp-time-zone: "UTC"
|
||||||
|
# time-stamp-end: "; # UTC"
|
||||||
|
# End:
|
9655
Frameworks/Opus/Opus/opus/ltmain.sh
Normal file
9655
Frameworks/Opus/Opus/opus/ltmain.sh
Normal file
File diff suppressed because it is too large
Load diff
7986
Frameworks/Opus/Opus/opus/m4/libtool.m4
vendored
Normal file
7986
Frameworks/Opus/Opus/opus/m4/libtool.m4
vendored
Normal file
File diff suppressed because it is too large
Load diff
384
Frameworks/Opus/Opus/opus/m4/ltoptions.m4
vendored
Normal file
384
Frameworks/Opus/Opus/opus/m4/ltoptions.m4
vendored
Normal file
|
@ -0,0 +1,384 @@
|
||||||
|
# Helper functions for option handling. -*- Autoconf -*-
|
||||||
|
#
|
||||||
|
# Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation,
|
||||||
|
# Inc.
|
||||||
|
# Written by Gary V. Vaughan, 2004
|
||||||
|
#
|
||||||
|
# This file is free software; the Free Software Foundation gives
|
||||||
|
# unlimited permission to copy and/or distribute it, with or without
|
||||||
|
# modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
# serial 7 ltoptions.m4
|
||||||
|
|
||||||
|
# This is to help aclocal find these macros, as it can't see m4_define.
|
||||||
|
AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
|
||||||
|
|
||||||
|
|
||||||
|
# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME)
|
||||||
|
# ------------------------------------------
|
||||||
|
m4_define([_LT_MANGLE_OPTION],
|
||||||
|
[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])])
|
||||||
|
|
||||||
|
|
||||||
|
# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME)
|
||||||
|
# ---------------------------------------
|
||||||
|
# Set option OPTION-NAME for macro MACRO-NAME, and if there is a
|
||||||
|
# matching handler defined, dispatch to it. Other OPTION-NAMEs are
|
||||||
|
# saved as a flag.
|
||||||
|
m4_define([_LT_SET_OPTION],
|
||||||
|
[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl
|
||||||
|
m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),
|
||||||
|
_LT_MANGLE_DEFUN([$1], [$2]),
|
||||||
|
[m4_warning([Unknown $1 option `$2'])])[]dnl
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
|
# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET])
|
||||||
|
# ------------------------------------------------------------
|
||||||
|
# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
|
||||||
|
m4_define([_LT_IF_OPTION],
|
||||||
|
[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])])
|
||||||
|
|
||||||
|
|
||||||
|
# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET)
|
||||||
|
# -------------------------------------------------------
|
||||||
|
# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME
|
||||||
|
# are set.
|
||||||
|
m4_define([_LT_UNLESS_OPTIONS],
|
||||||
|
[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
|
||||||
|
[m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option),
|
||||||
|
[m4_define([$0_found])])])[]dnl
|
||||||
|
m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3
|
||||||
|
])[]dnl
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
|
# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST)
|
||||||
|
# ----------------------------------------
|
||||||
|
# OPTION-LIST is a space-separated list of Libtool options associated
|
||||||
|
# with MACRO-NAME. If any OPTION has a matching handler declared with
|
||||||
|
# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about
|
||||||
|
# the unknown option and exit.
|
||||||
|
m4_defun([_LT_SET_OPTIONS],
|
||||||
|
[# Set options
|
||||||
|
m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
|
||||||
|
[_LT_SET_OPTION([$1], _LT_Option)])
|
||||||
|
|
||||||
|
m4_if([$1],[LT_INIT],[
|
||||||
|
dnl
|
||||||
|
dnl Simply set some default values (i.e off) if boolean options were not
|
||||||
|
dnl specified:
|
||||||
|
_LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no
|
||||||
|
])
|
||||||
|
_LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no
|
||||||
|
])
|
||||||
|
dnl
|
||||||
|
dnl If no reference was made to various pairs of opposing options, then
|
||||||
|
dnl we run the default mode handler for the pair. For example, if neither
|
||||||
|
dnl `shared' nor `disable-shared' was passed, we enable building of shared
|
||||||
|
dnl archives by default:
|
||||||
|
_LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])
|
||||||
|
_LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])
|
||||||
|
_LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])
|
||||||
|
_LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],
|
||||||
|
[_LT_ENABLE_FAST_INSTALL])
|
||||||
|
])
|
||||||
|
])# _LT_SET_OPTIONS
|
||||||
|
|
||||||
|
|
||||||
|
## --------------------------------- ##
|
||||||
|
## Macros to handle LT_INIT options. ##
|
||||||
|
## --------------------------------- ##
|
||||||
|
|
||||||
|
# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME)
|
||||||
|
# -----------------------------------------
|
||||||
|
m4_define([_LT_MANGLE_DEFUN],
|
||||||
|
[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])])
|
||||||
|
|
||||||
|
|
||||||
|
# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE)
|
||||||
|
# -----------------------------------------------
|
||||||
|
m4_define([LT_OPTION_DEFINE],
|
||||||
|
[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl
|
||||||
|
])# LT_OPTION_DEFINE
|
||||||
|
|
||||||
|
|
||||||
|
# dlopen
|
||||||
|
# ------
|
||||||
|
LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes
|
||||||
|
])
|
||||||
|
|
||||||
|
AU_DEFUN([AC_LIBTOOL_DLOPEN],
|
||||||
|
[_LT_SET_OPTION([LT_INIT], [dlopen])
|
||||||
|
AC_DIAGNOSE([obsolete],
|
||||||
|
[$0: Remove this warning and the call to _LT_SET_OPTION when you
|
||||||
|
put the `dlopen' option into LT_INIT's first parameter.])
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl aclocal-1.4 backwards compatibility:
|
||||||
|
dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], [])
|
||||||
|
|
||||||
|
|
||||||
|
# win32-dll
|
||||||
|
# ---------
|
||||||
|
# Declare package support for building win32 dll's.
|
||||||
|
LT_OPTION_DEFINE([LT_INIT], [win32-dll],
|
||||||
|
[enable_win32_dll=yes
|
||||||
|
|
||||||
|
case $host in
|
||||||
|
*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*)
|
||||||
|
AC_CHECK_TOOL(AS, as, false)
|
||||||
|
AC_CHECK_TOOL(DLLTOOL, dlltool, false)
|
||||||
|
AC_CHECK_TOOL(OBJDUMP, objdump, false)
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
test -z "$AS" && AS=as
|
||||||
|
_LT_DECL([], [AS], [1], [Assembler program])dnl
|
||||||
|
|
||||||
|
test -z "$DLLTOOL" && DLLTOOL=dlltool
|
||||||
|
_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl
|
||||||
|
|
||||||
|
test -z "$OBJDUMP" && OBJDUMP=objdump
|
||||||
|
_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl
|
||||||
|
])# win32-dll
|
||||||
|
|
||||||
|
AU_DEFUN([AC_LIBTOOL_WIN32_DLL],
|
||||||
|
[AC_REQUIRE([AC_CANONICAL_HOST])dnl
|
||||||
|
_LT_SET_OPTION([LT_INIT], [win32-dll])
|
||||||
|
AC_DIAGNOSE([obsolete],
|
||||||
|
[$0: Remove this warning and the call to _LT_SET_OPTION when you
|
||||||
|
put the `win32-dll' option into LT_INIT's first parameter.])
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl aclocal-1.4 backwards compatibility:
|
||||||
|
dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [])
|
||||||
|
|
||||||
|
|
||||||
|
# _LT_ENABLE_SHARED([DEFAULT])
|
||||||
|
# ----------------------------
|
||||||
|
# implement the --enable-shared flag, and supports the `shared' and
|
||||||
|
# `disable-shared' LT_INIT options.
|
||||||
|
# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
|
||||||
|
m4_define([_LT_ENABLE_SHARED],
|
||||||
|
[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl
|
||||||
|
AC_ARG_ENABLE([shared],
|
||||||
|
[AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
|
||||||
|
[build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])],
|
||||||
|
[p=${PACKAGE-default}
|
||||||
|
case $enableval in
|
||||||
|
yes) enable_shared=yes ;;
|
||||||
|
no) enable_shared=no ;;
|
||||||
|
*)
|
||||||
|
enable_shared=no
|
||||||
|
# Look at the argument we got. We use all the common list separators.
|
||||||
|
lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
|
||||||
|
for pkg in $enableval; do
|
||||||
|
IFS="$lt_save_ifs"
|
||||||
|
if test "X$pkg" = "X$p"; then
|
||||||
|
enable_shared=yes
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
IFS="$lt_save_ifs"
|
||||||
|
;;
|
||||||
|
esac],
|
||||||
|
[enable_shared=]_LT_ENABLE_SHARED_DEFAULT)
|
||||||
|
|
||||||
|
_LT_DECL([build_libtool_libs], [enable_shared], [0],
|
||||||
|
[Whether or not to build shared libraries])
|
||||||
|
])# _LT_ENABLE_SHARED
|
||||||
|
|
||||||
|
LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])])
|
||||||
|
LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])])
|
||||||
|
|
||||||
|
# Old names:
|
||||||
|
AC_DEFUN([AC_ENABLE_SHARED],
|
||||||
|
[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared])
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_DEFUN([AC_DISABLE_SHARED],
|
||||||
|
[_LT_SET_OPTION([LT_INIT], [disable-shared])
|
||||||
|
])
|
||||||
|
|
||||||
|
AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])
|
||||||
|
AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
|
||||||
|
|
||||||
|
dnl aclocal-1.4 backwards compatibility:
|
||||||
|
dnl AC_DEFUN([AM_ENABLE_SHARED], [])
|
||||||
|
dnl AC_DEFUN([AM_DISABLE_SHARED], [])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# _LT_ENABLE_STATIC([DEFAULT])
|
||||||
|
# ----------------------------
|
||||||
|
# implement the --enable-static flag, and support the `static' and
|
||||||
|
# `disable-static' LT_INIT options.
|
||||||
|
# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
|
||||||
|
m4_define([_LT_ENABLE_STATIC],
|
||||||
|
[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl
|
||||||
|
AC_ARG_ENABLE([static],
|
||||||
|
[AS_HELP_STRING([--enable-static@<:@=PKGS@:>@],
|
||||||
|
[build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])],
|
||||||
|
[p=${PACKAGE-default}
|
||||||
|
case $enableval in
|
||||||
|
yes) enable_static=yes ;;
|
||||||
|
no) enable_static=no ;;
|
||||||
|
*)
|
||||||
|
enable_static=no
|
||||||
|
# Look at the argument we got. We use all the common list separators.
|
||||||
|
lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
|
||||||
|
for pkg in $enableval; do
|
||||||
|
IFS="$lt_save_ifs"
|
||||||
|
if test "X$pkg" = "X$p"; then
|
||||||
|
enable_static=yes
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
IFS="$lt_save_ifs"
|
||||||
|
;;
|
||||||
|
esac],
|
||||||
|
[enable_static=]_LT_ENABLE_STATIC_DEFAULT)
|
||||||
|
|
||||||
|
_LT_DECL([build_old_libs], [enable_static], [0],
|
||||||
|
[Whether or not to build static libraries])
|
||||||
|
])# _LT_ENABLE_STATIC
|
||||||
|
|
||||||
|
LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])])
|
||||||
|
LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])])
|
||||||
|
|
||||||
|
# Old names:
|
||||||
|
AC_DEFUN([AC_ENABLE_STATIC],
|
||||||
|
[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static])
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_DEFUN([AC_DISABLE_STATIC],
|
||||||
|
[_LT_SET_OPTION([LT_INIT], [disable-static])
|
||||||
|
])
|
||||||
|
|
||||||
|
AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])
|
||||||
|
AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
|
||||||
|
|
||||||
|
dnl aclocal-1.4 backwards compatibility:
|
||||||
|
dnl AC_DEFUN([AM_ENABLE_STATIC], [])
|
||||||
|
dnl AC_DEFUN([AM_DISABLE_STATIC], [])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# _LT_ENABLE_FAST_INSTALL([DEFAULT])
|
||||||
|
# ----------------------------------
|
||||||
|
# implement the --enable-fast-install flag, and support the `fast-install'
|
||||||
|
# and `disable-fast-install' LT_INIT options.
|
||||||
|
# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
|
||||||
|
m4_define([_LT_ENABLE_FAST_INSTALL],
|
||||||
|
[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl
|
||||||
|
AC_ARG_ENABLE([fast-install],
|
||||||
|
[AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
|
||||||
|
[optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],
|
||||||
|
[p=${PACKAGE-default}
|
||||||
|
case $enableval in
|
||||||
|
yes) enable_fast_install=yes ;;
|
||||||
|
no) enable_fast_install=no ;;
|
||||||
|
*)
|
||||||
|
enable_fast_install=no
|
||||||
|
# Look at the argument we got. We use all the common list separators.
|
||||||
|
lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
|
||||||
|
for pkg in $enableval; do
|
||||||
|
IFS="$lt_save_ifs"
|
||||||
|
if test "X$pkg" = "X$p"; then
|
||||||
|
enable_fast_install=yes
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
IFS="$lt_save_ifs"
|
||||||
|
;;
|
||||||
|
esac],
|
||||||
|
[enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)
|
||||||
|
|
||||||
|
_LT_DECL([fast_install], [enable_fast_install], [0],
|
||||||
|
[Whether or not to optimize for fast installation])dnl
|
||||||
|
])# _LT_ENABLE_FAST_INSTALL
|
||||||
|
|
||||||
|
LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])])
|
||||||
|
LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])])
|
||||||
|
|
||||||
|
# Old names:
|
||||||
|
AU_DEFUN([AC_ENABLE_FAST_INSTALL],
|
||||||
|
[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])
|
||||||
|
AC_DIAGNOSE([obsolete],
|
||||||
|
[$0: Remove this warning and the call to _LT_SET_OPTION when you put
|
||||||
|
the `fast-install' option into LT_INIT's first parameter.])
|
||||||
|
])
|
||||||
|
|
||||||
|
AU_DEFUN([AC_DISABLE_FAST_INSTALL],
|
||||||
|
[_LT_SET_OPTION([LT_INIT], [disable-fast-install])
|
||||||
|
AC_DIAGNOSE([obsolete],
|
||||||
|
[$0: Remove this warning and the call to _LT_SET_OPTION when you put
|
||||||
|
the `disable-fast-install' option into LT_INIT's first parameter.])
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl aclocal-1.4 backwards compatibility:
|
||||||
|
dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], [])
|
||||||
|
dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])
|
||||||
|
|
||||||
|
|
||||||
|
# _LT_WITH_PIC([MODE])
|
||||||
|
# --------------------
|
||||||
|
# implement the --with-pic flag, and support the `pic-only' and `no-pic'
|
||||||
|
# LT_INIT options.
|
||||||
|
# MODE is either `yes' or `no'. If omitted, it defaults to `both'.
|
||||||
|
m4_define([_LT_WITH_PIC],
|
||||||
|
[AC_ARG_WITH([pic],
|
||||||
|
[AS_HELP_STRING([--with-pic@<:@=PKGS@:>@],
|
||||||
|
[try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
|
||||||
|
[lt_p=${PACKAGE-default}
|
||||||
|
case $withval in
|
||||||
|
yes|no) pic_mode=$withval ;;
|
||||||
|
*)
|
||||||
|
pic_mode=default
|
||||||
|
# Look at the argument we got. We use all the common list separators.
|
||||||
|
lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
|
||||||
|
for lt_pkg in $withval; do
|
||||||
|
IFS="$lt_save_ifs"
|
||||||
|
if test "X$lt_pkg" = "X$lt_p"; then
|
||||||
|
pic_mode=yes
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
IFS="$lt_save_ifs"
|
||||||
|
;;
|
||||||
|
esac],
|
||||||
|
[pic_mode=default])
|
||||||
|
|
||||||
|
test -z "$pic_mode" && pic_mode=m4_default([$1], [default])
|
||||||
|
|
||||||
|
_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl
|
||||||
|
])# _LT_WITH_PIC
|
||||||
|
|
||||||
|
LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])])
|
||||||
|
LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])])
|
||||||
|
|
||||||
|
# Old name:
|
||||||
|
AU_DEFUN([AC_LIBTOOL_PICMODE],
|
||||||
|
[_LT_SET_OPTION([LT_INIT], [pic-only])
|
||||||
|
AC_DIAGNOSE([obsolete],
|
||||||
|
[$0: Remove this warning and the call to _LT_SET_OPTION when you
|
||||||
|
put the `pic-only' option into LT_INIT's first parameter.])
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl aclocal-1.4 backwards compatibility:
|
||||||
|
dnl AC_DEFUN([AC_LIBTOOL_PICMODE], [])
|
||||||
|
|
||||||
|
## ----------------- ##
|
||||||
|
## LTDL_INIT Options ##
|
||||||
|
## ----------------- ##
|
||||||
|
|
||||||
|
m4_define([_LTDL_MODE], [])
|
||||||
|
LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive],
|
||||||
|
[m4_define([_LTDL_MODE], [nonrecursive])])
|
||||||
|
LT_OPTION_DEFINE([LTDL_INIT], [recursive],
|
||||||
|
[m4_define([_LTDL_MODE], [recursive])])
|
||||||
|
LT_OPTION_DEFINE([LTDL_INIT], [subproject],
|
||||||
|
[m4_define([_LTDL_MODE], [subproject])])
|
||||||
|
|
||||||
|
m4_define([_LTDL_TYPE], [])
|
||||||
|
LT_OPTION_DEFINE([LTDL_INIT], [installable],
|
||||||
|
[m4_define([_LTDL_TYPE], [installable])])
|
||||||
|
LT_OPTION_DEFINE([LTDL_INIT], [convenience],
|
||||||
|
[m4_define([_LTDL_TYPE], [convenience])])
|
123
Frameworks/Opus/Opus/opus/m4/ltsugar.m4
vendored
Normal file
123
Frameworks/Opus/Opus/opus/m4/ltsugar.m4
vendored
Normal file
|
@ -0,0 +1,123 @@
|
||||||
|
# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*-
|
||||||
|
#
|
||||||
|
# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
|
||||||
|
# Written by Gary V. Vaughan, 2004
|
||||||
|
#
|
||||||
|
# This file is free software; the Free Software Foundation gives
|
||||||
|
# unlimited permission to copy and/or distribute it, with or without
|
||||||
|
# modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
# serial 6 ltsugar.m4
|
||||||
|
|
||||||
|
# This is to help aclocal find these macros, as it can't see m4_define.
|
||||||
|
AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])])
|
||||||
|
|
||||||
|
|
||||||
|
# lt_join(SEP, ARG1, [ARG2...])
|
||||||
|
# -----------------------------
|
||||||
|
# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their
|
||||||
|
# associated separator.
|
||||||
|
# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier
|
||||||
|
# versions in m4sugar had bugs.
|
||||||
|
m4_define([lt_join],
|
||||||
|
[m4_if([$#], [1], [],
|
||||||
|
[$#], [2], [[$2]],
|
||||||
|
[m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])])
|
||||||
|
m4_define([_lt_join],
|
||||||
|
[m4_if([$#$2], [2], [],
|
||||||
|
[m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])])
|
||||||
|
|
||||||
|
|
||||||
|
# lt_car(LIST)
|
||||||
|
# lt_cdr(LIST)
|
||||||
|
# ------------
|
||||||
|
# Manipulate m4 lists.
|
||||||
|
# These macros are necessary as long as will still need to support
|
||||||
|
# Autoconf-2.59 which quotes differently.
|
||||||
|
m4_define([lt_car], [[$1]])
|
||||||
|
m4_define([lt_cdr],
|
||||||
|
[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],
|
||||||
|
[$#], 1, [],
|
||||||
|
[m4_dquote(m4_shift($@))])])
|
||||||
|
m4_define([lt_unquote], $1)
|
||||||
|
|
||||||
|
|
||||||
|
# lt_append(MACRO-NAME, STRING, [SEPARATOR])
|
||||||
|
# ------------------------------------------
|
||||||
|
# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'.
|
||||||
|
# Note that neither SEPARATOR nor STRING are expanded; they are appended
|
||||||
|
# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).
|
||||||
|
# No SEPARATOR is output if MACRO-NAME was previously undefined (different
|
||||||
|
# than defined and empty).
|
||||||
|
#
|
||||||
|
# This macro is needed until we can rely on Autoconf 2.62, since earlier
|
||||||
|
# versions of m4sugar mistakenly expanded SEPARATOR but not STRING.
|
||||||
|
m4_define([lt_append],
|
||||||
|
[m4_define([$1],
|
||||||
|
m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...])
|
||||||
|
# ----------------------------------------------------------
|
||||||
|
# Produce a SEP delimited list of all paired combinations of elements of
|
||||||
|
# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list
|
||||||
|
# has the form PREFIXmINFIXSUFFIXn.
|
||||||
|
# Needed until we can rely on m4_combine added in Autoconf 2.62.
|
||||||
|
m4_define([lt_combine],
|
||||||
|
[m4_if(m4_eval([$# > 3]), [1],
|
||||||
|
[m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl
|
||||||
|
[[m4_foreach([_Lt_prefix], [$2],
|
||||||
|
[m4_foreach([_Lt_suffix],
|
||||||
|
]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[,
|
||||||
|
[_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])])
|
||||||
|
|
||||||
|
|
||||||
|
# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ])
|
||||||
|
# -----------------------------------------------------------------------
|
||||||
|
# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited
|
||||||
|
# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ.
|
||||||
|
m4_define([lt_if_append_uniq],
|
||||||
|
[m4_ifdef([$1],
|
||||||
|
[m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1],
|
||||||
|
[lt_append([$1], [$2], [$3])$4],
|
||||||
|
[$5])],
|
||||||
|
[lt_append([$1], [$2], [$3])$4])])
|
||||||
|
|
||||||
|
|
||||||
|
# lt_dict_add(DICT, KEY, VALUE)
|
||||||
|
# -----------------------------
|
||||||
|
m4_define([lt_dict_add],
|
||||||
|
[m4_define([$1($2)], [$3])])
|
||||||
|
|
||||||
|
|
||||||
|
# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE)
|
||||||
|
# --------------------------------------------
|
||||||
|
m4_define([lt_dict_add_subkey],
|
||||||
|
[m4_define([$1($2:$3)], [$4])])
|
||||||
|
|
||||||
|
|
||||||
|
# lt_dict_fetch(DICT, KEY, [SUBKEY])
|
||||||
|
# ----------------------------------
|
||||||
|
m4_define([lt_dict_fetch],
|
||||||
|
[m4_ifval([$3],
|
||||||
|
m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]),
|
||||||
|
m4_ifdef([$1($2)], [m4_defn([$1($2)])]))])
|
||||||
|
|
||||||
|
|
||||||
|
# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE])
|
||||||
|
# -----------------------------------------------------------------
|
||||||
|
m4_define([lt_if_dict_fetch],
|
||||||
|
[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4],
|
||||||
|
[$5],
|
||||||
|
[$6])])
|
||||||
|
|
||||||
|
|
||||||
|
# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...])
|
||||||
|
# --------------------------------------------------------------
|
||||||
|
m4_define([lt_dict_filter],
|
||||||
|
[m4_if([$5], [], [],
|
||||||
|
[lt_join(m4_quote(m4_default([$4], [[, ]])),
|
||||||
|
lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]),
|
||||||
|
[lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl
|
||||||
|
])
|
23
Frameworks/Opus/Opus/opus/m4/ltversion.m4
vendored
Normal file
23
Frameworks/Opus/Opus/opus/m4/ltversion.m4
vendored
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
# ltversion.m4 -- version numbers -*- Autoconf -*-
|
||||||
|
#
|
||||||
|
# Copyright (C) 2004 Free Software Foundation, Inc.
|
||||||
|
# Written by Scott James Remnant, 2004
|
||||||
|
#
|
||||||
|
# This file is free software; the Free Software Foundation gives
|
||||||
|
# unlimited permission to copy and/or distribute it, with or without
|
||||||
|
# modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
# @configure_input@
|
||||||
|
|
||||||
|
# serial 3337 ltversion.m4
|
||||||
|
# This file is part of GNU Libtool
|
||||||
|
|
||||||
|
m4_define([LT_PACKAGE_VERSION], [2.4.2])
|
||||||
|
m4_define([LT_PACKAGE_REVISION], [1.3337])
|
||||||
|
|
||||||
|
AC_DEFUN([LTVERSION_VERSION],
|
||||||
|
[macro_version='2.4.2'
|
||||||
|
macro_revision='1.3337'
|
||||||
|
_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
|
||||||
|
_LT_DECL(, macro_revision, 0)
|
||||||
|
])
|
98
Frameworks/Opus/Opus/opus/m4/lt~obsolete.m4
vendored
Normal file
98
Frameworks/Opus/Opus/opus/m4/lt~obsolete.m4
vendored
Normal file
|
@ -0,0 +1,98 @@
|
||||||
|
# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*-
|
||||||
|
#
|
||||||
|
# Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc.
|
||||||
|
# Written by Scott James Remnant, 2004.
|
||||||
|
#
|
||||||
|
# This file is free software; the Free Software Foundation gives
|
||||||
|
# unlimited permission to copy and/or distribute it, with or without
|
||||||
|
# modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
# serial 5 lt~obsolete.m4
|
||||||
|
|
||||||
|
# These exist entirely to fool aclocal when bootstrapping libtool.
|
||||||
|
#
|
||||||
|
# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN)
|
||||||
|
# which have later been changed to m4_define as they aren't part of the
|
||||||
|
# exported API, or moved to Autoconf or Automake where they belong.
|
||||||
|
#
|
||||||
|
# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN
|
||||||
|
# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us
|
||||||
|
# using a macro with the same name in our local m4/libtool.m4 it'll
|
||||||
|
# pull the old libtool.m4 in (it doesn't see our shiny new m4_define
|
||||||
|
# and doesn't know about Autoconf macros at all.)
|
||||||
|
#
|
||||||
|
# So we provide this file, which has a silly filename so it's always
|
||||||
|
# included after everything else. This provides aclocal with the
|
||||||
|
# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything
|
||||||
|
# because those macros already exist, or will be overwritten later.
|
||||||
|
# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6.
|
||||||
|
#
|
||||||
|
# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.
|
||||||
|
# Yes, that means every name once taken will need to remain here until
|
||||||
|
# we give up compatibility with versions before 1.7, at which point
|
||||||
|
# we need to keep only those names which we still refer to.
|
||||||
|
|
||||||
|
# This is to help aclocal find these macros, as it can't see m4_define.
|
||||||
|
AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])])
|
||||||
|
|
||||||
|
m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])])
|
||||||
|
m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])])
|
||||||
|
m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])])
|
||||||
|
m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])])
|
||||||
|
m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])])
|
||||||
|
m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])])
|
||||||
|
m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])])
|
||||||
|
m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])])
|
||||||
|
m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])])
|
||||||
|
m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])])
|
||||||
|
m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])])
|
||||||
|
m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])])
|
||||||
|
m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])])
|
||||||
|
m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])])
|
||||||
|
m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])])
|
||||||
|
m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])])
|
||||||
|
m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])])
|
||||||
|
m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])])
|
||||||
|
m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])])
|
||||||
|
m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])])
|
||||||
|
m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])])
|
||||||
|
m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])])
|
||||||
|
m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])])
|
||||||
|
m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])])
|
||||||
|
m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])])
|
||||||
|
m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])])
|
||||||
|
m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])])
|
||||||
|
m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])])
|
||||||
|
m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])])
|
||||||
|
m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])])
|
||||||
|
m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])])
|
||||||
|
m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])])
|
||||||
|
m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])])
|
||||||
|
m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])])
|
||||||
|
m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])])
|
||||||
|
m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])])
|
||||||
|
m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])])
|
||||||
|
m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])])
|
||||||
|
m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])])
|
||||||
|
m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])])
|
||||||
|
m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])])
|
||||||
|
m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])])
|
||||||
|
m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])])
|
||||||
|
m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])])
|
||||||
|
m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])])
|
||||||
|
m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])])
|
||||||
|
m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])])
|
||||||
|
m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])])
|
||||||
|
m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])])
|
||||||
|
m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])])
|
||||||
|
m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])])
|
||||||
|
m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])])
|
||||||
|
m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])])
|
||||||
|
m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])])
|
||||||
|
m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])])
|
||||||
|
m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])])
|
||||||
|
m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])])
|
||||||
|
m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])])
|
||||||
|
m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])])
|
||||||
|
m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])])
|
||||||
|
m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])])
|
331
Frameworks/Opus/Opus/opus/missing
Executable file
331
Frameworks/Opus/Opus/opus/missing
Executable file
|
@ -0,0 +1,331 @@
|
||||||
|
#! /bin/sh
|
||||||
|
# Common stub for a few missing GNU programs while installing.
|
||||||
|
|
||||||
|
scriptversion=2012-01-06.13; # UTC
|
||||||
|
|
||||||
|
# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006,
|
||||||
|
# 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
|
||||||
|
# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
|
||||||
|
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
# any later version.
|
||||||
|
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# As a special exception to the GNU General Public License, if you
|
||||||
|
# distribute this file as part of a program that contains a
|
||||||
|
# configuration script generated by Autoconf, you may include it under
|
||||||
|
# the same distribution terms that you use for the rest of that program.
|
||||||
|
|
||||||
|
if test $# -eq 0; then
|
||||||
|
echo 1>&2 "Try \`$0 --help' for more information"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
run=:
|
||||||
|
sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p'
|
||||||
|
sed_minuso='s/.* -o \([^ ]*\).*/\1/p'
|
||||||
|
|
||||||
|
# In the cases where this matters, `missing' is being run in the
|
||||||
|
# srcdir already.
|
||||||
|
if test -f configure.ac; then
|
||||||
|
configure_ac=configure.ac
|
||||||
|
else
|
||||||
|
configure_ac=configure.in
|
||||||
|
fi
|
||||||
|
|
||||||
|
msg="missing on your system"
|
||||||
|
|
||||||
|
case $1 in
|
||||||
|
--run)
|
||||||
|
# Try to run requested program, and just exit if it succeeds.
|
||||||
|
run=
|
||||||
|
shift
|
||||||
|
"$@" && exit 0
|
||||||
|
# Exit code 63 means version mismatch. This often happens
|
||||||
|
# when the user try to use an ancient version of a tool on
|
||||||
|
# a file that requires a minimum version. In this case we
|
||||||
|
# we should proceed has if the program had been absent, or
|
||||||
|
# if --run hadn't been passed.
|
||||||
|
if test $? = 63; then
|
||||||
|
run=:
|
||||||
|
msg="probably too old"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
-h|--h|--he|--hel|--help)
|
||||||
|
echo "\
|
||||||
|
$0 [OPTION]... PROGRAM [ARGUMENT]...
|
||||||
|
|
||||||
|
Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
|
||||||
|
error status if there is no known handling for PROGRAM.
|
||||||
|
|
||||||
|
Options:
|
||||||
|
-h, --help display this help and exit
|
||||||
|
-v, --version output version information and exit
|
||||||
|
--run try to run the given command, and emulate it if it fails
|
||||||
|
|
||||||
|
Supported PROGRAM values:
|
||||||
|
aclocal touch file \`aclocal.m4'
|
||||||
|
autoconf touch file \`configure'
|
||||||
|
autoheader touch file \`config.h.in'
|
||||||
|
autom4te touch the output file, or create a stub one
|
||||||
|
automake touch all \`Makefile.in' files
|
||||||
|
bison create \`y.tab.[ch]', if possible, from existing .[ch]
|
||||||
|
flex create \`lex.yy.c', if possible, from existing .c
|
||||||
|
help2man touch the output file
|
||||||
|
lex create \`lex.yy.c', if possible, from existing .c
|
||||||
|
makeinfo touch the output file
|
||||||
|
yacc create \`y.tab.[ch]', if possible, from existing .[ch]
|
||||||
|
|
||||||
|
Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and
|
||||||
|
\`g' are ignored when checking the name.
|
||||||
|
|
||||||
|
Send bug reports to <bug-automake@gnu.org>."
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
|
||||||
|
-v|--v|--ve|--ver|--vers|--versi|--versio|--version)
|
||||||
|
echo "missing $scriptversion (GNU Automake)"
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
|
||||||
|
-*)
|
||||||
|
echo 1>&2 "$0: Unknown \`$1' option"
|
||||||
|
echo 1>&2 "Try \`$0 --help' for more information"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
|
||||||
|
esac
|
||||||
|
|
||||||
|
# normalize program name to check for.
|
||||||
|
program=`echo "$1" | sed '
|
||||||
|
s/^gnu-//; t
|
||||||
|
s/^gnu//; t
|
||||||
|
s/^g//; t'`
|
||||||
|
|
||||||
|
# Now exit if we have it, but it failed. Also exit now if we
|
||||||
|
# don't have it and --version was passed (most likely to detect
|
||||||
|
# the program). This is about non-GNU programs, so use $1 not
|
||||||
|
# $program.
|
||||||
|
case $1 in
|
||||||
|
lex*|yacc*)
|
||||||
|
# Not GNU programs, they don't have --version.
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
|
||||||
|
# We have it, but it failed.
|
||||||
|
exit 1
|
||||||
|
elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
|
||||||
|
# Could not run --version or --help. This is probably someone
|
||||||
|
# running `$TOOL --version' or `$TOOL --help' to check whether
|
||||||
|
# $TOOL exists and not knowing $TOOL uses missing.
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# If it does not exist, or fails to run (possibly an outdated version),
|
||||||
|
# try to emulate it.
|
||||||
|
case $program in
|
||||||
|
aclocal*)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: \`$1' is $msg. You should only need it if
|
||||||
|
you modified \`acinclude.m4' or \`${configure_ac}'. You might want
|
||||||
|
to install the \`Automake' and \`Perl' packages. Grab them from
|
||||||
|
any GNU archive site."
|
||||||
|
touch aclocal.m4
|
||||||
|
;;
|
||||||
|
|
||||||
|
autoconf*)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: \`$1' is $msg. You should only need it if
|
||||||
|
you modified \`${configure_ac}'. You might want to install the
|
||||||
|
\`Autoconf' and \`GNU m4' packages. Grab them from any GNU
|
||||||
|
archive site."
|
||||||
|
touch configure
|
||||||
|
;;
|
||||||
|
|
||||||
|
autoheader*)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: \`$1' is $msg. You should only need it if
|
||||||
|
you modified \`acconfig.h' or \`${configure_ac}'. You might want
|
||||||
|
to install the \`Autoconf' and \`GNU m4' packages. Grab them
|
||||||
|
from any GNU archive site."
|
||||||
|
files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
|
||||||
|
test -z "$files" && files="config.h"
|
||||||
|
touch_files=
|
||||||
|
for f in $files; do
|
||||||
|
case $f in
|
||||||
|
*:*) touch_files="$touch_files "`echo "$f" |
|
||||||
|
sed -e 's/^[^:]*://' -e 's/:.*//'`;;
|
||||||
|
*) touch_files="$touch_files $f.in";;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
touch $touch_files
|
||||||
|
;;
|
||||||
|
|
||||||
|
automake*)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: \`$1' is $msg. You should only need it if
|
||||||
|
you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
|
||||||
|
You might want to install the \`Automake' and \`Perl' packages.
|
||||||
|
Grab them from any GNU archive site."
|
||||||
|
find . -type f -name Makefile.am -print |
|
||||||
|
sed 's/\.am$/.in/' |
|
||||||
|
while read f; do touch "$f"; done
|
||||||
|
;;
|
||||||
|
|
||||||
|
autom4te*)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: \`$1' is needed, but is $msg.
|
||||||
|
You might have modified some files without having the
|
||||||
|
proper tools for further handling them.
|
||||||
|
You can get \`$1' as part of \`Autoconf' from any GNU
|
||||||
|
archive site."
|
||||||
|
|
||||||
|
file=`echo "$*" | sed -n "$sed_output"`
|
||||||
|
test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
|
||||||
|
if test -f "$file"; then
|
||||||
|
touch $file
|
||||||
|
else
|
||||||
|
test -z "$file" || exec >$file
|
||||||
|
echo "#! /bin/sh"
|
||||||
|
echo "# Created by GNU Automake missing as a replacement of"
|
||||||
|
echo "# $ $@"
|
||||||
|
echo "exit 0"
|
||||||
|
chmod +x $file
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
bison*|yacc*)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: \`$1' $msg. You should only need it if
|
||||||
|
you modified a \`.y' file. You may need the \`Bison' package
|
||||||
|
in order for those modifications to take effect. You can get
|
||||||
|
\`Bison' from any GNU archive site."
|
||||||
|
rm -f y.tab.c y.tab.h
|
||||||
|
if test $# -ne 1; then
|
||||||
|
eval LASTARG=\${$#}
|
||||||
|
case $LASTARG in
|
||||||
|
*.y)
|
||||||
|
SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
|
||||||
|
if test -f "$SRCFILE"; then
|
||||||
|
cp "$SRCFILE" y.tab.c
|
||||||
|
fi
|
||||||
|
SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
|
||||||
|
if test -f "$SRCFILE"; then
|
||||||
|
cp "$SRCFILE" y.tab.h
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
if test ! -f y.tab.h; then
|
||||||
|
echo >y.tab.h
|
||||||
|
fi
|
||||||
|
if test ! -f y.tab.c; then
|
||||||
|
echo 'main() { return 0; }' >y.tab.c
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
lex*|flex*)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: \`$1' is $msg. You should only need it if
|
||||||
|
you modified a \`.l' file. You may need the \`Flex' package
|
||||||
|
in order for those modifications to take effect. You can get
|
||||||
|
\`Flex' from any GNU archive site."
|
||||||
|
rm -f lex.yy.c
|
||||||
|
if test $# -ne 1; then
|
||||||
|
eval LASTARG=\${$#}
|
||||||
|
case $LASTARG in
|
||||||
|
*.l)
|
||||||
|
SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
|
||||||
|
if test -f "$SRCFILE"; then
|
||||||
|
cp "$SRCFILE" lex.yy.c
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
if test ! -f lex.yy.c; then
|
||||||
|
echo 'main() { return 0; }' >lex.yy.c
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
help2man*)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: \`$1' is $msg. You should only need it if
|
||||||
|
you modified a dependency of a manual page. You may need the
|
||||||
|
\`Help2man' package in order for those modifications to take
|
||||||
|
effect. You can get \`Help2man' from any GNU archive site."
|
||||||
|
|
||||||
|
file=`echo "$*" | sed -n "$sed_output"`
|
||||||
|
test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
|
||||||
|
if test -f "$file"; then
|
||||||
|
touch $file
|
||||||
|
else
|
||||||
|
test -z "$file" || exec >$file
|
||||||
|
echo ".ab help2man is required to generate this page"
|
||||||
|
exit $?
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
makeinfo*)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: \`$1' is $msg. You should only need it if
|
||||||
|
you modified a \`.texi' or \`.texinfo' file, or any other file
|
||||||
|
indirectly affecting the aspect of the manual. The spurious
|
||||||
|
call might also be the consequence of using a buggy \`make' (AIX,
|
||||||
|
DU, IRIX). You might want to install the \`Texinfo' package or
|
||||||
|
the \`GNU make' package. Grab either from any GNU archive site."
|
||||||
|
# The file to touch is that specified with -o ...
|
||||||
|
file=`echo "$*" | sed -n "$sed_output"`
|
||||||
|
test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
|
||||||
|
if test -z "$file"; then
|
||||||
|
# ... or it is the one specified with @setfilename ...
|
||||||
|
infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
|
||||||
|
file=`sed -n '
|
||||||
|
/^@setfilename/{
|
||||||
|
s/.* \([^ ]*\) *$/\1/
|
||||||
|
p
|
||||||
|
q
|
||||||
|
}' $infile`
|
||||||
|
# ... or it is derived from the source name (dir/f.texi becomes f.info)
|
||||||
|
test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
|
||||||
|
fi
|
||||||
|
# If the file does not exist, the user really needs makeinfo;
|
||||||
|
# let's fail without touching anything.
|
||||||
|
test -f $file || exit 1
|
||||||
|
touch $file
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: \`$1' is needed, and is $msg.
|
||||||
|
You might have modified some files without having the
|
||||||
|
proper tools for further handling them. Check the \`README' file,
|
||||||
|
it often tells you about the needed prerequisites for installing
|
||||||
|
this package. You may also peek at any GNU archive site, in case
|
||||||
|
some other package would contain this missing \`$1' program."
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
exit 0
|
||||||
|
|
||||||
|
# Local variables:
|
||||||
|
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||||
|
# time-stamp-start: "scriptversion="
|
||||||
|
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||||
|
# time-stamp-time-zone: "UTC"
|
||||||
|
# time-stamp-end: "; # UTC"
|
||||||
|
# End:
|
12
Frameworks/Opus/Opus/opus/opus-uninstalled.pc.in
Normal file
12
Frameworks/Opus/Opus/opus/opus-uninstalled.pc.in
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
# Opus codec reference implementation uninstalled pkg-config file
|
||||||
|
|
||||||
|
libdir=${pcfiledir}/.libs
|
||||||
|
includedir=${pcfiledir}
|
||||||
|
|
||||||
|
Name: opus uninstalled
|
||||||
|
Description: Opus IETF audio codec (not installed, @PC_BUILD@)
|
||||||
|
Version: @VERSION@
|
||||||
|
Requires:
|
||||||
|
Conflicts:
|
||||||
|
Libs: ${libdir}/libopus.a @PC_LIBM@
|
||||||
|
Cflags: -I${pcfiledir}/@top_srcdir@/include
|
117
Frameworks/Opus/Opus/opus/opus.m4
Normal file
117
Frameworks/Opus/Opus/opus/opus.m4
Normal file
|
@ -0,0 +1,117 @@
|
||||||
|
# Configure paths for libopus
|
||||||
|
# Gregory Maxwell <greg@xiph.org> 08-30-2012
|
||||||
|
# Shamelessly stolen from Jack Moffitt (libogg) who
|
||||||
|
# Shamelessly stole from Owen Taylor and Manish Singh
|
||||||
|
|
||||||
|
dnl XIPH_PATH_OPUS([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]])
|
||||||
|
dnl Test for libopus, and define OPUS_CFLAGS and OPUS_LIBS
|
||||||
|
dnl
|
||||||
|
AC_DEFUN([XIPH_PATH_OPUS],
|
||||||
|
[dnl
|
||||||
|
dnl Get the cflags and libraries
|
||||||
|
dnl
|
||||||
|
AC_ARG_WITH(opus,AC_HELP_STRING([--with-opus=PFX],[Prefix where opus is installed (optional)]), opus_prefix="$withval", opus_prefix="")
|
||||||
|
AC_ARG_WITH(opus-libraries,AC_HELP_STRING([--with-opus-libraries=DIR],[Directory where the opus library is installed (optional)]), opus_libraries="$withval", opus_libraries="")
|
||||||
|
AC_ARG_WITH(opus-includes,AC_HELP_STRING([--with-opus-includes=DIR],[Directory where the opus header files are installed (optional)]), opus_includes="$withval", opus_includes="")
|
||||||
|
AC_ARG_ENABLE(opustest,AC_HELP_STRING([--disable-opustest],[Do not try to compile and run a test opus program]),, enable_opustest=yes)
|
||||||
|
|
||||||
|
if test "x$opus_libraries" != "x" ; then
|
||||||
|
OPUS_LIBS="-L$opus_libraries"
|
||||||
|
elif test "x$opus_prefix" = "xno" || test "x$opus_prefix" = "xyes" ; then
|
||||||
|
OPUS_LIBS=""
|
||||||
|
elif test "x$opus_prefix" != "x" ; then
|
||||||
|
OPUS_LIBS="-L$opus_prefix/lib"
|
||||||
|
elif test "x$prefix" != "xNONE" ; then
|
||||||
|
OPUS_LIBS="-L$prefix/lib"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "x$opus_prefix" != "xno" ; then
|
||||||
|
OPUS_LIBS="$OPUS_LIBS -lopus"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "x$opus_includes" != "x" ; then
|
||||||
|
OPUS_CFLAGS="-I$opus_includes"
|
||||||
|
elif test "x$opus_prefix" = "xno" || test "x$opus_prefix" = "xyes" ; then
|
||||||
|
OPUS_CFLAGS=""
|
||||||
|
elif test "x$opus_prefix" != "x" ; then
|
||||||
|
OPUS_CFLAGS="-I$opus_prefix/include"
|
||||||
|
elif test "x$prefix" != "xNONE"; then
|
||||||
|
OPUS_CFLAGS="-I$prefix/include"
|
||||||
|
fi
|
||||||
|
|
||||||
|
AC_MSG_CHECKING(for Opus)
|
||||||
|
if test "x$opus_prefix" = "xno" ; then
|
||||||
|
no_opus="disabled"
|
||||||
|
enable_opustest="no"
|
||||||
|
else
|
||||||
|
no_opus=""
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if test "x$enable_opustest" = "xyes" ; then
|
||||||
|
ac_save_CFLAGS="$CFLAGS"
|
||||||
|
ac_save_LIBS="$LIBS"
|
||||||
|
CFLAGS="$CFLAGS $OPUS_CFLAGS"
|
||||||
|
LIBS="$LIBS $OPUS_LIBS"
|
||||||
|
dnl
|
||||||
|
dnl Now check if the installed Opus is sufficiently new.
|
||||||
|
dnl
|
||||||
|
rm -f conf.opustest
|
||||||
|
AC_TRY_RUN([
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <opus.h>
|
||||||
|
|
||||||
|
int main ()
|
||||||
|
{
|
||||||
|
system("touch conf.opustest");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
],, no_opus=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"])
|
||||||
|
CFLAGS="$ac_save_CFLAGS"
|
||||||
|
LIBS="$ac_save_LIBS"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "x$no_opus" = "xdisabled" ; then
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
ifelse([$2], , :, [$2])
|
||||||
|
elif test "x$no_opus" = "x" ; then
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
ifelse([$1], , :, [$1])
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
if test -f conf.opustest ; then
|
||||||
|
:
|
||||||
|
else
|
||||||
|
echo "*** Could not run Opus test program, checking why..."
|
||||||
|
CFLAGS="$CFLAGS $OPUS_CFLAGS"
|
||||||
|
LIBS="$LIBS $OPUS_LIBS"
|
||||||
|
AC_TRY_LINK([
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <opus.h>
|
||||||
|
], [ return 0; ],
|
||||||
|
[ echo "*** The test program compiled, but did not run. This usually means"
|
||||||
|
echo "*** that the run-time linker is not finding Opus or finding the wrong"
|
||||||
|
echo "*** version of Opus. If it is not finding Opus, you'll need to set your"
|
||||||
|
echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point"
|
||||||
|
echo "*** to the installed location Also, make sure you have run ldconfig if that"
|
||||||
|
echo "*** is required on your system"
|
||||||
|
echo "***"
|
||||||
|
echo "*** If you have an old version installed, it is best to remove it, although"
|
||||||
|
echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"],
|
||||||
|
[ echo "*** The test program failed to compile or link. See the file config.log for the"
|
||||||
|
echo "*** exact error that occurred. This usually means Opus was incorrectly installed"
|
||||||
|
echo "*** or that you have moved Opus since it was installed." ])
|
||||||
|
CFLAGS="$ac_save_CFLAGS"
|
||||||
|
LIBS="$ac_save_LIBS"
|
||||||
|
fi
|
||||||
|
OPUS_CFLAGS=""
|
||||||
|
OPUS_LIBS=""
|
||||||
|
ifelse([$2], , :, [$2])
|
||||||
|
fi
|
||||||
|
AC_SUBST(OPUS_CFLAGS)
|
||||||
|
AC_SUBST(OPUS_LIBS)
|
||||||
|
rm -f conf.opustest
|
||||||
|
])
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue