mirror of
https://github.com/libretro/RetroArch
synced 2025-04-16 08:43:10 +00:00
deps: import libFLAC
This is needed by libchdr
This commit is contained in:
parent
d41ea34d6b
commit
4ead5da18a
@ -1306,6 +1306,27 @@ ifeq ($(HAVE_7ZIP),1)
|
|||||||
$(7ZOBJ)
|
$(7ZOBJ)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifeq ($(HAVE_FLAC),1)
|
||||||
|
CFLAGS += -I$(DEPS_DIR)/libFLAC/include
|
||||||
|
DEFINES += -DHAVE_FLAC -DHAVE_STDINT_H -DHAVE_LROUND -DFLAC__HAS_OGG=0 \
|
||||||
|
-DPACKAGE_VERSION="\"retroarch\""
|
||||||
|
FLACOBJ = $(DEPS_DIR)/libFLAC/bitmath.o \
|
||||||
|
$(DEPS_DIR)/libFLAC/bitreader.o \
|
||||||
|
$(DEPS_DIR)/libFLAC/cpu.o \
|
||||||
|
$(DEPS_DIR)/libFLAC/crc.o \
|
||||||
|
$(DEPS_DIR)/libFLAC/fixed.o \
|
||||||
|
$(DEPS_DIR)/libFLAC/float.o \
|
||||||
|
$(DEPS_DIR)/libFLAC/format.o \
|
||||||
|
$(DEPS_DIR)/libFLAC/lpc.o \
|
||||||
|
$(DEPS_DIR)/libFLAC/lpc_intrin_avx2.o \
|
||||||
|
$(DEPS_DIR)/libFLAC/lpc_intrin_sse2.o \
|
||||||
|
$(DEPS_DIR)/libFLAC/lpc_intrin_sse41.o \
|
||||||
|
$(DEPS_DIR)/libFLAC/lpc_intrin_sse.o \
|
||||||
|
$(DEPS_DIR)/libFLAC/md5.o \
|
||||||
|
$(DEPS_DIR)/libFLAC/memory.o \
|
||||||
|
$(DEPS_DIR)/libFLAC/stream_decoder.o
|
||||||
|
OBJ += $(FLACOBJ)
|
||||||
|
endif
|
||||||
|
|
||||||
ifeq ($(HAVE_ZLIB), 1)
|
ifeq ($(HAVE_ZLIB), 1)
|
||||||
OBJ += $(LIBRETRO_COMM_DIR)/file/archive_file_zlib.o \
|
OBJ += $(LIBRETRO_COMM_DIR)/file/archive_file_zlib.o \
|
||||||
|
58
deps/libFLAC/AUTHORS
vendored
Normal file
58
deps/libFLAC/AUTHORS
vendored
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
/* FLAC - Free Lossless Audio Codec
|
||||||
|
* Copyright (C) 2001-2009 Josh Coalson
|
||||||
|
* Copyright (C) 2011-2016 Xiph.Org Foundation
|
||||||
|
*
|
||||||
|
* This file is part the FLAC project. FLAC is comprised of several
|
||||||
|
* components distributed under different licenses. The codec libraries
|
||||||
|
* are distributed under Xiph.Org's BSD-like license (see the file
|
||||||
|
* COPYING.Xiph in this distribution). All other programs, libraries, and
|
||||||
|
* plugins are distributed under the GPL (see COPYING.GPL). The documentation
|
||||||
|
* is distributed under the Gnu FDL (see COPYING.FDL). Each file in the
|
||||||
|
* FLAC distribution contains at the top the terms under which it may be
|
||||||
|
* distributed.
|
||||||
|
*
|
||||||
|
* Since this particular file is relevant to all components of FLAC,
|
||||||
|
* it may be distributed under the Xiph.Org license, which is the least
|
||||||
|
* restrictive of those mentioned above. See the file COPYING.Xiph in this
|
||||||
|
* distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
Current FLAC maintainer: Erik de Castro Lopo <erikd@mega-nerd.com>
|
||||||
|
|
||||||
|
Original author: Josh Coalson <jcoalson@users.sourceforge.net>
|
||||||
|
|
||||||
|
Website : https://www.xiph.org/flac/
|
||||||
|
|
||||||
|
FLAC is an Open Source lossless audio codec originally developed by Josh Coalson
|
||||||
|
between 2001 and 2009. From 2009 to 2012 FLAC was basically unmaintained. In
|
||||||
|
2012 the Erik de Castro Lopo became the chief maintainer as part of the
|
||||||
|
Xiph.Org Foundation.
|
||||||
|
|
||||||
|
Other major contributors and their contributions:
|
||||||
|
|
||||||
|
"lvqcl" <lvqcl@users.sourceforge.net>
|
||||||
|
* Visual Studio build system.
|
||||||
|
* Optimisations in the encoder and decoder.
|
||||||
|
|
||||||
|
"Janne Hyvärinen" <cse@sci.fi>
|
||||||
|
* Visual Studio build system.
|
||||||
|
* Unicode handling on Windows.
|
||||||
|
|
||||||
|
"Andrey Astafiev" <andrei@tvcell.ru>
|
||||||
|
* Russian translation of the HTML documentation
|
||||||
|
|
||||||
|
"Miroslav Lichvar" <lichvarm@phoenix.inf.upol.cz>
|
||||||
|
* IA-32 assembly versions of several libFLAC routines
|
||||||
|
|
||||||
|
"Brady Patterson" <bpat@users.sourceforge.net>
|
||||||
|
* AIFF file support, PPC assembly versions of libFLAC routines
|
||||||
|
|
||||||
|
"Daisuke Shimamura" <Daisuke_Shimamura@nifty.com>
|
||||||
|
* i18n support in the XMMS plugin
|
||||||
|
|
||||||
|
"X-Fixer" <x-fixer@narod.ru>
|
||||||
|
* Configuration system, tag editing, and file info in the Winamp2 plugin
|
||||||
|
|
||||||
|
"Matt Zimmerman" <mdz@debian.org>
|
||||||
|
* Libtool/autoconf/automake make system, flac man page
|
||||||
|
|
29
deps/libFLAC/COPYING.Xiph
vendored
Normal file
29
deps/libFLAC/COPYING.Xiph
vendored
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
Copyright (C) 2000-2009 Josh Coalson
|
||||||
|
Copyright (C) 2011-2016 Xiph.Org Foundation
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions
|
||||||
|
are met:
|
||||||
|
|
||||||
|
- Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
- Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
- Neither the name of the Xiph.org Foundation nor the names of its
|
||||||
|
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 FOUNDATION OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
254
deps/libFLAC/README
vendored
Normal file
254
deps/libFLAC/README
vendored
Normal file
@ -0,0 +1,254 @@
|
|||||||
|
/* FLAC - Free Lossless Audio Codec
|
||||||
|
* Copyright (C) 2001-2009 Josh Coalson
|
||||||
|
* Copyright (C) 2011-2016 Xiph.Org Foundation
|
||||||
|
*
|
||||||
|
* This file is part the FLAC project. FLAC is comprised of several
|
||||||
|
* components distributed under different licenses. The codec libraries
|
||||||
|
* are distributed under Xiph.Org's BSD-like license (see the file
|
||||||
|
* COPYING.Xiph in this distribution). All other programs, libraries, and
|
||||||
|
* plugins are distributed under the LGPL or GPL (see COPYING.LGPL and
|
||||||
|
* COPYING.GPL). The documentation is distributed under the Gnu FDL (see
|
||||||
|
* COPYING.FDL). Each file in the FLAC distribution contains at the top the
|
||||||
|
* terms under which it may be distributed.
|
||||||
|
*
|
||||||
|
* Since this particular file is relevant to all components of FLAC,
|
||||||
|
* it may be distributed under the Xiph.Org license, which is the least
|
||||||
|
* restrictive of those mentioned above. See the file COPYING.Xiph in this
|
||||||
|
* distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
FLAC is an Open Source lossless audio codec developed by Josh Coalson from 2001
|
||||||
|
to 2009.
|
||||||
|
|
||||||
|
From January 2012 FLAC is being maintained by Erik de Castro Lopo under the
|
||||||
|
auspices of the Xiph.org Foundation.
|
||||||
|
|
||||||
|
FLAC is comprised of
|
||||||
|
* `libFLAC', a library which implements reference encoders and
|
||||||
|
decoders for native FLAC and Ogg FLAC, and a metadata interface
|
||||||
|
* `libFLAC++', a C++ object wrapper library around libFLAC
|
||||||
|
* `flac', a command-line program for encoding and decoding files
|
||||||
|
* `metaflac', a command-line program for viewing and editing FLAC
|
||||||
|
metadata
|
||||||
|
* player plugin for XMMS
|
||||||
|
* user and API documentation
|
||||||
|
|
||||||
|
The libraries (libFLAC, libFLAC++) are
|
||||||
|
licensed under Xiph.org's BSD-like license (see COPYING.Xiph). All other
|
||||||
|
programs and plugins are licensed under the GNU General Public License
|
||||||
|
(see COPYING.GPL). The documentation is licensed under the GNU Free
|
||||||
|
Documentation License (see COPYING.FDL).
|
||||||
|
|
||||||
|
|
||||||
|
===============================================================================
|
||||||
|
FLAC - 1.3.2 - Contents
|
||||||
|
===============================================================================
|
||||||
|
|
||||||
|
- Introduction
|
||||||
|
- Prerequisites
|
||||||
|
- Note to embedded developers
|
||||||
|
- Building in a GNU environment
|
||||||
|
- Building with Makefile.lite
|
||||||
|
- Building with MSVC
|
||||||
|
- Building on Mac OS X
|
||||||
|
|
||||||
|
|
||||||
|
===============================================================================
|
||||||
|
Introduction
|
||||||
|
===============================================================================
|
||||||
|
|
||||||
|
This is the source release for the FLAC project. See
|
||||||
|
|
||||||
|
doc/html/index.html
|
||||||
|
|
||||||
|
for full documentation.
|
||||||
|
|
||||||
|
A brief description of the directory tree:
|
||||||
|
|
||||||
|
doc/ the HTML documentation
|
||||||
|
examples/ example programs demonstrating the use of libFLAC and libFLAC++
|
||||||
|
include/ public include files for libFLAC and libFLAC++
|
||||||
|
man/ the man pages for `flac' and `metaflac'
|
||||||
|
src/ the source code and private headers
|
||||||
|
test/ the test scripts
|
||||||
|
|
||||||
|
If you have questions about building FLAC that this document does not answer,
|
||||||
|
please submit them at the following tracker so this document can be improved:
|
||||||
|
|
||||||
|
https://sourceforge.net/p/flac/support-requests/
|
||||||
|
|
||||||
|
|
||||||
|
===============================================================================
|
||||||
|
Prerequisites
|
||||||
|
===============================================================================
|
||||||
|
|
||||||
|
To build FLAC with support for Ogg FLAC you must have built and installed
|
||||||
|
libogg according to the specific instructions below. You must have
|
||||||
|
libogg 1.1.2 or greater, or there will be seeking problems with Ogg FLAC.
|
||||||
|
|
||||||
|
If you are building on x86 and want the assembly optimizations, you will
|
||||||
|
need to have NASM >= 0.98.30 installed according to the specific instructions
|
||||||
|
below.
|
||||||
|
|
||||||
|
|
||||||
|
===============================================================================
|
||||||
|
Note to embedded developers
|
||||||
|
===============================================================================
|
||||||
|
|
||||||
|
libFLAC has grown larger over time as more functionality has been
|
||||||
|
included, but much of it may be unnecessary for a particular embedded
|
||||||
|
implementation. Unused parts may be pruned by some simple editing of
|
||||||
|
configure.ac and src/libFLAC/Makefile.am; the following dependency
|
||||||
|
graph shows which modules may be pruned without breaking things
|
||||||
|
further down:
|
||||||
|
|
||||||
|
metadata.h
|
||||||
|
stream_decoder.h
|
||||||
|
format.h
|
||||||
|
|
||||||
|
stream_encoder.h
|
||||||
|
stream_decoder.h
|
||||||
|
format.h
|
||||||
|
|
||||||
|
stream_decoder.h
|
||||||
|
format.h
|
||||||
|
|
||||||
|
In other words, for pure decoding applications, both the stream encoder
|
||||||
|
and metadata editing interfaces can be safely removed.
|
||||||
|
|
||||||
|
There is a section dedicated to embedded use in the libFLAC API
|
||||||
|
HTML documentation (see doc/html/api/index.html).
|
||||||
|
|
||||||
|
Also, there are several places in the libFLAC code with comments marked
|
||||||
|
with "OPT:" where a #define can be changed to enable code that might be
|
||||||
|
faster on a specific platform. Experimenting with these can yield faster
|
||||||
|
binaries.
|
||||||
|
|
||||||
|
|
||||||
|
===============================================================================
|
||||||
|
Building in a GNU environment
|
||||||
|
===============================================================================
|
||||||
|
|
||||||
|
FLAC uses autoconf and libtool for configuring and building.
|
||||||
|
Better documentation for these will be forthcoming, but in
|
||||||
|
general, this should work:
|
||||||
|
|
||||||
|
./configure && make && make check && make install
|
||||||
|
|
||||||
|
The 'make check' step is optional; omit it to skip all the tests,
|
||||||
|
which can take several hours and use around 70-80 megs of disk space.
|
||||||
|
Even though it will stop with an explicit message on any failure, it
|
||||||
|
does print out a lot of stuff so you might want to capture the output
|
||||||
|
to a file if you're having a problem. Also, don't run 'make check'
|
||||||
|
as root because it confuses some of the tests.
|
||||||
|
|
||||||
|
NOTE: Despite our best efforts it's entirely possible to have
|
||||||
|
problems when using older versions of autoconf, automake, or
|
||||||
|
libtool. If you have the latest versions and still can't get it
|
||||||
|
to work, see the next section on Makefile.lite.
|
||||||
|
|
||||||
|
There are a few FLAC-specific arguments you can give to
|
||||||
|
`configure':
|
||||||
|
|
||||||
|
--enable-debug : Builds everything with debug symbols and some
|
||||||
|
extra (and more verbose) error checking.
|
||||||
|
|
||||||
|
--disable-asm-optimizations : Disables the compilation of the
|
||||||
|
assembly routines. Many routines have assembly versions for
|
||||||
|
speed and `configure' is pretty good about knowing what is
|
||||||
|
supported, but you can use this option to build only from the
|
||||||
|
C sources. May be necessary for building on OS X (Intel).
|
||||||
|
|
||||||
|
--enable-sse : If you are building for an x86 CPU that supports
|
||||||
|
SSE instructions, you can enable some of the faster routines
|
||||||
|
if your operating system also supports SSE instructions. flac
|
||||||
|
can tell if the CPU supports the instructions but currently has
|
||||||
|
no way to test if the OS does, so if it does, you must pass
|
||||||
|
this argument to configure to use the SSE routines. If flac
|
||||||
|
crashes when built with this option you will have to go back and
|
||||||
|
configure without --enable-sse. Note that
|
||||||
|
--disable-asm-optimizations implies --disable-sse.
|
||||||
|
|
||||||
|
--enable-local-xmms-plugin : Installs the FLAC XMMS plugin in
|
||||||
|
$HOME/.xmms/Plugins, instead of the global XMMS plugin area
|
||||||
|
(usually /usr/lib/xmms/Input).
|
||||||
|
|
||||||
|
--with-ogg=
|
||||||
|
--with-xmms-prefix=
|
||||||
|
--with-libiconv-prefix=
|
||||||
|
Use these if you have these packages but configure can't find them.
|
||||||
|
|
||||||
|
If you want to build completely from scratch (i.e. starting with just
|
||||||
|
configure.ac and Makefile.am) you should be able to just run 'autogen.sh'
|
||||||
|
but make sure and read the comments in that file first.
|
||||||
|
|
||||||
|
|
||||||
|
===============================================================================
|
||||||
|
Building with Makefile.lite
|
||||||
|
===============================================================================
|
||||||
|
|
||||||
|
There is a more lightweight build system for do-it-yourself-ers.
|
||||||
|
It is also useful if configure isn't working, which may be the
|
||||||
|
case since lately we've had some problems with different versions
|
||||||
|
of automake and libtool. The Makefile.lite system should work
|
||||||
|
on GNU systems with few or no adjustments.
|
||||||
|
|
||||||
|
From the top level just 'make -f Makefile.lite'. You can
|
||||||
|
specify zero or one optional target from 'release', 'debug',
|
||||||
|
'test', or 'clean'. The default is 'release'. There is no
|
||||||
|
'install' target but everything you need will end up in the
|
||||||
|
obj/ directory.
|
||||||
|
|
||||||
|
If you are not on an x86 system or you don't have nasm, you
|
||||||
|
may have to change the DEFINES in src/libFLAC/Makefile.lite. If
|
||||||
|
you don't have nasm, remove -DFLAC__HAS_NASM. If your target is
|
||||||
|
not an x86, change -DFLAC__CPU_IA32 to -DFLAC__CPU_UNKNOWN.
|
||||||
|
|
||||||
|
|
||||||
|
===============================================================================
|
||||||
|
Building with MSVC
|
||||||
|
===============================================================================
|
||||||
|
|
||||||
|
There are .vcproj projects and a master FLAC.sln solution to build all
|
||||||
|
the libraries and executables with MSVC 2005 or newer.
|
||||||
|
|
||||||
|
Prerequisite: you must have the Ogg libraries installed as described
|
||||||
|
later.
|
||||||
|
|
||||||
|
Prerequisite: you must have nasm installed, and nasm.exe must be in
|
||||||
|
your PATH, or the path to nasm.exe must be added to the list of
|
||||||
|
directories for executable files in the MSVC global options.
|
||||||
|
|
||||||
|
To build everything, run Visual Studio, do File|Open and open FLAC.sln.
|
||||||
|
From the dropdown in the toolbar, select "Release" instead of "Debug",
|
||||||
|
then do Build|Build Solution.
|
||||||
|
|
||||||
|
This will build all libraries both statically (e.g.
|
||||||
|
objs\release\lib\libFLAC_static.lib) and as DLLs (e.g.
|
||||||
|
objs\release\lib\libFLAC.dll), and it will build all binaries, statically
|
||||||
|
linked (e.g. objs\release\bin\flac.exe).
|
||||||
|
|
||||||
|
Everything will end up in the "objs" directory. DLLs and .exe files
|
||||||
|
are all that are needed and can be copied to an installation area and
|
||||||
|
added to the PATH.
|
||||||
|
|
||||||
|
By default the code is configured with Ogg support. Before building FLAC
|
||||||
|
you will need to get the Ogg source distribution
|
||||||
|
(see http://xiph.org/downloads/), build libogg_static.lib (load
|
||||||
|
win32\libogg_static.sln, change solution configuration to "Release" and
|
||||||
|
code generation to "Multi-threaded (/MT)", then build), copy libogg_static.lib
|
||||||
|
into FLAC's 'objs\release\lib' directory, and copy the entire include\ogg tree
|
||||||
|
into FLAC's 'include' directory (so that there is an 'ogg' directory in FLAC's
|
||||||
|
'include' directory with the files ogg.h, os_types.h and config_types.h).
|
||||||
|
|
||||||
|
If you want to build without Ogg support, instead edit all .vcproj files
|
||||||
|
and remove any "FLAC__HAS_OGG" definitions.
|
||||||
|
|
||||||
|
|
||||||
|
===============================================================================
|
||||||
|
Building on Mac OS X
|
||||||
|
===============================================================================
|
||||||
|
|
||||||
|
If you have Fink or a recent version of OS X with the proper autotools,
|
||||||
|
the GNU flow above should work.
|
73
deps/libFLAC/bitmath.c
vendored
Normal file
73
deps/libFLAC/bitmath.c
vendored
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
/* libFLAC - Free Lossless Audio Codec library
|
||||||
|
* Copyright (C) 2001-2009 Josh Coalson
|
||||||
|
* Copyright (C) 2011-2016 Xiph.Org Foundation
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Xiph.org Foundation nor the names of its
|
||||||
|
* 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 FOUNDATION OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "private/bitmath.h"
|
||||||
|
|
||||||
|
/* An example of what FLAC__bitmath_silog2() computes:
|
||||||
|
*
|
||||||
|
* silog2(-10) = 5
|
||||||
|
* silog2(- 9) = 5
|
||||||
|
* silog2(- 8) = 4
|
||||||
|
* silog2(- 7) = 4
|
||||||
|
* silog2(- 6) = 4
|
||||||
|
* silog2(- 5) = 4
|
||||||
|
* silog2(- 4) = 3
|
||||||
|
* silog2(- 3) = 3
|
||||||
|
* silog2(- 2) = 2
|
||||||
|
* silog2(- 1) = 2
|
||||||
|
* silog2( 0) = 0
|
||||||
|
* silog2( 1) = 2
|
||||||
|
* silog2( 2) = 3
|
||||||
|
* silog2( 3) = 3
|
||||||
|
* silog2( 4) = 4
|
||||||
|
* silog2( 5) = 4
|
||||||
|
* silog2( 6) = 4
|
||||||
|
* silog2( 7) = 4
|
||||||
|
* silog2( 8) = 5
|
||||||
|
* silog2( 9) = 5
|
||||||
|
* silog2( 10) = 5
|
||||||
|
*/
|
||||||
|
unsigned FLAC__bitmath_silog2(FLAC__int64 v)
|
||||||
|
{
|
||||||
|
if(v == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if(v == -1)
|
||||||
|
return 2;
|
||||||
|
|
||||||
|
v = (v < 0) ? (-(v+1)) : v;
|
||||||
|
return FLAC__bitmath_ilog2_wide(v)+2;
|
||||||
|
}
|
1087
deps/libFLAC/bitreader.c
vendored
Normal file
1087
deps/libFLAC/bitreader.c
vendored
Normal file
File diff suppressed because it is too large
Load Diff
293
deps/libFLAC/cpu.c
vendored
Normal file
293
deps/libFLAC/cpu.c
vendored
Normal file
@ -0,0 +1,293 @@
|
|||||||
|
/* libFLAC - Free Lossless Audio Codec library
|
||||||
|
* Copyright (C) 2001-2009 Josh Coalson
|
||||||
|
* Copyright (C) 2011-2016 Xiph.Org Foundation
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Xiph.org Foundation nor the names of its
|
||||||
|
* 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 FOUNDATION OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "private/cpu.h"
|
||||||
|
#include "share/compat.h"
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#if defined(_MSC_VER)
|
||||||
|
# include <intrin.h> /* for __cpuid() and _xgetbv() */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined __GNUC__ && defined HAVE_CPUID_H
|
||||||
|
# include <cpuid.h> /* for __get_cpuid() and __get_cpuid_max() */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#define dfprintf fprintf
|
||||||
|
#else
|
||||||
|
/* This is bad practice, it should be a static void empty function */
|
||||||
|
#define dfprintf(file, format, ...)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if defined FLAC__CPU_IA32
|
||||||
|
/* these are flags in EDX of CPUID AX=00000001 */
|
||||||
|
static const unsigned FLAC__CPUINFO_IA32_CPUID_CMOV = 0x00008000;
|
||||||
|
static const unsigned FLAC__CPUINFO_IA32_CPUID_MMX = 0x00800000;
|
||||||
|
static const unsigned FLAC__CPUINFO_IA32_CPUID_SSE = 0x02000000;
|
||||||
|
static const unsigned FLAC__CPUINFO_IA32_CPUID_SSE2 = 0x04000000;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if FLAC__HAS_X86INTRIN || FLAC__AVX_SUPPORTED
|
||||||
|
/* these are flags in ECX of CPUID AX=00000001 */
|
||||||
|
static const unsigned FLAC__CPUINFO_IA32_CPUID_SSE3 = 0x00000001;
|
||||||
|
static const unsigned FLAC__CPUINFO_IA32_CPUID_SSSE3 = 0x00000200;
|
||||||
|
static const unsigned FLAC__CPUINFO_IA32_CPUID_SSE41 = 0x00080000;
|
||||||
|
static const unsigned FLAC__CPUINFO_IA32_CPUID_SSE42 = 0x00100000;
|
||||||
|
|
||||||
|
/* these are flags in ECX of CPUID AX=00000001 */
|
||||||
|
static const unsigned FLAC__CPUINFO_IA32_CPUID_OSXSAVE = 0x08000000;
|
||||||
|
static const unsigned FLAC__CPUINFO_IA32_CPUID_AVX = 0x10000000;
|
||||||
|
static const unsigned FLAC__CPUINFO_IA32_CPUID_FMA = 0x00001000;
|
||||||
|
/* these are flags in EBX of CPUID AX=00000007 */
|
||||||
|
static const unsigned FLAC__CPUINFO_IA32_CPUID_AVX2 = 0x00000020;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64
|
||||||
|
static uint32_t
|
||||||
|
cpu_xgetbv_x86(void)
|
||||||
|
{
|
||||||
|
#if (defined _MSC_VER || defined __INTEL_COMPILER) && FLAC__HAS_X86INTRIN && FLAC__AVX_SUPPORTED
|
||||||
|
return (uint32_t)_xgetbv(0);
|
||||||
|
#elif defined __GNUC__
|
||||||
|
uint32_t lo, hi;
|
||||||
|
asm volatile (".byte 0x0f, 0x01, 0xd0" : "=a"(lo), "=d"(hi) : "c" (0));
|
||||||
|
return lo;
|
||||||
|
#else
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static void
|
||||||
|
ia32_cpu_info (FLAC__CPUInfo *info)
|
||||||
|
{
|
||||||
|
#if !defined FLAC__CPU_IA32
|
||||||
|
(void) info;
|
||||||
|
#else
|
||||||
|
FLAC__bool ia32_osxsave = false;
|
||||||
|
FLAC__uint32 flags_eax, flags_ebx, flags_ecx, flags_edx;
|
||||||
|
|
||||||
|
#if !defined FLAC__NO_ASM && (defined FLAC__HAS_NASM || FLAC__HAS_X86INTRIN)
|
||||||
|
info->use_asm = true; /* we assume a minimum of 80386 with FLAC__CPU_IA32 */
|
||||||
|
#if defined FLAC__HAS_NASM
|
||||||
|
if(!FLAC__cpu_have_cpuid_asm_ia32())
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
|
/* http://www.sandpile.org/x86/cpuid.htm */
|
||||||
|
if (FLAC__HAS_X86INTRIN) {
|
||||||
|
FLAC__cpu_info_x86(0, &flags_eax, &flags_ebx, &flags_ecx, &flags_edx);
|
||||||
|
info->ia32.intel = (flags_ebx == 0x756E6547 && flags_edx == 0x49656E69 && flags_ecx == 0x6C65746E) ? true : false; /* GenuineIntel */
|
||||||
|
FLAC__cpu_info_x86(1, &flags_eax, &flags_ebx, &flags_ecx, &flags_edx);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
FLAC__cpu_info_asm_ia32(&flags_edx, &flags_ecx);
|
||||||
|
}
|
||||||
|
|
||||||
|
info->ia32.cmov = (flags_edx & FLAC__CPUINFO_IA32_CPUID_CMOV ) ? true : false;
|
||||||
|
info->ia32.mmx = (flags_edx & FLAC__CPUINFO_IA32_CPUID_MMX ) ? true : false;
|
||||||
|
info->ia32.sse = (flags_edx & FLAC__CPUINFO_IA32_CPUID_SSE ) ? true : false;
|
||||||
|
info->ia32.sse2 = (flags_edx & FLAC__CPUINFO_IA32_CPUID_SSE2 ) ? true : false;
|
||||||
|
info->ia32.sse3 = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_SSE3 ) ? true : false;
|
||||||
|
info->ia32.ssse3 = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_SSSE3) ? true : false;
|
||||||
|
info->ia32.sse41 = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_SSE41) ? true : false;
|
||||||
|
info->ia32.sse42 = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_SSE42) ? true : false;
|
||||||
|
|
||||||
|
if (FLAC__HAS_X86INTRIN && FLAC__AVX_SUPPORTED) {
|
||||||
|
ia32_osxsave = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_OSXSAVE) ? true : false;
|
||||||
|
info->ia32.avx = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_AVX ) ? true : false;
|
||||||
|
info->ia32.fma = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_FMA ) ? true : false;
|
||||||
|
FLAC__cpu_info_x86(7, &flags_eax, &flags_ebx, &flags_ecx, &flags_edx);
|
||||||
|
info->ia32.avx2 = (flags_ebx & FLAC__CPUINFO_IA32_CPUID_AVX2 ) ? true : false;
|
||||||
|
}
|
||||||
|
|
||||||
|
dfprintf(stderr, "CPU info (IA-32):\n");
|
||||||
|
dfprintf(stderr, " CMOV ....... %c\n", info->ia32.cmov ? 'Y' : 'n');
|
||||||
|
dfprintf(stderr, " MMX ........ %c\n", info->ia32.mmx ? 'Y' : 'n');
|
||||||
|
dfprintf(stderr, " SSE ........ %c\n", info->ia32.sse ? 'Y' : 'n');
|
||||||
|
dfprintf(stderr, " SSE2 ....... %c\n", info->ia32.sse2 ? 'Y' : 'n');
|
||||||
|
dfprintf(stderr, " SSE3 ....... %c\n", info->ia32.sse3 ? 'Y' : 'n');
|
||||||
|
dfprintf(stderr, " SSSE3 ...... %c\n", info->ia32.ssse3 ? 'Y' : 'n');
|
||||||
|
dfprintf(stderr, " SSE41 ...... %c\n", info->ia32.sse41 ? 'Y' : 'n');
|
||||||
|
dfprintf(stderr, " SSE42 ...... %c\n", info->ia32.sse42 ? 'Y' : 'n');
|
||||||
|
|
||||||
|
if (FLAC__HAS_X86INTRIN && FLAC__AVX_SUPPORTED) {
|
||||||
|
dfprintf(stderr, " AVX ........ %c\n", info->ia32.avx ? 'Y' : 'n');
|
||||||
|
dfprintf(stderr, " FMA ........ %c\n", info->ia32.fma ? 'Y' : 'n');
|
||||||
|
dfprintf(stderr, " AVX2 ....... %c\n", info->ia32.avx2 ? 'Y' : 'n');
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* now have to check for OS support of AVX instructions
|
||||||
|
*/
|
||||||
|
if (!FLAC__HAS_X86INTRIN || !info->ia32.avx || !ia32_osxsave || (cpu_xgetbv_x86() & 0x6) != 0x6) {
|
||||||
|
/* no OS AVX support */
|
||||||
|
info->ia32.avx = false;
|
||||||
|
info->ia32.avx2 = false;
|
||||||
|
info->ia32.fma = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (FLAC__HAS_X86INTRIN && FLAC__AVX_SUPPORTED) {
|
||||||
|
dfprintf(stderr, " AVX OS sup . %c\n", info->ia32.avx ? 'Y' : 'n');
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
info->use_asm = false;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
x86_64_cpu_info (FLAC__CPUInfo *info)
|
||||||
|
{
|
||||||
|
#if !defined FLAC__NO_ASM && FLAC__HAS_X86INTRIN
|
||||||
|
FLAC__bool x86_osxsave = false;
|
||||||
|
FLAC__uint32 flags_eax, flags_ebx, flags_ecx, flags_edx;
|
||||||
|
|
||||||
|
info->use_asm = true;
|
||||||
|
|
||||||
|
/* http://www.sandpile.org/x86/cpuid.htm */
|
||||||
|
FLAC__cpu_info_x86(0, &flags_eax, &flags_ebx, &flags_ecx, &flags_edx);
|
||||||
|
info->x86.intel = (flags_ebx == 0x756E6547 && flags_edx == 0x49656E69 && flags_ecx == 0x6C65746E) ? true : false; /* GenuineIntel */
|
||||||
|
FLAC__cpu_info_x86(1, &flags_eax, &flags_ebx, &flags_ecx, &flags_edx);
|
||||||
|
info->x86.sse3 = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_SSE3 ) ? true : false;
|
||||||
|
info->x86.ssse3 = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_SSSE3) ? true : false;
|
||||||
|
info->x86.sse41 = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_SSE41) ? true : false;
|
||||||
|
info->x86.sse42 = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_SSE42) ? true : false;
|
||||||
|
|
||||||
|
if (FLAC__AVX_SUPPORTED) {
|
||||||
|
x86_osxsave = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_OSXSAVE) ? true : false;
|
||||||
|
info->x86.avx = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_AVX ) ? true : false;
|
||||||
|
info->x86.fma = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_FMA ) ? true : false;
|
||||||
|
FLAC__cpu_info_x86(7, &flags_eax, &flags_ebx, &flags_ecx, &flags_edx);
|
||||||
|
info->x86.avx2 = (flags_ebx & FLAC__CPUINFO_IA32_CPUID_AVX2 ) ? true : false;
|
||||||
|
}
|
||||||
|
|
||||||
|
dfprintf(stderr, "CPU info (x86-64):\n");
|
||||||
|
dfprintf(stderr, " SSE3 ....... %c\n", info->x86.sse3 ? 'Y' : 'n');
|
||||||
|
dfprintf(stderr, " SSSE3 ...... %c\n", info->x86.ssse3 ? 'Y' : 'n');
|
||||||
|
dfprintf(stderr, " SSE41 ...... %c\n", info->x86.sse41 ? 'Y' : 'n');
|
||||||
|
dfprintf(stderr, " SSE42 ...... %c\n", info->x86.sse42 ? 'Y' : 'n');
|
||||||
|
|
||||||
|
if (FLAC__AVX_SUPPORTED) {
|
||||||
|
dfprintf(stderr, " AVX ........ %c\n", info->x86.avx ? 'Y' : 'n');
|
||||||
|
dfprintf(stderr, " FMA ........ %c\n", info->x86.fma ? 'Y' : 'n');
|
||||||
|
dfprintf(stderr, " AVX2 ....... %c\n", info->x86.avx2 ? 'Y' : 'n');
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* now have to check for OS support of AVX instructions
|
||||||
|
*/
|
||||||
|
if (!info->x86.avx || !x86_osxsave || (cpu_xgetbv_x86() & 0x6) != 0x6) {
|
||||||
|
/* no OS AVX support */
|
||||||
|
info->x86.avx = false;
|
||||||
|
info->x86.avx2 = false;
|
||||||
|
info->x86.fma = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (FLAC__AVX_SUPPORTED) {
|
||||||
|
dfprintf(stderr, " AVX OS sup . %c\n", info->x86.avx ? 'Y' : 'n');
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
/* Silence compiler warnings. */
|
||||||
|
(void) info;
|
||||||
|
#if defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64
|
||||||
|
if (0) cpu_xgetbv_x86 ();
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void FLAC__cpu_info (FLAC__CPUInfo *info)
|
||||||
|
{
|
||||||
|
memset(info, 0, sizeof(*info));
|
||||||
|
|
||||||
|
#ifdef FLAC__CPU_IA32
|
||||||
|
info->type = FLAC__CPUINFO_TYPE_IA32;
|
||||||
|
#elif defined FLAC__CPU_X86_64
|
||||||
|
info->type = FLAC__CPUINFO_TYPE_X86_64;
|
||||||
|
#else
|
||||||
|
info->type = FLAC__CPUINFO_TYPE_UNKNOWN;
|
||||||
|
info->use_asm = false;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
switch (info->type) {
|
||||||
|
case FLAC__CPUINFO_TYPE_IA32:
|
||||||
|
ia32_cpu_info (info);
|
||||||
|
break;
|
||||||
|
case FLAC__CPUINFO_TYPE_X86_64:
|
||||||
|
x86_64_cpu_info (info);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
info->use_asm = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#if (defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64) && FLAC__HAS_X86INTRIN
|
||||||
|
|
||||||
|
void FLAC__cpu_info_x86(FLAC__uint32 level, FLAC__uint32 *eax, FLAC__uint32 *ebx, FLAC__uint32 *ecx, FLAC__uint32 *edx)
|
||||||
|
{
|
||||||
|
#if defined _MSC_VER || defined __INTEL_COMPILER
|
||||||
|
int cpuinfo[4];
|
||||||
|
int ext = level & 0x80000000;
|
||||||
|
__cpuid(cpuinfo, ext);
|
||||||
|
if((unsigned)cpuinfo[0] >= level) {
|
||||||
|
#if FLAC__AVX_SUPPORTED
|
||||||
|
__cpuidex(cpuinfo, ext, 0); /* for AVX2 detection */
|
||||||
|
#else
|
||||||
|
__cpuid(cpuinfo, ext); /* some old compilers don't support __cpuidex */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
*eax = cpuinfo[0]; *ebx = cpuinfo[1]; *ecx = cpuinfo[2]; *edx = cpuinfo[3];
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#elif defined __GNUC__ && defined HAVE_CPUID_H
|
||||||
|
FLAC__uint32 ext = level & 0x80000000;
|
||||||
|
__cpuid(ext, *eax, *ebx, *ecx, *edx);
|
||||||
|
if (*eax >= level) {
|
||||||
|
__cpuid_count(level, 0, *eax, *ebx, *ecx, *edx);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
*eax = *ebx = *ecx = *edx = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* (FLAC__CPU_IA32 || FLAC__CPU_X86_64) && FLAC__HAS_X86INTRIN */
|
143
deps/libFLAC/crc.c
vendored
Normal file
143
deps/libFLAC/crc.c
vendored
Normal file
@ -0,0 +1,143 @@
|
|||||||
|
/* libFLAC - Free Lossless Audio Codec library
|
||||||
|
* Copyright (C) 2000-2009 Josh Coalson
|
||||||
|
* Copyright (C) 2011-2016 Xiph.Org Foundation
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Xiph.org Foundation nor the names of its
|
||||||
|
* 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 FOUNDATION OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "private/crc.h"
|
||||||
|
|
||||||
|
/* CRC-8, poly = x^8 + x^2 + x^1 + x^0, init = 0 */
|
||||||
|
|
||||||
|
FLAC__byte const FLAC__crc8_table[256] = {
|
||||||
|
0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15,
|
||||||
|
0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D,
|
||||||
|
0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65,
|
||||||
|
0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D,
|
||||||
|
0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB, 0xF2, 0xF5,
|
||||||
|
0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD,
|
||||||
|
0x90, 0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85,
|
||||||
|
0xA8, 0xAF, 0xA6, 0xA1, 0xB4, 0xB3, 0xBA, 0xBD,
|
||||||
|
0xC7, 0xC0, 0xC9, 0xCE, 0xDB, 0xDC, 0xD5, 0xD2,
|
||||||
|
0xFF, 0xF8, 0xF1, 0xF6, 0xE3, 0xE4, 0xED, 0xEA,
|
||||||
|
0xB7, 0xB0, 0xB9, 0xBE, 0xAB, 0xAC, 0xA5, 0xA2,
|
||||||
|
0x8F, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9D, 0x9A,
|
||||||
|
0x27, 0x20, 0x29, 0x2E, 0x3B, 0x3C, 0x35, 0x32,
|
||||||
|
0x1F, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0D, 0x0A,
|
||||||
|
0x57, 0x50, 0x59, 0x5E, 0x4B, 0x4C, 0x45, 0x42,
|
||||||
|
0x6F, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7D, 0x7A,
|
||||||
|
0x89, 0x8E, 0x87, 0x80, 0x95, 0x92, 0x9B, 0x9C,
|
||||||
|
0xB1, 0xB6, 0xBF, 0xB8, 0xAD, 0xAA, 0xA3, 0xA4,
|
||||||
|
0xF9, 0xFE, 0xF7, 0xF0, 0xE5, 0xE2, 0xEB, 0xEC,
|
||||||
|
0xC1, 0xC6, 0xCF, 0xC8, 0xDD, 0xDA, 0xD3, 0xD4,
|
||||||
|
0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C,
|
||||||
|
0x51, 0x56, 0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44,
|
||||||
|
0x19, 0x1E, 0x17, 0x10, 0x05, 0x02, 0x0B, 0x0C,
|
||||||
|
0x21, 0x26, 0x2F, 0x28, 0x3D, 0x3A, 0x33, 0x34,
|
||||||
|
0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B,
|
||||||
|
0x76, 0x71, 0x78, 0x7F, 0x6A, 0x6D, 0x64, 0x63,
|
||||||
|
0x3E, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2C, 0x2B,
|
||||||
|
0x06, 0x01, 0x08, 0x0F, 0x1A, 0x1D, 0x14, 0x13,
|
||||||
|
0xAE, 0xA9, 0xA0, 0xA7, 0xB2, 0xB5, 0xBC, 0xBB,
|
||||||
|
0x96, 0x91, 0x98, 0x9F, 0x8A, 0x8D, 0x84, 0x83,
|
||||||
|
0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC, 0xCB,
|
||||||
|
0xE6, 0xE1, 0xE8, 0xEF, 0xFA, 0xFD, 0xF4, 0xF3
|
||||||
|
};
|
||||||
|
|
||||||
|
/* CRC-16, poly = x^16 + x^15 + x^2 + x^0, init = 0 */
|
||||||
|
|
||||||
|
unsigned const FLAC__crc16_table[256] = {
|
||||||
|
0x0000, 0x8005, 0x800f, 0x000a, 0x801b, 0x001e, 0x0014, 0x8011,
|
||||||
|
0x8033, 0x0036, 0x003c, 0x8039, 0x0028, 0x802d, 0x8027, 0x0022,
|
||||||
|
0x8063, 0x0066, 0x006c, 0x8069, 0x0078, 0x807d, 0x8077, 0x0072,
|
||||||
|
0x0050, 0x8055, 0x805f, 0x005a, 0x804b, 0x004e, 0x0044, 0x8041,
|
||||||
|
0x80c3, 0x00c6, 0x00cc, 0x80c9, 0x00d8, 0x80dd, 0x80d7, 0x00d2,
|
||||||
|
0x00f0, 0x80f5, 0x80ff, 0x00fa, 0x80eb, 0x00ee, 0x00e4, 0x80e1,
|
||||||
|
0x00a0, 0x80a5, 0x80af, 0x00aa, 0x80bb, 0x00be, 0x00b4, 0x80b1,
|
||||||
|
0x8093, 0x0096, 0x009c, 0x8099, 0x0088, 0x808d, 0x8087, 0x0082,
|
||||||
|
0x8183, 0x0186, 0x018c, 0x8189, 0x0198, 0x819d, 0x8197, 0x0192,
|
||||||
|
0x01b0, 0x81b5, 0x81bf, 0x01ba, 0x81ab, 0x01ae, 0x01a4, 0x81a1,
|
||||||
|
0x01e0, 0x81e5, 0x81ef, 0x01ea, 0x81fb, 0x01fe, 0x01f4, 0x81f1,
|
||||||
|
0x81d3, 0x01d6, 0x01dc, 0x81d9, 0x01c8, 0x81cd, 0x81c7, 0x01c2,
|
||||||
|
0x0140, 0x8145, 0x814f, 0x014a, 0x815b, 0x015e, 0x0154, 0x8151,
|
||||||
|
0x8173, 0x0176, 0x017c, 0x8179, 0x0168, 0x816d, 0x8167, 0x0162,
|
||||||
|
0x8123, 0x0126, 0x012c, 0x8129, 0x0138, 0x813d, 0x8137, 0x0132,
|
||||||
|
0x0110, 0x8115, 0x811f, 0x011a, 0x810b, 0x010e, 0x0104, 0x8101,
|
||||||
|
0x8303, 0x0306, 0x030c, 0x8309, 0x0318, 0x831d, 0x8317, 0x0312,
|
||||||
|
0x0330, 0x8335, 0x833f, 0x033a, 0x832b, 0x032e, 0x0324, 0x8321,
|
||||||
|
0x0360, 0x8365, 0x836f, 0x036a, 0x837b, 0x037e, 0x0374, 0x8371,
|
||||||
|
0x8353, 0x0356, 0x035c, 0x8359, 0x0348, 0x834d, 0x8347, 0x0342,
|
||||||
|
0x03c0, 0x83c5, 0x83cf, 0x03ca, 0x83db, 0x03de, 0x03d4, 0x83d1,
|
||||||
|
0x83f3, 0x03f6, 0x03fc, 0x83f9, 0x03e8, 0x83ed, 0x83e7, 0x03e2,
|
||||||
|
0x83a3, 0x03a6, 0x03ac, 0x83a9, 0x03b8, 0x83bd, 0x83b7, 0x03b2,
|
||||||
|
0x0390, 0x8395, 0x839f, 0x039a, 0x838b, 0x038e, 0x0384, 0x8381,
|
||||||
|
0x0280, 0x8285, 0x828f, 0x028a, 0x829b, 0x029e, 0x0294, 0x8291,
|
||||||
|
0x82b3, 0x02b6, 0x02bc, 0x82b9, 0x02a8, 0x82ad, 0x82a7, 0x02a2,
|
||||||
|
0x82e3, 0x02e6, 0x02ec, 0x82e9, 0x02f8, 0x82fd, 0x82f7, 0x02f2,
|
||||||
|
0x02d0, 0x82d5, 0x82df, 0x02da, 0x82cb, 0x02ce, 0x02c4, 0x82c1,
|
||||||
|
0x8243, 0x0246, 0x024c, 0x8249, 0x0258, 0x825d, 0x8257, 0x0252,
|
||||||
|
0x0270, 0x8275, 0x827f, 0x027a, 0x826b, 0x026e, 0x0264, 0x8261,
|
||||||
|
0x0220, 0x8225, 0x822f, 0x022a, 0x823b, 0x023e, 0x0234, 0x8231,
|
||||||
|
0x8213, 0x0216, 0x021c, 0x8219, 0x0208, 0x820d, 0x8207, 0x0202
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
void FLAC__crc8_update(const FLAC__byte data, FLAC__uint8 *crc)
|
||||||
|
{
|
||||||
|
*crc = FLAC__crc8_table[*crc ^ data];
|
||||||
|
}
|
||||||
|
|
||||||
|
void FLAC__crc8_update_block(const FLAC__byte *data, unsigned len, FLAC__uint8 *crc)
|
||||||
|
{
|
||||||
|
while(len--)
|
||||||
|
*crc = FLAC__crc8_table[*crc ^ *data++];
|
||||||
|
}
|
||||||
|
|
||||||
|
FLAC__uint8 FLAC__crc8(const FLAC__byte *data, unsigned len)
|
||||||
|
{
|
||||||
|
FLAC__uint8 crc = 0;
|
||||||
|
|
||||||
|
while(len--)
|
||||||
|
crc = FLAC__crc8_table[crc ^ *data++];
|
||||||
|
|
||||||
|
return crc;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned FLAC__crc16(const FLAC__byte *data, unsigned len)
|
||||||
|
{
|
||||||
|
unsigned crc = 0;
|
||||||
|
|
||||||
|
while(len--)
|
||||||
|
crc = ((crc<<8) ^ FLAC__crc16_table[(crc>>8) ^ *data++]) & 0xffff;
|
||||||
|
|
||||||
|
return crc;
|
||||||
|
}
|
395
deps/libFLAC/fixed.c
vendored
Normal file
395
deps/libFLAC/fixed.c
vendored
Normal file
@ -0,0 +1,395 @@
|
|||||||
|
/* libFLAC - Free Lossless Audio Codec library
|
||||||
|
* Copyright (C) 2000-2009 Josh Coalson
|
||||||
|
* Copyright (C) 2011-2016 Xiph.Org Foundation
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Xiph.org Foundation nor the names of its
|
||||||
|
* 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 FOUNDATION OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "share/compat.h"
|
||||||
|
#include "private/bitmath.h"
|
||||||
|
#include "private/fixed.h"
|
||||||
|
#include "private/macros.h"
|
||||||
|
#include "FLAC/assert.h"
|
||||||
|
|
||||||
|
#ifdef local_abs
|
||||||
|
#undef local_abs
|
||||||
|
#endif
|
||||||
|
#define local_abs(x) ((unsigned)((x)<0? -(x) : (x)))
|
||||||
|
|
||||||
|
#ifdef FLAC__INTEGER_ONLY_LIBRARY
|
||||||
|
/* rbps stands for residual bits per sample
|
||||||
|
*
|
||||||
|
* (ln(2) * err)
|
||||||
|
* rbps = log (-----------)
|
||||||
|
* 2 ( n )
|
||||||
|
*/
|
||||||
|
static FLAC__fixedpoint local__compute_rbps_integerized(FLAC__uint32 err, FLAC__uint32 n)
|
||||||
|
{
|
||||||
|
FLAC__uint32 rbps;
|
||||||
|
unsigned bits; /* the number of bits required to represent a number */
|
||||||
|
int fracbits; /* the number of bits of rbps that comprise the fractional part */
|
||||||
|
|
||||||
|
FLAC__ASSERT(sizeof(rbps) == sizeof(FLAC__fixedpoint));
|
||||||
|
FLAC__ASSERT(err > 0);
|
||||||
|
FLAC__ASSERT(n > 0);
|
||||||
|
|
||||||
|
FLAC__ASSERT(n <= FLAC__MAX_BLOCK_SIZE);
|
||||||
|
if(err <= n)
|
||||||
|
return 0;
|
||||||
|
/*
|
||||||
|
* The above two things tell us 1) n fits in 16 bits; 2) err/n > 1.
|
||||||
|
* These allow us later to know we won't lose too much precision in the
|
||||||
|
* fixed-point division (err<<fracbits)/n.
|
||||||
|
*/
|
||||||
|
|
||||||
|
fracbits = (8*sizeof(err)) - (FLAC__bitmath_ilog2(err)+1);
|
||||||
|
|
||||||
|
err <<= fracbits;
|
||||||
|
err /= n;
|
||||||
|
/* err now holds err/n with fracbits fractional bits */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Whittle err down to 16 bits max. 16 significant bits is enough for
|
||||||
|
* our purposes.
|
||||||
|
*/
|
||||||
|
FLAC__ASSERT(err > 0);
|
||||||
|
bits = FLAC__bitmath_ilog2(err)+1;
|
||||||
|
if(bits > 16) {
|
||||||
|
err >>= (bits-16);
|
||||||
|
fracbits -= (bits-16);
|
||||||
|
}
|
||||||
|
rbps = (FLAC__uint32)err;
|
||||||
|
|
||||||
|
/* Multiply by fixed-point version of ln(2), with 16 fractional bits */
|
||||||
|
rbps *= FLAC__FP_LN2;
|
||||||
|
fracbits += 16;
|
||||||
|
FLAC__ASSERT(fracbits >= 0);
|
||||||
|
|
||||||
|
/* FLAC__fixedpoint_log2 requires fracbits%4 to be 0 */
|
||||||
|
{
|
||||||
|
const int f = fracbits & 3;
|
||||||
|
if(f) {
|
||||||
|
rbps >>= f;
|
||||||
|
fracbits -= f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rbps = FLAC__fixedpoint_log2(rbps, fracbits, (unsigned)(-1));
|
||||||
|
|
||||||
|
if(rbps == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The return value must have 16 fractional bits. Since the whole part
|
||||||
|
* of the base-2 log of a 32 bit number must fit in 5 bits, and fracbits
|
||||||
|
* must be >= -3, these assertion allows us to be able to shift rbps
|
||||||
|
* left if necessary to get 16 fracbits without losing any bits of the
|
||||||
|
* whole part of rbps.
|
||||||
|
*
|
||||||
|
* There is a slight chance due to accumulated error that the whole part
|
||||||
|
* will require 6 bits, so we use 6 in the assertion. Really though as
|
||||||
|
* long as it fits in 13 bits (32 - (16 - (-3))) we are fine.
|
||||||
|
*/
|
||||||
|
FLAC__ASSERT((int)FLAC__bitmath_ilog2(rbps)+1 <= fracbits + 6);
|
||||||
|
FLAC__ASSERT(fracbits >= -3);
|
||||||
|
|
||||||
|
/* now shift the decimal point into place */
|
||||||
|
if(fracbits < 16)
|
||||||
|
return rbps << (16-fracbits);
|
||||||
|
else if(fracbits > 16)
|
||||||
|
return rbps >> (fracbits-16);
|
||||||
|
else
|
||||||
|
return rbps;
|
||||||
|
}
|
||||||
|
|
||||||
|
static FLAC__fixedpoint local__compute_rbps_wide_integerized(FLAC__uint64 err, FLAC__uint32 n)
|
||||||
|
{
|
||||||
|
FLAC__uint32 rbps;
|
||||||
|
unsigned bits; /* the number of bits required to represent a number */
|
||||||
|
int fracbits; /* the number of bits of rbps that comprise the fractional part */
|
||||||
|
|
||||||
|
FLAC__ASSERT(sizeof(rbps) == sizeof(FLAC__fixedpoint));
|
||||||
|
FLAC__ASSERT(err > 0);
|
||||||
|
FLAC__ASSERT(n > 0);
|
||||||
|
|
||||||
|
FLAC__ASSERT(n <= FLAC__MAX_BLOCK_SIZE);
|
||||||
|
if(err <= n)
|
||||||
|
return 0;
|
||||||
|
/*
|
||||||
|
* The above two things tell us 1) n fits in 16 bits; 2) err/n > 1.
|
||||||
|
* These allow us later to know we won't lose too much precision in the
|
||||||
|
* fixed-point division (err<<fracbits)/n.
|
||||||
|
*/
|
||||||
|
|
||||||
|
fracbits = (8*sizeof(err)) - (FLAC__bitmath_ilog2_wide(err)+1);
|
||||||
|
|
||||||
|
err <<= fracbits;
|
||||||
|
err /= n;
|
||||||
|
/* err now holds err/n with fracbits fractional bits */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Whittle err down to 16 bits max. 16 significant bits is enough for
|
||||||
|
* our purposes.
|
||||||
|
*/
|
||||||
|
FLAC__ASSERT(err > 0);
|
||||||
|
bits = FLAC__bitmath_ilog2_wide(err)+1;
|
||||||
|
if(bits > 16) {
|
||||||
|
err >>= (bits-16);
|
||||||
|
fracbits -= (bits-16);
|
||||||
|
}
|
||||||
|
rbps = (FLAC__uint32)err;
|
||||||
|
|
||||||
|
/* Multiply by fixed-point version of ln(2), with 16 fractional bits */
|
||||||
|
rbps *= FLAC__FP_LN2;
|
||||||
|
fracbits += 16;
|
||||||
|
FLAC__ASSERT(fracbits >= 0);
|
||||||
|
|
||||||
|
/* FLAC__fixedpoint_log2 requires fracbits%4 to be 0 */
|
||||||
|
{
|
||||||
|
const int f = fracbits & 3;
|
||||||
|
if(f) {
|
||||||
|
rbps >>= f;
|
||||||
|
fracbits -= f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rbps = FLAC__fixedpoint_log2(rbps, fracbits, (unsigned)(-1));
|
||||||
|
|
||||||
|
if(rbps == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The return value must have 16 fractional bits. Since the whole part
|
||||||
|
* of the base-2 log of a 32 bit number must fit in 5 bits, and fracbits
|
||||||
|
* must be >= -3, these assertion allows us to be able to shift rbps
|
||||||
|
* left if necessary to get 16 fracbits without losing any bits of the
|
||||||
|
* whole part of rbps.
|
||||||
|
*
|
||||||
|
* There is a slight chance due to accumulated error that the whole part
|
||||||
|
* will require 6 bits, so we use 6 in the assertion. Really though as
|
||||||
|
* long as it fits in 13 bits (32 - (16 - (-3))) we are fine.
|
||||||
|
*/
|
||||||
|
FLAC__ASSERT((int)FLAC__bitmath_ilog2(rbps)+1 <= fracbits + 6);
|
||||||
|
FLAC__ASSERT(fracbits >= -3);
|
||||||
|
|
||||||
|
/* now shift the decimal point into place */
|
||||||
|
if(fracbits < 16)
|
||||||
|
return rbps << (16-fracbits);
|
||||||
|
else if(fracbits > 16)
|
||||||
|
return rbps >> (fracbits-16);
|
||||||
|
else
|
||||||
|
return rbps;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef FLAC__INTEGER_ONLY_LIBRARY
|
||||||
|
unsigned FLAC__fixed_compute_best_predictor(const FLAC__int32 data[], unsigned data_len, float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1])
|
||||||
|
#else
|
||||||
|
unsigned FLAC__fixed_compute_best_predictor(const FLAC__int32 data[], unsigned data_len, FLAC__fixedpoint residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1])
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
FLAC__int32 last_error_0 = data[-1];
|
||||||
|
FLAC__int32 last_error_1 = data[-1] - data[-2];
|
||||||
|
FLAC__int32 last_error_2 = last_error_1 - (data[-2] - data[-3]);
|
||||||
|
FLAC__int32 last_error_3 = last_error_2 - (data[-2] - 2*data[-3] + data[-4]);
|
||||||
|
FLAC__int32 error, save;
|
||||||
|
FLAC__uint32 total_error_0 = 0, total_error_1 = 0, total_error_2 = 0, total_error_3 = 0, total_error_4 = 0;
|
||||||
|
unsigned i, order;
|
||||||
|
|
||||||
|
for(i = 0; i < data_len; i++) {
|
||||||
|
error = data[i] ; total_error_0 += local_abs(error); save = error;
|
||||||
|
error -= last_error_0; total_error_1 += local_abs(error); last_error_0 = save; save = error;
|
||||||
|
error -= last_error_1; total_error_2 += local_abs(error); last_error_1 = save; save = error;
|
||||||
|
error -= last_error_2; total_error_3 += local_abs(error); last_error_2 = save; save = error;
|
||||||
|
error -= last_error_3; total_error_4 += local_abs(error); last_error_3 = save;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(total_error_0 < flac_min(flac_min(flac_min(total_error_1, total_error_2), total_error_3), total_error_4))
|
||||||
|
order = 0;
|
||||||
|
else if(total_error_1 < flac_min(flac_min(total_error_2, total_error_3), total_error_4))
|
||||||
|
order = 1;
|
||||||
|
else if(total_error_2 < flac_min(total_error_3, total_error_4))
|
||||||
|
order = 2;
|
||||||
|
else if(total_error_3 < total_error_4)
|
||||||
|
order = 3;
|
||||||
|
else
|
||||||
|
order = 4;
|
||||||
|
|
||||||
|
/* Estimate the expected number of bits per residual signal sample. */
|
||||||
|
/* 'total_error*' is linearly related to the variance of the residual */
|
||||||
|
/* signal, so we use it directly to compute E(|x|) */
|
||||||
|
FLAC__ASSERT(data_len > 0 || total_error_0 == 0);
|
||||||
|
FLAC__ASSERT(data_len > 0 || total_error_1 == 0);
|
||||||
|
FLAC__ASSERT(data_len > 0 || total_error_2 == 0);
|
||||||
|
FLAC__ASSERT(data_len > 0 || total_error_3 == 0);
|
||||||
|
FLAC__ASSERT(data_len > 0 || total_error_4 == 0);
|
||||||
|
#ifndef FLAC__INTEGER_ONLY_LIBRARY
|
||||||
|
residual_bits_per_sample[0] = (float)((total_error_0 > 0) ? log(M_LN2 * (double)total_error_0 / (double)data_len) / M_LN2 : 0.0);
|
||||||
|
residual_bits_per_sample[1] = (float)((total_error_1 > 0) ? log(M_LN2 * (double)total_error_1 / (double)data_len) / M_LN2 : 0.0);
|
||||||
|
residual_bits_per_sample[2] = (float)((total_error_2 > 0) ? log(M_LN2 * (double)total_error_2 / (double)data_len) / M_LN2 : 0.0);
|
||||||
|
residual_bits_per_sample[3] = (float)((total_error_3 > 0) ? log(M_LN2 * (double)total_error_3 / (double)data_len) / M_LN2 : 0.0);
|
||||||
|
residual_bits_per_sample[4] = (float)((total_error_4 > 0) ? log(M_LN2 * (double)total_error_4 / (double)data_len) / M_LN2 : 0.0);
|
||||||
|
#else
|
||||||
|
residual_bits_per_sample[0] = (total_error_0 > 0) ? local__compute_rbps_integerized(total_error_0, data_len) : 0;
|
||||||
|
residual_bits_per_sample[1] = (total_error_1 > 0) ? local__compute_rbps_integerized(total_error_1, data_len) : 0;
|
||||||
|
residual_bits_per_sample[2] = (total_error_2 > 0) ? local__compute_rbps_integerized(total_error_2, data_len) : 0;
|
||||||
|
residual_bits_per_sample[3] = (total_error_3 > 0) ? local__compute_rbps_integerized(total_error_3, data_len) : 0;
|
||||||
|
residual_bits_per_sample[4] = (total_error_4 > 0) ? local__compute_rbps_integerized(total_error_4, data_len) : 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return order;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef FLAC__INTEGER_ONLY_LIBRARY
|
||||||
|
unsigned FLAC__fixed_compute_best_predictor_wide(const FLAC__int32 data[], unsigned data_len, float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1])
|
||||||
|
#else
|
||||||
|
unsigned FLAC__fixed_compute_best_predictor_wide(const FLAC__int32 data[], unsigned data_len, FLAC__fixedpoint residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1])
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
FLAC__int32 last_error_0 = data[-1];
|
||||||
|
FLAC__int32 last_error_1 = data[-1] - data[-2];
|
||||||
|
FLAC__int32 last_error_2 = last_error_1 - (data[-2] - data[-3]);
|
||||||
|
FLAC__int32 last_error_3 = last_error_2 - (data[-2] - 2*data[-3] + data[-4]);
|
||||||
|
FLAC__int32 error, save;
|
||||||
|
/* total_error_* are 64-bits to avoid overflow when encoding
|
||||||
|
* erratic signals when the bits-per-sample and blocksize are
|
||||||
|
* large.
|
||||||
|
*/
|
||||||
|
FLAC__uint64 total_error_0 = 0, total_error_1 = 0, total_error_2 = 0, total_error_3 = 0, total_error_4 = 0;
|
||||||
|
unsigned i, order;
|
||||||
|
|
||||||
|
for(i = 0; i < data_len; i++) {
|
||||||
|
error = data[i] ; total_error_0 += local_abs(error); save = error;
|
||||||
|
error -= last_error_0; total_error_1 += local_abs(error); last_error_0 = save; save = error;
|
||||||
|
error -= last_error_1; total_error_2 += local_abs(error); last_error_1 = save; save = error;
|
||||||
|
error -= last_error_2; total_error_3 += local_abs(error); last_error_2 = save; save = error;
|
||||||
|
error -= last_error_3; total_error_4 += local_abs(error); last_error_3 = save;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(total_error_0 < flac_min(flac_min(flac_min(total_error_1, total_error_2), total_error_3), total_error_4))
|
||||||
|
order = 0;
|
||||||
|
else if(total_error_1 < flac_min(flac_min(total_error_2, total_error_3), total_error_4))
|
||||||
|
order = 1;
|
||||||
|
else if(total_error_2 < flac_min(total_error_3, total_error_4))
|
||||||
|
order = 2;
|
||||||
|
else if(total_error_3 < total_error_4)
|
||||||
|
order = 3;
|
||||||
|
else
|
||||||
|
order = 4;
|
||||||
|
|
||||||
|
/* Estimate the expected number of bits per residual signal sample. */
|
||||||
|
/* 'total_error*' is linearly related to the variance of the residual */
|
||||||
|
/* signal, so we use it directly to compute E(|x|) */
|
||||||
|
FLAC__ASSERT(data_len > 0 || total_error_0 == 0);
|
||||||
|
FLAC__ASSERT(data_len > 0 || total_error_1 == 0);
|
||||||
|
FLAC__ASSERT(data_len > 0 || total_error_2 == 0);
|
||||||
|
FLAC__ASSERT(data_len > 0 || total_error_3 == 0);
|
||||||
|
FLAC__ASSERT(data_len > 0 || total_error_4 == 0);
|
||||||
|
#ifndef FLAC__INTEGER_ONLY_LIBRARY
|
||||||
|
residual_bits_per_sample[0] = (float)((total_error_0 > 0) ? log(M_LN2 * (double)total_error_0 / (double)data_len) / M_LN2 : 0.0);
|
||||||
|
residual_bits_per_sample[1] = (float)((total_error_1 > 0) ? log(M_LN2 * (double)total_error_1 / (double)data_len) / M_LN2 : 0.0);
|
||||||
|
residual_bits_per_sample[2] = (float)((total_error_2 > 0) ? log(M_LN2 * (double)total_error_2 / (double)data_len) / M_LN2 : 0.0);
|
||||||
|
residual_bits_per_sample[3] = (float)((total_error_3 > 0) ? log(M_LN2 * (double)total_error_3 / (double)data_len) / M_LN2 : 0.0);
|
||||||
|
residual_bits_per_sample[4] = (float)((total_error_4 > 0) ? log(M_LN2 * (double)total_error_4 / (double)data_len) / M_LN2 : 0.0);
|
||||||
|
#else
|
||||||
|
residual_bits_per_sample[0] = (total_error_0 > 0) ? local__compute_rbps_wide_integerized(total_error_0, data_len) : 0;
|
||||||
|
residual_bits_per_sample[1] = (total_error_1 > 0) ? local__compute_rbps_wide_integerized(total_error_1, data_len) : 0;
|
||||||
|
residual_bits_per_sample[2] = (total_error_2 > 0) ? local__compute_rbps_wide_integerized(total_error_2, data_len) : 0;
|
||||||
|
residual_bits_per_sample[3] = (total_error_3 > 0) ? local__compute_rbps_wide_integerized(total_error_3, data_len) : 0;
|
||||||
|
residual_bits_per_sample[4] = (total_error_4 > 0) ? local__compute_rbps_wide_integerized(total_error_4, data_len) : 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return order;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FLAC__fixed_compute_residual(const FLAC__int32 data[], unsigned data_len, unsigned order, FLAC__int32 residual[])
|
||||||
|
{
|
||||||
|
const int idata_len = (int)data_len;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
switch(order) {
|
||||||
|
case 0:
|
||||||
|
FLAC__ASSERT(sizeof(residual[0]) == sizeof(data[0]));
|
||||||
|
memcpy(residual, data, sizeof(residual[0])*data_len);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
for(i = 0; i < idata_len; i++)
|
||||||
|
residual[i] = data[i] - data[i-1];
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
for(i = 0; i < idata_len; i++)
|
||||||
|
residual[i] = data[i] - 2*data[i-1] + data[i-2];
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
for(i = 0; i < idata_len; i++)
|
||||||
|
residual[i] = data[i] - 3*data[i-1] + 3*data[i-2] - data[i-3];
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
for(i = 0; i < idata_len; i++)
|
||||||
|
residual[i] = data[i] - 4*data[i-1] + 6*data[i-2] - 4*data[i-3] + data[i-4];
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
FLAC__ASSERT(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void FLAC__fixed_restore_signal(const FLAC__int32 residual[], unsigned data_len, unsigned order, FLAC__int32 data[])
|
||||||
|
{
|
||||||
|
int i, idata_len = (int)data_len;
|
||||||
|
|
||||||
|
switch(order) {
|
||||||
|
case 0:
|
||||||
|
FLAC__ASSERT(sizeof(residual[0]) == sizeof(data[0]));
|
||||||
|
memcpy(data, residual, sizeof(residual[0])*data_len);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
for(i = 0; i < idata_len; i++)
|
||||||
|
data[i] = residual[i] + data[i-1];
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
for(i = 0; i < idata_len; i++)
|
||||||
|
data[i] = residual[i] + 2*data[i-1] - data[i-2];
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
for(i = 0; i < idata_len; i++)
|
||||||
|
data[i] = residual[i] + 3*data[i-1] - 3*data[i-2] + data[i-3];
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
for(i = 0; i < idata_len; i++)
|
||||||
|
data[i] = residual[i] + 4*data[i-1] - 6*data[i-2] + 4*data[i-3] - data[i-4];
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
FLAC__ASSERT(0);
|
||||||
|
}
|
||||||
|
}
|
302
deps/libFLAC/float.c
vendored
Normal file
302
deps/libFLAC/float.c
vendored
Normal file
@ -0,0 +1,302 @@
|
|||||||
|
/* libFLAC - Free Lossless Audio Codec library
|
||||||
|
* Copyright (C) 2004-2009 Josh Coalson
|
||||||
|
* Copyright (C) 2011-2016 Xiph.Org Foundation
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Xiph.org Foundation nor the names of its
|
||||||
|
* 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 FOUNDATION OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "FLAC/assert.h"
|
||||||
|
#include "share/compat.h"
|
||||||
|
#include "private/float.h"
|
||||||
|
|
||||||
|
#ifdef FLAC__INTEGER_ONLY_LIBRARY
|
||||||
|
|
||||||
|
const FLAC__fixedpoint FLAC__FP_ZERO = 0;
|
||||||
|
const FLAC__fixedpoint FLAC__FP_ONE_HALF = 0x00008000;
|
||||||
|
const FLAC__fixedpoint FLAC__FP_ONE = 0x00010000;
|
||||||
|
const FLAC__fixedpoint FLAC__FP_LN2 = 45426;
|
||||||
|
const FLAC__fixedpoint FLAC__FP_E = 178145;
|
||||||
|
|
||||||
|
/* Lookup tables for Knuth's logarithm algorithm */
|
||||||
|
#define LOG2_LOOKUP_PRECISION 16
|
||||||
|
static const FLAC__uint32 log2_lookup[][LOG2_LOOKUP_PRECISION] = {
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* 0 fraction bits
|
||||||
|
*/
|
||||||
|
/* undefined */ 0x00000000,
|
||||||
|
/* lg(2/1) = */ 0x00000001,
|
||||||
|
/* lg(4/3) = */ 0x00000000,
|
||||||
|
/* lg(8/7) = */ 0x00000000,
|
||||||
|
/* lg(16/15) = */ 0x00000000,
|
||||||
|
/* lg(32/31) = */ 0x00000000,
|
||||||
|
/* lg(64/63) = */ 0x00000000,
|
||||||
|
/* lg(128/127) = */ 0x00000000,
|
||||||
|
/* lg(256/255) = */ 0x00000000,
|
||||||
|
/* lg(512/511) = */ 0x00000000,
|
||||||
|
/* lg(1024/1023) = */ 0x00000000,
|
||||||
|
/* lg(2048/2047) = */ 0x00000000,
|
||||||
|
/* lg(4096/4095) = */ 0x00000000,
|
||||||
|
/* lg(8192/8191) = */ 0x00000000,
|
||||||
|
/* lg(16384/16383) = */ 0x00000000,
|
||||||
|
/* lg(32768/32767) = */ 0x00000000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* 4 fraction bits
|
||||||
|
*/
|
||||||
|
/* undefined */ 0x00000000,
|
||||||
|
/* lg(2/1) = */ 0x00000010,
|
||||||
|
/* lg(4/3) = */ 0x00000007,
|
||||||
|
/* lg(8/7) = */ 0x00000003,
|
||||||
|
/* lg(16/15) = */ 0x00000001,
|
||||||
|
/* lg(32/31) = */ 0x00000001,
|
||||||
|
/* lg(64/63) = */ 0x00000000,
|
||||||
|
/* lg(128/127) = */ 0x00000000,
|
||||||
|
/* lg(256/255) = */ 0x00000000,
|
||||||
|
/* lg(512/511) = */ 0x00000000,
|
||||||
|
/* lg(1024/1023) = */ 0x00000000,
|
||||||
|
/* lg(2048/2047) = */ 0x00000000,
|
||||||
|
/* lg(4096/4095) = */ 0x00000000,
|
||||||
|
/* lg(8192/8191) = */ 0x00000000,
|
||||||
|
/* lg(16384/16383) = */ 0x00000000,
|
||||||
|
/* lg(32768/32767) = */ 0x00000000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* 8 fraction bits
|
||||||
|
*/
|
||||||
|
/* undefined */ 0x00000000,
|
||||||
|
/* lg(2/1) = */ 0x00000100,
|
||||||
|
/* lg(4/3) = */ 0x0000006a,
|
||||||
|
/* lg(8/7) = */ 0x00000031,
|
||||||
|
/* lg(16/15) = */ 0x00000018,
|
||||||
|
/* lg(32/31) = */ 0x0000000c,
|
||||||
|
/* lg(64/63) = */ 0x00000006,
|
||||||
|
/* lg(128/127) = */ 0x00000003,
|
||||||
|
/* lg(256/255) = */ 0x00000001,
|
||||||
|
/* lg(512/511) = */ 0x00000001,
|
||||||
|
/* lg(1024/1023) = */ 0x00000000,
|
||||||
|
/* lg(2048/2047) = */ 0x00000000,
|
||||||
|
/* lg(4096/4095) = */ 0x00000000,
|
||||||
|
/* lg(8192/8191) = */ 0x00000000,
|
||||||
|
/* lg(16384/16383) = */ 0x00000000,
|
||||||
|
/* lg(32768/32767) = */ 0x00000000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* 12 fraction bits
|
||||||
|
*/
|
||||||
|
/* undefined */ 0x00000000,
|
||||||
|
/* lg(2/1) = */ 0x00001000,
|
||||||
|
/* lg(4/3) = */ 0x000006a4,
|
||||||
|
/* lg(8/7) = */ 0x00000315,
|
||||||
|
/* lg(16/15) = */ 0x0000017d,
|
||||||
|
/* lg(32/31) = */ 0x000000bc,
|
||||||
|
/* lg(64/63) = */ 0x0000005d,
|
||||||
|
/* lg(128/127) = */ 0x0000002e,
|
||||||
|
/* lg(256/255) = */ 0x00000017,
|
||||||
|
/* lg(512/511) = */ 0x0000000c,
|
||||||
|
/* lg(1024/1023) = */ 0x00000006,
|
||||||
|
/* lg(2048/2047) = */ 0x00000003,
|
||||||
|
/* lg(4096/4095) = */ 0x00000001,
|
||||||
|
/* lg(8192/8191) = */ 0x00000001,
|
||||||
|
/* lg(16384/16383) = */ 0x00000000,
|
||||||
|
/* lg(32768/32767) = */ 0x00000000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* 16 fraction bits
|
||||||
|
*/
|
||||||
|
/* undefined */ 0x00000000,
|
||||||
|
/* lg(2/1) = */ 0x00010000,
|
||||||
|
/* lg(4/3) = */ 0x00006a40,
|
||||||
|
/* lg(8/7) = */ 0x00003151,
|
||||||
|
/* lg(16/15) = */ 0x000017d6,
|
||||||
|
/* lg(32/31) = */ 0x00000bba,
|
||||||
|
/* lg(64/63) = */ 0x000005d1,
|
||||||
|
/* lg(128/127) = */ 0x000002e6,
|
||||||
|
/* lg(256/255) = */ 0x00000172,
|
||||||
|
/* lg(512/511) = */ 0x000000b9,
|
||||||
|
/* lg(1024/1023) = */ 0x0000005c,
|
||||||
|
/* lg(2048/2047) = */ 0x0000002e,
|
||||||
|
/* lg(4096/4095) = */ 0x00000017,
|
||||||
|
/* lg(8192/8191) = */ 0x0000000c,
|
||||||
|
/* lg(16384/16383) = */ 0x00000006,
|
||||||
|
/* lg(32768/32767) = */ 0x00000003
|
||||||
|
},
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* 20 fraction bits
|
||||||
|
*/
|
||||||
|
/* undefined */ 0x00000000,
|
||||||
|
/* lg(2/1) = */ 0x00100000,
|
||||||
|
/* lg(4/3) = */ 0x0006a3fe,
|
||||||
|
/* lg(8/7) = */ 0x00031513,
|
||||||
|
/* lg(16/15) = */ 0x00017d60,
|
||||||
|
/* lg(32/31) = */ 0x0000bb9d,
|
||||||
|
/* lg(64/63) = */ 0x00005d10,
|
||||||
|
/* lg(128/127) = */ 0x00002e59,
|
||||||
|
/* lg(256/255) = */ 0x00001721,
|
||||||
|
/* lg(512/511) = */ 0x00000b8e,
|
||||||
|
/* lg(1024/1023) = */ 0x000005c6,
|
||||||
|
/* lg(2048/2047) = */ 0x000002e3,
|
||||||
|
/* lg(4096/4095) = */ 0x00000171,
|
||||||
|
/* lg(8192/8191) = */ 0x000000b9,
|
||||||
|
/* lg(16384/16383) = */ 0x0000005c,
|
||||||
|
/* lg(32768/32767) = */ 0x0000002e
|
||||||
|
},
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* 24 fraction bits
|
||||||
|
*/
|
||||||
|
/* undefined */ 0x00000000,
|
||||||
|
/* lg(2/1) = */ 0x01000000,
|
||||||
|
/* lg(4/3) = */ 0x006a3fe6,
|
||||||
|
/* lg(8/7) = */ 0x00315130,
|
||||||
|
/* lg(16/15) = */ 0x0017d605,
|
||||||
|
/* lg(32/31) = */ 0x000bb9ca,
|
||||||
|
/* lg(64/63) = */ 0x0005d0fc,
|
||||||
|
/* lg(128/127) = */ 0x0002e58f,
|
||||||
|
/* lg(256/255) = */ 0x0001720e,
|
||||||
|
/* lg(512/511) = */ 0x0000b8d8,
|
||||||
|
/* lg(1024/1023) = */ 0x00005c61,
|
||||||
|
/* lg(2048/2047) = */ 0x00002e2d,
|
||||||
|
/* lg(4096/4095) = */ 0x00001716,
|
||||||
|
/* lg(8192/8191) = */ 0x00000b8b,
|
||||||
|
/* lg(16384/16383) = */ 0x000005c5,
|
||||||
|
/* lg(32768/32767) = */ 0x000002e3
|
||||||
|
},
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* 28 fraction bits
|
||||||
|
*/
|
||||||
|
/* undefined */ 0x00000000,
|
||||||
|
/* lg(2/1) = */ 0x10000000,
|
||||||
|
/* lg(4/3) = */ 0x06a3fe5c,
|
||||||
|
/* lg(8/7) = */ 0x03151301,
|
||||||
|
/* lg(16/15) = */ 0x017d6049,
|
||||||
|
/* lg(32/31) = */ 0x00bb9ca6,
|
||||||
|
/* lg(64/63) = */ 0x005d0fba,
|
||||||
|
/* lg(128/127) = */ 0x002e58f7,
|
||||||
|
/* lg(256/255) = */ 0x001720da,
|
||||||
|
/* lg(512/511) = */ 0x000b8d87,
|
||||||
|
/* lg(1024/1023) = */ 0x0005c60b,
|
||||||
|
/* lg(2048/2047) = */ 0x0002e2d7,
|
||||||
|
/* lg(4096/4095) = */ 0x00017160,
|
||||||
|
/* lg(8192/8191) = */ 0x0000b8ad,
|
||||||
|
/* lg(16384/16383) = */ 0x00005c56,
|
||||||
|
/* lg(32768/32767) = */ 0x00002e2b
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
static const FLAC__uint64 log2_lookup_wide[] = {
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* 32 fraction bits
|
||||||
|
*/
|
||||||
|
/* undefined */ 0x00000000,
|
||||||
|
/* lg(2/1) = */ FLAC__U64L(0x100000000),
|
||||||
|
/* lg(4/3) = */ FLAC__U64L(0x6a3fe5c6),
|
||||||
|
/* lg(8/7) = */ FLAC__U64L(0x31513015),
|
||||||
|
/* lg(16/15) = */ FLAC__U64L(0x17d60497),
|
||||||
|
/* lg(32/31) = */ FLAC__U64L(0x0bb9ca65),
|
||||||
|
/* lg(64/63) = */ FLAC__U64L(0x05d0fba2),
|
||||||
|
/* lg(128/127) = */ FLAC__U64L(0x02e58f74),
|
||||||
|
/* lg(256/255) = */ FLAC__U64L(0x01720d9c),
|
||||||
|
/* lg(512/511) = */ FLAC__U64L(0x00b8d875),
|
||||||
|
/* lg(1024/1023) = */ FLAC__U64L(0x005c60aa),
|
||||||
|
/* lg(2048/2047) = */ FLAC__U64L(0x002e2d72),
|
||||||
|
/* lg(4096/4095) = */ FLAC__U64L(0x00171600),
|
||||||
|
/* lg(8192/8191) = */ FLAC__U64L(0x000b8ad2),
|
||||||
|
/* lg(16384/16383) = */ FLAC__U64L(0x0005c55d),
|
||||||
|
/* lg(32768/32767) = */ FLAC__U64L(0x0002e2ac)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* 48 fraction bits
|
||||||
|
*/
|
||||||
|
/* undefined */ 0x00000000,
|
||||||
|
/* lg(2/1) = */ FLAC__U64L(0x1000000000000),
|
||||||
|
/* lg(4/3) = */ FLAC__U64L(0x6a3fe5c60429),
|
||||||
|
/* lg(8/7) = */ FLAC__U64L(0x315130157f7a),
|
||||||
|
/* lg(16/15) = */ FLAC__U64L(0x17d60496cfbb),
|
||||||
|
/* lg(32/31) = */ FLAC__U64L(0xbb9ca64ecac),
|
||||||
|
/* lg(64/63) = */ FLAC__U64L(0x5d0fba187cd),
|
||||||
|
/* lg(128/127) = */ FLAC__U64L(0x2e58f7441ee),
|
||||||
|
/* lg(256/255) = */ FLAC__U64L(0x1720d9c06a8),
|
||||||
|
/* lg(512/511) = */ FLAC__U64L(0xb8d8752173),
|
||||||
|
/* lg(1024/1023) = */ FLAC__U64L(0x5c60aa252e),
|
||||||
|
/* lg(2048/2047) = */ FLAC__U64L(0x2e2d71b0d8),
|
||||||
|
/* lg(4096/4095) = */ FLAC__U64L(0x1716001719),
|
||||||
|
/* lg(8192/8191) = */ FLAC__U64L(0xb8ad1de1b),
|
||||||
|
/* lg(16384/16383) = */ FLAC__U64L(0x5c55d640d),
|
||||||
|
/* lg(32768/32767) = */ FLAC__U64L(0x2e2abcf52)
|
||||||
|
}
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
FLAC__uint32 FLAC__fixedpoint_log2(FLAC__uint32 x, unsigned fracbits, unsigned precision)
|
||||||
|
{
|
||||||
|
const FLAC__uint32 ONE = (1u << fracbits);
|
||||||
|
const FLAC__uint32 *table = log2_lookup[fracbits >> 2];
|
||||||
|
|
||||||
|
FLAC__ASSERT(fracbits < 32);
|
||||||
|
FLAC__ASSERT((fracbits & 0x3) == 0);
|
||||||
|
|
||||||
|
if(x < ONE)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if(precision > LOG2_LOOKUP_PRECISION)
|
||||||
|
precision = LOG2_LOOKUP_PRECISION;
|
||||||
|
|
||||||
|
/* Knuth's algorithm for computing logarithms, optimized for base-2 with lookup tables */
|
||||||
|
{
|
||||||
|
FLAC__uint32 y = 0;
|
||||||
|
FLAC__uint32 z = x >> 1, k = 1;
|
||||||
|
while (x > ONE && k < precision) {
|
||||||
|
if (x - z >= ONE) {
|
||||||
|
x -= z;
|
||||||
|
z = x >> k;
|
||||||
|
y += table[k];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
z >>= 1;
|
||||||
|
k++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* defined FLAC__INTEGER_ONLY_LIBRARY */
|
589
deps/libFLAC/format.c
vendored
Normal file
589
deps/libFLAC/format.c
vendored
Normal file
@ -0,0 +1,589 @@
|
|||||||
|
/* libFLAC - Free Lossless Audio Codec library
|
||||||
|
* Copyright (C) 2000-2009 Josh Coalson
|
||||||
|
* Copyright (C) 2011-2016 Xiph.Org Foundation
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Xiph.org Foundation nor the names of its
|
||||||
|
* 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 FOUNDATION OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h> /* for qsort() */
|
||||||
|
#include <string.h> /* for memset() */
|
||||||
|
#include "FLAC/assert.h"
|
||||||
|
#include "FLAC/format.h"
|
||||||
|
#include "share/alloc.h"
|
||||||
|
#include "share/compat.h"
|
||||||
|
#include "private/format.h"
|
||||||
|
#include "private/macros.h"
|
||||||
|
|
||||||
|
/* PACKAGE_VERSION should come from configure */
|
||||||
|
FLAC_API const char *FLAC__VERSION_STRING = PACKAGE_VERSION;
|
||||||
|
|
||||||
|
FLAC_API const char *FLAC__VENDOR_STRING = "reference libFLAC " PACKAGE_VERSION " 20170101";
|
||||||
|
|
||||||
|
FLAC_API const FLAC__byte FLAC__STREAM_SYNC_STRING[4] = { 'f','L','a','C' };
|
||||||
|
FLAC_API const unsigned FLAC__STREAM_SYNC = 0x664C6143;
|
||||||
|
FLAC_API const unsigned FLAC__STREAM_SYNC_LEN = 32; /* bits */
|
||||||
|
|
||||||
|
FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN = 16; /* bits */
|
||||||
|
FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN = 16; /* bits */
|
||||||
|
FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN = 24; /* bits */
|
||||||
|
FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN = 24; /* bits */
|
||||||
|
FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN = 20; /* bits */
|
||||||
|
FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN = 3; /* bits */
|
||||||
|
FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN = 5; /* bits */
|
||||||
|
FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_TOTAL_SAMPLES_LEN = 36; /* bits */
|
||||||
|
FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MD5SUM_LEN = 128; /* bits */
|
||||||
|
|
||||||
|
FLAC_API const unsigned FLAC__STREAM_METADATA_APPLICATION_ID_LEN = 32; /* bits */
|
||||||
|
|
||||||
|
FLAC_API const unsigned FLAC__STREAM_METADATA_SEEKPOINT_SAMPLE_NUMBER_LEN = 64; /* bits */
|
||||||
|
FLAC_API const unsigned FLAC__STREAM_METADATA_SEEKPOINT_STREAM_OFFSET_LEN = 64; /* bits */
|
||||||
|
FLAC_API const unsigned FLAC__STREAM_METADATA_SEEKPOINT_FRAME_SAMPLES_LEN = 16; /* bits */
|
||||||
|
|
||||||
|
FLAC_API const FLAC__uint64 FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER = FLAC__U64L(0xffffffffffffffff);
|
||||||
|
|
||||||
|
FLAC_API const unsigned FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN = 32; /* bits */
|
||||||
|
FLAC_API const unsigned FLAC__STREAM_METADATA_VORBIS_COMMENT_NUM_COMMENTS_LEN = 32; /* bits */
|
||||||
|
|
||||||
|
FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_INDEX_OFFSET_LEN = 64; /* bits */
|
||||||
|
FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_INDEX_NUMBER_LEN = 8; /* bits */
|
||||||
|
FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN = 3*8; /* bits */
|
||||||
|
|
||||||
|
FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_OFFSET_LEN = 64; /* bits */
|
||||||
|
FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_NUMBER_LEN = 8; /* bits */
|
||||||
|
FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN = 12*8; /* bits */
|
||||||
|
FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN = 1; /* bit */
|
||||||
|
FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN = 1; /* bit */
|
||||||
|
FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN = 6+13*8; /* bits */
|
||||||
|
FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_NUM_INDICES_LEN = 8; /* bits */
|
||||||
|
|
||||||
|
FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN = 128*8; /* bits */
|
||||||
|
FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_LEAD_IN_LEN = 64; /* bits */
|
||||||
|
FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN = 1; /* bit */
|
||||||
|
FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN = 7+258*8; /* bits */
|
||||||
|
FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_NUM_TRACKS_LEN = 8; /* bits */
|
||||||
|
|
||||||
|
FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_TYPE_LEN = 32; /* bits */
|
||||||
|
FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_MIME_TYPE_LENGTH_LEN = 32; /* bits */
|
||||||
|
FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_DESCRIPTION_LENGTH_LEN = 32; /* bits */
|
||||||
|
FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN = 32; /* bits */
|
||||||
|
FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN = 32; /* bits */
|
||||||
|
FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN = 32; /* bits */
|
||||||
|
FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_COLORS_LEN = 32; /* bits */
|
||||||
|
FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_DATA_LENGTH_LEN = 32; /* bits */
|
||||||
|
|
||||||
|
FLAC_API const unsigned FLAC__STREAM_METADATA_IS_LAST_LEN = 1; /* bits */
|
||||||
|
FLAC_API const unsigned FLAC__STREAM_METADATA_TYPE_LEN = 7; /* bits */
|
||||||
|
FLAC_API const unsigned FLAC__STREAM_METADATA_LENGTH_LEN = 24; /* bits */
|
||||||
|
|
||||||
|
FLAC_API const unsigned FLAC__FRAME_HEADER_SYNC = 0x3ffe;
|
||||||
|
FLAC_API const unsigned FLAC__FRAME_HEADER_SYNC_LEN = 14; /* bits */
|
||||||
|
FLAC_API const unsigned FLAC__FRAME_HEADER_RESERVED_LEN = 1; /* bits */
|
||||||
|
FLAC_API const unsigned FLAC__FRAME_HEADER_BLOCKING_STRATEGY_LEN = 1; /* bits */
|
||||||
|
FLAC_API const unsigned FLAC__FRAME_HEADER_BLOCK_SIZE_LEN = 4; /* bits */
|
||||||
|
FLAC_API const unsigned FLAC__FRAME_HEADER_SAMPLE_RATE_LEN = 4; /* bits */
|
||||||
|
FLAC_API const unsigned FLAC__FRAME_HEADER_CHANNEL_ASSIGNMENT_LEN = 4; /* bits */
|
||||||
|
FLAC_API const unsigned FLAC__FRAME_HEADER_BITS_PER_SAMPLE_LEN = 3; /* bits */
|
||||||
|
FLAC_API const unsigned FLAC__FRAME_HEADER_ZERO_PAD_LEN = 1; /* bits */
|
||||||
|
FLAC_API const unsigned FLAC__FRAME_HEADER_CRC_LEN = 8; /* bits */
|
||||||
|
|
||||||
|
FLAC_API const unsigned FLAC__FRAME_FOOTER_CRC_LEN = 16; /* bits */
|
||||||
|
|
||||||
|
FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_TYPE_LEN = 2; /* bits */
|
||||||
|
FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN = 4; /* bits */
|
||||||
|
FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN = 4; /* bits */
|
||||||
|
FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_PARAMETER_LEN = 5; /* bits */
|
||||||
|
FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_RAW_LEN = 5; /* bits */
|
||||||
|
|
||||||
|
FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER = 15; /* == (1<<FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN)-1 */
|
||||||
|
FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_ESCAPE_PARAMETER = 31; /* == (1<<FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_PARAMETER_LEN)-1 */
|
||||||
|
|
||||||
|
FLAC_API const char * const FLAC__EntropyCodingMethodTypeString[] = {
|
||||||
|
"PARTITIONED_RICE",
|
||||||
|
"PARTITIONED_RICE2"
|
||||||
|
};
|
||||||
|
|
||||||
|
FLAC_API const unsigned FLAC__SUBFRAME_LPC_QLP_COEFF_PRECISION_LEN = 4; /* bits */
|
||||||
|
FLAC_API const unsigned FLAC__SUBFRAME_LPC_QLP_SHIFT_LEN = 5; /* bits */
|
||||||
|
|
||||||
|
FLAC_API const unsigned FLAC__SUBFRAME_ZERO_PAD_LEN = 1; /* bits */
|
||||||
|
FLAC_API const unsigned FLAC__SUBFRAME_TYPE_LEN = 6; /* bits */
|
||||||
|
FLAC_API const unsigned FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN = 1; /* bits */
|
||||||
|
|
||||||
|
FLAC_API const unsigned FLAC__SUBFRAME_TYPE_CONSTANT_BYTE_ALIGNED_MASK = 0x00;
|
||||||
|
FLAC_API const unsigned FLAC__SUBFRAME_TYPE_VERBATIM_BYTE_ALIGNED_MASK = 0x02;
|
||||||
|
FLAC_API const unsigned FLAC__SUBFRAME_TYPE_FIXED_BYTE_ALIGNED_MASK = 0x10;
|
||||||
|
FLAC_API const unsigned FLAC__SUBFRAME_TYPE_LPC_BYTE_ALIGNED_MASK = 0x40;
|
||||||
|
|
||||||
|
FLAC_API const char * const FLAC__SubframeTypeString[] = {
|
||||||
|
"CONSTANT",
|
||||||
|
"VERBATIM",
|
||||||
|
"FIXED",
|
||||||
|
"LPC"
|
||||||
|
};
|
||||||
|
|
||||||
|
FLAC_API const char * const FLAC__ChannelAssignmentString[] = {
|
||||||
|
"INDEPENDENT",
|
||||||
|
"LEFT_SIDE",
|
||||||
|
"RIGHT_SIDE",
|
||||||
|
"MID_SIDE"
|
||||||
|
};
|
||||||
|
|
||||||
|
FLAC_API const char * const FLAC__FrameNumberTypeString[] = {
|
||||||
|
"FRAME_NUMBER_TYPE_FRAME_NUMBER",
|
||||||
|
"FRAME_NUMBER_TYPE_SAMPLE_NUMBER"
|
||||||
|
};
|
||||||
|
|
||||||
|
FLAC_API const char * const FLAC__MetadataTypeString[] = {
|
||||||
|
"STREAMINFO",
|
||||||
|
"PADDING",
|
||||||
|
"APPLICATION",
|
||||||
|
"SEEKTABLE",
|
||||||
|
"VORBIS_COMMENT",
|
||||||
|
"CUESHEET",
|
||||||
|
"PICTURE"
|
||||||
|
};
|
||||||
|
|
||||||
|
FLAC_API const char * const FLAC__StreamMetadata_Picture_TypeString[] = {
|
||||||
|
"Other",
|
||||||
|
"32x32 pixels 'file icon' (PNG only)",
|
||||||
|
"Other file icon",
|
||||||
|
"Cover (front)",
|
||||||
|
"Cover (back)",
|
||||||
|
"Leaflet page",
|
||||||
|
"Media (e.g. label side of CD)",
|
||||||
|
"Lead artist/lead performer/soloist",
|
||||||
|
"Artist/performer",
|
||||||
|
"Conductor",
|
||||||
|
"Band/Orchestra",
|
||||||
|
"Composer",
|
||||||
|
"Lyricist/text writer",
|
||||||
|
"Recording Location",
|
||||||
|
"During recording",
|
||||||
|
"During performance",
|
||||||
|
"Movie/video screen capture",
|
||||||
|
"A bright coloured fish",
|
||||||
|
"Illustration",
|
||||||
|
"Band/artist logotype",
|
||||||
|
"Publisher/Studio logotype"
|
||||||
|
};
|
||||||
|
|
||||||
|
FLAC_API FLAC__bool FLAC__format_sample_rate_is_valid(unsigned sample_rate)
|
||||||
|
{
|
||||||
|
if(sample_rate == 0 || sample_rate > FLAC__MAX_SAMPLE_RATE) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
FLAC_API FLAC__bool FLAC__format_blocksize_is_subset(unsigned blocksize, unsigned sample_rate)
|
||||||
|
{
|
||||||
|
if(blocksize > 16384)
|
||||||
|
return false;
|
||||||
|
else if(sample_rate <= 48000 && blocksize > 4608)
|
||||||
|
return false;
|
||||||
|
else
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
FLAC_API FLAC__bool FLAC__format_sample_rate_is_subset(unsigned sample_rate)
|
||||||
|
{
|
||||||
|
if(
|
||||||
|
!FLAC__format_sample_rate_is_valid(sample_rate) ||
|
||||||
|
(
|
||||||
|
sample_rate >= (1u << 16) &&
|
||||||
|
!(sample_rate % 1000 == 0 || sample_rate % 10 == 0)
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* @@@@ add to unit tests; it is already indirectly tested by the metadata_object tests */
|
||||||
|
FLAC_API FLAC__bool FLAC__format_seektable_is_legal(const FLAC__StreamMetadata_SeekTable *seek_table)
|
||||||
|
{
|
||||||
|
unsigned i;
|
||||||
|
FLAC__uint64 prev_sample_number = 0;
|
||||||
|
FLAC__bool got_prev = false;
|
||||||
|
|
||||||
|
FLAC__ASSERT(0 != seek_table);
|
||||||
|
|
||||||
|
for(i = 0; i < seek_table->num_points; i++) {
|
||||||
|
if(got_prev) {
|
||||||
|
if(
|
||||||
|
seek_table->points[i].sample_number != FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER &&
|
||||||
|
seek_table->points[i].sample_number <= prev_sample_number
|
||||||
|
)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
prev_sample_number = seek_table->points[i].sample_number;
|
||||||
|
got_prev = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* used as the sort predicate for qsort() */
|
||||||
|
static int seekpoint_compare_(const FLAC__StreamMetadata_SeekPoint *l, const FLAC__StreamMetadata_SeekPoint *r)
|
||||||
|
{
|
||||||
|
/* we don't just 'return l->sample_number - r->sample_number' since the result (FLAC__int64) might overflow an 'int' */
|
||||||
|
if(l->sample_number == r->sample_number)
|
||||||
|
return 0;
|
||||||
|
else if(l->sample_number < r->sample_number)
|
||||||
|
return -1;
|
||||||
|
else
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* @@@@ add to unit tests; it is already indirectly tested by the metadata_object tests */
|
||||||
|
FLAC_API unsigned FLAC__format_seektable_sort(FLAC__StreamMetadata_SeekTable *seek_table)
|
||||||
|
{
|
||||||
|
unsigned i, j;
|
||||||
|
FLAC__bool first;
|
||||||
|
|
||||||
|
FLAC__ASSERT(0 != seek_table);
|
||||||
|
|
||||||
|
if (seek_table->num_points == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/* sort the seekpoints */
|
||||||
|
qsort(seek_table->points, seek_table->num_points, sizeof(FLAC__StreamMetadata_SeekPoint), (int (*)(const void *, const void *))seekpoint_compare_);
|
||||||
|
|
||||||
|
/* uniquify the seekpoints */
|
||||||
|
first = true;
|
||||||
|
for(i = j = 0; i < seek_table->num_points; i++) {
|
||||||
|
if(seek_table->points[i].sample_number != FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER) {
|
||||||
|
if(!first) {
|
||||||
|
if(seek_table->points[i].sample_number == seek_table->points[j-1].sample_number)
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
first = false;
|
||||||
|
seek_table->points[j++] = seek_table->points[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i = j; i < seek_table->num_points; i++) {
|
||||||
|
seek_table->points[i].sample_number = FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER;
|
||||||
|
seek_table->points[i].stream_offset = 0;
|
||||||
|
seek_table->points[i].frame_samples = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return j;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* also disallows non-shortest-form encodings, c.f.
|
||||||
|
* http://www.unicode.org/versions/corrigendum1.html
|
||||||
|
* and a more clear explanation at the end of this section:
|
||||||
|
* http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
|
||||||
|
*/
|
||||||
|
static unsigned utf8len_(const FLAC__byte *utf8)
|
||||||
|
{
|
||||||
|
FLAC__ASSERT(0 != utf8);
|
||||||
|
if ((utf8[0] & 0x80) == 0) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else if ((utf8[0] & 0xE0) == 0xC0 && (utf8[1] & 0xC0) == 0x80) {
|
||||||
|
if ((utf8[0] & 0xFE) == 0xC0) /* overlong sequence check */
|
||||||
|
return 0;
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
else if ((utf8[0] & 0xF0) == 0xE0 && (utf8[1] & 0xC0) == 0x80 && (utf8[2] & 0xC0) == 0x80) {
|
||||||
|
if (utf8[0] == 0xE0 && (utf8[1] & 0xE0) == 0x80) /* overlong sequence check */
|
||||||
|
return 0;
|
||||||
|
/* illegal surrogates check (U+D800...U+DFFF and U+FFFE...U+FFFF) */
|
||||||
|
if (utf8[0] == 0xED && (utf8[1] & 0xE0) == 0xA0) /* D800-DFFF */
|
||||||
|
return 0;
|
||||||
|
if (utf8[0] == 0xEF && utf8[1] == 0xBF && (utf8[2] & 0xFE) == 0xBE) /* FFFE-FFFF */
|
||||||
|
return 0;
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
|
else if ((utf8[0] & 0xF8) == 0xF0 && (utf8[1] & 0xC0) == 0x80 && (utf8[2] & 0xC0) == 0x80 && (utf8[3] & 0xC0) == 0x80) {
|
||||||
|
if (utf8[0] == 0xF0 && (utf8[1] & 0xF0) == 0x80) /* overlong sequence check */
|
||||||
|
return 0;
|
||||||
|
return 4;
|
||||||
|
}
|
||||||
|
else if ((utf8[0] & 0xFC) == 0xF8 && (utf8[1] & 0xC0) == 0x80 && (utf8[2] & 0xC0) == 0x80 && (utf8[3] & 0xC0) == 0x80 && (utf8[4] & 0xC0) == 0x80) {
|
||||||
|
if (utf8[0] == 0xF8 && (utf8[1] & 0xF8) == 0x80) /* overlong sequence check */
|
||||||
|
return 0;
|
||||||
|
return 5;
|
||||||
|
}
|
||||||
|
else if ((utf8[0] & 0xFE) == 0xFC && (utf8[1] & 0xC0) == 0x80 && (utf8[2] & 0xC0) == 0x80 && (utf8[3] & 0xC0) == 0x80 && (utf8[4] & 0xC0) == 0x80 && (utf8[5] & 0xC0) == 0x80) {
|
||||||
|
if (utf8[0] == 0xFC && (utf8[1] & 0xFC) == 0x80) /* overlong sequence check */
|
||||||
|
return 0;
|
||||||
|
return 6;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
FLAC_API FLAC__bool FLAC__format_vorbiscomment_entry_name_is_legal(const char *name)
|
||||||
|
{
|
||||||
|
char c;
|
||||||
|
for(c = *name; c; c = *(++name))
|
||||||
|
if(c < 0x20 || c == 0x3d || c > 0x7d)
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
FLAC_API FLAC__bool FLAC__format_vorbiscomment_entry_value_is_legal(const FLAC__byte *value, unsigned length)
|
||||||
|
{
|
||||||
|
if(length == (unsigned)(-1)) {
|
||||||
|
while(*value) {
|
||||||
|
unsigned n = utf8len_(value);
|
||||||
|
if(n == 0)
|
||||||
|
return false;
|
||||||
|
value += n;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const FLAC__byte *end = value + length;
|
||||||
|
while(value < end) {
|
||||||
|
unsigned n = utf8len_(value);
|
||||||
|
if(n == 0)
|
||||||
|
return false;
|
||||||
|
value += n;
|
||||||
|
}
|
||||||
|
if(value != end)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
FLAC_API FLAC__bool FLAC__format_vorbiscomment_entry_is_legal(const FLAC__byte *entry, unsigned length)
|
||||||
|
{
|
||||||
|
const FLAC__byte *s, *end;
|
||||||
|
|
||||||
|
for(s = entry, end = s + length; s < end && *s != '='; s++) {
|
||||||
|
if(*s < 0x20 || *s > 0x7D)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if(s == end)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
s++; /* skip '=' */
|
||||||
|
|
||||||
|
while(s < end) {
|
||||||
|
unsigned n = utf8len_(s);
|
||||||
|
if(n == 0)
|
||||||
|
return false;
|
||||||
|
s += n;
|
||||||
|
}
|
||||||
|
if(s != end)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* @@@@ add to unit tests; it is already indirectly tested by the metadata_object tests */
|
||||||
|
FLAC_API FLAC__bool FLAC__format_cuesheet_is_legal(const FLAC__StreamMetadata_CueSheet *cue_sheet, FLAC__bool check_cd_da_subset, const char **violation)
|
||||||
|
{
|
||||||
|
unsigned i, j;
|
||||||
|
|
||||||
|
if(check_cd_da_subset) {
|
||||||
|
if(cue_sheet->lead_in < 2 * 44100) {
|
||||||
|
if(violation) *violation = "CD-DA cue sheet must have a lead-in length of at least 2 seconds";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if(cue_sheet->lead_in % 588 != 0) {
|
||||||
|
if(violation) *violation = "CD-DA cue sheet lead-in length must be evenly divisible by 588 samples";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(cue_sheet->num_tracks == 0) {
|
||||||
|
if(violation) *violation = "cue sheet must have at least one track (the lead-out)";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(check_cd_da_subset && cue_sheet->tracks[cue_sheet->num_tracks-1].number != 170) {
|
||||||
|
if(violation) *violation = "CD-DA cue sheet must have a lead-out track number 170 (0xAA)";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i = 0; i < cue_sheet->num_tracks; i++) {
|
||||||
|
if(cue_sheet->tracks[i].number == 0) {
|
||||||
|
if(violation) *violation = "cue sheet may not have a track number 0";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(check_cd_da_subset) {
|
||||||
|
if(!((cue_sheet->tracks[i].number >= 1 && cue_sheet->tracks[i].number <= 99) || cue_sheet->tracks[i].number == 170)) {
|
||||||
|
if(violation) *violation = "CD-DA cue sheet track number must be 1-99 or 170";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(check_cd_da_subset && cue_sheet->tracks[i].offset % 588 != 0) {
|
||||||
|
if(violation) {
|
||||||
|
if(i == cue_sheet->num_tracks-1) /* the lead-out track... */
|
||||||
|
*violation = "CD-DA cue sheet lead-out offset must be evenly divisible by 588 samples";
|
||||||
|
else
|
||||||
|
*violation = "CD-DA cue sheet track offset must be evenly divisible by 588 samples";
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(i < cue_sheet->num_tracks - 1) {
|
||||||
|
if(cue_sheet->tracks[i].num_indices == 0) {
|
||||||
|
if(violation) *violation = "cue sheet track must have at least one index point";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(cue_sheet->tracks[i].indices[0].number > 1) {
|
||||||
|
if(violation) *violation = "cue sheet track's first index number must be 0 or 1";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for(j = 0; j < cue_sheet->tracks[i].num_indices; j++) {
|
||||||
|
if(check_cd_da_subset && cue_sheet->tracks[i].indices[j].offset % 588 != 0) {
|
||||||
|
if(violation) *violation = "CD-DA cue sheet track index offset must be evenly divisible by 588 samples";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(j > 0) {
|
||||||
|
if(cue_sheet->tracks[i].indices[j].number != cue_sheet->tracks[i].indices[j-1].number + 1) {
|
||||||
|
if(violation) *violation = "cue sheet track index numbers must increase by 1";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* @@@@ add to unit tests; it is already indirectly tested by the metadata_object tests */
|
||||||
|
FLAC_API FLAC__bool FLAC__format_picture_is_legal(const FLAC__StreamMetadata_Picture *picture, const char **violation)
|
||||||
|
{
|
||||||
|
char *p;
|
||||||
|
FLAC__byte *b;
|
||||||
|
|
||||||
|
for(p = picture->mime_type; *p; p++) {
|
||||||
|
if(*p < 0x20 || *p > 0x7e) {
|
||||||
|
if(violation) *violation = "MIME type string must contain only printable ASCII characters (0x20-0x7e)";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for(b = picture->description; *b; ) {
|
||||||
|
unsigned n = utf8len_(b);
|
||||||
|
if(n == 0) {
|
||||||
|
if(violation) *violation = "description string must be valid UTF-8";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
b += n;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* These routines are private to libFLAC
|
||||||
|
*/
|
||||||
|
unsigned FLAC__format_get_max_rice_partition_order(unsigned blocksize, unsigned predictor_order)
|
||||||
|
{
|
||||||
|
return
|
||||||
|
FLAC__format_get_max_rice_partition_order_from_blocksize_limited_max_and_predictor_order(
|
||||||
|
FLAC__format_get_max_rice_partition_order_from_blocksize(blocksize),
|
||||||
|
blocksize,
|
||||||
|
predictor_order
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned FLAC__format_get_max_rice_partition_order_from_blocksize(unsigned blocksize)
|
||||||
|
{
|
||||||
|
unsigned max_rice_partition_order = 0;
|
||||||
|
while(!(blocksize & 1)) {
|
||||||
|
max_rice_partition_order++;
|
||||||
|
blocksize >>= 1;
|
||||||
|
}
|
||||||
|
return flac_min(FLAC__MAX_RICE_PARTITION_ORDER, max_rice_partition_order);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned FLAC__format_get_max_rice_partition_order_from_blocksize_limited_max_and_predictor_order(unsigned limit, unsigned blocksize, unsigned predictor_order)
|
||||||
|
{
|
||||||
|
unsigned max_rice_partition_order = limit;
|
||||||
|
|
||||||
|
while(max_rice_partition_order > 0 && (blocksize >> max_rice_partition_order) <= predictor_order)
|
||||||
|
max_rice_partition_order--;
|
||||||
|
|
||||||
|
FLAC__ASSERT(
|
||||||
|
(max_rice_partition_order == 0 && blocksize >= predictor_order) ||
|
||||||
|
(max_rice_partition_order > 0 && blocksize >> max_rice_partition_order > predictor_order)
|
||||||
|
);
|
||||||
|
|
||||||
|
return max_rice_partition_order;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FLAC__format_entropy_coding_method_partitioned_rice_contents_init(FLAC__EntropyCodingMethod_PartitionedRiceContents *object)
|
||||||
|
{
|
||||||
|
FLAC__ASSERT(0 != object);
|
||||||
|
|
||||||
|
object->parameters = 0;
|
||||||
|
object->raw_bits = 0;
|
||||||
|
object->capacity_by_order = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(FLAC__EntropyCodingMethod_PartitionedRiceContents *object)
|
||||||
|
{
|
||||||
|
FLAC__ASSERT(0 != object);
|
||||||
|
|
||||||
|
if(0 != object->parameters)
|
||||||
|
free(object->parameters);
|
||||||
|
if(0 != object->raw_bits)
|
||||||
|
free(object->raw_bits);
|
||||||
|
FLAC__format_entropy_coding_method_partitioned_rice_contents_init(object);
|
||||||
|
}
|
||||||
|
|
||||||
|
FLAC__bool FLAC__format_entropy_coding_method_partitioned_rice_contents_ensure_size(FLAC__EntropyCodingMethod_PartitionedRiceContents *object, unsigned max_partition_order)
|
||||||
|
{
|
||||||
|
FLAC__ASSERT(0 != object);
|
||||||
|
|
||||||
|
FLAC__ASSERT(object->capacity_by_order > 0 || (0 == object->parameters && 0 == object->raw_bits));
|
||||||
|
|
||||||
|
if(object->capacity_by_order < max_partition_order) {
|
||||||
|
if(0 == (object->parameters = safe_realloc_(object->parameters, sizeof(unsigned)*(1 << max_partition_order))))
|
||||||
|
return false;
|
||||||
|
if(0 == (object->raw_bits = safe_realloc_(object->raw_bits, sizeof(unsigned)*(1 << max_partition_order))))
|
||||||
|
return false;
|
||||||
|
memset(object->raw_bits, 0, sizeof(unsigned)*(1 << max_partition_order));
|
||||||
|
object->capacity_by_order = max_partition_order;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
46
deps/libFLAC/include/FLAC/assert.h
vendored
Normal file
46
deps/libFLAC/include/FLAC/assert.h
vendored
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
/* libFLAC - Free Lossless Audio Codec library
|
||||||
|
* Copyright (C) 2001-2009 Josh Coalson
|
||||||
|
* Copyright (C) 2011-2016 Xiph.Org Foundation
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Xiph.org Foundation nor the names of its
|
||||||
|
* 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 FOUNDATION OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef FLAC__ASSERT_H
|
||||||
|
#define FLAC__ASSERT_H
|
||||||
|
|
||||||
|
/* we need this since some compilers (like MSVC) leave assert()s on release code (and we don't want to use their ASSERT) */
|
||||||
|
#ifdef DEBUG
|
||||||
|
#include <assert.h>
|
||||||
|
#define FLAC__ASSERT(x) assert(x)
|
||||||
|
#define FLAC__ASSERT_DECLARATION(x) x
|
||||||
|
#else
|
||||||
|
#define FLAC__ASSERT(x)
|
||||||
|
#define FLAC__ASSERT_DECLARATION(x)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
185
deps/libFLAC/include/FLAC/callback.h
vendored
Normal file
185
deps/libFLAC/include/FLAC/callback.h
vendored
Normal file
@ -0,0 +1,185 @@
|
|||||||
|
/* libFLAC - Free Lossless Audio Codec library
|
||||||
|
* Copyright (C) 2004-2009 Josh Coalson
|
||||||
|
* Copyright (C) 2011-2016 Xiph.Org Foundation
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Xiph.org Foundation nor the names of its
|
||||||
|
* 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 FOUNDATION OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef FLAC__CALLBACK_H
|
||||||
|
#define FLAC__CALLBACK_H
|
||||||
|
|
||||||
|
#include "ordinals.h"
|
||||||
|
#include <stdlib.h> /* for size_t */
|
||||||
|
|
||||||
|
/** \file include/FLAC/callback.h
|
||||||
|
*
|
||||||
|
* \brief
|
||||||
|
* This module defines the structures for describing I/O callbacks
|
||||||
|
* to the other FLAC interfaces.
|
||||||
|
*
|
||||||
|
* See the detailed documentation for callbacks in the
|
||||||
|
* \link flac_callbacks callbacks \endlink module.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** \defgroup flac_callbacks FLAC/callback.h: I/O callback structures
|
||||||
|
* \ingroup flac
|
||||||
|
*
|
||||||
|
* \brief
|
||||||
|
* This module defines the structures for describing I/O callbacks
|
||||||
|
* to the other FLAC interfaces.
|
||||||
|
*
|
||||||
|
* The purpose of the I/O callback functions is to create a common way
|
||||||
|
* for the metadata interfaces to handle I/O.
|
||||||
|
*
|
||||||
|
* Originally the metadata interfaces required filenames as the way of
|
||||||
|
* specifying FLAC files to operate on. This is problematic in some
|
||||||
|
* environments so there is an additional option to specify a set of
|
||||||
|
* callbacks for doing I/O on the FLAC file, instead of the filename.
|
||||||
|
*
|
||||||
|
* In addition to the callbacks, a FLAC__IOHandle type is defined as an
|
||||||
|
* opaque structure for a data source.
|
||||||
|
*
|
||||||
|
* The callback function prototypes are similar (but not identical) to the
|
||||||
|
* stdio functions fread, fwrite, fseek, ftell, feof, and fclose. If you use
|
||||||
|
* stdio streams to implement the callbacks, you can pass fread, fwrite, and
|
||||||
|
* fclose anywhere a FLAC__IOCallback_Read, FLAC__IOCallback_Write, or
|
||||||
|
* FLAC__IOCallback_Close is required, and a FILE* anywhere a FLAC__IOHandle
|
||||||
|
* is required. \warning You generally CANNOT directly use fseek or ftell
|
||||||
|
* for FLAC__IOCallback_Seek or FLAC__IOCallback_Tell since on most systems
|
||||||
|
* these use 32-bit offsets and FLAC requires 64-bit offsets to deal with
|
||||||
|
* large files. You will have to find an equivalent function (e.g. ftello),
|
||||||
|
* or write a wrapper. The same is true for feof() since this is usually
|
||||||
|
* implemented as a macro, not as a function whose address can be taken.
|
||||||
|
*
|
||||||
|
* \{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** This is the opaque handle type used by the callbacks. Typically
|
||||||
|
* this is a \c FILE* or address of a file descriptor.
|
||||||
|
*/
|
||||||
|
typedef void* FLAC__IOHandle;
|
||||||
|
|
||||||
|
/** Signature for the read callback.
|
||||||
|
* The signature and semantics match POSIX fread() implementations
|
||||||
|
* and can generally be used interchangeably.
|
||||||
|
*
|
||||||
|
* \param ptr The address of the read buffer.
|
||||||
|
* \param size The size of the records to be read.
|
||||||
|
* \param nmemb The number of records to be read.
|
||||||
|
* \param handle The handle to the data source.
|
||||||
|
* \retval size_t
|
||||||
|
* The number of records read.
|
||||||
|
*/
|
||||||
|
typedef size_t (*FLAC__IOCallback_Read) (void *ptr, size_t size, size_t nmemb, FLAC__IOHandle handle);
|
||||||
|
|
||||||
|
/** Signature for the write callback.
|
||||||
|
* The signature and semantics match POSIX fwrite() implementations
|
||||||
|
* and can generally be used interchangeably.
|
||||||
|
*
|
||||||
|
* \param ptr The address of the write buffer.
|
||||||
|
* \param size The size of the records to be written.
|
||||||
|
* \param nmemb The number of records to be written.
|
||||||
|
* \param handle The handle to the data source.
|
||||||
|
* \retval size_t
|
||||||
|
* The number of records written.
|
||||||
|
*/
|
||||||
|
typedef size_t (*FLAC__IOCallback_Write) (const void *ptr, size_t size, size_t nmemb, FLAC__IOHandle handle);
|
||||||
|
|
||||||
|
/** Signature for the seek callback.
|
||||||
|
* The signature and semantics mostly match POSIX fseek() WITH ONE IMPORTANT
|
||||||
|
* EXCEPTION: the offset is a 64-bit type whereas fseek() is generally 'long'
|
||||||
|
* and 32-bits wide.
|
||||||
|
*
|
||||||
|
* \param handle The handle to the data source.
|
||||||
|
* \param offset The new position, relative to \a whence
|
||||||
|
* \param whence \c SEEK_SET, \c SEEK_CUR, or \c SEEK_END
|
||||||
|
* \retval int
|
||||||
|
* \c 0 on success, \c -1 on error.
|
||||||
|
*/
|
||||||
|
typedef int (*FLAC__IOCallback_Seek) (FLAC__IOHandle handle, FLAC__int64 offset, int whence);
|
||||||
|
|
||||||
|
/** Signature for the tell callback.
|
||||||
|
* The signature and semantics mostly match POSIX ftell() WITH ONE IMPORTANT
|
||||||
|
* EXCEPTION: the offset is a 64-bit type whereas ftell() is generally 'long'
|
||||||
|
* and 32-bits wide.
|
||||||
|
*
|
||||||
|
* \param handle The handle to the data source.
|
||||||
|
* \retval FLAC__int64
|
||||||
|
* The current position on success, \c -1 on error.
|
||||||
|
*/
|
||||||
|
typedef FLAC__int64 (*FLAC__IOCallback_Tell) (FLAC__IOHandle handle);
|
||||||
|
|
||||||
|
/** Signature for the EOF callback.
|
||||||
|
* The signature and semantics mostly match POSIX feof() but WATCHOUT:
|
||||||
|
* on many systems, feof() is a macro, so in this case a wrapper function
|
||||||
|
* must be provided instead.
|
||||||
|
*
|
||||||
|
* \param handle The handle to the data source.
|
||||||
|
* \retval int
|
||||||
|
* \c 0 if not at end of file, nonzero if at end of file.
|
||||||
|
*/
|
||||||
|
typedef int (*FLAC__IOCallback_Eof) (FLAC__IOHandle handle);
|
||||||
|
|
||||||
|
/** Signature for the close callback.
|
||||||
|
* The signature and semantics match POSIX fclose() implementations
|
||||||
|
* and can generally be used interchangeably.
|
||||||
|
*
|
||||||
|
* \param handle The handle to the data source.
|
||||||
|
* \retval int
|
||||||
|
* \c 0 on success, \c EOF on error.
|
||||||
|
*/
|
||||||
|
typedef int (*FLAC__IOCallback_Close) (FLAC__IOHandle handle);
|
||||||
|
|
||||||
|
/** A structure for holding a set of callbacks.
|
||||||
|
* Each FLAC interface that requires a FLAC__IOCallbacks structure will
|
||||||
|
* describe which of the callbacks are required. The ones that are not
|
||||||
|
* required may be set to NULL.
|
||||||
|
*
|
||||||
|
* If the seek requirement for an interface is optional, you can signify that
|
||||||
|
* a data sorce is not seekable by setting the \a seek field to \c NULL.
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
FLAC__IOCallback_Read read;
|
||||||
|
FLAC__IOCallback_Write write;
|
||||||
|
FLAC__IOCallback_Seek seek;
|
||||||
|
FLAC__IOCallback_Tell tell;
|
||||||
|
FLAC__IOCallback_Eof eof;
|
||||||
|
FLAC__IOCallback_Close close;
|
||||||
|
} FLAC__IOCallbacks;
|
||||||
|
|
||||||
|
/* \} */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
97
deps/libFLAC/include/FLAC/export.h
vendored
Normal file
97
deps/libFLAC/include/FLAC/export.h
vendored
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
/* libFLAC - Free Lossless Audio Codec library
|
||||||
|
* Copyright (C) 2000-2009 Josh Coalson
|
||||||
|
* Copyright (C) 2011-2016 Xiph.Org Foundation
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Xiph.org Foundation nor the names of its
|
||||||
|
* 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 FOUNDATION OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef FLAC__EXPORT_H
|
||||||
|
#define FLAC__EXPORT_H
|
||||||
|
|
||||||
|
/** \file include/FLAC/export.h
|
||||||
|
*
|
||||||
|
* \brief
|
||||||
|
* This module contains #defines and symbols for exporting function
|
||||||
|
* calls, and providing version information and compiled-in features.
|
||||||
|
*
|
||||||
|
* See the \link flac_export export \endlink module.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** \defgroup flac_export FLAC/export.h: export symbols
|
||||||
|
* \ingroup flac
|
||||||
|
*
|
||||||
|
* \brief
|
||||||
|
* This module contains #defines and symbols for exporting function
|
||||||
|
* calls, and providing version information and compiled-in features.
|
||||||
|
*
|
||||||
|
* If you are compiling with MSVC and will link to the static library
|
||||||
|
* (libFLAC.lib) you should define FLAC__NO_DLL in your project to
|
||||||
|
* make sure the symbols are exported properly.
|
||||||
|
*
|
||||||
|
* \{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined(FLAC__NO_DLL)
|
||||||
|
#define FLAC_API
|
||||||
|
|
||||||
|
#elif defined(_MSC_VER)
|
||||||
|
#ifdef FLAC_API_EXPORTS
|
||||||
|
#define FLAC_API __declspec(dllexport)
|
||||||
|
#else
|
||||||
|
#define FLAC_API __declspec(dllimport)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif defined(FLAC__USE_VISIBILITY_ATTR)
|
||||||
|
#define FLAC_API __attribute__ ((visibility ("default")))
|
||||||
|
|
||||||
|
#else
|
||||||
|
#define FLAC_API
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** These #defines will mirror the libtool-based library version number, see
|
||||||
|
* http://www.gnu.org/software/libtool/manual/libtool.html#Libtool-versioning
|
||||||
|
*/
|
||||||
|
#define FLAC_API_VERSION_CURRENT 11
|
||||||
|
#define FLAC_API_VERSION_REVISION 0 /**< see above */
|
||||||
|
#define FLAC_API_VERSION_AGE 3 /**< see above */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** \c 1 if the library has been compiled with support for Ogg FLAC, else \c 0. */
|
||||||
|
extern FLAC_API int FLAC_API_SUPPORTS_OGG_FLAC;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* \} */
|
||||||
|
|
||||||
|
#endif
|
1025
deps/libFLAC/include/FLAC/format.h
vendored
Normal file
1025
deps/libFLAC/include/FLAC/format.h
vendored
Normal file
File diff suppressed because it is too large
Load Diff
2182
deps/libFLAC/include/FLAC/metadata.h
vendored
Normal file
2182
deps/libFLAC/include/FLAC/metadata.h
vendored
Normal file
File diff suppressed because it is too large
Load Diff
86
deps/libFLAC/include/FLAC/ordinals.h
vendored
Normal file
86
deps/libFLAC/include/FLAC/ordinals.h
vendored
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
/* libFLAC - Free Lossless Audio Codec library
|
||||||
|
* Copyright (C) 2000-2009 Josh Coalson
|
||||||
|
* Copyright (C) 2011-2016 Xiph.Org Foundation
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Xiph.org Foundation nor the names of its
|
||||||
|
* 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 FOUNDATION OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef FLAC__ORDINALS_H
|
||||||
|
#define FLAC__ORDINALS_H
|
||||||
|
|
||||||
|
#if defined(_MSC_VER) && _MSC_VER < 1600
|
||||||
|
|
||||||
|
/* Microsoft Visual Studio earlier than the 2010 version did not provide
|
||||||
|
* the 1999 ISO C Standard header file <stdint.h>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef __int8 FLAC__int8;
|
||||||
|
typedef unsigned __int8 FLAC__uint8;
|
||||||
|
|
||||||
|
typedef __int16 FLAC__int16;
|
||||||
|
typedef __int32 FLAC__int32;
|
||||||
|
typedef __int64 FLAC__int64;
|
||||||
|
typedef unsigned __int16 FLAC__uint16;
|
||||||
|
typedef unsigned __int32 FLAC__uint32;
|
||||||
|
typedef unsigned __int64 FLAC__uint64;
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/* For MSVC 2010 and everything else which provides <stdint.h>. */
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
typedef int8_t FLAC__int8;
|
||||||
|
typedef uint8_t FLAC__uint8;
|
||||||
|
|
||||||
|
typedef int16_t FLAC__int16;
|
||||||
|
typedef int32_t FLAC__int32;
|
||||||
|
typedef int64_t FLAC__int64;
|
||||||
|
typedef uint16_t FLAC__uint16;
|
||||||
|
typedef uint32_t FLAC__uint32;
|
||||||
|
typedef uint64_t FLAC__uint64;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef int FLAC__bool;
|
||||||
|
|
||||||
|
typedef FLAC__uint8 FLAC__byte;
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef true
|
||||||
|
#undef true
|
||||||
|
#endif
|
||||||
|
#ifdef false
|
||||||
|
#undef false
|
||||||
|
#endif
|
||||||
|
#ifndef __cplusplus
|
||||||
|
#define true 1
|
||||||
|
#define false 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
1560
deps/libFLAC/include/FLAC/stream_decoder.h
vendored
Normal file
1560
deps/libFLAC/include/FLAC/stream_decoder.h
vendored
Normal file
File diff suppressed because it is too large
Load Diff
210
deps/libFLAC/include/private/bitmath.h
vendored
Normal file
210
deps/libFLAC/include/private/bitmath.h
vendored
Normal file
@ -0,0 +1,210 @@
|
|||||||
|
/* libFLAC - Free Lossless Audio Codec library
|
||||||
|
* Copyright (C) 2001-2009 Josh Coalson
|
||||||
|
* Copyright (C) 2011-2016 Xiph.Org Foundation
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Xiph.org Foundation nor the names of its
|
||||||
|
* 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 FOUNDATION OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef FLAC__PRIVATE__BITMATH_H
|
||||||
|
#define FLAC__PRIVATE__BITMATH_H
|
||||||
|
|
||||||
|
#include "FLAC/ordinals.h"
|
||||||
|
#include "FLAC/assert.h"
|
||||||
|
|
||||||
|
#include "share/compat.h"
|
||||||
|
|
||||||
|
#if defined(_MSC_VER)
|
||||||
|
#include <intrin.h> /* for _BitScanReverse* */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Will never be emitted for MSVC, GCC, Intel compilers */
|
||||||
|
static inline unsigned int FLAC__clz_soft_uint32(FLAC__uint32 word)
|
||||||
|
{
|
||||||
|
static const unsigned char byte_to_unary_table[] = {
|
||||||
|
8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4,
|
||||||
|
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
|
||||||
|
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
||||||
|
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||||
|
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, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
return word > 0xffffff ? byte_to_unary_table[word >> 24] :
|
||||||
|
word > 0xffff ? byte_to_unary_table[word >> 16] + 8 :
|
||||||
|
word > 0xff ? byte_to_unary_table[word >> 8] + 16 :
|
||||||
|
byte_to_unary_table[word] + 24;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline unsigned int FLAC__clz_uint32(FLAC__uint32 v)
|
||||||
|
{
|
||||||
|
/* Never used with input 0 */
|
||||||
|
FLAC__ASSERT(v > 0);
|
||||||
|
#if defined(__INTEL_COMPILER)
|
||||||
|
return _bit_scan_reverse(v) ^ 31U;
|
||||||
|
#elif defined(__GNUC__) && (__GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
|
||||||
|
/* This will translate either to (bsr ^ 31U), clz , ctlz, cntlz, lzcnt depending on
|
||||||
|
* -march= setting or to a software routine in exotic machines. */
|
||||||
|
return __builtin_clz(v);
|
||||||
|
#elif defined(_MSC_VER)
|
||||||
|
{
|
||||||
|
unsigned long idx;
|
||||||
|
_BitScanReverse(&idx, v);
|
||||||
|
return idx ^ 31U;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
return FLAC__clz_soft_uint32(v);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Used when 64-bit bsr/clz is unavailable; can use 32-bit bsr/clz when possible */
|
||||||
|
static inline unsigned int FLAC__clz_soft_uint64(FLAC__uint64 word)
|
||||||
|
{
|
||||||
|
return (FLAC__uint32)(word>>32) ? FLAC__clz_uint32((FLAC__uint32)(word>>32)) :
|
||||||
|
FLAC__clz_uint32((FLAC__uint32)word) + 32;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline unsigned int FLAC__clz_uint64(FLAC__uint64 v)
|
||||||
|
{
|
||||||
|
/* Never used with input 0 */
|
||||||
|
FLAC__ASSERT(v > 0);
|
||||||
|
#if defined(__GNUC__) && (__GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
|
||||||
|
return __builtin_clzll(v);
|
||||||
|
#elif (defined(__INTEL_COMPILER) || defined(_MSC_VER)) && (defined(_M_IA64) || defined(_M_X64))
|
||||||
|
{
|
||||||
|
unsigned long idx;
|
||||||
|
_BitScanReverse64(&idx, v);
|
||||||
|
return idx ^ 63U;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
return FLAC__clz_soft_uint64(v);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/* These two functions work with input 0 */
|
||||||
|
static inline unsigned int FLAC__clz2_uint32(FLAC__uint32 v)
|
||||||
|
{
|
||||||
|
if (!v)
|
||||||
|
return 32;
|
||||||
|
return FLAC__clz_uint32(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline unsigned int FLAC__clz2_uint64(FLAC__uint64 v)
|
||||||
|
{
|
||||||
|
if (!v)
|
||||||
|
return 64;
|
||||||
|
return FLAC__clz_uint64(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* An example of what FLAC__bitmath_ilog2() computes:
|
||||||
|
*
|
||||||
|
* ilog2( 0) = assertion failure
|
||||||
|
* ilog2( 1) = 0
|
||||||
|
* ilog2( 2) = 1
|
||||||
|
* ilog2( 3) = 1
|
||||||
|
* ilog2( 4) = 2
|
||||||
|
* ilog2( 5) = 2
|
||||||
|
* ilog2( 6) = 2
|
||||||
|
* ilog2( 7) = 2
|
||||||
|
* ilog2( 8) = 3
|
||||||
|
* ilog2( 9) = 3
|
||||||
|
* ilog2(10) = 3
|
||||||
|
* ilog2(11) = 3
|
||||||
|
* ilog2(12) = 3
|
||||||
|
* ilog2(13) = 3
|
||||||
|
* ilog2(14) = 3
|
||||||
|
* ilog2(15) = 3
|
||||||
|
* ilog2(16) = 4
|
||||||
|
* ilog2(17) = 4
|
||||||
|
* ilog2(18) = 4
|
||||||
|
*/
|
||||||
|
|
||||||
|
static inline unsigned FLAC__bitmath_ilog2(FLAC__uint32 v)
|
||||||
|
{
|
||||||
|
FLAC__ASSERT(v > 0);
|
||||||
|
#if defined(__INTEL_COMPILER)
|
||||||
|
return _bit_scan_reverse(v);
|
||||||
|
#elif defined(_MSC_VER)
|
||||||
|
{
|
||||||
|
unsigned long idx;
|
||||||
|
_BitScanReverse(&idx, v);
|
||||||
|
return idx;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
return FLAC__clz_uint32(v) ^ 31U;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline unsigned FLAC__bitmath_ilog2_wide(FLAC__uint64 v)
|
||||||
|
{
|
||||||
|
FLAC__ASSERT(v > 0);
|
||||||
|
#if defined(__GNUC__) && (__GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
|
||||||
|
return __builtin_clzll(v) ^ 63U;
|
||||||
|
/* Sorry, only supported in x64/Itanium.. and both have fast FPU which makes integer-only encoder pointless */
|
||||||
|
#elif (defined(__INTEL_COMPILER) || defined(_MSC_VER)) && (defined(_M_IA64) || defined(_M_X64))
|
||||||
|
{
|
||||||
|
unsigned long idx;
|
||||||
|
_BitScanReverse64(&idx, v);
|
||||||
|
return idx;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
/* Brain-damaged compilers will use the fastest possible way that is,
|
||||||
|
de Bruijn sequences (http://supertech.csail.mit.edu/papers/debruijn.pdf)
|
||||||
|
(C) Timothy B. Terriberry (tterribe@xiph.org) 2001-2009 CC0 (Public domain).
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
static const unsigned char DEBRUIJN_IDX64[64]={
|
||||||
|
0, 1, 2, 7, 3,13, 8,19, 4,25,14,28, 9,34,20,40,
|
||||||
|
5,17,26,38,15,46,29,48,10,31,35,54,21,50,41,57,
|
||||||
|
63, 6,12,18,24,27,33,39,16,37,45,47,30,53,49,56,
|
||||||
|
62,11,23,32,36,44,52,55,61,22,43,51,60,42,59,58
|
||||||
|
};
|
||||||
|
v|= v>>1;
|
||||||
|
v|= v>>2;
|
||||||
|
v|= v>>4;
|
||||||
|
v|= v>>8;
|
||||||
|
v|= v>>16;
|
||||||
|
v|= v>>32;
|
||||||
|
v= (v>>1)+1;
|
||||||
|
return DEBRUIJN_IDX64[v*FLAC__U64L(0x218A392CD3D5DBF)>>58&0x3F];
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned FLAC__bitmath_silog2(FLAC__int64 v);
|
||||||
|
|
||||||
|
#endif
|
91
deps/libFLAC/include/private/bitreader.h
vendored
Normal file
91
deps/libFLAC/include/private/bitreader.h
vendored
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
/* libFLAC - Free Lossless Audio Codec library
|
||||||
|
* Copyright (C) 2000-2009 Josh Coalson
|
||||||
|
* Copyright (C) 2011-2016 Xiph.Org Foundation
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Xiph.org Foundation nor the names of its
|
||||||
|
* 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 FOUNDATION OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef FLAC__PRIVATE__BITREADER_H
|
||||||
|
#define FLAC__PRIVATE__BITREADER_H
|
||||||
|
|
||||||
|
#include <stdio.h> /* for FILE */
|
||||||
|
#include "FLAC/ordinals.h"
|
||||||
|
#include "cpu.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* opaque structure definition
|
||||||
|
*/
|
||||||
|
struct FLAC__BitReader;
|
||||||
|
typedef struct FLAC__BitReader FLAC__BitReader;
|
||||||
|
|
||||||
|
typedef FLAC__bool (*FLAC__BitReaderReadCallback)(FLAC__byte buffer[], size_t *bytes, void *client_data);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* construction, deletion, initialization, etc functions
|
||||||
|
*/
|
||||||
|
FLAC__BitReader *FLAC__bitreader_new(void);
|
||||||
|
void FLAC__bitreader_delete(FLAC__BitReader *br);
|
||||||
|
FLAC__bool FLAC__bitreader_init(FLAC__BitReader *br, FLAC__BitReaderReadCallback rcb, void *cd);
|
||||||
|
void FLAC__bitreader_free(FLAC__BitReader *br); /* does not 'free(br)' */
|
||||||
|
FLAC__bool FLAC__bitreader_clear(FLAC__BitReader *br);
|
||||||
|
void FLAC__bitreader_dump(const FLAC__BitReader *br, FILE *out);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* CRC functions
|
||||||
|
*/
|
||||||
|
void FLAC__bitreader_reset_read_crc16(FLAC__BitReader *br, FLAC__uint16 seed);
|
||||||
|
FLAC__uint16 FLAC__bitreader_get_read_crc16(FLAC__BitReader *br);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* info functions
|
||||||
|
*/
|
||||||
|
FLAC__bool FLAC__bitreader_is_consumed_byte_aligned(const FLAC__BitReader *br);
|
||||||
|
unsigned FLAC__bitreader_bits_left_for_byte_alignment(const FLAC__BitReader *br);
|
||||||
|
unsigned FLAC__bitreader_get_input_bits_unconsumed(const FLAC__BitReader *br);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* read functions
|
||||||
|
*/
|
||||||
|
|
||||||
|
FLAC__bool FLAC__bitreader_read_raw_uint32(FLAC__BitReader *br, FLAC__uint32 *val, unsigned bits);
|
||||||
|
FLAC__bool FLAC__bitreader_read_raw_int32(FLAC__BitReader *br, FLAC__int32 *val, unsigned bits);
|
||||||
|
FLAC__bool FLAC__bitreader_read_raw_uint64(FLAC__BitReader *br, FLAC__uint64 *val, unsigned bits);
|
||||||
|
FLAC__bool FLAC__bitreader_read_uint32_little_endian(FLAC__BitReader *br, FLAC__uint32 *val); /*only for bits=32*/
|
||||||
|
FLAC__bool FLAC__bitreader_skip_bits_no_crc(FLAC__BitReader *br, unsigned bits); /* WATCHOUT: does not CRC the skipped data! */ /*@@@@ add to unit tests */
|
||||||
|
FLAC__bool FLAC__bitreader_skip_byte_block_aligned_no_crc(FLAC__BitReader *br, unsigned nvals); /* WATCHOUT: does not CRC the read data! */
|
||||||
|
FLAC__bool FLAC__bitreader_read_byte_block_aligned_no_crc(FLAC__BitReader *br, FLAC__byte *val, unsigned nvals); /* WATCHOUT: does not CRC the read data! */
|
||||||
|
FLAC__bool FLAC__bitreader_read_unary_unsigned(FLAC__BitReader *br, unsigned *val);
|
||||||
|
FLAC__bool FLAC__bitreader_read_rice_signed(FLAC__BitReader *br, int *val, unsigned parameter);
|
||||||
|
FLAC__bool FLAC__bitreader_read_rice_signed_block(FLAC__BitReader *br, int vals[], unsigned nvals, unsigned parameter);
|
||||||
|
#if 0 /* UNUSED */
|
||||||
|
FLAC__bool FLAC__bitreader_read_golomb_signed(FLAC__BitReader *br, int *val, unsigned parameter);
|
||||||
|
FLAC__bool FLAC__bitreader_read_golomb_unsigned(FLAC__BitReader *br, unsigned *val, unsigned parameter);
|
||||||
|
#endif
|
||||||
|
FLAC__bool FLAC__bitreader_read_utf8_uint32(FLAC__BitReader *br, FLAC__uint32 *val, FLAC__byte *raw, unsigned *rawlen);
|
||||||
|
FLAC__bool FLAC__bitreader_read_utf8_uint64(FLAC__BitReader *br, FLAC__uint64 *val, FLAC__byte *raw, unsigned *rawlen);
|
||||||
|
#endif
|
186
deps/libFLAC/include/private/cpu.h
vendored
Normal file
186
deps/libFLAC/include/private/cpu.h
vendored
Normal file
@ -0,0 +1,186 @@
|
|||||||
|
/* libFLAC - Free Lossless Audio Codec library
|
||||||
|
* Copyright (C) 2001-2009 Josh Coalson
|
||||||
|
* Copyright (C) 2011-2016 Xiph.Org Foundation
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Xiph.org Foundation nor the names of its
|
||||||
|
* 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 FOUNDATION OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef FLAC__PRIVATE__CPU_H
|
||||||
|
#define FLAC__PRIVATE__CPU_H
|
||||||
|
|
||||||
|
#include "FLAC/ordinals.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef FLAC__CPU_X86_64
|
||||||
|
|
||||||
|
#if defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) || defined(_M_X64) || defined(_M_AMD64)
|
||||||
|
#define FLAC__CPU_X86_64
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef FLAC__CPU_IA32
|
||||||
|
|
||||||
|
#if defined(__i386__) || defined(__i486__) || defined(__i586__) || defined(__i686__) ||defined( __i386) || defined(_M_IX86)
|
||||||
|
#define FLAC__CPU_IA32
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if FLAC__HAS_X86INTRIN
|
||||||
|
/* SSE intrinsics support by ICC/MSVC/GCC */
|
||||||
|
#if defined __INTEL_COMPILER
|
||||||
|
#define FLAC__SSE_TARGET(x)
|
||||||
|
#define FLAC__SSE_SUPPORTED 1
|
||||||
|
#define FLAC__SSE2_SUPPORTED 1
|
||||||
|
#if (__INTEL_COMPILER >= 1000) /* Intel C++ Compiler 10.0 */
|
||||||
|
#define FLAC__SSSE3_SUPPORTED 1
|
||||||
|
#define FLAC__SSE4_1_SUPPORTED 1
|
||||||
|
#endif
|
||||||
|
#if (__INTEL_COMPILER >= 1110) /* Intel C++ Compiler 11.1 */
|
||||||
|
#define FLAC__AVX_SUPPORTED 1
|
||||||
|
#endif
|
||||||
|
#if (__INTEL_COMPILER >= 1300) /* Intel C++ Compiler 13.0 */
|
||||||
|
#define FLAC__AVX2_SUPPORTED 1
|
||||||
|
#define FLAC__FMA_SUPPORTED 1
|
||||||
|
#endif
|
||||||
|
#elif defined _MSC_VER
|
||||||
|
#define FLAC__SSE_TARGET(x)
|
||||||
|
#define FLAC__SSE_SUPPORTED 1
|
||||||
|
#define FLAC__SSE2_SUPPORTED 1
|
||||||
|
#if (_MSC_VER >= 1500) /* MS Visual Studio 2008 */
|
||||||
|
#define FLAC__SSSE3_SUPPORTED 1
|
||||||
|
#define FLAC__SSE4_1_SUPPORTED 1
|
||||||
|
#endif
|
||||||
|
#if (_MSC_FULL_VER >= 160040219) /* MS Visual Studio 2010 SP1 */
|
||||||
|
#define FLAC__AVX_SUPPORTED 1
|
||||||
|
#endif
|
||||||
|
#if (_MSC_VER >= 1700) /* MS Visual Studio 2012 */
|
||||||
|
#define FLAC__AVX2_SUPPORTED 1
|
||||||
|
#define FLAC__FMA_SUPPORTED 1
|
||||||
|
#endif
|
||||||
|
#elif defined __GNUC__
|
||||||
|
#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 9)) /* since GCC 4.9 -msse.. compiler options aren't necessary */
|
||||||
|
#define FLAC__SSE_TARGET(x) __attribute__ ((__target__ (x)))
|
||||||
|
#define FLAC__SSE_SUPPORTED 1
|
||||||
|
#define FLAC__SSE2_SUPPORTED 1
|
||||||
|
#define FLAC__SSSE3_SUPPORTED 1
|
||||||
|
#define FLAC__SSE4_1_SUPPORTED 1
|
||||||
|
#ifdef FLAC__USE_AVX
|
||||||
|
#define FLAC__AVX_SUPPORTED 1
|
||||||
|
#define FLAC__AVX2_SUPPORTED 1
|
||||||
|
#define FLAC__FMA_SUPPORTED 1
|
||||||
|
#endif
|
||||||
|
#else /* for GCC older than 4.9 */
|
||||||
|
#define FLAC__SSE_TARGET(x)
|
||||||
|
#ifdef __SSE__
|
||||||
|
#define FLAC__SSE_SUPPORTED 1
|
||||||
|
#endif
|
||||||
|
#ifdef __SSE2__
|
||||||
|
#define FLAC__SSE2_SUPPORTED 1
|
||||||
|
#endif
|
||||||
|
#ifdef __SSSE3__
|
||||||
|
#define FLAC__SSSE3_SUPPORTED 1
|
||||||
|
#endif
|
||||||
|
#ifdef __SSE4_1__
|
||||||
|
#define FLAC__SSE4_1_SUPPORTED 1
|
||||||
|
#endif
|
||||||
|
#ifdef __AVX__
|
||||||
|
#define FLAC__AVX_SUPPORTED 1
|
||||||
|
#endif
|
||||||
|
#ifdef __AVX2__
|
||||||
|
#define FLAC__AVX2_SUPPORTED 1
|
||||||
|
#endif
|
||||||
|
#ifdef __FMA__
|
||||||
|
#define FLAC__FMA_SUPPORTED 1
|
||||||
|
#endif
|
||||||
|
#endif /* GCC version */
|
||||||
|
#endif /* compiler version */
|
||||||
|
#endif /* intrinsics support */
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef FLAC__AVX_SUPPORTED
|
||||||
|
#define FLAC__AVX_SUPPORTED 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
FLAC__CPUINFO_TYPE_IA32,
|
||||||
|
FLAC__CPUINFO_TYPE_X86_64,
|
||||||
|
FLAC__CPUINFO_TYPE_UNKNOWN
|
||||||
|
} FLAC__CPUInfo_Type;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
FLAC__bool intel;
|
||||||
|
|
||||||
|
FLAC__bool cmov;
|
||||||
|
FLAC__bool mmx;
|
||||||
|
FLAC__bool sse;
|
||||||
|
FLAC__bool sse2;
|
||||||
|
|
||||||
|
FLAC__bool sse3;
|
||||||
|
FLAC__bool ssse3;
|
||||||
|
FLAC__bool sse41;
|
||||||
|
FLAC__bool sse42;
|
||||||
|
FLAC__bool avx;
|
||||||
|
FLAC__bool avx2;
|
||||||
|
FLAC__bool fma;
|
||||||
|
} FLAC__CPUInfo_IA32;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
FLAC__bool intel;
|
||||||
|
|
||||||
|
FLAC__bool sse3;
|
||||||
|
FLAC__bool ssse3;
|
||||||
|
FLAC__bool sse41;
|
||||||
|
FLAC__bool sse42;
|
||||||
|
FLAC__bool avx;
|
||||||
|
FLAC__bool avx2;
|
||||||
|
FLAC__bool fma;
|
||||||
|
} FLAC__CPUInfo_x86;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
FLAC__bool use_asm;
|
||||||
|
FLAC__CPUInfo_Type type;
|
||||||
|
FLAC__CPUInfo_IA32 ia32;
|
||||||
|
FLAC__CPUInfo_x86 x86;
|
||||||
|
} FLAC__CPUInfo;
|
||||||
|
|
||||||
|
void FLAC__cpu_info(FLAC__CPUInfo *info);
|
||||||
|
|
||||||
|
FLAC__uint32 FLAC__cpu_have_cpuid_asm_ia32(void);
|
||||||
|
|
||||||
|
void FLAC__cpu_info_asm_ia32(FLAC__uint32 *flags_edx, FLAC__uint32 *flags_ecx);
|
||||||
|
|
||||||
|
void FLAC__cpu_info_x86(FLAC__uint32 level, FLAC__uint32 *eax, FLAC__uint32 *ebx, FLAC__uint32 *ecx, FLAC__uint32 *edx);
|
||||||
|
|
||||||
|
#endif
|
62
deps/libFLAC/include/private/crc.h
vendored
Normal file
62
deps/libFLAC/include/private/crc.h
vendored
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
/* libFLAC - Free Lossless Audio Codec library
|
||||||
|
* Copyright (C) 2000-2009 Josh Coalson
|
||||||
|
* Copyright (C) 2011-2016 Xiph.Org Foundation
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Xiph.org Foundation nor the names of its
|
||||||
|
* 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 FOUNDATION OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef FLAC__PRIVATE__CRC_H
|
||||||
|
#define FLAC__PRIVATE__CRC_H
|
||||||
|
|
||||||
|
#include "FLAC/ordinals.h"
|
||||||
|
|
||||||
|
/* 8 bit CRC generator, MSB shifted first
|
||||||
|
** polynomial = x^8 + x^2 + x^1 + x^0
|
||||||
|
** init = 0
|
||||||
|
*/
|
||||||
|
extern FLAC__byte const FLAC__crc8_table[256];
|
||||||
|
#define FLAC__CRC8_UPDATE(data, crc) (crc) = FLAC__crc8_table[(crc) ^ (data)];
|
||||||
|
void FLAC__crc8_update(const FLAC__byte data, FLAC__uint8 *crc);
|
||||||
|
void FLAC__crc8_update_block(const FLAC__byte *data, unsigned len, FLAC__uint8 *crc);
|
||||||
|
FLAC__uint8 FLAC__crc8(const FLAC__byte *data, unsigned len);
|
||||||
|
|
||||||
|
/* 16 bit CRC generator, MSB shifted first
|
||||||
|
** polynomial = x^16 + x^15 + x^2 + x^0
|
||||||
|
** init = 0
|
||||||
|
*/
|
||||||
|
extern unsigned const FLAC__crc16_table[256];
|
||||||
|
|
||||||
|
#define FLAC__CRC16_UPDATE(data, crc) ((((crc)<<8) & 0xffff) ^ FLAC__crc16_table[((crc)>>8) ^ (data)])
|
||||||
|
/* this alternate may be faster on some systems/compilers */
|
||||||
|
#if 0
|
||||||
|
#define FLAC__CRC16_UPDATE(data, crc) ((((crc)<<8) ^ FLAC__crc16_table[((crc)>>8) ^ (data)]) & 0xffff)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
unsigned FLAC__crc16(const FLAC__byte *data, unsigned len);
|
||||||
|
|
||||||
|
#endif
|
107
deps/libFLAC/include/private/fixed.h
vendored
Normal file
107
deps/libFLAC/include/private/fixed.h
vendored
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
/* libFLAC - Free Lossless Audio Codec library
|
||||||
|
* Copyright (C) 2000-2009 Josh Coalson
|
||||||
|
* Copyright (C) 2011-2016 Xiph.Org Foundation
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Xiph.org Foundation nor the names of its
|
||||||
|
* 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 FOUNDATION OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef FLAC__PRIVATE__FIXED_H
|
||||||
|
#define FLAC__PRIVATE__FIXED_H
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "private/cpu.h"
|
||||||
|
#include "private/float.h"
|
||||||
|
#include "FLAC/format.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* FLAC__fixed_compute_best_predictor()
|
||||||
|
* --------------------------------------------------------------------
|
||||||
|
* Compute the best fixed predictor and the expected bits-per-sample
|
||||||
|
* of the residual signal for each order. The _wide() version uses
|
||||||
|
* 64-bit integers which is statistically necessary when bits-per-
|
||||||
|
* sample + log2(blocksize) > 30
|
||||||
|
*
|
||||||
|
* IN data[0,data_len-1]
|
||||||
|
* IN data_len
|
||||||
|
* OUT residual_bits_per_sample[0,FLAC__MAX_FIXED_ORDER]
|
||||||
|
*/
|
||||||
|
#ifndef FLAC__INTEGER_ONLY_LIBRARY
|
||||||
|
unsigned FLAC__fixed_compute_best_predictor(const FLAC__int32 data[], unsigned data_len, float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]);
|
||||||
|
unsigned FLAC__fixed_compute_best_predictor_wide(const FLAC__int32 data[], unsigned data_len, float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]);
|
||||||
|
# ifndef FLAC__NO_ASM
|
||||||
|
# if (defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64) && FLAC__HAS_X86INTRIN
|
||||||
|
# ifdef FLAC__SSE2_SUPPORTED
|
||||||
|
unsigned FLAC__fixed_compute_best_predictor_intrin_sse2(const FLAC__int32 data[], unsigned data_len, float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER + 1]);
|
||||||
|
unsigned FLAC__fixed_compute_best_predictor_wide_intrin_sse2(const FLAC__int32 data[], unsigned data_len, float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER + 1]);
|
||||||
|
# endif
|
||||||
|
# ifdef FLAC__SSSE3_SUPPORTED
|
||||||
|
unsigned FLAC__fixed_compute_best_predictor_intrin_ssse3(const FLAC__int32 data[], unsigned data_len, float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]);
|
||||||
|
unsigned FLAC__fixed_compute_best_predictor_wide_intrin_ssse3(const FLAC__int32 data[], unsigned data_len, float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER + 1]);
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
# if defined FLAC__CPU_IA32 && defined FLAC__HAS_NASM
|
||||||
|
unsigned FLAC__fixed_compute_best_predictor_asm_ia32_mmx_cmov(const FLAC__int32 data[], unsigned data_len, float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]);
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
unsigned FLAC__fixed_compute_best_predictor(const FLAC__int32 data[], unsigned data_len, FLAC__fixedpoint residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]);
|
||||||
|
unsigned FLAC__fixed_compute_best_predictor_wide(const FLAC__int32 data[], unsigned data_len, FLAC__fixedpoint residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* FLAC__fixed_compute_residual()
|
||||||
|
* --------------------------------------------------------------------
|
||||||
|
* Compute the residual signal obtained from sutracting the predicted
|
||||||
|
* signal from the original.
|
||||||
|
*
|
||||||
|
* IN data[-order,data_len-1] original signal (NOTE THE INDICES!)
|
||||||
|
* IN data_len length of original signal
|
||||||
|
* IN order <= FLAC__MAX_FIXED_ORDER fixed-predictor order
|
||||||
|
* OUT residual[0,data_len-1] residual signal
|
||||||
|
*/
|
||||||
|
void FLAC__fixed_compute_residual(const FLAC__int32 data[], unsigned data_len, unsigned order, FLAC__int32 residual[]);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* FLAC__fixed_restore_signal()
|
||||||
|
* --------------------------------------------------------------------
|
||||||
|
* Restore the original signal by summing the residual and the
|
||||||
|
* predictor.
|
||||||
|
*
|
||||||
|
* IN residual[0,data_len-1] residual signal
|
||||||
|
* IN data_len length of original signal
|
||||||
|
* IN order <= FLAC__MAX_FIXED_ORDER fixed-predictor order
|
||||||
|
* *** IMPORTANT: the caller must pass in the historical samples:
|
||||||
|
* IN data[-order,-1] previously-reconstructed historical samples
|
||||||
|
* OUT data[0,data_len-1] original signal
|
||||||
|
*/
|
||||||
|
void FLAC__fixed_restore_signal(const FLAC__int32 residual[], unsigned data_len, unsigned order, FLAC__int32 data[]);
|
||||||
|
|
||||||
|
#endif
|
95
deps/libFLAC/include/private/float.h
vendored
Normal file
95
deps/libFLAC/include/private/float.h
vendored
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
/* libFLAC - Free Lossless Audio Codec library
|
||||||
|
* Copyright (C) 2004-2009 Josh Coalson
|
||||||
|
* Copyright (C) 2011-2016 Xiph.Org Foundation
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Xiph.org Foundation nor the names of its
|
||||||
|
* 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 FOUNDATION OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef FLAC__PRIVATE__FLOAT_H
|
||||||
|
#define FLAC__PRIVATE__FLOAT_H
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "FLAC/ordinals.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* All the code in libFLAC that uses float and double
|
||||||
|
* should be protected by checks of the macro
|
||||||
|
* FLAC__INTEGER_ONLY_LIBRARY.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef FLAC__INTEGER_ONLY_LIBRARY
|
||||||
|
/*
|
||||||
|
* FLAC__real is the basic floating point type used in LPC analysis.
|
||||||
|
*
|
||||||
|
* WATCHOUT: changing FLAC__real will change the signatures of many
|
||||||
|
* functions that have assembly language equivalents and break them.
|
||||||
|
*/
|
||||||
|
typedef float FLAC__real;
|
||||||
|
#else
|
||||||
|
/*
|
||||||
|
* The convention for FLAC__fixedpoint is to use the upper 16 bits
|
||||||
|
* for the integer part and lower 16 bits for the fractional part.
|
||||||
|
*/
|
||||||
|
typedef FLAC__int32 FLAC__fixedpoint;
|
||||||
|
extern const FLAC__fixedpoint FLAC__FP_ZERO;
|
||||||
|
extern const FLAC__fixedpoint FLAC__FP_ONE_HALF;
|
||||||
|
extern const FLAC__fixedpoint FLAC__FP_ONE;
|
||||||
|
extern const FLAC__fixedpoint FLAC__FP_LN2;
|
||||||
|
extern const FLAC__fixedpoint FLAC__FP_E;
|
||||||
|
|
||||||
|
#define FLAC__fixedpoint_trunc(x) ((x)>>16)
|
||||||
|
|
||||||
|
#define FLAC__fixedpoint_mul(x, y) ( (FLAC__fixedpoint) ( ((FLAC__int64)(x)*(FLAC__int64)(y)) >> 16 ) )
|
||||||
|
|
||||||
|
#define FLAC__fixedpoint_div(x, y) ( (FLAC__fixedpoint) ( ( ((FLAC__int64)(x)<<32) / (FLAC__int64)(y) ) >> 16 ) )
|
||||||
|
|
||||||
|
/*
|
||||||
|
* FLAC__fixedpoint_log2()
|
||||||
|
* --------------------------------------------------------------------
|
||||||
|
* Returns the base-2 logarithm of the fixed-point number 'x' using an
|
||||||
|
* algorithm by Knuth for x >= 1.0
|
||||||
|
*
|
||||||
|
* 'fracbits' is the number of fractional bits of 'x'. 'fracbits' must
|
||||||
|
* be < 32 and evenly divisible by 4 (0 is OK but not very precise).
|
||||||
|
*
|
||||||
|
* 'precision' roughly limits the number of iterations that are done;
|
||||||
|
* use (unsigned)(-1) for maximum precision.
|
||||||
|
*
|
||||||
|
* If 'x' is less than one -- that is, x < (1<<fracbits) -- then this
|
||||||
|
* function will punt and return 0.
|
||||||
|
*
|
||||||
|
* The return value will also have 'fracbits' fractional bits.
|
||||||
|
*/
|
||||||
|
FLAC__uint32 FLAC__fixedpoint_log2(FLAC__uint32 x, unsigned fracbits, unsigned precision);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
45
deps/libFLAC/include/private/format.h
vendored
Normal file
45
deps/libFLAC/include/private/format.h
vendored
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
/* libFLAC - Free Lossless Audio Codec library
|
||||||
|
* Copyright (C) 2000-2009 Josh Coalson
|
||||||
|
* Copyright (C) 2011-2016 Xiph.Org Foundation
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Xiph.org Foundation nor the names of its
|
||||||
|
* 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 FOUNDATION OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef FLAC__PRIVATE__FORMAT_H
|
||||||
|
#define FLAC__PRIVATE__FORMAT_H
|
||||||
|
|
||||||
|
#include "FLAC/format.h"
|
||||||
|
|
||||||
|
unsigned FLAC__format_get_max_rice_partition_order(unsigned blocksize, unsigned predictor_order);
|
||||||
|
unsigned FLAC__format_get_max_rice_partition_order_from_blocksize(unsigned blocksize);
|
||||||
|
unsigned FLAC__format_get_max_rice_partition_order_from_blocksize_limited_max_and_predictor_order(unsigned limit, unsigned blocksize, unsigned predictor_order);
|
||||||
|
void FLAC__format_entropy_coding_method_partitioned_rice_contents_init(FLAC__EntropyCodingMethod_PartitionedRiceContents *object);
|
||||||
|
void FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(FLAC__EntropyCodingMethod_PartitionedRiceContents *object);
|
||||||
|
FLAC__bool FLAC__format_entropy_coding_method_partitioned_rice_contents_ensure_size(FLAC__EntropyCodingMethod_PartitionedRiceContents *object, unsigned max_partition_order);
|
||||||
|
|
||||||
|
#endif
|
250
deps/libFLAC/include/private/lpc.h
vendored
Normal file
250
deps/libFLAC/include/private/lpc.h
vendored
Normal file
@ -0,0 +1,250 @@
|
|||||||
|
/* libFLAC - Free Lossless Audio Codec library
|
||||||
|
* Copyright (C) 2000-2009 Josh Coalson
|
||||||
|
* Copyright (C) 2011-2016 Xiph.Org Foundation
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Xiph.org Foundation nor the names of its
|
||||||
|
* 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 FOUNDATION OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef FLAC__PRIVATE__LPC_H
|
||||||
|
#define FLAC__PRIVATE__LPC_H
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "private/cpu.h"
|
||||||
|
#include "private/float.h"
|
||||||
|
#include "FLAC/format.h"
|
||||||
|
|
||||||
|
#ifndef FLAC__INTEGER_ONLY_LIBRARY
|
||||||
|
|
||||||
|
/*
|
||||||
|
* FLAC__lpc_window_data()
|
||||||
|
* --------------------------------------------------------------------
|
||||||
|
* Applies the given window to the data.
|
||||||
|
* OPT: asm implementation
|
||||||
|
*
|
||||||
|
* IN in[0,data_len-1]
|
||||||
|
* IN window[0,data_len-1]
|
||||||
|
* OUT out[0,lag-1]
|
||||||
|
* IN data_len
|
||||||
|
*/
|
||||||
|
void FLAC__lpc_window_data(const FLAC__int32 in[], const FLAC__real window[], FLAC__real out[], unsigned data_len);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* FLAC__lpc_compute_autocorrelation()
|
||||||
|
* --------------------------------------------------------------------
|
||||||
|
* Compute the autocorrelation for lags between 0 and lag-1.
|
||||||
|
* Assumes data[] outside of [0,data_len-1] == 0.
|
||||||
|
* Asserts that lag > 0.
|
||||||
|
*
|
||||||
|
* IN data[0,data_len-1]
|
||||||
|
* IN data_len
|
||||||
|
* IN 0 < lag <= data_len
|
||||||
|
* OUT autoc[0,lag-1]
|
||||||
|
*/
|
||||||
|
void FLAC__lpc_compute_autocorrelation(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]);
|
||||||
|
#ifndef FLAC__NO_ASM
|
||||||
|
# ifdef FLAC__CPU_IA32
|
||||||
|
# ifdef FLAC__HAS_NASM
|
||||||
|
void FLAC__lpc_compute_autocorrelation_asm_ia32(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]);
|
||||||
|
void FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_4_old(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]);
|
||||||
|
void FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_8_old(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]);
|
||||||
|
void FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_12_old(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]);
|
||||||
|
void FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_16_old(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]);
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
# if (defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64) && FLAC__HAS_X86INTRIN
|
||||||
|
# ifdef FLAC__SSE_SUPPORTED
|
||||||
|
void FLAC__lpc_compute_autocorrelation_intrin_sse_lag_4_old(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]);
|
||||||
|
void FLAC__lpc_compute_autocorrelation_intrin_sse_lag_8_old(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]);
|
||||||
|
void FLAC__lpc_compute_autocorrelation_intrin_sse_lag_12_old(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]);
|
||||||
|
void FLAC__lpc_compute_autocorrelation_intrin_sse_lag_16_old(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]);
|
||||||
|
void FLAC__lpc_compute_autocorrelation_intrin_sse_lag_4_new(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]);
|
||||||
|
void FLAC__lpc_compute_autocorrelation_intrin_sse_lag_8_new(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]);
|
||||||
|
void FLAC__lpc_compute_autocorrelation_intrin_sse_lag_12_new(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]);
|
||||||
|
void FLAC__lpc_compute_autocorrelation_intrin_sse_lag_16_new(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]);
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* FLAC__lpc_compute_lp_coefficients()
|
||||||
|
* --------------------------------------------------------------------
|
||||||
|
* Computes LP coefficients for orders 1..max_order.
|
||||||
|
* Do not call if autoc[0] == 0.0. This means the signal is zero
|
||||||
|
* and there is no point in calculating a predictor.
|
||||||
|
*
|
||||||
|
* IN autoc[0,max_order] autocorrelation values
|
||||||
|
* IN 0 < max_order <= FLAC__MAX_LPC_ORDER max LP order to compute
|
||||||
|
* OUT lp_coeff[0,max_order-1][0,max_order-1] LP coefficients for each order
|
||||||
|
* *** IMPORTANT:
|
||||||
|
* *** lp_coeff[0,max_order-1][max_order,FLAC__MAX_LPC_ORDER-1] are untouched
|
||||||
|
* OUT error[0,max_order-1] error for each order (more
|
||||||
|
* specifically, the variance of
|
||||||
|
* the error signal times # of
|
||||||
|
* samples in the signal)
|
||||||
|
*
|
||||||
|
* Example: if max_order is 9, the LP coefficients for order 9 will be
|
||||||
|
* in lp_coeff[8][0,8], the LP coefficients for order 8 will be
|
||||||
|
* in lp_coeff[7][0,7], etc.
|
||||||
|
*/
|
||||||
|
void FLAC__lpc_compute_lp_coefficients(const FLAC__real autoc[], unsigned *max_order, FLAC__real lp_coeff[][FLAC__MAX_LPC_ORDER], double error[]);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* FLAC__lpc_quantize_coefficients()
|
||||||
|
* --------------------------------------------------------------------
|
||||||
|
* Quantizes the LP coefficients. NOTE: precision + bits_per_sample
|
||||||
|
* must be less than 32 (sizeof(FLAC__int32)*8).
|
||||||
|
*
|
||||||
|
* IN lp_coeff[0,order-1] LP coefficients
|
||||||
|
* IN order LP order
|
||||||
|
* IN FLAC__MIN_QLP_COEFF_PRECISION < precision
|
||||||
|
* desired precision (in bits, including sign
|
||||||
|
* bit) of largest coefficient
|
||||||
|
* OUT qlp_coeff[0,order-1] quantized coefficients
|
||||||
|
* OUT shift # of bits to shift right to get approximated
|
||||||
|
* LP coefficients. NOTE: could be negative.
|
||||||
|
* RETURN 0 => quantization OK
|
||||||
|
* 1 => coefficients require too much shifting for *shift to
|
||||||
|
* fit in the LPC subframe header. 'shift' is unset.
|
||||||
|
* 2 => coefficients are all zero, which is bad. 'shift' is
|
||||||
|
* unset.
|
||||||
|
*/
|
||||||
|
int FLAC__lpc_quantize_coefficients(const FLAC__real lp_coeff[], unsigned order, unsigned precision, FLAC__int32 qlp_coeff[], int *shift);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* FLAC__lpc_compute_residual_from_qlp_coefficients()
|
||||||
|
* --------------------------------------------------------------------
|
||||||
|
* Compute the residual signal obtained from sutracting the predicted
|
||||||
|
* signal from the original.
|
||||||
|
*
|
||||||
|
* IN data[-order,data_len-1] original signal (NOTE THE INDICES!)
|
||||||
|
* IN data_len length of original signal
|
||||||
|
* IN qlp_coeff[0,order-1] quantized LP coefficients
|
||||||
|
* IN order > 0 LP order
|
||||||
|
* IN lp_quantization quantization of LP coefficients in bits
|
||||||
|
* OUT residual[0,data_len-1] residual signal
|
||||||
|
*/
|
||||||
|
void FLAC__lpc_compute_residual_from_qlp_coefficients(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]);
|
||||||
|
void FLAC__lpc_compute_residual_from_qlp_coefficients_wide(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]);
|
||||||
|
#ifndef FLAC__NO_ASM
|
||||||
|
# ifdef FLAC__CPU_IA32
|
||||||
|
# ifdef FLAC__HAS_NASM
|
||||||
|
void FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]);
|
||||||
|
void FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32_mmx(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]);
|
||||||
|
void FLAC__lpc_compute_residual_from_qlp_coefficients_wide_asm_ia32(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]);
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
# if (defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64) && FLAC__HAS_X86INTRIN
|
||||||
|
# ifdef FLAC__SSE2_SUPPORTED
|
||||||
|
void FLAC__lpc_compute_residual_from_qlp_coefficients_16_intrin_sse2(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]);
|
||||||
|
void FLAC__lpc_compute_residual_from_qlp_coefficients_intrin_sse2(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]);
|
||||||
|
# endif
|
||||||
|
# ifdef FLAC__SSE4_1_SUPPORTED
|
||||||
|
void FLAC__lpc_compute_residual_from_qlp_coefficients_intrin_sse41(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]);
|
||||||
|
void FLAC__lpc_compute_residual_from_qlp_coefficients_wide_intrin_sse41(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]);
|
||||||
|
# endif
|
||||||
|
# ifdef FLAC__AVX2_SUPPORTED
|
||||||
|
void FLAC__lpc_compute_residual_from_qlp_coefficients_16_intrin_avx2(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]);
|
||||||
|
void FLAC__lpc_compute_residual_from_qlp_coefficients_intrin_avx2(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]);
|
||||||
|
void FLAC__lpc_compute_residual_from_qlp_coefficients_wide_intrin_avx2(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]);
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* FLAC__lpc_restore_signal()
|
||||||
|
* --------------------------------------------------------------------
|
||||||
|
* Restore the original signal by summing the residual and the
|
||||||
|
* predictor.
|
||||||
|
*
|
||||||
|
* IN residual[0,data_len-1] residual signal
|
||||||
|
* IN data_len length of original signal
|
||||||
|
* IN qlp_coeff[0,order-1] quantized LP coefficients
|
||||||
|
* IN order > 0 LP order
|
||||||
|
* IN lp_quantization quantization of LP coefficients in bits
|
||||||
|
* *** IMPORTANT: the caller must pass in the historical samples:
|
||||||
|
* IN data[-order,-1] previously-reconstructed historical samples
|
||||||
|
* OUT data[0,data_len-1] original signal
|
||||||
|
*/
|
||||||
|
void FLAC__lpc_restore_signal(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]);
|
||||||
|
void FLAC__lpc_restore_signal_wide(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]);
|
||||||
|
#ifndef FLAC__NO_ASM
|
||||||
|
# ifdef FLAC__CPU_IA32
|
||||||
|
# ifdef FLAC__HAS_NASM
|
||||||
|
void FLAC__lpc_restore_signal_asm_ia32(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]);
|
||||||
|
void FLAC__lpc_restore_signal_asm_ia32_mmx(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]);
|
||||||
|
void FLAC__lpc_restore_signal_wide_asm_ia32(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]);
|
||||||
|
# endif /* FLAC__HAS_NASM */
|
||||||
|
# endif /* FLAC__CPU_IA32 */
|
||||||
|
# if (defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64) && FLAC__HAS_X86INTRIN
|
||||||
|
# ifdef FLAC__SSE2_SUPPORTED
|
||||||
|
void FLAC__lpc_restore_signal_16_intrin_sse2(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]);
|
||||||
|
# endif
|
||||||
|
# ifdef FLAC__SSE4_1_SUPPORTED
|
||||||
|
void FLAC__lpc_restore_signal_wide_intrin_sse41(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]);
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif /* FLAC__NO_ASM */
|
||||||
|
|
||||||
|
#ifndef FLAC__INTEGER_ONLY_LIBRARY
|
||||||
|
|
||||||
|
/*
|
||||||
|
* FLAC__lpc_compute_expected_bits_per_residual_sample()
|
||||||
|
* --------------------------------------------------------------------
|
||||||
|
* Compute the expected number of bits per residual signal sample
|
||||||
|
* based on the LP error (which is related to the residual variance).
|
||||||
|
*
|
||||||
|
* IN lpc_error >= 0.0 error returned from calculating LP coefficients
|
||||||
|
* IN total_samples > 0 # of samples in residual signal
|
||||||
|
* RETURN expected bits per sample
|
||||||
|
*/
|
||||||
|
double FLAC__lpc_compute_expected_bits_per_residual_sample(double lpc_error, unsigned total_samples);
|
||||||
|
double FLAC__lpc_compute_expected_bits_per_residual_sample_with_error_scale(double lpc_error, double error_scale);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* FLAC__lpc_compute_best_order()
|
||||||
|
* --------------------------------------------------------------------
|
||||||
|
* Compute the best order from the array of signal errors returned
|
||||||
|
* during coefficient computation.
|
||||||
|
*
|
||||||
|
* IN lpc_error[0,max_order-1] >= 0.0 error returned from calculating LP coefficients
|
||||||
|
* IN max_order > 0 max LP order
|
||||||
|
* IN total_samples > 0 # of samples in residual signal
|
||||||
|
* IN overhead_bits_per_order # of bits overhead for each increased LP order
|
||||||
|
* (includes warmup sample size and quantized LP coefficient)
|
||||||
|
* RETURN [1,max_order] best order
|
||||||
|
*/
|
||||||
|
unsigned FLAC__lpc_compute_best_order(const double lpc_error[], unsigned max_order, unsigned total_samples, unsigned overhead_bits_per_order);
|
||||||
|
|
||||||
|
#endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */
|
||||||
|
|
||||||
|
#endif
|
72
deps/libFLAC/include/private/macros.h
vendored
Normal file
72
deps/libFLAC/include/private/macros.h
vendored
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
/* libFLAC - Free Lossless Audio Codec library
|
||||||
|
* Copyright (C) 2012-2016 Xiph.org Foundation
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Xiph.org Foundation nor the names of its
|
||||||
|
* 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 FOUNDATION OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef FLAC__PRIVATE__MACROS_H
|
||||||
|
#define FLAC__PRIVATE__MACROS_H
|
||||||
|
|
||||||
|
#if defined(__GNUC__) && (__GNUC__ > 4 || ( __GNUC__ == 4 && __GNUC_MINOR__ >= 3))
|
||||||
|
|
||||||
|
#define flac_max(a,b) \
|
||||||
|
({ __typeof__ (a) _a = (a); \
|
||||||
|
__typeof__ (b) _b = (b); \
|
||||||
|
_a > _b ? _a : _b; })
|
||||||
|
|
||||||
|
#define MIN_PASTE(A,B) A##B
|
||||||
|
#define MIN_IMPL(A,B,L) ({ \
|
||||||
|
__typeof__(A) MIN_PASTE(__a,L) = (A); \
|
||||||
|
__typeof__(B) MIN_PASTE(__b,L) = (B); \
|
||||||
|
MIN_PASTE(__a,L) < MIN_PASTE(__b,L) ? MIN_PASTE(__a,L) : MIN_PASTE(__b,L); \
|
||||||
|
})
|
||||||
|
|
||||||
|
#define flac_min(A,B) MIN_IMPL(A,B,__COUNTER__)
|
||||||
|
|
||||||
|
/* Whatever other unix that has sys/param.h */
|
||||||
|
#elif defined(HAVE_SYS_PARAM_H)
|
||||||
|
#include <sys/param.h>
|
||||||
|
#define flac_max(a,b) MAX(a,b)
|
||||||
|
#define flac_min(a,b) MIN(a,b)
|
||||||
|
|
||||||
|
/* Windows VS has them in stdlib.h.. XXX:Untested */
|
||||||
|
#elif defined(_MSC_VER)
|
||||||
|
#include <stdlib.h>
|
||||||
|
#define flac_max(a,b) __max(a,b)
|
||||||
|
#define flac_min(a,b) __min(a,b)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MIN
|
||||||
|
#define MIN(x,y) ((x) <= (y) ? (x) : (y))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MAX
|
||||||
|
#define MAX(x,y) ((x) >= (y) ? (x) : (y))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
50
deps/libFLAC/include/private/md5.h
vendored
Normal file
50
deps/libFLAC/include/private/md5.h
vendored
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
#ifndef FLAC__PRIVATE__MD5_H
|
||||||
|
#define FLAC__PRIVATE__MD5_H
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is the header file for the MD5 message-digest algorithm.
|
||||||
|
* The algorithm is due to Ron Rivest. This code was
|
||||||
|
* written by Colin Plumb in 1993, no copyright is claimed.
|
||||||
|
* This code is in the public domain; do with it what you wish.
|
||||||
|
*
|
||||||
|
* Equivalent code is available from RSA Data Security, Inc.
|
||||||
|
* This code has been tested against that, and is equivalent,
|
||||||
|
* except that you don't need to include two pages of legalese
|
||||||
|
* with every copy.
|
||||||
|
*
|
||||||
|
* To compute the message digest of a chunk of bytes, declare an
|
||||||
|
* MD5Context structure, pass it to MD5Init, call MD5Update as
|
||||||
|
* needed on buffers full of bytes, and then call MD5Final, which
|
||||||
|
* will fill a supplied 16-byte array with the digest.
|
||||||
|
*
|
||||||
|
* Changed so as no longer to depend on Colin Plumb's `usual.h'
|
||||||
|
* header definitions; now uses stuff from dpkg's config.h
|
||||||
|
* - Ian Jackson <ijackson@nyx.cs.du.edu>.
|
||||||
|
* Still in the public domain.
|
||||||
|
*
|
||||||
|
* Josh Coalson: made some changes to integrate with libFLAC.
|
||||||
|
* Still in the public domain, with no warranty.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "FLAC/ordinals.h"
|
||||||
|
|
||||||
|
typedef union {
|
||||||
|
FLAC__byte *p8;
|
||||||
|
FLAC__int16 *p16;
|
||||||
|
FLAC__int32 *p32;
|
||||||
|
} FLAC__multibyte;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
FLAC__uint32 in[16];
|
||||||
|
FLAC__uint32 buf[4];
|
||||||
|
FLAC__uint32 bytes[2];
|
||||||
|
FLAC__multibyte internal_buf;
|
||||||
|
size_t capacity;
|
||||||
|
} FLAC__MD5Context;
|
||||||
|
|
||||||
|
void FLAC__MD5Init(FLAC__MD5Context *context);
|
||||||
|
void FLAC__MD5Final(FLAC__byte digest[16], FLAC__MD5Context *context);
|
||||||
|
|
||||||
|
FLAC__bool FLAC__MD5Accumulate(FLAC__MD5Context *ctx, const FLAC__int32 * const signal[], unsigned channels, unsigned samples, unsigned bytes_per_sample);
|
||||||
|
|
||||||
|
#endif
|
58
deps/libFLAC/include/private/memory.h
vendored
Normal file
58
deps/libFLAC/include/private/memory.h
vendored
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
/* libFLAC - Free Lossless Audio Codec library
|
||||||
|
* Copyright (C) 2001-2009 Josh Coalson
|
||||||
|
* Copyright (C) 2011-2016 Xiph.Org Foundation
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Xiph.org Foundation nor the names of its
|
||||||
|
* 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 FOUNDATION OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef FLAC__PRIVATE__MEMORY_H
|
||||||
|
#define FLAC__PRIVATE__MEMORY_H
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdlib.h> /* for size_t */
|
||||||
|
|
||||||
|
#include "private/float.h"
|
||||||
|
#include "FLAC/ordinals.h" /* for FLAC__bool */
|
||||||
|
|
||||||
|
/* Returns the unaligned address returned by malloc.
|
||||||
|
* Use free() on this address to deallocate.
|
||||||
|
*/
|
||||||
|
void *FLAC__memory_alloc_aligned(size_t bytes, void **aligned_address);
|
||||||
|
FLAC__bool FLAC__memory_alloc_aligned_int32_array(size_t elements, FLAC__int32 **unaligned_pointer, FLAC__int32 **aligned_pointer);
|
||||||
|
FLAC__bool FLAC__memory_alloc_aligned_uint32_array(size_t elements, FLAC__uint32 **unaligned_pointer, FLAC__uint32 **aligned_pointer);
|
||||||
|
FLAC__bool FLAC__memory_alloc_aligned_uint64_array(size_t elements, FLAC__uint64 **unaligned_pointer, FLAC__uint64 **aligned_pointer);
|
||||||
|
FLAC__bool FLAC__memory_alloc_aligned_unsigned_array(size_t elements, unsigned **unaligned_pointer, unsigned **aligned_pointer);
|
||||||
|
#ifndef FLAC__INTEGER_ONLY_LIBRARY
|
||||||
|
FLAC__bool FLAC__memory_alloc_aligned_real_array(size_t elements, FLAC__real **unaligned_pointer, FLAC__real **aligned_pointer);
|
||||||
|
#endif
|
||||||
|
void *safe_malloc_mul_2op_p(size_t size1, size_t size2);
|
||||||
|
|
||||||
|
#endif
|
60
deps/libFLAC/include/protected/stream_decoder.h
vendored
Normal file
60
deps/libFLAC/include/protected/stream_decoder.h
vendored
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
/* libFLAC - Free Lossless Audio Codec library
|
||||||
|
* Copyright (C) 2000-2009 Josh Coalson
|
||||||
|
* Copyright (C) 2011-2016 Xiph.Org Foundation
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Xiph.org Foundation nor the names of its
|
||||||
|
* 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 FOUNDATION OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef FLAC__PROTECTED__STREAM_DECODER_H
|
||||||
|
#define FLAC__PROTECTED__STREAM_DECODER_H
|
||||||
|
|
||||||
|
#include "FLAC/stream_decoder.h"
|
||||||
|
#if FLAC__HAS_OGG
|
||||||
|
#include "private/ogg_decoder_aspect.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct FLAC__StreamDecoderProtected {
|
||||||
|
FLAC__StreamDecoderState state;
|
||||||
|
FLAC__StreamDecoderInitStatus initstate;
|
||||||
|
unsigned channels;
|
||||||
|
FLAC__ChannelAssignment channel_assignment;
|
||||||
|
unsigned bits_per_sample;
|
||||||
|
unsigned sample_rate; /* in Hz */
|
||||||
|
unsigned blocksize; /* in samples (per channel) */
|
||||||
|
FLAC__bool md5_checking; /* if true, generate MD5 signature of decoded data and compare against signature in the STREAMINFO metadata block */
|
||||||
|
#if FLAC__HAS_OGG
|
||||||
|
FLAC__OggDecoderAspect ogg_decoder_aspect;
|
||||||
|
#endif
|
||||||
|
} FLAC__StreamDecoderProtected;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* return the number of input bytes consumed
|
||||||
|
*/
|
||||||
|
unsigned FLAC__stream_decoder_get_input_bytes_unconsumed(const FLAC__StreamDecoder *decoder);
|
||||||
|
|
||||||
|
#endif
|
219
deps/libFLAC/include/share/alloc.h
vendored
Normal file
219
deps/libFLAC/include/share/alloc.h
vendored
Normal file
@ -0,0 +1,219 @@
|
|||||||
|
/* alloc - Convenience routines for safely allocating memory
|
||||||
|
* Copyright (C) 2007-2009 Josh Coalson
|
||||||
|
* Copyright (C) 2011-2016 Xiph.Org Foundation
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Xiph.org Foundation nor the names of its
|
||||||
|
* 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 FOUNDATION OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef FLAC__SHARE__ALLOC_H
|
||||||
|
#define FLAC__SHARE__ALLOC_H
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* WATCHOUT: for c++ you may have to #define __STDC_LIMIT_MACROS 1 real early
|
||||||
|
* before #including this file, otherwise SIZE_MAX might not be defined
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <limits.h> /* for SIZE_MAX */
|
||||||
|
#if HAVE_STDINT_H
|
||||||
|
#include <stdint.h> /* for SIZE_MAX in case limits.h didn't get it */
|
||||||
|
#endif
|
||||||
|
#include <stdlib.h> /* for size_t, malloc(), etc */
|
||||||
|
#include "share/compat.h"
|
||||||
|
|
||||||
|
#ifndef SIZE_MAX
|
||||||
|
# ifndef SIZE_T_MAX
|
||||||
|
# ifdef _MSC_VER
|
||||||
|
# ifdef _WIN64
|
||||||
|
# define SIZE_T_MAX FLAC__U64L(0xffffffffffffffff)
|
||||||
|
# else
|
||||||
|
# define SIZE_T_MAX 0xffffffff
|
||||||
|
# endif
|
||||||
|
# else
|
||||||
|
# error
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
# define SIZE_MAX SIZE_T_MAX
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* avoid malloc()ing 0 bytes, see:
|
||||||
|
* https://www.securecoding.cert.org/confluence/display/seccode/MEM04-A.+Do+not+make+assumptions+about+the+result+of+allocating+0+bytes?focusedCommentId=5407003
|
||||||
|
*/
|
||||||
|
static inline void *safe_malloc_(size_t size)
|
||||||
|
{
|
||||||
|
/* malloc(0) is undefined; FLAC src convention is to always allocate */
|
||||||
|
if(!size)
|
||||||
|
size++;
|
||||||
|
return malloc(size);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void *safe_calloc_(size_t nmemb, size_t size)
|
||||||
|
{
|
||||||
|
if(!nmemb || !size)
|
||||||
|
return malloc(1); /* malloc(0) is undefined; FLAC src convention is to always allocate */
|
||||||
|
return calloc(nmemb, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*@@@@ there's probably a better way to prevent overflows when allocating untrusted sums but this works for now */
|
||||||
|
|
||||||
|
static inline void *safe_malloc_add_2op_(size_t size1, size_t size2)
|
||||||
|
{
|
||||||
|
size2 += size1;
|
||||||
|
if(size2 < size1)
|
||||||
|
return 0;
|
||||||
|
return safe_malloc_(size2);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void *safe_malloc_add_3op_(size_t size1, size_t size2, size_t size3)
|
||||||
|
{
|
||||||
|
size2 += size1;
|
||||||
|
if(size2 < size1)
|
||||||
|
return 0;
|
||||||
|
size3 += size2;
|
||||||
|
if(size3 < size2)
|
||||||
|
return 0;
|
||||||
|
return safe_malloc_(size3);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void *safe_malloc_add_4op_(size_t size1, size_t size2, size_t size3, size_t size4)
|
||||||
|
{
|
||||||
|
size2 += size1;
|
||||||
|
if(size2 < size1)
|
||||||
|
return 0;
|
||||||
|
size3 += size2;
|
||||||
|
if(size3 < size2)
|
||||||
|
return 0;
|
||||||
|
size4 += size3;
|
||||||
|
if(size4 < size3)
|
||||||
|
return 0;
|
||||||
|
return safe_malloc_(size4);
|
||||||
|
}
|
||||||
|
|
||||||
|
void *safe_malloc_mul_2op_(size_t size1, size_t size2) ;
|
||||||
|
|
||||||
|
static inline void *safe_malloc_mul_3op_(size_t size1, size_t size2, size_t size3)
|
||||||
|
{
|
||||||
|
if(!size1 || !size2 || !size3)
|
||||||
|
return malloc(1); /* malloc(0) is undefined; FLAC src convention is to always allocate */
|
||||||
|
if(size1 > SIZE_MAX / size2)
|
||||||
|
return 0;
|
||||||
|
size1 *= size2;
|
||||||
|
if(size1 > SIZE_MAX / size3)
|
||||||
|
return 0;
|
||||||
|
return malloc(size1*size3);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* size1*size2 + size3 */
|
||||||
|
static inline void *safe_malloc_mul2add_(size_t size1, size_t size2, size_t size3)
|
||||||
|
{
|
||||||
|
if(!size1 || !size2)
|
||||||
|
return safe_malloc_(size3);
|
||||||
|
if(size1 > SIZE_MAX / size2)
|
||||||
|
return 0;
|
||||||
|
return safe_malloc_add_2op_(size1*size2, size3);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* size1 * (size2 + size3) */
|
||||||
|
static inline void *safe_malloc_muladd2_(size_t size1, size_t size2, size_t size3)
|
||||||
|
{
|
||||||
|
if(!size1 || (!size2 && !size3))
|
||||||
|
return malloc(1); /* malloc(0) is undefined; FLAC src convention is to always allocate */
|
||||||
|
size2 += size3;
|
||||||
|
if(size2 < size3)
|
||||||
|
return 0;
|
||||||
|
if(size1 > SIZE_MAX / size2)
|
||||||
|
return 0;
|
||||||
|
return malloc(size1*size2);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void *safe_realloc_(void *ptr, size_t size)
|
||||||
|
{
|
||||||
|
void *oldptr = ptr;
|
||||||
|
void *newptr = realloc(ptr, size);
|
||||||
|
if(size > 0 && newptr == 0)
|
||||||
|
free(oldptr);
|
||||||
|
return newptr;
|
||||||
|
}
|
||||||
|
static inline void *safe_realloc_add_2op_(void *ptr, size_t size1, size_t size2)
|
||||||
|
{
|
||||||
|
size2 += size1;
|
||||||
|
if(size2 < size1) {
|
||||||
|
free(ptr);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return realloc(ptr, size2);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void *safe_realloc_add_3op_(void *ptr, size_t size1, size_t size2, size_t size3)
|
||||||
|
{
|
||||||
|
size2 += size1;
|
||||||
|
if(size2 < size1)
|
||||||
|
return 0;
|
||||||
|
size3 += size2;
|
||||||
|
if(size3 < size2)
|
||||||
|
return 0;
|
||||||
|
return realloc(ptr, size3);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void *safe_realloc_add_4op_(void *ptr, size_t size1, size_t size2, size_t size3, size_t size4)
|
||||||
|
{
|
||||||
|
size2 += size1;
|
||||||
|
if(size2 < size1)
|
||||||
|
return 0;
|
||||||
|
size3 += size2;
|
||||||
|
if(size3 < size2)
|
||||||
|
return 0;
|
||||||
|
size4 += size3;
|
||||||
|
if(size4 < size3)
|
||||||
|
return 0;
|
||||||
|
return realloc(ptr, size4);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void *safe_realloc_mul_2op_(void *ptr, size_t size1, size_t size2)
|
||||||
|
{
|
||||||
|
if(!size1 || !size2)
|
||||||
|
return realloc(ptr, 0); /* preserve POSIX realloc(ptr, 0) semantics */
|
||||||
|
if(size1 > SIZE_MAX / size2)
|
||||||
|
return 0;
|
||||||
|
return safe_realloc_(ptr, size1*size2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* size1 * (size2 + size3) */
|
||||||
|
static inline void *safe_realloc_muladd2_(void *ptr, size_t size1, size_t size2, size_t size3)
|
||||||
|
{
|
||||||
|
if(!size1 || (!size2 && !size3))
|
||||||
|
return realloc(ptr, 0); /* preserve POSIX realloc(ptr, 0) semantics */
|
||||||
|
size2 += size3;
|
||||||
|
if(size2 < size3)
|
||||||
|
return 0;
|
||||||
|
return safe_realloc_mul_2op_(ptr, size1, size2);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
209
deps/libFLAC/include/share/compat.h
vendored
Normal file
209
deps/libFLAC/include/share/compat.h
vendored
Normal file
@ -0,0 +1,209 @@
|
|||||||
|
/* libFLAC - Free Lossless Audio Codec library
|
||||||
|
* Copyright (C) 2012-2016 Xiph.org Foundation
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Xiph.org Foundation nor the names of its
|
||||||
|
* 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 FOUNDATION OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* This is the prefered location of all CPP hackery to make $random_compiler
|
||||||
|
* work like something approaching a C99 (or maybe more accurately GNU99)
|
||||||
|
* compiler.
|
||||||
|
*
|
||||||
|
* It is assumed that this header will be included after "config.h".
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef FLAC__SHARE__COMPAT_H
|
||||||
|
#define FLAC__SHARE__COMPAT_H
|
||||||
|
|
||||||
|
#if defined _WIN32 && !defined __CYGWIN__
|
||||||
|
/* where MSVC puts unlink() */
|
||||||
|
# include <io.h>
|
||||||
|
#else
|
||||||
|
# include <unistd.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined _MSC_VER || defined __BORLANDC__ || defined __MINGW32__
|
||||||
|
#include <sys/types.h> /* for off_t */
|
||||||
|
#define FLAC__off_t __int64 /* use this instead of off_t to fix the 2 GB limit */
|
||||||
|
#if !defined __MINGW32__
|
||||||
|
#define fseeko _fseeki64
|
||||||
|
#define ftello _ftelli64
|
||||||
|
#else /* MinGW */
|
||||||
|
#if !defined(HAVE_FSEEKO)
|
||||||
|
#define fseeko fseeko64
|
||||||
|
#define ftello ftello64
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#define FLAC__off_t off_t
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if HAVE_INTTYPES_H
|
||||||
|
#define __STDC_FORMAT_MACROS
|
||||||
|
#include <inttypes.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(_MSC_VER)
|
||||||
|
#define strtoll _strtoi64
|
||||||
|
#define strtoull _strtoui64
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(_MSC_VER)
|
||||||
|
#define inline __inline
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined __INTEL_COMPILER || (defined _MSC_VER && defined _WIN64)
|
||||||
|
/* MSVS generates VERY slow 32-bit code with __restrict */
|
||||||
|
#define flac_restrict __restrict
|
||||||
|
#elif defined __GNUC__
|
||||||
|
#define flac_restrict __restrict__
|
||||||
|
#else
|
||||||
|
#define flac_restrict
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define FLAC__U64L(x) x##ULL
|
||||||
|
|
||||||
|
#if defined _MSC_VER || defined __MINGW32__
|
||||||
|
#define FLAC__STRCASECMP _stricmp
|
||||||
|
#define FLAC__STRNCASECMP _strnicmp
|
||||||
|
#elif defined __BORLANDC__
|
||||||
|
#define FLAC__STRCASECMP stricmp
|
||||||
|
#define FLAC__STRNCASECMP strnicmp
|
||||||
|
#else
|
||||||
|
#define FLAC__STRCASECMP strcasecmp
|
||||||
|
#define FLAC__STRNCASECMP strncasecmp
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined _MSC_VER || defined __MINGW32__ || defined __CYGWIN__ || defined __EMX__
|
||||||
|
#include <io.h> /* for _setmode(), chmod() */
|
||||||
|
#include <fcntl.h> /* for _O_BINARY */
|
||||||
|
#else
|
||||||
|
#include <unistd.h> /* for chown(), unlink() */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined _MSC_VER || defined __BORLANDC__ || defined __MINGW32__
|
||||||
|
#if defined __BORLANDC__
|
||||||
|
#include <utime.h> /* for utime() */
|
||||||
|
#else
|
||||||
|
#include <sys/utime.h> /* for utime() */
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#include <sys/types.h> /* some flavors of BSD (like OS X) require this to get time_t */
|
||||||
|
#include <utime.h> /* for utime() */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined _MSC_VER
|
||||||
|
# if _MSC_VER >= 1800
|
||||||
|
# include <inttypes.h>
|
||||||
|
# elif _MSC_VER >= 1600
|
||||||
|
/* Visual Studio 2010 has decent C99 support */
|
||||||
|
# include <stdint.h>
|
||||||
|
# define PRIu64 "llu"
|
||||||
|
# define PRId64 "lld"
|
||||||
|
# define PRIx64 "llx"
|
||||||
|
# else
|
||||||
|
# include <limits.h>
|
||||||
|
# ifndef UINT32_MAX
|
||||||
|
# define UINT32_MAX _UI32_MAX
|
||||||
|
# endif
|
||||||
|
typedef unsigned __int64 uint64_t;
|
||||||
|
typedef unsigned __int32 uint32_t;
|
||||||
|
typedef unsigned __int16 uint16_t;
|
||||||
|
typedef unsigned __int8 uint8_t;
|
||||||
|
typedef __int64 int64_t;
|
||||||
|
typedef __int32 int32_t;
|
||||||
|
typedef __int16 int16_t;
|
||||||
|
typedef __int8 int8_t;
|
||||||
|
# define PRIu64 "I64u"
|
||||||
|
# define PRId64 "I64d"
|
||||||
|
# define PRIx64 "I64x"
|
||||||
|
# endif
|
||||||
|
#endif /* defined _MSC_VER */
|
||||||
|
|
||||||
|
#if defined(_WIN32) && defined(NEED_UTF8_SUPPORT)
|
||||||
|
/* All char* strings are in UTF-8 format. Added to support Unicode files on Windows */
|
||||||
|
|
||||||
|
#include "share/win_utf8_io.h"
|
||||||
|
#define flac_printf printf_utf8
|
||||||
|
#define flac_fprintf fprintf_utf8
|
||||||
|
#define flac_vfprintf vfprintf_utf8
|
||||||
|
|
||||||
|
#include "share/windows_unicode_filenames.h"
|
||||||
|
#define flac_fopen flac_internal_fopen_utf8
|
||||||
|
#define flac_chmod flac_internal_chmod_utf8
|
||||||
|
#define flac_utime flac_internal_utime_utf8
|
||||||
|
#define flac_unlink flac_internal_unlink_utf8
|
||||||
|
#define flac_rename flac_internal_rename_utf8
|
||||||
|
#define flac_stat flac_internal_stat64_utf8
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#define flac_printf printf
|
||||||
|
#define flac_fprintf fprintf
|
||||||
|
#define flac_vfprintf vfprintf
|
||||||
|
|
||||||
|
#define flac_fopen fopen
|
||||||
|
#define flac_chmod chmod
|
||||||
|
#define flac_utime utime
|
||||||
|
#define flac_unlink unlink
|
||||||
|
#define flac_rename rename
|
||||||
|
#define flac_stat stat
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined _MSC_VER
|
||||||
|
#define flac_stat_s __stat64 /* stat struct */
|
||||||
|
#define flac_fstat _fstat64
|
||||||
|
#else
|
||||||
|
#define flac_stat_s stat /* stat struct */
|
||||||
|
#define flac_fstat fstat
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef M_LN2
|
||||||
|
#define M_LN2 0.69314718055994530942
|
||||||
|
#endif
|
||||||
|
#ifndef M_PI
|
||||||
|
#define M_PI 3.14159265358979323846
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* FLAC needs to compile and work correctly on systems with a normal ISO C99
|
||||||
|
* snprintf as well as Microsoft Visual Studio which has an non-standards
|
||||||
|
* conformant snprint_s function.
|
||||||
|
*
|
||||||
|
* This function wraps the MS version to behave more like the ISO version.
|
||||||
|
*/
|
||||||
|
#include <stdarg.h>
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
int flac_snprintf(char *str, size_t size, const char *fmt, ...);
|
||||||
|
int flac_vsnprintf(char *str, size_t size, const char *fmt, va_list va);
|
||||||
|
#ifdef __cplusplus
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* FLAC__SHARE__COMPAT_H */
|
84
deps/libFLAC/include/share/endswap.h
vendored
Normal file
84
deps/libFLAC/include/share/endswap.h
vendored
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
/* libFLAC - Free Lossless Audio Codec library
|
||||||
|
* Copyright (C) 2012-2016 Xiph.org Foundation
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Xiph.org Foundation nor the names of its
|
||||||
|
* 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 FOUNDATION OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* It is assumed that this header will be included after "config.h". */
|
||||||
|
|
||||||
|
#if HAVE_BSWAP32 /* GCC and Clang */
|
||||||
|
|
||||||
|
/* GCC prior to 4.8 didn't provide bswap16 on x86_64 */
|
||||||
|
#if ! HAVE_BSWAP16
|
||||||
|
static inline unsigned short __builtin_bswap16(unsigned short a)
|
||||||
|
{
|
||||||
|
return (a<<8)|(a>>8);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define ENDSWAP_16(x) (__builtin_bswap16 (x))
|
||||||
|
#define ENDSWAP_32(x) (__builtin_bswap32 (x))
|
||||||
|
#define ENDSWAP_64(x) (__builtin_bswap64 (x))
|
||||||
|
|
||||||
|
#elif defined _MSC_VER /* Windows */
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#define ENDSWAP_16(x) (_byteswap_ushort (x))
|
||||||
|
#define ENDSWAP_32(x) (_byteswap_ulong (x))
|
||||||
|
#define ENDSWAP_64(x) (_byteswap_uint64 (x))
|
||||||
|
|
||||||
|
#elif defined HAVE_BYTESWAP_H /* Linux */
|
||||||
|
|
||||||
|
#include <byteswap.h>
|
||||||
|
|
||||||
|
#define ENDSWAP_16(x) (bswap_16 (x))
|
||||||
|
#define ENDSWAP_32(x) (bswap_32 (x))
|
||||||
|
#define ENDSWAP_64(x) (bswap_64 (x))
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#define ENDSWAP_16(x) ((((x) >> 8) & 0xFF) | (((x) & 0xFF) << 8))
|
||||||
|
#define ENDSWAP_32(x) ((((x) >> 24) & 0xFF) | (((x) >> 8) & 0xFF00) | (((x) & 0xFF00) << 8) | (((x) & 0xFF) << 24))
|
||||||
|
#define ENDSWAP_64(x) ((ENDSWAP_32(((x) >> 32) & 0xFFFFFFFF)) | (ENDSWAP_32((x) & 0xFFFFFFFF) << 32))
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Host to little-endian byte swapping (for MD5 calculation) */
|
||||||
|
#if CPU_IS_BIG_ENDIAN
|
||||||
|
|
||||||
|
#define H2LE_16(x) ENDSWAP_16 (x)
|
||||||
|
#define H2LE_32(x) ENDSWAP_32 (x)
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#define H2LE_16(x) (x)
|
||||||
|
#define H2LE_32(x) (x)
|
||||||
|
|
||||||
|
#endif
|
1357
deps/libFLAC/lpc.c
vendored
Normal file
1357
deps/libFLAC/lpc.c
vendored
Normal file
File diff suppressed because it is too large
Load Diff
1122
deps/libFLAC/lpc_intrin_avx2.c
vendored
Normal file
1122
deps/libFLAC/lpc_intrin_avx2.c
vendored
Normal file
File diff suppressed because it is too large
Load Diff
454
deps/libFLAC/lpc_intrin_sse.c
vendored
Normal file
454
deps/libFLAC/lpc_intrin_sse.c
vendored
Normal file
@ -0,0 +1,454 @@
|
|||||||
|
/* libFLAC - Free Lossless Audio Codec library
|
||||||
|
* Copyright (C) 2000-2009 Josh Coalson
|
||||||
|
* Copyright (C) 2011-2016 Xiph.Org Foundation
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Xiph.org Foundation nor the names of its
|
||||||
|
* 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 FOUNDATION OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "private/cpu.h"
|
||||||
|
|
||||||
|
#ifndef FLAC__INTEGER_ONLY_LIBRARY
|
||||||
|
#ifndef FLAC__NO_ASM
|
||||||
|
#if (defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64) && FLAC__HAS_X86INTRIN
|
||||||
|
#include "private/lpc.h"
|
||||||
|
#ifdef FLAC__SSE_SUPPORTED
|
||||||
|
#include "FLAC/assert.h"
|
||||||
|
#include "FLAC/format.h"
|
||||||
|
|
||||||
|
#include <xmmintrin.h> /* SSE */
|
||||||
|
|
||||||
|
/* new routines: more unaligned loads, less shuffle
|
||||||
|
* old routines: less unaligned loads, more shuffle
|
||||||
|
* these *_old routines are equivalent to the ASM routines in ia32/lpc_asm.nasm
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* new routines: faster on current Intel (starting from Core i aka Nehalem) and all AMD CPUs */
|
||||||
|
|
||||||
|
FLAC__SSE_TARGET("sse")
|
||||||
|
void FLAC__lpc_compute_autocorrelation_intrin_sse_lag_4_new(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[])
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int limit = data_len - 4;
|
||||||
|
__m128 sum0;
|
||||||
|
|
||||||
|
(void) lag;
|
||||||
|
FLAC__ASSERT(lag <= 4);
|
||||||
|
FLAC__ASSERT(lag <= data_len);
|
||||||
|
|
||||||
|
sum0 = _mm_setzero_ps();
|
||||||
|
|
||||||
|
for(i = 0; i <= limit; i++) {
|
||||||
|
__m128 d, d0;
|
||||||
|
d0 = _mm_loadu_ps(data+i);
|
||||||
|
d = d0; d = _mm_shuffle_ps(d, d, 0);
|
||||||
|
sum0 = _mm_add_ps(sum0, _mm_mul_ps(d0, d));
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
__m128 d0 = _mm_setzero_ps();
|
||||||
|
limit++; if(limit < 0) limit = 0;
|
||||||
|
|
||||||
|
for(i = data_len-1; i >= limit; i--) {
|
||||||
|
__m128 d;
|
||||||
|
d = _mm_load_ss(data+i); d = _mm_shuffle_ps(d, d, 0);
|
||||||
|
d0 = _mm_shuffle_ps(d0, d0, _MM_SHUFFLE(2,1,0,3));
|
||||||
|
d0 = _mm_move_ss(d0, d);
|
||||||
|
sum0 = _mm_add_ps(sum0, _mm_mul_ps(d, d0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_mm_storeu_ps(autoc, sum0);
|
||||||
|
}
|
||||||
|
|
||||||
|
FLAC__SSE_TARGET("sse")
|
||||||
|
void FLAC__lpc_compute_autocorrelation_intrin_sse_lag_8_new(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[])
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int limit = data_len - 8;
|
||||||
|
__m128 sum0, sum1;
|
||||||
|
|
||||||
|
(void) lag;
|
||||||
|
FLAC__ASSERT(lag <= 8);
|
||||||
|
FLAC__ASSERT(lag <= data_len);
|
||||||
|
|
||||||
|
sum0 = _mm_setzero_ps();
|
||||||
|
sum1 = _mm_setzero_ps();
|
||||||
|
|
||||||
|
for(i = 0; i <= limit; i++) {
|
||||||
|
__m128 d, d0, d1;
|
||||||
|
d0 = _mm_loadu_ps(data+i);
|
||||||
|
d1 = _mm_loadu_ps(data+i+4);
|
||||||
|
d = d0; d = _mm_shuffle_ps(d, d, 0);
|
||||||
|
sum0 = _mm_add_ps(sum0, _mm_mul_ps(d0, d));
|
||||||
|
sum1 = _mm_add_ps(sum1, _mm_mul_ps(d1, d));
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
__m128 d0 = _mm_setzero_ps();
|
||||||
|
__m128 d1 = _mm_setzero_ps();
|
||||||
|
limit++; if(limit < 0) limit = 0;
|
||||||
|
|
||||||
|
for(i = data_len-1; i >= limit; i--) {
|
||||||
|
__m128 d;
|
||||||
|
d = _mm_load_ss(data+i); d = _mm_shuffle_ps(d, d, 0);
|
||||||
|
d1 = _mm_shuffle_ps(d1, d1, _MM_SHUFFLE(2,1,0,3));
|
||||||
|
d0 = _mm_shuffle_ps(d0, d0, _MM_SHUFFLE(2,1,0,3));
|
||||||
|
d1 = _mm_move_ss(d1, d0);
|
||||||
|
d0 = _mm_move_ss(d0, d);
|
||||||
|
sum1 = _mm_add_ps(sum1, _mm_mul_ps(d, d1));
|
||||||
|
sum0 = _mm_add_ps(sum0, _mm_mul_ps(d, d0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_mm_storeu_ps(autoc, sum0);
|
||||||
|
_mm_storeu_ps(autoc+4, sum1);
|
||||||
|
}
|
||||||
|
|
||||||
|
FLAC__SSE_TARGET("sse")
|
||||||
|
void FLAC__lpc_compute_autocorrelation_intrin_sse_lag_12_new(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[])
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int limit = data_len - 12;
|
||||||
|
__m128 sum0, sum1, sum2;
|
||||||
|
|
||||||
|
(void) lag;
|
||||||
|
FLAC__ASSERT(lag <= 12);
|
||||||
|
FLAC__ASSERT(lag <= data_len);
|
||||||
|
|
||||||
|
sum0 = _mm_setzero_ps();
|
||||||
|
sum1 = _mm_setzero_ps();
|
||||||
|
sum2 = _mm_setzero_ps();
|
||||||
|
|
||||||
|
for(i = 0; i <= limit; i++) {
|
||||||
|
__m128 d, d0, d1, d2;
|
||||||
|
d0 = _mm_loadu_ps(data+i);
|
||||||
|
d1 = _mm_loadu_ps(data+i+4);
|
||||||
|
d2 = _mm_loadu_ps(data+i+8);
|
||||||
|
d = d0; d = _mm_shuffle_ps(d, d, 0);
|
||||||
|
sum0 = _mm_add_ps(sum0, _mm_mul_ps(d0, d));
|
||||||
|
sum1 = _mm_add_ps(sum1, _mm_mul_ps(d1, d));
|
||||||
|
sum2 = _mm_add_ps(sum2, _mm_mul_ps(d2, d));
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
__m128 d0 = _mm_setzero_ps();
|
||||||
|
__m128 d1 = _mm_setzero_ps();
|
||||||
|
__m128 d2 = _mm_setzero_ps();
|
||||||
|
limit++; if(limit < 0) limit = 0;
|
||||||
|
|
||||||
|
for(i = data_len-1; i >= limit; i--) {
|
||||||
|
__m128 d;
|
||||||
|
d = _mm_load_ss(data+i); d = _mm_shuffle_ps(d, d, 0);
|
||||||
|
d2 = _mm_shuffle_ps(d2, d2, _MM_SHUFFLE(2,1,0,3));
|
||||||
|
d1 = _mm_shuffle_ps(d1, d1, _MM_SHUFFLE(2,1,0,3));
|
||||||
|
d0 = _mm_shuffle_ps(d0, d0, _MM_SHUFFLE(2,1,0,3));
|
||||||
|
d2 = _mm_move_ss(d2, d1);
|
||||||
|
d1 = _mm_move_ss(d1, d0);
|
||||||
|
d0 = _mm_move_ss(d0, d);
|
||||||
|
sum2 = _mm_add_ps(sum2, _mm_mul_ps(d, d2));
|
||||||
|
sum1 = _mm_add_ps(sum1, _mm_mul_ps(d, d1));
|
||||||
|
sum0 = _mm_add_ps(sum0, _mm_mul_ps(d, d0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_mm_storeu_ps(autoc, sum0);
|
||||||
|
_mm_storeu_ps(autoc+4, sum1);
|
||||||
|
_mm_storeu_ps(autoc+8, sum2);
|
||||||
|
}
|
||||||
|
|
||||||
|
FLAC__SSE_TARGET("sse")
|
||||||
|
void FLAC__lpc_compute_autocorrelation_intrin_sse_lag_16_new(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[])
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int limit = data_len - 16;
|
||||||
|
__m128 sum0, sum1, sum2, sum3;
|
||||||
|
|
||||||
|
(void) lag;
|
||||||
|
FLAC__ASSERT(lag <= 16);
|
||||||
|
FLAC__ASSERT(lag <= data_len);
|
||||||
|
|
||||||
|
sum0 = _mm_setzero_ps();
|
||||||
|
sum1 = _mm_setzero_ps();
|
||||||
|
sum2 = _mm_setzero_ps();
|
||||||
|
sum3 = _mm_setzero_ps();
|
||||||
|
|
||||||
|
for(i = 0; i <= limit; i++) {
|
||||||
|
__m128 d, d0, d1, d2, d3;
|
||||||
|
d0 = _mm_loadu_ps(data+i);
|
||||||
|
d1 = _mm_loadu_ps(data+i+4);
|
||||||
|
d2 = _mm_loadu_ps(data+i+8);
|
||||||
|
d3 = _mm_loadu_ps(data+i+12);
|
||||||
|
d = d0; d = _mm_shuffle_ps(d, d, 0);
|
||||||
|
sum0 = _mm_add_ps(sum0, _mm_mul_ps(d0, d));
|
||||||
|
sum1 = _mm_add_ps(sum1, _mm_mul_ps(d1, d));
|
||||||
|
sum2 = _mm_add_ps(sum2, _mm_mul_ps(d2, d));
|
||||||
|
sum3 = _mm_add_ps(sum3, _mm_mul_ps(d3, d));
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
__m128 d0 = _mm_setzero_ps();
|
||||||
|
__m128 d1 = _mm_setzero_ps();
|
||||||
|
__m128 d2 = _mm_setzero_ps();
|
||||||
|
__m128 d3 = _mm_setzero_ps();
|
||||||
|
limit++; if(limit < 0) limit = 0;
|
||||||
|
|
||||||
|
for(i = data_len-1; i >= limit; i--) {
|
||||||
|
__m128 d;
|
||||||
|
d = _mm_load_ss(data+i); d = _mm_shuffle_ps(d, d, 0);
|
||||||
|
d3 = _mm_shuffle_ps(d3, d3, _MM_SHUFFLE(2,1,0,3));
|
||||||
|
d2 = _mm_shuffle_ps(d2, d2, _MM_SHUFFLE(2,1,0,3));
|
||||||
|
d1 = _mm_shuffle_ps(d1, d1, _MM_SHUFFLE(2,1,0,3));
|
||||||
|
d0 = _mm_shuffle_ps(d0, d0, _MM_SHUFFLE(2,1,0,3));
|
||||||
|
d3 = _mm_move_ss(d3, d2);
|
||||||
|
d2 = _mm_move_ss(d2, d1);
|
||||||
|
d1 = _mm_move_ss(d1, d0);
|
||||||
|
d0 = _mm_move_ss(d0, d);
|
||||||
|
sum3 = _mm_add_ps(sum3, _mm_mul_ps(d, d3));
|
||||||
|
sum2 = _mm_add_ps(sum2, _mm_mul_ps(d, d2));
|
||||||
|
sum1 = _mm_add_ps(sum1, _mm_mul_ps(d, d1));
|
||||||
|
sum0 = _mm_add_ps(sum0, _mm_mul_ps(d, d0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_mm_storeu_ps(autoc, sum0);
|
||||||
|
_mm_storeu_ps(autoc+4, sum1);
|
||||||
|
_mm_storeu_ps(autoc+8, sum2);
|
||||||
|
_mm_storeu_ps(autoc+12,sum3);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* old routines: faster on older Intel CPUs (up to Core 2) */
|
||||||
|
|
||||||
|
FLAC__SSE_TARGET("sse")
|
||||||
|
void FLAC__lpc_compute_autocorrelation_intrin_sse_lag_4_old(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[])
|
||||||
|
{
|
||||||
|
__m128 xmm0, xmm2, xmm5;
|
||||||
|
|
||||||
|
(void) lag;
|
||||||
|
FLAC__ASSERT(lag > 0);
|
||||||
|
FLAC__ASSERT(lag <= 4);
|
||||||
|
FLAC__ASSERT(lag <= data_len);
|
||||||
|
FLAC__ASSERT(data_len > 0);
|
||||||
|
|
||||||
|
xmm5 = _mm_setzero_ps();
|
||||||
|
|
||||||
|
xmm0 = _mm_load_ss(data++);
|
||||||
|
xmm2 = xmm0;
|
||||||
|
xmm0 = _mm_shuffle_ps(xmm0, xmm0, 0);
|
||||||
|
|
||||||
|
xmm0 = _mm_mul_ps(xmm0, xmm2);
|
||||||
|
xmm5 = _mm_add_ps(xmm5, xmm0);
|
||||||
|
|
||||||
|
data_len--;
|
||||||
|
|
||||||
|
while(data_len)
|
||||||
|
{
|
||||||
|
xmm0 = _mm_load1_ps(data++);
|
||||||
|
|
||||||
|
xmm2 = _mm_shuffle_ps(xmm2, xmm2, _MM_SHUFFLE(2,1,0,3));
|
||||||
|
xmm2 = _mm_move_ss(xmm2, xmm0);
|
||||||
|
xmm0 = _mm_mul_ps(xmm0, xmm2);
|
||||||
|
xmm5 = _mm_add_ps(xmm5, xmm0);
|
||||||
|
|
||||||
|
data_len--;
|
||||||
|
}
|
||||||
|
|
||||||
|
_mm_storeu_ps(autoc, xmm5);
|
||||||
|
}
|
||||||
|
|
||||||
|
FLAC__SSE_TARGET("sse")
|
||||||
|
void FLAC__lpc_compute_autocorrelation_intrin_sse_lag_8_old(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[])
|
||||||
|
{
|
||||||
|
__m128 xmm0, xmm1, xmm2, xmm3, xmm5, xmm6;
|
||||||
|
|
||||||
|
(void) lag;
|
||||||
|
FLAC__ASSERT(lag > 0);
|
||||||
|
FLAC__ASSERT(lag <= 8);
|
||||||
|
FLAC__ASSERT(lag <= data_len);
|
||||||
|
FLAC__ASSERT(data_len > 0);
|
||||||
|
|
||||||
|
xmm5 = _mm_setzero_ps();
|
||||||
|
xmm6 = _mm_setzero_ps();
|
||||||
|
|
||||||
|
xmm0 = _mm_load_ss(data++);
|
||||||
|
xmm2 = xmm0;
|
||||||
|
xmm0 = _mm_shuffle_ps(xmm0, xmm0, 0);
|
||||||
|
xmm3 = _mm_setzero_ps();
|
||||||
|
|
||||||
|
xmm0 = _mm_mul_ps(xmm0, xmm2);
|
||||||
|
xmm5 = _mm_add_ps(xmm5, xmm0);
|
||||||
|
|
||||||
|
data_len--;
|
||||||
|
|
||||||
|
while(data_len)
|
||||||
|
{
|
||||||
|
xmm0 = _mm_load1_ps(data++);
|
||||||
|
|
||||||
|
xmm2 = _mm_shuffle_ps(xmm2, xmm2, _MM_SHUFFLE(2,1,0,3));
|
||||||
|
xmm3 = _mm_shuffle_ps(xmm3, xmm3, _MM_SHUFFLE(2,1,0,3));
|
||||||
|
xmm3 = _mm_move_ss(xmm3, xmm2);
|
||||||
|
xmm2 = _mm_move_ss(xmm2, xmm0);
|
||||||
|
|
||||||
|
xmm1 = xmm0;
|
||||||
|
xmm1 = _mm_mul_ps(xmm1, xmm3);
|
||||||
|
xmm0 = _mm_mul_ps(xmm0, xmm2);
|
||||||
|
xmm6 = _mm_add_ps(xmm6, xmm1);
|
||||||
|
xmm5 = _mm_add_ps(xmm5, xmm0);
|
||||||
|
|
||||||
|
data_len--;
|
||||||
|
}
|
||||||
|
|
||||||
|
_mm_storeu_ps(autoc, xmm5);
|
||||||
|
_mm_storeu_ps(autoc+4, xmm6);
|
||||||
|
}
|
||||||
|
|
||||||
|
FLAC__SSE_TARGET("sse")
|
||||||
|
void FLAC__lpc_compute_autocorrelation_intrin_sse_lag_12_old(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[])
|
||||||
|
{
|
||||||
|
__m128 xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7;
|
||||||
|
|
||||||
|
(void) lag;
|
||||||
|
FLAC__ASSERT(lag > 0);
|
||||||
|
FLAC__ASSERT(lag <= 12);
|
||||||
|
FLAC__ASSERT(lag <= data_len);
|
||||||
|
FLAC__ASSERT(data_len > 0);
|
||||||
|
|
||||||
|
xmm5 = _mm_setzero_ps();
|
||||||
|
xmm6 = _mm_setzero_ps();
|
||||||
|
xmm7 = _mm_setzero_ps();
|
||||||
|
|
||||||
|
xmm0 = _mm_load_ss(data++);
|
||||||
|
xmm2 = xmm0;
|
||||||
|
xmm0 = _mm_shuffle_ps(xmm0, xmm0, 0);
|
||||||
|
xmm3 = _mm_setzero_ps();
|
||||||
|
xmm4 = _mm_setzero_ps();
|
||||||
|
|
||||||
|
xmm0 = _mm_mul_ps(xmm0, xmm2);
|
||||||
|
xmm5 = _mm_add_ps(xmm5, xmm0);
|
||||||
|
|
||||||
|
data_len--;
|
||||||
|
|
||||||
|
while(data_len)
|
||||||
|
{
|
||||||
|
xmm0 = _mm_load1_ps(data++);
|
||||||
|
|
||||||
|
xmm2 = _mm_shuffle_ps(xmm2, xmm2, _MM_SHUFFLE(2,1,0,3));
|
||||||
|
xmm3 = _mm_shuffle_ps(xmm3, xmm3, _MM_SHUFFLE(2,1,0,3));
|
||||||
|
xmm4 = _mm_shuffle_ps(xmm4, xmm4, _MM_SHUFFLE(2,1,0,3));
|
||||||
|
xmm4 = _mm_move_ss(xmm4, xmm3);
|
||||||
|
xmm3 = _mm_move_ss(xmm3, xmm2);
|
||||||
|
xmm2 = _mm_move_ss(xmm2, xmm0);
|
||||||
|
|
||||||
|
xmm1 = xmm0;
|
||||||
|
xmm1 = _mm_mul_ps(xmm1, xmm2);
|
||||||
|
xmm5 = _mm_add_ps(xmm5, xmm1);
|
||||||
|
xmm1 = xmm0;
|
||||||
|
xmm1 = _mm_mul_ps(xmm1, xmm3);
|
||||||
|
xmm6 = _mm_add_ps(xmm6, xmm1);
|
||||||
|
xmm0 = _mm_mul_ps(xmm0, xmm4);
|
||||||
|
xmm7 = _mm_add_ps(xmm7, xmm0);
|
||||||
|
|
||||||
|
data_len--;
|
||||||
|
}
|
||||||
|
|
||||||
|
_mm_storeu_ps(autoc, xmm5);
|
||||||
|
_mm_storeu_ps(autoc+4, xmm6);
|
||||||
|
_mm_storeu_ps(autoc+8, xmm7);
|
||||||
|
}
|
||||||
|
|
||||||
|
FLAC__SSE_TARGET("sse")
|
||||||
|
void FLAC__lpc_compute_autocorrelation_intrin_sse_lag_16_old(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[])
|
||||||
|
{
|
||||||
|
__m128 xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm8, xmm9;
|
||||||
|
|
||||||
|
(void) lag;
|
||||||
|
FLAC__ASSERT(lag > 0);
|
||||||
|
FLAC__ASSERT(lag <= 16);
|
||||||
|
FLAC__ASSERT(lag <= data_len);
|
||||||
|
FLAC__ASSERT(data_len > 0);
|
||||||
|
|
||||||
|
xmm6 = _mm_setzero_ps();
|
||||||
|
xmm7 = _mm_setzero_ps();
|
||||||
|
xmm8 = _mm_setzero_ps();
|
||||||
|
xmm9 = _mm_setzero_ps();
|
||||||
|
|
||||||
|
xmm0 = _mm_load_ss(data++);
|
||||||
|
xmm2 = xmm0;
|
||||||
|
xmm0 = _mm_shuffle_ps(xmm0, xmm0, 0);
|
||||||
|
xmm3 = _mm_setzero_ps();
|
||||||
|
xmm4 = _mm_setzero_ps();
|
||||||
|
xmm5 = _mm_setzero_ps();
|
||||||
|
|
||||||
|
xmm0 = _mm_mul_ps(xmm0, xmm2);
|
||||||
|
xmm6 = _mm_add_ps(xmm6, xmm0);
|
||||||
|
|
||||||
|
data_len--;
|
||||||
|
|
||||||
|
while(data_len)
|
||||||
|
{
|
||||||
|
xmm0 = _mm_load1_ps(data++);
|
||||||
|
|
||||||
|
/* shift xmm5:xmm4:xmm3:xmm2 left by one float */
|
||||||
|
xmm5 = _mm_shuffle_ps(xmm5, xmm5, _MM_SHUFFLE(2,1,0,3));
|
||||||
|
xmm4 = _mm_shuffle_ps(xmm4, xmm4, _MM_SHUFFLE(2,1,0,3));
|
||||||
|
xmm3 = _mm_shuffle_ps(xmm3, xmm3, _MM_SHUFFLE(2,1,0,3));
|
||||||
|
xmm2 = _mm_shuffle_ps(xmm2, xmm2, _MM_SHUFFLE(2,1,0,3));
|
||||||
|
xmm5 = _mm_move_ss(xmm5, xmm4);
|
||||||
|
xmm4 = _mm_move_ss(xmm4, xmm3);
|
||||||
|
xmm3 = _mm_move_ss(xmm3, xmm2);
|
||||||
|
xmm2 = _mm_move_ss(xmm2, xmm0);
|
||||||
|
|
||||||
|
/* xmm9|xmm8|xmm7|xmm6 += xmm0|xmm0|xmm0|xmm0 * xmm5|xmm4|xmm3|xmm2 */
|
||||||
|
xmm1 = xmm0;
|
||||||
|
xmm1 = _mm_mul_ps(xmm1, xmm5);
|
||||||
|
xmm9 = _mm_add_ps(xmm9, xmm1);
|
||||||
|
xmm1 = xmm0;
|
||||||
|
xmm1 = _mm_mul_ps(xmm1, xmm4);
|
||||||
|
xmm8 = _mm_add_ps(xmm8, xmm1);
|
||||||
|
xmm1 = xmm0;
|
||||||
|
xmm1 = _mm_mul_ps(xmm1, xmm3);
|
||||||
|
xmm7 = _mm_add_ps(xmm7, xmm1);
|
||||||
|
xmm0 = _mm_mul_ps(xmm0, xmm2);
|
||||||
|
xmm6 = _mm_add_ps(xmm6, xmm0);
|
||||||
|
|
||||||
|
data_len--;
|
||||||
|
}
|
||||||
|
|
||||||
|
_mm_storeu_ps(autoc, xmm6);
|
||||||
|
_mm_storeu_ps(autoc+4, xmm7);
|
||||||
|
_mm_storeu_ps(autoc+8, xmm8);
|
||||||
|
_mm_storeu_ps(autoc+12,xmm9);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* FLAC__SSE_SUPPORTED */
|
||||||
|
#endif /* (FLAC__CPU_IA32 || FLAC__CPU_X86_64) && FLAC__HAS_X86INTRIN */
|
||||||
|
#endif /* FLAC__NO_ASM */
|
||||||
|
#endif /* FLAC__INTEGER_ONLY_LIBRARY */
|
1090
deps/libFLAC/lpc_intrin_sse2.c
vendored
Normal file
1090
deps/libFLAC/lpc_intrin_sse2.c
vendored
Normal file
File diff suppressed because it is too large
Load Diff
1314
deps/libFLAC/lpc_intrin_sse41.c
vendored
Normal file
1314
deps/libFLAC/lpc_intrin_sse41.c
vendored
Normal file
File diff suppressed because it is too large
Load Diff
516
deps/libFLAC/md5.c
vendored
Normal file
516
deps/libFLAC/md5.c
vendored
Normal file
@ -0,0 +1,516 @@
|
|||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdlib.h> /* for malloc() */
|
||||||
|
#include <string.h> /* for memcpy() */
|
||||||
|
|
||||||
|
#include "private/md5.h"
|
||||||
|
#include "share/alloc.h"
|
||||||
|
#include "share/endswap.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This code implements the MD5 message-digest algorithm.
|
||||||
|
* The algorithm is due to Ron Rivest. This code was
|
||||||
|
* written by Colin Plumb in 1993, no copyright is claimed.
|
||||||
|
* This code is in the public domain; do with it what you wish.
|
||||||
|
*
|
||||||
|
* Equivalent code is available from RSA Data Security, Inc.
|
||||||
|
* This code has been tested against that, and is equivalent,
|
||||||
|
* except that you don't need to include two pages of legalese
|
||||||
|
* with every copy.
|
||||||
|
*
|
||||||
|
* To compute the message digest of a chunk of bytes, declare an
|
||||||
|
* MD5Context structure, pass it to MD5Init, call MD5Update as
|
||||||
|
* needed on buffers full of bytes, and then call MD5Final, which
|
||||||
|
* will fill a supplied 16-byte array with the digest.
|
||||||
|
*
|
||||||
|
* Changed so as no longer to depend on Colin Plumb's `usual.h' header
|
||||||
|
* definitions; now uses stuff from dpkg's config.h.
|
||||||
|
* - Ian Jackson <ijackson@nyx.cs.du.edu>.
|
||||||
|
* Still in the public domain.
|
||||||
|
*
|
||||||
|
* Josh Coalson: made some changes to integrate with libFLAC.
|
||||||
|
* Still in the public domain.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* The four core functions - F1 is optimized somewhat */
|
||||||
|
|
||||||
|
/* #define F1(x, y, z) (x & y | ~x & z) */
|
||||||
|
#define F1(x, y, z) (z ^ (x & (y ^ z)))
|
||||||
|
#define F2(x, y, z) F1(z, x, y)
|
||||||
|
#define F3(x, y, z) (x ^ y ^ z)
|
||||||
|
#define F4(x, y, z) (y ^ (x | ~z))
|
||||||
|
|
||||||
|
/* This is the central step in the MD5 algorithm. */
|
||||||
|
#define MD5STEP(f,w,x,y,z,in,s) \
|
||||||
|
(w += f(x,y,z) + in, w = (w<<s | w>>(32-s)) + x)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The core of the MD5 algorithm, this alters an existing MD5 hash to
|
||||||
|
* reflect the addition of 16 longwords of new data. MD5Update blocks
|
||||||
|
* the data and converts bytes into longwords for this routine.
|
||||||
|
*/
|
||||||
|
static void FLAC__MD5Transform(FLAC__uint32 buf[4], FLAC__uint32 const in[16])
|
||||||
|
{
|
||||||
|
register FLAC__uint32 a, b, c, d;
|
||||||
|
|
||||||
|
a = buf[0];
|
||||||
|
b = buf[1];
|
||||||
|
c = buf[2];
|
||||||
|
d = buf[3];
|
||||||
|
|
||||||
|
MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7);
|
||||||
|
MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12);
|
||||||
|
MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17);
|
||||||
|
MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22);
|
||||||
|
MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7);
|
||||||
|
MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12);
|
||||||
|
MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17);
|
||||||
|
MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22);
|
||||||
|
MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7);
|
||||||
|
MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12);
|
||||||
|
MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17);
|
||||||
|
MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22);
|
||||||
|
MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7);
|
||||||
|
MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12);
|
||||||
|
MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17);
|
||||||
|
MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22);
|
||||||
|
|
||||||
|
MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5);
|
||||||
|
MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9);
|
||||||
|
MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14);
|
||||||
|
MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20);
|
||||||
|
MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5);
|
||||||
|
MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9);
|
||||||
|
MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14);
|
||||||
|
MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20);
|
||||||
|
MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5);
|
||||||
|
MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9);
|
||||||
|
MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14);
|
||||||
|
MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20);
|
||||||
|
MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5);
|
||||||
|
MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9);
|
||||||
|
MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14);
|
||||||
|
MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);
|
||||||
|
|
||||||
|
MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4);
|
||||||
|
MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11);
|
||||||
|
MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16);
|
||||||
|
MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23);
|
||||||
|
MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4);
|
||||||
|
MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11);
|
||||||
|
MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16);
|
||||||
|
MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23);
|
||||||
|
MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4);
|
||||||
|
MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11);
|
||||||
|
MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16);
|
||||||
|
MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23);
|
||||||
|
MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4);
|
||||||
|
MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11);
|
||||||
|
MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);
|
||||||
|
MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23);
|
||||||
|
|
||||||
|
MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6);
|
||||||
|
MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10);
|
||||||
|
MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15);
|
||||||
|
MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21);
|
||||||
|
MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6);
|
||||||
|
MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10);
|
||||||
|
MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15);
|
||||||
|
MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21);
|
||||||
|
MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6);
|
||||||
|
MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);
|
||||||
|
MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15);
|
||||||
|
MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21);
|
||||||
|
MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6);
|
||||||
|
MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10);
|
||||||
|
MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15);
|
||||||
|
MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21);
|
||||||
|
|
||||||
|
buf[0] += a;
|
||||||
|
buf[1] += b;
|
||||||
|
buf[2] += c;
|
||||||
|
buf[3] += d;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if WORDS_BIGENDIAN
|
||||||
|
//@@@@@@ OPT: use bswap/intrinsics
|
||||||
|
static void byteSwap(FLAC__uint32 *buf, unsigned words)
|
||||||
|
{
|
||||||
|
register FLAC__uint32 x;
|
||||||
|
do {
|
||||||
|
x = *buf;
|
||||||
|
x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff);
|
||||||
|
*buf++ = (x >> 16) | (x << 16);
|
||||||
|
} while (--words);
|
||||||
|
}
|
||||||
|
static void byteSwapX16(FLAC__uint32 *buf)
|
||||||
|
{
|
||||||
|
register FLAC__uint32 x;
|
||||||
|
|
||||||
|
x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16);
|
||||||
|
x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16);
|
||||||
|
x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16);
|
||||||
|
x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16);
|
||||||
|
x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16);
|
||||||
|
x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16);
|
||||||
|
x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16);
|
||||||
|
x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16);
|
||||||
|
x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16);
|
||||||
|
x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16);
|
||||||
|
x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16);
|
||||||
|
x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16);
|
||||||
|
x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16);
|
||||||
|
x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16);
|
||||||
|
x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16);
|
||||||
|
x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf = (x >> 16) | (x << 16);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#define byteSwap(buf, words)
|
||||||
|
#define byteSwapX16(buf)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Update context to reflect the concatenation of another buffer full
|
||||||
|
* of bytes.
|
||||||
|
*/
|
||||||
|
static void FLAC__MD5Update(FLAC__MD5Context *ctx, FLAC__byte const *buf, unsigned len)
|
||||||
|
{
|
||||||
|
FLAC__uint32 t;
|
||||||
|
|
||||||
|
/* Update byte count */
|
||||||
|
|
||||||
|
t = ctx->bytes[0];
|
||||||
|
if ((ctx->bytes[0] = t + len) < t)
|
||||||
|
ctx->bytes[1]++; /* Carry from low to high */
|
||||||
|
|
||||||
|
t = 64 - (t & 0x3f); /* Space available in ctx->in (at least 1) */
|
||||||
|
if (t > len) {
|
||||||
|
memcpy((FLAC__byte *)ctx->in + 64 - t, buf, len);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* First chunk is an odd size */
|
||||||
|
memcpy((FLAC__byte *)ctx->in + 64 - t, buf, t);
|
||||||
|
byteSwapX16(ctx->in);
|
||||||
|
FLAC__MD5Transform(ctx->buf, ctx->in);
|
||||||
|
buf += t;
|
||||||
|
len -= t;
|
||||||
|
|
||||||
|
/* Process data in 64-byte chunks */
|
||||||
|
while (len >= 64) {
|
||||||
|
memcpy(ctx->in, buf, 64);
|
||||||
|
byteSwapX16(ctx->in);
|
||||||
|
FLAC__MD5Transform(ctx->buf, ctx->in);
|
||||||
|
buf += 64;
|
||||||
|
len -= 64;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Handle any remaining bytes of data. */
|
||||||
|
memcpy(ctx->in, buf, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Start MD5 accumulation. Set bit count to 0 and buffer to mysterious
|
||||||
|
* initialization constants.
|
||||||
|
*/
|
||||||
|
void FLAC__MD5Init(FLAC__MD5Context *ctx)
|
||||||
|
{
|
||||||
|
ctx->buf[0] = 0x67452301;
|
||||||
|
ctx->buf[1] = 0xefcdab89;
|
||||||
|
ctx->buf[2] = 0x98badcfe;
|
||||||
|
ctx->buf[3] = 0x10325476;
|
||||||
|
|
||||||
|
ctx->bytes[0] = 0;
|
||||||
|
ctx->bytes[1] = 0;
|
||||||
|
|
||||||
|
ctx->internal_buf.p8 = 0;
|
||||||
|
ctx->capacity = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Final wrapup - pad to 64-byte boundary with the bit pattern
|
||||||
|
* 1 0* (64-bit count of bits processed, MSB-first)
|
||||||
|
*/
|
||||||
|
void FLAC__MD5Final(FLAC__byte digest[16], FLAC__MD5Context *ctx)
|
||||||
|
{
|
||||||
|
int count = ctx->bytes[0] & 0x3f; /* Number of bytes in ctx->in */
|
||||||
|
FLAC__byte *p = (FLAC__byte *)ctx->in + count;
|
||||||
|
|
||||||
|
/* Set the first char of padding to 0x80. There is always room. */
|
||||||
|
*p++ = 0x80;
|
||||||
|
|
||||||
|
/* Bytes of padding needed to make 56 bytes (-8..55) */
|
||||||
|
count = 56 - 1 - count;
|
||||||
|
|
||||||
|
if (count < 0) { /* Padding forces an extra block */
|
||||||
|
memset(p, 0, count + 8);
|
||||||
|
byteSwapX16(ctx->in);
|
||||||
|
FLAC__MD5Transform(ctx->buf, ctx->in);
|
||||||
|
p = (FLAC__byte *)ctx->in;
|
||||||
|
count = 56;
|
||||||
|
}
|
||||||
|
memset(p, 0, count);
|
||||||
|
byteSwap(ctx->in, 14);
|
||||||
|
|
||||||
|
/* Append length in bits and transform */
|
||||||
|
ctx->in[14] = ctx->bytes[0] << 3;
|
||||||
|
ctx->in[15] = ctx->bytes[1] << 3 | ctx->bytes[0] >> 29;
|
||||||
|
FLAC__MD5Transform(ctx->buf, ctx->in);
|
||||||
|
|
||||||
|
byteSwap(ctx->buf, 4);
|
||||||
|
memcpy(digest, ctx->buf, 16);
|
||||||
|
if (0 != ctx->internal_buf.p8) {
|
||||||
|
free(ctx->internal_buf.p8);
|
||||||
|
ctx->internal_buf.p8 = 0;
|
||||||
|
ctx->capacity = 0;
|
||||||
|
}
|
||||||
|
memset(ctx, 0, sizeof(*ctx)); /* In case it's sensitive */
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Convert the incoming audio signal to a byte stream
|
||||||
|
*/
|
||||||
|
static void format_input_(FLAC__multibyte *mbuf, const FLAC__int32 * const signal[], unsigned channels, unsigned samples, unsigned bytes_per_sample)
|
||||||
|
{
|
||||||
|
FLAC__byte *buf_ = mbuf->p8;
|
||||||
|
FLAC__int16 *buf16 = mbuf->p16;
|
||||||
|
FLAC__int32 *buf32 = mbuf->p32;
|
||||||
|
FLAC__int32 a_word;
|
||||||
|
unsigned channel, sample;
|
||||||
|
|
||||||
|
/* Storage in the output buffer, buf, is little endian. */
|
||||||
|
|
||||||
|
#define BYTES_CHANNEL_SELECTOR(bytes, channels) (bytes * 100 + channels)
|
||||||
|
|
||||||
|
/* First do the most commonly used combinations. */
|
||||||
|
switch (BYTES_CHANNEL_SELECTOR (bytes_per_sample, channels)) {
|
||||||
|
/* One byte per sample. */
|
||||||
|
case (BYTES_CHANNEL_SELECTOR (1, 1)):
|
||||||
|
for (sample = 0; sample < samples; sample++)
|
||||||
|
*buf_++ = signal[0][sample];
|
||||||
|
return;
|
||||||
|
|
||||||
|
case (BYTES_CHANNEL_SELECTOR (1, 2)):
|
||||||
|
for (sample = 0; sample < samples; sample++) {
|
||||||
|
*buf_++ = signal[0][sample];
|
||||||
|
*buf_++ = signal[1][sample];
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
|
||||||
|
case (BYTES_CHANNEL_SELECTOR (1, 4)):
|
||||||
|
for (sample = 0; sample < samples; sample++) {
|
||||||
|
*buf_++ = signal[0][sample];
|
||||||
|
*buf_++ = signal[1][sample];
|
||||||
|
*buf_++ = signal[2][sample];
|
||||||
|
*buf_++ = signal[3][sample];
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
|
||||||
|
case (BYTES_CHANNEL_SELECTOR (1, 6)):
|
||||||
|
for (sample = 0; sample < samples; sample++) {
|
||||||
|
*buf_++ = signal[0][sample];
|
||||||
|
*buf_++ = signal[1][sample];
|
||||||
|
*buf_++ = signal[2][sample];
|
||||||
|
*buf_++ = signal[3][sample];
|
||||||
|
*buf_++ = signal[4][sample];
|
||||||
|
*buf_++ = signal[5][sample];
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
|
||||||
|
case (BYTES_CHANNEL_SELECTOR (1, 8)):
|
||||||
|
for (sample = 0; sample < samples; sample++) {
|
||||||
|
*buf_++ = signal[0][sample];
|
||||||
|
*buf_++ = signal[1][sample];
|
||||||
|
*buf_++ = signal[2][sample];
|
||||||
|
*buf_++ = signal[3][sample];
|
||||||
|
*buf_++ = signal[4][sample];
|
||||||
|
*buf_++ = signal[5][sample];
|
||||||
|
*buf_++ = signal[6][sample];
|
||||||
|
*buf_++ = signal[7][sample];
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* Two bytes per sample. */
|
||||||
|
case (BYTES_CHANNEL_SELECTOR (2, 1)):
|
||||||
|
for (sample = 0; sample < samples; sample++)
|
||||||
|
*buf16++ = H2LE_16(signal[0][sample]);
|
||||||
|
return;
|
||||||
|
|
||||||
|
case (BYTES_CHANNEL_SELECTOR (2, 2)):
|
||||||
|
for (sample = 0; sample < samples; sample++) {
|
||||||
|
*buf16++ = H2LE_16(signal[0][sample]);
|
||||||
|
*buf16++ = H2LE_16(signal[1][sample]);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
|
||||||
|
case (BYTES_CHANNEL_SELECTOR (2, 4)):
|
||||||
|
for (sample = 0; sample < samples; sample++) {
|
||||||
|
*buf16++ = H2LE_16(signal[0][sample]);
|
||||||
|
*buf16++ = H2LE_16(signal[1][sample]);
|
||||||
|
*buf16++ = H2LE_16(signal[2][sample]);
|
||||||
|
*buf16++ = H2LE_16(signal[3][sample]);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
|
||||||
|
case (BYTES_CHANNEL_SELECTOR (2, 6)):
|
||||||
|
for (sample = 0; sample < samples; sample++) {
|
||||||
|
*buf16++ = H2LE_16(signal[0][sample]);
|
||||||
|
*buf16++ = H2LE_16(signal[1][sample]);
|
||||||
|
*buf16++ = H2LE_16(signal[2][sample]);
|
||||||
|
*buf16++ = H2LE_16(signal[3][sample]);
|
||||||
|
*buf16++ = H2LE_16(signal[4][sample]);
|
||||||
|
*buf16++ = H2LE_16(signal[5][sample]);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
|
||||||
|
case (BYTES_CHANNEL_SELECTOR (2, 8)):
|
||||||
|
for (sample = 0; sample < samples; sample++) {
|
||||||
|
*buf16++ = H2LE_16(signal[0][sample]);
|
||||||
|
*buf16++ = H2LE_16(signal[1][sample]);
|
||||||
|
*buf16++ = H2LE_16(signal[2][sample]);
|
||||||
|
*buf16++ = H2LE_16(signal[3][sample]);
|
||||||
|
*buf16++ = H2LE_16(signal[4][sample]);
|
||||||
|
*buf16++ = H2LE_16(signal[5][sample]);
|
||||||
|
*buf16++ = H2LE_16(signal[6][sample]);
|
||||||
|
*buf16++ = H2LE_16(signal[7][sample]);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* Three bytes per sample. */
|
||||||
|
case (BYTES_CHANNEL_SELECTOR (3, 1)):
|
||||||
|
for (sample = 0; sample < samples; sample++) {
|
||||||
|
a_word = signal[0][sample];
|
||||||
|
*buf_++ = (FLAC__byte)a_word; a_word >>= 8;
|
||||||
|
*buf_++ = (FLAC__byte)a_word; a_word >>= 8;
|
||||||
|
*buf_++ = (FLAC__byte)a_word;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
|
||||||
|
case (BYTES_CHANNEL_SELECTOR (3, 2)):
|
||||||
|
for (sample = 0; sample < samples; sample++) {
|
||||||
|
a_word = signal[0][sample];
|
||||||
|
*buf_++ = (FLAC__byte)a_word; a_word >>= 8;
|
||||||
|
*buf_++ = (FLAC__byte)a_word; a_word >>= 8;
|
||||||
|
*buf_++ = (FLAC__byte)a_word;
|
||||||
|
a_word = signal[1][sample];
|
||||||
|
*buf_++ = (FLAC__byte)a_word; a_word >>= 8;
|
||||||
|
*buf_++ = (FLAC__byte)a_word; a_word >>= 8;
|
||||||
|
*buf_++ = (FLAC__byte)a_word;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* Four bytes per sample. */
|
||||||
|
case (BYTES_CHANNEL_SELECTOR (4, 1)):
|
||||||
|
for (sample = 0; sample < samples; sample++)
|
||||||
|
*buf32++ = H2LE_32(signal[0][sample]);
|
||||||
|
return;
|
||||||
|
|
||||||
|
case (BYTES_CHANNEL_SELECTOR (4, 2)):
|
||||||
|
for (sample = 0; sample < samples; sample++) {
|
||||||
|
*buf32++ = H2LE_32(signal[0][sample]);
|
||||||
|
*buf32++ = H2LE_32(signal[1][sample]);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
|
||||||
|
case (BYTES_CHANNEL_SELECTOR (4, 4)):
|
||||||
|
for (sample = 0; sample < samples; sample++) {
|
||||||
|
*buf32++ = H2LE_32(signal[0][sample]);
|
||||||
|
*buf32++ = H2LE_32(signal[1][sample]);
|
||||||
|
*buf32++ = H2LE_32(signal[2][sample]);
|
||||||
|
*buf32++ = H2LE_32(signal[3][sample]);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
|
||||||
|
case (BYTES_CHANNEL_SELECTOR (4, 6)):
|
||||||
|
for (sample = 0; sample < samples; sample++) {
|
||||||
|
*buf32++ = H2LE_32(signal[0][sample]);
|
||||||
|
*buf32++ = H2LE_32(signal[1][sample]);
|
||||||
|
*buf32++ = H2LE_32(signal[2][sample]);
|
||||||
|
*buf32++ = H2LE_32(signal[3][sample]);
|
||||||
|
*buf32++ = H2LE_32(signal[4][sample]);
|
||||||
|
*buf32++ = H2LE_32(signal[5][sample]);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
|
||||||
|
case (BYTES_CHANNEL_SELECTOR (4, 8)):
|
||||||
|
for (sample = 0; sample < samples; sample++) {
|
||||||
|
*buf32++ = H2LE_32(signal[0][sample]);
|
||||||
|
*buf32++ = H2LE_32(signal[1][sample]);
|
||||||
|
*buf32++ = H2LE_32(signal[2][sample]);
|
||||||
|
*buf32++ = H2LE_32(signal[3][sample]);
|
||||||
|
*buf32++ = H2LE_32(signal[4][sample]);
|
||||||
|
*buf32++ = H2LE_32(signal[5][sample]);
|
||||||
|
*buf32++ = H2LE_32(signal[6][sample]);
|
||||||
|
*buf32++ = H2LE_32(signal[7][sample]);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* General version. */
|
||||||
|
switch (bytes_per_sample) {
|
||||||
|
case 1:
|
||||||
|
for (sample = 0; sample < samples; sample++)
|
||||||
|
for (channel = 0; channel < channels; channel++)
|
||||||
|
*buf_++ = signal[channel][sample];
|
||||||
|
return;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
for (sample = 0; sample < samples; sample++)
|
||||||
|
for (channel = 0; channel < channels; channel++)
|
||||||
|
*buf16++ = H2LE_16(signal[channel][sample]);
|
||||||
|
return;
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
for (sample = 0; sample < samples; sample++)
|
||||||
|
for (channel = 0; channel < channels; channel++) {
|
||||||
|
a_word = signal[channel][sample];
|
||||||
|
*buf_++ = (FLAC__byte)a_word; a_word >>= 8;
|
||||||
|
*buf_++ = (FLAC__byte)a_word; a_word >>= 8;
|
||||||
|
*buf_++ = (FLAC__byte)a_word;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
|
||||||
|
case 4:
|
||||||
|
for (sample = 0; sample < samples; sample++)
|
||||||
|
for (channel = 0; channel < channels; channel++)
|
||||||
|
*buf32++ = H2LE_32(signal[channel][sample]);
|
||||||
|
return;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Convert the incoming audio signal to a byte stream and FLAC__MD5Update it.
|
||||||
|
*/
|
||||||
|
FLAC__bool FLAC__MD5Accumulate(FLAC__MD5Context *ctx, const FLAC__int32 * const signal[], unsigned channels, unsigned samples, unsigned bytes_per_sample)
|
||||||
|
{
|
||||||
|
const size_t bytes_needed = (size_t)channels * (size_t)samples * (size_t)bytes_per_sample;
|
||||||
|
|
||||||
|
/* overflow check */
|
||||||
|
if ((size_t)channels > SIZE_MAX / (size_t)bytes_per_sample)
|
||||||
|
return false;
|
||||||
|
if ((size_t)channels * (size_t)bytes_per_sample > SIZE_MAX / (size_t)samples)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (ctx->capacity < bytes_needed) {
|
||||||
|
if (0 == (ctx->internal_buf.p8 = safe_realloc_(ctx->internal_buf.p8, bytes_needed))) {
|
||||||
|
if (0 == (ctx->internal_buf.p8 = safe_malloc_(bytes_needed))) {
|
||||||
|
ctx->capacity = 0;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ctx->capacity = bytes_needed;
|
||||||
|
}
|
||||||
|
|
||||||
|
format_input_(&ctx->internal_buf, signal, channels, samples, bytes_per_sample);
|
||||||
|
|
||||||
|
FLAC__MD5Update(ctx, ctx->internal_buf.p8, bytes_needed);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
218
deps/libFLAC/memory.c
vendored
Normal file
218
deps/libFLAC/memory.c
vendored
Normal file
@ -0,0 +1,218 @@
|
|||||||
|
/* libFLAC - Free Lossless Audio Codec library
|
||||||
|
* Copyright (C) 2001-2009 Josh Coalson
|
||||||
|
* Copyright (C) 2011-2016 Xiph.Org Foundation
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Xiph.org Foundation nor the names of its
|
||||||
|
* 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 FOUNDATION OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_STDINT_H
|
||||||
|
#include <stdint.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "private/memory.h"
|
||||||
|
#include "FLAC/assert.h"
|
||||||
|
#include "share/alloc.h"
|
||||||
|
|
||||||
|
void *FLAC__memory_alloc_aligned(size_t bytes, void **aligned_address)
|
||||||
|
{
|
||||||
|
void *x;
|
||||||
|
|
||||||
|
FLAC__ASSERT(0 != aligned_address);
|
||||||
|
|
||||||
|
#ifdef FLAC__ALIGN_MALLOC_DATA
|
||||||
|
/* align on 32-byte (256-bit) boundary */
|
||||||
|
x = safe_malloc_add_2op_(bytes, /*+*/31L);
|
||||||
|
*aligned_address = (void*)(((uintptr_t)x + 31L) & -32L);
|
||||||
|
#else
|
||||||
|
x = safe_malloc_(bytes);
|
||||||
|
*aligned_address = x;
|
||||||
|
#endif
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
FLAC__bool FLAC__memory_alloc_aligned_int32_array(size_t elements, FLAC__int32 **unaligned_pointer, FLAC__int32 **aligned_pointer)
|
||||||
|
{
|
||||||
|
FLAC__int32 *pu; /* unaligned pointer */
|
||||||
|
union { /* union needed to comply with C99 pointer aliasing rules */
|
||||||
|
FLAC__int32 *pa; /* aligned pointer */
|
||||||
|
void *pv; /* aligned pointer alias */
|
||||||
|
} u;
|
||||||
|
|
||||||
|
FLAC__ASSERT(elements > 0);
|
||||||
|
FLAC__ASSERT(0 != unaligned_pointer);
|
||||||
|
FLAC__ASSERT(0 != aligned_pointer);
|
||||||
|
FLAC__ASSERT(unaligned_pointer != aligned_pointer);
|
||||||
|
|
||||||
|
if(elements > SIZE_MAX / sizeof(*pu)) /* overflow check */
|
||||||
|
return false;
|
||||||
|
|
||||||
|
pu = FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv);
|
||||||
|
if(0 == pu) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if(*unaligned_pointer != 0)
|
||||||
|
free(*unaligned_pointer);
|
||||||
|
*unaligned_pointer = pu;
|
||||||
|
*aligned_pointer = u.pa;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
FLAC__bool FLAC__memory_alloc_aligned_uint32_array(size_t elements, FLAC__uint32 **unaligned_pointer, FLAC__uint32 **aligned_pointer)
|
||||||
|
{
|
||||||
|
FLAC__uint32 *pu; /* unaligned pointer */
|
||||||
|
union { /* union needed to comply with C99 pointer aliasing rules */
|
||||||
|
FLAC__uint32 *pa; /* aligned pointer */
|
||||||
|
void *pv; /* aligned pointer alias */
|
||||||
|
} u;
|
||||||
|
|
||||||
|
FLAC__ASSERT(elements > 0);
|
||||||
|
FLAC__ASSERT(0 != unaligned_pointer);
|
||||||
|
FLAC__ASSERT(0 != aligned_pointer);
|
||||||
|
FLAC__ASSERT(unaligned_pointer != aligned_pointer);
|
||||||
|
|
||||||
|
if(elements > SIZE_MAX / sizeof(*pu)) /* overflow check */
|
||||||
|
return false;
|
||||||
|
|
||||||
|
pu = FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv);
|
||||||
|
if(0 == pu) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if(*unaligned_pointer != 0)
|
||||||
|
free(*unaligned_pointer);
|
||||||
|
*unaligned_pointer = pu;
|
||||||
|
*aligned_pointer = u.pa;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
FLAC__bool FLAC__memory_alloc_aligned_uint64_array(size_t elements, FLAC__uint64 **unaligned_pointer, FLAC__uint64 **aligned_pointer)
|
||||||
|
{
|
||||||
|
FLAC__uint64 *pu; /* unaligned pointer */
|
||||||
|
union { /* union needed to comply with C99 pointer aliasing rules */
|
||||||
|
FLAC__uint64 *pa; /* aligned pointer */
|
||||||
|
void *pv; /* aligned pointer alias */
|
||||||
|
} u;
|
||||||
|
|
||||||
|
FLAC__ASSERT(elements > 0);
|
||||||
|
FLAC__ASSERT(0 != unaligned_pointer);
|
||||||
|
FLAC__ASSERT(0 != aligned_pointer);
|
||||||
|
FLAC__ASSERT(unaligned_pointer != aligned_pointer);
|
||||||
|
|
||||||
|
if(elements > SIZE_MAX / sizeof(*pu)) /* overflow check */
|
||||||
|
return false;
|
||||||
|
|
||||||
|
pu = FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv);
|
||||||
|
if(0 == pu) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if(*unaligned_pointer != 0)
|
||||||
|
free(*unaligned_pointer);
|
||||||
|
*unaligned_pointer = pu;
|
||||||
|
*aligned_pointer = u.pa;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
FLAC__bool FLAC__memory_alloc_aligned_unsigned_array(size_t elements, unsigned **unaligned_pointer, unsigned **aligned_pointer)
|
||||||
|
{
|
||||||
|
unsigned *pu; /* unaligned pointer */
|
||||||
|
union { /* union needed to comply with C99 pointer aliasing rules */
|
||||||
|
unsigned *pa; /* aligned pointer */
|
||||||
|
void *pv; /* aligned pointer alias */
|
||||||
|
} u;
|
||||||
|
|
||||||
|
FLAC__ASSERT(elements > 0);
|
||||||
|
FLAC__ASSERT(0 != unaligned_pointer);
|
||||||
|
FLAC__ASSERT(0 != aligned_pointer);
|
||||||
|
FLAC__ASSERT(unaligned_pointer != aligned_pointer);
|
||||||
|
|
||||||
|
if(elements > SIZE_MAX / sizeof(*pu)) /* overflow check */
|
||||||
|
return false;
|
||||||
|
|
||||||
|
pu = FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv);
|
||||||
|
if(0 == pu) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if(*unaligned_pointer != 0)
|
||||||
|
free(*unaligned_pointer);
|
||||||
|
*unaligned_pointer = pu;
|
||||||
|
*aligned_pointer = u.pa;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef FLAC__INTEGER_ONLY_LIBRARY
|
||||||
|
|
||||||
|
FLAC__bool FLAC__memory_alloc_aligned_real_array(size_t elements, FLAC__real **unaligned_pointer, FLAC__real **aligned_pointer)
|
||||||
|
{
|
||||||
|
FLAC__real *pu; /* unaligned pointer */
|
||||||
|
union { /* union needed to comply with C99 pointer aliasing rules */
|
||||||
|
FLAC__real *pa; /* aligned pointer */
|
||||||
|
void *pv; /* aligned pointer alias */
|
||||||
|
} u;
|
||||||
|
|
||||||
|
FLAC__ASSERT(elements > 0);
|
||||||
|
FLAC__ASSERT(0 != unaligned_pointer);
|
||||||
|
FLAC__ASSERT(0 != aligned_pointer);
|
||||||
|
FLAC__ASSERT(unaligned_pointer != aligned_pointer);
|
||||||
|
|
||||||
|
if(elements > SIZE_MAX / sizeof(*pu)) /* overflow check */
|
||||||
|
return false;
|
||||||
|
|
||||||
|
pu = FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv);
|
||||||
|
if(0 == pu) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if(*unaligned_pointer != 0)
|
||||||
|
free(*unaligned_pointer);
|
||||||
|
*unaligned_pointer = pu;
|
||||||
|
*aligned_pointer = u.pa;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void *safe_malloc_mul_2op_p(size_t size1, size_t size2)
|
||||||
|
{
|
||||||
|
if(!size1 || !size2)
|
||||||
|
return malloc(1); /* malloc(0) is undefined; FLAC src convention is to always allocate */
|
||||||
|
if(size1 > SIZE_MAX / size2)
|
||||||
|
return 0;
|
||||||
|
return malloc(size1*size2);
|
||||||
|
}
|
3400
deps/libFLAC/stream_decoder.c
vendored
Normal file
3400
deps/libFLAC/stream_decoder.c
vendored
Normal file
File diff suppressed because it is too large
Load Diff
@ -82,6 +82,7 @@ HAVE_SSE=no # x86 SSE optimizations (SSE, SSE2)
|
|||||||
HAVE_FLOATHARD=no # Force hard float ABI (for ARM)
|
HAVE_FLOATHARD=no # Force hard float ABI (for ARM)
|
||||||
HAVE_FLOATSOFTFP=no # Force soft float ABI (for ARM)
|
HAVE_FLOATSOFTFP=no # Force soft float ABI (for ARM)
|
||||||
HAVE_7ZIP=yes # Compile in 7z support
|
HAVE_7ZIP=yes # Compile in 7z support
|
||||||
|
HAVE_FLAC=yes # Compile in flac support
|
||||||
HAVE_UPDATE_ASSETS=yes # Disable downloading assets with online updater
|
HAVE_UPDATE_ASSETS=yes # Disable downloading assets with online updater
|
||||||
HAVE_PRESERVE_DYLIB=no # Enable dlclose() for Valgrind support
|
HAVE_PRESERVE_DYLIB=no # Enable dlclose() for Valgrind support
|
||||||
HAVE_PARPORT=auto # Parallel port joypad support
|
HAVE_PARPORT=auto # Parallel port joypad support
|
||||||
|
Loading…
x
Reference in New Issue
Block a user