Compare commits
29 Commits
steam
...
CeltOpusTr
| Author | SHA1 | Date | |
|---|---|---|---|
| 984f3804cf | |||
| 37c1a4d1b6 | |||
| ddad8421e7 | |||
| 718284e7dd | |||
| 009962f120 | |||
| a02af1a297 | |||
| 7d46e3b9eb | |||
| 2184fd917a | |||
| e6fb78cdf9 | |||
| 59fbf67c4a | |||
| b987a8207d | |||
| fa34037aa4 | |||
| 13b9bef468 | |||
| 41f030c23a | |||
| cf86277e67 | |||
| 678155ff57 | |||
| bb71861348 | |||
| 3ed2703b74 | |||
| 11488260c7 | |||
| b17de382d8 | |||
|
|
2eb343d6e0 | ||
|
|
a29a884671 | ||
|
|
2d750744e6 | ||
|
|
7855fd04a2 | ||
|
|
493b799954 | ||
|
|
cfbaf18f66 | ||
|
|
d2905c03eb | ||
|
|
d10eb1305d | ||
|
|
70fc7c26a0 |
622
AMBuildScript
622
AMBuildScript
@ -1,26 +1,5 @@
|
|||||||
# vim: set sts=2 ts=8 sw=2 tw=99 et ft=python:
|
# vim: set sts=2 ts=8 sw=2 tw=99 et ft=python:
|
||||||
import os, sys
|
import os
|
||||||
|
|
||||||
# Simple extensions do not need to modify this file.
|
|
||||||
|
|
||||||
class SDK(object):
|
|
||||||
def __init__(self, sdk, ext, aDef, name, platform, dir):
|
|
||||||
self.folder = 'hl2sdk-' + dir
|
|
||||||
self.envvar = sdk
|
|
||||||
self.ext = ext
|
|
||||||
self.code = aDef
|
|
||||||
self.define = name
|
|
||||||
self.platform = platform
|
|
||||||
self.name = dir
|
|
||||||
self.path = None
|
|
||||||
|
|
||||||
WinOnly = ['windows']
|
|
||||||
WinLinux = ['windows', 'linux']
|
|
||||||
WinLinuxMac = ['windows', 'linux', 'mac']
|
|
||||||
|
|
||||||
PossibleSDKs = {
|
|
||||||
'css': SDK('HL2SDKCSS', '2.css', '6', 'CSS', WinLinuxMac, 'css'),
|
|
||||||
}
|
|
||||||
|
|
||||||
def ResolveEnvPath(env, folder):
|
def ResolveEnvPath(env, folder):
|
||||||
if env in os.environ:
|
if env in os.environ:
|
||||||
@ -42,15 +21,72 @@ def ResolveEnvPath(env, folder):
|
|||||||
|
|
||||||
def Normalize(path):
|
def Normalize(path):
|
||||||
return os.path.abspath(os.path.normpath(path))
|
return os.path.abspath(os.path.normpath(path))
|
||||||
|
|
||||||
|
def SetArchFlags(compiler):
|
||||||
|
if compiler.behavior == 'gcc':
|
||||||
|
if compiler.target.arch == 'x86_64':
|
||||||
|
compiler.cflags += ['-fPIC']
|
||||||
|
elif compiler.like('msvc'):
|
||||||
|
if compiler.target.arch == 'x86_64':
|
||||||
|
compiler.defines += ['WIN64']
|
||||||
|
|
||||||
|
hl2sdk_manifests_path = None
|
||||||
|
|
||||||
|
# First we check if the manifest exists in the current path
|
||||||
|
hl2sdk_manifests_path = os.path.join(builder.sourcePath, 'hl2sdk-manifests/SdkHelpers.ambuild')
|
||||||
|
|
||||||
|
if not os.path.exists(hl2sdk_manifests_path):
|
||||||
|
# manifests does not exists in the project file, use the path from --hl2sdk-manifest-path
|
||||||
|
if not builder.options.hl2sdk_manifest:
|
||||||
|
raise Exception('HL2SDK Manifest root path not set! (--hl2sdk-manifest-path)')
|
||||||
|
else:
|
||||||
|
hl2sdk_manifests_path = os.path.join(builder.options.hl2sdk_manifest, 'SdkHelpers.ambuild')
|
||||||
|
|
||||||
|
if not os.path.exists(hl2sdk_manifests_path):
|
||||||
|
raise Exception('Could not find SdkHelpers.ambuild in the given HL2SDK Manifest path!')
|
||||||
|
|
||||||
|
|
||||||
|
SdkHelpers = builder.Eval(hl2sdk_manifests_path, {
|
||||||
|
'Project': 'sm-extension'
|
||||||
|
})
|
||||||
|
|
||||||
class ExtensionConfig(object):
|
class ExtensionConfig(object):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
self.sdk_manifests = []
|
||||||
self.sdks = {}
|
self.sdks = {}
|
||||||
self.binaries = []
|
self.sdk_targets = []
|
||||||
self.extensions = []
|
self.extensions = []
|
||||||
self.generated_headers = None
|
self.generated_headers = None
|
||||||
self.mms_root = None
|
self.mms_root = None
|
||||||
self.sm_root = None
|
self.sm_root = None
|
||||||
|
self.all_targets = []
|
||||||
|
self.target_archs = set()
|
||||||
|
self.libsafetyhook = {}
|
||||||
|
|
||||||
|
if builder.options.targets:
|
||||||
|
target_archs = builder.options.targets.split(',')
|
||||||
|
else:
|
||||||
|
target_archs = ['x86', 'x86_64']
|
||||||
|
|
||||||
|
for arch in target_archs:
|
||||||
|
try:
|
||||||
|
cxx = builder.DetectCxx(target_arch = arch)
|
||||||
|
self.target_archs.add(cxx.target.arch)
|
||||||
|
except Exception as e:
|
||||||
|
# Error if archs were manually overridden.
|
||||||
|
if builder.options.targets:
|
||||||
|
raise
|
||||||
|
print('Skipping target {}: {}'.format(arch, e))
|
||||||
|
continue
|
||||||
|
self.all_targets.append(cxx)
|
||||||
|
|
||||||
|
if not self.all_targets:
|
||||||
|
raise Exception('No suitable C/C++ compiler was found.')
|
||||||
|
|
||||||
|
def use_auto_versioning(self):
|
||||||
|
if builder.backend != 'amb2':
|
||||||
|
return False
|
||||||
|
return not getattr(builder.options, 'disable_auto_versioning', False)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def tag(self):
|
def tag(self):
|
||||||
@ -58,48 +94,35 @@ class ExtensionConfig(object):
|
|||||||
return 'Debug'
|
return 'Debug'
|
||||||
return 'Release'
|
return 'Release'
|
||||||
|
|
||||||
|
def findSdkPath(self, sdk_name):
|
||||||
|
dir_name = 'hl2sdk-{}'.format(sdk_name)
|
||||||
|
if builder.options.hl2sdk_root:
|
||||||
|
sdk_path = os.path.join(builder.options.hl2sdk_root, dir_name)
|
||||||
|
if os.path.exists(sdk_path):
|
||||||
|
return sdk_path
|
||||||
|
return ResolveEnvPath('HL2SDK{}'.format(sdk_name.upper()), dir_name)
|
||||||
|
|
||||||
|
def shouldIncludeSdk(self, sdk):
|
||||||
|
return not sdk.get('source2', False)
|
||||||
|
|
||||||
def detectSDKs(self):
|
def detectSDKs(self):
|
||||||
sdk_list = builder.options.sdks.split(',')
|
sdk_list = [s for s in builder.options.sdks.split(',') if s]
|
||||||
use_all = sdk_list[0] == 'all'
|
SdkHelpers.sdk_filter = self.shouldIncludeSdk
|
||||||
use_present = sdk_list[0] == 'present'
|
SdkHelpers.find_sdk_path = self.findSdkPath
|
||||||
|
SdkHelpers.findSdks(builder, self.all_targets, sdk_list)
|
||||||
|
|
||||||
for sdk_name in PossibleSDKs:
|
self.sdks = SdkHelpers.sdks
|
||||||
sdk = PossibleSDKs[sdk_name]
|
self.sdk_manifests = SdkHelpers.sdk_manifests
|
||||||
if builder.target_platform in sdk.platform:
|
self.sdk_targets = SdkHelpers.sdk_targets
|
||||||
if builder.options.hl2sdk_root:
|
|
||||||
sdk_path = os.path.join(builder.options.hl2sdk_root, sdk.folder)
|
|
||||||
else:
|
|
||||||
sdk_path = ResolveEnvPath(sdk.envvar, sdk.folder)
|
|
||||||
if sdk_path is None or not os.path.isdir(sdk_path):
|
|
||||||
if use_all or sdk_name in sdk_list:
|
|
||||||
raise Exception('Could not find a valid path for {0}'.format(sdk.envvar))
|
|
||||||
continue
|
|
||||||
if use_all or use_present or sdk_name in sdk_list:
|
|
||||||
sdk.path = Normalize(sdk_path)
|
|
||||||
self.sdks[sdk_name] = sdk
|
|
||||||
|
|
||||||
if len(self.sdks) < 1:
|
|
||||||
raise Exception('At least one SDK must be available.')
|
|
||||||
|
|
||||||
if builder.options.sm_path:
|
|
||||||
self.sm_root = builder.options.sm_path
|
|
||||||
else:
|
|
||||||
self.sm_root = ResolveEnvPath('SOURCEMOD18', 'sourcemod-1.8')
|
|
||||||
if not self.sm_root:
|
|
||||||
self.sm_root = ResolveEnvPath('SOURCEMOD', 'sourcemod')
|
|
||||||
if not self.sm_root:
|
|
||||||
self.sm_root = ResolveEnvPath('SOURCEMOD_DEV', 'sourcemod-central')
|
|
||||||
|
|
||||||
if not self.sm_root or not os.path.isdir(self.sm_root):
|
|
||||||
raise Exception('Could not find a source copy of SourceMod')
|
|
||||||
self.sm_root = Normalize(self.sm_root)
|
|
||||||
|
|
||||||
if builder.options.mms_path:
|
if builder.options.mms_path:
|
||||||
self.mms_root = builder.options.mms_path
|
self.mms_root = builder.options.mms_path
|
||||||
else:
|
else:
|
||||||
self.mms_root = ResolveEnvPath('MMSOURCE110', 'mmsource-1.10')
|
self.mms_root = ResolveEnvPath('MMSOURCE112', 'mmsource-1.12')
|
||||||
if not self.mms_root:
|
if not self.mms_root:
|
||||||
self.mms_root = ResolveEnvPath('MMSOURCE', 'metamod-source')
|
self.mms_root = ResolveEnvPath('MMSOURCE', 'metamod-source')
|
||||||
|
if not self.mms_root:
|
||||||
|
self.mms_root = ResolveEnvPath('MMSOURCE_DEV', 'metamod-source')
|
||||||
if not self.mms_root:
|
if not self.mms_root:
|
||||||
self.mms_root = ResolveEnvPath('MMSOURCE_DEV', 'mmsource-central')
|
self.mms_root = ResolveEnvPath('MMSOURCE_DEV', 'mmsource-central')
|
||||||
|
|
||||||
@ -107,268 +130,203 @@ class ExtensionConfig(object):
|
|||||||
raise Exception('Could not find a source copy of Metamod:Source')
|
raise Exception('Could not find a source copy of Metamod:Source')
|
||||||
self.mms_root = Normalize(self.mms_root)
|
self.mms_root = Normalize(self.mms_root)
|
||||||
|
|
||||||
|
if builder.options.sm_path:
|
||||||
|
self.sm_root = builder.options.sm_path
|
||||||
|
else:
|
||||||
|
self.sm_root = ResolveEnvPath('SOURCEMOD112', 'sourcemod-1.12')
|
||||||
|
if not self.sm_root:
|
||||||
|
self.sm_root = ResolveEnvPath('SOURCEMOD', 'sourcemod')
|
||||||
|
if not self.sm_root:
|
||||||
|
self.sm_root = ResolveEnvPath('SOURCEMOD_DEV', 'sourcemod')
|
||||||
|
if not self.sm_root:
|
||||||
|
self.sm_root = ResolveEnvPath('SOURCEMOD_DEV', 'sourcemod-central')
|
||||||
|
|
||||||
|
if not self.sm_root or not os.path.isdir(self.sm_root):
|
||||||
|
raise Exception('Could not find a source copy of SourceMod')
|
||||||
|
self.sm_root = Normalize(self.sm_root)
|
||||||
|
|
||||||
def configure(self):
|
def configure(self):
|
||||||
cxx = builder.DetectCompilers()
|
|
||||||
|
allowed_archs = ['x86','x86_64']
|
||||||
|
|
||||||
|
if not set(self.target_archs).issubset(allowed_archs):
|
||||||
|
raise Exception('Unknown target architecture: {0}'.format(self.target_archs))
|
||||||
|
|
||||||
|
for cxx in self.all_targets:
|
||||||
|
self.configure_cxx(cxx)
|
||||||
|
|
||||||
|
def configure_cxx(self, cxx):
|
||||||
|
if cxx.family == 'msvc':
|
||||||
|
if cxx.version < 1914 and builder.options.generator != 'vs':
|
||||||
|
raise Exception(f'Only MSVC 2017 15.7 and later are supported, full C++17 support is required. ({str(cxx.version)} < 1914)')
|
||||||
|
elif cxx.family == 'gcc':
|
||||||
|
if cxx.version < 'gcc-8':
|
||||||
|
raise Exception('Only GCC versions 8 or later are supported, full C++17 support is required.')
|
||||||
|
elif cxx.family == 'clang':
|
||||||
|
if cxx.version < 'clang-5':
|
||||||
|
raise Exception('Only clang versions 5 or later are supported, full C++17 support is required.')
|
||||||
|
|
||||||
if cxx.like('gcc'):
|
if cxx.like('gcc'):
|
||||||
cxx.defines += [
|
self.configure_gcc(cxx)
|
||||||
'stricmp=strcasecmp',
|
elif cxx.family == 'msvc':
|
||||||
'_stricmp=strcasecmp',
|
self.configure_msvc(cxx)
|
||||||
'_snprintf=snprintf',
|
|
||||||
'_vsnprintf=vsnprintf',
|
|
||||||
'HAVE_STDINT_H',
|
|
||||||
'GNUC',
|
|
||||||
]
|
|
||||||
cxx.cflags += [
|
|
||||||
'-pipe',
|
|
||||||
'-fno-strict-aliasing',
|
|
||||||
'-Wall',
|
|
||||||
# '-Werror',
|
|
||||||
'-Wno-unused',
|
|
||||||
'-Wno-switch',
|
|
||||||
'-Wno-array-bounds',
|
|
||||||
'-msse',
|
|
||||||
'-m32',
|
|
||||||
]
|
|
||||||
cxx.cxxflags += [
|
|
||||||
'-std=c++11',
|
|
||||||
]
|
|
||||||
|
|
||||||
have_gcc = cxx.vendor == 'gcc'
|
|
||||||
have_clang = cxx.vendor == 'clang'
|
|
||||||
if have_clang or (have_gcc and cxx.version >= '4'):
|
|
||||||
cxx.cflags += ['-fvisibility=hidden']
|
|
||||||
cxx.cxxflags += ['-fvisibility-inlines-hidden']
|
|
||||||
if have_clang or (have_gcc and cxx.version >= '4.6'):
|
|
||||||
cxx.cflags += ['-Wno-narrowing']
|
|
||||||
if (have_gcc and cxx.version >= '4.7') or (have_clang and cxx.version >= '3'):
|
|
||||||
cxx.cxxflags += ['-Wno-delete-non-virtual-dtor']
|
|
||||||
if have_gcc and cxx.version >= '4.8':
|
|
||||||
cxx.cflags += ['-Wno-unused-result']
|
|
||||||
if have_clang:
|
|
||||||
cxx.cxxflags += ['-Wno-implicit-exception-spec-mismatch']
|
|
||||||
if cxx.version >= 'apple-clang-5.1' or cxx.version >= 'clang-3.4':
|
|
||||||
cxx.cxxflags += ['-Wno-deprecated-register']
|
|
||||||
else:
|
|
||||||
cxx.cxxflags += ['-Wno-deprecated']
|
|
||||||
cxx.cflags += ['-Wno-sometimes-uninitialized']
|
|
||||||
|
|
||||||
cxx.linkflags += ['-m32']
|
|
||||||
cxx.cxxflags += [
|
|
||||||
'-fno-exceptions',
|
|
||||||
'-fno-threadsafe-statics',
|
|
||||||
'-Wno-non-virtual-dtor',
|
|
||||||
'-Wno-overloaded-virtual',
|
|
||||||
]
|
|
||||||
|
|
||||||
if have_gcc:
|
|
||||||
cxx.cflags += ['-mfpmath=sse']
|
|
||||||
elif cxx.vendor == 'msvc':
|
|
||||||
if builder.options.debug == '1':
|
|
||||||
cxx.cflags += ['/MTd']
|
|
||||||
cxx.linkflags += ['/NODEFAULTLIB:libcmt']
|
|
||||||
else:
|
|
||||||
cxx.cflags += ['/MT']
|
|
||||||
cxx.defines += [
|
|
||||||
'_CRT_SECURE_NO_DEPRECATE',
|
|
||||||
'_CRT_SECURE_NO_WARNINGS',
|
|
||||||
'_CRT_NONSTDC_NO_DEPRECATE',
|
|
||||||
'_ITERATOR_DEBUG_LEVEL=0',
|
|
||||||
]
|
|
||||||
cxx.cflags += [
|
|
||||||
'/W3',
|
|
||||||
]
|
|
||||||
cxx.cxxflags += [
|
|
||||||
'/EHsc',
|
|
||||||
'/GR-',
|
|
||||||
'/TP',
|
|
||||||
]
|
|
||||||
cxx.linkflags += [
|
|
||||||
'/MACHINE:X86',
|
|
||||||
'kernel32.lib',
|
|
||||||
'user32.lib',
|
|
||||||
'gdi32.lib',
|
|
||||||
'winspool.lib',
|
|
||||||
'comdlg32.lib',
|
|
||||||
'advapi32.lib',
|
|
||||||
'shell32.lib',
|
|
||||||
'ole32.lib',
|
|
||||||
'oleaut32.lib',
|
|
||||||
'uuid.lib',
|
|
||||||
'odbc32.lib',
|
|
||||||
'odbccp32.lib',
|
|
||||||
]
|
|
||||||
|
|
||||||
# Optimization
|
# Optimization
|
||||||
if builder.options.opt == '1':
|
if builder.options.opt == '1':
|
||||||
cxx.defines += ['NDEBUG']
|
cxx.defines += ['NDEBUG']
|
||||||
if cxx.like('gcc'):
|
|
||||||
cxx.cflags += ['-O3']
|
|
||||||
elif cxx.like('msvc'):
|
|
||||||
cxx.cflags += ['/Ox', '/Zo']
|
|
||||||
cxx.linkflags += ['/OPT:ICF', '/OPT:REF']
|
|
||||||
|
|
||||||
# Debugging
|
# Debugging
|
||||||
if builder.options.debug == '1':
|
if builder.options.debug == '1':
|
||||||
cxx.defines += ['DEBUG', '_DEBUG']
|
cxx.defines += ['DEBUG', '_DEBUG']
|
||||||
if cxx.like('msvc'):
|
|
||||||
cxx.cflags += ['/Od', '/RTC1']
|
|
||||||
|
|
||||||
# This needs to be after our optimization flags which could otherwise disable it.
|
|
||||||
if cxx.vendor == 'msvc':
|
|
||||||
# Don't omit the frame pointer.
|
|
||||||
cxx.cflags += ['/Oy-']
|
|
||||||
|
|
||||||
# Platform-specifics
|
# Platform-specifics
|
||||||
if builder.target_platform == 'linux':
|
if cxx.target.platform == 'linux':
|
||||||
cxx.defines += ['_LINUX', 'POSIX']
|
self.configure_linux(cxx)
|
||||||
cxx.linkflags += ['-lm']
|
elif cxx.target.platform == 'mac':
|
||||||
if cxx.vendor == 'gcc':
|
self.configure_mac(cxx)
|
||||||
cxx.linkflags += ['-static-libgcc']
|
elif cxx.target.platform == 'windows':
|
||||||
elif cxx.vendor == 'clang':
|
self.configure_windows(cxx)
|
||||||
cxx.linkflags += ['-lgcc_eh']
|
|
||||||
elif builder.target_platform == 'mac':
|
|
||||||
cxx.defines += ['OSX', '_OSX', 'POSIX']
|
|
||||||
cxx.cflags += ['-mmacosx-version-min=10.5']
|
|
||||||
cxx.linkflags += [
|
|
||||||
'-mmacosx-version-min=10.5',
|
|
||||||
'-arch', 'i386',
|
|
||||||
'-lstdc++',
|
|
||||||
'-stdlib=libstdc++',
|
|
||||||
]
|
|
||||||
cxx.cxxflags += ['-stdlib=libstdc++']
|
|
||||||
elif builder.target_platform == 'windows':
|
|
||||||
cxx.defines += ['WIN32', '_WINDOWS']
|
|
||||||
|
|
||||||
# Finish up.
|
def configure_gcc(self, cxx):
|
||||||
cxx.includes += [
|
cxx.defines += [
|
||||||
os.path.join(self.sm_root, 'public'),
|
'stricmp=strcasecmp',
|
||||||
|
'_stricmp=strcasecmp',
|
||||||
|
'_snprintf=snprintf',
|
||||||
|
'_vsnprintf=vsnprintf',
|
||||||
|
'HAVE_STDINT_H',
|
||||||
|
'GNUC',
|
||||||
]
|
]
|
||||||
|
cxx.cflags += [
|
||||||
def ConfigureForHL2(self, binary, sdk):
|
'-pipe',
|
||||||
compiler = binary.compiler
|
'-fno-strict-aliasing',
|
||||||
|
'-Wall',
|
||||||
if sdk.name == 'episode1':
|
'-Werror',
|
||||||
mms_path = os.path.join(self.mms_root, 'core-legacy')
|
'-Wno-unused',
|
||||||
else:
|
'-Wno-switch',
|
||||||
mms_path = os.path.join(self.mms_root, 'core')
|
'-Wno-array-bounds',
|
||||||
|
'-fvisibility=hidden',
|
||||||
compiler.cxxincludes += [
|
|
||||||
os.path.join(mms_path),
|
|
||||||
os.path.join(mms_path, 'sourcehook'),
|
|
||||||
]
|
]
|
||||||
|
|
||||||
defines = ['SE_' + PossibleSDKs[i].define + '=' + PossibleSDKs[i].code for i in PossibleSDKs]
|
if cxx.target.arch in ['x86', 'x86_64']:
|
||||||
compiler.defines += defines
|
cxx.cflags += ['-msse']
|
||||||
|
|
||||||
paths = [
|
cxx.cxxflags += [
|
||||||
['public'],
|
'-fno-threadsafe-statics',
|
||||||
['public', 'engine'],
|
'-Wno-non-virtual-dtor',
|
||||||
['public', 'mathlib'],
|
'-Wno-overloaded-virtual',
|
||||||
['public', 'vstdlib'],
|
'-Wno-register',
|
||||||
['public', 'tier0'],
|
'-fvisibility-inlines-hidden',
|
||||||
['public', 'tier1']
|
'-std=c++17',
|
||||||
]
|
]
|
||||||
if sdk.name == 'episode1' or sdk.name == 'darkm':
|
|
||||||
paths.append(['public', 'dlls'])
|
|
||||||
paths.append(['game_shared'])
|
|
||||||
else:
|
|
||||||
paths.append(['public', 'game', 'server'])
|
|
||||||
paths.append(['public', 'toolframework'])
|
|
||||||
paths.append(['game', 'shared'])
|
|
||||||
paths.append(['common'])
|
|
||||||
|
|
||||||
compiler.defines += ['SOURCE_ENGINE=' + sdk.code]
|
|
||||||
|
have_gcc = cxx.family == 'gcc'
|
||||||
|
have_clang = cxx.family == 'clang'
|
||||||
|
|
||||||
if sdk.name in ['sdk2013', 'bms'] and compiler.like('gcc'):
|
# Work around errors from smsdk_ext.cpp
|
||||||
# The 2013 SDK already has these in public/tier0/basetypes.h
|
if have_clang:
|
||||||
compiler.defines.remove('stricmp=strcasecmp')
|
cxx.cxxflags += ['-Wno-implicit-exception-spec-mismatch']
|
||||||
compiler.defines.remove('_stricmp=strcasecmp')
|
|
||||||
compiler.defines.remove('_snprintf=snprintf')
|
|
||||||
compiler.defines.remove('_vsnprintf=vsnprintf')
|
|
||||||
|
|
||||||
if compiler.like('msvc'):
|
# Work around SDK warnings.
|
||||||
compiler.defines += ['COMPILER_MSVC', 'COMPILER_MSVC32']
|
if cxx.version >= 'clang-10.0' or cxx.version >= 'apple-clang-12.0':
|
||||||
else:
|
cxx.cflags += [
|
||||||
compiler.defines += ['COMPILER_GCC']
|
'-Wno-implicit-int-float-conversion',
|
||||||
|
'-Wno-tautological-overlap-compare',
|
||||||
# For everything after Swarm, this needs to be defined for entity networking
|
|
||||||
# to work properly with sendprop value changes.
|
|
||||||
if sdk.name in ['blade', 'insurgency', 'csgo', 'dota']:
|
|
||||||
compiler.defines += ['NETWORK_VARS_ENABLED']
|
|
||||||
|
|
||||||
if sdk.name in ['css', 'hl2dm', 'dods', 'sdk2013', 'bms', 'tf2', 'l4d', 'nucleardawn', 'l4d2', 'dota']:
|
|
||||||
if builder.target_platform in ['linux', 'mac']:
|
|
||||||
compiler.defines += ['NO_HOOK_MALLOC', 'NO_MALLOC_OVERRIDE']
|
|
||||||
|
|
||||||
if sdk.name == 'csgo' and builder.target_platform == 'linux':
|
|
||||||
compiler.linkflags += ['-lstdc++']
|
|
||||||
|
|
||||||
for path in paths:
|
|
||||||
compiler.cxxincludes += [os.path.join(sdk.path, *path)]
|
|
||||||
|
|
||||||
if builder.target_platform == 'linux':
|
|
||||||
if sdk.name == 'episode1':
|
|
||||||
lib_folder = os.path.join(sdk.path, 'linux_sdk')
|
|
||||||
elif sdk.name in ['sdk2013', 'bms']:
|
|
||||||
lib_folder = os.path.join(sdk.path, 'lib', 'public', 'linux32')
|
|
||||||
else:
|
|
||||||
lib_folder = os.path.join(sdk.path, 'lib', 'linux')
|
|
||||||
elif builder.target_platform == 'mac':
|
|
||||||
if sdk.name in ['sdk2013', 'bms']:
|
|
||||||
lib_folder = os.path.join(sdk.path, 'lib', 'public', 'osx32')
|
|
||||||
else:
|
|
||||||
lib_folder = os.path.join(sdk.path, 'lib', 'mac')
|
|
||||||
|
|
||||||
if builder.target_platform in ['linux', 'mac']:
|
|
||||||
if sdk.name in ['sdk2013', 'bms']:
|
|
||||||
compiler.postlink += [
|
|
||||||
compiler.Dep(os.path.join(lib_folder, 'tier1.a')),
|
|
||||||
compiler.Dep(os.path.join(lib_folder, 'mathlib.a'))
|
|
||||||
]
|
|
||||||
else:
|
|
||||||
compiler.postlink += [
|
|
||||||
compiler.Dep(os.path.join(lib_folder, 'tier1_i486.a')),
|
|
||||||
compiler.Dep(os.path.join(lib_folder, 'mathlib_i486.a'))
|
|
||||||
]
|
]
|
||||||
|
|
||||||
if sdk.name in ['blade', 'insurgency', 'csgo', 'dota']:
|
if have_gcc:
|
||||||
compiler.postlink += [compiler.Dep(os.path.join(lib_folder, 'interfaces_i486.a'))]
|
cxx.cflags += ['-mfpmath=sse']
|
||||||
|
cxx.cflags += ['-Wno-maybe-uninitialized']
|
||||||
|
|
||||||
dynamic_libs = []
|
if builder.options.opt == '1':
|
||||||
if builder.target_platform == 'linux':
|
cxx.cflags += ['-O3']
|
||||||
if sdk.name in ['css', 'hl2dm', 'dods', 'tf2', 'sdk2013', 'bms', 'nucleardawn', 'l4d2']:
|
|
||||||
dynamic_libs = ['libtier0_srv.so', 'libvstdlib_srv.so']
|
|
||||||
elif sdk.name in ['l4d', 'blade', 'insurgency', 'csgo', 'dota']:
|
|
||||||
dynamic_libs = ['libtier0.so', 'libvstdlib.so']
|
|
||||||
else:
|
|
||||||
dynamic_libs = ['tier0_i486.so', 'vstdlib_i486.so']
|
|
||||||
elif builder.target_platform == 'mac':
|
|
||||||
compiler.linkflags.append('-liconv')
|
|
||||||
dynamic_libs = ['libtier0.dylib', 'libvstdlib.dylib']
|
|
||||||
elif builder.target_platform == 'windows':
|
|
||||||
libs = ['tier0', 'tier1', 'vstdlib', 'mathlib']
|
|
||||||
if sdk.name in ['swarm', 'blade', 'insurgency', 'csgo', 'dota']:
|
|
||||||
libs.append('interfaces')
|
|
||||||
for lib in libs:
|
|
||||||
lib_path = os.path.join(sdk.path, 'lib', 'public', lib) + '.lib'
|
|
||||||
compiler.linkflags.append(compiler.Dep(lib_path))
|
|
||||||
|
|
||||||
for library in dynamic_libs:
|
# Don't omit the frame pointer.
|
||||||
source_path = os.path.join(lib_folder, library)
|
cxx.cflags += ['-fno-omit-frame-pointer']
|
||||||
output_path = os.path.join(binary.localFolder, library)
|
|
||||||
|
|
||||||
def make_linker(source_path, output_path):
|
def configure_msvc(self, cxx):
|
||||||
def link(context, binary):
|
|
||||||
cmd_node, (output,) = context.AddSymlink(source_path, output_path)
|
|
||||||
return output
|
|
||||||
return link
|
|
||||||
|
|
||||||
linker = make_linker(source_path, output_path)
|
if builder.options.debug == '1':
|
||||||
compiler.linkflags[0:0] = [compiler.Dep(library, linker)]
|
cxx.cflags += ['/MTd']
|
||||||
|
cxx.linkflags += ['/NODEFAULTLIB:libcmt']
|
||||||
|
else:
|
||||||
|
cxx.cflags += ['/MT']
|
||||||
|
cxx.defines += [
|
||||||
|
'_CRT_SECURE_NO_DEPRECATE',
|
||||||
|
'_CRT_SECURE_NO_WARNINGS',
|
||||||
|
'_CRT_NONSTDC_NO_DEPRECATE',
|
||||||
|
'_ITERATOR_DEBUG_LEVEL=0',
|
||||||
|
]
|
||||||
|
cxx.cflags += [
|
||||||
|
'/W3',
|
||||||
|
]
|
||||||
|
cxx.cxxflags += [
|
||||||
|
'/EHsc',
|
||||||
|
'/GR-',
|
||||||
|
'/TP',
|
||||||
|
'/std:c++17',
|
||||||
|
]
|
||||||
|
cxx.linkflags += [
|
||||||
|
'kernel32.lib',
|
||||||
|
'user32.lib',
|
||||||
|
'gdi32.lib',
|
||||||
|
'winspool.lib',
|
||||||
|
'comdlg32.lib',
|
||||||
|
'advapi32.lib',
|
||||||
|
'shell32.lib',
|
||||||
|
'ole32.lib',
|
||||||
|
'oleaut32.lib',
|
||||||
|
'uuid.lib',
|
||||||
|
'odbc32.lib',
|
||||||
|
'odbccp32.lib',
|
||||||
|
]
|
||||||
|
|
||||||
|
if builder.options.opt == '1':
|
||||||
|
cxx.cflags += ['/Ox', '/Zo']
|
||||||
|
cxx.linkflags += ['/OPT:ICF', '/OPT:REF']
|
||||||
|
|
||||||
|
if builder.options.debug == '1':
|
||||||
|
cxx.cflags += ['/Od', '/RTC1']
|
||||||
|
|
||||||
|
# This needs to be after our optimization flags which could otherwise disable it.
|
||||||
|
# Don't omit the frame pointer.
|
||||||
|
cxx.cflags += ['/Oy-']
|
||||||
|
|
||||||
|
def configure_linux(self, cxx):
|
||||||
|
cxx.defines += ['LINUX', '_LINUX', 'POSIX', '_FILE_OFFSET_BITS=64']
|
||||||
|
cxx.linkflags += ['-lm']
|
||||||
|
if cxx.family == 'gcc':
|
||||||
|
cxx.linkflags += ['-static-libgcc']
|
||||||
|
elif cxx.family == 'clang':
|
||||||
|
cxx.linkflags += ['-lgcc_eh']
|
||||||
|
cxx.linkflags += ['-static-libstdc++']
|
||||||
|
|
||||||
|
def configure_mac(self, cxx):
|
||||||
|
cxx.defines += ['OSX', '_OSX', 'POSIX', 'KE_ABSOLUTELY_NO_STL']
|
||||||
|
cxx.cflags += ['-mmacosx-version-min=10.15']
|
||||||
|
cxx.linkflags += [
|
||||||
|
'-mmacosx-version-min=10.15',
|
||||||
|
'-stdlib=libc++',
|
||||||
|
'-lc++',
|
||||||
|
]
|
||||||
|
cxx.cxxflags += ['-stdlib=libc++']
|
||||||
|
|
||||||
|
def configure_windows(self, cxx):
|
||||||
|
cxx.defines += ['WIN32', '_WINDOWS']
|
||||||
|
|
||||||
|
def LibraryBuilder(self, compiler, name):
|
||||||
|
binary = compiler.Library(name)
|
||||||
|
self.AddVersioning(binary)
|
||||||
|
if binary.compiler.like('msvc'):
|
||||||
|
binary.compiler.linkflags += ['/SUBSYSTEM:WINDOWS']
|
||||||
|
self.AddCxxCompat(binary)
|
||||||
return binary
|
return binary
|
||||||
|
|
||||||
|
def Library(self, context, compiler, name):
|
||||||
|
compiler = compiler.clone()
|
||||||
|
SetArchFlags(compiler)
|
||||||
|
return self.LibraryBuilder(compiler, name)
|
||||||
|
|
||||||
def ConfigureForExtension(self, context, compiler):
|
def ConfigureForExtension(self, context, compiler):
|
||||||
compiler.cxxincludes += [
|
compiler.cxxincludes += [
|
||||||
os.path.join(context.currentSourcePath),
|
os.path.join(context.currentSourcePath),
|
||||||
@ -376,31 +334,89 @@ class ExtensionConfig(object):
|
|||||||
os.path.join(self.sm_root, 'public'),
|
os.path.join(self.sm_root, 'public'),
|
||||||
os.path.join(self.sm_root, 'public', 'extensions'),
|
os.path.join(self.sm_root, 'public', 'extensions'),
|
||||||
os.path.join(self.sm_root, 'sourcepawn', 'include'),
|
os.path.join(self.sm_root, 'sourcepawn', 'include'),
|
||||||
os.path.join(self.sm_root, 'public', 'amtl', 'include'),
|
os.path.join(self.sm_root, 'public', 'amtl', 'amtl'),
|
||||||
|
os.path.join(self.sm_root, 'public', 'amtl'),
|
||||||
]
|
]
|
||||||
return compiler
|
return compiler
|
||||||
|
|
||||||
def HL2Project(self, context, name):
|
|
||||||
project = context.compiler.LibraryProject(name)
|
|
||||||
self.ConfigureForExtension(context, project.compiler)
|
|
||||||
return project
|
|
||||||
|
|
||||||
def HL2Config(self, project, name, sdk):
|
def AddCDetour(self, binary):
|
||||||
binary = project.Configure(name, '{0} - {1}'.format(self.tag, sdk.name))
|
public_path = os.path.join(self.sm_root, 'public')
|
||||||
return self.ConfigureForHL2(binary, sdk)
|
binary.sources += [
|
||||||
|
os.path.join(public_path, 'CDetour', 'detours.cpp'),
|
||||||
|
os.path.join(public_path, 'safetyhook', 'src', 'allocator.cpp'),
|
||||||
|
os.path.join(public_path, 'safetyhook', 'src', 'easy.cpp'),
|
||||||
|
os.path.join(public_path, 'safetyhook', 'src', 'inline_hook.cpp'),
|
||||||
|
os.path.join(public_path, 'safetyhook', 'src', 'mid_hook.cpp'),
|
||||||
|
os.path.join(public_path, 'safetyhook', 'src', 'os.linux.cpp'),
|
||||||
|
os.path.join(public_path, 'safetyhook', 'src', 'utility.cpp'),
|
||||||
|
os.path.join(public_path, 'safetyhook', 'src', 'vmt_hook.cpp'),
|
||||||
|
os.path.join(public_path, 'safetyhook', 'zydis', 'Zydis.c')
|
||||||
|
]
|
||||||
|
|
||||||
|
binary.compiler.includes += [
|
||||||
|
os.path.join(public_path, 'safetyhook', 'include'),
|
||||||
|
os.path.join(public_path, 'safetyhook', 'zydis'),
|
||||||
|
]
|
||||||
|
|
||||||
|
def ExtLibrary(self, context, compiler, name):
|
||||||
|
binary = self.Library(context, compiler, name)
|
||||||
|
SetArchFlags(compiler)
|
||||||
|
self.ConfigureForExtension(context, binary.compiler)
|
||||||
|
return binary
|
||||||
|
|
||||||
|
def AddCxxCompat(self, binary):
|
||||||
|
if binary.compiler.target.platform == 'linux':
|
||||||
|
binary.sources += [
|
||||||
|
os.path.join(self.sm_root, 'public', 'amtl', 'compat', 'stdcxx.cpp'),
|
||||||
|
]
|
||||||
|
|
||||||
|
def ConfigureForHL2(self, context, binary, sdk):
|
||||||
|
compiler = binary.compiler
|
||||||
|
SetArchFlags(compiler)
|
||||||
|
|
||||||
|
compiler.cxxincludes += [
|
||||||
|
os.path.join(self.mms_root, 'core'),
|
||||||
|
os.path.join(self.mms_root, 'core', 'sourcehook'),
|
||||||
|
]
|
||||||
|
|
||||||
|
for other_sdk in self.sdk_manifests:
|
||||||
|
compiler.defines += ['SE_{}={}'.format(other_sdk['define'], other_sdk['code'])]
|
||||||
|
|
||||||
|
SdkHelpers.configureCxx(context, binary, sdk)
|
||||||
|
|
||||||
|
return binary
|
||||||
|
|
||||||
|
def HL2Library(self, context, compiler, name, sdk):
|
||||||
|
binary = self.Library(context, compiler, name)
|
||||||
|
self.ConfigureForExtension(context, binary.compiler)
|
||||||
|
return self.ConfigureForHL2(context, binary, sdk)
|
||||||
|
|
||||||
|
def HL2Config(self, project, context, compiler, name, sdk):
|
||||||
|
binary = project.Configure(compiler, name,
|
||||||
|
'{0} - {1} {2}'.format(self.tag, sdk['name'], compiler.target.arch))
|
||||||
|
self.AddCxxCompat(binary)
|
||||||
|
return self.ConfigureForHL2(context, binary, sdk)
|
||||||
|
|
||||||
|
def HL2ExtConfig(self, project, context, compiler, name, sdk):
|
||||||
|
binary = project.Configure(compiler, name,
|
||||||
|
'{0} - {1} {2}'.format(self.tag, sdk['name'], compiler.target.arch))
|
||||||
|
self.AddCxxCompat(binary)
|
||||||
|
self.ConfigureForHL2(context, binary, sdk)
|
||||||
|
self.ConfigureForExtension(context, binary.compiler)
|
||||||
|
return binary
|
||||||
|
|
||||||
Extension = ExtensionConfig()
|
Extension = ExtensionConfig()
|
||||||
Extension.detectSDKs()
|
Extension.detectSDKs()
|
||||||
Extension.configure()
|
Extension.configure()
|
||||||
|
|
||||||
# Add additional buildscripts here
|
# This will clone the list and each cxx object as we recurse, preventing child
|
||||||
|
# scripts from messing up global state.
|
||||||
|
builder.targets = builder.CloneableList(Extension.all_targets)
|
||||||
|
|
||||||
BuildScripts = [
|
BuildScripts = [
|
||||||
'AMBuilder',
|
'AMBuilder',
|
||||||
|
'PackageScript',
|
||||||
]
|
]
|
||||||
|
|
||||||
if builder.backend == 'amb2':
|
builder.Build(BuildScripts, { 'Extension': Extension })
|
||||||
BuildScripts += [
|
|
||||||
'PackageScript',
|
|
||||||
]
|
|
||||||
|
|
||||||
builder.RunBuildScripts(BuildScripts, { 'Extension': Extension})
|
|
||||||
|
|||||||
42
AMBuilder
42
AMBuilder
@ -2,26 +2,46 @@
|
|||||||
import os
|
import os
|
||||||
|
|
||||||
if not "SM" in globals():
|
if not "SM" in globals():
|
||||||
SM = Extension
|
SM = Extension
|
||||||
|
|
||||||
projectName = 'Voice'
|
projectName = 'Voice'
|
||||||
|
|
||||||
project = SM.HL2Project(builder, projectName + '.ext')
|
project = builder.LibraryProject(projectName)
|
||||||
project.sources += [
|
project.sources += [
|
||||||
'extension.cpp',
|
'extension.cpp',
|
||||||
'ringbuffer.cpp',
|
'ringbuffer.cpp',
|
||||||
'../../public/smsdk_ext.cpp'
|
os.path.join(SM.sm_root, 'public', 'smsdk_ext.cpp')
|
||||||
]
|
]
|
||||||
|
|
||||||
for sdk_name in SM.sdks:
|
for sdk_name in SM.sdks:
|
||||||
sdk = SM.sdks[sdk_name]
|
sdk = SM.sdks[sdk_name]
|
||||||
binary = SM.HL2Config(project, projectName + '.ext', sdk)
|
if sdk['name'] in ['mock']:
|
||||||
binary.compiler.cxxincludes += [
|
continue
|
||||||
os.path.join(SM.sm_root, 'public', 'extensions'),
|
|
||||||
os.path.join(builder.sourcePath, 'silk')
|
for cxx in builder.targets:
|
||||||
]
|
cxx.defines += ['HAVE_STRING_H'];
|
||||||
binary.compiler.linkflags += [
|
if not cxx.target.arch in sdk['platforms'][cxx.target.platform]:
|
||||||
os.path.join(builder.sourcePath, 'silk', 'libSKP_SILK_SDK.a')
|
continue
|
||||||
]
|
|
||||||
|
binary = Extension.HL2ExtConfig(project, builder, cxx, projectName + '.ext.' + sdk['extension'], sdk)
|
||||||
|
|
||||||
|
SM.AddCDetour(binary)
|
||||||
|
|
||||||
|
binary.compiler.cxxflags += [
|
||||||
|
'-Wno-dangling-else',
|
||||||
|
'-Wno-unknown-pragmas',
|
||||||
|
'-Wno-unused-result',
|
||||||
|
'-Wno-sign-compare',
|
||||||
|
]
|
||||||
|
|
||||||
|
binary.compiler.cxxincludes += [
|
||||||
|
os.path.join(SM.sm_root, 'public', 'extensions'),
|
||||||
|
os.path.join(builder.sourcePath, 'opus'),
|
||||||
|
os.path.join(builder.sourcePath, 'celt')
|
||||||
|
]
|
||||||
|
binary.compiler.linkflags += [
|
||||||
|
os.path.join(builder.sourcePath, 'opus', 'libopus.a'),
|
||||||
|
os.path.join(builder.sourcePath, 'celt', 'libcelt0_patched.a')
|
||||||
|
]
|
||||||
|
|
||||||
SM.extensions += builder.Add(project)
|
SM.extensions += builder.Add(project)
|
||||||
|
|||||||
4
Makefile
4
Makefile
@ -109,7 +109,7 @@ else
|
|||||||
LIB_SUFFIX = .$(LIB_EXT)
|
LIB_SUFFIX = .$(LIB_EXT)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
INCLUDE += -I. -I.. -Isdk -I$(SMSDK)/public -I$(SMSDK)/public/sourcepawn
|
INCLUDE += -I. -I.. -Isdk -I$(SMSDK)/public -I$(SMSDK)/sourcepawn/include
|
||||||
|
|
||||||
ifeq "$(USEMETA)" "true"
|
ifeq "$(USEMETA)" "true"
|
||||||
LINK_HL2 = $(HL2LIB)/tier1_i486.a $(LIB_PREFIX)vstdlib$(LIB_SUFFIX) $(LIB_PREFIX)tier0$(LIB_SUFFIX)
|
LINK_HL2 = $(HL2LIB)/tier1_i486.a $(LIB_PREFIX)vstdlib$(LIB_SUFFIX) $(LIB_PREFIX)tier0$(LIB_SUFFIX)
|
||||||
@ -131,7 +131,7 @@ LINK += -m32 -lm -ldl
|
|||||||
CFLAGS += -DPOSIX -Dstricmp=strcasecmp -D_stricmp=strcasecmp -D_strnicmp=strncasecmp -Dstrnicmp=strncasecmp \
|
CFLAGS += -DPOSIX -Dstricmp=strcasecmp -D_stricmp=strcasecmp -D_strnicmp=strncasecmp -Dstrnicmp=strncasecmp \
|
||||||
-D_snprintf=snprintf -D_vsnprintf=vsnprintf -D_alloca=alloca -Dstrcmpi=strcasecmp -DCOMPILER_GCC -Wall -Werror \
|
-D_snprintf=snprintf -D_vsnprintf=vsnprintf -D_alloca=alloca -Dstrcmpi=strcasecmp -DCOMPILER_GCC -Wall -Werror \
|
||||||
-Wno-overloaded-virtual -Wno-switch -Wno-unused -msse -DSOURCEMOD_BUILD -DHAVE_STDINT_H -m32
|
-Wno-overloaded-virtual -Wno-switch -Wno-unused -msse -DSOURCEMOD_BUILD -DHAVE_STDINT_H -m32
|
||||||
CPPFLAGS += -Wno-non-virtual-dtor -fno-exceptions -fno-rtti
|
CPPFLAGS += -Wno-non-virtual-dtor -fno-exceptions -fno-rtti -std=c++11
|
||||||
|
|
||||||
################################################
|
################################################
|
||||||
### DO NOT EDIT BELOW HERE FOR MOST PROJECTS ###
|
### DO NOT EDIT BELOW HERE FOR MOST PROJECTS ###
|
||||||
|
|||||||
@ -7,9 +7,14 @@ builder.SetBuildFolder('package')
|
|||||||
|
|
||||||
# Add any folders you need to this list
|
# Add any folders you need to this list
|
||||||
folder_list = [
|
folder_list = [
|
||||||
'addons/sourcemod/extensions'
|
'addons/sourcemod/extensions',
|
||||||
]
|
]
|
||||||
|
|
||||||
|
if 'x86_64' in Extension.target_archs:
|
||||||
|
folder_list.extend([
|
||||||
|
'addons/sourcemod/extensions/x64',
|
||||||
|
])
|
||||||
|
|
||||||
# Create the distribution folder hierarchy.
|
# Create the distribution folder hierarchy.
|
||||||
folder_map = {}
|
folder_map = {}
|
||||||
for folder in folder_list:
|
for folder in folder_list:
|
||||||
@ -25,6 +30,10 @@ def CopyFiles(src, dest, files):
|
|||||||
source_path = os.path.join(builder.sourcePath, src, source_file)
|
source_path = os.path.join(builder.sourcePath, src, source_file)
|
||||||
builder.AddCopy(source_path, dest_entry)
|
builder.AddCopy(source_path, dest_entry)
|
||||||
|
|
||||||
|
|
||||||
# Copy binaries.
|
# Copy binaries.
|
||||||
for cxx_task in Extension.extensions:
|
for cxx_task in Extension.extensions:
|
||||||
builder.AddCopy(cxx_task.binary, folder_map['addons/sourcemod/extensions'])
|
if cxx_task.target.arch == 'x86_64':
|
||||||
|
builder.AddCopy(cxx_task.binary, folder_map['addons/sourcemod/extensions/x64'])
|
||||||
|
else:
|
||||||
|
builder.AddCopy(cxx_task.binary, folder_map['addons/sourcemod/extensions'])
|
||||||
|
|||||||
15
README.md
Normal file
15
README.md
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
This new branch is used for allowing both nosteamers and linux users to communicate at the same time.
|
||||||
|
|
||||||
|
Nosteamers are stuck with CELT codec as they dont support steam/opus.
|
||||||
|
|
||||||
|
Linux users are stuck with steam as they dont support celt without manually fixing the .so file.
|
||||||
|
|
||||||
|
This branch discards BroadCastVoiceData for instead creating our own SendNetMsg using SVC_VoiceData
|
||||||
|
|
||||||
|
that enables us to take opus packets, decode to raw pcm and encode with celt.
|
||||||
|
|
||||||
|
that enables us to take celt packets, decode to raw pcm and encode with opus.
|
||||||
|
|
||||||
|
currently does the support for nosteamers to hear steam voice chat still have to be improved, but steam users can hear nosteam users very fine.
|
||||||
|
|
||||||
|
the sourcemod plugin used for stubbing nosteamers with SVC_VoiceInit: https://git.unloze.com/UNLOZE/sm-plugins/src/branch/master/CELT_VOICE
|
||||||
325
celt/celt.h
Normal file
325
celt/celt.h
Normal file
@ -0,0 +1,325 @@
|
|||||||
|
/* 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 FOUNDATION 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 "celt_types.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__GNUC__) && defined(CELT_BUILD)
|
||||||
|
#define EXPORT __attribute__ ((visibility ("default")))
|
||||||
|
#elif defined(WIN32)
|
||||||
|
#define EXPORT __declspec(dllexport)
|
||||||
|
#else
|
||||||
|
#define EXPORT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define _celt_check_int(x) (((void)((x) == (celt_int32)0)), (celt_int32)(x))
|
||||||
|
#define _celt_check_mode_ptr_ptr(ptr) ((ptr) + ((ptr) - (const CELTMode**)(ptr)))
|
||||||
|
#define _celt_check_int_ptr(ptr) ((ptr) + ((ptr) - (int*)(ptr)))
|
||||||
|
|
||||||
|
/* Error codes */
|
||||||
|
/** No error */
|
||||||
|
#define CELT_OK 0
|
||||||
|
/** An (or more) invalid argument (e.g. out of range) */
|
||||||
|
#define CELT_BAD_ARG -1
|
||||||
|
/** The mode struct passed is invalid */
|
||||||
|
#define CELT_BUFFER_TOO_SMALL -2
|
||||||
|
/** An internal error was detected */
|
||||||
|
#define CELT_INTERNAL_ERROR -3
|
||||||
|
/** The data passed (e.g. compressed data to decoder) is corrupted */
|
||||||
|
#define CELT_CORRUPTED_DATA -4
|
||||||
|
/** Invalid/unsupported request number */
|
||||||
|
#define CELT_UNIMPLEMENTED -5
|
||||||
|
/** An encoder or decoder structure is invalid or already freed */
|
||||||
|
#define CELT_INVALID_STATE -6
|
||||||
|
/** Memory allocation has failed */
|
||||||
|
#define CELT_ALLOC_FAIL -7
|
||||||
|
|
||||||
|
|
||||||
|
/* Encoder/decoder Requests */
|
||||||
|
|
||||||
|
#define CELT_SET_COMPLEXITY_REQUEST 2
|
||||||
|
/** Controls the complexity from 0-10 (int) */
|
||||||
|
#define CELT_SET_COMPLEXITY(x) CELT_SET_COMPLEXITY_REQUEST, _celt_check_int(x)
|
||||||
|
|
||||||
|
#define CELT_SET_PREDICTION_REQUEST 4
|
||||||
|
/** 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, _celt_check_int(x)
|
||||||
|
|
||||||
|
#define CELT_SET_BITRATE_REQUEST 6
|
||||||
|
/** Set the target VBR rate in bits per second(int); 0=CBR (default) */
|
||||||
|
#define CELT_SET_BITRATE(x) CELT_SET_BITRATE_REQUEST, _celt_check_int(x)
|
||||||
|
|
||||||
|
#define CELT_RESET_STATE_REQUEST 8
|
||||||
|
/** Reset the encoder/decoder memories to zero*/
|
||||||
|
#define CELT_RESET_STATE CELT_RESET_STATE_REQUEST
|
||||||
|
|
||||||
|
#define CELT_SET_VBR_CONSTRAINT_REQUEST 10
|
||||||
|
#define CELT_SET_VBR_CONSTRAINT(x) CELT_SET_VBR_CONSTRAINT_REQUEST, _celt_check_int(x)
|
||||||
|
|
||||||
|
#define CELT_SET_VBR_REQUEST 12
|
||||||
|
#define CELT_SET_VBR(x) CELT_SET_VBR_REQUEST, _celt_check_int(x)
|
||||||
|
|
||||||
|
#define CELT_SET_INPUT_CLIPPING_REQUEST 14
|
||||||
|
#define CELT_SET_INPUT_CLIPPING(x) CELT_SET_INPUT_CLIPPING_REQUEST, _celt_check_int(x)
|
||||||
|
|
||||||
|
#define CELT_GET_AND_CLEAR_ERROR_REQUEST 15
|
||||||
|
#define CELT_GET_AND_CLEAR_ERROR(x) CELT_GET_AND_CLEAR_ERROR_REQUEST, _celt_check_int_ptr(x)
|
||||||
|
|
||||||
|
#define CELT_GET_LOOKAHEAD_REQUEST 17
|
||||||
|
#define CELT_GET_LOOKAHEAD(x) CELT_GET_LOOKAHEAD_REQUEST, _celt_check_int_ptr(x)
|
||||||
|
|
||||||
|
#define CELT_SET_CHANNELS_REQUEST 18
|
||||||
|
#define CELT_SET_CHANNELS(x) CELT_SET_CHANNELS_REQUEST, _celt_check_int(x)
|
||||||
|
|
||||||
|
#define CELT_SET_LOSS_PERC_REQUEST 20
|
||||||
|
#define CELT_SET_LOSS_PERC(x) CELT_SET_LOSS_PERC_REQUEST, _celt_check_int(x)
|
||||||
|
|
||||||
|
/* Internal */
|
||||||
|
#define CELT_SET_START_BAND_REQUEST 10000
|
||||||
|
#define CELT_SET_START_BAND(x) CELT_SET_START_BAND_REQUEST, _celt_check_int(x)
|
||||||
|
|
||||||
|
#define CELT_SET_END_BAND_REQUEST 10001
|
||||||
|
#define CELT_SET_END_BAND(x) CELT_SET_END_BAND_REQUEST, _celt_check_int(x)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** Contains the state of an encoder. One encoder state is needed
|
||||||
|
for each stream. It is initialised once at the beginning of the
|
||||||
|
stream. Do *not* re-initialise the state for every frame.
|
||||||
|
@brief Encoder state
|
||||||
|
*/
|
||||||
|
typedef struct CELTEncoder CELTEncoder;
|
||||||
|
|
||||||
|
/** State of the decoder. One decoder state is needed for each stream.
|
||||||
|
It is initialised once at the beginning of the stream. Do *not*
|
||||||
|
re-initialise the state for every frame */
|
||||||
|
typedef struct CELTDecoder CELTDecoder;
|
||||||
|
|
||||||
|
/** The mode contains all the information necessary to create an
|
||||||
|
encoder. Both the encoder and decoder need to be initialised
|
||||||
|
with exactly the same mode, otherwise the quality will be very
|
||||||
|
bad */
|
||||||
|
typedef struct CELTMode CELTMode;
|
||||||
|
|
||||||
|
|
||||||
|
/** \defgroup codec Encoding and decoding */
|
||||||
|
/* @{ */
|
||||||
|
|
||||||
|
/* Mode calls */
|
||||||
|
|
||||||
|
/** 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 Fs Sampling rate (32000 to 96000 Hz)
|
||||||
|
@param frame_size Number of samples (per channel) to encode in each
|
||||||
|
packet (even values; 64 - 512)
|
||||||
|
@param error Returned error code (if NULL, no error will be returned)
|
||||||
|
@return A newly created mode
|
||||||
|
*/
|
||||||
|
EXPORT CELTMode *celt_mode_create(celt_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 mode Mode to be destroyed
|
||||||
|
*/
|
||||||
|
EXPORT void celt_mode_destroy(CELTMode *mode);
|
||||||
|
|
||||||
|
/* Encoder stuff */
|
||||||
|
|
||||||
|
EXPORT int celt_encoder_get_size(int channels);
|
||||||
|
|
||||||
|
EXPORT int celt_encoder_get_size_custom(const CELTMode *mode, int channels);
|
||||||
|
|
||||||
|
/** Creates a new encoder state. Each stream needs its own encoder
|
||||||
|
state (can't be shared across simultaneous streams).
|
||||||
|
@param channels Number of channels
|
||||||
|
@param error Returns an error code
|
||||||
|
@return Newly created encoder state.
|
||||||
|
*/
|
||||||
|
EXPORT CELTEncoder *celt_encoder_create(int sampling_rate, int channels, int *error);
|
||||||
|
|
||||||
|
/** Creates a new encoder state. Each stream needs its own encoder
|
||||||
|
state (can't be shared across simultaneous streams).
|
||||||
|
@param mode Contains all the information about the characteristics of
|
||||||
|
* the stream (must be the same characteristics as used for the
|
||||||
|
* decoder)
|
||||||
|
@param channels Number of channels
|
||||||
|
@param error Returns an error code
|
||||||
|
@return Newly created encoder state.
|
||||||
|
*/
|
||||||
|
EXPORT CELTEncoder *celt_encoder_create_custom(const CELTMode *mode, int channels, int *error);
|
||||||
|
|
||||||
|
EXPORT CELTEncoder *celt_encoder_init(CELTEncoder *st, int sampling_rate, int channels, int *error);
|
||||||
|
|
||||||
|
EXPORT CELTEncoder *celt_encoder_init_custom(CELTEncoder *st, const CELTMode *mode, int channels, int *error);
|
||||||
|
|
||||||
|
/** Destroys a an encoder state.
|
||||||
|
@param st Encoder state to be destroyed
|
||||||
|
*/
|
||||||
|
EXPORT void celt_encoder_destroy(CELTEncoder *st);
|
||||||
|
|
||||||
|
/** Encodes a frame of audio.
|
||||||
|
@param st Encoder state
|
||||||
|
@param pcm 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 dynmaic range. There must be exactly
|
||||||
|
* frame_size samples per channel.
|
||||||
|
@param compressed The compressed data is written here. This may not alias pcm or
|
||||||
|
* optional_synthesis.
|
||||||
|
@param nbCompressedBytes Maximum number of bytes to use for compressing the frame
|
||||||
|
* (can change from one frame to another)
|
||||||
|
@return Number of bytes written to "compressed". Will be the same as
|
||||||
|
* "nbCompressedBytes" unless the stream is VBR and will never be larger.
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
EXPORT int celt_encode_float(CELTEncoder *st, const float *pcm, int frame_size, unsigned char *compressed, int maxCompressedBytes);
|
||||||
|
|
||||||
|
/** Encodes a frame of audio.
|
||||||
|
@param st Encoder state
|
||||||
|
@param pcm PCM audio in signed 16-bit format (native endian). There must be
|
||||||
|
* exactly frame_size samples per channel.
|
||||||
|
@param compressed The compressed data is written here. This may not alias pcm or
|
||||||
|
* optional_synthesis.
|
||||||
|
@param nbCompressedBytes Maximum number of bytes to use for compressing the frame
|
||||||
|
* (can change from one frame to another)
|
||||||
|
@return Number of bytes written to "compressed". Will be the same as
|
||||||
|
* "nbCompressedBytes" unless the stream is VBR and will never be larger.
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
EXPORT int celt_encode(CELTEncoder *st, const celt_int16 *pcm, int frame_size, unsigned char *compressed, int maxCompressedBytes);
|
||||||
|
|
||||||
|
/** Query and set encoder parameters
|
||||||
|
@param st Encoder state
|
||||||
|
@param request Parameter to change or query
|
||||||
|
@param value Pointer to a 32-bit int value
|
||||||
|
@return Error code
|
||||||
|
*/
|
||||||
|
EXPORT int celt_encoder_ctl(CELTEncoder * st, int request, ...);
|
||||||
|
|
||||||
|
/* Decoder stuff */
|
||||||
|
|
||||||
|
EXPORT int celt_decoder_get_size(int channels);
|
||||||
|
|
||||||
|
EXPORT int celt_decoder_get_size_custom(const CELTMode *mode, int channels);
|
||||||
|
|
||||||
|
/** Creates a new decoder state. Each stream needs its own decoder state (can't
|
||||||
|
be shared across simultaneous streams).
|
||||||
|
@param mode Contains all the information about the characteristics of the
|
||||||
|
stream (must be the same characteristics as used for the encoder)
|
||||||
|
@param channels Number of channels
|
||||||
|
@param error Returns an error code
|
||||||
|
@return Newly created decoder state.
|
||||||
|
*/
|
||||||
|
EXPORT CELTDecoder *celt_decoder_create(int sampling_rate, int channels, int *error);
|
||||||
|
|
||||||
|
/** Creates a new decoder state. Each stream needs its own decoder state (can't
|
||||||
|
be shared across simultaneous streams).
|
||||||
|
@param mode Contains all the information about the characteristics of the
|
||||||
|
stream (must be the same characteristics as used for the encoder)
|
||||||
|
@param channels Number of channels
|
||||||
|
@param error Returns an error code
|
||||||
|
@return Newly created decoder state.
|
||||||
|
*/
|
||||||
|
EXPORT CELTDecoder *celt_decoder_create_custom(const CELTMode *mode, int channels, int *error);
|
||||||
|
|
||||||
|
EXPORT CELTDecoder *celt_decoder_init(CELTDecoder *st, int sampling_rate, int channels, int *error);
|
||||||
|
|
||||||
|
EXPORT CELTDecoder *celt_decoder_init_custom(CELTDecoder *st, const CELTMode *mode, int channels, int *error);
|
||||||
|
|
||||||
|
/** Destroys a a decoder state.
|
||||||
|
@param st Decoder state to be destroyed
|
||||||
|
*/
|
||||||
|
EXPORT void celt_decoder_destroy(CELTDecoder *st);
|
||||||
|
|
||||||
|
/** Decodes a frame of audio.
|
||||||
|
@param st Decoder state
|
||||||
|
@param data Compressed data produced by an encoder
|
||||||
|
@param len Number of bytes to read from "data". This MUST be exactly the number
|
||||||
|
of bytes returned by the encoder. Using a larger value WILL NOT WORK.
|
||||||
|
@param pcm One frame (frame_size samples per channel) of decoded PCM will be
|
||||||
|
returned here in float format.
|
||||||
|
@return Error code.
|
||||||
|
*/
|
||||||
|
EXPORT int celt_decode_float(CELTDecoder *st, const unsigned char *data, int len, float *pcm, int frame_size);
|
||||||
|
|
||||||
|
/** Decodes a frame of audio.
|
||||||
|
@param st Decoder state
|
||||||
|
@param data Compressed data produced by an encoder
|
||||||
|
@param len Number of bytes to read from "data". This MUST be exactly the number
|
||||||
|
of bytes returned by the encoder. Using a larger value WILL NOT WORK.
|
||||||
|
@param pcm One frame (frame_size samples per channel) of decoded PCM will be
|
||||||
|
returned here in 16-bit PCM format (native endian).
|
||||||
|
@return Error code.
|
||||||
|
*/
|
||||||
|
EXPORT int celt_decode(CELTDecoder *st, const unsigned char *data, int len, celt_int16 *pcm, int frame_size);
|
||||||
|
|
||||||
|
/** Query and set decoder parameters
|
||||||
|
@param st Decoder state
|
||||||
|
@param request Parameter to change or query
|
||||||
|
@param value Pointer to a 32-bit int value
|
||||||
|
@return Error code
|
||||||
|
*/
|
||||||
|
EXPORT int celt_decoder_ctl(CELTDecoder * st, int request, ...);
|
||||||
|
|
||||||
|
|
||||||
|
/** Returns the English string that corresponds to an error code
|
||||||
|
* @param error Error code (negative for an error, 0 for success
|
||||||
|
* @return Constant string (must NOT be freed)
|
||||||
|
*/
|
||||||
|
EXPORT const char *celt_strerror(int error);
|
||||||
|
|
||||||
|
/* @} */
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /*CELT_H */
|
||||||
66
celt/celt_header.h
Normal file
66
celt/celt_header.h
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
/* Copyright (c) 2007 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 FOUNDATION 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_HEADER_H
|
||||||
|
#define CELT_HEADER_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "celt.h"
|
||||||
|
#include "celt_types.h"
|
||||||
|
|
||||||
|
/** Header data to be used for Ogg files (or possibly other encapsulation)
|
||||||
|
@brief Header data
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
char codec_id[8]; /**< MUST be "CELT " (four spaces) */
|
||||||
|
char codec_version[20]; /**< Version used (as string) */
|
||||||
|
celt_int32 version_id; /**< Version id (negative for until stream is frozen) */
|
||||||
|
celt_int32 header_size; /**< Size of this header */
|
||||||
|
celt_int32 sample_rate; /**< Sampling rate of the original audio */
|
||||||
|
celt_int32 nb_channels; /**< Number of channels */
|
||||||
|
celt_int32 frame_size; /**< Samples per frame (per channel) */
|
||||||
|
celt_int32 overlap; /**< Overlapping samples (per channel) */
|
||||||
|
celt_int32 bytes_per_packet; /**< Number of bytes per compressed packet (0 if unknown) */
|
||||||
|
celt_int32 extra_headers; /**< Number of additional headers that follow this header */
|
||||||
|
} CELTHeader;
|
||||||
|
|
||||||
|
/** Creates a basic header struct */
|
||||||
|
EXPORT int celt_header_init(CELTHeader *header, const CELTMode *m, int frame_size, int channels);
|
||||||
|
|
||||||
|
EXPORT int celt_header_to_packet(const CELTHeader *header, unsigned char *packet, celt_uint32 size);
|
||||||
|
|
||||||
|
EXPORT int celt_header_from_packet(const unsigned char *packet, celt_uint32 size, CELTHeader *header);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* CELT_HEADER_H */
|
||||||
151
celt/celt_types.h
Normal file
151
celt/celt_types.h
Normal file
@ -0,0 +1,151 @@
|
|||||||
|
/* (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 FOUNDATION 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.
|
||||||
|
*/
|
||||||
|
/* celt_types.h taken from libogg */
|
||||||
|
|
||||||
|
/**
|
||||||
|
@file celt_types.h
|
||||||
|
@brief CELT types
|
||||||
|
*/
|
||||||
|
#ifndef _CELT_TYPES_H
|
||||||
|
#define _CELT_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 celt_int16;
|
||||||
|
typedef uint16_t celt_uint16;
|
||||||
|
typedef int32_t celt_int32;
|
||||||
|
typedef uint32_t celt_uint32;
|
||||||
|
#elif defined(_WIN32)
|
||||||
|
|
||||||
|
# if defined(__CYGWIN__)
|
||||||
|
# include <_G_config.h>
|
||||||
|
typedef _G_int32_t celt_int32;
|
||||||
|
typedef _G_uint32_t celt_uint32;
|
||||||
|
typedef _G_int16 celt_int16;
|
||||||
|
typedef _G_uint16 celt_uint16;
|
||||||
|
# elif defined(__MINGW32__)
|
||||||
|
typedef short celt_int16;
|
||||||
|
typedef unsigned short celt_uint16;
|
||||||
|
typedef int celt_int32;
|
||||||
|
typedef unsigned int celt_uint32;
|
||||||
|
# elif defined(__MWERKS__)
|
||||||
|
typedef int celt_int32;
|
||||||
|
typedef unsigned int celt_uint32;
|
||||||
|
typedef short celt_int16;
|
||||||
|
typedef unsigned short celt_uint16;
|
||||||
|
# else
|
||||||
|
/* MSVC/Borland */
|
||||||
|
typedef __int32 celt_int32;
|
||||||
|
typedef unsigned __int32 celt_uint32;
|
||||||
|
typedef __int16 celt_int16;
|
||||||
|
typedef unsigned __int16 celt_uint16;
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#elif defined(__MACOS__)
|
||||||
|
|
||||||
|
# include <sys/types.h>
|
||||||
|
typedef SInt16 celt_int16;
|
||||||
|
typedef UInt16 celt_uint16;
|
||||||
|
typedef SInt32 celt_int32;
|
||||||
|
typedef UInt32 celt_uint32;
|
||||||
|
|
||||||
|
#elif (defined(__APPLE__) && defined(__MACH__)) /* MacOS X Framework build */
|
||||||
|
|
||||||
|
# include <sys/types.h>
|
||||||
|
typedef int16_t celt_int16;
|
||||||
|
typedef u_int16_t celt_uint16;
|
||||||
|
typedef int32_t celt_int32;
|
||||||
|
typedef u_int32_t celt_uint32;
|
||||||
|
|
||||||
|
#elif defined(__BEOS__)
|
||||||
|
|
||||||
|
/* Be */
|
||||||
|
# include <inttypes.h>
|
||||||
|
typedef int16 celt_int16;
|
||||||
|
typedef u_int16 celt_uint16;
|
||||||
|
typedef int32_t celt_int32;
|
||||||
|
typedef u_int32_t celt_uint32;
|
||||||
|
|
||||||
|
#elif defined (__EMX__)
|
||||||
|
|
||||||
|
/* OS/2 GCC */
|
||||||
|
typedef short celt_int16;
|
||||||
|
typedef unsigned short celt_uint16;
|
||||||
|
typedef int celt_int32;
|
||||||
|
typedef unsigned int celt_uint32;
|
||||||
|
|
||||||
|
#elif defined (DJGPP)
|
||||||
|
|
||||||
|
/* DJGPP */
|
||||||
|
typedef short celt_int16;
|
||||||
|
typedef unsigned short celt_uint16;
|
||||||
|
typedef int celt_int32;
|
||||||
|
typedef unsigned int celt_uint32;
|
||||||
|
|
||||||
|
#elif defined(R5900)
|
||||||
|
|
||||||
|
/* PS2 EE */
|
||||||
|
typedef int celt_int32;
|
||||||
|
typedef unsigned celt_uint32;
|
||||||
|
typedef short celt_int16;
|
||||||
|
typedef unsigned short celt_uint16;
|
||||||
|
|
||||||
|
#elif defined(__SYMBIAN32__)
|
||||||
|
|
||||||
|
/* Symbian GCC */
|
||||||
|
typedef signed short celt_int16;
|
||||||
|
typedef unsigned short celt_uint16;
|
||||||
|
typedef signed int celt_int32;
|
||||||
|
typedef unsigned int celt_uint32;
|
||||||
|
|
||||||
|
#elif defined(CONFIG_TI_C54X) || defined (CONFIG_TI_C55X)
|
||||||
|
|
||||||
|
typedef short celt_int16;
|
||||||
|
typedef unsigned short celt_uint16;
|
||||||
|
typedef long celt_int32;
|
||||||
|
typedef unsigned long celt_uint32;
|
||||||
|
|
||||||
|
#elif defined(CONFIG_TI_C6X)
|
||||||
|
|
||||||
|
typedef short celt_int16;
|
||||||
|
typedef unsigned short celt_uint16;
|
||||||
|
typedef int celt_int32;
|
||||||
|
typedef unsigned int celt_uint32;
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/* Give up, take a reasonable guess */
|
||||||
|
typedef short celt_int16;
|
||||||
|
typedef unsigned short celt_uint16;
|
||||||
|
typedef int celt_int32;
|
||||||
|
typedef unsigned int celt_uint32;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _CELT_TYPES_H */
|
||||||
BIN
celt/celt_work/bands.o
Normal file
BIN
celt/celt_work/bands.o
Normal file
Binary file not shown.
BIN
celt/celt_work/celt.o
Normal file
BIN
celt/celt_work/celt.o
Normal file
Binary file not shown.
BIN
celt/celt_work/cwrs.o
Normal file
BIN
celt/celt_work/cwrs.o
Normal file
Binary file not shown.
BIN
celt/celt_work/entcode.o
Normal file
BIN
celt/celt_work/entcode.o
Normal file
Binary file not shown.
BIN
celt/celt_work/entdec.o
Normal file
BIN
celt/celt_work/entdec.o
Normal file
Binary file not shown.
BIN
celt/celt_work/entenc.o
Normal file
BIN
celt/celt_work/entenc.o
Normal file
Binary file not shown.
BIN
celt/celt_work/header.o
Normal file
BIN
celt/celt_work/header.o
Normal file
Binary file not shown.
BIN
celt/celt_work/kiss_fft.o
Normal file
BIN
celt/celt_work/kiss_fft.o
Normal file
Binary file not shown.
BIN
celt/celt_work/laplace.o
Normal file
BIN
celt/celt_work/laplace.o
Normal file
Binary file not shown.
BIN
celt/celt_work/mathops.o
Normal file
BIN
celt/celt_work/mathops.o
Normal file
Binary file not shown.
BIN
celt/celt_work/mdct.o
Normal file
BIN
celt/celt_work/mdct.o
Normal file
Binary file not shown.
BIN
celt/celt_work/modes.o
Normal file
BIN
celt/celt_work/modes.o
Normal file
Binary file not shown.
BIN
celt/celt_work/pitch.o
Normal file
BIN
celt/celt_work/pitch.o
Normal file
Binary file not shown.
BIN
celt/celt_work/plc.o
Normal file
BIN
celt/celt_work/plc.o
Normal file
Binary file not shown.
BIN
celt/celt_work/quant_bands.o
Normal file
BIN
celt/celt_work/quant_bands.o
Normal file
Binary file not shown.
BIN
celt/celt_work/rate.o
Normal file
BIN
celt/celt_work/rate.o
Normal file
Binary file not shown.
BIN
celt/celt_work/vq.o
Normal file
BIN
celt/celt_work/vq.o
Normal file
Binary file not shown.
BIN
celt/libcelt0.a
Normal file
BIN
celt/libcelt0.a
Normal file
Binary file not shown.
BIN
celt/libcelt0_patched.a
Normal file
BIN
celt/libcelt0_patched.a
Normal file
Binary file not shown.
34
configure.py
34
configure.py
@ -4,20 +4,24 @@ from ambuild2 import run
|
|||||||
|
|
||||||
# Simple extensions do not need to modify this file.
|
# Simple extensions do not need to modify this file.
|
||||||
|
|
||||||
builder = run.PrepareBuild(sourcePath = sys.path[0])
|
parser = run.BuildParser(sourcePath=sys.path[0], api='2.2')
|
||||||
|
parser.options.add_argument('--hl2sdk-root', type=str, dest='hl2sdk_root', default=None,
|
||||||
builder.options.add_option('--hl2sdk-root', type=str, dest='hl2sdk_root', default=None,
|
help='Root search folder for HL2SDKs')
|
||||||
help='Root search folder for HL2SDKs')
|
parser.options.add_argument('--hl2sdk-manifest-path', type=str, dest='hl2sdk_manifest', default=None,
|
||||||
builder.options.add_option('--mms-path', type=str, dest='mms_path', default=None,
|
help='Path to HL2SDK Manifests')
|
||||||
help='Path to Metamod:Source')
|
parser.options.add_argument('--sm-path', type=str, dest='sm_path', default=None,
|
||||||
builder.options.add_option('--sm-path', type=str, dest='sm_path', default=None,
|
|
||||||
help='Path to SourceMod')
|
help='Path to SourceMod')
|
||||||
builder.options.add_option('--enable-debug', action='store_const', const='1', dest='debug',
|
parser.options.add_argument('--mms-path', type=str, dest='mms_path', default=None,
|
||||||
help='Enable debugging symbols')
|
help='Path to Metamod:Source')
|
||||||
builder.options.add_option('--enable-optimize', action='store_const', const='1', dest='opt',
|
|
||||||
help='Enable optimization')
|
parser.options.add_argument('--enable-debug', action='store_const', const='1', dest='debug',
|
||||||
builder.options.add_option('-s', '--sdks', default='all', dest='sdks',
|
help='Enable debugging symbols')
|
||||||
help='Build against specified SDKs; valid args are "all", "present", or '
|
parser.options.add_argument('--enable-optimize', action='store_const', const='1', dest='opt',
|
||||||
'comma-delimited list of engine names (default: %default)')
|
help='Enable optimization')
|
||||||
|
parser.options.add_argument('-s', '--sdks', default='present', dest='sdks',
|
||||||
|
help='Build against specified SDKs; valid args are "none", "all", "present",'
|
||||||
|
' or comma-delimited list of engine names')
|
||||||
|
parser.options.add_argument('--targets', type=str, dest='targets', default=None,
|
||||||
|
help="Override the target architecture (use commas to separate multiple targets).")
|
||||||
|
parser.Configure()
|
||||||
|
|
||||||
builder.Configure()
|
|
||||||
|
|||||||
1760
extension.cpp
1760
extension.cpp
File diff suppressed because it is too large
Load Diff
77
extension.h
77
extension.h
@ -32,8 +32,9 @@
|
|||||||
#ifndef _INCLUDE_SOURCEMOD_EXTENSION_PROPER_H_
|
#ifndef _INCLUDE_SOURCEMOD_EXTENSION_PROPER_H_
|
||||||
#define _INCLUDE_SOURCEMOD_EXTENSION_PROPER_H_
|
#define _INCLUDE_SOURCEMOD_EXTENSION_PROPER_H_
|
||||||
|
|
||||||
|
#include <poll.h>
|
||||||
#include "smsdk_ext.h"
|
#include "smsdk_ext.h"
|
||||||
#include <SKP_Silk_SDK_API.h>
|
#include "celt_header.h"
|
||||||
#include "ringbuffer.h"
|
#include "ringbuffer.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -49,6 +50,7 @@ typedef __int64 int64;
|
|||||||
typedef long long int64;
|
typedef long long int64;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
class CDetour;
|
||||||
class IClient;
|
class IClient;
|
||||||
typedef void (*t_SV_BroadcastVoiceData)(IClient *, int, unsigned char *, int64);
|
typedef void (*t_SV_BroadcastVoiceData)(IClient *, int, unsigned char *, int64);
|
||||||
|
|
||||||
@ -135,6 +137,13 @@ public: // IConCommandBaseAccessor
|
|||||||
public:
|
public:
|
||||||
CVoice();
|
CVoice();
|
||||||
void OnGameFrame(bool simulating);
|
void OnGameFrame(bool simulating);
|
||||||
|
bool OnBroadcastVoiceData(IClient *pClient, int nBytes, char *data);
|
||||||
|
|
||||||
|
void ListenSocket();
|
||||||
|
void PushPlayerVoiceData(int playerSlot, int nBytes, char *data);
|
||||||
|
void BroadcastVoiceDataTorchlightCelt(IClient *pClient, int16_t *pPCM, int nSamples);
|
||||||
|
void TranscodeNoSteamToSteam(int playerSlot, int nBytes, char *data);
|
||||||
|
void HandlePlayerVoiceData(int playerSlot);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int m_ListenSocket;
|
int m_ListenSocket;
|
||||||
@ -146,6 +155,8 @@ private:
|
|||||||
size_t m_LastLength;
|
size_t m_LastLength;
|
||||||
double m_LastValidData;
|
double m_LastValidData;
|
||||||
bool m_New;
|
bool m_New;
|
||||||
|
bool m_UnEven;
|
||||||
|
unsigned char m_Remainder;
|
||||||
} m_aClients[MAX_CLIENTS];
|
} m_aClients[MAX_CLIENTS];
|
||||||
|
|
||||||
struct pollfd m_aPollFds[1 + MAX_CLIENTS];
|
struct pollfd m_aPollFds[1 + MAX_CLIENTS];
|
||||||
@ -153,30 +164,62 @@ private:
|
|||||||
|
|
||||||
CRingBuffer m_Buffer;
|
CRingBuffer m_Buffer;
|
||||||
|
|
||||||
|
OpusEncoder *m_OpusEncoder;
|
||||||
|
|
||||||
|
// Torchlight transcode state (48000 Hz stereo -> 22050 Hz mono -> CELT)
|
||||||
|
OpusDecoder *m_TorchlightOpusDecoder;
|
||||||
|
int16_t m_torchMonoAccum[4096];
|
||||||
|
int m_torchMonoAccumLen;
|
||||||
|
int m_torchResampleAccum;
|
||||||
|
|
||||||
|
// Player transcode state (24000 Hz mono -> 22050 Hz mono -> CELT)
|
||||||
|
OpusDecoder *m_PlayerOpusDecoder[SM_MAXPLAYERS + 1];
|
||||||
|
|
||||||
double m_AvailableTime;
|
double m_AvailableTime;
|
||||||
|
double m_playerAvailableTime[SM_MAXPLAYERS + 1];
|
||||||
|
|
||||||
struct CEncoderSettings
|
// NoSteam->Steam transcode state per player
|
||||||
{
|
CRingBuffer m_nosteamOpusPCMBuffer[SM_MAXPLAYERS + 1];
|
||||||
SKP_int InputSampleRate_kHz;
|
int m_nosteamResampleAccum[SM_MAXPLAYERS + 1];
|
||||||
SKP_int OutputSampleRate_kHz;
|
OpusEncoder *m_nosteamOpusEncoder[SM_MAXPLAYERS + 1];
|
||||||
SKP_int TargetBitRate_Kbps;
|
int16_t m_nosteamLastSample[SM_MAXPLAYERS + 1];
|
||||||
SKP_int PacketSize_ms;
|
|
||||||
SKP_int FrameSize_ms;
|
|
||||||
SKP_int PacketLoss_perc;
|
|
||||||
SKP_int Complexity;
|
|
||||||
SKP_int InBandFEC;
|
|
||||||
SKP_int DTX;
|
|
||||||
} m_EncoderSettings;
|
|
||||||
|
|
||||||
void *m_Silk_EncoderState;
|
// CELT encoder (shared by both paths, same output format)
|
||||||
SKP_SILK_SDK_EncControlStruct m_Silk_EncoderControl;
|
struct CEncoderSettings
|
||||||
|
{
|
||||||
|
int32_t SampleRate_Hz;
|
||||||
|
int32_t TargetBitRate_Kbps;
|
||||||
|
int32_t FrameSize;
|
||||||
|
int32_t PacketSize;
|
||||||
|
int32_t Complexity;
|
||||||
|
double FrameTime;
|
||||||
|
} m_CeltEncoderSettings;
|
||||||
|
|
||||||
|
CELTMode *m_pCeltMode;
|
||||||
|
CELTEncoder *m_pCeltCodec;
|
||||||
|
|
||||||
|
CELTMode *m_pCeltModePlayer;
|
||||||
|
CELTEncoder *m_pCeltCodecPlayer[SM_MAXPLAYERS + 1];
|
||||||
|
|
||||||
|
CELTDecoder *m_pCeltDecoder[SM_MAXPLAYERS + 1];
|
||||||
|
|
||||||
|
CRingBuffer m_playerVoiceBuffer[SM_MAXPLAYERS + 1];
|
||||||
|
|
||||||
t_SV_BroadcastVoiceData m_SV_BroadcastVoiceData;
|
t_SV_BroadcastVoiceData m_SV_BroadcastVoiceData;
|
||||||
|
CDetour *m_VoiceDetour;
|
||||||
|
CDetour *m_ProcessVoiceDataDetour;
|
||||||
|
|
||||||
|
uint16_t m_nosteamSeqNum[SM_MAXPLAYERS + 1];
|
||||||
|
|
||||||
|
double m_nosteamAvailableTime[SM_MAXPLAYERS + 1];
|
||||||
|
|
||||||
|
int m_TorchlightSeqNum;
|
||||||
|
|
||||||
void HandleNetwork();
|
void HandleNetwork();
|
||||||
void OnDataReceived(CClient *pClient, int16_t *pData, size_t Samples);
|
void OnDataReceived(CClient *pClient, int16_t *pData, size_t Samples);
|
||||||
void HandleVoiceData();
|
void HandleVoiceDataTorchlight();
|
||||||
void SV_BroadcastVoiceData(IClient *pClient, int nBytes, unsigned char *pData);
|
void HandleNoSteamVoiceData();
|
||||||
|
void BroadcastVoiceData(IClient *pClient, int nBytes, unsigned char *pData);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // _INCLUDE_SOURCEMOD_EXTENSION_PROPER_H_
|
#endif // _INCLUDE_SOURCEMOD_EXTENSION_PROPER_H_
|
||||||
|
|||||||
195
inetmessage.h
Normal file
195
inetmessage.h
Normal file
@ -0,0 +1,195 @@
|
|||||||
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||||||
|
//
|
||||||
|
// Purpose: INetMessage interface
|
||||||
|
//
|
||||||
|
// $NoKeywords: $
|
||||||
|
//=============================================================================//
|
||||||
|
|
||||||
|
#ifndef INETMESSAGE_FRAEVEN_H
|
||||||
|
#define INETMESSAGE_FRAEVEN_H
|
||||||
|
|
||||||
|
#include "smsdk_ext.h"
|
||||||
|
#include "bitbuf.h"
|
||||||
|
#include "inetchannelinfo.h"
|
||||||
|
|
||||||
|
class INetMsgHandler;
|
||||||
|
class INetMessage;
|
||||||
|
class INetChannel;
|
||||||
|
|
||||||
|
// typedef bool (INetMsgHandler::*PROCESSFUNCPTR)(INetMessage*);
|
||||||
|
// #define CASTPROCPTR( fn ) static_cast <bool (INetMsgHandler::*)(INetMessage*)> (fn)
|
||||||
|
|
||||||
|
class INetMessage
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual ~INetMessage() {};
|
||||||
|
|
||||||
|
// Use these to setup who can hear whose voice.
|
||||||
|
// Pass in client indices (which are their ent indices - 1).
|
||||||
|
|
||||||
|
virtual void SetNetChannel(INetChannel * netchan) = 0; // netchannel this message is from/for
|
||||||
|
virtual void SetReliable( bool state ) = 0; // set to true if it's a reliable message
|
||||||
|
|
||||||
|
virtual bool Process( void ) = 0; // calles the recently set handler to process this message
|
||||||
|
|
||||||
|
virtual bool ReadFromBuffer( bf_read &buffer ) = 0; // returns true if parsing was OK
|
||||||
|
virtual bool WriteToBuffer( bf_write &buffer ) = 0; // returns true if writing was OK
|
||||||
|
|
||||||
|
virtual bool IsReliable( void ) const = 0; // true, if message needs reliable handling
|
||||||
|
|
||||||
|
virtual int GetType( void ) const = 0; // returns module specific header tag eg svc_serverinfo
|
||||||
|
virtual int GetGroup( void ) const = 0; // returns net message group of this message
|
||||||
|
virtual const char *GetName( void ) const = 0; // returns network message name, eg "svc_serverinfo"
|
||||||
|
virtual INetChannel *GetNetChannel( void ) const = 0;
|
||||||
|
virtual const char *ToString( void ) const = 0; // returns a human readable string about message content
|
||||||
|
};
|
||||||
|
|
||||||
|
class CNetMessage : public INetMessage
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CNetMessage() { m_bReliable = true;
|
||||||
|
m_NetChannel = NULL; }
|
||||||
|
|
||||||
|
virtual ~CNetMessage() {};
|
||||||
|
|
||||||
|
virtual int GetGroup() const { return INetChannelInfo::GENERIC; }
|
||||||
|
INetChannel *GetNetChannel() const { return m_NetChannel; }
|
||||||
|
|
||||||
|
virtual void SetReliable( bool state) {m_bReliable = state;};
|
||||||
|
virtual bool IsReliable() const { return m_bReliable; };
|
||||||
|
virtual void SetNetChannel(INetChannel * netchan) { m_NetChannel = netchan; }
|
||||||
|
virtual bool Process() { return false; }; // no handler set
|
||||||
|
|
||||||
|
protected:
|
||||||
|
bool m_bReliable; // true if message should be send reliable
|
||||||
|
INetChannel *m_NetChannel; // netchannel this message is from/for
|
||||||
|
};
|
||||||
|
|
||||||
|
#define svc_VoiceData 15
|
||||||
|
|
||||||
|
#define DECLARE_BASE_MESSAGE( msgtype ) \
|
||||||
|
public: \
|
||||||
|
bool ReadFromBuffer( bf_read &buffer ); \
|
||||||
|
bool WriteToBuffer( bf_write &buffer ); \
|
||||||
|
const char *ToString() const; \
|
||||||
|
int GetType() const { return msgtype; } \
|
||||||
|
const char *GetName() const { return #msgtype;}\
|
||||||
|
|
||||||
|
#define DECLARE_SVC_MESSAGE( name ) \
|
||||||
|
DECLARE_BASE_MESSAGE( svc_##name ); \
|
||||||
|
IServerMessageHandler *m_pMessageHandler;\
|
||||||
|
bool Process() { return m_pMessageHandler->Process##name( this ); }\
|
||||||
|
|
||||||
|
class SVC_VoiceData : public CNetMessage
|
||||||
|
{
|
||||||
|
DECLARE_SVC_MESSAGE( VoiceData );
|
||||||
|
|
||||||
|
int GetGroup() const { return INetChannelInfo::VOICE; }
|
||||||
|
|
||||||
|
SVC_VoiceData() { m_bReliable = false; }
|
||||||
|
|
||||||
|
public:
|
||||||
|
int m_nFromClient; // client who has spoken
|
||||||
|
bool m_bProximity;
|
||||||
|
int m_nLength; // data length in bits
|
||||||
|
uint64 m_xuid; // X360 player ID
|
||||||
|
|
||||||
|
bf_read m_DataIn;
|
||||||
|
void *m_DataOut;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define NETMSG_TYPE_BITS 6
|
||||||
|
|
||||||
|
bool SVC_VoiceData::WriteToBuffer( bf_write &buffer )
|
||||||
|
{
|
||||||
|
buffer.WriteUBitLong( GetType(), NETMSG_TYPE_BITS );
|
||||||
|
buffer.WriteByte( m_nFromClient );
|
||||||
|
buffer.WriteByte( m_bProximity );
|
||||||
|
buffer.WriteWord( m_nLength );
|
||||||
|
|
||||||
|
return buffer.WriteBits( m_DataOut, m_nLength );
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SVC_VoiceData::ReadFromBuffer( bf_read &buffer )
|
||||||
|
{
|
||||||
|
// VPROF( "SVC_VoiceData::ReadFromBuffer" );
|
||||||
|
|
||||||
|
m_nFromClient = buffer.ReadByte();
|
||||||
|
m_bProximity = !!buffer.ReadByte();
|
||||||
|
m_nLength = buffer.ReadWord();
|
||||||
|
|
||||||
|
// if ( IsX360() )
|
||||||
|
// {
|
||||||
|
// m_xuid = buffer.ReadLongLong();
|
||||||
|
// }
|
||||||
|
|
||||||
|
m_DataIn = buffer;
|
||||||
|
return buffer.SeekRelative( m_nLength );
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *SVC_VoiceData::ToString(void) const
|
||||||
|
{
|
||||||
|
// Q_snprintf(s_text, sizeof(s_text), "%s: client %i, bytes %i", GetName(), m_nFromClient, Bits2Bytes(m_nLength) );
|
||||||
|
// return s_text;
|
||||||
|
return "idc";
|
||||||
|
}
|
||||||
|
|
||||||
|
#define svc_VoiceInit 14
|
||||||
|
|
||||||
|
class SVC_VoiceInit : public CNetMessage
|
||||||
|
{
|
||||||
|
DECLARE_SVC_MESSAGE( VoiceInit );
|
||||||
|
|
||||||
|
int GetGroup() const { return INetChannelInfo::SIGNON; }
|
||||||
|
|
||||||
|
SVC_VoiceInit() : m_nSampleRate(0)
|
||||||
|
{
|
||||||
|
m_bReliable = true;
|
||||||
|
memset(m_szVoiceCodec, 0, sizeof(m_szVoiceCodec));
|
||||||
|
}
|
||||||
|
|
||||||
|
SVC_VoiceInit(const char *pCodec, int nSampleRate) : m_nSampleRate(nSampleRate)
|
||||||
|
{
|
||||||
|
m_bReliable = true;
|
||||||
|
Q_strncpy(m_szVoiceCodec, pCodec ? pCodec : "", sizeof(m_szVoiceCodec));
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
char m_szVoiceCodec[MAX_PATH];
|
||||||
|
int m_nSampleRate;
|
||||||
|
};
|
||||||
|
|
||||||
|
bool SVC_VoiceInit::WriteToBuffer(bf_write &buffer)
|
||||||
|
{
|
||||||
|
buffer.WriteUBitLong(GetType(), NETMSG_TYPE_BITS);
|
||||||
|
buffer.WriteString(m_szVoiceCodec);
|
||||||
|
buffer.WriteShort(m_nSampleRate);
|
||||||
|
return !buffer.IsOverflowed();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SVC_VoiceInit::ReadFromBuffer(bf_read &buffer)
|
||||||
|
{
|
||||||
|
buffer.ReadString(m_szVoiceCodec, sizeof(m_szVoiceCodec));
|
||||||
|
m_nSampleRate = buffer.ReadShort();
|
||||||
|
return !buffer.IsOverflowed();
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *SVC_VoiceInit::ToString() const
|
||||||
|
{
|
||||||
|
return "SVC_VoiceInit";
|
||||||
|
}
|
||||||
|
|
||||||
|
#define clc_VoiceData 10
|
||||||
|
|
||||||
|
//objdump -d /home/gameservers/css_dev/bin/engine_srv.so | grep -A 15 "_ZN11CGameClient16ProcessVoiceDataEP13CLC_VoiceData"
|
||||||
|
class CLC_VoiceData
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
uint8_t _pad[20]; // vtable + CNetMessage base fields + padding up to m_nLength (20 offset)
|
||||||
|
int m_nLength;
|
||||||
|
bf_read m_DataIn;
|
||||||
|
bf_write m_DataOut;
|
||||||
|
uint64 m_xuid;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
BIN
opus/libopus.a
Executable file
BIN
opus/libopus.a
Executable file
Binary file not shown.
13
opus/meson.build
Normal file
13
opus/meson.build
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
opus_headers = [
|
||||||
|
'opus.h',
|
||||||
|
'opus_multistream.h',
|
||||||
|
'opus_projection.h',
|
||||||
|
'opus_types.h',
|
||||||
|
'opus_defines.h',
|
||||||
|
]
|
||||||
|
|
||||||
|
if opt_custom_modes
|
||||||
|
opus_headers += ['opus_custom.h']
|
||||||
|
endif
|
||||||
|
|
||||||
|
install_headers(opus_headers, subdir: 'opus')
|
||||||
1099
opus/opus.h
Normal file
1099
opus/opus.h
Normal file
File diff suppressed because it is too large
Load Diff
343
opus/opus_custom.h
Normal file
343
opus/opus_custom.h
Normal file
@ -0,0 +1,343 @@
|
|||||||
|
/* 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 OPUS_BUILD
|
||||||
|
# define OPUS_CUSTOM_EXPORT_STATIC static OPUS_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. The mode MUST NOT BE DESTROYED until the encoders and
|
||||||
|
decoders that use it are destroyed as well.
|
||||||
|
@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);
|
||||||
|
|
||||||
|
|
||||||
|
#if !defined(OPUS_BUILD) || defined(CELT_ENCODER_C)
|
||||||
|
|
||||||
|
/* 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);
|
||||||
|
|
||||||
|
# ifdef CUSTOM_MODES
|
||||||
|
/** 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 int opus_custom_encoder_init(
|
||||||
|
OpusCustomEncoder *st,
|
||||||
|
const OpusCustomMode *mode,
|
||||||
|
int channels
|
||||||
|
) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2);
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/** 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);
|
||||||
|
|
||||||
|
|
||||||
|
/** Destroys 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);
|
||||||
|
|
||||||
|
|
||||||
|
#if !defined(OPUS_BUILD) || defined(CELT_DECODER_C)
|
||||||
|
/* 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);
|
||||||
|
|
||||||
|
/** 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);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/** 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);
|
||||||
|
|
||||||
|
/** Destroys a 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 */
|
||||||
830
opus/opus_defines.h
Normal file
830
opus/opus_defines.h
Normal file
@ -0,0 +1,830 @@
|
|||||||
|
/* 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
|
||||||
|
/** Not enough bytes allocated in the buffer @hideinitializer*/
|
||||||
|
#define OPUS_BUFFER_TOO_SMALL -2
|
||||||
|
/** An internal error was detected @hideinitializer*/
|
||||||
|
#define OPUS_INTERNAL_ERROR -3
|
||||||
|
/** 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)
|
||||||
|
# if defined(OPUS_BUILD) && defined(DLL_EXPORT)
|
||||||
|
# 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
|
||||||
|
|
||||||
|
#if (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L) )
|
||||||
|
# if OPUS_GNUC_PREREQ(2,7)
|
||||||
|
# define OPUS_INLINE __inline__
|
||||||
|
# elif (defined(_MSC_VER))
|
||||||
|
# define OPUS_INLINE __inline
|
||||||
|
# else
|
||||||
|
# define OPUS_INLINE
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# define OPUS_INLINE inline
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**Warning attributes for opus functions
|
||||||
|
* NONNULL is not used in OPUS_BUILD to avoid the compiler optimizing out
|
||||||
|
* some paranoid null checks. */
|
||||||
|
#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
|
||||||
|
#define OPUS_SET_EXPERT_FRAME_DURATION_REQUEST 4040
|
||||||
|
#define OPUS_GET_EXPERT_FRAME_DURATION_REQUEST 4041
|
||||||
|
#define OPUS_SET_PREDICTION_DISABLED_REQUEST 4042
|
||||||
|
#define OPUS_GET_PREDICTION_DISABLED_REQUEST 4043
|
||||||
|
/* Don't use 4045, it's already taken by OPUS_GET_GAIN_REQUEST */
|
||||||
|
#define OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST 4046
|
||||||
|
#define OPUS_GET_PHASE_INVERSION_DISABLED_REQUEST 4047
|
||||||
|
#define OPUS_GET_IN_DTX_REQUEST 4049
|
||||||
|
#define OPUS_SET_DRED_DURATION_REQUEST 4050
|
||||||
|
#define OPUS_GET_DRED_DURATION_REQUEST 4051
|
||||||
|
#define OPUS_SET_DNN_BLOB_REQUEST 4052
|
||||||
|
/*#define OPUS_GET_DNN_BLOB_REQUEST 4053 */
|
||||||
|
|
||||||
|
/** Defines for the presence of extended APIs. */
|
||||||
|
#define OPUS_HAVE_OPUS_PROJECTION_H
|
||||||
|
|
||||||
|
/* Macros to trigger compilation errors when the wrong types are provided to a CTL */
|
||||||
|
#define __opus_check_int(x) (((void)((x) == (opus_int32)0)), (opus_int32)(x))
|
||||||
|
|
||||||
|
#ifdef DISABLE_PTR_CHECK
|
||||||
|
/* Disable checks to prevent ubsan from complaining about NULL checks
|
||||||
|
in test_opus_api. */
|
||||||
|
#define __opus_check_int_ptr(ptr) (ptr)
|
||||||
|
#define __opus_check_uint_ptr(ptr) (ptr)
|
||||||
|
#define __opus_check_uint8_ptr(ptr) (ptr)
|
||||||
|
#define __opus_check_val16_ptr(ptr) (ptr)
|
||||||
|
#define __opus_check_void_ptr(ptr) (ptr)
|
||||||
|
#else
|
||||||
|
#define __opus_check_int_ptr(ptr) ((ptr) + ((ptr) - (opus_int32*)(ptr)))
|
||||||
|
#define __opus_check_uint_ptr(ptr) ((ptr) + ((ptr) - (opus_uint32*)(ptr)))
|
||||||
|
#define __opus_check_uint8_ptr(ptr) ((ptr) + ((ptr) - (opus_uint8*)(ptr)))
|
||||||
|
#define __opus_check_val16_ptr(ptr) ((ptr) + ((ptr) - (opus_val16*)(ptr)))
|
||||||
|
#define __opus_check_void_ptr(x) ((void)((void *)0 == (x)), (x))
|
||||||
|
#endif
|
||||||
|
/** @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*/
|
||||||
|
|
||||||
|
#define OPUS_FRAMESIZE_ARG 5000 /**< Select frame size from the argument (default) */
|
||||||
|
#define OPUS_FRAMESIZE_2_5_MS 5001 /**< Use 2.5 ms frames */
|
||||||
|
#define OPUS_FRAMESIZE_5_MS 5002 /**< Use 5 ms frames */
|
||||||
|
#define OPUS_FRAMESIZE_10_MS 5003 /**< Use 10 ms frames */
|
||||||
|
#define OPUS_FRAMESIZE_20_MS 5004 /**< Use 20 ms frames */
|
||||||
|
#define OPUS_FRAMESIZE_40_MS 5005 /**< Use 40 ms frames */
|
||||||
|
#define OPUS_FRAMESIZE_60_MS 5006 /**< Use 60 ms frames */
|
||||||
|
#define OPUS_FRAMESIZE_80_MS 5007 /**< Use 80 ms frames */
|
||||||
|
#define OPUS_FRAMESIZE_100_MS 5008 /**< Use 100 ms frames */
|
||||||
|
#define OPUS_FRAMESIZE_120_MS 5009 /**< Use 120 ms frames */
|
||||||
|
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @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.
|
||||||
|
* @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 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>Inband FEC enabled. If the packet loss rate is sufficiently high, Opus will automatically switch to SILK even at high rates to enable use of that FEC.</dd>
|
||||||
|
* <dt>2</dt><dd>Inband FEC enabled, but does not necessarily switch to SILK if we have music.</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. If the packet loss rate is sufficiently high, Opus will automatically switch to SILK even at high rates to enable use of that FEC.</dd>
|
||||||
|
* <dt>2</dt><dd>Inband FEC enabled, but does not necessarily switch to SILK if we have music.</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 trigger progressively more loss resistant behavior in the encoder
|
||||||
|
* at the expense of quality at a given bitrate in the absence of packet loss, 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.
|
||||||
|
* It represents the number of significant bits of linear intensity below
|
||||||
|
* which the signal contains ignorable quantization or other noise.
|
||||||
|
*
|
||||||
|
* For example, OPUS_SET_LSB_DEPTH(14) would be an appropriate setting
|
||||||
|
* for G.711 u-law input. OPUS_SET_LSB_DEPTH(16) would be appropriate
|
||||||
|
* for 16-bit linear pcm input with opus_encode_float().
|
||||||
|
*
|
||||||
|
* When using opus_encode() instead of opus_encode_float(), or when libopus
|
||||||
|
* is compiled for fixed-point, the encoder uses the minimum of the value
|
||||||
|
* set here and the value 16.
|
||||||
|
*
|
||||||
|
* @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)
|
||||||
|
|
||||||
|
/** Configures the encoder's use of variable duration frames.
|
||||||
|
* When variable duration is enabled, the encoder is free to use a shorter frame
|
||||||
|
* size than the one requested in the opus_encode*() call.
|
||||||
|
* It is then the user's responsibility
|
||||||
|
* to verify how much audio was encoded by checking the ToC byte of the encoded
|
||||||
|
* packet. The part of the audio that was not encoded needs to be resent to the
|
||||||
|
* encoder for the next call. Do not use this option unless you <b>really</b>
|
||||||
|
* know what you are doing.
|
||||||
|
* @see OPUS_GET_EXPERT_FRAME_DURATION
|
||||||
|
* @param[in] x <tt>opus_int32</tt>: Allowed values:
|
||||||
|
* <dl>
|
||||||
|
* <dt>OPUS_FRAMESIZE_ARG</dt><dd>Select frame size from the argument (default).</dd>
|
||||||
|
* <dt>OPUS_FRAMESIZE_2_5_MS</dt><dd>Use 2.5 ms frames.</dd>
|
||||||
|
* <dt>OPUS_FRAMESIZE_5_MS</dt><dd>Use 5 ms frames.</dd>
|
||||||
|
* <dt>OPUS_FRAMESIZE_10_MS</dt><dd>Use 10 ms frames.</dd>
|
||||||
|
* <dt>OPUS_FRAMESIZE_20_MS</dt><dd>Use 20 ms frames.</dd>
|
||||||
|
* <dt>OPUS_FRAMESIZE_40_MS</dt><dd>Use 40 ms frames.</dd>
|
||||||
|
* <dt>OPUS_FRAMESIZE_60_MS</dt><dd>Use 60 ms frames.</dd>
|
||||||
|
* <dt>OPUS_FRAMESIZE_80_MS</dt><dd>Use 80 ms frames.</dd>
|
||||||
|
* <dt>OPUS_FRAMESIZE_100_MS</dt><dd>Use 100 ms frames.</dd>
|
||||||
|
* <dt>OPUS_FRAMESIZE_120_MS</dt><dd>Use 120 ms frames.</dd>
|
||||||
|
* </dl>
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_SET_EXPERT_FRAME_DURATION(x) OPUS_SET_EXPERT_FRAME_DURATION_REQUEST, __opus_check_int(x)
|
||||||
|
/** Gets the encoder's configured use of variable duration frames.
|
||||||
|
* @see OPUS_SET_EXPERT_FRAME_DURATION
|
||||||
|
* @param[out] x <tt>opus_int32 *</tt>: Returns one of the following values:
|
||||||
|
* <dl>
|
||||||
|
* <dt>OPUS_FRAMESIZE_ARG</dt><dd>Select frame size from the argument (default).</dd>
|
||||||
|
* <dt>OPUS_FRAMESIZE_2_5_MS</dt><dd>Use 2.5 ms frames.</dd>
|
||||||
|
* <dt>OPUS_FRAMESIZE_5_MS</dt><dd>Use 5 ms frames.</dd>
|
||||||
|
* <dt>OPUS_FRAMESIZE_10_MS</dt><dd>Use 10 ms frames.</dd>
|
||||||
|
* <dt>OPUS_FRAMESIZE_20_MS</dt><dd>Use 20 ms frames.</dd>
|
||||||
|
* <dt>OPUS_FRAMESIZE_40_MS</dt><dd>Use 40 ms frames.</dd>
|
||||||
|
* <dt>OPUS_FRAMESIZE_60_MS</dt><dd>Use 60 ms frames.</dd>
|
||||||
|
* <dt>OPUS_FRAMESIZE_80_MS</dt><dd>Use 80 ms frames.</dd>
|
||||||
|
* <dt>OPUS_FRAMESIZE_100_MS</dt><dd>Use 100 ms frames.</dd>
|
||||||
|
* <dt>OPUS_FRAMESIZE_120_MS</dt><dd>Use 120 ms frames.</dd>
|
||||||
|
* </dl>
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_GET_EXPERT_FRAME_DURATION(x) OPUS_GET_EXPERT_FRAME_DURATION_REQUEST, __opus_check_int_ptr(x)
|
||||||
|
|
||||||
|
/** If set to 1, disables almost all use of prediction, making frames almost
|
||||||
|
* completely independent. This reduces quality.
|
||||||
|
* @see OPUS_GET_PREDICTION_DISABLED
|
||||||
|
* @param[in] x <tt>opus_int32</tt>: Allowed values:
|
||||||
|
* <dl>
|
||||||
|
* <dt>0</dt><dd>Enable prediction (default).</dd>
|
||||||
|
* <dt>1</dt><dd>Disable prediction.</dd>
|
||||||
|
* </dl>
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_SET_PREDICTION_DISABLED(x) OPUS_SET_PREDICTION_DISABLED_REQUEST, __opus_check_int(x)
|
||||||
|
/** Gets the encoder's configured prediction status.
|
||||||
|
* @see OPUS_SET_PREDICTION_DISABLED
|
||||||
|
* @param[out] x <tt>opus_int32 *</tt>: Returns one of the following values:
|
||||||
|
* <dl>
|
||||||
|
* <dt>0</dt><dd>Prediction enabled (default).</dd>
|
||||||
|
* <dt>1</dt><dd>Prediction disabled.</dd>
|
||||||
|
* </dl>
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_GET_PREDICTION_DISABLED(x) OPUS_GET_PREDICTION_DISABLED_REQUEST, __opus_check_int_ptr(x)
|
||||||
|
|
||||||
|
/** If non-zero, enables Deep Redundancy (DRED) and use the specified maximum number of 10-ms redundant frames
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_SET_DRED_DURATION(x) OPUS_SET_DRED_DURATION_REQUEST, __opus_check_int(x)
|
||||||
|
/** Gets the encoder's configured Deep Redundancy (DRED) maximum number of frames.
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_GET_DRED_DURATION(x) OPUS_GET_DRED_DURATION_REQUEST, __opus_check_int_ptr(x)
|
||||||
|
|
||||||
|
/** Provide external DNN weights from binary object (only when explicitly built without the weights)
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_SET_DNN_BLOB(data, len) OPUS_SET_DNN_BLOB_REQUEST, __opus_check_void_ptr(data), __opus_check_int(len)
|
||||||
|
|
||||||
|
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
/** @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 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)
|
||||||
|
|
||||||
|
/** 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)
|
||||||
|
|
||||||
|
/** If set to 1, disables the use of phase inversion for intensity stereo,
|
||||||
|
* improving the quality of mono downmixes, but slightly reducing normal
|
||||||
|
* stereo quality. Disabling phase inversion in the decoder does not comply
|
||||||
|
* with RFC 6716, although it does not cause any interoperability issue and
|
||||||
|
* is expected to become part of the Opus standard once RFC 6716 is updated
|
||||||
|
* by draft-ietf-codec-opus-update.
|
||||||
|
* @see OPUS_GET_PHASE_INVERSION_DISABLED
|
||||||
|
* @param[in] x <tt>opus_int32</tt>: Allowed values:
|
||||||
|
* <dl>
|
||||||
|
* <dt>0</dt><dd>Enable phase inversion (default).</dd>
|
||||||
|
* <dt>1</dt><dd>Disable phase inversion.</dd>
|
||||||
|
* </dl>
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_SET_PHASE_INVERSION_DISABLED(x) OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST, __opus_check_int(x)
|
||||||
|
/** Gets the encoder's configured phase inversion status.
|
||||||
|
* @see OPUS_SET_PHASE_INVERSION_DISABLED
|
||||||
|
* @param[out] x <tt>opus_int32 *</tt>: Returns one of the following values:
|
||||||
|
* <dl>
|
||||||
|
* <dt>0</dt><dd>Stereo phase inversion enabled (default).</dd>
|
||||||
|
* <dt>1</dt><dd>Stereo phase inversion disabled.</dd>
|
||||||
|
* </dl>
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_GET_PHASE_INVERSION_DISABLED(x) OPUS_GET_PHASE_INVERSION_DISABLED_REQUEST, __opus_check_int_ptr(x)
|
||||||
|
/** Gets the DTX state of the encoder.
|
||||||
|
* Returns whether the last encoded frame was either a comfort noise update
|
||||||
|
* during DTX or not encoded because of DTX.
|
||||||
|
* @param[out] x <tt>opus_int32 *</tt>: Returns one of the following values:
|
||||||
|
* <dl>
|
||||||
|
* <dt>0</dt><dd>The encoder is not in DTX.</dd>
|
||||||
|
* <dt>1</dt><dd>The encoder is in DTX.</dd>
|
||||||
|
* </dl>
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_GET_IN_DTX(x) OPUS_GET_IN_DTX_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)
|
||||||
|
|
||||||
|
/** 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)
|
||||||
|
|
||||||
|
/** 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)
|
||||||
|
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
/** @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.
|
||||||
|
*
|
||||||
|
* Applications may look for the substring "-fixed" in the version string to
|
||||||
|
* determine whether they have a fixed-point or floating-point build at
|
||||||
|
* runtime.
|
||||||
|
*
|
||||||
|
* @returns Version string
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT const char *opus_get_version_string(void);
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* OPUS_DEFINES_H */
|
||||||
660
opus/opus_multistream.h
Normal file
660
opus/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
|
||||||
|
* <a href="https://tools.ietf.org/html/rfc7845">RFC 7845</a>
|
||||||
|
* and is based on the self-delimited Opus framing described in Appendix B of
|
||||||
|
* <a href="https://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="https://www.xiph.org/vorbis/doc/Vorbis_I_spec.html#x1-810004.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 outputting 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(4) OPUS_ARG_NONNULL(5) OPUS_ARG_NONNULL(6);
|
||||||
|
|
||||||
|
/** Initialize a previously allocated multistream encoder state.
|
||||||
|
* The memory pointed to by \a st must be at least the size returned by
|
||||||
|
* 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(5) OPUS_ARG_NONNULL(6) OPUS_ARG_NONNULL(7);
|
||||||
|
|
||||||
|
/** 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 */
|
||||||
568
opus/opus_projection.h
Normal file
568
opus/opus_projection.h
Normal file
@ -0,0 +1,568 @@
|
|||||||
|
/* Copyright (c) 2017 Google Inc.
|
||||||
|
Written by Andrew Allen */
|
||||||
|
/*
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions
|
||||||
|
are met:
|
||||||
|
|
||||||
|
- Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
- Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file opus_projection.h
|
||||||
|
* @brief Opus projection reference API
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef OPUS_PROJECTION_H
|
||||||
|
#define OPUS_PROJECTION_H
|
||||||
|
|
||||||
|
#include "opus_multistream.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** @cond OPUS_INTERNAL_DOC */
|
||||||
|
|
||||||
|
/** These are the actual encoder and decoder CTL ID numbers.
|
||||||
|
* They should not be used directly by applications.c
|
||||||
|
* In general, SETs should be even and GETs should be odd.*/
|
||||||
|
/**@{*/
|
||||||
|
#define OPUS_PROJECTION_GET_DEMIXING_MATRIX_GAIN_REQUEST 6001
|
||||||
|
#define OPUS_PROJECTION_GET_DEMIXING_MATRIX_SIZE_REQUEST 6003
|
||||||
|
#define OPUS_PROJECTION_GET_DEMIXING_MATRIX_REQUEST 6005
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @endcond */
|
||||||
|
|
||||||
|
/** @defgroup opus_projection_ctls Projection specific encoder and decoder CTLs
|
||||||
|
*
|
||||||
|
* These are convenience macros that are specific to the
|
||||||
|
* opus_projection_encoder_ctl() and opus_projection_decoder_ctl()
|
||||||
|
* interface.
|
||||||
|
* The CTLs from @ref opus_genericctls, @ref opus_encoderctls,
|
||||||
|
* @ref opus_decoderctls, and @ref opus_multistream_ctls may be applied to a
|
||||||
|
* projection encoder or decoder as well.
|
||||||
|
*/
|
||||||
|
/**@{*/
|
||||||
|
|
||||||
|
/** Gets the gain (in dB. S7.8-format) of the demixing matrix from the encoder.
|
||||||
|
* @param[out] x <tt>opus_int32 *</tt>: Returns the gain (in dB. S7.8-format)
|
||||||
|
* of the demixing matrix.
|
||||||
|
* @hideinitializer
|
||||||
|
*/
|
||||||
|
#define OPUS_PROJECTION_GET_DEMIXING_MATRIX_GAIN(x) OPUS_PROJECTION_GET_DEMIXING_MATRIX_GAIN_REQUEST, __opus_check_int_ptr(x)
|
||||||
|
|
||||||
|
|
||||||
|
/** Gets the size in bytes of the demixing matrix from the encoder.
|
||||||
|
* @param[out] x <tt>opus_int32 *</tt>: Returns the size in bytes of the
|
||||||
|
* demixing matrix.
|
||||||
|
* @hideinitializer
|
||||||
|
*/
|
||||||
|
#define OPUS_PROJECTION_GET_DEMIXING_MATRIX_SIZE(x) OPUS_PROJECTION_GET_DEMIXING_MATRIX_SIZE_REQUEST, __opus_check_int_ptr(x)
|
||||||
|
|
||||||
|
|
||||||
|
/** Copies the demixing matrix to the supplied pointer location.
|
||||||
|
* @param[out] x <tt>unsigned char *</tt>: Returns the demixing matrix to the
|
||||||
|
* supplied pointer location.
|
||||||
|
* @param y <tt>opus_int32</tt>: The size in bytes of the reserved memory at the
|
||||||
|
* pointer location.
|
||||||
|
* @hideinitializer
|
||||||
|
*/
|
||||||
|
#define OPUS_PROJECTION_GET_DEMIXING_MATRIX(x,y) OPUS_PROJECTION_GET_DEMIXING_MATRIX_REQUEST, x, __opus_check_int(y)
|
||||||
|
|
||||||
|
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
/** Opus projection encoder state.
|
||||||
|
* This contains the complete state of a projection Opus encoder.
|
||||||
|
* It is position independent and can be freely copied.
|
||||||
|
* @see opus_projection_ambisonics_encoder_create
|
||||||
|
*/
|
||||||
|
typedef struct OpusProjectionEncoder OpusProjectionEncoder;
|
||||||
|
|
||||||
|
|
||||||
|
/** Opus projection decoder state.
|
||||||
|
* This contains the complete state of a projection Opus decoder.
|
||||||
|
* It is position independent and can be freely copied.
|
||||||
|
* @see opus_projection_decoder_create
|
||||||
|
* @see opus_projection_decoder_init
|
||||||
|
*/
|
||||||
|
typedef struct OpusProjectionDecoder OpusProjectionDecoder;
|
||||||
|
|
||||||
|
|
||||||
|
/**\name Projection encoder functions */
|
||||||
|
/**@{*/
|
||||||
|
|
||||||
|
/** Gets the size of an OpusProjectionEncoder structure.
|
||||||
|
* @param channels <tt>int</tt>: The total number of input channels to encode.
|
||||||
|
* This must be no more than 255.
|
||||||
|
* @param mapping_family <tt>int</tt>: The mapping family to use for selecting
|
||||||
|
* the appropriate projection.
|
||||||
|
* @returns The size in bytes on success, or a negative error code
|
||||||
|
* (see @ref opus_errorcodes) on error.
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_projection_ambisonics_encoder_get_size(
|
||||||
|
int channels,
|
||||||
|
int mapping_family
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
/** Allocates and initializes a projection encoder state.
|
||||||
|
* Call opus_projection_encoder_destroy() to release
|
||||||
|
* this object when finished.
|
||||||
|
* @param Fs <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 mapping_family <tt>int</tt>: The mapping family to use for selecting
|
||||||
|
* the appropriate projection.
|
||||||
|
* @param[out] streams <tt>int *</tt>: The total number of streams that will
|
||||||
|
* be encoded from the input.
|
||||||
|
* @param[out] coupled_streams <tt>int *</tt>: Number of coupled (2 channel)
|
||||||
|
* streams that will be encoded from the input.
|
||||||
|
* @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 OpusProjectionEncoder *opus_projection_ambisonics_encoder_create(
|
||||||
|
opus_int32 Fs,
|
||||||
|
int channels,
|
||||||
|
int mapping_family,
|
||||||
|
int *streams,
|
||||||
|
int *coupled_streams,
|
||||||
|
int application,
|
||||||
|
int *error
|
||||||
|
) OPUS_ARG_NONNULL(4) OPUS_ARG_NONNULL(5);
|
||||||
|
|
||||||
|
|
||||||
|
/** Initialize a previously allocated projection encoder state.
|
||||||
|
* The memory pointed to by \a st must be at least the size returned by
|
||||||
|
* opus_projection_ambisonics_encoder_get_size().
|
||||||
|
* This is intended for applications which use their own allocator instead of
|
||||||
|
* malloc.
|
||||||
|
* To reset a previously initialized state, use the #OPUS_RESET_STATE CTL.
|
||||||
|
* @see opus_projection_ambisonics_encoder_create
|
||||||
|
* @see opus_projection_ambisonics_encoder_get_size
|
||||||
|
* @param st <tt>OpusProjectionEncoder*</tt>: Projection 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 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_projection_ambisonics_encoder_init(
|
||||||
|
OpusProjectionEncoder *st,
|
||||||
|
opus_int32 Fs,
|
||||||
|
int channels,
|
||||||
|
int mapping_family,
|
||||||
|
int *streams,
|
||||||
|
int *coupled_streams,
|
||||||
|
int application
|
||||||
|
) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(5) OPUS_ARG_NONNULL(6);
|
||||||
|
|
||||||
|
|
||||||
|
/** Encodes a projection Opus frame.
|
||||||
|
* @param st <tt>OpusProjectionEncoder*</tt>: Projection 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_projection_encode(
|
||||||
|
OpusProjectionEncoder *st,
|
||||||
|
const opus_int16 *pcm,
|
||||||
|
int frame_size,
|
||||||
|
unsigned char *data,
|
||||||
|
opus_int32 max_data_bytes
|
||||||
|
) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4);
|
||||||
|
|
||||||
|
|
||||||
|
/** Encodes a projection Opus frame from floating point input.
|
||||||
|
* @param st <tt>OpusProjectionEncoder*</tt>: Projection 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_projection_encode_float(
|
||||||
|
OpusProjectionEncoder *st,
|
||||||
|
const float *pcm,
|
||||||
|
int frame_size,
|
||||||
|
unsigned char *data,
|
||||||
|
opus_int32 max_data_bytes
|
||||||
|
) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4);
|
||||||
|
|
||||||
|
|
||||||
|
/** Frees an <code>OpusProjectionEncoder</code> allocated by
|
||||||
|
* opus_projection_ambisonics_encoder_create().
|
||||||
|
* @param st <tt>OpusProjectionEncoder*</tt>: Projection encoder state to be freed.
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT void opus_projection_encoder_destroy(OpusProjectionEncoder *st);
|
||||||
|
|
||||||
|
|
||||||
|
/** Perform a CTL function on a projection Opus encoder.
|
||||||
|
*
|
||||||
|
* Generally the request and subsequent arguments are generated by a
|
||||||
|
* convenience macro.
|
||||||
|
* @param st <tt>OpusProjectionEncoder*</tt>: Projection encoder state.
|
||||||
|
* @param request This and all remaining parameters should be replaced by one
|
||||||
|
* of the convenience macros in @ref opus_genericctls,
|
||||||
|
* @ref opus_encoderctls, @ref opus_multistream_ctls, or
|
||||||
|
* @ref opus_projection_ctls
|
||||||
|
* @see opus_genericctls
|
||||||
|
* @see opus_encoderctls
|
||||||
|
* @see opus_multistream_ctls
|
||||||
|
* @see opus_projection_ctls
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT int opus_projection_encoder_ctl(OpusProjectionEncoder *st, int request, ...) OPUS_ARG_NONNULL(1);
|
||||||
|
|
||||||
|
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
/**\name Projection decoder functions */
|
||||||
|
/**@{*/
|
||||||
|
|
||||||
|
/** Gets the size of an <code>OpusProjectionDecoder</code> structure.
|
||||||
|
* @param channels <tt>int</tt>: The total number of output channels.
|
||||||
|
* This must be no more than 255.
|
||||||
|
* @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_projection_decoder_get_size(
|
||||||
|
int channels,
|
||||||
|
int streams,
|
||||||
|
int coupled_streams
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
/** Allocates and initializes a projection decoder state.
|
||||||
|
* Call opus_projection_decoder_destroy() to release
|
||||||
|
* this object when finished.
|
||||||
|
* @param Fs <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] demixing_matrix <tt>const unsigned char[demixing_matrix_size]</tt>: Demixing matrix
|
||||||
|
* that mapping from coded channels to output channels,
|
||||||
|
* as described in @ref opus_projection and
|
||||||
|
* @ref opus_projection_ctls.
|
||||||
|
* @param demixing_matrix_size <tt>opus_int32</tt>: The size in bytes of the
|
||||||
|
* demixing matrix, as
|
||||||
|
* described in @ref
|
||||||
|
* opus_projection_ctls.
|
||||||
|
* @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 OpusProjectionDecoder *opus_projection_decoder_create(
|
||||||
|
opus_int32 Fs,
|
||||||
|
int channels,
|
||||||
|
int streams,
|
||||||
|
int coupled_streams,
|
||||||
|
unsigned char *demixing_matrix,
|
||||||
|
opus_int32 demixing_matrix_size,
|
||||||
|
int *error
|
||||||
|
) OPUS_ARG_NONNULL(5);
|
||||||
|
|
||||||
|
|
||||||
|
/** Intialize a previously allocated projection decoder state object.
|
||||||
|
* The memory pointed to by \a st must be at least the size returned by
|
||||||
|
* opus_projection_decoder_get_size().
|
||||||
|
* This is intended for applications which use their own allocator instead of
|
||||||
|
* malloc.
|
||||||
|
* To reset a previously initialized state, use the #OPUS_RESET_STATE CTL.
|
||||||
|
* @see opus_projection_decoder_create
|
||||||
|
* @see opus_projection_deocder_get_size
|
||||||
|
* @param st <tt>OpusProjectionDecoder*</tt>: Projection 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] demixing_matrix <tt>const unsigned char[demixing_matrix_size]</tt>: Demixing matrix
|
||||||
|
* that mapping from coded channels to output channels,
|
||||||
|
* as described in @ref opus_projection and
|
||||||
|
* @ref opus_projection_ctls.
|
||||||
|
* @param demixing_matrix_size <tt>opus_int32</tt>: The size in bytes of the
|
||||||
|
* demixing matrix, as
|
||||||
|
* described in @ref
|
||||||
|
* opus_projection_ctls.
|
||||||
|
* @returns #OPUS_OK on success, or an error code (see @ref opus_errorcodes)
|
||||||
|
* on failure.
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT int opus_projection_decoder_init(
|
||||||
|
OpusProjectionDecoder *st,
|
||||||
|
opus_int32 Fs,
|
||||||
|
int channels,
|
||||||
|
int streams,
|
||||||
|
int coupled_streams,
|
||||||
|
unsigned char *demixing_matrix,
|
||||||
|
opus_int32 demixing_matrix_size
|
||||||
|
) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(6);
|
||||||
|
|
||||||
|
|
||||||
|
/** Decode a projection Opus packet.
|
||||||
|
* @param st <tt>OpusProjectionDecoder*</tt>: Projection 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_projection_decode(
|
||||||
|
OpusProjectionDecoder *st,
|
||||||
|
const unsigned char *data,
|
||||||
|
opus_int32 len,
|
||||||
|
opus_int16 *pcm,
|
||||||
|
int frame_size,
|
||||||
|
int decode_fec
|
||||||
|
) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4);
|
||||||
|
|
||||||
|
|
||||||
|
/** Decode a projection Opus packet with floating point output.
|
||||||
|
* @param st <tt>OpusProjectionDecoder*</tt>: Projection 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_projection_decode_float(
|
||||||
|
OpusProjectionDecoder *st,
|
||||||
|
const unsigned char *data,
|
||||||
|
opus_int32 len,
|
||||||
|
float *pcm,
|
||||||
|
int frame_size,
|
||||||
|
int decode_fec
|
||||||
|
) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4);
|
||||||
|
|
||||||
|
|
||||||
|
/** Perform a CTL function on a projection Opus decoder.
|
||||||
|
*
|
||||||
|
* Generally the request and subsequent arguments are generated by a
|
||||||
|
* convenience macro.
|
||||||
|
* @param st <tt>OpusProjectionDecoder*</tt>: Projection decoder state.
|
||||||
|
* @param request This and all remaining parameters should be replaced by one
|
||||||
|
* of the convenience macros in @ref opus_genericctls,
|
||||||
|
* @ref opus_decoderctls, @ref opus_multistream_ctls, or
|
||||||
|
* @ref opus_projection_ctls.
|
||||||
|
* @see opus_genericctls
|
||||||
|
* @see opus_decoderctls
|
||||||
|
* @see opus_multistream_ctls
|
||||||
|
* @see opus_projection_ctls
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT int opus_projection_decoder_ctl(OpusProjectionDecoder *st, int request, ...) OPUS_ARG_NONNULL(1);
|
||||||
|
|
||||||
|
|
||||||
|
/** Frees an <code>OpusProjectionDecoder</code> allocated by
|
||||||
|
* opus_projection_decoder_create().
|
||||||
|
* @param st <tt>OpusProjectionDecoder</tt>: Projection decoder state to be freed.
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT void opus_projection_decoder_destroy(OpusProjectionDecoder *st);
|
||||||
|
|
||||||
|
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* OPUS_PROJECTION_H */
|
||||||
166
opus/opus_types.h
Normal file
166
opus/opus_types.h
Normal file
@ -0,0 +1,166 @@
|
|||||||
|
/* (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
|
||||||
|
|
||||||
|
#define opus_int int /* used for counters etc; at least 16 bits */
|
||||||
|
#define opus_int64 long long
|
||||||
|
#define opus_int8 signed char
|
||||||
|
|
||||||
|
#define opus_uint unsigned int /* used for counters etc; at least 16 bits */
|
||||||
|
#define opus_uint64 unsigned long long
|
||||||
|
#define opus_uint8 unsigned char
|
||||||
|
|
||||||
|
/* Use the real stdint.h if it's there (taken from Paul Hsieh's pstdint.h) */
|
||||||
|
#if (defined(__STDC__) && __STDC__ && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || (defined(__GNUC__) && (defined(_STDINT_H) || defined(_STDINT_H_)) || defined (HAVE_STDINT_H))
|
||||||
|
#include <stdint.h>
|
||||||
|
# undef opus_int64
|
||||||
|
# undef opus_int8
|
||||||
|
# undef opus_uint64
|
||||||
|
# undef opus_uint8
|
||||||
|
typedef int8_t opus_int8;
|
||||||
|
typedef uint8_t opus_uint8;
|
||||||
|
typedef int16_t opus_int16;
|
||||||
|
typedef uint16_t opus_uint16;
|
||||||
|
typedef int32_t opus_int32;
|
||||||
|
typedef uint32_t opus_uint32;
|
||||||
|
typedef int64_t opus_int64;
|
||||||
|
typedef uint64_t opus_uint64;
|
||||||
|
#elif defined(_WIN32)
|
||||||
|
|
||||||
|
# if defined(__CYGWIN__)
|
||||||
|
# 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
|
||||||
|
|
||||||
|
#endif /* OPUS_TYPES_H */
|
||||||
@ -65,7 +65,7 @@ void CRingBuffer::Mix(int16_t *pData, size_t Samples)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CRingBuffer::Push(int16_t *pData, size_t Samples)
|
bool CRingBuffer::PushTorch(int16_t *pData, size_t Samples)
|
||||||
{
|
{
|
||||||
if(Samples > CurrentFree())
|
if(Samples > CurrentFree())
|
||||||
return false;
|
return false;
|
||||||
@ -127,6 +127,34 @@ bool CRingBuffer::Push(int16_t *pData, size_t Samples)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CRingBuffer::Push(int16_t *pData, size_t Samples)
|
||||||
|
{
|
||||||
|
if(Samples > CurrentFree())
|
||||||
|
return false; // Safely drop if buffer overflows, preventing distortion
|
||||||
|
|
||||||
|
if(m_WriteIndex + Samples > m_BufferSize)
|
||||||
|
{
|
||||||
|
size_t TowardsEnd = m_BufferSize - m_WriteIndex;
|
||||||
|
memcpy(&m_aBuffer[m_WriteIndex], pData, TowardsEnd * sizeof(*m_aBuffer));
|
||||||
|
m_WriteIndex = 0;
|
||||||
|
|
||||||
|
size_t Left = Samples - TowardsEnd;
|
||||||
|
memcpy(m_aBuffer, &pData[TowardsEnd], Left * sizeof(*m_aBuffer));
|
||||||
|
m_WriteIndex = Left;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
memcpy(&m_aBuffer[m_WriteIndex], pData, Samples * sizeof(*m_aBuffer));
|
||||||
|
m_WriteIndex += Samples;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(m_WriteIndex == m_BufferSize)
|
||||||
|
m_WriteIndex = 0;
|
||||||
|
|
||||||
|
m_Length += Samples;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
size_t CRingBuffer::TotalLength()
|
size_t CRingBuffer::TotalLength()
|
||||||
{
|
{
|
||||||
return m_Length;
|
return m_Length;
|
||||||
|
|||||||
@ -12,6 +12,7 @@ public:
|
|||||||
|
|
||||||
bool Pop(int16_t *pData, size_t Samples);
|
bool Pop(int16_t *pData, size_t Samples);
|
||||||
bool Push(int16_t *pData, size_t BufLen);
|
bool Push(int16_t *pData, size_t BufLen);
|
||||||
|
bool PushTorch(int16_t *pData, size_t BufLen);
|
||||||
|
|
||||||
size_t TotalLength();
|
size_t TotalLength();
|
||||||
size_t TotalFree();
|
size_t TotalFree();
|
||||||
|
|||||||
Binary file not shown.
@ -1,152 +0,0 @@
|
|||||||
/***********************************************************************
|
|
||||||
Copyright (c) 2006-2012, Skype Limited. All rights reserved.
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, (subject to the limitations in the disclaimer below)
|
|
||||||
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 Skype Limited, nor the names of specific
|
|
||||||
contributors, may be used to endorse or promote products derived from
|
|
||||||
this software without specific prior written permission.
|
|
||||||
NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
|
|
||||||
BY THIS LICENSE. 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 SKP_SILK_SDK_API_H
|
|
||||||
#define SKP_SILK_SDK_API_H
|
|
||||||
|
|
||||||
#include "SKP_Silk_control.h"
|
|
||||||
#include "SKP_Silk_typedef.h"
|
|
||||||
#include "SKP_Silk_errors.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C"
|
|
||||||
{
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define SILK_MAX_FRAMES_PER_PACKET 5
|
|
||||||
|
|
||||||
/* Struct for TOC (Table of Contents) */
|
|
||||||
typedef struct {
|
|
||||||
SKP_int framesInPacket; /* Number of 20 ms frames in packet */
|
|
||||||
SKP_int fs_kHz; /* Sampling frequency in packet */
|
|
||||||
SKP_int inbandLBRR; /* Does packet contain LBRR information */
|
|
||||||
SKP_int corrupt; /* Packet is corrupt */
|
|
||||||
SKP_int vadFlags[ SILK_MAX_FRAMES_PER_PACKET ]; /* VAD flag for each frame in packet */
|
|
||||||
SKP_int sigtypeFlags[ SILK_MAX_FRAMES_PER_PACKET ]; /* Signal type for each frame in packet */
|
|
||||||
} SKP_Silk_TOC_struct;
|
|
||||||
|
|
||||||
/****************************************/
|
|
||||||
/* Encoder functions */
|
|
||||||
/****************************************/
|
|
||||||
|
|
||||||
/***********************************************/
|
|
||||||
/* Get size in bytes of the Silk encoder state */
|
|
||||||
/***********************************************/
|
|
||||||
SKP_int SKP_Silk_SDK_Get_Encoder_Size(
|
|
||||||
SKP_int32 *encSizeBytes /* O: Number of bytes in SILK encoder state */
|
|
||||||
);
|
|
||||||
|
|
||||||
/*************************/
|
|
||||||
/* Init or reset encoder */
|
|
||||||
/*************************/
|
|
||||||
SKP_int SKP_Silk_SDK_InitEncoder(
|
|
||||||
void *encState, /* I/O: State */
|
|
||||||
SKP_SILK_SDK_EncControlStruct *encStatus /* O: Encoder Status */
|
|
||||||
);
|
|
||||||
|
|
||||||
/***************************************/
|
|
||||||
/* Read control structure from encoder */
|
|
||||||
/***************************************/
|
|
||||||
SKP_int SKP_Silk_SDK_QueryEncoder(
|
|
||||||
const void *encState, /* I: State */
|
|
||||||
SKP_SILK_SDK_EncControlStruct *encStatus /* O: Encoder Status */
|
|
||||||
);
|
|
||||||
|
|
||||||
/**************************/
|
|
||||||
/* Encode frame with Silk */
|
|
||||||
/**************************/
|
|
||||||
SKP_int SKP_Silk_SDK_Encode(
|
|
||||||
void *encState, /* I/O: State */
|
|
||||||
const SKP_SILK_SDK_EncControlStruct *encControl, /* I: Control status */
|
|
||||||
const SKP_int16 *samplesIn, /* I: Speech sample input vector */
|
|
||||||
SKP_int nSamplesIn, /* I: Number of samples in input vector */
|
|
||||||
SKP_uint8 *outData, /* O: Encoded output vector */
|
|
||||||
SKP_int16 *nBytesOut /* I/O: Number of bytes in outData (input: Max bytes) */
|
|
||||||
);
|
|
||||||
|
|
||||||
/****************************************/
|
|
||||||
/* Decoder functions */
|
|
||||||
/****************************************/
|
|
||||||
|
|
||||||
/***********************************************/
|
|
||||||
/* Get size in bytes of the Silk decoder state */
|
|
||||||
/***********************************************/
|
|
||||||
SKP_int SKP_Silk_SDK_Get_Decoder_Size(
|
|
||||||
SKP_int32 *decSizeBytes /* O: Number of bytes in SILK decoder state */
|
|
||||||
);
|
|
||||||
|
|
||||||
/*************************/
|
|
||||||
/* Init or Reset decoder */
|
|
||||||
/*************************/
|
|
||||||
SKP_int SKP_Silk_SDK_InitDecoder(
|
|
||||||
void *decState /* I/O: State */
|
|
||||||
);
|
|
||||||
|
|
||||||
/******************/
|
|
||||||
/* Decode a frame */
|
|
||||||
/******************/
|
|
||||||
SKP_int SKP_Silk_SDK_Decode(
|
|
||||||
void* decState, /* I/O: State */
|
|
||||||
SKP_SILK_SDK_DecControlStruct* decControl, /* I/O: Control Structure */
|
|
||||||
SKP_int lostFlag, /* I: 0: no loss, 1 loss */
|
|
||||||
const SKP_uint8 *inData, /* I: Encoded input vector */
|
|
||||||
const SKP_int nBytesIn, /* I: Number of input bytes */
|
|
||||||
SKP_int16 *samplesOut, /* O: Decoded output speech vector */
|
|
||||||
SKP_int16 *nSamplesOut /* I/O: Number of samples (vector/decoded) */
|
|
||||||
);
|
|
||||||
|
|
||||||
/***************************************************************/
|
|
||||||
/* Find Low Bit Rate Redundancy (LBRR) information in a packet */
|
|
||||||
/***************************************************************/
|
|
||||||
void SKP_Silk_SDK_search_for_LBRR(
|
|
||||||
const SKP_uint8 *inData, /* I: Encoded input vector */
|
|
||||||
const SKP_int nBytesIn, /* I: Number of input Bytes */
|
|
||||||
SKP_int lost_offset, /* I: Offset from lost packet */
|
|
||||||
SKP_uint8 *LBRRData, /* O: LBRR payload */
|
|
||||||
SKP_int16 *nLBRRBytes /* O: Number of LBRR Bytes */
|
|
||||||
);
|
|
||||||
|
|
||||||
/**************************************/
|
|
||||||
/* Get table of contents for a packet */
|
|
||||||
/**************************************/
|
|
||||||
void SKP_Silk_SDK_get_TOC(
|
|
||||||
const SKP_uint8 *inData, /* I: Encoded input vector */
|
|
||||||
const SKP_int nBytesIn, /* I: Number of input bytes */
|
|
||||||
SKP_Silk_TOC_struct *Silk_TOC /* O: Table of contents */
|
|
||||||
);
|
|
||||||
|
|
||||||
/**************************/
|
|
||||||
/* Get the version number */
|
|
||||||
/**************************/
|
|
||||||
/* Return a pointer to string specifying the version */
|
|
||||||
const char *SKP_Silk_SDK_get_version();
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@ -1,91 +0,0 @@
|
|||||||
/***********************************************************************
|
|
||||||
Copyright (c) 2006-2012, Skype Limited. All rights reserved.
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, (subject to the limitations in the disclaimer below)
|
|
||||||
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 Skype Limited, nor the names of specific
|
|
||||||
contributors, may be used to endorse or promote products derived from
|
|
||||||
this software without specific prior written permission.
|
|
||||||
NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
|
|
||||||
BY THIS LICENSE. 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 SKP_SILK_CONTROL_H
|
|
||||||
#define SKP_SILK_CONTROL_H
|
|
||||||
|
|
||||||
#include "SKP_Silk_typedef.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C"
|
|
||||||
{
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/***********************************************/
|
|
||||||
/* Structure for controlling encoder operation */
|
|
||||||
/***********************************************/
|
|
||||||
typedef struct {
|
|
||||||
/* I: Input signal sampling rate in Hertz; 8000/12000/16000/24000 */
|
|
||||||
SKP_int32 API_sampleRate;
|
|
||||||
|
|
||||||
/* I: Maximum internal sampling rate in Hertz; 8000/12000/16000/24000 */
|
|
||||||
SKP_int32 maxInternalSampleRate;
|
|
||||||
|
|
||||||
/* I: Number of samples per packet; must be equivalent of 20, 40, 60, 80 or 100 ms */
|
|
||||||
SKP_int packetSize;
|
|
||||||
|
|
||||||
/* I: Bitrate during active speech in bits/second; internally limited */
|
|
||||||
SKP_int32 bitRate;
|
|
||||||
|
|
||||||
/* I: Uplink packet loss in percent (0-100) */
|
|
||||||
SKP_int packetLossPercentage;
|
|
||||||
|
|
||||||
/* I: Complexity mode; 0 is lowest; 1 is medium and 2 is highest complexity */
|
|
||||||
SKP_int complexity;
|
|
||||||
|
|
||||||
/* I: Flag to enable in-band Forward Error Correction (FEC); 0/1 */
|
|
||||||
SKP_int useInBandFEC;
|
|
||||||
|
|
||||||
/* I: Flag to enable discontinuous transmission (DTX); 0/1 */
|
|
||||||
SKP_int useDTX;
|
|
||||||
} SKP_SILK_SDK_EncControlStruct;
|
|
||||||
|
|
||||||
/**************************************************************************/
|
|
||||||
/* Structure for controlling decoder operation and reading decoder status */
|
|
||||||
/**************************************************************************/
|
|
||||||
typedef struct {
|
|
||||||
/* I: Output signal sampling rate in Hertz; 8000/12000/16000/24000 */
|
|
||||||
SKP_int32 API_sampleRate;
|
|
||||||
|
|
||||||
/* O: Number of samples per frame */
|
|
||||||
SKP_int frameSize;
|
|
||||||
|
|
||||||
/* O: Frames per packet 1, 2, 3, 4, 5 */
|
|
||||||
SKP_int framesPerPacket;
|
|
||||||
|
|
||||||
/* O: Flag to indicate that the decoder has remaining payloads internally */
|
|
||||||
SKP_int moreInternalDecoderFrames;
|
|
||||||
|
|
||||||
/* O: Distance between main payload and redundant payload in packets */
|
|
||||||
SKP_int inBandFECOffset;
|
|
||||||
} SKP_SILK_SDK_DecControlStruct;
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@ -1,89 +0,0 @@
|
|||||||
/***********************************************************************
|
|
||||||
Copyright (c) 2006-2012, Skype Limited. All rights reserved.
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, (subject to the limitations in the disclaimer below)
|
|
||||||
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 Skype Limited, nor the names of specific
|
|
||||||
contributors, may be used to endorse or promote products derived from
|
|
||||||
this software without specific prior written permission.
|
|
||||||
NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
|
|
||||||
BY THIS LICENSE. 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 SKP_SILK_ERRORS_H
|
|
||||||
#define SKP_SILK_ERRORS_H
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C"
|
|
||||||
{
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/******************/
|
|
||||||
/* Error messages */
|
|
||||||
/******************/
|
|
||||||
#define SKP_SILK_NO_ERROR 0
|
|
||||||
|
|
||||||
/**************************/
|
|
||||||
/* Encoder error messages */
|
|
||||||
/**************************/
|
|
||||||
|
|
||||||
/* Input length is not a multiplum of 10 ms, or length is longer than the packet length */
|
|
||||||
#define SKP_SILK_ENC_INPUT_INVALID_NO_OF_SAMPLES -1
|
|
||||||
|
|
||||||
/* Sampling frequency not 8000, 12000, 16000 or 24000 Hertz */
|
|
||||||
#define SKP_SILK_ENC_FS_NOT_SUPPORTED -2
|
|
||||||
|
|
||||||
/* Packet size not 20, 40, 60, 80 or 100 ms */
|
|
||||||
#define SKP_SILK_ENC_PACKET_SIZE_NOT_SUPPORTED -3
|
|
||||||
|
|
||||||
/* Allocated payload buffer too short */
|
|
||||||
#define SKP_SILK_ENC_PAYLOAD_BUF_TOO_SHORT -4
|
|
||||||
|
|
||||||
/* Loss rate not between 0 and 100 percent */
|
|
||||||
#define SKP_SILK_ENC_INVALID_LOSS_RATE -5
|
|
||||||
|
|
||||||
/* Complexity setting not valid, use 0, 1 or 2 */
|
|
||||||
#define SKP_SILK_ENC_INVALID_COMPLEXITY_SETTING -6
|
|
||||||
|
|
||||||
/* Inband FEC setting not valid, use 0 or 1 */
|
|
||||||
#define SKP_SILK_ENC_INVALID_INBAND_FEC_SETTING -7
|
|
||||||
|
|
||||||
/* DTX setting not valid, use 0 or 1 */
|
|
||||||
#define SKP_SILK_ENC_INVALID_DTX_SETTING -8
|
|
||||||
|
|
||||||
/* Internal encoder error */
|
|
||||||
#define SKP_SILK_ENC_INTERNAL_ERROR -9
|
|
||||||
|
|
||||||
/**************************/
|
|
||||||
/* Decoder error messages */
|
|
||||||
/**************************/
|
|
||||||
|
|
||||||
/* Output sampling frequency lower than internal decoded sampling frequency */
|
|
||||||
#define SKP_SILK_DEC_INVALID_SAMPLING_FREQUENCY -10
|
|
||||||
|
|
||||||
/* Payload size exceeded the maximum allowed 1024 bytes */
|
|
||||||
#define SKP_SILK_DEC_PAYLOAD_TOO_LARGE -11
|
|
||||||
|
|
||||||
/* Payload has bit errors */
|
|
||||||
#define SKP_SILK_DEC_PAYLOAD_ERROR -12
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@ -1,107 +0,0 @@
|
|||||||
/***********************************************************************
|
|
||||||
Copyright (c) 2006-2012, Skype Limited. All rights reserved.
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, (subject to the limitations in the disclaimer below)
|
|
||||||
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 Skype Limited, nor the names of specific
|
|
||||||
contributors, may be used to endorse or promote products derived from
|
|
||||||
this software without specific prior written permission.
|
|
||||||
NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
|
|
||||||
BY THIS LICENSE. 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 _SKP_SILK_API_TYPDEF_H_
|
|
||||||
#define _SKP_SILK_API_TYPDEF_H_
|
|
||||||
|
|
||||||
#ifndef SKP_USE_DOUBLE_PRECISION_FLOATS
|
|
||||||
#define SKP_USE_DOUBLE_PRECISION_FLOATS 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <float.h>
|
|
||||||
#if defined( __GNUC__ )
|
|
||||||
#include <stdint.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define SKP_int int /* used for counters etc; at least 16 bits */
|
|
||||||
#ifdef __GNUC__
|
|
||||||
# define SKP_int64 int64_t
|
|
||||||
#else
|
|
||||||
# define SKP_int64 long long
|
|
||||||
#endif
|
|
||||||
#define SKP_int32 int
|
|
||||||
#define SKP_int16 short
|
|
||||||
#define SKP_int8 signed char
|
|
||||||
|
|
||||||
#define SKP_uint unsigned int /* used for counters etc; at least 16 bits */
|
|
||||||
#ifdef __GNUC__
|
|
||||||
# define SKP_uint64 uint64_t
|
|
||||||
#else
|
|
||||||
# define SKP_uint64 unsigned long long
|
|
||||||
#endif
|
|
||||||
#define SKP_uint32 unsigned int
|
|
||||||
#define SKP_uint16 unsigned short
|
|
||||||
#define SKP_uint8 unsigned char
|
|
||||||
|
|
||||||
#define SKP_int_ptr_size intptr_t
|
|
||||||
|
|
||||||
#if SKP_USE_DOUBLE_PRECISION_FLOATS
|
|
||||||
# define SKP_float double
|
|
||||||
# define SKP_float_MAX DBL_MAX
|
|
||||||
#else
|
|
||||||
# define SKP_float float
|
|
||||||
# define SKP_float_MAX FLT_MAX
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define SKP_INLINE static __inline
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
# define SKP_STR_CASEINSENSITIVE_COMPARE(x, y) _stricmp(x, y)
|
|
||||||
#else
|
|
||||||
# define SKP_STR_CASEINSENSITIVE_COMPARE(x, y) strcasecmp(x, y)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define SKP_int64_MAX ((SKP_int64)0x7FFFFFFFFFFFFFFFLL) /* 2^63 - 1 */
|
|
||||||
#define SKP_int64_MIN ((SKP_int64)0x8000000000000000LL) /* -2^63 */
|
|
||||||
#define SKP_int32_MAX 0x7FFFFFFF /* 2^31 - 1 = 2147483647*/
|
|
||||||
#define SKP_int32_MIN ((SKP_int32)0x80000000) /* -2^31 = -2147483648*/
|
|
||||||
#define SKP_int16_MAX 0x7FFF /* 2^15 - 1 = 32767*/
|
|
||||||
#define SKP_int16_MIN ((SKP_int16)0x8000) /* -2^15 = -32768*/
|
|
||||||
#define SKP_int8_MAX 0x7F /* 2^7 - 1 = 127*/
|
|
||||||
#define SKP_int8_MIN ((SKP_int8)0x80) /* -2^7 = -128*/
|
|
||||||
|
|
||||||
#define SKP_uint32_MAX 0xFFFFFFFF /* 2^32 - 1 = 4294967295 */
|
|
||||||
#define SKP_uint32_MIN 0x00000000
|
|
||||||
#define SKP_uint16_MAX 0xFFFF /* 2^16 - 1 = 65535 */
|
|
||||||
#define SKP_uint16_MIN 0x0000
|
|
||||||
#define SKP_uint8_MAX 0xFF /* 2^8 - 1 = 255 */
|
|
||||||
#define SKP_uint8_MIN 0x00
|
|
||||||
|
|
||||||
#define SKP_TRUE 1
|
|
||||||
#define SKP_FALSE 0
|
|
||||||
|
|
||||||
/* assertions */
|
|
||||||
#if (defined _WIN32 && !defined _WINCE && !defined(__GNUC__) && !defined(NO_ASSERTS))
|
|
||||||
# ifndef SKP_assert
|
|
||||||
# include <crtdbg.h> /* ASSERTE() */
|
|
||||||
# define SKP_assert(COND) _ASSERTE(COND)
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
# define SKP_assert(COND)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
Binary file not shown.
@ -40,7 +40,7 @@
|
|||||||
/* Basic information exposed publicly */
|
/* Basic information exposed publicly */
|
||||||
#define SMEXT_CONF_NAME "Voice"
|
#define SMEXT_CONF_NAME "Voice"
|
||||||
#define SMEXT_CONF_DESCRIPTION "Inject voice data over existing clients"
|
#define SMEXT_CONF_DESCRIPTION "Inject voice data over existing clients"
|
||||||
#define SMEXT_CONF_VERSION "1.0"
|
#define SMEXT_CONF_VERSION "1.1"
|
||||||
#define SMEXT_CONF_AUTHOR "BotoX"
|
#define SMEXT_CONF_AUTHOR "BotoX"
|
||||||
#define SMEXT_CONF_URL ""
|
#define SMEXT_CONF_URL ""
|
||||||
#define SMEXT_CONF_LOGTAG "VOICE"
|
#define SMEXT_CONF_LOGTAG "VOICE"
|
||||||
@ -61,7 +61,7 @@
|
|||||||
/** Enable interfaces you want to use here by uncommenting lines */
|
/** Enable interfaces you want to use here by uncommenting lines */
|
||||||
//#define SMEXT_ENABLE_FORWARDSYS
|
//#define SMEXT_ENABLE_FORWARDSYS
|
||||||
//#define SMEXT_ENABLE_HANDLESYS
|
//#define SMEXT_ENABLE_HANDLESYS
|
||||||
//#define SMEXT_ENABLE_PLAYERHELPERS
|
#define SMEXT_ENABLE_PLAYERHELPERS
|
||||||
//#define SMEXT_ENABLE_DBMANAGER
|
//#define SMEXT_ENABLE_DBMANAGER
|
||||||
#define SMEXT_ENABLE_GAMECONF
|
#define SMEXT_ENABLE_GAMECONF
|
||||||
#define SMEXT_ENABLE_MEMUTILS
|
#define SMEXT_ENABLE_MEMUTILS
|
||||||
|
|||||||
@ -1,68 +0,0 @@
|
|||||||
//--------------------------------------
|
|
||||||
//--- 010 Editor v6.0.3 Binary Template
|
|
||||||
//
|
|
||||||
// File:
|
|
||||||
// Author:
|
|
||||||
// Revision:
|
|
||||||
// Purpose:
|
|
||||||
//--------------------------------------
|
|
||||||
|
|
||||||
// CClientAudio::DecompressVoice
|
|
||||||
local int64 crcLength = FileSize() - sizeof(uint32);
|
|
||||||
|
|
||||||
uint64 steamId;
|
|
||||||
|
|
||||||
FSeek(crcLength);
|
|
||||||
uint32 crc;
|
|
||||||
|
|
||||||
local int64 crc_calc = Checksum(CHECKSUM_CRC32, 0, crcLength);
|
|
||||||
if (crc != crc_calc) {
|
|
||||||
Warning("CRC mismatch!");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// CVoiceDecoder::ProcessVoicePayload
|
|
||||||
FSeek(sizeof(uint64));
|
|
||||||
|
|
||||||
while (FTell() < crcLength) {
|
|
||||||
char payloadType;
|
|
||||||
|
|
||||||
switch (payloadType) {
|
|
||||||
default:
|
|
||||||
Warning("Unhandled payload!");
|
|
||||||
return;
|
|
||||||
case 11: // Sample Rate
|
|
||||||
short sampleRate;
|
|
||||||
break;
|
|
||||||
case 10: // Unknown / Unused
|
|
||||||
char unk1;
|
|
||||||
char unk2;
|
|
||||||
break;
|
|
||||||
case 1: // Unknown Codec???
|
|
||||||
case 2: // Speex Data (Unsupported)
|
|
||||||
case 3: // Uncompressed Data
|
|
||||||
case 4: // SILK Data
|
|
||||||
short dataLength;
|
|
||||||
char data[dataLength];
|
|
||||||
break;
|
|
||||||
case 0: // Silence
|
|
||||||
short numSamples;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// CVoiceDecoder::AddIncomingData
|
|
||||||
FSeek(startof(data));
|
|
||||||
|
|
||||||
// VoiceEncoder_SILK::Decompress
|
|
||||||
|
|
||||||
// chunkLength == -1 means ResetState
|
|
||||||
|
|
||||||
while ((FTell() - startof(data)) < dataLength) {
|
|
||||||
struct Chunk {
|
|
||||||
short chunkLength;
|
|
||||||
if (chunkLength != -1) {
|
|
||||||
char chunk[chunkLength];
|
|
||||||
}
|
|
||||||
} chunk;
|
|
||||||
}
|
|
||||||
Loading…
Reference in New Issue
Block a user