mirror of
https://github.com/clangen/musikcube.git
synced 2025-02-06 03:39:50 +00:00
Major surgery to websocket_remote:
- Renamed websocket_remote plugin to "server" - Added IEncoder, IEncoderFactory interfaces to SDK. Updated IEnvironment and related plumbing; plugins can now declare encoders and other plugins can request instances through the SDK. - Removed LAME encoding from websocket_server plugin, created new stockencoders plugin that includes both LAME and Ogg Vorbis encoders. - Moved to dynamic libraries for ogg, vorbis, libvorbis so it can be shared between encoding and decoding plugins. - Plumbing for new "format" URL param through HttpServer, Transcoder, and TranscodingDataStream. Use new IEncoder functionality to deal with on-the-fly re-encoding
This commit is contained in:
parent
0a6851544e
commit
1a15e084c7
@ -96,8 +96,9 @@ add_subdirectory(src/plugins/oggdecoder)
|
||||
add_subdirectory(src/plugins/nomaddecoder)
|
||||
add_subdirectory(src/plugins/flacdecoder)
|
||||
add_subdirectory(src/plugins/nullout)
|
||||
add_subdirectory(src/plugins/websocket_remote)
|
||||
add_subdirectory(src/plugins/server)
|
||||
add_subdirectory(src/plugins/httpdatastream)
|
||||
add_subdirectory(src/plugins/stockencoders)
|
||||
|
||||
add_dependencies(taglibreader taglib)
|
||||
|
||||
@ -131,8 +132,9 @@ if (CMAKE_SYSTEM_NAME MATCHES "Linux")
|
||||
bin/plugins/libnomaddecoder.so
|
||||
bin/plugins/liboggdecoder.so
|
||||
bin/plugins/libtaglibreader.so
|
||||
bin/plugins/libwebsocket_remote.so
|
||||
bin/plugins/libserver.so
|
||||
bin/plugins/libhttpdatastream.so
|
||||
bin/plugins/libstockencoders.so
|
||||
DESTINATION share/musikcube/plugins
|
||||
)
|
||||
else (CMAKE_SYSTEM_NAME MATCHES "Linux")
|
||||
@ -146,8 +148,9 @@ else (CMAKE_SYSTEM_NAME MATCHES "Linux")
|
||||
bin/plugins/libnomaddecoder.dylib
|
||||
bin/plugins/liboggdecoder.dylib
|
||||
bin/plugins/libtaglibreader.dylib
|
||||
bin/plugins/libwebsocket_remote.dylib
|
||||
bin/plugins/libserver.dylib
|
||||
bin/plugins/libhttpdatastream.dylib
|
||||
bin/plugins/libstockencoders.dylib
|
||||
DESTINATION share/musikcube/plugins
|
||||
)
|
||||
endif (CMAKE_SYSTEM_NAME MATCHES "Linux")
|
||||
|
@ -1,6 +1,6 @@
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio 15
|
||||
VisualStudioVersion = 15.0.26430.14
|
||||
VisualStudioVersion = 15.0.27004.2002
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "musikcube", "src\musikcube\musikcube.vcxproj", "{C7102EB1-7311-4B36-A7FF-89DD7F077FF9}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
@ -67,12 +67,14 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "glue", "src\glue\glue.vcxpr
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nullout", "src\plugins\nullout\nullout.vcxproj", "{BA3902E0-8915-4E59-AD3B-F9960507F234}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "websocket_remote", "src\plugins\websocket_remote\websocket_remote.vcxproj", "{43A78C57-C9A3-4852-B0BE-05335C5C077D}"
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "server", "src\plugins\server\server.vcxproj", "{43A78C57-C9A3-4852-B0BE-05335C5C077D}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "httpdatastream", "src\plugins\httpdatastream\httpdatastream.vcxproj", "{FA74D37C-8184-4596-BFE9-766C159045E1}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "plugins", "plugins", "{CE0E0AF3-A106-4992-BEBD-B842B983D0FE}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "stockencoders", "src\plugins\stockencoders\stockencoders.vcxproj", "{8AD92D25-0921-44AB-BBEF-5244F5CFC6DA}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Win32 = Debug|Win32
|
||||
@ -199,6 +201,14 @@ Global
|
||||
{FA74D37C-8184-4596-BFE9-766C159045E1}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{FA74D37C-8184-4596-BFE9-766C159045E1}.Release|Win32.Build.0 = Release|Win32
|
||||
{FA74D37C-8184-4596-BFE9-766C159045E1}.Release|x64.ActiveCfg = Release|Win32
|
||||
{8AD92D25-0921-44AB-BBEF-5244F5CFC6DA}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{8AD92D25-0921-44AB-BBEF-5244F5CFC6DA}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{8AD92D25-0921-44AB-BBEF-5244F5CFC6DA}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{8AD92D25-0921-44AB-BBEF-5244F5CFC6DA}.Debug|x64.Build.0 = Debug|x64
|
||||
{8AD92D25-0921-44AB-BBEF-5244F5CFC6DA}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{8AD92D25-0921-44AB-BBEF-5244F5CFC6DA}.Release|Win32.Build.0 = Release|Win32
|
||||
{8AD92D25-0921-44AB-BBEF-5244F5CFC6DA}.Release|x64.ActiveCfg = Release|x64
|
||||
{8AD92D25-0921-44AB-BBEF-5244F5CFC6DA}.Release|x64.Build.0 = Release|x64
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
@ -216,7 +226,10 @@ Global
|
||||
{CA56A398-7F9A-493A-A7FC-C6B4D550B674} = {CE0E0AF3-A106-4992-BEBD-B842B983D0FE}
|
||||
{51C18730-DC48-411A-829D-F2B3B7AC4C97} = {CE0E0AF3-A106-4992-BEBD-B842B983D0FE}
|
||||
{BA3902E0-8915-4E59-AD3B-F9960507F234} = {CE0E0AF3-A106-4992-BEBD-B842B983D0FE}
|
||||
{43A78C57-C9A3-4852-B0BE-05335C5C077D} = {CE0E0AF3-A106-4992-BEBD-B842B983D0FE}
|
||||
{FA74D37C-8184-4596-BFE9-766C159045E1} = {CE0E0AF3-A106-4992-BEBD-B842B983D0FE}
|
||||
{8AD92D25-0921-44AB-BBEF-5244F5CFC6DA} = {CE0E0AF3-A106-4992-BEBD-B842B983D0FE}
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {9B481265-6DD9-4083-8D4A-247B6A58644F}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
|
BIN
src/3rdparty/win32_bin/libogg.dll
vendored
Normal file
BIN
src/3rdparty/win32_bin/libogg.dll
vendored
Normal file
Binary file not shown.
BIN
src/3rdparty/win32_bin/libvorbis.dll
vendored
Normal file
BIN
src/3rdparty/win32_bin/libvorbis.dll
vendored
Normal file
Binary file not shown.
BIN
src/3rdparty/win32_bin/libvorbisfile.dll
vendored
Normal file
BIN
src/3rdparty/win32_bin/libvorbisfile.dll
vendored
Normal file
Binary file not shown.
@ -11,7 +11,6 @@
|
||||
********************************************************************
|
||||
|
||||
function: toplevel libogg include
|
||||
last mod: $Id: ogg.h 18044 2011-08-01 17:55:20Z gmaxwell $
|
||||
|
||||
********************************************************************/
|
||||
#ifndef _OGG_H
|
@ -10,8 +10,7 @@
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: #ifdef jail to whip a few platforms into the UNIX ideal.
|
||||
last mod: $Id: os_types.h 19098 2014-02-26 19:06:45Z giles $
|
||||
function: Define a consistent set of types on each platform.
|
||||
|
||||
********************************************************************/
|
||||
#ifndef _OS_TYPES_H
|
||||
@ -49,23 +48,24 @@
|
||||
typedef short ogg_int16_t;
|
||||
typedef unsigned short ogg_uint16_t;
|
||||
# else
|
||||
/* MSVC/Borland */
|
||||
typedef __int64 ogg_int64_t;
|
||||
typedef __int32 ogg_int32_t;
|
||||
typedef unsigned __int32 ogg_uint32_t;
|
||||
typedef __int16 ogg_int16_t;
|
||||
typedef unsigned __int16 ogg_uint16_t;
|
||||
# if defined(_MSC_VER) && (_MSC_VER >= 1800) /* MSVC 2013 and newer */
|
||||
# include <stdint.h>
|
||||
typedef int16_t ogg_int16_t;
|
||||
typedef uint16_t ogg_uint16_t;
|
||||
typedef int32_t ogg_int32_t;
|
||||
typedef uint32_t ogg_uint32_t;
|
||||
typedef int64_t ogg_int64_t;
|
||||
typedef uint64_t ogg_uint64_t;
|
||||
# else
|
||||
/* MSVC/Borland */
|
||||
typedef __int64 ogg_int64_t;
|
||||
typedef __int32 ogg_int32_t;
|
||||
typedef unsigned __int32 ogg_uint32_t;
|
||||
typedef __int16 ogg_int16_t;
|
||||
typedef unsigned __int16 ogg_uint16_t;
|
||||
# endif
|
||||
# endif
|
||||
|
||||
#elif defined(__MACOS__)
|
||||
|
||||
# include <sys/types.h>
|
||||
typedef SInt16 ogg_int16_t;
|
||||
typedef UInt16 ogg_uint16_t;
|
||||
typedef SInt32 ogg_int32_t;
|
||||
typedef UInt32 ogg_uint32_t;
|
||||
typedef SInt64 ogg_int64_t;
|
||||
|
||||
#elif (defined(__APPLE__) && defined(__MACH__)) /* MacOS X Framework build */
|
||||
|
||||
# include <inttypes.h>
|
@ -11,7 +11,6 @@
|
||||
********************************************************************
|
||||
|
||||
function: libvorbis codec headers
|
||||
last mod: $Id: codec.h 17021 2010-03-24 09:29:41Z xiphmont $
|
||||
|
||||
********************************************************************/
|
||||
|
@ -11,7 +11,6 @@
|
||||
********************************************************************
|
||||
|
||||
function: vorbis encode-engine setup
|
||||
last mod: $Id: vorbisenc.h 17021 2010-03-24 09:29:41Z xiphmont $
|
||||
|
||||
********************************************************************/
|
||||
|
@ -11,7 +11,6 @@
|
||||
********************************************************************
|
||||
|
||||
function: stdio-based convenience library for opening/seeking/decoding
|
||||
last mod: $Id: vorbisfile.h 17182 2010-04-29 03:48:32Z xiphmont $
|
||||
|
||||
********************************************************************/
|
||||
|
BIN
src/3rdparty/win32_lib/libogg.lib
vendored
Normal file
BIN
src/3rdparty/win32_lib/libogg.lib
vendored
Normal file
Binary file not shown.
BIN
src/3rdparty/win32_lib/libvorbis.lib
vendored
Normal file
BIN
src/3rdparty/win32_lib/libvorbis.lib
vendored
Normal file
Binary file not shown.
BIN
src/3rdparty/win32_lib/libvorbisfile.lib
vendored
Normal file
BIN
src/3rdparty/win32_lib/libvorbisfile.lib
vendored
Normal file
Binary file not shown.
@ -37,6 +37,7 @@
|
||||
#include "Streams.h"
|
||||
#include <core/debug.h>
|
||||
#include <core/sdk/IDecoderFactory.h>
|
||||
#include <core/sdk/IEncoderFactory.h>
|
||||
#include <core/plugin/PluginFactory.h>
|
||||
#include <mutex>
|
||||
|
||||
@ -47,22 +48,32 @@ using namespace musik::core::sdk;
|
||||
using musik::core::PluginFactory;
|
||||
|
||||
using DataStreamPtr = musik::core::io::DataStreamFactory::DataStreamPtr;
|
||||
using DecoderFactoryList = std::vector<std::shared_ptr<IDecoderFactory > >;
|
||||
using DspList = std::vector<std::shared_ptr<IDSP > >;
|
||||
using DecoderFactoryList = std::vector<std::shared_ptr<IDecoderFactory>>;
|
||||
using EncoderFactoryList = std::vector<std::shared_ptr<IEncoderFactory>>;
|
||||
using DspList = std::vector<std::shared_ptr<IDSP>>;
|
||||
using Deleter = PluginFactory::ReleaseDeleter<IDecoder>;
|
||||
using DecoderPtr = std::shared_ptr<IDecoder>;
|
||||
|
||||
static std::mutex initLock;
|
||||
static DecoderFactoryList decoders;
|
||||
static EncoderFactoryList encoders;
|
||||
|
||||
static void init() {
|
||||
std::unique_lock<std::mutex> lock(initLock);
|
||||
|
||||
if (!decoders.size()) {
|
||||
typedef PluginFactory::ReleaseDeleter<IDecoderFactory> Deleter;
|
||||
using Deleter = PluginFactory::ReleaseDeleter<IDecoderFactory>;
|
||||
|
||||
decoders = PluginFactory::Instance()
|
||||
.QueryInterface<IDecoderFactory, Deleter>("GetDecoderFactory");
|
||||
}
|
||||
|
||||
if (!encoders.size()) {
|
||||
using Deleter = PluginFactory::ReleaseDeleter<IEncoderFactory>;
|
||||
|
||||
encoders = PluginFactory::Instance()
|
||||
.QueryInterface<IEncoderFactory, Deleter>("GetEncoderFactory");
|
||||
}
|
||||
}
|
||||
|
||||
namespace musik { namespace core { namespace audio {
|
||||
@ -112,6 +123,18 @@ namespace musik { namespace core { namespace audio {
|
||||
return decoder;
|
||||
}
|
||||
|
||||
IEncoder* GetEncoderForType(const char* type) {
|
||||
init();
|
||||
|
||||
for (auto factory : encoders) {
|
||||
if (factory->CanHandle(type)) {
|
||||
return factory->CreateEncoder(type);
|
||||
}
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
std::shared_ptr<IDecoder> GetDecoderForDataStream(DataStreamPtr dataStream) {
|
||||
auto decoder = GetDecoderForDataStream(dataStream.get());
|
||||
return decoder ? DecoderPtr(decoder, Deleter()) : DecoderPtr();
|
||||
|
@ -37,6 +37,7 @@
|
||||
#include <core/config.h>
|
||||
#include <core/io/DataStreamFactory.h>
|
||||
#include <core/sdk/IDecoder.h>
|
||||
#include <core/sdk/IEncoder.h>
|
||||
#include <core/sdk/IDSP.h>
|
||||
#include <core/sdk/IDecoderFactory.h>
|
||||
|
||||
@ -52,6 +53,8 @@ namespace musik { namespace core { namespace audio {
|
||||
musik::core::sdk::IDecoder*
|
||||
GetDecoderForDataStream(musik::core::sdk::IDataStream* stream);
|
||||
|
||||
musik::core::sdk::IEncoder* GetEncoderForType(const char* type);
|
||||
|
||||
std::vector<std::shared_ptr<musik::core::sdk::IDSP > > GetDspPlugins();
|
||||
};
|
||||
|
||||
|
@ -196,6 +196,8 @@
|
||||
<ClInclude Include="sdk\IDSP.h" />
|
||||
<ClInclude Include="sdk\IDataStream.h" />
|
||||
<ClInclude Include="sdk\IDataStreamFactory.h" />
|
||||
<ClInclude Include="sdk\IEncoder.h" />
|
||||
<ClInclude Include="sdk\IEncoderFactory.h" />
|
||||
<ClInclude Include="sdk\IEnvironment.h" />
|
||||
<ClInclude Include="sdk\IIndexerNotifier.h" />
|
||||
<ClInclude Include="sdk\IIndexerSource.h" />
|
||||
|
@ -471,5 +471,11 @@
|
||||
<ClInclude Include="library\query\local\AppendPlaylistQuery.h">
|
||||
<Filter>src\library\query\local</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="sdk\IEncoder.h">
|
||||
<Filter>src\sdk\audio</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="sdk\IEncoderFactory.h">
|
||||
<Filter>src\sdk\audio</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
</Project>
|
@ -100,6 +100,10 @@ static class Environment : public IEnvironment {
|
||||
return streams::GetDecoderForDataStream(stream);
|
||||
}
|
||||
|
||||
virtual IEncoder* GetEncoder(const char* type) override {
|
||||
return streams::GetEncoderForType(type);
|
||||
}
|
||||
|
||||
virtual IBuffer* GetBuffer(size_t samples, size_t rate = 44100, size_t channels = 2) override {
|
||||
musik::core::audio::Buffer* buffer = new Buffer();
|
||||
buffer->SetChannels(2);
|
||||
|
138
src/core/sdk/DataBuffer.h
Normal file
138
src/core/sdk/DataBuffer.h
Normal file
@ -0,0 +1,138 @@
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (c) 2007-2017 musikcube team
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistributions in binary form must reproduce the above copyright
|
||||
// notice, this list of conditions and the following disclaimer in the
|
||||
// documentation and/or other materials provided with the distribution.
|
||||
//
|
||||
// * Neither the name of the author nor the names of other contributors may
|
||||
// be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
// POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <core/sdk/IBuffer.h>
|
||||
#include <string.h>
|
||||
|
||||
template <typename T>
|
||||
struct DataBuffer {
|
||||
DataBuffer() {
|
||||
data = nullptr;
|
||||
offset = rawLength = length = 0;
|
||||
}
|
||||
|
||||
~DataBuffer() {
|
||||
delete[] data;
|
||||
}
|
||||
|
||||
void reset(size_t newLength) {
|
||||
if (newLength > rawLength) {
|
||||
delete[] data;
|
||||
data = new T[newLength];
|
||||
}
|
||||
rawLength = length = newLength;
|
||||
offset = 0;
|
||||
}
|
||||
|
||||
void reset() {
|
||||
offset = 0;
|
||||
length = 0;
|
||||
}
|
||||
|
||||
void zero() {
|
||||
reset();
|
||||
if (data) {
|
||||
memset(data, 0, rawLength * sizeof(T));
|
||||
}
|
||||
}
|
||||
|
||||
void from(T* source, size_t size) {
|
||||
reset(size);
|
||||
memcpy(this->data, source, size);
|
||||
length = size;
|
||||
}
|
||||
|
||||
void realloc(size_t size) {
|
||||
if (length + size > rawLength) {
|
||||
rawLength = (length + size) * 2;
|
||||
T* newData = new T[rawLength];
|
||||
if (length && data) {
|
||||
memcpy(newData, data, length * sizeof(T));
|
||||
delete[] data;
|
||||
}
|
||||
data = newData;
|
||||
}
|
||||
}
|
||||
|
||||
int append(const T* source, size_t size) {
|
||||
realloc(size);
|
||||
memcpy(data + length, source, size * sizeof(T));
|
||||
length += size;
|
||||
return size;
|
||||
}
|
||||
|
||||
int pad(char value, size_t size) {
|
||||
realloc(size);
|
||||
memset(data + length, value, size * sizeof(T));
|
||||
length += size;
|
||||
return size;
|
||||
}
|
||||
|
||||
bool empty() {
|
||||
return offset >= length || length == 0;
|
||||
}
|
||||
|
||||
size_t avail() {
|
||||
return (length > offset) ? length - offset : 0;
|
||||
}
|
||||
|
||||
T* pos() {
|
||||
return data + offset;
|
||||
}
|
||||
|
||||
void inc(size_t count) {
|
||||
offset += count;
|
||||
if (offset >= length) {
|
||||
offset = length = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void swap(DataBuffer& with) {
|
||||
size_t off = offset, len = length, raw = rawLength;
|
||||
T* d = data;
|
||||
this->data = with.data;
|
||||
this->length = with.length;
|
||||
this->rawLength = with.rawLength;
|
||||
this->offset = with.offset;
|
||||
with.data = d;
|
||||
with.length = len;
|
||||
with.rawLength = raw;
|
||||
with.offset = offset;
|
||||
}
|
||||
|
||||
T *data;
|
||||
size_t offset, length, rawLength;
|
||||
};
|
50
src/core/sdk/IEncoder.h
Normal file
50
src/core/sdk/IEncoder.h
Normal file
@ -0,0 +1,50 @@
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (c) 2007-2017 musikcube team
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistributions in binary form must reproduce the above copyright
|
||||
// notice, this list of conditions and the following disclaimer in the
|
||||
// documentation and/or other materials provided with the distribution.
|
||||
//
|
||||
// * Neither the name of the author nor the names of other contributors may
|
||||
// be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
// POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "IBuffer.h"
|
||||
|
||||
namespace musik { namespace core { namespace sdk {
|
||||
|
||||
class IEncoder {
|
||||
public:
|
||||
virtual void Release() = 0;
|
||||
virtual void Initialize(size_t rate, size_t channels, size_t bitrate) = 0;
|
||||
virtual int Encode(const IBuffer* pcm, char** data) = 0;
|
||||
virtual int Flush(char** data) = 0;
|
||||
virtual void Finalize(const char* uri) = 0;
|
||||
};
|
||||
|
||||
} } }
|
48
src/core/sdk/IEncoderFactory.h
Normal file
48
src/core/sdk/IEncoderFactory.h
Normal file
@ -0,0 +1,48 @@
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (c) 2007-2017 musikcube team
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistributions in binary form must reproduce the above copyright
|
||||
// notice, this list of conditions and the following disclaimer in the
|
||||
// documentation and/or other materials provided with the distribution.
|
||||
//
|
||||
// * Neither the name of the author nor the names of other contributors may
|
||||
// be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
// POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "IEncoder.h"
|
||||
|
||||
namespace musik { namespace core { namespace sdk {
|
||||
|
||||
class IEncoderFactory{
|
||||
public:
|
||||
virtual void Release() = 0;
|
||||
virtual IEncoder* CreateEncoder(const char* type) = 0;
|
||||
virtual bool CanHandle(const char* type) const = 0;
|
||||
};
|
||||
|
||||
} } }
|
@ -37,6 +37,7 @@
|
||||
#include "constants.h"
|
||||
#include "IDataStream.h"
|
||||
#include "IDecoder.h"
|
||||
#include "IEncoder.h"
|
||||
|
||||
namespace musik { namespace core { namespace sdk {
|
||||
|
||||
@ -45,6 +46,7 @@ namespace musik { namespace core { namespace sdk {
|
||||
virtual size_t GetPath(PathType type, char* dst, int size) = 0;
|
||||
virtual IDataStream* GetDataStream(const char* uri) = 0;
|
||||
virtual IDecoder* GetDecoder(IDataStream* stream) = 0;
|
||||
virtual IEncoder* GetEncoder(const char* type) = 0;
|
||||
virtual IBuffer* GetBuffer(size_t samples, size_t rate = 44100, size_t channels = 2) = 0;
|
||||
};
|
||||
|
||||
|
@ -90,7 +90,7 @@ xcopy "$(ProjectDir)data\themes\*" "$(TargetDir)themes\" /Y /e
|
||||
if not exist "$(TargetDir)locales" mkdir "$(TargetDir)locales"
|
||||
xcopy "$(ProjectDir)data\locales\*" "$(TargetDir)locales\" /Y /e
|
||||
xcopy "$(SolutionDir)src\3rdparty\win32_bin\*" "$(TargetDir)" /Y /e
|
||||
xcopy "$(SolutionDir)src\plugins\websocket_remote\3rdparty\win32_bin\$(Configuration)\*" "$(TargetDir)plugins" /Y /e</Command>
|
||||
xcopy "$(SolutionDir)src\plugins\stockencoders\3rdparty\win32_bin\$(Configuration)\*" "$(TargetDir)plugins" /Y /e</Command>
|
||||
</PostBuildEvent>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
@ -132,7 +132,7 @@ xcopy "$(ProjectDir)data\themes\*" "$(TargetDir)themes\" /Y /e
|
||||
if not exist "$(TargetDir)locales" mkdir "$(TargetDir)locales"
|
||||
xcopy "$(ProjectDir)data\locales\*" "$(TargetDir)locales\" /Y /e
|
||||
xcopy "$(SolutionDir)src\3rdparty\win32_bin\*" "$(TargetDir)" /Y /e
|
||||
xcopy "$(SolutionDir)src\plugins\websocket_remote\3rdparty\win32_bin\$(Configuration)\*" "$(TargetDir)plugins" /Y /e</Command>
|
||||
xcopy "$(SolutionDir)src\plugins\stockencoders\3rdparty\win32_bin\$(Configuration)\*" "$(TargetDir)plugins" /Y /e</Command>
|
||||
</PostBuildEvent>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
|
@ -530,7 +530,7 @@ class StreamingPlaybackService(context: Context) : IPlaybackService {
|
||||
|
||||
return String.format(
|
||||
Locale.ENGLISH,
|
||||
"%s://%s:%d/audio/external_id/%s%s",
|
||||
"%s://%s:%d/audio/external_id/%s%s&format=mp3",
|
||||
protocol,
|
||||
prefs.getString(Prefs.Key.ADDRESS, Prefs.Default.ADDRESS),
|
||||
prefs.getInt(Prefs.Key.AUDIO_PORT, Prefs.Default.AUDIO_PORT),
|
||||
|
@ -189,6 +189,18 @@ bool OggDecoder::GetBuffer(IBuffer *buffer) {
|
||||
++pDataBuffer;
|
||||
}
|
||||
}
|
||||
else if (info->channels == 4) {
|
||||
for (unsigned long x = 0; x < samplesRead; ++x) {
|
||||
*pDataBuffer = pcm[0][x];
|
||||
++pDataBuffer;
|
||||
*pDataBuffer = pcm[1][x];
|
||||
++pDataBuffer;
|
||||
*pDataBuffer = pcm[2][x];
|
||||
++pDataBuffer;
|
||||
*pDataBuffer = pcm[3][x];
|
||||
++pDataBuffer;
|
||||
}
|
||||
}
|
||||
else if (info->channels == 5) {
|
||||
for (unsigned long x = 0; x < samplesRead; ++x) {
|
||||
*pDataBuffer = pcm[0][x];
|
||||
|
@ -35,8 +35,8 @@
|
||||
|
||||
#include <core/sdk/IDecoder.h>
|
||||
|
||||
#include "vorbis/codec.h"
|
||||
#include "vorbis/vorbisfile.h"
|
||||
#include <vorbis/codec.h>
|
||||
#include <vorbis/vorbisfile.h>
|
||||
|
||||
using namespace musik::core::sdk;
|
||||
|
||||
|
@ -39,7 +39,7 @@
|
||||
#include "OggDecoderFactory.h"
|
||||
#include "OggDecoder.h"
|
||||
|
||||
inline bool endsWith(const std::string& s, const std::string& suffix) {
|
||||
static inline bool endsWith(const std::string& s, const std::string& suffix) {
|
||||
return
|
||||
s.size() >= suffix.size() &&
|
||||
s.rfind(suffix) == (s.size() - suffix.size());
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,120 +0,0 @@
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: single-block PCM analysis mode dispatch
|
||||
last mod: $Id: analysis.c 16226 2009-07-08 06:43:49Z xiphmont $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
#include <ogg/ogg.h>
|
||||
#include "vorbis/codec.h"
|
||||
#include "codec_internal.h"
|
||||
#include "registry.h"
|
||||
#include "scales.h"
|
||||
#include "os.h"
|
||||
#include "misc.h"
|
||||
|
||||
/* decides between modes, dispatches to the appropriate mapping. */
|
||||
int vorbis_analysis(vorbis_block *vb, ogg_packet *op){
|
||||
int ret,i;
|
||||
vorbis_block_internal *vbi=vb->internal;
|
||||
|
||||
vb->glue_bits=0;
|
||||
vb->time_bits=0;
|
||||
vb->floor_bits=0;
|
||||
vb->res_bits=0;
|
||||
|
||||
/* first things first. Make sure encode is ready */
|
||||
for(i=0;i<PACKETBLOBS;i++)
|
||||
oggpack_reset(vbi->packetblob[i]);
|
||||
|
||||
/* we only have one mapping type (0), and we let the mapping code
|
||||
itself figure out what soft mode to use. This allows easier
|
||||
bitrate management */
|
||||
|
||||
if((ret=_mapping_P[0]->forward(vb)))
|
||||
return(ret);
|
||||
|
||||
if(op){
|
||||
if(vorbis_bitrate_managed(vb))
|
||||
/* The app is using a bitmanaged mode... but not using the
|
||||
bitrate management interface. */
|
||||
return(OV_EINVAL);
|
||||
|
||||
op->packet=oggpack_get_buffer(&vb->opb);
|
||||
op->bytes=oggpack_bytes(&vb->opb);
|
||||
op->b_o_s=0;
|
||||
op->e_o_s=vb->eofflag;
|
||||
op->granulepos=vb->granulepos;
|
||||
op->packetno=vb->sequence; /* for sake of completeness */
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
#ifdef ANALYSIS
|
||||
int analysis_noisy=1;
|
||||
|
||||
/* there was no great place to put this.... */
|
||||
void _analysis_output_always(char *base,int i,float *v,int n,int bark,int dB,ogg_int64_t off){
|
||||
int j;
|
||||
FILE *of;
|
||||
char buffer[80];
|
||||
|
||||
sprintf(buffer,"%s_%d.m",base,i);
|
||||
of=fopen(buffer,"w");
|
||||
|
||||
if(!of)perror("failed to open data dump file");
|
||||
|
||||
for(j=0;j<n;j++){
|
||||
if(bark){
|
||||
float b=toBARK((4000.f*j/n)+.25);
|
||||
fprintf(of,"%f ",b);
|
||||
}else
|
||||
if(off!=0)
|
||||
fprintf(of,"%f ",(double)(j+off)/8000.);
|
||||
else
|
||||
fprintf(of,"%f ",(double)j);
|
||||
|
||||
if(dB){
|
||||
float val;
|
||||
if(v[j]==0.)
|
||||
val=-140.;
|
||||
else
|
||||
val=todB(v+j);
|
||||
fprintf(of,"%f\n",val);
|
||||
}else{
|
||||
fprintf(of,"%f\n",v[j]);
|
||||
}
|
||||
}
|
||||
fclose(of);
|
||||
}
|
||||
|
||||
void _analysis_output(char *base,int i,float *v,int n,int bark,int dB,
|
||||
ogg_int64_t off){
|
||||
if(analysis_noisy)_analysis_output_always(base,i,v,n,bark,dB,off);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,144 +0,0 @@
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: libvorbis backend and mapping structures; needed for
|
||||
static mode headers
|
||||
last mod: $Id: backends.h 16962 2010-03-11 07:30:34Z xiphmont $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
/* this is exposed up here because we need it for static modes.
|
||||
Lookups for each backend aren't exposed because there's no reason
|
||||
to do so */
|
||||
|
||||
#ifndef _vorbis_backend_h_
|
||||
#define _vorbis_backend_h_
|
||||
|
||||
#include "codec_internal.h"
|
||||
|
||||
/* this would all be simpler/shorter with templates, but.... */
|
||||
/* Floor backend generic *****************************************/
|
||||
typedef struct{
|
||||
void (*pack) (vorbis_info_floor *,oggpack_buffer *);
|
||||
vorbis_info_floor *(*unpack)(vorbis_info *,oggpack_buffer *);
|
||||
vorbis_look_floor *(*look) (vorbis_dsp_state *,vorbis_info_floor *);
|
||||
void (*free_info) (vorbis_info_floor *);
|
||||
void (*free_look) (vorbis_look_floor *);
|
||||
void *(*inverse1) (struct vorbis_block *,vorbis_look_floor *);
|
||||
int (*inverse2) (struct vorbis_block *,vorbis_look_floor *,
|
||||
void *buffer,float *);
|
||||
} vorbis_func_floor;
|
||||
|
||||
typedef struct{
|
||||
int order;
|
||||
long rate;
|
||||
long barkmap;
|
||||
|
||||
int ampbits;
|
||||
int ampdB;
|
||||
|
||||
int numbooks; /* <= 16 */
|
||||
int books[16];
|
||||
|
||||
float lessthan; /* encode-only config setting hacks for libvorbis */
|
||||
float greaterthan; /* encode-only config setting hacks for libvorbis */
|
||||
|
||||
} vorbis_info_floor0;
|
||||
|
||||
|
||||
#define VIF_POSIT 63
|
||||
#define VIF_CLASS 16
|
||||
#define VIF_PARTS 31
|
||||
typedef struct{
|
||||
int partitions; /* 0 to 31 */
|
||||
int partitionclass[VIF_PARTS]; /* 0 to 15 */
|
||||
|
||||
int class_dim[VIF_CLASS]; /* 1 to 8 */
|
||||
int class_subs[VIF_CLASS]; /* 0,1,2,3 (bits: 1<<n poss) */
|
||||
int class_book[VIF_CLASS]; /* subs ^ dim entries */
|
||||
int class_subbook[VIF_CLASS][8]; /* [VIF_CLASS][subs] */
|
||||
|
||||
|
||||
int mult; /* 1 2 3 or 4 */
|
||||
int postlist[VIF_POSIT+2]; /* first two implicit */
|
||||
|
||||
|
||||
/* encode side analysis parameters */
|
||||
float maxover;
|
||||
float maxunder;
|
||||
float maxerr;
|
||||
|
||||
float twofitweight;
|
||||
float twofitatten;
|
||||
|
||||
int n;
|
||||
|
||||
} vorbis_info_floor1;
|
||||
|
||||
/* Residue backend generic *****************************************/
|
||||
typedef struct{
|
||||
void (*pack) (vorbis_info_residue *,oggpack_buffer *);
|
||||
vorbis_info_residue *(*unpack)(vorbis_info *,oggpack_buffer *);
|
||||
vorbis_look_residue *(*look) (vorbis_dsp_state *,
|
||||
vorbis_info_residue *);
|
||||
void (*free_info) (vorbis_info_residue *);
|
||||
void (*free_look) (vorbis_look_residue *);
|
||||
long **(*class) (struct vorbis_block *,vorbis_look_residue *,
|
||||
int **,int *,int);
|
||||
int (*forward) (oggpack_buffer *,struct vorbis_block *,
|
||||
vorbis_look_residue *,
|
||||
int **,int *,int,long **,int);
|
||||
int (*inverse) (struct vorbis_block *,vorbis_look_residue *,
|
||||
float **,int *,int);
|
||||
} vorbis_func_residue;
|
||||
|
||||
typedef struct vorbis_info_residue0{
|
||||
/* block-partitioned VQ coded straight residue */
|
||||
long begin;
|
||||
long end;
|
||||
|
||||
/* first stage (lossless partitioning) */
|
||||
int grouping; /* group n vectors per partition */
|
||||
int partitions; /* possible codebooks for a partition */
|
||||
int partvals; /* partitions ^ groupbook dim */
|
||||
int groupbook; /* huffbook for partitioning */
|
||||
int secondstages[64]; /* expanded out to pointers in lookup */
|
||||
int booklist[512]; /* list of second stage books */
|
||||
|
||||
const int classmetric1[64];
|
||||
const int classmetric2[64];
|
||||
} vorbis_info_residue0;
|
||||
|
||||
/* Mapping backend generic *****************************************/
|
||||
typedef struct{
|
||||
void (*pack) (vorbis_info *,vorbis_info_mapping *,
|
||||
oggpack_buffer *);
|
||||
vorbis_info_mapping *(*unpack)(vorbis_info *,oggpack_buffer *);
|
||||
void (*free_info) (vorbis_info_mapping *);
|
||||
int (*forward) (struct vorbis_block *vb);
|
||||
int (*inverse) (struct vorbis_block *vb,vorbis_info_mapping *);
|
||||
} vorbis_func_mapping;
|
||||
|
||||
typedef struct vorbis_info_mapping0{
|
||||
int submaps; /* <= 16 */
|
||||
int chmuxlist[256]; /* up to 256 channels in a Vorbis stream */
|
||||
|
||||
int floorsubmap[16]; /* [mux] submap to floors */
|
||||
int residuesubmap[16]; /* [mux] submap to residue */
|
||||
|
||||
int coupling_steps;
|
||||
int coupling_mag[256];
|
||||
int coupling_ang[256];
|
||||
|
||||
} vorbis_info_mapping0;
|
||||
|
||||
#endif
|
@ -1,64 +0,0 @@
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: bark scale utility
|
||||
last mod: $Id: barkmel.c 19454 2015-03-02 22:39:28Z xiphmont $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
#include <stdio.h>
|
||||
#include "scales.h"
|
||||
int main(){
|
||||
int i;
|
||||
double rate;
|
||||
for(i=64;i<32000;i*=2){
|
||||
rate=48000.f;
|
||||
fprintf(stderr,"rate=%gHz, block=%d, f(1)=%.2gHz bark(1)=%.2g (of %.2g)\n",
|
||||
rate,i,rate/2 / (i/2),toBARK(rate/2 /(i/2)),toBARK(rate/2));
|
||||
|
||||
rate=44100.f;
|
||||
fprintf(stderr,"rate=%gHz, block=%d, f(1)=%.2gHz bark(1)=%.2g (of %.2g)\n",
|
||||
rate,i,rate/2 / (i/2),toBARK(rate/2 /(i/2)),toBARK(rate/2));
|
||||
|
||||
rate=32000.f;
|
||||
fprintf(stderr,"rate=%gHz, block=%d, f(1)=%.2gHz bark(1)=%.2g (of %.2g)\n",
|
||||
rate,i,rate/2 / (i/2),toBARK(rate/2 /(i/2)),toBARK(rate/2));
|
||||
|
||||
rate=22050.f;
|
||||
fprintf(stderr,"rate=%gHz, block=%d, f(1)=%.2gHz bark(1)=%.2g (of %.2g)\n",
|
||||
rate,i,rate/2 / (i/2),toBARK(rate/2 /(i/2)),toBARK(rate/2));
|
||||
|
||||
rate=16000.f;
|
||||
fprintf(stderr,"rate=%gHz, block=%d, f(1)=%.2gHz bark(1)=%.2g (of %.2g)\n",
|
||||
rate,i,rate/2 / (i/2),toBARK(rate/2 /(i/2)),toBARK(rate/2));
|
||||
|
||||
rate=11025.f;
|
||||
fprintf(stderr,"rate=%gHz, block=%d, f(1)=%.2gHz bark(1)=%.2g (of %.2g)\n",
|
||||
rate,i,rate/2 / (i/2),toBARK(rate/2 /(i/2)),toBARK(rate/2));
|
||||
|
||||
rate=8000.f;
|
||||
fprintf(stderr,"rate=%gHz, block=%d, f(1)=%.2gHz bark(1)=%.2g (of %.2g)\n\n",
|
||||
rate,i,rate/2 / (i/2),toBARK(rate/2 /(i/2)),toBARK(rate/2));
|
||||
|
||||
|
||||
}
|
||||
{
|
||||
float i;
|
||||
int j;
|
||||
for(i=0.,j=0;i<28;i+=1,j++){
|
||||
fprintf(stderr,"(%d) bark=%f %gHz (%d of 128)\n",
|
||||
j,i,fromBARK(i),(int)(fromBARK(i)/22050.*128.));
|
||||
}
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
@ -1,253 +0,0 @@
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: bitrate tracking and management
|
||||
last mod: $Id: bitrate.c 16227 2009-07-08 06:58:46Z xiphmont $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
#include <ogg/ogg.h>
|
||||
#include "vorbis/codec.h"
|
||||
#include "codec_internal.h"
|
||||
#include "os.h"
|
||||
#include "misc.h"
|
||||
#include "bitrate.h"
|
||||
|
||||
/* compute bitrate tracking setup */
|
||||
void vorbis_bitrate_init(vorbis_info *vi,bitrate_manager_state *bm){
|
||||
codec_setup_info *ci=vi->codec_setup;
|
||||
bitrate_manager_info *bi=&ci->bi;
|
||||
|
||||
memset(bm,0,sizeof(*bm));
|
||||
|
||||
if(bi && (bi->reservoir_bits>0)){
|
||||
long ratesamples=vi->rate;
|
||||
int halfsamples=ci->blocksizes[0]>>1;
|
||||
|
||||
bm->short_per_long=ci->blocksizes[1]/ci->blocksizes[0];
|
||||
bm->managed=1;
|
||||
|
||||
bm->avg_bitsper= rint(1.*bi->avg_rate*halfsamples/ratesamples);
|
||||
bm->min_bitsper= rint(1.*bi->min_rate*halfsamples/ratesamples);
|
||||
bm->max_bitsper= rint(1.*bi->max_rate*halfsamples/ratesamples);
|
||||
|
||||
bm->avgfloat=PACKETBLOBS/2;
|
||||
|
||||
/* not a necessary fix, but one that leads to a more balanced
|
||||
typical initialization */
|
||||
{
|
||||
long desired_fill=bi->reservoir_bits*bi->reservoir_bias;
|
||||
bm->minmax_reservoir=desired_fill;
|
||||
bm->avg_reservoir=desired_fill;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void vorbis_bitrate_clear(bitrate_manager_state *bm){
|
||||
memset(bm,0,sizeof(*bm));
|
||||
return;
|
||||
}
|
||||
|
||||
int vorbis_bitrate_managed(vorbis_block *vb){
|
||||
vorbis_dsp_state *vd=vb->vd;
|
||||
private_state *b=vd->backend_state;
|
||||
bitrate_manager_state *bm=&b->bms;
|
||||
|
||||
if(bm && bm->managed)return(1);
|
||||
return(0);
|
||||
}
|
||||
|
||||
/* finish taking in the block we just processed */
|
||||
int vorbis_bitrate_addblock(vorbis_block *vb){
|
||||
vorbis_block_internal *vbi=vb->internal;
|
||||
vorbis_dsp_state *vd=vb->vd;
|
||||
private_state *b=vd->backend_state;
|
||||
bitrate_manager_state *bm=&b->bms;
|
||||
vorbis_info *vi=vd->vi;
|
||||
codec_setup_info *ci=vi->codec_setup;
|
||||
bitrate_manager_info *bi=&ci->bi;
|
||||
|
||||
int choice=rint(bm->avgfloat);
|
||||
long this_bits=oggpack_bytes(vbi->packetblob[choice])*8;
|
||||
long min_target_bits=(vb->W?bm->min_bitsper*bm->short_per_long:bm->min_bitsper);
|
||||
long max_target_bits=(vb->W?bm->max_bitsper*bm->short_per_long:bm->max_bitsper);
|
||||
int samples=ci->blocksizes[vb->W]>>1;
|
||||
long desired_fill=bi->reservoir_bits*bi->reservoir_bias;
|
||||
if(!bm->managed){
|
||||
/* not a bitrate managed stream, but for API simplicity, we'll
|
||||
buffer the packet to keep the code path clean */
|
||||
|
||||
if(bm->vb)return(-1); /* one has been submitted without
|
||||
being claimed */
|
||||
bm->vb=vb;
|
||||
return(0);
|
||||
}
|
||||
|
||||
bm->vb=vb;
|
||||
|
||||
/* look ahead for avg floater */
|
||||
if(bm->avg_bitsper>0){
|
||||
double slew=0.;
|
||||
long avg_target_bits=(vb->W?bm->avg_bitsper*bm->short_per_long:bm->avg_bitsper);
|
||||
double slewlimit= 15./bi->slew_damp;
|
||||
|
||||
/* choosing a new floater:
|
||||
if we're over target, we slew down
|
||||
if we're under target, we slew up
|
||||
|
||||
choose slew as follows: look through packetblobs of this frame
|
||||
and set slew as the first in the appropriate direction that
|
||||
gives us the slew we want. This may mean no slew if delta is
|
||||
already favorable.
|
||||
|
||||
Then limit slew to slew max */
|
||||
|
||||
if(bm->avg_reservoir+(this_bits-avg_target_bits)>desired_fill){
|
||||
while(choice>0 && this_bits>avg_target_bits &&
|
||||
bm->avg_reservoir+(this_bits-avg_target_bits)>desired_fill){
|
||||
choice--;
|
||||
this_bits=oggpack_bytes(vbi->packetblob[choice])*8;
|
||||
}
|
||||
}else if(bm->avg_reservoir+(this_bits-avg_target_bits)<desired_fill){
|
||||
while(choice+1<PACKETBLOBS && this_bits<avg_target_bits &&
|
||||
bm->avg_reservoir+(this_bits-avg_target_bits)<desired_fill){
|
||||
choice++;
|
||||
this_bits=oggpack_bytes(vbi->packetblob[choice])*8;
|
||||
}
|
||||
}
|
||||
|
||||
slew=rint(choice-bm->avgfloat)/samples*vi->rate;
|
||||
if(slew<-slewlimit)slew=-slewlimit;
|
||||
if(slew>slewlimit)slew=slewlimit;
|
||||
choice=rint(bm->avgfloat+= slew/vi->rate*samples);
|
||||
this_bits=oggpack_bytes(vbi->packetblob[choice])*8;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* enforce min(if used) on the current floater (if used) */
|
||||
if(bm->min_bitsper>0){
|
||||
/* do we need to force the bitrate up? */
|
||||
if(this_bits<min_target_bits){
|
||||
while(bm->minmax_reservoir-(min_target_bits-this_bits)<0){
|
||||
choice++;
|
||||
if(choice>=PACKETBLOBS)break;
|
||||
this_bits=oggpack_bytes(vbi->packetblob[choice])*8;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* enforce max (if used) on the current floater (if used) */
|
||||
if(bm->max_bitsper>0){
|
||||
/* do we need to force the bitrate down? */
|
||||
if(this_bits>max_target_bits){
|
||||
while(bm->minmax_reservoir+(this_bits-max_target_bits)>bi->reservoir_bits){
|
||||
choice--;
|
||||
if(choice<0)break;
|
||||
this_bits=oggpack_bytes(vbi->packetblob[choice])*8;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Choice of packetblobs now made based on floater, and min/max
|
||||
requirements. Now boundary check extreme choices */
|
||||
|
||||
if(choice<0){
|
||||
/* choosing a smaller packetblob is insufficient to trim bitrate.
|
||||
frame will need to be truncated */
|
||||
long maxsize=(max_target_bits+(bi->reservoir_bits-bm->minmax_reservoir))/8;
|
||||
bm->choice=choice=0;
|
||||
|
||||
if(oggpack_bytes(vbi->packetblob[choice])>maxsize){
|
||||
|
||||
oggpack_writetrunc(vbi->packetblob[choice],maxsize*8);
|
||||
this_bits=oggpack_bytes(vbi->packetblob[choice])*8;
|
||||
}
|
||||
}else{
|
||||
long minsize=(min_target_bits-bm->minmax_reservoir+7)/8;
|
||||
if(choice>=PACKETBLOBS)
|
||||
choice=PACKETBLOBS-1;
|
||||
|
||||
bm->choice=choice;
|
||||
|
||||
/* prop up bitrate according to demand. pad this frame out with zeroes */
|
||||
minsize-=oggpack_bytes(vbi->packetblob[choice]);
|
||||
while(minsize-->0)oggpack_write(vbi->packetblob[choice],0,8);
|
||||
this_bits=oggpack_bytes(vbi->packetblob[choice])*8;
|
||||
|
||||
}
|
||||
|
||||
/* now we have the final packet and the final packet size. Update statistics */
|
||||
/* min and max reservoir */
|
||||
if(bm->min_bitsper>0 || bm->max_bitsper>0){
|
||||
|
||||
if(max_target_bits>0 && this_bits>max_target_bits){
|
||||
bm->minmax_reservoir+=(this_bits-max_target_bits);
|
||||
}else if(min_target_bits>0 && this_bits<min_target_bits){
|
||||
bm->minmax_reservoir+=(this_bits-min_target_bits);
|
||||
}else{
|
||||
/* inbetween; we want to take reservoir toward but not past desired_fill */
|
||||
if(bm->minmax_reservoir>desired_fill){
|
||||
if(max_target_bits>0){ /* logical bulletproofing against initialization state */
|
||||
bm->minmax_reservoir+=(this_bits-max_target_bits);
|
||||
if(bm->minmax_reservoir<desired_fill)bm->minmax_reservoir=desired_fill;
|
||||
}else{
|
||||
bm->minmax_reservoir=desired_fill;
|
||||
}
|
||||
}else{
|
||||
if(min_target_bits>0){ /* logical bulletproofing against initialization state */
|
||||
bm->minmax_reservoir+=(this_bits-min_target_bits);
|
||||
if(bm->minmax_reservoir>desired_fill)bm->minmax_reservoir=desired_fill;
|
||||
}else{
|
||||
bm->minmax_reservoir=desired_fill;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* avg reservoir */
|
||||
if(bm->avg_bitsper>0){
|
||||
long avg_target_bits=(vb->W?bm->avg_bitsper*bm->short_per_long:bm->avg_bitsper);
|
||||
bm->avg_reservoir+=this_bits-avg_target_bits;
|
||||
}
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
int vorbis_bitrate_flushpacket(vorbis_dsp_state *vd,ogg_packet *op){
|
||||
private_state *b=vd->backend_state;
|
||||
bitrate_manager_state *bm=&b->bms;
|
||||
vorbis_block *vb=bm->vb;
|
||||
int choice=PACKETBLOBS/2;
|
||||
if(!vb)return 0;
|
||||
|
||||
if(op){
|
||||
vorbis_block_internal *vbi=vb->internal;
|
||||
|
||||
if(vorbis_bitrate_managed(vb))
|
||||
choice=bm->choice;
|
||||
|
||||
op->packet=oggpack_get_buffer(vbi->packetblob[choice]);
|
||||
op->bytes=oggpack_bytes(vbi->packetblob[choice]);
|
||||
op->b_o_s=0;
|
||||
op->e_o_s=vb->eofflag;
|
||||
op->granulepos=vb->granulepos;
|
||||
op->packetno=vb->sequence; /* for sake of completeness */
|
||||
}
|
||||
|
||||
bm->vb=0;
|
||||
return(1);
|
||||
}
|
@ -1,59 +0,0 @@
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: bitrate tracking and management
|
||||
last mod: $Id: bitrate.h 13293 2007-07-24 00:09:47Z xiphmont $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
#ifndef _V_BITRATE_H_
|
||||
#define _V_BITRATE_H_
|
||||
|
||||
#include "vorbis/codec.h"
|
||||
#include "codec_internal.h"
|
||||
#include "os.h"
|
||||
|
||||
/* encode side bitrate tracking */
|
||||
typedef struct bitrate_manager_state {
|
||||
int managed;
|
||||
|
||||
long avg_reservoir;
|
||||
long minmax_reservoir;
|
||||
long avg_bitsper;
|
||||
long min_bitsper;
|
||||
long max_bitsper;
|
||||
|
||||
long short_per_long;
|
||||
double avgfloat;
|
||||
|
||||
vorbis_block *vb;
|
||||
int choice;
|
||||
} bitrate_manager_state;
|
||||
|
||||
typedef struct bitrate_manager_info{
|
||||
long avg_rate;
|
||||
long min_rate;
|
||||
long max_rate;
|
||||
long reservoir_bits;
|
||||
double reservoir_bias;
|
||||
|
||||
double slew_damp;
|
||||
|
||||
} bitrate_manager_info;
|
||||
|
||||
extern void vorbis_bitrate_init(vorbis_info *vi,bitrate_manager_state *bs);
|
||||
extern void vorbis_bitrate_clear(bitrate_manager_state *bs);
|
||||
extern int vorbis_bitrate_managed(vorbis_block *vb);
|
||||
extern int vorbis_bitrate_addblock(vorbis_block *vb);
|
||||
extern int vorbis_bitrate_flushpacket(vorbis_dsp_state *vd, ogg_packet *op);
|
||||
|
||||
#endif
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,490 +0,0 @@
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2015 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: basic codebook pack/unpack/code/decode operations
|
||||
last mod: $Id: codebook.c 19457 2015-03-03 00:15:29Z giles $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
#include <ogg/ogg.h>
|
||||
#include "vorbis/codec.h"
|
||||
#include "codebook.h"
|
||||
#include "scales.h"
|
||||
#include "misc.h"
|
||||
#include "os.h"
|
||||
|
||||
/* packs the given codebook into the bitstream **************************/
|
||||
|
||||
int vorbis_staticbook_pack(const static_codebook *c,oggpack_buffer *opb){
|
||||
long i,j;
|
||||
int ordered=0;
|
||||
|
||||
/* first the basic parameters */
|
||||
oggpack_write(opb,0x564342,24);
|
||||
oggpack_write(opb,c->dim,16);
|
||||
oggpack_write(opb,c->entries,24);
|
||||
|
||||
/* pack the codewords. There are two packings; length ordered and
|
||||
length random. Decide between the two now. */
|
||||
|
||||
for(i=1;i<c->entries;i++)
|
||||
if(c->lengthlist[i-1]==0 || c->lengthlist[i]<c->lengthlist[i-1])break;
|
||||
if(i==c->entries)ordered=1;
|
||||
|
||||
if(ordered){
|
||||
/* length ordered. We only need to say how many codewords of
|
||||
each length. The actual codewords are generated
|
||||
deterministically */
|
||||
|
||||
long count=0;
|
||||
oggpack_write(opb,1,1); /* ordered */
|
||||
oggpack_write(opb,c->lengthlist[0]-1,5); /* 1 to 32 */
|
||||
|
||||
for(i=1;i<c->entries;i++){
|
||||
char this=c->lengthlist[i];
|
||||
char last=c->lengthlist[i-1];
|
||||
if(this>last){
|
||||
for(j=last;j<this;j++){
|
||||
oggpack_write(opb,i-count,ov_ilog(c->entries-count));
|
||||
count=i;
|
||||
}
|
||||
}
|
||||
}
|
||||
oggpack_write(opb,i-count,ov_ilog(c->entries-count));
|
||||
|
||||
}else{
|
||||
/* length random. Again, we don't code the codeword itself, just
|
||||
the length. This time, though, we have to encode each length */
|
||||
oggpack_write(opb,0,1); /* unordered */
|
||||
|
||||
/* algortihmic mapping has use for 'unused entries', which we tag
|
||||
here. The algorithmic mapping happens as usual, but the unused
|
||||
entry has no codeword. */
|
||||
for(i=0;i<c->entries;i++)
|
||||
if(c->lengthlist[i]==0)break;
|
||||
|
||||
if(i==c->entries){
|
||||
oggpack_write(opb,0,1); /* no unused entries */
|
||||
for(i=0;i<c->entries;i++)
|
||||
oggpack_write(opb,c->lengthlist[i]-1,5);
|
||||
}else{
|
||||
oggpack_write(opb,1,1); /* we have unused entries; thus we tag */
|
||||
for(i=0;i<c->entries;i++){
|
||||
if(c->lengthlist[i]==0){
|
||||
oggpack_write(opb,0,1);
|
||||
}else{
|
||||
oggpack_write(opb,1,1);
|
||||
oggpack_write(opb,c->lengthlist[i]-1,5);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* is the entry number the desired return value, or do we have a
|
||||
mapping? If we have a mapping, what type? */
|
||||
oggpack_write(opb,c->maptype,4);
|
||||
switch(c->maptype){
|
||||
case 0:
|
||||
/* no mapping */
|
||||
break;
|
||||
case 1:case 2:
|
||||
/* implicitly populated value mapping */
|
||||
/* explicitly populated value mapping */
|
||||
|
||||
if(!c->quantlist){
|
||||
/* no quantlist? error */
|
||||
return(-1);
|
||||
}
|
||||
|
||||
/* values that define the dequantization */
|
||||
oggpack_write(opb,c->q_min,32);
|
||||
oggpack_write(opb,c->q_delta,32);
|
||||
oggpack_write(opb,c->q_quant-1,4);
|
||||
oggpack_write(opb,c->q_sequencep,1);
|
||||
|
||||
{
|
||||
int quantvals;
|
||||
switch(c->maptype){
|
||||
case 1:
|
||||
/* a single column of (c->entries/c->dim) quantized values for
|
||||
building a full value list algorithmically (square lattice) */
|
||||
quantvals=_book_maptype1_quantvals(c);
|
||||
break;
|
||||
case 2:
|
||||
/* every value (c->entries*c->dim total) specified explicitly */
|
||||
quantvals=c->entries*c->dim;
|
||||
break;
|
||||
default: /* NOT_REACHABLE */
|
||||
quantvals=-1;
|
||||
}
|
||||
|
||||
/* quantized values */
|
||||
for(i=0;i<quantvals;i++)
|
||||
oggpack_write(opb,labs(c->quantlist[i]),c->q_quant);
|
||||
|
||||
}
|
||||
break;
|
||||
default:
|
||||
/* error case; we don't have any other map types now */
|
||||
return(-1);
|
||||
}
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
/* unpacks a codebook from the packet buffer into the codebook struct,
|
||||
readies the codebook auxiliary structures for decode *************/
|
||||
static_codebook *vorbis_staticbook_unpack(oggpack_buffer *opb){
|
||||
long i,j;
|
||||
static_codebook *s=_ogg_calloc(1,sizeof(*s));
|
||||
s->allocedp=1;
|
||||
|
||||
/* make sure alignment is correct */
|
||||
if(oggpack_read(opb,24)!=0x564342)goto _eofout;
|
||||
|
||||
/* first the basic parameters */
|
||||
s->dim=oggpack_read(opb,16);
|
||||
s->entries=oggpack_read(opb,24);
|
||||
if(s->entries==-1)goto _eofout;
|
||||
|
||||
if(ov_ilog(s->dim)+ov_ilog(s->entries)>24)goto _eofout;
|
||||
|
||||
/* codeword ordering.... length ordered or unordered? */
|
||||
switch((int)oggpack_read(opb,1)){
|
||||
case 0:{
|
||||
long unused;
|
||||
/* allocated but unused entries? */
|
||||
unused=oggpack_read(opb,1);
|
||||
if((s->entries*(unused?1:5)+7)>>3>opb->storage-oggpack_bytes(opb))
|
||||
goto _eofout;
|
||||
/* unordered */
|
||||
s->lengthlist=_ogg_malloc(sizeof(*s->lengthlist)*s->entries);
|
||||
|
||||
/* allocated but unused entries? */
|
||||
if(unused){
|
||||
/* yes, unused entries */
|
||||
|
||||
for(i=0;i<s->entries;i++){
|
||||
if(oggpack_read(opb,1)){
|
||||
long num=oggpack_read(opb,5);
|
||||
if(num==-1)goto _eofout;
|
||||
s->lengthlist[i]=num+1;
|
||||
}else
|
||||
s->lengthlist[i]=0;
|
||||
}
|
||||
}else{
|
||||
/* all entries used; no tagging */
|
||||
for(i=0;i<s->entries;i++){
|
||||
long num=oggpack_read(opb,5);
|
||||
if(num==-1)goto _eofout;
|
||||
s->lengthlist[i]=num+1;
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case 1:
|
||||
/* ordered */
|
||||
{
|
||||
long length=oggpack_read(opb,5)+1;
|
||||
if(length==0)goto _eofout;
|
||||
s->lengthlist=_ogg_malloc(sizeof(*s->lengthlist)*s->entries);
|
||||
|
||||
for(i=0;i<s->entries;){
|
||||
long num=oggpack_read(opb,ov_ilog(s->entries-i));
|
||||
if(num==-1)goto _eofout;
|
||||
if(length>32 || num>s->entries-i ||
|
||||
(num>0 && (num-1)>>(length-1)>1)){
|
||||
goto _errout;
|
||||
}
|
||||
if(length>32)goto _errout;
|
||||
for(j=0;j<num;j++,i++)
|
||||
s->lengthlist[i]=length;
|
||||
length++;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
/* EOF */
|
||||
goto _eofout;
|
||||
}
|
||||
|
||||
/* Do we have a mapping to unpack? */
|
||||
switch((s->maptype=oggpack_read(opb,4))){
|
||||
case 0:
|
||||
/* no mapping */
|
||||
break;
|
||||
case 1: case 2:
|
||||
/* implicitly populated value mapping */
|
||||
/* explicitly populated value mapping */
|
||||
|
||||
s->q_min=oggpack_read(opb,32);
|
||||
s->q_delta=oggpack_read(opb,32);
|
||||
s->q_quant=oggpack_read(opb,4)+1;
|
||||
s->q_sequencep=oggpack_read(opb,1);
|
||||
if(s->q_sequencep==-1)goto _eofout;
|
||||
|
||||
{
|
||||
int quantvals=0;
|
||||
switch(s->maptype){
|
||||
case 1:
|
||||
quantvals=(s->dim==0?0:_book_maptype1_quantvals(s));
|
||||
break;
|
||||
case 2:
|
||||
quantvals=s->entries*s->dim;
|
||||
break;
|
||||
}
|
||||
|
||||
/* quantized values */
|
||||
if(((quantvals*s->q_quant+7)>>3)>opb->storage-oggpack_bytes(opb))
|
||||
goto _eofout;
|
||||
s->quantlist=_ogg_malloc(sizeof(*s->quantlist)*quantvals);
|
||||
for(i=0;i<quantvals;i++)
|
||||
s->quantlist[i]=oggpack_read(opb,s->q_quant);
|
||||
|
||||
if(quantvals&&s->quantlist[quantvals-1]==-1)goto _eofout;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
goto _errout;
|
||||
}
|
||||
|
||||
/* all set */
|
||||
return(s);
|
||||
|
||||
_errout:
|
||||
_eofout:
|
||||
vorbis_staticbook_destroy(s);
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
/* returns the number of bits ************************************************/
|
||||
int vorbis_book_encode(codebook *book, int a, oggpack_buffer *b){
|
||||
if(a<0 || a>=book->c->entries)return(0);
|
||||
oggpack_write(b,book->codelist[a],book->c->lengthlist[a]);
|
||||
return(book->c->lengthlist[a]);
|
||||
}
|
||||
|
||||
/* the 'eliminate the decode tree' optimization actually requires the
|
||||
codewords to be MSb first, not LSb. This is an annoying inelegancy
|
||||
(and one of the first places where carefully thought out design
|
||||
turned out to be wrong; Vorbis II and future Ogg codecs should go
|
||||
to an MSb bitpacker), but not actually the huge hit it appears to
|
||||
be. The first-stage decode table catches most words so that
|
||||
bitreverse is not in the main execution path. */
|
||||
|
||||
static ogg_uint32_t bitreverse(ogg_uint32_t x){
|
||||
x= ((x>>16)&0x0000ffff) | ((x<<16)&0xffff0000);
|
||||
x= ((x>> 8)&0x00ff00ff) | ((x<< 8)&0xff00ff00);
|
||||
x= ((x>> 4)&0x0f0f0f0f) | ((x<< 4)&0xf0f0f0f0);
|
||||
x= ((x>> 2)&0x33333333) | ((x<< 2)&0xcccccccc);
|
||||
return((x>> 1)&0x55555555) | ((x<< 1)&0xaaaaaaaa);
|
||||
}
|
||||
|
||||
STIN long decode_packed_entry_number(codebook *book, oggpack_buffer *b){
|
||||
int read=book->dec_maxlength;
|
||||
long lo,hi;
|
||||
long lok = oggpack_look(b,book->dec_firsttablen);
|
||||
|
||||
if (lok >= 0) {
|
||||
long entry = book->dec_firsttable[lok];
|
||||
if(entry&0x80000000UL){
|
||||
lo=(entry>>15)&0x7fff;
|
||||
hi=book->used_entries-(entry&0x7fff);
|
||||
}else{
|
||||
oggpack_adv(b, book->dec_codelengths[entry-1]);
|
||||
return(entry-1);
|
||||
}
|
||||
}else{
|
||||
lo=0;
|
||||
hi=book->used_entries;
|
||||
}
|
||||
|
||||
/* Single entry codebooks use a firsttablen of 1 and a
|
||||
dec_maxlength of 1. If a single-entry codebook gets here (due to
|
||||
failure to read one bit above), the next look attempt will also
|
||||
fail and we'll correctly kick out instead of trying to walk the
|
||||
underformed tree */
|
||||
|
||||
lok = oggpack_look(b, read);
|
||||
|
||||
while(lok<0 && read>1)
|
||||
lok = oggpack_look(b, --read);
|
||||
if(lok<0)return -1;
|
||||
|
||||
/* bisect search for the codeword in the ordered list */
|
||||
{
|
||||
ogg_uint32_t testword=bitreverse((ogg_uint32_t)lok);
|
||||
|
||||
while(hi-lo>1){
|
||||
long p=(hi-lo)>>1;
|
||||
long test=book->codelist[lo+p]>testword;
|
||||
lo+=p&(test-1);
|
||||
hi-=p&(-test);
|
||||
}
|
||||
|
||||
if(book->dec_codelengths[lo]<=read){
|
||||
oggpack_adv(b, book->dec_codelengths[lo]);
|
||||
return(lo);
|
||||
}
|
||||
}
|
||||
|
||||
oggpack_adv(b, read);
|
||||
|
||||
return(-1);
|
||||
}
|
||||
|
||||
/* Decode side is specced and easier, because we don't need to find
|
||||
matches using different criteria; we simply read and map. There are
|
||||
two things we need to do 'depending':
|
||||
|
||||
We may need to support interleave. We don't really, but it's
|
||||
convenient to do it here rather than rebuild the vector later.
|
||||
|
||||
Cascades may be additive or multiplicitive; this is not inherent in
|
||||
the codebook, but set in the code using the codebook. Like
|
||||
interleaving, it's easiest to do it here.
|
||||
addmul==0 -> declarative (set the value)
|
||||
addmul==1 -> additive
|
||||
addmul==2 -> multiplicitive */
|
||||
|
||||
/* returns the [original, not compacted] entry number or -1 on eof *********/
|
||||
long vorbis_book_decode(codebook *book, oggpack_buffer *b){
|
||||
if(book->used_entries>0){
|
||||
long packed_entry=decode_packed_entry_number(book,b);
|
||||
if(packed_entry>=0)
|
||||
return(book->dec_index[packed_entry]);
|
||||
}
|
||||
|
||||
/* if there's no dec_index, the codebook unpacking isn't collapsed */
|
||||
return(-1);
|
||||
}
|
||||
|
||||
/* returns 0 on OK or -1 on eof *************************************/
|
||||
/* decode vector / dim granularity gaurding is done in the upper layer */
|
||||
long vorbis_book_decodevs_add(codebook *book,float *a,oggpack_buffer *b,int n){
|
||||
if(book->used_entries>0){
|
||||
int step=n/book->dim;
|
||||
long *entry = alloca(sizeof(*entry)*step);
|
||||
float **t = alloca(sizeof(*t)*step);
|
||||
int i,j,o;
|
||||
|
||||
for (i = 0; i < step; i++) {
|
||||
entry[i]=decode_packed_entry_number(book,b);
|
||||
if(entry[i]==-1)return(-1);
|
||||
t[i] = book->valuelist+entry[i]*book->dim;
|
||||
}
|
||||
for(i=0,o=0;i<book->dim;i++,o+=step)
|
||||
for (j=0;j<step;j++)
|
||||
a[o+j]+=t[j][i];
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
/* decode vector / dim granularity gaurding is done in the upper layer */
|
||||
long vorbis_book_decodev_add(codebook *book,float *a,oggpack_buffer *b,int n){
|
||||
if(book->used_entries>0){
|
||||
int i,j,entry;
|
||||
float *t;
|
||||
|
||||
if(book->dim>8){
|
||||
for(i=0;i<n;){
|
||||
entry = decode_packed_entry_number(book,b);
|
||||
if(entry==-1)return(-1);
|
||||
t = book->valuelist+entry*book->dim;
|
||||
for (j=0;j<book->dim;)
|
||||
a[i++]+=t[j++];
|
||||
}
|
||||
}else{
|
||||
for(i=0;i<n;){
|
||||
entry = decode_packed_entry_number(book,b);
|
||||
if(entry==-1)return(-1);
|
||||
t = book->valuelist+entry*book->dim;
|
||||
j=0;
|
||||
switch((int)book->dim){
|
||||
case 8:
|
||||
a[i++]+=t[j++];
|
||||
case 7:
|
||||
a[i++]+=t[j++];
|
||||
case 6:
|
||||
a[i++]+=t[j++];
|
||||
case 5:
|
||||
a[i++]+=t[j++];
|
||||
case 4:
|
||||
a[i++]+=t[j++];
|
||||
case 3:
|
||||
a[i++]+=t[j++];
|
||||
case 2:
|
||||
a[i++]+=t[j++];
|
||||
case 1:
|
||||
a[i++]+=t[j++];
|
||||
case 0:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
/* unlike the others, we guard against n not being an integer number
|
||||
of <dim> internally rather than in the upper layer (called only by
|
||||
floor0) */
|
||||
long vorbis_book_decodev_set(codebook *book,float *a,oggpack_buffer *b,int n){
|
||||
if(book->used_entries>0){
|
||||
int i,j,entry;
|
||||
float *t;
|
||||
|
||||
for(i=0;i<n;){
|
||||
entry = decode_packed_entry_number(book,b);
|
||||
if(entry==-1)return(-1);
|
||||
t = book->valuelist+entry*book->dim;
|
||||
for (j=0;i<n && j<book->dim;){
|
||||
a[i++]=t[j++];
|
||||
}
|
||||
}
|
||||
}else{
|
||||
int i;
|
||||
|
||||
for(i=0;i<n;){
|
||||
a[i++]=0.f;
|
||||
}
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
long vorbis_book_decodevv_add(codebook *book,float **a,long offset,int ch,
|
||||
oggpack_buffer *b,int n){
|
||||
|
||||
long i,j,entry;
|
||||
int chptr=0;
|
||||
if(book->used_entries>0){
|
||||
for(i=offset/ch;i<(offset+n)/ch;){
|
||||
entry = decode_packed_entry_number(book,b);
|
||||
if(entry==-1)return(-1);
|
||||
{
|
||||
const float *t = book->valuelist+entry*book->dim;
|
||||
for (j=0;j<book->dim;j++){
|
||||
a[chptr++][i]+=t[j];
|
||||
if(chptr==ch){
|
||||
chptr=0;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return(0);
|
||||
}
|
@ -1,118 +0,0 @@
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2015 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: basic shared codebook operations
|
||||
last mod: $Id: codebook.h 19457 2015-03-03 00:15:29Z giles $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
#ifndef _V_CODEBOOK_H_
|
||||
#define _V_CODEBOOK_H_
|
||||
|
||||
#include <ogg/ogg.h>
|
||||
|
||||
/* This structure encapsulates huffman and VQ style encoding books; it
|
||||
doesn't do anything specific to either.
|
||||
|
||||
valuelist/quantlist are nonNULL (and q_* significant) only if
|
||||
there's entry->value mapping to be done.
|
||||
|
||||
If encode-side mapping must be done (and thus the entry needs to be
|
||||
hunted), the auxiliary encode pointer will point to a decision
|
||||
tree. This is true of both VQ and huffman, but is mostly useful
|
||||
with VQ.
|
||||
|
||||
*/
|
||||
|
||||
typedef struct static_codebook{
|
||||
long dim; /* codebook dimensions (elements per vector) */
|
||||
long entries; /* codebook entries */
|
||||
char *lengthlist; /* codeword lengths in bits */
|
||||
|
||||
/* mapping ***************************************************************/
|
||||
int maptype; /* 0=none
|
||||
1=implicitly populated values from map column
|
||||
2=listed arbitrary values */
|
||||
|
||||
/* The below does a linear, single monotonic sequence mapping. */
|
||||
long q_min; /* packed 32 bit float; quant value 0 maps to minval */
|
||||
long q_delta; /* packed 32 bit float; val 1 - val 0 == delta */
|
||||
int q_quant; /* bits: 0 < quant <= 16 */
|
||||
int q_sequencep; /* bitflag */
|
||||
|
||||
long *quantlist; /* map == 1: (int)(entries^(1/dim)) element column map
|
||||
map == 2: list of dim*entries quantized entry vals
|
||||
*/
|
||||
int allocedp;
|
||||
} static_codebook;
|
||||
|
||||
typedef struct codebook{
|
||||
long dim; /* codebook dimensions (elements per vector) */
|
||||
long entries; /* codebook entries */
|
||||
long used_entries; /* populated codebook entries */
|
||||
const static_codebook *c;
|
||||
|
||||
/* for encode, the below are entry-ordered, fully populated */
|
||||
/* for decode, the below are ordered by bitreversed codeword and only
|
||||
used entries are populated */
|
||||
float *valuelist; /* list of dim*entries actual entry values */
|
||||
ogg_uint32_t *codelist; /* list of bitstream codewords for each entry */
|
||||
|
||||
int *dec_index; /* only used if sparseness collapsed */
|
||||
char *dec_codelengths;
|
||||
ogg_uint32_t *dec_firsttable;
|
||||
int dec_firsttablen;
|
||||
int dec_maxlength;
|
||||
|
||||
/* The current encoder uses only centered, integer-only lattice books. */
|
||||
int quantvals;
|
||||
int minval;
|
||||
int delta;
|
||||
} codebook;
|
||||
|
||||
extern void vorbis_staticbook_destroy(static_codebook *b);
|
||||
extern int vorbis_book_init_encode(codebook *dest,const static_codebook *source);
|
||||
extern int vorbis_book_init_decode(codebook *dest,const static_codebook *source);
|
||||
extern void vorbis_book_clear(codebook *b);
|
||||
|
||||
extern float *_book_unquantize(const static_codebook *b,int n,int *map);
|
||||
extern float *_book_logdist(const static_codebook *b,float *vals);
|
||||
extern float _float32_unpack(long val);
|
||||
extern long _float32_pack(float val);
|
||||
extern int _best(codebook *book, float *a, int step);
|
||||
extern long _book_maptype1_quantvals(const static_codebook *b);
|
||||
|
||||
extern int vorbis_book_besterror(codebook *book,float *a,int step,int addmul);
|
||||
extern long vorbis_book_codeword(codebook *book,int entry);
|
||||
extern long vorbis_book_codelen(codebook *book,int entry);
|
||||
|
||||
|
||||
|
||||
extern int vorbis_staticbook_pack(const static_codebook *c,oggpack_buffer *b);
|
||||
extern static_codebook *vorbis_staticbook_unpack(oggpack_buffer *b);
|
||||
|
||||
extern int vorbis_book_encode(codebook *book, int a, oggpack_buffer *b);
|
||||
|
||||
extern long vorbis_book_decode(codebook *book, oggpack_buffer *b);
|
||||
extern long vorbis_book_decodevs_add(codebook *book, float *a,
|
||||
oggpack_buffer *b,int n);
|
||||
extern long vorbis_book_decodev_set(codebook *book, float *a,
|
||||
oggpack_buffer *b,int n);
|
||||
extern long vorbis_book_decodev_add(codebook *book, float *a,
|
||||
oggpack_buffer *b,int n);
|
||||
extern long vorbis_book_decodevv_add(codebook *book, float **a,
|
||||
long off,int ch,
|
||||
oggpack_buffer *b,int n);
|
||||
|
||||
|
||||
|
||||
#endif
|
@ -1,167 +0,0 @@
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: libvorbis codec headers
|
||||
last mod: $Id: codec_internal.h 16227 2009-07-08 06:58:46Z xiphmont $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
#ifndef _V_CODECI_H_
|
||||
#define _V_CODECI_H_
|
||||
|
||||
#include "envelope.h"
|
||||
#include "codebook.h"
|
||||
|
||||
#define BLOCKTYPE_IMPULSE 0
|
||||
#define BLOCKTYPE_PADDING 1
|
||||
#define BLOCKTYPE_TRANSITION 0
|
||||
#define BLOCKTYPE_LONG 1
|
||||
|
||||
#define PACKETBLOBS 15
|
||||
|
||||
typedef struct vorbis_block_internal{
|
||||
float **pcmdelay; /* this is a pointer into local storage */
|
||||
float ampmax;
|
||||
int blocktype;
|
||||
|
||||
oggpack_buffer *packetblob[PACKETBLOBS]; /* initialized, must be freed;
|
||||
blob [PACKETBLOBS/2] points to
|
||||
the oggpack_buffer in the
|
||||
main vorbis_block */
|
||||
} vorbis_block_internal;
|
||||
|
||||
typedef void vorbis_look_floor;
|
||||
typedef void vorbis_look_residue;
|
||||
typedef void vorbis_look_transform;
|
||||
|
||||
/* mode ************************************************************/
|
||||
typedef struct {
|
||||
int blockflag;
|
||||
int windowtype;
|
||||
int transformtype;
|
||||
int mapping;
|
||||
} vorbis_info_mode;
|
||||
|
||||
typedef void vorbis_info_floor;
|
||||
typedef void vorbis_info_residue;
|
||||
typedef void vorbis_info_mapping;
|
||||
|
||||
#include "psy.h"
|
||||
#include "bitrate.h"
|
||||
|
||||
typedef struct private_state {
|
||||
/* local lookup storage */
|
||||
envelope_lookup *ve; /* envelope lookup */
|
||||
int window[2];
|
||||
vorbis_look_transform **transform[2]; /* block, type */
|
||||
drft_lookup fft_look[2];
|
||||
|
||||
int modebits;
|
||||
vorbis_look_floor **flr;
|
||||
vorbis_look_residue **residue;
|
||||
vorbis_look_psy *psy;
|
||||
vorbis_look_psy_global *psy_g_look;
|
||||
|
||||
/* local storage, only used on the encoding side. This way the
|
||||
application does not need to worry about freeing some packets'
|
||||
memory and not others'; packet storage is always tracked.
|
||||
Cleared next call to a _dsp_ function */
|
||||
unsigned char *header;
|
||||
unsigned char *header1;
|
||||
unsigned char *header2;
|
||||
|
||||
bitrate_manager_state bms;
|
||||
|
||||
ogg_int64_t sample_count;
|
||||
} private_state;
|
||||
|
||||
/* codec_setup_info contains all the setup information specific to the
|
||||
specific compression/decompression mode in progress (eg,
|
||||
psychoacoustic settings, channel setup, options, codebook
|
||||
etc).
|
||||
*********************************************************************/
|
||||
|
||||
#include "highlevel.h"
|
||||
typedef struct codec_setup_info {
|
||||
|
||||
/* Vorbis supports only short and long blocks, but allows the
|
||||
encoder to choose the sizes */
|
||||
|
||||
long blocksizes[2];
|
||||
|
||||
/* modes are the primary means of supporting on-the-fly different
|
||||
blocksizes, different channel mappings (LR or M/A),
|
||||
different residue backends, etc. Each mode consists of a
|
||||
blocksize flag and a mapping (along with the mapping setup */
|
||||
|
||||
int modes;
|
||||
int maps;
|
||||
int floors;
|
||||
int residues;
|
||||
int books;
|
||||
int psys; /* encode only */
|
||||
|
||||
vorbis_info_mode *mode_param[64];
|
||||
int map_type[64];
|
||||
vorbis_info_mapping *map_param[64];
|
||||
int floor_type[64];
|
||||
vorbis_info_floor *floor_param[64];
|
||||
int residue_type[64];
|
||||
vorbis_info_residue *residue_param[64];
|
||||
static_codebook *book_param[256];
|
||||
codebook *fullbooks;
|
||||
|
||||
vorbis_info_psy *psy_param[4]; /* encode only */
|
||||
vorbis_info_psy_global psy_g_param;
|
||||
|
||||
bitrate_manager_info bi;
|
||||
highlevel_encode_setup hi; /* used only by vorbisenc.c. It's a
|
||||
highly redundant structure, but
|
||||
improves clarity of program flow. */
|
||||
int halfrate_flag; /* painless downsample for decode */
|
||||
} codec_setup_info;
|
||||
|
||||
extern vorbis_look_psy_global *_vp_global_look(vorbis_info *vi);
|
||||
extern void _vp_global_free(vorbis_look_psy_global *look);
|
||||
|
||||
|
||||
|
||||
typedef struct {
|
||||
int sorted_index[VIF_POSIT+2];
|
||||
int forward_index[VIF_POSIT+2];
|
||||
int reverse_index[VIF_POSIT+2];
|
||||
|
||||
int hineighbor[VIF_POSIT];
|
||||
int loneighbor[VIF_POSIT];
|
||||
int posts;
|
||||
|
||||
int n;
|
||||
int quant_q;
|
||||
vorbis_info_floor1 *vi;
|
||||
|
||||
long phrasebits;
|
||||
long postbits;
|
||||
long frames;
|
||||
} vorbis_look_floor1;
|
||||
|
||||
|
||||
|
||||
extern int *floor1_fit(vorbis_block *vb,vorbis_look_floor1 *look,
|
||||
const float *logmdct, /* in */
|
||||
const float *logmask);
|
||||
extern int *floor1_interpolate_fit(vorbis_block *vb,vorbis_look_floor1 *look,
|
||||
int *A,int *B,
|
||||
int del);
|
||||
extern int floor1_encode(oggpack_buffer *opb,vorbis_block *vb,
|
||||
vorbis_look_floor1 *look,
|
||||
int *post,int *ilogmask);
|
||||
#endif
|
@ -1,375 +0,0 @@
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: PCM data envelope analysis
|
||||
last mod: $Id: envelope.c 16227 2009-07-08 06:58:46Z xiphmont $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <math.h>
|
||||
#include <ogg/ogg.h>
|
||||
#include "vorbis/codec.h"
|
||||
#include "codec_internal.h"
|
||||
|
||||
#include "os.h"
|
||||
#include "scales.h"
|
||||
#include "envelope.h"
|
||||
#include "mdct.h"
|
||||
#include "misc.h"
|
||||
|
||||
void _ve_envelope_init(envelope_lookup *e,vorbis_info *vi){
|
||||
codec_setup_info *ci=vi->codec_setup;
|
||||
vorbis_info_psy_global *gi=&ci->psy_g_param;
|
||||
int ch=vi->channels;
|
||||
int i,j;
|
||||
int n=e->winlength=128;
|
||||
e->searchstep=64; /* not random */
|
||||
|
||||
e->minenergy=gi->preecho_minenergy;
|
||||
e->ch=ch;
|
||||
e->storage=128;
|
||||
e->cursor=ci->blocksizes[1]/2;
|
||||
e->mdct_win=_ogg_calloc(n,sizeof(*e->mdct_win));
|
||||
mdct_init(&e->mdct,n);
|
||||
|
||||
for(i=0;i<n;i++){
|
||||
e->mdct_win[i]=sin(i/(n-1.)*M_PI);
|
||||
e->mdct_win[i]*=e->mdct_win[i];
|
||||
}
|
||||
|
||||
/* magic follows */
|
||||
e->band[0].begin=2; e->band[0].end=4;
|
||||
e->band[1].begin=4; e->band[1].end=5;
|
||||
e->band[2].begin=6; e->band[2].end=6;
|
||||
e->band[3].begin=9; e->band[3].end=8;
|
||||
e->band[4].begin=13; e->band[4].end=8;
|
||||
e->band[5].begin=17; e->band[5].end=8;
|
||||
e->band[6].begin=22; e->band[6].end=8;
|
||||
|
||||
for(j=0;j<VE_BANDS;j++){
|
||||
n=e->band[j].end;
|
||||
e->band[j].window=_ogg_malloc(n*sizeof(*e->band[0].window));
|
||||
for(i=0;i<n;i++){
|
||||
e->band[j].window[i]=sin((i+.5)/n*M_PI);
|
||||
e->band[j].total+=e->band[j].window[i];
|
||||
}
|
||||
e->band[j].total=1./e->band[j].total;
|
||||
}
|
||||
|
||||
e->filter=_ogg_calloc(VE_BANDS*ch,sizeof(*e->filter));
|
||||
e->mark=_ogg_calloc(e->storage,sizeof(*e->mark));
|
||||
|
||||
}
|
||||
|
||||
void _ve_envelope_clear(envelope_lookup *e){
|
||||
int i;
|
||||
mdct_clear(&e->mdct);
|
||||
for(i=0;i<VE_BANDS;i++)
|
||||
_ogg_free(e->band[i].window);
|
||||
_ogg_free(e->mdct_win);
|
||||
_ogg_free(e->filter);
|
||||
_ogg_free(e->mark);
|
||||
memset(e,0,sizeof(*e));
|
||||
}
|
||||
|
||||
/* fairly straight threshhold-by-band based until we find something
|
||||
that works better and isn't patented. */
|
||||
|
||||
static int _ve_amp(envelope_lookup *ve,
|
||||
vorbis_info_psy_global *gi,
|
||||
float *data,
|
||||
envelope_band *bands,
|
||||
envelope_filter_state *filters){
|
||||
long n=ve->winlength;
|
||||
int ret=0;
|
||||
long i,j;
|
||||
float decay;
|
||||
|
||||
/* we want to have a 'minimum bar' for energy, else we're just
|
||||
basing blocks on quantization noise that outweighs the signal
|
||||
itself (for low power signals) */
|
||||
|
||||
float minV=ve->minenergy;
|
||||
float *vec=alloca(n*sizeof(*vec));
|
||||
|
||||
/* stretch is used to gradually lengthen the number of windows
|
||||
considered prevoius-to-potential-trigger */
|
||||
int stretch=max(VE_MINSTRETCH,ve->stretch/2);
|
||||
float penalty=gi->stretch_penalty-(ve->stretch/2-VE_MINSTRETCH);
|
||||
if(penalty<0.f)penalty=0.f;
|
||||
if(penalty>gi->stretch_penalty)penalty=gi->stretch_penalty;
|
||||
|
||||
/*_analysis_output_always("lpcm",seq2,data,n,0,0,
|
||||
totalshift+pos*ve->searchstep);*/
|
||||
|
||||
/* window and transform */
|
||||
for(i=0;i<n;i++)
|
||||
vec[i]=data[i]*ve->mdct_win[i];
|
||||
mdct_forward(&ve->mdct,vec,vec);
|
||||
|
||||
/*_analysis_output_always("mdct",seq2,vec,n/2,0,1,0); */
|
||||
|
||||
/* near-DC spreading function; this has nothing to do with
|
||||
psychoacoustics, just sidelobe leakage and window size */
|
||||
{
|
||||
float temp=vec[0]*vec[0]+.7*vec[1]*vec[1]+.2*vec[2]*vec[2];
|
||||
int ptr=filters->nearptr;
|
||||
|
||||
/* the accumulation is regularly refreshed from scratch to avoid
|
||||
floating point creep */
|
||||
if(ptr==0){
|
||||
decay=filters->nearDC_acc=filters->nearDC_partialacc+temp;
|
||||
filters->nearDC_partialacc=temp;
|
||||
}else{
|
||||
decay=filters->nearDC_acc+=temp;
|
||||
filters->nearDC_partialacc+=temp;
|
||||
}
|
||||
filters->nearDC_acc-=filters->nearDC[ptr];
|
||||
filters->nearDC[ptr]=temp;
|
||||
|
||||
decay*=(1./(VE_NEARDC+1));
|
||||
filters->nearptr++;
|
||||
if(filters->nearptr>=VE_NEARDC)filters->nearptr=0;
|
||||
decay=todB(&decay)*.5-15.f;
|
||||
}
|
||||
|
||||
/* perform spreading and limiting, also smooth the spectrum. yes,
|
||||
the MDCT results in all real coefficients, but it still *behaves*
|
||||
like real/imaginary pairs */
|
||||
for(i=0;i<n/2;i+=2){
|
||||
float val=vec[i]*vec[i]+vec[i+1]*vec[i+1];
|
||||
val=todB(&val)*.5f;
|
||||
if(val<decay)val=decay;
|
||||
if(val<minV)val=minV;
|
||||
vec[i>>1]=val;
|
||||
decay-=8.;
|
||||
}
|
||||
|
||||
/*_analysis_output_always("spread",seq2++,vec,n/4,0,0,0);*/
|
||||
|
||||
/* perform preecho/postecho triggering by band */
|
||||
for(j=0;j<VE_BANDS;j++){
|
||||
float acc=0.;
|
||||
float valmax,valmin;
|
||||
|
||||
/* accumulate amplitude */
|
||||
for(i=0;i<bands[j].end;i++)
|
||||
acc+=vec[i+bands[j].begin]*bands[j].window[i];
|
||||
|
||||
acc*=bands[j].total;
|
||||
|
||||
/* convert amplitude to delta */
|
||||
{
|
||||
int p,this=filters[j].ampptr;
|
||||
float postmax,postmin,premax=-99999.f,premin=99999.f;
|
||||
|
||||
p=this;
|
||||
p--;
|
||||
if(p<0)p+=VE_AMP;
|
||||
postmax=max(acc,filters[j].ampbuf[p]);
|
||||
postmin=min(acc,filters[j].ampbuf[p]);
|
||||
|
||||
for(i=0;i<stretch;i++){
|
||||
p--;
|
||||
if(p<0)p+=VE_AMP;
|
||||
premax=max(premax,filters[j].ampbuf[p]);
|
||||
premin=min(premin,filters[j].ampbuf[p]);
|
||||
}
|
||||
|
||||
valmin=postmin-premin;
|
||||
valmax=postmax-premax;
|
||||
|
||||
/*filters[j].markers[pos]=valmax;*/
|
||||
filters[j].ampbuf[this]=acc;
|
||||
filters[j].ampptr++;
|
||||
if(filters[j].ampptr>=VE_AMP)filters[j].ampptr=0;
|
||||
}
|
||||
|
||||
/* look at min/max, decide trigger */
|
||||
if(valmax>gi->preecho_thresh[j]+penalty){
|
||||
ret|=1;
|
||||
ret|=4;
|
||||
}
|
||||
if(valmin<gi->postecho_thresh[j]-penalty)ret|=2;
|
||||
}
|
||||
|
||||
return(ret);
|
||||
}
|
||||
|
||||
#if 0
|
||||
static int seq=0;
|
||||
static ogg_int64_t totalshift=-1024;
|
||||
#endif
|
||||
|
||||
long _ve_envelope_search(vorbis_dsp_state *v){
|
||||
vorbis_info *vi=v->vi;
|
||||
codec_setup_info *ci=vi->codec_setup;
|
||||
vorbis_info_psy_global *gi=&ci->psy_g_param;
|
||||
envelope_lookup *ve=((private_state *)(v->backend_state))->ve;
|
||||
long i,j;
|
||||
|
||||
int first=ve->current/ve->searchstep;
|
||||
int last=v->pcm_current/ve->searchstep-VE_WIN;
|
||||
if(first<0)first=0;
|
||||
|
||||
/* make sure we have enough storage to match the PCM */
|
||||
if(last+VE_WIN+VE_POST>ve->storage){
|
||||
ve->storage=last+VE_WIN+VE_POST; /* be sure */
|
||||
ve->mark=_ogg_realloc(ve->mark,ve->storage*sizeof(*ve->mark));
|
||||
}
|
||||
|
||||
for(j=first;j<last;j++){
|
||||
int ret=0;
|
||||
|
||||
ve->stretch++;
|
||||
if(ve->stretch>VE_MAXSTRETCH*2)
|
||||
ve->stretch=VE_MAXSTRETCH*2;
|
||||
|
||||
for(i=0;i<ve->ch;i++){
|
||||
float *pcm=v->pcm[i]+ve->searchstep*(j);
|
||||
ret|=_ve_amp(ve,gi,pcm,ve->band,ve->filter+i*VE_BANDS);
|
||||
}
|
||||
|
||||
ve->mark[j+VE_POST]=0;
|
||||
if(ret&1){
|
||||
ve->mark[j]=1;
|
||||
ve->mark[j+1]=1;
|
||||
}
|
||||
|
||||
if(ret&2){
|
||||
ve->mark[j]=1;
|
||||
if(j>0)ve->mark[j-1]=1;
|
||||
}
|
||||
|
||||
if(ret&4)ve->stretch=-1;
|
||||
}
|
||||
|
||||
ve->current=last*ve->searchstep;
|
||||
|
||||
{
|
||||
long centerW=v->centerW;
|
||||
long testW=
|
||||
centerW+
|
||||
ci->blocksizes[v->W]/4+
|
||||
ci->blocksizes[1]/2+
|
||||
ci->blocksizes[0]/4;
|
||||
|
||||
j=ve->cursor;
|
||||
|
||||
while(j<ve->current-(ve->searchstep)){/* account for postecho
|
||||
working back one window */
|
||||
if(j>=testW)return(1);
|
||||
|
||||
ve->cursor=j;
|
||||
|
||||
if(ve->mark[j/ve->searchstep]){
|
||||
if(j>centerW){
|
||||
|
||||
#if 0
|
||||
if(j>ve->curmark){
|
||||
float *marker=alloca(v->pcm_current*sizeof(*marker));
|
||||
int l,m;
|
||||
memset(marker,0,sizeof(*marker)*v->pcm_current);
|
||||
fprintf(stderr,"mark! seq=%d, cursor:%fs time:%fs\n",
|
||||
seq,
|
||||
(totalshift+ve->cursor)/44100.,
|
||||
(totalshift+j)/44100.);
|
||||
_analysis_output_always("pcmL",seq,v->pcm[0],v->pcm_current,0,0,totalshift);
|
||||
_analysis_output_always("pcmR",seq,v->pcm[1],v->pcm_current,0,0,totalshift);
|
||||
|
||||
_analysis_output_always("markL",seq,v->pcm[0],j,0,0,totalshift);
|
||||
_analysis_output_always("markR",seq,v->pcm[1],j,0,0,totalshift);
|
||||
|
||||
for(m=0;m<VE_BANDS;m++){
|
||||
char buf[80];
|
||||
sprintf(buf,"delL%d",m);
|
||||
for(l=0;l<last;l++)marker[l*ve->searchstep]=ve->filter[m].markers[l]*.1;
|
||||
_analysis_output_always(buf,seq,marker,v->pcm_current,0,0,totalshift);
|
||||
}
|
||||
|
||||
for(m=0;m<VE_BANDS;m++){
|
||||
char buf[80];
|
||||
sprintf(buf,"delR%d",m);
|
||||
for(l=0;l<last;l++)marker[l*ve->searchstep]=ve->filter[m+VE_BANDS].markers[l]*.1;
|
||||
_analysis_output_always(buf,seq,marker,v->pcm_current,0,0,totalshift);
|
||||
}
|
||||
|
||||
for(l=0;l<last;l++)marker[l*ve->searchstep]=ve->mark[l]*.4;
|
||||
_analysis_output_always("mark",seq,marker,v->pcm_current,0,0,totalshift);
|
||||
|
||||
|
||||
seq++;
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
ve->curmark=j;
|
||||
if(j>=testW)return(1);
|
||||
return(0);
|
||||
}
|
||||
}
|
||||
j+=ve->searchstep;
|
||||
}
|
||||
}
|
||||
|
||||
return(-1);
|
||||
}
|
||||
|
||||
int _ve_envelope_mark(vorbis_dsp_state *v){
|
||||
envelope_lookup *ve=((private_state *)(v->backend_state))->ve;
|
||||
vorbis_info *vi=v->vi;
|
||||
codec_setup_info *ci=vi->codec_setup;
|
||||
long centerW=v->centerW;
|
||||
long beginW=centerW-ci->blocksizes[v->W]/4;
|
||||
long endW=centerW+ci->blocksizes[v->W]/4;
|
||||
if(v->W){
|
||||
beginW-=ci->blocksizes[v->lW]/4;
|
||||
endW+=ci->blocksizes[v->nW]/4;
|
||||
}else{
|
||||
beginW-=ci->blocksizes[0]/4;
|
||||
endW+=ci->blocksizes[0]/4;
|
||||
}
|
||||
|
||||
if(ve->curmark>=beginW && ve->curmark<endW)return(1);
|
||||
{
|
||||
long first=beginW/ve->searchstep;
|
||||
long last=endW/ve->searchstep;
|
||||
long i;
|
||||
for(i=first;i<last;i++)
|
||||
if(ve->mark[i])return(1);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
void _ve_envelope_shift(envelope_lookup *e,long shift){
|
||||
int smallsize=e->current/e->searchstep+VE_POST; /* adjust for placing marks
|
||||
ahead of ve->current */
|
||||
int smallshift=shift/e->searchstep;
|
||||
|
||||
memmove(e->mark,e->mark+smallshift,(smallsize-smallshift)*sizeof(*e->mark));
|
||||
|
||||
#if 0
|
||||
for(i=0;i<VE_BANDS*e->ch;i++)
|
||||
memmove(e->filter[i].markers,
|
||||
e->filter[i].markers+smallshift,
|
||||
(1024-smallshift)*sizeof(*(*e->filter).markers));
|
||||
totalshift+=shift;
|
||||
#endif
|
||||
|
||||
e->current-=shift;
|
||||
if(e->curmark>=0)
|
||||
e->curmark-=shift;
|
||||
e->cursor-=shift;
|
||||
}
|
@ -1,80 +0,0 @@
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: PCM data envelope analysis and manipulation
|
||||
last mod: $Id: envelope.h 16227 2009-07-08 06:58:46Z xiphmont $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
#ifndef _V_ENVELOPE_
|
||||
#define _V_ENVELOPE_
|
||||
|
||||
#include "mdct.h"
|
||||
|
||||
#define VE_PRE 16
|
||||
#define VE_WIN 4
|
||||
#define VE_POST 2
|
||||
#define VE_AMP (VE_PRE+VE_POST-1)
|
||||
|
||||
#define VE_BANDS 7
|
||||
#define VE_NEARDC 15
|
||||
|
||||
#define VE_MINSTRETCH 2 /* a bit less than short block */
|
||||
#define VE_MAXSTRETCH 12 /* one-third full block */
|
||||
|
||||
typedef struct {
|
||||
float ampbuf[VE_AMP];
|
||||
int ampptr;
|
||||
|
||||
float nearDC[VE_NEARDC];
|
||||
float nearDC_acc;
|
||||
float nearDC_partialacc;
|
||||
int nearptr;
|
||||
|
||||
} envelope_filter_state;
|
||||
|
||||
typedef struct {
|
||||
int begin;
|
||||
int end;
|
||||
float *window;
|
||||
float total;
|
||||
} envelope_band;
|
||||
|
||||
typedef struct {
|
||||
int ch;
|
||||
int winlength;
|
||||
int searchstep;
|
||||
float minenergy;
|
||||
|
||||
mdct_lookup mdct;
|
||||
float *mdct_win;
|
||||
|
||||
envelope_band band[VE_BANDS];
|
||||
envelope_filter_state *filter;
|
||||
int stretch;
|
||||
|
||||
int *mark;
|
||||
|
||||
long storage;
|
||||
long current;
|
||||
long curmark;
|
||||
long cursor;
|
||||
} envelope_lookup;
|
||||
|
||||
extern void _ve_envelope_init(envelope_lookup *e,vorbis_info *vi);
|
||||
extern void _ve_envelope_clear(envelope_lookup *e);
|
||||
extern long _ve_envelope_search(vorbis_dsp_state *v);
|
||||
extern void _ve_envelope_shift(envelope_lookup *e,long shift);
|
||||
extern int _ve_envelope_mark(vorbis_dsp_state *v);
|
||||
|
||||
|
||||
#endif
|
@ -1,224 +0,0 @@
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2015 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: floor backend 0 implementation
|
||||
last mod: $Id: floor0.c 19457 2015-03-03 00:15:29Z giles $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
#include <ogg/ogg.h>
|
||||
#include "vorbis/codec.h"
|
||||
#include "codec_internal.h"
|
||||
#include "registry.h"
|
||||
#include "lpc.h"
|
||||
#include "lsp.h"
|
||||
#include "codebook.h"
|
||||
#include "scales.h"
|
||||
#include "misc.h"
|
||||
#include "os.h"
|
||||
|
||||
#include "misc.h"
|
||||
#include <stdio.h>
|
||||
|
||||
typedef struct {
|
||||
int ln;
|
||||
int m;
|
||||
int **linearmap;
|
||||
int n[2];
|
||||
|
||||
vorbis_info_floor0 *vi;
|
||||
|
||||
long bits;
|
||||
long frames;
|
||||
} vorbis_look_floor0;
|
||||
|
||||
|
||||
/***********************************************/
|
||||
|
||||
static void floor0_free_info(vorbis_info_floor *i){
|
||||
vorbis_info_floor0 *info=(vorbis_info_floor0 *)i;
|
||||
if(info){
|
||||
memset(info,0,sizeof(*info));
|
||||
_ogg_free(info);
|
||||
}
|
||||
}
|
||||
|
||||
static void floor0_free_look(vorbis_look_floor *i){
|
||||
vorbis_look_floor0 *look=(vorbis_look_floor0 *)i;
|
||||
if(look){
|
||||
|
||||
if(look->linearmap){
|
||||
|
||||
if(look->linearmap[0])_ogg_free(look->linearmap[0]);
|
||||
if(look->linearmap[1])_ogg_free(look->linearmap[1]);
|
||||
|
||||
_ogg_free(look->linearmap);
|
||||
}
|
||||
memset(look,0,sizeof(*look));
|
||||
_ogg_free(look);
|
||||
}
|
||||
}
|
||||
|
||||
static vorbis_info_floor *floor0_unpack (vorbis_info *vi,oggpack_buffer *opb){
|
||||
codec_setup_info *ci=vi->codec_setup;
|
||||
int j;
|
||||
|
||||
vorbis_info_floor0 *info=_ogg_malloc(sizeof(*info));
|
||||
info->order=oggpack_read(opb,8);
|
||||
info->rate=oggpack_read(opb,16);
|
||||
info->barkmap=oggpack_read(opb,16);
|
||||
info->ampbits=oggpack_read(opb,6);
|
||||
info->ampdB=oggpack_read(opb,8);
|
||||
info->numbooks=oggpack_read(opb,4)+1;
|
||||
|
||||
if(info->order<1)goto err_out;
|
||||
if(info->rate<1)goto err_out;
|
||||
if(info->barkmap<1)goto err_out;
|
||||
if(info->numbooks<1)goto err_out;
|
||||
|
||||
for(j=0;j<info->numbooks;j++){
|
||||
info->books[j]=oggpack_read(opb,8);
|
||||
if(info->books[j]<0 || info->books[j]>=ci->books)goto err_out;
|
||||
if(ci->book_param[info->books[j]]->maptype==0)goto err_out;
|
||||
if(ci->book_param[info->books[j]]->dim<1)goto err_out;
|
||||
}
|
||||
return(info);
|
||||
|
||||
err_out:
|
||||
floor0_free_info(info);
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
/* initialize Bark scale and normalization lookups. We could do this
|
||||
with static tables, but Vorbis allows a number of possible
|
||||
combinations, so it's best to do it computationally.
|
||||
|
||||
The below is authoritative in terms of defining scale mapping.
|
||||
Note that the scale depends on the sampling rate as well as the
|
||||
linear block and mapping sizes */
|
||||
|
||||
static void floor0_map_lazy_init(vorbis_block *vb,
|
||||
vorbis_info_floor *infoX,
|
||||
vorbis_look_floor0 *look){
|
||||
if(!look->linearmap[vb->W]){
|
||||
vorbis_dsp_state *vd=vb->vd;
|
||||
vorbis_info *vi=vd->vi;
|
||||
codec_setup_info *ci=vi->codec_setup;
|
||||
vorbis_info_floor0 *info=(vorbis_info_floor0 *)infoX;
|
||||
int W=vb->W;
|
||||
int n=ci->blocksizes[W]/2,j;
|
||||
|
||||
/* we choose a scaling constant so that:
|
||||
floor(bark(rate/2-1)*C)=mapped-1
|
||||
floor(bark(rate/2)*C)=mapped */
|
||||
float scale=look->ln/toBARK(info->rate/2.f);
|
||||
|
||||
/* the mapping from a linear scale to a smaller bark scale is
|
||||
straightforward. We do *not* make sure that the linear mapping
|
||||
does not skip bark-scale bins; the decoder simply skips them and
|
||||
the encoder may do what it wishes in filling them. They're
|
||||
necessary in some mapping combinations to keep the scale spacing
|
||||
accurate */
|
||||
look->linearmap[W]=_ogg_malloc((n+1)*sizeof(**look->linearmap));
|
||||
for(j=0;j<n;j++){
|
||||
int val=floor( toBARK((info->rate/2.f)/n*j)
|
||||
*scale); /* bark numbers represent band edges */
|
||||
if(val>=look->ln)val=look->ln-1; /* guard against the approximation */
|
||||
look->linearmap[W][j]=val;
|
||||
}
|
||||
look->linearmap[W][j]=-1;
|
||||
look->n[W]=n;
|
||||
}
|
||||
}
|
||||
|
||||
static vorbis_look_floor *floor0_look(vorbis_dsp_state *vd,
|
||||
vorbis_info_floor *i){
|
||||
vorbis_info_floor0 *info=(vorbis_info_floor0 *)i;
|
||||
vorbis_look_floor0 *look=_ogg_calloc(1,sizeof(*look));
|
||||
|
||||
(void)vd;
|
||||
|
||||
look->m=info->order;
|
||||
look->ln=info->barkmap;
|
||||
look->vi=info;
|
||||
|
||||
look->linearmap=_ogg_calloc(2,sizeof(*look->linearmap));
|
||||
|
||||
return look;
|
||||
}
|
||||
|
||||
static void *floor0_inverse1(vorbis_block *vb,vorbis_look_floor *i){
|
||||
vorbis_look_floor0 *look=(vorbis_look_floor0 *)i;
|
||||
vorbis_info_floor0 *info=look->vi;
|
||||
int j,k;
|
||||
|
||||
int ampraw=oggpack_read(&vb->opb,info->ampbits);
|
||||
if(ampraw>0){ /* also handles the -1 out of data case */
|
||||
long maxval=(1<<info->ampbits)-1;
|
||||
float amp=(float)ampraw/maxval*info->ampdB;
|
||||
int booknum=oggpack_read(&vb->opb,ov_ilog(info->numbooks));
|
||||
|
||||
if(booknum!=-1 && booknum<info->numbooks){ /* be paranoid */
|
||||
codec_setup_info *ci=vb->vd->vi->codec_setup;
|
||||
codebook *b=ci->fullbooks+info->books[booknum];
|
||||
float last=0.f;
|
||||
|
||||
/* the additional b->dim is a guard against any possible stack
|
||||
smash; b->dim is provably more than we can overflow the
|
||||
vector */
|
||||
float *lsp=_vorbis_block_alloc(vb,sizeof(*lsp)*(look->m+b->dim+1));
|
||||
|
||||
if(vorbis_book_decodev_set(b,lsp,&vb->opb,look->m)==-1)goto eop;
|
||||
for(j=0;j<look->m;){
|
||||
for(k=0;j<look->m && k<b->dim;k++,j++)lsp[j]+=last;
|
||||
last=lsp[j-1];
|
||||
}
|
||||
|
||||
lsp[look->m]=amp;
|
||||
return(lsp);
|
||||
}
|
||||
}
|
||||
eop:
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
static int floor0_inverse2(vorbis_block *vb,vorbis_look_floor *i,
|
||||
void *memo,float *out){
|
||||
vorbis_look_floor0 *look=(vorbis_look_floor0 *)i;
|
||||
vorbis_info_floor0 *info=look->vi;
|
||||
|
||||
floor0_map_lazy_init(vb,info,look);
|
||||
|
||||
if(memo){
|
||||
float *lsp=(float *)memo;
|
||||
float amp=lsp[look->m];
|
||||
|
||||
/* take the coefficients back to a spectral envelope curve */
|
||||
vorbis_lsp_to_curve(out,
|
||||
look->linearmap[vb->W],
|
||||
look->n[vb->W],
|
||||
look->ln,
|
||||
lsp,look->m,amp,(float)info->ampdB);
|
||||
return(1);
|
||||
}
|
||||
memset(out,0,sizeof(*out)*look->n[vb->W]);
|
||||
return(0);
|
||||
}
|
||||
|
||||
/* export hooks */
|
||||
const vorbis_func_floor floor0_exportbundle={
|
||||
NULL,&floor0_unpack,&floor0_look,&floor0_free_info,
|
||||
&floor0_free_look,&floor0_inverse1,&floor0_inverse2
|
||||
};
|
File diff suppressed because it is too large
Load Diff
@ -1,58 +0,0 @@
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: highlevel encoder setup struct separated out for vorbisenc clarity
|
||||
last mod: $Id: highlevel.h 17195 2010-05-05 21:49:51Z giles $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
typedef struct highlevel_byblocktype {
|
||||
double tone_mask_setting;
|
||||
double tone_peaklimit_setting;
|
||||
double noise_bias_setting;
|
||||
double noise_compand_setting;
|
||||
} highlevel_byblocktype;
|
||||
|
||||
typedef struct highlevel_encode_setup {
|
||||
int set_in_stone;
|
||||
const void *setup;
|
||||
double base_setting;
|
||||
|
||||
double impulse_noisetune;
|
||||
|
||||
/* bitrate management below all settable */
|
||||
float req;
|
||||
int managed;
|
||||
long bitrate_min;
|
||||
long bitrate_av;
|
||||
double bitrate_av_damp;
|
||||
long bitrate_max;
|
||||
long bitrate_reservoir;
|
||||
double bitrate_reservoir_bias;
|
||||
|
||||
int impulse_block_p;
|
||||
int noise_normalize_p;
|
||||
int coupling_p;
|
||||
|
||||
double stereo_point_setting;
|
||||
double lowpass_kHz;
|
||||
int lowpass_altered;
|
||||
|
||||
double ath_floating_dB;
|
||||
double ath_absolute_dB;
|
||||
|
||||
double amplitude_track_dBpersec;
|
||||
double trigger_setting;
|
||||
|
||||
highlevel_byblocktype block[4]; /* padding, impulse, transition, long */
|
||||
|
||||
} highlevel_encode_setup;
|
@ -1,673 +0,0 @@
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2015 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: maintain the info structure, info <-> header packets
|
||||
last mod: $Id: info.c 19441 2015-01-21 01:17:41Z xiphmont $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
/* general handling of the header and the vorbis_info structure (and
|
||||
substructures) */
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include <ogg/ogg.h>
|
||||
#include "vorbis/codec.h"
|
||||
#include "codec_internal.h"
|
||||
#include "codebook.h"
|
||||
#include "registry.h"
|
||||
#include "window.h"
|
||||
#include "psy.h"
|
||||
#include "misc.h"
|
||||
#include "os.h"
|
||||
|
||||
#define GENERAL_VENDOR_STRING "Xiph.Org libVorbis 1.3.5"
|
||||
#define ENCODE_VENDOR_STRING "Xiph.Org libVorbis I 20150105 (⛄⛄⛄⛄)"
|
||||
|
||||
/* helpers */
|
||||
static void _v_writestring(oggpack_buffer *o,const char *s, int bytes){
|
||||
|
||||
while(bytes--){
|
||||
oggpack_write(o,*s++,8);
|
||||
}
|
||||
}
|
||||
|
||||
static void _v_readstring(oggpack_buffer *o,char *buf,int bytes){
|
||||
while(bytes--){
|
||||
*buf++=oggpack_read(o,8);
|
||||
}
|
||||
}
|
||||
|
||||
void vorbis_comment_init(vorbis_comment *vc){
|
||||
memset(vc,0,sizeof(*vc));
|
||||
}
|
||||
|
||||
void vorbis_comment_add(vorbis_comment *vc,const char *comment){
|
||||
vc->user_comments=_ogg_realloc(vc->user_comments,
|
||||
(vc->comments+2)*sizeof(*vc->user_comments));
|
||||
vc->comment_lengths=_ogg_realloc(vc->comment_lengths,
|
||||
(vc->comments+2)*sizeof(*vc->comment_lengths));
|
||||
vc->comment_lengths[vc->comments]=strlen(comment);
|
||||
vc->user_comments[vc->comments]=_ogg_malloc(vc->comment_lengths[vc->comments]+1);
|
||||
strcpy(vc->user_comments[vc->comments], comment);
|
||||
vc->comments++;
|
||||
vc->user_comments[vc->comments]=NULL;
|
||||
}
|
||||
|
||||
void vorbis_comment_add_tag(vorbis_comment *vc, const char *tag, const char *contents){
|
||||
char *comment=alloca(strlen(tag)+strlen(contents)+2); /* +2 for = and \0 */
|
||||
strcpy(comment, tag);
|
||||
strcat(comment, "=");
|
||||
strcat(comment, contents);
|
||||
vorbis_comment_add(vc, comment);
|
||||
}
|
||||
|
||||
/* This is more or less the same as strncasecmp - but that doesn't exist
|
||||
* everywhere, and this is a fairly trivial function, so we include it */
|
||||
static int tagcompare(const char *s1, const char *s2, int n){
|
||||
int c=0;
|
||||
while(c < n){
|
||||
if(toupper(s1[c]) != toupper(s2[c]))
|
||||
return !0;
|
||||
c++;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
char *vorbis_comment_query(vorbis_comment *vc, const char *tag, int count){
|
||||
long i;
|
||||
int found = 0;
|
||||
int taglen = strlen(tag)+1; /* +1 for the = we append */
|
||||
char *fulltag = alloca(taglen+ 1);
|
||||
|
||||
strcpy(fulltag, tag);
|
||||
strcat(fulltag, "=");
|
||||
|
||||
for(i=0;i<vc->comments;i++){
|
||||
if(!tagcompare(vc->user_comments[i], fulltag, taglen)){
|
||||
if(count == found)
|
||||
/* We return a pointer to the data, not a copy */
|
||||
return vc->user_comments[i] + taglen;
|
||||
else
|
||||
found++;
|
||||
}
|
||||
}
|
||||
return NULL; /* didn't find anything */
|
||||
}
|
||||
|
||||
int vorbis_comment_query_count(vorbis_comment *vc, const char *tag){
|
||||
int i,count=0;
|
||||
int taglen = strlen(tag)+1; /* +1 for the = we append */
|
||||
char *fulltag = alloca(taglen+1);
|
||||
strcpy(fulltag,tag);
|
||||
strcat(fulltag, "=");
|
||||
|
||||
for(i=0;i<vc->comments;i++){
|
||||
if(!tagcompare(vc->user_comments[i], fulltag, taglen))
|
||||
count++;
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
void vorbis_comment_clear(vorbis_comment *vc){
|
||||
if(vc){
|
||||
long i;
|
||||
if(vc->user_comments){
|
||||
for(i=0;i<vc->comments;i++)
|
||||
if(vc->user_comments[i])_ogg_free(vc->user_comments[i]);
|
||||
_ogg_free(vc->user_comments);
|
||||
}
|
||||
if(vc->comment_lengths)_ogg_free(vc->comment_lengths);
|
||||
if(vc->vendor)_ogg_free(vc->vendor);
|
||||
memset(vc,0,sizeof(*vc));
|
||||
}
|
||||
}
|
||||
|
||||
/* blocksize 0 is guaranteed to be short, 1 is guaranteed to be long.
|
||||
They may be equal, but short will never ge greater than long */
|
||||
int vorbis_info_blocksize(vorbis_info *vi,int zo){
|
||||
codec_setup_info *ci = vi->codec_setup;
|
||||
return ci ? ci->blocksizes[zo] : -1;
|
||||
}
|
||||
|
||||
/* used by synthesis, which has a full, alloced vi */
|
||||
void vorbis_info_init(vorbis_info *vi){
|
||||
memset(vi,0,sizeof(*vi));
|
||||
vi->codec_setup=_ogg_calloc(1,sizeof(codec_setup_info));
|
||||
}
|
||||
|
||||
void vorbis_info_clear(vorbis_info *vi){
|
||||
codec_setup_info *ci=vi->codec_setup;
|
||||
int i;
|
||||
|
||||
if(ci){
|
||||
|
||||
for(i=0;i<ci->modes;i++)
|
||||
if(ci->mode_param[i])_ogg_free(ci->mode_param[i]);
|
||||
|
||||
for(i=0;i<ci->maps;i++) /* unpack does the range checking */
|
||||
if(ci->map_param[i]) /* this may be cleaning up an aborted
|
||||
unpack, in which case the below type
|
||||
cannot be trusted */
|
||||
_mapping_P[ci->map_type[i]]->free_info(ci->map_param[i]);
|
||||
|
||||
for(i=0;i<ci->floors;i++) /* unpack does the range checking */
|
||||
if(ci->floor_param[i]) /* this may be cleaning up an aborted
|
||||
unpack, in which case the below type
|
||||
cannot be trusted */
|
||||
_floor_P[ci->floor_type[i]]->free_info(ci->floor_param[i]);
|
||||
|
||||
for(i=0;i<ci->residues;i++) /* unpack does the range checking */
|
||||
if(ci->residue_param[i]) /* this may be cleaning up an aborted
|
||||
unpack, in which case the below type
|
||||
cannot be trusted */
|
||||
_residue_P[ci->residue_type[i]]->free_info(ci->residue_param[i]);
|
||||
|
||||
for(i=0;i<ci->books;i++){
|
||||
if(ci->book_param[i]){
|
||||
/* knows if the book was not alloced */
|
||||
vorbis_staticbook_destroy(ci->book_param[i]);
|
||||
}
|
||||
if(ci->fullbooks)
|
||||
vorbis_book_clear(ci->fullbooks+i);
|
||||
}
|
||||
if(ci->fullbooks)
|
||||
_ogg_free(ci->fullbooks);
|
||||
|
||||
for(i=0;i<ci->psys;i++)
|
||||
_vi_psy_free(ci->psy_param[i]);
|
||||
|
||||
_ogg_free(ci);
|
||||
}
|
||||
|
||||
memset(vi,0,sizeof(*vi));
|
||||
}
|
||||
|
||||
/* Header packing/unpacking ********************************************/
|
||||
|
||||
static int _vorbis_unpack_info(vorbis_info *vi,oggpack_buffer *opb){
|
||||
codec_setup_info *ci=vi->codec_setup;
|
||||
if(!ci)return(OV_EFAULT);
|
||||
|
||||
vi->version=oggpack_read(opb,32);
|
||||
if(vi->version!=0)return(OV_EVERSION);
|
||||
|
||||
vi->channels=oggpack_read(opb,8);
|
||||
vi->rate=oggpack_read(opb,32);
|
||||
|
||||
vi->bitrate_upper=oggpack_read(opb,32);
|
||||
vi->bitrate_nominal=oggpack_read(opb,32);
|
||||
vi->bitrate_lower=oggpack_read(opb,32);
|
||||
|
||||
ci->blocksizes[0]=1<<oggpack_read(opb,4);
|
||||
ci->blocksizes[1]=1<<oggpack_read(opb,4);
|
||||
|
||||
if(vi->rate<1)goto err_out;
|
||||
if(vi->channels<1)goto err_out;
|
||||
if(ci->blocksizes[0]<64)goto err_out;
|
||||
if(ci->blocksizes[1]<ci->blocksizes[0])goto err_out;
|
||||
if(ci->blocksizes[1]>8192)goto err_out;
|
||||
|
||||
if(oggpack_read(opb,1)!=1)goto err_out; /* EOP check */
|
||||
|
||||
return(0);
|
||||
err_out:
|
||||
vorbis_info_clear(vi);
|
||||
return(OV_EBADHEADER);
|
||||
}
|
||||
|
||||
static int _vorbis_unpack_comment(vorbis_comment *vc,oggpack_buffer *opb){
|
||||
int i;
|
||||
int vendorlen=oggpack_read(opb,32);
|
||||
if(vendorlen<0)goto err_out;
|
||||
if(vendorlen>opb->storage-8)goto err_out;
|
||||
vc->vendor=_ogg_calloc(vendorlen+1,1);
|
||||
_v_readstring(opb,vc->vendor,vendorlen);
|
||||
i=oggpack_read(opb,32);
|
||||
if(i<0)goto err_out;
|
||||
if(i>((opb->storage-oggpack_bytes(opb))>>2))goto err_out;
|
||||
vc->comments=i;
|
||||
vc->user_comments=_ogg_calloc(vc->comments+1,sizeof(*vc->user_comments));
|
||||
vc->comment_lengths=_ogg_calloc(vc->comments+1, sizeof(*vc->comment_lengths));
|
||||
|
||||
for(i=0;i<vc->comments;i++){
|
||||
int len=oggpack_read(opb,32);
|
||||
if(len<0)goto err_out;
|
||||
if(len>opb->storage-oggpack_bytes(opb))goto err_out;
|
||||
vc->comment_lengths[i]=len;
|
||||
vc->user_comments[i]=_ogg_calloc(len+1,1);
|
||||
_v_readstring(opb,vc->user_comments[i],len);
|
||||
}
|
||||
if(oggpack_read(opb,1)!=1)goto err_out; /* EOP check */
|
||||
|
||||
return(0);
|
||||
err_out:
|
||||
vorbis_comment_clear(vc);
|
||||
return(OV_EBADHEADER);
|
||||
}
|
||||
|
||||
/* all of the real encoding details are here. The modes, books,
|
||||
everything */
|
||||
static int _vorbis_unpack_books(vorbis_info *vi,oggpack_buffer *opb){
|
||||
codec_setup_info *ci=vi->codec_setup;
|
||||
int i;
|
||||
|
||||
/* codebooks */
|
||||
ci->books=oggpack_read(opb,8)+1;
|
||||
if(ci->books<=0)goto err_out;
|
||||
for(i=0;i<ci->books;i++){
|
||||
ci->book_param[i]=vorbis_staticbook_unpack(opb);
|
||||
if(!ci->book_param[i])goto err_out;
|
||||
}
|
||||
|
||||
/* time backend settings; hooks are unused */
|
||||
{
|
||||
int times=oggpack_read(opb,6)+1;
|
||||
if(times<=0)goto err_out;
|
||||
for(i=0;i<times;i++){
|
||||
int test=oggpack_read(opb,16);
|
||||
if(test<0 || test>=VI_TIMEB)goto err_out;
|
||||
}
|
||||
}
|
||||
|
||||
/* floor backend settings */
|
||||
ci->floors=oggpack_read(opb,6)+1;
|
||||
if(ci->floors<=0)goto err_out;
|
||||
for(i=0;i<ci->floors;i++){
|
||||
ci->floor_type[i]=oggpack_read(opb,16);
|
||||
if(ci->floor_type[i]<0 || ci->floor_type[i]>=VI_FLOORB)goto err_out;
|
||||
ci->floor_param[i]=_floor_P[ci->floor_type[i]]->unpack(vi,opb);
|
||||
if(!ci->floor_param[i])goto err_out;
|
||||
}
|
||||
|
||||
/* residue backend settings */
|
||||
ci->residues=oggpack_read(opb,6)+1;
|
||||
if(ci->residues<=0)goto err_out;
|
||||
for(i=0;i<ci->residues;i++){
|
||||
ci->residue_type[i]=oggpack_read(opb,16);
|
||||
if(ci->residue_type[i]<0 || ci->residue_type[i]>=VI_RESB)goto err_out;
|
||||
ci->residue_param[i]=_residue_P[ci->residue_type[i]]->unpack(vi,opb);
|
||||
if(!ci->residue_param[i])goto err_out;
|
||||
}
|
||||
|
||||
/* map backend settings */
|
||||
ci->maps=oggpack_read(opb,6)+1;
|
||||
if(ci->maps<=0)goto err_out;
|
||||
for(i=0;i<ci->maps;i++){
|
||||
ci->map_type[i]=oggpack_read(opb,16);
|
||||
if(ci->map_type[i]<0 || ci->map_type[i]>=VI_MAPB)goto err_out;
|
||||
ci->map_param[i]=_mapping_P[ci->map_type[i]]->unpack(vi,opb);
|
||||
if(!ci->map_param[i])goto err_out;
|
||||
}
|
||||
|
||||
/* mode settings */
|
||||
ci->modes=oggpack_read(opb,6)+1;
|
||||
if(ci->modes<=0)goto err_out;
|
||||
for(i=0;i<ci->modes;i++){
|
||||
ci->mode_param[i]=_ogg_calloc(1,sizeof(*ci->mode_param[i]));
|
||||
ci->mode_param[i]->blockflag=oggpack_read(opb,1);
|
||||
ci->mode_param[i]->windowtype=oggpack_read(opb,16);
|
||||
ci->mode_param[i]->transformtype=oggpack_read(opb,16);
|
||||
ci->mode_param[i]->mapping=oggpack_read(opb,8);
|
||||
|
||||
if(ci->mode_param[i]->windowtype>=VI_WINDOWB)goto err_out;
|
||||
if(ci->mode_param[i]->transformtype>=VI_WINDOWB)goto err_out;
|
||||
if(ci->mode_param[i]->mapping>=ci->maps)goto err_out;
|
||||
if(ci->mode_param[i]->mapping<0)goto err_out;
|
||||
}
|
||||
|
||||
if(oggpack_read(opb,1)!=1)goto err_out; /* top level EOP check */
|
||||
|
||||
return(0);
|
||||
err_out:
|
||||
vorbis_info_clear(vi);
|
||||
return(OV_EBADHEADER);
|
||||
}
|
||||
|
||||
/* Is this packet a vorbis ID header? */
|
||||
int vorbis_synthesis_idheader(ogg_packet *op){
|
||||
oggpack_buffer opb;
|
||||
char buffer[6];
|
||||
|
||||
if(op){
|
||||
oggpack_readinit(&opb,op->packet,op->bytes);
|
||||
|
||||
if(!op->b_o_s)
|
||||
return(0); /* Not the initial packet */
|
||||
|
||||
if(oggpack_read(&opb,8) != 1)
|
||||
return 0; /* not an ID header */
|
||||
|
||||
memset(buffer,0,6);
|
||||
_v_readstring(&opb,buffer,6);
|
||||
if(memcmp(buffer,"vorbis",6))
|
||||
return 0; /* not vorbis */
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* The Vorbis header is in three packets; the initial small packet in
|
||||
the first page that identifies basic parameters, a second packet
|
||||
with bitstream comments and a third packet that holds the
|
||||
codebook. */
|
||||
|
||||
int vorbis_synthesis_headerin(vorbis_info *vi,vorbis_comment *vc,ogg_packet *op){
|
||||
oggpack_buffer opb;
|
||||
|
||||
if(op){
|
||||
oggpack_readinit(&opb,op->packet,op->bytes);
|
||||
|
||||
/* Which of the three types of header is this? */
|
||||
/* Also verify header-ness, vorbis */
|
||||
{
|
||||
char buffer[6];
|
||||
int packtype=oggpack_read(&opb,8);
|
||||
memset(buffer,0,6);
|
||||
_v_readstring(&opb,buffer,6);
|
||||
if(memcmp(buffer,"vorbis",6)){
|
||||
/* not a vorbis header */
|
||||
return(OV_ENOTVORBIS);
|
||||
}
|
||||
switch(packtype){
|
||||
case 0x01: /* least significant *bit* is read first */
|
||||
if(!op->b_o_s){
|
||||
/* Not the initial packet */
|
||||
return(OV_EBADHEADER);
|
||||
}
|
||||
if(vi->rate!=0){
|
||||
/* previously initialized info header */
|
||||
return(OV_EBADHEADER);
|
||||
}
|
||||
|
||||
return(_vorbis_unpack_info(vi,&opb));
|
||||
|
||||
case 0x03: /* least significant *bit* is read first */
|
||||
if(vi->rate==0){
|
||||
/* um... we didn't get the initial header */
|
||||
return(OV_EBADHEADER);
|
||||
}
|
||||
if(vc->vendor!=NULL){
|
||||
/* previously initialized comment header */
|
||||
return(OV_EBADHEADER);
|
||||
}
|
||||
|
||||
return(_vorbis_unpack_comment(vc,&opb));
|
||||
|
||||
case 0x05: /* least significant *bit* is read first */
|
||||
if(vi->rate==0 || vc->vendor==NULL){
|
||||
/* um... we didn;t get the initial header or comments yet */
|
||||
return(OV_EBADHEADER);
|
||||
}
|
||||
if(vi->codec_setup==NULL){
|
||||
/* improperly initialized vorbis_info */
|
||||
return(OV_EFAULT);
|
||||
}
|
||||
if(((codec_setup_info *)vi->codec_setup)->books>0){
|
||||
/* previously initialized setup header */
|
||||
return(OV_EBADHEADER);
|
||||
}
|
||||
|
||||
return(_vorbis_unpack_books(vi,&opb));
|
||||
|
||||
default:
|
||||
/* Not a valid vorbis header type */
|
||||
return(OV_EBADHEADER);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return(OV_EBADHEADER);
|
||||
}
|
||||
|
||||
/* pack side **********************************************************/
|
||||
|
||||
static int _vorbis_pack_info(oggpack_buffer *opb,vorbis_info *vi){
|
||||
codec_setup_info *ci=vi->codec_setup;
|
||||
if(!ci||
|
||||
ci->blocksizes[0]<64||
|
||||
ci->blocksizes[1]<ci->blocksizes[0]){
|
||||
return(OV_EFAULT);
|
||||
}
|
||||
|
||||
/* preamble */
|
||||
oggpack_write(opb,0x01,8);
|
||||
_v_writestring(opb,"vorbis", 6);
|
||||
|
||||
/* basic information about the stream */
|
||||
oggpack_write(opb,0x00,32);
|
||||
oggpack_write(opb,vi->channels,8);
|
||||
oggpack_write(opb,vi->rate,32);
|
||||
|
||||
oggpack_write(opb,vi->bitrate_upper,32);
|
||||
oggpack_write(opb,vi->bitrate_nominal,32);
|
||||
oggpack_write(opb,vi->bitrate_lower,32);
|
||||
|
||||
oggpack_write(opb,ov_ilog(ci->blocksizes[0]-1),4);
|
||||
oggpack_write(opb,ov_ilog(ci->blocksizes[1]-1),4);
|
||||
oggpack_write(opb,1,1);
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
static int _vorbis_pack_comment(oggpack_buffer *opb,vorbis_comment *vc){
|
||||
int bytes = strlen(ENCODE_VENDOR_STRING);
|
||||
|
||||
/* preamble */
|
||||
oggpack_write(opb,0x03,8);
|
||||
_v_writestring(opb,"vorbis", 6);
|
||||
|
||||
/* vendor */
|
||||
oggpack_write(opb,bytes,32);
|
||||
_v_writestring(opb,ENCODE_VENDOR_STRING, bytes);
|
||||
|
||||
/* comments */
|
||||
|
||||
oggpack_write(opb,vc->comments,32);
|
||||
if(vc->comments){
|
||||
int i;
|
||||
for(i=0;i<vc->comments;i++){
|
||||
if(vc->user_comments[i]){
|
||||
oggpack_write(opb,vc->comment_lengths[i],32);
|
||||
_v_writestring(opb,vc->user_comments[i], vc->comment_lengths[i]);
|
||||
}else{
|
||||
oggpack_write(opb,0,32);
|
||||
}
|
||||
}
|
||||
}
|
||||
oggpack_write(opb,1,1);
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
static int _vorbis_pack_books(oggpack_buffer *opb,vorbis_info *vi){
|
||||
codec_setup_info *ci=vi->codec_setup;
|
||||
int i;
|
||||
if(!ci)return(OV_EFAULT);
|
||||
|
||||
oggpack_write(opb,0x05,8);
|
||||
_v_writestring(opb,"vorbis", 6);
|
||||
|
||||
/* books */
|
||||
oggpack_write(opb,ci->books-1,8);
|
||||
for(i=0;i<ci->books;i++)
|
||||
if(vorbis_staticbook_pack(ci->book_param[i],opb))goto err_out;
|
||||
|
||||
/* times; hook placeholders */
|
||||
oggpack_write(opb,0,6);
|
||||
oggpack_write(opb,0,16);
|
||||
|
||||
/* floors */
|
||||
oggpack_write(opb,ci->floors-1,6);
|
||||
for(i=0;i<ci->floors;i++){
|
||||
oggpack_write(opb,ci->floor_type[i],16);
|
||||
if(_floor_P[ci->floor_type[i]]->pack)
|
||||
_floor_P[ci->floor_type[i]]->pack(ci->floor_param[i],opb);
|
||||
else
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
/* residues */
|
||||
oggpack_write(opb,ci->residues-1,6);
|
||||
for(i=0;i<ci->residues;i++){
|
||||
oggpack_write(opb,ci->residue_type[i],16);
|
||||
_residue_P[ci->residue_type[i]]->pack(ci->residue_param[i],opb);
|
||||
}
|
||||
|
||||
/* maps */
|
||||
oggpack_write(opb,ci->maps-1,6);
|
||||
for(i=0;i<ci->maps;i++){
|
||||
oggpack_write(opb,ci->map_type[i],16);
|
||||
_mapping_P[ci->map_type[i]]->pack(vi,ci->map_param[i],opb);
|
||||
}
|
||||
|
||||
/* modes */
|
||||
oggpack_write(opb,ci->modes-1,6);
|
||||
for(i=0;i<ci->modes;i++){
|
||||
oggpack_write(opb,ci->mode_param[i]->blockflag,1);
|
||||
oggpack_write(opb,ci->mode_param[i]->windowtype,16);
|
||||
oggpack_write(opb,ci->mode_param[i]->transformtype,16);
|
||||
oggpack_write(opb,ci->mode_param[i]->mapping,8);
|
||||
}
|
||||
oggpack_write(opb,1,1);
|
||||
|
||||
return(0);
|
||||
err_out:
|
||||
return(-1);
|
||||
}
|
||||
|
||||
int vorbis_commentheader_out(vorbis_comment *vc,
|
||||
ogg_packet *op){
|
||||
|
||||
oggpack_buffer opb;
|
||||
|
||||
oggpack_writeinit(&opb);
|
||||
if(_vorbis_pack_comment(&opb,vc)){
|
||||
oggpack_writeclear(&opb);
|
||||
return OV_EIMPL;
|
||||
}
|
||||
|
||||
op->packet = _ogg_malloc(oggpack_bytes(&opb));
|
||||
memcpy(op->packet, opb.buffer, oggpack_bytes(&opb));
|
||||
|
||||
op->bytes=oggpack_bytes(&opb);
|
||||
op->b_o_s=0;
|
||||
op->e_o_s=0;
|
||||
op->granulepos=0;
|
||||
op->packetno=1;
|
||||
|
||||
oggpack_writeclear(&opb);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int vorbis_analysis_headerout(vorbis_dsp_state *v,
|
||||
vorbis_comment *vc,
|
||||
ogg_packet *op,
|
||||
ogg_packet *op_comm,
|
||||
ogg_packet *op_code){
|
||||
int ret=OV_EIMPL;
|
||||
vorbis_info *vi=v->vi;
|
||||
oggpack_buffer opb;
|
||||
private_state *b=v->backend_state;
|
||||
|
||||
if(!b||vi->channels<=0){
|
||||
ret=OV_EFAULT;
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
/* first header packet **********************************************/
|
||||
|
||||
oggpack_writeinit(&opb);
|
||||
if(_vorbis_pack_info(&opb,vi))goto err_out;
|
||||
|
||||
/* build the packet */
|
||||
if(b->header)_ogg_free(b->header);
|
||||
b->header=_ogg_malloc(oggpack_bytes(&opb));
|
||||
memcpy(b->header,opb.buffer,oggpack_bytes(&opb));
|
||||
op->packet=b->header;
|
||||
op->bytes=oggpack_bytes(&opb);
|
||||
op->b_o_s=1;
|
||||
op->e_o_s=0;
|
||||
op->granulepos=0;
|
||||
op->packetno=0;
|
||||
|
||||
/* second header packet (comments) **********************************/
|
||||
|
||||
oggpack_reset(&opb);
|
||||
if(_vorbis_pack_comment(&opb,vc))goto err_out;
|
||||
|
||||
if(b->header1)_ogg_free(b->header1);
|
||||
b->header1=_ogg_malloc(oggpack_bytes(&opb));
|
||||
memcpy(b->header1,opb.buffer,oggpack_bytes(&opb));
|
||||
op_comm->packet=b->header1;
|
||||
op_comm->bytes=oggpack_bytes(&opb);
|
||||
op_comm->b_o_s=0;
|
||||
op_comm->e_o_s=0;
|
||||
op_comm->granulepos=0;
|
||||
op_comm->packetno=1;
|
||||
|
||||
/* third header packet (modes/codebooks) ****************************/
|
||||
|
||||
oggpack_reset(&opb);
|
||||
if(_vorbis_pack_books(&opb,vi))goto err_out;
|
||||
|
||||
if(b->header2)_ogg_free(b->header2);
|
||||
b->header2=_ogg_malloc(oggpack_bytes(&opb));
|
||||
memcpy(b->header2,opb.buffer,oggpack_bytes(&opb));
|
||||
op_code->packet=b->header2;
|
||||
op_code->bytes=oggpack_bytes(&opb);
|
||||
op_code->b_o_s=0;
|
||||
op_code->e_o_s=0;
|
||||
op_code->granulepos=0;
|
||||
op_code->packetno=2;
|
||||
|
||||
oggpack_writeclear(&opb);
|
||||
return(0);
|
||||
err_out:
|
||||
memset(op,0,sizeof(*op));
|
||||
memset(op_comm,0,sizeof(*op_comm));
|
||||
memset(op_code,0,sizeof(*op_code));
|
||||
|
||||
if(b){
|
||||
oggpack_writeclear(&opb);
|
||||
if(b->header)_ogg_free(b->header);
|
||||
if(b->header1)_ogg_free(b->header1);
|
||||
if(b->header2)_ogg_free(b->header2);
|
||||
b->header=NULL;
|
||||
b->header1=NULL;
|
||||
b->header2=NULL;
|
||||
}
|
||||
return(ret);
|
||||
}
|
||||
|
||||
double vorbis_granule_time(vorbis_dsp_state *v,ogg_int64_t granulepos){
|
||||
if(granulepos == -1) return -1;
|
||||
|
||||
/* We're not guaranteed a 64 bit unsigned type everywhere, so we
|
||||
have to put the unsigned granpo in a signed type. */
|
||||
if(granulepos>=0){
|
||||
return((double)granulepos/v->vi->rate);
|
||||
}else{
|
||||
ogg_int64_t granuleoff=0xffffffff;
|
||||
granuleoff<<=31;
|
||||
granuleoff|=0x7ffffffff;
|
||||
return(((double)granulepos+2+granuleoff+granuleoff)/v->vi->rate);
|
||||
}
|
||||
}
|
||||
|
||||
const char *vorbis_version_string(void){
|
||||
return GENERAL_VENDOR_STRING;
|
||||
}
|
@ -1,94 +0,0 @@
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: lookup based functions
|
||||
last mod: $Id: lookup.c 16227 2009-07-08 06:58:46Z xiphmont $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
#include <math.h>
|
||||
#include "lookup.h"
|
||||
#include "lookup_data.h"
|
||||
#include "os.h"
|
||||
#include "misc.h"
|
||||
|
||||
#ifdef FLOAT_LOOKUP
|
||||
|
||||
/* interpolated lookup based cos function, domain 0 to PI only */
|
||||
float vorbis_coslook(float a){
|
||||
double d=a*(.31830989*(float)COS_LOOKUP_SZ);
|
||||
int i=vorbis_ftoi(d-.5);
|
||||
|
||||
return COS_LOOKUP[i]+ (d-i)*(COS_LOOKUP[i+1]-COS_LOOKUP[i]);
|
||||
}
|
||||
|
||||
/* interpolated 1./sqrt(p) where .5 <= p < 1. */
|
||||
float vorbis_invsqlook(float a){
|
||||
double d=a*(2.f*(float)INVSQ_LOOKUP_SZ)-(float)INVSQ_LOOKUP_SZ;
|
||||
int i=vorbis_ftoi(d-.5f);
|
||||
return INVSQ_LOOKUP[i]+ (d-i)*(INVSQ_LOOKUP[i+1]-INVSQ_LOOKUP[i]);
|
||||
}
|
||||
|
||||
/* interpolated 1./sqrt(p) where .5 <= p < 1. */
|
||||
float vorbis_invsq2explook(int a){
|
||||
return INVSQ2EXP_LOOKUP[a-INVSQ2EXP_LOOKUP_MIN];
|
||||
}
|
||||
|
||||
#include <stdio.h>
|
||||
/* interpolated lookup based fromdB function, domain -140dB to 0dB only */
|
||||
float vorbis_fromdBlook(float a){
|
||||
int i=vorbis_ftoi(a*((float)(-(1<<FROMdB2_SHIFT)))-.5f);
|
||||
return (i<0)?1.f:
|
||||
((i>=(FROMdB_LOOKUP_SZ<<FROMdB_SHIFT))?0.f:
|
||||
FROMdB_LOOKUP[i>>FROMdB_SHIFT]*FROMdB2_LOOKUP[i&FROMdB2_MASK]);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef INT_LOOKUP
|
||||
/* interpolated 1./sqrt(p) where .5 <= a < 1. (.100000... to .111111...) in
|
||||
16.16 format
|
||||
|
||||
returns in m.8 format */
|
||||
long vorbis_invsqlook_i(long a,long e){
|
||||
long i=(a&0x7fff)>>(INVSQ_LOOKUP_I_SHIFT-1);
|
||||
long d=(a&INVSQ_LOOKUP_I_MASK)<<(16-INVSQ_LOOKUP_I_SHIFT); /* 0.16 */
|
||||
long val=INVSQ_LOOKUP_I[i]- /* 1.16 */
|
||||
(((INVSQ_LOOKUP_I[i]-INVSQ_LOOKUP_I[i+1])* /* 0.16 */
|
||||
d)>>16); /* result 1.16 */
|
||||
|
||||
e+=32;
|
||||
if(e&1)val=(val*5792)>>13; /* multiply val by 1/sqrt(2) */
|
||||
e=(e>>1)-8;
|
||||
|
||||
return(val>>e);
|
||||
}
|
||||
|
||||
/* interpolated lookup based fromdB function, domain -140dB to 0dB only */
|
||||
/* a is in n.12 format */
|
||||
float vorbis_fromdBlook_i(long a){
|
||||
int i=(-a)>>(12-FROMdB2_SHIFT);
|
||||
return (i<0)?1.f:
|
||||
((i>=(FROMdB_LOOKUP_SZ<<FROMdB_SHIFT))?0.f:
|
||||
FROMdB_LOOKUP[i>>FROMdB_SHIFT]*FROMdB2_LOOKUP[i&FROMdB2_MASK]);
|
||||
}
|
||||
|
||||
/* interpolated lookup based cos function, domain 0 to PI only */
|
||||
/* a is in 0.16 format, where 0==0, 2^^16-1==PI, return 0.14 */
|
||||
long vorbis_coslook_i(long a){
|
||||
int i=a>>COS_LOOKUP_I_SHIFT;
|
||||
int d=a&COS_LOOKUP_I_MASK;
|
||||
return COS_LOOKUP_I[i]- ((d*(COS_LOOKUP_I[i]-COS_LOOKUP_I[i+1]))>>
|
||||
COS_LOOKUP_I_SHIFT);
|
||||
}
|
||||
|
||||
#endif
|
@ -1,32 +0,0 @@
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: lookup based functions
|
||||
last mod: $Id: lookup.h 16227 2009-07-08 06:58:46Z xiphmont $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
#ifndef _V_LOOKUP_H_
|
||||
|
||||
#ifdef FLOAT_LOOKUP
|
||||
extern float vorbis_coslook(float a);
|
||||
extern float vorbis_invsqlook(float a);
|
||||
extern float vorbis_invsq2explook(int a);
|
||||
extern float vorbis_fromdBlook(float a);
|
||||
#endif
|
||||
#ifdef INT_LOOKUP
|
||||
extern long vorbis_invsqlook_i(long a,long e);
|
||||
extern long vorbis_coslook_i(long a);
|
||||
extern float vorbis_fromdBlook_i(long a);
|
||||
#endif
|
||||
|
||||
#endif
|
@ -1,192 +0,0 @@
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: lookup data; generated by lookups.pl; edit there
|
||||
last mod: $Id: lookup_data.h 16037 2009-05-26 21:10:58Z xiphmont $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
#ifndef _V_LOOKUP_DATA_H_
|
||||
|
||||
#ifdef FLOAT_LOOKUP
|
||||
#define COS_LOOKUP_SZ 128
|
||||
static const float COS_LOOKUP[COS_LOOKUP_SZ+1]={
|
||||
+1.0000000000000f,+0.9996988186962f,+0.9987954562052f,+0.9972904566787f,
|
||||
+0.9951847266722f,+0.9924795345987f,+0.9891765099648f,+0.9852776423889f,
|
||||
+0.9807852804032f,+0.9757021300385f,+0.9700312531945f,+0.9637760657954f,
|
||||
+0.9569403357322f,+0.9495281805930f,+0.9415440651830f,+0.9329927988347f,
|
||||
+0.9238795325113f,+0.9142097557035f,+0.9039892931234f,+0.8932243011955f,
|
||||
+0.8819212643484f,+0.8700869911087f,+0.8577286100003f,+0.8448535652497f,
|
||||
+0.8314696123025f,+0.8175848131516f,+0.8032075314806f,+0.7883464276266f,
|
||||
+0.7730104533627f,+0.7572088465065f,+0.7409511253550f,+0.7242470829515f,
|
||||
+0.7071067811865f,+0.6895405447371f,+0.6715589548470f,+0.6531728429538f,
|
||||
+0.6343932841636f,+0.6152315905806f,+0.5956993044924f,+0.5758081914178f,
|
||||
+0.5555702330196f,+0.5349976198871f,+0.5141027441932f,+0.4928981922298f,
|
||||
+0.4713967368260f,+0.4496113296546f,+0.4275550934303f,+0.4052413140050f,
|
||||
+0.3826834323651f,+0.3598950365350f,+0.3368898533922f,+0.3136817403989f,
|
||||
+0.2902846772545f,+0.2667127574749f,+0.2429801799033f,+0.2191012401569f,
|
||||
+0.1950903220161f,+0.1709618887603f,+0.1467304744554f,+0.1224106751992f,
|
||||
+0.0980171403296f,+0.0735645635997f,+0.0490676743274f,+0.0245412285229f,
|
||||
+0.0000000000000f,-0.0245412285229f,-0.0490676743274f,-0.0735645635997f,
|
||||
-0.0980171403296f,-0.1224106751992f,-0.1467304744554f,-0.1709618887603f,
|
||||
-0.1950903220161f,-0.2191012401569f,-0.2429801799033f,-0.2667127574749f,
|
||||
-0.2902846772545f,-0.3136817403989f,-0.3368898533922f,-0.3598950365350f,
|
||||
-0.3826834323651f,-0.4052413140050f,-0.4275550934303f,-0.4496113296546f,
|
||||
-0.4713967368260f,-0.4928981922298f,-0.5141027441932f,-0.5349976198871f,
|
||||
-0.5555702330196f,-0.5758081914178f,-0.5956993044924f,-0.6152315905806f,
|
||||
-0.6343932841636f,-0.6531728429538f,-0.6715589548470f,-0.6895405447371f,
|
||||
-0.7071067811865f,-0.7242470829515f,-0.7409511253550f,-0.7572088465065f,
|
||||
-0.7730104533627f,-0.7883464276266f,-0.8032075314806f,-0.8175848131516f,
|
||||
-0.8314696123025f,-0.8448535652497f,-0.8577286100003f,-0.8700869911087f,
|
||||
-0.8819212643484f,-0.8932243011955f,-0.9039892931234f,-0.9142097557035f,
|
||||
-0.9238795325113f,-0.9329927988347f,-0.9415440651830f,-0.9495281805930f,
|
||||
-0.9569403357322f,-0.9637760657954f,-0.9700312531945f,-0.9757021300385f,
|
||||
-0.9807852804032f,-0.9852776423889f,-0.9891765099648f,-0.9924795345987f,
|
||||
-0.9951847266722f,-0.9972904566787f,-0.9987954562052f,-0.9996988186962f,
|
||||
-1.0000000000000f,
|
||||
};
|
||||
|
||||
#define INVSQ_LOOKUP_SZ 32
|
||||
static const float INVSQ_LOOKUP[INVSQ_LOOKUP_SZ+1]={
|
||||
1.414213562373f,1.392621247646f,1.371988681140f,1.352246807566f,
|
||||
1.333333333333f,1.315191898443f,1.297771369046f,1.281025230441f,
|
||||
1.264911064067f,1.249390095109f,1.234426799697f,1.219988562661f,
|
||||
1.206045378311f,1.192569588000f,1.179535649239f,1.166919931983f,
|
||||
1.154700538379f,1.142857142857f,1.131370849898f,1.120224067222f,
|
||||
1.109400392450f,1.098884511590f,1.088662107904f,1.078719779941f,
|
||||
1.069044967650f,1.059625885652f,1.050451462878f,1.041511287847f,
|
||||
1.032795558989f,1.024295039463f,1.016001016002f,1.007905261358f,
|
||||
1.000000000000f,
|
||||
};
|
||||
|
||||
#define INVSQ2EXP_LOOKUP_MIN (-32)
|
||||
#define INVSQ2EXP_LOOKUP_MAX 32
|
||||
static const float INVSQ2EXP_LOOKUP[INVSQ2EXP_LOOKUP_MAX-\
|
||||
INVSQ2EXP_LOOKUP_MIN+1]={
|
||||
65536.f, 46340.95001f, 32768.f, 23170.47501f,
|
||||
16384.f, 11585.2375f, 8192.f, 5792.618751f,
|
||||
4096.f, 2896.309376f, 2048.f, 1448.154688f,
|
||||
1024.f, 724.0773439f, 512.f, 362.038672f,
|
||||
256.f, 181.019336f, 128.f, 90.50966799f,
|
||||
64.f, 45.254834f, 32.f, 22.627417f,
|
||||
16.f, 11.3137085f, 8.f, 5.656854249f,
|
||||
4.f, 2.828427125f, 2.f, 1.414213562f,
|
||||
1.f, 0.7071067812f, 0.5f, 0.3535533906f,
|
||||
0.25f, 0.1767766953f, 0.125f, 0.08838834765f,
|
||||
0.0625f, 0.04419417382f, 0.03125f, 0.02209708691f,
|
||||
0.015625f, 0.01104854346f, 0.0078125f, 0.005524271728f,
|
||||
0.00390625f, 0.002762135864f, 0.001953125f, 0.001381067932f,
|
||||
0.0009765625f, 0.000690533966f, 0.00048828125f, 0.000345266983f,
|
||||
0.000244140625f,0.0001726334915f,0.0001220703125f,8.631674575e-05f,
|
||||
6.103515625e-05f,4.315837288e-05f,3.051757812e-05f,2.157918644e-05f,
|
||||
1.525878906e-05f,
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
#define FROMdB_LOOKUP_SZ 35
|
||||
#define FROMdB2_LOOKUP_SZ 32
|
||||
#define FROMdB_SHIFT 5
|
||||
#define FROMdB2_SHIFT 3
|
||||
#define FROMdB2_MASK 31
|
||||
|
||||
#ifdef FLOAT_LOOKUP
|
||||
static const float FROMdB_LOOKUP[FROMdB_LOOKUP_SZ]={
|
||||
1.f, 0.6309573445f, 0.3981071706f, 0.2511886432f,
|
||||
0.1584893192f, 0.1f, 0.06309573445f, 0.03981071706f,
|
||||
0.02511886432f, 0.01584893192f, 0.01f, 0.006309573445f,
|
||||
0.003981071706f, 0.002511886432f, 0.001584893192f, 0.001f,
|
||||
0.0006309573445f,0.0003981071706f,0.0002511886432f,0.0001584893192f,
|
||||
0.0001f,6.309573445e-05f,3.981071706e-05f,2.511886432e-05f,
|
||||
1.584893192e-05f, 1e-05f,6.309573445e-06f,3.981071706e-06f,
|
||||
2.511886432e-06f,1.584893192e-06f, 1e-06f,6.309573445e-07f,
|
||||
3.981071706e-07f,2.511886432e-07f,1.584893192e-07f,
|
||||
};
|
||||
|
||||
static const float FROMdB2_LOOKUP[FROMdB2_LOOKUP_SZ]={
|
||||
0.9928302478f, 0.9786445908f, 0.9646616199f, 0.9508784391f,
|
||||
0.9372921937f, 0.92390007f, 0.9106992942f, 0.8976871324f,
|
||||
0.8848608897f, 0.8722179097f, 0.8597555737f, 0.8474713009f,
|
||||
0.835362547f, 0.8234268041f, 0.8116616003f, 0.8000644989f,
|
||||
0.7886330981f, 0.7773650302f, 0.7662579617f, 0.755309592f,
|
||||
0.7445176537f, 0.7338799116f, 0.7233941627f, 0.7130582353f,
|
||||
0.7028699885f, 0.6928273125f, 0.6829281272f, 0.6731703824f,
|
||||
0.6635520573f, 0.6540711597f, 0.6447257262f, 0.6355138211f,
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef INT_LOOKUP
|
||||
|
||||
#define INVSQ_LOOKUP_I_SHIFT 10
|
||||
#define INVSQ_LOOKUP_I_MASK 1023
|
||||
static const long INVSQ_LOOKUP_I[64+1]={
|
||||
92682l, 91966l, 91267l, 90583l,
|
||||
89915l, 89261l, 88621l, 87995l,
|
||||
87381l, 86781l, 86192l, 85616l,
|
||||
85051l, 84497l, 83953l, 83420l,
|
||||
82897l, 82384l, 81880l, 81385l,
|
||||
80899l, 80422l, 79953l, 79492l,
|
||||
79039l, 78594l, 78156l, 77726l,
|
||||
77302l, 76885l, 76475l, 76072l,
|
||||
75674l, 75283l, 74898l, 74519l,
|
||||
74146l, 73778l, 73415l, 73058l,
|
||||
72706l, 72359l, 72016l, 71679l,
|
||||
71347l, 71019l, 70695l, 70376l,
|
||||
70061l, 69750l, 69444l, 69141l,
|
||||
68842l, 68548l, 68256l, 67969l,
|
||||
67685l, 67405l, 67128l, 66855l,
|
||||
66585l, 66318l, 66054l, 65794l,
|
||||
65536l,
|
||||
};
|
||||
|
||||
#define COS_LOOKUP_I_SHIFT 9
|
||||
#define COS_LOOKUP_I_MASK 511
|
||||
#define COS_LOOKUP_I_SZ 128
|
||||
static const long COS_LOOKUP_I[COS_LOOKUP_I_SZ+1]={
|
||||
16384l, 16379l, 16364l, 16340l,
|
||||
16305l, 16261l, 16207l, 16143l,
|
||||
16069l, 15986l, 15893l, 15791l,
|
||||
15679l, 15557l, 15426l, 15286l,
|
||||
15137l, 14978l, 14811l, 14635l,
|
||||
14449l, 14256l, 14053l, 13842l,
|
||||
13623l, 13395l, 13160l, 12916l,
|
||||
12665l, 12406l, 12140l, 11866l,
|
||||
11585l, 11297l, 11003l, 10702l,
|
||||
10394l, 10080l, 9760l, 9434l,
|
||||
9102l, 8765l, 8423l, 8076l,
|
||||
7723l, 7366l, 7005l, 6639l,
|
||||
6270l, 5897l, 5520l, 5139l,
|
||||
4756l, 4370l, 3981l, 3590l,
|
||||
3196l, 2801l, 2404l, 2006l,
|
||||
1606l, 1205l, 804l, 402l,
|
||||
0l, -401l, -803l, -1204l,
|
||||
-1605l, -2005l, -2403l, -2800l,
|
||||
-3195l, -3589l, -3980l, -4369l,
|
||||
-4755l, -5138l, -5519l, -5896l,
|
||||
-6269l, -6638l, -7004l, -7365l,
|
||||
-7722l, -8075l, -8422l, -8764l,
|
||||
-9101l, -9433l, -9759l, -10079l,
|
||||
-10393l, -10701l, -11002l, -11296l,
|
||||
-11584l, -11865l, -12139l, -12405l,
|
||||
-12664l, -12915l, -13159l, -13394l,
|
||||
-13622l, -13841l, -14052l, -14255l,
|
||||
-14448l, -14634l, -14810l, -14977l,
|
||||
-15136l, -15285l, -15425l, -15556l,
|
||||
-15678l, -15790l, -15892l, -15985l,
|
||||
-16068l, -16142l, -16206l, -16260l,
|
||||
-16304l, -16339l, -16363l, -16378l,
|
||||
-16383l,
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
@ -1,142 +0,0 @@
|
||||
#!/usr/bin/perl
|
||||
print <<'EOD';
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: lookup data; generated by lookups.pl; edit there
|
||||
last mod: $Id: lookups.pl 13293 2007-07-24 00:09:47Z xiphmont $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
#ifndef _V_LOOKUP_DATA_H_
|
||||
|
||||
#ifdef FLOAT_LOOKUP
|
||||
EOD
|
||||
|
||||
$cos_sz=128;
|
||||
$invsq_sz=32;
|
||||
$invsq2exp_min=-32;
|
||||
$invsq2exp_max=32;
|
||||
|
||||
$fromdB_sz=35;
|
||||
$fromdB_shift=5;
|
||||
$fromdB2_shift=3;
|
||||
|
||||
$invsq_i_shift=10;
|
||||
$cos_i_shift=9;
|
||||
$delta_shift=6;
|
||||
|
||||
print "#define COS_LOOKUP_SZ $cos_sz\n";
|
||||
print "static float COS_LOOKUP[COS_LOOKUP_SZ+1]={\n";
|
||||
|
||||
for($i=0;$i<=$cos_sz;){
|
||||
print "\t";
|
||||
for($j=0;$j<4 && $i<=$cos_sz;$j++){
|
||||
printf "%+.13f,", cos(3.14159265358979323846*($i++)/$cos_sz) ;
|
||||
}
|
||||
print "\n";
|
||||
}
|
||||
print "};\n\n";
|
||||
|
||||
print "#define INVSQ_LOOKUP_SZ $invsq_sz\n";
|
||||
print "static float INVSQ_LOOKUP[INVSQ_LOOKUP_SZ+1]={\n";
|
||||
|
||||
for($i=0;$i<=$invsq_sz;){
|
||||
print "\t";
|
||||
for($j=0;$j<4 && $i<=$invsq_sz;$j++){
|
||||
my$indexmap=$i++/$invsq_sz*.5+.5;
|
||||
printf "%.12f,", 1./sqrt($indexmap);
|
||||
}
|
||||
print "\n";
|
||||
}
|
||||
print "};\n\n";
|
||||
|
||||
print "#define INVSQ2EXP_LOOKUP_MIN $invsq2exp_min\n";
|
||||
print "#define INVSQ2EXP_LOOKUP_MAX $invsq2exp_max\n";
|
||||
print "static float INVSQ2EXP_LOOKUP[INVSQ2EXP_LOOKUP_MAX-\\\n".
|
||||
" INVSQ2EXP_LOOKUP_MIN+1]={\n";
|
||||
|
||||
for($i=$invsq2exp_min;$i<=$invsq2exp_max;){
|
||||
print "\t";
|
||||
for($j=0;$j<4 && $i<=$invsq2exp_max;$j++){
|
||||
printf "%15.10g,", 2**($i++*-.5);
|
||||
}
|
||||
print "\n";
|
||||
}
|
||||
print "};\n\n#endif\n\n";
|
||||
|
||||
|
||||
# 0 to -140 dB
|
||||
$fromdB2_sz=1<<$fromdB_shift;
|
||||
$fromdB_gran=1<<($fromdB_shift-$fromdB2_shift);
|
||||
print "#define FROMdB_LOOKUP_SZ $fromdB_sz\n";
|
||||
print "#define FROMdB2_LOOKUP_SZ $fromdB2_sz\n";
|
||||
print "#define FROMdB_SHIFT $fromdB_shift\n";
|
||||
print "#define FROMdB2_SHIFT $fromdB2_shift\n";
|
||||
print "#define FROMdB2_MASK ".((1<<$fromdB_shift)-1)."\n";
|
||||
|
||||
print "static float FROMdB_LOOKUP[FROMdB_LOOKUP_SZ]={\n";
|
||||
|
||||
for($i=0;$i<$fromdB_sz;){
|
||||
print "\t";
|
||||
for($j=0;$j<4 && $i<$fromdB_sz;$j++){
|
||||
printf "%15.10g,", 10**(.05*(-$fromdB_gran*$i++));
|
||||
}
|
||||
print "\n";
|
||||
}
|
||||
print "};\n\n";
|
||||
|
||||
print "static float FROMdB2_LOOKUP[FROMdB2_LOOKUP_SZ]={\n";
|
||||
|
||||
for($i=0;$i<$fromdB2_sz;){
|
||||
print "\t";
|
||||
for($j=0;$j<4 && $i<$fromdB_sz;$j++){
|
||||
printf "%15.10g,", 10**(.05*(-$fromdB_gran/$fromdB2_sz*(.5+$i++)));
|
||||
}
|
||||
print "\n";
|
||||
}
|
||||
print "};\n\n#ifdef INT_LOOKUP\n\n";
|
||||
|
||||
|
||||
$iisz=0x10000>>$invsq_i_shift;
|
||||
print "#define INVSQ_LOOKUP_I_SHIFT $invsq_i_shift\n";
|
||||
print "#define INVSQ_LOOKUP_I_MASK ".(0x0ffff>>(16-$invsq_i_shift))."\n";
|
||||
print "static long INVSQ_LOOKUP_I[$iisz+1]={\n";
|
||||
for($i=0;$i<=$iisz;){
|
||||
print "\t";
|
||||
for($j=0;$j<4 && $i<=$iisz;$j++){
|
||||
my$indexmap=$i++/$iisz*.5+.5;
|
||||
printf "%8d,", int(1./sqrt($indexmap)*65536.+.5);
|
||||
}
|
||||
print "\n";
|
||||
}
|
||||
print "};\n\n";
|
||||
|
||||
$cisz=0x10000>>$cos_i_shift;
|
||||
print "#define COS_LOOKUP_I_SHIFT $cos_i_shift\n";
|
||||
print "#define COS_LOOKUP_I_MASK ".(0x0ffff>>(16-$cos_i_shift))."\n";
|
||||
print "#define COS_LOOKUP_I_SZ $cisz\n";
|
||||
print "static long COS_LOOKUP_I[COS_LOOKUP_I_SZ+1]={\n";
|
||||
|
||||
for($i=0;$i<=$cisz;){
|
||||
print "\t";
|
||||
for($j=0;$j<4 && $i<=$cisz;$j++){
|
||||
printf "%8d,", int(cos(3.14159265358979323846*($i++)/$cos_sz)*16384.+.5) ;
|
||||
}
|
||||
print "\n";
|
||||
}
|
||||
print "};\n\n";
|
||||
|
||||
|
||||
print "#endif\n\n#endif\n";
|
||||
|
||||
|
@ -1,160 +0,0 @@
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: LPC low level routines
|
||||
last mod: $Id: lpc.c 16227 2009-07-08 06:58:46Z xiphmont $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
/* Some of these routines (autocorrelator, LPC coefficient estimator)
|
||||
are derived from code written by Jutta Degener and Carsten Bormann;
|
||||
thus we include their copyright below. The entirety of this file
|
||||
is freely redistributable on the condition that both of these
|
||||
copyright notices are preserved without modification. */
|
||||
|
||||
/* Preserved Copyright: *********************************************/
|
||||
|
||||
/* Copyright 1992, 1993, 1994 by Jutta Degener and Carsten Bormann,
|
||||
Technische Universita"t Berlin
|
||||
|
||||
Any use of this software is permitted provided that this notice is not
|
||||
removed and that neither the authors nor the Technische Universita"t
|
||||
Berlin are deemed to have made any representations as to the
|
||||
suitability of this software for any purpose nor are held responsible
|
||||
for any defects of this software. THERE IS ABSOLUTELY NO WARRANTY FOR
|
||||
THIS SOFTWARE.
|
||||
|
||||
As a matter of courtesy, the authors request to be informed about uses
|
||||
this software has found, about bugs in this software, and about any
|
||||
improvements that may be of general interest.
|
||||
|
||||
Berlin, 28.11.1994
|
||||
Jutta Degener
|
||||
Carsten Bormann
|
||||
|
||||
*********************************************************************/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
#include "os.h"
|
||||
#include "smallft.h"
|
||||
#include "lpc.h"
|
||||
#include "scales.h"
|
||||
#include "misc.h"
|
||||
|
||||
/* Autocorrelation LPC coeff generation algorithm invented by
|
||||
N. Levinson in 1947, modified by J. Durbin in 1959. */
|
||||
|
||||
/* Input : n elements of time doamin data
|
||||
Output: m lpc coefficients, excitation energy */
|
||||
|
||||
float vorbis_lpc_from_data(float *data,float *lpci,int n,int m){
|
||||
double *aut=alloca(sizeof(*aut)*(m+1));
|
||||
double *lpc=alloca(sizeof(*lpc)*(m));
|
||||
double error;
|
||||
double epsilon;
|
||||
int i,j;
|
||||
|
||||
/* autocorrelation, p+1 lag coefficients */
|
||||
j=m+1;
|
||||
while(j--){
|
||||
double d=0; /* double needed for accumulator depth */
|
||||
for(i=j;i<n;i++)d+=(double)data[i]*data[i-j];
|
||||
aut[j]=d;
|
||||
}
|
||||
|
||||
/* Generate lpc coefficients from autocorr values */
|
||||
|
||||
/* set our noise floor to about -100dB */
|
||||
error=aut[0] * (1. + 1e-10);
|
||||
epsilon=1e-9*aut[0]+1e-10;
|
||||
|
||||
for(i=0;i<m;i++){
|
||||
double r= -aut[i+1];
|
||||
|
||||
if(error<epsilon){
|
||||
memset(lpc+i,0,(m-i)*sizeof(*lpc));
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* Sum up this iteration's reflection coefficient; note that in
|
||||
Vorbis we don't save it. If anyone wants to recycle this code
|
||||
and needs reflection coefficients, save the results of 'r' from
|
||||
each iteration. */
|
||||
|
||||
for(j=0;j<i;j++)r-=lpc[j]*aut[i-j];
|
||||
r/=error;
|
||||
|
||||
/* Update LPC coefficients and total error */
|
||||
|
||||
lpc[i]=r;
|
||||
for(j=0;j<i/2;j++){
|
||||
double tmp=lpc[j];
|
||||
|
||||
lpc[j]+=r*lpc[i-1-j];
|
||||
lpc[i-1-j]+=r*tmp;
|
||||
}
|
||||
if(i&1)lpc[j]+=lpc[j]*r;
|
||||
|
||||
error*=1.-r*r;
|
||||
|
||||
}
|
||||
|
||||
done:
|
||||
|
||||
/* slightly damp the filter */
|
||||
{
|
||||
double g = .99;
|
||||
double damp = g;
|
||||
for(j=0;j<m;j++){
|
||||
lpc[j]*=damp;
|
||||
damp*=g;
|
||||
}
|
||||
}
|
||||
|
||||
for(j=0;j<m;j++)lpci[j]=(float)lpc[j];
|
||||
|
||||
/* we need the error value to know how big an impulse to hit the
|
||||
filter with later */
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
void vorbis_lpc_predict(float *coeff,float *prime,int m,
|
||||
float *data,long n){
|
||||
|
||||
/* in: coeff[0...m-1] LPC coefficients
|
||||
prime[0...m-1] initial values (allocated size of n+m-1)
|
||||
out: data[0...n-1] data samples */
|
||||
|
||||
long i,j,o,p;
|
||||
float y;
|
||||
float *work=alloca(sizeof(*work)*(m+n));
|
||||
|
||||
if(!prime)
|
||||
for(i=0;i<m;i++)
|
||||
work[i]=0.f;
|
||||
else
|
||||
for(i=0;i<m;i++)
|
||||
work[i]=prime[i];
|
||||
|
||||
for(i=0;i<n;i++){
|
||||
y=0;
|
||||
o=i;
|
||||
p=m;
|
||||
for(j=0;j<m;j++)
|
||||
y-=work[o++]*coeff[--p];
|
||||
|
||||
data[i]=work[o]=y;
|
||||
}
|
||||
}
|
@ -1,29 +0,0 @@
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: LPC low level routines
|
||||
last mod: $Id: lpc.h 16037 2009-05-26 21:10:58Z xiphmont $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
#ifndef _V_LPC_H_
|
||||
#define _V_LPC_H_
|
||||
|
||||
#include "vorbis/codec.h"
|
||||
|
||||
/* simple linear scale LPC code */
|
||||
extern float vorbis_lpc_from_data(float *data,float *lpc,int n,int m);
|
||||
|
||||
extern void vorbis_lpc_predict(float *coeff,float *prime,int m,
|
||||
float *data,long n);
|
||||
|
||||
#endif
|
@ -1,454 +0,0 @@
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: LSP (also called LSF) conversion routines
|
||||
last mod: $Id: lsp.c 19453 2015-03-02 22:35:34Z xiphmont $
|
||||
|
||||
The LSP generation code is taken (with minimal modification and a
|
||||
few bugfixes) from "On the Computation of the LSP Frequencies" by
|
||||
Joseph Rothweiler (see http://www.rothweiler.us for contact info).
|
||||
The paper is available at:
|
||||
|
||||
http://www.myown1.com/joe/lsf
|
||||
|
||||
********************************************************************/
|
||||
|
||||
/* Note that the lpc-lsp conversion finds the roots of polynomial with
|
||||
an iterative root polisher (CACM algorithm 283). It *is* possible
|
||||
to confuse this algorithm into not converging; that should only
|
||||
happen with absurdly closely spaced roots (very sharp peaks in the
|
||||
LPC f response) which in turn should be impossible in our use of
|
||||
the code. If this *does* happen anyway, it's a bug in the floor
|
||||
finder; find the cause of the confusion (probably a single bin
|
||||
spike or accidental near-float-limit resolution problems) and
|
||||
correct it. */
|
||||
|
||||
#include <math.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include "lsp.h"
|
||||
#include "os.h"
|
||||
#include "misc.h"
|
||||
#include "lookup.h"
|
||||
#include "scales.h"
|
||||
|
||||
/* three possible LSP to f curve functions; the exact computation
|
||||
(float), a lookup based float implementation, and an integer
|
||||
implementation. The float lookup is likely the optimal choice on
|
||||
any machine with an FPU. The integer implementation is *not* fixed
|
||||
point (due to the need for a large dynamic range and thus a
|
||||
separately tracked exponent) and thus much more complex than the
|
||||
relatively simple float implementations. It's mostly for future
|
||||
work on a fully fixed point implementation for processors like the
|
||||
ARM family. */
|
||||
|
||||
/* define either of these (preferably FLOAT_LOOKUP) to have faster
|
||||
but less precise implementation. */
|
||||
#undef FLOAT_LOOKUP
|
||||
#undef INT_LOOKUP
|
||||
|
||||
#ifdef FLOAT_LOOKUP
|
||||
#include "lookup.c" /* catch this in the build system; we #include for
|
||||
compilers (like gcc) that can't inline across
|
||||
modules */
|
||||
|
||||
/* side effect: changes *lsp to cosines of lsp */
|
||||
void vorbis_lsp_to_curve(float *curve,int *map,int n,int ln,float *lsp,int m,
|
||||
float amp,float ampoffset){
|
||||
int i;
|
||||
float wdel=M_PI/ln;
|
||||
vorbis_fpu_control fpu;
|
||||
|
||||
vorbis_fpu_setround(&fpu);
|
||||
for(i=0;i<m;i++)lsp[i]=vorbis_coslook(lsp[i]);
|
||||
|
||||
i=0;
|
||||
while(i<n){
|
||||
int k=map[i];
|
||||
int qexp;
|
||||
float p=.7071067812f;
|
||||
float q=.7071067812f;
|
||||
float w=vorbis_coslook(wdel*k);
|
||||
float *ftmp=lsp;
|
||||
int c=m>>1;
|
||||
|
||||
while(c--){
|
||||
q*=ftmp[0]-w;
|
||||
p*=ftmp[1]-w;
|
||||
ftmp+=2;
|
||||
}
|
||||
|
||||
if(m&1){
|
||||
/* odd order filter; slightly assymetric */
|
||||
/* the last coefficient */
|
||||
q*=ftmp[0]-w;
|
||||
q*=q;
|
||||
p*=p*(1.f-w*w);
|
||||
}else{
|
||||
/* even order filter; still symmetric */
|
||||
q*=q*(1.f+w);
|
||||
p*=p*(1.f-w);
|
||||
}
|
||||
|
||||
q=frexp(p+q,&qexp);
|
||||
q=vorbis_fromdBlook(amp*
|
||||
vorbis_invsqlook(q)*
|
||||
vorbis_invsq2explook(qexp+m)-
|
||||
ampoffset);
|
||||
|
||||
do{
|
||||
curve[i++]*=q;
|
||||
}while(map[i]==k);
|
||||
}
|
||||
vorbis_fpu_restore(fpu);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
#ifdef INT_LOOKUP
|
||||
#include "lookup.c" /* catch this in the build system; we #include for
|
||||
compilers (like gcc) that can't inline across
|
||||
modules */
|
||||
|
||||
static const int MLOOP_1[64]={
|
||||
0,10,11,11, 12,12,12,12, 13,13,13,13, 13,13,13,13,
|
||||
14,14,14,14, 14,14,14,14, 14,14,14,14, 14,14,14,14,
|
||||
15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15,
|
||||
15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15,
|
||||
};
|
||||
|
||||
static const int MLOOP_2[64]={
|
||||
0,4,5,5, 6,6,6,6, 7,7,7,7, 7,7,7,7,
|
||||
8,8,8,8, 8,8,8,8, 8,8,8,8, 8,8,8,8,
|
||||
9,9,9,9, 9,9,9,9, 9,9,9,9, 9,9,9,9,
|
||||
9,9,9,9, 9,9,9,9, 9,9,9,9, 9,9,9,9,
|
||||
};
|
||||
|
||||
static const int MLOOP_3[8]={0,1,2,2,3,3,3,3};
|
||||
|
||||
|
||||
/* side effect: changes *lsp to cosines of lsp */
|
||||
void vorbis_lsp_to_curve(float *curve,int *map,int n,int ln,float *lsp,int m,
|
||||
float amp,float ampoffset){
|
||||
|
||||
/* 0 <= m < 256 */
|
||||
|
||||
/* set up for using all int later */
|
||||
int i;
|
||||
int ampoffseti=rint(ampoffset*4096.f);
|
||||
int ampi=rint(amp*16.f);
|
||||
long *ilsp=alloca(m*sizeof(*ilsp));
|
||||
for(i=0;i<m;i++)ilsp[i]=vorbis_coslook_i(lsp[i]/M_PI*65536.f+.5f);
|
||||
|
||||
i=0;
|
||||
while(i<n){
|
||||
int j,k=map[i];
|
||||
unsigned long pi=46341; /* 2**-.5 in 0.16 */
|
||||
unsigned long qi=46341;
|
||||
int qexp=0,shift;
|
||||
long wi=vorbis_coslook_i(k*65536/ln);
|
||||
|
||||
qi*=labs(ilsp[0]-wi);
|
||||
pi*=labs(ilsp[1]-wi);
|
||||
|
||||
for(j=3;j<m;j+=2){
|
||||
if(!(shift=MLOOP_1[(pi|qi)>>25]))
|
||||
if(!(shift=MLOOP_2[(pi|qi)>>19]))
|
||||
shift=MLOOP_3[(pi|qi)>>16];
|
||||
qi=(qi>>shift)*labs(ilsp[j-1]-wi);
|
||||
pi=(pi>>shift)*labs(ilsp[j]-wi);
|
||||
qexp+=shift;
|
||||
}
|
||||
if(!(shift=MLOOP_1[(pi|qi)>>25]))
|
||||
if(!(shift=MLOOP_2[(pi|qi)>>19]))
|
||||
shift=MLOOP_3[(pi|qi)>>16];
|
||||
|
||||
/* pi,qi normalized collectively, both tracked using qexp */
|
||||
|
||||
if(m&1){
|
||||
/* odd order filter; slightly assymetric */
|
||||
/* the last coefficient */
|
||||
qi=(qi>>shift)*labs(ilsp[j-1]-wi);
|
||||
pi=(pi>>shift)<<14;
|
||||
qexp+=shift;
|
||||
|
||||
if(!(shift=MLOOP_1[(pi|qi)>>25]))
|
||||
if(!(shift=MLOOP_2[(pi|qi)>>19]))
|
||||
shift=MLOOP_3[(pi|qi)>>16];
|
||||
|
||||
pi>>=shift;
|
||||
qi>>=shift;
|
||||
qexp+=shift-14*((m+1)>>1);
|
||||
|
||||
pi=((pi*pi)>>16);
|
||||
qi=((qi*qi)>>16);
|
||||
qexp=qexp*2+m;
|
||||
|
||||
pi*=(1<<14)-((wi*wi)>>14);
|
||||
qi+=pi>>14;
|
||||
|
||||
}else{
|
||||
/* even order filter; still symmetric */
|
||||
|
||||
/* p*=p(1-w), q*=q(1+w), let normalization drift because it isn't
|
||||
worth tracking step by step */
|
||||
|
||||
pi>>=shift;
|
||||
qi>>=shift;
|
||||
qexp+=shift-7*m;
|
||||
|
||||
pi=((pi*pi)>>16);
|
||||
qi=((qi*qi)>>16);
|
||||
qexp=qexp*2+m;
|
||||
|
||||
pi*=(1<<14)-wi;
|
||||
qi*=(1<<14)+wi;
|
||||
qi=(qi+pi)>>14;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* we've let the normalization drift because it wasn't important;
|
||||
however, for the lookup, things must be normalized again. We
|
||||
need at most one right shift or a number of left shifts */
|
||||
|
||||
if(qi&0xffff0000){ /* checks for 1.xxxxxxxxxxxxxxxx */
|
||||
qi>>=1; qexp++;
|
||||
}else
|
||||
while(qi && !(qi&0x8000)){ /* checks for 0.0xxxxxxxxxxxxxxx or less*/
|
||||
qi<<=1; qexp--;
|
||||
}
|
||||
|
||||
amp=vorbis_fromdBlook_i(ampi* /* n.4 */
|
||||
vorbis_invsqlook_i(qi,qexp)-
|
||||
/* m.8, m+n<=8 */
|
||||
ampoffseti); /* 8.12[0] */
|
||||
|
||||
curve[i]*=amp;
|
||||
while(map[++i]==k)curve[i]*=amp;
|
||||
}
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
/* old, nonoptimized but simple version for any poor sap who needs to
|
||||
figure out what the hell this code does, or wants the other
|
||||
fraction of a dB precision */
|
||||
|
||||
/* side effect: changes *lsp to cosines of lsp */
|
||||
void vorbis_lsp_to_curve(float *curve,int *map,int n,int ln,float *lsp,int m,
|
||||
float amp,float ampoffset){
|
||||
int i;
|
||||
float wdel=M_PI/ln;
|
||||
for(i=0;i<m;i++)lsp[i]=2.f*cos(lsp[i]);
|
||||
|
||||
i=0;
|
||||
while(i<n){
|
||||
int j,k=map[i];
|
||||
float p=.5f;
|
||||
float q=.5f;
|
||||
float w=2.f*cos(wdel*k);
|
||||
for(j=1;j<m;j+=2){
|
||||
q *= w-lsp[j-1];
|
||||
p *= w-lsp[j];
|
||||
}
|
||||
if(j==m){
|
||||
/* odd order filter; slightly assymetric */
|
||||
/* the last coefficient */
|
||||
q*=w-lsp[j-1];
|
||||
p*=p*(4.f-w*w);
|
||||
q*=q;
|
||||
}else{
|
||||
/* even order filter; still symmetric */
|
||||
p*=p*(2.f-w);
|
||||
q*=q*(2.f+w);
|
||||
}
|
||||
|
||||
q=fromdB(amp/sqrt(p+q)-ampoffset);
|
||||
|
||||
curve[i]*=q;
|
||||
while(map[++i]==k)curve[i]*=q;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
static void cheby(float *g, int ord) {
|
||||
int i, j;
|
||||
|
||||
g[0] *= .5f;
|
||||
for(i=2; i<= ord; i++) {
|
||||
for(j=ord; j >= i; j--) {
|
||||
g[j-2] -= g[j];
|
||||
g[j] += g[j];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int comp(const void *a,const void *b){
|
||||
return (*(float *)a<*(float *)b)-(*(float *)a>*(float *)b);
|
||||
}
|
||||
|
||||
/* Newton-Raphson-Maehly actually functioned as a decent root finder,
|
||||
but there are root sets for which it gets into limit cycles
|
||||
(exacerbated by zero suppression) and fails. We can't afford to
|
||||
fail, even if the failure is 1 in 100,000,000, so we now use
|
||||
Laguerre and later polish with Newton-Raphson (which can then
|
||||
afford to fail) */
|
||||
|
||||
#define EPSILON 10e-7
|
||||
static int Laguerre_With_Deflation(float *a,int ord,float *r){
|
||||
int i,m;
|
||||
double *defl=alloca(sizeof(*defl)*(ord+1));
|
||||
for(i=0;i<=ord;i++)defl[i]=a[i];
|
||||
|
||||
for(m=ord;m>0;m--){
|
||||
double new=0.f,delta;
|
||||
|
||||
/* iterate a root */
|
||||
while(1){
|
||||
double p=defl[m],pp=0.f,ppp=0.f,denom;
|
||||
|
||||
/* eval the polynomial and its first two derivatives */
|
||||
for(i=m;i>0;i--){
|
||||
ppp = new*ppp + pp;
|
||||
pp = new*pp + p;
|
||||
p = new*p + defl[i-1];
|
||||
}
|
||||
|
||||
/* Laguerre's method */
|
||||
denom=(m-1) * ((m-1)*pp*pp - m*p*ppp);
|
||||
if(denom<0)
|
||||
return(-1); /* complex root! The LPC generator handed us a bad filter */
|
||||
|
||||
if(pp>0){
|
||||
denom = pp + sqrt(denom);
|
||||
if(denom<EPSILON)denom=EPSILON;
|
||||
}else{
|
||||
denom = pp - sqrt(denom);
|
||||
if(denom>-(EPSILON))denom=-(EPSILON);
|
||||
}
|
||||
|
||||
delta = m*p/denom;
|
||||
new -= delta;
|
||||
|
||||
if(delta<0.f)delta*=-1;
|
||||
|
||||
if(fabs(delta/new)<10e-12)break;
|
||||
}
|
||||
|
||||
r[m-1]=new;
|
||||
|
||||
/* forward deflation */
|
||||
|
||||
for(i=m;i>0;i--)
|
||||
defl[i-1]+=new*defl[i];
|
||||
defl++;
|
||||
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
/* for spit-and-polish only */
|
||||
static int Newton_Raphson(float *a,int ord,float *r){
|
||||
int i, k, count=0;
|
||||
double error=1.f;
|
||||
double *root=alloca(ord*sizeof(*root));
|
||||
|
||||
for(i=0; i<ord;i++) root[i] = r[i];
|
||||
|
||||
while(error>1e-20){
|
||||
error=0;
|
||||
|
||||
for(i=0; i<ord; i++) { /* Update each point. */
|
||||
double pp=0.,delta;
|
||||
double rooti=root[i];
|
||||
double p=a[ord];
|
||||
for(k=ord-1; k>= 0; k--) {
|
||||
|
||||
pp= pp* rooti + p;
|
||||
p = p * rooti + a[k];
|
||||
}
|
||||
|
||||
delta = p/pp;
|
||||
root[i] -= delta;
|
||||
error+= delta*delta;
|
||||
}
|
||||
|
||||
if(count>40)return(-1);
|
||||
|
||||
count++;
|
||||
}
|
||||
|
||||
/* Replaced the original bubble sort with a real sort. With your
|
||||
help, we can eliminate the bubble sort in our lifetime. --Monty */
|
||||
|
||||
for(i=0; i<ord;i++) r[i] = root[i];
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
/* Convert lpc coefficients to lsp coefficients */
|
||||
int vorbis_lpc_to_lsp(float *lpc,float *lsp,int m){
|
||||
int order2=(m+1)>>1;
|
||||
int g1_order,g2_order;
|
||||
float *g1=alloca(sizeof(*g1)*(order2+1));
|
||||
float *g2=alloca(sizeof(*g2)*(order2+1));
|
||||
float *g1r=alloca(sizeof(*g1r)*(order2+1));
|
||||
float *g2r=alloca(sizeof(*g2r)*(order2+1));
|
||||
int i;
|
||||
|
||||
/* even and odd are slightly different base cases */
|
||||
g1_order=(m+1)>>1;
|
||||
g2_order=(m) >>1;
|
||||
|
||||
/* Compute the lengths of the x polynomials. */
|
||||
/* Compute the first half of K & R F1 & F2 polynomials. */
|
||||
/* Compute half of the symmetric and antisymmetric polynomials. */
|
||||
/* Remove the roots at +1 and -1. */
|
||||
|
||||
g1[g1_order] = 1.f;
|
||||
for(i=1;i<=g1_order;i++) g1[g1_order-i] = lpc[i-1]+lpc[m-i];
|
||||
g2[g2_order] = 1.f;
|
||||
for(i=1;i<=g2_order;i++) g2[g2_order-i] = lpc[i-1]-lpc[m-i];
|
||||
|
||||
if(g1_order>g2_order){
|
||||
for(i=2; i<=g2_order;i++) g2[g2_order-i] += g2[g2_order-i+2];
|
||||
}else{
|
||||
for(i=1; i<=g1_order;i++) g1[g1_order-i] -= g1[g1_order-i+1];
|
||||
for(i=1; i<=g2_order;i++) g2[g2_order-i] += g2[g2_order-i+1];
|
||||
}
|
||||
|
||||
/* Convert into polynomials in cos(alpha) */
|
||||
cheby(g1,g1_order);
|
||||
cheby(g2,g2_order);
|
||||
|
||||
/* Find the roots of the 2 even polynomials.*/
|
||||
if(Laguerre_With_Deflation(g1,g1_order,g1r) ||
|
||||
Laguerre_With_Deflation(g2,g2_order,g2r))
|
||||
return(-1);
|
||||
|
||||
Newton_Raphson(g1,g1_order,g1r); /* if it fails, it leaves g1r alone */
|
||||
Newton_Raphson(g2,g2_order,g2r); /* if it fails, it leaves g2r alone */
|
||||
|
||||
qsort(g1r,g1_order,sizeof(*g1r),comp);
|
||||
qsort(g2r,g2_order,sizeof(*g2r),comp);
|
||||
|
||||
for(i=0;i<g1_order;i++)
|
||||
lsp[i*2] = acos(g1r[i]);
|
||||
|
||||
for(i=0;i<g2_order;i++)
|
||||
lsp[i*2+1] = acos(g2r[i]);
|
||||
return(0);
|
||||
}
|
@ -1,28 +0,0 @@
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: LSP (also called LSF) conversion routines
|
||||
last mod: $Id: lsp.h 16227 2009-07-08 06:58:46Z xiphmont $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
|
||||
#ifndef _V_LSP_H_
|
||||
#define _V_LSP_H_
|
||||
|
||||
extern int vorbis_lpc_to_lsp(float *lpc,float *lsp,int m);
|
||||
|
||||
extern void vorbis_lsp_to_curve(float *curve,int *map,int n,int ln,
|
||||
float *lsp,int m,
|
||||
float amp,float ampoffset);
|
||||
|
||||
#endif
|
@ -1,810 +0,0 @@
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2010 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: channel mapping 0 implementation
|
||||
last mod: $Id: mapping0.c 19441 2015-01-21 01:17:41Z xiphmont $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
#include <ogg/ogg.h>
|
||||
#include "vorbis/codec.h"
|
||||
#include "codec_internal.h"
|
||||
#include "codebook.h"
|
||||
#include "window.h"
|
||||
#include "registry.h"
|
||||
#include "psy.h"
|
||||
#include "misc.h"
|
||||
|
||||
/* simplistic, wasteful way of doing this (unique lookup for each
|
||||
mode/submapping); there should be a central repository for
|
||||
identical lookups. That will require minor work, so I'm putting it
|
||||
off as low priority.
|
||||
|
||||
Why a lookup for each backend in a given mode? Because the
|
||||
blocksize is set by the mode, and low backend lookups may require
|
||||
parameters from other areas of the mode/mapping */
|
||||
|
||||
static void mapping0_free_info(vorbis_info_mapping *i){
|
||||
vorbis_info_mapping0 *info=(vorbis_info_mapping0 *)i;
|
||||
if(info){
|
||||
memset(info,0,sizeof(*info));
|
||||
_ogg_free(info);
|
||||
}
|
||||
}
|
||||
|
||||
static void mapping0_pack(vorbis_info *vi,vorbis_info_mapping *vm,
|
||||
oggpack_buffer *opb){
|
||||
int i;
|
||||
vorbis_info_mapping0 *info=(vorbis_info_mapping0 *)vm;
|
||||
|
||||
/* another 'we meant to do it this way' hack... up to beta 4, we
|
||||
packed 4 binary zeros here to signify one submapping in use. We
|
||||
now redefine that to mean four bitflags that indicate use of
|
||||
deeper features; bit0:submappings, bit1:coupling,
|
||||
bit2,3:reserved. This is backward compatable with all actual uses
|
||||
of the beta code. */
|
||||
|
||||
if(info->submaps>1){
|
||||
oggpack_write(opb,1,1);
|
||||
oggpack_write(opb,info->submaps-1,4);
|
||||
}else
|
||||
oggpack_write(opb,0,1);
|
||||
|
||||
if(info->coupling_steps>0){
|
||||
oggpack_write(opb,1,1);
|
||||
oggpack_write(opb,info->coupling_steps-1,8);
|
||||
|
||||
for(i=0;i<info->coupling_steps;i++){
|
||||
oggpack_write(opb,info->coupling_mag[i],ov_ilog(vi->channels-1));
|
||||
oggpack_write(opb,info->coupling_ang[i],ov_ilog(vi->channels-1));
|
||||
}
|
||||
}else
|
||||
oggpack_write(opb,0,1);
|
||||
|
||||
oggpack_write(opb,0,2); /* 2,3:reserved */
|
||||
|
||||
/* we don't write the channel submappings if we only have one... */
|
||||
if(info->submaps>1){
|
||||
for(i=0;i<vi->channels;i++)
|
||||
oggpack_write(opb,info->chmuxlist[i],4);
|
||||
}
|
||||
for(i=0;i<info->submaps;i++){
|
||||
oggpack_write(opb,0,8); /* time submap unused */
|
||||
oggpack_write(opb,info->floorsubmap[i],8);
|
||||
oggpack_write(opb,info->residuesubmap[i],8);
|
||||
}
|
||||
}
|
||||
|
||||
/* also responsible for range checking */
|
||||
static vorbis_info_mapping *mapping0_unpack(vorbis_info *vi,oggpack_buffer *opb){
|
||||
int i,b;
|
||||
vorbis_info_mapping0 *info=_ogg_calloc(1,sizeof(*info));
|
||||
codec_setup_info *ci=vi->codec_setup;
|
||||
memset(info,0,sizeof(*info));
|
||||
if(vi->channels<=0)goto err_out;
|
||||
|
||||
b=oggpack_read(opb,1);
|
||||
if(b<0)goto err_out;
|
||||
if(b){
|
||||
info->submaps=oggpack_read(opb,4)+1;
|
||||
if(info->submaps<=0)goto err_out;
|
||||
}else
|
||||
info->submaps=1;
|
||||
|
||||
b=oggpack_read(opb,1);
|
||||
if(b<0)goto err_out;
|
||||
if(b){
|
||||
info->coupling_steps=oggpack_read(opb,8)+1;
|
||||
if(info->coupling_steps<=0)goto err_out;
|
||||
for(i=0;i<info->coupling_steps;i++){
|
||||
/* vi->channels > 0 is enforced in the caller */
|
||||
int testM=info->coupling_mag[i]=
|
||||
oggpack_read(opb,ov_ilog(vi->channels-1));
|
||||
int testA=info->coupling_ang[i]=
|
||||
oggpack_read(opb,ov_ilog(vi->channels-1));
|
||||
|
||||
if(testM<0 ||
|
||||
testA<0 ||
|
||||
testM==testA ||
|
||||
testM>=vi->channels ||
|
||||
testA>=vi->channels) goto err_out;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if(oggpack_read(opb,2)!=0)goto err_out; /* 2,3:reserved */
|
||||
|
||||
if(info->submaps>1){
|
||||
for(i=0;i<vi->channels;i++){
|
||||
info->chmuxlist[i]=oggpack_read(opb,4);
|
||||
if(info->chmuxlist[i]>=info->submaps || info->chmuxlist[i]<0)goto err_out;
|
||||
}
|
||||
}
|
||||
for(i=0;i<info->submaps;i++){
|
||||
oggpack_read(opb,8); /* time submap unused */
|
||||
info->floorsubmap[i]=oggpack_read(opb,8);
|
||||
if(info->floorsubmap[i]>=ci->floors || info->floorsubmap[i]<0)goto err_out;
|
||||
info->residuesubmap[i]=oggpack_read(opb,8);
|
||||
if(info->residuesubmap[i]>=ci->residues || info->residuesubmap[i]<0)goto err_out;
|
||||
}
|
||||
|
||||
return info;
|
||||
|
||||
err_out:
|
||||
mapping0_free_info(info);
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
#include "os.h"
|
||||
#include "lpc.h"
|
||||
#include "lsp.h"
|
||||
#include "envelope.h"
|
||||
#include "mdct.h"
|
||||
#include "psy.h"
|
||||
#include "scales.h"
|
||||
|
||||
#if 0
|
||||
static long seq=0;
|
||||
static ogg_int64_t total=0;
|
||||
static float FLOOR1_fromdB_LOOKUP[256]={
|
||||
1.0649863e-07F, 1.1341951e-07F, 1.2079015e-07F, 1.2863978e-07F,
|
||||
1.3699951e-07F, 1.4590251e-07F, 1.5538408e-07F, 1.6548181e-07F,
|
||||
1.7623575e-07F, 1.8768855e-07F, 1.9988561e-07F, 2.128753e-07F,
|
||||
2.2670913e-07F, 2.4144197e-07F, 2.5713223e-07F, 2.7384213e-07F,
|
||||
2.9163793e-07F, 3.1059021e-07F, 3.3077411e-07F, 3.5226968e-07F,
|
||||
3.7516214e-07F, 3.9954229e-07F, 4.2550680e-07F, 4.5315863e-07F,
|
||||
4.8260743e-07F, 5.1396998e-07F, 5.4737065e-07F, 5.8294187e-07F,
|
||||
6.2082472e-07F, 6.6116941e-07F, 7.0413592e-07F, 7.4989464e-07F,
|
||||
7.9862701e-07F, 8.5052630e-07F, 9.0579828e-07F, 9.6466216e-07F,
|
||||
1.0273513e-06F, 1.0941144e-06F, 1.1652161e-06F, 1.2409384e-06F,
|
||||
1.3215816e-06F, 1.4074654e-06F, 1.4989305e-06F, 1.5963394e-06F,
|
||||
1.7000785e-06F, 1.8105592e-06F, 1.9282195e-06F, 2.0535261e-06F,
|
||||
2.1869758e-06F, 2.3290978e-06F, 2.4804557e-06F, 2.6416497e-06F,
|
||||
2.8133190e-06F, 2.9961443e-06F, 3.1908506e-06F, 3.3982101e-06F,
|
||||
3.6190449e-06F, 3.8542308e-06F, 4.1047004e-06F, 4.3714470e-06F,
|
||||
4.6555282e-06F, 4.9580707e-06F, 5.2802740e-06F, 5.6234160e-06F,
|
||||
5.9888572e-06F, 6.3780469e-06F, 6.7925283e-06F, 7.2339451e-06F,
|
||||
7.7040476e-06F, 8.2047000e-06F, 8.7378876e-06F, 9.3057248e-06F,
|
||||
9.9104632e-06F, 1.0554501e-05F, 1.1240392e-05F, 1.1970856e-05F,
|
||||
1.2748789e-05F, 1.3577278e-05F, 1.4459606e-05F, 1.5399272e-05F,
|
||||
1.6400004e-05F, 1.7465768e-05F, 1.8600792e-05F, 1.9809576e-05F,
|
||||
2.1096914e-05F, 2.2467911e-05F, 2.3928002e-05F, 2.5482978e-05F,
|
||||
2.7139006e-05F, 2.8902651e-05F, 3.0780908e-05F, 3.2781225e-05F,
|
||||
3.4911534e-05F, 3.7180282e-05F, 3.9596466e-05F, 4.2169667e-05F,
|
||||
4.4910090e-05F, 4.7828601e-05F, 5.0936773e-05F, 5.4246931e-05F,
|
||||
5.7772202e-05F, 6.1526565e-05F, 6.5524908e-05F, 6.9783085e-05F,
|
||||
7.4317983e-05F, 7.9147585e-05F, 8.4291040e-05F, 8.9768747e-05F,
|
||||
9.5602426e-05F, 0.00010181521F, 0.00010843174F, 0.00011547824F,
|
||||
0.00012298267F, 0.00013097477F, 0.00013948625F, 0.00014855085F,
|
||||
0.00015820453F, 0.00016848555F, 0.00017943469F, 0.00019109536F,
|
||||
0.00020351382F, 0.00021673929F, 0.00023082423F, 0.00024582449F,
|
||||
0.00026179955F, 0.00027881276F, 0.00029693158F, 0.00031622787F,
|
||||
0.00033677814F, 0.00035866388F, 0.00038197188F, 0.00040679456F,
|
||||
0.00043323036F, 0.00046138411F, 0.00049136745F, 0.00052329927F,
|
||||
0.00055730621F, 0.00059352311F, 0.00063209358F, 0.00067317058F,
|
||||
0.00071691700F, 0.00076350630F, 0.00081312324F, 0.00086596457F,
|
||||
0.00092223983F, 0.00098217216F, 0.0010459992F, 0.0011139742F,
|
||||
0.0011863665F, 0.0012634633F, 0.0013455702F, 0.0014330129F,
|
||||
0.0015261382F, 0.0016253153F, 0.0017309374F, 0.0018434235F,
|
||||
0.0019632195F, 0.0020908006F, 0.0022266726F, 0.0023713743F,
|
||||
0.0025254795F, 0.0026895994F, 0.0028643847F, 0.0030505286F,
|
||||
0.0032487691F, 0.0034598925F, 0.0036847358F, 0.0039241906F,
|
||||
0.0041792066F, 0.0044507950F, 0.0047400328F, 0.0050480668F,
|
||||
0.0053761186F, 0.0057254891F, 0.0060975636F, 0.0064938176F,
|
||||
0.0069158225F, 0.0073652516F, 0.0078438871F, 0.0083536271F,
|
||||
0.0088964928F, 0.009474637F, 0.010090352F, 0.010746080F,
|
||||
0.011444421F, 0.012188144F, 0.012980198F, 0.013823725F,
|
||||
0.014722068F, 0.015678791F, 0.016697687F, 0.017782797F,
|
||||
0.018938423F, 0.020169149F, 0.021479854F, 0.022875735F,
|
||||
0.024362330F, 0.025945531F, 0.027631618F, 0.029427276F,
|
||||
0.031339626F, 0.033376252F, 0.035545228F, 0.037855157F,
|
||||
0.040315199F, 0.042935108F, 0.045725273F, 0.048696758F,
|
||||
0.051861348F, 0.055231591F, 0.058820850F, 0.062643361F,
|
||||
0.066714279F, 0.071049749F, 0.075666962F, 0.080584227F,
|
||||
0.085821044F, 0.091398179F, 0.097337747F, 0.10366330F,
|
||||
0.11039993F, 0.11757434F, 0.12521498F, 0.13335215F,
|
||||
0.14201813F, 0.15124727F, 0.16107617F, 0.17154380F,
|
||||
0.18269168F, 0.19456402F, 0.20720788F, 0.22067342F,
|
||||
0.23501402F, 0.25028656F, 0.26655159F, 0.28387361F,
|
||||
0.30232132F, 0.32196786F, 0.34289114F, 0.36517414F,
|
||||
0.38890521F, 0.41417847F, 0.44109412F, 0.46975890F,
|
||||
0.50028648F, 0.53279791F, 0.56742212F, 0.60429640F,
|
||||
0.64356699F, 0.68538959F, 0.72993007F, 0.77736504F,
|
||||
0.82788260F, 0.88168307F, 0.9389798F, 1.F,
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
static int mapping0_forward(vorbis_block *vb){
|
||||
vorbis_dsp_state *vd=vb->vd;
|
||||
vorbis_info *vi=vd->vi;
|
||||
codec_setup_info *ci=vi->codec_setup;
|
||||
private_state *b=vb->vd->backend_state;
|
||||
vorbis_block_internal *vbi=(vorbis_block_internal *)vb->internal;
|
||||
int n=vb->pcmend;
|
||||
int i,j,k;
|
||||
|
||||
int *nonzero = alloca(sizeof(*nonzero)*vi->channels);
|
||||
float **gmdct = _vorbis_block_alloc(vb,vi->channels*sizeof(*gmdct));
|
||||
int **iwork = _vorbis_block_alloc(vb,vi->channels*sizeof(*iwork));
|
||||
int ***floor_posts = _vorbis_block_alloc(vb,vi->channels*sizeof(*floor_posts));
|
||||
|
||||
float global_ampmax=vbi->ampmax;
|
||||
float *local_ampmax=alloca(sizeof(*local_ampmax)*vi->channels);
|
||||
int blocktype=vbi->blocktype;
|
||||
|
||||
int modenumber=vb->W;
|
||||
vorbis_info_mapping0 *info=ci->map_param[modenumber];
|
||||
vorbis_look_psy *psy_look=b->psy+blocktype+(vb->W?2:0);
|
||||
|
||||
vb->mode=modenumber;
|
||||
|
||||
for(i=0;i<vi->channels;i++){
|
||||
float scale=4.f/n;
|
||||
float scale_dB;
|
||||
|
||||
float *pcm =vb->pcm[i];
|
||||
float *logfft =pcm;
|
||||
|
||||
iwork[i]=_vorbis_block_alloc(vb,n/2*sizeof(**iwork));
|
||||
gmdct[i]=_vorbis_block_alloc(vb,n/2*sizeof(**gmdct));
|
||||
|
||||
scale_dB=todB(&scale) + .345; /* + .345 is a hack; the original
|
||||
todB estimation used on IEEE 754
|
||||
compliant machines had a bug that
|
||||
returned dB values about a third
|
||||
of a decibel too high. The bug
|
||||
was harmless because tunings
|
||||
implicitly took that into
|
||||
account. However, fixing the bug
|
||||
in the estimator requires
|
||||
changing all the tunings as well.
|
||||
For now, it's easier to sync
|
||||
things back up here, and
|
||||
recalibrate the tunings in the
|
||||
next major model upgrade. */
|
||||
|
||||
#if 0
|
||||
if(vi->channels==2){
|
||||
if(i==0)
|
||||
_analysis_output("pcmL",seq,pcm,n,0,0,total-n/2);
|
||||
else
|
||||
_analysis_output("pcmR",seq,pcm,n,0,0,total-n/2);
|
||||
}else{
|
||||
_analysis_output("pcm",seq,pcm,n,0,0,total-n/2);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* window the PCM data */
|
||||
_vorbis_apply_window(pcm,b->window,ci->blocksizes,vb->lW,vb->W,vb->nW);
|
||||
|
||||
#if 0
|
||||
if(vi->channels==2){
|
||||
if(i==0)
|
||||
_analysis_output("windowedL",seq,pcm,n,0,0,total-n/2);
|
||||
else
|
||||
_analysis_output("windowedR",seq,pcm,n,0,0,total-n/2);
|
||||
}else{
|
||||
_analysis_output("windowed",seq,pcm,n,0,0,total-n/2);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* transform the PCM data */
|
||||
/* only MDCT right now.... */
|
||||
mdct_forward(b->transform[vb->W][0],pcm,gmdct[i]);
|
||||
|
||||
/* FFT yields more accurate tonal estimation (not phase sensitive) */
|
||||
drft_forward(&b->fft_look[vb->W],pcm);
|
||||
logfft[0]=scale_dB+todB(pcm) + .345; /* + .345 is a hack; the
|
||||
original todB estimation used on
|
||||
IEEE 754 compliant machines had a
|
||||
bug that returned dB values about
|
||||
a third of a decibel too high.
|
||||
The bug was harmless because
|
||||
tunings implicitly took that into
|
||||
account. However, fixing the bug
|
||||
in the estimator requires
|
||||
changing all the tunings as well.
|
||||
For now, it's easier to sync
|
||||
things back up here, and
|
||||
recalibrate the tunings in the
|
||||
next major model upgrade. */
|
||||
local_ampmax[i]=logfft[0];
|
||||
for(j=1;j<n-1;j+=2){
|
||||
float temp=pcm[j]*pcm[j]+pcm[j+1]*pcm[j+1];
|
||||
temp=logfft[(j+1)>>1]=scale_dB+.5f*todB(&temp) + .345; /* +
|
||||
.345 is a hack; the original todB
|
||||
estimation used on IEEE 754
|
||||
compliant machines had a bug that
|
||||
returned dB values about a third
|
||||
of a decibel too high. The bug
|
||||
was harmless because tunings
|
||||
implicitly took that into
|
||||
account. However, fixing the bug
|
||||
in the estimator requires
|
||||
changing all the tunings as well.
|
||||
For now, it's easier to sync
|
||||
things back up here, and
|
||||
recalibrate the tunings in the
|
||||
next major model upgrade. */
|
||||
if(temp>local_ampmax[i])local_ampmax[i]=temp;
|
||||
}
|
||||
|
||||
if(local_ampmax[i]>0.f)local_ampmax[i]=0.f;
|
||||
if(local_ampmax[i]>global_ampmax)global_ampmax=local_ampmax[i];
|
||||
|
||||
#if 0
|
||||
if(vi->channels==2){
|
||||
if(i==0){
|
||||
_analysis_output("fftL",seq,logfft,n/2,1,0,0);
|
||||
}else{
|
||||
_analysis_output("fftR",seq,logfft,n/2,1,0,0);
|
||||
}
|
||||
}else{
|
||||
_analysis_output("fft",seq,logfft,n/2,1,0,0);
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
{
|
||||
float *noise = _vorbis_block_alloc(vb,n/2*sizeof(*noise));
|
||||
float *tone = _vorbis_block_alloc(vb,n/2*sizeof(*tone));
|
||||
|
||||
for(i=0;i<vi->channels;i++){
|
||||
/* the encoder setup assumes that all the modes used by any
|
||||
specific bitrate tweaking use the same floor */
|
||||
|
||||
int submap=info->chmuxlist[i];
|
||||
|
||||
/* the following makes things clearer to *me* anyway */
|
||||
float *mdct =gmdct[i];
|
||||
float *logfft =vb->pcm[i];
|
||||
|
||||
float *logmdct =logfft+n/2;
|
||||
float *logmask =logfft;
|
||||
|
||||
vb->mode=modenumber;
|
||||
|
||||
floor_posts[i]=_vorbis_block_alloc(vb,PACKETBLOBS*sizeof(**floor_posts));
|
||||
memset(floor_posts[i],0,sizeof(**floor_posts)*PACKETBLOBS);
|
||||
|
||||
for(j=0;j<n/2;j++)
|
||||
logmdct[j]=todB(mdct+j) + .345; /* + .345 is a hack; the original
|
||||
todB estimation used on IEEE 754
|
||||
compliant machines had a bug that
|
||||
returned dB values about a third
|
||||
of a decibel too high. The bug
|
||||
was harmless because tunings
|
||||
implicitly took that into
|
||||
account. However, fixing the bug
|
||||
in the estimator requires
|
||||
changing all the tunings as well.
|
||||
For now, it's easier to sync
|
||||
things back up here, and
|
||||
recalibrate the tunings in the
|
||||
next major model upgrade. */
|
||||
|
||||
#if 0
|
||||
if(vi->channels==2){
|
||||
if(i==0)
|
||||
_analysis_output("mdctL",seq,logmdct,n/2,1,0,0);
|
||||
else
|
||||
_analysis_output("mdctR",seq,logmdct,n/2,1,0,0);
|
||||
}else{
|
||||
_analysis_output("mdct",seq,logmdct,n/2,1,0,0);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* first step; noise masking. Not only does 'noise masking'
|
||||
give us curves from which we can decide how much resolution
|
||||
to give noise parts of the spectrum, it also implicitly hands
|
||||
us a tonality estimate (the larger the value in the
|
||||
'noise_depth' vector, the more tonal that area is) */
|
||||
|
||||
_vp_noisemask(psy_look,
|
||||
logmdct,
|
||||
noise); /* noise does not have by-frequency offset
|
||||
bias applied yet */
|
||||
#if 0
|
||||
if(vi->channels==2){
|
||||
if(i==0)
|
||||
_analysis_output("noiseL",seq,noise,n/2,1,0,0);
|
||||
else
|
||||
_analysis_output("noiseR",seq,noise,n/2,1,0,0);
|
||||
}else{
|
||||
_analysis_output("noise",seq,noise,n/2,1,0,0);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* second step: 'all the other crap'; all the stuff that isn't
|
||||
computed/fit for bitrate management goes in the second psy
|
||||
vector. This includes tone masking, peak limiting and ATH */
|
||||
|
||||
_vp_tonemask(psy_look,
|
||||
logfft,
|
||||
tone,
|
||||
global_ampmax,
|
||||
local_ampmax[i]);
|
||||
|
||||
#if 0
|
||||
if(vi->channels==2){
|
||||
if(i==0)
|
||||
_analysis_output("toneL",seq,tone,n/2,1,0,0);
|
||||
else
|
||||
_analysis_output("toneR",seq,tone,n/2,1,0,0);
|
||||
}else{
|
||||
_analysis_output("tone",seq,tone,n/2,1,0,0);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* third step; we offset the noise vectors, overlay tone
|
||||
masking. We then do a floor1-specific line fit. If we're
|
||||
performing bitrate management, the line fit is performed
|
||||
multiple times for up/down tweakage on demand. */
|
||||
|
||||
#if 0
|
||||
{
|
||||
float aotuv[psy_look->n];
|
||||
#endif
|
||||
|
||||
_vp_offset_and_mix(psy_look,
|
||||
noise,
|
||||
tone,
|
||||
1,
|
||||
logmask,
|
||||
mdct,
|
||||
logmdct);
|
||||
|
||||
#if 0
|
||||
if(vi->channels==2){
|
||||
if(i==0)
|
||||
_analysis_output("aotuvM1_L",seq,aotuv,psy_look->n,1,1,0);
|
||||
else
|
||||
_analysis_output("aotuvM1_R",seq,aotuv,psy_look->n,1,1,0);
|
||||
}else{
|
||||
_analysis_output("aotuvM1",seq,aotuv,psy_look->n,1,1,0);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#if 0
|
||||
if(vi->channels==2){
|
||||
if(i==0)
|
||||
_analysis_output("mask1L",seq,logmask,n/2,1,0,0);
|
||||
else
|
||||
_analysis_output("mask1R",seq,logmask,n/2,1,0,0);
|
||||
}else{
|
||||
_analysis_output("mask1",seq,logmask,n/2,1,0,0);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* this algorithm is hardwired to floor 1 for now; abort out if
|
||||
we're *not* floor1. This won't happen unless someone has
|
||||
broken the encode setup lib. Guard it anyway. */
|
||||
if(ci->floor_type[info->floorsubmap[submap]]!=1)return(-1);
|
||||
|
||||
floor_posts[i][PACKETBLOBS/2]=
|
||||
floor1_fit(vb,b->flr[info->floorsubmap[submap]],
|
||||
logmdct,
|
||||
logmask);
|
||||
|
||||
/* are we managing bitrate? If so, perform two more fits for
|
||||
later rate tweaking (fits represent hi/lo) */
|
||||
if(vorbis_bitrate_managed(vb) && floor_posts[i][PACKETBLOBS/2]){
|
||||
/* higher rate by way of lower noise curve */
|
||||
|
||||
_vp_offset_and_mix(psy_look,
|
||||
noise,
|
||||
tone,
|
||||
2,
|
||||
logmask,
|
||||
mdct,
|
||||
logmdct);
|
||||
|
||||
#if 0
|
||||
if(vi->channels==2){
|
||||
if(i==0)
|
||||
_analysis_output("mask2L",seq,logmask,n/2,1,0,0);
|
||||
else
|
||||
_analysis_output("mask2R",seq,logmask,n/2,1,0,0);
|
||||
}else{
|
||||
_analysis_output("mask2",seq,logmask,n/2,1,0,0);
|
||||
}
|
||||
#endif
|
||||
|
||||
floor_posts[i][PACKETBLOBS-1]=
|
||||
floor1_fit(vb,b->flr[info->floorsubmap[submap]],
|
||||
logmdct,
|
||||
logmask);
|
||||
|
||||
/* lower rate by way of higher noise curve */
|
||||
_vp_offset_and_mix(psy_look,
|
||||
noise,
|
||||
tone,
|
||||
0,
|
||||
logmask,
|
||||
mdct,
|
||||
logmdct);
|
||||
|
||||
#if 0
|
||||
if(vi->channels==2){
|
||||
if(i==0)
|
||||
_analysis_output("mask0L",seq,logmask,n/2,1,0,0);
|
||||
else
|
||||
_analysis_output("mask0R",seq,logmask,n/2,1,0,0);
|
||||
}else{
|
||||
_analysis_output("mask0",seq,logmask,n/2,1,0,0);
|
||||
}
|
||||
#endif
|
||||
|
||||
floor_posts[i][0]=
|
||||
floor1_fit(vb,b->flr[info->floorsubmap[submap]],
|
||||
logmdct,
|
||||
logmask);
|
||||
|
||||
/* we also interpolate a range of intermediate curves for
|
||||
intermediate rates */
|
||||
for(k=1;k<PACKETBLOBS/2;k++)
|
||||
floor_posts[i][k]=
|
||||
floor1_interpolate_fit(vb,b->flr[info->floorsubmap[submap]],
|
||||
floor_posts[i][0],
|
||||
floor_posts[i][PACKETBLOBS/2],
|
||||
k*65536/(PACKETBLOBS/2));
|
||||
for(k=PACKETBLOBS/2+1;k<PACKETBLOBS-1;k++)
|
||||
floor_posts[i][k]=
|
||||
floor1_interpolate_fit(vb,b->flr[info->floorsubmap[submap]],
|
||||
floor_posts[i][PACKETBLOBS/2],
|
||||
floor_posts[i][PACKETBLOBS-1],
|
||||
(k-PACKETBLOBS/2)*65536/(PACKETBLOBS/2));
|
||||
}
|
||||
}
|
||||
}
|
||||
vbi->ampmax=global_ampmax;
|
||||
|
||||
/*
|
||||
the next phases are performed once for vbr-only and PACKETBLOB
|
||||
times for bitrate managed modes.
|
||||
|
||||
1) encode actual mode being used
|
||||
2) encode the floor for each channel, compute coded mask curve/res
|
||||
3) normalize and couple.
|
||||
4) encode residue
|
||||
5) save packet bytes to the packetblob vector
|
||||
|
||||
*/
|
||||
|
||||
/* iterate over the many masking curve fits we've created */
|
||||
|
||||
{
|
||||
int **couple_bundle=alloca(sizeof(*couple_bundle)*vi->channels);
|
||||
int *zerobundle=alloca(sizeof(*zerobundle)*vi->channels);
|
||||
|
||||
for(k=(vorbis_bitrate_managed(vb)?0:PACKETBLOBS/2);
|
||||
k<=(vorbis_bitrate_managed(vb)?PACKETBLOBS-1:PACKETBLOBS/2);
|
||||
k++){
|
||||
oggpack_buffer *opb=vbi->packetblob[k];
|
||||
|
||||
/* start out our new packet blob with packet type and mode */
|
||||
/* Encode the packet type */
|
||||
oggpack_write(opb,0,1);
|
||||
/* Encode the modenumber */
|
||||
/* Encode frame mode, pre,post windowsize, then dispatch */
|
||||
oggpack_write(opb,modenumber,b->modebits);
|
||||
if(vb->W){
|
||||
oggpack_write(opb,vb->lW,1);
|
||||
oggpack_write(opb,vb->nW,1);
|
||||
}
|
||||
|
||||
/* encode floor, compute masking curve, sep out residue */
|
||||
for(i=0;i<vi->channels;i++){
|
||||
int submap=info->chmuxlist[i];
|
||||
int *ilogmask=iwork[i];
|
||||
|
||||
nonzero[i]=floor1_encode(opb,vb,b->flr[info->floorsubmap[submap]],
|
||||
floor_posts[i][k],
|
||||
ilogmask);
|
||||
#if 0
|
||||
{
|
||||
char buf[80];
|
||||
sprintf(buf,"maskI%c%d",i?'R':'L',k);
|
||||
float work[n/2];
|
||||
for(j=0;j<n/2;j++)
|
||||
work[j]=FLOOR1_fromdB_LOOKUP[iwork[i][j]];
|
||||
_analysis_output(buf,seq,work,n/2,1,1,0);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/* our iteration is now based on masking curve, not prequant and
|
||||
coupling. Only one prequant/coupling step */
|
||||
|
||||
/* quantize/couple */
|
||||
/* incomplete implementation that assumes the tree is all depth
|
||||
one, or no tree at all */
|
||||
_vp_couple_quantize_normalize(k,
|
||||
&ci->psy_g_param,
|
||||
psy_look,
|
||||
info,
|
||||
gmdct,
|
||||
iwork,
|
||||
nonzero,
|
||||
ci->psy_g_param.sliding_lowpass[vb->W][k],
|
||||
vi->channels);
|
||||
|
||||
#if 0
|
||||
for(i=0;i<vi->channels;i++){
|
||||
char buf[80];
|
||||
sprintf(buf,"res%c%d",i?'R':'L',k);
|
||||
float work[n/2];
|
||||
for(j=0;j<n/2;j++)
|
||||
work[j]=iwork[i][j];
|
||||
_analysis_output(buf,seq,work,n/2,1,0,0);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* classify and encode by submap */
|
||||
for(i=0;i<info->submaps;i++){
|
||||
int ch_in_bundle=0;
|
||||
long **classifications;
|
||||
int resnum=info->residuesubmap[i];
|
||||
|
||||
for(j=0;j<vi->channels;j++){
|
||||
if(info->chmuxlist[j]==i){
|
||||
zerobundle[ch_in_bundle]=0;
|
||||
if(nonzero[j])zerobundle[ch_in_bundle]=1;
|
||||
couple_bundle[ch_in_bundle++]=iwork[j];
|
||||
}
|
||||
}
|
||||
|
||||
classifications=_residue_P[ci->residue_type[resnum]]->
|
||||
class(vb,b->residue[resnum],couple_bundle,zerobundle,ch_in_bundle);
|
||||
|
||||
ch_in_bundle=0;
|
||||
for(j=0;j<vi->channels;j++)
|
||||
if(info->chmuxlist[j]==i)
|
||||
couple_bundle[ch_in_bundle++]=iwork[j];
|
||||
|
||||
_residue_P[ci->residue_type[resnum]]->
|
||||
forward(opb,vb,b->residue[resnum],
|
||||
couple_bundle,zerobundle,ch_in_bundle,classifications,i);
|
||||
}
|
||||
|
||||
/* ok, done encoding. Next protopacket. */
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#if 0
|
||||
seq++;
|
||||
total+=ci->blocksizes[vb->W]/4+ci->blocksizes[vb->nW]/4;
|
||||
#endif
|
||||
return(0);
|
||||
}
|
||||
|
||||
static int mapping0_inverse(vorbis_block *vb,vorbis_info_mapping *l){
|
||||
vorbis_dsp_state *vd=vb->vd;
|
||||
vorbis_info *vi=vd->vi;
|
||||
codec_setup_info *ci=vi->codec_setup;
|
||||
private_state *b=vd->backend_state;
|
||||
vorbis_info_mapping0 *info=(vorbis_info_mapping0 *)l;
|
||||
|
||||
int i,j;
|
||||
long n=vb->pcmend=ci->blocksizes[vb->W];
|
||||
|
||||
float **pcmbundle=alloca(sizeof(*pcmbundle)*vi->channels);
|
||||
int *zerobundle=alloca(sizeof(*zerobundle)*vi->channels);
|
||||
|
||||
int *nonzero =alloca(sizeof(*nonzero)*vi->channels);
|
||||
void **floormemo=alloca(sizeof(*floormemo)*vi->channels);
|
||||
|
||||
/* recover the spectral envelope; store it in the PCM vector for now */
|
||||
for(i=0;i<vi->channels;i++){
|
||||
int submap=info->chmuxlist[i];
|
||||
floormemo[i]=_floor_P[ci->floor_type[info->floorsubmap[submap]]]->
|
||||
inverse1(vb,b->flr[info->floorsubmap[submap]]);
|
||||
if(floormemo[i])
|
||||
nonzero[i]=1;
|
||||
else
|
||||
nonzero[i]=0;
|
||||
memset(vb->pcm[i],0,sizeof(*vb->pcm[i])*n/2);
|
||||
}
|
||||
|
||||
/* channel coupling can 'dirty' the nonzero listing */
|
||||
for(i=0;i<info->coupling_steps;i++){
|
||||
if(nonzero[info->coupling_mag[i]] ||
|
||||
nonzero[info->coupling_ang[i]]){
|
||||
nonzero[info->coupling_mag[i]]=1;
|
||||
nonzero[info->coupling_ang[i]]=1;
|
||||
}
|
||||
}
|
||||
|
||||
/* recover the residue into our working vectors */
|
||||
for(i=0;i<info->submaps;i++){
|
||||
int ch_in_bundle=0;
|
||||
for(j=0;j<vi->channels;j++){
|
||||
if(info->chmuxlist[j]==i){
|
||||
if(nonzero[j])
|
||||
zerobundle[ch_in_bundle]=1;
|
||||
else
|
||||
zerobundle[ch_in_bundle]=0;
|
||||
pcmbundle[ch_in_bundle++]=vb->pcm[j];
|
||||
}
|
||||
}
|
||||
|
||||
_residue_P[ci->residue_type[info->residuesubmap[i]]]->
|
||||
inverse(vb,b->residue[info->residuesubmap[i]],
|
||||
pcmbundle,zerobundle,ch_in_bundle);
|
||||
}
|
||||
|
||||
/* channel coupling */
|
||||
for(i=info->coupling_steps-1;i>=0;i--){
|
||||
float *pcmM=vb->pcm[info->coupling_mag[i]];
|
||||
float *pcmA=vb->pcm[info->coupling_ang[i]];
|
||||
|
||||
for(j=0;j<n/2;j++){
|
||||
float mag=pcmM[j];
|
||||
float ang=pcmA[j];
|
||||
|
||||
if(mag>0)
|
||||
if(ang>0){
|
||||
pcmM[j]=mag;
|
||||
pcmA[j]=mag-ang;
|
||||
}else{
|
||||
pcmA[j]=mag;
|
||||
pcmM[j]=mag+ang;
|
||||
}
|
||||
else
|
||||
if(ang>0){
|
||||
pcmM[j]=mag;
|
||||
pcmA[j]=mag+ang;
|
||||
}else{
|
||||
pcmA[j]=mag;
|
||||
pcmM[j]=mag-ang;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* compute and apply spectral envelope */
|
||||
for(i=0;i<vi->channels;i++){
|
||||
float *pcm=vb->pcm[i];
|
||||
int submap=info->chmuxlist[i];
|
||||
_floor_P[ci->floor_type[info->floorsubmap[submap]]]->
|
||||
inverse2(vb,b->flr[info->floorsubmap[submap]],
|
||||
floormemo[i],pcm);
|
||||
}
|
||||
|
||||
/* transform the PCM data; takes PCM vector, vb; modifies PCM vector */
|
||||
/* only MDCT right now.... */
|
||||
for(i=0;i<vi->channels;i++){
|
||||
float *pcm=vb->pcm[i];
|
||||
mdct_backward(b->transform[vb->W][0],pcm,pcm);
|
||||
}
|
||||
|
||||
/* all done! */
|
||||
return(0);
|
||||
}
|
||||
|
||||
/* export hooks */
|
||||
const vorbis_func_mapping mapping0_exportbundle={
|
||||
&mapping0_pack,
|
||||
&mapping0_unpack,
|
||||
&mapping0_free_info,
|
||||
&mapping0_forward,
|
||||
&mapping0_inverse
|
||||
};
|
@ -1,785 +0,0 @@
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: masking curve data for psychoacoustics
|
||||
last mod: $Id: masking.h 16227 2009-07-08 06:58:46Z xiphmont $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
#ifndef _V_MASKING_H_
|
||||
#define _V_MASKING_H_
|
||||
|
||||
/* more detailed ATH; the bass if flat to save stressing the floor
|
||||
overly for only a bin or two of savings. */
|
||||
|
||||
#define MAX_ATH 88
|
||||
static const float ATH[]={
|
||||
/*15*/ -51, -52, -53, -54, -55, -56, -57, -58,
|
||||
/*31*/ -59, -60, -61, -62, -63, -64, -65, -66,
|
||||
/*63*/ -67, -68, -69, -70, -71, -72, -73, -74,
|
||||
/*125*/ -75, -76, -77, -78, -80, -81, -82, -83,
|
||||
/*250*/ -84, -85, -86, -87, -88, -88, -89, -89,
|
||||
/*500*/ -90, -91, -91, -92, -93, -94, -95, -96,
|
||||
/*1k*/ -96, -97, -98, -98, -99, -99,-100,-100,
|
||||
/*2k*/ -101,-102,-103,-104,-106,-107,-107,-107,
|
||||
/*4k*/ -107,-105,-103,-102,-101, -99, -98, -96,
|
||||
/*8k*/ -95, -95, -96, -97, -96, -95, -93, -90,
|
||||
/*16k*/ -80, -70, -50, -40, -30, -30, -30, -30
|
||||
};
|
||||
|
||||
/* The tone masking curves from Ehmer's and Fielder's papers have been
|
||||
replaced by an empirically collected data set. The previously
|
||||
published values were, far too often, simply on crack. */
|
||||
|
||||
#define EHMER_OFFSET 16
|
||||
#define EHMER_MAX 56
|
||||
|
||||
/* masking tones from -50 to 0dB, 62.5 through 16kHz at half octaves
|
||||
test tones from -2 octaves to +5 octaves sampled at eighth octaves */
|
||||
/* (Vorbis 0dB, the loudest possible tone, is assumed to be ~100dB SPL
|
||||
for collection of these curves) */
|
||||
|
||||
static const float tonemasks[P_BANDS][6][EHMER_MAX]={
|
||||
/* 62.5 Hz */
|
||||
{{ -60, -60, -60, -60, -60, -60, -60, -60,
|
||||
-60, -60, -60, -60, -62, -62, -65, -73,
|
||||
-69, -68, -68, -67, -70, -70, -72, -74,
|
||||
-75, -79, -79, -80, -83, -88, -93, -100,
|
||||
-110, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{ -48, -48, -48, -48, -48, -48, -48, -48,
|
||||
-48, -48, -48, -48, -48, -53, -61, -66,
|
||||
-66, -68, -67, -70, -76, -76, -72, -73,
|
||||
-75, -76, -78, -79, -83, -88, -93, -100,
|
||||
-110, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{ -37, -37, -37, -37, -37, -37, -37, -37,
|
||||
-38, -40, -42, -46, -48, -53, -55, -62,
|
||||
-65, -58, -56, -56, -61, -60, -65, -67,
|
||||
-69, -71, -77, -77, -78, -80, -82, -84,
|
||||
-88, -93, -98, -106, -112, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{ -25, -25, -25, -25, -25, -25, -25, -25,
|
||||
-25, -26, -27, -29, -32, -38, -48, -52,
|
||||
-52, -50, -48, -48, -51, -52, -54, -60,
|
||||
-67, -67, -66, -68, -69, -73, -73, -76,
|
||||
-80, -81, -81, -85, -85, -86, -88, -93,
|
||||
-100, -110, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{ -16, -16, -16, -16, -16, -16, -16, -16,
|
||||
-17, -19, -20, -22, -26, -28, -31, -40,
|
||||
-47, -39, -39, -40, -42, -43, -47, -51,
|
||||
-57, -52, -55, -55, -60, -58, -62, -63,
|
||||
-70, -67, -69, -72, -73, -77, -80, -82,
|
||||
-83, -87, -90, -94, -98, -104, -115, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{ -8, -8, -8, -8, -8, -8, -8, -8,
|
||||
-8, -8, -10, -11, -15, -19, -25, -30,
|
||||
-34, -31, -30, -31, -29, -32, -35, -42,
|
||||
-48, -42, -44, -46, -50, -50, -51, -52,
|
||||
-59, -54, -55, -55, -58, -62, -63, -66,
|
||||
-72, -73, -76, -75, -78, -80, -80, -81,
|
||||
-84, -88, -90, -94, -98, -101, -106, -110}},
|
||||
/* 88Hz */
|
||||
{{ -66, -66, -66, -66, -66, -66, -66, -66,
|
||||
-66, -66, -66, -66, -66, -67, -67, -67,
|
||||
-76, -72, -71, -74, -76, -76, -75, -78,
|
||||
-79, -79, -81, -83, -86, -89, -93, -97,
|
||||
-100, -105, -110, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{ -47, -47, -47, -47, -47, -47, -47, -47,
|
||||
-47, -47, -47, -48, -51, -55, -59, -66,
|
||||
-66, -66, -67, -66, -68, -69, -70, -74,
|
||||
-79, -77, -77, -78, -80, -81, -82, -84,
|
||||
-86, -88, -91, -95, -100, -108, -116, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{ -36, -36, -36, -36, -36, -36, -36, -36,
|
||||
-36, -37, -37, -41, -44, -48, -51, -58,
|
||||
-62, -60, -57, -59, -59, -60, -63, -65,
|
||||
-72, -71, -70, -72, -74, -77, -76, -78,
|
||||
-81, -81, -80, -83, -86, -91, -96, -100,
|
||||
-105, -110, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{ -28, -28, -28, -28, -28, -28, -28, -28,
|
||||
-28, -30, -32, -32, -33, -35, -41, -49,
|
||||
-50, -49, -47, -48, -48, -52, -51, -57,
|
||||
-65, -61, -59, -61, -64, -69, -70, -74,
|
||||
-77, -77, -78, -81, -84, -85, -87, -90,
|
||||
-92, -96, -100, -107, -112, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{ -19, -19, -19, -19, -19, -19, -19, -19,
|
||||
-20, -21, -23, -27, -30, -35, -36, -41,
|
||||
-46, -44, -42, -40, -41, -41, -43, -48,
|
||||
-55, -53, -52, -53, -56, -59, -58, -60,
|
||||
-67, -66, -69, -71, -72, -75, -79, -81,
|
||||
-84, -87, -90, -93, -97, -101, -107, -114,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{ -9, -9, -9, -9, -9, -9, -9, -9,
|
||||
-11, -12, -12, -15, -16, -20, -23, -30,
|
||||
-37, -34, -33, -34, -31, -32, -32, -38,
|
||||
-47, -44, -41, -40, -47, -49, -46, -46,
|
||||
-58, -50, -50, -54, -58, -62, -64, -67,
|
||||
-67, -70, -72, -76, -79, -83, -87, -91,
|
||||
-96, -100, -104, -110, -999, -999, -999, -999}},
|
||||
/* 125 Hz */
|
||||
{{ -62, -62, -62, -62, -62, -62, -62, -62,
|
||||
-62, -62, -63, -64, -66, -67, -66, -68,
|
||||
-75, -72, -76, -75, -76, -78, -79, -82,
|
||||
-84, -85, -90, -94, -101, -110, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{ -59, -59, -59, -59, -59, -59, -59, -59,
|
||||
-59, -59, -59, -60, -60, -61, -63, -66,
|
||||
-71, -68, -70, -70, -71, -72, -72, -75,
|
||||
-81, -78, -79, -82, -83, -86, -90, -97,
|
||||
-103, -113, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{ -53, -53, -53, -53, -53, -53, -53, -53,
|
||||
-53, -54, -55, -57, -56, -57, -55, -61,
|
||||
-65, -60, -60, -62, -63, -63, -66, -68,
|
||||
-74, -73, -75, -75, -78, -80, -80, -82,
|
||||
-85, -90, -96, -101, -108, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{ -46, -46, -46, -46, -46, -46, -46, -46,
|
||||
-46, -46, -47, -47, -47, -47, -48, -51,
|
||||
-57, -51, -49, -50, -51, -53, -54, -59,
|
||||
-66, -60, -62, -67, -67, -70, -72, -75,
|
||||
-76, -78, -81, -85, -88, -94, -97, -104,
|
||||
-112, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{ -36, -36, -36, -36, -36, -36, -36, -36,
|
||||
-39, -41, -42, -42, -39, -38, -41, -43,
|
||||
-52, -44, -40, -39, -37, -37, -40, -47,
|
||||
-54, -50, -48, -50, -55, -61, -59, -62,
|
||||
-66, -66, -66, -69, -69, -73, -74, -74,
|
||||
-75, -77, -79, -82, -87, -91, -95, -100,
|
||||
-108, -115, -999, -999, -999, -999, -999, -999},
|
||||
{ -28, -26, -24, -22, -20, -20, -23, -29,
|
||||
-30, -31, -28, -27, -28, -28, -28, -35,
|
||||
-40, -33, -32, -29, -30, -30, -30, -37,
|
||||
-45, -41, -37, -38, -45, -47, -47, -48,
|
||||
-53, -49, -48, -50, -49, -49, -51, -52,
|
||||
-58, -56, -57, -56, -60, -61, -62, -70,
|
||||
-72, -74, -78, -83, -88, -93, -100, -106}},
|
||||
/* 177 Hz */
|
||||
{{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -110, -105, -100, -95, -91, -87, -83,
|
||||
-80, -78, -76, -78, -78, -81, -83, -85,
|
||||
-86, -85, -86, -87, -90, -97, -107, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -110, -105, -100, -95, -90,
|
||||
-85, -81, -77, -73, -70, -67, -67, -68,
|
||||
-75, -73, -70, -69, -70, -72, -75, -79,
|
||||
-84, -83, -84, -86, -88, -89, -89, -93,
|
||||
-98, -105, -112, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-105, -100, -95, -90, -85, -80, -76, -71,
|
||||
-68, -68, -65, -63, -63, -62, -62, -64,
|
||||
-65, -64, -61, -62, -63, -64, -66, -68,
|
||||
-73, -73, -74, -75, -76, -81, -83, -85,
|
||||
-88, -89, -92, -95, -100, -108, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{ -80, -75, -71, -68, -65, -63, -62, -61,
|
||||
-61, -61, -61, -59, -56, -57, -53, -50,
|
||||
-58, -52, -50, -50, -52, -53, -54, -58,
|
||||
-67, -63, -67, -68, -72, -75, -78, -80,
|
||||
-81, -81, -82, -85, -89, -90, -93, -97,
|
||||
-101, -107, -114, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{ -65, -61, -59, -57, -56, -55, -55, -56,
|
||||
-56, -57, -55, -53, -52, -47, -44, -44,
|
||||
-50, -44, -41, -39, -39, -42, -40, -46,
|
||||
-51, -49, -50, -53, -54, -63, -60, -61,
|
||||
-62, -66, -66, -66, -70, -73, -74, -75,
|
||||
-76, -75, -79, -85, -89, -91, -96, -102,
|
||||
-110, -999, -999, -999, -999, -999, -999, -999},
|
||||
{ -52, -50, -49, -49, -48, -48, -48, -49,
|
||||
-50, -50, -49, -46, -43, -39, -35, -33,
|
||||
-38, -36, -32, -29, -32, -32, -32, -35,
|
||||
-44, -39, -38, -38, -46, -50, -45, -46,
|
||||
-53, -50, -50, -50, -54, -54, -53, -53,
|
||||
-56, -57, -59, -66, -70, -72, -74, -79,
|
||||
-83, -85, -90, -97, -114, -999, -999, -999}},
|
||||
/* 250 Hz */
|
||||
{{-999, -999, -999, -999, -999, -999, -110, -105,
|
||||
-100, -95, -90, -86, -80, -75, -75, -79,
|
||||
-80, -79, -80, -81, -82, -88, -95, -103,
|
||||
-110, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -108, -103, -98, -93,
|
||||
-88, -83, -79, -78, -75, -71, -67, -68,
|
||||
-73, -73, -72, -73, -75, -77, -80, -82,
|
||||
-88, -93, -100, -107, -114, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -110, -105, -101, -96, -90,
|
||||
-86, -81, -77, -73, -69, -66, -61, -62,
|
||||
-66, -64, -62, -65, -66, -70, -72, -76,
|
||||
-81, -80, -84, -90, -95, -102, -110, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -107, -103, -97, -92, -88,
|
||||
-83, -79, -74, -70, -66, -59, -53, -58,
|
||||
-62, -55, -54, -54, -54, -58, -61, -62,
|
||||
-72, -70, -72, -75, -78, -80, -81, -80,
|
||||
-83, -83, -88, -93, -100, -107, -115, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -105, -100, -95, -90, -85,
|
||||
-80, -75, -70, -66, -62, -56, -48, -44,
|
||||
-48, -46, -46, -43, -46, -48, -48, -51,
|
||||
-58, -58, -59, -60, -62, -62, -61, -61,
|
||||
-65, -64, -65, -68, -70, -74, -75, -78,
|
||||
-81, -86, -95, -110, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -105, -100, -95, -90, -85, -80,
|
||||
-75, -70, -65, -61, -55, -49, -39, -33,
|
||||
-40, -35, -32, -38, -40, -33, -35, -37,
|
||||
-46, -41, -45, -44, -46, -42, -45, -46,
|
||||
-52, -50, -50, -50, -54, -54, -55, -57,
|
||||
-62, -64, -66, -68, -70, -76, -81, -90,
|
||||
-100, -110, -999, -999, -999, -999, -999, -999}},
|
||||
/* 354 hz */
|
||||
{{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-105, -98, -90, -85, -82, -83, -80, -78,
|
||||
-84, -79, -80, -83, -87, -89, -91, -93,
|
||||
-99, -106, -117, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-105, -98, -90, -85, -80, -75, -70, -68,
|
||||
-74, -72, -74, -77, -80, -82, -85, -87,
|
||||
-92, -89, -91, -95, -100, -106, -112, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-105, -98, -90, -83, -75, -71, -63, -64,
|
||||
-67, -62, -64, -67, -70, -73, -77, -81,
|
||||
-84, -83, -85, -89, -90, -93, -98, -104,
|
||||
-109, -114, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-103, -96, -88, -81, -75, -68, -58, -54,
|
||||
-56, -54, -56, -56, -58, -60, -63, -66,
|
||||
-74, -69, -72, -72, -75, -74, -77, -81,
|
||||
-81, -82, -84, -87, -93, -96, -99, -104,
|
||||
-110, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -108, -102, -96,
|
||||
-91, -85, -80, -74, -68, -60, -51, -46,
|
||||
-48, -46, -43, -45, -47, -47, -49, -48,
|
||||
-56, -53, -55, -58, -57, -63, -58, -60,
|
||||
-66, -64, -67, -70, -70, -74, -77, -84,
|
||||
-86, -89, -91, -93, -94, -101, -109, -118,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -108, -103, -98, -93, -88,
|
||||
-83, -78, -73, -68, -60, -53, -44, -35,
|
||||
-38, -38, -34, -34, -36, -40, -41, -44,
|
||||
-51, -45, -46, -47, -46, -54, -50, -49,
|
||||
-50, -50, -50, -51, -54, -57, -58, -60,
|
||||
-66, -66, -66, -64, -65, -68, -77, -82,
|
||||
-87, -95, -110, -999, -999, -999, -999, -999}},
|
||||
/* 500 Hz */
|
||||
{{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-107, -102, -97, -92, -87, -83, -78, -75,
|
||||
-82, -79, -83, -85, -89, -92, -95, -98,
|
||||
-101, -105, -109, -113, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -999, -106,
|
||||
-100, -95, -90, -86, -81, -78, -74, -69,
|
||||
-74, -74, -76, -79, -83, -84, -86, -89,
|
||||
-92, -97, -93, -100, -103, -107, -110, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -106, -100,
|
||||
-95, -90, -87, -83, -80, -75, -69, -60,
|
||||
-66, -66, -68, -70, -74, -78, -79, -81,
|
||||
-81, -83, -84, -87, -93, -96, -99, -103,
|
||||
-107, -110, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -108, -103, -98,
|
||||
-93, -89, -85, -82, -78, -71, -62, -55,
|
||||
-58, -58, -54, -54, -55, -59, -61, -62,
|
||||
-70, -66, -66, -67, -70, -72, -75, -78,
|
||||
-84, -84, -84, -88, -91, -90, -95, -98,
|
||||
-102, -103, -106, -110, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -108, -103, -98, -94,
|
||||
-90, -87, -82, -79, -73, -67, -58, -47,
|
||||
-50, -45, -41, -45, -48, -44, -44, -49,
|
||||
-54, -51, -48, -47, -49, -50, -51, -57,
|
||||
-58, -60, -63, -69, -70, -69, -71, -74,
|
||||
-78, -82, -90, -95, -101, -105, -110, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -105, -101, -97, -93, -90,
|
||||
-85, -80, -77, -72, -65, -56, -48, -37,
|
||||
-40, -36, -34, -40, -50, -47, -38, -41,
|
||||
-47, -38, -35, -39, -38, -43, -40, -45,
|
||||
-50, -45, -44, -47, -50, -55, -48, -48,
|
||||
-52, -66, -70, -76, -82, -90, -97, -105,
|
||||
-110, -999, -999, -999, -999, -999, -999, -999}},
|
||||
/* 707 Hz */
|
||||
{{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -108, -103, -98, -93, -86, -79, -76,
|
||||
-83, -81, -85, -87, -89, -93, -98, -102,
|
||||
-107, -112, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -108, -103, -98, -93, -86, -79, -71,
|
||||
-77, -74, -77, -79, -81, -84, -85, -90,
|
||||
-92, -93, -92, -98, -101, -108, -112, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-108, -103, -98, -93, -87, -78, -68, -65,
|
||||
-66, -62, -65, -67, -70, -73, -75, -78,
|
||||
-82, -82, -83, -84, -91, -93, -98, -102,
|
||||
-106, -110, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-105, -100, -95, -90, -82, -74, -62, -57,
|
||||
-58, -56, -51, -52, -52, -54, -54, -58,
|
||||
-66, -59, -60, -63, -66, -69, -73, -79,
|
||||
-83, -84, -80, -81, -81, -82, -88, -92,
|
||||
-98, -105, -113, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -999, -107,
|
||||
-102, -97, -92, -84, -79, -69, -57, -47,
|
||||
-52, -47, -44, -45, -50, -52, -42, -42,
|
||||
-53, -43, -43, -48, -51, -56, -55, -52,
|
||||
-57, -59, -61, -62, -67, -71, -78, -83,
|
||||
-86, -94, -98, -103, -110, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -105, -100,
|
||||
-95, -90, -84, -78, -70, -61, -51, -41,
|
||||
-40, -38, -40, -46, -52, -51, -41, -40,
|
||||
-46, -40, -38, -38, -41, -46, -41, -46,
|
||||
-47, -43, -43, -45, -41, -45, -56, -67,
|
||||
-68, -83, -87, -90, -95, -102, -107, -113,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999}},
|
||||
/* 1000 Hz */
|
||||
{{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -109, -105, -101, -96, -91, -84, -77,
|
||||
-82, -82, -85, -89, -94, -100, -106, -110,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -106, -103, -98, -92, -85, -80, -71,
|
||||
-75, -72, -76, -80, -84, -86, -89, -93,
|
||||
-100, -107, -113, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -999, -107,
|
||||
-104, -101, -97, -92, -88, -84, -80, -64,
|
||||
-66, -63, -64, -66, -69, -73, -77, -83,
|
||||
-83, -86, -91, -98, -104, -111, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -999, -107,
|
||||
-104, -101, -97, -92, -90, -84, -74, -57,
|
||||
-58, -52, -55, -54, -50, -52, -50, -52,
|
||||
-63, -62, -69, -76, -77, -78, -78, -79,
|
||||
-82, -88, -94, -100, -106, -111, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -106, -102,
|
||||
-98, -95, -90, -85, -83, -78, -70, -50,
|
||||
-50, -41, -44, -49, -47, -50, -50, -44,
|
||||
-55, -46, -47, -48, -48, -54, -49, -49,
|
||||
-58, -62, -71, -81, -87, -92, -97, -102,
|
||||
-108, -114, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -106, -102,
|
||||
-98, -95, -90, -85, -83, -78, -70, -45,
|
||||
-43, -41, -47, -50, -51, -50, -49, -45,
|
||||
-47, -41, -44, -41, -39, -43, -38, -37,
|
||||
-40, -41, -44, -50, -58, -65, -73, -79,
|
||||
-85, -92, -97, -101, -105, -109, -113, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999}},
|
||||
/* 1414 Hz */
|
||||
{{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -107, -100, -95, -87, -81,
|
||||
-85, -83, -88, -93, -100, -107, -114, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -107, -101, -95, -88, -83, -76,
|
||||
-73, -72, -79, -84, -90, -95, -100, -105,
|
||||
-110, -115, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -104, -98, -92, -87, -81, -70,
|
||||
-65, -62, -67, -71, -74, -80, -85, -91,
|
||||
-95, -99, -103, -108, -111, -114, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -103, -97, -90, -85, -76, -60,
|
||||
-56, -54, -60, -62, -61, -56, -63, -65,
|
||||
-73, -74, -77, -75, -78, -81, -86, -87,
|
||||
-88, -91, -94, -98, -103, -110, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -999, -105,
|
||||
-100, -97, -92, -86, -81, -79, -70, -57,
|
||||
-51, -47, -51, -58, -60, -56, -53, -50,
|
||||
-58, -52, -50, -50, -53, -55, -64, -69,
|
||||
-71, -85, -82, -78, -81, -85, -95, -102,
|
||||
-112, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -999, -105,
|
||||
-100, -97, -92, -85, -83, -79, -72, -49,
|
||||
-40, -43, -43, -54, -56, -51, -50, -40,
|
||||
-43, -38, -36, -35, -37, -38, -37, -44,
|
||||
-54, -60, -57, -60, -70, -75, -84, -92,
|
||||
-103, -112, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999}},
|
||||
/* 2000 Hz */
|
||||
{{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -110, -102, -95, -89, -82,
|
||||
-83, -84, -90, -92, -99, -107, -113, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -107, -101, -95, -89, -83, -72,
|
||||
-74, -78, -85, -88, -88, -90, -92, -98,
|
||||
-105, -111, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -109, -103, -97, -93, -87, -81, -70,
|
||||
-70, -67, -75, -73, -76, -79, -81, -83,
|
||||
-88, -89, -97, -103, -110, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -107, -100, -94, -88, -83, -75, -63,
|
||||
-59, -59, -63, -66, -60, -62, -67, -67,
|
||||
-77, -76, -81, -88, -86, -92, -96, -102,
|
||||
-109, -116, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -105, -98, -92, -86, -81, -73, -56,
|
||||
-52, -47, -55, -60, -58, -52, -51, -45,
|
||||
-49, -50, -53, -54, -61, -71, -70, -69,
|
||||
-78, -79, -87, -90, -96, -104, -112, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -103, -96, -90, -86, -78, -70, -51,
|
||||
-42, -47, -48, -55, -54, -54, -53, -42,
|
||||
-35, -28, -33, -38, -37, -44, -47, -49,
|
||||
-54, -63, -68, -78, -82, -89, -94, -99,
|
||||
-104, -109, -114, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999}},
|
||||
/* 2828 Hz */
|
||||
{{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -110, -100, -90, -79,
|
||||
-85, -81, -82, -82, -89, -94, -99, -103,
|
||||
-109, -115, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -105, -97, -85, -72,
|
||||
-74, -70, -70, -70, -76, -85, -91, -93,
|
||||
-97, -103, -109, -115, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -112, -93, -81, -68,
|
||||
-62, -60, -60, -57, -63, -70, -77, -82,
|
||||
-90, -93, -98, -104, -109, -113, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -113, -100, -93, -84, -63,
|
||||
-58, -48, -53, -54, -52, -52, -57, -64,
|
||||
-66, -76, -83, -81, -85, -85, -90, -95,
|
||||
-98, -101, -103, -106, -108, -111, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -105, -95, -86, -74, -53,
|
||||
-50, -38, -43, -49, -43, -42, -39, -39,
|
||||
-46, -52, -57, -56, -72, -69, -74, -81,
|
||||
-87, -92, -94, -97, -99, -102, -105, -108,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -108, -99, -90, -76, -66, -45,
|
||||
-43, -41, -44, -47, -43, -47, -40, -30,
|
||||
-31, -31, -39, -33, -40, -41, -43, -53,
|
||||
-59, -70, -73, -77, -79, -82, -84, -87,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999}},
|
||||
/* 4000 Hz */
|
||||
{{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -110, -91, -76,
|
||||
-75, -85, -93, -98, -104, -110, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -110, -91, -70,
|
||||
-70, -75, -86, -89, -94, -98, -101, -106,
|
||||
-110, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -110, -95, -80, -60,
|
||||
-65, -64, -74, -83, -88, -91, -95, -99,
|
||||
-103, -107, -110, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -110, -95, -80, -58,
|
||||
-55, -49, -66, -68, -71, -78, -78, -80,
|
||||
-88, -85, -89, -97, -100, -105, -110, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -110, -95, -80, -53,
|
||||
-52, -41, -59, -59, -49, -58, -56, -63,
|
||||
-86, -79, -90, -93, -98, -103, -107, -112,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -110, -97, -91, -73, -45,
|
||||
-40, -33, -53, -61, -49, -54, -50, -50,
|
||||
-60, -52, -67, -74, -81, -92, -96, -100,
|
||||
-105, -110, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999}},
|
||||
/* 5657 Hz */
|
||||
{{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -113, -106, -99, -92, -77,
|
||||
-80, -88, -97, -106, -115, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -116, -109, -102, -95, -89, -74,
|
||||
-72, -88, -87, -95, -102, -109, -116, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -116, -109, -102, -95, -89, -75,
|
||||
-66, -74, -77, -78, -86, -87, -90, -96,
|
||||
-105, -115, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -115, -108, -101, -94, -88, -66,
|
||||
-56, -61, -70, -65, -78, -72, -83, -84,
|
||||
-93, -98, -105, -110, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -110, -105, -95, -89, -82, -57,
|
||||
-52, -52, -59, -56, -59, -58, -69, -67,
|
||||
-88, -82, -82, -89, -94, -100, -108, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -110, -101, -96, -90, -83, -77, -54,
|
||||
-43, -38, -50, -48, -52, -48, -42, -42,
|
||||
-51, -52, -53, -59, -65, -71, -78, -85,
|
||||
-95, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999}},
|
||||
/* 8000 Hz */
|
||||
{{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -120, -105, -86, -68,
|
||||
-78, -79, -90, -100, -110, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -120, -105, -86, -66,
|
||||
-73, -77, -88, -96, -105, -115, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -120, -105, -92, -80, -61,
|
||||
-64, -68, -80, -87, -92, -100, -110, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -120, -104, -91, -79, -52,
|
||||
-60, -54, -64, -69, -77, -80, -82, -84,
|
||||
-85, -87, -88, -90, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -118, -100, -87, -77, -49,
|
||||
-50, -44, -58, -61, -61, -67, -65, -62,
|
||||
-62, -62, -65, -68, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -115, -98, -84, -62, -49,
|
||||
-44, -38, -46, -49, -49, -46, -39, -37,
|
||||
-39, -40, -42, -43, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999}},
|
||||
/* 11314 Hz */
|
||||
{{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -110, -88, -74,
|
||||
-77, -82, -82, -85, -90, -94, -99, -104,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -110, -88, -66,
|
||||
-70, -81, -80, -81, -84, -88, -91, -93,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -110, -88, -61,
|
||||
-63, -70, -71, -74, -77, -80, -83, -85,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -110, -86, -62,
|
||||
-63, -62, -62, -58, -52, -50, -50, -52,
|
||||
-54, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -118, -108, -84, -53,
|
||||
-50, -50, -50, -55, -47, -45, -40, -40,
|
||||
-40, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -118, -100, -73, -43,
|
||||
-37, -42, -43, -53, -38, -37, -35, -35,
|
||||
-38, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999}},
|
||||
/* 16000 Hz */
|
||||
{{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -110, -100, -91, -84, -74,
|
||||
-80, -80, -80, -80, -80, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -110, -100, -91, -84, -74,
|
||||
-68, -68, -68, -68, -68, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -110, -100, -86, -78, -70,
|
||||
-60, -45, -30, -21, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -110, -100, -87, -78, -67,
|
||||
-48, -38, -29, -21, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -110, -100, -86, -69, -56,
|
||||
-45, -35, -33, -29, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999},
|
||||
{-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -110, -100, -83, -71, -48,
|
||||
-27, -38, -37, -34, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999,
|
||||
-999, -999, -999, -999, -999, -999, -999, -999}}
|
||||
};
|
||||
|
||||
#endif
|
@ -1,563 +0,0 @@
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: normalized modified discrete cosine transform
|
||||
power of two length transform only [64 <= n ]
|
||||
last mod: $Id: mdct.c 16227 2009-07-08 06:58:46Z xiphmont $
|
||||
|
||||
Original algorithm adapted long ago from _The use of multirate filter
|
||||
banks for coding of high quality digital audio_, by T. Sporer,
|
||||
K. Brandenburg and B. Edler, collection of the European Signal
|
||||
Processing Conference (EUSIPCO), Amsterdam, June 1992, Vol.1, pp
|
||||
211-214
|
||||
|
||||
The below code implements an algorithm that no longer looks much like
|
||||
that presented in the paper, but the basic structure remains if you
|
||||
dig deep enough to see it.
|
||||
|
||||
This module DOES NOT INCLUDE code to generate/apply the window
|
||||
function. Everybody has their own weird favorite including me... I
|
||||
happen to like the properties of y=sin(.5PI*sin^2(x)), but others may
|
||||
vehemently disagree.
|
||||
|
||||
********************************************************************/
|
||||
|
||||
/* this can also be run as an integer transform by uncommenting a
|
||||
define in mdct.h; the integerization is a first pass and although
|
||||
it's likely stable for Vorbis, the dynamic range is constrained and
|
||||
roundoff isn't done (so it's noisy). Consider it functional, but
|
||||
only a starting point. There's no point on a machine with an FPU */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
#include "vorbis/codec.h"
|
||||
#include "mdct.h"
|
||||
#include "os.h"
|
||||
#include "misc.h"
|
||||
|
||||
/* build lookups for trig functions; also pre-figure scaling and
|
||||
some window function algebra. */
|
||||
|
||||
void mdct_init(mdct_lookup *lookup,int n){
|
||||
int *bitrev=_ogg_malloc(sizeof(*bitrev)*(n/4));
|
||||
DATA_TYPE *T=_ogg_malloc(sizeof(*T)*(n+n/4));
|
||||
|
||||
int i;
|
||||
int n2=n>>1;
|
||||
int log2n=lookup->log2n=rint(log((float)n)/log(2.f));
|
||||
lookup->n=n;
|
||||
lookup->trig=T;
|
||||
lookup->bitrev=bitrev;
|
||||
|
||||
/* trig lookups... */
|
||||
|
||||
for(i=0;i<n/4;i++){
|
||||
T[i*2]=FLOAT_CONV(cos((M_PI/n)*(4*i)));
|
||||
T[i*2+1]=FLOAT_CONV(-sin((M_PI/n)*(4*i)));
|
||||
T[n2+i*2]=FLOAT_CONV(cos((M_PI/(2*n))*(2*i+1)));
|
||||
T[n2+i*2+1]=FLOAT_CONV(sin((M_PI/(2*n))*(2*i+1)));
|
||||
}
|
||||
for(i=0;i<n/8;i++){
|
||||
T[n+i*2]=FLOAT_CONV(cos((M_PI/n)*(4*i+2))*.5);
|
||||
T[n+i*2+1]=FLOAT_CONV(-sin((M_PI/n)*(4*i+2))*.5);
|
||||
}
|
||||
|
||||
/* bitreverse lookup... */
|
||||
|
||||
{
|
||||
int mask=(1<<(log2n-1))-1,i,j;
|
||||
int msb=1<<(log2n-2);
|
||||
for(i=0;i<n/8;i++){
|
||||
int acc=0;
|
||||
for(j=0;msb>>j;j++)
|
||||
if((msb>>j)&i)acc|=1<<j;
|
||||
bitrev[i*2]=((~acc)&mask)-1;
|
||||
bitrev[i*2+1]=acc;
|
||||
|
||||
}
|
||||
}
|
||||
lookup->scale=FLOAT_CONV(4.f/n);
|
||||
}
|
||||
|
||||
/* 8 point butterfly (in place, 4 register) */
|
||||
STIN void mdct_butterfly_8(DATA_TYPE *x){
|
||||
REG_TYPE r0 = x[6] + x[2];
|
||||
REG_TYPE r1 = x[6] - x[2];
|
||||
REG_TYPE r2 = x[4] + x[0];
|
||||
REG_TYPE r3 = x[4] - x[0];
|
||||
|
||||
x[6] = r0 + r2;
|
||||
x[4] = r0 - r2;
|
||||
|
||||
r0 = x[5] - x[1];
|
||||
r2 = x[7] - x[3];
|
||||
x[0] = r1 + r0;
|
||||
x[2] = r1 - r0;
|
||||
|
||||
r0 = x[5] + x[1];
|
||||
r1 = x[7] + x[3];
|
||||
x[3] = r2 + r3;
|
||||
x[1] = r2 - r3;
|
||||
x[7] = r1 + r0;
|
||||
x[5] = r1 - r0;
|
||||
|
||||
}
|
||||
|
||||
/* 16 point butterfly (in place, 4 register) */
|
||||
STIN void mdct_butterfly_16(DATA_TYPE *x){
|
||||
REG_TYPE r0 = x[1] - x[9];
|
||||
REG_TYPE r1 = x[0] - x[8];
|
||||
|
||||
x[8] += x[0];
|
||||
x[9] += x[1];
|
||||
x[0] = MULT_NORM((r0 + r1) * cPI2_8);
|
||||
x[1] = MULT_NORM((r0 - r1) * cPI2_8);
|
||||
|
||||
r0 = x[3] - x[11];
|
||||
r1 = x[10] - x[2];
|
||||
x[10] += x[2];
|
||||
x[11] += x[3];
|
||||
x[2] = r0;
|
||||
x[3] = r1;
|
||||
|
||||
r0 = x[12] - x[4];
|
||||
r1 = x[13] - x[5];
|
||||
x[12] += x[4];
|
||||
x[13] += x[5];
|
||||
x[4] = MULT_NORM((r0 - r1) * cPI2_8);
|
||||
x[5] = MULT_NORM((r0 + r1) * cPI2_8);
|
||||
|
||||
r0 = x[14] - x[6];
|
||||
r1 = x[15] - x[7];
|
||||
x[14] += x[6];
|
||||
x[15] += x[7];
|
||||
x[6] = r0;
|
||||
x[7] = r1;
|
||||
|
||||
mdct_butterfly_8(x);
|
||||
mdct_butterfly_8(x+8);
|
||||
}
|
||||
|
||||
/* 32 point butterfly (in place, 4 register) */
|
||||
STIN void mdct_butterfly_32(DATA_TYPE *x){
|
||||
REG_TYPE r0 = x[30] - x[14];
|
||||
REG_TYPE r1 = x[31] - x[15];
|
||||
|
||||
x[30] += x[14];
|
||||
x[31] += x[15];
|
||||
x[14] = r0;
|
||||
x[15] = r1;
|
||||
|
||||
r0 = x[28] - x[12];
|
||||
r1 = x[29] - x[13];
|
||||
x[28] += x[12];
|
||||
x[29] += x[13];
|
||||
x[12] = MULT_NORM( r0 * cPI1_8 - r1 * cPI3_8 );
|
||||
x[13] = MULT_NORM( r0 * cPI3_8 + r1 * cPI1_8 );
|
||||
|
||||
r0 = x[26] - x[10];
|
||||
r1 = x[27] - x[11];
|
||||
x[26] += x[10];
|
||||
x[27] += x[11];
|
||||
x[10] = MULT_NORM(( r0 - r1 ) * cPI2_8);
|
||||
x[11] = MULT_NORM(( r0 + r1 ) * cPI2_8);
|
||||
|
||||
r0 = x[24] - x[8];
|
||||
r1 = x[25] - x[9];
|
||||
x[24] += x[8];
|
||||
x[25] += x[9];
|
||||
x[8] = MULT_NORM( r0 * cPI3_8 - r1 * cPI1_8 );
|
||||
x[9] = MULT_NORM( r1 * cPI3_8 + r0 * cPI1_8 );
|
||||
|
||||
r0 = x[22] - x[6];
|
||||
r1 = x[7] - x[23];
|
||||
x[22] += x[6];
|
||||
x[23] += x[7];
|
||||
x[6] = r1;
|
||||
x[7] = r0;
|
||||
|
||||
r0 = x[4] - x[20];
|
||||
r1 = x[5] - x[21];
|
||||
x[20] += x[4];
|
||||
x[21] += x[5];
|
||||
x[4] = MULT_NORM( r1 * cPI1_8 + r0 * cPI3_8 );
|
||||
x[5] = MULT_NORM( r1 * cPI3_8 - r0 * cPI1_8 );
|
||||
|
||||
r0 = x[2] - x[18];
|
||||
r1 = x[3] - x[19];
|
||||
x[18] += x[2];
|
||||
x[19] += x[3];
|
||||
x[2] = MULT_NORM(( r1 + r0 ) * cPI2_8);
|
||||
x[3] = MULT_NORM(( r1 - r0 ) * cPI2_8);
|
||||
|
||||
r0 = x[0] - x[16];
|
||||
r1 = x[1] - x[17];
|
||||
x[16] += x[0];
|
||||
x[17] += x[1];
|
||||
x[0] = MULT_NORM( r1 * cPI3_8 + r0 * cPI1_8 );
|
||||
x[1] = MULT_NORM( r1 * cPI1_8 - r0 * cPI3_8 );
|
||||
|
||||
mdct_butterfly_16(x);
|
||||
mdct_butterfly_16(x+16);
|
||||
|
||||
}
|
||||
|
||||
/* N point first stage butterfly (in place, 2 register) */
|
||||
STIN void mdct_butterfly_first(DATA_TYPE *T,
|
||||
DATA_TYPE *x,
|
||||
int points){
|
||||
|
||||
DATA_TYPE *x1 = x + points - 8;
|
||||
DATA_TYPE *x2 = x + (points>>1) - 8;
|
||||
REG_TYPE r0;
|
||||
REG_TYPE r1;
|
||||
|
||||
do{
|
||||
|
||||
r0 = x1[6] - x2[6];
|
||||
r1 = x1[7] - x2[7];
|
||||
x1[6] += x2[6];
|
||||
x1[7] += x2[7];
|
||||
x2[6] = MULT_NORM(r1 * T[1] + r0 * T[0]);
|
||||
x2[7] = MULT_NORM(r1 * T[0] - r0 * T[1]);
|
||||
|
||||
r0 = x1[4] - x2[4];
|
||||
r1 = x1[5] - x2[5];
|
||||
x1[4] += x2[4];
|
||||
x1[5] += x2[5];
|
||||
x2[4] = MULT_NORM(r1 * T[5] + r0 * T[4]);
|
||||
x2[5] = MULT_NORM(r1 * T[4] - r0 * T[5]);
|
||||
|
||||
r0 = x1[2] - x2[2];
|
||||
r1 = x1[3] - x2[3];
|
||||
x1[2] += x2[2];
|
||||
x1[3] += x2[3];
|
||||
x2[2] = MULT_NORM(r1 * T[9] + r0 * T[8]);
|
||||
x2[3] = MULT_NORM(r1 * T[8] - r0 * T[9]);
|
||||
|
||||
r0 = x1[0] - x2[0];
|
||||
r1 = x1[1] - x2[1];
|
||||
x1[0] += x2[0];
|
||||
x1[1] += x2[1];
|
||||
x2[0] = MULT_NORM(r1 * T[13] + r0 * T[12]);
|
||||
x2[1] = MULT_NORM(r1 * T[12] - r0 * T[13]);
|
||||
|
||||
x1-=8;
|
||||
x2-=8;
|
||||
T+=16;
|
||||
|
||||
}while(x2>=x);
|
||||
}
|
||||
|
||||
/* N/stage point generic N stage butterfly (in place, 2 register) */
|
||||
STIN void mdct_butterfly_generic(DATA_TYPE *T,
|
||||
DATA_TYPE *x,
|
||||
int points,
|
||||
int trigint){
|
||||
|
||||
DATA_TYPE *x1 = x + points - 8;
|
||||
DATA_TYPE *x2 = x + (points>>1) - 8;
|
||||
REG_TYPE r0;
|
||||
REG_TYPE r1;
|
||||
|
||||
do{
|
||||
|
||||
r0 = x1[6] - x2[6];
|
||||
r1 = x1[7] - x2[7];
|
||||
x1[6] += x2[6];
|
||||
x1[7] += x2[7];
|
||||
x2[6] = MULT_NORM(r1 * T[1] + r0 * T[0]);
|
||||
x2[7] = MULT_NORM(r1 * T[0] - r0 * T[1]);
|
||||
|
||||
T+=trigint;
|
||||
|
||||
r0 = x1[4] - x2[4];
|
||||
r1 = x1[5] - x2[5];
|
||||
x1[4] += x2[4];
|
||||
x1[5] += x2[5];
|
||||
x2[4] = MULT_NORM(r1 * T[1] + r0 * T[0]);
|
||||
x2[5] = MULT_NORM(r1 * T[0] - r0 * T[1]);
|
||||
|
||||
T+=trigint;
|
||||
|
||||
r0 = x1[2] - x2[2];
|
||||
r1 = x1[3] - x2[3];
|
||||
x1[2] += x2[2];
|
||||
x1[3] += x2[3];
|
||||
x2[2] = MULT_NORM(r1 * T[1] + r0 * T[0]);
|
||||
x2[3] = MULT_NORM(r1 * T[0] - r0 * T[1]);
|
||||
|
||||
T+=trigint;
|
||||
|
||||
r0 = x1[0] - x2[0];
|
||||
r1 = x1[1] - x2[1];
|
||||
x1[0] += x2[0];
|
||||
x1[1] += x2[1];
|
||||
x2[0] = MULT_NORM(r1 * T[1] + r0 * T[0]);
|
||||
x2[1] = MULT_NORM(r1 * T[0] - r0 * T[1]);
|
||||
|
||||
T+=trigint;
|
||||
x1-=8;
|
||||
x2-=8;
|
||||
|
||||
}while(x2>=x);
|
||||
}
|
||||
|
||||
STIN void mdct_butterflies(mdct_lookup *init,
|
||||
DATA_TYPE *x,
|
||||
int points){
|
||||
|
||||
DATA_TYPE *T=init->trig;
|
||||
int stages=init->log2n-5;
|
||||
int i,j;
|
||||
|
||||
if(--stages>0){
|
||||
mdct_butterfly_first(T,x,points);
|
||||
}
|
||||
|
||||
for(i=1;--stages>0;i++){
|
||||
for(j=0;j<(1<<i);j++)
|
||||
mdct_butterfly_generic(T,x+(points>>i)*j,points>>i,4<<i);
|
||||
}
|
||||
|
||||
for(j=0;j<points;j+=32)
|
||||
mdct_butterfly_32(x+j);
|
||||
|
||||
}
|
||||
|
||||
void mdct_clear(mdct_lookup *l){
|
||||
if(l){
|
||||
if(l->trig)_ogg_free(l->trig);
|
||||
if(l->bitrev)_ogg_free(l->bitrev);
|
||||
memset(l,0,sizeof(*l));
|
||||
}
|
||||
}
|
||||
|
||||
STIN void mdct_bitreverse(mdct_lookup *init,
|
||||
DATA_TYPE *x){
|
||||
int n = init->n;
|
||||
int *bit = init->bitrev;
|
||||
DATA_TYPE *w0 = x;
|
||||
DATA_TYPE *w1 = x = w0+(n>>1);
|
||||
DATA_TYPE *T = init->trig+n;
|
||||
|
||||
do{
|
||||
DATA_TYPE *x0 = x+bit[0];
|
||||
DATA_TYPE *x1 = x+bit[1];
|
||||
|
||||
REG_TYPE r0 = x0[1] - x1[1];
|
||||
REG_TYPE r1 = x0[0] + x1[0];
|
||||
REG_TYPE r2 = MULT_NORM(r1 * T[0] + r0 * T[1]);
|
||||
REG_TYPE r3 = MULT_NORM(r1 * T[1] - r0 * T[0]);
|
||||
|
||||
w1 -= 4;
|
||||
|
||||
r0 = HALVE(x0[1] + x1[1]);
|
||||
r1 = HALVE(x0[0] - x1[0]);
|
||||
|
||||
w0[0] = r0 + r2;
|
||||
w1[2] = r0 - r2;
|
||||
w0[1] = r1 + r3;
|
||||
w1[3] = r3 - r1;
|
||||
|
||||
x0 = x+bit[2];
|
||||
x1 = x+bit[3];
|
||||
|
||||
r0 = x0[1] - x1[1];
|
||||
r1 = x0[0] + x1[0];
|
||||
r2 = MULT_NORM(r1 * T[2] + r0 * T[3]);
|
||||
r3 = MULT_NORM(r1 * T[3] - r0 * T[2]);
|
||||
|
||||
r0 = HALVE(x0[1] + x1[1]);
|
||||
r1 = HALVE(x0[0] - x1[0]);
|
||||
|
||||
w0[2] = r0 + r2;
|
||||
w1[0] = r0 - r2;
|
||||
w0[3] = r1 + r3;
|
||||
w1[1] = r3 - r1;
|
||||
|
||||
T += 4;
|
||||
bit += 4;
|
||||
w0 += 4;
|
||||
|
||||
}while(w0<w1);
|
||||
}
|
||||
|
||||
void mdct_backward(mdct_lookup *init, DATA_TYPE *in, DATA_TYPE *out){
|
||||
int n=init->n;
|
||||
int n2=n>>1;
|
||||
int n4=n>>2;
|
||||
|
||||
/* rotate */
|
||||
|
||||
DATA_TYPE *iX = in+n2-7;
|
||||
DATA_TYPE *oX = out+n2+n4;
|
||||
DATA_TYPE *T = init->trig+n4;
|
||||
|
||||
do{
|
||||
oX -= 4;
|
||||
oX[0] = MULT_NORM(-iX[2] * T[3] - iX[0] * T[2]);
|
||||
oX[1] = MULT_NORM (iX[0] * T[3] - iX[2] * T[2]);
|
||||
oX[2] = MULT_NORM(-iX[6] * T[1] - iX[4] * T[0]);
|
||||
oX[3] = MULT_NORM (iX[4] * T[1] - iX[6] * T[0]);
|
||||
iX -= 8;
|
||||
T += 4;
|
||||
}while(iX>=in);
|
||||
|
||||
iX = in+n2-8;
|
||||
oX = out+n2+n4;
|
||||
T = init->trig+n4;
|
||||
|
||||
do{
|
||||
T -= 4;
|
||||
oX[0] = MULT_NORM (iX[4] * T[3] + iX[6] * T[2]);
|
||||
oX[1] = MULT_NORM (iX[4] * T[2] - iX[6] * T[3]);
|
||||
oX[2] = MULT_NORM (iX[0] * T[1] + iX[2] * T[0]);
|
||||
oX[3] = MULT_NORM (iX[0] * T[0] - iX[2] * T[1]);
|
||||
iX -= 8;
|
||||
oX += 4;
|
||||
}while(iX>=in);
|
||||
|
||||
mdct_butterflies(init,out+n2,n2);
|
||||
mdct_bitreverse(init,out);
|
||||
|
||||
/* roatate + window */
|
||||
|
||||
{
|
||||
DATA_TYPE *oX1=out+n2+n4;
|
||||
DATA_TYPE *oX2=out+n2+n4;
|
||||
DATA_TYPE *iX =out;
|
||||
T =init->trig+n2;
|
||||
|
||||
do{
|
||||
oX1-=4;
|
||||
|
||||
oX1[3] = MULT_NORM (iX[0] * T[1] - iX[1] * T[0]);
|
||||
oX2[0] = -MULT_NORM (iX[0] * T[0] + iX[1] * T[1]);
|
||||
|
||||
oX1[2] = MULT_NORM (iX[2] * T[3] - iX[3] * T[2]);
|
||||
oX2[1] = -MULT_NORM (iX[2] * T[2] + iX[3] * T[3]);
|
||||
|
||||
oX1[1] = MULT_NORM (iX[4] * T[5] - iX[5] * T[4]);
|
||||
oX2[2] = -MULT_NORM (iX[4] * T[4] + iX[5] * T[5]);
|
||||
|
||||
oX1[0] = MULT_NORM (iX[6] * T[7] - iX[7] * T[6]);
|
||||
oX2[3] = -MULT_NORM (iX[6] * T[6] + iX[7] * T[7]);
|
||||
|
||||
oX2+=4;
|
||||
iX += 8;
|
||||
T += 8;
|
||||
}while(iX<oX1);
|
||||
|
||||
iX=out+n2+n4;
|
||||
oX1=out+n4;
|
||||
oX2=oX1;
|
||||
|
||||
do{
|
||||
oX1-=4;
|
||||
iX-=4;
|
||||
|
||||
oX2[0] = -(oX1[3] = iX[3]);
|
||||
oX2[1] = -(oX1[2] = iX[2]);
|
||||
oX2[2] = -(oX1[1] = iX[1]);
|
||||
oX2[3] = -(oX1[0] = iX[0]);
|
||||
|
||||
oX2+=4;
|
||||
}while(oX2<iX);
|
||||
|
||||
iX=out+n2+n4;
|
||||
oX1=out+n2+n4;
|
||||
oX2=out+n2;
|
||||
do{
|
||||
oX1-=4;
|
||||
oX1[0]= iX[3];
|
||||
oX1[1]= iX[2];
|
||||
oX1[2]= iX[1];
|
||||
oX1[3]= iX[0];
|
||||
iX+=4;
|
||||
}while(oX1>oX2);
|
||||
}
|
||||
}
|
||||
|
||||
void mdct_forward(mdct_lookup *init, DATA_TYPE *in, DATA_TYPE *out){
|
||||
int n=init->n;
|
||||
int n2=n>>1;
|
||||
int n4=n>>2;
|
||||
int n8=n>>3;
|
||||
DATA_TYPE *w=alloca(n*sizeof(*w)); /* forward needs working space */
|
||||
DATA_TYPE *w2=w+n2;
|
||||
|
||||
/* rotate */
|
||||
|
||||
/* window + rotate + step 1 */
|
||||
|
||||
REG_TYPE r0;
|
||||
REG_TYPE r1;
|
||||
DATA_TYPE *x0=in+n2+n4;
|
||||
DATA_TYPE *x1=x0+1;
|
||||
DATA_TYPE *T=init->trig+n2;
|
||||
|
||||
int i=0;
|
||||
|
||||
for(i=0;i<n8;i+=2){
|
||||
x0 -=4;
|
||||
T-=2;
|
||||
r0= x0[2] + x1[0];
|
||||
r1= x0[0] + x1[2];
|
||||
w2[i]= MULT_NORM(r1*T[1] + r0*T[0]);
|
||||
w2[i+1]= MULT_NORM(r1*T[0] - r0*T[1]);
|
||||
x1 +=4;
|
||||
}
|
||||
|
||||
x1=in+1;
|
||||
|
||||
for(;i<n2-n8;i+=2){
|
||||
T-=2;
|
||||
x0 -=4;
|
||||
r0= x0[2] - x1[0];
|
||||
r1= x0[0] - x1[2];
|
||||
w2[i]= MULT_NORM(r1*T[1] + r0*T[0]);
|
||||
w2[i+1]= MULT_NORM(r1*T[0] - r0*T[1]);
|
||||
x1 +=4;
|
||||
}
|
||||
|
||||
x0=in+n;
|
||||
|
||||
for(;i<n2;i+=2){
|
||||
T-=2;
|
||||
x0 -=4;
|
||||
r0= -x0[2] - x1[0];
|
||||
r1= -x0[0] - x1[2];
|
||||
w2[i]= MULT_NORM(r1*T[1] + r0*T[0]);
|
||||
w2[i+1]= MULT_NORM(r1*T[0] - r0*T[1]);
|
||||
x1 +=4;
|
||||
}
|
||||
|
||||
|
||||
mdct_butterflies(init,w+n2,n2);
|
||||
mdct_bitreverse(init,w);
|
||||
|
||||
/* roatate + window */
|
||||
|
||||
T=init->trig+n2;
|
||||
x0=out+n2;
|
||||
|
||||
for(i=0;i<n4;i++){
|
||||
x0--;
|
||||
out[i] =MULT_NORM((w[0]*T[0]+w[1]*T[1])*init->scale);
|
||||
x0[0] =MULT_NORM((w[0]*T[1]-w[1]*T[0])*init->scale);
|
||||
w+=2;
|
||||
T+=2;
|
||||
}
|
||||
}
|
@ -1,71 +0,0 @@
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: modified discrete cosine transform prototypes
|
||||
last mod: $Id: mdct.h 16227 2009-07-08 06:58:46Z xiphmont $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
#ifndef _OGG_mdct_H_
|
||||
#define _OGG_mdct_H_
|
||||
|
||||
#include "vorbis/codec.h"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*#define MDCT_INTEGERIZED <- be warned there could be some hurt left here*/
|
||||
#ifdef MDCT_INTEGERIZED
|
||||
|
||||
#define DATA_TYPE int
|
||||
#define REG_TYPE register int
|
||||
#define TRIGBITS 14
|
||||
#define cPI3_8 6270
|
||||
#define cPI2_8 11585
|
||||
#define cPI1_8 15137
|
||||
|
||||
#define FLOAT_CONV(x) ((int)((x)*(1<<TRIGBITS)+.5))
|
||||
#define MULT_NORM(x) ((x)>>TRIGBITS)
|
||||
#define HALVE(x) ((x)>>1)
|
||||
|
||||
#else
|
||||
|
||||
#define DATA_TYPE float
|
||||
#define REG_TYPE float
|
||||
#define cPI3_8 .38268343236508977175F
|
||||
#define cPI2_8 .70710678118654752441F
|
||||
#define cPI1_8 .92387953251128675613F
|
||||
|
||||
#define FLOAT_CONV(x) (x)
|
||||
#define MULT_NORM(x) (x)
|
||||
#define HALVE(x) ((x)*.5f)
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
typedef struct {
|
||||
int n;
|
||||
int log2n;
|
||||
|
||||
DATA_TYPE *trig;
|
||||
int *bitrev;
|
||||
|
||||
DATA_TYPE scale;
|
||||
} mdct_lookup;
|
||||
|
||||
extern void mdct_init(mdct_lookup *lookup,int n);
|
||||
extern void mdct_clear(mdct_lookup *l);
|
||||
extern void mdct_forward(mdct_lookup *init, DATA_TYPE *in, DATA_TYPE *out);
|
||||
extern void mdct_backward(mdct_lookup *init, DATA_TYPE *in, DATA_TYPE *out);
|
||||
|
||||
#endif
|
@ -1,58 +0,0 @@
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2015 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: miscellaneous prototypes
|
||||
last mod: $Id: misc.h 19457 2015-03-03 00:15:29Z giles $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
#ifndef _V_RANDOM_H_
|
||||
#define _V_RANDOM_H_
|
||||
#include "vorbis/codec.h"
|
||||
|
||||
extern void *_vorbis_block_alloc(vorbis_block *vb,long bytes);
|
||||
extern void _vorbis_block_ripcord(vorbis_block *vb);
|
||||
extern int ov_ilog(ogg_uint32_t v);
|
||||
|
||||
#ifdef ANALYSIS
|
||||
extern int analysis_noisy;
|
||||
extern void _analysis_output(char *base,int i,float *v,int n,int bark,int dB,
|
||||
ogg_int64_t off);
|
||||
extern void _analysis_output_always(char *base,int i,float *v,int n,int bark,int dB,
|
||||
ogg_int64_t off);
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG_MALLOC
|
||||
|
||||
#define _VDBG_GRAPHFILE "malloc.m"
|
||||
#undef _VDBG_GRAPHFILE
|
||||
extern void *_VDBG_malloc(void *ptr,long bytes,char *file,long line);
|
||||
extern void _VDBG_free(void *ptr,char *file,long line);
|
||||
|
||||
#ifndef MISC_C
|
||||
#undef _ogg_malloc
|
||||
#undef _ogg_calloc
|
||||
#undef _ogg_realloc
|
||||
#undef _ogg_free
|
||||
|
||||
#define _ogg_malloc(x) _VDBG_malloc(NULL,(x),__FILE__,__LINE__)
|
||||
#define _ogg_calloc(x,y) _VDBG_malloc(NULL,(x)*(y),__FILE__,__LINE__)
|
||||
#define _ogg_realloc(x,y) _VDBG_malloc((x),(y),__FILE__,__LINE__)
|
||||
#define _ogg_free(x) _VDBG_free((x),__FILE__,__LINE__)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
@ -1,260 +0,0 @@
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: key floor settings
|
||||
last mod: $Id: floor_all.h 17050 2010-03-26 01:34:42Z xiphmont $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
#include "vorbis/codec.h"
|
||||
#include "backends.h"
|
||||
#include "books/floor/floor_books.h"
|
||||
|
||||
static const static_codebook*const _floor_128x4_books[]={
|
||||
&_huff_book_line_128x4_class0,
|
||||
&_huff_book_line_128x4_0sub0,
|
||||
&_huff_book_line_128x4_0sub1,
|
||||
&_huff_book_line_128x4_0sub2,
|
||||
&_huff_book_line_128x4_0sub3,
|
||||
};
|
||||
static const static_codebook*const _floor_256x4_books[]={
|
||||
&_huff_book_line_256x4_class0,
|
||||
&_huff_book_line_256x4_0sub0,
|
||||
&_huff_book_line_256x4_0sub1,
|
||||
&_huff_book_line_256x4_0sub2,
|
||||
&_huff_book_line_256x4_0sub3,
|
||||
};
|
||||
static const static_codebook*const _floor_128x7_books[]={
|
||||
&_huff_book_line_128x7_class0,
|
||||
&_huff_book_line_128x7_class1,
|
||||
|
||||
&_huff_book_line_128x7_0sub1,
|
||||
&_huff_book_line_128x7_0sub2,
|
||||
&_huff_book_line_128x7_0sub3,
|
||||
&_huff_book_line_128x7_1sub1,
|
||||
&_huff_book_line_128x7_1sub2,
|
||||
&_huff_book_line_128x7_1sub3,
|
||||
};
|
||||
static const static_codebook*const _floor_256x7_books[]={
|
||||
&_huff_book_line_256x7_class0,
|
||||
&_huff_book_line_256x7_class1,
|
||||
|
||||
&_huff_book_line_256x7_0sub1,
|
||||
&_huff_book_line_256x7_0sub2,
|
||||
&_huff_book_line_256x7_0sub3,
|
||||
&_huff_book_line_256x7_1sub1,
|
||||
&_huff_book_line_256x7_1sub2,
|
||||
&_huff_book_line_256x7_1sub3,
|
||||
};
|
||||
static const static_codebook*const _floor_128x11_books[]={
|
||||
&_huff_book_line_128x11_class1,
|
||||
&_huff_book_line_128x11_class2,
|
||||
&_huff_book_line_128x11_class3,
|
||||
|
||||
&_huff_book_line_128x11_0sub0,
|
||||
&_huff_book_line_128x11_1sub0,
|
||||
&_huff_book_line_128x11_1sub1,
|
||||
&_huff_book_line_128x11_2sub1,
|
||||
&_huff_book_line_128x11_2sub2,
|
||||
&_huff_book_line_128x11_2sub3,
|
||||
&_huff_book_line_128x11_3sub1,
|
||||
&_huff_book_line_128x11_3sub2,
|
||||
&_huff_book_line_128x11_3sub3,
|
||||
};
|
||||
static const static_codebook*const _floor_128x17_books[]={
|
||||
&_huff_book_line_128x17_class1,
|
||||
&_huff_book_line_128x17_class2,
|
||||
&_huff_book_line_128x17_class3,
|
||||
|
||||
&_huff_book_line_128x17_0sub0,
|
||||
&_huff_book_line_128x17_1sub0,
|
||||
&_huff_book_line_128x17_1sub1,
|
||||
&_huff_book_line_128x17_2sub1,
|
||||
&_huff_book_line_128x17_2sub2,
|
||||
&_huff_book_line_128x17_2sub3,
|
||||
&_huff_book_line_128x17_3sub1,
|
||||
&_huff_book_line_128x17_3sub2,
|
||||
&_huff_book_line_128x17_3sub3,
|
||||
};
|
||||
static const static_codebook*const _floor_256x4low_books[]={
|
||||
&_huff_book_line_256x4low_class0,
|
||||
&_huff_book_line_256x4low_0sub0,
|
||||
&_huff_book_line_256x4low_0sub1,
|
||||
&_huff_book_line_256x4low_0sub2,
|
||||
&_huff_book_line_256x4low_0sub3,
|
||||
};
|
||||
static const static_codebook*const _floor_1024x27_books[]={
|
||||
&_huff_book_line_1024x27_class1,
|
||||
&_huff_book_line_1024x27_class2,
|
||||
&_huff_book_line_1024x27_class3,
|
||||
&_huff_book_line_1024x27_class4,
|
||||
|
||||
&_huff_book_line_1024x27_0sub0,
|
||||
&_huff_book_line_1024x27_1sub0,
|
||||
&_huff_book_line_1024x27_1sub1,
|
||||
&_huff_book_line_1024x27_2sub0,
|
||||
&_huff_book_line_1024x27_2sub1,
|
||||
&_huff_book_line_1024x27_3sub1,
|
||||
&_huff_book_line_1024x27_3sub2,
|
||||
&_huff_book_line_1024x27_3sub3,
|
||||
&_huff_book_line_1024x27_4sub1,
|
||||
&_huff_book_line_1024x27_4sub2,
|
||||
&_huff_book_line_1024x27_4sub3,
|
||||
};
|
||||
static const static_codebook*const _floor_2048x27_books[]={
|
||||
&_huff_book_line_2048x27_class1,
|
||||
&_huff_book_line_2048x27_class2,
|
||||
&_huff_book_line_2048x27_class3,
|
||||
&_huff_book_line_2048x27_class4,
|
||||
|
||||
&_huff_book_line_2048x27_0sub0,
|
||||
&_huff_book_line_2048x27_1sub0,
|
||||
&_huff_book_line_2048x27_1sub1,
|
||||
&_huff_book_line_2048x27_2sub0,
|
||||
&_huff_book_line_2048x27_2sub1,
|
||||
&_huff_book_line_2048x27_3sub1,
|
||||
&_huff_book_line_2048x27_3sub2,
|
||||
&_huff_book_line_2048x27_3sub3,
|
||||
&_huff_book_line_2048x27_4sub1,
|
||||
&_huff_book_line_2048x27_4sub2,
|
||||
&_huff_book_line_2048x27_4sub3,
|
||||
};
|
||||
|
||||
static const static_codebook*const _floor_512x17_books[]={
|
||||
&_huff_book_line_512x17_class1,
|
||||
&_huff_book_line_512x17_class2,
|
||||
&_huff_book_line_512x17_class3,
|
||||
|
||||
&_huff_book_line_512x17_0sub0,
|
||||
&_huff_book_line_512x17_1sub0,
|
||||
&_huff_book_line_512x17_1sub1,
|
||||
&_huff_book_line_512x17_2sub1,
|
||||
&_huff_book_line_512x17_2sub2,
|
||||
&_huff_book_line_512x17_2sub3,
|
||||
&_huff_book_line_512x17_3sub1,
|
||||
&_huff_book_line_512x17_3sub2,
|
||||
&_huff_book_line_512x17_3sub3,
|
||||
};
|
||||
|
||||
static const static_codebook*const _floor_Xx0_books[]={
|
||||
0
|
||||
};
|
||||
|
||||
static const static_codebook*const *const _floor_books[11]={
|
||||
_floor_128x4_books,
|
||||
_floor_256x4_books,
|
||||
_floor_128x7_books,
|
||||
_floor_256x7_books,
|
||||
_floor_128x11_books,
|
||||
_floor_128x17_books,
|
||||
_floor_256x4low_books,
|
||||
_floor_1024x27_books,
|
||||
_floor_2048x27_books,
|
||||
_floor_512x17_books,
|
||||
_floor_Xx0_books,
|
||||
};
|
||||
|
||||
static const vorbis_info_floor1 _floor[11]={
|
||||
/* 0: 128 x 4 */
|
||||
{
|
||||
1,{0},{4},{2},{0},
|
||||
{{1,2,3,4}},
|
||||
4,{0,128, 33,8,16,70},
|
||||
|
||||
60,30,500, 1.,18., 128
|
||||
},
|
||||
/* 1: 256 x 4 */
|
||||
{
|
||||
1,{0},{4},{2},{0},
|
||||
{{1,2,3,4}},
|
||||
4,{0,256, 66,16,32,140},
|
||||
|
||||
60,30,500, 1.,18., 256
|
||||
},
|
||||
/* 2: 128 x 7 */
|
||||
{
|
||||
2,{0,1},{3,4},{2,2},{0,1},
|
||||
{{-1,2,3,4},{-1,5,6,7}},
|
||||
4,{0,128, 14,4,58, 2,8,28,90},
|
||||
|
||||
60,30,500, 1.,18., 128
|
||||
},
|
||||
/* 3: 256 x 7 */
|
||||
{
|
||||
2,{0,1},{3,4},{2,2},{0,1},
|
||||
{{-1,2,3,4},{-1,5,6,7}},
|
||||
4,{0,256, 28,8,116, 4,16,56,180},
|
||||
|
||||
60,30,500, 1.,18., 256
|
||||
},
|
||||
/* 4: 128 x 11 */
|
||||
{
|
||||
4,{0,1,2,3},{2,3,3,3},{0,1,2,2},{-1,0,1,2},
|
||||
{{3},{4,5},{-1,6,7,8},{-1,9,10,11}},
|
||||
|
||||
2,{0,128, 8,33, 4,16,70, 2,6,12, 23,46,90},
|
||||
|
||||
60,30,500, 1,18., 128
|
||||
},
|
||||
/* 5: 128 x 17 */
|
||||
{
|
||||
6,{0,1,1,2,3,3},{2,3,3,3},{0,1,2,2},{-1,0,1,2},
|
||||
{{3},{4,5},{-1,6,7,8},{-1,9,10,11}},
|
||||
2,{0,128, 12,46, 4,8,16, 23,33,70, 2,6,10, 14,19,28, 39,58,90},
|
||||
|
||||
60,30,500, 1,18., 128
|
||||
},
|
||||
/* 6: 256 x 4 (low bitrate version) */
|
||||
{
|
||||
1,{0},{4},{2},{0},
|
||||
{{1,2,3,4}},
|
||||
4,{0,256, 66,16,32,140},
|
||||
|
||||
60,30,500, 1.,18., 256
|
||||
},
|
||||
/* 7: 1024 x 27 */
|
||||
{
|
||||
8,{0,1,2,2,3,3,4,4},{3,4,3,4,3},{0,1,1,2,2},{-1,0,1,2,3},
|
||||
{{4},{5,6},{7,8},{-1,9,10,11},{-1,12,13,14}},
|
||||
2,{0,1024, 93,23,372, 6,46,186,750, 14,33,65, 130,260,556,
|
||||
3,10,18,28, 39,55,79,111, 158,220,312, 464,650,850},
|
||||
|
||||
60,30,500, 3,18., 1024
|
||||
},
|
||||
/* 8: 2048 x 27 */
|
||||
{
|
||||
8,{0,1,2,2,3,3,4,4},{3,4,3,4,3},{0,1,1,2,2},{-1,0,1,2,3},
|
||||
{{4},{5,6},{7,8},{-1,9,10,11},{-1,12,13,14}},
|
||||
2,{0,2048, 186,46,744, 12,92,372,1500, 28,66,130, 260,520,1112,
|
||||
6,20,36,56, 78,110,158,222, 316,440,624, 928,1300,1700},
|
||||
|
||||
60,30,500, 3,18., 2048
|
||||
},
|
||||
/* 9: 512 x 17 */
|
||||
{
|
||||
6,{0,1,1,2,3,3},{2,3,3,3},{0,1,2,2},{-1,0,1,2},
|
||||
{{3},{4,5},{-1,6,7,8},{-1,9,10,11}},
|
||||
2,{0,512, 46,186, 16,33,65, 93,130,278,
|
||||
7,23,39, 55,79,110, 156,232,360},
|
||||
|
||||
60,30,500, 1,18., 512
|
||||
},
|
||||
|
||||
/* 10: X x 0 (LFE floor; edge posts only) */
|
||||
{
|
||||
0,{0}, {0},{0},{-1},
|
||||
{{-1}},
|
||||
2,{0,12},
|
||||
60,30,500, 1.,18., 10
|
||||
},
|
||||
|
||||
};
|
@ -1,51 +0,0 @@
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: 11kHz settings
|
||||
last mod: $Id: psych_11.h 16227 2009-07-08 06:58:46Z xiphmont $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
static const double _psy_lowpass_11[3]={4.5,5.5,30.,};
|
||||
|
||||
static const att3 _psy_tone_masteratt_11[3]={
|
||||
{{ 30, 25, 12}, 0, 0}, /* 0 */
|
||||
{{ 30, 25, 12}, 0, 0}, /* 0 */
|
||||
{{ 20, 0, -14}, 0, 0}, /* 0 */
|
||||
};
|
||||
|
||||
static const vp_adjblock _vp_tonemask_adj_11[3]={
|
||||
/* adjust for mode zero */
|
||||
/* 63 125 250 500 1 2 4 8 16 */
|
||||
{{-20,-20,-20,-20,-20,-16,-10, 0, 0, 0, 0,10, 2, 0,99,99,99}}, /* 0 */
|
||||
{{-20,-20,-20,-20,-20,-16,-10, 0, 0, 0, 0, 5, 0, 0,99,99,99}}, /* 1 */
|
||||
{{-20,-20,-20,-20,-20,-16,-10, 0, 0, 0, 0, 0, 0, 0,99,99,99}}, /* 2 */
|
||||
};
|
||||
|
||||
|
||||
static const noise3 _psy_noisebias_11[3]={
|
||||
/* 63 125 250 500 1k 2k 4k 8k 16k*/
|
||||
{{{-10,-10,-10,-10, -5, -5, -5, 0, 4, 10, 10, 12, 12, 12, 99, 99, 99},
|
||||
{-15,-15,-15,-15,-10,-10, -5, 0, 0, 4, 4, 5, 5, 10, 99, 99, 99},
|
||||
{-30,-30,-30,-30,-30,-24,-20,-14,-10, -6, -8, -8, -6, -6, 99, 99, 99}}},
|
||||
|
||||
{{{-10,-10,-10,-10, -5, -5, -5, 0, 4, 10, 10, 12, 12, 12, 99, 99, 99},
|
||||
{-15,-15,-15,-15,-10,-10, -5, -5, -5, 0, 0, 0, 0, 0, 99, 99, 99},
|
||||
{-30,-30,-30,-30,-30,-24,-20,-14,-10, -6, -8, -8, -6, -6, 99, 99, 99}}},
|
||||
|
||||
{{{-15,-15,-15,-15,-15,-12,-10, -8, 0, 2, 4, 4, 5, 5, 99, 99, 99},
|
||||
{-30,-30,-30,-30,-26,-22,-20,-14,-12,-12,-10,-10,-10,-10, 99, 99, 99},
|
||||
{-30,-30,-30,-30,-26,-26,-26,-26,-26,-26,-26,-26,-26,-24, 99, 99, 99}}},
|
||||
};
|
||||
|
||||
static const double _noise_thresh_11[3]={ .3,.5,.5 };
|
||||
|
@ -1,133 +0,0 @@
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: 16kHz settings
|
||||
last mod: $Id: psych_16.h 16227 2009-07-08 06:58:46Z xiphmont $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
/* stereo mode by base quality level */
|
||||
static const adj_stereo _psy_stereo_modes_16[4]={
|
||||
/* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 */
|
||||
{{ 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3},
|
||||
{ 6, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4},
|
||||
{ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4, 4},
|
||||
{ 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}},
|
||||
{{ 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3},
|
||||
{ 6, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4},
|
||||
{ 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 4, 4, 4, 4, 4},
|
||||
{ 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}},
|
||||
{{ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3},
|
||||
{ 5, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3},
|
||||
{ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4},
|
||||
{ 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}},
|
||||
{{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8},
|
||||
{ 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}},
|
||||
};
|
||||
|
||||
static const double _psy_lowpass_16[4]={6.5,8,30.,99.};
|
||||
|
||||
static const att3 _psy_tone_masteratt_16[4]={
|
||||
{{ 30, 25, 12}, 0, 0}, /* 0 */
|
||||
{{ 25, 22, 12}, 0, 0}, /* 0 */
|
||||
{{ 20, 12, 0}, 0, 0}, /* 0 */
|
||||
{{ 15, 0, -14}, 0, 0}, /* 0 */
|
||||
};
|
||||
|
||||
static const vp_adjblock _vp_tonemask_adj_16[4]={
|
||||
/* adjust for mode zero */
|
||||
/* 63 125 250 500 1 2 4 8 16 */
|
||||
{{-20,-20,-20,-20,-20,-16,-10, 0, 0, 0, 0,10, 0, 0, 0, 0, 0}}, /* 0 */
|
||||
{{-20,-20,-20,-20,-20,-16,-10, 0, 0, 0, 0,10, 0, 0, 0, 0, 0}}, /* 1 */
|
||||
{{-20,-20,-20,-20,-20,-16,-10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, /* 2 */
|
||||
{{-30,-30,-30,-30,-30,-26,-20,-10, -5, 0, 0, 0, 0, 0, 0, 0, 0}}, /* 2 */
|
||||
};
|
||||
|
||||
|
||||
static const noise3 _psy_noisebias_16_short[4]={
|
||||
/* 63 125 250 500 1k 2k 4k 8k 16k*/
|
||||
{{{-15,-15,-15,-15,-15,-10,-10,-5, 4, 10, 10, 10, 10, 12, 12, 14, 20},
|
||||
{-15,-15,-15,-15,-15,-10,-10, -5, 0, 0, 4, 5, 5, 6, 8, 8, 15},
|
||||
{-30,-30,-30,-30,-30,-24,-20,-14,-10, -6, -8, -8, -6, -6, -6, -6, -6}}},
|
||||
|
||||
{{{-15,-15,-15,-15,-15,-10,-10,-5, 4, 6, 6, 6, 6, 8, 10, 12, 20},
|
||||
{-15,-15,-15,-15,-15,-15,-15,-10, -5, -5, -5, 4, 5, 6, 8, 8, 15},
|
||||
{-30,-30,-30,-30,-30,-24,-20,-14,-10,-10,-10,-10,-10,-10,-10,-10,-10}}},
|
||||
|
||||
{{{-15,-15,-15,-15,-15,-12,-10, -8, 0, 2, 4, 4, 5, 5, 5, 8, 12},
|
||||
{-20,-20,-20,-20,-16,-12,-20,-14,-10,-10, -8, 0, 0, 0, 0, 2, 5},
|
||||
{-30,-30,-30,-30,-26,-26,-26,-26,-26,-26,-26,-26,-26,-24,-20,-20,-20}}},
|
||||
|
||||
{{{-15,-15,-15,-15,-15,-12,-10, -8, -5, -5, -5, -5, -5, 0, 0, 0, 6},
|
||||
{-30,-30,-30,-30,-26,-22,-20,-14,-12,-12,-10,-10,-10,-10,-10,-10, -6},
|
||||
{-30,-30,-30,-30,-26,-26,-26,-26,-26,-26,-26,-26,-26,-24,-20,-20,-20}}},
|
||||
};
|
||||
|
||||
static const noise3 _psy_noisebias_16_impulse[4]={
|
||||
/* 63 125 250 500 1k 2k 4k 8k 16k*/
|
||||
{{{-15,-15,-15,-15,-15,-10,-10,-5, 4, 10, 10, 10, 10, 12, 12, 14, 20},
|
||||
{-15,-15,-15,-15,-15,-10,-10, -5, 0, 0, 4, 5, 5, 6, 8, 8, 15},
|
||||
{-30,-30,-30,-30,-30,-24,-20,-14,-10, -6, -8, -8, -6, -6, -6, -6, -6}}},
|
||||
|
||||
{{{-15,-15,-15,-15,-15,-10,-10,-5, 4, 4, 4, 4, 5, 5, 6, 8, 15},
|
||||
{-15,-15,-15,-15,-15,-15,-15,-10, -5, -5, -5, 0, 0, 0, 0, 4, 10},
|
||||
{-30,-30,-30,-30,-30,-24,-20,-14,-10,-10,-10,-10,-10,-10,-10,-10,-10}}},
|
||||
|
||||
{{{-15,-15,-15,-15,-15,-12,-10, -8, 0, 0, 0, 0, 0, 0, 0, 4, 10},
|
||||
{-20,-20,-20,-20,-16,-12,-20,-14,-10,-10,-10,-10,-10,-10,-10, -7, -5},
|
||||
{-30,-30,-30,-30,-26,-26,-26,-26,-26,-26,-26,-26,-26,-24,-20,-20,-20}}},
|
||||
|
||||
{{{-15,-15,-15,-15,-15,-12,-10, -8, -5, -5, -5, -5, -5, 0, 0, 0, 6},
|
||||
{-30,-30,-30,-30,-26,-22,-20,-18,-18,-18,-20,-20,-20,-20,-20,-20,-16},
|
||||
{-30,-30,-30,-30,-26,-26,-26,-26,-26,-26,-26,-26,-26,-24,-20,-20,-20}}},
|
||||
};
|
||||
|
||||
static const noise3 _psy_noisebias_16[4]={
|
||||
/* 63 125 250 500 1k 2k 4k 8k 16k*/
|
||||
{{{-10,-10,-10,-10, -5, -5, -5, 0, 4, 6, 8, 8, 10, 10, 10, 14, 20},
|
||||
{-10,-10,-10,-10,-10, -5, -2, -2, 0, 0, 0, 4, 5, 6, 8, 8, 15},
|
||||
{-30,-30,-30,-30,-30,-24,-20,-14,-10, -6, -8, -8, -6, -6, -6, -6, -6}}},
|
||||
|
||||
{{{-10,-10,-10,-10, -5, -5, -5, 0, 4, 6, 6, 6, 6, 8, 10, 12, 20},
|
||||
{-15,-15,-15,-15,-15,-10, -5, -5, 0, 0, 0, 4, 5, 6, 8, 8, 15},
|
||||
{-30,-30,-30,-30,-30,-24,-20,-14,-10, -6, -8, -8, -6, -6, -6, -6, -6}}},
|
||||
|
||||
{{{-15,-15,-15,-15,-15,-12,-10, -8, 0, 2, 4, 4, 5, 5, 5, 8, 12},
|
||||
{-20,-20,-20,-20,-16,-12,-20,-10, -5, -5, 0, 0, 0, 0, 0, 2, 5},
|
||||
{-30,-30,-30,-30,-26,-26,-26,-26,-26,-26,-26,-26,-26,-24,-20,-20,-20}}},
|
||||
|
||||
{{{-15,-15,-15,-15,-15,-12,-10, -8, -5, -5, -5, -5, -5, 0, 0, 0, 6},
|
||||
{-30,-30,-30,-30,-26,-22,-20,-14,-12,-12,-10,-10,-10,-10,-10,-10, -6},
|
||||
{-30,-30,-30,-30,-26,-26,-26,-26,-26,-26,-26,-26,-26,-24,-20,-20,-20}}},
|
||||
};
|
||||
|
||||
static const noiseguard _psy_noiseguards_16[4]={
|
||||
{10,10,-1},
|
||||
{10,10,-1},
|
||||
{20,20,-1},
|
||||
{20,20,-1},
|
||||
};
|
||||
|
||||
static const double _noise_thresh_16[4]={ .3,.5,.5,.5 };
|
||||
|
||||
static const int _noise_start_16[3]={ 256,256,9999 };
|
||||
static const int _noise_part_16[4]={ 8,8,8,8 };
|
||||
|
||||
static const int _psy_ath_floater_16[4]={
|
||||
-100,-100,-100,-105,
|
||||
};
|
||||
|
||||
static const int _psy_ath_abs_16[4]={
|
||||
-130,-130,-130,-140,
|
||||
};
|
@ -1,642 +0,0 @@
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: key psychoacoustic settings for 44.1/48kHz
|
||||
last mod: $Id: psych_44.h 16962 2010-03-11 07:30:34Z xiphmont $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
|
||||
/* preecho trigger settings *****************************************/
|
||||
|
||||
static const vorbis_info_psy_global _psy_global_44[5]={
|
||||
|
||||
{8, /* lines per eighth octave */
|
||||
{20.f,14.f,12.f,12.f,12.f,12.f,12.f},
|
||||
{-60.f,-30.f,-40.f,-40.f,-40.f,-40.f,-40.f}, 2,-75.f,
|
||||
-6.f,
|
||||
{99.},{{99.},{99.}},{0},{0},{{0.},{0.}}
|
||||
},
|
||||
{8, /* lines per eighth octave */
|
||||
{14.f,10.f,10.f,10.f,10.f,10.f,10.f},
|
||||
{-40.f,-30.f,-25.f,-25.f,-25.f,-25.f,-25.f}, 2,-80.f,
|
||||
-6.f,
|
||||
{99.},{{99.},{99.}},{0},{0},{{0.},{0.}}
|
||||
},
|
||||
{8, /* lines per eighth octave */
|
||||
{12.f,10.f,10.f,10.f,10.f,10.f,10.f},
|
||||
{-20.f,-20.f,-15.f,-15.f,-15.f,-15.f,-15.f}, 0,-80.f,
|
||||
-6.f,
|
||||
{99.},{{99.},{99.}},{0},{0},{{0.},{0.}}
|
||||
},
|
||||
{8, /* lines per eighth octave */
|
||||
{10.f,8.f,8.f,8.f,8.f,8.f,8.f},
|
||||
{-20.f,-15.f,-12.f,-12.f,-12.f,-12.f,-12.f}, 0,-80.f,
|
||||
-6.f,
|
||||
{99.},{{99.},{99.}},{0},{0},{{0.},{0.}}
|
||||
},
|
||||
{8, /* lines per eighth octave */
|
||||
{10.f,6.f,6.f,6.f,6.f,6.f,6.f},
|
||||
{-15.f,-15.f,-12.f,-12.f,-12.f,-12.f,-12.f}, 0,-85.f,
|
||||
-6.f,
|
||||
{99.},{{99.},{99.}},{0},{0},{{0.},{0.}}
|
||||
},
|
||||
};
|
||||
|
||||
/* noise compander lookups * low, mid, high quality ****************/
|
||||
static const compandblock _psy_compand_44[6]={
|
||||
/* sub-mode Z short */
|
||||
{{
|
||||
0, 1, 2, 3, 4, 5, 6, 7, /* 7dB */
|
||||
8, 9,10,11,12,13,14, 15, /* 15dB */
|
||||
16,17,18,19,20,21,22, 23, /* 23dB */
|
||||
24,25,26,27,28,29,30, 31, /* 31dB */
|
||||
32,33,34,35,36,37,38, 39, /* 39dB */
|
||||
}},
|
||||
/* mode_Z nominal short */
|
||||
{{
|
||||
0, 1, 2, 3, 4, 5, 6, 6, /* 7dB */
|
||||
7, 7, 7, 7, 6, 6, 6, 7, /* 15dB */
|
||||
7, 8, 9,10,11,12,13, 14, /* 23dB */
|
||||
15,16,17,17,17,18,18, 19, /* 31dB */
|
||||
19,19,20,21,22,23,24, 25, /* 39dB */
|
||||
}},
|
||||
/* mode A short */
|
||||
{{
|
||||
0, 1, 2, 3, 4, 5, 5, 5, /* 7dB */
|
||||
6, 6, 6, 5, 4, 4, 4, 4, /* 15dB */
|
||||
4, 4, 5, 5, 5, 6, 6, 6, /* 23dB */
|
||||
7, 7, 7, 8, 8, 8, 9, 10, /* 31dB */
|
||||
11,12,13,14,15,16,17, 18, /* 39dB */
|
||||
}},
|
||||
/* sub-mode Z long */
|
||||
{{
|
||||
0, 1, 2, 3, 4, 5, 6, 7, /* 7dB */
|
||||
8, 9,10,11,12,13,14, 15, /* 15dB */
|
||||
16,17,18,19,20,21,22, 23, /* 23dB */
|
||||
24,25,26,27,28,29,30, 31, /* 31dB */
|
||||
32,33,34,35,36,37,38, 39, /* 39dB */
|
||||
}},
|
||||
/* mode_Z nominal long */
|
||||
{{
|
||||
0, 1, 2, 3, 4, 5, 6, 7, /* 7dB */
|
||||
8, 9,10,11,12,12,13, 13, /* 15dB */
|
||||
13,14,14,14,15,15,15, 15, /* 23dB */
|
||||
16,16,17,17,17,18,18, 19, /* 31dB */
|
||||
19,19,20,21,22,23,24, 25, /* 39dB */
|
||||
}},
|
||||
/* mode A long */
|
||||
{{
|
||||
0, 1, 2, 3, 4, 5, 6, 7, /* 7dB */
|
||||
8, 8, 7, 6, 5, 4, 4, 4, /* 15dB */
|
||||
4, 4, 5, 5, 5, 6, 6, 6, /* 23dB */
|
||||
7, 7, 7, 8, 8, 8, 9, 10, /* 31dB */
|
||||
11,12,13,14,15,16,17, 18, /* 39dB */
|
||||
}}
|
||||
};
|
||||
|
||||
/* tonal masking curve level adjustments *************************/
|
||||
|
||||
static const vp_adjblock _vp_tonemask_adj_longblock[12]={
|
||||
|
||||
/* 63 125 250 500 1 2 4 8 16 */
|
||||
|
||||
{{ -3, -8,-13,-15,-10,-10,-10,-10,-10,-10,-10, 0, 0, 0, 0, 0, 0}}, /* -1 */
|
||||
|
||||
/* {{-15,-15,-15,-15,-10, -8, -4, -2, 0, 0, 0, 10, 0, 0, 0, 0, 0}}, 0 */
|
||||
{{ -4,-10,-14,-16,-15,-14,-13,-12,-12,-12,-11, -1, -1, -1, -1, -1, 0}}, /* 0 */
|
||||
|
||||
/* {{-15,-15,-15,-15,-15,-12,-10, -8, 0, 0, 0, 5, 0, 0, 0, 0, 0}}, 1 */
|
||||
{{ -6,-12,-14,-16,-15,-15,-14,-13,-13,-12,-12, -2, -2, -1, -1, -1, 0}}, /* 1 */
|
||||
|
||||
/* {{-15,-15,-15,-15,-15,-12,-10, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, 2 */
|
||||
{{-12,-13,-14,-16,-16,-16,-15,-14,-13,-12,-12, -6, -3, -1, -1, -1, 0}}, /* 2 */
|
||||
|
||||
/* {{-15,-15,-15,-15,-15,-12,-10, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, 3 */
|
||||
{{-15,-15,-15,-16,-16,-16,-16,-14,-13,-13,-13,-10, -4, -2, -1, -1, 0}}, /* 3 */
|
||||
|
||||
/* {{-15,-15,-15,-15,-15,-12,-10, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, *//* 4 */
|
||||
{{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-13,-11, -7 -3, -1, -1 , 0}}, /* 4 */
|
||||
|
||||
/* {{-15,-15,-15,-15,-15,-12,-10, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, 5 */
|
||||
{{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-13,-11, -7 -3, -1, -1 , 0}}, /* 5 */
|
||||
|
||||
/* {{-15,-15,-15,-15,-15,-12,-10, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, 6 */
|
||||
{{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-14,-12, -8, -4, -2, -2, 0}}, /* 6 */
|
||||
|
||||
/* {{-15,-15,-15,-15,-15,-12,-10, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, 7 */
|
||||
{{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-14,-12, -9, -4, -2, -2, 0}}, /* 7 */
|
||||
|
||||
/* {{-15,-15,-15,-15,-15,-12,-10, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, 8 */
|
||||
{{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-14,-12, -9, -4, -2, -2, 0}}, /* 8 */
|
||||
|
||||
/* {{-15,-15,-15,-15,-15,-12,-10, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, 9 */
|
||||
{{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-14,-12, -9, -4, -2, -2, 0}}, /* 9 */
|
||||
|
||||
/* {{-15,-15,-15,-15,-15,-12,-10, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, 10 */
|
||||
{{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-14,-12, -9, -4, -2, -2, 0}}, /* 10 */
|
||||
};
|
||||
|
||||
static const vp_adjblock _vp_tonemask_adj_otherblock[12]={
|
||||
/* 63 125 250 500 1 2 4 8 16 */
|
||||
|
||||
{{ -3, -8,-13,-15,-10,-10, -9, -9, -9, -9, -9, 1, 1, 1, 1, 1, 1}}, /* -1 */
|
||||
|
||||
/* {{-20,-20,-20,-20,-14,-12,-10, -8, -4, 0, 0, 10, 0, 0, 0, 0, 0}}, 0 */
|
||||
{{ -4,-10,-14,-16,-14,-13,-12,-12,-11,-11,-10, 0, 0, 0, 0, 0, 0}}, /* 0 */
|
||||
|
||||
/* {{-20,-20,-20,-20,-20,-18,-16,-14,-10, 0, 0, 5, 0, 0, 0, 0, 0}}, 1 */
|
||||
{{ -6,-12,-14,-16,-15,-15,-14,-13,-13,-12,-12, -2, -2, -1, 0, 0, 0}}, /* 1 */
|
||||
|
||||
/* {{-20,-20,-20,-20,-20,-18,-16,-14,-10, 0, 0, 0, 0, 0, 0, 0, 0}}, 2 */
|
||||
{{-12,-13,-14,-16,-16,-16,-15,-14,-13,-12,-12, -5, -2, -1, 0, 0, 0}}, /* 2 */
|
||||
|
||||
/* {{-20,-20,-20,-20,-20,-18,-16,-14,-10, 0, 0, 0, 0, 0, 0, 0, 0}}, 3 */
|
||||
{{-15,-15,-15,-16,-16,-16,-16,-14,-13,-13,-13,-10, -4, -2, 0, 0, 0}}, /* 3 */
|
||||
|
||||
/* {{-20,-20,-20,-20,-20,-18,-16,-14,-10, 0, 0, 0, 0, 0, 0, 0, 0}}, 4 */
|
||||
{{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-13,-11, -7 -3, -1, -1 , 0}}, /* 4 */
|
||||
|
||||
/* {{-20,-20,-20,-20,-20,-18,-16,-14,-10, 0, 0, 0, 0, 0, 0, 0, 0}}, 5 */
|
||||
{{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-13,-11, -7 -3, -1, -1 , 0}}, /* 5 */
|
||||
|
||||
/* {{-20,-20,-20,-20,-20,-18,-16,-14,-10, 0, 0, 0, 0, 0, 0, 0, 0}}, 6 */
|
||||
{{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-14,-12, -8, -4, -2, -2, 0}}, /* 6 */
|
||||
|
||||
/* {{-20,-20,-20,-20,-20,-18,-16,-14,-10, 0, 0, 0, 0, 0, 0, 0, 0}}, 7 */
|
||||
{{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-14,-12, -9, -4, -2, -2, 0}}, /* 7 */
|
||||
|
||||
/* {{-20,-20,-20,-20,-20,-18,-16,-14,-10, 0, 0, 0, 0, 0, 0, 0, 0}}, 8 */
|
||||
{{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-14,-12, -9, -4, -2, -2, 0}}, /* 8 */
|
||||
|
||||
/* {{-20,-20,-20,-20,-20,-18,-16,-14,-10, 0, 0, 0, 0, 0, 0, 0, 0}}, 9 */
|
||||
{{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-14,-12, -9, -4, -2, -2, 0}}, /* 9 */
|
||||
|
||||
/* {{-20,-20,-20,-20,-20,-18,-16,-14,-10, 0, 0, 0, 0, 0, 0, 0, 0}}, 10 */
|
||||
{{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-14,-12, -9, -4, -2, -2, 0}}, /* 10 */
|
||||
};
|
||||
|
||||
/* noise bias (transition block) */
|
||||
static const noise3 _psy_noisebias_trans[12]={
|
||||
/* 63 125 250 500 1k 2k 4k 8k 16k*/
|
||||
/* -1 */
|
||||
{{{-10,-10,-10,-10,-10, -4, 0, 0, 4, 8, 8, 8, 8, 10, 12, 14, 20},
|
||||
{-30,-30,-30,-30,-26,-20,-16, -8, -6, -6, -2, 2, 2, 3, 6, 6, 15},
|
||||
{-30,-30,-30,-30,-30,-24,-20,-14,-10, -6, -8, -8, -6, -6, -6, -4, -2}}},
|
||||
/* 0
|
||||
{{{-15,-15,-15,-15,-15,-12,-10, -8, 0, 2, 4, 4, 5, 5, 5, 8, 10},
|
||||
{-30,-30,-30,-30,-26,-22,-20,-14, -8, -4, 0, 0, 0, 0, 2, 4, 10},
|
||||
{-30,-30,-30,-30,-26,-22,-20,-14,-10, -6, -6, -6, -6, -4, -4, -4, -2}}},*/
|
||||
{{{-15,-15,-15,-15,-15,-12, -6, -4, 0, 2, 4, 4, 5, 5, 5, 8, 10},
|
||||
{-30,-30,-30,-30,-26,-22,-20,-14, -8, -4, 0, 0, 0, 0, 2, 3, 6},
|
||||
{-30,-30,-30,-30,-26,-22,-20,-14,-10, -6, -6, -6, -6, -4, -4, -4, -2}}},
|
||||
/* 1
|
||||
{{{-15,-15,-15,-15,-15,-12,-10, -8, 0, 2, 4, 4, 5, 5, 5, 8, 10},
|
||||
{-30,-30,-30,-30,-26,-22,-20,-14,-10, -4, -2, -2, -2, -2, 0, 2, 8},
|
||||
{-30,-30,-30,-30,-26,-22,-20,-14,-10, -8, -8, -8, -8, -6, -6, -6, -4}}},*/
|
||||
{{{-15,-15,-15,-15,-15,-12,-10, -8, 0, 2, 4, 4, 5, 5, 5, 8, 10},
|
||||
{-30,-30,-30,-30,-26,-22,-20,-14,-10, -4, -2, -2, -2, -2, 0, 1, 4},
|
||||
{-30,-30,-30,-30,-26,-22,-20,-14,-10, -8, -8, -8, -8, -6, -6, -6, -4}}},
|
||||
/* 2
|
||||
{{{-15,-15,-15,-15,-15,-12,-10, -8, 0, 2, 2, 2, 4, 4, 5, 6, 10},
|
||||
{-30,-30,-30,-30,-26,-22,-20,-14,-10, -4, -2, -2, -2, -2, 0, 2, 6},
|
||||
{-30,-30,-30,-30,-26,-22,-20,-14,-10,-10,-10,-10,-10, -8, -8, -8, -4}}}, */
|
||||
{{{-15,-15,-15,-15,-15,-12,-10, -8, 0, 2, 2, 2, 4, 4, 5, 6, 10},
|
||||
{-30,-30,-30,-30,-26,-22,-20,-14,-10, -4, -3, -3, -3, -2, -1, 0, 3},
|
||||
{-30,-30,-30,-30,-26,-22,-20,-14,-10,-10,-10,-10,-10, -8, -8, -7, -4}}},
|
||||
/* 3
|
||||
{{{-15,-15,-15,-15,-15,-12,-10, -8, 0, 2, 2, 2, 4, 4, 4, 5, 8},
|
||||
{-30,-30,-30,-30,-26,-22,-20,-14,-10, -4, -3, -3, -3, -3, -1, 1, 6},
|
||||
{-30,-30,-30,-30,-26,-22,-20,-14,-10,-10,-10,-10,-10, -8, -8, -8, -4}}},*/
|
||||
{{{-15,-15,-15,-15,-15,-12,-10, -8, 0, 2, 2, 2, 4, 4, 4, 5, 8},
|
||||
{-30,-30,-30,-30,-26,-22,-20,-14,-10, -4, -3, -3, -3, -3, -2, 0, 2},
|
||||
{-30,-30,-30,-30,-26,-22,-20,-14,-10,-10,-10,-10,-10, -8, -8, -8, -4}}},
|
||||
/* 4
|
||||
{{{-20,-20,-20,-20,-20,-18,-14, -8, -1, 1, 1, 1, 2, 3, 3, 4, 7},
|
||||
{-30,-30,-30,-30,-26,-22,-20,-14,-10, -4, -3, -3, -3, -3, -1, 1, 5},
|
||||
{-30,-30,-30,-30,-26,-22,-20,-14,-10,-10,-10,-10,-10, -8, -8, -8, -4}}},*/
|
||||
{{{-20,-20,-20,-20,-20,-18,-14, -8, -1, 1, 1, 1, 2, 3, 3, 4, 7},
|
||||
{-30,-30,-30,-30,-26,-22,-20,-14,-10, -4, -3, -3, -3, -3, -2, -1, 1},
|
||||
{-30,-30,-30,-30,-26,-22,-20,-14,-10,-10,-10,-10,-10, -8, -8, -8, -4}}},
|
||||
/* 5
|
||||
{{{-24,-24,-24,-24,-20,-18,-14, -8, -1, 1, 1, 1, 2, 3, 3, 4, 7},
|
||||
{-32,-32,-32,-32,-28,-24,-22,-16,-12, -6, -4, -4, -4, -4, -2, -1, 2},
|
||||
{-34,-34,-34,-34,-30,-24,-24,-18,-14,-12,-12,-12,-12,-10,-10, -9, -5}}}, */
|
||||
{{{-24,-24,-24,-24,-20,-18,-14, -8, -1, 1, 1, 1, 2, 3, 3, 4, 7},
|
||||
{-32,-32,-32,-32,-28,-24,-22,-16,-12, -6, -4, -4, -4, -4, -3, -1, 0},
|
||||
{-34,-34,-34,-34,-30,-24,-24,-18,-14,-12,-12,-12,-12,-10,-10, -9, -5}}},
|
||||
/* 6
|
||||
{{{-24,-24,-24,-24,-20,-18,-14, -8, -1, 1, 1, 1, 2, 3, 3, 4, 7},
|
||||
{-32,-32,-32,-32,-28,-24,-24,-18,-14, -8, -6, -6, -6, -6, -4, -2, 1},
|
||||
{-34,-34,-34,-34,-30,-26,-24,-18,-17,-15,-15,-15,-15,-13,-13,-12, -8}}},*/
|
||||
{{{-24,-24,-24,-24,-20,-18,-14, -8, -1, 1, 1, 1, 2, 3, 3, 4, 7},
|
||||
{-32,-32,-32,-32,-28,-24,-24,-18,-14, -8, -6, -6, -6, -6, -5, -2, 0},
|
||||
{-34,-34,-34,-34,-30,-26,-26,-24,-22,-19,-19,-19,-19,-18,-17,-16,-12}}},
|
||||
/* 7
|
||||
{{{-24,-24,-24,-24,-20,-18,-14, -8, -1, 1, 1, 1, 2, 3, 3, 4, 7},
|
||||
{-32,-32,-32,-32,-28,-24,-24,-18,-14,-12,-10, -8, -8, -8, -6, -4, 0},
|
||||
{-34,-34,-34,-34,-30,-26,-26,-24,-22,-19,-19,-19,-19,-18,-17,-16,-12}}},*/
|
||||
{{{-24,-24,-24,-24,-20,-18,-14, -8, -1, 1, 1, 1, 2, 3, 3, 4, 7},
|
||||
{-32,-32,-32,-32,-28,-24,-24,-24,-18,-14,-12,-10,-10,-10, -8, -6, -2},
|
||||
{-34,-34,-34,-34,-30,-26,-26,-26,-24,-24,-24,-24,-24,-24,-24,-20,-16}}},
|
||||
/* 8
|
||||
{{{-24,-24,-24,-24,-22,-20,-15,-10, -8, -2, 0, 0, 0, 1, 2, 3, 7},
|
||||
{-36,-36,-36,-36,-30,-30,-30,-24,-18,-14,-12,-10,-10,-10, -8, -6, -2},
|
||||
{-36,-36,-36,-36,-34,-30,-28,-26,-24,-24,-24,-24,-24,-24,-24,-20,-16}}},*/
|
||||
{{{-24,-24,-24,-24,-22,-20,-15,-10, -8, -2, 0, 0, 0, 1, 2, 3, 7},
|
||||
{-36,-36,-36,-36,-30,-30,-30,-24,-20,-16,-16,-16,-16,-14,-12,-10, -7},
|
||||
{-36,-36,-36,-36,-34,-30,-28,-26,-24,-30,-30,-30,-30,-30,-30,-24,-20}}},
|
||||
/* 9
|
||||
{{{-28,-28,-28,-28,-28,-28,-28,-20,-14, -8, -4, -4, -4, -4, -4, -2, 2},
|
||||
{-36,-36,-36,-36,-34,-32,-32,-28,-20,-16,-16,-16,-16,-14,-12,-10, -7},
|
||||
{-40,-40,-40,-40,-40,-40,-40,-32,-30,-30,-30,-30,-30,-30,-30,-24,-20}}},*/
|
||||
{{{-28,-28,-28,-28,-28,-28,-28,-20,-14, -8, -4, -4, -4, -4, -4, -2, 2},
|
||||
{-38,-38,-38,-38,-36,-34,-34,-30,-24,-20,-20,-20,-20,-18,-16,-12,-10},
|
||||
{-40,-40,-40,-40,-40,-40,-40,-38,-35,-35,-35,-35,-35,-35,-35,-35,-30}}},
|
||||
/* 10 */
|
||||
{{{-30,-30,-30,-30,-30,-30,-30,-28,-20,-14,-14,-14,-14,-14,-14,-12,-10},
|
||||
{-40,-40,-40,-40,-40,-40,-40,-40,-35,-30,-30,-30,-30,-30,-30,-30,-20},
|
||||
{-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40}}},
|
||||
};
|
||||
|
||||
/* noise bias (long block) */
|
||||
static const noise3 _psy_noisebias_long[12]={
|
||||
/*63 125 250 500 1k 2k 4k 8k 16k*/
|
||||
/* -1 */
|
||||
{{{-10,-10,-10,-10,-10, -4, 0, 0, 0, 6, 6, 6, 6, 10, 10, 12, 20},
|
||||
{-20,-20,-20,-20,-20,-20,-10, -2, 0, 0, 0, 0, 0, 2, 4, 6, 15},
|
||||
{-20,-20,-20,-20,-20,-20,-20,-10, -6, -6, -6, -6, -6, -4, -4, -4, -2}}},
|
||||
|
||||
/* 0 */
|
||||
/* {{{-10,-10,-10,-10,-10,-10, -8, 2, 2, 2, 4, 4, 5, 5, 5, 8, 10},
|
||||
{-20,-20,-20,-20,-20,-20,-20,-14, -6, 0, 0, 0, 0, 0, 2, 4, 10},
|
||||
{-20,-20,-20,-20,-20,-20,-20,-14, -8, -6, -6, -6, -6, -4, -4, -4, -2}}},*/
|
||||
{{{-10,-10,-10,-10,-10,-10, -8, 2, 2, 2, 4, 4, 5, 5, 5, 8, 10},
|
||||
{-20,-20,-20,-20,-20,-20,-20,-14, -6, 0, 0, 0, 0, 0, 2, 3, 6},
|
||||
{-20,-20,-20,-20,-20,-20,-20,-14, -8, -6, -6, -6, -6, -4, -4, -4, -2}}},
|
||||
/* 1 */
|
||||
/* {{{-10,-10,-10,-10,-10,-10, -8, -4, 0, 2, 4, 4, 5, 5, 5, 8, 10},
|
||||
{-20,-20,-20,-20,-20,-20,-20,-14,-10, -4, -2, -2, -2, -2, 0, 2, 8},
|
||||
{-20,-20,-20,-20,-20,-20,-20,-14,-10, -8, -8, -8, -8, -6, -6, -6, -4}}},*/
|
||||
{{{-10,-10,-10,-10,-10,-10, -8, -4, 0, 2, 4, 4, 5, 5, 5, 8, 10},
|
||||
{-20,-20,-20,-20,-20,-20,-20,-14,-10, -4, -2, -2, -2, -2, 0, 1, 4},
|
||||
{-20,-20,-20,-20,-20,-20,-20,-14,-10, -8, -8, -8, -8, -6, -6, -6, -4}}},
|
||||
/* 2 */
|
||||
/* {{{-10,-10,-10,-10,-10,-10,-10, -8, 0, 2, 2, 2, 4, 4, 5, 6, 10},
|
||||
{-20,-20,-20,-20,-20,-20,-20,-14,-10, -4, -2, -2, -2, -2, 0, 2, 6},
|
||||
{-20,-20,-20,-20,-20,-20,-20,-14,-10,-10,-10,-10,-10, -8, -8, -8, -4}}},*/
|
||||
{{{-10,-10,-10,-10,-10,-10,-10, -8, 0, 2, 2, 2, 4, 4, 5, 6, 10},
|
||||
{-20,-20,-20,-20,-20,-20,-20,-14,-10, -4, -3, -3, -3, -2, -1, 0, 3},
|
||||
{-20,-20,-20,-20,-20,-20,-20,-14,-10,-10,-10,-10,-10, -8, -8, -8, -4}}},
|
||||
/* 3 */
|
||||
/* {{{-10,-10,-10,-10,-10,-10,-10, -8, 0, 2, 2, 2, 4, 4, 4, 5, 8},
|
||||
{-20,-20,-20,-20,-20,-20,-20,-14,-10, -4, -3, -3, -3, -3, -1, 1, 6},
|
||||
{-20,-20,-20,-20,-20,-20,-20,-14,-10,-10,-10,-10,-10, -8, -8, -8, -4}}},*/
|
||||
{{{-10,-10,-10,-10,-10,-10,-10, -8, 0, 2, 2, 2, 4, 4, 4, 5, 8},
|
||||
{-20,-20,-20,-20,-20,-20,-20,-14,-10, -4, -3, -3, -3, -3, -2, 0, 2},
|
||||
{-20,-20,-20,-20,-20,-20,-20,-14,-10,-10,-10,-10,-10, -8, -8, -8, -5}}},
|
||||
/* 4 */
|
||||
/* {{{-15,-15,-15,-15,-15,-15,-15,-10, -4, 1, 1, 1, 2, 3, 3, 4, 7},
|
||||
{-20,-20,-20,-20,-20,-20,-20,-14,-10, -4, -3, -3, -3, -3, -1, 1, 5},
|
||||
{-20,-20,-20,-20,-20,-20,-20,-14,-10,-10,-10,-10,-10, -8, -8, -8, -4}}},*/
|
||||
{{{-15,-15,-15,-15,-15,-15,-15,-10, -4, 1, 1, 1, 2, 3, 3, 4, 7},
|
||||
{-20,-20,-20,-20,-20,-20,-20,-14,-10, -4, -3, -3, -3, -3, -2, -1, 1},
|
||||
{-20,-20,-20,-20,-20,-20,-20,-14,-10,-10,-10,-10,-10, -8, -8, -8, -7}}},
|
||||
/* 5 */
|
||||
/* {{{-15,-15,-15,-15,-15,-15,-15,-10, -4, 1, 1, 1, 2, 3, 3, 4, 7},
|
||||
{-22,-22,-22,-22,-22,-22,-22,-16,-12, -6, -4, -4, -4, -4, -2, -1, 2},
|
||||
{-24,-24,-24,-24,-24,-24,-24,-18,-14,-12,-12,-12,-12,-10,-10, -9, -5}}},*/
|
||||
{{{-15,-15,-15,-15,-15,-15,-15,-10, -4, 1, 1, 1, 2, 3, 3, 4, 7},
|
||||
{-22,-22,-22,-22,-22,-22,-22,-16,-12, -6, -4, -4, -4, -4, -3, -1, 0},
|
||||
{-24,-24,-24,-24,-24,-24,-24,-18,-14,-12,-12,-12,-12,-10,-10, -9, -8}}},
|
||||
/* 6 */
|
||||
/* {{{-15,-15,-15,-15,-15,-15,-15,-10, -4, 1, 1, 1, 2, 3, 3, 4, 7},
|
||||
{-24,-24,-24,-24,-24,-24,-24,-18,-14, -8, -6, -6, -6, -6, -4, -2, 1},
|
||||
{-26,-26,-26,-26,-26,-26,-26,-18,-16,-15,-15,-15,-15,-13,-13,-12, -8}}},*/
|
||||
{{{-15,-15,-15,-15,-15,-15,-15,-10, -4, 1, 1, 1, 2, 3, 3, 4, 7},
|
||||
{-24,-24,-24,-24,-24,-24,-24,-18,-14, -8, -6, -6, -6, -6, -5, -2, 0},
|
||||
{-26,-26,-26,-26,-26,-26,-26,-18,-16,-15,-15,-15,-15,-13,-13,-12,-10}}},
|
||||
/* 7 */
|
||||
{{{-15,-15,-15,-15,-15,-15,-15,-10, -4, 1, 1, 1, 2, 3, 3, 4, 7},
|
||||
{-24,-24,-24,-24,-24,-24,-24,-18,-14,-10, -8, -8, -8, -8, -6, -4, 0},
|
||||
{-26,-26,-26,-26,-26,-26,-26,-22,-20,-19,-19,-19,-19,-18,-17,-16,-12}}},
|
||||
/* 8 */
|
||||
{{{-15,-15,-15,-15,-15,-15,-15,-10, -4, 0, 0, 0, 0, 1, 2, 3, 7},
|
||||
{-26,-26,-26,-26,-26,-26,-26,-20,-16,-12,-10,-10,-10,-10, -8, -6, -2},
|
||||
{-28,-28,-28,-28,-28,-28,-28,-26,-24,-24,-24,-24,-24,-24,-24,-20,-16}}},
|
||||
/* 9 */
|
||||
{{{-22,-22,-22,-22,-22,-22,-22,-18,-14, -8, -4, -4, -4, -4, -4, -2, 2},
|
||||
{-26,-26,-26,-26,-26,-26,-26,-22,-18,-16,-16,-16,-16,-14,-12,-10, -7},
|
||||
{-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-24,-20}}},
|
||||
/* 10 */
|
||||
{{{-24,-24,-24,-24,-24,-24,-24,-24,-24,-18,-14,-14,-14,-14,-14,-12,-10},
|
||||
{-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-20},
|
||||
{-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40}}},
|
||||
};
|
||||
|
||||
/* noise bias (impulse block) */
|
||||
static const noise3 _psy_noisebias_impulse[12]={
|
||||
/* 63 125 250 500 1k 2k 4k 8k 16k*/
|
||||
/* -1 */
|
||||
{{{-10,-10,-10,-10,-10, -4, 0, 0, 4, 8, 8, 8, 8, 10, 12, 14, 20},
|
||||
{-30,-30,-30,-30,-26,-20,-16, -8, -6, -6, -2, 2, 2, 3, 6, 6, 15},
|
||||
{-30,-30,-30,-30,-30,-24,-20,-14,-10, -6, -8, -8, -6, -6, -6, -4, -2}}},
|
||||
|
||||
/* 0 */
|
||||
/* {{{-10,-10,-10,-10,-10, -4, 0, 0, 4, 4, 8, 8, 8, 10, 12, 14, 20},
|
||||
{-30,-30,-30,-30,-26,-22,-20,-14, -6, -2, 0, 0, 0, 0, 2, 4, 10},
|
||||
{-30,-30,-30,-30,-30,-24,-20,-14,-10, -6, -8, -8, -6, -6, -6, -4, -2}}},*/
|
||||
{{{-10,-10,-10,-10,-10, -4, 0, 0, 4, 4, 8, 8, 8, 10, 12, 14, 20},
|
||||
{-30,-30,-30,-30,-26,-22,-20,-14, -6, -2, 0, 0, 0, 0, 2, 3, 6},
|
||||
{-30,-30,-30,-30,-30,-24,-20,-14,-10, -6, -8, -8, -6, -6, -6, -4, -2}}},
|
||||
/* 1 */
|
||||
{{{-12,-12,-12,-12,-12, -8, -6, -4, 0, 4, 4, 4, 4, 10, 12, 14, 20},
|
||||
{-30,-30,-30,-30,-26,-22,-20,-14,-10, -6, -4, -4, -2, -2, -2, -2, 2},
|
||||
{-30,-30,-30,-30,-26,-22,-20,-14,-10, -8,-10,-10, -8, -8, -8, -6, -4}}},
|
||||
/* 2 */
|
||||
{{{-14,-14,-14,-14,-14,-10, -8, -6, -2, 2, 2, 2, 2, 8, 10, 10, 16},
|
||||
{-30,-30,-30,-30,-26,-22,-20,-14,-10, -6, -6, -6, -4, -4, -4, -2, 0},
|
||||
{-30,-30,-30,-30,-26,-22,-20,-14,-10,-10,-10,-10,-10,-10,-10, -8, -4}}},
|
||||
/* 3 */
|
||||
{{{-14,-14,-14,-14,-14,-10, -8, -6, -2, 2, 2, 2, 2, 6, 8, 8, 14},
|
||||
{-30,-30,-30,-30,-26,-22,-20,-14,-10, -6, -6, -6, -4, -4, -4, -2, 0},
|
||||
{-30,-30,-30,-30,-26,-22,-20,-14,-10,-10,-10,-10,-10,-10,-10, -8, -4}}},
|
||||
/* 4 */
|
||||
{{{-16,-16,-16,-16,-16,-12,-10, -6, -2, 0, 0, 0, 0, 4, 6, 6, 12},
|
||||
{-30,-30,-30,-30,-26,-22,-20,-14,-10, -6, -6, -6, -4, -4, -4, -2, 0},
|
||||
{-30,-30,-30,-30,-26,-22,-20,-14,-10,-10,-10,-10,-10,-10,-10, -8, -4}}},
|
||||
/* 5 */
|
||||
{{{-20,-20,-20,-20,-20,-18,-14,-10, -4, 0, 0, 0, 0, 4, 4, 6, 11},
|
||||
{-32,-32,-32,-32,-28,-24,-22,-16,-10, -6, -8, -8, -6, -6, -6, -4, -2},
|
||||
{-34,-34,-34,-34,-30,-26,-24,-18,-14,-12,-12,-12,-12,-12,-10, -9, -5}}},
|
||||
/* 6
|
||||
{{{-20,-20,-20,-20,-20,-18,-14,-10, -4, 0, 0, 0, 0, 4, 4, 6, 11},
|
||||
{-34,-34,-34,-34,-30,-30,-24,-20,-12,-12,-14,-14,-10, -9, -8, -6, -4},
|
||||
{-34,-34,-34,-34,-34,-30,-26,-20,-16,-15,-15,-15,-15,-15,-13,-12, -8}}},*/
|
||||
{{{-20,-20,-20,-20,-20,-18,-14,-10, -4, 0, 0, 0, 0, 4, 4, 6, 11},
|
||||
{-34,-34,-34,-34,-30,-30,-30,-24,-16,-16,-16,-16,-16,-16,-14,-14,-12},
|
||||
{-36,-36,-36,-36,-36,-34,-28,-24,-20,-20,-20,-20,-20,-20,-20,-18,-16}}},
|
||||
/* 7 */
|
||||
/* {{{-22,-22,-22,-22,-22,-20,-14,-10, -6, 0, 0, 0, 0, 4, 4, 6, 11},
|
||||
{-34,-34,-34,-34,-30,-30,-24,-20,-14,-14,-16,-16,-14,-12,-10,-10,-10},
|
||||
{-34,-34,-34,-34,-32,-32,-30,-24,-20,-19,-19,-19,-19,-19,-17,-16,-12}}},*/
|
||||
{{{-22,-22,-22,-22,-22,-20,-14,-10, -6, 0, 0, 0, 0, 4, 4, 6, 11},
|
||||
{-34,-34,-34,-34,-30,-30,-30,-30,-26,-26,-26,-26,-26,-26,-26,-24,-22},
|
||||
{-40,-40,-40,-40,-40,-40,-40,-32,-30,-30,-30,-30,-30,-30,-30,-30,-24}}},
|
||||
/* 8 */
|
||||
/* {{{-24,-24,-24,-24,-24,-22,-14,-10, -6, -1, -1, -1, -1, 3, 3, 5, 10},
|
||||
{-34,-34,-34,-34,-30,-30,-30,-24,-20,-20,-20,-20,-20,-18,-16,-16,-14},
|
||||
{-36,-36,-36,-36,-36,-34,-28,-24,-24,-24,-24,-24,-24,-24,-24,-20,-16}}},*/
|
||||
{{{-24,-24,-24,-24,-24,-22,-14,-10, -6, -1, -1, -1, -1, 3, 3, 5, 10},
|
||||
{-34,-34,-34,-34,-34,-32,-32,-30,-26,-26,-26,-26,-26,-26,-26,-26,-24},
|
||||
{-40,-40,-40,-40,-40,-40,-40,-32,-30,-30,-30,-30,-30,-30,-30,-30,-24}}},
|
||||
/* 9 */
|
||||
/* {{{-28,-28,-28,-28,-28,-28,-28,-20,-14, -8, -4, -4, -4, -4, -4, -2, 2},
|
||||
{-36,-36,-36,-36,-34,-32,-32,-30,-26,-26,-26,-26,-26,-22,-20,-20,-18},
|
||||
{-40,-40,-40,-40,-40,-40,-40,-32,-30,-30,-30,-30,-30,-30,-30,-24,-20}}},*/
|
||||
{{{-28,-28,-28,-28,-28,-28,-28,-20,-14, -8, -4, -4, -4, -4, -4, -2, 2},
|
||||
{-36,-36,-36,-36,-34,-32,-32,-30,-26,-26,-26,-26,-26,-26,-26,-26,-26},
|
||||
{-40,-40,-40,-40,-40,-40,-40,-32,-30,-30,-30,-30,-30,-30,-30,-24,-20}}},
|
||||
/* 10 */
|
||||
{{{-30,-30,-30,-30,-30,-26,-24,-24,-24,-20,-16,-16,-16,-16,-16,-14,-12},
|
||||
{-40,-40,-40,-40,-40,-40,-40,-40,-35,-30,-30,-30,-30,-30,-30,-30,-26},
|
||||
{-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40}}},
|
||||
};
|
||||
|
||||
/* noise bias (padding block) */
|
||||
static const noise3 _psy_noisebias_padding[12]={
|
||||
/* 63 125 250 500 1k 2k 4k 8k 16k*/
|
||||
|
||||
/* -1 */
|
||||
{{{-10,-10,-10,-10,-10, -4, 0, 0, 4, 8, 8, 8, 8, 10, 12, 14, 20},
|
||||
{-30,-30,-30,-30,-26,-20,-16, -8, -6, -6, -2, 2, 2, 3, 6, 6, 15},
|
||||
{-30,-30,-30,-30,-30,-24,-20,-14,-10, -6, -8, -8, -6, -6, -6, -4, -2}}},
|
||||
|
||||
/* 0 */
|
||||
{{{-10,-10,-10,-10,-10, -4, 0, 0, 4, 8, 8, 8, 8, 10, 12, 14, 20},
|
||||
{-30,-30,-30,-30,-26,-22,-20,-14,-10, -4, -2, 2, 3, 6, 6, 8, 10},
|
||||
{-30,-30,-30,-30,-26,-22,-20,-14,-10, -4, -4, -4, -4, -4, -2, 0, 2}}},
|
||||
/* 1 */
|
||||
{{{-12,-12,-12,-12,-12, -8, -6, -4, 0, 4, 4, 4, 4, 10, 12, 14, 20},
|
||||
{-30,-30,-30,-30,-26,-22,-20,-14,-10, -4, 0, 0, 0, 2, 2, 4, 8},
|
||||
{-30,-30,-30,-30,-26,-22,-20,-14,-10, -6, -6, -6, -6, -6, -4, -2, 0}}},
|
||||
/* 2 */
|
||||
/* {{{-14,-14,-14,-14,-14,-10, -8, -6, -2, 2, 2, 2, 2, 8, 10, 10, 16},
|
||||
{-30,-30,-30,-30,-26,-22,-20,-14,-10, -4, 0, 0, 0, 2, 2, 4, 8},
|
||||
{-30,-30,-30,-30,-26,-22,-20,-14,-10, -8, -8, -8, -8, -8, -6, -4, -2}}},*/
|
||||
{{{-14,-14,-14,-14,-14,-10, -8, -6, -2, 2, 2, 2, 2, 8, 10, 10, 16},
|
||||
{-30,-30,-30,-30,-26,-22,-20,-14,-10, -6, -1, -1, -1, 0, 0, 2, 6},
|
||||
{-30,-30,-30,-30,-26,-22,-20,-14,-10, -8, -8, -8, -8, -8, -6, -4, -2}}},
|
||||
/* 3 */
|
||||
{{{-14,-14,-14,-14,-14,-10, -8, -6, -2, 2, 2, 2, 2, 6, 8, 8, 14},
|
||||
{-30,-30,-30,-30,-26,-22,-20,-14,-10, -6, -1, -1, -1, 0, 0, 2, 6},
|
||||
{-30,-30,-30,-30,-26,-22,-20,-14,-10, -8, -8, -8, -8, -8, -6, -4, -2}}},
|
||||
/* 4 */
|
||||
{{{-16,-16,-16,-16,-16,-12,-10, -6, -2, 0, 0, 0, 0, 4, 6, 6, 12},
|
||||
{-30,-30,-30,-30,-26,-22,-20,-14,-10, -6, -1, -1, -1, -1, 0, 2, 6},
|
||||
{-30,-30,-30,-30,-26,-22,-20,-14,-10, -8, -8, -8, -8, -8, -6, -4, -2}}},
|
||||
/* 5 */
|
||||
{{{-20,-20,-20,-20,-20,-18,-14,-10, -4, 0, 0, 0, 0, 4, 6, 6, 12},
|
||||
{-32,-32,-32,-32,-28,-24,-22,-16,-12, -6, -3, -3, -3, -3, -2, 0, 4},
|
||||
{-34,-34,-34,-34,-30,-26,-24,-18,-14,-10,-10,-10,-10,-10, -8, -5, -3}}},
|
||||
/* 6 */
|
||||
{{{-20,-20,-20,-20,-20,-18,-14,-10, -4, 0, 0, 0, 0, 4, 6, 6, 12},
|
||||
{-34,-34,-34,-34,-30,-30,-24,-20,-14, -8, -4, -4, -4, -4, -3, -1, 4},
|
||||
{-34,-34,-34,-34,-34,-30,-26,-20,-16,-13,-13,-13,-13,-13,-11, -8, -6}}},
|
||||
/* 7 */
|
||||
{{{-20,-20,-20,-20,-20,-18,-14,-10, -4, 0, 0, 0, 0, 4, 6, 6, 12},
|
||||
{-34,-34,-34,-34,-30,-30,-30,-24,-16,-10, -8, -6, -6, -6, -5, -3, 1},
|
||||
{-34,-34,-34,-34,-32,-32,-28,-22,-18,-16,-16,-16,-16,-16,-14,-12,-10}}},
|
||||
/* 8 */
|
||||
{{{-22,-22,-22,-22,-22,-20,-14,-10, -4, 0, 0, 0, 0, 3, 5, 5, 11},
|
||||
{-34,-34,-34,-34,-30,-30,-30,-24,-16,-12,-10, -8, -8, -8, -7, -5, -2},
|
||||
{-36,-36,-36,-36,-36,-34,-28,-22,-20,-20,-20,-20,-20,-20,-20,-16,-14}}},
|
||||
/* 9 */
|
||||
{{{-28,-28,-28,-28,-28,-28,-28,-20,-14, -8, -2, -2, -2, -2, 0, 2, 6},
|
||||
{-36,-36,-36,-36,-34,-32,-32,-24,-16,-12,-12,-12,-12,-12,-10, -8, -5},
|
||||
{-40,-40,-40,-40,-40,-40,-40,-32,-26,-24,-24,-24,-24,-24,-24,-20,-18}}},
|
||||
/* 10 */
|
||||
{{{-30,-30,-30,-30,-30,-26,-24,-24,-24,-20,-12,-12,-12,-12,-12,-10, -8},
|
||||
{-40,-40,-40,-40,-40,-40,-40,-40,-35,-30,-25,-25,-25,-25,-25,-25,-15},
|
||||
{-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40}}},
|
||||
};
|
||||
|
||||
|
||||
static const noiseguard _psy_noiseguards_44[4]={
|
||||
{3,3,15},
|
||||
{3,3,15},
|
||||
{10,10,100},
|
||||
{10,10,100},
|
||||
};
|
||||
|
||||
static const int _psy_tone_suppress[12]={
|
||||
-20,-20,-20,-20,-20,-24,-30,-40,-40,-45,-45,-45,
|
||||
};
|
||||
static const int _psy_tone_0dB[12]={
|
||||
90,90,95,95,95,95,105,105,105,105,105,105,
|
||||
};
|
||||
static const int _psy_noise_suppress[12]={
|
||||
-20,-20,-24,-24,-24,-24,-30,-40,-40,-45,-45,-45,
|
||||
};
|
||||
|
||||
static const vorbis_info_psy _psy_info_template={
|
||||
/* blockflag */
|
||||
-1,
|
||||
/* ath_adjatt, ath_maxatt */
|
||||
-140.,-140.,
|
||||
/* tonemask att boost/decay,suppr,curves */
|
||||
{0.f,0.f,0.f}, 0.,0., -40.f, {0.},
|
||||
|
||||
/*noisemaskp,supp, low/high window, low/hi guard, minimum */
|
||||
1, -0.f, .5f, .5f, 0,0,0,
|
||||
/* noiseoffset*3, noisecompand, max_curve_dB */
|
||||
{{-1},{-1},{-1}},{-1},105.f,
|
||||
/* noise normalization - noise_p, start, partition, thresh. */
|
||||
0,-1,-1,0.,
|
||||
};
|
||||
|
||||
/* ath ****************/
|
||||
|
||||
static const int _psy_ath_floater[12]={
|
||||
-100,-100,-100,-100,-100,-100,-105,-105,-105,-105,-110,-120,
|
||||
};
|
||||
static const int _psy_ath_abs[12]={
|
||||
-130,-130,-130,-130,-140,-140,-140,-140,-140,-140,-140,-150,
|
||||
};
|
||||
|
||||
/* stereo setup. These don't map directly to quality level, there's
|
||||
an additional indirection as several of the below may be used in a
|
||||
single bitmanaged stream
|
||||
|
||||
****************/
|
||||
|
||||
/* various stereo possibilities */
|
||||
|
||||
/* stereo mode by base quality level */
|
||||
static const adj_stereo _psy_stereo_modes_44[12]={
|
||||
/* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 -1 */
|
||||
{{ 4, 4, 4, 4, 4, 4, 4, 3, 2, 2, 1, 0, 0, 0, 0},
|
||||
{ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 5, 4, 3},
|
||||
{ 1, 2, 3, 4, 4, 4, 4, 4, 4, 5, 6, 7, 8, 8, 8},
|
||||
{ 12,12.5, 13,13.5, 14,14.5, 15, 99, 99, 99, 99, 99, 99, 99, 99}},
|
||||
|
||||
/* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 0 */
|
||||
{{ 4, 4, 4, 4, 4, 4, 4, 3, 2, 1, 0, 0, 0, 0, 0},
|
||||
{ 8, 8, 8, 8, 6, 6, 5, 5, 5, 5, 5, 5, 5, 4, 3},
|
||||
{ 1, 2, 3, 4, 4, 5, 6, 6, 6, 6, 6, 8, 8, 8, 8},
|
||||
{ 12,12.5, 13,13.5, 14,14.5, 15, 99, 99, 99, 99, 99, 99, 99, 99}},
|
||||
|
||||
|
||||
/* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1 */
|
||||
{{ 3, 3, 3, 3, 3, 3, 3, 3, 2, 1, 0, 0, 0, 0, 0},
|
||||
{ 8, 8, 8, 8, 6, 6, 5, 5, 5, 5, 5, 5, 5, 4, 3},
|
||||
{ 1, 2, 3, 4, 4, 5, 6, 6, 6, 6, 6, 8, 8, 8, 8},
|
||||
{ 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}},
|
||||
|
||||
|
||||
/* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 2 */
|
||||
{{ 3, 3, 3, 3, 3, 3, 3, 2, 1, 1, 0, 0, 0, 0, 0},
|
||||
{ 8, 8, 6, 6, 5, 5, 4, 4, 4, 4, 4, 4, 3, 2, 1},
|
||||
{ 3, 4, 4, 5, 5, 6, 6, 6, 6, 6, 6, 8, 8, 8, 8},
|
||||
{ 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}},
|
||||
/* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 3 */
|
||||
{{ 2, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0},
|
||||
{ 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 2, 1},
|
||||
{ 4, 4, 5, 6, 6, 6, 6, 6, 8, 8, 10, 10, 10, 10, 10},
|
||||
{ 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}},
|
||||
/* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 4 */
|
||||
{{ 2, 2, 2, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 2, 1, 0},
|
||||
{ 6, 6, 6, 8, 8, 8, 8, 8, 8, 8, 10, 10, 10, 10, 10},
|
||||
{ 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}},
|
||||
/* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 5 */
|
||||
{{ 2, 2, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{ 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0},
|
||||
{ 6, 7, 8, 8, 8, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12},
|
||||
{ 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}},
|
||||
/* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 6 */
|
||||
{{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{ 3, 3, 3, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{ 8, 8, 8, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12},
|
||||
{ 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}},
|
||||
/* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 7 */
|
||||
{{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{ 3, 3, 3, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{ 8, 8, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12},
|
||||
{ 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}},
|
||||
/* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 8 */
|
||||
{{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{ 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{ 8, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12},
|
||||
{ 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}},
|
||||
/* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 9 */
|
||||
{{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4},
|
||||
{ 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}},
|
||||
/* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 10 */
|
||||
{{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4},
|
||||
{ 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}},
|
||||
};
|
||||
|
||||
/* tone master attenuation by base quality mode and bitrate tweak */
|
||||
static const att3 _psy_tone_masteratt_44[12]={
|
||||
{{ 35, 21, 9}, 0, 0}, /* -1 */
|
||||
{{ 30, 20, 8}, -2, 1.25}, /* 0 */
|
||||
/* {{ 25, 14, 4}, 0, 0}, *//* 1 */
|
||||
{{ 25, 12, 2}, 0, 0}, /* 1 */
|
||||
/* {{ 20, 10, -2}, 0, 0}, *//* 2 */
|
||||
{{ 20, 9, -3}, 0, 0}, /* 2 */
|
||||
{{ 20, 9, -4}, 0, 0}, /* 3 */
|
||||
{{ 20, 9, -4}, 0, 0}, /* 4 */
|
||||
{{ 20, 6, -6}, 0, 0}, /* 5 */
|
||||
{{ 20, 3, -10}, 0, 0}, /* 6 */
|
||||
{{ 18, 1, -14}, 0, 0}, /* 7 */
|
||||
{{ 18, 0, -16}, 0, 0}, /* 8 */
|
||||
{{ 18, -2, -16}, 0, 0}, /* 9 */
|
||||
{{ 12, -2, -20}, 0, 0}, /* 10 */
|
||||
};
|
||||
|
||||
/* lowpass by mode **************/
|
||||
static const double _psy_lowpass_44[12]={
|
||||
/* 15.1,15.8,16.5,17.9,20.5,48.,999.,999.,999.,999.,999. */
|
||||
13.9,15.1,15.8,16.5,17.2,18.9,20.1,48.,999.,999.,999.,999.
|
||||
};
|
||||
|
||||
/* noise normalization **********/
|
||||
|
||||
static const int _noise_start_short_44[11]={
|
||||
/* 16,16,16,16,32,32,9999,9999,9999,9999 */
|
||||
32,16,16,16,32,9999,9999,9999,9999,9999,9999
|
||||
};
|
||||
static const int _noise_start_long_44[11]={
|
||||
/* 128,128,128,256,512,512,9999,9999,9999,9999 */
|
||||
256,128,128,256,512,9999,9999,9999,9999,9999,9999
|
||||
};
|
||||
|
||||
static const int _noise_part_short_44[11]={
|
||||
8,8,8,8,8,8,8,8,8,8,8
|
||||
};
|
||||
static const int _noise_part_long_44[11]={
|
||||
32,32,32,32,32,32,32,32,32,32,32
|
||||
};
|
||||
|
||||
static const double _noise_thresh_44[11]={
|
||||
/* .2,.2,.3,.4,.5,.5,9999.,9999.,9999.,9999., */
|
||||
.2,.2,.2,.4,.6,9999.,9999.,9999.,9999.,9999.,9999.,
|
||||
};
|
||||
|
||||
static const double _noise_thresh_5only[2]={
|
||||
.5,.5,
|
||||
};
|
@ -1,101 +0,0 @@
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: 8kHz psychoacoustic settings
|
||||
last mod: $Id: psych_8.h 16227 2009-07-08 06:58:46Z xiphmont $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
static const att3 _psy_tone_masteratt_8[3]={
|
||||
{{ 32, 25, 12}, 0, 0}, /* 0 */
|
||||
{{ 30, 25, 12}, 0, 0}, /* 0 */
|
||||
{{ 20, 0, -14}, 0, 0}, /* 0 */
|
||||
};
|
||||
|
||||
static const vp_adjblock _vp_tonemask_adj_8[3]={
|
||||
/* adjust for mode zero */
|
||||
/* 63 125 250 500 1 2 4 8 16 */
|
||||
{{-15,-15,-15,-15,-10,-10, -6, 0, 0, 0, 0,10, 0, 0,99,99,99}}, /* 1 */
|
||||
{{-15,-15,-15,-15,-10,-10, -6, 0, 0, 0, 0,10, 0, 0,99,99,99}}, /* 1 */
|
||||
{{-15,-15,-15,-15,-10,-10, -6, 0, 0, 0, 0, 0, 0, 0,99,99,99}}, /* 1 */
|
||||
};
|
||||
|
||||
|
||||
static const noise3 _psy_noisebias_8[3]={
|
||||
/* 63 125 250 500 1k 2k 4k 8k 16k*/
|
||||
{{{-10,-10,-10,-10, -5, -5, -5, 0, 4, 8, 8, 8, 10, 10, 99, 99, 99},
|
||||
{-10,-10,-10,-10, -5, -5, -5, 0, 0, 4, 4, 4, 4, 4, 99, 99, 99},
|
||||
{-30,-30,-30,-30,-30,-24,-20,-14,-10, -6, -8, -8, -6, -6, 99, 99, 99}}},
|
||||
|
||||
{{{-10,-10,-10,-10, -5, -5, -5, 0, 4, 8, 8, 8, 10, 10, 99, 99, 99},
|
||||
{-10,-10,-10,-10,-10,-10, -5, -5, -5, 0, 0, 0, 0, 0, 99, 99, 99},
|
||||
{-30,-30,-30,-30,-30,-24,-20,-14,-10, -6, -8, -8, -6, -6, 99, 99, 99}}},
|
||||
|
||||
{{{-15,-15,-15,-15,-15,-12,-10, -8, 0, 2, 4, 4, 5, 5, 99, 99, 99},
|
||||
{-30,-30,-30,-30,-26,-22,-20,-14,-12,-12,-10,-10,-10,-10, 99, 99, 99},
|
||||
{-30,-30,-30,-30,-26,-26,-26,-26,-26,-26,-26,-26,-26,-24, 99, 99, 99}}},
|
||||
};
|
||||
|
||||
/* stereo mode by base quality level */
|
||||
static const adj_stereo _psy_stereo_modes_8[3]={
|
||||
/* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 */
|
||||
{{ 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3},
|
||||
{ 6, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4},
|
||||
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
|
||||
{ 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}},
|
||||
{{ 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3},
|
||||
{ 6, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4},
|
||||
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
|
||||
{ 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}},
|
||||
{{ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3},
|
||||
{ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4},
|
||||
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
|
||||
{ 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}},
|
||||
};
|
||||
|
||||
static const noiseguard _psy_noiseguards_8[2]={
|
||||
{10,10,-1},
|
||||
{10,10,-1},
|
||||
};
|
||||
|
||||
static const compandblock _psy_compand_8[2]={
|
||||
{{
|
||||
0, 1, 2, 3, 4, 5, 6, 7, /* 7dB */
|
||||
8, 8, 9, 9,10,10,11, 11, /* 15dB */
|
||||
12,12,13,13,14,14,15, 15, /* 23dB */
|
||||
16,16,17,17,17,18,18, 19, /* 31dB */
|
||||
19,19,20,21,22,23,24, 25, /* 39dB */
|
||||
}},
|
||||
{{
|
||||
0, 1, 2, 3, 4, 5, 6, 6, /* 7dB */
|
||||
7, 7, 6, 6, 5, 5, 4, 4, /* 15dB */
|
||||
3, 3, 3, 4, 5, 6, 7, 8, /* 23dB */
|
||||
9,10,11,12,13,14,15, 16, /* 31dB */
|
||||
17,18,19,20,21,22,23, 24, /* 39dB */
|
||||
}},
|
||||
};
|
||||
|
||||
static const double _psy_lowpass_8[3]={3.,4.,4.};
|
||||
static const int _noise_start_8[2]={
|
||||
64,64,
|
||||
};
|
||||
static const int _noise_part_8[2]={
|
||||
8,8,
|
||||
};
|
||||
|
||||
static const int _psy_ath_floater_8[3]={
|
||||
-100,-100,-105,
|
||||
};
|
||||
|
||||
static const int _psy_ath_abs_8[3]={
|
||||
-130,-130,-140,
|
||||
};
|
@ -1,163 +0,0 @@
|
||||
/********************************************************************
|
||||
* *
|
||||
* This FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: toplevel residue templates 16/22kHz
|
||||
last mod: $Id: residue_16.h 16962 2010-03-11 07:30:34Z xiphmont $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
/***** residue backends *********************************************/
|
||||
|
||||
static const static_bookblock _resbook_16s_0={
|
||||
{
|
||||
{0},
|
||||
{0,0,&_16c0_s_p1_0},
|
||||
{0},
|
||||
{0,0,&_16c0_s_p3_0},
|
||||
{0,0,&_16c0_s_p4_0},
|
||||
{0,0,&_16c0_s_p5_0},
|
||||
{0,0,&_16c0_s_p6_0},
|
||||
{&_16c0_s_p7_0,&_16c0_s_p7_1},
|
||||
{&_16c0_s_p8_0,&_16c0_s_p8_1},
|
||||
{&_16c0_s_p9_0,&_16c0_s_p9_1,&_16c0_s_p9_2}
|
||||
}
|
||||
};
|
||||
static const static_bookblock _resbook_16s_1={
|
||||
{
|
||||
{0},
|
||||
{0,0,&_16c1_s_p1_0},
|
||||
{0},
|
||||
{0,0,&_16c1_s_p3_0},
|
||||
{0,0,&_16c1_s_p4_0},
|
||||
{0,0,&_16c1_s_p5_0},
|
||||
{0,0,&_16c1_s_p6_0},
|
||||
{&_16c1_s_p7_0,&_16c1_s_p7_1},
|
||||
{&_16c1_s_p8_0,&_16c1_s_p8_1},
|
||||
{&_16c1_s_p9_0,&_16c1_s_p9_1,&_16c1_s_p9_2}
|
||||
}
|
||||
};
|
||||
static const static_bookblock _resbook_16s_2={
|
||||
{
|
||||
{0},
|
||||
{0,0,&_16c2_s_p1_0},
|
||||
{0,0,&_16c2_s_p2_0},
|
||||
{0,0,&_16c2_s_p3_0},
|
||||
{0,0,&_16c2_s_p4_0},
|
||||
{&_16c2_s_p5_0,&_16c2_s_p5_1},
|
||||
{&_16c2_s_p6_0,&_16c2_s_p6_1},
|
||||
{&_16c2_s_p7_0,&_16c2_s_p7_1},
|
||||
{&_16c2_s_p8_0,&_16c2_s_p8_1},
|
||||
{&_16c2_s_p9_0,&_16c2_s_p9_1,&_16c2_s_p9_2}
|
||||
}
|
||||
};
|
||||
|
||||
static const vorbis_residue_template _res_16s_0[]={
|
||||
{2,0,32, &_residue_44_mid,
|
||||
&_huff_book__16c0_s_single,&_huff_book__16c0_s_single,
|
||||
&_resbook_16s_0,&_resbook_16s_0},
|
||||
};
|
||||
static const vorbis_residue_template _res_16s_1[]={
|
||||
{2,0,32, &_residue_44_mid,
|
||||
&_huff_book__16c1_s_short,&_huff_book__16c1_s_short,
|
||||
&_resbook_16s_1,&_resbook_16s_1},
|
||||
|
||||
{2,0,32, &_residue_44_mid,
|
||||
&_huff_book__16c1_s_long,&_huff_book__16c1_s_long,
|
||||
&_resbook_16s_1,&_resbook_16s_1}
|
||||
};
|
||||
static const vorbis_residue_template _res_16s_2[]={
|
||||
{2,0,32, &_residue_44_high,
|
||||
&_huff_book__16c2_s_short,&_huff_book__16c2_s_short,
|
||||
&_resbook_16s_2,&_resbook_16s_2},
|
||||
|
||||
{2,0,32, &_residue_44_high,
|
||||
&_huff_book__16c2_s_long,&_huff_book__16c2_s_long,
|
||||
&_resbook_16s_2,&_resbook_16s_2}
|
||||
};
|
||||
|
||||
static const vorbis_mapping_template _mapres_template_16_stereo[3]={
|
||||
{ _map_nominal, _res_16s_0 }, /* 0 */
|
||||
{ _map_nominal, _res_16s_1 }, /* 1 */
|
||||
{ _map_nominal, _res_16s_2 }, /* 2 */
|
||||
};
|
||||
|
||||
static const static_bookblock _resbook_16u_0={
|
||||
{
|
||||
{0},
|
||||
{0,0,&_16u0__p1_0},
|
||||
{0,0,&_16u0__p2_0},
|
||||
{0,0,&_16u0__p3_0},
|
||||
{0,0,&_16u0__p4_0},
|
||||
{0,0,&_16u0__p5_0},
|
||||
{&_16u0__p6_0,&_16u0__p6_1},
|
||||
{&_16u0__p7_0,&_16u0__p7_1,&_16u0__p7_2}
|
||||
}
|
||||
};
|
||||
static const static_bookblock _resbook_16u_1={
|
||||
{
|
||||
{0},
|
||||
{0,0,&_16u1__p1_0},
|
||||
{0,0,&_16u1__p2_0},
|
||||
{0,0,&_16u1__p3_0},
|
||||
{0,0,&_16u1__p4_0},
|
||||
{0,0,&_16u1__p5_0},
|
||||
{0,0,&_16u1__p6_0},
|
||||
{&_16u1__p7_0,&_16u1__p7_1},
|
||||
{&_16u1__p8_0,&_16u1__p8_1},
|
||||
{&_16u1__p9_0,&_16u1__p9_1,&_16u1__p9_2}
|
||||
}
|
||||
};
|
||||
static const static_bookblock _resbook_16u_2={
|
||||
{
|
||||
{0},
|
||||
{0,0,&_16u2_p1_0},
|
||||
{0,0,&_16u2_p2_0},
|
||||
{0,0,&_16u2_p3_0},
|
||||
{0,0,&_16u2_p4_0},
|
||||
{&_16u2_p5_0,&_16u2_p5_1},
|
||||
{&_16u2_p6_0,&_16u2_p6_1},
|
||||
{&_16u2_p7_0,&_16u2_p7_1},
|
||||
{&_16u2_p8_0,&_16u2_p8_1},
|
||||
{&_16u2_p9_0,&_16u2_p9_1,&_16u2_p9_2}
|
||||
}
|
||||
};
|
||||
|
||||
static const vorbis_residue_template _res_16u_0[]={
|
||||
{1,0,32, &_residue_44_low_un,
|
||||
&_huff_book__16u0__single,&_huff_book__16u0__single,
|
||||
&_resbook_16u_0,&_resbook_16u_0},
|
||||
};
|
||||
static const vorbis_residue_template _res_16u_1[]={
|
||||
{1,0,32, &_residue_44_mid_un,
|
||||
&_huff_book__16u1__short,&_huff_book__16u1__short,
|
||||
&_resbook_16u_1,&_resbook_16u_1},
|
||||
|
||||
{1,0,32, &_residue_44_mid_un,
|
||||
&_huff_book__16u1__long,&_huff_book__16u1__long,
|
||||
&_resbook_16u_1,&_resbook_16u_1}
|
||||
};
|
||||
static const vorbis_residue_template _res_16u_2[]={
|
||||
{1,0,32, &_residue_44_hi_un,
|
||||
&_huff_book__16u2__short,&_huff_book__16u2__short,
|
||||
&_resbook_16u_2,&_resbook_16u_2},
|
||||
|
||||
{1,0,32, &_residue_44_hi_un,
|
||||
&_huff_book__16u2__long,&_huff_book__16u2__long,
|
||||
&_resbook_16u_2,&_resbook_16u_2}
|
||||
};
|
||||
|
||||
|
||||
static const vorbis_mapping_template _mapres_template_16_uncoupled[3]={
|
||||
{ _map_nominal_u, _res_16u_0 }, /* 0 */
|
||||
{ _map_nominal_u, _res_16u_1 }, /* 1 */
|
||||
{ _map_nominal_u, _res_16u_2 }, /* 2 */
|
||||
};
|
@ -1,292 +0,0 @@
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: toplevel residue templates for 32/44.1/48kHz
|
||||
last mod: $Id: residue_44.h 16962 2010-03-11 07:30:34Z xiphmont $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
#include "vorbis/codec.h"
|
||||
#include "backends.h"
|
||||
#include "books/coupled/res_books_stereo.h"
|
||||
|
||||
/***** residue backends *********************************************/
|
||||
|
||||
static const vorbis_info_residue0 _residue_44_low={
|
||||
0,-1, -1, 9,-1,-1,
|
||||
/* 0 1 2 3 4 5 6 7 */
|
||||
{0},
|
||||
{-1},
|
||||
{ 0, 1, 2, 2, 4, 8, 16, 32},
|
||||
{ 0, 0, 0,999, 4, 8, 16, 32},
|
||||
};
|
||||
|
||||
static const vorbis_info_residue0 _residue_44_mid={
|
||||
0,-1, -1, 10,-1,-1,
|
||||
/* 0 1 2 3 4 5 6 7 8 */
|
||||
{0},
|
||||
{-1},
|
||||
{ 0, 1, 1, 2, 2, 4, 8, 16, 32},
|
||||
{ 0, 0,999, 0,999, 4, 8, 16, 32},
|
||||
};
|
||||
|
||||
static const vorbis_info_residue0 _residue_44_high={
|
||||
0,-1, -1, 10,-1,-1,
|
||||
/* 0 1 2 3 4 5 6 7 8 */
|
||||
{0},
|
||||
{-1},
|
||||
{ 0, 1, 2, 4, 8, 16, 32, 71,157},
|
||||
{ 0, 1, 2, 3, 4, 8, 16, 71,157},
|
||||
};
|
||||
|
||||
static const static_bookblock _resbook_44s_n1={
|
||||
{
|
||||
{0},{0,0,&_44cn1_s_p1_0},{0,0,&_44cn1_s_p2_0},
|
||||
{0,0,&_44cn1_s_p3_0},{0,0,&_44cn1_s_p4_0},{0,0,&_44cn1_s_p5_0},
|
||||
{&_44cn1_s_p6_0,&_44cn1_s_p6_1},{&_44cn1_s_p7_0,&_44cn1_s_p7_1},
|
||||
{&_44cn1_s_p8_0,&_44cn1_s_p8_1,&_44cn1_s_p8_2}
|
||||
}
|
||||
};
|
||||
static const static_bookblock _resbook_44sm_n1={
|
||||
{
|
||||
{0},{0,0,&_44cn1_sm_p1_0},{0,0,&_44cn1_sm_p2_0},
|
||||
{0,0,&_44cn1_sm_p3_0},{0,0,&_44cn1_sm_p4_0},{0,0,&_44cn1_sm_p5_0},
|
||||
{&_44cn1_sm_p6_0,&_44cn1_sm_p6_1},{&_44cn1_sm_p7_0,&_44cn1_sm_p7_1},
|
||||
{&_44cn1_sm_p8_0,&_44cn1_sm_p8_1,&_44cn1_sm_p8_2}
|
||||
}
|
||||
};
|
||||
|
||||
static const static_bookblock _resbook_44s_0={
|
||||
{
|
||||
{0},{0,0,&_44c0_s_p1_0},{0,0,&_44c0_s_p2_0},
|
||||
{0,0,&_44c0_s_p3_0},{0,0,&_44c0_s_p4_0},{0,0,&_44c0_s_p5_0},
|
||||
{&_44c0_s_p6_0,&_44c0_s_p6_1},{&_44c0_s_p7_0,&_44c0_s_p7_1},
|
||||
{&_44c0_s_p8_0,&_44c0_s_p8_1,&_44c0_s_p8_2}
|
||||
}
|
||||
};
|
||||
static const static_bookblock _resbook_44sm_0={
|
||||
{
|
||||
{0},{0,0,&_44c0_sm_p1_0},{0,0,&_44c0_sm_p2_0},
|
||||
{0,0,&_44c0_sm_p3_0},{0,0,&_44c0_sm_p4_0},{0,0,&_44c0_sm_p5_0},
|
||||
{&_44c0_sm_p6_0,&_44c0_sm_p6_1},{&_44c0_sm_p7_0,&_44c0_sm_p7_1},
|
||||
{&_44c0_sm_p8_0,&_44c0_sm_p8_1,&_44c0_sm_p8_2}
|
||||
}
|
||||
};
|
||||
|
||||
static const static_bookblock _resbook_44s_1={
|
||||
{
|
||||
{0},{0,0,&_44c1_s_p1_0},{0,0,&_44c1_s_p2_0},
|
||||
{0,0,&_44c1_s_p3_0},{0,0,&_44c1_s_p4_0},{0,0,&_44c1_s_p5_0},
|
||||
{&_44c1_s_p6_0,&_44c1_s_p6_1},{&_44c1_s_p7_0,&_44c1_s_p7_1},
|
||||
{&_44c1_s_p8_0,&_44c1_s_p8_1,&_44c1_s_p8_2}
|
||||
}
|
||||
};
|
||||
static const static_bookblock _resbook_44sm_1={
|
||||
{
|
||||
{0},{0,0,&_44c1_sm_p1_0},{0,0,&_44c1_sm_p2_0},
|
||||
{0,0,&_44c1_sm_p3_0},{0,0,&_44c1_sm_p4_0},{0,0,&_44c1_sm_p5_0},
|
||||
{&_44c1_sm_p6_0,&_44c1_sm_p6_1},{&_44c1_sm_p7_0,&_44c1_sm_p7_1},
|
||||
{&_44c1_sm_p8_0,&_44c1_sm_p8_1,&_44c1_sm_p8_2}
|
||||
}
|
||||
};
|
||||
|
||||
static const static_bookblock _resbook_44s_2={
|
||||
{
|
||||
{0},{0,0,&_44c2_s_p1_0},{0,0,&_44c2_s_p2_0},{0,0,&_44c2_s_p3_0},
|
||||
{0,0,&_44c2_s_p4_0},{0,0,&_44c2_s_p5_0},{0,0,&_44c2_s_p6_0},
|
||||
{&_44c2_s_p7_0,&_44c2_s_p7_1},{&_44c2_s_p8_0,&_44c2_s_p8_1},
|
||||
{&_44c2_s_p9_0,&_44c2_s_p9_1,&_44c2_s_p9_2}
|
||||
}
|
||||
};
|
||||
static const static_bookblock _resbook_44s_3={
|
||||
{
|
||||
{0},{0,0,&_44c3_s_p1_0},{0,0,&_44c3_s_p2_0},{0,0,&_44c3_s_p3_0},
|
||||
{0,0,&_44c3_s_p4_0},{0,0,&_44c3_s_p5_0},{0,0,&_44c3_s_p6_0},
|
||||
{&_44c3_s_p7_0,&_44c3_s_p7_1},{&_44c3_s_p8_0,&_44c3_s_p8_1},
|
||||
{&_44c3_s_p9_0,&_44c3_s_p9_1,&_44c3_s_p9_2}
|
||||
}
|
||||
};
|
||||
static const static_bookblock _resbook_44s_4={
|
||||
{
|
||||
{0},{0,0,&_44c4_s_p1_0},{0,0,&_44c4_s_p2_0},{0,0,&_44c4_s_p3_0},
|
||||
{0,0,&_44c4_s_p4_0},{0,0,&_44c4_s_p5_0},{0,0,&_44c4_s_p6_0},
|
||||
{&_44c4_s_p7_0,&_44c4_s_p7_1},{&_44c4_s_p8_0,&_44c4_s_p8_1},
|
||||
{&_44c4_s_p9_0,&_44c4_s_p9_1,&_44c4_s_p9_2}
|
||||
}
|
||||
};
|
||||
static const static_bookblock _resbook_44s_5={
|
||||
{
|
||||
{0},{0,0,&_44c5_s_p1_0},{0,0,&_44c5_s_p2_0},{0,0,&_44c5_s_p3_0},
|
||||
{0,0,&_44c5_s_p4_0},{0,0,&_44c5_s_p5_0},{0,0,&_44c5_s_p6_0},
|
||||
{&_44c5_s_p7_0,&_44c5_s_p7_1},{&_44c5_s_p8_0,&_44c5_s_p8_1},
|
||||
{&_44c5_s_p9_0,&_44c5_s_p9_1,&_44c5_s_p9_2}
|
||||
}
|
||||
};
|
||||
static const static_bookblock _resbook_44s_6={
|
||||
{
|
||||
{0},{0,0,&_44c6_s_p1_0},{0,0,&_44c6_s_p2_0},{0,0,&_44c6_s_p3_0},
|
||||
{0,0,&_44c6_s_p4_0},
|
||||
{&_44c6_s_p5_0,&_44c6_s_p5_1},
|
||||
{&_44c6_s_p6_0,&_44c6_s_p6_1},
|
||||
{&_44c6_s_p7_0,&_44c6_s_p7_1},
|
||||
{&_44c6_s_p8_0,&_44c6_s_p8_1},
|
||||
{&_44c6_s_p9_0,&_44c6_s_p9_1,&_44c6_s_p9_2}
|
||||
}
|
||||
};
|
||||
static const static_bookblock _resbook_44s_7={
|
||||
{
|
||||
{0},{0,0,&_44c7_s_p1_0},{0,0,&_44c7_s_p2_0},{0,0,&_44c7_s_p3_0},
|
||||
{0,0,&_44c7_s_p4_0},
|
||||
{&_44c7_s_p5_0,&_44c7_s_p5_1},
|
||||
{&_44c7_s_p6_0,&_44c7_s_p6_1},
|
||||
{&_44c7_s_p7_0,&_44c7_s_p7_1},
|
||||
{&_44c7_s_p8_0,&_44c7_s_p8_1},
|
||||
{&_44c7_s_p9_0,&_44c7_s_p9_1,&_44c7_s_p9_2}
|
||||
}
|
||||
};
|
||||
static const static_bookblock _resbook_44s_8={
|
||||
{
|
||||
{0},{0,0,&_44c8_s_p1_0},{0,0,&_44c8_s_p2_0},{0,0,&_44c8_s_p3_0},
|
||||
{0,0,&_44c8_s_p4_0},
|
||||
{&_44c8_s_p5_0,&_44c8_s_p5_1},
|
||||
{&_44c8_s_p6_0,&_44c8_s_p6_1},
|
||||
{&_44c8_s_p7_0,&_44c8_s_p7_1},
|
||||
{&_44c8_s_p8_0,&_44c8_s_p8_1},
|
||||
{&_44c8_s_p9_0,&_44c8_s_p9_1,&_44c8_s_p9_2}
|
||||
}
|
||||
};
|
||||
static const static_bookblock _resbook_44s_9={
|
||||
{
|
||||
{0},{0,0,&_44c9_s_p1_0},{0,0,&_44c9_s_p2_0},{0,0,&_44c9_s_p3_0},
|
||||
{0,0,&_44c9_s_p4_0},
|
||||
{&_44c9_s_p5_0,&_44c9_s_p5_1},
|
||||
{&_44c9_s_p6_0,&_44c9_s_p6_1},
|
||||
{&_44c9_s_p7_0,&_44c9_s_p7_1},
|
||||
{&_44c9_s_p8_0,&_44c9_s_p8_1},
|
||||
{&_44c9_s_p9_0,&_44c9_s_p9_1,&_44c9_s_p9_2}
|
||||
}
|
||||
};
|
||||
|
||||
static const vorbis_residue_template _res_44s_n1[]={
|
||||
{2,0,32, &_residue_44_low,
|
||||
&_huff_book__44cn1_s_short,&_huff_book__44cn1_sm_short,
|
||||
&_resbook_44s_n1,&_resbook_44sm_n1},
|
||||
|
||||
{2,0,32, &_residue_44_low,
|
||||
&_huff_book__44cn1_s_long,&_huff_book__44cn1_sm_long,
|
||||
&_resbook_44s_n1,&_resbook_44sm_n1}
|
||||
};
|
||||
static const vorbis_residue_template _res_44s_0[]={
|
||||
{2,0,16, &_residue_44_low,
|
||||
&_huff_book__44c0_s_short,&_huff_book__44c0_sm_short,
|
||||
&_resbook_44s_0,&_resbook_44sm_0},
|
||||
|
||||
{2,0,32, &_residue_44_low,
|
||||
&_huff_book__44c0_s_long,&_huff_book__44c0_sm_long,
|
||||
&_resbook_44s_0,&_resbook_44sm_0}
|
||||
};
|
||||
static const vorbis_residue_template _res_44s_1[]={
|
||||
{2,0,16, &_residue_44_low,
|
||||
&_huff_book__44c1_s_short,&_huff_book__44c1_sm_short,
|
||||
&_resbook_44s_1,&_resbook_44sm_1},
|
||||
|
||||
{2,0,32, &_residue_44_low,
|
||||
&_huff_book__44c1_s_long,&_huff_book__44c1_sm_long,
|
||||
&_resbook_44s_1,&_resbook_44sm_1}
|
||||
};
|
||||
|
||||
static const vorbis_residue_template _res_44s_2[]={
|
||||
{2,0,16, &_residue_44_mid,
|
||||
&_huff_book__44c2_s_short,&_huff_book__44c2_s_short,
|
||||
&_resbook_44s_2,&_resbook_44s_2},
|
||||
|
||||
{2,0,32, &_residue_44_mid,
|
||||
&_huff_book__44c2_s_long,&_huff_book__44c2_s_long,
|
||||
&_resbook_44s_2,&_resbook_44s_2}
|
||||
};
|
||||
static const vorbis_residue_template _res_44s_3[]={
|
||||
{2,0,16, &_residue_44_mid,
|
||||
&_huff_book__44c3_s_short,&_huff_book__44c3_s_short,
|
||||
&_resbook_44s_3,&_resbook_44s_3},
|
||||
|
||||
{2,0,32, &_residue_44_mid,
|
||||
&_huff_book__44c3_s_long,&_huff_book__44c3_s_long,
|
||||
&_resbook_44s_3,&_resbook_44s_3}
|
||||
};
|
||||
static const vorbis_residue_template _res_44s_4[]={
|
||||
{2,0,16, &_residue_44_mid,
|
||||
&_huff_book__44c4_s_short,&_huff_book__44c4_s_short,
|
||||
&_resbook_44s_4,&_resbook_44s_4},
|
||||
|
||||
{2,0,32, &_residue_44_mid,
|
||||
&_huff_book__44c4_s_long,&_huff_book__44c4_s_long,
|
||||
&_resbook_44s_4,&_resbook_44s_4}
|
||||
};
|
||||
static const vorbis_residue_template _res_44s_5[]={
|
||||
{2,0,16, &_residue_44_mid,
|
||||
&_huff_book__44c5_s_short,&_huff_book__44c5_s_short,
|
||||
&_resbook_44s_5,&_resbook_44s_5},
|
||||
|
||||
{2,0,32, &_residue_44_mid,
|
||||
&_huff_book__44c5_s_long,&_huff_book__44c5_s_long,
|
||||
&_resbook_44s_5,&_resbook_44s_5}
|
||||
};
|
||||
static const vorbis_residue_template _res_44s_6[]={
|
||||
{2,0,16, &_residue_44_high,
|
||||
&_huff_book__44c6_s_short,&_huff_book__44c6_s_short,
|
||||
&_resbook_44s_6,&_resbook_44s_6},
|
||||
|
||||
{2,0,32, &_residue_44_high,
|
||||
&_huff_book__44c6_s_long,&_huff_book__44c6_s_long,
|
||||
&_resbook_44s_6,&_resbook_44s_6}
|
||||
};
|
||||
static const vorbis_residue_template _res_44s_7[]={
|
||||
{2,0,16, &_residue_44_high,
|
||||
&_huff_book__44c7_s_short,&_huff_book__44c7_s_short,
|
||||
&_resbook_44s_7,&_resbook_44s_7},
|
||||
|
||||
{2,0,32, &_residue_44_high,
|
||||
&_huff_book__44c7_s_long,&_huff_book__44c7_s_long,
|
||||
&_resbook_44s_7,&_resbook_44s_7}
|
||||
};
|
||||
static const vorbis_residue_template _res_44s_8[]={
|
||||
{2,0,16, &_residue_44_high,
|
||||
&_huff_book__44c8_s_short,&_huff_book__44c8_s_short,
|
||||
&_resbook_44s_8,&_resbook_44s_8},
|
||||
|
||||
{2,0,32, &_residue_44_high,
|
||||
&_huff_book__44c8_s_long,&_huff_book__44c8_s_long,
|
||||
&_resbook_44s_8,&_resbook_44s_8}
|
||||
};
|
||||
static const vorbis_residue_template _res_44s_9[]={
|
||||
{2,0,16, &_residue_44_high,
|
||||
&_huff_book__44c9_s_short,&_huff_book__44c9_s_short,
|
||||
&_resbook_44s_9,&_resbook_44s_9},
|
||||
|
||||
{2,0,32, &_residue_44_high,
|
||||
&_huff_book__44c9_s_long,&_huff_book__44c9_s_long,
|
||||
&_resbook_44s_9,&_resbook_44s_9}
|
||||
};
|
||||
|
||||
static const vorbis_mapping_template _mapres_template_44_stereo[]={
|
||||
{ _map_nominal, _res_44s_n1 }, /* -1 */
|
||||
{ _map_nominal, _res_44s_0 }, /* 0 */
|
||||
{ _map_nominal, _res_44s_1 }, /* 1 */
|
||||
{ _map_nominal, _res_44s_2 }, /* 2 */
|
||||
{ _map_nominal, _res_44s_3 }, /* 3 */
|
||||
{ _map_nominal, _res_44s_4 }, /* 4 */
|
||||
{ _map_nominal, _res_44s_5 }, /* 5 */
|
||||
{ _map_nominal, _res_44s_6 }, /* 6 */
|
||||
{ _map_nominal, _res_44s_7 }, /* 7 */
|
||||
{ _map_nominal, _res_44s_8 }, /* 8 */
|
||||
{ _map_nominal, _res_44s_9 }, /* 9 */
|
||||
};
|
@ -1,451 +0,0 @@
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2010 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: toplevel residue templates for 32/44.1/48kHz uncoupled
|
||||
last mod: $Id: residue_44p51.h 19013 2013-11-12 04:04:50Z giles $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
#include "vorbis/codec.h"
|
||||
#include "backends.h"
|
||||
|
||||
#include "books/coupled/res_books_51.h"
|
||||
|
||||
/***** residue backends *********************************************/
|
||||
|
||||
static const vorbis_info_residue0 _residue_44p_lo={
|
||||
0,-1, -1, 7,-1,-1,
|
||||
/* 0 1 2 3 4 5 6 7 8 */
|
||||
{0},
|
||||
{-1},
|
||||
{ 0, 1, 2, 7, 17, 31},
|
||||
{ 0, 0, 99, 7, 17, 31},
|
||||
};
|
||||
|
||||
static const vorbis_info_residue0 _residue_44p={
|
||||
0,-1, -1, 8,-1,-1,
|
||||
/* 0 1 2 3 4 5 6 7 8 */
|
||||
{0},
|
||||
{-1},
|
||||
{ 0, 1, 1, 2, 7, 17, 31},
|
||||
{ 0, 0, 99, 99, 7, 17, 31},
|
||||
};
|
||||
|
||||
static const vorbis_info_residue0 _residue_44p_hi={
|
||||
0,-1, -1, 8,-1,-1,
|
||||
/* 0 1 2 3 4 5 6 7 8 */
|
||||
{0},
|
||||
{-1},
|
||||
{ 0, 1, 2, 4, 7, 17, 31},
|
||||
{ 0, 1, 2, 4, 7, 17, 31},
|
||||
};
|
||||
|
||||
static const vorbis_info_residue0 _residue_44p_lfe={
|
||||
0,-1, -1, 2,-1,-1,
|
||||
/* 0 1 2 3 4 5 6 7 8 */
|
||||
{0},
|
||||
{-1},
|
||||
{ 32},
|
||||
{ -1}
|
||||
};
|
||||
|
||||
static const static_bookblock _resbook_44p_n1={
|
||||
{
|
||||
{0},
|
||||
{0,&_44pn1_p1_0},
|
||||
|
||||
{&_44pn1_p2_0,&_44pn1_p2_1,0},
|
||||
{&_44pn1_p3_0,&_44pn1_p3_1,0},
|
||||
{&_44pn1_p4_0,&_44pn1_p4_1,0},
|
||||
|
||||
{&_44pn1_p5_0,&_44pn1_p5_1,&_44pn1_p4_1},
|
||||
{&_44pn1_p6_0,&_44pn1_p6_1,&_44pn1_p6_2},
|
||||
}
|
||||
};
|
||||
|
||||
static const static_bookblock _resbook_44p_0={
|
||||
{
|
||||
{0},
|
||||
{0,&_44p0_p1_0},
|
||||
|
||||
{&_44p0_p2_0,&_44p0_p2_1,0},
|
||||
{&_44p0_p3_0,&_44p0_p3_1,0},
|
||||
{&_44p0_p4_0,&_44p0_p4_1,0},
|
||||
|
||||
{&_44p0_p5_0,&_44p0_p5_1,&_44p0_p4_1},
|
||||
{&_44p0_p6_0,&_44p0_p6_1,&_44p0_p6_2},
|
||||
}
|
||||
};
|
||||
|
||||
static const static_bookblock _resbook_44p_1={
|
||||
{
|
||||
{0},
|
||||
{0,&_44p1_p1_0},
|
||||
|
||||
{&_44p1_p2_0,&_44p1_p2_1,0},
|
||||
{&_44p1_p3_0,&_44p1_p3_1,0},
|
||||
{&_44p1_p4_0,&_44p1_p4_1,0},
|
||||
|
||||
{&_44p1_p5_0,&_44p1_p5_1,&_44p1_p4_1},
|
||||
{&_44p1_p6_0,&_44p1_p6_1,&_44p1_p6_2},
|
||||
}
|
||||
};
|
||||
|
||||
static const static_bookblock _resbook_44p_2={
|
||||
{
|
||||
{0},
|
||||
{0,0,&_44p2_p1_0},
|
||||
{0,&_44p2_p2_0,0},
|
||||
|
||||
{&_44p2_p3_0,&_44p2_p3_1,0},
|
||||
{&_44p2_p4_0,&_44p2_p4_1,0},
|
||||
{&_44p2_p5_0,&_44p2_p5_1,0},
|
||||
|
||||
{&_44p2_p6_0,&_44p2_p6_1,&_44p2_p5_1},
|
||||
{&_44p2_p7_0,&_44p2_p7_1,&_44p2_p7_2,&_44p2_p7_3}
|
||||
}
|
||||
};
|
||||
static const static_bookblock _resbook_44p_3={
|
||||
{
|
||||
{0},
|
||||
{0,0,&_44p3_p1_0},
|
||||
{0,&_44p3_p2_0,0},
|
||||
|
||||
{&_44p3_p3_0,&_44p3_p3_1,0},
|
||||
{&_44p3_p4_0,&_44p3_p4_1,0},
|
||||
{&_44p3_p5_0,&_44p3_p5_1,0},
|
||||
|
||||
{&_44p3_p6_0,&_44p3_p6_1,&_44p3_p5_1},
|
||||
{&_44p3_p7_0,&_44p3_p7_1,&_44p3_p7_2,&_44p3_p7_3}
|
||||
}
|
||||
};
|
||||
static const static_bookblock _resbook_44p_4={
|
||||
{
|
||||
{0},
|
||||
{0,0,&_44p4_p1_0},
|
||||
{0,&_44p4_p2_0,0},
|
||||
|
||||
{&_44p4_p3_0,&_44p4_p3_1,0},
|
||||
{&_44p4_p4_0,&_44p4_p4_1,0},
|
||||
{&_44p4_p5_0,&_44p4_p5_1,0},
|
||||
|
||||
{&_44p4_p6_0,&_44p4_p6_1,&_44p4_p5_1},
|
||||
{&_44p4_p7_0,&_44p4_p7_1,&_44p4_p7_2,&_44p4_p7_3}
|
||||
}
|
||||
};
|
||||
static const static_bookblock _resbook_44p_5={
|
||||
{
|
||||
{0},
|
||||
{0,0,&_44p5_p1_0},
|
||||
{0,&_44p5_p2_0,0},
|
||||
|
||||
{&_44p5_p3_0,&_44p5_p3_1,0},
|
||||
{&_44p5_p4_0,&_44p5_p4_1,0},
|
||||
{&_44p5_p5_0,&_44p5_p5_1,0},
|
||||
|
||||
{&_44p5_p6_0,&_44p5_p6_1,&_44p5_p5_1},
|
||||
{&_44p5_p7_0,&_44p5_p7_1,&_44p5_p7_2,&_44p5_p7_3}
|
||||
}
|
||||
};
|
||||
static const static_bookblock _resbook_44p_6={
|
||||
{
|
||||
{0},
|
||||
{0,0,&_44p6_p1_0},
|
||||
{0,&_44p6_p2_0,0},
|
||||
|
||||
{&_44p6_p3_0,&_44p6_p3_1,0},
|
||||
{&_44p6_p4_0,&_44p6_p4_1,0},
|
||||
{&_44p6_p5_0,&_44p6_p5_1,0},
|
||||
|
||||
{&_44p6_p6_0,&_44p6_p6_1,&_44p6_p5_1},
|
||||
{&_44p6_p7_0,&_44p6_p7_1,&_44p6_p7_2,&_44p6_p7_3}
|
||||
}
|
||||
};
|
||||
static const static_bookblock _resbook_44p_7={
|
||||
{
|
||||
{0},
|
||||
{0,0,&_44p7_p1_0},
|
||||
{0,&_44p7_p2_0,0},
|
||||
|
||||
{&_44p7_p3_0,&_44p7_p3_1,0},
|
||||
{&_44p7_p4_0,&_44p7_p4_1,0},
|
||||
{&_44p7_p5_0,&_44p7_p5_1,0},
|
||||
|
||||
{&_44p7_p6_0,&_44p7_p6_1,&_44p7_p5_1},
|
||||
{&_44p7_p7_0,&_44p7_p7_1,&_44p7_p7_2,&_44p7_p7_3}
|
||||
}
|
||||
};
|
||||
static const static_bookblock _resbook_44p_8={
|
||||
{
|
||||
{0},
|
||||
{0,0,&_44p8_p1_0},
|
||||
{0,&_44p8_p2_0,0},
|
||||
|
||||
{&_44p8_p3_0,&_44p8_p3_1,0},
|
||||
{&_44p8_p4_0,&_44p8_p4_1,0},
|
||||
{&_44p8_p5_0,&_44p8_p5_1,0},
|
||||
|
||||
{&_44p8_p6_0,&_44p8_p6_1,&_44p8_p5_1},
|
||||
{&_44p8_p7_0,&_44p8_p7_1,&_44p8_p7_2,&_44p8_p7_3}
|
||||
}
|
||||
};
|
||||
static const static_bookblock _resbook_44p_9={
|
||||
{
|
||||
{0},
|
||||
{0,0,&_44p9_p1_0},
|
||||
{0,&_44p9_p2_0,0},
|
||||
|
||||
{&_44p9_p3_0,&_44p9_p3_1,0},
|
||||
{&_44p9_p4_0,&_44p9_p4_1,0},
|
||||
{&_44p9_p5_0,&_44p9_p5_1,0},
|
||||
|
||||
{&_44p9_p6_0,&_44p9_p6_1,&_44p9_p5_1},
|
||||
{&_44p9_p7_0,&_44p9_p7_1,&_44p9_p7_2,&_44p9_p7_3}
|
||||
}
|
||||
};
|
||||
|
||||
static const static_bookblock _resbook_44p_ln1={
|
||||
{
|
||||
{&_44pn1_l0_0,&_44pn1_l0_1,0},
|
||||
{&_44pn1_l1_0,&_44pn1_p6_1,&_44pn1_p6_2},
|
||||
}
|
||||
};
|
||||
static const static_bookblock _resbook_44p_l0={
|
||||
{
|
||||
{&_44p0_l0_0,&_44p0_l0_1,0},
|
||||
{&_44p0_l1_0,&_44p0_p6_1,&_44p0_p6_2},
|
||||
}
|
||||
};
|
||||
static const static_bookblock _resbook_44p_l1={
|
||||
{
|
||||
{&_44p1_l0_0,&_44p1_l0_1,0},
|
||||
{&_44p1_l1_0,&_44p1_p6_1,&_44p1_p6_2},
|
||||
}
|
||||
};
|
||||
static const static_bookblock _resbook_44p_l2={
|
||||
{
|
||||
{&_44p2_l0_0,&_44p2_l0_1,0},
|
||||
{&_44p2_l1_0,&_44p2_p7_2,&_44p2_p7_3},
|
||||
}
|
||||
};
|
||||
static const static_bookblock _resbook_44p_l3={
|
||||
{
|
||||
{&_44p3_l0_0,&_44p3_l0_1,0},
|
||||
{&_44p3_l1_0,&_44p3_p7_2,&_44p3_p7_3},
|
||||
}
|
||||
};
|
||||
static const static_bookblock _resbook_44p_l4={
|
||||
{
|
||||
{&_44p4_l0_0,&_44p4_l0_1,0},
|
||||
{&_44p4_l1_0,&_44p4_p7_2,&_44p4_p7_3},
|
||||
}
|
||||
};
|
||||
static const static_bookblock _resbook_44p_l5={
|
||||
{
|
||||
{&_44p5_l0_0,&_44p5_l0_1,0},
|
||||
{&_44p5_l1_0,&_44p5_p7_2,&_44p5_p7_3},
|
||||
}
|
||||
};
|
||||
static const static_bookblock _resbook_44p_l6={
|
||||
{
|
||||
{&_44p6_l0_0,&_44p6_l0_1,0},
|
||||
{&_44p6_l1_0,&_44p6_p7_2,&_44p6_p7_3},
|
||||
}
|
||||
};
|
||||
static const static_bookblock _resbook_44p_l7={
|
||||
{
|
||||
{&_44p7_l0_0,&_44p7_l0_1,0},
|
||||
{&_44p7_l1_0,&_44p7_p7_2,&_44p7_p7_3},
|
||||
}
|
||||
};
|
||||
static const static_bookblock _resbook_44p_l8={
|
||||
{
|
||||
{&_44p8_l0_0,&_44p8_l0_1,0},
|
||||
{&_44p8_l1_0,&_44p8_p7_2,&_44p8_p7_3},
|
||||
}
|
||||
};
|
||||
static const static_bookblock _resbook_44p_l9={
|
||||
{
|
||||
{&_44p9_l0_0,&_44p9_l0_1,0},
|
||||
{&_44p9_l1_0,&_44p9_p7_2,&_44p9_p7_3},
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
static const vorbis_info_mapping0 _map_nominal_51[2]={
|
||||
{2, {0,0,0,0,0,1}, {0,2}, {0,2}, 4,{0,3,0,0},{2,4,1,3}},
|
||||
{2, {0,0,0,0,0,1}, {1,2}, {1,2}, 4,{0,3,0,0},{2,4,1,3}}
|
||||
};
|
||||
static const vorbis_info_mapping0 _map_nominal_51u[2]={
|
||||
{2, {0,0,0,0,0,1}, {0,2}, {0,2}, 0,{0},{0}},
|
||||
{2, {0,0,0,0,0,1}, {1,2}, {1,2}, 0,{0},{0}}
|
||||
};
|
||||
|
||||
static const vorbis_residue_template _res_44p51_n1[]={
|
||||
{2,0,30, &_residue_44p_lo,
|
||||
&_huff_book__44pn1_short,&_huff_book__44pn1_short,
|
||||
&_resbook_44p_n1,&_resbook_44p_n1},
|
||||
|
||||
{2,0,30, &_residue_44p_lo,
|
||||
&_huff_book__44pn1_long,&_huff_book__44pn1_long,
|
||||
&_resbook_44p_n1,&_resbook_44p_n1},
|
||||
|
||||
{1,2,6, &_residue_44p_lfe,
|
||||
&_huff_book__44pn1_lfe,&_huff_book__44pn1_lfe,
|
||||
&_resbook_44p_ln1,&_resbook_44p_ln1}
|
||||
};
|
||||
static const vorbis_residue_template _res_44p51_0[]={
|
||||
{2,0,15, &_residue_44p_lo,
|
||||
&_huff_book__44p0_short,&_huff_book__44p0_short,
|
||||
&_resbook_44p_0,&_resbook_44p_0},
|
||||
|
||||
{2,0,30, &_residue_44p_lo,
|
||||
&_huff_book__44p0_long,&_huff_book__44p0_long,
|
||||
&_resbook_44p_0,&_resbook_44p_0},
|
||||
|
||||
{1,2,6, &_residue_44p_lfe,
|
||||
&_huff_book__44p0_lfe,&_huff_book__44p0_lfe,
|
||||
&_resbook_44p_l0,&_resbook_44p_l0}
|
||||
};
|
||||
static const vorbis_residue_template _res_44p51_1[]={
|
||||
{2,0,15, &_residue_44p_lo,
|
||||
&_huff_book__44p1_short,&_huff_book__44p1_short,
|
||||
&_resbook_44p_1,&_resbook_44p_1},
|
||||
|
||||
{2,0,30, &_residue_44p_lo,
|
||||
&_huff_book__44p1_long,&_huff_book__44p1_long,
|
||||
&_resbook_44p_1,&_resbook_44p_1},
|
||||
|
||||
{1,2,6, &_residue_44p_lfe,
|
||||
&_huff_book__44p1_lfe,&_huff_book__44p1_lfe,
|
||||
&_resbook_44p_l1,&_resbook_44p_l1}
|
||||
};
|
||||
static const vorbis_residue_template _res_44p51_2[]={
|
||||
{2,0,15, &_residue_44p,
|
||||
&_huff_book__44p2_short,&_huff_book__44p2_short,
|
||||
&_resbook_44p_2,&_resbook_44p_2},
|
||||
|
||||
{2,0,30, &_residue_44p,
|
||||
&_huff_book__44p2_long,&_huff_book__44p2_long,
|
||||
&_resbook_44p_2,&_resbook_44p_2},
|
||||
|
||||
{1,2,6, &_residue_44p_lfe,
|
||||
&_huff_book__44p2_lfe,&_huff_book__44p2_lfe,
|
||||
&_resbook_44p_l2,&_resbook_44p_l2}
|
||||
};
|
||||
static const vorbis_residue_template _res_44p51_3[]={
|
||||
{2,0,15, &_residue_44p,
|
||||
&_huff_book__44p3_short,&_huff_book__44p3_short,
|
||||
&_resbook_44p_3,&_resbook_44p_3},
|
||||
|
||||
{2,0,30, &_residue_44p,
|
||||
&_huff_book__44p3_long,&_huff_book__44p3_long,
|
||||
&_resbook_44p_3,&_resbook_44p_3},
|
||||
|
||||
{1,2,6, &_residue_44p_lfe,
|
||||
&_huff_book__44p3_lfe,&_huff_book__44p3_lfe,
|
||||
&_resbook_44p_l3,&_resbook_44p_l3}
|
||||
};
|
||||
static const vorbis_residue_template _res_44p51_4[]={
|
||||
{2,0,15, &_residue_44p,
|
||||
&_huff_book__44p4_short,&_huff_book__44p4_short,
|
||||
&_resbook_44p_4,&_resbook_44p_4},
|
||||
|
||||
{2,0,30, &_residue_44p,
|
||||
&_huff_book__44p4_long,&_huff_book__44p4_long,
|
||||
&_resbook_44p_4,&_resbook_44p_4},
|
||||
|
||||
{1,2,6, &_residue_44p_lfe,
|
||||
&_huff_book__44p4_lfe,&_huff_book__44p4_lfe,
|
||||
&_resbook_44p_l4,&_resbook_44p_l4}
|
||||
};
|
||||
static const vorbis_residue_template _res_44p51_5[]={
|
||||
{2,0,15, &_residue_44p_hi,
|
||||
&_huff_book__44p5_short,&_huff_book__44p5_short,
|
||||
&_resbook_44p_5,&_resbook_44p_5},
|
||||
|
||||
{2,0,30, &_residue_44p_hi,
|
||||
&_huff_book__44p5_long,&_huff_book__44p5_long,
|
||||
&_resbook_44p_5,&_resbook_44p_5},
|
||||
|
||||
{1,2,6, &_residue_44p_lfe,
|
||||
&_huff_book__44p5_lfe,&_huff_book__44p5_lfe,
|
||||
&_resbook_44p_l5,&_resbook_44p_l5}
|
||||
};
|
||||
static const vorbis_residue_template _res_44p51_6[]={
|
||||
{2,0,15, &_residue_44p_hi,
|
||||
&_huff_book__44p6_short,&_huff_book__44p6_short,
|
||||
&_resbook_44p_6,&_resbook_44p_6},
|
||||
|
||||
{2,0,30, &_residue_44p_hi,
|
||||
&_huff_book__44p6_long,&_huff_book__44p6_long,
|
||||
&_resbook_44p_6,&_resbook_44p_6},
|
||||
|
||||
{1,2,6, &_residue_44p_lfe,
|
||||
&_huff_book__44p6_lfe,&_huff_book__44p6_lfe,
|
||||
&_resbook_44p_l6,&_resbook_44p_l6}
|
||||
};
|
||||
|
||||
|
||||
static const vorbis_residue_template _res_44p51_7[]={
|
||||
{2,0,15, &_residue_44p_hi,
|
||||
&_huff_book__44p7_short,&_huff_book__44p7_short,
|
||||
&_resbook_44p_7,&_resbook_44p_7},
|
||||
|
||||
{2,0,30, &_residue_44p_hi,
|
||||
&_huff_book__44p7_long,&_huff_book__44p7_long,
|
||||
&_resbook_44p_7,&_resbook_44p_7},
|
||||
|
||||
{1,2,6, &_residue_44p_lfe,
|
||||
&_huff_book__44p6_lfe,&_huff_book__44p6_lfe,
|
||||
&_resbook_44p_l6,&_resbook_44p_l6}
|
||||
};
|
||||
static const vorbis_residue_template _res_44p51_8[]={
|
||||
{2,0,15, &_residue_44p_hi,
|
||||
&_huff_book__44p8_short,&_huff_book__44p8_short,
|
||||
&_resbook_44p_8,&_resbook_44p_8},
|
||||
|
||||
{2,0,30, &_residue_44p_hi,
|
||||
&_huff_book__44p8_long,&_huff_book__44p8_long,
|
||||
&_resbook_44p_8,&_resbook_44p_8},
|
||||
|
||||
{1,2,6, &_residue_44p_lfe,
|
||||
&_huff_book__44p6_lfe,&_huff_book__44p6_lfe,
|
||||
&_resbook_44p_l6,&_resbook_44p_l6}
|
||||
};
|
||||
static const vorbis_residue_template _res_44p51_9[]={
|
||||
{2,0,15, &_residue_44p_hi,
|
||||
&_huff_book__44p9_short,&_huff_book__44p9_short,
|
||||
&_resbook_44p_9,&_resbook_44p_9},
|
||||
|
||||
{2,0,30, &_residue_44p_hi,
|
||||
&_huff_book__44p9_long,&_huff_book__44p9_long,
|
||||
&_resbook_44p_9,&_resbook_44p_9},
|
||||
|
||||
{1,2,6, &_residue_44p_lfe,
|
||||
&_huff_book__44p6_lfe,&_huff_book__44p6_lfe,
|
||||
&_resbook_44p_l6,&_resbook_44p_l6}
|
||||
};
|
||||
|
||||
static const vorbis_mapping_template _mapres_template_44_51[]={
|
||||
{ _map_nominal_51, _res_44p51_n1 }, /* -1 */
|
||||
{ _map_nominal_51, _res_44p51_0 }, /* 0 */
|
||||
{ _map_nominal_51, _res_44p51_1 }, /* 1 */
|
||||
{ _map_nominal_51, _res_44p51_2 }, /* 2 */
|
||||
{ _map_nominal_51, _res_44p51_3 }, /* 3 */
|
||||
{ _map_nominal_51, _res_44p51_4 }, /* 4 */
|
||||
{ _map_nominal_51u, _res_44p51_5 }, /* 5 */
|
||||
{ _map_nominal_51u, _res_44p51_6 }, /* 6 */
|
||||
{ _map_nominal_51u, _res_44p51_7 }, /* 7 */
|
||||
{ _map_nominal_51u, _res_44p51_8 }, /* 8 */
|
||||
{ _map_nominal_51u, _res_44p51_9 }, /* 9 */
|
||||
};
|
@ -1,318 +0,0 @@
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: toplevel residue templates for 32/44.1/48kHz uncoupled
|
||||
last mod: $Id: residue_44u.h 16962 2010-03-11 07:30:34Z xiphmont $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
#include "vorbis/codec.h"
|
||||
#include "backends.h"
|
||||
#include "books/uncoupled/res_books_uncoupled.h"
|
||||
|
||||
/***** residue backends *********************************************/
|
||||
|
||||
|
||||
static const vorbis_info_residue0 _residue_44_low_un={
|
||||
0,-1, -1, 8,-1,-1,
|
||||
{0},
|
||||
{-1},
|
||||
{ 0, 1, 1, 2, 2, 4, 28},
|
||||
{ -1, 25, -1, 45, -1, -1, -1}
|
||||
};
|
||||
|
||||
static const vorbis_info_residue0 _residue_44_mid_un={
|
||||
0,-1, -1, 10,-1,-1,
|
||||
/* 0 1 2 3 4 5 6 7 8 9 */
|
||||
{0},
|
||||
{-1},
|
||||
{ 0, 1, 1, 2, 2, 4, 4, 16, 60},
|
||||
{ -1, 30, -1, 50, -1, 80, -1, -1, -1}
|
||||
};
|
||||
|
||||
static const vorbis_info_residue0 _residue_44_hi_un={
|
||||
0,-1, -1, 10,-1,-1,
|
||||
/* 0 1 2 3 4 5 6 7 8 9 */
|
||||
{0},
|
||||
{-1},
|
||||
{ 0, 1, 2, 4, 8, 16, 32, 71,157},
|
||||
{ -1, -1, -1, -1, -1, -1, -1, -1, -1}
|
||||
};
|
||||
|
||||
/* mapping conventions:
|
||||
only one submap (this would change for efficient 5.1 support for example)*/
|
||||
/* Four psychoacoustic profiles are used, one for each blocktype */
|
||||
static const vorbis_info_mapping0 _map_nominal_u[2]={
|
||||
{1, {0,0,0,0,0,0}, {0}, {0}, 0,{0},{0}},
|
||||
{1, {0,0,0,0,0,0}, {1}, {1}, 0,{0},{0}}
|
||||
};
|
||||
|
||||
static const static_bookblock _resbook_44u_n1={
|
||||
{
|
||||
{0},
|
||||
{0,0,&_44un1__p1_0},
|
||||
{0,0,&_44un1__p2_0},
|
||||
{0,0,&_44un1__p3_0},
|
||||
{0,0,&_44un1__p4_0},
|
||||
{0,0,&_44un1__p5_0},
|
||||
{&_44un1__p6_0,&_44un1__p6_1},
|
||||
{&_44un1__p7_0,&_44un1__p7_1,&_44un1__p7_2}
|
||||
}
|
||||
};
|
||||
static const static_bookblock _resbook_44u_0={
|
||||
{
|
||||
{0},
|
||||
{0,0,&_44u0__p1_0},
|
||||
{0,0,&_44u0__p2_0},
|
||||
{0,0,&_44u0__p3_0},
|
||||
{0,0,&_44u0__p4_0},
|
||||
{0,0,&_44u0__p5_0},
|
||||
{&_44u0__p6_0,&_44u0__p6_1},
|
||||
{&_44u0__p7_0,&_44u0__p7_1,&_44u0__p7_2}
|
||||
}
|
||||
};
|
||||
static const static_bookblock _resbook_44u_1={
|
||||
{
|
||||
{0},
|
||||
{0,0,&_44u1__p1_0},
|
||||
{0,0,&_44u1__p2_0},
|
||||
{0,0,&_44u1__p3_0},
|
||||
{0,0,&_44u1__p4_0},
|
||||
{0,0,&_44u1__p5_0},
|
||||
{&_44u1__p6_0,&_44u1__p6_1},
|
||||
{&_44u1__p7_0,&_44u1__p7_1,&_44u1__p7_2}
|
||||
}
|
||||
};
|
||||
static const static_bookblock _resbook_44u_2={
|
||||
{
|
||||
{0},
|
||||
{0,0,&_44u2__p1_0},
|
||||
{0,0,&_44u2__p2_0},
|
||||
{0,0,&_44u2__p3_0},
|
||||
{0,0,&_44u2__p4_0},
|
||||
{0,0,&_44u2__p5_0},
|
||||
{&_44u2__p6_0,&_44u2__p6_1},
|
||||
{&_44u2__p7_0,&_44u2__p7_1,&_44u2__p7_2}
|
||||
}
|
||||
};
|
||||
static const static_bookblock _resbook_44u_3={
|
||||
{
|
||||
{0},
|
||||
{0,0,&_44u3__p1_0},
|
||||
{0,0,&_44u3__p2_0},
|
||||
{0,0,&_44u3__p3_0},
|
||||
{0,0,&_44u3__p4_0},
|
||||
{0,0,&_44u3__p5_0},
|
||||
{&_44u3__p6_0,&_44u3__p6_1},
|
||||
{&_44u3__p7_0,&_44u3__p7_1,&_44u3__p7_2}
|
||||
}
|
||||
};
|
||||
static const static_bookblock _resbook_44u_4={
|
||||
{
|
||||
{0},
|
||||
{0,0,&_44u4__p1_0},
|
||||
{0,0,&_44u4__p2_0},
|
||||
{0,0,&_44u4__p3_0},
|
||||
{0,0,&_44u4__p4_0},
|
||||
{0,0,&_44u4__p5_0},
|
||||
{&_44u4__p6_0,&_44u4__p6_1},
|
||||
{&_44u4__p7_0,&_44u4__p7_1,&_44u4__p7_2}
|
||||
}
|
||||
};
|
||||
static const static_bookblock _resbook_44u_5={
|
||||
{
|
||||
{0},
|
||||
{0,0,&_44u5__p1_0},
|
||||
{0,0,&_44u5__p2_0},
|
||||
{0,0,&_44u5__p3_0},
|
||||
{0,0,&_44u5__p4_0},
|
||||
{0,0,&_44u5__p5_0},
|
||||
{0,0,&_44u5__p6_0},
|
||||
{&_44u5__p7_0,&_44u5__p7_1},
|
||||
{&_44u5__p8_0,&_44u5__p8_1},
|
||||
{&_44u5__p9_0,&_44u5__p9_1,&_44u5__p9_2}
|
||||
}
|
||||
};
|
||||
static const static_bookblock _resbook_44u_6={
|
||||
{
|
||||
{0},
|
||||
{0,0,&_44u6__p1_0},
|
||||
{0,0,&_44u6__p2_0},
|
||||
{0,0,&_44u6__p3_0},
|
||||
{0,0,&_44u6__p4_0},
|
||||
{0,0,&_44u6__p5_0},
|
||||
{0,0,&_44u6__p6_0},
|
||||
{&_44u6__p7_0,&_44u6__p7_1},
|
||||
{&_44u6__p8_0,&_44u6__p8_1},
|
||||
{&_44u6__p9_0,&_44u6__p9_1,&_44u6__p9_2}
|
||||
}
|
||||
};
|
||||
static const static_bookblock _resbook_44u_7={
|
||||
{
|
||||
{0},
|
||||
{0,0,&_44u7__p1_0},
|
||||
{0,0,&_44u7__p2_0},
|
||||
{0,0,&_44u7__p3_0},
|
||||
{0,0,&_44u7__p4_0},
|
||||
{0,0,&_44u7__p5_0},
|
||||
{0,0,&_44u7__p6_0},
|
||||
{&_44u7__p7_0,&_44u7__p7_1},
|
||||
{&_44u7__p8_0,&_44u7__p8_1},
|
||||
{&_44u7__p9_0,&_44u7__p9_1,&_44u7__p9_2}
|
||||
}
|
||||
};
|
||||
static const static_bookblock _resbook_44u_8={
|
||||
{
|
||||
{0},
|
||||
{0,0,&_44u8_p1_0},
|
||||
{0,0,&_44u8_p2_0},
|
||||
{0,0,&_44u8_p3_0},
|
||||
{0,0,&_44u8_p4_0},
|
||||
{&_44u8_p5_0,&_44u8_p5_1},
|
||||
{&_44u8_p6_0,&_44u8_p6_1},
|
||||
{&_44u8_p7_0,&_44u8_p7_1},
|
||||
{&_44u8_p8_0,&_44u8_p8_1},
|
||||
{&_44u8_p9_0,&_44u8_p9_1,&_44u8_p9_2}
|
||||
}
|
||||
};
|
||||
static const static_bookblock _resbook_44u_9={
|
||||
{
|
||||
{0},
|
||||
{0,0,&_44u9_p1_0},
|
||||
{0,0,&_44u9_p2_0},
|
||||
{0,0,&_44u9_p3_0},
|
||||
{0,0,&_44u9_p4_0},
|
||||
{&_44u9_p5_0,&_44u9_p5_1},
|
||||
{&_44u9_p6_0,&_44u9_p6_1},
|
||||
{&_44u9_p7_0,&_44u9_p7_1},
|
||||
{&_44u9_p8_0,&_44u9_p8_1},
|
||||
{&_44u9_p9_0,&_44u9_p9_1,&_44u9_p9_2}
|
||||
}
|
||||
};
|
||||
|
||||
static const vorbis_residue_template _res_44u_n1[]={
|
||||
{1,0,32, &_residue_44_low_un,
|
||||
&_huff_book__44un1__short,&_huff_book__44un1__short,
|
||||
&_resbook_44u_n1,&_resbook_44u_n1},
|
||||
|
||||
{1,0,32, &_residue_44_low_un,
|
||||
&_huff_book__44un1__long,&_huff_book__44un1__long,
|
||||
&_resbook_44u_n1,&_resbook_44u_n1}
|
||||
};
|
||||
static const vorbis_residue_template _res_44u_0[]={
|
||||
{1,0,16, &_residue_44_low_un,
|
||||
&_huff_book__44u0__short,&_huff_book__44u0__short,
|
||||
&_resbook_44u_0,&_resbook_44u_0},
|
||||
|
||||
{1,0,32, &_residue_44_low_un,
|
||||
&_huff_book__44u0__long,&_huff_book__44u0__long,
|
||||
&_resbook_44u_0,&_resbook_44u_0}
|
||||
};
|
||||
static const vorbis_residue_template _res_44u_1[]={
|
||||
{1,0,16, &_residue_44_low_un,
|
||||
&_huff_book__44u1__short,&_huff_book__44u1__short,
|
||||
&_resbook_44u_1,&_resbook_44u_1},
|
||||
|
||||
{1,0,32, &_residue_44_low_un,
|
||||
&_huff_book__44u1__long,&_huff_book__44u1__long,
|
||||
&_resbook_44u_1,&_resbook_44u_1}
|
||||
};
|
||||
static const vorbis_residue_template _res_44u_2[]={
|
||||
{1,0,16, &_residue_44_low_un,
|
||||
&_huff_book__44u2__short,&_huff_book__44u2__short,
|
||||
&_resbook_44u_2,&_resbook_44u_2},
|
||||
|
||||
{1,0,32, &_residue_44_low_un,
|
||||
&_huff_book__44u2__long,&_huff_book__44u2__long,
|
||||
&_resbook_44u_2,&_resbook_44u_2}
|
||||
};
|
||||
static const vorbis_residue_template _res_44u_3[]={
|
||||
{1,0,16, &_residue_44_low_un,
|
||||
&_huff_book__44u3__short,&_huff_book__44u3__short,
|
||||
&_resbook_44u_3,&_resbook_44u_3},
|
||||
|
||||
{1,0,32, &_residue_44_low_un,
|
||||
&_huff_book__44u3__long,&_huff_book__44u3__long,
|
||||
&_resbook_44u_3,&_resbook_44u_3}
|
||||
};
|
||||
static const vorbis_residue_template _res_44u_4[]={
|
||||
{1,0,16, &_residue_44_low_un,
|
||||
&_huff_book__44u4__short,&_huff_book__44u4__short,
|
||||
&_resbook_44u_4,&_resbook_44u_4},
|
||||
|
||||
{1,0,32, &_residue_44_low_un,
|
||||
&_huff_book__44u4__long,&_huff_book__44u4__long,
|
||||
&_resbook_44u_4,&_resbook_44u_4}
|
||||
};
|
||||
|
||||
static const vorbis_residue_template _res_44u_5[]={
|
||||
{1,0,16, &_residue_44_mid_un,
|
||||
&_huff_book__44u5__short,&_huff_book__44u5__short,
|
||||
&_resbook_44u_5,&_resbook_44u_5},
|
||||
|
||||
{1,0,32, &_residue_44_mid_un,
|
||||
&_huff_book__44u5__long,&_huff_book__44u5__long,
|
||||
&_resbook_44u_5,&_resbook_44u_5}
|
||||
};
|
||||
|
||||
static const vorbis_residue_template _res_44u_6[]={
|
||||
{1,0,16, &_residue_44_mid_un,
|
||||
&_huff_book__44u6__short,&_huff_book__44u6__short,
|
||||
&_resbook_44u_6,&_resbook_44u_6},
|
||||
|
||||
{1,0,32, &_residue_44_mid_un,
|
||||
&_huff_book__44u6__long,&_huff_book__44u6__long,
|
||||
&_resbook_44u_6,&_resbook_44u_6}
|
||||
};
|
||||
|
||||
static const vorbis_residue_template _res_44u_7[]={
|
||||
{1,0,16, &_residue_44_mid_un,
|
||||
&_huff_book__44u7__short,&_huff_book__44u7__short,
|
||||
&_resbook_44u_7,&_resbook_44u_7},
|
||||
|
||||
{1,0,32, &_residue_44_mid_un,
|
||||
&_huff_book__44u7__long,&_huff_book__44u7__long,
|
||||
&_resbook_44u_7,&_resbook_44u_7}
|
||||
};
|
||||
|
||||
static const vorbis_residue_template _res_44u_8[]={
|
||||
{1,0,16, &_residue_44_hi_un,
|
||||
&_huff_book__44u8__short,&_huff_book__44u8__short,
|
||||
&_resbook_44u_8,&_resbook_44u_8},
|
||||
|
||||
{1,0,32, &_residue_44_hi_un,
|
||||
&_huff_book__44u8__long,&_huff_book__44u8__long,
|
||||
&_resbook_44u_8,&_resbook_44u_8}
|
||||
};
|
||||
static const vorbis_residue_template _res_44u_9[]={
|
||||
{1,0,16, &_residue_44_hi_un,
|
||||
&_huff_book__44u9__short,&_huff_book__44u9__short,
|
||||
&_resbook_44u_9,&_resbook_44u_9},
|
||||
|
||||
{1,0,32, &_residue_44_hi_un,
|
||||
&_huff_book__44u9__long,&_huff_book__44u9__long,
|
||||
&_resbook_44u_9,&_resbook_44u_9}
|
||||
};
|
||||
|
||||
static const vorbis_mapping_template _mapres_template_44_uncoupled[]={
|
||||
{ _map_nominal_u, _res_44u_n1 }, /* -1 */
|
||||
{ _map_nominal_u, _res_44u_0 }, /* 0 */
|
||||
{ _map_nominal_u, _res_44u_1 }, /* 1 */
|
||||
{ _map_nominal_u, _res_44u_2 }, /* 2 */
|
||||
{ _map_nominal_u, _res_44u_3 }, /* 3 */
|
||||
{ _map_nominal_u, _res_44u_4 }, /* 4 */
|
||||
{ _map_nominal_u, _res_44u_5 }, /* 5 */
|
||||
{ _map_nominal_u, _res_44u_6 }, /* 6 */
|
||||
{ _map_nominal_u, _res_44u_7 }, /* 7 */
|
||||
{ _map_nominal_u, _res_44u_8 }, /* 8 */
|
||||
{ _map_nominal_u, _res_44u_9 }, /* 9 */
|
||||
};
|
@ -1,109 +0,0 @@
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: toplevel residue templates 8/11kHz
|
||||
last mod: $Id: residue_8.h 16962 2010-03-11 07:30:34Z xiphmont $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
#include "vorbis/codec.h"
|
||||
#include "backends.h"
|
||||
|
||||
/***** residue backends *********************************************/
|
||||
|
||||
static const static_bookblock _resbook_8s_0={
|
||||
{
|
||||
{0},
|
||||
{0,0,&_8c0_s_p1_0},
|
||||
{0},
|
||||
{0,0,&_8c0_s_p3_0},
|
||||
{0,0,&_8c0_s_p4_0},
|
||||
{0,0,&_8c0_s_p5_0},
|
||||
{0,0,&_8c0_s_p6_0},
|
||||
{&_8c0_s_p7_0,&_8c0_s_p7_1},
|
||||
{&_8c0_s_p8_0,&_8c0_s_p8_1},
|
||||
{&_8c0_s_p9_0,&_8c0_s_p9_1,&_8c0_s_p9_2}
|
||||
}
|
||||
};
|
||||
static const static_bookblock _resbook_8s_1={
|
||||
{
|
||||
{0},
|
||||
{0,0,&_8c1_s_p1_0},
|
||||
{0},
|
||||
{0,0,&_8c1_s_p3_0},
|
||||
{0,0,&_8c1_s_p4_0},
|
||||
{0,0,&_8c1_s_p5_0},
|
||||
{0,0,&_8c1_s_p6_0},
|
||||
{&_8c1_s_p7_0,&_8c1_s_p7_1},
|
||||
{&_8c1_s_p8_0,&_8c1_s_p8_1},
|
||||
{&_8c1_s_p9_0,&_8c1_s_p9_1,&_8c1_s_p9_2}
|
||||
}
|
||||
};
|
||||
|
||||
static const vorbis_residue_template _res_8s_0[]={
|
||||
{2,0,32, &_residue_44_mid,
|
||||
&_huff_book__8c0_s_single,&_huff_book__8c0_s_single,
|
||||
&_resbook_8s_0,&_resbook_8s_0},
|
||||
};
|
||||
static const vorbis_residue_template _res_8s_1[]={
|
||||
{2,0,32, &_residue_44_mid,
|
||||
&_huff_book__8c1_s_single,&_huff_book__8c1_s_single,
|
||||
&_resbook_8s_1,&_resbook_8s_1},
|
||||
};
|
||||
|
||||
static const vorbis_mapping_template _mapres_template_8_stereo[2]={
|
||||
{ _map_nominal, _res_8s_0 }, /* 0 */
|
||||
{ _map_nominal, _res_8s_1 }, /* 1 */
|
||||
};
|
||||
|
||||
static const static_bookblock _resbook_8u_0={
|
||||
{
|
||||
{0},
|
||||
{0,0,&_8u0__p1_0},
|
||||
{0,0,&_8u0__p2_0},
|
||||
{0,0,&_8u0__p3_0},
|
||||
{0,0,&_8u0__p4_0},
|
||||
{0,0,&_8u0__p5_0},
|
||||
{&_8u0__p6_0,&_8u0__p6_1},
|
||||
{&_8u0__p7_0,&_8u0__p7_1,&_8u0__p7_2}
|
||||
}
|
||||
};
|
||||
static const static_bookblock _resbook_8u_1={
|
||||
{
|
||||
{0},
|
||||
{0,0,&_8u1__p1_0},
|
||||
{0,0,&_8u1__p2_0},
|
||||
{0,0,&_8u1__p3_0},
|
||||
{0,0,&_8u1__p4_0},
|
||||
{0,0,&_8u1__p5_0},
|
||||
{0,0,&_8u1__p6_0},
|
||||
{&_8u1__p7_0,&_8u1__p7_1},
|
||||
{&_8u1__p8_0,&_8u1__p8_1},
|
||||
{&_8u1__p9_0,&_8u1__p9_1,&_8u1__p9_2}
|
||||
}
|
||||
};
|
||||
|
||||
static const vorbis_residue_template _res_8u_0[]={
|
||||
{1,0,32, &_residue_44_low_un,
|
||||
&_huff_book__8u0__single,&_huff_book__8u0__single,
|
||||
&_resbook_8u_0,&_resbook_8u_0},
|
||||
};
|
||||
static const vorbis_residue_template _res_8u_1[]={
|
||||
{1,0,32, &_residue_44_mid_un,
|
||||
&_huff_book__8u1__single,&_huff_book__8u1__single,
|
||||
&_resbook_8u_1,&_resbook_8u_1},
|
||||
};
|
||||
|
||||
static const vorbis_mapping_template _mapres_template_8_uncoupled[2]={
|
||||
{ _map_nominal_u, _res_8u_0 }, /* 0 */
|
||||
{ _map_nominal_u, _res_8u_1 }, /* 1 */
|
||||
};
|
@ -1,143 +0,0 @@
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: 11kHz settings
|
||||
last mod: $Id: setup_11.h 16894 2010-02-12 20:32:12Z xiphmont $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
#include "psych_11.h"
|
||||
|
||||
static const int blocksize_11[2]={
|
||||
512,512
|
||||
};
|
||||
|
||||
static const int _floor_mapping_11a[]={
|
||||
6,6
|
||||
};
|
||||
static const int *_floor_mapping_11[]={
|
||||
_floor_mapping_11a
|
||||
};
|
||||
|
||||
static const double rate_mapping_11[3]={
|
||||
8000.,13000.,44000.,
|
||||
};
|
||||
|
||||
static const double rate_mapping_11_uncoupled[3]={
|
||||
12000.,20000.,50000.,
|
||||
};
|
||||
|
||||
static const double quality_mapping_11[3]={
|
||||
-.1,.0,1.
|
||||
};
|
||||
|
||||
static const ve_setup_data_template ve_setup_11_stereo={
|
||||
2,
|
||||
rate_mapping_11,
|
||||
quality_mapping_11,
|
||||
2,
|
||||
9000,
|
||||
15000,
|
||||
|
||||
blocksize_11,
|
||||
blocksize_11,
|
||||
|
||||
_psy_tone_masteratt_11,
|
||||
_psy_tone_0dB,
|
||||
_psy_tone_suppress,
|
||||
|
||||
_vp_tonemask_adj_11,
|
||||
NULL,
|
||||
_vp_tonemask_adj_11,
|
||||
|
||||
_psy_noiseguards_8,
|
||||
_psy_noisebias_11,
|
||||
_psy_noisebias_11,
|
||||
NULL,
|
||||
NULL,
|
||||
_psy_noise_suppress,
|
||||
|
||||
_psy_compand_8,
|
||||
_psy_compand_8_mapping,
|
||||
NULL,
|
||||
|
||||
{_noise_start_8,_noise_start_8},
|
||||
{_noise_part_8,_noise_part_8},
|
||||
_noise_thresh_11,
|
||||
|
||||
_psy_ath_floater_8,
|
||||
_psy_ath_abs_8,
|
||||
|
||||
_psy_lowpass_11,
|
||||
|
||||
_psy_global_44,
|
||||
_global_mapping_8,
|
||||
_psy_stereo_modes_8,
|
||||
|
||||
_floor_books,
|
||||
_floor,
|
||||
1,
|
||||
_floor_mapping_11,
|
||||
|
||||
_mapres_template_8_stereo
|
||||
};
|
||||
|
||||
static const ve_setup_data_template ve_setup_11_uncoupled={
|
||||
2,
|
||||
rate_mapping_11_uncoupled,
|
||||
quality_mapping_11,
|
||||
-1,
|
||||
9000,
|
||||
15000,
|
||||
|
||||
blocksize_11,
|
||||
blocksize_11,
|
||||
|
||||
_psy_tone_masteratt_11,
|
||||
_psy_tone_0dB,
|
||||
_psy_tone_suppress,
|
||||
|
||||
_vp_tonemask_adj_11,
|
||||
NULL,
|
||||
_vp_tonemask_adj_11,
|
||||
|
||||
_psy_noiseguards_8,
|
||||
_psy_noisebias_11,
|
||||
_psy_noisebias_11,
|
||||
NULL,
|
||||
NULL,
|
||||
_psy_noise_suppress,
|
||||
|
||||
_psy_compand_8,
|
||||
_psy_compand_8_mapping,
|
||||
NULL,
|
||||
|
||||
{_noise_start_8,_noise_start_8},
|
||||
{_noise_part_8,_noise_part_8},
|
||||
_noise_thresh_11,
|
||||
|
||||
_psy_ath_floater_8,
|
||||
_psy_ath_abs_8,
|
||||
|
||||
_psy_lowpass_11,
|
||||
|
||||
_psy_global_44,
|
||||
_global_mapping_8,
|
||||
_psy_stereo_modes_8,
|
||||
|
||||
_floor_books,
|
||||
_floor,
|
||||
1,
|
||||
_floor_mapping_11,
|
||||
|
||||
_mapres_template_8_uncoupled
|
||||
};
|
@ -1,153 +0,0 @@
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: 16kHz settings
|
||||
last mod: $Id: setup_16.h 16894 2010-02-12 20:32:12Z xiphmont $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
#include "psych_16.h"
|
||||
#include "residue_16.h"
|
||||
|
||||
static const int blocksize_16_short[3]={
|
||||
1024,512,512
|
||||
};
|
||||
static const int blocksize_16_long[3]={
|
||||
1024,1024,1024
|
||||
};
|
||||
|
||||
static const int _floor_mapping_16a[]={
|
||||
9,3,3
|
||||
};
|
||||
static const int _floor_mapping_16b[]={
|
||||
9,9,9
|
||||
};
|
||||
static const int *_floor_mapping_16[]={
|
||||
_floor_mapping_16a,
|
||||
_floor_mapping_16b
|
||||
};
|
||||
|
||||
static const double rate_mapping_16[4]={
|
||||
12000.,20000.,44000.,86000.
|
||||
};
|
||||
|
||||
static const double rate_mapping_16_uncoupled[4]={
|
||||
16000.,28000.,64000.,100000.
|
||||
};
|
||||
|
||||
static const double _global_mapping_16[4]={ 1., 2., 3., 4. };
|
||||
|
||||
static const double quality_mapping_16[4]={ -.1,.05,.5,1. };
|
||||
|
||||
static const double _psy_compand_16_mapping[4]={ 0., .8, 1., 1.};
|
||||
|
||||
static const ve_setup_data_template ve_setup_16_stereo={
|
||||
3,
|
||||
rate_mapping_16,
|
||||
quality_mapping_16,
|
||||
2,
|
||||
15000,
|
||||
19000,
|
||||
|
||||
blocksize_16_short,
|
||||
blocksize_16_long,
|
||||
|
||||
_psy_tone_masteratt_16,
|
||||
_psy_tone_0dB,
|
||||
_psy_tone_suppress,
|
||||
|
||||
_vp_tonemask_adj_16,
|
||||
_vp_tonemask_adj_16,
|
||||
_vp_tonemask_adj_16,
|
||||
|
||||
_psy_noiseguards_16,
|
||||
_psy_noisebias_16_impulse,
|
||||
_psy_noisebias_16_short,
|
||||
_psy_noisebias_16_short,
|
||||
_psy_noisebias_16,
|
||||
_psy_noise_suppress,
|
||||
|
||||
_psy_compand_8,
|
||||
_psy_compand_16_mapping,
|
||||
_psy_compand_16_mapping,
|
||||
|
||||
{_noise_start_16,_noise_start_16},
|
||||
{ _noise_part_16, _noise_part_16},
|
||||
_noise_thresh_16,
|
||||
|
||||
_psy_ath_floater_16,
|
||||
_psy_ath_abs_16,
|
||||
|
||||
_psy_lowpass_16,
|
||||
|
||||
_psy_global_44,
|
||||
_global_mapping_16,
|
||||
_psy_stereo_modes_16,
|
||||
|
||||
_floor_books,
|
||||
_floor,
|
||||
2,
|
||||
_floor_mapping_16,
|
||||
|
||||
_mapres_template_16_stereo
|
||||
};
|
||||
|
||||
static const ve_setup_data_template ve_setup_16_uncoupled={
|
||||
3,
|
||||
rate_mapping_16_uncoupled,
|
||||
quality_mapping_16,
|
||||
-1,
|
||||
15000,
|
||||
19000,
|
||||
|
||||
blocksize_16_short,
|
||||
blocksize_16_long,
|
||||
|
||||
_psy_tone_masteratt_16,
|
||||
_psy_tone_0dB,
|
||||
_psy_tone_suppress,
|
||||
|
||||
_vp_tonemask_adj_16,
|
||||
_vp_tonemask_adj_16,
|
||||
_vp_tonemask_adj_16,
|
||||
|
||||
_psy_noiseguards_16,
|
||||
_psy_noisebias_16_impulse,
|
||||
_psy_noisebias_16_short,
|
||||
_psy_noisebias_16_short,
|
||||
_psy_noisebias_16,
|
||||
_psy_noise_suppress,
|
||||
|
||||
_psy_compand_8,
|
||||
_psy_compand_16_mapping,
|
||||
_psy_compand_16_mapping,
|
||||
|
||||
{_noise_start_16,_noise_start_16},
|
||||
{ _noise_part_16, _noise_part_16},
|
||||
_noise_thresh_16,
|
||||
|
||||
_psy_ath_floater_16,
|
||||
_psy_ath_abs_16,
|
||||
|
||||
_psy_lowpass_16,
|
||||
|
||||
_psy_global_44,
|
||||
_global_mapping_16,
|
||||
_psy_stereo_modes_16,
|
||||
|
||||
_floor_books,
|
||||
_floor,
|
||||
2,
|
||||
_floor_mapping_16,
|
||||
|
||||
_mapres_template_16_uncoupled
|
||||
};
|
@ -1,128 +0,0 @@
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: 22kHz settings
|
||||
last mod: $Id: setup_22.h 17026 2010-03-25 05:00:27Z xiphmont $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
static const double rate_mapping_22[4]={
|
||||
15000.,20000.,44000.,86000.
|
||||
};
|
||||
|
||||
static const double rate_mapping_22_uncoupled[4]={
|
||||
16000.,28000.,50000.,90000.
|
||||
};
|
||||
|
||||
static const double _psy_lowpass_22[4]={9.5,11.,30.,99.};
|
||||
|
||||
static const ve_setup_data_template ve_setup_22_stereo={
|
||||
3,
|
||||
rate_mapping_22,
|
||||
quality_mapping_16,
|
||||
2,
|
||||
19000,
|
||||
26000,
|
||||
|
||||
blocksize_16_short,
|
||||
blocksize_16_long,
|
||||
|
||||
_psy_tone_masteratt_16,
|
||||
_psy_tone_0dB,
|
||||
_psy_tone_suppress,
|
||||
|
||||
_vp_tonemask_adj_16,
|
||||
_vp_tonemask_adj_16,
|
||||
_vp_tonemask_adj_16,
|
||||
|
||||
_psy_noiseguards_16,
|
||||
_psy_noisebias_16_impulse,
|
||||
_psy_noisebias_16_short,
|
||||
_psy_noisebias_16_short,
|
||||
_psy_noisebias_16,
|
||||
_psy_noise_suppress,
|
||||
|
||||
_psy_compand_8,
|
||||
_psy_compand_16_mapping,
|
||||
_psy_compand_16_mapping,
|
||||
|
||||
{_noise_start_16,_noise_start_16},
|
||||
{ _noise_part_16, _noise_part_16},
|
||||
_noise_thresh_16,
|
||||
|
||||
_psy_ath_floater_16,
|
||||
_psy_ath_abs_16,
|
||||
|
||||
_psy_lowpass_22,
|
||||
|
||||
_psy_global_44,
|
||||
_global_mapping_16,
|
||||
_psy_stereo_modes_16,
|
||||
|
||||
_floor_books,
|
||||
_floor,
|
||||
2,
|
||||
_floor_mapping_16,
|
||||
|
||||
_mapres_template_16_stereo
|
||||
};
|
||||
|
||||
static const ve_setup_data_template ve_setup_22_uncoupled={
|
||||
3,
|
||||
rate_mapping_22_uncoupled,
|
||||
quality_mapping_16,
|
||||
-1,
|
||||
19000,
|
||||
26000,
|
||||
|
||||
blocksize_16_short,
|
||||
blocksize_16_long,
|
||||
|
||||
_psy_tone_masteratt_16,
|
||||
_psy_tone_0dB,
|
||||
_psy_tone_suppress,
|
||||
|
||||
_vp_tonemask_adj_16,
|
||||
_vp_tonemask_adj_16,
|
||||
_vp_tonemask_adj_16,
|
||||
|
||||
_psy_noiseguards_16,
|
||||
_psy_noisebias_16_impulse,
|
||||
_psy_noisebias_16_short,
|
||||
_psy_noisebias_16_short,
|
||||
_psy_noisebias_16,
|
||||
_psy_noise_suppress,
|
||||
|
||||
_psy_compand_8,
|
||||
_psy_compand_16_mapping,
|
||||
_psy_compand_16_mapping,
|
||||
|
||||
{_noise_start_16,_noise_start_16},
|
||||
{ _noise_part_16, _noise_part_16},
|
||||
_noise_thresh_16,
|
||||
|
||||
_psy_ath_floater_16,
|
||||
_psy_ath_abs_16,
|
||||
|
||||
_psy_lowpass_22,
|
||||
|
||||
_psy_global_44,
|
||||
_global_mapping_16,
|
||||
_psy_stereo_modes_16,
|
||||
|
||||
_floor_books,
|
||||
_floor,
|
||||
2,
|
||||
_floor_mapping_16,
|
||||
|
||||
_mapres_template_16_uncoupled
|
||||
};
|
@ -1,132 +0,0 @@
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: toplevel settings for 32kHz
|
||||
last mod: $Id: setup_32.h 16894 2010-02-12 20:32:12Z xiphmont $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
static const double rate_mapping_32[12]={
|
||||
18000.,28000.,35000.,45000.,56000.,60000.,
|
||||
75000.,90000.,100000.,115000.,150000.,190000.,
|
||||
};
|
||||
|
||||
static const double rate_mapping_32_un[12]={
|
||||
30000.,42000.,52000.,64000.,72000.,78000.,
|
||||
86000.,92000.,110000.,120000.,140000.,190000.,
|
||||
};
|
||||
|
||||
static const double _psy_lowpass_32[12]={
|
||||
12.3,13.,13.,14.,15.,99.,99.,99.,99.,99.,99.,99.
|
||||
};
|
||||
|
||||
static const ve_setup_data_template ve_setup_32_stereo={
|
||||
11,
|
||||
rate_mapping_32,
|
||||
quality_mapping_44,
|
||||
2,
|
||||
26000,
|
||||
40000,
|
||||
|
||||
blocksize_short_44,
|
||||
blocksize_long_44,
|
||||
|
||||
_psy_tone_masteratt_44,
|
||||
_psy_tone_0dB,
|
||||
_psy_tone_suppress,
|
||||
|
||||
_vp_tonemask_adj_otherblock,
|
||||
_vp_tonemask_adj_longblock,
|
||||
_vp_tonemask_adj_otherblock,
|
||||
|
||||
_psy_noiseguards_44,
|
||||
_psy_noisebias_impulse,
|
||||
_psy_noisebias_padding,
|
||||
_psy_noisebias_trans,
|
||||
_psy_noisebias_long,
|
||||
_psy_noise_suppress,
|
||||
|
||||
_psy_compand_44,
|
||||
_psy_compand_short_mapping,
|
||||
_psy_compand_long_mapping,
|
||||
|
||||
{_noise_start_short_44,_noise_start_long_44},
|
||||
{_noise_part_short_44,_noise_part_long_44},
|
||||
_noise_thresh_44,
|
||||
|
||||
_psy_ath_floater,
|
||||
_psy_ath_abs,
|
||||
|
||||
_psy_lowpass_32,
|
||||
|
||||
_psy_global_44,
|
||||
_global_mapping_44,
|
||||
_psy_stereo_modes_44,
|
||||
|
||||
_floor_books,
|
||||
_floor,
|
||||
2,
|
||||
_floor_mapping_44,
|
||||
|
||||
_mapres_template_44_stereo
|
||||
};
|
||||
|
||||
static const ve_setup_data_template ve_setup_32_uncoupled={
|
||||
11,
|
||||
rate_mapping_32_un,
|
||||
quality_mapping_44,
|
||||
-1,
|
||||
26000,
|
||||
40000,
|
||||
|
||||
blocksize_short_44,
|
||||
blocksize_long_44,
|
||||
|
||||
_psy_tone_masteratt_44,
|
||||
_psy_tone_0dB,
|
||||
_psy_tone_suppress,
|
||||
|
||||
_vp_tonemask_adj_otherblock,
|
||||
_vp_tonemask_adj_longblock,
|
||||
_vp_tonemask_adj_otherblock,
|
||||
|
||||
_psy_noiseguards_44,
|
||||
_psy_noisebias_impulse,
|
||||
_psy_noisebias_padding,
|
||||
_psy_noisebias_trans,
|
||||
_psy_noisebias_long,
|
||||
_psy_noise_suppress,
|
||||
|
||||
_psy_compand_44,
|
||||
_psy_compand_short_mapping,
|
||||
_psy_compand_long_mapping,
|
||||
|
||||
{_noise_start_short_44,_noise_start_long_44},
|
||||
{_noise_part_short_44,_noise_part_long_44},
|
||||
_noise_thresh_44,
|
||||
|
||||
_psy_ath_floater,
|
||||
_psy_ath_abs,
|
||||
|
||||
_psy_lowpass_32,
|
||||
|
||||
_psy_global_44,
|
||||
_global_mapping_44,
|
||||
NULL,
|
||||
|
||||
_floor_books,
|
||||
_floor,
|
||||
2,
|
||||
_floor_mapping_44,
|
||||
|
||||
_mapres_template_44_uncoupled
|
||||
};
|
@ -1,117 +0,0 @@
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: toplevel settings for 44.1/48kHz
|
||||
last mod: $Id: setup_44.h 16962 2010-03-11 07:30:34Z xiphmont $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
#include "modes/floor_all.h"
|
||||
#include "modes/residue_44.h"
|
||||
#include "modes/psych_44.h"
|
||||
|
||||
static const double rate_mapping_44_stereo[12]={
|
||||
22500.,32000.,40000.,48000.,56000.,64000.,
|
||||
80000.,96000.,112000.,128000.,160000.,250001.
|
||||
};
|
||||
|
||||
static const double quality_mapping_44[12]={
|
||||
-.1,.0,.1,.2,.3,.4,.5,.6,.7,.8,.9,1.0
|
||||
};
|
||||
|
||||
static const int blocksize_short_44[11]={
|
||||
512,256,256,256,256,256,256,256,256,256,256
|
||||
};
|
||||
static const int blocksize_long_44[11]={
|
||||
4096,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048
|
||||
};
|
||||
|
||||
static const double _psy_compand_short_mapping[12]={
|
||||
0.5, 1., 1., 1.3, 1.6, 2., 2., 2., 2., 2., 2., 2.
|
||||
};
|
||||
static const double _psy_compand_long_mapping[12]={
|
||||
3.5, 4., 4., 4.3, 4.6, 5., 5., 5., 5., 5., 5., 5.
|
||||
};
|
||||
|
||||
static const double _global_mapping_44[12]={
|
||||
/* 1., 1., 1.5, 2., 2., 2.5, 2.7, 3.0, 3.5, 4., 4. */
|
||||
0., 1., 1., 1.5, 2., 2., 2.5, 2.7, 3.0, 3.7, 4., 4.
|
||||
};
|
||||
|
||||
static const int _floor_mapping_44a[11]={
|
||||
1,0,0,2,2,4,5,5,5,5,5
|
||||
};
|
||||
|
||||
static const int _floor_mapping_44b[11]={
|
||||
8,7,7,7,7,7,7,7,7,7,7
|
||||
};
|
||||
|
||||
static const int _floor_mapping_44c[11]={
|
||||
10,10,10,10,10,10,10,10,10,10,10
|
||||
};
|
||||
|
||||
static const int *_floor_mapping_44[]={
|
||||
_floor_mapping_44a,
|
||||
_floor_mapping_44b,
|
||||
_floor_mapping_44c,
|
||||
};
|
||||
|
||||
static const ve_setup_data_template ve_setup_44_stereo={
|
||||
11,
|
||||
rate_mapping_44_stereo,
|
||||
quality_mapping_44,
|
||||
2,
|
||||
40000,
|
||||
50000,
|
||||
|
||||
blocksize_short_44,
|
||||
blocksize_long_44,
|
||||
|
||||
_psy_tone_masteratt_44,
|
||||
_psy_tone_0dB,
|
||||
_psy_tone_suppress,
|
||||
|
||||
_vp_tonemask_adj_otherblock,
|
||||
_vp_tonemask_adj_longblock,
|
||||
_vp_tonemask_adj_otherblock,
|
||||
|
||||
_psy_noiseguards_44,
|
||||
_psy_noisebias_impulse,
|
||||
_psy_noisebias_padding,
|
||||
_psy_noisebias_trans,
|
||||
_psy_noisebias_long,
|
||||
_psy_noise_suppress,
|
||||
|
||||
_psy_compand_44,
|
||||
_psy_compand_short_mapping,
|
||||
_psy_compand_long_mapping,
|
||||
|
||||
{_noise_start_short_44,_noise_start_long_44},
|
||||
{_noise_part_short_44,_noise_part_long_44},
|
||||
_noise_thresh_44,
|
||||
|
||||
_psy_ath_floater,
|
||||
_psy_ath_abs,
|
||||
|
||||
_psy_lowpass_44,
|
||||
|
||||
_psy_global_44,
|
||||
_global_mapping_44,
|
||||
_psy_stereo_modes_44,
|
||||
|
||||
_floor_books,
|
||||
_floor,
|
||||
2,
|
||||
_floor_mapping_44,
|
||||
|
||||
_mapres_template_44_stereo
|
||||
};
|
@ -1,74 +0,0 @@
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2010 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: toplevel settings for 44.1/48kHz 5.1 surround modes
|
||||
last mod: $Id: setup_44p51.h 19013 2013-11-12 04:04:50Z giles $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
#include "modes/residue_44p51.h"
|
||||
|
||||
static const double rate_mapping_44p51[12]={
|
||||
14000.,20000.,28000.,38000.,46000.,54000.,
|
||||
75000.,96000.,120000.,140000.,180000.,240001.
|
||||
};
|
||||
|
||||
static const ve_setup_data_template ve_setup_44_51={
|
||||
11,
|
||||
rate_mapping_44p51,
|
||||
quality_mapping_44,
|
||||
6,
|
||||
40000,
|
||||
70000,
|
||||
|
||||
blocksize_short_44,
|
||||
blocksize_long_44,
|
||||
|
||||
_psy_tone_masteratt_44,
|
||||
_psy_tone_0dB,
|
||||
_psy_tone_suppress,
|
||||
|
||||
_vp_tonemask_adj_otherblock,
|
||||
_vp_tonemask_adj_longblock,
|
||||
_vp_tonemask_adj_otherblock,
|
||||
|
||||
_psy_noiseguards_44,
|
||||
_psy_noisebias_impulse,
|
||||
_psy_noisebias_padding,
|
||||
_psy_noisebias_trans,
|
||||
_psy_noisebias_long,
|
||||
_psy_noise_suppress,
|
||||
|
||||
_psy_compand_44,
|
||||
_psy_compand_short_mapping,
|
||||
_psy_compand_long_mapping,
|
||||
|
||||
{_noise_start_short_44,_noise_start_long_44},
|
||||
{_noise_part_short_44,_noise_part_long_44},
|
||||
_noise_thresh_44,
|
||||
|
||||
_psy_ath_floater,
|
||||
_psy_ath_abs,
|
||||
|
||||
_psy_lowpass_44,
|
||||
|
||||
_psy_global_44,
|
||||
_global_mapping_44,
|
||||
_psy_stereo_modes_44,
|
||||
|
||||
_floor_books,
|
||||
_floor,
|
||||
3,
|
||||
_floor_mapping_44,
|
||||
|
||||
_mapres_template_44_51
|
||||
};
|
@ -1,74 +0,0 @@
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: toplevel settings for 44.1/48kHz uncoupled modes
|
||||
last mod: $Id: setup_44u.h 16962 2010-03-11 07:30:34Z xiphmont $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
#include "modes/residue_44u.h"
|
||||
|
||||
static const double rate_mapping_44_un[12]={
|
||||
32000.,48000.,60000.,70000.,80000.,86000.,
|
||||
96000.,110000.,120000.,140000.,160000.,240001.
|
||||
};
|
||||
|
||||
static const ve_setup_data_template ve_setup_44_uncoupled={
|
||||
11,
|
||||
rate_mapping_44_un,
|
||||
quality_mapping_44,
|
||||
-1,
|
||||
40000,
|
||||
50000,
|
||||
|
||||
blocksize_short_44,
|
||||
blocksize_long_44,
|
||||
|
||||
_psy_tone_masteratt_44,
|
||||
_psy_tone_0dB,
|
||||
_psy_tone_suppress,
|
||||
|
||||
_vp_tonemask_adj_otherblock,
|
||||
_vp_tonemask_adj_longblock,
|
||||
_vp_tonemask_adj_otherblock,
|
||||
|
||||
_psy_noiseguards_44,
|
||||
_psy_noisebias_impulse,
|
||||
_psy_noisebias_padding,
|
||||
_psy_noisebias_trans,
|
||||
_psy_noisebias_long,
|
||||
_psy_noise_suppress,
|
||||
|
||||
_psy_compand_44,
|
||||
_psy_compand_short_mapping,
|
||||
_psy_compand_long_mapping,
|
||||
|
||||
{_noise_start_short_44,_noise_start_long_44},
|
||||
{_noise_part_short_44,_noise_part_long_44},
|
||||
_noise_thresh_44,
|
||||
|
||||
_psy_ath_floater,
|
||||
_psy_ath_abs,
|
||||
|
||||
_psy_lowpass_44,
|
||||
|
||||
_psy_global_44,
|
||||
_global_mapping_44,
|
||||
_psy_stereo_modes_44,
|
||||
|
||||
_floor_books,
|
||||
_floor,
|
||||
2,
|
||||
_floor_mapping_44,
|
||||
|
||||
_mapres_template_44_uncoupled
|
||||
};
|
@ -1,149 +0,0 @@
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: 8kHz settings
|
||||
last mod: $Id: setup_8.h 16894 2010-02-12 20:32:12Z xiphmont $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
#include "psych_8.h"
|
||||
#include "residue_8.h"
|
||||
|
||||
static const int blocksize_8[2]={
|
||||
512,512
|
||||
};
|
||||
|
||||
static const int _floor_mapping_8a[]={
|
||||
6,6
|
||||
};
|
||||
|
||||
static const int *_floor_mapping_8[]={
|
||||
_floor_mapping_8a
|
||||
};
|
||||
|
||||
static const double rate_mapping_8[3]={
|
||||
6000.,9000.,32000.,
|
||||
};
|
||||
|
||||
static const double rate_mapping_8_uncoupled[3]={
|
||||
8000.,14000.,42000.,
|
||||
};
|
||||
|
||||
static const double quality_mapping_8[3]={
|
||||
-.1,.0,1.
|
||||
};
|
||||
|
||||
static const double _psy_compand_8_mapping[3]={ 0., 1., 1.};
|
||||
|
||||
static const double _global_mapping_8[3]={ 1., 2., 3. };
|
||||
|
||||
static const ve_setup_data_template ve_setup_8_stereo={
|
||||
2,
|
||||
rate_mapping_8,
|
||||
quality_mapping_8,
|
||||
2,
|
||||
8000,
|
||||
9000,
|
||||
|
||||
blocksize_8,
|
||||
blocksize_8,
|
||||
|
||||
_psy_tone_masteratt_8,
|
||||
_psy_tone_0dB,
|
||||
_psy_tone_suppress,
|
||||
|
||||
_vp_tonemask_adj_8,
|
||||
NULL,
|
||||
_vp_tonemask_adj_8,
|
||||
|
||||
_psy_noiseguards_8,
|
||||
_psy_noisebias_8,
|
||||
_psy_noisebias_8,
|
||||
NULL,
|
||||
NULL,
|
||||
_psy_noise_suppress,
|
||||
|
||||
_psy_compand_8,
|
||||
_psy_compand_8_mapping,
|
||||
NULL,
|
||||
|
||||
{_noise_start_8,_noise_start_8},
|
||||
{_noise_part_8,_noise_part_8},
|
||||
_noise_thresh_5only,
|
||||
|
||||
_psy_ath_floater_8,
|
||||
_psy_ath_abs_8,
|
||||
|
||||
_psy_lowpass_8,
|
||||
|
||||
_psy_global_44,
|
||||
_global_mapping_8,
|
||||
_psy_stereo_modes_8,
|
||||
|
||||
_floor_books,
|
||||
_floor,
|
||||
1,
|
||||
_floor_mapping_8,
|
||||
|
||||
_mapres_template_8_stereo
|
||||
};
|
||||
|
||||
static const ve_setup_data_template ve_setup_8_uncoupled={
|
||||
2,
|
||||
rate_mapping_8_uncoupled,
|
||||
quality_mapping_8,
|
||||
-1,
|
||||
8000,
|
||||
9000,
|
||||
|
||||
blocksize_8,
|
||||
blocksize_8,
|
||||
|
||||
_psy_tone_masteratt_8,
|
||||
_psy_tone_0dB,
|
||||
_psy_tone_suppress,
|
||||
|
||||
_vp_tonemask_adj_8,
|
||||
NULL,
|
||||
_vp_tonemask_adj_8,
|
||||
|
||||
_psy_noiseguards_8,
|
||||
_psy_noisebias_8,
|
||||
_psy_noisebias_8,
|
||||
NULL,
|
||||
NULL,
|
||||
_psy_noise_suppress,
|
||||
|
||||
_psy_compand_8,
|
||||
_psy_compand_8_mapping,
|
||||
NULL,
|
||||
|
||||
{_noise_start_8,_noise_start_8},
|
||||
{_noise_part_8,_noise_part_8},
|
||||
_noise_thresh_5only,
|
||||
|
||||
_psy_ath_floater_8,
|
||||
_psy_ath_abs_8,
|
||||
|
||||
_psy_lowpass_8,
|
||||
|
||||
_psy_global_44,
|
||||
_global_mapping_8,
|
||||
_psy_stereo_modes_8,
|
||||
|
||||
_floor_books,
|
||||
_floor,
|
||||
1,
|
||||
_floor_mapping_8,
|
||||
|
||||
_mapres_template_8_uncoupled
|
||||
};
|
@ -1,225 +0,0 @@
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: catch-all toplevel settings for q modes only
|
||||
last mod: $Id: setup_X.h 16894 2010-02-12 20:32:12Z xiphmont $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
static const double rate_mapping_X[12]={
|
||||
-1.,-1.,-1.,-1.,-1.,-1.,
|
||||
-1.,-1.,-1.,-1.,-1.,-1.
|
||||
};
|
||||
|
||||
static const ve_setup_data_template ve_setup_X_stereo={
|
||||
11,
|
||||
rate_mapping_X,
|
||||
quality_mapping_44,
|
||||
2,
|
||||
50000,
|
||||
200000,
|
||||
|
||||
blocksize_short_44,
|
||||
blocksize_long_44,
|
||||
|
||||
_psy_tone_masteratt_44,
|
||||
_psy_tone_0dB,
|
||||
_psy_tone_suppress,
|
||||
|
||||
_vp_tonemask_adj_otherblock,
|
||||
_vp_tonemask_adj_longblock,
|
||||
_vp_tonemask_adj_otherblock,
|
||||
|
||||
_psy_noiseguards_44,
|
||||
_psy_noisebias_impulse,
|
||||
_psy_noisebias_padding,
|
||||
_psy_noisebias_trans,
|
||||
_psy_noisebias_long,
|
||||
_psy_noise_suppress,
|
||||
|
||||
_psy_compand_44,
|
||||
_psy_compand_short_mapping,
|
||||
_psy_compand_long_mapping,
|
||||
|
||||
{_noise_start_short_44,_noise_start_long_44},
|
||||
{_noise_part_short_44,_noise_part_long_44},
|
||||
_noise_thresh_44,
|
||||
|
||||
_psy_ath_floater,
|
||||
_psy_ath_abs,
|
||||
|
||||
_psy_lowpass_44,
|
||||
|
||||
_psy_global_44,
|
||||
_global_mapping_44,
|
||||
_psy_stereo_modes_44,
|
||||
|
||||
_floor_books,
|
||||
_floor,
|
||||
2,
|
||||
_floor_mapping_44,
|
||||
|
||||
_mapres_template_44_stereo
|
||||
};
|
||||
|
||||
static const ve_setup_data_template ve_setup_X_uncoupled={
|
||||
11,
|
||||
rate_mapping_X,
|
||||
quality_mapping_44,
|
||||
-1,
|
||||
50000,
|
||||
200000,
|
||||
|
||||
blocksize_short_44,
|
||||
blocksize_long_44,
|
||||
|
||||
_psy_tone_masteratt_44,
|
||||
_psy_tone_0dB,
|
||||
_psy_tone_suppress,
|
||||
|
||||
_vp_tonemask_adj_otherblock,
|
||||
_vp_tonemask_adj_longblock,
|
||||
_vp_tonemask_adj_otherblock,
|
||||
|
||||
_psy_noiseguards_44,
|
||||
_psy_noisebias_impulse,
|
||||
_psy_noisebias_padding,
|
||||
_psy_noisebias_trans,
|
||||
_psy_noisebias_long,
|
||||
_psy_noise_suppress,
|
||||
|
||||
_psy_compand_44,
|
||||
_psy_compand_short_mapping,
|
||||
_psy_compand_long_mapping,
|
||||
|
||||
{_noise_start_short_44,_noise_start_long_44},
|
||||
{_noise_part_short_44,_noise_part_long_44},
|
||||
_noise_thresh_44,
|
||||
|
||||
_psy_ath_floater,
|
||||
_psy_ath_abs,
|
||||
|
||||
_psy_lowpass_44,
|
||||
|
||||
_psy_global_44,
|
||||
_global_mapping_44,
|
||||
NULL,
|
||||
|
||||
_floor_books,
|
||||
_floor,
|
||||
2,
|
||||
_floor_mapping_44,
|
||||
|
||||
_mapres_template_44_uncoupled
|
||||
};
|
||||
|
||||
static const ve_setup_data_template ve_setup_XX_stereo={
|
||||
2,
|
||||
rate_mapping_X,
|
||||
quality_mapping_8,
|
||||
2,
|
||||
0,
|
||||
8000,
|
||||
|
||||
blocksize_8,
|
||||
blocksize_8,
|
||||
|
||||
_psy_tone_masteratt_8,
|
||||
_psy_tone_0dB,
|
||||
_psy_tone_suppress,
|
||||
|
||||
_vp_tonemask_adj_8,
|
||||
NULL,
|
||||
_vp_tonemask_adj_8,
|
||||
|
||||
_psy_noiseguards_8,
|
||||
_psy_noisebias_8,
|
||||
_psy_noisebias_8,
|
||||
NULL,
|
||||
NULL,
|
||||
_psy_noise_suppress,
|
||||
|
||||
_psy_compand_8,
|
||||
_psy_compand_8_mapping,
|
||||
NULL,
|
||||
|
||||
{_noise_start_8,_noise_start_8},
|
||||
{_noise_part_8,_noise_part_8},
|
||||
_noise_thresh_5only,
|
||||
|
||||
_psy_ath_floater_8,
|
||||
_psy_ath_abs_8,
|
||||
|
||||
_psy_lowpass_8,
|
||||
|
||||
_psy_global_44,
|
||||
_global_mapping_8,
|
||||
_psy_stereo_modes_8,
|
||||
|
||||
_floor_books,
|
||||
_floor,
|
||||
1,
|
||||
_floor_mapping_8,
|
||||
|
||||
_mapres_template_8_stereo
|
||||
};
|
||||
|
||||
static const ve_setup_data_template ve_setup_XX_uncoupled={
|
||||
2,
|
||||
rate_mapping_X,
|
||||
quality_mapping_8,
|
||||
-1,
|
||||
0,
|
||||
8000,
|
||||
|
||||
blocksize_8,
|
||||
blocksize_8,
|
||||
|
||||
_psy_tone_masteratt_8,
|
||||
_psy_tone_0dB,
|
||||
_psy_tone_suppress,
|
||||
|
||||
_vp_tonemask_adj_8,
|
||||
NULL,
|
||||
_vp_tonemask_adj_8,
|
||||
|
||||
_psy_noiseguards_8,
|
||||
_psy_noisebias_8,
|
||||
_psy_noisebias_8,
|
||||
NULL,
|
||||
NULL,
|
||||
_psy_noise_suppress,
|
||||
|
||||
_psy_compand_8,
|
||||
_psy_compand_8_mapping,
|
||||
NULL,
|
||||
|
||||
{_noise_start_8,_noise_start_8},
|
||||
{_noise_part_8,_noise_part_8},
|
||||
_noise_thresh_5only,
|
||||
|
||||
_psy_ath_floater_8,
|
||||
_psy_ath_abs_8,
|
||||
|
||||
_psy_lowpass_8,
|
||||
|
||||
_psy_global_44,
|
||||
_global_mapping_8,
|
||||
_psy_stereo_modes_8,
|
||||
|
||||
_floor_books,
|
||||
_floor,
|
||||
1,
|
||||
_floor_mapping_8,
|
||||
|
||||
_mapres_template_8_uncoupled
|
||||
};
|
@ -1,191 +0,0 @@
|
||||
#ifndef _OS_H
|
||||
#define _OS_H
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2015 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: #ifdef jail to whip a few platforms into the UNIX ideal.
|
||||
last mod: $Id: os.h 19457 2015-03-03 00:15:29Z giles $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#include <math.h>
|
||||
#include <ogg/os_types.h>
|
||||
|
||||
#include "misc.h"
|
||||
|
||||
#ifndef _V_IFDEFJAIL_H_
|
||||
# define _V_IFDEFJAIL_H_
|
||||
|
||||
# ifdef __GNUC__
|
||||
# define STIN static __inline__
|
||||
# elif _WIN32
|
||||
# define STIN static __inline
|
||||
# else
|
||||
# define STIN static
|
||||
# endif
|
||||
|
||||
#ifdef DJGPP
|
||||
# define rint(x) (floor((x)+0.5f))
|
||||
#endif
|
||||
|
||||
#ifndef M_PI
|
||||
# define M_PI (3.1415926536f)
|
||||
#endif
|
||||
|
||||
#if defined(_WIN32) && !defined(__SYMBIAN32__)
|
||||
# include <malloc.h>
|
||||
# define rint(x) (floor((x)+0.5f))
|
||||
# define NO_FLOAT_MATH_LIB
|
||||
# define FAST_HYPOT(a, b) sqrt((a)*(a) + (b)*(b))
|
||||
#endif
|
||||
|
||||
#if defined(__SYMBIAN32__) && defined(__WINS__)
|
||||
void *_alloca(size_t size);
|
||||
# define alloca _alloca
|
||||
#endif
|
||||
|
||||
#ifndef FAST_HYPOT
|
||||
# define FAST_HYPOT hypot
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_ALLOCA_H
|
||||
# include <alloca.h>
|
||||
#endif
|
||||
|
||||
#ifdef USE_MEMORY_H
|
||||
# include <memory.h>
|
||||
#endif
|
||||
|
||||
#ifndef min
|
||||
# define min(x,y) ((x)>(y)?(y):(x))
|
||||
#endif
|
||||
|
||||
#ifndef max
|
||||
# define max(x,y) ((x)<(y)?(y):(x))
|
||||
#endif
|
||||
|
||||
|
||||
/* Special i386 GCC implementation */
|
||||
#if defined(__i386__) && defined(__GNUC__) && !defined(__BEOS__)
|
||||
# define VORBIS_FPU_CONTROL
|
||||
/* both GCC and MSVC are kinda stupid about rounding/casting to int.
|
||||
Because of encapsulation constraints (GCC can't see inside the asm
|
||||
block and so we end up doing stupid things like a store/load that
|
||||
is collectively a noop), we do it this way */
|
||||
|
||||
/* we must set up the fpu before this works!! */
|
||||
|
||||
typedef ogg_int16_t vorbis_fpu_control;
|
||||
|
||||
static inline void vorbis_fpu_setround(vorbis_fpu_control *fpu){
|
||||
ogg_int16_t ret;
|
||||
ogg_int16_t temp;
|
||||
__asm__ __volatile__("fnstcw %0\n\t"
|
||||
"movw %0,%%dx\n\t"
|
||||
"andw $62463,%%dx\n\t"
|
||||
"movw %%dx,%1\n\t"
|
||||
"fldcw %1\n\t":"=m"(ret):"m"(temp): "dx");
|
||||
*fpu=ret;
|
||||
}
|
||||
|
||||
static inline void vorbis_fpu_restore(vorbis_fpu_control fpu){
|
||||
__asm__ __volatile__("fldcw %0":: "m"(fpu));
|
||||
}
|
||||
|
||||
/* assumes the FPU is in round mode! */
|
||||
static inline int vorbis_ftoi(double f){ /* yes, double! Otherwise,
|
||||
we get extra fst/fld to
|
||||
truncate precision */
|
||||
int i;
|
||||
__asm__("fistl %0": "=m"(i) : "t"(f));
|
||||
return(i);
|
||||
}
|
||||
#endif /* Special i386 GCC implementation */
|
||||
|
||||
|
||||
/* MSVC inline assembly. 32 bit only; inline ASM isn't implemented in the
|
||||
* 64 bit compiler and doesn't work on arm. */
|
||||
#if defined(_MSC_VER) && !defined(_WIN64) && \
|
||||
!defined(_WIN32_WCE) && !defined(_M_ARM)
|
||||
# define VORBIS_FPU_CONTROL
|
||||
|
||||
typedef ogg_int16_t vorbis_fpu_control;
|
||||
|
||||
static __inline int vorbis_ftoi(double f){
|
||||
int i;
|
||||
__asm{
|
||||
fld f
|
||||
fistp i
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
||||
static __inline void vorbis_fpu_setround(vorbis_fpu_control *fpu){
|
||||
(void)fpu;
|
||||
}
|
||||
|
||||
static __inline void vorbis_fpu_restore(vorbis_fpu_control fpu){
|
||||
(void)fpu;
|
||||
}
|
||||
|
||||
#endif /* Special MSVC 32 bit implementation */
|
||||
|
||||
|
||||
/* Optimized code path for x86_64 builds. Uses SSE2 intrinsics. This can be
|
||||
done safely because all x86_64 CPUs supports SSE2. */
|
||||
#if (defined(_MSC_VER) && defined(_WIN64)) || (defined(__GNUC__) && defined (__x86_64__))
|
||||
# define VORBIS_FPU_CONTROL
|
||||
|
||||
typedef ogg_int16_t vorbis_fpu_control;
|
||||
|
||||
#include <emmintrin.h>
|
||||
static __inline int vorbis_ftoi(double f){
|
||||
return _mm_cvtsd_si32(_mm_load_sd(&f));
|
||||
}
|
||||
|
||||
static __inline void vorbis_fpu_setround(vorbis_fpu_control *fpu){
|
||||
(void)fpu;
|
||||
}
|
||||
|
||||
static __inline void vorbis_fpu_restore(vorbis_fpu_control fpu){
|
||||
(void)fpu;
|
||||
}
|
||||
|
||||
#endif /* Special MSVC x64 implementation */
|
||||
|
||||
|
||||
/* If no special implementation was found for the current compiler / platform,
|
||||
use the default implementation here: */
|
||||
#ifndef VORBIS_FPU_CONTROL
|
||||
|
||||
typedef int vorbis_fpu_control;
|
||||
|
||||
static int vorbis_ftoi(double f){
|
||||
/* Note: MSVC and GCC (at least on some systems) round towards zero, thus,
|
||||
the floor() call is required to ensure correct roudning of
|
||||
negative numbers */
|
||||
return (int)floor(f+.5);
|
||||
}
|
||||
|
||||
/* We don't have special code for this compiler/arch, so do it the slow way */
|
||||
# define vorbis_fpu_setround(vorbis_fpu_control) {}
|
||||
# define vorbis_fpu_restore(vorbis_fpu_control) {}
|
||||
|
||||
#endif /* default implementation */
|
||||
|
||||
#endif /* _OS_H */
|
File diff suppressed because it is too large
Load Diff
@ -1,154 +0,0 @@
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: random psychoacoustics (not including preecho)
|
||||
last mod: $Id: psy.h 16946 2010-03-03 16:12:40Z xiphmont $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
#ifndef _V_PSY_H_
|
||||
#define _V_PSY_H_
|
||||
#include "smallft.h"
|
||||
|
||||
#include "backends.h"
|
||||
#include "envelope.h"
|
||||
|
||||
#ifndef EHMER_MAX
|
||||
#define EHMER_MAX 56
|
||||
#endif
|
||||
|
||||
/* psychoacoustic setup ********************************************/
|
||||
#define P_BANDS 17 /* 62Hz to 16kHz */
|
||||
#define P_LEVELS 8 /* 30dB to 100dB */
|
||||
#define P_LEVEL_0 30. /* 30 dB */
|
||||
#define P_NOISECURVES 3
|
||||
|
||||
#define NOISE_COMPAND_LEVELS 40
|
||||
typedef struct vorbis_info_psy{
|
||||
int blockflag;
|
||||
|
||||
float ath_adjatt;
|
||||
float ath_maxatt;
|
||||
|
||||
float tone_masteratt[P_NOISECURVES];
|
||||
float tone_centerboost;
|
||||
float tone_decay;
|
||||
float tone_abs_limit;
|
||||
float toneatt[P_BANDS];
|
||||
|
||||
int noisemaskp;
|
||||
float noisemaxsupp;
|
||||
float noisewindowlo;
|
||||
float noisewindowhi;
|
||||
int noisewindowlomin;
|
||||
int noisewindowhimin;
|
||||
int noisewindowfixed;
|
||||
float noiseoff[P_NOISECURVES][P_BANDS];
|
||||
float noisecompand[NOISE_COMPAND_LEVELS];
|
||||
|
||||
float max_curve_dB;
|
||||
|
||||
int normal_p;
|
||||
int normal_start;
|
||||
int normal_partition;
|
||||
double normal_thresh;
|
||||
} vorbis_info_psy;
|
||||
|
||||
typedef struct{
|
||||
int eighth_octave_lines;
|
||||
|
||||
/* for block long/short tuning; encode only */
|
||||
float preecho_thresh[VE_BANDS];
|
||||
float postecho_thresh[VE_BANDS];
|
||||
float stretch_penalty;
|
||||
float preecho_minenergy;
|
||||
|
||||
float ampmax_att_per_sec;
|
||||
|
||||
/* channel coupling config */
|
||||
int coupling_pkHz[PACKETBLOBS];
|
||||
int coupling_pointlimit[2][PACKETBLOBS];
|
||||
int coupling_prepointamp[PACKETBLOBS];
|
||||
int coupling_postpointamp[PACKETBLOBS];
|
||||
int sliding_lowpass[2][PACKETBLOBS];
|
||||
|
||||
} vorbis_info_psy_global;
|
||||
|
||||
typedef struct {
|
||||
float ampmax;
|
||||
int channels;
|
||||
|
||||
vorbis_info_psy_global *gi;
|
||||
int coupling_pointlimit[2][P_NOISECURVES];
|
||||
} vorbis_look_psy_global;
|
||||
|
||||
|
||||
typedef struct {
|
||||
int n;
|
||||
struct vorbis_info_psy *vi;
|
||||
|
||||
float ***tonecurves;
|
||||
float **noiseoffset;
|
||||
|
||||
float *ath;
|
||||
long *octave; /* in n.ocshift format */
|
||||
long *bark;
|
||||
|
||||
long firstoc;
|
||||
long shiftoc;
|
||||
int eighth_octave_lines; /* power of two, please */
|
||||
int total_octave_lines;
|
||||
long rate; /* cache it */
|
||||
|
||||
float m_val; /* Masking compensation value */
|
||||
|
||||
} vorbis_look_psy;
|
||||
|
||||
extern void _vp_psy_init(vorbis_look_psy *p,vorbis_info_psy *vi,
|
||||
vorbis_info_psy_global *gi,int n,long rate);
|
||||
extern void _vp_psy_clear(vorbis_look_psy *p);
|
||||
extern void *_vi_psy_dup(void *source);
|
||||
|
||||
extern void _vi_psy_free(vorbis_info_psy *i);
|
||||
extern vorbis_info_psy *_vi_psy_copy(vorbis_info_psy *i);
|
||||
|
||||
extern void _vp_noisemask(vorbis_look_psy *p,
|
||||
float *logmdct,
|
||||
float *logmask);
|
||||
|
||||
extern void _vp_tonemask(vorbis_look_psy *p,
|
||||
float *logfft,
|
||||
float *logmask,
|
||||
float global_specmax,
|
||||
float local_specmax);
|
||||
|
||||
extern void _vp_offset_and_mix(vorbis_look_psy *p,
|
||||
float *noise,
|
||||
float *tone,
|
||||
int offset_select,
|
||||
float *logmask,
|
||||
float *mdct,
|
||||
float *logmdct);
|
||||
|
||||
extern float _vp_ampmax_decay(float amp,vorbis_dsp_state *vd);
|
||||
|
||||
extern void _vp_couple_quantize_normalize(int blobno,
|
||||
vorbis_info_psy_global *g,
|
||||
vorbis_look_psy *p,
|
||||
vorbis_info_mapping0 *vi,
|
||||
float **mdct,
|
||||
int **iwork,
|
||||
int *nonzero,
|
||||
int sliding_lowpass,
|
||||
int ch);
|
||||
|
||||
#endif
|
@ -1,524 +0,0 @@
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: simple utility that runs audio through the psychoacoustics
|
||||
without encoding
|
||||
last mod: $Id: psytune.c 16037 2009-05-26 21:10:58Z xiphmont $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
/* NB: this is dead code, retained purely for doc and reference value
|
||||
don't try to compile it */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
|
||||
#include "vorbis/codec.h"
|
||||
#include "codec_internal.h"
|
||||
#include "os.h"
|
||||
#include "misc.h"
|
||||
#include "psy.h"
|
||||
#include "mdct.h"
|
||||
#include "smallft.h"
|
||||
#include "window.h"
|
||||
#include "scales.h"
|
||||
#include "lpc.h"
|
||||
#include "lsp.h"
|
||||
#include "masking.h"
|
||||
#include "registry.h"
|
||||
|
||||
static vorbis_info_psy_global _psy_set0G={
|
||||
0, /* decaydBpms */
|
||||
8, /* lines per eighth octave */
|
||||
|
||||
/* thresh sample period, preecho clamp trigger threshhold, range, minenergy */
|
||||
256, {26.f,26.f,26.f,30.f}, {-90.f,-90.f,-90.f,-90.f}, -90.f,
|
||||
-6.f,
|
||||
|
||||
0,
|
||||
|
||||
0.,
|
||||
0.,
|
||||
};
|
||||
|
||||
static vp_part _vp_part0[]={
|
||||
{ 1,9e10f, 9e10f, 1.f,9999.f},
|
||||
{ 9999, .75f, 9e10f, .5f,9999.f},
|
||||
/*{ 9999, 1.5f, 9e10f, .5f,9999.f},*/
|
||||
{ 18,9e10f, 9e10f, .5f, 30.f},
|
||||
{ 9999,9e10f, 9e10f, .5f, 30.f}
|
||||
};
|
||||
|
||||
static vp_couple _vp_couple0[]={
|
||||
{ 1, {9e10f,9e10f,0}, { 0.f, 0.f,0}, { 0.f, 0.f,0}, {0.f,0.f,0}},
|
||||
{ 18, {9e10f,9e10f,0}, { 0.f, 0.f,0}, { 0.f, 0.f,0}, {0.f,0.f,0}},
|
||||
{ 9999, {9e10f,9e10f,0}, { 0.f, 9e10f,0}, { 0.f,22.f,1}, {0.f,0.f,0}}
|
||||
};
|
||||
|
||||
static vorbis_info_psy _psy_set0={
|
||||
ATH_Bark_dB_lineaggressive,
|
||||
|
||||
-100.f,
|
||||
-140.f,
|
||||
6.f, /* floor master att */
|
||||
|
||||
/* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 */
|
||||
/* x: 63 88 125 175 250 350 500 700 1k 1.4k 2k 2.8k 4k 5.6k 8k 11.5k 16k Hz */
|
||||
/* y: 0 10 20 30 40 50 60 70 80 90 100 dB */
|
||||
1, /* tonemaskp */
|
||||
0.f, /* tone master att */
|
||||
/* 0 10 20 30 40 50 60 70 80 90 100 */
|
||||
{
|
||||
{-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f}, /*63*/
|
||||
{-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f}, /*88*/
|
||||
{-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f}, /*125*/
|
||||
|
||||
{-30.f,-30.f,-35.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*175*/
|
||||
{-30.f,-30.f,-35.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*250*/
|
||||
{-30.f,-30.f,-35.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*350*/
|
||||
{-30.f,-30.f,-35.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*500*/
|
||||
{-30.f,-30.f,-35.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*700*/
|
||||
{-30.f,-30.f,-35.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*1000*/
|
||||
{-30.f,-30.f,-35.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*1400*/
|
||||
{-40.f,-40.f,-40.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*2000*/
|
||||
{-40.f,-40.f,-40.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*2800*/
|
||||
{-40.f,-40.f,-40.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*4000*/
|
||||
|
||||
{-30.f,-35.f,-35.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*5600*/
|
||||
|
||||
{-30.f,-30.f,-33.f,-35.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*8000*/
|
||||
{-30.f,-30.f,-33.f,-35.f,-40.f,-45.f,-50.f,-60.f,-70.f,-85.f,-100.f}, /*11500*/
|
||||
{-24.f,-24.f,-26.f,-32.f,-32.f,-42.f,-50.f,-60.f,-70.f,-85.f,-100.f}, /*16000*/
|
||||
|
||||
},
|
||||
|
||||
1,/* peakattp */
|
||||
{{-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*63*/
|
||||
{-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*88*/
|
||||
{-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*125*/
|
||||
{-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*175*/
|
||||
{-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*250*/
|
||||
{-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*350*/
|
||||
{-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*500*/
|
||||
{-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*700*/
|
||||
{-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*1000*/
|
||||
{-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*1400*/
|
||||
{-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*2000*/
|
||||
{-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*2800*/
|
||||
{-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*4000*/
|
||||
{-10.f,-12.f,-14.f,-16.f,-16.f,-20.f,-24.f,-30.f,-32.f,-40.f,-40.f},/*5600*/
|
||||
{-10.f,-12.f,-14.f,-16.f,-16.f,-20.f,-24.f,-30.f,-32.f,-40.f,-40.f},/*8000*/
|
||||
{-10.f,-10.f,-10.f,-12.f,-14.f,-18.f,-22.f,-28.f,-32.f,-40.f,-40.f},/*11500*/
|
||||
{-10.f,-10.f,-10.f,-12.f,-14.f,-18.f,-22.f,-28.f,-32.f,-40.f,-40.f},/*16000*/
|
||||
},
|
||||
|
||||
1,/*noisemaskp */
|
||||
-10.f, /* suppress any noise curve over maxspec+n */
|
||||
.5f, /* low window */
|
||||
.5f, /* high window */
|
||||
10,
|
||||
10,
|
||||
25,
|
||||
{.000f, 0.f, /*63*/
|
||||
.000f, 0.f, /*88*/
|
||||
.000f, 0.f, /*125*/
|
||||
.000f, 0.f, /*175*/
|
||||
.000f, 0.f, /*250*/
|
||||
.000f, 0.f, /*350*/
|
||||
.000f, 0.f, /*500*/
|
||||
.000f, 0.f, /*700*/
|
||||
.000f, 0.f, /*1000*/
|
||||
.300f, 0.f, /*1400*/
|
||||
.300f, 0.f, /*2000*/
|
||||
.300f, 0.f, /*2800*/
|
||||
.500f, 0.f, /*4000*/
|
||||
.700f, 0.f, /*5600*/
|
||||
.850f, 0.f, /*8000*/
|
||||
.900f, 0.f, /*11500*/
|
||||
.900f, 1.f, /*16000*/
|
||||
},
|
||||
|
||||
95.f, /* even decade + 5 is important; saves an rint() later in a
|
||||
tight loop) */
|
||||
-44.,
|
||||
|
||||
32,
|
||||
_vp_part0,_vp_couple0
|
||||
};
|
||||
|
||||
static vorbis_info_floor1 _floor_set0={1,
|
||||
{0},
|
||||
|
||||
{32},
|
||||
{0},
|
||||
{0},
|
||||
{{-1}},
|
||||
|
||||
2,
|
||||
{0,1024,
|
||||
|
||||
88,31,243,
|
||||
|
||||
14,54,143,460,
|
||||
|
||||
6,3,10, 22,18,26, 41,36,47,
|
||||
69,61,78, 112,99,126, 185,162,211,
|
||||
329,282,387, 672,553,825
|
||||
},
|
||||
|
||||
60,30,400,
|
||||
20,8,1,18.,
|
||||
20,600,
|
||||
960};
|
||||
|
||||
|
||||
static vorbis_info_mapping0 mapping_info={1,{0,1},{0},{0},{0},0, 1, {0},{1}};
|
||||
static codec_setup_info codec_setup0={ {0,0},
|
||||
1,1,1,1,1,0,1,
|
||||
{NULL},
|
||||
{0},{&mapping_info},
|
||||
{0},{NULL},
|
||||
{1},{&_floor_set0},
|
||||
{2},{NULL},
|
||||
{NULL},
|
||||
{&_psy_set0},
|
||||
&_psy_set0G};
|
||||
|
||||
static int noisy=0;
|
||||
void analysis(char *base,int i,float *v,int n,int bark,int dB){
|
||||
if(noisy){
|
||||
int j;
|
||||
FILE *of;
|
||||
char buffer[80];
|
||||
sprintf(buffer,"%s_%d.m",base,i);
|
||||
of=fopen(buffer,"w");
|
||||
|
||||
for(j=0;j<n;j++){
|
||||
if(dB && v[j]==0)
|
||||
fprintf(of,"\n\n");
|
||||
else{
|
||||
if(bark)
|
||||
fprintf(of,"%g ",toBARK(22050.f*j/n));
|
||||
else
|
||||
fprintf(of,"%g ",(float)j);
|
||||
|
||||
if(dB){
|
||||
fprintf(of,"%g\n",todB(v+j));
|
||||
}else{
|
||||
fprintf(of,"%g\n",v[j]);
|
||||
}
|
||||
}
|
||||
}
|
||||
fclose(of);
|
||||
}
|
||||
}
|
||||
|
||||
long frameno=0;
|
||||
|
||||
/****************************************************************/
|
||||
|
||||
int main(int argc,char *argv[]){
|
||||
int eos=0;
|
||||
float nonz=0.f;
|
||||
float acc=0.f;
|
||||
float tot=0.f;
|
||||
float ampmax=-9999,newmax;
|
||||
float local_ampmax[2];
|
||||
|
||||
int framesize=2048;
|
||||
float ampmax_att_per_sec=-6.;
|
||||
|
||||
float *pcm[2],*out[2],*window,*flr[2],*mask[2],*work[2];
|
||||
signed char *buffer,*buffer2;
|
||||
mdct_lookup m_look;
|
||||
drft_lookup f_look;
|
||||
vorbis_look_psy p_look;
|
||||
vorbis_look_psy_global *pg_look;
|
||||
vorbis_look_floor *floor_look;
|
||||
vorbis_info vi;
|
||||
long i,j,k;
|
||||
|
||||
int ath=0;
|
||||
int decayp=0;
|
||||
|
||||
argv++;
|
||||
while(*argv){
|
||||
if(*argv[0]=='-'){
|
||||
/* option */
|
||||
if(argv[0][1]=='v'){
|
||||
noisy=0;
|
||||
}
|
||||
}else
|
||||
if(*argv[0]=='+'){
|
||||
/* option */
|
||||
if(argv[0][1]=='v'){
|
||||
noisy=1;
|
||||
}
|
||||
}else
|
||||
framesize=atoi(argv[0]);
|
||||
argv++;
|
||||
}
|
||||
|
||||
vi.channels=2;
|
||||
vi.codec_setup=&codec_setup0;
|
||||
|
||||
pcm[0]=_ogg_malloc(framesize*sizeof(float));
|
||||
pcm[1]=_ogg_malloc(framesize*sizeof(float));
|
||||
out[0]=_ogg_calloc(framesize/2,sizeof(float));
|
||||
out[1]=_ogg_calloc(framesize/2,sizeof(float));
|
||||
work[0]=_ogg_calloc(framesize,sizeof(float));
|
||||
work[1]=_ogg_calloc(framesize,sizeof(float));
|
||||
flr[0]=_ogg_calloc(framesize/2,sizeof(float));
|
||||
flr[1]=_ogg_calloc(framesize/2,sizeof(float));
|
||||
buffer=_ogg_malloc(framesize*4);
|
||||
buffer2=buffer+framesize*2;
|
||||
window=_vorbis_window_create(0,framesize,framesize/2,framesize/2);
|
||||
mdct_init(&m_look,framesize);
|
||||
drft_init(&f_look,framesize);
|
||||
_vp_psy_init(&p_look,&_psy_set0,&_psy_set0G,framesize/2,44100);
|
||||
pg_look=_vp_global_look(&vi);
|
||||
floor_look=_floor_P[1]->look(NULL,NULL,&_floor_set0);
|
||||
|
||||
/* we cheat on the WAV header; we just bypass 44 bytes and never
|
||||
verify that it matches 16bit/stereo/44.1kHz. */
|
||||
|
||||
fread(buffer,1,44,stdin);
|
||||
fwrite(buffer,1,44,stdout);
|
||||
memset(buffer,0,framesize*2);
|
||||
|
||||
analysis("window",0,window,framesize,0,0);
|
||||
|
||||
fprintf(stderr,"Processing for frame size %d...\n",framesize);
|
||||
|
||||
while(!eos){
|
||||
long bytes=fread(buffer2,1,framesize*2,stdin);
|
||||
if(bytes<framesize*2)
|
||||
memset(buffer2+bytes,0,framesize*2-bytes);
|
||||
|
||||
if(bytes!=0){
|
||||
int nonzero[2];
|
||||
|
||||
/* uninterleave samples */
|
||||
for(i=0;i<framesize;i++){
|
||||
pcm[0][i]=((buffer[i*4+1]<<8)|
|
||||
(0x00ff&(int)buffer[i*4]))/32768.f;
|
||||
pcm[1][i]=((buffer[i*4+3]<<8)|
|
||||
(0x00ff&(int)buffer[i*4+2]))/32768.f;
|
||||
}
|
||||
|
||||
{
|
||||
float secs=framesize/44100.;
|
||||
|
||||
ampmax+=secs*ampmax_att_per_sec;
|
||||
if(ampmax<-9999)ampmax=-9999;
|
||||
}
|
||||
|
||||
for(i=0;i<2;i++){
|
||||
float scale=4.f/framesize;
|
||||
float *fft=work[i];
|
||||
float *mdct=pcm[i];
|
||||
float *logmdct=mdct+framesize/2;
|
||||
|
||||
analysis("pre",frameno+i,pcm[i],framesize,0,0);
|
||||
|
||||
/* fft and mdct transforms */
|
||||
for(j=0;j<framesize;j++)
|
||||
fft[j]=pcm[i][j]*=window[j];
|
||||
|
||||
drft_forward(&f_look,fft);
|
||||
|
||||
local_ampmax[i]=-9999.f;
|
||||
fft[0]*=scale;
|
||||
fft[0]=todB(fft);
|
||||
for(j=1;j<framesize-1;j+=2){
|
||||
float temp=scale*FAST_HYPOT(fft[j],fft[j+1]);
|
||||
temp=fft[(j+1)>>1]=todB(&temp);
|
||||
if(temp>local_ampmax[i])local_ampmax[i]=temp;
|
||||
}
|
||||
if(local_ampmax[i]>ampmax)ampmax=local_ampmax[i];
|
||||
|
||||
mdct_forward(&m_look,pcm[i],mdct);
|
||||
for(j=0;j<framesize/2;j++)
|
||||
logmdct[j]=todB(mdct+j);
|
||||
|
||||
analysis("mdct",frameno+i,logmdct,framesize/2,1,0);
|
||||
analysis("fft",frameno+i,fft,framesize/2,1,0);
|
||||
}
|
||||
|
||||
for(i=0;i<2;i++){
|
||||
float amp;
|
||||
float *fft=work[i];
|
||||
float *logmax=fft;
|
||||
float *mdct=pcm[i];
|
||||
float *logmdct=mdct+framesize/2;
|
||||
float *mask=fft+framesize/2;
|
||||
|
||||
/* floor psychoacoustics */
|
||||
_vp_compute_mask(&p_look,
|
||||
pg_look,
|
||||
i,
|
||||
fft,
|
||||
logmdct,
|
||||
mask,
|
||||
ampmax,
|
||||
local_ampmax[i],
|
||||
framesize/2);
|
||||
|
||||
analysis("mask",frameno+i,mask,framesize/2,1,0);
|
||||
|
||||
{
|
||||
vorbis_block vb;
|
||||
vorbis_dsp_state vd;
|
||||
memset(&vd,0,sizeof(vd));
|
||||
vd.vi=&vi;
|
||||
vb.vd=&vd;
|
||||
vb.pcmend=framesize;
|
||||
|
||||
/* floor quantization/application */
|
||||
nonzero[i]=_floor_P[1]->forward(&vb,floor_look,
|
||||
mdct,
|
||||
logmdct,
|
||||
mask,
|
||||
logmax,
|
||||
|
||||
flr[i]);
|
||||
}
|
||||
|
||||
_vp_remove_floor(&p_look,
|
||||
pg_look,
|
||||
logmdct,
|
||||
mdct,
|
||||
flr[i],
|
||||
pcm[i],
|
||||
local_ampmax[i]);
|
||||
|
||||
for(j=0;j<framesize/2;j++)
|
||||
if(fabs(pcm[i][j])>1500)
|
||||
fprintf(stderr,"%ld ",frameno+i);
|
||||
|
||||
analysis("res",frameno+i,pcm[i],framesize/2,1,0);
|
||||
analysis("codedflr",frameno+i,flr[i],framesize/2,1,1);
|
||||
}
|
||||
|
||||
/* residue prequantization */
|
||||
_vp_partition_prequant(&p_look,
|
||||
&vi,
|
||||
pcm,
|
||||
nonzero);
|
||||
|
||||
for(i=0;i<2;i++)
|
||||
analysis("quant",frameno+i,pcm[i],framesize/2,1,0);
|
||||
|
||||
/* channel coupling / stereo quantization */
|
||||
|
||||
_vp_couple(&p_look,
|
||||
&mapping_info,
|
||||
pcm,
|
||||
nonzero);
|
||||
|
||||
for(i=0;i<2;i++)
|
||||
analysis("coupled",frameno+i,pcm[i],framesize/2,1,0);
|
||||
|
||||
/* decoupling */
|
||||
for(i=mapping_info.coupling_steps-1;i>=0;i--){
|
||||
float *pcmM=pcm[mapping_info.coupling_mag[i]];
|
||||
float *pcmA=pcm[mapping_info.coupling_ang[i]];
|
||||
|
||||
for(j=0;j<framesize/2;j++){
|
||||
float mag=pcmM[j];
|
||||
float ang=pcmA[j];
|
||||
|
||||
if(mag>0)
|
||||
if(ang>0){
|
||||
pcmM[j]=mag;
|
||||
pcmA[j]=mag-ang;
|
||||
}else{
|
||||
pcmA[j]=mag;
|
||||
pcmM[j]=mag+ang;
|
||||
}
|
||||
else
|
||||
if(ang>0){
|
||||
pcmM[j]=mag;
|
||||
pcmA[j]=mag+ang;
|
||||
}else{
|
||||
pcmA[j]=mag;
|
||||
pcmM[j]=mag-ang;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for(i=0;i<2;i++)
|
||||
analysis("decoupled",frameno+i,pcm[i],framesize/2,1,0);
|
||||
|
||||
for(i=0;i<2;i++){
|
||||
float amp;
|
||||
|
||||
for(j=0;j<framesize/2;j++)
|
||||
pcm[i][j]*=flr[i][j];
|
||||
|
||||
analysis("final",frameno+i,pcm[i],framesize/2,1,1);
|
||||
|
||||
/* take it back to time */
|
||||
mdct_backward(&m_look,pcm[i],pcm[i]);
|
||||
|
||||
for(j=0;j<framesize/2;j++)
|
||||
out[i][j]+=pcm[i][j]*window[j];
|
||||
|
||||
analysis("out",frameno+i,out[i],framesize/2,0,0);
|
||||
|
||||
|
||||
}
|
||||
|
||||
/* write data. Use the part of buffer we're about to shift out */
|
||||
for(i=0;i<2;i++){
|
||||
char *ptr=buffer+i*2;
|
||||
float *mono=out[i];
|
||||
int flag=0;
|
||||
for(j=0;j<framesize/2;j++){
|
||||
int val=mono[j]*32767.;
|
||||
/* might as well guard against clipping */
|
||||
if(val>32767){
|
||||
if(!flag)fprintf(stderr,"clipping in frame %ld ",frameno+i);
|
||||
flag=1;
|
||||
val=32767;
|
||||
}
|
||||
if(val<-32768){
|
||||
if(!flag)fprintf(stderr,"clipping in frame %ld ",frameno+i);
|
||||
flag=1;
|
||||
val=-32768;
|
||||
}
|
||||
ptr[0]=val&0xff;
|
||||
ptr[1]=(val>>8)&0xff;
|
||||
ptr+=4;
|
||||
}
|
||||
}
|
||||
|
||||
fprintf(stderr,"*");
|
||||
fwrite(buffer,1,framesize*2,stdout);
|
||||
memmove(buffer,buffer2,framesize*2);
|
||||
|
||||
for(i=0;i<2;i++){
|
||||
for(j=0,k=framesize/2;j<framesize/2;j++,k++)
|
||||
out[i][j]=pcm[i][k]*window[k];
|
||||
}
|
||||
frameno+=2;
|
||||
}else
|
||||
eos=1;
|
||||
}
|
||||
fprintf(stderr,"average raw bits of entropy: %.03g/sample\n",acc/tot);
|
||||
fprintf(stderr,"average nonzero samples: %.03g/%d\n",nonz/tot*framesize/2,
|
||||
framesize/2);
|
||||
fprintf(stderr,"Done\n\n");
|
||||
return 0;
|
||||
}
|
@ -1,45 +0,0 @@
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: registry for time, floor, res backends and channel mappings
|
||||
last mod: $Id: registry.c 16227 2009-07-08 06:58:46Z xiphmont $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
#include "vorbis/codec.h"
|
||||
#include "codec_internal.h"
|
||||
#include "registry.h"
|
||||
#include "misc.h"
|
||||
/* seems like major overkill now; the backend numbers will grow into
|
||||
the infrastructure soon enough */
|
||||
|
||||
extern const vorbis_func_floor floor0_exportbundle;
|
||||
extern const vorbis_func_floor floor1_exportbundle;
|
||||
extern const vorbis_func_residue residue0_exportbundle;
|
||||
extern const vorbis_func_residue residue1_exportbundle;
|
||||
extern const vorbis_func_residue residue2_exportbundle;
|
||||
extern const vorbis_func_mapping mapping0_exportbundle;
|
||||
|
||||
const vorbis_func_floor *const _floor_P[]={
|
||||
&floor0_exportbundle,
|
||||
&floor1_exportbundle,
|
||||
};
|
||||
|
||||
const vorbis_func_residue *const _residue_P[]={
|
||||
&residue0_exportbundle,
|
||||
&residue1_exportbundle,
|
||||
&residue2_exportbundle,
|
||||
};
|
||||
|
||||
const vorbis_func_mapping *const _mapping_P[]={
|
||||
&mapping0_exportbundle,
|
||||
};
|
@ -1,32 +0,0 @@
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: registry for time, floor, res backends and channel mappings
|
||||
last mod: $Id: registry.h 15531 2008-11-24 23:50:06Z xiphmont $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
#ifndef _V_REG_H_
|
||||
#define _V_REG_H_
|
||||
|
||||
#define VI_TRANSFORMB 1
|
||||
#define VI_WINDOWB 1
|
||||
#define VI_TIMEB 1
|
||||
#define VI_FLOORB 2
|
||||
#define VI_RESB 3
|
||||
#define VI_MAPB 1
|
||||
|
||||
extern const vorbis_func_floor *const _floor_P[];
|
||||
extern const vorbis_func_residue *const _residue_P[];
|
||||
extern const vorbis_func_mapping *const _mapping_P[];
|
||||
|
||||
#endif
|
@ -1,890 +0,0 @@
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2010 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: residue backend 0, 1 and 2 implementation
|
||||
last mod: $Id: res0.c 19441 2015-01-21 01:17:41Z xiphmont $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
/* Slow, slow, slow, simpleminded and did I mention it was slow? The
|
||||
encode/decode loops are coded for clarity and performance is not
|
||||
yet even a nagging little idea lurking in the shadows. Oh and BTW,
|
||||
it's slow. */
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
#include <ogg/ogg.h>
|
||||
#include "vorbis/codec.h"
|
||||
#include "codec_internal.h"
|
||||
#include "registry.h"
|
||||
#include "codebook.h"
|
||||
#include "misc.h"
|
||||
#include "os.h"
|
||||
|
||||
//#define TRAIN_RES 1
|
||||
//#define TRAIN_RESAUX 1
|
||||
|
||||
#if defined(TRAIN_RES) || defined (TRAIN_RESAUX)
|
||||
#include <stdio.h>
|
||||
#endif
|
||||
|
||||
typedef struct {
|
||||
vorbis_info_residue0 *info;
|
||||
|
||||
int parts;
|
||||
int stages;
|
||||
codebook *fullbooks;
|
||||
codebook *phrasebook;
|
||||
codebook ***partbooks;
|
||||
|
||||
int partvals;
|
||||
int **decodemap;
|
||||
|
||||
long postbits;
|
||||
long phrasebits;
|
||||
long frames;
|
||||
|
||||
#if defined(TRAIN_RES) || defined(TRAIN_RESAUX)
|
||||
int train_seq;
|
||||
long *training_data[8][64];
|
||||
float training_max[8][64];
|
||||
float training_min[8][64];
|
||||
float tmin;
|
||||
float tmax;
|
||||
int submap;
|
||||
#endif
|
||||
|
||||
} vorbis_look_residue0;
|
||||
|
||||
void res0_free_info(vorbis_info_residue *i){
|
||||
vorbis_info_residue0 *info=(vorbis_info_residue0 *)i;
|
||||
if(info){
|
||||
memset(info,0,sizeof(*info));
|
||||
_ogg_free(info);
|
||||
}
|
||||
}
|
||||
|
||||
void res0_free_look(vorbis_look_residue *i){
|
||||
int j;
|
||||
if(i){
|
||||
|
||||
vorbis_look_residue0 *look=(vorbis_look_residue0 *)i;
|
||||
|
||||
#ifdef TRAIN_RES
|
||||
{
|
||||
int j,k,l;
|
||||
for(j=0;j<look->parts;j++){
|
||||
/*fprintf(stderr,"partition %d: ",j);*/
|
||||
for(k=0;k<8;k++)
|
||||
if(look->training_data[k][j]){
|
||||
char buffer[80];
|
||||
FILE *of;
|
||||
codebook *statebook=look->partbooks[j][k];
|
||||
|
||||
/* long and short into the same bucket by current convention */
|
||||
sprintf(buffer,"res_sub%d_part%d_pass%d.vqd",look->submap,j,k);
|
||||
of=fopen(buffer,"a");
|
||||
|
||||
for(l=0;l<statebook->entries;l++)
|
||||
fprintf(of,"%d:%ld\n",l,look->training_data[k][j][l]);
|
||||
|
||||
fclose(of);
|
||||
|
||||
/*fprintf(stderr,"%d(%.2f|%.2f) ",k,
|
||||
look->training_min[k][j],look->training_max[k][j]);*/
|
||||
|
||||
_ogg_free(look->training_data[k][j]);
|
||||
look->training_data[k][j]=NULL;
|
||||
}
|
||||
/*fprintf(stderr,"\n");*/
|
||||
}
|
||||
}
|
||||
fprintf(stderr,"min/max residue: %g::%g\n",look->tmin,look->tmax);
|
||||
|
||||
/*fprintf(stderr,"residue bit usage %f:%f (%f total)\n",
|
||||
(float)look->phrasebits/look->frames,
|
||||
(float)look->postbits/look->frames,
|
||||
(float)(look->postbits+look->phrasebits)/look->frames);*/
|
||||
#endif
|
||||
|
||||
|
||||
/*vorbis_info_residue0 *info=look->info;
|
||||
|
||||
fprintf(stderr,
|
||||
"%ld frames encoded in %ld phrasebits and %ld residue bits "
|
||||
"(%g/frame) \n",look->frames,look->phrasebits,
|
||||
look->resbitsflat,
|
||||
(look->phrasebits+look->resbitsflat)/(float)look->frames);
|
||||
|
||||
for(j=0;j<look->parts;j++){
|
||||
long acc=0;
|
||||
fprintf(stderr,"\t[%d] == ",j);
|
||||
for(k=0;k<look->stages;k++)
|
||||
if((info->secondstages[j]>>k)&1){
|
||||
fprintf(stderr,"%ld,",look->resbits[j][k]);
|
||||
acc+=look->resbits[j][k];
|
||||
}
|
||||
|
||||
fprintf(stderr,":: (%ld vals) %1.2fbits/sample\n",look->resvals[j],
|
||||
acc?(float)acc/(look->resvals[j]*info->grouping):0);
|
||||
}
|
||||
fprintf(stderr,"\n");*/
|
||||
|
||||
for(j=0;j<look->parts;j++)
|
||||
if(look->partbooks[j])_ogg_free(look->partbooks[j]);
|
||||
_ogg_free(look->partbooks);
|
||||
for(j=0;j<look->partvals;j++)
|
||||
_ogg_free(look->decodemap[j]);
|
||||
_ogg_free(look->decodemap);
|
||||
|
||||
memset(look,0,sizeof(*look));
|
||||
_ogg_free(look);
|
||||
}
|
||||
}
|
||||
|
||||
static int icount(unsigned int v){
|
||||
int ret=0;
|
||||
while(v){
|
||||
ret+=v&1;
|
||||
v>>=1;
|
||||
}
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
void res0_pack(vorbis_info_residue *vr,oggpack_buffer *opb){
|
||||
vorbis_info_residue0 *info=(vorbis_info_residue0 *)vr;
|
||||
int j,acc=0;
|
||||
oggpack_write(opb,info->begin,24);
|
||||
oggpack_write(opb,info->end,24);
|
||||
|
||||
oggpack_write(opb,info->grouping-1,24); /* residue vectors to group and
|
||||
code with a partitioned book */
|
||||
oggpack_write(opb,info->partitions-1,6); /* possible partition choices */
|
||||
oggpack_write(opb,info->groupbook,8); /* group huffman book */
|
||||
|
||||
/* secondstages is a bitmask; as encoding progresses pass by pass, a
|
||||
bitmask of one indicates this partition class has bits to write
|
||||
this pass */
|
||||
for(j=0;j<info->partitions;j++){
|
||||
if(ov_ilog(info->secondstages[j])>3){
|
||||
/* yes, this is a minor hack due to not thinking ahead */
|
||||
oggpack_write(opb,info->secondstages[j],3);
|
||||
oggpack_write(opb,1,1);
|
||||
oggpack_write(opb,info->secondstages[j]>>3,5);
|
||||
}else
|
||||
oggpack_write(opb,info->secondstages[j],4); /* trailing zero */
|
||||
acc+=icount(info->secondstages[j]);
|
||||
}
|
||||
for(j=0;j<acc;j++)
|
||||
oggpack_write(opb,info->booklist[j],8);
|
||||
|
||||
}
|
||||
|
||||
/* vorbis_info is for range checking */
|
||||
vorbis_info_residue *res0_unpack(vorbis_info *vi,oggpack_buffer *opb){
|
||||
int j,acc=0;
|
||||
vorbis_info_residue0 *info=_ogg_calloc(1,sizeof(*info));
|
||||
codec_setup_info *ci=vi->codec_setup;
|
||||
|
||||
info->begin=oggpack_read(opb,24);
|
||||
info->end=oggpack_read(opb,24);
|
||||
info->grouping=oggpack_read(opb,24)+1;
|
||||
info->partitions=oggpack_read(opb,6)+1;
|
||||
info->groupbook=oggpack_read(opb,8);
|
||||
|
||||
/* check for premature EOP */
|
||||
if(info->groupbook<0)goto errout;
|
||||
|
||||
for(j=0;j<info->partitions;j++){
|
||||
int cascade=oggpack_read(opb,3);
|
||||
int cflag=oggpack_read(opb,1);
|
||||
if(cflag<0) goto errout;
|
||||
if(cflag){
|
||||
int c=oggpack_read(opb,5);
|
||||
if(c<0) goto errout;
|
||||
cascade|=(c<<3);
|
||||
}
|
||||
info->secondstages[j]=cascade;
|
||||
|
||||
acc+=icount(cascade);
|
||||
}
|
||||
for(j=0;j<acc;j++){
|
||||
int book=oggpack_read(opb,8);
|
||||
if(book<0) goto errout;
|
||||
info->booklist[j]=book;
|
||||
}
|
||||
|
||||
if(info->groupbook>=ci->books)goto errout;
|
||||
for(j=0;j<acc;j++){
|
||||
if(info->booklist[j]>=ci->books)goto errout;
|
||||
if(ci->book_param[info->booklist[j]]->maptype==0)goto errout;
|
||||
}
|
||||
|
||||
/* verify the phrasebook is not specifying an impossible or
|
||||
inconsistent partitioning scheme. */
|
||||
/* modify the phrasebook ranging check from r16327; an early beta
|
||||
encoder had a bug where it used an oversized phrasebook by
|
||||
accident. These files should continue to be playable, but don't
|
||||
allow an exploit */
|
||||
{
|
||||
int entries = ci->book_param[info->groupbook]->entries;
|
||||
int dim = ci->book_param[info->groupbook]->dim;
|
||||
int partvals = 1;
|
||||
if (dim<1) goto errout;
|
||||
while(dim>0){
|
||||
partvals *= info->partitions;
|
||||
if(partvals > entries) goto errout;
|
||||
dim--;
|
||||
}
|
||||
info->partvals = partvals;
|
||||
}
|
||||
|
||||
return(info);
|
||||
errout:
|
||||
res0_free_info(info);
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
vorbis_look_residue *res0_look(vorbis_dsp_state *vd,
|
||||
vorbis_info_residue *vr){
|
||||
vorbis_info_residue0 *info=(vorbis_info_residue0 *)vr;
|
||||
vorbis_look_residue0 *look=_ogg_calloc(1,sizeof(*look));
|
||||
codec_setup_info *ci=vd->vi->codec_setup;
|
||||
|
||||
int j,k,acc=0;
|
||||
int dim;
|
||||
int maxstage=0;
|
||||
look->info=info;
|
||||
|
||||
look->parts=info->partitions;
|
||||
look->fullbooks=ci->fullbooks;
|
||||
look->phrasebook=ci->fullbooks+info->groupbook;
|
||||
dim=look->phrasebook->dim;
|
||||
|
||||
look->partbooks=_ogg_calloc(look->parts,sizeof(*look->partbooks));
|
||||
|
||||
for(j=0;j<look->parts;j++){
|
||||
int stages=ov_ilog(info->secondstages[j]);
|
||||
if(stages){
|
||||
if(stages>maxstage)maxstage=stages;
|
||||
look->partbooks[j]=_ogg_calloc(stages,sizeof(*look->partbooks[j]));
|
||||
for(k=0;k<stages;k++)
|
||||
if(info->secondstages[j]&(1<<k)){
|
||||
look->partbooks[j][k]=ci->fullbooks+info->booklist[acc++];
|
||||
#ifdef TRAIN_RES
|
||||
look->training_data[k][j]=_ogg_calloc(look->partbooks[j][k]->entries,
|
||||
sizeof(***look->training_data));
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
look->partvals=1;
|
||||
for(j=0;j<dim;j++)
|
||||
look->partvals*=look->parts;
|
||||
|
||||
look->stages=maxstage;
|
||||
look->decodemap=_ogg_malloc(look->partvals*sizeof(*look->decodemap));
|
||||
for(j=0;j<look->partvals;j++){
|
||||
long val=j;
|
||||
long mult=look->partvals/look->parts;
|
||||
look->decodemap[j]=_ogg_malloc(dim*sizeof(*look->decodemap[j]));
|
||||
for(k=0;k<dim;k++){
|
||||
long deco=val/mult;
|
||||
val-=deco*mult;
|
||||
mult/=look->parts;
|
||||
look->decodemap[j][k]=deco;
|
||||
}
|
||||
}
|
||||
#if defined(TRAIN_RES) || defined (TRAIN_RESAUX)
|
||||
{
|
||||
static int train_seq=0;
|
||||
look->train_seq=train_seq++;
|
||||
}
|
||||
#endif
|
||||
return(look);
|
||||
}
|
||||
|
||||
/* break an abstraction and copy some code for performance purposes */
|
||||
static int local_book_besterror(codebook *book,int *a){
|
||||
int dim=book->dim;
|
||||
int i,j,o;
|
||||
int minval=book->minval;
|
||||
int del=book->delta;
|
||||
int qv=book->quantvals;
|
||||
int ze=(qv>>1);
|
||||
int index=0;
|
||||
/* assumes integer/centered encoder codebook maptype 1 no more than dim 8 */
|
||||
int p[8]={0,0,0,0,0,0,0,0};
|
||||
|
||||
if(del!=1){
|
||||
for(i=0,o=dim;i<dim;i++){
|
||||
int v = (a[--o]-minval+(del>>1))/del;
|
||||
int m = (v<ze ? ((ze-v)<<1)-1 : ((v-ze)<<1));
|
||||
index = index*qv+ (m<0?0:(m>=qv?qv-1:m));
|
||||
p[o]=v*del+minval;
|
||||
}
|
||||
}else{
|
||||
for(i=0,o=dim;i<dim;i++){
|
||||
int v = a[--o]-minval;
|
||||
int m = (v<ze ? ((ze-v)<<1)-1 : ((v-ze)<<1));
|
||||
index = index*qv+ (m<0?0:(m>=qv?qv-1:m));
|
||||
p[o]=v*del+minval;
|
||||
}
|
||||
}
|
||||
|
||||
if(book->c->lengthlist[index]<=0){
|
||||
const static_codebook *c=book->c;
|
||||
int best=-1;
|
||||
/* assumes integer/centered encoder codebook maptype 1 no more than dim 8 */
|
||||
int e[8]={0,0,0,0,0,0,0,0};
|
||||
int maxval = book->minval + book->delta*(book->quantvals-1);
|
||||
for(i=0;i<book->entries;i++){
|
||||
if(c->lengthlist[i]>0){
|
||||
int this=0;
|
||||
for(j=0;j<dim;j++){
|
||||
int val=(e[j]-a[j]);
|
||||
this+=val*val;
|
||||
}
|
||||
if(best==-1 || this<best){
|
||||
memcpy(p,e,sizeof(p));
|
||||
best=this;
|
||||
index=i;
|
||||
}
|
||||
}
|
||||
/* assumes the value patterning created by the tools in vq/ */
|
||||
j=0;
|
||||
while(e[j]>=maxval)
|
||||
e[j++]=0;
|
||||
if(e[j]>=0)
|
||||
e[j]+=book->delta;
|
||||
e[j]= -e[j];
|
||||
}
|
||||
}
|
||||
|
||||
if(index>-1){
|
||||
for(i=0;i<dim;i++)
|
||||
*a++ -= p[i];
|
||||
}
|
||||
|
||||
return(index);
|
||||
}
|
||||
|
||||
#ifdef TRAIN_RES
|
||||
static int _encodepart(oggpack_buffer *opb,int *vec, int n,
|
||||
codebook *book,long *acc){
|
||||
#else
|
||||
static int _encodepart(oggpack_buffer *opb,int *vec, int n,
|
||||
codebook *book){
|
||||
#endif
|
||||
int i,bits=0;
|
||||
int dim=book->dim;
|
||||
int step=n/dim;
|
||||
|
||||
for(i=0;i<step;i++){
|
||||
int entry=local_book_besterror(book,vec+i*dim);
|
||||
|
||||
#ifdef TRAIN_RES
|
||||
if(entry>=0)
|
||||
acc[entry]++;
|
||||
#endif
|
||||
|
||||
bits+=vorbis_book_encode(book,entry,opb);
|
||||
|
||||
}
|
||||
|
||||
return(bits);
|
||||
}
|
||||
|
||||
static long **_01class(vorbis_block *vb,vorbis_look_residue *vl,
|
||||
int **in,int ch){
|
||||
long i,j,k;
|
||||
vorbis_look_residue0 *look=(vorbis_look_residue0 *)vl;
|
||||
vorbis_info_residue0 *info=look->info;
|
||||
|
||||
/* move all this setup out later */
|
||||
int samples_per_partition=info->grouping;
|
||||
int possible_partitions=info->partitions;
|
||||
int n=info->end-info->begin;
|
||||
|
||||
int partvals=n/samples_per_partition;
|
||||
long **partword=_vorbis_block_alloc(vb,ch*sizeof(*partword));
|
||||
float scale=100./samples_per_partition;
|
||||
|
||||
/* we find the partition type for each partition of each
|
||||
channel. We'll go back and do the interleaved encoding in a
|
||||
bit. For now, clarity */
|
||||
|
||||
for(i=0;i<ch;i++){
|
||||
partword[i]=_vorbis_block_alloc(vb,n/samples_per_partition*sizeof(*partword[i]));
|
||||
memset(partword[i],0,n/samples_per_partition*sizeof(*partword[i]));
|
||||
}
|
||||
|
||||
for(i=0;i<partvals;i++){
|
||||
int offset=i*samples_per_partition+info->begin;
|
||||
for(j=0;j<ch;j++){
|
||||
int max=0;
|
||||
int ent=0;
|
||||
for(k=0;k<samples_per_partition;k++){
|
||||
if(abs(in[j][offset+k])>max)max=abs(in[j][offset+k]);
|
||||
ent+=abs(in[j][offset+k]);
|
||||
}
|
||||
ent*=scale;
|
||||
|
||||
for(k=0;k<possible_partitions-1;k++)
|
||||
if(max<=info->classmetric1[k] &&
|
||||
(info->classmetric2[k]<0 || ent<info->classmetric2[k]))
|
||||
break;
|
||||
|
||||
partword[j][i]=k;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef TRAIN_RESAUX
|
||||
{
|
||||
FILE *of;
|
||||
char buffer[80];
|
||||
|
||||
for(i=0;i<ch;i++){
|
||||
sprintf(buffer,"resaux_%d.vqd",look->train_seq);
|
||||
of=fopen(buffer,"a");
|
||||
for(j=0;j<partvals;j++)
|
||||
fprintf(of,"%ld, ",partword[i][j]);
|
||||
fprintf(of,"\n");
|
||||
fclose(of);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
look->frames++;
|
||||
|
||||
return(partword);
|
||||
}
|
||||
|
||||
/* designed for stereo or other modes where the partition size is an
|
||||
integer multiple of the number of channels encoded in the current
|
||||
submap */
|
||||
static long **_2class(vorbis_block *vb,vorbis_look_residue *vl,int **in,
|
||||
int ch){
|
||||
long i,j,k,l;
|
||||
vorbis_look_residue0 *look=(vorbis_look_residue0 *)vl;
|
||||
vorbis_info_residue0 *info=look->info;
|
||||
|
||||
/* move all this setup out later */
|
||||
int samples_per_partition=info->grouping;
|
||||
int possible_partitions=info->partitions;
|
||||
int n=info->end-info->begin;
|
||||
|
||||
int partvals=n/samples_per_partition;
|
||||
long **partword=_vorbis_block_alloc(vb,sizeof(*partword));
|
||||
|
||||
#if defined(TRAIN_RES) || defined (TRAIN_RESAUX)
|
||||
FILE *of;
|
||||
char buffer[80];
|
||||
#endif
|
||||
|
||||
partword[0]=_vorbis_block_alloc(vb,partvals*sizeof(*partword[0]));
|
||||
memset(partword[0],0,partvals*sizeof(*partword[0]));
|
||||
|
||||
for(i=0,l=info->begin/ch;i<partvals;i++){
|
||||
int magmax=0;
|
||||
int angmax=0;
|
||||
for(j=0;j<samples_per_partition;j+=ch){
|
||||
if(abs(in[0][l])>magmax)magmax=abs(in[0][l]);
|
||||
for(k=1;k<ch;k++)
|
||||
if(abs(in[k][l])>angmax)angmax=abs(in[k][l]);
|
||||
l++;
|
||||
}
|
||||
|
||||
for(j=0;j<possible_partitions-1;j++)
|
||||
if(magmax<=info->classmetric1[j] &&
|
||||
angmax<=info->classmetric2[j])
|
||||
break;
|
||||
|
||||
partword[0][i]=j;
|
||||
|
||||
}
|
||||
|
||||
#ifdef TRAIN_RESAUX
|
||||
sprintf(buffer,"resaux_%d.vqd",look->train_seq);
|
||||
of=fopen(buffer,"a");
|
||||
for(i=0;i<partvals;i++)
|
||||
fprintf(of,"%ld, ",partword[0][i]);
|
||||
fprintf(of,"\n");
|
||||
fclose(of);
|
||||
#endif
|
||||
|
||||
look->frames++;
|
||||
|
||||
return(partword);
|
||||
}
|
||||
|
||||
static int _01forward(oggpack_buffer *opb,
|
||||
vorbis_look_residue *vl,
|
||||
int **in,int ch,
|
||||
long **partword,
|
||||
#ifdef TRAIN_RES
|
||||
int (*encode)(oggpack_buffer *,int *,int,
|
||||
codebook *,long *),
|
||||
int submap
|
||||
#else
|
||||
int (*encode)(oggpack_buffer *,int *,int,
|
||||
codebook *)
|
||||
#endif
|
||||
){
|
||||
long i,j,k,s;
|
||||
vorbis_look_residue0 *look=(vorbis_look_residue0 *)vl;
|
||||
vorbis_info_residue0 *info=look->info;
|
||||
|
||||
#ifdef TRAIN_RES
|
||||
look->submap=submap;
|
||||
#endif
|
||||
|
||||
/* move all this setup out later */
|
||||
int samples_per_partition=info->grouping;
|
||||
int possible_partitions=info->partitions;
|
||||
int partitions_per_word=look->phrasebook->dim;
|
||||
int n=info->end-info->begin;
|
||||
|
||||
int partvals=n/samples_per_partition;
|
||||
long resbits[128];
|
||||
long resvals[128];
|
||||
|
||||
#ifdef TRAIN_RES
|
||||
for(i=0;i<ch;i++)
|
||||
for(j=info->begin;j<info->end;j++){
|
||||
if(in[i][j]>look->tmax)look->tmax=in[i][j];
|
||||
if(in[i][j]<look->tmin)look->tmin=in[i][j];
|
||||
}
|
||||
#endif
|
||||
|
||||
memset(resbits,0,sizeof(resbits));
|
||||
memset(resvals,0,sizeof(resvals));
|
||||
|
||||
/* we code the partition words for each channel, then the residual
|
||||
words for a partition per channel until we've written all the
|
||||
residual words for that partition word. Then write the next
|
||||
partition channel words... */
|
||||
|
||||
for(s=0;s<look->stages;s++){
|
||||
|
||||
for(i=0;i<partvals;){
|
||||
|
||||
/* first we encode a partition codeword for each channel */
|
||||
if(s==0){
|
||||
for(j=0;j<ch;j++){
|
||||
long val=partword[j][i];
|
||||
for(k=1;k<partitions_per_word;k++){
|
||||
val*=possible_partitions;
|
||||
if(i+k<partvals)
|
||||
val+=partword[j][i+k];
|
||||
}
|
||||
|
||||
/* training hack */
|
||||
if(val<look->phrasebook->entries)
|
||||
look->phrasebits+=vorbis_book_encode(look->phrasebook,val,opb);
|
||||
#if 0 /*def TRAIN_RES*/
|
||||
else
|
||||
fprintf(stderr,"!");
|
||||
#endif
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/* now we encode interleaved residual values for the partitions */
|
||||
for(k=0;k<partitions_per_word && i<partvals;k++,i++){
|
||||
long offset=i*samples_per_partition+info->begin;
|
||||
|
||||
for(j=0;j<ch;j++){
|
||||
if(s==0)resvals[partword[j][i]]+=samples_per_partition;
|
||||
if(info->secondstages[partword[j][i]]&(1<<s)){
|
||||
codebook *statebook=look->partbooks[partword[j][i]][s];
|
||||
if(statebook){
|
||||
int ret;
|
||||
#ifdef TRAIN_RES
|
||||
long *accumulator=NULL;
|
||||
accumulator=look->training_data[s][partword[j][i]];
|
||||
{
|
||||
int l;
|
||||
int *samples=in[j]+offset;
|
||||
for(l=0;l<samples_per_partition;l++){
|
||||
if(samples[l]<look->training_min[s][partword[j][i]])
|
||||
look->training_min[s][partword[j][i]]=samples[l];
|
||||
if(samples[l]>look->training_max[s][partword[j][i]])
|
||||
look->training_max[s][partword[j][i]]=samples[l];
|
||||
}
|
||||
}
|
||||
ret=encode(opb,in[j]+offset,samples_per_partition,
|
||||
statebook,accumulator);
|
||||
#else
|
||||
ret=encode(opb,in[j]+offset,samples_per_partition,
|
||||
statebook);
|
||||
#endif
|
||||
|
||||
look->postbits+=ret;
|
||||
resbits[partword[j][i]]+=ret;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
/* a truncated packet here just means 'stop working'; it's not an error */
|
||||
static int _01inverse(vorbis_block *vb,vorbis_look_residue *vl,
|
||||
float **in,int ch,
|
||||
long (*decodepart)(codebook *, float *,
|
||||
oggpack_buffer *,int)){
|
||||
|
||||
long i,j,k,l,s;
|
||||
vorbis_look_residue0 *look=(vorbis_look_residue0 *)vl;
|
||||
vorbis_info_residue0 *info=look->info;
|
||||
|
||||
/* move all this setup out later */
|
||||
int samples_per_partition=info->grouping;
|
||||
int partitions_per_word=look->phrasebook->dim;
|
||||
int max=vb->pcmend>>1;
|
||||
int end=(info->end<max?info->end:max);
|
||||
int n=end-info->begin;
|
||||
|
||||
if(n>0){
|
||||
int partvals=n/samples_per_partition;
|
||||
int partwords=(partvals+partitions_per_word-1)/partitions_per_word;
|
||||
int ***partword=alloca(ch*sizeof(*partword));
|
||||
|
||||
for(j=0;j<ch;j++)
|
||||
partword[j]=_vorbis_block_alloc(vb,partwords*sizeof(*partword[j]));
|
||||
|
||||
for(s=0;s<look->stages;s++){
|
||||
|
||||
/* each loop decodes on partition codeword containing
|
||||
partitions_per_word partitions */
|
||||
for(i=0,l=0;i<partvals;l++){
|
||||
if(s==0){
|
||||
/* fetch the partition word for each channel */
|
||||
for(j=0;j<ch;j++){
|
||||
int temp=vorbis_book_decode(look->phrasebook,&vb->opb);
|
||||
|
||||
if(temp==-1 || temp>=info->partvals)goto eopbreak;
|
||||
partword[j][l]=look->decodemap[temp];
|
||||
if(partword[j][l]==NULL)goto errout;
|
||||
}
|
||||
}
|
||||
|
||||
/* now we decode residual values for the partitions */
|
||||
for(k=0;k<partitions_per_word && i<partvals;k++,i++)
|
||||
for(j=0;j<ch;j++){
|
||||
long offset=info->begin+i*samples_per_partition;
|
||||
if(info->secondstages[partword[j][l][k]]&(1<<s)){
|
||||
codebook *stagebook=look->partbooks[partword[j][l][k]][s];
|
||||
if(stagebook){
|
||||
if(decodepart(stagebook,in[j]+offset,&vb->opb,
|
||||
samples_per_partition)==-1)goto eopbreak;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
errout:
|
||||
eopbreak:
|
||||
return(0);
|
||||
}
|
||||
|
||||
int res0_inverse(vorbis_block *vb,vorbis_look_residue *vl,
|
||||
float **in,int *nonzero,int ch){
|
||||
int i,used=0;
|
||||
for(i=0;i<ch;i++)
|
||||
if(nonzero[i])
|
||||
in[used++]=in[i];
|
||||
if(used)
|
||||
return(_01inverse(vb,vl,in,used,vorbis_book_decodevs_add));
|
||||
else
|
||||
return(0);
|
||||
}
|
||||
|
||||
int res1_forward(oggpack_buffer *opb,vorbis_block *vb,vorbis_look_residue *vl,
|
||||
int **in,int *nonzero,int ch, long **partword, int submap){
|
||||
int i,used=0;
|
||||
(void)vb;
|
||||
for(i=0;i<ch;i++)
|
||||
if(nonzero[i])
|
||||
in[used++]=in[i];
|
||||
|
||||
if(used){
|
||||
#ifdef TRAIN_RES
|
||||
return _01forward(opb,vl,in,used,partword,_encodepart,submap);
|
||||
#else
|
||||
(void)submap;
|
||||
return _01forward(opb,vl,in,used,partword,_encodepart);
|
||||
#endif
|
||||
}else{
|
||||
return(0);
|
||||
}
|
||||
}
|
||||
|
||||
long **res1_class(vorbis_block *vb,vorbis_look_residue *vl,
|
||||
int **in,int *nonzero,int ch){
|
||||
int i,used=0;
|
||||
for(i=0;i<ch;i++)
|
||||
if(nonzero[i])
|
||||
in[used++]=in[i];
|
||||
if(used)
|
||||
return(_01class(vb,vl,in,used));
|
||||
else
|
||||
return(0);
|
||||
}
|
||||
|
||||
int res1_inverse(vorbis_block *vb,vorbis_look_residue *vl,
|
||||
float **in,int *nonzero,int ch){
|
||||
int i,used=0;
|
||||
for(i=0;i<ch;i++)
|
||||
if(nonzero[i])
|
||||
in[used++]=in[i];
|
||||
if(used)
|
||||
return(_01inverse(vb,vl,in,used,vorbis_book_decodev_add));
|
||||
else
|
||||
return(0);
|
||||
}
|
||||
|
||||
long **res2_class(vorbis_block *vb,vorbis_look_residue *vl,
|
||||
int **in,int *nonzero,int ch){
|
||||
int i,used=0;
|
||||
for(i=0;i<ch;i++)
|
||||
if(nonzero[i])used++;
|
||||
if(used)
|
||||
return(_2class(vb,vl,in,ch));
|
||||
else
|
||||
return(0);
|
||||
}
|
||||
|
||||
/* res2 is slightly more different; all the channels are interleaved
|
||||
into a single vector and encoded. */
|
||||
|
||||
int res2_forward(oggpack_buffer *opb,
|
||||
vorbis_block *vb,vorbis_look_residue *vl,
|
||||
int **in,int *nonzero,int ch, long **partword,int submap){
|
||||
long i,j,k,n=vb->pcmend/2,used=0;
|
||||
|
||||
/* don't duplicate the code; use a working vector hack for now and
|
||||
reshape ourselves into a single channel res1 */
|
||||
/* ugly; reallocs for each coupling pass :-( */
|
||||
int *work=_vorbis_block_alloc(vb,ch*n*sizeof(*work));
|
||||
for(i=0;i<ch;i++){
|
||||
int *pcm=in[i];
|
||||
if(nonzero[i])used++;
|
||||
for(j=0,k=i;j<n;j++,k+=ch)
|
||||
work[k]=pcm[j];
|
||||
}
|
||||
|
||||
if(used){
|
||||
#ifdef TRAIN_RES
|
||||
return _01forward(opb,vl,&work,1,partword,_encodepart,submap);
|
||||
#else
|
||||
(void)submap;
|
||||
return _01forward(opb,vl,&work,1,partword,_encodepart);
|
||||
#endif
|
||||
}else{
|
||||
return(0);
|
||||
}
|
||||
}
|
||||
|
||||
/* duplicate code here as speed is somewhat more important */
|
||||
int res2_inverse(vorbis_block *vb,vorbis_look_residue *vl,
|
||||
float **in,int *nonzero,int ch){
|
||||
long i,k,l,s;
|
||||
vorbis_look_residue0 *look=(vorbis_look_residue0 *)vl;
|
||||
vorbis_info_residue0 *info=look->info;
|
||||
|
||||
/* move all this setup out later */
|
||||
int samples_per_partition=info->grouping;
|
||||
int partitions_per_word=look->phrasebook->dim;
|
||||
int max=(vb->pcmend*ch)>>1;
|
||||
int end=(info->end<max?info->end:max);
|
||||
int n=end-info->begin;
|
||||
|
||||
if(n>0){
|
||||
int partvals=n/samples_per_partition;
|
||||
int partwords=(partvals+partitions_per_word-1)/partitions_per_word;
|
||||
int **partword=_vorbis_block_alloc(vb,partwords*sizeof(*partword));
|
||||
|
||||
for(i=0;i<ch;i++)if(nonzero[i])break;
|
||||
if(i==ch)return(0); /* no nonzero vectors */
|
||||
|
||||
for(s=0;s<look->stages;s++){
|
||||
for(i=0,l=0;i<partvals;l++){
|
||||
|
||||
if(s==0){
|
||||
/* fetch the partition word */
|
||||
int temp=vorbis_book_decode(look->phrasebook,&vb->opb);
|
||||
if(temp==-1 || temp>=info->partvals)goto eopbreak;
|
||||
partword[l]=look->decodemap[temp];
|
||||
if(partword[l]==NULL)goto errout;
|
||||
}
|
||||
|
||||
/* now we decode residual values for the partitions */
|
||||
for(k=0;k<partitions_per_word && i<partvals;k++,i++)
|
||||
if(info->secondstages[partword[l][k]]&(1<<s)){
|
||||
codebook *stagebook=look->partbooks[partword[l][k]][s];
|
||||
|
||||
if(stagebook){
|
||||
if(vorbis_book_decodevv_add(stagebook,in,
|
||||
i*samples_per_partition+info->begin,ch,
|
||||
&vb->opb,samples_per_partition)==-1)
|
||||
goto eopbreak;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
errout:
|
||||
eopbreak:
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
const vorbis_func_residue residue0_exportbundle={
|
||||
NULL,
|
||||
&res0_unpack,
|
||||
&res0_look,
|
||||
&res0_free_info,
|
||||
&res0_free_look,
|
||||
NULL,
|
||||
NULL,
|
||||
&res0_inverse
|
||||
};
|
||||
|
||||
const vorbis_func_residue residue1_exportbundle={
|
||||
&res0_pack,
|
||||
&res0_unpack,
|
||||
&res0_look,
|
||||
&res0_free_info,
|
||||
&res0_free_look,
|
||||
&res1_class,
|
||||
&res1_forward,
|
||||
&res1_inverse
|
||||
};
|
||||
|
||||
const vorbis_func_residue residue2_exportbundle={
|
||||
&res0_pack,
|
||||
&res0_unpack,
|
||||
&res0_look,
|
||||
&res0_free_info,
|
||||
&res0_free_look,
|
||||
&res2_class,
|
||||
&res2_forward,
|
||||
&res2_inverse
|
||||
};
|
@ -1,90 +0,0 @@
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: linear scale -> dB, Bark and Mel scales
|
||||
last mod: $Id: scales.h 16227 2009-07-08 06:58:46Z xiphmont $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
#ifndef _V_SCALES_H_
|
||||
#define _V_SCALES_H_
|
||||
|
||||
#include <math.h>
|
||||
#include "os.h"
|
||||
|
||||
#ifdef _MSC_VER
|
||||
/* MS Visual Studio doesn't have C99 inline keyword. */
|
||||
#define inline __inline
|
||||
#endif
|
||||
|
||||
/* 20log10(x) */
|
||||
#define VORBIS_IEEE_FLOAT32 1
|
||||
#ifdef VORBIS_IEEE_FLOAT32
|
||||
|
||||
static inline float unitnorm(float x){
|
||||
union {
|
||||
ogg_uint32_t i;
|
||||
float f;
|
||||
} ix;
|
||||
ix.f = x;
|
||||
ix.i = (ix.i & 0x80000000U) | (0x3f800000U);
|
||||
return ix.f;
|
||||
}
|
||||
|
||||
/* Segher was off (too high) by ~ .3 decibel. Center the conversion correctly. */
|
||||
static inline float todB(const float *x){
|
||||
union {
|
||||
ogg_uint32_t i;
|
||||
float f;
|
||||
} ix;
|
||||
ix.f = *x;
|
||||
ix.i = ix.i&0x7fffffff;
|
||||
return (float)(ix.i * 7.17711438e-7f -764.6161886f);
|
||||
}
|
||||
|
||||
#define todB_nn(x) todB(x)
|
||||
|
||||
#else
|
||||
|
||||
static float unitnorm(float x){
|
||||
if(x<0)return(-1.f);
|
||||
return(1.f);
|
||||
}
|
||||
|
||||
#define todB(x) (*(x)==0?-400.f:log(*(x)**(x))*4.34294480f)
|
||||
#define todB_nn(x) (*(x)==0.f?-400.f:log(*(x))*8.6858896f)
|
||||
|
||||
#endif
|
||||
|
||||
#define fromdB(x) (exp((x)*.11512925f))
|
||||
|
||||
/* The bark scale equations are approximations, since the original
|
||||
table was somewhat hand rolled. The below are chosen to have the
|
||||
best possible fit to the rolled tables, thus their somewhat odd
|
||||
appearance (these are more accurate and over a longer range than
|
||||
the oft-quoted bark equations found in the texts I have). The
|
||||
approximations are valid from 0 - 30kHz (nyquist) or so.
|
||||
|
||||
all f in Hz, z in Bark */
|
||||
|
||||
#define toBARK(n) (13.1f*atan(.00074f*(n))+2.24f*atan((n)*(n)*1.85e-8f)+1e-4f*(n))
|
||||
#define fromBARK(z) (102.f*(z)-2.f*pow(z,2.f)+.4f*pow(z,3.f)+pow(1.46f,z)-1.f)
|
||||
#define toMEL(n) (log(1.f+(n)*.001f)*1442.695f)
|
||||
#define fromMEL(m) (1000.f*exp((m)/1442.695f)-1000.f)
|
||||
|
||||
/* Frequency to octave. We arbitrarily declare 63.5 Hz to be octave
|
||||
0.0 */
|
||||
|
||||
#define toOC(n) (log(n)*1.442695f-5.965784f)
|
||||
#define fromOC(o) (exp(((o)+5.965784f)*.693147f))
|
||||
|
||||
#endif
|
@ -1,586 +0,0 @@
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2015 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: basic shared codebook operations
|
||||
last mod: $Id: sharedbook.c 19457 2015-03-03 00:15:29Z giles $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
#include <string.h>
|
||||
#include <ogg/ogg.h>
|
||||
#include "os.h"
|
||||
#include "misc.h"
|
||||
#include "vorbis/codec.h"
|
||||
#include "codebook.h"
|
||||
#include "scales.h"
|
||||
|
||||
/**** pack/unpack helpers ******************************************/
|
||||
|
||||
int ov_ilog(ogg_uint32_t v){
|
||||
int ret;
|
||||
for(ret=0;v;ret++)v>>=1;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* 32 bit float (not IEEE; nonnormalized mantissa +
|
||||
biased exponent) : neeeeeee eeemmmmm mmmmmmmm mmmmmmmm
|
||||
Why not IEEE? It's just not that important here. */
|
||||
|
||||
#define VQ_FEXP 10
|
||||
#define VQ_FMAN 21
|
||||
#define VQ_FEXP_BIAS 768 /* bias toward values smaller than 1. */
|
||||
|
||||
/* doesn't currently guard under/overflow */
|
||||
long _float32_pack(float val){
|
||||
int sign=0;
|
||||
long exp;
|
||||
long mant;
|
||||
if(val<0){
|
||||
sign=0x80000000;
|
||||
val= -val;
|
||||
}
|
||||
exp= floor(log(val)/log(2.f)+.001); //+epsilon
|
||||
mant=rint(ldexp(val,(VQ_FMAN-1)-exp));
|
||||
exp=(exp+VQ_FEXP_BIAS)<<VQ_FMAN;
|
||||
|
||||
return(sign|exp|mant);
|
||||
}
|
||||
|
||||
float _float32_unpack(long val){
|
||||
double mant=val&0x1fffff;
|
||||
int sign=val&0x80000000;
|
||||
long exp =(val&0x7fe00000L)>>VQ_FMAN;
|
||||
if(sign)mant= -mant;
|
||||
return(ldexp(mant,exp-(VQ_FMAN-1)-VQ_FEXP_BIAS));
|
||||
}
|
||||
|
||||
/* given a list of word lengths, generate a list of codewords. Works
|
||||
for length ordered or unordered, always assigns the lowest valued
|
||||
codewords first. Extended to handle unused entries (length 0) */
|
||||
ogg_uint32_t *_make_words(char *l,long n,long sparsecount){
|
||||
long i,j,count=0;
|
||||
ogg_uint32_t marker[33];
|
||||
ogg_uint32_t *r=_ogg_malloc((sparsecount?sparsecount:n)*sizeof(*r));
|
||||
memset(marker,0,sizeof(marker));
|
||||
|
||||
for(i=0;i<n;i++){
|
||||
long length=l[i];
|
||||
if(length>0){
|
||||
ogg_uint32_t entry=marker[length];
|
||||
|
||||
/* when we claim a node for an entry, we also claim the nodes
|
||||
below it (pruning off the imagined tree that may have dangled
|
||||
from it) as well as blocking the use of any nodes directly
|
||||
above for leaves */
|
||||
|
||||
/* update ourself */
|
||||
if(length<32 && (entry>>length)){
|
||||
/* error condition; the lengths must specify an overpopulated tree */
|
||||
_ogg_free(r);
|
||||
return(NULL);
|
||||
}
|
||||
r[count++]=entry;
|
||||
|
||||
/* Look to see if the next shorter marker points to the node
|
||||
above. if so, update it and repeat. */
|
||||
{
|
||||
for(j=length;j>0;j--){
|
||||
|
||||
if(marker[j]&1){
|
||||
/* have to jump branches */
|
||||
if(j==1)
|
||||
marker[1]++;
|
||||
else
|
||||
marker[j]=marker[j-1]<<1;
|
||||
break; /* invariant says next upper marker would already
|
||||
have been moved if it was on the same path */
|
||||
}
|
||||
marker[j]++;
|
||||
}
|
||||
}
|
||||
|
||||
/* prune the tree; the implicit invariant says all the longer
|
||||
markers were dangling from our just-taken node. Dangle them
|
||||
from our *new* node. */
|
||||
for(j=length+1;j<33;j++)
|
||||
if((marker[j]>>1) == entry){
|
||||
entry=marker[j];
|
||||
marker[j]=marker[j-1]<<1;
|
||||
}else
|
||||
break;
|
||||
}else
|
||||
if(sparsecount==0)count++;
|
||||
}
|
||||
|
||||
/* any underpopulated tree must be rejected. */
|
||||
/* Single-entry codebooks are a retconned extension to the spec.
|
||||
They have a single codeword '0' of length 1 that results in an
|
||||
underpopulated tree. Shield that case from the underformed tree check. */
|
||||
if(!(count==1 && marker[2]==2)){
|
||||
for(i=1;i<33;i++)
|
||||
if(marker[i] & (0xffffffffUL>>(32-i))){
|
||||
_ogg_free(r);
|
||||
return(NULL);
|
||||
}
|
||||
}
|
||||
|
||||
/* bitreverse the words because our bitwise packer/unpacker is LSb
|
||||
endian */
|
||||
for(i=0,count=0;i<n;i++){
|
||||
ogg_uint32_t temp=0;
|
||||
for(j=0;j<l[i];j++){
|
||||
temp<<=1;
|
||||
temp|=(r[count]>>j)&1;
|
||||
}
|
||||
|
||||
if(sparsecount){
|
||||
if(l[i])
|
||||
r[count++]=temp;
|
||||
}else
|
||||
r[count++]=temp;
|
||||
}
|
||||
|
||||
return(r);
|
||||
}
|
||||
|
||||
/* there might be a straightforward one-line way to do the below
|
||||
that's portable and totally safe against roundoff, but I haven't
|
||||
thought of it. Therefore, we opt on the side of caution */
|
||||
long _book_maptype1_quantvals(const static_codebook *b){
|
||||
long vals=floor(pow((float)b->entries,1.f/b->dim));
|
||||
|
||||
/* the above *should* be reliable, but we'll not assume that FP is
|
||||
ever reliable when bitstream sync is at stake; verify via integer
|
||||
means that vals really is the greatest value of dim for which
|
||||
vals^b->bim <= b->entries */
|
||||
/* treat the above as an initial guess */
|
||||
while(1){
|
||||
long acc=1;
|
||||
long acc1=1;
|
||||
int i;
|
||||
for(i=0;i<b->dim;i++){
|
||||
acc*=vals;
|
||||
acc1*=vals+1;
|
||||
}
|
||||
if(acc<=b->entries && acc1>b->entries){
|
||||
return(vals);
|
||||
}else{
|
||||
if(acc>b->entries){
|
||||
vals--;
|
||||
}else{
|
||||
vals++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* unpack the quantized list of values for encode/decode ***********/
|
||||
/* we need to deal with two map types: in map type 1, the values are
|
||||
generated algorithmically (each column of the vector counts through
|
||||
the values in the quant vector). in map type 2, all the values came
|
||||
in in an explicit list. Both value lists must be unpacked */
|
||||
float *_book_unquantize(const static_codebook *b,int n,int *sparsemap){
|
||||
long j,k,count=0;
|
||||
if(b->maptype==1 || b->maptype==2){
|
||||
int quantvals;
|
||||
float mindel=_float32_unpack(b->q_min);
|
||||
float delta=_float32_unpack(b->q_delta);
|
||||
float *r=_ogg_calloc(n*b->dim,sizeof(*r));
|
||||
|
||||
/* maptype 1 and 2 both use a quantized value vector, but
|
||||
different sizes */
|
||||
switch(b->maptype){
|
||||
case 1:
|
||||
/* most of the time, entries%dimensions == 0, but we need to be
|
||||
well defined. We define that the possible vales at each
|
||||
scalar is values == entries/dim. If entries%dim != 0, we'll
|
||||
have 'too few' values (values*dim<entries), which means that
|
||||
we'll have 'left over' entries; left over entries use zeroed
|
||||
values (and are wasted). So don't generate codebooks like
|
||||
that */
|
||||
quantvals=_book_maptype1_quantvals(b);
|
||||
for(j=0;j<b->entries;j++){
|
||||
if((sparsemap && b->lengthlist[j]) || !sparsemap){
|
||||
float last=0.f;
|
||||
int indexdiv=1;
|
||||
for(k=0;k<b->dim;k++){
|
||||
int index= (j/indexdiv)%quantvals;
|
||||
float val=b->quantlist[index];
|
||||
val=fabs(val)*delta+mindel+last;
|
||||
if(b->q_sequencep)last=val;
|
||||
if(sparsemap)
|
||||
r[sparsemap[count]*b->dim+k]=val;
|
||||
else
|
||||
r[count*b->dim+k]=val;
|
||||
indexdiv*=quantvals;
|
||||
}
|
||||
count++;
|
||||
}
|
||||
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
for(j=0;j<b->entries;j++){
|
||||
if((sparsemap && b->lengthlist[j]) || !sparsemap){
|
||||
float last=0.f;
|
||||
|
||||
for(k=0;k<b->dim;k++){
|
||||
float val=b->quantlist[j*b->dim+k];
|
||||
val=fabs(val)*delta+mindel+last;
|
||||
if(b->q_sequencep)last=val;
|
||||
if(sparsemap)
|
||||
r[sparsemap[count]*b->dim+k]=val;
|
||||
else
|
||||
r[count*b->dim+k]=val;
|
||||
}
|
||||
count++;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return(r);
|
||||
}
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
void vorbis_staticbook_destroy(static_codebook *b){
|
||||
if(b->allocedp){
|
||||
if(b->quantlist)_ogg_free(b->quantlist);
|
||||
if(b->lengthlist)_ogg_free(b->lengthlist);
|
||||
memset(b,0,sizeof(*b));
|
||||
_ogg_free(b);
|
||||
} /* otherwise, it is in static memory */
|
||||
}
|
||||
|
||||
void vorbis_book_clear(codebook *b){
|
||||
/* static book is not cleared; we're likely called on the lookup and
|
||||
the static codebook belongs to the info struct */
|
||||
if(b->valuelist)_ogg_free(b->valuelist);
|
||||
if(b->codelist)_ogg_free(b->codelist);
|
||||
|
||||
if(b->dec_index)_ogg_free(b->dec_index);
|
||||
if(b->dec_codelengths)_ogg_free(b->dec_codelengths);
|
||||
if(b->dec_firsttable)_ogg_free(b->dec_firsttable);
|
||||
|
||||
memset(b,0,sizeof(*b));
|
||||
}
|
||||
|
||||
int vorbis_book_init_encode(codebook *c,const static_codebook *s){
|
||||
|
||||
memset(c,0,sizeof(*c));
|
||||
c->c=s;
|
||||
c->entries=s->entries;
|
||||
c->used_entries=s->entries;
|
||||
c->dim=s->dim;
|
||||
c->codelist=_make_words(s->lengthlist,s->entries,0);
|
||||
//c->valuelist=_book_unquantize(s,s->entries,NULL);
|
||||
c->quantvals=_book_maptype1_quantvals(s);
|
||||
c->minval=(int)rint(_float32_unpack(s->q_min));
|
||||
c->delta=(int)rint(_float32_unpack(s->q_delta));
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
static ogg_uint32_t bitreverse(ogg_uint32_t x){
|
||||
x= ((x>>16)&0x0000ffffUL) | ((x<<16)&0xffff0000UL);
|
||||
x= ((x>> 8)&0x00ff00ffUL) | ((x<< 8)&0xff00ff00UL);
|
||||
x= ((x>> 4)&0x0f0f0f0fUL) | ((x<< 4)&0xf0f0f0f0UL);
|
||||
x= ((x>> 2)&0x33333333UL) | ((x<< 2)&0xccccccccUL);
|
||||
return((x>> 1)&0x55555555UL) | ((x<< 1)&0xaaaaaaaaUL);
|
||||
}
|
||||
|
||||
static int sort32a(const void *a,const void *b){
|
||||
return ( **(ogg_uint32_t **)a>**(ogg_uint32_t **)b)-
|
||||
( **(ogg_uint32_t **)a<**(ogg_uint32_t **)b);
|
||||
}
|
||||
|
||||
/* decode codebook arrangement is more heavily optimized than encode */
|
||||
int vorbis_book_init_decode(codebook *c,const static_codebook *s){
|
||||
int i,j,n=0,tabn;
|
||||
int *sortindex;
|
||||
|
||||
memset(c,0,sizeof(*c));
|
||||
|
||||
/* count actually used entries and find max length */
|
||||
for(i=0;i<s->entries;i++)
|
||||
if(s->lengthlist[i]>0)
|
||||
n++;
|
||||
|
||||
c->entries=s->entries;
|
||||
c->used_entries=n;
|
||||
c->dim=s->dim;
|
||||
|
||||
if(n>0){
|
||||
/* two different remappings go on here.
|
||||
|
||||
First, we collapse the likely sparse codebook down only to
|
||||
actually represented values/words. This collapsing needs to be
|
||||
indexed as map-valueless books are used to encode original entry
|
||||
positions as integers.
|
||||
|
||||
Second, we reorder all vectors, including the entry index above,
|
||||
by sorted bitreversed codeword to allow treeless decode. */
|
||||
|
||||
/* perform sort */
|
||||
ogg_uint32_t *codes=_make_words(s->lengthlist,s->entries,c->used_entries);
|
||||
ogg_uint32_t **codep=alloca(sizeof(*codep)*n);
|
||||
|
||||
if(codes==NULL)goto err_out;
|
||||
|
||||
for(i=0;i<n;i++){
|
||||
codes[i]=bitreverse(codes[i]);
|
||||
codep[i]=codes+i;
|
||||
}
|
||||
|
||||
qsort(codep,n,sizeof(*codep),sort32a);
|
||||
|
||||
sortindex=alloca(n*sizeof(*sortindex));
|
||||
c->codelist=_ogg_malloc(n*sizeof(*c->codelist));
|
||||
/* the index is a reverse index */
|
||||
for(i=0;i<n;i++){
|
||||
int position=codep[i]-codes;
|
||||
sortindex[position]=i;
|
||||
}
|
||||
|
||||
for(i=0;i<n;i++)
|
||||
c->codelist[sortindex[i]]=codes[i];
|
||||
_ogg_free(codes);
|
||||
|
||||
c->valuelist=_book_unquantize(s,n,sortindex);
|
||||
c->dec_index=_ogg_malloc(n*sizeof(*c->dec_index));
|
||||
|
||||
for(n=0,i=0;i<s->entries;i++)
|
||||
if(s->lengthlist[i]>0)
|
||||
c->dec_index[sortindex[n++]]=i;
|
||||
|
||||
c->dec_codelengths=_ogg_malloc(n*sizeof(*c->dec_codelengths));
|
||||
c->dec_maxlength=0;
|
||||
for(n=0,i=0;i<s->entries;i++)
|
||||
if(s->lengthlist[i]>0){
|
||||
c->dec_codelengths[sortindex[n++]]=s->lengthlist[i];
|
||||
if(s->lengthlist[i]>c->dec_maxlength)
|
||||
c->dec_maxlength=s->lengthlist[i];
|
||||
}
|
||||
|
||||
if(n==1 && c->dec_maxlength==1){
|
||||
/* special case the 'single entry codebook' with a single bit
|
||||
fastpath table (that always returns entry 0 )in order to use
|
||||
unmodified decode paths. */
|
||||
c->dec_firsttablen=1;
|
||||
c->dec_firsttable=_ogg_calloc(2,sizeof(*c->dec_firsttable));
|
||||
c->dec_firsttable[0]=c->dec_firsttable[1]=1;
|
||||
|
||||
}else{
|
||||
c->dec_firsttablen=ov_ilog(c->used_entries)-4; /* this is magic */
|
||||
if(c->dec_firsttablen<5)c->dec_firsttablen=5;
|
||||
if(c->dec_firsttablen>8)c->dec_firsttablen=8;
|
||||
|
||||
tabn=1<<c->dec_firsttablen;
|
||||
c->dec_firsttable=_ogg_calloc(tabn,sizeof(*c->dec_firsttable));
|
||||
|
||||
for(i=0;i<n;i++){
|
||||
if(c->dec_codelengths[i]<=c->dec_firsttablen){
|
||||
ogg_uint32_t orig=bitreverse(c->codelist[i]);
|
||||
for(j=0;j<(1<<(c->dec_firsttablen-c->dec_codelengths[i]));j++)
|
||||
c->dec_firsttable[orig|(j<<c->dec_codelengths[i])]=i+1;
|
||||
}
|
||||
}
|
||||
|
||||
/* now fill in 'unused' entries in the firsttable with hi/lo search
|
||||
hints for the non-direct-hits */
|
||||
{
|
||||
ogg_uint32_t mask=0xfffffffeUL<<(31-c->dec_firsttablen);
|
||||
long lo=0,hi=0;
|
||||
|
||||
for(i=0;i<tabn;i++){
|
||||
ogg_uint32_t word=i<<(32-c->dec_firsttablen);
|
||||
if(c->dec_firsttable[bitreverse(word)]==0){
|
||||
while((lo+1)<n && c->codelist[lo+1]<=word)lo++;
|
||||
while( hi<n && word>=(c->codelist[hi]&mask))hi++;
|
||||
|
||||
/* we only actually have 15 bits per hint to play with here.
|
||||
In order to overflow gracefully (nothing breaks, efficiency
|
||||
just drops), encode as the difference from the extremes. */
|
||||
{
|
||||
unsigned long loval=lo;
|
||||
unsigned long hival=n-hi;
|
||||
|
||||
if(loval>0x7fff)loval=0x7fff;
|
||||
if(hival>0x7fff)hival=0x7fff;
|
||||
c->dec_firsttable[bitreverse(word)]=
|
||||
0x80000000UL | (loval<<15) | hival;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return(0);
|
||||
err_out:
|
||||
vorbis_book_clear(c);
|
||||
return(-1);
|
||||
}
|
||||
|
||||
long vorbis_book_codeword(codebook *book,int entry){
|
||||
if(book->c) /* only use with encode; decode optimizations are
|
||||
allowed to break this */
|
||||
return book->codelist[entry];
|
||||
return -1;
|
||||
}
|
||||
|
||||
long vorbis_book_codelen(codebook *book,int entry){
|
||||
if(book->c) /* only use with encode; decode optimizations are
|
||||
allowed to break this */
|
||||
return book->c->lengthlist[entry];
|
||||
return -1;
|
||||
}
|
||||
|
||||
#ifdef _V_SELFTEST
|
||||
|
||||
/* Unit tests of the dequantizer; this stuff will be OK
|
||||
cross-platform, I simply want to be sure that special mapping cases
|
||||
actually work properly; a bug could go unnoticed for a while */
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
/* cases:
|
||||
|
||||
no mapping
|
||||
full, explicit mapping
|
||||
algorithmic mapping
|
||||
|
||||
nonsequential
|
||||
sequential
|
||||
*/
|
||||
|
||||
static long full_quantlist1[]={0,1,2,3, 4,5,6,7, 8,3,6,1};
|
||||
static long partial_quantlist1[]={0,7,2};
|
||||
|
||||
/* no mapping */
|
||||
static_codebook test1={
|
||||
4,16,
|
||||
NULL,
|
||||
0,
|
||||
0,0,0,0,
|
||||
NULL,
|
||||
0
|
||||
};
|
||||
static float *test1_result=NULL;
|
||||
|
||||
/* linear, full mapping, nonsequential */
|
||||
static_codebook test2={
|
||||
4,3,
|
||||
NULL,
|
||||
2,
|
||||
-533200896,1611661312,4,0,
|
||||
full_quantlist1,
|
||||
0
|
||||
};
|
||||
static float test2_result[]={-3,-2,-1,0, 1,2,3,4, 5,0,3,-2};
|
||||
|
||||
/* linear, full mapping, sequential */
|
||||
static_codebook test3={
|
||||
4,3,
|
||||
NULL,
|
||||
2,
|
||||
-533200896,1611661312,4,1,
|
||||
full_quantlist1,
|
||||
0
|
||||
};
|
||||
static float test3_result[]={-3,-5,-6,-6, 1,3,6,10, 5,5,8,6};
|
||||
|
||||
/* linear, algorithmic mapping, nonsequential */
|
||||
static_codebook test4={
|
||||
3,27,
|
||||
NULL,
|
||||
1,
|
||||
-533200896,1611661312,4,0,
|
||||
partial_quantlist1,
|
||||
0
|
||||
};
|
||||
static float test4_result[]={-3,-3,-3, 4,-3,-3, -1,-3,-3,
|
||||
-3, 4,-3, 4, 4,-3, -1, 4,-3,
|
||||
-3,-1,-3, 4,-1,-3, -1,-1,-3,
|
||||
-3,-3, 4, 4,-3, 4, -1,-3, 4,
|
||||
-3, 4, 4, 4, 4, 4, -1, 4, 4,
|
||||
-3,-1, 4, 4,-1, 4, -1,-1, 4,
|
||||
-3,-3,-1, 4,-3,-1, -1,-3,-1,
|
||||
-3, 4,-1, 4, 4,-1, -1, 4,-1,
|
||||
-3,-1,-1, 4,-1,-1, -1,-1,-1};
|
||||
|
||||
/* linear, algorithmic mapping, sequential */
|
||||
static_codebook test5={
|
||||
3,27,
|
||||
NULL,
|
||||
1,
|
||||
-533200896,1611661312,4,1,
|
||||
partial_quantlist1,
|
||||
0
|
||||
};
|
||||
static float test5_result[]={-3,-6,-9, 4, 1,-2, -1,-4,-7,
|
||||
-3, 1,-2, 4, 8, 5, -1, 3, 0,
|
||||
-3,-4,-7, 4, 3, 0, -1,-2,-5,
|
||||
-3,-6,-2, 4, 1, 5, -1,-4, 0,
|
||||
-3, 1, 5, 4, 8,12, -1, 3, 7,
|
||||
-3,-4, 0, 4, 3, 7, -1,-2, 2,
|
||||
-3,-6,-7, 4, 1, 0, -1,-4,-5,
|
||||
-3, 1, 0, 4, 8, 7, -1, 3, 2,
|
||||
-3,-4,-5, 4, 3, 2, -1,-2,-3};
|
||||
|
||||
void run_test(static_codebook *b,float *comp){
|
||||
float *out=_book_unquantize(b,b->entries,NULL);
|
||||
int i;
|
||||
|
||||
if(comp){
|
||||
if(!out){
|
||||
fprintf(stderr,"_book_unquantize incorrectly returned NULL\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
for(i=0;i<b->entries*b->dim;i++)
|
||||
if(fabs(out[i]-comp[i])>.0001){
|
||||
fprintf(stderr,"disagreement in unquantized and reference data:\n"
|
||||
"position %d, %g != %g\n",i,out[i],comp[i]);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
}else{
|
||||
if(out){
|
||||
fprintf(stderr,"_book_unquantize returned a value array: \n"
|
||||
" correct result should have been NULL\n");
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int main(){
|
||||
/* run the nine dequant tests, and compare to the hand-rolled results */
|
||||
fprintf(stderr,"Dequant test 1... ");
|
||||
run_test(&test1,test1_result);
|
||||
fprintf(stderr,"OK\nDequant test 2... ");
|
||||
run_test(&test2,test2_result);
|
||||
fprintf(stderr,"OK\nDequant test 3... ");
|
||||
run_test(&test3,test3_result);
|
||||
fprintf(stderr,"OK\nDequant test 4... ");
|
||||
run_test(&test4,test4_result);
|
||||
fprintf(stderr,"OK\nDequant test 5... ");
|
||||
run_test(&test5,test5_result);
|
||||
fprintf(stderr,"OK\n\n");
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
#endif
|
File diff suppressed because it is too large
Load Diff
@ -1,34 +0,0 @@
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: fft transform
|
||||
last mod: $Id: smallft.h 13293 2007-07-24 00:09:47Z xiphmont $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
#ifndef _V_SMFT_H_
|
||||
#define _V_SMFT_H_
|
||||
|
||||
#include "vorbis/codec.h"
|
||||
|
||||
typedef struct {
|
||||
int n;
|
||||
float *trigcache;
|
||||
int *splitcache;
|
||||
} drft_lookup;
|
||||
|
||||
extern void drft_forward(drft_lookup *l,float *data);
|
||||
extern void drft_backward(drft_lookup *l,float *data);
|
||||
extern void drft_init(drft_lookup *l,int n);
|
||||
extern void drft_clear(drft_lookup *l);
|
||||
|
||||
#endif
|
@ -1,180 +0,0 @@
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2015 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: single-block PCM synthesis
|
||||
last mod: $Id: synthesis.c 19441 2015-01-21 01:17:41Z xiphmont $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <ogg/ogg.h>
|
||||
#include "vorbis/codec.h"
|
||||
#include "codec_internal.h"
|
||||
#include "registry.h"
|
||||
#include "misc.h"
|
||||
#include "os.h"
|
||||
|
||||
int vorbis_synthesis(vorbis_block *vb,ogg_packet *op){
|
||||
vorbis_dsp_state *vd= vb ? vb->vd : 0;
|
||||
private_state *b= vd ? vd->backend_state : 0;
|
||||
vorbis_info *vi= vd ? vd->vi : 0;
|
||||
codec_setup_info *ci= vi ? vi->codec_setup : 0;
|
||||
oggpack_buffer *opb=vb ? &vb->opb : 0;
|
||||
int type,mode,i;
|
||||
|
||||
if (!vd || !b || !vi || !ci || !opb) {
|
||||
return OV_EBADPACKET;
|
||||
}
|
||||
|
||||
/* first things first. Make sure decode is ready */
|
||||
_vorbis_block_ripcord(vb);
|
||||
oggpack_readinit(opb,op->packet,op->bytes);
|
||||
|
||||
/* Check the packet type */
|
||||
if(oggpack_read(opb,1)!=0){
|
||||
/* Oops. This is not an audio data packet */
|
||||
return(OV_ENOTAUDIO);
|
||||
}
|
||||
|
||||
/* read our mode and pre/post windowsize */
|
||||
mode=oggpack_read(opb,b->modebits);
|
||||
if(mode==-1){
|
||||
return(OV_EBADPACKET);
|
||||
}
|
||||
|
||||
vb->mode=mode;
|
||||
if(!ci->mode_param[mode]){
|
||||
return(OV_EBADPACKET);
|
||||
}
|
||||
|
||||
vb->W=ci->mode_param[mode]->blockflag;
|
||||
if(vb->W){
|
||||
|
||||
/* this doesn;t get mapped through mode selection as it's used
|
||||
only for window selection */
|
||||
vb->lW=oggpack_read(opb,1);
|
||||
vb->nW=oggpack_read(opb,1);
|
||||
if(vb->nW==-1){
|
||||
return(OV_EBADPACKET);
|
||||
}
|
||||
}else{
|
||||
vb->lW=0;
|
||||
vb->nW=0;
|
||||
}
|
||||
|
||||
/* more setup */
|
||||
vb->granulepos=op->granulepos;
|
||||
vb->sequence=op->packetno;
|
||||
vb->eofflag=op->e_o_s;
|
||||
|
||||
/* alloc pcm passback storage */
|
||||
vb->pcmend=ci->blocksizes[vb->W];
|
||||
vb->pcm=_vorbis_block_alloc(vb,sizeof(*vb->pcm)*vi->channels);
|
||||
for(i=0;i<vi->channels;i++)
|
||||
vb->pcm[i]=_vorbis_block_alloc(vb,vb->pcmend*sizeof(*vb->pcm[i]));
|
||||
|
||||
/* unpack_header enforces range checking */
|
||||
type=ci->map_type[ci->mode_param[mode]->mapping];
|
||||
|
||||
return(_mapping_P[type]->inverse(vb,ci->map_param[ci->mode_param[mode]->
|
||||
mapping]));
|
||||
}
|
||||
|
||||
/* used to track pcm position without actually performing decode.
|
||||
Useful for sequential 'fast forward' */
|
||||
int vorbis_synthesis_trackonly(vorbis_block *vb,ogg_packet *op){
|
||||
vorbis_dsp_state *vd=vb->vd;
|
||||
private_state *b=vd->backend_state;
|
||||
vorbis_info *vi=vd->vi;
|
||||
codec_setup_info *ci=vi->codec_setup;
|
||||
oggpack_buffer *opb=&vb->opb;
|
||||
int mode;
|
||||
|
||||
/* first things first. Make sure decode is ready */
|
||||
_vorbis_block_ripcord(vb);
|
||||
oggpack_readinit(opb,op->packet,op->bytes);
|
||||
|
||||
/* Check the packet type */
|
||||
if(oggpack_read(opb,1)!=0){
|
||||
/* Oops. This is not an audio data packet */
|
||||
return(OV_ENOTAUDIO);
|
||||
}
|
||||
|
||||
/* read our mode and pre/post windowsize */
|
||||
mode=oggpack_read(opb,b->modebits);
|
||||
if(mode==-1)return(OV_EBADPACKET);
|
||||
|
||||
vb->mode=mode;
|
||||
if(!ci->mode_param[mode]){
|
||||
return(OV_EBADPACKET);
|
||||
}
|
||||
|
||||
vb->W=ci->mode_param[mode]->blockflag;
|
||||
if(vb->W){
|
||||
vb->lW=oggpack_read(opb,1);
|
||||
vb->nW=oggpack_read(opb,1);
|
||||
if(vb->nW==-1) return(OV_EBADPACKET);
|
||||
}else{
|
||||
vb->lW=0;
|
||||
vb->nW=0;
|
||||
}
|
||||
|
||||
/* more setup */
|
||||
vb->granulepos=op->granulepos;
|
||||
vb->sequence=op->packetno;
|
||||
vb->eofflag=op->e_o_s;
|
||||
|
||||
/* no pcm */
|
||||
vb->pcmend=0;
|
||||
vb->pcm=NULL;
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
long vorbis_packet_blocksize(vorbis_info *vi,ogg_packet *op){
|
||||
codec_setup_info *ci=vi->codec_setup;
|
||||
oggpack_buffer opb;
|
||||
int mode;
|
||||
|
||||
if(ci==NULL || ci->modes<=0){
|
||||
/* codec setup not properly intialized */
|
||||
return(OV_EFAULT);
|
||||
}
|
||||
|
||||
oggpack_readinit(&opb,op->packet,op->bytes);
|
||||
|
||||
/* Check the packet type */
|
||||
if(oggpack_read(&opb,1)!=0){
|
||||
/* Oops. This is not an audio data packet */
|
||||
return(OV_ENOTAUDIO);
|
||||
}
|
||||
|
||||
/* read our mode and pre/post windowsize */
|
||||
mode=oggpack_read(&opb,ov_ilog(ci->modes-1));
|
||||
if(mode==-1 || !ci->mode_param[mode])return(OV_EBADPACKET);
|
||||
return(ci->blocksizes[ci->mode_param[mode]->blockflag]);
|
||||
}
|
||||
|
||||
int vorbis_synthesis_halfrate(vorbis_info *vi,int flag){
|
||||
/* set / clear half-sample-rate mode */
|
||||
codec_setup_info *ci=vi->codec_setup;
|
||||
|
||||
/* right now, our MDCT can't handle < 64 sample windows. */
|
||||
if(ci->blocksizes[0]<=64 && flag)return -1;
|
||||
ci->halfrate_flag=(flag?1:0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int vorbis_synthesis_halfrate_p(vorbis_info *vi){
|
||||
codec_setup_info *ci=vi->codec_setup;
|
||||
return ci->halfrate_flag;
|
||||
}
|
@ -1,54 +0,0 @@
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <math.h>
|
||||
#include <string.h>
|
||||
|
||||
void usage(){
|
||||
fprintf(stderr,"tone <frequency_Hz>,[<amplitude>] [<frequency_Hz>,[<amplitude>]...]\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
int main (int argc,char *argv[]){
|
||||
int i,j;
|
||||
double *f;
|
||||
double *amp;
|
||||
|
||||
if(argc<2)usage();
|
||||
|
||||
f=alloca(sizeof(*f)*(argc-1));
|
||||
amp=alloca(sizeof(*amp)*(argc-1));
|
||||
|
||||
i=0;
|
||||
while(argv[i+1]){
|
||||
char *pos=strchr(argv[i+1],',');
|
||||
|
||||
f[i]=atof(argv[i+1]);
|
||||
if(pos)
|
||||
amp[i]=atof(pos+1)*32767.f;
|
||||
else
|
||||
amp[i]=32767.f;
|
||||
|
||||
fprintf(stderr,"%g Hz, %g amp\n",f[i],amp[i]);
|
||||
|
||||
i++;
|
||||
}
|
||||
|
||||
for(i=0;i<44100*10;i++){
|
||||
float val=0;
|
||||
int ival;
|
||||
for(j=0;j<argc-1;j++)
|
||||
val+=amp[j]*sin(i/44100.f*f[j]*2*M_PI);
|
||||
ival=rint(val);
|
||||
|
||||
if(ival>32767.f)ival=32767.f;
|
||||
if(ival<-32768.f)ival=-32768.f;
|
||||
|
||||
fprintf(stdout,"%c%c%c%c",
|
||||
(char)(ival&0xff),
|
||||
(char)((ival>>8)&0xff),
|
||||
(char)(ival&0xff),
|
||||
(char)((ival>>8)&0xff));
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,26 +0,0 @@
|
||||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 *
|
||||
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function: window functions
|
||||
last mod: $Id: window.h 19028 2013-12-02 23:23:39Z tterribe $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
#ifndef _V_WINDOW_
|
||||
#define _V_WINDOW_
|
||||
|
||||
extern const float *_vorbis_window_get(int n);
|
||||
extern void _vorbis_apply_window(float *d,int *winno,long *blocksizes,
|
||||
int lW,int W,int nW);
|
||||
|
||||
|
||||
#endif
|
@ -55,7 +55,7 @@
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<AdditionalIncludeDirectories>.;../..;../../3rdparty/include;../../../../boost_1_60_0;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>.;../..;../../3rdparty/include;../../3rdparty/win32_include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;OGGDECODER_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MinimalRebuild>true</MinimalRebuild>
|
||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||
@ -71,8 +71,8 @@
|
||||
<Link>
|
||||
<AdditionalOptions>/NODEFAULTLIB:LIBCMT
|
||||
%(AdditionalOptions)</AdditionalOptions>
|
||||
<AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<AdditionalLibraryDirectories>./lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<AdditionalDependencies>libvorbis.lib;libvorbisfile.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<AdditionalLibraryDirectories>../../3rdparty/win32_lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
|
||||
@ -82,7 +82,7 @@
|
||||
<ClCompile>
|
||||
<InlineFunctionExpansion>Default</InlineFunctionExpansion>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<AdditionalIncludeDirectories>.;../..;../../3rdparty/include;../../../../boost_1_60_0;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>.;../..;../../3rdparty/include;../../3rdparty/win32_include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;OGGDECODER_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
<PrecompiledHeader>
|
||||
@ -98,8 +98,8 @@
|
||||
<ExceptionHandling>Sync</ExceptionHandling>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<AdditionalLibraryDirectories>./lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<AdditionalDependencies>libvorbis.lib;libvorbisfile.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<AdditionalLibraryDirectories>../../3rdparty/win32_lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
@ -107,90 +107,15 @@
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="libogg\bitwise.c" />
|
||||
<ClCompile Include="libogg\framing.c" />
|
||||
<ClCompile Include="libvorbis\analysis.c" />
|
||||
<ClCompile Include="libvorbis\barkmel.c" />
|
||||
<ClCompile Include="libvorbis\bitrate.c" />
|
||||
<ClCompile Include="libvorbis\block.c" />
|
||||
<ClCompile Include="libvorbis\codebook.c" />
|
||||
<ClCompile Include="libvorbis\envelope.c" />
|
||||
<ClCompile Include="libvorbis\floor0.c" />
|
||||
<ClCompile Include="libvorbis\floor1.c" />
|
||||
<ClCompile Include="libvorbis\info.c" />
|
||||
<ClCompile Include="libvorbis\lookup.c" />
|
||||
<ClCompile Include="libvorbis\lpc.c" />
|
||||
<ClCompile Include="libvorbis\lsp.c" />
|
||||
<ClCompile Include="libvorbis\mapping0.c" />
|
||||
<ClCompile Include="libvorbis\mdct.c" />
|
||||
<ClCompile Include="libvorbis\psy.c" />
|
||||
<ClCompile Include="libvorbis\registry.c" />
|
||||
<ClCompile Include="libvorbis\res0.c" />
|
||||
<ClCompile Include="libvorbis\sharedbook.c" />
|
||||
<ClCompile Include="libvorbis\smallft.c" />
|
||||
<ClCompile Include="libvorbis\synthesis.c" />
|
||||
<ClCompile Include="libvorbis\vorbisenc.c" />
|
||||
<ClCompile Include="libvorbis\vorbisfile.c" />
|
||||
<ClCompile Include="libvorbis\window.c" />
|
||||
<ClCompile Include="OggDecoder.cpp" />
|
||||
<ClCompile Include="oggdecoder_plugin.cpp" />
|
||||
<ClCompile Include="OggDecoderFactory.cpp" />
|
||||
<ClCompile Include="stdafx.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="libvorbis\backends.h" />
|
||||
<ClInclude Include="libvorbis\bitrate.h" />
|
||||
<ClInclude Include="libvorbis\books\coupled\res_books_51.h" />
|
||||
<ClInclude Include="libvorbis\books\coupled\res_books_stereo.h" />
|
||||
<ClInclude Include="libvorbis\books\floor\floor_books.h" />
|
||||
<ClInclude Include="libvorbis\books\uncoupled\res_books_uncoupled.h" />
|
||||
<ClInclude Include="libvorbis\codebook.h" />
|
||||
<ClInclude Include="libvorbis\codec_internal.h" />
|
||||
<ClInclude Include="libvorbis\envelope.h" />
|
||||
<ClInclude Include="libvorbis\highlevel.h" />
|
||||
<ClInclude Include="libvorbis\lookup.h" />
|
||||
<ClInclude Include="libvorbis\lookup_data.h" />
|
||||
<ClInclude Include="libvorbis\lpc.h" />
|
||||
<ClInclude Include="libvorbis\lsp.h" />
|
||||
<ClInclude Include="libvorbis\masking.h" />
|
||||
<ClInclude Include="libvorbis\mdct.h" />
|
||||
<ClInclude Include="libvorbis\misc.h" />
|
||||
<ClInclude Include="libvorbis\modes\floor_all.h" />
|
||||
<ClInclude Include="libvorbis\modes\psych_11.h" />
|
||||
<ClInclude Include="libvorbis\modes\psych_16.h" />
|
||||
<ClInclude Include="libvorbis\modes\psych_44.h" />
|
||||
<ClInclude Include="libvorbis\modes\psych_8.h" />
|
||||
<ClInclude Include="libvorbis\modes\residue_16.h" />
|
||||
<ClInclude Include="libvorbis\modes\residue_44.h" />
|
||||
<ClInclude Include="libvorbis\modes\residue_44p51.h" />
|
||||
<ClInclude Include="libvorbis\modes\residue_44u.h" />
|
||||
<ClInclude Include="libvorbis\modes\residue_8.h" />
|
||||
<ClInclude Include="libvorbis\modes\setup_11.h" />
|
||||
<ClInclude Include="libvorbis\modes\setup_16.h" />
|
||||
<ClInclude Include="libvorbis\modes\setup_22.h" />
|
||||
<ClInclude Include="libvorbis\modes\setup_32.h" />
|
||||
<ClInclude Include="libvorbis\modes\setup_44.h" />
|
||||
<ClInclude Include="libvorbis\modes\setup_44p51.h" />
|
||||
<ClInclude Include="libvorbis\modes\setup_44u.h" />
|
||||
<ClInclude Include="libvorbis\modes\setup_8.h" />
|
||||
<ClInclude Include="libvorbis\modes\setup_X.h" />
|
||||
<ClInclude Include="libvorbis\os.h" />
|
||||
<ClInclude Include="libvorbis\psy.h" />
|
||||
<ClInclude Include="libvorbis\registry.h" />
|
||||
<ClInclude Include="libvorbis\scales.h" />
|
||||
<ClInclude Include="libvorbis\smallft.h" />
|
||||
<ClInclude Include="libvorbis\window.h" />
|
||||
<ClInclude Include="OggDecoder.h" />
|
||||
<ClInclude Include="OggDecoderFactory.h" />
|
||||
<ClInclude Include="ogg\ogg.h" />
|
||||
<ClInclude Include="ogg\os_types.h" />
|
||||
<ClInclude Include="stdafx.h" />
|
||||
<ClInclude Include="vorbis\codec.h" />
|
||||
<ClInclude Include="vorbis\vorbisenc.h" />
|
||||
<ClInclude Include="vorbis\vorbisfile.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="libvorbis\lookups.pl" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
|
@ -8,18 +8,6 @@
|
||||
<Filter Include="plugin">
|
||||
<UniqueIdentifier>{ffcb03b9-3bae-48bd-b6a6-244e21c1c28f}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="libogg">
|
||||
<UniqueIdentifier>{39c6666b-b9dd-410a-a19e-8308ebe0436a}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="libvorbis">
|
||||
<UniqueIdentifier>{d6382720-5a4e-4339-811f-c8a221ea7ba3}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="ogg">
|
||||
<UniqueIdentifier>{7096f0a9-56cc-4594-a196-63fd6a88210c}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="vorbis">
|
||||
<UniqueIdentifier>{f2ce6b67-6a6e-4290-9053-1e3e8b5c13dc}</UniqueIdentifier>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="oggdecoder_plugin.cpp">
|
||||
@ -34,81 +22,6 @@
|
||||
<ClCompile Include="OggDecoder.cpp">
|
||||
<Filter>plugin</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="libogg\framing.c">
|
||||
<Filter>libogg</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="libogg\bitwise.c">
|
||||
<Filter>libogg</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="libvorbis\window.c">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="libvorbis\analysis.c">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="libvorbis\barkmel.c">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="libvorbis\bitrate.c">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="libvorbis\block.c">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="libvorbis\codebook.c">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="libvorbis\envelope.c">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="libvorbis\floor0.c">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="libvorbis\floor1.c">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="libvorbis\info.c">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="libvorbis\lookup.c">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="libvorbis\lpc.c">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="libvorbis\lsp.c">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="libvorbis\mapping0.c">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="libvorbis\mdct.c">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="libvorbis\psy.c">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="libvorbis\registry.c">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="libvorbis\res0.c">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="libvorbis\sharedbook.c">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="libvorbis\smallft.c">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="libvorbis\synthesis.c">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="libvorbis\vorbisenc.c">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="libvorbis\vorbisfile.c">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="stdafx.h">
|
||||
@ -120,151 +33,5 @@
|
||||
<ClInclude Include="OggDecoder.h">
|
||||
<Filter>plugin</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="libvorbis\window.h">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="libvorbis\backends.h">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="libvorbis\bitrate.h">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="libvorbis\codebook.h">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="libvorbis\codec_internal.h">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="libvorbis\envelope.h">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="libvorbis\highlevel.h">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="libvorbis\lookup.h">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="libvorbis\lookup_data.h">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="libvorbis\lpc.h">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="libvorbis\lsp.h">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="libvorbis\masking.h">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="libvorbis\mdct.h">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="libvorbis\misc.h">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="libvorbis\os.h">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="libvorbis\psy.h">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="libvorbis\registry.h">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="libvorbis\scales.h">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="libvorbis\smallft.h">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="libvorbis\modes\psych_11.h">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="libvorbis\modes\psych_16.h">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="libvorbis\modes\psych_44.h">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="libvorbis\modes\residue_8.h">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="libvorbis\modes\residue_16.h">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="libvorbis\modes\residue_44.h">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="libvorbis\modes\residue_44p51.h">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="libvorbis\modes\residue_44u.h">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="libvorbis\modes\setup_8.h">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="libvorbis\modes\setup_11.h">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="libvorbis\modes\setup_16.h">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="libvorbis\modes\setup_22.h">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="libvorbis\modes\setup_32.h">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="libvorbis\modes\setup_44.h">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="libvorbis\modes\setup_44p51.h">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="libvorbis\modes\setup_44u.h">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="libvorbis\modes\setup_X.h">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="libvorbis\modes\floor_all.h">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="libvorbis\modes\psych_8.h">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="libvorbis\books\coupled\res_books_51.h">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="libvorbis\books\coupled\res_books_stereo.h">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="libvorbis\books\floor\floor_books.h">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="libvorbis\books\uncoupled\res_books_uncoupled.h">
|
||||
<Filter>libvorbis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="ogg\ogg.h">
|
||||
<Filter>ogg</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="ogg\os_types.h">
|
||||
<Filter>ogg</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="vorbis\vorbisenc.h">
|
||||
<Filter>vorbis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="vorbis\vorbisfile.h">
|
||||
<Filter>vorbis</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="vorbis\codec.h">
|
||||
<Filter>vorbis</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="libvorbis\lookups.pl">
|
||||
<Filter>libvorbis</Filter>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
</Project>
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user