From 05dc8faa0419869438fc1a3c2b1741e87fea0178 Mon Sep 17 00:00:00 2001 From: EkeEke Date: Sun, 27 Aug 2017 16:42:31 +0200 Subject: [PATCH] [Core/CD] added (optional) CHD image file support --- HISTORY.txt | 1 + LICENSE.txt | 96 +- Makefile.libretro | 19 +- Makefile.wii | 6 +- builds/genesis_plus_gx_libretro.dll | Bin 2420770 -> 2611555 bytes builds/genplus_wii.dol | Bin 3502944 -> 3584416 bytes core/cd_hw/cdd.c | 324 +- core/cd_hw/cdd.h | 24 +- core/cd_hw/libchdr/LICENSE.txt | 24 + core/cd_hw/libchdr/README.md | 7 + core/cd_hw/libchdr/deps/libFLAC/AUTHORS | 58 + core/cd_hw/libchdr/deps/libFLAC/COPYING.Xiph | 29 + core/cd_hw/libchdr/deps/libFLAC/README | 254 ++ core/cd_hw/libchdr/deps/libFLAC/bitmath.c | 73 + core/cd_hw/libchdr/deps/libFLAC/bitreader.c | 1087 ++++++ core/cd_hw/libchdr/deps/libFLAC/cpu.c | 293 ++ core/cd_hw/libchdr/deps/libFLAC/crc.c | 143 + core/cd_hw/libchdr/deps/libFLAC/fixed.c | 395 ++ core/cd_hw/libchdr/deps/libFLAC/float.c | 302 ++ core/cd_hw/libchdr/deps/libFLAC/format.c | 589 +++ .../deps/libFLAC/include/FLAC/assert.h | 46 + .../deps/libFLAC/include/FLAC/callback.h | 185 + .../deps/libFLAC/include/FLAC/export.h | 97 + .../deps/libFLAC/include/FLAC/format.h | 1025 +++++ .../deps/libFLAC/include/FLAC/metadata.h | 2182 +++++++++++ .../deps/libFLAC/include/FLAC/ordinals.h | 86 + .../libFLAC/include/FLAC/stream_decoder.h | 1560 ++++++++ .../deps/libFLAC/include/private/bitmath.h | 210 + .../deps/libFLAC/include/private/bitreader.h | 91 + .../deps/libFLAC/include/private/cpu.h | 186 + .../deps/libFLAC/include/private/crc.h | 62 + .../deps/libFLAC/include/private/fixed.h | 107 + .../deps/libFLAC/include/private/float.h | 95 + .../deps/libFLAC/include/private/format.h | 45 + .../deps/libFLAC/include/private/lpc.h | 250 ++ .../deps/libFLAC/include/private/macros.h | 72 + .../deps/libFLAC/include/private/md5.h | 50 + .../deps/libFLAC/include/private/memory.h | 58 + .../include/protected/stream_decoder.h | 60 + .../deps/libFLAC/include/share/alloc.h | 219 ++ .../deps/libFLAC/include/share/compat.h | 209 + .../deps/libFLAC/include/share/endswap.h | 84 + core/cd_hw/libchdr/deps/libFLAC/lpc.c | 1357 +++++++ .../libchdr/deps/libFLAC/lpc_intrin_avx2.c | 1122 ++++++ .../libchdr/deps/libFLAC/lpc_intrin_sse.c | 454 +++ .../libchdr/deps/libFLAC/lpc_intrin_sse2.c | 1090 ++++++ .../libchdr/deps/libFLAC/lpc_intrin_sse41.c | 1314 +++++++ core/cd_hw/libchdr/deps/libFLAC/md5.c | 516 +++ core/cd_hw/libchdr/deps/libFLAC/memory.c | 218 ++ .../libchdr/deps/libFLAC/stream_decoder.c | 3400 +++++++++++++++++ core/cd_hw/libchdr/deps/lzma/7zTypes.h | 258 ++ core/cd_hw/libchdr/deps/lzma/Compiler.h | 32 + .../libchdr/deps/lzma/DOC/lzma-history.txt | 363 ++ core/cd_hw/libchdr/deps/lzma/DOC/lzma-sdk.txt | 357 ++ .../deps/lzma/DOC/lzma-specification.txt | 1176 ++++++ core/cd_hw/libchdr/deps/lzma/DOC/lzma.txt | 328 ++ core/cd_hw/libchdr/deps/lzma/LzFind.c | 1044 +++++ core/cd_hw/libchdr/deps/lzma/LzFind.h | 117 + core/cd_hw/libchdr/deps/lzma/LzHash.h | 57 + core/cd_hw/libchdr/deps/lzma/LzmaDec.c | 1100 ++++++ core/cd_hw/libchdr/deps/lzma/LzmaDec.h | 227 ++ core/cd_hw/libchdr/deps/lzma/LzmaEnc.c | 2351 ++++++++++++ core/cd_hw/libchdr/deps/lzma/LzmaEnc.h | 78 + core/cd_hw/libchdr/deps/lzma/Precomp.h | 10 + core/cd_hw/libchdr/deps/zlib/ChangeLog | 1515 ++++++++ core/cd_hw/libchdr/deps/zlib/README | 115 + core/cd_hw/libchdr/deps/zlib/adler32.c | 186 + core/cd_hw/libchdr/deps/zlib/gzguts.h | 218 ++ core/cd_hw/libchdr/deps/zlib/inffast.c | 323 ++ core/cd_hw/libchdr/deps/zlib/inffast.h | 11 + core/cd_hw/libchdr/deps/zlib/inffixed.h | 94 + core/cd_hw/libchdr/deps/zlib/inflate.c | 1561 ++++++++ core/cd_hw/libchdr/deps/zlib/inflate.h | 125 + core/cd_hw/libchdr/deps/zlib/inftrees.c | 304 ++ core/cd_hw/libchdr/deps/zlib/inftrees.h | 62 + core/cd_hw/libchdr/deps/zlib/zconf.h | 534 +++ core/cd_hw/libchdr/deps/zlib/zlib.h | 1912 +++++++++ core/cd_hw/libchdr/deps/zlib/zutil.c | 325 ++ core/cd_hw/libchdr/deps/zlib/zutil.h | 271 ++ core/cd_hw/libchdr/src/bitstream.c | 118 + core/cd_hw/libchdr/src/bitstream.h | 42 + core/cd_hw/libchdr/src/cdrom.c | 416 ++ core/cd_hw/libchdr/src/cdrom.h | 70 + core/cd_hw/libchdr/src/chd.c | 2469 ++++++++++++ core/cd_hw/libchdr/src/chd.h | 400 ++ core/cd_hw/libchdr/src/coretypes.h | 30 + core/cd_hw/libchdr/src/flac.c | 319 ++ core/cd_hw/libchdr/src/flac.h | 51 + core/cd_hw/libchdr/src/huffman.c | 521 +++ core/cd_hw/libchdr/src/huffman.h | 88 + gx/gui/menu.c | 54 +- gx/gui/menu.h | 2 +- libretro/Makefile.common | 8 + libretro/libretro.c | 2 +- 94 files changed, 39767 insertions(+), 51 deletions(-) create mode 100644 core/cd_hw/libchdr/LICENSE.txt create mode 100644 core/cd_hw/libchdr/README.md create mode 100644 core/cd_hw/libchdr/deps/libFLAC/AUTHORS create mode 100644 core/cd_hw/libchdr/deps/libFLAC/COPYING.Xiph create mode 100644 core/cd_hw/libchdr/deps/libFLAC/README create mode 100644 core/cd_hw/libchdr/deps/libFLAC/bitmath.c create mode 100644 core/cd_hw/libchdr/deps/libFLAC/bitreader.c create mode 100644 core/cd_hw/libchdr/deps/libFLAC/cpu.c create mode 100644 core/cd_hw/libchdr/deps/libFLAC/crc.c create mode 100644 core/cd_hw/libchdr/deps/libFLAC/fixed.c create mode 100644 core/cd_hw/libchdr/deps/libFLAC/float.c create mode 100644 core/cd_hw/libchdr/deps/libFLAC/format.c create mode 100644 core/cd_hw/libchdr/deps/libFLAC/include/FLAC/assert.h create mode 100644 core/cd_hw/libchdr/deps/libFLAC/include/FLAC/callback.h create mode 100644 core/cd_hw/libchdr/deps/libFLAC/include/FLAC/export.h create mode 100644 core/cd_hw/libchdr/deps/libFLAC/include/FLAC/format.h create mode 100644 core/cd_hw/libchdr/deps/libFLAC/include/FLAC/metadata.h create mode 100644 core/cd_hw/libchdr/deps/libFLAC/include/FLAC/ordinals.h create mode 100644 core/cd_hw/libchdr/deps/libFLAC/include/FLAC/stream_decoder.h create mode 100644 core/cd_hw/libchdr/deps/libFLAC/include/private/bitmath.h create mode 100644 core/cd_hw/libchdr/deps/libFLAC/include/private/bitreader.h create mode 100644 core/cd_hw/libchdr/deps/libFLAC/include/private/cpu.h create mode 100644 core/cd_hw/libchdr/deps/libFLAC/include/private/crc.h create mode 100644 core/cd_hw/libchdr/deps/libFLAC/include/private/fixed.h create mode 100644 core/cd_hw/libchdr/deps/libFLAC/include/private/float.h create mode 100644 core/cd_hw/libchdr/deps/libFLAC/include/private/format.h create mode 100644 core/cd_hw/libchdr/deps/libFLAC/include/private/lpc.h create mode 100644 core/cd_hw/libchdr/deps/libFLAC/include/private/macros.h create mode 100644 core/cd_hw/libchdr/deps/libFLAC/include/private/md5.h create mode 100644 core/cd_hw/libchdr/deps/libFLAC/include/private/memory.h create mode 100644 core/cd_hw/libchdr/deps/libFLAC/include/protected/stream_decoder.h create mode 100644 core/cd_hw/libchdr/deps/libFLAC/include/share/alloc.h create mode 100644 core/cd_hw/libchdr/deps/libFLAC/include/share/compat.h create mode 100644 core/cd_hw/libchdr/deps/libFLAC/include/share/endswap.h create mode 100644 core/cd_hw/libchdr/deps/libFLAC/lpc.c create mode 100644 core/cd_hw/libchdr/deps/libFLAC/lpc_intrin_avx2.c create mode 100644 core/cd_hw/libchdr/deps/libFLAC/lpc_intrin_sse.c create mode 100644 core/cd_hw/libchdr/deps/libFLAC/lpc_intrin_sse2.c create mode 100644 core/cd_hw/libchdr/deps/libFLAC/lpc_intrin_sse41.c create mode 100644 core/cd_hw/libchdr/deps/libFLAC/md5.c create mode 100644 core/cd_hw/libchdr/deps/libFLAC/memory.c create mode 100644 core/cd_hw/libchdr/deps/libFLAC/stream_decoder.c create mode 100644 core/cd_hw/libchdr/deps/lzma/7zTypes.h create mode 100644 core/cd_hw/libchdr/deps/lzma/Compiler.h create mode 100644 core/cd_hw/libchdr/deps/lzma/DOC/lzma-history.txt create mode 100644 core/cd_hw/libchdr/deps/lzma/DOC/lzma-sdk.txt create mode 100644 core/cd_hw/libchdr/deps/lzma/DOC/lzma-specification.txt create mode 100644 core/cd_hw/libchdr/deps/lzma/DOC/lzma.txt create mode 100644 core/cd_hw/libchdr/deps/lzma/LzFind.c create mode 100644 core/cd_hw/libchdr/deps/lzma/LzFind.h create mode 100644 core/cd_hw/libchdr/deps/lzma/LzHash.h create mode 100644 core/cd_hw/libchdr/deps/lzma/LzmaDec.c create mode 100644 core/cd_hw/libchdr/deps/lzma/LzmaDec.h create mode 100644 core/cd_hw/libchdr/deps/lzma/LzmaEnc.c create mode 100644 core/cd_hw/libchdr/deps/lzma/LzmaEnc.h create mode 100644 core/cd_hw/libchdr/deps/lzma/Precomp.h create mode 100644 core/cd_hw/libchdr/deps/zlib/ChangeLog create mode 100644 core/cd_hw/libchdr/deps/zlib/README create mode 100644 core/cd_hw/libchdr/deps/zlib/adler32.c create mode 100644 core/cd_hw/libchdr/deps/zlib/gzguts.h create mode 100644 core/cd_hw/libchdr/deps/zlib/inffast.c create mode 100644 core/cd_hw/libchdr/deps/zlib/inffast.h create mode 100644 core/cd_hw/libchdr/deps/zlib/inffixed.h create mode 100644 core/cd_hw/libchdr/deps/zlib/inflate.c create mode 100644 core/cd_hw/libchdr/deps/zlib/inflate.h create mode 100644 core/cd_hw/libchdr/deps/zlib/inftrees.c create mode 100644 core/cd_hw/libchdr/deps/zlib/inftrees.h create mode 100644 core/cd_hw/libchdr/deps/zlib/zconf.h create mode 100644 core/cd_hw/libchdr/deps/zlib/zlib.h create mode 100644 core/cd_hw/libchdr/deps/zlib/zutil.c create mode 100644 core/cd_hw/libchdr/deps/zlib/zutil.h create mode 100644 core/cd_hw/libchdr/src/bitstream.c create mode 100644 core/cd_hw/libchdr/src/bitstream.h create mode 100644 core/cd_hw/libchdr/src/cdrom.c create mode 100644 core/cd_hw/libchdr/src/cdrom.h create mode 100644 core/cd_hw/libchdr/src/chd.c create mode 100644 core/cd_hw/libchdr/src/chd.h create mode 100644 core/cd_hw/libchdr/src/coretypes.h create mode 100644 core/cd_hw/libchdr/src/flac.c create mode 100644 core/cd_hw/libchdr/src/flac.h create mode 100644 core/cd_hw/libchdr/src/huffman.c create mode 100644 core/cd_hw/libchdr/src/huffman.h diff --git a/HISTORY.txt b/HISTORY.txt index 6fc5d49..a6c626e 100644 --- a/HISTORY.txt +++ b/HISTORY.txt @@ -14,6 +14,7 @@ Genesis Plus GX 1.7.5 (xx/xx/xxxx) (Eke-Eke) --------------- * added CD-AUDIO & CD+G support * added optional support for external VORBIS library +* added optional CHD file support * added CDC & GFX register polling detection / synchronization * improved CDC emulation (fixes random freezes during Jeopardy & ESPN Sunday Night NFL intro) * improved emulation of mirrored memory areas diff --git a/LICENSE.txt b/LICENSE.txt index 498fcf2..5c2d9ef 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -3,7 +3,7 @@ Unless otherwise explicitly stated, all code in Genesis Plus GX is released under the following license: Copyright (c) 1998-2003 Charles MacDonald -Copyright (c) 2007-2015 Eke-Eke +Copyright (c) 2007-2017 Eke-Eke Some portions copyright Nicola Salmoria and the MAME team All rights reserved. @@ -72,6 +72,100 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +---------------------------------------------------------------------------------------- + +LIBCHDR is distributed under following licenses: + + +MAME CHD interface +------------------ +Copyright Aaron Giles +Copyright Romain Tisserand +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + Neither the name of the 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 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. + + +FLAC - Free Lossless Audio Codec +-------------------------------- +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. + + +ZLIB DATA COMPRESSION LIBRARY +----------------------------- +(C) 1995-2017 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + +LZMA SDK is written and placed in the public domain by Igor Pavlov. +Anyone is free to copy, modify, publish, use, compile, sell, or distribute the +original LZMA SDK code, either in source code form or as a compiled binary, for +any purpose, commercial or non-commercial, and by any means. + + ---------------------------------------------------------------------------------------- diff --git a/Makefile.libretro b/Makefile.libretro index 5c95884..af53f5f 100644 --- a/Makefile.libretro +++ b/Makefile.libretro @@ -1,6 +1,7 @@ DEBUG = 0 LOGSOUND = 0 FRONTEND_SUPPORTS_RGB565 = 1 +HAVE_CHD = 1 # system platform ifeq ($(platform),) @@ -70,7 +71,7 @@ else ifeq ($(platform), osx) fpic := -fPIC SHARED := -dynamiclib ifeq ($(arch),ppc) - ENDIANNESS_DEFINES := -DBYTE_ORDER=BIG_ENDIAN + ENDIANNESS_DEFINES := -DBYTE_ORDER=BIG_ENDIAN -DCPU_IS_BIG_ENDIAN=1 -DWORDS_BIGENDIAN=1 else ENDIANNESS_DEFINES := -DLSB_FIRST -DBYTE_ORDER=LITTLE_ENDIAN endif @@ -134,19 +135,18 @@ else ifeq ($(platform), qnx) else ifneq (,$(filter $(platform), ps3 sncps3 psl1ght)) TARGET := $(TARGET_NAME)_libretro_ps3.a PLATFORM_DEFINES := -D__CELLOS_LV2 -DALT_RENDER + ENDIANNESS_DEFINES := -DBYTE_ORDER=BIG_ENDIAN -DBYTE_ORDER=BIG_ENDIAN -DCPU_IS_BIG_ENDIAN=1 -DWORDS_BIGENDIAN=1 STATIC_LINKING = 1 # sncps3 ifneq (,$(findstring sncps3,$(platform))) CC = $(CELL_SDK)/host-win32/sn/bin/ps3ppusnc.exe AR = $(CELL_SDK)/host-win32/sn/bin/ps3snarl.exe - PLATFORM_DEFINES += -DBYTE_ORDER=BIG_ENDIAN # PS3 else ifneq (,$(findstring ps3,$(platform))) CC = $(CELL_SDK)/host-win32/ppu/bin/ppu-lv2-gcc.exe AR = $(CELL_SDK)/host-win32/ppu/bin/ppu-lv2-ar.exe - PLATFORM_DEFINES += -DBYTE_ORDER=BIG_ENDIAN # Lightweight PS3 Homebrew SDK else ifneq (,$(findstring psl1ght,$(platform))) @@ -193,7 +193,7 @@ else ifeq ($(platform), xenon) CC = xenon-gcc$(EXE_EXT) AR = xenon-ar$(EXE_EXT) PLATFORM_DEFINES := -D__LIBXENON__ -DALT_RENDER - ENDIANNESS_DEFINES := -DBYTE_ORDER=BIG_ENDIAN + ENDIANNESS_DEFINES := -DBYTE_ORDER=BIG_ENDIAN -DBYTE_ORDER=BIG_ENDIAN -DCPU_IS_BIG_ENDIAN=1 -DWORDS_BIGENDIAN=1 STATIC_LINKING = 1 # Nintendo GameCube / Wii / WiiU @@ -201,7 +201,7 @@ else ifneq (,$(filter $(platform), ngc wii wiiu)) TARGET := $(TARGET_NAME)_libretro_$(platform).a CC = $(DEVKITPPC)/bin/powerpc-eabi-gcc$(EXE_EXT) AR = $(DEVKITPPC)/bin/powerpc-eabi-ar$(EXE_EXT) - ENDIANNESS_DEFINES := -DBYTE_ORDER=BIG_ENDIAN + ENDIANNESS_DEFINES := -DBYTE_ORDER=BIG_ENDIAN -DCPU_IS_BIG_ENDIAN=1 -DWORDS_BIGENDIAN=1 PLATFORM_DEFINES := -DGEKKO -mcpu=750 -meabi -mhard-float -DALT_RENDER PLATFORM_DEFINES += -U__INT32_TYPE__ -U __UINT32_TYPE__ -D__INT32_TYPE__=int STATIC_LINKING = 1 @@ -241,7 +241,6 @@ else TARGET := $(TARGET_NAME)_libretro.dll CC = gcc SHARED := -shared -static-libgcc -static-libstdc++ -Wl,--version-script=libretro/link.T -Wl,--no-undefined - ENDIANNESS_DEFINES := -DLSB_FIRST -DBYTE_ORDER=LITTLE_ENDIAN PLATFORM_DEFINES := -DHAVE_ZLIB @@ -267,6 +266,9 @@ CORE_DIR := . ifeq ($(SHARED_LIBVORBIS),) TREMOR_SRC_DIR := $(CORE_DIR)/core/tremor endif +ifeq ($(HAVE_CHD), 1) + CHDLIBDIR = $(CORE_DIR)/core/cd_hw/libchdr +endif LIBRETRO_DIR := $(CORE_DIR)/libretro include $(LIBRETRO_DIR)/Makefile.common @@ -282,6 +284,11 @@ ifeq ($(SHARED_LIBVORBIS), 1) else DEFINES := -DUSE_LIBTREMOR endif + +ifeq ($(HAVE_CHD), 1) + DEFINES += -DUSE_LIBCHDR -DPACKAGE_VERSION=\"1.3.2\" -DFLAC_API_EXPORTS -DFLAC__HAS_OGG=0 -DHAVE_LROUND -DHAVE_STDINT_H -DHAVE_SYS_PARAM_H -D_7ZIP_ST +endif + CFLAGS += $(fpic) $(DEFINES) $(CODE_DEFINES) ifeq ($(FRONTEND_SUPPORTS_RGB565), 1) diff --git a/Makefile.wii b/Makefile.wii index 1febf4c..d7983df 100644 --- a/Makefile.wii +++ b/Makefile.wii @@ -9,6 +9,8 @@ endif include $(DEVKITPPC)/wii_rules +CHDLIBDIR = core/cd_hw/libchdr + #--------------------------------------------------------------------------------- # TARGET is the name of the output # BUILD is the directory where object files & intermediate files will be placed @@ -18,8 +20,10 @@ include $(DEVKITPPC)/wii_rules TARGET := genplus_wii BUILD := build_wii SOURCES := core core/m68k core/z80 core/sound core/tremor core/ntsc core/input_hw core/cd_hw core/cart_hw core/cart_hw/svp \ + $(CHDLIBDIR)/src $(CHDLIBDIR)/deps/libFLAC $(CHDLIBDIR)/deps/lzma \ gx gx/utils gx/gui gx/fileio gx/images gx/sounds INCLUDES := core core/m68k core/z80 core/sound core/tremor core/ntsc core/input_hw core/cd_hw core/cart_hw core/cart_hw/svp \ + $(CHDLIBDIR)/src $(CHDLIBDIR)/deps/libFLAC/include $(CHDLIBDIR)/deps/lzma \ gx gx/utils gx/gui gx/fileio gx/images gx/sounds \ $(BUILD) @@ -27,7 +31,7 @@ INCLUDES := core core/m68k core/z80 core/sound core/tremor core/ntsc core/input_ # options for code generation #--------------------------------------------------------------------------------- -CFLAGS = -O3 -fomit-frame-pointer -Wall -Wno-strict-aliasing $(MACHDEP) $(INCLUDE) -DUSE_LIBTREMOR -DUSE_16BPP_RENDERING -DALT_RENDERER -DBLIP_INVERT -DHW_RVL +CFLAGS = -O3 -fomit-frame-pointer -Wall -Wno-strict-aliasing $(MACHDEP) $(INCLUDE) -DUSE_LIBTREMOR -DUSE_LIBCHDR -DUSE_16BPP_RENDERING -DALT_RENDERER -DBLIP_INVERT -DHW_RVL -DCPU_IS_BIG_ENDIAN=1 -DWORDS_BIGENDIAN=1 -DPACKAGE_VERSION=\"1.3.2\" -DFLAC_API_EXPORTS -DFLAC__HAS_OGG=0 -DHAVE_LROUND -DHAVE_STDINT_H -DHAVE_SYS_PARAM_H -D_7ZIP_ST CXXFLAGS = $(CFLAGS) LDFLAGS = $(MACHDEP) -Wl,-Map,$(notdir $@).map,-wrap,wiiuse_set_ir,-wrap,wiiuse_handshake,-wrap,classic_ctrl_handshake,-wrap,classic_ctrl_event diff --git a/builds/genesis_plus_gx_libretro.dll b/builds/genesis_plus_gx_libretro.dll index f84770a3975570e4f2896d7a6ff52b22e48512e0..d7cb5e271f41c8742c19254ddc51f918bc98bc57 100644 GIT binary patch literal 2611555 zcmd?S3wTu3)i-`7nZX1SPJqN>B@z@=6crTINK!^5iV77KY-^>(s^g{FP@MsN%Volu z(K#7M$4f0*+a{z|Ykd{9g^*gv1#`h$0#<|EhCpGCp&G%45Rm!*etVyDGQ&mb+xPpP z|MPr#V9q}Ky7t;@ueJ8tYwt7t=BSdcD2fyR6A4AB#*=?;@%!~Zek2bZUNcbnbLM*^ zsvXnb8!_{)yB{c+dw=Pj_uqP7!ELwx>}RFkf}h+`aKGC%|QYFuRxqK zv{Z!CB-{?f5PtEO^SOArtM@F?FGVSk)2Jm^LFk&mK31c-gLJ0UBcqs*9d{_VGVZ^i2zc9MNZpOq(xgT6nvGN<`9*zq%X|XYz`2rvTHHtFLqG1gxAZoEMw|op%1}I~9+hwM z1>~OfqW<9dHXT) zO}IqlTjau{7WqgT|8Ov^YdwxrY8#@FKc8vlzfs$h8_r{$!S℘e58Dbvg?_ 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

*fa59+b*RV{chdTr?K9R}!b$PsW=0DrQ7mlIlX4 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

#q%IGVoKnGO9+JS8BI24|&f&4>DnOK*QmTNLP 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

6eDGJ1cE z`a_uA!SgW)^Y4kv#`6=hi}=re9d+PNnengwFv>q+92%qV&3J|ep<)(m;0Ybr2g>OB z70L&p>?)LL!rTW@{$GZDPjAO{)B@UqtoWCG1m&AB3XM_sy0|cEKZE*D*u^{uWBL2o zA5WP3BicVg3HE=_cj6h_XW}~Q8@Lzioip=4eje_BPMC$p7{VS0M)&7Y{|T!fL;WUH z{|tN92?wsk{T~PmAIAQAT>teAq3(YZ_e!`+X8c>nW5Sq+&X_$N^@`B_S;U`Ei2P@C zuEd4W{105;5^CRv_TvQ!>3s*v|F=+A$};26yx(ce`<=$T-)YSIoyNT1Y0Ueb#=PHY z=KtpZ=KtpZ=KtpZx%__?e#mIKEAE{|*o4LyD#yKd2(_VvFxH_nro#zgj6@PLhwI;# zXhP~^32BO(|EG`5u)e?3Sl{1itncqM*7tWB>-#&6_5Gd3`u0X$R zug(9>|IPo+|IPn%uLERj|D49w{yB}U{c{>y`{y*a_Rnc-?VrHVZ^_dl<{}q zGl;{)OR)bRVfuAm^+)0VgjQ&b@P$cXRGgI(M(^c#el%fjH6@IK!Gtgt5&wm=6Vi`( z6ucaJ!4am%zw2FiE;wNx8YBEs#Glap>!dJx*ARa~#kY}ugt=E?e+!}WQ%RY7T|&a| zMm~1op6UqG;~zeN=YJChpfTn?iN8-6d2dP>^WRGfV`K&A6N+Dx5Jt&VQnrV%M+xyL zcq#UPy(csNCFjJ1(F2_^@SdbFYR*pyBm4`LA41EQQ^F`l-ZB;u|K_)1&lBP?i}?4x zH#7b_c+VIZLH-k}&PfWR;aw?V%>4-EhtT}flrZ|3$}f|`sQn(!CrtDwgfaK&q#Sr7K7%+k3GP)f zni>D<51{=gj6-A0ek>`B?GM4f2qOzgVZ?u)5=KATf5z-rl2UdS?*H;Z%vE*AWd>n- z{xk1)8uNaqG4FR8^M0o>?{^yWey1_-cbfUX`M>$U`M>$U`F}3|?<`3Oqww|#VU&(0 zg)w>&?%_#j{syj331y2ZVXV9!*S3VpFW~y>?Fkt}JUZ`?kmjuW-3!jRd~N=3{%`(o{_mRuU}OJI zV`KkLV`KkLV`KkLV`KkLV`KkLv+;i$|7YX>`RMuSaW?-q|2O|P|2O~7y$*oQ{X31# z{X31#{X31#{X31#{X31#{X5O(|M~oXx)|?lZ3}FHqqhSK+M_7Z#7`q@QjJ^wFGMMnkKUbXWSnjssSWK6)Y3vOr1jV`Ke6)Xr z?hmJgvG`r=5hpDDASH~FPhgJ=A$%FGPd|xgAe{s)9xAp84zo{8U2$o_ox`)QoZ*oE$+r4?;EVGCN#vpAE`8THRb z`}a(Lo{vLkWXCuA{W{KPR6Pf4ga`xB7^~13Ep2#4F<}E*X{$f}P0z)BF$mf5&3-?G za~aFf8CB0i`Va=7F?OLdhEIY&lK5xG$KL0U_gP-!`ANk4ofecv%=?|jyx(ce`<=$T z-)YSIoo4>e{lDUm=zkG{^1tzQDPb%@_tDvxk}bl(>#@J*bj}=f#_$_bQjIYRUp)E{ zcZTmgJ>Gva-2aeJT!?!d5ms)AzB!?%C@GApTjBm=go5L6{d;GB|9=hfXJ|ZqVeOSM zVGKiO>_BI<|0yPn4d{%aEnGhx?{CM(TH?a+#aoXLj3a#s(-)+KQHC|%jE*1S9#@3* zHz$Nqe=+V)c6vf~5zl_y|M9?y=I@$!7MlO>w+yhpzti^n_gUZHX{_(>w4nZf*WYme zS3=P5uY7At7&Fj)v<#+XjnMbDloY+4vjCkjb|$V*hW!3NgSaz-;@=;J{}W0gNnuPv zXEa8!f0s}c!}vd84ccJb@Bbx#$NgUkLGf?Jxr_jOf|eK3AXXucozfDyWD(8nT7J~%1U55+a;`!W9cfrK=U z_|qaNuBIP**G|^|-(Q~I*!{nA6YVP@sLt2E9P2v>b+1T?kLFk6-rhZaI$o8M&R26r zUW5Ci6V`jNe&95}|F1p;&!8d%#lP`cabX0VAEcK&2hZ>%jJC!xhvKK>*?0zNO+sey zH`bnU-Ll^J>XORG_GF=HJ^z|N7C=qxEYT-@2PW{z1Rb^y}7{V<}C{|M!=_H+KK;YsNDX z2tj4N=1p;7%w33QRC}nz{YxjWLjTvp`bRMK|Km8N4$rt|EW9r+o2UBQziGss5fuN) zG5mhQ+%)DV2=%zfE2I01SU*FUdoA|35=Os>@!vE3@!v-L8A0(MIV~=X)k|=FMQHnI zTo@~tqka*vI!1k^Z)(j?~UF6kM{Cuzi)r#^M+2pwqGZNQSdW7pO6sr z`zC&mwX1~i7S{L>CjO4^zY5R4S-?EQ;{NC3vVZUHD%Kwo>b{HTZV|HoUiSO$U&Mq_ z{HvHS=GL)(wlaa|3}Bt;j}CwQvwyF>Kf3E{cK(?E?=Qd1|M!=E+2!$n{eIysaoG=J z82|UtavJt_JvHv73fky+f^!~p#z*mNW2|8qcuxY)n%SG@uf9WEy1tQ+(gFXx|KUpK z62zae-|v~k`~{;7b03USoZpE3FP)hG7<=a7FRMkb!F2^;zwxiY-)6K!XDmS9x+UiR z5ylV0dZhiv$Id_eWpF=fYW}~!{J63E|NQ;%e0M@n*_yr*>x&3Ye@cpvEog&VeyaYA zXV(TW^p~VCy8eps)os5IR^A`;uY^%(jP}PTg|Q2rG5&<4Fq)o-^dpou;rWw<9cWWe z^2dJ`@ncjx0RBU0fX0}D&Zw+G`V+>WF=`)({Rf0iXfsdokN?-)5%X7s!53oxD4_}G zGP6NE*XM*8XpF{T_k0~c>(Cg(XD5YG_pYQc3g4X+#s>7U z1OEEIg7`7&o`CsPLK`&30(3^h6OsOeIcSX5rnoSQpA?sZ$NI~E$(_)DAsj&6XH?=` zMk90|J?awdB4+q-tUf^|8wtm*9FY`oyNT1 zY3Bdj|Cdld7^R)Ke*$5!JT8nm=st==X!{65(B=cE4rBcSVH#Q&ssGITo#w0edYpN` z(|q3Vj+_5;?|0V)%=?|jyx(c&|J?t}?t<|{!W8O0qd0==b3y|&AH&cV2qjTmI|MKT zolzIV`ZrSl&Ht_cpU?gOcGP`F^NV7_IDq=an1}A8D2}}ugkES90Td_D{tyPCbv?*` z{crwn{r`OK|Bs>mGuBc687rt?jN&Bfr-x=7A0W&_+YX>Dh4B}{DztS{|IPo+|MS`Z z*HHf%y)VZ7feBR=abdJV_b~!(o=|W%{OtgSpfd{Zj_aEToB!*0MRv%>{+-6g{+-6g z{+-6g{+-6g{;mJd$Nt^C02}*vTG04^yeuw^;+J53Euk6pi_r(&#|*S}LiirIHVt4L zIwM>emt|7_&Hv5+^V$E~QU4iZsQZi#)Gx*X=suRA72MNL9kk8>7NIj5j)zCpn*V3} zzP>mA&+qyFG1PxXO&9jh5Qb5|7<15l6y6JKj|kn+#sVm;iVLG3`Yfsc=KtpZ`RxB| zsQ-)w)P2Sx>K9`dx{tbh!`}(x(3S$IxewY9!lct4V*amwpBQe0eynhfAfFy|9tlUcGP{w7V1Bv=6>*3LMJpI zQ_$8475B&ZW&m^08TAi9`}R=t|7_pa_vZik?f>Jb|BRuR;rV8SVbm|i0(2iGH5lI~ z3__a?pz?vZz939M8zuGM{NMaPpZ$LW^`B8GC?AAf)GtQegRps9%gt=sxNmg0%sJ1!#p2<@7>l6g&)b z2&DcGwP1adVQFAxAn(e+4D!6;nHZlq5zhcIEDfv-c3%WU}Ye`%0MmZ{|xH?4(h*QX<%g_ zzsf*6>i;h4fBcDtrGb@!d@BQksQ>j(#`B+1{|!q6D+Bpe2BuK|2T}jKQU47~11kgh zRR&g2{})mJM^OI_O9Lwd`BerAo)(jmr^N7l1;f(7%0RxAflAc>7S#U@)PKX$z{)^= zm4Rl|{}I&x6089}~4GLWxjAp3qe_8#}cIm56t$d59RukD`2 z+dSXOK+L?(yxz({9+v@Y1I-7m4CHSauzp^C^z$sAEuV9h0c-p7x9zvQx4h5QCfG6a z3M&KoQ3lKd%mb_pYcFerO%0PaU0rLR! z04oFeTL!G1&yRNA^4an^R~fLjKY!bP%X`cFTy26KGq12RkRN4WYbPd*pmH$Q9~Z`f zPsGJX^$$|A^rg6$wewRl{=+zBaw9H`;Sa>6^`!}E{AWxyUl^ASgz0hW_*YCA>7UK@ zditYDVRXMIC5)*bB!$twoDxR=n-aoU{d!WuXD4JH@!Wo8Tsr=p8UJ;>XXJ`=`mykv zf3RdsY+zzf6F%$!bp#6uGd?m zNnxyCm=ebLPm;n|{z^(13%^bYqxrK*>HI-L>VBM%^>3pbd@nQp&38ch6AGS@5+Ah_ zDJgy&XA-)P*2a`<6UH8&lDa2wil2z@Cu~ETY)WP1d9Hjs)MKrQq%d}%Gsct1e?oIA zDU5hUQW!;dOUfKL)c6IRH;ekksJIHxm?n%tV}!4c31b>MqvK#q+U}iM=F{V}{P~11 z(m$K)^}vNmVXVGCC5+y0C52J*`IIm=zM2q5HX?=&{|?=&{|?=&{|?=&{|?=+kLxAlLv{?FF`+4{f3-}iTZ zVEupV|FdfV^MC&uKwJN3>;Kr=f2Xmv|4w6T|D9H6>;G;2zpeid?8oNn+x|DlZ2h0D z|7UvuZ2aHG|84yL#ykGM(1JMz4%E zVD0PU!f5*#{=SFy@1|ty3vn-v1t~eOjPV0P-)3AG&F5gB;i(B(L_GWI;?nT&%yGaa zyk|5&0{f#0ZRaJ0u{?$S+l190V~&W>_nnk5I^K{FM&Bh#86HT;65=q`gZ}a(Gvi-b z9~Z_5bVeL|JQ)+0#)T2S2=@;lO#TG-cObO>3uCZ^u>)~wdTv5G-xZg_@5H5|E^AJ& z0qH>~cx+r4B^M-x(R?1};0e3mObVm)Cn;gHoPqln5SnrSho!SH4~TdSyeclk2-EBI z$di!2gvHvF_~?3HN*bTZ*?{h2v^6F5&+@Yc?ZC4+9nVP#qqz;&D9`op|0{iRTo}9G zNB$5N2a>|*IU^~Is<$MCu@0Rv`_`l|CI^$!^)~?{^yWey1_-cN+74rG}iZb8teNzjrIMVX8nKb|6Bjx#{X^n-^TxK{QtV+ndbjC{%_;| z{xtx(u9?%1+4#TB|J(e(e+>Ye`*#|f`*#|f`*#|f`*)hn|J(e(&Hrc4d8hjq^M0qX zxqqjzxqqjzxqqk8xqr7dfXw|njm`Z#&F24Y{hzJ>v-N+r{_nbdf9C_%|F`}>y9O}- z&s}fy8p`_r*8jKuzxDrp`v81v|J`w0|8MjEw*D_*48Z#Tw*Qap0krl1w*QaK0ql4D zzZm=fd@N%A!sq*X-29)f0krjhd=G%F|L1c6`yKz^!SmY7Wx&dS zl>sXQRtBsLSQ)S~U}eC{fRzC&16BsC3|JYkGGJxE%7B#tD+5*rtPEHgurgp}z{-G? z0V@Mm2CNKN8L%>NWXr(zNikvQeg1sm=4;}@Xt@~oFYvJYb3DKHOSng|hpDqu68|Oc z4?zfT;ra1|#Sh{9S0<#XJtlMQaalu{9+&3l$AmEjow0LHQW$e1DPeT~JSmKYOH#t< zUrPyN_A^OY#(m&RPL4_Ki{mnZFg^Yir^JLY2%S-RT3i@am&S!L`O&yAwttG}RudMk zhzn&bE+w4_89WQmo1VvSc~<7Vz&8;;Mso+s2ccskDUAM)A%6(%KTHava3&>;-CyDv z0)+ngq|^^3WEyeUME^}mC& z1)Z_-0(}3e{^$QLApVTm@suzQbR>mQ^Ma%>)}S+nPE87|(f*26dR`e5Mnz9dN^g=`=hNfA;_3sT?$nqtCh?4W z#`b5?ei16qNBc>r`4OIBOxXHcTo^0wh3B1u=YR~yrT(jNS?Ves|pbKSjOYT^BI#cN+74r*K{J(z<0Gs=F8k_rf z8k_rf8k_rfn$7>){J+ir+x)-H|J(XMTmNV4|7`tV<`{tW|E>RT{eSEK`}P2^wf|0I zYyX|b*8V$#W<>v0PjKXY2pj9sn&TzR<@1 zZT#QH|Bv1A|LtF;#7E1|_})LaFVMI5&mFh@f42V5*8d;b{eL?TMjw{o^L;(u^Xj-T zx<4KlA9LSN$@*n+FLm!vN!d^0lsfExWYoVWE+a3({>NHe=RFU5C0&@dkFo0^F=3>C zHrMO;hm*o6dk5k`Soj6@_z^n3iF+gv279r$oiK1wQYv4ckOjoE??rLxd}wC;H}Ia3 zE6(Z17GE0|M&nFe7zG!^h0%C9&L@P?$7jUPjZ4=H6SDYDl#_=cubVUH0=xczV}$g$ z=6XGLZc-Q(pH2y5WF;w-g_MjC+WQj1=$T1M-P;nfg*XR9@nGKXwDiyBdd;GH-KbPOJzQ5C0-`{Dh z@9#9$_jelW`#X*G{hh}8{!X+0zxDsE|8L{}HvVtp|2F=gx%S^(519X7H%-#7ldS*G z(}#`yJB^L~JB^L~JB^L~JB^L~JI%)bZT{cp|84%?=KpiIQ}%nE%`Q zKU@FjUjxY2{yB}U{c{>y`{y*a_Rndy{?FF`+4?_Q|EJe8*&$o|=d|q4XTLZ9H~%;P zH~;tT0bpzYokrLGyS)Kq?Z4C5+JC3n`hQ#hZ|nbU{lBgM$F-d8|Fivnw*N1qPs8^9 zIc@c(DKDdE+5SIU|HtNq2Nyd(R4A@=w&MyIgG#zW;-QquB8JR{h{ z!hw`@{sMc}3GshpjF-@W=N~VRvHnEWQqXe?r$Z_TLfK z&cpL52{qrt^REe=zeD*T)W16}L(fad>|0R|zl(cKoRHZU=(ul87(>t*rQ=Cqgx{MI zM*ELZeh4K?=)V%`UyC(9gyu_=Qr(}BX~bi<6Z0k2nfc%QpqMab|CSUV@pDpAb#u-l zbRYe1P>Q$$FBq4xO>|8$3hrxBl_(EySO4c~Z6r8xP0+dcx2n@co2_N8%ZM zgk5Ni<@%&B<{yPU1dsN|zYlx78RK|1J!2H@10!4&6UG#DM#H^h!q|b%n7uCEJRU5dcIici(@Yj>zf4Kk2&{AAF8Z*;^ zdB4-r(<;|%=KW6ddA~bu{-2`W@2(4&_dAVwzthbB&Hv5+{r*S2-(4FJ?{^yWey1_- zcN+74r!nt$8uNaqng5&roBvz?-}?X7|F{1Cb=Pv6|6Bjx`v3kpfLwk4^kdflxAFh~ zWA97gW4hY^&m@y%LXZ#<`-p6o5RnjjR!PX#B-EZn7739XS!~6G+P7*^yHfjBw5nPZ zMNyQtYAISpRa;wYCvyMaGc!*z8RkZlx4*vc-#z(!^L@_poaH&|U1mnU|8M#kfYiNz z9w&A0pT|kv`{!{|_x^dDeE(m*|1aPFFL}?~aQ~9p`+1zyy?-7jb?=|YN!|PBaZ>mG zd7RX}e;y}w@1MuX_y6VR|MK&H`T4*6{QvoDf4&dM*Z=bMztkB(-v3`bZ|DpqU;oS3 z|MK;}eEo0gJwQ|M{_$}6{XhBnztp>bJWlG}KOQIb?jMhn-~W@}|C8VUm*4-F-~X52 z|EFsfLzb`q`d@zjZ|XCEQlI_faZ;cC<8e}-{o`>`pZ$~H|Cj#kAOBpS)Mx*A zoc#H}@_qh~;q!l{P-nLEXaD#;0r~o0`ZECX`~ULi|D@gl_@|%$7j(jPfdtl$tS?C6 zuu3gR;Q~_&Qkd+IcPu2}II6xNg&h^tf)qxXsRb$I`_&hu;QmH^K?>p4YC#IQ3Vc7J z1P%w(7o=c28o$3Sf$0_T`8ElJn&UfkC14BNOJO70FNLdUzZ8_PzZ7hPP`(6IW9kc1 z$g;t2OiQ4S5}$dOfZ?@ZS>)uN_>E=>uwK|dC9n~3Qs~j!NsxkbA16Tys=oOAK47YC zp~3Y9Dcpnor7)@z=9dJn!uC?|48c285{S;nZ@@|*tqRV75*THP`bpp_+AoDZn)-qi zSY>>NwFGi4F#jds7g}GCg7?_^f)v`@;&-hi5Nd__FM(N|>kCr2iuOxkKH4q?C2TK+ zMLwZHMoFk-$B)T?(e=#mj~-?&l;(AuiqtpT9SaItfmK6s{s(3da(i z1WEKq{gO=2f2qBn$4Tw|JWguw=W$YdKaZ2z`+1zy-p}Kt_I@5GwfFNlslA`aN$veS zPHOMxaZ-CfkCWQ_d7RYV&*P-_ejX>a_wzWZy`RTP?fpDXYVYT9QhPs-liK@voYdaW zPp|A=(zd(JFyEh?BxBJNyQi1fr`Ve+jr(a}rJhrs^-X z_wzWZy`RTP?fpDXYVYT9QhPs-liK@voYdaWxK??1wyFdBuF9J64xJArsu!B|I63^QfB~p|Ce4P zE(~`Pq%e7elOP4ZkxqgX9wA-|r{2JKz)0ZmDBOP@ZF>I8`@eksFLefx_kZd6KYWan zAO&X)?$1f!0^+1FC*MhsLe^O9{}M`XhnxVYvRsHHxYEFYo{I{x9$UWuO11=GFg7xV-<%`@g*Zzq<2Z-v8zO zU*7*;-T5!?|MLDX@Bgpv{FnECdHL2IMgyj{$iM$YVer1M(P<$ACNrL2IMgyj{$iM$YVer1M(P<$ACNr z!Eki35-QUr@Z=99F?DCzlHebp$M(k18}r6Z>Flt01@Q?$46@UuPlX{-E(g{a4oUNBU%cDu-CA|G7?i^{E^xU+#aJ`8uZg zL3X14ko%uTO!@d#U;kkYDR zn%*U3kw*FWRiFRmv)=!{_N(6iwt7cBN&5jYtxv}DnXZ3HudGbvkUo_|OzXq*>z`k! zCzSqeeX1wbpXy0W>$UNE7M&2?!w*W-KGLW3#KwBG4)#dvk-!gN#{wN*kQ#xW({rI2ie=3K{r}08;djCvFY-w4VRBtpC(+Wo3E(%ky8J|7tbOA3Dzw|F@t2sNQ8|dH&1upT+=Z z8u!GdjekSkvglJe#B|+4T-x;u=@FA2@jtCk=K^B7J}0L8mGoSbo@Zy}XAMulq^0u& zF{LLq)}!|zhEE=zp9Xy@mzc^WHkA*RU*7&JuRiq~G4&hqKiz*+E-{r$Tw3{LcVe?=|I_-^ z@5I#a#HRX@<{$MtF{LLq)sHm)(S_x5QlcFQ@;`a)BQ)~5>vUvrIkbl;!2wEO?Y z=ReXTE=`}(5z{(MT-yBy(jz84;(uD7$|0tGfSCH#ct0_I{!8_w^u)$`w67RH|1WF# zQlcFQ#**sF2?qx=P#s3OnSusv_6$XO!Xu-)sO$F{-<(?X}l1Zc77>u|CLvt z`i+?ENc>OtAC*f?`qK}BreVVq(@A8#Q(HD zl|xMZPAvDo?gT*gq5h!v2dUqPDIGDTH@2s|{_EcVljlE;939iRA^xYw50yhqH|K%A2bbg~eXdNRqy?*L6%BxSGzo7DIo)DY9e$ir=gn zORGPX`)@JbAEEN8zQm^XkI(C5#L z%OgGF()5k{kNTaswEm}h|F5##|GE)C{YU*yTw4FrI3s*MLCOJThK zQ2LkEr*!`o|F_M5vL7+k@9)~btol?A@!uVPwB8fbcr)Hddf?^Bq7S|NTb++`$-Yzt zYA-R(8{_u;r{+JE``^OU@5EFuV>|Hse-vlPq(@9~FRM@K|F8Iez5i+bB_=zQ{VALn z3w|{7157y5H;$(9PxCl5I<$vz8t$ic$2gAcO!La!)BQ!4PsVEhxS#4p1yTKo$sW{x zTF?Gd^S`KH^cA3fBQ{kJi>83NspM?O|4RF*{$zLJSEc=O|LaBo z^*gcL|2hj8?_;!o(7Yk0c~30Qf1L$P?SH1`-OG+Y(l77+NBK~>#IMTur}0beCVo}g zFZaK^{_`n!l!dj6sN53efIeU(?0U)6q>+bvr_wt#E_ z*#fc!WDCd^kS!ovK(>Hvfmh7}bl>(>WqR)Ms`9Ja@6_&Bwcn}TWQSLk$quh7zpDLC z?S57Jo!U)ycvYF~@T&5w+V9lvSGC`%-DHPXmB|jTD!;1zPVIhG`<>ctYzKOeg_!P# z7{AX!-``VSeJY3QL+^_a8^1R}?}hTuKlqW70aJa5>GJ_p4z&lLe|P7f|Dt$${!i^B zHdPOLf7PI9tw?&re^;N{M_k(bug2w5yNRiNrrJ;GC?85kO!hKvkKF%cv64)7B9{AK zH-e1qLF0$U8Cj9+MJ&&M>G!|MZp1X7iRJmPvjB}VTF>P5U$_6!IHB=Fb|NNwnVP@l z)u(c(e46*f^8AuQ<7;u63gqqy#8|w&^k-&IqiQmPG}TSI$}yM zum8H8h}I$b`p?r>jX^`>hnU6@k31WkXT;-btA}l z9h298-T9Hm2{Fw#Vq?3>>%ZOM1k#Zxfr!M?U|RJpWPu$t+tywt#E_*#fc!WDCd^kS!ovK(>Hv z0oekw1!N2S|7(GN>;50TpF~XeYlx-p|L`AhAU$Hb-$ZQcK9FyyuOI)>CF)U1XUwMR zLHF;=t55f>=)Sfwm-hUh+D%OLB`(c=RDZeujeB0_H)Th;|Nk@Z|IoN4CVLZ?HhxKu znC3k(^{R1x^8DBReyBYEbrzs;V$8zM3C zEU*94pZ_RnJx52f8*yp&qwy=B|7gaRWK(vO*ME8am)HN|{jaR+2kn2PPxFmfYW?yf zB?G4QjF{F(Du=EM=<_cWPv^Rlv)|LxR6S_^lRoj^)u*bH{@=a+Cw*dSH!8_79r3q%W`kWHBAf>%YAI^D#i@Gnyat`7fG3#I)}b)4Y<`f1L%4_dl`| z*^lf*OzDl+Gx_|dvlxvpVzLu4t!BpSn7sa%{QM7%Ke89GvEAhPU-I)mWH(}(&%`t? zjps9+e<>a5Q##_8o&S^%=@FNvPw9xM--%1>f6^nSc}Hw2ANlhiB|rZm_rLu4FFpon z9ub!|e`($mlOAzt`jn2C<}0y0|E16WWH(~68*yp&qkfa;zdZlt`5zie=LTX^^N7yx zG=J#&l=O&8)2DeWfB%cl5@avp($+7sA2HdT*i=69`A{>$^9 zj{&;BL99Fd_2`kHce<{FjyK+)7OAKC$WbU#IbJwVTQ?en9{UG}WZnz5(h`E$IyK&ECv7;u3L7u4i= zbVS`c3RTTJAdJTcH2Y#{d$T5!I(_5x2KA zSGPxahsRak?u0PEcPdQmILTo_$M=IBI(_M7;cYGx(xF+v^9e&u@Slf07 zZHD=K!dI_Hzv<$*yigaeO`}Vzi!(Lu49C}~bIbnL_(D;9%oL5=uaAXm$L(?Oe`@SC zVKc;j3dh1MWoE%I4)tQ1vZ-Ppg8Jj3Z zD_$%7!2JBP_O^XrYtAN!A&QK`Wb=N79+eM8H%EMX#gsxv^DBkkHY)fhi_H~l3%@c; z7vn0Zqnfd4Vgtojg(J;wi_=whkVh(d+2gFuqYX3!)F3#_YtM%BfGswRT{?h)!%h z`?2t*()np+AA5E~v}K3b*23x*r=QI9s><$(&&11YN?}WjWltu{ij|qoF0M#Wsi$3RR)nf<0ZKROwQ(orSCYoP|q?&O$z511wH(7VNW}1@9bZVTa%>Y|C~QPGvd^HwHTk zet;5wqdXOGW^i;=;HLzBGO&VE!CAvqfU5{+16K*IGF%lnez>-Ss|r^Q&K|BhoC919 zIR0p^CS0vrwK#Dv59ZN48BfmDxH`{hoq8w+!aj|7p8|r_h6^HgH_qtoRSP@hpp-5~8yBPYJo$@mg_bRC4?vj9H@Tbi?HPo6PzEAV4*Q3n5@phVu50Iz%nzy_!c@R9!_$J6q3 zl*S%1-!B}2T0kA39-syc9oOM`^0Yi1rE!Mr3h?jqZVWU9ngN~wIj+Zb)BsP*(@`34 z$gKeWed28aemLP9habQl*Hr^thv&)D@^q92ha#+ajD-SSfN&rZhz7V*16+^m_yIgE zPe*CuAa@6P0KI@dKtCV>;EwD10bGaY$__tHi|GmdPo$H4+nT94Fk# zvTCTXvb(dAInCSWY$ZN&s+wqPWAWELzaWL8oB7>$?%qxGpJM*!y*t$u3J3P=QS-rk z-8p;q@gocHqtC*+p-LED`5~XJJofpc2I)92@pBUMzuo3ZVL&r}{?Fe7e?alRl8@n) zAAm5pWjw9c#f@?n#sk}ctAPDztl>aY$SUCH#m++iMOfd#9{_WJdO#syzt&j@0&;z#!-U_3A!@!P;x0s9Te2gn6h0;hljh*xezUO+N1 z2RH!S1DrQG3$|;J7kE6d4Y&%}e}H^|T%Zr)SAtIg%FW0JNCxHr*AcfC;0E9;e`&6a zJA=-^rTm{&s^b~h+P>_ZD4GjtS;O;R!m*;=OSfy$-o@F-m23aPPNvdA1=jwl@W0sc zU70&$bMdt*0tf*D0StQW`pxIG1)z5d?a2bWvC@@gpS8A1IIX zurFX^Fw`$jZ>CRgj`UhJ<@0(f8(Uj@zT_4;e$;`7A9Hwm{I^8?_$kK{-AUzonDLS*KjlSr`RO2GW2&+|OKu@xUw~3rGfTC|raK zfH5CNn99sWm~7!9i~@`~4PncGXiFC%2ry<(grx!bRxUy=V9ZK{Ee7rYXJ5d(5N5A( z5p1kogn}3Fb%Z%1?h$bP1$+u&wiQrEV3r=oz*m7szz%)bqss8>VN=CLPy^mTC~&xv zi*O3)133*C1!o>FU@+%bT%s*B(VGzI*C zQAj%(h=ZH}9K`3A&z$M5J!CyPL2>Sr;{~i8|z)4^da30|k5bj+ac>`SL*n;q6_=f}2fn~rp z;4p9ph(kQh4lQHl$1-Q7(oMT6wsuvk*;jX{;aIa)?K*Yq)mJxgYUu3Z>gL|4ag(MV z&6<0*@M`Jp)2g*^o3`!Rcj(y3&p#kAD7bS-Xjqr7;SrHh(XYkC#&zrddXJvHdiUwu zFFql$e^PQv>VUNLfrByzX9`(EvU76th7KD(V&og6Mvu|tj~(~s_z4pyO`bA!+VmMS z-`Ah2b;HS{qUo0A8-HV+OOAt z`~8m_H*ej(^XFf8@7;g!@X_NZPYa&$CnhD_e_{JxuHw2@tgPcAw6BXX3+5;QY~WV| zO@Sc58<_8eH4VtsV!d`M@k-8L$P|3mgMBBJJW1 zXg{z8*bAHlE&+D{=Z+`?SO#nZ{D2G~AD9EIL>k9VItXBnB;a*@*aM_F<%c!JAL|p~ z2lN0QA&kb*h0Z8H1bKkn15u|S*g61h1#%JQ4Wt3w&%>u9?PB;Vhq(w*p)NvoU_Ru1 z2>0#cB4qbx&63iRS+l^>T4C5gf}Sqho?Y z{G+u}2*pN+ASu^~j*5-b#lCEQ%)eVuSQLwh3JPwa`yU_U|2is`mx79Q3udt>E+{NE zFt%rGTyO*niwp|xq4sQ{7h15+Vd23nAS}{9rYH2{qGF=L{aJEiZlbO|Y8OwhWVK7< z9P;Ws+VYxvd3yWm3T^Jy(#MPG+NM=$%k{MXs7Ox};U4~yvP;qBeRlZAM+@@&zPhQkY3!OWOBQ{psj$*gd#jN5_y zEQC8qN`-~OQemY~DXfu5d(Ok{DGM`8Gb=NdnKjfD=Gya;xrMnU?kK6ut&tIKIVrVA zD5a&+3P*iwWUa6;voN>7smj9A!pcHrVU5BRmbe*ZskG$x0j(@mmewdPI2SoJ4JwyfniAUOz)Wub-h`SHI$ruYb6$nC#Xyx~XNO>Zd(_ z=(wQfH!i2@E2BPWP*~%#gOvrVd!o`eZ+vV$XC$?tBsZ(xKv__)X7wA6duv{EXi+1z z`Yi{$THn{KTXTH1A=PR+Os=e~5oEK+=7eLQ{Z^YD7VRxhTb{8zRP(Z3H~Y$#4Xqrl z11uU?Mp)Lb<5z9C<$dc|s}5D#TE$!6u-au=v)UQoWy(0!CbRew*HMNw_{)v4)piQj zrwL>CaJ91-n2j5cT@n5Xun@T9!&sgNV|Ovi&jGeo7#pv@GW-fxLaXsa;YZxj2})$F zWh=&R;ez=(bgJM+<)c8xjs-CG3^iC+i?N;k4NGV22b5LWm9hCK=X)2%UIPknW9+mu zV|GrAJw%){aGi&@!2K{>!Tkk%g7UM#uQ$Z?IIhZC!2c^`40?7M`qA!;ebj)l?$f!okOgYs*m{F{ht2;4*XLzEwgGH(N)qr9QuUMRB;%4`Gw zZ;;I(pM(BD=rn7@*a}OOX2sZj@FCRY2Cqv{(-5jdk6G9^0e8R_c=Q(bXJ8JH24o=& zcLRdh2Vet)Zo;(%;ES*XVASWB<9o5c@5WghGG{`V}9rg7%rEdq- zMUD2TcXbSBd%Feu2gZd(MXF$Ho-XB(bloQIERi`HDLr1LzkOUL6|wvmqa)|P5o z-=~GNek)Yp*irdvZ3CY#V2-|ix_F=GHfV~+Hr~Pu8@#bA5$}ZoZ{#RG#KXs@<@3>u z;-h0cTC{2NT=7Nm>JSfa&sJEJj2!9n?~yf52koC?47S zc%uuAqKoPm=i%GJv*mNq>=EqCZ;Hivc>1GfO(m5BFxzJ8wHx(HZOpzqrP1~4w3 z@pvpXy8L~7pG&~w`O>4+e?EJyK9+KAypLqOetsC$!26VoV1Y1hf9@zcC_FM~nge4} z@%{Aiy80o1&*vuy*Ds3KO-m|5%RHXfUsrl@`TV^-Dxbf+_o8?zpT}#bhi9wj?8oz` zcz(fNqHuU9p1%LcFuu)C#qm~5gVU`F&qn!wjrN2q>i#RL@NjeOf2%4utBFfofNE*T`;xUBiQ8wVmaS z`Q(91q3-F~xp|4|n8c*?%mLa9CUtCVXBOKnIygoh8y6EC9H;Ia77`j49OH#i>eJfW zlOZ0n9qpEj;V)^%4VHd>x)Ag?e;u?4 zCDZYO-HY&P&`kAB4r~gPO zpMLxCS^EAfef*T1!My+Q?$Z~3d}zRxuCGhS|KCIZuYJnr|Dw92{|sY>gYu#ASFB|q zLEjzgD`SUemPcQ$UVO7W`k#6>u2UX;MS`7KdGtkbe&6!wd$nvbsXY4gR?k~a`qXd4 zy#J&e??2_(8WyJX6)&NWw`3M`{S7FH$|deBrH}EWt6S?Vu0QL$=k>Mqw?*WOT#^3V zcIDGQu%tZtK{jJQ+A3L^k!GB{(An&j^eq;W$w)MdZzS6 z(cD^B{t=Vq^F74aQTdEbsLu7fRayUn^8K{sbA8k0Z#h#IeOA2(eNoIl#r2csm#uu< zEz+JJ%dRihEMNJ(ZS?woYy6V^@V3gy&?r8lipM`rdGHq<3n7OB;edfF8h@3w>xT_H z@_hN8%e4w6<`3!Vx!0GyzNB2A>wmpI#cP@LivqX2OJZ5{MKPCOhHKv!EsMTd{l_-0 zUk50QKHf4l${gxpRsQqbA9ffv!5>bx&N~au0cf6tCd=OdkE`;n z=5;3?`n;Rm%2hbn-c{gCxX{{F_`3-1=qfY?ssT?rxC%c5FO$b%q}!~=%cTELr}+_W zf8Hv^Au|%6gy6Euc5FUli+l#~P208sX6RFr`!v?9hHS6KzgA|O=Y#yXy#MDtnIuOITrrm9zUdw_NPd0M-f<*v zyEWO50Jb!IInTK0)`)K9&@_&P^IEmZB>&tc^;42Ne?4p! z$wJ#cziZ`uJS(!XU(aQK$W5FkA11kX|MeMM=6!UmQuFF0KRguMkL0XB*PJ8yf%CzK zB=?ze{XEIH2IcJ|`E}d**(47>{zogwReAoWE6u>?`*iY|6TUl1_MJNQb&_kRcDV>y zVT*sK8#T8EnQ?iSebi=>SJ>35%Vj(K+aKEfYmhmYm(Od-XSP|Pg7m2~p(_`&?1 zr#Adp$R%z=t(;`HyAR3Vrw(aG@||tb2T5+=i_q`Plqlh`F34jKF+n_>*mh4NIu=;j@Bl;+;?lLyHohR&(HHAtIdDW_J9Ri8UH%e+wlg; zCpypMYptz6{&hMtPTLkP@A=~UL3rcVR-KP?hWhwSlE-E|eoAs^!S_8#uBhD6g5+kR0N_W+%x%bhvk#cCxkTO5yiUsMe9}F|=na$*sGu!&7Tr`j#J`f6Npr?HoB7@MJZ~n>4!` zk$kE~PxPZM&7ROBFuk=lef`UyARoxE|NO9KS4nPufBO@B0)RC@c*T#~+LIixYM>iG zQS$UN>(8yD-TNSa|E}*olIQ)lrw_^V3*X;K@<)-0{KloWEV~oqJxN|;ov@MQ*WD(p zBzcuke+S9=nPPjA2RD20E6L7zGiQ-}cS_$?BtQ1wTBN&a%KUFB{H)K$qWsl)<1#4R z>fS6zlJBqX{0YgC1U;`s_Fd*{B&%w_raLFV zR+;TuR;KXvJ!=)&q2j31{1XRS`+R$LN;i@-u6bS}IdA?L^tCR{x!c41NZztNuE@@} zLJ9&Xy!Ia<2T8u+K5Ze%`^RiwPjci&!G`2tzlzbGd3gWMuGpp)g?Fv|&IcraZoj*z zT|3tubE5FW2_7GlTw}s}Ka!ldb<0mA4|P~NfaHC5KA%qVk#^0RlU%LKDQ;(`W{mZA zIB-@Q4*7B2ec>dhUTtud2RwB;MDlN0yGD{+fA_=`lHcAHqU%%S zf9}DvPbqvU>ou3;*x27KNWSV-_ZyOfh0!`2LU)s$au0>aRC~Vx$(C=&_a?c|==VP- zdEj>zsU+|GQ~a6aux`nABp-cLc?`*(1Ao{`a?=f7V@cjx^Xt7NzggeYipyhBAMRp> z%=9F63w2D&;KZEVl~Sl;ZpCuDdW ziTCL6yk8d+7aFV%4Gszk4vh*?d+ACn`Tt&bT!-jk^SY~0#{lgiM;jm)@^}MmguK@P z1(0oe6eARJ9|Np~yb@&*u0l@h=_=$JU>4+M1~>rulmQAL+x9AkH{>7#v^UV@`SdZ+ z<@tmI+mN1c3i4G0sCv5!Ti_?Cjr_hw{x~ClhLL}=k$*b!cIo3PIQB)|fH}Zs;8&nl zKUbjxkdOEt;6-}*C$J%&z@HwkOScbfli(`!1h^hyncn{Z{8nOdIK>_9?pbv%wbtx71?&!H}2g{eOX{4k(V} z`d`D}CQTPM3w#c6PA{2epx*yExcb17aXsNbpbx7($W=%NHUoz3y>H+T%P1K)1O7+) zu&BX!W(-^b4D}mj7W+@3&LwAEu`ehREjMU_$1NyidlU#)zz~PCyI9}$9T?5+yb&}_Jzg5v+ zCj6SE8r$gYF3SgPoxX3=H(&pJ`_C3tZOwALVw^sXnG^6Z`*i;{vmM`j| zx!t#Q?)}NgH8tn?PWtI#;jc^1>^gKH^p_qJ)7A|4Qzbf@xi|DZcI4){nZIp*96BX^ zL4|cqKE2=TRF_XizB_P8t>_9Z+g5G-?EHnJd!8=+W5l8!)7tH-e*3obL+v(MS87@AOB#r;n$dU9@wf3xYOI{R$u-|i^( zJu&L1MVmj{bMCE2@72g`HKto+Zok>hKJ55S1A56nU}|vl9oWK%po^`zZvTMx80-s#Ey_!?II` z()yzf)YmFWNKQ%8%Txh5xNi|DJ8k&~B| zC1hiPWV)28>6yu}N^YXItyC=vQ0JtNOksJMMOtcn)I^Qkd97e3UdIfWj0d5>BEyk> zQ9w>EYRHPKl9iH~%-?ll=&Hn=5t&Kq;<)robyl`8fVaIw(WyfA;KbY)Pke3YvVK0o zI$#&@6>tXl4R`=p#QO-<0e7G!&9hQo|Di^KrklIK0Av0DhO_C0%+l22^@dVg`CDIYpg=eo_xg8IjXeos%ZyWh84m zFfB0)#%oXkdG=4wLV*j{}v{d()Sf~SAoKl{_^Zw~DL>iDdAOBYO^Hg3Y&&8wGh`{=XXhxQ)% z`uv6OzZD<-`QXaco4frFEiI=1m_ z?c~z5iKRkSrB+@0Y9Fjyw&uf+ckO)l?fLIboiYB+AJ3gU^TokqN3Z>S{q~b*_wI62 zSmfhfet_G*Hkdy!!p#b12e~D{Z^pI<+CX*(dw|^lJ}8pFsbGFXI34nE@M!QbfZsTb z2D(9x2YNy73XTK^0sJ1=e&9>U$ABY{&w?+4&j8;-=0oj1WD&s46!r)B78o~K*w2uc zfmeYy1M4C01b+_R25f~q8{jt#`3=4WkSBv@fF}XtAis$Vy@@yoOb4bwo)2CEo(H@G zc?<9{1fB z9}o;V3g`m4H@F`-4tNc64loq*C}0HSH1J^X0H8nQhG184Q=k!KUvLL-YrqS#El?eD zeV`WPir~s%C7^(8j;99r&K_n1SVMLM*9F%AszUYzd?0rM+CpvuZU%M+8bD3}r+@`u zAmlf|W5Bt<5XiAWcgTH!o{&Sq5#SIY0P$oV+vO~62S3z!Od z5qK$h4)8YQkAUrvcLAS5UJKp?UIV-j`3m?N_y+JBh5CfTi1||=(1{eu>5I7T@3?xEUgI&PQfyR*Afjfe| zffkUf0S=Js05u`2z?HyO0ROgxJ{MhuW59JF4VVvj|A=b_;3Nmj@z+mpTWB zfz0Hb7v*83r_Hi|iaKRzN@m6gb#nU9^qh2@NwDs#eSCe@If;D3MourR1(k@43UzLF zV$vYBdv02au5LJ;@XLi#+rUpTI^E2?!Tqr}wP@{$?~WMmkBbjDgK`r`=r=U20ZQn2 zK37hOXli8(k2Y=8g0={gw$YucQgg`OFJTHyfLFb;YD!L0c6yffylR*mx=nXv?-tkD!6BPatVUeAq(DI<5u*eYR9~~VY7Kpk>MdI@o!CmA01Mn&I?olxTVX^UnQ4tZm zzWDTdY$!f^!J@+go1^4kv_1(awiPOq*7Ffu`nhEKtBDl-fNt8?&Yn`TAoCZp6Y<5>s)Jg$qtx z7e=Hcrzfi2Q<@EErp`$0pOS$~G+ZlSzX%NC^9PBO)rr};xEs}+?+t2P{qYN@lIn3>!>Dmy7H1#>SE5reaY9JDEXM0R=-&oVb}2py#Bqu#61sl)8&pT@`f=RA&eS1itRD=)C?JNQp+q=H?}* zW8_f`?=y1h!MOed!ht@(Kwua!9#{z+0?q=Lfj@yKK$T2f`vEP1&OjnC9GCzs1SoIL zL631S81M#~0?t4kz#gyxlt95F+^+;~09Szvz$xGuZ~)i^%z23WWJr6!!cEu$ECwb6 zxj+IC4)_AjfGtp@Y#D%^y#NM~c`CMbadTQ}hza09psTmVi1 z$AAOCE?^t55m*T<2Ic_Mf$>0}DsF-!@>yIL^#XE%1Rxyn1)Kp}pr8)w1)Ku*0vmz( zz<3}F=mUfTqiUj^NY8ZNo7aiXO*JwtKK^*e?9RAy!1{aJ|3&viQ+vA!!+}xpZUUF% zz%76${oDjs`0qnL3vk&X!A)2QxgYqzAhZ!!Yk;|sIe1uT4%z^?8{tug8}668371Mi z)-dD&^Z_0Xh3&y=z#CW#|1RJpa205p>n1D%6A}lz34S~ra0DhJemZzKkgWIjn1K9& zI)FFe4p`{H<*UFkU>7h4*aD2!gUdT+pgdqQkPMsz!u8-X-%8`-bt`9lP;el=-XkVH zHrPKVFf_h%R7`wCaGZaTf1E!b_b*I~B{#?*)eF-YUU`-g}1;{^Pg_rjzcm z0nYiz7|)*gGjbfdiytrH0Ztme%aUp|47UM(N!DwrFfGECuWW)x)GL*n^<~ttPpjkM!E2bqFJ15)%0o!?(AJ_TQAuN#%$sUc zGPI-yOlij43*ighg){HE3rpT} z7yex8F7yO~m$(aS;lDk@UC5j1E_?_KhWzj?cVW~lcVQy1ZN9r;w%A>;T;wjq&v6&h zfw^zH3p;?5i0=%pgM5PKx(flwUj;cHWgdlWJhr&smf30FiB@42SmW+N1>8xfh}mj` z8C(f7nZJa{?@5?)w)jHr8WsvgH48gd+d^S$XJNr=S}2s&E&N$s3x%Jpg*kJyP?*_U zG+=cs6zZxL)~uF=LgipFmighP1s?W5e=PKCa(zcT3oEW~S=}O$>nGS+D7n75y+sSI z?^)HN64$qJu-K>7PvDbR6%E)jdsPmrYK6Nesw}`03(H<+YlRuCN&wXGF9Y-R`G6n% zmk^KDN!0_u-5cv!teRCj$io3&_)juBD?7+(fIIwKz{o%~83={{4)n3Isp0^8R$X-k z`b{8X@T$BKe;E3eASVOP@UI2)^y7gb_^(5s=hp|Q1OI$xZ-v8|Y822O{NT4nJr%--1$OD1K@NWZidrk$qz<&?==tLD>^Hw=9KQyJ9 z74{3&PykQWtdF65j2=}g;0pgnFt_(apfmh8ppVsGg^yLJ@KnxvG0IPZJO=0p{{@s^ z8#3|C{>$9|Avab6S6a{CRy7fd=ru55^9q8VmTt ze;M(-K6q7LRTKVq^!+~q{x93J?bWU(o0M*$t@9Y*l6oUH{_= ztjY)RU+Mcl1%4O!*MqseCIG?k{|Iq=e-j9V{~Gjp|Mv!9XX|(M{r?91 z?chJH@BcyYV_aKr2lMeX4d@F01L*Viybjbb=>K8xw?_Qe`u-mPzZ?7?fO&b7fDrg^ zL7&?bk6u)mx7JJb{jY()6Z}8w`yWe}syY0hgZX%R3y6ZhP~ZQi=KntA&-*_CP$T_v zFaz=dKlpz}Jn#P=fFt~G>-&E={J!viqwoJT_}$^(3g-Pa83={{Pw4ahH#Pr{==(nz zX`GRM9hj#d4+O#g8}xa8eSkXfFVOe@DEQmMe@@^38SpoS|5LCHFdYbo|1tD=f0~;A z2lf5mA8DMBeihgZ7zYHv{|oeafAj)s!9Q2u|0CgV3;*}}{vQZ`WB5M?b9+t&y1;)Q z`n>;5&Hv;2{!c|3SESzr=JuWlbcX*X^m+gH1M0!QMBo2o;O_|kMScHg!ru)3-Qdc= zOdt~eXQj;l{m7r!HxX!n^eey$U@YJd{}sgZ`t$^9!av(+{(qHV{6DJi{}iNgLHZ3~Zm$VIF#LZ&pZ9-Xpf3E2^!+~?{tob;*Z2Qm_&wm? z39bap03zUj3Vq)Hrsn@4eg7vRO+%z#1Lo=91Onmz75cpYdjqxMpQrEtH{fpv{~3M% z4}!l5{GWg;0@Hx5@IQn;Z;z?@e?s5?1CYiI={JLUd6R$;_-{j>+mq)1d;0#T`Tvu? z{{^IJj`VxLRe-mEDELLDPS4c7G>Jz@{KZdoppb?8-u!+vzLw3$gFjMIMvTFFV$6s~)IpD7b{v7dF6MwbvR~vtI@K+aqe)!|xS89&) zl7;sCR0+A%WDQsg=Fbw@Shf#e1v{3$3>L4fC~OqA`1vTc!c*a=NZ>W0@`-sps4i7; zGUN53I#IoN-E8rz4qriES2lg~Yz3U%D&f3l2b~(IX?@lZzn|5TwZm^e#Ihuo!`@^o z*nV~eUq{PJ$1`-@`?8rSIMyepC-G-^iFnx#x9(FC2lJCQUVq^))9GH#rC{xQy4usO zE<7FYC8eg~aRXk4qWAUsBLo(w1pG<`4;=X8M0yvEm+v;wM`#TM0D(Xx&>KhvMgo%n z9>>#~a=a-R)#!oZ=V#bG7)FuyH=RTz5RpJc0ujSUtPdao|3WhU*=G?6@I4xU6;K7> zpGEHkXaJEz0hj|;Koy`q&GFqL*- zIrk2~*)jI^HkAviO|y z!#g`@>kZ%(uoaj9L;+QRgIH#>f$G3!cdaO@h2qjv`C)~gxbfx@!YpegFm81IEN!aFMNj3u}+ zrgp{qBF=bMr6Jzual-p9YP_RVA7!9zU)I4pBDG-?EXiZgUh5jLQ+1pz(f&DAQ7&vT z1N~?TyNrT;{)C;9VXxD$TW8qsW7v|vzr){e;!eP?w_d~->xDlR#hs5uu?c=4cgX`$ zw7oBi6Yh%Q(?9Vo2>AAf+qXn<@J&&?^@k`9`CSwrT^GeSe-*{5*F!`13hYTz*y*2b>YbmZwG0@_YOq?|1lJ-fu;5%{QVr z_awg8?}R8${#q1g92dm}$3*diqoVlLS19+0DAoa9J1mN`4xx-MMbQ<|97G-mM6oNd zXTK=62fp}16k~uJ`$X|Apgr){UQzrI7zIQF9zb=#5>Nm-E139?pNyj)jN`ve#edb! z(D7e-lX6V^Qy;n?qT|2%R{V=JI*I=xoRs4~e}bP3L2td-RT!vX9S11bo5>1xCQ-rK z#VgpRJ__d1OTl)&u3+7|DcG|Z1=|v>U|Erf4_7cdylD1kh=N@RRN^1M0Q%z{P^?pru=ez~#k+l2 zTP9*nsfRUX0c^Db<)Yiz8sv>7mjwV=+O)rYhh+)-uWlbga_yc36>Sef<%O;Q5%+;x zz^}k1;2iKRa17vmum{)yda3C8P45R@`0DtGQC&1sk zi~=x4STOJlYIP5Q2^fZ~*8Xk4kpR~l3Glw&1RMc)9WBu)cOV?#<7^S|C2$XL#Z2zS z*IwW_U;{%$1M`5ZfDiV#>A-cM3+(z4;DmL10pN(E@KT@|*77fbblBbj20a1H#yX#j zqi-PAeEdi$^FZIUg~5AZKbTq#X|Ojm!Z=uny}}87cL0|&HN_s)0ejY1>|sx_uWiPjx6BXwZxGrRhO=2D-ap0BdTI}(?}u@njCURf z!e&DdKLYg}i+W9g-QU5OSd2QY#ygx_um|qKyOh}Q4}6bzHm_h`{EN>$tW#C7CSh=2 z#h`D5$*?C;!FHjuTEDGeT{d9eA5yU8R~4*24hZXA%vk?0Gd5T-V|V76F^BzTxZE^j zj~kdX2fT1PZ-zPBcG#S)!S%<7U2u==9VKh{qmtEYZo&FYuwXtv<0k?FEm_MAmdv@9 z73(_7im5BBnA02;`@zYYo&C(3ZSPZo)v~V0w(hOST8+11L*gpoJ($WYzFrk}wI+Vo z)x{2ZRAt|1S7S-r?b*Z14(!h88f>4kCVRZH7VD5uhei3;V^x}~*~rdLcpurBJ^aa) zeU#dW4Xx3X72IpaJj}e9Q-BY1-{H%?7|@=55a-9Pj|*a(AB3{W+ag%Nz8EGp=)qcE z=*za;Phx9w2eQraL)h25hcnH)_;#y5C$qLO-|WaRUR_QYQcv})$JNn zRb$*8tw-f6Kdk6IE6?Vu(?OMX&23P*(k7cK{VQ78{{DfTUB+sU zs#U7?sdmnJsr^=$`_->x^{>%&#IKGY9GOt-8_Q00M&GfocP7bNeY{USr>sZaoGT9d z(6vd&R*m|cztUv8<>$?MuR7G?)G>3P^#}8OgQ_%W-z3S}@5BzTpj~0hLzm9&8PRe; zLd=4*pS|9;XJ+5|ALb`5to$f_?Xw@UhK}|ej-#svQ=ffOcb_t|-8k!Wu7Q;<3{_Se zH0WTB4#ZJv0vYm?+fHa_1?Jl>+hvYG97?~d}#I&T+# z=*yF#^)Ag0UiU1ixyL^Sb9v>mGBsRn38#CTBBOS6Y;0XWMIlyX%PwdgV z$>+B_|NdF4gms^c9i8^kc#r0rT6*4E_q)TUm3=E_ESojh>y%s8-IImgw_FVCI^%ApUA9UWiy`ZALX!owM}h@oyY4} z`(vtN<%6ykqfe?-UmZVUW3^%4@GaZBk4m3aeaMe9PUW4yID1gW-WcKIYj*w3o}NtI z)A_xAs^0y2eKWf5>!}GBVv{@Tb;QaG56Iy>6mF)GdYUG4zN5=HoG&Sds zEnSCoucVCn+4f*p-&PYlzttopVCoyJPlwcfJ+AtV>lWKL@U^Aw>bf*?z0lwed#`Co z-G1%?5j9)gk3Q?wbm*c^iw5;-=X$!j`P)ZNS%u!5S3$hfz4DV~cD50_PukB}G`nWQ zi7|C6cW?gZr(JK|PZ+%E(V47_f^XGLE~j+({o1bD>;9-{nRa{oPPa3P)z`i|o4@Ku zVM+221CKX6aPj2jy~+p6kAL(>!jUmEI_^F)OZ?P!`>t(kHjLi#{?oP}RKNCg{jt3} z*1U0X#ELHyS}htf`r&(PdvANEe&@V*YdLsL-c<4K^jwcEWA}RwnXq8i)V|GTbnW?Y zgDTE%`;qA2YcnJNdK%TG$wixx#e0tjHW)qbjdv3QHBp^e_M_hWhCZt}F|CV3NXBeW zWumjk!Ia;+F0$*_y;t=~Sv4I!2cNCu)8Rd{aq51Sy)Eljyixl?mDg6!ZhdWMOv_G7 z>^e@)KiPK1$$8Fgk9SvJ`J=i=+=Ek%M!2p!_;tIqeKqPfIkt@bet1>%rqfj;GQK@J zsQFK$hTb~A@96R?Lr*9Cy7^AS-yLsWzEyYksypkKCEv@L==S))qHE8rpY53P`K1vv z27K8z|K$0nXyP2#+*wp%t^RvNP5rzT#j(^}nqe{kxyT|c~$ zx5K<|tB<$&J={7JpIS}N;j4gY$JdGbfnKb^15tBjQZk!(R@Ce}`Yvm_M$}BMa)deb z7d4)-Pg$U~sM-3ihvLJsX#OD{RfIFE(My) zSKZCN?)Fr3#a!% z>~4PU{5{R@>n5A$j=QV*@cL)wvDN?5Tywo?K77s{O@4BH<{h{ewbGvfy(cd&3d#*^TMva>I9$7;@nIT^L5F_U{M34@ zg=+3knsu31EN(spxyRwoh;YL@msXZ3EkFEn3Ftf*Sw zYL8~kmJX^4%3Yd}bAoEe?j4$i?0wZoNgrz#xSmoK+~2Bc+tt!~Zte$~;hDbHqkdYi z37a+0dRwbC&|7TXe&hhwRhDMTem9#_zYWr)9qVahQEPyv-*?k&-fGoflX7;qOyMHHQL5RB_o{MbpG>LzM$>TWegcFIG94V6NG8y|QilI?u-JJm_cZc;La9&}G@S z2|ezN>H7cZI_syZzVP4gQ*?KCcXxMpcXz{q(@RPOMNtp|1r$Nb1PKuYKByoKDvE$8 z2nr%75|Zcgy+7QUduQ&MdC!^s2kgDp^Q`CfT9{fUw%IjOkNpgjhQ%_eREUcCb@e=H z;y`JUpck>snp_hkAH zua7k%GlS%%xXrrLmPoqxPLvJtA(HeY-JPxYTOjEndmdZ;XHOD%(#dA<%8?{!v(DyQ zW=T4~$jeUlG$b`8+q26cHA&|oz`l4(fy8p@F}t9M1j(FjiG978pTt$p%3-q2M#|@$+mv=aq;V zVzo&%XQuQRvAceflYVx9C`S$FQbTtU*CJH8{+&D~uJ?s;d8gJBr8rBueBM_QZ$=Mt z9gCI_^*aA?83h&)kq8-Xsl0Q*9wh#9r z@)`*7067PuRI)Qqz!y`Z#O*AejdR*W`jJ*1Sq4So%%5*OycfiXST+vc-c4@emWm}W zmkA?L$sWTim4zg#hc@#5et1CGOZ&u|IT{$wJ4r1`py`k zv#5%1CH_A`>!k@kG06^seh$PhHP%e9&rs(76L_1j5FWyxy;wq6aV+NlY@1IAP=Cpf zsv{B%Id=IE){_ZY+u{P<{1F6!VGjW(eIEjSWu8EXwFAK-wo_o+#Dp-QwkCj-)*#>y zxCJ+lqzO^aYy?}M^Aj@D@Pe*U%!FQ<`-0Oj6oGesUQp@6KYZZ@dZDDFpLlvD1ECV% zMf~;Y1fi;iX*^$2wNTO0EBr00NugNkXL!0>kgziUeSEl#vhXT@HU4&Muy8)@HGG@q zHDSTk9Q>{J|AZSJWZ)f@{t8Qm#Nc1mii%Vr{PF)--9#9!IpV(%b3}0TCit|ary?t8 zHT)yv6%oe~3H*hd?4sTD-1vW6=Av@?wD^64bkSPx6CAj3PgFE?3zs)KBl^($D~^hm zQp{ZcE$+}%Q*49&70xRoQml5Q9miRBLo6}90jD}PDCWdafveft7qcq9hzp>T68A+B zae<;<;ss#|xJtDP;vXLe;#iD2#VyyJaP8(l#6L2b;4;m*B#OjTadC!LXOadnT#_nA z0>jFVJ1^WI@n92$tE2uX!Q8Qj9sEftSs(WuyF92VnaKDNyHgn{nNU51{S$vfvX<`| z_O0fiBzs;X_S(^&}Ma3<2RK`2jytMhFeF!kj}~#>EXog?t5{jBA4l3gbtX8A&%Q6&| z@%D#!$-A)f4G*-IDa5=b)=;K$Tw&BH3guZU>Mk$)=X!_nx0B?(o#9(VN3Z8z2LmB#1`hgqs| zaq{S#!^f&$q`1*}+n-g<-y+c$m*~{0Vt=RQ4eO|F{h3QkZ;DdWi5N_C$|_aM8EQ$R zcX_Ec##NQpz`d=;=b4|zH7lr|oSl~DS!Az1RT-G(Z-`enyl0apzS^MPb4xw#Ue1iV zQ>IYbEDuuS$dxv&vq4#-k8LkiS0Pa2?!cE+zvfFC4M8KRY(iZcQ$O2MeJ_325DCAX zD)XC7vud;;6>n>zX)S_IwWvzel!ypS&HZspQ>)B6RY_)8GrLnY)i`utlV*@V^>MM7 z*5m+XYQ}SCt=WfvQZ9cYX-Qp}OWFF}tkv)MDy8`JqgFlYQA#R;LVKaHEG3Vuq8+K1 zmGWjgP}`~}HbrIOl6J0~drJ351+uI+kRUU>UvRw8NyNE)TueBTGq6G}(Gm%p*yk zoF3_ko3|!WU!K$Ji@cdM(@&{S#$+dHZ>Z`oV`7u!=!5i=BVCgk#4hPSFw;%Cr_!lk z!6cd_sQFD_Z-gd^UWLivM%s2_w5XoJL%L6iaGmwvsEn;J0B((%DKuX7P(XyJ`QF}EZcZx$P##zFiiMk z=xMu@AdKKQ%9ePOPy(!s%6~sf;NMO)s%$JxX!of$Dt0C&cs(070zX0%j_CJ{A`)y8 zZh8qD+bk<3D3;q9D_L?TJekNa=Bqe~=Q*x1W}aV;4;L6WW}_dD&(}CGmX?1UpJ^s$ z;-*&`e`d5YDbpduPa5M)4kbh4d6nx-NJy)A0gg!%$w~S6cfSu!jtW@g)%(RwkJS$1 z^zxic6~{lveKox4Wsi&1_X+v6c-KE=`*d#=jC{O0nl z*y1^i`Pkje*x&Sb&0}37Vy~!=nPazYVq;zQ&5zD0#uCGXEp|^?V_(GDTExZui;;># zTZFxtk9q1{ZL!4OALD2A#$wI6E{2EiuLY5qAM<^K&$6~GKBl|H!ZP@-b4+o3lI62X z^_WQh3d_fN+%by(4OrR)pG2?v{<6Fz^ELYXI)@c*`DHX!f{_*XrH1J6)o80Yu}jf6 zT#KzR_YW;Mry%&uQorbN0GwD_GVnvs;r{T`Ao;CDn2ipW>1x<&#+9J7yRr| zHFJ$NuioxQE;UZu3}8P+mc<>}^f2~Bz7Q3&?YLeYX+L3S+d-QZX_Sbz?Mn`eEJ9S- zejK!j)VTE87S13YDNns+Yi33pnSkT8yA$&(VrS9NPAGFCqC-2%ZXoYT#FM-tyQ`$) zh=n(uc9+7@5o*v^yXShI5szi4?M0B<5w_OK_OG7vM4bA1+c$~oF+-Sr_>p6g%2w!|N)adJ|0Y7q-&i}vn>-FxTuXAYX)Ov3IKJUD z%9b1|i0E}Xh;R;#KUr~l*Qgw7^pnmxY=JqnWK`ApK5RQAfY_4HlmvT5g#|LFK!DsL)>{Jw7DLULygNnnX~F@*jEYh_(= zS-CkGY_Zbjk}mZ)_?qs#%YNOJV6I%aYaCl*@MOP~>!(zQ;I=;wu9h$5ga2bgyLO=H zgMZ81bXC&Y2+~&TckS>U3A&;5-PI|nDF`J*?*>cH4FYuiqySw1&?ZC~~I_?&QAaKbj$i0<5 zAn?J1T=!U@7idA>?4Gv76WA0u={}`#5HMZ4>s~Fgokzk3Z2*bwz(aL(&Hr$d-;+=|=ugpY;^`Pv z=U<7B^nAjW?cXJT$+NyI$lqi7v8Sesfq#7Td(ZGWUjKjF2cB9U2Y!DN1iae*oAGm7 zF!A~#^wf{nAkwQh>8hX6)r($UEeU=-GmpF;uh{xsVtD5@N+a#psP)gQMVP{m!JW@L zQfAq=E!4>Sw^*NVSy-628*`;^i{}OJ(k-m-iQawho?Z`MG~1;2c&4f^%jdt|6Y5O9 zQ{|jKujV#BW2cFyL zBg8XzfpbA3qEdMW1iiU~@EzXtID=0*RUb0m74ED88*#Ak?giqS*Wf=)Z-dv}Tup1Ya5I$>T2|*mW3{oc0-X z<{zVQV)HyqKE;o?3E=QtnzH`h zD7dulOW88|2Gnz1rleYY4a&^>C>s|BfM@bHW$92KShy)hHCf#QgkE`2d4_fY-d`7} zWLZ1FE7s>!4v$&^hxRY3Ud_jV!e5XY+`kX50B7pU^o^kYb~g2=Qd(Ui1b1%8%~X}%T~f5ah8gPcVjz}y%rIXg06HTT z7_seK;E`hxBcYuISg2oP{9Z!`(z#wTcHt?2*1<00o)H9cK1ecEZXb|bTD_Sb7X2mN zymXOCj`tVIBeaK!^V%wjsJX?Iw7W>6q!wn@GM^>=`ryKxoH5{UvBiMJQRY)DL zZ?OLgmLc76dc&T&AWY)@aLArx&P~$wk>e1nU?TmV_2+Pzqa>+#T;X7*CKC_F`#3^G z_lO2&+Z>iMzlaBIqMUvF--se&?wsQ%pNOrO&vT-Or-*lVJ2;U_}N)-L5#WPD~O_ZjN;bCkwAo6S6 zE@V>8LBi`r>{bhn_zDS62yUlb z{C~Ob5hS*(`GspL2&r>8eon3{1hs)?{*Sn9Ldd;&{_x=p!fp<|Kp#aMVI{yoU_&v8 zAg7inux9Q?=ttfb=(4gRR8CF`1Zn9JI&Z)PKeH(jXnj-!)jx|8u5gA5MwW0A^d^f1 zGc;)lG&wH?!v|0C+bX+)YG&K`jd^jQ)dws1Kbamv1mrCKKsZn6&~g-i+T9@(gz3fa zx%?1%e7yxfzsx1PSzU*(PqY^1zEOsE+`|fM;4k7QGMa?V?MQh3olnBnG|70CSXvR& zwop9Pg06^$y$8P3I!;7<+6w>v@huT1GhKWS%b3VvjXd5e@kC^0QxG5jT3+<6Bnw`G zD?oJ69*K_$yDa)&&>l{;`Gx3U&<`ADV^j2_{U@BNl%UwYKoX3VIyhBRB?+H;S)80ski>WuA5L4gNFqL)9_P-{C!y_ricLS-lF(q= z!j^s#lnm=z#6E0wlpOM&#I~IWk|AIEu=iXaNvgX&!DjF*N}9Lb!HUi?NL@o*!```W zASGm&g9C-9%-i|lO zJg$C-nO6KLGxEL?qftO9YjjB2t9czn>}WQ zpF68IdaI6)w&hWITkoDd-f+W%Q3MD_oG{$tW*mQN%u@%uuj0R%B4yO~)N2 zD%##!N=MgMDXMHwq;uPiDGsXlr2DTODbhzarRxA0CDi#F>CN=sN>8ulq~9yaQ{pR3 zPM2V7S298eq>EhorX*@>n|}S6MR|xpD?L5jSXsGGEd9mnMCH&x=JZIRD&?S!lQZq! zsIpAtI=ZL(Q2Euw4BC$@rJ^P=fHu_eRKdqQLI=d>s@%MF6WvVGE&9rStZH1ICOY@1T=j>YC^~n4P}L1$MCbq9Rc*ax*VMa3jnWd@d)3XDWz*g`{Ze1rU{8Cy#G_Hs4yB!sv(iXN_?bHU z3#}2%Hk0}~;;sg!p)b|q!=%PjndVd%!&433o7Yp9t7J7F9)Q&CT`$dKigI_es{Zgrg$MjltgDk0yQo34~o*$=h+eK-0RIaAXL|oUBO_)rX z#r&tWF4vX9m$jv}KYKUjMi!s8C%Q1j6lbkXPfkzaj!xI+%?L_ib-b&6e!)6LMs8Bu zSw%I)13J+@hvrMUIwGyZQIAS_SLmU`F}Rt`X_>8)`~E|+`~D-H@aewf^HuXYT|JG- zclD@s^KV>BuA5TVeH(~RKJOo*TgefYZ1Cl>?$76T$%Ed{b^9FElX-@}>k3WtCo3tl z=`om6BqOdE>0PebOe$E8)2sbGlhmhBuIDP>n^cwbO0U|hK8dgKkKVc_XZ~1If=nBFvE|bv5B`OOH^Xb1rupKiQj!?`~c;))VZBA9=xGGOuwrzG+a~q*y;c-t~2uNw{ia{EMzDCSF|b z@vF66CJ7rl@dG(4Cifo+#XI>hnX-pa#OI3Znm$5o#QCmKCD=un%#ngN$GcG5S$&6MhGESI5*Ni9LE>62B+zef=9QTs4$V|A6Bd#Z{%S^cM zD3rh2{@WQe(M9JIxVwUa=nL zOXefG`my7FbQV@v}vL z^o^KB6qThwAwEWVO4*X>c3{kftG<>MHKsA2EpjdUOC)3D{yenIPp6HEFZyV?XSo$! zE(W(^pnekMy!`v0dNLjFcMvWGf`g6KQUWuuJql zj%a)+Yd4?qIl_U#%`X0Y-x-ZauoKIzi7;-ewWCVQiO5+Uwc~e-Nb1#>2BbdhDxB9*6rFuGn8{y&A5>NAEDf zmKuJ%q2>@D;THbviJwDkgL-&SOpe3YCywx+9QPf{PWHpxJKj1>G0ldR+8#L&*}B4- z-ikQhrn(uH?`Y#__zNGV(3|WS^q*f?u}HZi#RdJaC)hqmEdznD?3dpi|9v|Rg(Dc9 z>DlX(9NVR}>I+{9fIf+jt8zC)E2VkEib9PuMKBxZoh zh1_WzvgxAel7bTsdG+4i`~ex_`Z7%hCkb^7*kkh1ba*Qt@YAPTj2u3x`*1^tpf zbVco!2YqD`ax?pj37Xq9cdJ?Q4EoR$>n1*+5i}02x=od^2X(1+xIOUP2`rtTck8Bo z8|aq-cSk;X5{N=cxffU#1s3MoySq*#1pfM$;vQ~gA1D-9=KiWhHc+s$$326ACU6z8 z?4ITOBOt+q%44nkbwEq1yhrPs+JNR8E*>lESpjYjGdyxmf&v;kZh4fz3_v&vKVf}{U6 z!2!<-E_wfNkG^|WRM7a>tI&BFGyL$IsaNtUNqyxP$LQ`=K3wA$5{>n8V?F2B+E(c` zYVYsoyVLK5!s+$TKei{=d5q^GRud-L4c_Vq#p)_qBz$IXg9Om{S;njafZ&9_*-#-DRcy1e6o zJ^tnI%HbSFo}h}6DyB@_DYZ=9?if!0F;kAMo*2OQ3;7WjgR!K@I#n?FwFcB-7C`*Q z9$1?^1%}6DVBbdxXJ}Q%U7WG}g|4*U_%9BfCRCr$c6zY(tN~~4xe^#wdM^~%e zj=8U&M)B16ad(?J^^^P7vg{@HJ!X;4LT`oL>&kk)c3$ZD`Hx-?{P18fB&>HLylc8S z3Z>=~+kAgEo<2u9NsDBia{r@tnu_@mnr8WO21#QN!y~AQ8ymI6b3D}`T+4(Lx#%Af zo9y&Rp_Y$H^;Gnrqu3q1|8NPg*0q7-JJW#0WEI%;Y=a`IL!doz0`A9?0qhqUoQ;(O zuHP^yB8eHQN>GCStOP(36Sts?LhI1_m<0?BwZIln<>9~lI^jJd&Iq7M#ugbF#B&Iw zB(%{~B>p>XOX4_sl{`iF{BL4{(4LAi~q{-lKH5p9Llflf{9M9w_8Jr;zfP!!~f9;2aLip$)yKYVh zrz;7$m+L@$@13FVzv7_ArHhbE%R`9X_dPT^M~2!}6kxmlL9krkQkb^%B&_QtJv>|1 z5x(kE0!KP6z~55JAh-bzk(N=cTNnkzco62_S zHUE|}NSxDUyrQwpXhMIPY4}i=Id*r0S?up^miud-tV!d{Y-Oe6Y;euX>}Iu298J^g zoLcP*oJ}STTq&_=?q{OrJRt#`yhw%(-rr&ad@9#(@fSE@1k$ZM1QilAglby2gfl5l zgf)GZMK&u(L@)QZiS<3bBmO7iiiE=;NpkdMqLipZi1Y_%4;i%=wz5u{CUUI#I`S$5 zstW4-3W}HZX4=HOzj(HO#|p)h)g*s9KWm zDO-VJ1#9yn8JoZYaa)Q+LAx4RF8lEZj1IobC`Z?>L&p=LO{cG@FV4fBlP<%kURPam zv)iER4fpWka~>fKQJ((S?Y&&MmAy+ZviK}4{PEF&PxwmyZ1l^#nB`wM;}vk+D;Kz? zdm6ZCFc$Qwr##sFVQ2`PLN+ww`Btdmt0!TTJjvl7TIC}OFMN-vyIK|LFys=YE`f~B zs%wc}Fbar?`%4i!-FZJ&sn9V_B7Q6Go%^NucV-d^Mp``y4-}je6(pAu9fgyUIQfr~ zD0s7zIrykj+Jp;IhUBSJ@0sML@`j$K2471{6MpwSEk(`?{l5AYT2)mkec|Vg^xTQ# zbklDE83jr&G8CTkV7xD;VJc}BGOD#|tC6^f$x5Y=9-MDeOPlA<`Fnu4JCkz)2eGv#TJ9i{$c9_2TYmy`xxFsiGG zhE#%4Br0j+7gXy9r&JYJji}=(v#GE7yr$MFprOgV?nqOOzfM!HJ5TfMoha?5c^s|J z#3VZ~4q)p*ip$N0bBX(ko1yCz?T z(5Czpd!}1K5tduG%tX!DZ%UGo_j+9Jeu$6_Qj)$*Rzw&mshBrBeTEvp}m@zysQ zep(MjM%xIltlC%#gxRhzeYLIc^0zbO{$v*@<6+m=1fu!`TpPakd1_ckUuGYp+jRYLTyPxVLsWJVV~!|h7FxJ4rj=|9sXqE zG`u6$FG9)VS%lJM_Q($`$&t3pBazQe#iKmJKvXd6$0z|>rRYyKdC}`r3(?Khsxeuu z7h>k<7Gh+Ym0~vvvt#c)eIL6dAQ`7Inh~epJs5X$lOz5pBs`v(yEVR?2}*Fcwo70h zxRFpzTuPY5$R*Z1MJIk!dXaeb7b@w_x?K{7RB_V3x{pboVf@Lqp~1<2Yig6xqTiFD z6{(b=@6jnVa!o1JEo&((IH}b1oQTvbQ+HFlgTJIksPm;A+IgmJHe5}6VLg(zp@>8y z{PfV*##7OX7n;!6{4Z$Mx9sWl;Wp_j#-#L|s3+-0pO(|-Z?IebKYS; zzdyuca)faBtL8YC(`a1WNFna|;bWXe;aeO}&Mxlm7Y;l}ttP&6!V~{4ECb&jR*HW- z`4rFAG>zBY-ok?>I)dIiDZ+G;8KEvSkibKQBb1>^2p91W2m!IL3Fl@$6T)8X5%6LR zL_HdDB44sD@w$&QQDi8BsP`OC3{@{8vT4;4Ctr3DITnVAFl`}QrO84gBzJHbK% zouZ^sbv2TywHYaL$CcEl6-s)~nL?5+K1Z^?f0@(~c8m0{r;$|htewQvjjZGkBO@x243J2N1^aTbtu=K<$~&tUW9 z3#e3F2AZZTU|jn%>#=z5Nt;ubqOI>}1fWM+WBt$e<5@wtp`n1NkO0knTRq2pOFJKnB;plEK}x^Y_Co zGFaFlgZzJFpm{_FJZI~@|Jhz&`fRPgeU>w18SJ0sf7bs0$yxaey)-{#$NSH?w=;hg9YMX;ebxj+|VaZeyCwz2nu5t zhv<@}p(+{$h;vB=O5N9l9^2?c!*eFki>5QqtHS{jgS$gl3VfkgP9adgTQo!}O@a>C zF_7F_0I`neL5&ne&>Eo(8dbUjIf^tvvCgd!&x>xzBkDE8<1`5cqCY``AHPAam@R0> z{SZ1%Lcv1cFu_Cu`Cuw4Qm{)VYB0$nBiIp-Jq*6=4O9LR0n3s}gKacs!onl2z*Yh) zVWFkXuo>zum|E8m3|;>LRyef^OV!$g3CyG5S>5dL8?)kYCshsj-8UBS^S3mwXZL zb(0YGQ#pupHRXtaM-LIR`vZt?_*q1P?iM0O1BD!l<3(aVDd!$tNFXS&H3RDmzh)O!tMA0ZZqXepAP-T`ms7To=6vny})p=(c z#isTPg*}t1yrmGOV6-%#;O_UPSV%)tScY7sFwTEK(Yf}9;zsr=#gGSrQX^D|a->0@ zGDXstl6?_Fd26DS^6$T=lrZ17luvg5Q2rcZqPp=;k*bQzk!r0ZfhxfIGS#a3L#imB zajMbwO{#x3jMQ&Al&H;koT-)EQ>ejUF*SQ~8}&!$57ZB%52y*9yfhL91~gX>gJ^1g zWz*01Q{zc2@!9piKsY&M! z{OJlqv*{iZ8tHBfPteKO@6nkd`RNC@OzE#N#?ohpUZcnUd`9n5|CN5Tl$t@hOPOJb z$%kRDB8$P;tC^w3>K(&Q>(I*M40#=o*G5sT~iqVIxMuyUC$);XxH_&-(x$oQA=tEc8 zkOCa+x)c`dxxDG@t^W7e%SUI}DWWJj#uT+UdPSo-noTP>LavN(v{9UJq&6yW#%2U@ zCL~?sv@UtcIkL3JIp8bJMLzZAvKzh3g&pYUa{0EyRjVMytykmAy=riUI{`VseP?@* z+lE?}N7X8jN9s{A&tLr^o}is$9?fZGUb7Doybg$4yuuz+yg3sTd`5|Sd;;nze5*nY zd_gLo`COyf`14-b@DEsI@{etF@W*v*@<-ki7sz_%Cy@KQSU}ZwM8Ne8T(BudNAO4? zMUa-GNw7+ANf2wxBjjK1BE&>}QOLDoKxp0WSm=h3x-cJmg0PNEy>MIL7h(H0Zjk{Q zSCNmsmqhH-UW+VQLZV(eI->EmX`;)xhoYFFAEFzoqGBiA{$kOgWnzCM-ikRorG$cmLk|ic|A4rrO{E(QL5|ea(86?>^c}w!k-bcw84R$Hs zE6!5)q03Sq3x=h9Z+fQrjb~S9d6F)1xUvxsfI#tK1@!cxg-K;)$HB zW=@Q(oKSA*9FEqFohFr8O^zuH@VckYIKv&@YA#6>m*4zi1a zM$T1*6`o0j+5Z?6U*qi+L(DHJh6s)*;;3nq0uk0qujwu*g^CXdVAHIrpfAzn}!Vtf}_Pk*|6bG%oeyy!OgUTg+$=*?Y9b0;Xz4!J8bb*%* zWLL)xP_c}L*1sGL8{&!#r+-WuW&|@ES<6{kFy?ke%EO1G}VIg54{s=XPJk4(xF9n)a3=XnP3JYVR}g+nzB`!C^)^&LN_s z(E+3Q-Qnd`F-Q34V8;#CYDZnwdB+A_Zl_;z9!>)k#ZD_j6HfH0bk2K7YiA!)uJi8a ze&;NSQ|E3s9hczfbQig>7MEGGO&1AT8Q017aMxnXJFbd7^R7XhTy87wu5LukWw%w* z8@I1fNOw66L-)K@ta~f=se97araQ2d_PCQ7>T#p8(nIX#2M-z?vnP#?t>@aO9M5RK z7oPSn_C0+dWiL087%xcdu9paE-V3~9^Zp!W?~Pi{_3ko!;XQ!c^Ij`f@Yybi@VOUQ zie0r?rZEX>{rR@<@e&jWxqthSAK-JBfpjsW&h7N zBK;@OmHy5OZ~ayJsRB$D3<8|dsR8n(4FUB<3jvqISOT9iTL!M*zz4$j9|evpd_uNN4j)S~sGP<+u*26wJU4gTwo$`jd)iW1<7cH1zIR=<=Sy?b&i z8W;~n_j&w{zN;?~!@g$~13#A<<1<$oLq#rwb8%%q(1+N3nE!KCc(Ye_8@bjhf6g=BzsN)|Ow zN#6TboP6TemTYi+Cb_3>KRNR}SIRX_?Udb4@01oAT*|auMT);*SBl@#Y|2OULCV}L zS85`IR_bk5&s5ABIu%h=l4?iUni}jlmFgI^l`7&wpSDIPoA#v4DlLCEJS|f+JFP+F zb{fOq?zDlD*|d+8duf4oEa<2Z1vJXW25pOoK-*l-M05PSg?`E1iH_iTi)Q)t3q608 zD*Y3cXu7bAe)>?nXZknaqMcVaT2ovaMlU`0kxd`pJ&k2e_~HNIvfdjHE%abm<6@=9P@y7Vwj3a%LQjA+d5 z5`dXIe;vc_(2R*+@53PcW-$9TKQU3g5ElD{9czu1!5(oKVjmT_VlTXl#5U~UvC2QM zU@bcDVrl$3uyxJ#Na#+iAUu+(Cm>(85`O6R5iVRCC9n;B zBs`n{MyQ+oO`xbfCeV3O5m(k&iM@V;#NkIWMD=BLqQbrr@!L;Z;)Q+>q7^2X=*ARB zoXbxqGOU~<@`_v}sv2J>o;Rr`no2YhZ*H^@d#-mAKMB7kie8-{zFz)F+~Zy%E~)+` zb}8==AF-Ygw`WnLr#TEHF*Z(8+66(BXy*_CJA33CCS~HCehsZNLo+-Ogb_8MoQgXBN0osNVWpIB>Lh*()Ko)Bx`^I zKhkJ`*9}H+zm5&C-sT3~=LNt=Z&7faTMCH2mIF@$l|jO)IwfY~cgflo&}5PjPT{Fl3c@{evX`1J*_oa_U$t^a|# zOE1A&pV#1mz!2E{@CL}_jetP2(xxeR&F87ES?q=M<>Yp7qxS z$sj?M42sRkfapO6IuT^>F^vquv(Dz@FOxxL1sTZJk-@)*XFPq!SqTO@`DbZ8%b9)*oaxKJndS@}p5;u1_J3;s|Ed4aj(?%# zGmlQnnX_&8%yIMY%wt1XKXXV~!XVUB7(}ZChpwIprpnHoGXgLqB>o%;-OoWmt^O2{ zjs+!TY(NDKno~ogXD%71Y+A_e86EWDlpgx%$_ROOGM%}!SfHs#tkAFtJ7m1V0jb~M zg6h3^pzG3n5Sdy4T0IbitPX@Bi8DXyISC2K%}olrdsPOC`z!}N(ouwB?T9 zl3;gpGGJb2B$zX6F6{E3i!l1dYp}7oa@g4S+b}vr11w+u5zI8Q9j5iT2Np^73O1QI z3QJmj3$u)ygSo<%Va0XpFiP)j*nQqZSmrMn{QNjIyz>P!obv@Yyk=Aw?y)WnSLIZJ zYr5*dgQ`s6kN(-fg+g56t)G11ks)Dlor5^IOf?#=;YNb{bLGJ+e_ny_jFrJddhftj zdYj<*iB`DiW;c9}_cgr6YXXk0{Rnp_e}x-F|AZ?o?ZBmDPT`U;Dui@BGeX{v7ojX9 zj!^rnfKYp{g;08Jf)IaghhTZ{f!Ny)LW~Q>BFcTy2={y7OjT8YsE8^-2z{wST#0Bz ztRA%@#BRSpSh~JJ*t5SwsIGoS9K2dX+kz_7qMjU5Dn}Dp z^T`CcZs>qKY4t|VX@n!s4J9FeMiG!aTo;hEGsVd6nrfsBsTt`O)q&Iu9zae-O(2EA z98#?IJM!a)zersk2xSvXheD2Up(3=!Q3>tJC>|37RMfl;%01T;wWt?{LL!n;{U3-Z z_U8qtllwPN=?`jAp!*4m?b8dCI>jhz!DtpmTd<1i`T7_2+Y&}`r<;Ld!jO+5eM*|5 zBw3R}QplV_Zo!43rXh$TCo6$sDuzIDKDdD5PDB}n0PY^e@y)0Ii>tGWYWjiO_;102 z(G8=!ySux)ySsDjhoFKWN`r`ql;|H&6hsja1Q8LW8$=KR38kdt-Fxxgycf?o+c`Vi zu6D7{_jx`D`N5BfVd7E52fHN%{Phmv5%UEiy?_|m$;60Mf5C^uSjr-qVLHh0k5)){ zjwf;|C<3`+lY-_r^rz$gCtAv*r6%;zgI*43El41`pgs}(-X{zFMz{=}3TZ$yt#+W3C%&O; z#+J}I-*?eUClKN)HfrJ?Yi{C_Vi{ug4P9beU3+4=R{_LbLP^BiukI4J>6H_6Z@wTF zDD5Whu^T7;%lV7=zw;yFy=4@pYmx~=H7$(!^-C2a4Yj~r3VC6aykan0Pt!4|vj>?Gki;^74YLMI~vnB~X@FmIkl|Zt*dY2?} z?=guS<~511WFLu%?<`62(`^!>qid3U3u;o8HeS+eF-6kJS0hyUr2LJ#LuttWm~z0Xh0-(Y zD<%2xGUZp+6Uv-KGAhRvZYpkDC92<(7F1Op{#2%?c&eXeg;Z|F^;GYXJyiSOW~qS6 zU8KIZb8rM;gDRIhst9eHw%iG3_KZC+!|mk=6!j zNqbHiNV~|FO8Za0lvX9?6>U@f0Ik8_6HQk$2A-Xz$ZMr8b&U9sdF?9LI z*>ov+wRFz%ALuxLPty%n@6uTZq3N5IIq82fDABK6ThZ6-1=I8Wxkc~!ubkc-`Idf* zYm{EZXp^2I8OD(Pj+vnxkY!M|G-L2;^k*QZO=S?i{g9y-(!%g1{TqWU!v+JE1KV`AsrW_WWhyr^&oRVWhry#lNM&&^AYB<_AO?*83fDf z1qaKupbCq-r#;J6WfaTA_C1z4wdXA8vQI3IkY$!nVHYe~>-4Ncep0MXd#0@GX@RVP zY`0nGdY-UKMRc$R@y)X0)(%-+8!6a`L1DH8dwsS_MQ=8cCxs2gSjHwx`<4x0nqc$b z+hsFTAz|-v;%9G7)n?~-<<5To8^^9H_<;RKWDEO3&nP=T%OCbmJTXV%1}{ggqZY^J zgd2yQ9gbsTxr8G>x`o4ne2fG8>JP`dGlugeIX`FcfHo&}wg=~9J3J>s@FAxr{4J-! z+5{)<$R6jTZZfXfHX*L=_xfDMy*^yg6RBL{+mE^8F&$jml5<>H?#EoZMKs*O;}YEe z=*_t2yn?wYTkmk^Q$FRkkLu;NTUh4KFuvwq>0#z^)l}p;{A|ZlY8}I)zmdmtocfZd zockM(^w1X1D;%1aOp1?JeOH@TquG-e38wJgF)!!s=5Ob%M$YjH?Hu!(%+m5f2c`Jb zKUwerpThVQzGm~SO#jDsu=$103%VNnHRR?mj@9HBdFIZ4yo~4HVt>RB^L@`R z-89P|13lsIa-b7Hw@M2bFj)!2r$q>4?cWzj@@o`OT^SVk>bWI={f!pnis2VrKL^bKJ zMN`69#ZJDeh*b!?h=t|i#GKC_in;i`7Ymq~6N@!D6HDr26c5u<5ZCXu7r)St7f%~4 z79V$M6<^tz60f~+Bu>vrCn3}*&{Pq5>&YCFKmu%tHev$c!LpHRK1-^m;)pKg>V zU!U|!o}*z*{`=Ct{0ud<0>VH_!3DHZn0OPV;QlvX;gr8wA>V64f#>m|LhU?_A~Bms4)(7saYYH)t+iW)QLe3_2_pR>T~-Z>XJgK>XDw6>bWH! z)zgMn)YTy{jSeX;jXiHIjj;kR4V#`cjqu$n4J>o7hN14N#$hO2lcI=QGw;2&X5^B$ zW)0+)CMRc&=6Cf^nj*%rsab{ zXj{&odFcDPQZnZPQs3l&ffejoxaaC zI)7h&((x$%r9+!Uqca7Wd{~4F%4jBLU__y)*I+TfU1D{D&y{^eYt&fRg*-ewy zyHzI8_>U$MuFEEhYJe#nmd&(nPsNnA$Jtczev&E7w$wC&{+(&k__QfQ=8>tI60O<# znv@wT+tRF9B*N@o|9!J%mqxS9ok24&Zp-Y=Iog~*k>7l9U)Q|E$H)BUSeki;LZx|W zX_tA^zwhRs4KK|{9$+m#tteQO^VnNhc*a^xl@wU;e0gOdeK2BiPWRU$N}AL%*GS0H z)Y-tY($~*2E%27*Z@((bA=hq8ZnGuJ4f#t;3TCWT-if@G|2JE!JCCBRwtVueGWcFv z*{uv&nH6nW1!$qI%YO4(FJ)+33v+l{C%gi!JCz?>vMo=ZlhVov9P2F^j%{pU`&1dT$HfkA{HhRrWwlgzwwwwQ~ZDTNzwh@f?ZKv7l zZOd7|*mlvb*-8_^?Dn_W><$K%?Zj&w>?&en?UYsX?Jlog*v+>N+I{o?Z8uDbu%CLx zX}@TsW>VA_q8*zK$+L_d9N%{B(TW zb?sOTVx5L$MdbiW_?gghwg%c;_Giqlgaxv$?U_(59y#K&mC79I11i|N_SfuW8jdk=WE{^iJKxKOfgx7j7 z4Sn$FXPfm9^WXO{ti^az&vAR+hN*f!;FaH}}<<}3q-e$e>5+nWUb)ELpi*xtftI&eR+p133 z+wM@?yIjV_n=?4Z`$uuM_xRfy@1t)W-gG%e`0SU;`1}kr@mW{! z@i{-i`CuCg2#llNC-kt#=Rx|sPZ#-t&yTyrz6VzvzQ;ZazU$rQzTH&*zA5&gFMEEG zZ~4at-{ZAjUtVCrm!Isw_l$zruLQ;6cYP@5Cp2a1$5`*<_bC?VCoG%qXSDguk1fB; zuS$H{Z|dWY-)jT7zx*dAe@__+f00r>|DppI|A!jU{_;07{R7`u_=~Q;@lQn#`Fk<{ z^dI6m_3z{&50Ikc2@tqc3@D#554d0F8*mbg3z+4}3lJH98gLNZ5x|ET59lx42pFTe z3ee7=4#e*A2U;7e2JVzu1+Fgp2g+gbfj{;01J?rU0#$Bw1g>X|1+HYS2MXaY0=s-D zgC1+}27RVf3X+~O3tGG99WAKOEeNk&5041b2u;f_K$D$${8 z?aZN}17e{s1~o&09-C122LI5JtfWvA*L$He+)qNomtKcb-|GwQ5uXiB{=5~cX?Yb& zIZ6@sTZ=2~>vNf~79#zyI%~(U%HrU#>Tme4#?zdzPKK(mDWR6IL&?u!jH0t)+ALdP zvA|_m!!%j=RwaA5n5SfTBCU4#K)X#ihrM4oemy>XB``DGc;#Vuhe<=YY(r;w3osI{ zqQ4wIn6@A8^%@odpQedu_`?(7ekL2ie5Mz%x?>;lW-=fmzbP>y`9@YmlulVh>}7pK z#J;#7PTJoUsUI#wy6H@FHxwunJ92=JxX-_D2jf8C|daw zP4weRu4v6@$!K0hjcAiYv*>q~uF=6dA<_N|Nzsjdnb8{SCDB|?Por&nTB7IKdZXWj zk43My{D_YD`zP9tUh+)(ZCHl(1KEWku+C zG9+z$elUBy#Al)SO**;w9w*KC&O(#;6hNbN8#ooP)cS?UBKVjGxUk)3M?`)cnm$O-mC;PJ-uZug6U%e(u*p8=2@LXp~Ff`&x zcv>x%kaD1qFfFH@@G`9VxO9UcP5`!G?Bpxc{C6<#v zObnZ^N(_2bpIB_ul6VU1Of0PHOAOZG$qaEzfCfy?n#|MdOm>C~%(*>2Z=athioV9$bo6EPTedS$2FaX18p;L zjzc-PcS^;$$|sL-*y}2sp!IXyc*RQ`>#sLBa*hsMy>$=n0{nu5R}JI7bWGwbM&@x< zbIZ7%g>~H9sU2KK{{c?^)hTW`{~BizLX`YT6_YHEqD(IRLYIt4V@}3Nb0!1d`I1XP zkz_MQsbuc|}19Eykv{s;^fobvSfwMC&~0LYm*<8{+HaF{4%-R zp(R;Nv@JR5yfgVucTciwN`Ep`ekeI%V>EdncPjZ@YCf52cqy6IYc-j8cO&^EW+(aQ z;a>81@KN&6;#u;v-gWZHa~NI*iNY5;li*qZqrguRwpP2P81Wk+EO_%L9Qf-Y9{k0D z0N$8d6#q|15`U>8iw`nT#Os)<;&Y5O@z&b9_(B;&yd%3Q{yE$de`m!8fBnt@PnG3@ z|7_!d=VtQ3OU(G=_wNVeLp8$j_1jVSm$`BHRPiJ{-xoZ-)+rSa-?)X>550qr`*Ron zz&{87Y9Sv#U|5X*^{Nz)p)JR2L_ERY`&^Abrmw@NdH#o&d)kO+T5G~fv9;iDS-!4G6P z`XEP;A?S@W29@uaf{nT6V0WPZTfkJAY!E{TqyMSwF{VdVJQS`l_DC85Uz3~Zb8|(uM8b5g4_WMhq71s|i zyX6NsuComCPb`DE?kgbG)(ZGC>L(a>_7k)MS3!5^FYsa7FAxP=1OH1|12Znx!0Om_ z5c+o=eCo3S7SC;fQzpMb{|~=G3$abG@X;oyK)eO2$83R(-?zYY-EDBVejCi9+yOhI zcfjDO9k4|952#=G2gL9H0o6?Zg7@nFf?<$daNT~Fz-xEGTG$?VWV;7$)$M^9r+eU- z{ysQZv=1i!By5d|9)Q>J2jKVa0}zis1b>+wg0zK)Am!{K_#OKX1YQ1t$B+JjhKv8e zBYjDq*LfP}wOc(SHhBADn`PEN9@U?iqL^>Gr~I9Iru^3 z9Q3w02Q{P5L6@R)@NMfkXgzZd%ATBqZuA%6xXcAuV08i3gkON@>)^1dXn^o}d={=gL|IDG|r z{=5R^|6YMF&aS{OMAu+C#WlFibPb+z6ZYgquR%KbYmi^#8r(7BI-YRn4qk(gZxI-I)-|}9OJLu{*PzBDLhr4T@c8L9_@JKf+9pCTuH_n} zZMy~~IQERUED8t2v)};rHXN8XCjt`R5dl{`2*9HV0aOzs zf&Nq^@bwA_G~!V}1QZR>WTJs$T4I7*h8R$i#{ez_@sC>|37~-{n5gSXfhtQffa{VB zxcMJB(Bnb@{G_G?R)#2nt}H45Z$b@V34*wi1sdS+87&~5LD0c)?ZfN}*h5RtaO=1CTm0JSgGSt zV_-3W$aw(pyn6_+t~~n~&Urw}>O1gr>jw~&@e}yMzXn_nZU7`PTfi>+AK<@{T|njL0Z^lK1gsvN z0B0@dz_0i#;Heq}qDBmdG|nI(`_Iu3k{cwDb4PMWmpm23iHR2Sl^|`S_{{_noMM46 zerAU(zUP9(HuFMOUkX5Yn}i|CEn*P94oS#bzYHW{Mjo=Xr37JusX_QzH6g?*I*<=; z`VjrwMv&^4rjW7k7LW-F8%Uk5J;Xf43G$`G6+(OM0g=}BfpBO0L)K=4AW4E@kY#)% zgkd@c!XcFaxyZvoo*sb^Zr3zO@|6>A}?gU=v1j|NEQ*-MCDaWjNk{w*YX;XP#P<_E|h@gB&;k3L97!2kqf{0-uS z9D^kEO+viy%tBbq7a>(l%aEguRS5n24G27U8`2TD3(?j;gcJ#!Kw8KyAQi{g5ZhH4 zbany><^6(zs&|t^xjU$#6Yca+(=IGD|1%r3YK#k-yvzsXI23~B5Q{_mxuu~4n)1*> zZ)K=praJV_Yi;PuANtS=N)xDqt_5@sZv*9i?*NrKcY%_tc|x0R`$Cz<0-;76VNk8; zC@A!695jOm2c1kyf&Tt=6Z+BU4%D+H8`{sA2R+O$g07(+LLc3D3}w8kf;!>rpdQc$ zsBmTz^gZnxD0xjAlu!Nx6gJ!gtqSOeB2hz7k>{gOdh;o0@97*=`sotX*M1f1MEV;_ z)wcu9O5KO{X&ys+5EsytZvgE20TE0+fEcE(Ob&xm)4*=-Fu?l0vcUQqIANLjd@zz^ zVVH5C1kA)q7Di&O1iPcJ4(rp_fpuvc!V>h&V7q44Fm5LY7+s(%>=VulCXw$Cb8HBK zseg@xt!&4^)TxqTj!LO8asPB!cgbBC*-$Qwj;I(mqh1EHNqGXx?x}@=#Pu*CnoAp+ZP>lzJy=oXG0bM~ z0`@fu3O_zY!e`S+;o+3j@Qz9bc$XY2JZ^*wz8Wk5hm(rI=Uz&~z3dg?6)<&p&MO_b zw2u)y3u^%{oV0~o<~zf?tv%t(jQ;TEl@PeXizs*~m;kr20^!?&x8O2}EV#(89Qf4d zBDiQ{8CcprhXbkG0l2J+C-*A?;Wg(W}6&|%1J$lh(r8{m`6g0CS{|Eq@N@b$&=q8T1iPK zk~qpH;t4At>f9%)271bbOI_Uxy%JJTXXgDGpgqbracjFAEt?mXEB@Ek(vMR3Zl}pCKE>n~>O# zZ;>>1UC5HZpOLj$!$>uuX{6`3??|$kHKZ2XA0%YxA5tHGiKLSvLWOLRpbVeVpkDYg zqe=z1Q6#%UC|H{mDkWVBm1?hrLW>xoXo##(RX-e2Z$5aUj4K0CJ{gfHNMs_4)h!j( zX_krlu9b&MQ7T1M%2uLuWS*n^XgO(V^uq{cblfX#^x%;(`hltqdhw16 z`oWA3`m10lIw~a=ojZ$1^T?*7MT_pE>rac(t^C*;SOR0R39Z#-P|WWjyfmC`oS?3E~JX1S4`$xKa9XcIEMQm0fVDW!-y;0#i)4~V(N0r zF~MC=F_{N1F%ZEv%&1on=CooElej#IvE*68+z8&lAX@h@EAVp+wJn_F!E;iQXed2N zl?yuwPrCrgIg1ntSDG?O`IZhzpq&{>MxQ;&k-R5KOJfj84_^!kM>U>gh%1Anzc!bI zLgXPy?VDlQcPA&&X&?OTj-ZI}w&{OLq#|e8Rq8#TW4PW7;(FtUv zX@U%-Gv7H#ql$z`tu16olgQOb*GBY73kxktGhCcWJNbP{<&MKh_xlq_|2#?~6^_j& zeQr@q>M#C;)R*c%(yHTTQq~`xq%&XpNx!v?kwP05NFyuPNLe55k`fi4k@6M6$$FWDg9FqwAXEZOFZpJX3ScE~{-A`pGSv#>ro8FOo~&*dU)`I3O>6eMuf?fue}nr=rL$VxbsN z;iq8Rkfg{hRH0zi)u;G$YDtm)(uKk^(4WGVFN(rzJ((i?c?QMD@O%my#c~Q9;u*#1 z>O75n)XECe)5nHq4WgZ6NYF65q>Rp^2 zRZ)j0RX8G)O2;yRiuTD(svrCJscQ5dQh7bDrD8m5qWWytK^6SAp9;l1K~D~iLLH_^O5OW{ff~clO|4xeMjgVTM18wbm--&BCH1Wa7wSN{0BYslXzFvT z6zZC_ENUfOF?Bml6*ce6M(PC9HtLqYpQvZ^N2ym87pbRKH>ewO52*t+02<68hUWe= zdYWSoE*cFMF`AHhMViDiT^fQ?kw%)&m1b!-fF_`Wu%v$X1`VxSHjRw*0~!gE8XDC4 zOPaU6?KGM-{WLWh6EsVqKWO&swrOUyPH2iH;j}{B6tsB^%(O$~{Im;bY1(##I&CPz zn060kPpeJlP3ub+PHV@3qootepsiFZpgp&&pk)iFrzKB)OWXgbm)5v_gtlaHfwlqi zn>K_0AFYrjgf1UXO4r@MNcVb)hc19dl5WLFm5$}MAsthXE!_;%i_S(Tj4m%TiSFK5 zI-MR%0UhDCfNr;~o^FZs9bJakC%UcoqjV_x?{tgNn{1Wv5oM7O1z09ze{D;Bb=$ye0i(=f~ zp<$%&;b5F96=f8NQDUU9)MvaSVZ)eD?a3&563XbXl*CB=C4`ao7_x?_avBv%T$@x|1)CZ?zCrG z8S`Oc-;8AX4ohKTV$WupR4rv9aevD6A+4F|&$Di(;<0Z`ZI|;*wnD#|0-TPR4zpp{ ze;+BZL1!#jTWKL|OSn8X{e=#8VAm20O1opL6GN~HJ&9OlvJ7m4Qz16%ze?=n~WkP_zUnV6SM`I#l($uO_;XfakaF+OD`)*VT{#@?g#7Yza7>m)90*t@6l{;p3t+AX7aEV zL`$(5d1$annwzodX}GZ6kq%-z7D!;r<49+-#TK$@(^s)M(KfM_(tcpOrXOO}kRxJe*QRE7wBlfI_7-CojaOms%Qj-i)i|)5e(+;gnvY@EI!$BuX3S$R zSE^wD>(A46)AsS^6J)o)3&8w1kqwVTg^x8ZOG=qN2rE< z&|=Tgedx<^A``b}mZ0$AK532OF7Qa@hLPrSYqve-whL(FR$%Jj-W>eO9e87oyH)Nt_b|Z= z_WBuu$K8jPXNr@XhjvAhhp9?~XVu4?CtA>r=ksm|&*EDgPjhM(kFjYfPc`-#PupfI z&%O73JgoO7c>+9Fc|zq6ctj|myw$%cc*lF$cw3){@|vfp@Rqw9^OkEm@tX4n^1j9- z@b>Me^JdH!@g9Gw;iZ1n%scnEhu8T27_VQ-GOtk7E^m?FHSbdwGCmg@7QR+fVZIgv zB|d9iL%u?72fi3>f4)PVI6ex4+k9V43i(*AtNBQsU-K3DeB^5lALR>6{=wIg^_Q>W z;T0c411Ude7c+n7gb@GMrXv4Ss3HG8)`9=4tUtfFRUAKi#BKhEIfeY?P1XE@6R-JI zPCoKavW)Q`XfN{@gzWOaExzV==^+zH-DMHrV-pcDG*cGXN-+{ZHaiNGZv+UuU`-HE zu+0!qx?e2t`b(`q1<@M;sMaTe=^GOQtRH_0Ou-HWE_I=T1zD7WC8O+uXhw0tH4imG z;d)cSg<}`NL+ud3=zN@@!_O?iO6iA!=IPG`-RIv4j*5Q~tV*8|9A8=&^i((&G%Y{~ z746ar$(!;BNjFFf-67Q$k`A*Hk{$CD%9f23k}taKs9Ffn}k422-UWl9xbc&3+eG?h}wLvtGaG;h$;IrQ&tb z1&w3Tt!;!D@dG+B1zldTm_r${jw&57Dr+0Da3UYEnbv4A{h*s-oooeSij!4h@3UTu zscH3yeL5c#Gj3TC8xPwTvloJj&#zO8JJxWBPk2d)>vL&{xBN60XRL7-kMau_?-5K9 zNBq4nuG0Ki+$Zscc(TR^@muI&@x-z3;x1)>#D)B>#D7YXN!+?-ksu!ukw|%{A~79k zB0;6(A|Xx^A|de|CqdnGS7PF3nMAZhy~LhqyMz(Zpai%uFLAGVOCmb^TtdnZBl%ea zD=EPuBpG_DD2bmklyqx$l%&iLl+2Axl>A|tDS0kcD!EMiTr%(Eog~S^7fF+@SxK9k z-;$hJr;^PPXeqPSfB~qznbyAX9 zZ>35S`=wq5&Pb&=ZAbwoCsN{SC}|2w2I;5dW{ApUIXkcAtYWP^DViGBPFi$T# zw8AGVvMDD^wXY|ebY>^(3-gy9BZ-&&K$jsa#8DzkBU~q&Aoo_*QLA6J*=$BO!+Aq? zEZ{^oKMp1LEr%#9;@+kPyc1eIUpa%#V|gTI~95- zx2pO@PS$c(ZpY`h94hft?$$lDyjK;YeC1mKd9`l}@`|el^0{XY@>-OE@@D*r^37_Q z^5J%+@@Zkue}OCf|<0C?Gko3gt>d3MsZq3iT023hdcV z3JY~X3X8o-3f#+C3XPW!6%v{16*A=76(+3*6+9vr6a;g&6~r1Z6v78d6gM}S70b{f zinsVx6l?TM6itm zGoo~q{zGZ*`L5E$5TN{HmqPi9nnPJcPC_}zQA4>k*+QA(iHCAbZ-nyd`VD1gOrG+B zXr;2J4ZSLDBNHm42dgU6bpKSoC=jXEI@79#fIO-!l`^W$ zy*jEA>o%$dXkXPip;%Rz>1|cg@FLaY+*;KSuivQpO!ld698Ia}Fs!TM6pmHzIwIAg zlIYdM%lOnjw#%vUE$XScUD~Pnv-qp2tHi6VJ7=gl<4V-Z9@eQnZF{SRo9$O)Jeg6$ z)BRSflRi}|vP7#JgfpslWDBV8KUYv+|7@UMy6T`#3<*@1Wl2#S)itM{Gq7dY|sjEMv`N4Kkv&VZ!(=zf>GY}-zBEHL_ zB~c=xwOFO1Mf$=-tLvSM*1w(*t^bCSwU(x`wepr8X?3qRXa)c6(8@g;(h|E|)Y5_d z(HcWtX-$xlX&X_oYD?3JYTsv6)pley)h=Xp)mCK>)wbfmYfp0A)9&IZ*QVuY)E;H) z)IMbSrk#xat{uqmN4t&YN;`;xOb3r))%i;#s`KGmMQ7{8L?>#`MaTAch)&**WF6k= zY#oZBM>-ZC8+3lX>ChQ^KBR*vU)0IX+0hA1z0}EzBGpBDv*`9)iReyfs^|(xnCSMg zy68T~gy@bR<8(ED-qk%AD$`wWt=DCK(yp6xXHZuwVnJ8Rep}Z~^+LCgi$u>4#jK~k zEu?2YtfW`eWTZ!#@1)li6+~FtNYZPT%+foec&O+1=eZu@Yn$F^?SS6r8*_T=PMdn- zGG}^ENQw33elhAFycf_P&sET$@-@&uS9H)4`Vp_s^D0BXH?>3`Z&{~r#qm~O z^hx6o%+rW4bUREjHm23F-lne>qD+G|(o9FI^Gufzm8M00O{V|)x=hcwM@(yOESVlG{4xC{du5t% zpVX{jjoBUM7)_DXNFl|Xt5d1yIM1A=o>SB!%t>8 zITL1ClRwSq84t{)oS^34A5xmr&$F8^GKiat*{GRga!k!5zPOmXLqg1_<#6WX!CB@u z6{Y4*W6#W2q3_K9O7xp2xlNm=XRVo2z4>R(v;?kz3G8>_myqn3E@tb!og?~S^R9ky)`EvQ4Wy*ZNW&QZH zrPRQhCGCfQmKLwzR==vKtw!=Wt*BBZtm;D5t@0hrtj085tvm%oth6X_RxyW}R!370 zta@APtbP==TIogiS)G|pS{(_jS}8#ftomml)@2P8)-5S)*3_1w)-4<=)}?=qth?Sj zTJzlwu>NKmZ~dA!-Fj-S&|0Rv+Iqz8wRJ7qN9&fw5$nqbOV&8+Kh~0@m)0!37#o!Y zCYxMg0UNsSayH+xb#2}#+1L!Nd)ZLuMcSk*-mu|YzHhUCtK8-{e}fHb;JuA`z<^B` zV%Em4a@~en`N-yQ9Bz9OKyAx*#bN80BW^p&u4e1_!o(J;>}>nFFVOb6S%PidRJv`q zQ<3fA_i9^p_t&=7OWn3?E+e)tX1?3nSnk-851iXBs1e(>zhXPk7N$%PSgq7N54%gZ3i?rH#WPY-nS{=7DS6Q(e%HOp!-MF$F zRV1~y&cfQy%nH~$^UB*VhU?lpzq7WVx%RX-(~hw3z75(7f6lhgB`UMu(RgmJj(cl= zr@7Dm^X7#8DeF&rHj6!bxf|E^>Muwg6z8!H+(d#77sB!mA1!qqVq&cwXiGdD9=C=& zP*36sxBhn>TG0<3ez8AuIF)I2IMn~-Fy=7sQ0TwxpcM1hp%=V#5Xrze#@%CdtjObY zd{!Xic&|Xq(IU^naW~t|F)%&Eu@j%r^#X?)2k9z0*(EHm7=yekaA1NvFFNKb@X9?>QyVT{}^IBXJH+V{*PN%kS*IF5`S$ zsO4;|Y2oa;?dmL45bWHnkm!88knVhtTr2zDYMSMsMnnr zs}G&irJydWAIM$y4Om>7Mg?8i?BrdP=X6|9PF5~AX5C$$+Jw5q4=1_&)4k)u++O6e zEn4m3^SH_7Ht7c!(}Y2nj+I%LQG<1t%*I2Pbqc8KdN{dj<~L^7Zvuj@&8c#(inH3T zZX%YhT%eolt#84ux3Gz>?7r!)_KgLuf`?CBi{)OpK8kO5Rc`&_8hJ3~sv)xKTI0Rv z`uM?>tJomM&GLf54K2v)W@RJgCWcpcdsJ=W_ORd4O<>c{O&1;Gw$GF5CZvAfZQriU zO*`b78&}F3x4St#ZeaO{+r_g*H|Xn4x14v!ZZ#cncl8gH?w*~j?&$YI?$Ryt?yL1W z?sS!w?q3Vs+@ZIE-QPtfxbM5%c7Lv$@4hTt;a)`1;QnRroqNJapLiAMW8U zJMN^CXYSl^q(}2OwMTmeyN7a+h=-(9ZhLfi z<$GAsS9mz}*L#e|zVm43?DL==9P^loT=F2H-}Y#Dd*ab%N8~AeNa@LNkJZzkN63?- zP0mx>Sle@C-rTd--^G*tAi#4aG1e0UqpUyZnms>8c6(}X40#GT z&3T4?UGt<>IPheyzV=KbA@S0WWbg`^k*C+%Zm8FN zjU=zU`{`bP=kmR(xhlMx0_weJ8{T@2?(};76dLt1@>}#mRs8m1n)>IJf`)o4D3W>W z`ZIagPa2`MS{0YYkhCRJbgY>{^QXv}@_nXa1jsSjNC z`5?OEL%Dn6^P~~(8yZOA8^^`$+d0eUtDY_8d#R%4`)|w8m%rH7w@}T~SLs)XFE%5= zSBn3ZZ`!9EUyOU1@4)d>->$o_eYaUZ_?k5i_^v5V`M&O5_H8!W@!cFg@wKvm`~4jz z_vajMX0~^c!GcB;Z1)!>Ky-@Jl^oXU47v1QhViZQ-cl&dqNZNtduPPo+}uTa#JP%8>1dD>1h-| z_^A(gD&z4#?7atA)LPdz96%5e?7fb?<0R9&G_in+fc=OA3@|W_DGbxH?Y;Ld_TC$c zy<%_J3wFUy6{LMDBXiC?p7Xr#^S#&qU)O(q|2MkW$x5=bSN7WXD#=ddr&=iF1?4I7 zzRxDekEG9*2P|AB|B|plen_}mzRV|GzVzui`MxbT{Ru6o$M`ypj1iG1>n|Vz*;1NrgSV zlkTi(l61CqyQFg|J(3>0U?r6Y^hqMN3`jD&M<(5qMkR?dC>y!LsWYW{a)03vS zElQFMT9Z_B>DHv|C;O8wwK|cMG5S){>1DT*Zr^^A^xflKQfvOVq!EdwNomX66h&u! z6vK0yDlYl7SNQerskjo#R*aGNQIt;@pxC-BLh;9rv5L0G6BM5=X%**hTNPU#PE{;? zI$tsK*-FK%Cz}*Y@9$CUypgWBdhVPe|Il?s$4w6uW9PqAtT%mBe2pqp_y<%f(mHr5 z-CY_ebx&I=a}IP;%BJ;JejLG58oLB2y$V8V65)k`)hg97#_X|{^s{6%FRk`Easa!mJs9Mivszg3wRrIW2)l82t)lqVk>O(<{s%4x~HS~UpYOddS z)%6`SRCVhwQbp)jtJY*~R^{S*Rh-%Bsu^$2s$Ouesn|2JRP!G`SAA{&K^2IEx9)L!Qz)l=V(Rl9j6s3&$# zR=fF|)l)}JQrFhZRxg;iMBQTHTJ@&2Th;V!`_w1*98-rJIH!Jo;F?;!FH7yV^SOG( zhWBdvvTy1u(@WGbMi)(0w3lY}z=j$D-b(YVVJ8h)&`Zc zyRK=DglB2YKb~p&EPtn|$^NRjbGulxCZS4`R8ccoFt1*+Pn+h+ueY~LK1Os;UYJfK zs|14Nkc@!jUfhu6`UfJCe{}sL`Q>U^@^v3oa)u=(dDnX~dHtYi$tw=dOJ3Y~dGaEC zTJqxC+mcsy+n>Av9ZTMO_iXa%_E(eds_!O$JoY5n!{tqK=b%r?1Ev-vYcG@~udQ;^ z-r{&`-Ia~Bl69@LqG z?`vZpKGzCPztgtZ^hN73wMd&6TcOSE-0<9g~0-I==G zc>>+H!vQ*haiDGiD_ocVeU$Ex?a{h>V-t1Z^|iX}GbUY%a)PdT(;2$UC+F)XNSEt^ zUDI?e(zfbK_hE`E>o3m`>96Dl>Yw)w(Yve<*Kd22f@@g$NMcxZtFPhc`B1}`LlFk?#?giybE6G}QEs?D zMq^kaF&dKFl7__c$p-Xbmf^teg$B2YD-6luX@<&nTMgU4>^A6*95RftW*B6WbA~xp znT7`^ZW$!T2Zl`F=LX%IHwMX)kA_}>c?Qw<9|rY`O2b8ody42y?UYB88l)_1*F42? zqHW5=h|Vc{b9<(^SQ#m)wfQNHmiI|{*e*Eb?6%O9J3S*(Jok)BiSH>*`MNbeWerW0 zVpytAG1Ri8tTRnWDR@6EMH4nRrP;B?DW6)eO36j*QyOM(O-T^!N%^?=P|EU8$5Zr@ zvnkg3ms1YDxRKJVdsfO$?UNK``pcBDW$#mv;7iKw)Pj_u2TN1jKUJmVwDmAnhIt!< zCNwaf-rdZoc-Y1mQrXcM)xL*uYXENS5X~{(vx$tymj)Q`@9J;ta%Qk`@9jvV`o(CY zELUn=loxOOS*$cJFVz_}r6%KqVr0DWeTs2t&Maet=L?KJx0V?LPOUK>*|E_mTfE&k z#Io0DiaKn3*(bv|rR`Z`LfIwb%&hCi&pYlK=a7$#>cKCJ3tPW67Ukp`SMC31oMfAnaOYIxN&mAklgYM;Oksq^x>rgmEGo9YtCOzo7*OI0C%N)5r;}O`!+do7TSWVhXL>%QT8dm@bXum=;VCnoe%@GxfjR*Ti}| z&@{Pnh>6)`m?^l&XwwPNIMdQlnJH^jq6sGDnMkGH^hs+n!K(sIrG`nSRl4b>&8j)3 zrtu3+`D2!uI73#O-uGE=!g_BpO=+>yl;XC}bT9XiY0ZsermQ`uOr|;KO>^X#rg{N4 zOl~din&Q4bF!9ekHKBPgP3$r6Oi`Ub!Y9bSn!FDdnC2TwOfy&&rXTq(=4ZP-%y}9?KF6M{bdYXUUpqp2yS>{7^_~wwEVzV?Tz+Ch! z*j!T^VqRV&%)EVZq?zA-lsRW@gF@ z%&}{Kn0wwSGtYFvEE9Uyu+$svY2i)wwv_LvXBl;?ktIB@nI)%QYfB5?c9z_Joh*^k zZWgJrm!KGTf**!T58`5vn1V#v}kUOw6whZ zhedfxYKc22vv_WiTf&zrEy0tME$`F@i|nsf}ZM4i^wAFHU>`u$(E_*GKuLmr14;-;9(jT`BVxF>` z%{y!Pyz8Rnmh6f}(dvff{O#M8tch8c^~57f_m@vCnpxQv9rKNa`SiWz5c+5-Z1>et za5m3!FsjJHDl4&=7MEL456n8?jGOh*(3;jBZ@jF5$#tw9D(YLWOl@ps*J*B5ENW#< zYC^LzmUXaRYTU)zabb7sAa7r5;AGrd^C#1~T*zPZHcw={&H)+=W6RU-a6~F zgbmiNOEz2go!(|`owL)bt+Us44H zSs#YvTaN}5S?6&}tmAr=S$njqwB~ua*be+~v#DQu*t%V-WqY~b+qQIRUE4rY16$R| z#tGwJ?`-Q7+|8EPw5RRDdtckSgSc%1$+RT}b8Jy{ z__jap32m~a5}Rqbzima6Als#T!8Vt918f8Ph1xb&4Yqk79%`GC5NWI1VuWqil~J}a z#y@OrJB+gxUyruE(aUV_TO`=3P9@rUOO>`%7me-lI;|~2Xt3ozFxpnC&9*oXn{Dta zWQ+8jXfvIjY&$V%nyt;V8MgKDvu%NSb8TLx1-AUkMYf8GOKrW}SJ);@S!FA8TWec2 zKFtSfR`cX-o2lVFTf2n&HkXWtwiez`Y)PY^ z*?w$$VLMs)(soMx##TP{oh{|Y2b*t$kG4*cpKYU-ezo1c|J^pVVS$YtTx3h1@x#VC zS86LNDYO0TRcQ;7V&wgWuH>$BHOOneBiZ&*XR`IDuB4{CJK5B`7umQ)Z!)nn zPBz9FWD7ovH2QH!-(Vgo87Lrkg^EbSAPKoL)Q@a4Fo3M;8$|Z;3npLk`jfBe1IfV7 zp=7NVgGst~7fvNAFN7pbEKNQ*E5;ay6VV@5A?I~obDV2=wZzd&8t>nTtHgeP+ zM6NJSAcsgMk;r`t+2!g~vj3dvxtHoTR*QQ&#g=&qk}h))AKiytks*z#K5g&mrvVB#rz$lkhzOo z`d~L{G43V5G}%vnI&^?Eh8-dod_GJHrXD5rZH|%R!^g=L15S|BUYsOrCZ8r-x}GJ^ zFE~fK&@PbocU>eU+{>ijxlHoufUBg>-D~8N;WtRXXE({fsN3Z0mv_k4(tBiab{47p z;{iG8@k5du@tB-<;|V!6=ov{n@thokXOqIsFUhk_Uy~oFzafv6yd`_bzb8YoK9CLi z?v~MFqN{w@Ydu+Ix4@gjEw=oal*q-KvGcTGU4LSZ{QF zmk;VxSO*FC^-z8IxA|NH^s`1IRJU(q^nOYcgf28iPhFa$GEockGPNa|d7u^g`LQ*^ z+qXr%N6_H?y6w=EGwsof{0=aQq7(Wa-Wlzj*aZ>$x}s^%x}hC4d!W^LPc(K^FZ6wa zFACq*8%@7KNAvPx%~63PwRs`=Pe)`=e*y1|YIzAgY0d zB8|r&bguSbR91HgYSj=@{EdgAW=+CTVdDst(I^tB8Vp0;b%&$nUL#O__mL>IawNK0 zJPI}XIvNdlI|gYV|AA)R7>kyji9$;cj6*XvN|9z!G#WH92DQ_~qEBOFXm`Ij6wio9 z&08m+OYU-{{31tnvl7wnV@asrS_OJJL5U2pD&*Byjn;J5AlxGvU3#00#+=il!nHay z&#Xtjkp^_fHwBq$8c~;QBYJu`6)l@(LZil+Q75Ja{q(S+$B(S&+;$r}YJ$)G^h4-k zlkw=~oAIdDz6q$0Wg?m$Gzn$bnT&!TPDW?fPC=ovspxa}X=v@YX-IZ(I`T`Ife7wQ z#4nwRMjo4m=BLg^+3Y!}U*Q~db>CbRub7A0beWIxU(QFbS1dr^!xo~JwH6`S=|$+K zelZ%+Z3%LDz69Nvw-g=sTZXRYFGCd@mZONFE6{ChB}(425^+bbLY-@_MuG#Y;T_0p z&N0E{s$H=TwcMD7hV@&IPJdpHBIa*E%@`X|?fV;1&y-DwY_b`-9NCNx zM{Gf>^0%Oa^R}X@9@`MQybUpoM8_jFE z2MPA>LGAtbqM)q3Xp?Lo@+;nlT29@Mn2ish*&7d_j`%@TcJd%)B#~ntW za}T4sx+5s14Bpc`=_qRKm5xH^r=#nQkD-MtkHI&Ij-wyzkE3NBGth)B8R&4A6Nt6# z1aj$m5;fm?5|N!wA$;R0M9@y7iK|becFoS9`ist>p+0BP+o@+!X4P3#Wju#wd^?BY zVL zpdst8pqM&W(LM83wBh|#bSvx{8gt?r>fiY~S~l-G>RWOhjTm?yNCR~ z+(Rn|WFhI+EVRV!KH@~(NBxf9M^_p>K*v=NP|M5*=nL&3B1{ia&h3Y&LDxrU5BUh4 z&U%D`x<5vJ&||dk-ea_^%M(;&euA#vc!HYIo}%Z;Pf@G$PtpB`&yZ*AGj!zOGnDQ6 z98C^;jyA7*jsm|tN8|V}P}$TMsL{O_XjhwTbU~ht{y3D4QYy1i{eCZz?}C@;=Hr*> zd%IU?sr(f>yYCg!{CI^niC&|qNw3km%-1O1=M6d>_6E&f@&mjpw51#9Y*4V=kKcG#8N#KcZR#KcXHJKcaW(9}(x< zN7Sy~#IrR;V`~>r( zn|?>#1HPl#s_$sYiti}!!gsX#>vy!OSsn`T&qIro^3dGHd5AcfhbFwsLl&QW)RvWx zG-L9SauR$iYX_9K^O3eVA9ZY1fTs8rpe1nyC~{T-y0EtZy}eg}4*e)Vtd@mHE-pla zq=o4Hq(b;kRw3%0S%_Zc7NX$VMJT#w5n_ZEp<~J-R5Ygueb`-u=HDnnd7q0=E$?FV zq0gXC#}}jZQ;N~>jm7BlnPQapycj+FS&UMf{y+~HKhU?qKhUM5A86#XA86-> zAL#hWA87icAEr6{V;}!=K2l>rZq@ z_!IRG`-yZin9FVYiAK)(iOSP{qQpZ#(Z#uv9DGjW>y8vv4*FyKU5%T9(?=kX9enAqY}w{Dv_m0B}#5v ziTZVgcdXMZ(K22os_$Qk6ay;J_Mw$1a}>-MkFG>}5-X8GTZ!75E79%=P|kq$`ITtj zGI&?}+DdeHb0x~yRf%REtVH7DmFUr#N;Kj!%uT;hiF~puk>8U_^vBCeH12&R8u%HG z&#y#JepDi|q7v11gZH+3R-u;XLEeYNeudYH3 zbyaA2N)_@pL!CA_c6=48F}Vt{r&Xa5GpkV29C)w%e5ij>73#Yb=BKZKdG4#K(CW3Y zz8>a&Z-jGfsX}?%;9c`OtI*ZmFz0+9)ODZ=?KuQ(KLX!*K30Wj8CA&lB+OAiU4=TI ztwQzB!!Z}C(8WttXkI3K3;im57yLTBll}&@`xYE`8_s2{xd5&W%&A`i zL@R=M@<8p1;dr2WFu#5R&{v@0FvmUvs8wkdG6CHM>H>4^O+cAI4a=bafYN|o1GR&B z_kRE_1-b#`Qc;BnASuvXpmd;@Ks77jz5PI;KuVxlK-+-M13d#O1oEn?LT!NaIRov%9(#lv`Z8t2eoHSIe>P>g>vH>Vp;C)I;67 ztAk}KnNF^w4N(|$wBQj~3hvACWn!2zHr1+(wd#Q4Wh!g5TxE?h$gFam+8UEU@pabt zc&jcRgRN8rQ5vWqDn2zTS}Rpz8kv?BEm!NXPP$Gpx|rCgAm3=M^3S!%e_0#w=UOM7 zeew4ybtau&ri@B3V!HTVIGs*+l(hc+F{MHb!aNl7qq1{N#V{j)f+(wL}dxn2jajriNK(F&y1RVKHi@My-?UWtc8S9xGF0+W6?dRiS|XuRiqmo>iyF zw7M9n3e&6Mt#@j@UaiCwvN(Njtvo(KkHr}jioaC{t&yebwbH+Bkm@wh9Z^~-Tq0~x zM0fygh~H3bh+l}k{QcBgnJN~9(aBZu3K=arxypW_Xxs2GD*_YZv|S3%SDQA)Kz zC&P@{)4PXoR7`h6o@5gBm%LP3M^r&p_K)TO3) z{Rj0OJT%lVqW|DQv|h9jwKNtQN$V6#i#F+HI-0L9?9)jH$7s^-K< zwR$@oVZju11XE(rh7Jy;=@Qfi1$2gt1_M;8m&MYgda94TsPW_XYk&@|9-u>Dfd01! zg;x*Yfz<<;)|H@z`u`7(iyRUf6beVP*tCKF!SSIK5C+&$b=>&$b=>&&B;DS4fF4tbq<4tbq<4tbq<4tc3< z6rcJzw$?ME>$m`5=$m`6bmZ|=A z<~ii0%HQR6<~ihb<~ihb<~ihb=0VkVd7XI1>m zU0!FNLtbZ|LtbYdwM^L~XP!e|XP!e|XP!e|XP!e|XP!e|XP!e|XP!e|XP!e|s!hND zUJhid>j86o2wUC2X=An1mmt-~8o~D$(4+>v8uAAAINni0d~S8b@vz_&x&P}Lwcnp{ zyj4lLUBAci)#v*ap;w>nSAcGX0NrX|OoaAT??;8$28~WYs}A+8e+J2a?Gvq5>mk|| zK!EcrfVMjF0@q5W;t9SKftCKlw zb*o^udOehZP)0zR0OcImJ{!uDu)Yt*$>JwQ0k#v2jw9sk3;zk z%CAs*_Xix}vDI8CSx_pV90_F_lzJ$yL+NPG0JTX2&b=RuY^-{D2&5xuK}wC@goOsu zs+kO$zX4J_Dkm2EPgb~NFT%lc+Rbq!tp|dPj;b%520>0N=s^G^X0&Pr#R>nFnSl+| zTCi5CNq}sfzZw9MYQTt~Ubx>7YRRqw_Dec{z%QSAHIx)%548?pewHc$n6s!7z&M90 z!MJz=_PT&U=}MJgp!!iI0Cxgag0YwmWeqrfIh5{D?x0GjCml);SieH8Lw)z4q;Q{V z3}{|V^(8XEpoRRH)}9}v+VlT(`^JIIr~xNVqDpAT|89F3_FsVn!)SicJipn#$8%;T z#QV|fO9x_SB7?BNp21YRoqtQ|HH|%`b-o@CtF@x}1!c{7g^3#0=9t`#OJdg&)1TJa zl>W@rCini!>5uO&>k)FK)=BGrvSzRJ4+~nKo*!H9XzP61zQlgX#|mEfotkXRdeY+4 z+vm!#!&!xwr`($~Y`LQ0nQck2=F;ej&sStK2aj=S^jP5$6CEGa2ks%Z6yE}Jq4 zi_ZVD#6w}(?9%dVq36Wm7wQ&Wdc03IB==~8kLjmoS*IT>&u;xZx__@HjSH;zX3Ijd z%0@^Jgx(B0%-3TlHom53Wch8*9`JCHYeM+seE9^}OKw zANLyXu4&x)X^lxup6MFYj(Ia#5W85MsPx%3D$!i~R-LzNs%kCjvIq0pzqY0=a8cdw zcQ<-YOUQR=Q+duq{>Sj>AJ^h#p2w@RkCm2w zJ2f}p)X}E*=k6Pqv+=QN){;Fzsd56|JZZXcet_HobFdtQv*cP@5S=lqz@ zt2ZVZycQ{4w|mrDEn(OBG$p>Kw&8Hhed2)AOB$KeU+?L$-@~vU&17(Ixk)lB7Ym6irfJd!>E7>+>*TQjJ094!ZHAo#VIuXfp10Xt2Eh zQ=>{eAo0$gXQLiGj;o#B=eyt$Cw$L|?HAW(yg;`O1m{*ArnkyJd2;5t<5%g64u)^p zc&MX0`}Xlg9uIGH8~!5Vbo}EEzUH`t=>wz}Tw5mmvABo2JLgpGL+j^ypKqD%K5EW4 z*IuEJ;x^K>2Jm;jA%4+M7^tFkGqv-5`x?LR1@Z&c8TA%h164T^{g>>u1eA{^`iros%E z0{(S_UAwB_Zb~<7kaQ3@HE~pZ;}zZ2Eo8q)TD?5PiRai>4|v~`e(iS~%7fL*%c@Jq ze*cqle&VlshgX+$C~E?}l>g%It1hX!k5;$!pU(60AKKl=>DYfdhT<6#s^yCBuC52m z^Pvm_Y7A5y_lx%uN^0LN)#u*~>r~z2s`=Em4zN5QO6PMrmMK1Uz2UOURdR5Ns6L=$ zShp0Y!|;pJU|9wPeJha$sAINHyDK@EIc`?hnU^GGrgcLa2Hum@_-R|yq}O60F)BEc zTK}aBl+EkY2j1=ulm>)Ju<khs-mh}{`CnyXiM<>@*_YC1>~@0~dpY^xGJ7ezaf2#pQE9IJ zQ0Aoc<51;>#VwRj_IbCOz5&YlZ7!U6041|?QIdCnLw+pn(UjrLlmIMqP`vW&&Hzlb zVBFgguLAnaKAhTmZ{xrr-(Ej>+hSng!uz2fx4w@Lq+;^sKsKQNFaM}GoBFw6E>=(P z8a3*Bx?nU|Zw6G-zq`7Q3phb_JnOr=`un)|t?%Yu-=jwTnr_&Cb)4tG?&?ARgX2bo zbXUXa|M7g#od5g#f9VPcA8!~*Ro&h%2lU{V-cq{TwNDN<8|XVw$2tu#&%g%Q?Dh?? z$@Lmw`nnCUO+e#-a$ws9ph8&Q#%_R(fU>YH@LM;)miKOeg~0l3*uEI(1gz7c+yrz8 z$O`01Yk+BhFM;!i0mT66fW`wY1=SKn~Udh|+Xd%nhr7xx@W{nwTe63-iKiW8Rn#RtKvKdR-rDfHlM#VU4jS zSW_4Wzu)Xv$fLC~h{$|n;ei7CQj}C9kE*uI)ts0FnG_x$km+Rlf8qSK9xJ2pyLw~1 z3~v9+lyG-EDpm?#Yxq^I6PGgMPTXH9DJO>R*JCZxlqk6>4j!GL8W=?#U%kPJ>vUQL zJPr^=WrV5^_;Wpq%4f*oA(USgIm-dAPBj<8RM_ROhW)u7<u4XsJFX;m?ZoQ8B-wUWH5>MFqX^d`yZw#`$QODn$;@EGT6v$3>*-l&c`00!RGW zHGeU6dbq#tbO!rFCeTH3Af4mP2GyUJpn6Y(>QAvicmB`&4H-g>iC@1O!*VcvSPnMb ziPsExyMQ;}iC1HI4t5B5|MXivGzZ%UlnL|<=qr#{cn(GbVgiK#MFS-QS%GE)QNIn< z7r0`wNB7^o7+Ga?6T1k?(sGf+<;0!Rqd7ib932%vF52|!vPGtfk!nLrDH zRswAT+68n3=nT+Jpe&#lKsiA9K;=LlkvUjBpe8_VfI0)wf!IKOfCd0X0F4Do0MY_k zfu;h@2U-cV31|<{aiB{;)bIaZqyPRIC1HUw1w0cMpq1<8F;Yc1JUj$p4@P1^R2KDj zHWua*EYrgseuF~RPpX2vnIDEJC>}gD6XW+QVUA&+UHSv){z9$atH^_GRDKq+__Elb z)R+XRDjqWKuKjg^{sG}3@XV7xJTeuOiea@~VJ+ovO~dG}q0}=^)NT>#;gA>(fLj&V zH`j25Os2uwxK&4l&?5V@epovP#~veMn6I1Tpa}J!HDNR?DvrV~@JO+!C@?x|l`Iu3 zhX~dbF#wdYGK~~k>Idt}XzCfWD5Vryc?6>#1yn&4a1CmJ@KYgE#p@H`4JR1pRV&SfE;o*8<*l^bvc!co}S6QkCi*k*NQK;cb zH7wdSE)E{|O2DvK*EldX@c14kvoGne1lKr)8lH7abd95)U&E4I<1|{iN*{+QV9B75 z!8ERbypYLErb?(yN0m^&!8J}NlOP(P6rkMzD4Cq zg~$pS*b7)&4{Pz*M)<3Wr=;5Cs;rh^n=9B?c+wEVw%eCrBeui7q=D@3PHIUBPY`1J zTs3MVcGNW)9@Nug$6U3bOc-|D6`E?l6z5$bSC3tE)m2NA>8hh1I)oVbs;f?~wV&ad zeTh254f_&xhC9>}^Z;Z=sU=kmY|i?%1e+gFOZI~wQA_Y2!=6w}dUX;!^Wmyj!&7;X zLjCNT;<${US1FE0V5P3c7@fU#jKb;vO&S<9bWl(TgRpxvfKQF!c%?2S2A)}?d>pJR ztpA@(&a&D8`u|UVAdriNJh>0OFD;|}9F;~gW9@soiuYcRc-b(oEq&6sVN?U~(~e5RNg$n3`) z#2m^T!5qVsGD+rS<_zXs=6dF4=1%5b=3(YB=4s}6<`w1*<~`;^=5yvN<_G2{W*)PM zS;nkly0dDr>arTLnzLH7IIWOte>n(Rt>f% zyAHbnyBWI`yFI%zyC<8@X0!S1KI}mD0QMku1bYN~EIXQ=z*exe>=d?@J)XUmoz8y1 ze#-vDE@e08_;MH=4QC=}K4&B62B(Nqhuebd&+W?%;SS*rf^EU9d@OJU`@s9A0^Um-t@UHT1^0Ii3crSRbc{#j7 zUMa7N=f-cs@5UGL&3uwSnLnMsoWF*@fxm};n16zQo`02phku{{jQ^6K&oAbe^D%*k zz)Mh1&`8ii&_>Wv&{g0oAOu{2P~b1fnJa*AO#Zz(*?5y z3k6FBs|9I-ErK0_eS$-Rz%#v)A?2#Ok zoRi#@JdwPXe4#Q|Gz{aqVpvalfBGPL0zHLprO%?Tq-W9})8Ei@>EG!;=#_ML+#7F* zcfh;jJUj>=goooJ@o{)OuEGtt6`zF9#24Vp@pbqXd^dgw&%kfsPw-cGDeg*m5Z**R zq6yKK=skXgd?V0p3Xu^O@3!6*)74PiyI5?NZ7 znKhB+$?nDuf$^nc>)7kqyV(cW=h=7Iuh{R|-kcVkcATCZoFm})aR$ODBRO+9D>>^q zyE$h$_c^(o3Qm1)7j6po3bz$6hNs}^c$0XGcq@5(VN6`(-Q|7YedW3Gz403%&>n1eJo$!d^n5u%B?4kQ7c4t`w#Tw+MF$j|ne= z{$&g6iJFRdqCTQPb3DdP)K$10*Vm zK{8RYNOD^8fYKW}_hNWk3j%xU(1*}~ifSbLFq8+xON>B{2T`#=MjIUW#m5o;}LFY5^F z3hOrOG2mkXAS1?hXE$WGg}&*{9>@*@42)$P*i+cE*vkO_PO#6iFSBp5@3XVnKiRE0 zJWhX33}-s@&LU10=PBns$D2z43ijg;;zn>~Tn*R8UC!ObJ-|K5y~};bea_9{7I9s8 ztpW3J-e6t?Zxm0;OWv`LF8N3dBoX_P4@FV!6_%ePHe>49i{~Z4{KZpO7 zU&ya1=q|tknPLP9fJD;-a|OEu`vpeJAf(K!neYY!a~55I--W6=AsUOC%z(ENY07c%2azzEA5>chdUFi2I5Mio?XC#p6I9lw!S@6fYL967LZo6dx0x z7iWrZitmeGh~J4z#Z}_Ql2(8-gCyf5T8UXQRkB60PjWo!1v?l!Q$5dBpFH!2a8W(NE)#hZ2fDZm?$IKFnTZsGL&H5r!lrL zE`ddV%lN^l&1?u(oWl%eMln^)Nz6sevtXlNGYgm%%(|?WFoNS*D%Jt8sb5(HJAgfm zJ(?ZQPG!%9F}#DF!9K%&!p>nAva8tjIlVbT&L~bIM-St7I%gqgHD?QFKj#GJGUqPm zIVTTBu?N?O+m-9fWpjnxB(9Y^pSzfw#@)o-!QI0>1QzoY_Z&BqdmVJ=0rwgACHDjO z6E~k*%&h<&@&p^|%k$&K@+`a=yc@h+o(I1--;W=~SMX=@SMoQ3wMz%hxz2yUf5rdI z|G{?!`_@{}LC^yOT<9wDu-l|&qE?_qT|kQn(GbyS(M-^tO`=Ppd!k38 zdg89)3F3KRZ8qAq;)?jW_`SFQP@{>YrGyI_F<3HMqL$1Ai-Qfpuo2MrH2^JG^iX;@ zT?2hS53u40{Q>9Hd*Q7CEe7Mm@HO~GJRNMv2mCYMi0DN0BqT&Q5lw6$wh`B% zkGnEh;K!Mue-|>2Gu|^kF^U-#3?C+oIe;0?90eG$5Rf4UFuID_0Q{_OEPvKemJG0Y z5+K8F)J>$NtJLVb|m|=5*(d;z~de?O}CU^+rxq+~+a58uZD~0QYhlL+t+;$a(isD7nMW?{B z=ZSiY1H?(!Swf7}X|Z9iPO46tt(IoCPa92agQuy8o|k!r4)y8y-n zH5M*&zj1wdZFn5Jrx?i_$%}&PDd#D{0vdVic*o$nUgZ_@hJt?;D>MjALL{6doB>yF zk#L#t9C%d}{(T1Y`zfpex(gqk5Cw<^h!R9M4c-y&i4%Aqye~cwFfIywsYMXeY{2*8ry!=ei$BHR;stmK-j47kScE?@nvfFl zgcf`yDze!Ip3+Goleka3BEAyM866qD89YXR#%M+yBN;5{YKUfbf)8|-ag*^B#>iK& zqZN#r%=*lh%uaxUe$0VjPbnlcFeiXTT?Y}&KISQiTqsN|WR}9%@nCsFtkTXNqx50* zXN_QuWhKKXn!sAfTEW`LIt)?B4c2{#Kyq2-FrFH+Td+Goyun~g*r9-*TClDQ*sIuS z>}~8r?Bifxue0y5AG1He_^J&$)sE8{bVnld^OX=Y?6srkSN>1FhoBDNClwv|3RnUO#0A3zQu|n) zESM!&2HyW+L5ARxAWM)f$Q6_byo7ayjfJfMRl5l};P;1uj};|U3H8Eh!ug<$+k|_; z&$=djBzzL#L#1fu@n(~lNK+qH74XoKjm=q%Xa+oGpngNwla))qGt zw-$F4_Ym{M1H^xb$3y-Ebkh~=Z(X{W9!L+N4+Wnsj;^4a06T8d zAJX5`8-vwl;}ZN2oCLpqKG@r{cqT;Hxp*<|Lg2($LQbR*6Tx$%{PiuwE{L&D5|_bS zcVX0LbYc+TlaFDF}pT>VY%32*Uq3t0|1q+>^Y!6+u8fT0$&0z`WgEz`y)FaG^mnY1LD*`P9!G* zuqTx>34FB`oK2ivoCBQWoHLwDfHofhuPecGYs_sAh#ke9z}*S{+9j~N_qp%6Ke%4J zh7hTC;?a2m(3wHtwT@QCE-iLK`WFJi)1pO)dq+F z4@%BUu1g+Dow_oXmd*#;tN}~16e7S9dQ*t`a9oTB<3m9o5^ybe z@yqe8;KAPl|Emgb4lx~0aEQJ{C=o%7B9xGMSxM|94nzEQfp|!KB0NDKcnp6=80dtW zF^Msgv6!)eu^%F{%Zw~WHsb@tW8IlJQ^X8lhA~GnW0^_JWadQX0_G~_4(3tjIl!Yk zpgV<-J@EqF>CEB*4#l&kvgQB+tpi(rn01DA8Bpj2>kI1#%L6c|4Z9Oq^+?f64g_XyeXpz-0i=1VP3l zk*npJ0BIJ1*LD*0<{|er_cLftC705iF5v5PctN~@yy4)jX?Rm0RyzgxinqLPyds_p zzYfG{y}=g<)zXIuytE*#fDmS7Fow!WHDR@2 z(O4Z>-C4dYrag-MgOvmpZVF`G=CPL8wQM6~+)hIz`GoZj?3^dt#~w%a0E8L>`n8R{ zmz@P((>L&#+&FbOZNX2{a3(-pu#%GoR_qeQ1lgQ-pjWj4huU#FbGh99kV&I*Xfq)$ zSPRzcB=U`K|UIDKXVgnz3 z8-8c7ZvFXTfJmwQsr=deWsnm)3^Bqj$cDWJR4Rq|vYtJ@^cM^ejD#ptA?}F zwStYHf2Zv6LcYL5SO;=iZ2_N{5Hs|JtQHk-Dut=waV-&^uzOm$5Ghm&+lq!mZb}FK z)kM)E(F)NS(M8dHJ34(46^mTOJ`hV%+SUzpEfO$F5AniGuw;A1N5rSZ7sPiVVxaO2 zC1A;#K&HW0;t&4S7>Qh>mslkWKQ`{HlG_og8=uoZgVmp$`VHiUd7dLf=O} zNj)6dU!LuJ>Csx0BZHahv1R+EY&o~JfwkNbqs%qKL@Ys8~zi=h(?f= zqCBfU;2}$iWMVS-Rq2q6ctm6qxkM3YT20Wgwvd(JG6EQb7$YHXtY(-QQy^cwim{Dx z5bWDE$QQq0e1^PIeP&xG8?wU#m@(i}jc3kct^qAO4spmsyFXRMtj}r%I>v)M?=V&Z zWOt{q=Cd{cf}Lhv1rO>2s}wS~P1x<&Jhnerz69{b_pz^nzw{b3tBUOhezp?)>#3Xt zoVDOp@8ulfoa9{KT(d`peM+7GXXY44K4}Mfr@S!>jdkX17wvaD`&w7A0950+HTnsVM7C^TTpl2mQcTp3F zLj6Sp?U_(DWI&ffzUmO| zVuebEOQIl?Wt5PTm6DB;!;+KWA3X=}=qIIPXE5vn#8Mvi>_jhm1U(vTp$W2~8|b^~ zCjrs!LRRYy{R`ZIXbN6Z5707yK(?Wf2Q@-=YXNxgyYVylRr~?|4$!Rv_a<5pUBN&4|(r-KY8wucMRnZ2M;KfKZ$=3^6pol=j#cY3iyz@nh3e`Rf64ubir+i zaz6=5!IISmf0-s^3B!dc!UfQ`8^PPj6yAg0b+^ZAexeA`SdmhMz+$}=eT3MzQsgOa zAZ`hsa9{9$=ZIGVYMg_p>^4}aeDH1>Lp(NGq5UG^X=T^RDwA@Ls|w%;PnIQ5Vfu!<~@*b}#fM zAbkx%D**$>AA(*u3UN!mphAGd_zD(AK!makGC#S1-aSPeQ81u460H+$5giv@5#0jp zeh1^p9sJ5bh>JB44_|~#Ulv5dEg%B+myDE1B@-koB$ptn$fm~3OPHqvg%^w&6@4Py zJJ>=0M(=|w@P&}8I}Uzg5ndZcKrq*AF7q9gLH36|)&R;03xf zJ2K;$>5$Fs!6I1UfRJvTw^FQrrU> zg-Grg$g)xBb{aBjFS%9VoiztvelPDn&%h4_M2Z*uFS_1>yUJ|o!i^vyxCgi3w%rAH z32u!x7Tn#XfyUjn3GVI?+}$C#cH>TC_o>=B=R0@Yarp;iuea8$X{#fu&MZ#leKxr6 zo?+~0yV%gafVC5OQ+aRrvhY7F<8R^*dJ`0sj5Aae#&L-855DWAuqhk4Jx=gt-!?t~ zySz3|G~G63M2Ywf#UVYa!Cz>76|EzztJ!02+0!^89N8Utx#>$fDmxlDn(GW6z^?kq zk;+*V{cE6e7@Y7Wu;Mp1i$X3Bn`sn`Q7cyu*FbiP$=u+ZRM9%&y5zbJ&-cWY(4CYW zwJ={<88oZr{Ga3om#=LJJH{sN?<=}ve0L}Co@=n8FFoPjyzrk6Hug#0joyne0SUm3*QkEt{Vt!)cT-BGl*d;Z754y6hXIuC|PWJt!g zmEB-6IMB5#8JZYcqHXt5erP&-_!`4j!)flCd)zbO##F}iAR3RcBwJWrFmz92fA;dF z#+AwwT?fxRG`{1eNo~q#$_JJyYpQH&Y--8(_NQqgQ*0BA=>>MNC)_)s<|N?e%;sEX zyV=WcRLxw++@4>l7n5xab1g{R^N^5p&UaJSbwLB=Nv9$+m(O|yh>DDzc>)WkI+0-7P zRljD-53{94jWOFCwsL4Otw7SlY@=*5z&)av?X#Uji@Awr_8A^BBpz1_BU>Kcv8KI= zy)%4cKe)z8Z2jx(o8cF)vhTmNzhmQ1#|+H@`(DOT$x+?W#LGXQ59WvUG2cy zJ=yDKxaPSQGktfsVqG^}ci`hg+!>g_xnPsr?vk)cHQi0!trQOpcaMSpo#S54WDX$i z3+}7zd#~Le-T%6icv5*XfxC;L+tpMRxgAVrKRBg1o*2(6&jHx_D{%F1;5ZX{!@W7Z zg-~}~Y%=UfBRd5G^l&iepWM{sx=xO$V%3)@+rQ`^zkjh$}_%<>Z7 z4sO*mAn|8ZO5Ki-SkkbakF2f1KCGOt`;Pan`{NCt>R`r3G;cAjZm;uxH%^% z-HIk0g)YzvcgGNzhUs`ZHh|HOm`|eq{%!usZJmtMoX1iOzM&Kjjuz~L-MG1@=xN>o z+i-@{{LJ!>$rNIZu;xbDHCZd59W+MW?SryA**aHU7`r*iSJ(&NperV{h1+u43fZi9 zETU`;ImzvCRQze1Zkwa`{Si?7Jvgh6=!&V(e+z=mJoZv>=S@KL-BdrC4^G<+KYoET z{M!B%3=rpA1O0mgXa`RYmH%?68Q^_E20Xuv7$=^fx5$+oysna?vQ&W}NR!M-psM{YPz;Ut9h z?8&Y;nOkZxPKFa`jrU=-zQV?*hKn!22^B2T3SYxOG?D4tS{wa4{ITqc&qWnMpAHVX z&8!VJBsXL-5S( z4gzo7x=Ys+!8r; z)|OBPzbU$supXn~W#@R8!^<9F8$Hiye&Bu0%$127!A@F;6YcYr2XQrL>JImf<2*0( ztpR)O^PK`$zhXoE>I?BFMKO)^``A${`fD zZqI-YRSY*y6?Tdy?99D5@6$N(qUi5qBHxC)dt?7*57V<=L@|AJ_OoV=4yaJW9phBl zU+LJ63+_0`A`T`01DG_-ncA5HWMP0;Da&*geYh*C!X!8qIqkdgx19$6-v_CFaR%Y( zNe_=wgc)4|d{NKU%+)r27nlaZSOLP=?>g=}kGJiy>m#aFD6=}h+kj)FjJvA45nOTy z+-pN&^k%`etYKasa-T-Cx`$@<*&T#;BpoxmFsz=qf@*N;+j_ddDUXEJlZ||%=NMjq z>-Yd(qC_X~Ci6zXDHjL%mcWTt2Tr*I4zwZOF(?s>*eAq=cFKDhJyo>oU+n9tVEgj= ztUedIbq$v1w2;48QSAN>LqRygU5mYiT}3pk`Q-+*jHfiGYZ+;j}*e-~fCIX(Sfz}3ld zr$kzdz)qLMBU<0uOy~V@>p159BI`;${m0p$;;jGR0TqT?kaYokpQ7v60h9cW7CV;x zc^)%=qiw(Kxa~Yj+GAAy?|cKP?3wKO?FPF8HLa?>k-a5+L?0N5iR{;l(9^cs522-r zI`SNB^3$H!k-<@%@1O)cMIFcQddBr4O2g{D-}39609PsNflRp&`M``rXg_J)0z8g zTw4^cT*Kk{4A;~TS5mawtoS;OinXh|o49+k-Hmon1GTKix48$;<^`17XYM!d?;w}7 zD7TR?j!yWHC{KOGF8$g4#(8Gp!&vXx0nR=R&VG!x@*XEl7H=f3Oa}<2I?75jzJi|U zapSzx_zG5fx5IiL=PQWw{^R}N{mxgA+Lr^gZSZ-(GPRieE%^@m`o^#&&SduQXX`%i zyUphP9tAf64!cbL{C)#|nKJN`jr=YB9sGUZSSF(3F2d`vRrR{d?2yle-)a^djG$i_Ed;wz|xi>ia62VcM#!%Wnd6?_4E4W|s3!QIdB8psWhiZ389jHSm|hA*H2 zym%L5ALD=SfHiyrvG_%<8t>xEON?hT!W0SmE`_ouPR*94c4&KpU@^zx)SL(2348;B zb{@cyy)%6={V;{&&&)zgiO*aWezOH%K`-|I5sJkZn3tQ^m^X1B9D?P%4d?ToFCiS3 zGc$gKV(^?UT$l|l&DbzIsPDxV9Zw#>3ozlP)ZFRxqfavyxbMV%B+PjT*oQZQ|e za7%Xv{ft1bSjF1NiX+oqpyq7qoB5#K})zKOATf#!mSw!qdM#~po*+u^l6 z34D+2n@${pmDMHP9CfEVSZEL)g^BuIY(?cc2s;&r*Xx}sh^fFrkcO;j z$MH1`KlEhhT<(Zf&duBqmsCys%m$hOr6(i4&wOZ#<&}YL3nJ>z4mukD=Th_@LGt1W z`$sX6xWaPtWfVng6t8nVcV`&+F)$ws!1J5%G#r2(yr7uqnfn#I*e`b~w4c15LU_gM zgX`O>?lTb8aXeqge9vlh$3vd8F!OPqCwLpacz&Q%CkGql#ob`#rYOrcDtARY)W<)( z6TH*C3)o0Efc8ZlI*&f|3>ET=_Xl4}a`@fccny7UQdNC*aT~S;C5aPfG`Geq_R|d@ zr2}w~mwY$TB|rIovH_&PkCPL%$l$kfbCiXxkEmJq7w4$q-T%KYc{aSmN1v)CaHr)&`vdi32d_q&^33!qg^sz zhn;zb<`ilPBcBk#O=4zi@R3ZYkNVUW{izRI?NrMw%K|j09o!}I_1v~RL`VMxno5Cd zIS=jFZfgl#kIfWI^-@<)081U=`*~yi2pg9KM~?+XO8h)c@InqmO`mLA67QD10)`5* zC$uNEXR}ALHI%SduvZ5~MdQU7gBxQpOxI| ze|JZ_2dYXH!<}(b{ryi-;s52E2!odqw@-d<4F_LFC43w8JWFR;6>pKl2F$|Tsw1-`X-Fn6G-o>Yt# z2cILmMZhDJ1_dne#n_bDsR-I?h!WNoXGkBku;Ko3V6H_lzdN{XPO(K__uuEcd5hN1 zT{DE<1-_dEd^c(MZgR76lw+5!Yv^d`$2R>Z8p}Eq|9yNf4^YQso6f*CosVy&lCd7{ z-OgaGVQ4K=aF1-j-FCuwmhVJZo-k8NQ!bOm|XT$SsG3`S$ zyJ&hy3Lw;+f!ie)D9eK$+YrUSqq#dwk0f{|li-<$vm|iG>_AsIh425N`6WBYPjd>i z*?eFv;V&D*)ptWn8_V}GkIi}m?*0S1U0>h}d0=^t(i zIN;91X^MmC4Lf&;J217FTS8r_~TaLtULf)euIR~KOnGAxK_elX~AIGVb6=Ri&Vfd*NC*u5Z8Eh6)eZ^ zbij31zomzyY<}RMOUX@>*_{{0)2_*yDs14gkMwm9S10lu_K{uOHsWNDgLe<+i^_=d zE2>m!wvlQ$lUtzvc0nH;!X7@0w8C1Lq+QB*-UW%h#^(}-4xE*pq%fRk1<+VCZ+rBs ze!7!P_0GfTvRWPOw^4;(<3RY1l9iG@Ji9Nyx?TSFyZO^Mk8ehHlC!=WzK8m?{EJqc zS-+Ix?BZo`)V0CsIh2iL1`N|Gyi+^yBb?y-xCI`20uKrzQv+@~y;oA{*WrN$t%I+w z73y(MFxg0apR$+y->q^775NRG=OAN3{0iCFOp4-k_p+N*H8z43?T+{E54Q6e?B^@c zly|^E9cM$i$5-pbkR3fUt{I!j2jgE2cXTsTE54nc+%O|elW;PuFs;SSAe*{; zJ+DwPf0z=PlbR#U+0bW-;%V@r!Bu5jX$&jXQ@vSpam%kWZ#C}&qn&48xkviqjrk)u zEurr1IYDY}nA2KhWm?0X_OkTno*55LTY{fvA79ZK%VoCq*OpJ*GHGzugKN2M z9ec}3+eJ3_d$yPO|9;rQ*xnCk;;*i@5g|bv; z)3dV_Wp^*(F3zwx7#xL;##wv(JSp<%W!uY`)XuOTMaayyxkMK@pYnj7sv&(y$ z{Ma=V!GFEU*jO^6v%7p%*xKu{uk?ebn#{Jc6i?V`-v!?_-y_`T$>3fyvacKbCH+;n zK^mb2_XKavLVsU_JM6M%Jzl_3@l`AeCPVz6JtZ^F!UCj(JTO(|`8w*uRki!?&OYV8 zJIgNeAIDMa@8KQ$LLwk3YC!}yiEQppzK$B~EiH}hxKH|ky+#`+;Fz9gTx?uJ5_CJx zizBdDS9Onnjz95V9E!qbMS#Teu+1CQ=~EwvS$nWpAJb6w`N^s$tTt_6qdy2DJCCYx z53TGU5@%mc;xkJb|HTwzukpa-Rx#H!*CRvPim#>@*lYyK*(|iP4LAZ0p){OFI}@(! zm1^4Iuw9u|JF7@)v=ukcK-`V9b*tIN*K*VH7#%biM3xEV%*sAf9o?*r=E#Ox|FllB zu7J;tMQw;DlrN;J&sx%Y)MDI~&J;BSW}nX2S5U=cYM?i|9H??G21q zN>^4_QG7pc5LH#2A+4DHeLZ9G^UuKzyBc@M6Y`NiJ;^o8B-@3!r)z_sqT|ui7|!!z z)Gl#1o+OhJ$9ewSE9s?@aIRH3$7LY>iLJXBd1W`cc?}fYR%{O4NllJ4jz#rafxaM)p$lN41gha? zi$_CM(HB~iW$wX5pNh6FuG)Q^&@-mE`1AP#L?jzSL1ww%TnUe@YzZ;=h&Hk%oMBJ6 zAD?3mBl(mM52S1eHFU@B8m}!(v8*KDc*t@J-And^q@2RyU>->$*T91zDdeGeAeXRN zZ@}5G-+CC#6K8#9eGAX}!%5#u6C7)Q+ZfwKw(2!-Oxs~u@5KAB#k()K-w0>q z2enitMJzhOAoZllsfuxIBwx$z3-G%Y774>`KxFh;T&Hy|!6( zWwt(EwP;c~!`$Q5pLPJx(mfE$D}35PorJdoQ8AyL4Y&-` zw+<>nC%B?X;Q6KKUOVw~pJ)2s#((n*pGHbeRu#Y}>0$4!g15T?D898i{%3&S1G&3H zaHdbeCSUx&{6PnTgCaPyNl?LZ81kbRSWsze;yGvyI_ae+b}F8Ot2ijd*Y;hrzFBqC zwZj#aCcRl(^LOp=xJ?AVFMu&!N6L4P=8Gg35M)Y$mohiHm`x{a74?JkK{5CPy>^yq z0T}^tgdZ}UKpndZSM(Dkk_t4R)0~f~T2|+2TfCKhnWYoSel9>ATV*~-a^)(s^a&W` z6T5DDi})gI-~?)lue+n3x1l%&<}>jwfu?`jlHl&X$JQ9iG|JC8iDlYc=3f5H3CZTl ztNwi(PMZ=aO5(Puji%JZ)e@e4AfDN=u1Vlq(UrEV@8$}3^+V3hYt@zn;bzerTNM2& z?i%mQC`c3#1_%A7vn&~tEEl)4 z6E37Gj=5GaiQU1h^9@VUNY|l}%0#{iw&2SWrjQ5-z0bd5V zz_+mCxiszPr2(NMxN;EFYKm<(8vO~JCU;=NzvG+CNhZl?ccBN>Csi^~apY2*w#V&f z?KemxJ;!C631?R^?#C*c0}kw7lermV@#9r4r-gxMB% z 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 z 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

%P%2XV)2XI8pI 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 H_AmYy$1#KB literal 2420770 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�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�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 z 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 z

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

  • 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 q8)AM`Yn$p? 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

    DekeDo#G(c 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

    *^fdXK`lewcsYPw$d+WlHPP8Zfyh{M$;y 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

    n)$F2 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%0A5xZ%Fbh~bI%d|7Lhr07b19$Uj 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 V@^GWba6Q@`p`Y_g3qIf9{{v}C#lZjo diff --git a/core/cd_hw/cdd.c b/core/cd_hw/cdd.c index cdf2009..6991270 100644 --- a/core/cd_hw/cdd.c +++ b/core/cd_hw/cdd.c @@ -273,6 +273,14 @@ int cdd_context_load(uint8 *state) } /* seek to current track position */ +#if defined(USE_LIBCHDR) + if (cdd.chd.file) + { + /* CHD file offset */ + cdd.chd.hunkofs = cdd.toc.tracks[cdd.index].offset + (lba * CD_FRAME_SIZE); + } + else +#endif if (cdd.toc.tracks[cdd.index].type) { /* DATA track */ @@ -313,7 +321,158 @@ int cdd_load(char *filename, char *header) /* open file */ fd = cdStreamOpen(filename); - if (!fd) return (-1); + if (!fd) + return (-1); + +#if defined(USE_LIBCHDR) + if (!memcmp(".chd", &filename[strlen(filename) - 4], 4) || !memcmp(".CHD", &filename[strlen(filename) - 4], 4)) + { + int sectors = 0; + char metadata[256]; + const chd_header *head; + + /* open CHD file */ + if (chd_open_file(fd, CHD_OPEN_READ, NULL, &cdd.chd.file) != CHDERR_NONE) + { + chd_close(cdd.chd.file); + cdStreamClose(fd); + return -1; + } + + /* retrieve CHD header */ + head = chd_get_header(cdd.chd.file); + + /* detect invalid hunk size */ + if ((head->hunkbytes == 0) || (head->hunkbytes % CD_FRAME_SIZE)) + { + chd_close(cdd.chd.file); + cdStreamClose(fd); + return -1; + } + + /* allocate hunk buffer */ + cdd.chd.hunk = (uint8 *)malloc(head->hunkbytes); + if (!cdd.chd.hunk) + { + chd_close(cdd.chd.file); + cdStreamClose(fd); + return -1; + } + + /* initialize hunk size (usually fixed to 8 sectors) */ + cdd.chd.hunkbytes = head->hunkbytes; + + /* initialize buffered hunk index */ + cdd.chd.hunknum = -1; + + /* retrieve tracks informations */ + for (cdd.toc.last = 0; cdd.toc.last < 99; cdd.toc.last++) + { + int tracknum = 0, frames = 0, pregap = 0, postgap = 0; + char type[16], subtype[16], pgtype[16], pgsub[16]; + type[0] = subtype[0] = pgtype[0] = pgsub[0] = 0; + + /* attempt fetch either complete or partial metadata for current track */ + if (chd_get_metadata(cdd.chd.file, CDROM_TRACK_METADATA2_TAG, cdd.toc.last, metadata, 256, 0, 0, 0) == CHDERR_NONE) + { + if (sscanf(metadata, CDROM_TRACK_METADATA2_FORMAT, &tracknum, &type[0], &subtype[0], &frames, &pregap, &pgtype[0], &pgsub[0], &postgap) != 8) + break; + } + else if (chd_get_metadata(cdd.chd.file, CDROM_TRACK_METADATA_TAG, cdd.toc.last, metadata, 256, 0, 0, 0) == CHDERR_NONE) + { + if (sscanf(metadata, CDROM_TRACK_METADATA_FORMAT, &tracknum, &type[0], &subtype[0], &frames) != 4) + break; + } + + /* no more track */ + else break; + + /* detect out of order track number or invalid parameter */ + if ((tracknum != (cdd.toc.last + 1)) || (frames < 0) || (pregap < 0) || (postgap < 0)) + break; + + /* detect track type */ + if (cdd.toc.last) + { + /* CD-ROM track supported only for first track */ + if (strcmp(type, "AUDIO")) + break; + + /* Audio track start LBA (adjusted with pregap length) */ + cdd.toc.tracks[cdd.toc.last].start = cdd.toc.end + pregap; + } + else + { + /* COOKED format (2048 bytes data blocks) */ + if (!strcmp(type, "MODE1")) + cdd.sectorSize = 2048; + + /* RAW format (2352 bytes data blocks) */ + else if (!strcmp(type, "MODE1_RAW")) + cdd.sectorSize = 2352; + + /* unsupported track format */ + else if (strcmp(type, "AUDIO")) + break; + + /* Data track start LBA (2s pause assumed by default) */ + cdd.toc.tracks[0].start = 0; + } + + /* detect pregap type */ + if (pgtype[0] != 'V') + { + /* clear pause length for further calculations (not included in CHD file) */ + pregap = 0; + } + + /* track end LBA (remove included pause from CHD track length) */ + cdd.toc.tracks[cdd.toc.last].end = cdd.toc.tracks[cdd.toc.last].start + frames - pregap; + + /* CHD file offset for current track */ + cdd.toc.tracks[cdd.toc.last].offset = (sectors + pregap - cdd.toc.tracks[cdd.toc.last].start) * CD_FRAME_SIZE; + + /* update TOC end with postgap length */ + cdd.toc.end = cdd.toc.tracks[cdd.toc.last].end + postgap; + + /* update CHD file sector count (adjusted with end of the track padding) */ + sectors += (((frames + CD_TRACK_PADDING - 1) / CD_TRACK_PADDING) * CD_TRACK_PADDING); + + /* indicate valid track file */ + cdd.toc.tracks[cdd.toc.last].fd = fd; + } + + /* valid CD-ROM image file ? */ + if (cdd.sectorSize) + { + /* read first chunk of data */ + cdd.chd.hunknum = cdd.toc.tracks[0].offset / cdd.chd.hunkbytes; + chd_read(cdd.chd.file, cdd.chd.hunknum, cdd.chd.hunk); + + /* copy CD image header + security code */ + memcpy(header, cdd.chd.hunk + (cdd.toc.tracks[0].offset % cdd.chd.hunkbytes) + 0x10, 0x210); + + /* there is a valid DATA track */ + cdd.toc.tracks[0].type = TYPE_CDROM; + } + + /* valid CD image ? */ + if (cdd.toc.last && (cdd.toc.end < (100*60*75))) + { + /* Lead-out */ + cdd.toc.tracks[cdd.toc.last].start = cdd.toc.end; + + /* CD mounted */ + cdd.loaded = 1; + return 1; + } + + /* invalid CHD file */ + chd_close(cdd.chd.file); + cdStreamClose(fd); + return -1; + } +#endif /* save a copy of base filename */ strncpy(fname, filename, 256); @@ -1006,6 +1165,13 @@ void cdd_unload(void) { int i; +#if defined(USE_LIBCHDR) + chd_close(cdd.chd.file); + if (cdd.chd.hunk) + free(cdd.chd.hunk); + memset(&cdd.chd, 0x00, sizeof(cdd.chd)); +#endif + /* close CD tracks */ for (i=0; i= 0)) { +#if defined(USE_LIBCHDR) + if (cdd.chd.file) + { + /* CHD file offset */ + int offset = cdd.toc.tracks[0].offset + (cdd.lba * CD_FRAME_SIZE); + + /* CHD hunk index */ + int hunknum = offset / cdd.chd.hunkbytes; + + /* update CHD hunk cache if necessary */ + if (hunknum != cdd.chd.hunknum) + { + chd_read(cdd.chd.file, hunknum, cdd.chd.hunk); + cdd.chd.hunknum = hunknum; + } + + /* copy Mode 1 sector data (2048 bytes only, skipping 16-byte header) */ + memcpy(dst, cdd.chd.hunk + (offset % cdd.chd.hunkbytes) + 16, 2048); + return; + } +#endif + /* seek current track sector */ if (cdd.sectorSize == 2048) { @@ -1064,7 +1253,7 @@ void cdd_read_data(uint8 *dst) cdStreamSeek(cdd.toc.tracks[0].fd, cdd.lba * 2352 + 16, SEEK_SET); } - /* read sector data (Mode 1 = 2048 bytes) */ + /* read Mode 1 sector data (2048 bytes only) */ cdStreamRead(dst, 2048, 1, cdd.toc.tracks[0].fd); } } @@ -1075,7 +1264,7 @@ void cdd_read_audio(unsigned int samples) int prev_l = cdd.audio[0]; int prev_r = cdd.audio[1]; - /* get number of internal clocks (samples) needed */ + /* get number of internal clocks (CD-DA samples) needed */ samples = blip_clocks_needed(snd.blips[2], samples); /* audio track playing ? */ @@ -1090,6 +1279,83 @@ void cdd_read_audio(unsigned int samples) int endVol = scd.regs[0x34>>1].w >> 4; /* read samples from current block */ +#if defined(USE_LIBCHDR) + if (cdd.chd.file) + { +#ifndef LSB_FIRST + int16 *ptr = (int16 *) (cdd.chd.hunk + (cdd.chd.hunkofs % cdd.chd.hunkbytes)); +#else + uint8 *ptr = cdd.chd.hunk + (cdd.chd.hunkofs % cdd.chd.hunkbytes); +#endif + + /* process 16-bit (big-endian) stereo samples */ + for (i=0; i endVol) + { + /* fade-out */ + curVol--; + } + else if (!curVol) + { + /* audio will remain muted until next setup */ + break; + } + } + } + else +#endif #if defined(USE_LIBTREMOR) || defined(USE_LIBVORBIS) if (cdd.toc.tracks[cdd.index].vf.datasource) { @@ -1265,7 +1531,7 @@ static void cdd_read_subcode(void) void cdd_update(void) { #ifdef LOG_CDD - error("LBA = %d (track n°%d)(latency=%d)\n", cdd.lba, cdd.index, cdd.latency); + error("LBA = %d (track %d)(latency=%d)\n", cdd.lba, cdd.index, cdd.latency); #endif /* seeking disc */ @@ -1354,6 +1620,14 @@ void cdd_update(void) scd.regs[0x36>>1].byte.h = 0x01; /* seek to next audio track start */ +#if defined(USE_LIBCHDR) + if (cdd.chd.file) + { + /* CHD file offset */ + cdd.chd.hunkofs = cdd.toc.tracks[cdd.index].offset + (cdd.toc.tracks[cdd.index].start * CD_FRAME_SIZE); + } + else +#endif #if defined(USE_LIBTREMOR) || defined(USE_LIBVORBIS) if (cdd.toc.tracks[cdd.index].vf.seekable) { @@ -1449,6 +1723,14 @@ void cdd_update(void) } /* seek to current track position */ +#if defined(USE_LIBCHDR) + if (cdd.chd.file) + { + /* CHD file offset */ + cdd.chd.hunkofs = cdd.toc.tracks[cdd.index].offset + (cdd.lba * CD_FRAME_SIZE); + } + else +#endif if (cdd.toc.tracks[cdd.index].type) { /* DATA track */ @@ -1670,13 +1952,15 @@ void cdd_process(void) lba = cdd.toc.tracks[index].start; } - /* seek to current subcode position */ - if (cdd.toc.sub) - { - cdStreamSeek(cdd.toc.sub, lba * 96, SEEK_SET); - } - /* seek to current track position */ +#if defined(USE_LIBCHDR) + if (cdd.chd.file) + { + /* CHD file offset */ + cdd.chd.hunkofs = cdd.toc.tracks[cdd.index].offset + (lba * CD_FRAME_SIZE); + } + else +#endif if (cdd.toc.tracks[index].type) { /* DATA track */ @@ -1695,6 +1979,12 @@ void cdd_process(void) cdStreamSeek(cdd.toc.tracks[index].fd, (lba * 2352) - cdd.toc.tracks[index].offset, SEEK_SET); } + /* seek to current subcode position */ + if (cdd.toc.sub) + { + cdStreamSeek(cdd.toc.sub, lba * 96, SEEK_SET); + } + /* no audio track playing (yet) */ scd.regs[0x36>>1].byte.h = 0x01; @@ -1767,8 +2057,16 @@ void cdd_process(void) { lba = cdd.toc.tracks[index].start; } - - /* seek to current block */ + + /* seek to current track position */ +#if defined(USE_LIBCHDR) + if (cdd.chd.file) + { + /* CHD file offset */ + cdd.chd.hunkofs = cdd.toc.tracks[cdd.index].offset + (lba * CD_FRAME_SIZE); + } + else +#endif if (cdd.toc.tracks[index].type) { /* DATA track */ diff --git a/core/cd_hw/cdd.h b/core/cd_hw/cdd.h index bd09677..ab38bbb 100644 --- a/core/cd_hw/cdd.h +++ b/core/cd_hw/cdd.h @@ -46,6 +46,11 @@ #include "tremor/ivorbisfile.h" #endif +#if defined(USE_LIBCHDR) +#include "libchdr/src/chd.h" +#include "libchdr/src/cdrom.h" +#endif + #define cdd scd.cdd_hw /* CDD status */ @@ -59,8 +64,6 @@ #define NO_DISC 0x0B #define CD_END 0x0C -#define CD_MAX_TRACKS 100 - /* CD track */ typedef struct { @@ -79,10 +82,22 @@ typedef struct { int end; int last; - track_t tracks[CD_MAX_TRACKS]; + track_t tracks[100]; cdStream *sub; } toc_t; +#if defined(USE_LIBCHDR) +/* CHD file */ +typedef struct +{ + chd_file *file; + uint8 *hunk; + int hunkbytes; + int hunknum; + int hunkofs; +} chd_t; +#endif + /* CDD hardware */ typedef struct { @@ -96,6 +111,9 @@ typedef struct uint8 status; uint16 sectorSize; toc_t toc; +#if defined(USE_LIBCHDR) + chd_t chd; +#endif int16 audio[2]; } cdd_t; diff --git a/core/cd_hw/libchdr/LICENSE.txt b/core/cd_hw/libchdr/LICENSE.txt new file mode 100644 index 0000000..1c36e5b --- /dev/null +++ b/core/cd_hw/libchdr/LICENSE.txt @@ -0,0 +1,24 @@ +Copyright Romain Tisserand +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the 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 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. diff --git a/core/cd_hw/libchdr/README.md b/core/cd_hw/libchdr/README.md new file mode 100644 index 0000000..940920a --- /dev/null +++ b/core/cd_hw/libchdr/README.md @@ -0,0 +1,7 @@ +# libchdr + +libchdr is a standalone library for reading MAME's CHDv1-v5 formats. + +The code is based off of MAME's old C codebase which read up to CHDv4 with OS-dependent features removed, and CHDv5 support backported from MAME's current C++ codebase. + +libchdr is licensed under the BSD 3-Clause (see [LICENSE.txt](LICENSE.txt)) and uses third party libraries that are each distributed under their own terms (see each library's license in [deps/](deps/)). diff --git a/core/cd_hw/libchdr/deps/libFLAC/AUTHORS b/core/cd_hw/libchdr/deps/libFLAC/AUTHORS new file mode 100644 index 0000000..8fe9092 --- /dev/null +++ b/core/cd_hw/libchdr/deps/libFLAC/AUTHORS @@ -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 + +Original author: Josh Coalson + +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" +* Visual Studio build system. +* Optimisations in the encoder and decoder. + +"Janne HyvÃĪrinen" +* Visual Studio build system. +* Unicode handling on Windows. + +"Andrey Astafiev" +* Russian translation of the HTML documentation + +"Miroslav Lichvar" +* IA-32 assembly versions of several libFLAC routines + +"Brady Patterson" +* AIFF file support, PPC assembly versions of libFLAC routines + +"Daisuke Shimamura" +* i18n support in the XMMS plugin + +"X-Fixer" +* Configuration system, tag editing, and file info in the Winamp2 plugin + +"Matt Zimmerman" +* Libtool/autoconf/automake make system, flac man page + diff --git a/core/cd_hw/libchdr/deps/libFLAC/COPYING.Xiph b/core/cd_hw/libchdr/deps/libFLAC/COPYING.Xiph new file mode 100644 index 0000000..d8295f0 --- /dev/null +++ b/core/cd_hw/libchdr/deps/libFLAC/COPYING.Xiph @@ -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. diff --git a/core/cd_hw/libchdr/deps/libFLAC/README b/core/cd_hw/libchdr/deps/libFLAC/README new file mode 100644 index 0000000..dd5e6e7 --- /dev/null +++ b/core/cd_hw/libchdr/deps/libFLAC/README @@ -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. diff --git a/core/cd_hw/libchdr/deps/libFLAC/bitmath.c b/core/cd_hw/libchdr/deps/libFLAC/bitmath.c new file mode 100644 index 0000000..b3d797d --- /dev/null +++ b/core/cd_hw/libchdr/deps/libFLAC/bitmath.c @@ -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 +#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; +} diff --git a/core/cd_hw/libchdr/deps/libFLAC/bitreader.c b/core/cd_hw/libchdr/deps/libFLAC/bitreader.c new file mode 100644 index 0000000..ab62d41 --- /dev/null +++ b/core/cd_hw/libchdr/deps/libFLAC/bitreader.c @@ -0,0 +1,1087 @@ +/* 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 +#endif + +#include +#include +#include "private/bitmath.h" +#include "private/bitreader.h" +#include "private/crc.h" +#include "private/macros.h" +#include "FLAC/assert.h" +#include "share/compat.h" +#include "share/endswap.h" + +/* Things should be fastest when this matches the machine word size */ +/* WATCHOUT: if you change this you must also change the following #defines down to COUNT_ZERO_MSBS2 below to match */ +/* WATCHOUT: there are a few places where the code will not work unless brword is >= 32 bits wide */ +/* also, some sections currently only have fast versions for 4 or 8 bytes per word */ + +#if (ENABLE_64_BIT_WORDS == 0) + +typedef FLAC__uint32 brword; +#define FLAC__BYTES_PER_WORD 4 /* sizeof brword */ +#define FLAC__BITS_PER_WORD 32 +#define FLAC__WORD_ALL_ONES ((FLAC__uint32)0xffffffff) +/* SWAP_BE_WORD_TO_HOST swaps bytes in a brword (which is always big-endian) if necessary to match host byte order */ +#if WORDS_BIGENDIAN +#define SWAP_BE_WORD_TO_HOST(x) (x) +#else +#define SWAP_BE_WORD_TO_HOST(x) ENDSWAP_32(x) +#endif +/* counts the # of zero MSBs in a word */ +#define COUNT_ZERO_MSBS(word) FLAC__clz_uint32(word) +#define COUNT_ZERO_MSBS2(word) FLAC__clz2_uint32(word) + +#else + +typedef FLAC__uint64 brword; +#define FLAC__BYTES_PER_WORD 8 /* sizeof brword */ +#define FLAC__BITS_PER_WORD 64 +#define FLAC__WORD_ALL_ONES ((FLAC__uint64)FLAC__U64L(0xffffffffffffffff)) +/* SWAP_BE_WORD_TO_HOST swaps bytes in a brword (which is always big-endian) if necessary to match host byte order */ +#if WORDS_BIGENDIAN +#define SWAP_BE_WORD_TO_HOST(x) (x) +#else +#define SWAP_BE_WORD_TO_HOST(x) ENDSWAP_64(x) +#endif +/* counts the # of zero MSBs in a word */ +#define COUNT_ZERO_MSBS(word) FLAC__clz_uint64(word) +#define COUNT_ZERO_MSBS2(word) FLAC__clz2_uint64(word) + +#endif + +/* + * This should be at least twice as large as the largest number of words + * required to represent any 'number' (in any encoding) you are going to + * read. With FLAC this is on the order of maybe a few hundred bits. + * If the buffer is smaller than that, the decoder won't be able to read + * in a whole number that is in a variable length encoding (e.g. Rice). + * But to be practical it should be at least 1K bytes. + * + * Increase this number to decrease the number of read callbacks, at the + * expense of using more memory. Or decrease for the reverse effect, + * keeping in mind the limit from the first paragraph. The optimal size + * also depends on the CPU cache size and other factors; some twiddling + * may be necessary to squeeze out the best performance. + */ +static const unsigned FLAC__BITREADER_DEFAULT_CAPACITY = 65536u / FLAC__BITS_PER_WORD; /* in words */ + +struct FLAC__BitReader { + /* any partially-consumed word at the head will stay right-justified as bits are consumed from the left */ + /* any incomplete word at the tail will be left-justified, and bytes from the read callback are added on the right */ + brword *buffer; + unsigned capacity; /* in words */ + unsigned words; /* # of completed words in buffer */ + unsigned bytes; /* # of bytes in incomplete word at buffer[words] */ + unsigned consumed_words; /* #words ... */ + unsigned consumed_bits; /* ... + (#bits of head word) already consumed from the front of buffer */ + unsigned read_crc16; /* the running frame CRC */ + unsigned crc16_align; /* the number of bits in the current consumed word that should not be CRC'd */ + FLAC__BitReaderReadCallback read_callback; + void *client_data; +}; + +static inline void crc16_update_word_(FLAC__BitReader *br, brword word) +{ + register unsigned crc = br->read_crc16; +#if FLAC__BYTES_PER_WORD == 4 + switch(br->crc16_align) { + case 0: crc = FLAC__CRC16_UPDATE((unsigned)(word >> 24), crc); + case 8: crc = FLAC__CRC16_UPDATE((unsigned)((word >> 16) & 0xff), crc); + case 16: crc = FLAC__CRC16_UPDATE((unsigned)((word >> 8) & 0xff), crc); + case 24: br->read_crc16 = FLAC__CRC16_UPDATE((unsigned)(word & 0xff), crc); + } +#elif FLAC__BYTES_PER_WORD == 8 + switch(br->crc16_align) { + case 0: crc = FLAC__CRC16_UPDATE((unsigned)(word >> 56), crc); + case 8: crc = FLAC__CRC16_UPDATE((unsigned)((word >> 48) & 0xff), crc); + case 16: crc = FLAC__CRC16_UPDATE((unsigned)((word >> 40) & 0xff), crc); + case 24: crc = FLAC__CRC16_UPDATE((unsigned)((word >> 32) & 0xff), crc); + case 32: crc = FLAC__CRC16_UPDATE((unsigned)((word >> 24) & 0xff), crc); + case 40: crc = FLAC__CRC16_UPDATE((unsigned)((word >> 16) & 0xff), crc); + case 48: crc = FLAC__CRC16_UPDATE((unsigned)((word >> 8) & 0xff), crc); + case 56: br->read_crc16 = FLAC__CRC16_UPDATE((unsigned)(word & 0xff), crc); + } +#else + for( ; br->crc16_align < FLAC__BITS_PER_WORD; br->crc16_align += 8) + crc = FLAC__CRC16_UPDATE((unsigned)((word >> (FLAC__BITS_PER_WORD-8-br->crc16_align)) & 0xff), crc); + br->read_crc16 = crc; +#endif + br->crc16_align = 0; +} + +static FLAC__bool bitreader_read_from_client_(FLAC__BitReader *br) +{ + unsigned start, end; + size_t bytes; + FLAC__byte *target; + + /* first shift the unconsumed buffer data toward the front as much as possible */ + if(br->consumed_words > 0) { + start = br->consumed_words; + end = br->words + (br->bytes? 1:0); + memmove(br->buffer, br->buffer+start, FLAC__BYTES_PER_WORD * (end - start)); + + br->words -= start; + br->consumed_words = 0; + } + + /* + * set the target for reading, taking into account word alignment and endianness + */ + bytes = (br->capacity - br->words) * FLAC__BYTES_PER_WORD - br->bytes; + if(bytes == 0) + return false; /* no space left, buffer is too small; see note for FLAC__BITREADER_DEFAULT_CAPACITY */ + target = ((FLAC__byte*)(br->buffer+br->words)) + br->bytes; + + /* before reading, if the existing reader looks like this (say brword is 32 bits wide) + * bitstream : 11 22 33 44 55 br->words=1 br->bytes=1 (partial tail word is left-justified) + * buffer[BE]: 11 22 33 44 55 ?? ?? ?? (shown layed out as bytes sequentially in memory) + * buffer[LE]: 44 33 22 11 ?? ?? ?? 55 (?? being don't-care) + * ^^-------target, bytes=3 + * on LE machines, have to byteswap the odd tail word so nothing is + * overwritten: + */ +#if WORDS_BIGENDIAN +#else + if(br->bytes) + br->buffer[br->words] = SWAP_BE_WORD_TO_HOST(br->buffer[br->words]); +#endif + + /* now it looks like: + * bitstream : 11 22 33 44 55 br->words=1 br->bytes=1 + * buffer[BE]: 11 22 33 44 55 ?? ?? ?? + * buffer[LE]: 44 33 22 11 55 ?? ?? ?? + * ^^-------target, bytes=3 + */ + + /* read in the data; note that the callback may return a smaller number of bytes */ + if(!br->read_callback(target, &bytes, br->client_data)) + return false; + + /* after reading bytes 66 77 88 99 AA BB CC DD EE FF from the client: + * bitstream : 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF + * buffer[BE]: 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF ?? + * buffer[LE]: 44 33 22 11 55 66 77 88 99 AA BB CC DD EE FF ?? + * now have to byteswap on LE machines: + */ +#if WORDS_BIGENDIAN +#else + end = (br->words*FLAC__BYTES_PER_WORD + br->bytes + (unsigned)bytes + (FLAC__BYTES_PER_WORD-1)) / FLAC__BYTES_PER_WORD; + for(start = br->words; start < end; start++) + br->buffer[start] = SWAP_BE_WORD_TO_HOST(br->buffer[start]); +#endif + + /* now it looks like: + * bitstream : 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF + * buffer[BE]: 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF ?? + * buffer[LE]: 44 33 22 11 88 77 66 55 CC BB AA 99 ?? FF EE DD + * finally we'll update the reader values: + */ + end = br->words*FLAC__BYTES_PER_WORD + br->bytes + (unsigned)bytes; + br->words = end / FLAC__BYTES_PER_WORD; + br->bytes = end % FLAC__BYTES_PER_WORD; + + return true; +} + +/*********************************************************************** + * + * Class constructor/destructor + * + ***********************************************************************/ + +FLAC__BitReader *FLAC__bitreader_new(void) +{ + FLAC__BitReader *br = calloc(1, sizeof(FLAC__BitReader)); + + /* calloc() implies: + memset(br, 0, sizeof(FLAC__BitReader)); + br->buffer = 0; + br->capacity = 0; + br->words = br->bytes = 0; + br->consumed_words = br->consumed_bits = 0; + br->read_callback = 0; + br->client_data = 0; + */ + return br; +} + +void FLAC__bitreader_delete(FLAC__BitReader *br) +{ + FLAC__ASSERT(0 != br); + + FLAC__bitreader_free(br); + free(br); +} + +/*********************************************************************** + * + * Public class methods + * + ***********************************************************************/ + +FLAC__bool FLAC__bitreader_init(FLAC__BitReader *br, FLAC__BitReaderReadCallback rcb, void *cd) +{ + FLAC__ASSERT(0 != br); + + br->words = br->bytes = 0; + br->consumed_words = br->consumed_bits = 0; + br->capacity = FLAC__BITREADER_DEFAULT_CAPACITY; + br->buffer = malloc(sizeof(brword) * br->capacity); + if(br->buffer == 0) + return false; + br->read_callback = rcb; + br->client_data = cd; + + return true; +} + +void FLAC__bitreader_free(FLAC__BitReader *br) +{ + FLAC__ASSERT(0 != br); + + if(0 != br->buffer) + free(br->buffer); + br->buffer = 0; + br->capacity = 0; + br->words = br->bytes = 0; + br->consumed_words = br->consumed_bits = 0; + br->read_callback = 0; + br->client_data = 0; +} + +FLAC__bool FLAC__bitreader_clear(FLAC__BitReader *br) +{ + br->words = br->bytes = 0; + br->consumed_words = br->consumed_bits = 0; + return true; +} + +void FLAC__bitreader_dump(const FLAC__BitReader *br, FILE *out) +{ + unsigned i, j; + if(br == 0) { + fprintf(out, "bitreader is NULL\n"); + } + else { + fprintf(out, "bitreader: capacity=%u words=%u bytes=%u consumed: words=%u, bits=%u\n", br->capacity, br->words, br->bytes, br->consumed_words, br->consumed_bits); + + for(i = 0; i < br->words; i++) { + fprintf(out, "%08X: ", i); + for(j = 0; j < FLAC__BITS_PER_WORD; j++) + if(i < br->consumed_words || (i == br->consumed_words && j < br->consumed_bits)) + fprintf(out, "."); + else + fprintf(out, "%01u", br->buffer[i] & ((brword)1 << (FLAC__BITS_PER_WORD-j-1)) ? 1:0); + fprintf(out, "\n"); + } + if(br->bytes > 0) { + fprintf(out, "%08X: ", i); + for(j = 0; j < br->bytes*8; j++) + if(i < br->consumed_words || (i == br->consumed_words && j < br->consumed_bits)) + fprintf(out, "."); + else + fprintf(out, "%01u", br->buffer[i] & ((brword)1 << (br->bytes*8-j-1)) ? 1:0); + fprintf(out, "\n"); + } + } +} + +void FLAC__bitreader_reset_read_crc16(FLAC__BitReader *br, FLAC__uint16 seed) +{ + FLAC__ASSERT(0 != br); + FLAC__ASSERT(0 != br->buffer); + FLAC__ASSERT((br->consumed_bits & 7) == 0); + + br->read_crc16 = (unsigned)seed; + br->crc16_align = br->consumed_bits; +} + +FLAC__uint16 FLAC__bitreader_get_read_crc16(FLAC__BitReader *br) +{ + FLAC__ASSERT(0 != br); + FLAC__ASSERT(0 != br->buffer); + FLAC__ASSERT((br->consumed_bits & 7) == 0); + FLAC__ASSERT(br->crc16_align <= br->consumed_bits); + + /* CRC any tail bytes in a partially-consumed word */ + if(br->consumed_bits) { + const brword tail = br->buffer[br->consumed_words]; + for( ; br->crc16_align < br->consumed_bits; br->crc16_align += 8) + br->read_crc16 = FLAC__CRC16_UPDATE((unsigned)((tail >> (FLAC__BITS_PER_WORD-8-br->crc16_align)) & 0xff), br->read_crc16); + } + return br->read_crc16; +} + +inline FLAC__bool FLAC__bitreader_is_consumed_byte_aligned(const FLAC__BitReader *br) +{ + return ((br->consumed_bits & 7) == 0); +} + +inline unsigned FLAC__bitreader_bits_left_for_byte_alignment(const FLAC__BitReader *br) +{ + return 8 - (br->consumed_bits & 7); +} + +inline unsigned FLAC__bitreader_get_input_bits_unconsumed(const FLAC__BitReader *br) +{ + return (br->words-br->consumed_words)*FLAC__BITS_PER_WORD + br->bytes*8 - br->consumed_bits; +} + +FLAC__bool FLAC__bitreader_read_raw_uint32(FLAC__BitReader *br, FLAC__uint32 *val, unsigned bits) +{ + FLAC__ASSERT(0 != br); + FLAC__ASSERT(0 != br->buffer); + + FLAC__ASSERT(bits <= 32); + FLAC__ASSERT((br->capacity*FLAC__BITS_PER_WORD) * 2 >= bits); + FLAC__ASSERT(br->consumed_words <= br->words); + + /* WATCHOUT: code does not work with <32bit words; we can make things much faster with this assertion */ + FLAC__ASSERT(FLAC__BITS_PER_WORD >= 32); + + if(bits == 0) { /* OPT: investigate if this can ever happen, maybe change to assertion */ + *val = 0; + return true; + } + + while((br->words-br->consumed_words)*FLAC__BITS_PER_WORD + br->bytes*8 - br->consumed_bits < bits) { + if(!bitreader_read_from_client_(br)) + return false; + } + if(br->consumed_words < br->words) { /* if we've not consumed up to a partial tail word... */ + /* OPT: taking out the consumed_bits==0 "else" case below might make things faster if less code allows the compiler to inline this function */ + if(br->consumed_bits) { + /* this also works when consumed_bits==0, it's just a little slower than necessary for that case */ + const unsigned n = FLAC__BITS_PER_WORD - br->consumed_bits; + const brword word = br->buffer[br->consumed_words]; + if(bits < n) { + *val = (FLAC__uint32)((word & (FLAC__WORD_ALL_ONES >> br->consumed_bits)) >> (n-bits)); /* The result has <= 32 non-zero bits */ + br->consumed_bits += bits; + return true; + } + /* (FLAC__BITS_PER_WORD - br->consumed_bits <= bits) ==> (FLAC__WORD_ALL_ONES >> br->consumed_bits) has no more than 'bits' non-zero bits */ + *val = (FLAC__uint32)(word & (FLAC__WORD_ALL_ONES >> br->consumed_bits)); + bits -= n; + crc16_update_word_(br, word); + br->consumed_words++; + br->consumed_bits = 0; + if(bits) { /* if there are still bits left to read, there have to be less than 32 so they will all be in the next word */ + *val <<= bits; + *val |= (FLAC__uint32)(br->buffer[br->consumed_words] >> (FLAC__BITS_PER_WORD-bits)); + br->consumed_bits = bits; + } + return true; + } + else { /* br->consumed_bits == 0 */ + const brword word = br->buffer[br->consumed_words]; + if(bits < FLAC__BITS_PER_WORD) { + *val = (FLAC__uint32)(word >> (FLAC__BITS_PER_WORD-bits)); + br->consumed_bits = bits; + return true; + } + /* at this point bits == FLAC__BITS_PER_WORD == 32; because of previous assertions, it can't be larger */ + *val = (FLAC__uint32)word; + crc16_update_word_(br, word); + br->consumed_words++; + return true; + } + } + else { + /* in this case we're starting our read at a partial tail word; + * the reader has guaranteed that we have at least 'bits' bits + * available to read, which makes this case simpler. + */ + /* OPT: taking out the consumed_bits==0 "else" case below might make things faster if less code allows the compiler to inline this function */ + if(br->consumed_bits) { + /* this also works when consumed_bits==0, it's just a little slower than necessary for that case */ + FLAC__ASSERT(br->consumed_bits + bits <= br->bytes*8); + *val = (FLAC__uint32)((br->buffer[br->consumed_words] & (FLAC__WORD_ALL_ONES >> br->consumed_bits)) >> (FLAC__BITS_PER_WORD-br->consumed_bits-bits)); + br->consumed_bits += bits; + return true; + } + else { + *val = (FLAC__uint32)(br->buffer[br->consumed_words] >> (FLAC__BITS_PER_WORD-bits)); + br->consumed_bits += bits; + return true; + } + } +} + +FLAC__bool FLAC__bitreader_read_raw_int32(FLAC__BitReader *br, FLAC__int32 *val, unsigned bits) +{ + FLAC__uint32 uval, mask; + /* OPT: inline raw uint32 code here, or make into a macro if possible in the .h file */ + if(!FLAC__bitreader_read_raw_uint32(br, &uval, bits)) + return false; + /* sign-extend *val assuming it is currently bits wide. */ + /* From: https://graphics.stanford.edu/~seander/bithacks.html#FixedSignExtend */ + mask = 1u << (bits - 1); + *val = (uval ^ mask) - mask; + return true; +} + +FLAC__bool FLAC__bitreader_read_raw_uint64(FLAC__BitReader *br, FLAC__uint64 *val, unsigned bits) +{ + FLAC__uint32 hi, lo; + + if(bits > 32) { + if(!FLAC__bitreader_read_raw_uint32(br, &hi, bits-32)) + return false; + if(!FLAC__bitreader_read_raw_uint32(br, &lo, 32)) + return false; + *val = hi; + *val <<= 32; + *val |= lo; + } + else { + if(!FLAC__bitreader_read_raw_uint32(br, &lo, bits)) + return false; + *val = lo; + } + return true; +} + +inline FLAC__bool FLAC__bitreader_read_uint32_little_endian(FLAC__BitReader *br, FLAC__uint32 *val) +{ + FLAC__uint32 x8, x32 = 0; + + /* this doesn't need to be that fast as currently it is only used for vorbis comments */ + + if(!FLAC__bitreader_read_raw_uint32(br, &x32, 8)) + return false; + + if(!FLAC__bitreader_read_raw_uint32(br, &x8, 8)) + return false; + x32 |= (x8 << 8); + + if(!FLAC__bitreader_read_raw_uint32(br, &x8, 8)) + return false; + x32 |= (x8 << 16); + + if(!FLAC__bitreader_read_raw_uint32(br, &x8, 8)) + return false; + x32 |= (x8 << 24); + + *val = x32; + return true; +} + +FLAC__bool FLAC__bitreader_skip_bits_no_crc(FLAC__BitReader *br, unsigned bits) +{ + /* + * OPT: a faster implementation is possible but probably not that useful + * since this is only called a couple of times in the metadata readers. + */ + FLAC__ASSERT(0 != br); + FLAC__ASSERT(0 != br->buffer); + + if(bits > 0) { + const unsigned n = br->consumed_bits & 7; + unsigned m; + FLAC__uint32 x; + + if(n != 0) { + m = flac_min(8-n, bits); + if(!FLAC__bitreader_read_raw_uint32(br, &x, m)) + return false; + bits -= m; + } + m = bits / 8; + if(m > 0) { + if(!FLAC__bitreader_skip_byte_block_aligned_no_crc(br, m)) + return false; + bits %= 8; + } + if(bits > 0) { + if(!FLAC__bitreader_read_raw_uint32(br, &x, bits)) + return false; + } + } + + return true; +} + +FLAC__bool FLAC__bitreader_skip_byte_block_aligned_no_crc(FLAC__BitReader *br, unsigned nvals) +{ + FLAC__uint32 x; + + FLAC__ASSERT(0 != br); + FLAC__ASSERT(0 != br->buffer); + FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(br)); + + /* step 1: skip over partial head word to get word aligned */ + while(nvals && br->consumed_bits) { /* i.e. run until we read 'nvals' bytes or we hit the end of the head word */ + if(!FLAC__bitreader_read_raw_uint32(br, &x, 8)) + return false; + nvals--; + } + if(0 == nvals) + return true; + /* step 2: skip whole words in chunks */ + while(nvals >= FLAC__BYTES_PER_WORD) { + if(br->consumed_words < br->words) { + br->consumed_words++; + nvals -= FLAC__BYTES_PER_WORD; + } + else if(!bitreader_read_from_client_(br)) + return false; + } + /* step 3: skip any remainder from partial tail bytes */ + while(nvals) { + if(!FLAC__bitreader_read_raw_uint32(br, &x, 8)) + return false; + nvals--; + } + + return true; +} + +FLAC__bool FLAC__bitreader_read_byte_block_aligned_no_crc(FLAC__BitReader *br, FLAC__byte *val, unsigned nvals) +{ + FLAC__uint32 x; + + FLAC__ASSERT(0 != br); + FLAC__ASSERT(0 != br->buffer); + FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(br)); + + /* step 1: read from partial head word to get word aligned */ + while(nvals && br->consumed_bits) { /* i.e. run until we read 'nvals' bytes or we hit the end of the head word */ + if(!FLAC__bitreader_read_raw_uint32(br, &x, 8)) + return false; + *val++ = (FLAC__byte)x; + nvals--; + } + if(0 == nvals) + return true; + /* step 2: read whole words in chunks */ + while(nvals >= FLAC__BYTES_PER_WORD) { + if(br->consumed_words < br->words) { + const brword word = br->buffer[br->consumed_words++]; +#if FLAC__BYTES_PER_WORD == 4 + val[0] = (FLAC__byte)(word >> 24); + val[1] = (FLAC__byte)(word >> 16); + val[2] = (FLAC__byte)(word >> 8); + val[3] = (FLAC__byte)word; +#elif FLAC__BYTES_PER_WORD == 8 + val[0] = (FLAC__byte)(word >> 56); + val[1] = (FLAC__byte)(word >> 48); + val[2] = (FLAC__byte)(word >> 40); + val[3] = (FLAC__byte)(word >> 32); + val[4] = (FLAC__byte)(word >> 24); + val[5] = (FLAC__byte)(word >> 16); + val[6] = (FLAC__byte)(word >> 8); + val[7] = (FLAC__byte)word; +#else + for(x = 0; x < FLAC__BYTES_PER_WORD; x++) + val[x] = (FLAC__byte)(word >> (8*(FLAC__BYTES_PER_WORD-x-1))); +#endif + val += FLAC__BYTES_PER_WORD; + nvals -= FLAC__BYTES_PER_WORD; + } + else if(!bitreader_read_from_client_(br)) + return false; + } + /* step 3: read any remainder from partial tail bytes */ + while(nvals) { + if(!FLAC__bitreader_read_raw_uint32(br, &x, 8)) + return false; + *val++ = (FLAC__byte)x; + nvals--; + } + + return true; +} + +FLAC__bool FLAC__bitreader_read_unary_unsigned(FLAC__BitReader *br, unsigned *val) +#if 0 /* slow but readable version */ +{ + unsigned bit; + + FLAC__ASSERT(0 != br); + FLAC__ASSERT(0 != br->buffer); + + *val = 0; + while(1) { + if(!FLAC__bitreader_read_bit(br, &bit)) + return false; + if(bit) + break; + else + *val++; + } + return true; +} +#else +{ + unsigned i; + + FLAC__ASSERT(0 != br); + FLAC__ASSERT(0 != br->buffer); + + *val = 0; + while(1) { + while(br->consumed_words < br->words) { /* if we've not consumed up to a partial tail word... */ + brword b = br->buffer[br->consumed_words] << br->consumed_bits; + if(b) { + i = COUNT_ZERO_MSBS(b); + *val += i; + i++; + br->consumed_bits += i; + if(br->consumed_bits >= FLAC__BITS_PER_WORD) { /* faster way of testing if(br->consumed_bits == FLAC__BITS_PER_WORD) */ + crc16_update_word_(br, br->buffer[br->consumed_words]); + br->consumed_words++; + br->consumed_bits = 0; + } + return true; + } + else { + *val += FLAC__BITS_PER_WORD - br->consumed_bits; + crc16_update_word_(br, br->buffer[br->consumed_words]); + br->consumed_words++; + br->consumed_bits = 0; + /* didn't find stop bit yet, have to keep going... */ + } + } + /* at this point we've eaten up all the whole words; have to try + * reading through any tail bytes before calling the read callback. + * this is a repeat of the above logic adjusted for the fact we + * don't have a whole word. note though if the client is feeding + * us data a byte at a time (unlikely), br->consumed_bits may not + * be zero. + */ + if(br->bytes*8 > br->consumed_bits) { + const unsigned end = br->bytes * 8; + brword b = (br->buffer[br->consumed_words] & (FLAC__WORD_ALL_ONES << (FLAC__BITS_PER_WORD-end))) << br->consumed_bits; + if(b) { + i = COUNT_ZERO_MSBS(b); + *val += i; + i++; + br->consumed_bits += i; + FLAC__ASSERT(br->consumed_bits < FLAC__BITS_PER_WORD); + return true; + } + else { + *val += end - br->consumed_bits; + br->consumed_bits = end; + FLAC__ASSERT(br->consumed_bits < FLAC__BITS_PER_WORD); + /* didn't find stop bit yet, have to keep going... */ + } + } + if(!bitreader_read_from_client_(br)) + return false; + } +} +#endif + +FLAC__bool FLAC__bitreader_read_rice_signed(FLAC__BitReader *br, int *val, unsigned parameter) +{ + FLAC__uint32 lsbs = 0, msbs = 0; + unsigned uval; + + FLAC__ASSERT(0 != br); + FLAC__ASSERT(0 != br->buffer); + FLAC__ASSERT(parameter <= 31); + + /* read the unary MSBs and end bit */ + if(!FLAC__bitreader_read_unary_unsigned(br, &msbs)) + return false; + + /* read the binary LSBs */ + if(!FLAC__bitreader_read_raw_uint32(br, &lsbs, parameter)) + return false; + + /* compose the value */ + uval = (msbs << parameter) | lsbs; + if(uval & 1) + *val = -((int)(uval >> 1)) - 1; + else + *val = (int)(uval >> 1); + + return true; +} + +/* this is by far the most heavily used reader call. it ain't pretty but it's fast */ +FLAC__bool FLAC__bitreader_read_rice_signed_block(FLAC__BitReader *br, int vals[], unsigned nvals, unsigned parameter) +{ + /* try and get br->consumed_words and br->consumed_bits into register; + * must remember to flush them back to *br before calling other + * bitreader functions that use them, and before returning */ + unsigned cwords, words, lsbs, msbs, x, y; + unsigned ucbits; /* keep track of the number of unconsumed bits in word */ + brword b; + int *val, *end; + + FLAC__ASSERT(0 != br); + FLAC__ASSERT(0 != br->buffer); + /* WATCHOUT: code does not work with <32bit words; we can make things much faster with this assertion */ + FLAC__ASSERT(FLAC__BITS_PER_WORD >= 32); + FLAC__ASSERT(parameter < 32); + /* the above two asserts also guarantee that the binary part never straddles more than 2 words, so we don't have to loop to read it */ + + val = vals; + end = vals + nvals; + + if(parameter == 0) { + while(val < end) { + /* read the unary MSBs and end bit */ + if(!FLAC__bitreader_read_unary_unsigned(br, &msbs)) + return false; + + *val++ = (int)(msbs >> 1) ^ -(int)(msbs & 1); + } + + return true; + } + + FLAC__ASSERT(parameter > 0); + + cwords = br->consumed_words; + words = br->words; + + /* if we've not consumed up to a partial tail word... */ + if(cwords >= words) { + x = 0; + goto process_tail; + } + + ucbits = FLAC__BITS_PER_WORD - br->consumed_bits; + b = br->buffer[cwords] << br->consumed_bits; /* keep unconsumed bits aligned to left */ + + while(val < end) { + /* read the unary MSBs and end bit */ + x = y = COUNT_ZERO_MSBS2(b); + if(x == FLAC__BITS_PER_WORD) { + x = ucbits; + do { + /* didn't find stop bit yet, have to keep going... */ + crc16_update_word_(br, br->buffer[cwords++]); + if (cwords >= words) + goto incomplete_msbs; + b = br->buffer[cwords]; + y = COUNT_ZERO_MSBS2(b); + x += y; + } while(y == FLAC__BITS_PER_WORD); + } + b <<= y; + b <<= 1; /* account for stop bit */ + ucbits = (ucbits - x - 1) % FLAC__BITS_PER_WORD; + msbs = x; + + /* read the binary LSBs */ + x = (FLAC__uint32)(b >> (FLAC__BITS_PER_WORD - parameter)); /* parameter < 32, so we can cast to 32-bit unsigned */ + if(parameter <= ucbits) { + ucbits -= parameter; + b <<= parameter; + } else { + /* there are still bits left to read, they will all be in the next word */ + crc16_update_word_(br, br->buffer[cwords++]); + if (cwords >= words) + goto incomplete_lsbs; + b = br->buffer[cwords]; + ucbits += FLAC__BITS_PER_WORD - parameter; + x |= (FLAC__uint32)(b >> ucbits); + b <<= FLAC__BITS_PER_WORD - ucbits; + } + lsbs = x; + + /* compose the value */ + x = (msbs << parameter) | lsbs; + *val++ = (int)(x >> 1) ^ -(int)(x & 1); + + continue; + + /* at this point we've eaten up all the whole words */ +process_tail: + do { + if(0) { +incomplete_msbs: + br->consumed_bits = 0; + br->consumed_words = cwords; + } + + /* read the unary MSBs and end bit */ + if(!FLAC__bitreader_read_unary_unsigned(br, &msbs)) + return false; + msbs += x; + x = ucbits = 0; + + if(0) { +incomplete_lsbs: + br->consumed_bits = 0; + br->consumed_words = cwords; + } + + /* read the binary LSBs */ + if(!FLAC__bitreader_read_raw_uint32(br, &lsbs, parameter - ucbits)) + return false; + lsbs = x | lsbs; + + /* compose the value */ + x = (msbs << parameter) | lsbs; + *val++ = (int)(x >> 1) ^ -(int)(x & 1); + x = 0; + + cwords = br->consumed_words; + words = br->words; + ucbits = FLAC__BITS_PER_WORD - br->consumed_bits; + b = br->buffer[cwords] << br->consumed_bits; + } while(cwords >= words && val < end); + } + + if(ucbits == 0 && cwords < words) { + /* don't leave the head word with no unconsumed bits */ + crc16_update_word_(br, br->buffer[cwords++]); + ucbits = FLAC__BITS_PER_WORD; + } + + br->consumed_bits = FLAC__BITS_PER_WORD - ucbits; + br->consumed_words = cwords; + + return true; +} + +#if 0 /* UNUSED */ +FLAC__bool FLAC__bitreader_read_golomb_signed(FLAC__BitReader *br, int *val, unsigned parameter) +{ + FLAC__uint32 lsbs = 0, msbs = 0; + unsigned bit, uval, k; + + FLAC__ASSERT(0 != br); + FLAC__ASSERT(0 != br->buffer); + + k = FLAC__bitmath_ilog2(parameter); + + /* read the unary MSBs and end bit */ + if(!FLAC__bitreader_read_unary_unsigned(br, &msbs)) + return false; + + /* read the binary LSBs */ + if(!FLAC__bitreader_read_raw_uint32(br, &lsbs, k)) + return false; + + if(parameter == 1u<= d) { + if(!FLAC__bitreader_read_bit(br, &bit)) + return false; + lsbs <<= 1; + lsbs |= bit; + lsbs -= d; + } + /* compose the value */ + uval = msbs * parameter + lsbs; + } + + /* unfold unsigned to signed */ + if(uval & 1) + *val = -((int)(uval >> 1)) - 1; + else + *val = (int)(uval >> 1); + + return true; +} + +FLAC__bool FLAC__bitreader_read_golomb_unsigned(FLAC__BitReader *br, unsigned *val, unsigned parameter) +{ + FLAC__uint32 lsbs, msbs = 0; + unsigned bit, k; + + FLAC__ASSERT(0 != br); + FLAC__ASSERT(0 != br->buffer); + + k = FLAC__bitmath_ilog2(parameter); + + /* read the unary MSBs and end bit */ + if(!FLAC__bitreader_read_unary_unsigned(br, &msbs)) + return false; + + /* read the binary LSBs */ + if(!FLAC__bitreader_read_raw_uint32(br, &lsbs, k)) + return false; + + if(parameter == 1u<= d) { + if(!FLAC__bitreader_read_bit(br, &bit)) + return false; + lsbs <<= 1; + lsbs |= bit; + lsbs -= d; + } + /* compose the value */ + *val = msbs * parameter + lsbs; + } + + return true; +} +#endif /* UNUSED */ + +/* on return, if *val == 0xffffffff then the utf-8 sequence was invalid, but the return value will be true */ +FLAC__bool FLAC__bitreader_read_utf8_uint32(FLAC__BitReader *br, FLAC__uint32 *val, FLAC__byte *raw, unsigned *rawlen) +{ + FLAC__uint32 v = 0; + FLAC__uint32 x; + unsigned i; + + if(!FLAC__bitreader_read_raw_uint32(br, &x, 8)) + return false; + if(raw) + raw[(*rawlen)++] = (FLAC__byte)x; + if(!(x & 0x80)) { /* 0xxxxxxx */ + v = x; + i = 0; + } + else if(x & 0xC0 && !(x & 0x20)) { /* 110xxxxx */ + v = x & 0x1F; + i = 1; + } + else if(x & 0xE0 && !(x & 0x10)) { /* 1110xxxx */ + v = x & 0x0F; + i = 2; + } + else if(x & 0xF0 && !(x & 0x08)) { /* 11110xxx */ + v = x & 0x07; + i = 3; + } + else if(x & 0xF8 && !(x & 0x04)) { /* 111110xx */ + v = x & 0x03; + i = 4; + } + else if(x & 0xFC && !(x & 0x02)) { /* 1111110x */ + v = x & 0x01; + i = 5; + } + else { + *val = 0xffffffff; + return true; + } + for( ; i; i--) { + if(!FLAC__bitreader_read_raw_uint32(br, &x, 8)) + return false; + if(raw) + raw[(*rawlen)++] = (FLAC__byte)x; + if(!(x & 0x80) || (x & 0x40)) { /* 10xxxxxx */ + *val = 0xffffffff; + return true; + } + v <<= 6; + v |= (x & 0x3F); + } + *val = v; + return true; +} + +/* on return, if *val == 0xffffffffffffffff then the utf-8 sequence was invalid, but the return value will be true */ +FLAC__bool FLAC__bitreader_read_utf8_uint64(FLAC__BitReader *br, FLAC__uint64 *val, FLAC__byte *raw, unsigned *rawlen) +{ + FLAC__uint64 v = 0; + FLAC__uint32 x; + unsigned i; + + if(!FLAC__bitreader_read_raw_uint32(br, &x, 8)) + return false; + if(raw) + raw[(*rawlen)++] = (FLAC__byte)x; + if(!(x & 0x80)) { /* 0xxxxxxx */ + v = x; + i = 0; + } + else if(x & 0xC0 && !(x & 0x20)) { /* 110xxxxx */ + v = x & 0x1F; + i = 1; + } + else if(x & 0xE0 && !(x & 0x10)) { /* 1110xxxx */ + v = x & 0x0F; + i = 2; + } + else if(x & 0xF0 && !(x & 0x08)) { /* 11110xxx */ + v = x & 0x07; + i = 3; + } + else if(x & 0xF8 && !(x & 0x04)) { /* 111110xx */ + v = x & 0x03; + i = 4; + } + else if(x & 0xFC && !(x & 0x02)) { /* 1111110x */ + v = x & 0x01; + i = 5; + } + else if(x & 0xFE && !(x & 0x01)) { /* 11111110 */ + v = 0; + i = 6; + } + else { + *val = FLAC__U64L(0xffffffffffffffff); + return true; + } + for( ; i; i--) { + if(!FLAC__bitreader_read_raw_uint32(br, &x, 8)) + return false; + if(raw) + raw[(*rawlen)++] = (FLAC__byte)x; + if(!(x & 0x80) || (x & 0x40)) { /* 10xxxxxx */ + *val = FLAC__U64L(0xffffffffffffffff); + return true; + } + v <<= 6; + v |= (x & 0x3F); + } + *val = v; + return true; +} + +/* These functions are declared inline in this file but are also callable as + * externs from elsewhere. + * According to the C99 spec, section 6.7.4, simply providing a function + * prototype in a header file without 'inline' and making the function inline + * in this file should be sufficient. + * Unfortunately, the Microsoft VS compiler doesn't pick them up externally. To + * fix that we add extern declarations here. + */ +extern FLAC__bool FLAC__bitreader_is_consumed_byte_aligned(const FLAC__BitReader *br); +extern unsigned FLAC__bitreader_bits_left_for_byte_alignment(const FLAC__BitReader *br); +extern unsigned FLAC__bitreader_get_input_bits_unconsumed(const FLAC__BitReader *br); +extern FLAC__bool FLAC__bitreader_read_uint32_little_endian(FLAC__BitReader *br, FLAC__uint32 *val); diff --git a/core/cd_hw/libchdr/deps/libFLAC/cpu.c b/core/cd_hw/libchdr/deps/libFLAC/cpu.c new file mode 100644 index 0000000..da76d87 --- /dev/null +++ b/core/cd_hw/libchdr/deps/libFLAC/cpu.c @@ -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 +#endif + +#include "private/cpu.h" +#include "share/compat.h" +#include +#include + +#if defined(_MSC_VER) +# include /* for __cpuid() and _xgetbv() */ +#endif + +#if defined __GNUC__ && defined HAVE_CPUID_H +# include /* for __get_cpuid() and __get_cpuid_max() */ +#endif + +#ifdef DEBUG +#include + +#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 */ diff --git a/core/cd_hw/libchdr/deps/libFLAC/crc.c b/core/cd_hw/libchdr/deps/libFLAC/crc.c new file mode 100644 index 0000000..8123c3b --- /dev/null +++ b/core/cd_hw/libchdr/deps/libFLAC/crc.c @@ -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 +#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; +} diff --git a/core/cd_hw/libchdr/deps/libFLAC/fixed.c b/core/cd_hw/libchdr/deps/libFLAC/fixed.c new file mode 100644 index 0000000..1e2d5b2 --- /dev/null +++ b/core/cd_hw/libchdr/deps/libFLAC/fixed.c @@ -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 +#endif + +#include +#include +#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< 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< 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); + } +} diff --git a/core/cd_hw/libchdr/deps/libFLAC/float.c b/core/cd_hw/libchdr/deps/libFLAC/float.c new file mode 100644 index 0000000..25d1a78 --- /dev/null +++ b/core/cd_hw/libchdr/deps/libFLAC/float.c @@ -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 +#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 */ diff --git a/core/cd_hw/libchdr/deps/libFLAC/format.c b/core/cd_hw/libchdr/deps/libFLAC/format.c new file mode 100644 index 0000000..214bd09 --- /dev/null +++ b/core/cd_hw/libchdr/deps/libFLAC/format.c @@ -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 +#endif + +#include +#include /* for qsort() */ +#include /* 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__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; +} diff --git a/core/cd_hw/libchdr/deps/libFLAC/include/FLAC/assert.h b/core/cd_hw/libchdr/deps/libFLAC/include/FLAC/assert.h new file mode 100644 index 0000000..b546fd0 --- /dev/null +++ b/core/cd_hw/libchdr/deps/libFLAC/include/FLAC/assert.h @@ -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 +#define FLAC__ASSERT(x) assert(x) +#define FLAC__ASSERT_DECLARATION(x) x +#else +#define FLAC__ASSERT(x) +#define FLAC__ASSERT_DECLARATION(x) +#endif + +#endif diff --git a/core/cd_hw/libchdr/deps/libFLAC/include/FLAC/callback.h b/core/cd_hw/libchdr/deps/libFLAC/include/FLAC/callback.h new file mode 100644 index 0000000..f942dd2 --- /dev/null +++ b/core/cd_hw/libchdr/deps/libFLAC/include/FLAC/callback.h @@ -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 /* 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 diff --git a/core/cd_hw/libchdr/deps/libFLAC/include/FLAC/export.h b/core/cd_hw/libchdr/deps/libFLAC/include/FLAC/export.h new file mode 100644 index 0000000..d52f0bb --- /dev/null +++ b/core/cd_hw/libchdr/deps/libFLAC/include/FLAC/export.h @@ -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 diff --git a/core/cd_hw/libchdr/deps/libFLAC/include/FLAC/format.h b/core/cd_hw/libchdr/deps/libFLAC/include/FLAC/format.h new file mode 100644 index 0000000..c087d4a --- /dev/null +++ b/core/cd_hw/libchdr/deps/libFLAC/include/FLAC/format.h @@ -0,0 +1,1025 @@ +/* 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__FORMAT_H +#define FLAC__FORMAT_H + +#include "export.h" +#include "ordinals.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** \file include/FLAC/format.h + * + * \brief + * This module contains structure definitions for the representation + * of FLAC format components in memory. These are the basic + * structures used by the rest of the interfaces. + * + * See the detailed documentation in the + * \link flac_format format \endlink module. + */ + +/** \defgroup flac_format FLAC/format.h: format components + * \ingroup flac + * + * \brief + * This module contains structure definitions for the representation + * of FLAC format components in memory. These are the basic + * structures used by the rest of the interfaces. + * + * First, you should be familiar with the + * FLAC format. Many of the values here + * follow directly from the specification. As a user of libFLAC, the + * interesting parts really are the structures that describe the frame + * header and metadata blocks. + * + * The format structures here are very primitive, designed to store + * information in an efficient way. Reading information from the + * structures is easy but creating or modifying them directly is + * more complex. For the most part, as a user of a library, editing + * is not necessary; however, for metadata blocks it is, so there are + * convenience functions provided in the \link flac_metadata metadata + * module \endlink to simplify the manipulation of metadata blocks. + * + * \note + * It's not the best convention, but symbols ending in _LEN are in bits + * and _LENGTH are in bytes. _LENGTH symbols are \#defines instead of + * global variables because they are usually used when declaring byte + * arrays and some compilers require compile-time knowledge of array + * sizes when declared on the stack. + * + * \{ + */ + + +/* + Most of the values described in this file are defined by the FLAC + format specification. There is nothing to tune here. +*/ + +/** The largest legal metadata type code. */ +#define FLAC__MAX_METADATA_TYPE_CODE (126u) + +/** The minimum block size, in samples, permitted by the format. */ +#define FLAC__MIN_BLOCK_SIZE (16u) + +/** The maximum block size, in samples, permitted by the format. */ +#define FLAC__MAX_BLOCK_SIZE (65535u) + +/** The maximum block size, in samples, permitted by the FLAC subset for + * sample rates up to 48kHz. */ +#define FLAC__SUBSET_MAX_BLOCK_SIZE_48000HZ (4608u) + +/** The maximum number of channels permitted by the format. */ +#define FLAC__MAX_CHANNELS (8u) + +/** The minimum sample resolution permitted by the format. */ +#define FLAC__MIN_BITS_PER_SAMPLE (4u) + +/** The maximum sample resolution permitted by the format. */ +#define FLAC__MAX_BITS_PER_SAMPLE (32u) + +/** The maximum sample resolution permitted by libFLAC. + * + * \warning + * FLAC__MAX_BITS_PER_SAMPLE is the limit of the FLAC format. However, + * the reference encoder/decoder is currently limited to 24 bits because + * of prevalent 32-bit math, so make sure and use this value when + * appropriate. + */ +#define FLAC__REFERENCE_CODEC_MAX_BITS_PER_SAMPLE (24u) + +/** The maximum sample rate permitted by the format. The value is + * ((2 ^ 16) - 1) * 10; see FLAC format + * as to why. + */ +#define FLAC__MAX_SAMPLE_RATE (655350u) + +/** The maximum LPC order permitted by the format. */ +#define FLAC__MAX_LPC_ORDER (32u) + +/** The maximum LPC order permitted by the FLAC subset for sample rates + * up to 48kHz. */ +#define FLAC__SUBSET_MAX_LPC_ORDER_48000HZ (12u) + +/** The minimum quantized linear predictor coefficient precision + * permitted by the format. + */ +#define FLAC__MIN_QLP_COEFF_PRECISION (5u) + +/** The maximum quantized linear predictor coefficient precision + * permitted by the format. + */ +#define FLAC__MAX_QLP_COEFF_PRECISION (15u) + +/** The maximum order of the fixed predictors permitted by the format. */ +#define FLAC__MAX_FIXED_ORDER (4u) + +/** The maximum Rice partition order permitted by the format. */ +#define FLAC__MAX_RICE_PARTITION_ORDER (15u) + +/** The maximum Rice partition order permitted by the FLAC Subset. */ +#define FLAC__SUBSET_MAX_RICE_PARTITION_ORDER (8u) + +/** The version string of the release, stamped onto the libraries and binaries. + * + * \note + * This does not correspond to the shared library version number, which + * is used to determine binary compatibility. + */ +extern FLAC_API const char *FLAC__VERSION_STRING; + +/** The vendor string inserted by the encoder into the VORBIS_COMMENT block. + * This is a NUL-terminated ASCII string; when inserted into the + * VORBIS_COMMENT the trailing null is stripped. + */ +extern FLAC_API const char *FLAC__VENDOR_STRING; + +/** The byte string representation of the beginning of a FLAC stream. */ +extern FLAC_API const FLAC__byte FLAC__STREAM_SYNC_STRING[4]; /* = "fLaC" */ + +/** The 32-bit integer big-endian representation of the beginning of + * a FLAC stream. + */ +extern FLAC_API const unsigned FLAC__STREAM_SYNC; /* = 0x664C6143 */ + +/** The length of the FLAC signature in bits. */ +extern FLAC_API const unsigned FLAC__STREAM_SYNC_LEN; /* = 32 bits */ + +/** The length of the FLAC signature in bytes. */ +#define FLAC__STREAM_SYNC_LENGTH (4u) + + +/***************************************************************************** + * + * Subframe structures + * + *****************************************************************************/ + +/*****************************************************************************/ + +/** An enumeration of the available entropy coding methods. */ +typedef enum { + FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE = 0, + /**< Residual is coded by partitioning into contexts, each with it's own + * 4-bit Rice parameter. */ + + FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2 = 1 + /**< Residual is coded by partitioning into contexts, each with it's own + * 5-bit Rice parameter. */ +} FLAC__EntropyCodingMethodType; + +/** Maps a FLAC__EntropyCodingMethodType to a C string. + * + * Using a FLAC__EntropyCodingMethodType as the index to this array will + * give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__EntropyCodingMethodTypeString[]; + + +/** Contents of a Rice partitioned residual + */ +typedef struct { + + unsigned *parameters; + /**< The Rice parameters for each context. */ + + unsigned *raw_bits; + /**< Widths for escape-coded partitions. Will be non-zero for escaped + * partitions and zero for unescaped partitions. + */ + + unsigned capacity_by_order; + /**< The capacity of the \a parameters and \a raw_bits arrays + * specified as an order, i.e. the number of array elements + * allocated is 2 ^ \a capacity_by_order. + */ +} FLAC__EntropyCodingMethod_PartitionedRiceContents; + +/** Header for a Rice partitioned residual. (c.f. format specification) + */ +typedef struct { + + unsigned order; + /**< The partition order, i.e. # of contexts = 2 ^ \a order. */ + + const FLAC__EntropyCodingMethod_PartitionedRiceContents *contents; + /**< The context's Rice parameters and/or raw bits. */ + +} FLAC__EntropyCodingMethod_PartitionedRice; + +extern FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN; /**< == 4 (bits) */ +extern FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN; /**< == 4 (bits) */ +extern FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_PARAMETER_LEN; /**< == 5 (bits) */ +extern FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_RAW_LEN; /**< == 5 (bits) */ + +extern FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER; +/**< == (1<format specification) + */ +typedef struct { + FLAC__EntropyCodingMethodType type; + union { + FLAC__EntropyCodingMethod_PartitionedRice partitioned_rice; + } data; +} FLAC__EntropyCodingMethod; + +extern FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_TYPE_LEN; /**< == 2 (bits) */ + +/*****************************************************************************/ + +/** An enumeration of the available subframe types. */ +typedef enum { + FLAC__SUBFRAME_TYPE_CONSTANT = 0, /**< constant signal */ + FLAC__SUBFRAME_TYPE_VERBATIM = 1, /**< uncompressed signal */ + FLAC__SUBFRAME_TYPE_FIXED = 2, /**< fixed polynomial prediction */ + FLAC__SUBFRAME_TYPE_LPC = 3 /**< linear prediction */ +} FLAC__SubframeType; + +/** Maps a FLAC__SubframeType to a C string. + * + * Using a FLAC__SubframeType as the index to this array will + * give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__SubframeTypeString[]; + + +/** CONSTANT subframe. (c.f. format specification) + */ +typedef struct { + FLAC__int32 value; /**< The constant signal value. */ +} FLAC__Subframe_Constant; + + +/** VERBATIM subframe. (c.f. format specification) + */ +typedef struct { + const FLAC__int32 *data; /**< A pointer to verbatim signal. */ +} FLAC__Subframe_Verbatim; + + +/** FIXED subframe. (c.f. format specification) + */ +typedef struct { + FLAC__EntropyCodingMethod entropy_coding_method; + /**< The residual coding method. */ + + unsigned order; + /**< The polynomial order. */ + + FLAC__int32 warmup[FLAC__MAX_FIXED_ORDER]; + /**< Warmup samples to prime the predictor, length == order. */ + + const FLAC__int32 *residual; + /**< The residual signal, length == (blocksize minus order) samples. */ +} FLAC__Subframe_Fixed; + + +/** LPC subframe. (c.f. format specification) + */ +typedef struct { + FLAC__EntropyCodingMethod entropy_coding_method; + /**< The residual coding method. */ + + unsigned order; + /**< The FIR order. */ + + unsigned qlp_coeff_precision; + /**< Quantized FIR filter coefficient precision in bits. */ + + int quantization_level; + /**< The qlp coeff shift needed. */ + + FLAC__int32 qlp_coeff[FLAC__MAX_LPC_ORDER]; + /**< FIR filter coefficients. */ + + FLAC__int32 warmup[FLAC__MAX_LPC_ORDER]; + /**< Warmup samples to prime the predictor, length == order. */ + + const FLAC__int32 *residual; + /**< The residual signal, length == (blocksize minus order) samples. */ +} FLAC__Subframe_LPC; + +extern FLAC_API const unsigned FLAC__SUBFRAME_LPC_QLP_COEFF_PRECISION_LEN; /**< == 4 (bits) */ +extern FLAC_API const unsigned FLAC__SUBFRAME_LPC_QLP_SHIFT_LEN; /**< == 5 (bits) */ + + +/** FLAC subframe structure. (c.f. format specification) + */ +typedef struct { + FLAC__SubframeType type; + union { + FLAC__Subframe_Constant constant; + FLAC__Subframe_Fixed fixed; + FLAC__Subframe_LPC lpc; + FLAC__Subframe_Verbatim verbatim; + } data; + unsigned wasted_bits; +} FLAC__Subframe; + +/** == 1 (bit) + * + * This used to be a zero-padding bit (hence the name + * FLAC__SUBFRAME_ZERO_PAD_LEN) but is now a reserved bit. It still has a + * mandatory value of \c 0 but in the future may take on the value \c 0 or \c 1 + * to mean something else. + */ +extern FLAC_API const unsigned FLAC__SUBFRAME_ZERO_PAD_LEN; +extern FLAC_API const unsigned FLAC__SUBFRAME_TYPE_LEN; /**< == 6 (bits) */ +extern FLAC_API const unsigned FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN; /**< == 1 (bit) */ + +extern FLAC_API const unsigned FLAC__SUBFRAME_TYPE_CONSTANT_BYTE_ALIGNED_MASK; /**< = 0x00 */ +extern FLAC_API const unsigned FLAC__SUBFRAME_TYPE_VERBATIM_BYTE_ALIGNED_MASK; /**< = 0x02 */ +extern FLAC_API const unsigned FLAC__SUBFRAME_TYPE_FIXED_BYTE_ALIGNED_MASK; /**< = 0x10 */ +extern FLAC_API const unsigned FLAC__SUBFRAME_TYPE_LPC_BYTE_ALIGNED_MASK; /**< = 0x40 */ + +/*****************************************************************************/ + + +/***************************************************************************** + * + * Frame structures + * + *****************************************************************************/ + +/** An enumeration of the available channel assignments. */ +typedef enum { + FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT = 0, /**< independent channels */ + FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE = 1, /**< left+side stereo */ + FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE = 2, /**< right+side stereo */ + FLAC__CHANNEL_ASSIGNMENT_MID_SIDE = 3 /**< mid+side stereo */ +} FLAC__ChannelAssignment; + +/** Maps a FLAC__ChannelAssignment to a C string. + * + * Using a FLAC__ChannelAssignment as the index to this array will + * give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__ChannelAssignmentString[]; + +/** An enumeration of the possible frame numbering methods. */ +typedef enum { + FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER, /**< number contains the frame number */ + FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER /**< number contains the sample number of first sample in frame */ +} FLAC__FrameNumberType; + +/** Maps a FLAC__FrameNumberType to a C string. + * + * Using a FLAC__FrameNumberType as the index to this array will + * give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__FrameNumberTypeString[]; + + +/** FLAC frame header structure. (c.f. format specification) + */ +typedef struct { + unsigned blocksize; + /**< The number of samples per subframe. */ + + unsigned sample_rate; + /**< The sample rate in Hz. */ + + unsigned channels; + /**< The number of channels (== number of subframes). */ + + FLAC__ChannelAssignment channel_assignment; + /**< The channel assignment for the frame. */ + + unsigned bits_per_sample; + /**< The sample resolution. */ + + FLAC__FrameNumberType number_type; + /**< The numbering scheme used for the frame. As a convenience, the + * decoder will always convert a frame number to a sample number because + * the rules are complex. */ + + union { + FLAC__uint32 frame_number; + FLAC__uint64 sample_number; + } number; + /**< The frame number or sample number of first sample in frame; + * use the \a number_type value to determine which to use. */ + + FLAC__uint8 crc; + /**< CRC-8 (polynomial = x^8 + x^2 + x^1 + x^0, initialized with 0) + * of the raw frame header bytes, meaning everything before the CRC byte + * including the sync code. + */ +} FLAC__FrameHeader; + +extern FLAC_API const unsigned FLAC__FRAME_HEADER_SYNC; /**< == 0x3ffe; the frame header sync code */ +extern FLAC_API const unsigned FLAC__FRAME_HEADER_SYNC_LEN; /**< == 14 (bits) */ +extern FLAC_API const unsigned FLAC__FRAME_HEADER_RESERVED_LEN; /**< == 1 (bits) */ +extern FLAC_API const unsigned FLAC__FRAME_HEADER_BLOCKING_STRATEGY_LEN; /**< == 1 (bits) */ +extern FLAC_API const unsigned FLAC__FRAME_HEADER_BLOCK_SIZE_LEN; /**< == 4 (bits) */ +extern FLAC_API const unsigned FLAC__FRAME_HEADER_SAMPLE_RATE_LEN; /**< == 4 (bits) */ +extern FLAC_API const unsigned FLAC__FRAME_HEADER_CHANNEL_ASSIGNMENT_LEN; /**< == 4 (bits) */ +extern FLAC_API const unsigned FLAC__FRAME_HEADER_BITS_PER_SAMPLE_LEN; /**< == 3 (bits) */ +extern FLAC_API const unsigned FLAC__FRAME_HEADER_ZERO_PAD_LEN; /**< == 1 (bit) */ +extern FLAC_API const unsigned FLAC__FRAME_HEADER_CRC_LEN; /**< == 8 (bits) */ + + +/** FLAC frame footer structure. (c.f. format specification) + */ +typedef struct { + FLAC__uint16 crc; + /**< CRC-16 (polynomial = x^16 + x^15 + x^2 + x^0, initialized with + * 0) of the bytes before the crc, back to and including the frame header + * sync code. + */ +} FLAC__FrameFooter; + +extern FLAC_API const unsigned FLAC__FRAME_FOOTER_CRC_LEN; /**< == 16 (bits) */ + + +/** FLAC frame structure. (c.f. format specification) + */ +typedef struct { + FLAC__FrameHeader header; + FLAC__Subframe subframes[FLAC__MAX_CHANNELS]; + FLAC__FrameFooter footer; +} FLAC__Frame; + +/*****************************************************************************/ + + +/***************************************************************************** + * + * Meta-data structures + * + *****************************************************************************/ + +/** An enumeration of the available metadata block types. */ +typedef enum { + + FLAC__METADATA_TYPE_STREAMINFO = 0, + /**< STREAMINFO block */ + + FLAC__METADATA_TYPE_PADDING = 1, + /**< PADDING block */ + + FLAC__METADATA_TYPE_APPLICATION = 2, + /**< APPLICATION block */ + + FLAC__METADATA_TYPE_SEEKTABLE = 3, + /**< SEEKTABLE block */ + + FLAC__METADATA_TYPE_VORBIS_COMMENT = 4, + /**< VORBISCOMMENT block (a.k.a. FLAC tags) */ + + FLAC__METADATA_TYPE_CUESHEET = 5, + /**< CUESHEET block */ + + FLAC__METADATA_TYPE_PICTURE = 6, + /**< PICTURE block */ + + FLAC__METADATA_TYPE_UNDEFINED = 7, + /**< marker to denote beginning of undefined type range; this number will increase as new metadata types are added */ + + FLAC__MAX_METADATA_TYPE = FLAC__MAX_METADATA_TYPE_CODE, + /**< No type will ever be greater than this. There is not enough room in the protocol block. */ +} FLAC__MetadataType; + +/** Maps a FLAC__MetadataType to a C string. + * + * Using a FLAC__MetadataType as the index to this array will + * give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__MetadataTypeString[]; + + +/** FLAC STREAMINFO structure. (c.f. format specification) + */ +typedef struct { + unsigned min_blocksize, max_blocksize; + unsigned min_framesize, max_framesize; + unsigned sample_rate; + unsigned channels; + unsigned bits_per_sample; + FLAC__uint64 total_samples; + FLAC__byte md5sum[16]; +} FLAC__StreamMetadata_StreamInfo; + +extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN; /**< == 16 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN; /**< == 16 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN; /**< == 24 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN; /**< == 24 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN; /**< == 20 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN; /**< == 3 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN; /**< == 5 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_TOTAL_SAMPLES_LEN; /**< == 36 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MD5SUM_LEN; /**< == 128 (bits) */ + +/** The total stream length of the STREAMINFO block in bytes. */ +#define FLAC__STREAM_METADATA_STREAMINFO_LENGTH (34u) + +/** FLAC PADDING structure. (c.f. format specification) + */ +typedef struct { + int dummy; + /**< Conceptually this is an empty struct since we don't store the + * padding bytes. Empty structs are not allowed by some C compilers, + * hence the dummy. + */ +} FLAC__StreamMetadata_Padding; + + +/** FLAC APPLICATION structure. (c.f. format specification) + */ +typedef struct { + FLAC__byte id[4]; + FLAC__byte *data; +} FLAC__StreamMetadata_Application; + +extern FLAC_API const unsigned FLAC__STREAM_METADATA_APPLICATION_ID_LEN; /**< == 32 (bits) */ + +/** SeekPoint structure used in SEEKTABLE blocks. (c.f. format specification) + */ +typedef struct { + FLAC__uint64 sample_number; + /**< The sample number of the target frame. */ + + FLAC__uint64 stream_offset; + /**< The offset, in bytes, of the target frame with respect to + * beginning of the first frame. */ + + unsigned frame_samples; + /**< The number of samples in the target frame. */ +} FLAC__StreamMetadata_SeekPoint; + +extern FLAC_API const unsigned FLAC__STREAM_METADATA_SEEKPOINT_SAMPLE_NUMBER_LEN; /**< == 64 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_SEEKPOINT_STREAM_OFFSET_LEN; /**< == 64 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_SEEKPOINT_FRAME_SAMPLES_LEN; /**< == 16 (bits) */ + +/** The total stream length of a seek point in bytes. */ +#define FLAC__STREAM_METADATA_SEEKPOINT_LENGTH (18u) + +/** The value used in the \a sample_number field of + * FLAC__StreamMetadataSeekPoint used to indicate a placeholder + * point (== 0xffffffffffffffff). + */ +extern FLAC_API const FLAC__uint64 FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER; + + +/** FLAC SEEKTABLE structure. (c.f. format specification) + * + * \note From the format specification: + * - The seek points must be sorted by ascending sample number. + * - Each seek point's sample number must be the first sample of the + * target frame. + * - Each seek point's sample number must be unique within the table. + * - Existence of a SEEKTABLE block implies a correct setting of + * total_samples in the stream_info block. + * - Behavior is undefined when more than one SEEKTABLE block is + * present in a stream. + */ +typedef struct { + unsigned num_points; + FLAC__StreamMetadata_SeekPoint *points; +} FLAC__StreamMetadata_SeekTable; + + +/** Vorbis comment entry structure used in VORBIS_COMMENT blocks. (c.f. format specification) + * + * For convenience, the APIs maintain a trailing NUL character at the end of + * \a entry which is not counted toward \a length, i.e. + * \code strlen(entry) == length \endcode + */ +typedef struct { + FLAC__uint32 length; + FLAC__byte *entry; +} FLAC__StreamMetadata_VorbisComment_Entry; + +extern FLAC_API const unsigned FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN; /**< == 32 (bits) */ + + +/** FLAC VORBIS_COMMENT structure. (c.f. format specification) + */ +typedef struct { + FLAC__StreamMetadata_VorbisComment_Entry vendor_string; + FLAC__uint32 num_comments; + FLAC__StreamMetadata_VorbisComment_Entry *comments; +} FLAC__StreamMetadata_VorbisComment; + +extern FLAC_API const unsigned FLAC__STREAM_METADATA_VORBIS_COMMENT_NUM_COMMENTS_LEN; /**< == 32 (bits) */ + + +/** FLAC CUESHEET track index structure. (See the + * format specification for + * the full description of each field.) + */ +typedef struct { + FLAC__uint64 offset; + /**< Offset in samples, relative to the track offset, of the index + * point. + */ + + FLAC__byte number; + /**< The index point number. */ +} FLAC__StreamMetadata_CueSheet_Index; + +extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_INDEX_OFFSET_LEN; /**< == 64 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_INDEX_NUMBER_LEN; /**< == 8 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN; /**< == 3*8 (bits) */ + + +/** FLAC CUESHEET track structure. (See the + * format specification for + * the full description of each field.) + */ +typedef struct { + FLAC__uint64 offset; + /**< Track offset in samples, relative to the beginning of the FLAC audio stream. */ + + FLAC__byte number; + /**< The track number. */ + + char isrc[13]; + /**< Track ISRC. This is a 12-digit alphanumeric code plus a trailing \c NUL byte */ + + unsigned type:1; + /**< The track type: 0 for audio, 1 for non-audio. */ + + unsigned pre_emphasis:1; + /**< The pre-emphasis flag: 0 for no pre-emphasis, 1 for pre-emphasis. */ + + FLAC__byte num_indices; + /**< The number of track index points. */ + + FLAC__StreamMetadata_CueSheet_Index *indices; + /**< NULL if num_indices == 0, else pointer to array of index points. */ + +} FLAC__StreamMetadata_CueSheet_Track; + +extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_OFFSET_LEN; /**< == 64 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_NUMBER_LEN; /**< == 8 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN; /**< == 12*8 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN; /**< == 1 (bit) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN; /**< == 1 (bit) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN; /**< == 6+13*8 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_NUM_INDICES_LEN; /**< == 8 (bits) */ + + +/** FLAC CUESHEET structure. (See the + * format specification + * for the full description of each field.) + */ +typedef struct { + char media_catalog_number[129]; + /**< Media catalog number, in ASCII printable characters 0x20-0x7e. In + * general, the media catalog number may be 0 to 128 bytes long; any + * unused characters should be right-padded with NUL characters. + */ + + FLAC__uint64 lead_in; + /**< The number of lead-in samples. */ + + FLAC__bool is_cd; + /**< \c true if CUESHEET corresponds to a Compact Disc, else \c false. */ + + unsigned num_tracks; + /**< The number of tracks. */ + + FLAC__StreamMetadata_CueSheet_Track *tracks; + /**< NULL if num_tracks == 0, else pointer to array of tracks. */ + +} FLAC__StreamMetadata_CueSheet; + +extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN; /**< == 128*8 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_LEAD_IN_LEN; /**< == 64 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN; /**< == 1 (bit) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN; /**< == 7+258*8 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_NUM_TRACKS_LEN; /**< == 8 (bits) */ + + +/** An enumeration of the PICTURE types (see FLAC__StreamMetadataPicture and id3 v2.4 APIC tag). */ +typedef enum { + FLAC__STREAM_METADATA_PICTURE_TYPE_OTHER = 0, /**< Other */ + FLAC__STREAM_METADATA_PICTURE_TYPE_FILE_ICON_STANDARD = 1, /**< 32x32 pixels 'file icon' (PNG only) */ + FLAC__STREAM_METADATA_PICTURE_TYPE_FILE_ICON = 2, /**< Other file icon */ + FLAC__STREAM_METADATA_PICTURE_TYPE_FRONT_COVER = 3, /**< Cover (front) */ + FLAC__STREAM_METADATA_PICTURE_TYPE_BACK_COVER = 4, /**< Cover (back) */ + FLAC__STREAM_METADATA_PICTURE_TYPE_LEAFLET_PAGE = 5, /**< Leaflet page */ + FLAC__STREAM_METADATA_PICTURE_TYPE_MEDIA = 6, /**< Media (e.g. label side of CD) */ + FLAC__STREAM_METADATA_PICTURE_TYPE_LEAD_ARTIST = 7, /**< Lead artist/lead performer/soloist */ + FLAC__STREAM_METADATA_PICTURE_TYPE_ARTIST = 8, /**< Artist/performer */ + FLAC__STREAM_METADATA_PICTURE_TYPE_CONDUCTOR = 9, /**< Conductor */ + FLAC__STREAM_METADATA_PICTURE_TYPE_BAND = 10, /**< Band/Orchestra */ + FLAC__STREAM_METADATA_PICTURE_TYPE_COMPOSER = 11, /**< Composer */ + FLAC__STREAM_METADATA_PICTURE_TYPE_LYRICIST = 12, /**< Lyricist/text writer */ + FLAC__STREAM_METADATA_PICTURE_TYPE_RECORDING_LOCATION = 13, /**< Recording Location */ + FLAC__STREAM_METADATA_PICTURE_TYPE_DURING_RECORDING = 14, /**< During recording */ + FLAC__STREAM_METADATA_PICTURE_TYPE_DURING_PERFORMANCE = 15, /**< During performance */ + FLAC__STREAM_METADATA_PICTURE_TYPE_VIDEO_SCREEN_CAPTURE = 16, /**< Movie/video screen capture */ + FLAC__STREAM_METADATA_PICTURE_TYPE_FISH = 17, /**< A bright coloured fish */ + FLAC__STREAM_METADATA_PICTURE_TYPE_ILLUSTRATION = 18, /**< Illustration */ + FLAC__STREAM_METADATA_PICTURE_TYPE_BAND_LOGOTYPE = 19, /**< Band/artist logotype */ + FLAC__STREAM_METADATA_PICTURE_TYPE_PUBLISHER_LOGOTYPE = 20, /**< Publisher/Studio logotype */ + FLAC__STREAM_METADATA_PICTURE_TYPE_UNDEFINED +} FLAC__StreamMetadata_Picture_Type; + +/** Maps a FLAC__StreamMetadata_Picture_Type to a C string. + * + * Using a FLAC__StreamMetadata_Picture_Type as the index to this array + * will give the string equivalent. The contents should not be + * modified. + */ +extern FLAC_API const char * const FLAC__StreamMetadata_Picture_TypeString[]; + +/** FLAC PICTURE structure. (See the + * format specification + * for the full description of each field.) + */ +typedef struct { + FLAC__StreamMetadata_Picture_Type type; + /**< The kind of picture stored. */ + + char *mime_type; + /**< Picture data's MIME type, in ASCII printable characters + * 0x20-0x7e, NUL terminated. For best compatibility with players, + * use picture data of MIME type \c image/jpeg or \c image/png. A + * MIME type of '-->' is also allowed, in which case the picture + * data should be a complete URL. In file storage, the MIME type is + * stored as a 32-bit length followed by the ASCII string with no NUL + * terminator, but is converted to a plain C string in this structure + * for convenience. + */ + + FLAC__byte *description; + /**< Picture's description in UTF-8, NUL terminated. In file storage, + * the description is stored as a 32-bit length followed by the UTF-8 + * string with no NUL terminator, but is converted to a plain C string + * in this structure for convenience. + */ + + FLAC__uint32 width; + /**< Picture's width in pixels. */ + + FLAC__uint32 height; + /**< Picture's height in pixels. */ + + FLAC__uint32 depth; + /**< Picture's color depth in bits-per-pixel. */ + + FLAC__uint32 colors; + /**< For indexed palettes (like GIF), picture's number of colors (the + * number of palette entries), or \c 0 for non-indexed (i.e. 2^depth). + */ + + FLAC__uint32 data_length; + /**< Length of binary picture data in bytes. */ + + FLAC__byte *data; + /**< Binary picture data. */ + +} FLAC__StreamMetadata_Picture; + +extern FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_TYPE_LEN; /**< == 32 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_MIME_TYPE_LENGTH_LEN; /**< == 32 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_DESCRIPTION_LENGTH_LEN; /**< == 32 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN; /**< == 32 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN; /**< == 32 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN; /**< == 32 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_COLORS_LEN; /**< == 32 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_DATA_LENGTH_LEN; /**< == 32 (bits) */ + + +/** Structure that is used when a metadata block of unknown type is loaded. + * The contents are opaque. The structure is used only internally to + * correctly handle unknown metadata. + */ +typedef struct { + FLAC__byte *data; +} FLAC__StreamMetadata_Unknown; + + +/** FLAC metadata block structure. (c.f. format specification) + */ +typedef struct { + FLAC__MetadataType type; + /**< The type of the metadata block; used determine which member of the + * \a data union to dereference. If type >= FLAC__METADATA_TYPE_UNDEFINED + * then \a data.unknown must be used. */ + + FLAC__bool is_last; + /**< \c true if this metadata block is the last, else \a false */ + + unsigned length; + /**< Length, in bytes, of the block data as it appears in the stream. */ + + union { + FLAC__StreamMetadata_StreamInfo stream_info; + FLAC__StreamMetadata_Padding padding; + FLAC__StreamMetadata_Application application; + FLAC__StreamMetadata_SeekTable seek_table; + FLAC__StreamMetadata_VorbisComment vorbis_comment; + FLAC__StreamMetadata_CueSheet cue_sheet; + FLAC__StreamMetadata_Picture picture; + FLAC__StreamMetadata_Unknown unknown; + } data; + /**< Polymorphic block data; use the \a type value to determine which + * to use. */ +} FLAC__StreamMetadata; + +extern FLAC_API const unsigned FLAC__STREAM_METADATA_IS_LAST_LEN; /**< == 1 (bit) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_TYPE_LEN; /**< == 7 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_LENGTH_LEN; /**< == 24 (bits) */ + +/** The total stream length of a metadata block header in bytes. */ +#define FLAC__STREAM_METADATA_HEADER_LENGTH (4u) + +/*****************************************************************************/ + + +/***************************************************************************** + * + * Utility functions + * + *****************************************************************************/ + +/** Tests that a sample rate is valid for FLAC. + * + * \param sample_rate The sample rate to test for compliance. + * \retval FLAC__bool + * \c true if the given sample rate conforms to the specification, else + * \c false. + */ +FLAC_API FLAC__bool FLAC__format_sample_rate_is_valid(unsigned sample_rate); + +/** Tests that a blocksize at the given sample rate is valid for the FLAC + * subset. + * + * \param blocksize The blocksize to test for compliance. + * \param sample_rate The sample rate is needed, since the valid subset + * blocksize depends on the sample rate. + * \retval FLAC__bool + * \c true if the given blocksize conforms to the specification for the + * subset at the given sample rate, else \c false. + */ +FLAC_API FLAC__bool FLAC__format_blocksize_is_subset(unsigned blocksize, unsigned sample_rate); + +/** Tests that a sample rate is valid for the FLAC subset. The subset rules + * for valid sample rates are slightly more complex since the rate has to + * be expressible completely in the frame header. + * + * \param sample_rate The sample rate to test for compliance. + * \retval FLAC__bool + * \c true if the given sample rate conforms to the specification for the + * subset, else \c false. + */ +FLAC_API FLAC__bool FLAC__format_sample_rate_is_subset(unsigned sample_rate); + +/** Check a Vorbis comment entry name to see if it conforms to the Vorbis + * comment specification. + * + * Vorbis comment names must be composed only of characters from + * [0x20-0x3C,0x3E-0x7D]. + * + * \param name A NUL-terminated string to be checked. + * \assert + * \code name != NULL \endcode + * \retval FLAC__bool + * \c false if entry name is illegal, else \c true. + */ +FLAC_API FLAC__bool FLAC__format_vorbiscomment_entry_name_is_legal(const char *name); + +/** Check a Vorbis comment entry value to see if it conforms to the Vorbis + * comment specification. + * + * Vorbis comment values must be valid UTF-8 sequences. + * + * \param value A string to be checked. + * \param length A the length of \a value in bytes. May be + * \c (unsigned)(-1) to indicate that \a value is a plain + * UTF-8 NUL-terminated string. + * \assert + * \code value != NULL \endcode + * \retval FLAC__bool + * \c false if entry name is illegal, else \c true. + */ +FLAC_API FLAC__bool FLAC__format_vorbiscomment_entry_value_is_legal(const FLAC__byte *value, unsigned length); + +/** Check a Vorbis comment entry to see if it conforms to the Vorbis + * comment specification. + * + * Vorbis comment entries must be of the form 'name=value', and 'name' and + * 'value' must be legal according to + * FLAC__format_vorbiscomment_entry_name_is_legal() and + * FLAC__format_vorbiscomment_entry_value_is_legal() respectively. + * + * \param entry An entry to be checked. + * \param length The length of \a entry in bytes. + * \assert + * \code value != NULL \endcode + * \retval FLAC__bool + * \c false if entry name is illegal, else \c true. + */ +FLAC_API FLAC__bool FLAC__format_vorbiscomment_entry_is_legal(const FLAC__byte *entry, unsigned length); + +/** Check a seek table to see if it conforms to the FLAC specification. + * See the format specification for limits on the contents of the + * seek table. + * + * \param seek_table A pointer to a seek table to be checked. + * \assert + * \code seek_table != NULL \endcode + * \retval FLAC__bool + * \c false if seek table is illegal, else \c true. + */ +FLAC_API FLAC__bool FLAC__format_seektable_is_legal(const FLAC__StreamMetadata_SeekTable *seek_table); + +/** Sort a seek table's seek points according to the format specification. + * This includes a "unique-ification" step to remove duplicates, i.e. + * seek points with identical \a sample_number values. Duplicate seek + * points are converted into placeholder points and sorted to the end of + * the table. + * + * \param seek_table A pointer to a seek table to be sorted. + * \assert + * \code seek_table != NULL \endcode + * \retval unsigned + * The number of duplicate seek points converted into placeholders. + */ +FLAC_API unsigned FLAC__format_seektable_sort(FLAC__StreamMetadata_SeekTable *seek_table); + +/** Check a cue sheet to see if it conforms to the FLAC specification. + * See the format specification for limits on the contents of the + * cue sheet. + * + * \param cue_sheet A pointer to an existing cue sheet to be checked. + * \param check_cd_da_subset If \c true, check CUESHEET against more + * stringent requirements for a CD-DA (audio) disc. + * \param violation Address of a pointer to a string. If there is a + * violation, a pointer to a string explanation of the + * violation will be returned here. \a violation may be + * \c NULL if you don't need the returned string. Do not + * free the returned string; it will always point to static + * data. + * \assert + * \code cue_sheet != NULL \endcode + * \retval FLAC__bool + * \c false if cue sheet is illegal, else \c true. + */ +FLAC_API FLAC__bool FLAC__format_cuesheet_is_legal(const FLAC__StreamMetadata_CueSheet *cue_sheet, FLAC__bool check_cd_da_subset, const char **violation); + +/** Check picture data to see if it conforms to the FLAC specification. + * See the format specification for limits on the contents of the + * PICTURE block. + * + * \param picture A pointer to existing picture data to be checked. + * \param violation Address of a pointer to a string. If there is a + * violation, a pointer to a string explanation of the + * violation will be returned here. \a violation may be + * \c NULL if you don't need the returned string. Do not + * free the returned string; it will always point to static + * data. + * \assert + * \code picture != NULL \endcode + * \retval FLAC__bool + * \c false if picture data is illegal, else \c true. + */ +FLAC_API FLAC__bool FLAC__format_picture_is_legal(const FLAC__StreamMetadata_Picture *picture, const char **violation); + +/* \} */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/core/cd_hw/libchdr/deps/libFLAC/include/FLAC/metadata.h b/core/cd_hw/libchdr/deps/libFLAC/include/FLAC/metadata.h new file mode 100644 index 0000000..4e18cd6 --- /dev/null +++ b/core/cd_hw/libchdr/deps/libFLAC/include/FLAC/metadata.h @@ -0,0 +1,2182 @@ +/* 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__METADATA_H +#define FLAC__METADATA_H + +#include /* for off_t */ +#include "export.h" +#include "callback.h" +#include "format.h" + +/* -------------------------------------------------------------------- + (For an example of how all these routines are used, see the source + code for the unit tests in src/test_libFLAC/metadata_*.c, or + metaflac in src/metaflac/) + ------------------------------------------------------------------*/ + +/** \file include/FLAC/metadata.h + * + * \brief + * This module provides functions for creating and manipulating FLAC + * metadata blocks in memory, and three progressively more powerful + * interfaces for traversing and editing metadata in FLAC files. + * + * See the detailed documentation for each interface in the + * \link flac_metadata metadata \endlink module. + */ + +/** \defgroup flac_metadata FLAC/metadata.h: metadata interfaces + * \ingroup flac + * + * \brief + * This module provides functions for creating and manipulating FLAC + * metadata blocks in memory, and three progressively more powerful + * interfaces for traversing and editing metadata in native FLAC files. + * Note that currently only the Chain interface (level 2) supports Ogg + * FLAC files, and it is read-only i.e. no writing back changed + * metadata to file. + * + * There are three metadata interfaces of increasing complexity: + * + * Level 0: + * Read-only access to the STREAMINFO, VORBIS_COMMENT, CUESHEET, and + * PICTURE blocks. + * + * Level 1: + * Read-write access to all metadata blocks. This level is write- + * efficient in most cases (more on this below), and uses less memory + * than level 2. + * + * Level 2: + * Read-write access to all metadata blocks. This level is write- + * efficient in all cases, but uses more memory since all metadata for + * the whole file is read into memory and manipulated before writing + * out again. + * + * What do we mean by efficient? Since FLAC metadata appears at the + * beginning of the file, when writing metadata back to a FLAC file + * it is possible to grow or shrink the metadata such that the entire + * file must be rewritten. However, if the size remains the same during + * changes or PADDING blocks are utilized, only the metadata needs to be + * overwritten, which is much faster. + * + * Efficient means the whole file is rewritten at most one time, and only + * when necessary. Level 1 is not efficient only in the case that you + * cause more than one metadata block to grow or shrink beyond what can + * be accomodated by padding. In this case you should probably use level + * 2, which allows you to edit all the metadata for a file in memory and + * write it out all at once. + * + * All levels know how to skip over and not disturb an ID3v2 tag at the + * front of the file. + * + * All levels access files via their filenames. In addition, level 2 + * has additional alternative read and write functions that take an I/O + * handle and callbacks, for situations where access by filename is not + * possible. + * + * In addition to the three interfaces, this module defines functions for + * creating and manipulating various metadata objects in memory. As we see + * from the Format module, FLAC metadata blocks in memory are very primitive + * structures for storing information in an efficient way. Reading + * information from the structures is easy but creating or modifying them + * directly is more complex. The metadata object routines here facilitate + * this by taking care of the consistency and memory management drudgery. + * + * Unless you will be using the level 1 or 2 interfaces to modify existing + * metadata however, you will not probably not need these. + * + * From a dependency standpoint, none of the encoders or decoders require + * the metadata module. This is so that embedded users can strip out the + * metadata module from libFLAC to reduce the size and complexity. + */ + +#ifdef __cplusplus +extern "C" { +#endif + + +/** \defgroup flac_metadata_level0 FLAC/metadata.h: metadata level 0 interface + * \ingroup flac_metadata + * + * \brief + * The level 0 interface consists of individual routines to read the + * STREAMINFO, VORBIS_COMMENT, CUESHEET, and PICTURE blocks, requiring + * only a filename. + * + * They try to skip any ID3v2 tag at the head of the file. + * + * \{ + */ + +/** Read the STREAMINFO metadata block of the given FLAC file. This function + * will try to skip any ID3v2 tag at the head of the file. + * + * \param filename The path to the FLAC file to read. + * \param streaminfo A pointer to space for the STREAMINFO block. Since + * FLAC__StreamMetadata is a simple structure with no + * memory allocation involved, you pass the address of + * an existing structure. It need not be initialized. + * \assert + * \code filename != NULL \endcode + * \code streaminfo != NULL \endcode + * \retval FLAC__bool + * \c true if a valid STREAMINFO block was read from \a filename. Returns + * \c false if there was a memory allocation error, a file decoder error, + * or the file contained no STREAMINFO block. (A memory allocation error + * is possible because this function must set up a file decoder.) + */ +FLAC_API FLAC__bool FLAC__metadata_get_streaminfo(const char *filename, FLAC__StreamMetadata *streaminfo); + +/** Read the VORBIS_COMMENT metadata block of the given FLAC file. This + * function will try to skip any ID3v2 tag at the head of the file. + * + * \param filename The path to the FLAC file to read. + * \param tags The address where the returned pointer will be + * stored. The \a tags object must be deleted by + * the caller using FLAC__metadata_object_delete(). + * \assert + * \code filename != NULL \endcode + * \code tags != NULL \endcode + * \retval FLAC__bool + * \c true if a valid VORBIS_COMMENT block was read from \a filename, + * and \a *tags will be set to the address of the metadata structure. + * Returns \c false if there was a memory allocation error, a file + * decoder error, or the file contained no VORBIS_COMMENT block, and + * \a *tags will be set to \c NULL. + */ +FLAC_API FLAC__bool FLAC__metadata_get_tags(const char *filename, FLAC__StreamMetadata **tags); + +/** Read the CUESHEET metadata block of the given FLAC file. This + * function will try to skip any ID3v2 tag at the head of the file. + * + * \param filename The path to the FLAC file to read. + * \param cuesheet The address where the returned pointer will be + * stored. The \a cuesheet object must be deleted by + * the caller using FLAC__metadata_object_delete(). + * \assert + * \code filename != NULL \endcode + * \code cuesheet != NULL \endcode + * \retval FLAC__bool + * \c true if a valid CUESHEET block was read from \a filename, + * and \a *cuesheet will be set to the address of the metadata + * structure. Returns \c false if there was a memory allocation + * error, a file decoder error, or the file contained no CUESHEET + * block, and \a *cuesheet will be set to \c NULL. + */ +FLAC_API FLAC__bool FLAC__metadata_get_cuesheet(const char *filename, FLAC__StreamMetadata **cuesheet); + +/** Read a PICTURE metadata block of the given FLAC file. This + * function will try to skip any ID3v2 tag at the head of the file. + * Since there can be more than one PICTURE block in a file, this + * function takes a number of parameters that act as constraints to + * the search. The PICTURE block with the largest area matching all + * the constraints will be returned, or \a *picture will be set to + * \c NULL if there was no such block. + * + * \param filename The path to the FLAC file to read. + * \param picture The address where the returned pointer will be + * stored. The \a picture object must be deleted by + * the caller using FLAC__metadata_object_delete(). + * \param type The desired picture type. Use \c -1 to mean + * "any type". + * \param mime_type The desired MIME type, e.g. "image/jpeg". The + * string will be matched exactly. Use \c NULL to + * mean "any MIME type". + * \param description The desired description. The string will be + * matched exactly. Use \c NULL to mean "any + * description". + * \param max_width The maximum width in pixels desired. Use + * \c (unsigned)(-1) to mean "any width". + * \param max_height The maximum height in pixels desired. Use + * \c (unsigned)(-1) to mean "any height". + * \param max_depth The maximum color depth in bits-per-pixel desired. + * Use \c (unsigned)(-1) to mean "any depth". + * \param max_colors The maximum number of colors desired. Use + * \c (unsigned)(-1) to mean "any number of colors". + * \assert + * \code filename != NULL \endcode + * \code picture != NULL \endcode + * \retval FLAC__bool + * \c true if a valid PICTURE block was read from \a filename, + * and \a *picture will be set to the address of the metadata + * structure. Returns \c false if there was a memory allocation + * error, a file decoder error, or the file contained no PICTURE + * block, and \a *picture will be set to \c NULL. + */ +FLAC_API FLAC__bool FLAC__metadata_get_picture(const char *filename, FLAC__StreamMetadata **picture, FLAC__StreamMetadata_Picture_Type type, const char *mime_type, const FLAC__byte *description, unsigned max_width, unsigned max_height, unsigned max_depth, unsigned max_colors); + +/* \} */ + + +/** \defgroup flac_metadata_level1 FLAC/metadata.h: metadata level 1 interface + * \ingroup flac_metadata + * + * \brief + * The level 1 interface provides read-write access to FLAC file metadata and + * operates directly on the FLAC file. + * + * The general usage of this interface is: + * + * - Create an iterator using FLAC__metadata_simple_iterator_new() + * - Attach it to a file using FLAC__metadata_simple_iterator_init() and check + * the exit code. Call FLAC__metadata_simple_iterator_is_writable() to + * see if the file is writable, or only read access is allowed. + * - Use FLAC__metadata_simple_iterator_next() and + * FLAC__metadata_simple_iterator_prev() to traverse the blocks. + * This is does not read the actual blocks themselves. + * FLAC__metadata_simple_iterator_next() is relatively fast. + * FLAC__metadata_simple_iterator_prev() is slower since it needs to search + * forward from the front of the file. + * - Use FLAC__metadata_simple_iterator_get_block_type() or + * FLAC__metadata_simple_iterator_get_block() to access the actual data at + * the current iterator position. The returned object is yours to modify + * and free. + * - Use FLAC__metadata_simple_iterator_set_block() to write a modified block + * back. You must have write permission to the original file. Make sure to + * read the whole comment to FLAC__metadata_simple_iterator_set_block() + * below. + * - Use FLAC__metadata_simple_iterator_insert_block_after() to add new blocks. + * Use the object creation functions from + * \link flac_metadata_object here \endlink to generate new objects. + * - Use FLAC__metadata_simple_iterator_delete_block() to remove the block + * currently referred to by the iterator, or replace it with padding. + * - Destroy the iterator with FLAC__metadata_simple_iterator_delete() when + * finished. + * + * \note + * The FLAC file remains open the whole time between + * FLAC__metadata_simple_iterator_init() and + * FLAC__metadata_simple_iterator_delete(), so make sure you are not altering + * the file during this time. + * + * \note + * Do not modify the \a is_last, \a length, or \a type fields of returned + * FLAC__StreamMetadata objects. These are managed automatically. + * + * \note + * If any of the modification functions + * (FLAC__metadata_simple_iterator_set_block(), + * FLAC__metadata_simple_iterator_delete_block(), + * FLAC__metadata_simple_iterator_insert_block_after(), etc.) return \c false, + * you should delete the iterator as it may no longer be valid. + * + * \{ + */ + +struct FLAC__Metadata_SimpleIterator; +/** The opaque structure definition for the level 1 iterator type. + * See the + * \link flac_metadata_level1 metadata level 1 module \endlink + * for a detailed description. + */ +typedef struct FLAC__Metadata_SimpleIterator FLAC__Metadata_SimpleIterator; + +/** Status type for FLAC__Metadata_SimpleIterator. + * + * The iterator's current status can be obtained by calling FLAC__metadata_simple_iterator_status(). + */ +typedef enum { + + FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK = 0, + /**< The iterator is in the normal OK state */ + + FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ILLEGAL_INPUT, + /**< The data passed into a function violated the function's usage criteria */ + + FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ERROR_OPENING_FILE, + /**< The iterator could not open the target file */ + + FLAC__METADATA_SIMPLE_ITERATOR_STATUS_NOT_A_FLAC_FILE, + /**< The iterator could not find the FLAC signature at the start of the file */ + + FLAC__METADATA_SIMPLE_ITERATOR_STATUS_NOT_WRITABLE, + /**< The iterator tried to write to a file that was not writable */ + + FLAC__METADATA_SIMPLE_ITERATOR_STATUS_BAD_METADATA, + /**< The iterator encountered input that does not conform to the FLAC metadata specification */ + + FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR, + /**< The iterator encountered an error while reading the FLAC file */ + + FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR, + /**< The iterator encountered an error while seeking in the FLAC file */ + + FLAC__METADATA_SIMPLE_ITERATOR_STATUS_WRITE_ERROR, + /**< The iterator encountered an error while writing the FLAC file */ + + FLAC__METADATA_SIMPLE_ITERATOR_STATUS_RENAME_ERROR, + /**< The iterator encountered an error renaming the FLAC file */ + + FLAC__METADATA_SIMPLE_ITERATOR_STATUS_UNLINK_ERROR, + /**< The iterator encountered an error removing the temporary file */ + + FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR, + /**< Memory allocation failed */ + + FLAC__METADATA_SIMPLE_ITERATOR_STATUS_INTERNAL_ERROR + /**< The caller violated an assertion or an unexpected error occurred */ + +} FLAC__Metadata_SimpleIteratorStatus; + +/** Maps a FLAC__Metadata_SimpleIteratorStatus to a C string. + * + * Using a FLAC__Metadata_SimpleIteratorStatus as the index to this array + * will give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__Metadata_SimpleIteratorStatusString[]; + + +/** Create a new iterator instance. + * + * \retval FLAC__Metadata_SimpleIterator* + * \c NULL if there was an error allocating memory, else the new instance. + */ +FLAC_API FLAC__Metadata_SimpleIterator *FLAC__metadata_simple_iterator_new(void); + +/** Free an iterator instance. Deletes the object pointed to by \a iterator. + * + * \param iterator A pointer to an existing iterator. + * \assert + * \code iterator != NULL \endcode + */ +FLAC_API void FLAC__metadata_simple_iterator_delete(FLAC__Metadata_SimpleIterator *iterator); + +/** Get the current status of the iterator. Call this after a function + * returns \c false to get the reason for the error. Also resets the status + * to FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK. + * + * \param iterator A pointer to an existing iterator. + * \assert + * \code iterator != NULL \endcode + * \retval FLAC__Metadata_SimpleIteratorStatus + * The current status of the iterator. + */ +FLAC_API FLAC__Metadata_SimpleIteratorStatus FLAC__metadata_simple_iterator_status(FLAC__Metadata_SimpleIterator *iterator); + +/** Initialize the iterator to point to the first metadata block in the + * given FLAC file. + * + * \param iterator A pointer to an existing iterator. + * \param filename The path to the FLAC file. + * \param read_only If \c true, the FLAC file will be opened + * in read-only mode; if \c false, the FLAC + * file will be opened for edit even if no + * edits are performed. + * \param preserve_file_stats If \c true, the owner and modification + * time will be preserved even if the FLAC + * file is written to. + * \assert + * \code iterator != NULL \endcode + * \code filename != NULL \endcode + * \retval FLAC__bool + * \c false if a memory allocation error occurs, the file can't be + * opened, or another error occurs, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_simple_iterator_init(FLAC__Metadata_SimpleIterator *iterator, const char *filename, FLAC__bool read_only, FLAC__bool preserve_file_stats); + +/** Returns \c true if the FLAC file is writable. If \c false, calls to + * FLAC__metadata_simple_iterator_set_block() and + * FLAC__metadata_simple_iterator_insert_block_after() will fail. + * + * \param iterator A pointer to an existing iterator. + * \assert + * \code iterator != NULL \endcode + * \retval FLAC__bool + * See above. + */ +FLAC_API FLAC__bool FLAC__metadata_simple_iterator_is_writable(const FLAC__Metadata_SimpleIterator *iterator); + +/** Moves the iterator forward one metadata block, returning \c false if + * already at the end. + * + * \param iterator A pointer to an existing initialized iterator. + * \assert + * \code iterator != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_simple_iterator_init() + * \retval FLAC__bool + * \c false if already at the last metadata block of the chain, else + * \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_simple_iterator_next(FLAC__Metadata_SimpleIterator *iterator); + +/** Moves the iterator backward one metadata block, returning \c false if + * already at the beginning. + * + * \param iterator A pointer to an existing initialized iterator. + * \assert + * \code iterator != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_simple_iterator_init() + * \retval FLAC__bool + * \c false if already at the first metadata block of the chain, else + * \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_simple_iterator_prev(FLAC__Metadata_SimpleIterator *iterator); + +/** Returns a flag telling if the current metadata block is the last. + * + * \param iterator A pointer to an existing initialized iterator. + * \assert + * \code iterator != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_simple_iterator_init() + * \retval FLAC__bool + * \c true if the current metadata block is the last in the file, + * else \c false. + */ +FLAC_API FLAC__bool FLAC__metadata_simple_iterator_is_last(const FLAC__Metadata_SimpleIterator *iterator); + +/** Get the offset of the metadata block at the current position. This + * avoids reading the actual block data which can save time for large + * blocks. + * + * \param iterator A pointer to an existing initialized iterator. + * \assert + * \code iterator != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_simple_iterator_init() + * \retval off_t + * The offset of the metadata block at the current iterator position. + * This is the byte offset relative to the beginning of the file of + * the current metadata block's header. + */ +FLAC_API off_t FLAC__metadata_simple_iterator_get_block_offset(const FLAC__Metadata_SimpleIterator *iterator); + +/** Get the type of the metadata block at the current position. This + * avoids reading the actual block data which can save time for large + * blocks. + * + * \param iterator A pointer to an existing initialized iterator. + * \assert + * \code iterator != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_simple_iterator_init() + * \retval FLAC__MetadataType + * The type of the metadata block at the current iterator position. + */ +FLAC_API FLAC__MetadataType FLAC__metadata_simple_iterator_get_block_type(const FLAC__Metadata_SimpleIterator *iterator); + +/** Get the length of the metadata block at the current position. This + * avoids reading the actual block data which can save time for large + * blocks. + * + * \param iterator A pointer to an existing initialized iterator. + * \assert + * \code iterator != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_simple_iterator_init() + * \retval unsigned + * The length of the metadata block at the current iterator position. + * The is same length as that in the + * metadata block header, + * i.e. the length of the metadata body that follows the header. + */ +FLAC_API unsigned FLAC__metadata_simple_iterator_get_block_length(const FLAC__Metadata_SimpleIterator *iterator); + +/** Get the application ID of the \c APPLICATION block at the current + * position. This avoids reading the actual block data which can save + * time for large blocks. + * + * \param iterator A pointer to an existing initialized iterator. + * \param id A pointer to a buffer of at least \c 4 bytes where + * the ID will be stored. + * \assert + * \code iterator != NULL \endcode + * \code id != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_simple_iterator_init() + * \retval FLAC__bool + * \c true if the ID was successfully read, else \c false, in which + * case you should check FLAC__metadata_simple_iterator_status() to + * find out why. If the status is + * \c FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ILLEGAL_INPUT, then the + * current metadata block is not an \c APPLICATION block. Otherwise + * if the status is + * \c FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR or + * \c FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR, an I/O error + * occurred and the iterator can no longer be used. + */ +FLAC_API FLAC__bool FLAC__metadata_simple_iterator_get_application_id(FLAC__Metadata_SimpleIterator *iterator, FLAC__byte *id); + +/** Get the metadata block at the current position. You can modify the + * block but must use FLAC__metadata_simple_iterator_set_block() to + * write it back to the FLAC file. + * + * You must call FLAC__metadata_object_delete() on the returned object + * when you are finished with it. + * + * \param iterator A pointer to an existing initialized iterator. + * \assert + * \code iterator != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_simple_iterator_init() + * \retval FLAC__StreamMetadata* + * The current metadata block, or \c NULL if there was a memory + * allocation error. + */ +FLAC_API FLAC__StreamMetadata *FLAC__metadata_simple_iterator_get_block(FLAC__Metadata_SimpleIterator *iterator); + +/** Write a block back to the FLAC file. This function tries to be + * as efficient as possible; how the block is actually written is + * shown by the following: + * + * Existing block is a STREAMINFO block and the new block is a + * STREAMINFO block: the new block is written in place. Make sure + * you know what you're doing when changing the values of a + * STREAMINFO block. + * + * Existing block is a STREAMINFO block and the new block is a + * not a STREAMINFO block: this is an error since the first block + * must be a STREAMINFO block. Returns \c false without altering the + * file. + * + * Existing block is not a STREAMINFO block and the new block is a + * STREAMINFO block: this is an error since there may be only one + * STREAMINFO block. Returns \c false without altering the file. + * + * Existing block and new block are the same length: the existing + * block will be replaced by the new block, written in place. + * + * Existing block is longer than new block: if use_padding is \c true, + * the existing block will be overwritten in place with the new + * block followed by a PADDING block, if possible, to make the total + * size the same as the existing block. Remember that a padding + * block requires at least four bytes so if the difference in size + * between the new block and existing block is less than that, the + * entire file will have to be rewritten, using the new block's + * exact size. If use_padding is \c false, the entire file will be + * rewritten, replacing the existing block by the new block. + * + * Existing block is shorter than new block: if use_padding is \c true, + * the function will try and expand the new block into the following + * PADDING block, if it exists and doing so won't shrink the PADDING + * block to less than 4 bytes. If there is no following PADDING + * block, or it will shrink to less than 4 bytes, or use_padding is + * \c false, the entire file is rewritten, replacing the existing block + * with the new block. Note that in this case any following PADDING + * block is preserved as is. + * + * After writing the block, the iterator will remain in the same + * place, i.e. pointing to the new block. + * + * \param iterator A pointer to an existing initialized iterator. + * \param block The block to set. + * \param use_padding See above. + * \assert + * \code iterator != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_simple_iterator_init() + * \code block != NULL \endcode + * \retval FLAC__bool + * \c true if successful, else \c false. + */ +FLAC_API FLAC__bool FLAC__metadata_simple_iterator_set_block(FLAC__Metadata_SimpleIterator *iterator, FLAC__StreamMetadata *block, FLAC__bool use_padding); + +/** This is similar to FLAC__metadata_simple_iterator_set_block() + * except that instead of writing over an existing block, it appends + * a block after the existing block. \a use_padding is again used to + * tell the function to try an expand into following padding in an + * attempt to avoid rewriting the entire file. + * + * This function will fail and return \c false if given a STREAMINFO + * block. + * + * After writing the block, the iterator will be pointing to the + * new block. + * + * \param iterator A pointer to an existing initialized iterator. + * \param block The block to set. + * \param use_padding See above. + * \assert + * \code iterator != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_simple_iterator_init() + * \code block != NULL \endcode + * \retval FLAC__bool + * \c true if successful, else \c false. + */ +FLAC_API FLAC__bool FLAC__metadata_simple_iterator_insert_block_after(FLAC__Metadata_SimpleIterator *iterator, FLAC__StreamMetadata *block, FLAC__bool use_padding); + +/** Deletes the block at the current position. This will cause the + * entire FLAC file to be rewritten, unless \a use_padding is \c true, + * in which case the block will be replaced by an equal-sized PADDING + * block. The iterator will be left pointing to the block before the + * one just deleted. + * + * You may not delete the STREAMINFO block. + * + * \param iterator A pointer to an existing initialized iterator. + * \param use_padding See above. + * \assert + * \code iterator != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_simple_iterator_init() + * \retval FLAC__bool + * \c true if successful, else \c false. + */ +FLAC_API FLAC__bool FLAC__metadata_simple_iterator_delete_block(FLAC__Metadata_SimpleIterator *iterator, FLAC__bool use_padding); + +/* \} */ + + +/** \defgroup flac_metadata_level2 FLAC/metadata.h: metadata level 2 interface + * \ingroup flac_metadata + * + * \brief + * The level 2 interface provides read-write access to FLAC file metadata; + * all metadata is read into memory, operated on in memory, and then written + * to file, which is more efficient than level 1 when editing multiple blocks. + * + * Currently Ogg FLAC is supported for read only, via + * FLAC__metadata_chain_read_ogg() but a subsequent + * FLAC__metadata_chain_write() will fail. + * + * The general usage of this interface is: + * + * - Create a new chain using FLAC__metadata_chain_new(). A chain is a + * linked list of FLAC metadata blocks. + * - Read all metadata into the chain from a FLAC file using + * FLAC__metadata_chain_read() or FLAC__metadata_chain_read_ogg() and + * check the status. + * - Optionally, consolidate the padding using + * FLAC__metadata_chain_merge_padding() or + * FLAC__metadata_chain_sort_padding(). + * - Create a new iterator using FLAC__metadata_iterator_new() + * - Initialize the iterator to point to the first element in the chain + * using FLAC__metadata_iterator_init() + * - Traverse the chain using FLAC__metadata_iterator_next and + * FLAC__metadata_iterator_prev(). + * - Get a block for reading or modification using + * FLAC__metadata_iterator_get_block(). The pointer to the object + * inside the chain is returned, so the block is yours to modify. + * Changes will be reflected in the FLAC file when you write the + * chain. You can also add and delete blocks (see functions below). + * - When done, write out the chain using FLAC__metadata_chain_write(). + * Make sure to read the whole comment to the function below. + * - Delete the chain using FLAC__metadata_chain_delete(). + * + * \note + * Even though the FLAC file is not open while the chain is being + * manipulated, you must not alter the file externally during + * this time. The chain assumes the FLAC file will not change + * between the time of FLAC__metadata_chain_read()/FLAC__metadata_chain_read_ogg() + * and FLAC__metadata_chain_write(). + * + * \note + * Do not modify the is_last, length, or type fields of returned + * FLAC__StreamMetadata objects. These are managed automatically. + * + * \note + * The metadata objects returned by FLAC__metadata_iterator_get_block() + * are owned by the chain; do not FLAC__metadata_object_delete() them. + * In the same way, blocks passed to FLAC__metadata_iterator_set_block() + * become owned by the chain and they will be deleted when the chain is + * deleted. + * + * \{ + */ + +struct FLAC__Metadata_Chain; +/** The opaque structure definition for the level 2 chain type. + */ +typedef struct FLAC__Metadata_Chain FLAC__Metadata_Chain; + +struct FLAC__Metadata_Iterator; +/** The opaque structure definition for the level 2 iterator type. + */ +typedef struct FLAC__Metadata_Iterator FLAC__Metadata_Iterator; + +typedef enum { + FLAC__METADATA_CHAIN_STATUS_OK = 0, + /**< The chain is in the normal OK state */ + + FLAC__METADATA_CHAIN_STATUS_ILLEGAL_INPUT, + /**< The data passed into a function violated the function's usage criteria */ + + FLAC__METADATA_CHAIN_STATUS_ERROR_OPENING_FILE, + /**< The chain could not open the target file */ + + FLAC__METADATA_CHAIN_STATUS_NOT_A_FLAC_FILE, + /**< The chain could not find the FLAC signature at the start of the file */ + + FLAC__METADATA_CHAIN_STATUS_NOT_WRITABLE, + /**< The chain tried to write to a file that was not writable */ + + FLAC__METADATA_CHAIN_STATUS_BAD_METADATA, + /**< The chain encountered input that does not conform to the FLAC metadata specification */ + + FLAC__METADATA_CHAIN_STATUS_READ_ERROR, + /**< The chain encountered an error while reading the FLAC file */ + + FLAC__METADATA_CHAIN_STATUS_SEEK_ERROR, + /**< The chain encountered an error while seeking in the FLAC file */ + + FLAC__METADATA_CHAIN_STATUS_WRITE_ERROR, + /**< The chain encountered an error while writing the FLAC file */ + + FLAC__METADATA_CHAIN_STATUS_RENAME_ERROR, + /**< The chain encountered an error renaming the FLAC file */ + + FLAC__METADATA_CHAIN_STATUS_UNLINK_ERROR, + /**< The chain encountered an error removing the temporary file */ + + FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR, + /**< Memory allocation failed */ + + FLAC__METADATA_CHAIN_STATUS_INTERNAL_ERROR, + /**< The caller violated an assertion or an unexpected error occurred */ + + FLAC__METADATA_CHAIN_STATUS_INVALID_CALLBACKS, + /**< One or more of the required callbacks was NULL */ + + FLAC__METADATA_CHAIN_STATUS_READ_WRITE_MISMATCH, + /**< FLAC__metadata_chain_write() was called on a chain read by + * FLAC__metadata_chain_read_with_callbacks()/FLAC__metadata_chain_read_ogg_with_callbacks(), + * or + * FLAC__metadata_chain_write_with_callbacks()/FLAC__metadata_chain_write_with_callbacks_and_tempfile() + * was called on a chain read by + * FLAC__metadata_chain_read()/FLAC__metadata_chain_read_ogg(). + * Matching read/write methods must always be used. */ + + FLAC__METADATA_CHAIN_STATUS_WRONG_WRITE_CALL + /**< FLAC__metadata_chain_write_with_callbacks() was called when the + * chain write requires a tempfile; use + * FLAC__metadata_chain_write_with_callbacks_and_tempfile() instead. + * Or, FLAC__metadata_chain_write_with_callbacks_and_tempfile() was + * called when the chain write does not require a tempfile; use + * FLAC__metadata_chain_write_with_callbacks() instead. + * Always check FLAC__metadata_chain_check_if_tempfile_needed() + * before writing via callbacks. */ + +} FLAC__Metadata_ChainStatus; + +/** Maps a FLAC__Metadata_ChainStatus to a C string. + * + * Using a FLAC__Metadata_ChainStatus as the index to this array + * will give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__Metadata_ChainStatusString[]; + +/*********** FLAC__Metadata_Chain ***********/ + +/** Create a new chain instance. + * + * \retval FLAC__Metadata_Chain* + * \c NULL if there was an error allocating memory, else the new instance. + */ +FLAC_API FLAC__Metadata_Chain *FLAC__metadata_chain_new(void); + +/** Free a chain instance. Deletes the object pointed to by \a chain. + * + * \param chain A pointer to an existing chain. + * \assert + * \code chain != NULL \endcode + */ +FLAC_API void FLAC__metadata_chain_delete(FLAC__Metadata_Chain *chain); + +/** Get the current status of the chain. Call this after a function + * returns \c false to get the reason for the error. Also resets the + * status to FLAC__METADATA_CHAIN_STATUS_OK. + * + * \param chain A pointer to an existing chain. + * \assert + * \code chain != NULL \endcode + * \retval FLAC__Metadata_ChainStatus + * The current status of the chain. + */ +FLAC_API FLAC__Metadata_ChainStatus FLAC__metadata_chain_status(FLAC__Metadata_Chain *chain); + +/** Read all metadata from a FLAC file into the chain. + * + * \param chain A pointer to an existing chain. + * \param filename The path to the FLAC file to read. + * \assert + * \code chain != NULL \endcode + * \code filename != NULL \endcode + * \retval FLAC__bool + * \c true if a valid list of metadata blocks was read from + * \a filename, else \c false. On failure, check the status with + * FLAC__metadata_chain_status(). + */ +FLAC_API FLAC__bool FLAC__metadata_chain_read(FLAC__Metadata_Chain *chain, const char *filename); + +/** Read all metadata from an Ogg FLAC file into the chain. + * + * \note Ogg FLAC metadata data writing is not supported yet and + * FLAC__metadata_chain_write() will fail. + * + * \param chain A pointer to an existing chain. + * \param filename The path to the Ogg FLAC file to read. + * \assert + * \code chain != NULL \endcode + * \code filename != NULL \endcode + * \retval FLAC__bool + * \c true if a valid list of metadata blocks was read from + * \a filename, else \c false. On failure, check the status with + * FLAC__metadata_chain_status(). + */ +FLAC_API FLAC__bool FLAC__metadata_chain_read_ogg(FLAC__Metadata_Chain *chain, const char *filename); + +/** Read all metadata from a FLAC stream into the chain via I/O callbacks. + * + * The \a handle need only be open for reading, but must be seekable. + * The equivalent minimum stdio fopen() file mode is \c "r" (or \c "rb" + * for Windows). + * + * \param chain A pointer to an existing chain. + * \param handle The I/O handle of the FLAC stream to read. The + * handle will NOT be closed after the metadata is read; + * that is the duty of the caller. + * \param callbacks + * A set of callbacks to use for I/O. The mandatory + * callbacks are \a read, \a seek, and \a tell. + * \assert + * \code chain != NULL \endcode + * \retval FLAC__bool + * \c true if a valid list of metadata blocks was read from + * \a handle, else \c false. On failure, check the status with + * FLAC__metadata_chain_status(). + */ +FLAC_API FLAC__bool FLAC__metadata_chain_read_with_callbacks(FLAC__Metadata_Chain *chain, FLAC__IOHandle handle, FLAC__IOCallbacks callbacks); + +/** Read all metadata from an Ogg FLAC stream into the chain via I/O callbacks. + * + * The \a handle need only be open for reading, but must be seekable. + * The equivalent minimum stdio fopen() file mode is \c "r" (or \c "rb" + * for Windows). + * + * \note Ogg FLAC metadata data writing is not supported yet and + * FLAC__metadata_chain_write() will fail. + * + * \param chain A pointer to an existing chain. + * \param handle The I/O handle of the Ogg FLAC stream to read. The + * handle will NOT be closed after the metadata is read; + * that is the duty of the caller. + * \param callbacks + * A set of callbacks to use for I/O. The mandatory + * callbacks are \a read, \a seek, and \a tell. + * \assert + * \code chain != NULL \endcode + * \retval FLAC__bool + * \c true if a valid list of metadata blocks was read from + * \a handle, else \c false. On failure, check the status with + * FLAC__metadata_chain_status(). + */ +FLAC_API FLAC__bool FLAC__metadata_chain_read_ogg_with_callbacks(FLAC__Metadata_Chain *chain, FLAC__IOHandle handle, FLAC__IOCallbacks callbacks); + +/** Checks if writing the given chain would require the use of a + * temporary file, or if it could be written in place. + * + * Under certain conditions, padding can be utilized so that writing + * edited metadata back to the FLAC file does not require rewriting the + * entire file. If rewriting is required, then a temporary workfile is + * required. When writing metadata using callbacks, you must check + * this function to know whether to call + * FLAC__metadata_chain_write_with_callbacks() or + * FLAC__metadata_chain_write_with_callbacks_and_tempfile(). When + * writing with FLAC__metadata_chain_write(), the temporary file is + * handled internally. + * + * \param chain A pointer to an existing chain. + * \param use_padding + * Whether or not padding will be allowed to be used + * during the write. The value of \a use_padding given + * here must match the value later passed to + * FLAC__metadata_chain_write_with_callbacks() or + * FLAC__metadata_chain_write_with_callbacks_with_tempfile(). + * \assert + * \code chain != NULL \endcode + * \retval FLAC__bool + * \c true if writing the current chain would require a tempfile, or + * \c false if metadata can be written in place. + */ +FLAC_API FLAC__bool FLAC__metadata_chain_check_if_tempfile_needed(FLAC__Metadata_Chain *chain, FLAC__bool use_padding); + +/** Write all metadata out to the FLAC file. This function tries to be as + * efficient as possible; how the metadata is actually written is shown by + * the following: + * + * If the current chain is the same size as the existing metadata, the new + * data is written in place. + * + * If the current chain is longer than the existing metadata, and + * \a use_padding is \c true, and the last block is a PADDING block of + * sufficient length, the function will truncate the final padding block + * so that the overall size of the metadata is the same as the existing + * metadata, and then just rewrite the metadata. Otherwise, if not all of + * the above conditions are met, the entire FLAC file must be rewritten. + * If you want to use padding this way it is a good idea to call + * FLAC__metadata_chain_sort_padding() first so that you have the maximum + * amount of padding to work with, unless you need to preserve ordering + * of the PADDING blocks for some reason. + * + * If the current chain is shorter than the existing metadata, and + * \a use_padding is \c true, and the final block is a PADDING block, the padding + * is extended to make the overall size the same as the existing data. If + * \a use_padding is \c true and the last block is not a PADDING block, a new + * PADDING block is added to the end of the new data to make it the same + * size as the existing data (if possible, see the note to + * FLAC__metadata_simple_iterator_set_block() about the four byte limit) + * and the new data is written in place. If none of the above apply or + * \a use_padding is \c false, the entire FLAC file is rewritten. + * + * If \a preserve_file_stats is \c true, the owner and modification time will + * be preserved even if the FLAC file is written. + * + * For this write function to be used, the chain must have been read with + * FLAC__metadata_chain_read()/FLAC__metadata_chain_read_ogg(), not + * FLAC__metadata_chain_read_with_callbacks()/FLAC__metadata_chain_read_ogg_with_callbacks(). + * + * \param chain A pointer to an existing chain. + * \param use_padding See above. + * \param preserve_file_stats See above. + * \assert + * \code chain != NULL \endcode + * \retval FLAC__bool + * \c true if the write succeeded, else \c false. On failure, + * check the status with FLAC__metadata_chain_status(). + */ +FLAC_API FLAC__bool FLAC__metadata_chain_write(FLAC__Metadata_Chain *chain, FLAC__bool use_padding, FLAC__bool preserve_file_stats); + +/** Write all metadata out to a FLAC stream via callbacks. + * + * (See FLAC__metadata_chain_write() for the details on how padding is + * used to write metadata in place if possible.) + * + * The \a handle must be open for updating and be seekable. The + * equivalent minimum stdio fopen() file mode is \c "r+" (or \c "r+b" + * for Windows). + * + * For this write function to be used, the chain must have been read with + * FLAC__metadata_chain_read_with_callbacks()/FLAC__metadata_chain_read_ogg_with_callbacks(), + * not FLAC__metadata_chain_read()/FLAC__metadata_chain_read_ogg(). + * Also, FLAC__metadata_chain_check_if_tempfile_needed() must have returned + * \c false. + * + * \param chain A pointer to an existing chain. + * \param use_padding See FLAC__metadata_chain_write() + * \param handle The I/O handle of the FLAC stream to write. The + * handle will NOT be closed after the metadata is + * written; that is the duty of the caller. + * \param callbacks A set of callbacks to use for I/O. The mandatory + * callbacks are \a write and \a seek. + * \assert + * \code chain != NULL \endcode + * \retval FLAC__bool + * \c true if the write succeeded, else \c false. On failure, + * check the status with FLAC__metadata_chain_status(). + */ +FLAC_API FLAC__bool FLAC__metadata_chain_write_with_callbacks(FLAC__Metadata_Chain *chain, FLAC__bool use_padding, FLAC__IOHandle handle, FLAC__IOCallbacks callbacks); + +/** Write all metadata out to a FLAC stream via callbacks. + * + * (See FLAC__metadata_chain_write() for the details on how padding is + * used to write metadata in place if possible.) + * + * This version of the write-with-callbacks function must be used when + * FLAC__metadata_chain_check_if_tempfile_needed() returns true. In + * this function, you must supply an I/O handle corresponding to the + * FLAC file to edit, and a temporary handle to which the new FLAC + * file will be written. It is the caller's job to move this temporary + * FLAC file on top of the original FLAC file to complete the metadata + * edit. + * + * The \a handle must be open for reading and be seekable. The + * equivalent minimum stdio fopen() file mode is \c "r" (or \c "rb" + * for Windows). + * + * The \a temp_handle must be open for writing. The + * equivalent minimum stdio fopen() file mode is \c "w" (or \c "wb" + * for Windows). It should be an empty stream, or at least positioned + * at the start-of-file (in which case it is the caller's duty to + * truncate it on return). + * + * For this write function to be used, the chain must have been read with + * FLAC__metadata_chain_read_with_callbacks()/FLAC__metadata_chain_read_ogg_with_callbacks(), + * not FLAC__metadata_chain_read()/FLAC__metadata_chain_read_ogg(). + * Also, FLAC__metadata_chain_check_if_tempfile_needed() must have returned + * \c true. + * + * \param chain A pointer to an existing chain. + * \param use_padding See FLAC__metadata_chain_write() + * \param handle The I/O handle of the original FLAC stream to read. + * The handle will NOT be closed after the metadata is + * written; that is the duty of the caller. + * \param callbacks A set of callbacks to use for I/O on \a handle. + * The mandatory callbacks are \a read, \a seek, and + * \a eof. + * \param temp_handle The I/O handle of the FLAC stream to write. The + * handle will NOT be closed after the metadata is + * written; that is the duty of the caller. + * \param temp_callbacks + * A set of callbacks to use for I/O on temp_handle. + * The only mandatory callback is \a write. + * \assert + * \code chain != NULL \endcode + * \retval FLAC__bool + * \c true if the write succeeded, else \c false. On failure, + * check the status with FLAC__metadata_chain_status(). + */ +FLAC_API FLAC__bool FLAC__metadata_chain_write_with_callbacks_and_tempfile(FLAC__Metadata_Chain *chain, FLAC__bool use_padding, FLAC__IOHandle handle, FLAC__IOCallbacks callbacks, FLAC__IOHandle temp_handle, FLAC__IOCallbacks temp_callbacks); + +/** Merge adjacent PADDING blocks into a single block. + * + * \note This function does not write to the FLAC file, it only + * modifies the chain. + * + * \warning Any iterator on the current chain will become invalid after this + * call. You should delete the iterator and get a new one. + * + * \param chain A pointer to an existing chain. + * \assert + * \code chain != NULL \endcode + */ +FLAC_API void FLAC__metadata_chain_merge_padding(FLAC__Metadata_Chain *chain); + +/** This function will move all PADDING blocks to the end on the metadata, + * then merge them into a single block. + * + * \note This function does not write to the FLAC file, it only + * modifies the chain. + * + * \warning Any iterator on the current chain will become invalid after this + * call. You should delete the iterator and get a new one. + * + * \param chain A pointer to an existing chain. + * \assert + * \code chain != NULL \endcode + */ +FLAC_API void FLAC__metadata_chain_sort_padding(FLAC__Metadata_Chain *chain); + + +/*********** FLAC__Metadata_Iterator ***********/ + +/** Create a new iterator instance. + * + * \retval FLAC__Metadata_Iterator* + * \c NULL if there was an error allocating memory, else the new instance. + */ +FLAC_API FLAC__Metadata_Iterator *FLAC__metadata_iterator_new(void); + +/** Free an iterator instance. Deletes the object pointed to by \a iterator. + * + * \param iterator A pointer to an existing iterator. + * \assert + * \code iterator != NULL \endcode + */ +FLAC_API void FLAC__metadata_iterator_delete(FLAC__Metadata_Iterator *iterator); + +/** Initialize the iterator to point to the first metadata block in the + * given chain. + * + * \param iterator A pointer to an existing iterator. + * \param chain A pointer to an existing and initialized (read) chain. + * \assert + * \code iterator != NULL \endcode + * \code chain != NULL \endcode + */ +FLAC_API void FLAC__metadata_iterator_init(FLAC__Metadata_Iterator *iterator, FLAC__Metadata_Chain *chain); + +/** Moves the iterator forward one metadata block, returning \c false if + * already at the end. + * + * \param iterator A pointer to an existing initialized iterator. + * \assert + * \code iterator != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_iterator_init() + * \retval FLAC__bool + * \c false if already at the last metadata block of the chain, else + * \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_iterator_next(FLAC__Metadata_Iterator *iterator); + +/** Moves the iterator backward one metadata block, returning \c false if + * already at the beginning. + * + * \param iterator A pointer to an existing initialized iterator. + * \assert + * \code iterator != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_iterator_init() + * \retval FLAC__bool + * \c false if already at the first metadata block of the chain, else + * \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_iterator_prev(FLAC__Metadata_Iterator *iterator); + +/** Get the type of the metadata block at the current position. + * + * \param iterator A pointer to an existing initialized iterator. + * \assert + * \code iterator != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_iterator_init() + * \retval FLAC__MetadataType + * The type of the metadata block at the current iterator position. + */ +FLAC_API FLAC__MetadataType FLAC__metadata_iterator_get_block_type(const FLAC__Metadata_Iterator *iterator); + +/** Get the metadata block at the current position. You can modify + * the block in place but must write the chain before the changes + * are reflected to the FLAC file. You do not need to call + * FLAC__metadata_iterator_set_block() to reflect the changes; + * the pointer returned by FLAC__metadata_iterator_get_block() + * points directly into the chain. + * + * \warning + * Do not call FLAC__metadata_object_delete() on the returned object; + * to delete a block use FLAC__metadata_iterator_delete_block(). + * + * \param iterator A pointer to an existing initialized iterator. + * \assert + * \code iterator != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_iterator_init() + * \retval FLAC__StreamMetadata* + * The current metadata block. + */ +FLAC_API FLAC__StreamMetadata *FLAC__metadata_iterator_get_block(FLAC__Metadata_Iterator *iterator); + +/** Set the metadata block at the current position, replacing the existing + * block. The new block passed in becomes owned by the chain and it will be + * deleted when the chain is deleted. + * + * \param iterator A pointer to an existing initialized iterator. + * \param block A pointer to a metadata block. + * \assert + * \code iterator != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_iterator_init() + * \code block != NULL \endcode + * \retval FLAC__bool + * \c false if the conditions in the above description are not met, or + * a memory allocation error occurs, otherwise \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_iterator_set_block(FLAC__Metadata_Iterator *iterator, FLAC__StreamMetadata *block); + +/** Removes the current block from the chain. If \a replace_with_padding is + * \c true, the block will instead be replaced with a padding block of equal + * size. You can not delete the STREAMINFO block. The iterator will be + * left pointing to the block before the one just "deleted", even if + * \a replace_with_padding is \c true. + * + * \param iterator A pointer to an existing initialized iterator. + * \param replace_with_padding See above. + * \assert + * \code iterator != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_iterator_init() + * \retval FLAC__bool + * \c false if the conditions in the above description are not met, + * otherwise \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_iterator_delete_block(FLAC__Metadata_Iterator *iterator, FLAC__bool replace_with_padding); + +/** Insert a new block before the current block. You cannot insert a block + * before the first STREAMINFO block. You cannot insert a STREAMINFO block + * as there can be only one, the one that already exists at the head when you + * read in a chain. The chain takes ownership of the new block and it will be + * deleted when the chain is deleted. The iterator will be left pointing to + * the new block. + * + * \param iterator A pointer to an existing initialized iterator. + * \param block A pointer to a metadata block to insert. + * \assert + * \code iterator != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_iterator_init() + * \retval FLAC__bool + * \c false if the conditions in the above description are not met, or + * a memory allocation error occurs, otherwise \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_iterator_insert_block_before(FLAC__Metadata_Iterator *iterator, FLAC__StreamMetadata *block); + +/** Insert a new block after the current block. You cannot insert a STREAMINFO + * block as there can be only one, the one that already exists at the head when + * you read in a chain. The chain takes ownership of the new block and it will + * be deleted when the chain is deleted. The iterator will be left pointing to + * the new block. + * + * \param iterator A pointer to an existing initialized iterator. + * \param block A pointer to a metadata block to insert. + * \assert + * \code iterator != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_iterator_init() + * \retval FLAC__bool + * \c false if the conditions in the above description are not met, or + * a memory allocation error occurs, otherwise \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_iterator_insert_block_after(FLAC__Metadata_Iterator *iterator, FLAC__StreamMetadata *block); + +/* \} */ + + +/** \defgroup flac_metadata_object FLAC/metadata.h: metadata object methods + * \ingroup flac_metadata + * + * \brief + * This module contains methods for manipulating FLAC metadata objects. + * + * Since many are variable length we have to be careful about the memory + * management. We decree that all pointers to data in the object are + * owned by the object and memory-managed by the object. + * + * Use the FLAC__metadata_object_new() and FLAC__metadata_object_delete() + * functions to create all instances. When using the + * FLAC__metadata_object_set_*() functions to set pointers to data, set + * \a copy to \c true to have the function make it's own copy of the data, or + * to \c false to give the object ownership of your data. In the latter case + * your pointer must be freeable by free() and will be free()d when the object + * is FLAC__metadata_object_delete()d. It is legal to pass a null pointer as + * the data pointer to a FLAC__metadata_object_set_*() function as long as + * the length argument is 0 and the \a copy argument is \c false. + * + * The FLAC__metadata_object_new() and FLAC__metadata_object_clone() function + * will return \c NULL in the case of a memory allocation error, otherwise a new + * object. The FLAC__metadata_object_set_*() functions return \c false in the + * case of a memory allocation error. + * + * We don't have the convenience of C++ here, so note that the library relies + * on you to keep the types straight. In other words, if you pass, for + * example, a FLAC__StreamMetadata* that represents a STREAMINFO block to + * FLAC__metadata_object_application_set_data(), you will get an assertion + * failure. + * + * For convenience the FLAC__metadata_object_vorbiscomment_*() functions + * maintain a trailing NUL on each Vorbis comment entry. This is not counted + * toward the length or stored in the stream, but it can make working with plain + * comments (those that don't contain embedded-NULs in the value) easier. + * Entries passed into these functions have trailing NULs added if missing, and + * returned entries are guaranteed to have a trailing NUL. + * + * The FLAC__metadata_object_vorbiscomment_*() functions that take a Vorbis + * comment entry/name/value will first validate that it complies with the Vorbis + * comment specification and return false if it does not. + * + * There is no need to recalculate the length field on metadata blocks you + * have modified. They will be calculated automatically before they are + * written back to a file. + * + * \{ + */ + + +/** Create a new metadata object instance of the given type. + * + * The object will be "empty"; i.e. values and data pointers will be \c 0, + * with the exception of FLAC__METADATA_TYPE_VORBIS_COMMENT, which will have + * the vendor string set (but zero comments). + * + * Do not pass in a value greater than or equal to + * \a FLAC__METADATA_TYPE_UNDEFINED unless you really know what you're + * doing. + * + * \param type Type of object to create + * \retval FLAC__StreamMetadata* + * \c NULL if there was an error allocating memory or the type code is + * greater than FLAC__MAX_METADATA_TYPE_CODE, else the new instance. + */ +FLAC_API FLAC__StreamMetadata *FLAC__metadata_object_new(FLAC__MetadataType type); + +/** Create a copy of an existing metadata object. + * + * The copy is a "deep" copy, i.e. dynamically allocated data within the + * object is also copied. The caller takes ownership of the new block and + * is responsible for freeing it with FLAC__metadata_object_delete(). + * + * \param object Pointer to object to copy. + * \assert + * \code object != NULL \endcode + * \retval FLAC__StreamMetadata* + * \c NULL if there was an error allocating memory, else the new instance. + */ +FLAC_API FLAC__StreamMetadata *FLAC__metadata_object_clone(const FLAC__StreamMetadata *object); + +/** Free a metadata object. Deletes the object pointed to by \a object. + * + * The delete is a "deep" delete, i.e. dynamically allocated data within the + * object is also deleted. + * + * \param object A pointer to an existing object. + * \assert + * \code object != NULL \endcode + */ +FLAC_API void FLAC__metadata_object_delete(FLAC__StreamMetadata *object); + +/** Compares two metadata objects. + * + * The compare is "deep", i.e. dynamically allocated data within the + * object is also compared. + * + * \param block1 A pointer to an existing object. + * \param block2 A pointer to an existing object. + * \assert + * \code block1 != NULL \endcode + * \code block2 != NULL \endcode + * \retval FLAC__bool + * \c true if objects are identical, else \c false. + */ +FLAC_API FLAC__bool FLAC__metadata_object_is_equal(const FLAC__StreamMetadata *block1, const FLAC__StreamMetadata *block2); + +/** Sets the application data of an APPLICATION block. + * + * If \a copy is \c true, a copy of the data is stored; otherwise, the object + * takes ownership of the pointer. The existing data will be freed if this + * function is successful, otherwise the original data will remain if \a copy + * is \c true and malloc() fails. + * + * \note It is safe to pass a const pointer to \a data if \a copy is \c true. + * + * \param object A pointer to an existing APPLICATION object. + * \param data A pointer to the data to set. + * \param length The length of \a data in bytes. + * \param copy See above. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_APPLICATION \endcode + * \code (data != NULL && length > 0) || + * (data == NULL && length == 0 && copy == false) \endcode + * \retval FLAC__bool + * \c false if \a copy is \c true and malloc() fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_application_set_data(FLAC__StreamMetadata *object, FLAC__byte *data, unsigned length, FLAC__bool copy); + +/** Resize the seekpoint array. + * + * If the size shrinks, elements will truncated; if it grows, new placeholder + * points will be added to the end. + * + * \param object A pointer to an existing SEEKTABLE object. + * \param new_num_points The desired length of the array; may be \c 0. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode + * \code (object->data.seek_table.points == NULL && object->data.seek_table.num_points == 0) || + * (object->data.seek_table.points != NULL && object->data.seek_table.num_points > 0) \endcode + * \retval FLAC__bool + * \c false if memory allocation error, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_seektable_resize_points(FLAC__StreamMetadata *object, unsigned new_num_points); + +/** Set a seekpoint in a seektable. + * + * \param object A pointer to an existing SEEKTABLE object. + * \param point_num Index into seekpoint array to set. + * \param point The point to set. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode + * \code object->data.seek_table.num_points > point_num \endcode + */ +FLAC_API void FLAC__metadata_object_seektable_set_point(FLAC__StreamMetadata *object, unsigned point_num, FLAC__StreamMetadata_SeekPoint point); + +/** Insert a seekpoint into a seektable. + * + * \param object A pointer to an existing SEEKTABLE object. + * \param point_num Index into seekpoint array to set. + * \param point The point to set. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode + * \code object->data.seek_table.num_points >= point_num \endcode + * \retval FLAC__bool + * \c false if memory allocation error, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_seektable_insert_point(FLAC__StreamMetadata *object, unsigned point_num, FLAC__StreamMetadata_SeekPoint point); + +/** Delete a seekpoint from a seektable. + * + * \param object A pointer to an existing SEEKTABLE object. + * \param point_num Index into seekpoint array to set. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode + * \code object->data.seek_table.num_points > point_num \endcode + * \retval FLAC__bool + * \c false if memory allocation error, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_seektable_delete_point(FLAC__StreamMetadata *object, unsigned point_num); + +/** Check a seektable to see if it conforms to the FLAC specification. + * See the format specification for limits on the contents of the + * seektable. + * + * \param object A pointer to an existing SEEKTABLE object. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode + * \retval FLAC__bool + * \c false if seek table is illegal, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_seektable_is_legal(const FLAC__StreamMetadata *object); + +/** Append a number of placeholder points to the end of a seek table. + * + * \note + * As with the other ..._seektable_template_... functions, you should + * call FLAC__metadata_object_seektable_template_sort() when finished + * to make the seek table legal. + * + * \param object A pointer to an existing SEEKTABLE object. + * \param num The number of placeholder points to append. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode + * \retval FLAC__bool + * \c false if memory allocation fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_placeholders(FLAC__StreamMetadata *object, unsigned num); + +/** Append a specific seek point template to the end of a seek table. + * + * \note + * As with the other ..._seektable_template_... functions, you should + * call FLAC__metadata_object_seektable_template_sort() when finished + * to make the seek table legal. + * + * \param object A pointer to an existing SEEKTABLE object. + * \param sample_number The sample number of the seek point template. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode + * \retval FLAC__bool + * \c false if memory allocation fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_point(FLAC__StreamMetadata *object, FLAC__uint64 sample_number); + +/** Append specific seek point templates to the end of a seek table. + * + * \note + * As with the other ..._seektable_template_... functions, you should + * call FLAC__metadata_object_seektable_template_sort() when finished + * to make the seek table legal. + * + * \param object A pointer to an existing SEEKTABLE object. + * \param sample_numbers An array of sample numbers for the seek points. + * \param num The number of seek point templates to append. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode + * \retval FLAC__bool + * \c false if memory allocation fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_points(FLAC__StreamMetadata *object, FLAC__uint64 sample_numbers[], unsigned num); + +/** Append a set of evenly-spaced seek point templates to the end of a + * seek table. + * + * \note + * As with the other ..._seektable_template_... functions, you should + * call FLAC__metadata_object_seektable_template_sort() when finished + * to make the seek table legal. + * + * \param object A pointer to an existing SEEKTABLE object. + * \param num The number of placeholder points to append. + * \param total_samples The total number of samples to be encoded; + * the seekpoints will be spaced approximately + * \a total_samples / \a num samples apart. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode + * \code total_samples > 0 \endcode + * \retval FLAC__bool + * \c false if memory allocation fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_spaced_points(FLAC__StreamMetadata *object, unsigned num, FLAC__uint64 total_samples); + +/** Append a set of evenly-spaced seek point templates to the end of a + * seek table. + * + * \note + * As with the other ..._seektable_template_... functions, you should + * call FLAC__metadata_object_seektable_template_sort() when finished + * to make the seek table legal. + * + * \param object A pointer to an existing SEEKTABLE object. + * \param samples The number of samples apart to space the placeholder + * points. The first point will be at sample \c 0, the + * second at sample \a samples, then 2*\a samples, and + * so on. As long as \a samples and \a total_samples + * are greater than \c 0, there will always be at least + * one seekpoint at sample \c 0. + * \param total_samples The total number of samples to be encoded; + * the seekpoints will be spaced + * \a samples samples apart. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode + * \code samples > 0 \endcode + * \code total_samples > 0 \endcode + * \retval FLAC__bool + * \c false if memory allocation fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_spaced_points_by_samples(FLAC__StreamMetadata *object, unsigned samples, FLAC__uint64 total_samples); + +/** Sort a seek table's seek points according to the format specification, + * removing duplicates. + * + * \param object A pointer to a seek table to be sorted. + * \param compact If \c false, behaves like FLAC__format_seektable_sort(). + * If \c true, duplicates are deleted and the seek table is + * shrunk appropriately; the number of placeholder points + * present in the seek table will be the same after the call + * as before. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode + * \retval FLAC__bool + * \c false if realloc() fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_sort(FLAC__StreamMetadata *object, FLAC__bool compact); + +/** Sets the vendor string in a VORBIS_COMMENT block. + * + * For convenience, a trailing NUL is added to the entry if it doesn't have + * one already. + * + * If \a copy is \c true, a copy of the entry is stored; otherwise, the object + * takes ownership of the \c entry.entry pointer. + * + * \note If this function returns \c false, the caller still owns the + * pointer. + * + * \param object A pointer to an existing VORBIS_COMMENT object. + * \param entry The entry to set the vendor string to. + * \param copy See above. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode + * \code (entry.entry != NULL && entry.length > 0) || + * (entry.entry == NULL && entry.length == 0) \endcode + * \retval FLAC__bool + * \c false if memory allocation fails or \a entry does not comply with the + * Vorbis comment specification, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_set_vendor_string(FLAC__StreamMetadata *object, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool copy); + +/** Resize the comment array. + * + * If the size shrinks, elements will truncated; if it grows, new empty + * fields will be added to the end. + * + * \param object A pointer to an existing VORBIS_COMMENT object. + * \param new_num_comments The desired length of the array; may be \c 0. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode + * \code (object->data.vorbis_comment.comments == NULL && object->data.vorbis_comment.num_comments == 0) || + * (object->data.vorbis_comment.comments != NULL && object->data.vorbis_comment.num_comments > 0) \endcode + * \retval FLAC__bool + * \c false if memory allocation fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_resize_comments(FLAC__StreamMetadata *object, unsigned new_num_comments); + +/** Sets a comment in a VORBIS_COMMENT block. + * + * For convenience, a trailing NUL is added to the entry if it doesn't have + * one already. + * + * If \a copy is \c true, a copy of the entry is stored; otherwise, the object + * takes ownership of the \c entry.entry pointer. + * + * \note If this function returns \c false, the caller still owns the + * pointer. + * + * \param object A pointer to an existing VORBIS_COMMENT object. + * \param comment_num Index into comment array to set. + * \param entry The entry to set the comment to. + * \param copy See above. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode + * \code comment_num < object->data.vorbis_comment.num_comments \endcode + * \code (entry.entry != NULL && entry.length > 0) || + * (entry.entry == NULL && entry.length == 0) \endcode + * \retval FLAC__bool + * \c false if memory allocation fails or \a entry does not comply with the + * Vorbis comment specification, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_set_comment(FLAC__StreamMetadata *object, unsigned comment_num, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool copy); + +/** Insert a comment in a VORBIS_COMMENT block at the given index. + * + * For convenience, a trailing NUL is added to the entry if it doesn't have + * one already. + * + * If \a copy is \c true, a copy of the entry is stored; otherwise, the object + * takes ownership of the \c entry.entry pointer. + * + * \note If this function returns \c false, the caller still owns the + * pointer. + * + * \param object A pointer to an existing VORBIS_COMMENT object. + * \param comment_num The index at which to insert the comment. The comments + * at and after \a comment_num move right one position. + * To append a comment to the end, set \a comment_num to + * \c object->data.vorbis_comment.num_comments . + * \param entry The comment to insert. + * \param copy See above. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode + * \code object->data.vorbis_comment.num_comments >= comment_num \endcode + * \code (entry.entry != NULL && entry.length > 0) || + * (entry.entry == NULL && entry.length == 0 && copy == false) \endcode + * \retval FLAC__bool + * \c false if memory allocation fails or \a entry does not comply with the + * Vorbis comment specification, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_insert_comment(FLAC__StreamMetadata *object, unsigned comment_num, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool copy); + +/** Appends a comment to a VORBIS_COMMENT block. + * + * For convenience, a trailing NUL is added to the entry if it doesn't have + * one already. + * + * If \a copy is \c true, a copy of the entry is stored; otherwise, the object + * takes ownership of the \c entry.entry pointer. + * + * \note If this function returns \c false, the caller still owns the + * pointer. + * + * \param object A pointer to an existing VORBIS_COMMENT object. + * \param entry The comment to insert. + * \param copy See above. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode + * \code (entry.entry != NULL && entry.length > 0) || + * (entry.entry == NULL && entry.length == 0 && copy == false) \endcode + * \retval FLAC__bool + * \c false if memory allocation fails or \a entry does not comply with the + * Vorbis comment specification, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_append_comment(FLAC__StreamMetadata *object, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool copy); + +/** Replaces comments in a VORBIS_COMMENT block with a new one. + * + * For convenience, a trailing NUL is added to the entry if it doesn't have + * one already. + * + * Depending on the value of \a all, either all or just the first comment + * whose field name(s) match the given entry's name will be replaced by the + * given entry. If no comments match, \a entry will simply be appended. + * + * If \a copy is \c true, a copy of the entry is stored; otherwise, the object + * takes ownership of the \c entry.entry pointer. + * + * \note If this function returns \c false, the caller still owns the + * pointer. + * + * \param object A pointer to an existing VORBIS_COMMENT object. + * \param entry The comment to insert. + * \param all If \c true, all comments whose field name matches + * \a entry's field name will be removed, and \a entry will + * be inserted at the position of the first matching + * comment. If \c false, only the first comment whose + * field name matches \a entry's field name will be + * replaced with \a entry. + * \param copy See above. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode + * \code (entry.entry != NULL && entry.length > 0) || + * (entry.entry == NULL && entry.length == 0 && copy == false) \endcode + * \retval FLAC__bool + * \c false if memory allocation fails or \a entry does not comply with the + * Vorbis comment specification, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_replace_comment(FLAC__StreamMetadata *object, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool all, FLAC__bool copy); + +/** Delete a comment in a VORBIS_COMMENT block at the given index. + * + * \param object A pointer to an existing VORBIS_COMMENT object. + * \param comment_num The index of the comment to delete. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode + * \code object->data.vorbis_comment.num_comments > comment_num \endcode + * \retval FLAC__bool + * \c false if realloc() fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_delete_comment(FLAC__StreamMetadata *object, unsigned comment_num); + +/** Creates a Vorbis comment entry from NUL-terminated name and value strings. + * + * On return, the filled-in \a entry->entry pointer will point to malloc()ed + * memory and shall be owned by the caller. For convenience the entry will + * have a terminating NUL. + * + * \param entry A pointer to a Vorbis comment entry. The entry's + * \c entry pointer should not point to allocated + * memory as it will be overwritten. + * \param field_name The field name in ASCII, \c NUL terminated. + * \param field_value The field value in UTF-8, \c NUL terminated. + * \assert + * \code entry != NULL \endcode + * \code field_name != NULL \endcode + * \code field_value != NULL \endcode + * \retval FLAC__bool + * \c false if malloc() fails, or if \a field_name or \a field_value does + * not comply with the Vorbis comment specification, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_entry_from_name_value_pair(FLAC__StreamMetadata_VorbisComment_Entry *entry, const char *field_name, const char *field_value); + +/** Splits a Vorbis comment entry into NUL-terminated name and value strings. + * + * The returned pointers to name and value will be allocated by malloc() + * and shall be owned by the caller. + * + * \param entry An existing Vorbis comment entry. + * \param field_name The address of where the returned pointer to the + * field name will be stored. + * \param field_value The address of where the returned pointer to the + * field value will be stored. + * \assert + * \code (entry.entry != NULL && entry.length > 0) \endcode + * \code memchr(entry.entry, '=', entry.length) != NULL \endcode + * \code field_name != NULL \endcode + * \code field_value != NULL \endcode + * \retval FLAC__bool + * \c false if memory allocation fails or \a entry does not comply with the + * Vorbis comment specification, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_entry_to_name_value_pair(const FLAC__StreamMetadata_VorbisComment_Entry entry, char **field_name, char **field_value); + +/** Check if the given Vorbis comment entry's field name matches the given + * field name. + * + * \param entry An existing Vorbis comment entry. + * \param field_name The field name to check. + * \param field_name_length The length of \a field_name, not including the + * terminating \c NUL. + * \assert + * \code (entry.entry != NULL && entry.length > 0) \endcode + * \retval FLAC__bool + * \c true if the field names match, else \c false + */ +FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_entry_matches(const FLAC__StreamMetadata_VorbisComment_Entry entry, const char *field_name, unsigned field_name_length); + +/** Find a Vorbis comment with the given field name. + * + * The search begins at entry number \a offset; use an offset of 0 to + * search from the beginning of the comment array. + * + * \param object A pointer to an existing VORBIS_COMMENT object. + * \param offset The offset into the comment array from where to start + * the search. + * \param field_name The field name of the comment to find. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode + * \code field_name != NULL \endcode + * \retval int + * The offset in the comment array of the first comment whose field + * name matches \a field_name, or \c -1 if no match was found. + */ +FLAC_API int FLAC__metadata_object_vorbiscomment_find_entry_from(const FLAC__StreamMetadata *object, unsigned offset, const char *field_name); + +/** Remove first Vorbis comment matching the given field name. + * + * \param object A pointer to an existing VORBIS_COMMENT object. + * \param field_name The field name of comment to delete. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode + * \retval int + * \c -1 for memory allocation error, \c 0 for no matching entries, + * \c 1 for one matching entry deleted. + */ +FLAC_API int FLAC__metadata_object_vorbiscomment_remove_entry_matching(FLAC__StreamMetadata *object, const char *field_name); + +/** Remove all Vorbis comments matching the given field name. + * + * \param object A pointer to an existing VORBIS_COMMENT object. + * \param field_name The field name of comments to delete. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode + * \retval int + * \c -1 for memory allocation error, \c 0 for no matching entries, + * else the number of matching entries deleted. + */ +FLAC_API int FLAC__metadata_object_vorbiscomment_remove_entries_matching(FLAC__StreamMetadata *object, const char *field_name); + +/** Create a new CUESHEET track instance. + * + * The object will be "empty"; i.e. values and data pointers will be \c 0. + * + * \retval FLAC__StreamMetadata_CueSheet_Track* + * \c NULL if there was an error allocating memory, else the new instance. + */ +FLAC_API FLAC__StreamMetadata_CueSheet_Track *FLAC__metadata_object_cuesheet_track_new(void); + +/** Create a copy of an existing CUESHEET track object. + * + * The copy is a "deep" copy, i.e. dynamically allocated data within the + * object is also copied. The caller takes ownership of the new object and + * is responsible for freeing it with + * FLAC__metadata_object_cuesheet_track_delete(). + * + * \param object Pointer to object to copy. + * \assert + * \code object != NULL \endcode + * \retval FLAC__StreamMetadata_CueSheet_Track* + * \c NULL if there was an error allocating memory, else the new instance. + */ +FLAC_API FLAC__StreamMetadata_CueSheet_Track *FLAC__metadata_object_cuesheet_track_clone(const FLAC__StreamMetadata_CueSheet_Track *object); + +/** Delete a CUESHEET track object + * + * \param object A pointer to an existing CUESHEET track object. + * \assert + * \code object != NULL \endcode + */ +FLAC_API void FLAC__metadata_object_cuesheet_track_delete(FLAC__StreamMetadata_CueSheet_Track *object); + +/** Resize a track's index point array. + * + * If the size shrinks, elements will truncated; if it grows, new blank + * indices will be added to the end. + * + * \param object A pointer to an existing CUESHEET object. + * \param track_num The index of the track to modify. NOTE: this is not + * necessarily the same as the track's \a number field. + * \param new_num_indices The desired length of the array; may be \c 0. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode + * \code object->data.cue_sheet.num_tracks > track_num \endcode + * \code (object->data.cue_sheet.tracks[track_num].indices == NULL && object->data.cue_sheet.tracks[track_num].num_indices == 0) || + * (object->data.cue_sheet.tracks[track_num].indices != NULL && object->data.cue_sheet.tracks[track_num].num_indices > 0) \endcode + * \retval FLAC__bool + * \c false if memory allocation error, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_track_resize_indices(FLAC__StreamMetadata *object, unsigned track_num, unsigned new_num_indices); + +/** Insert an index point in a CUESHEET track at the given index. + * + * \param object A pointer to an existing CUESHEET object. + * \param track_num The index of the track to modify. NOTE: this is not + * necessarily the same as the track's \a number field. + * \param index_num The index into the track's index array at which to + * insert the index point. NOTE: this is not necessarily + * the same as the index point's \a number field. The + * indices at and after \a index_num move right one + * position. To append an index point to the end, set + * \a index_num to + * \c object->data.cue_sheet.tracks[track_num].num_indices . + * \param index The index point to insert. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode + * \code object->data.cue_sheet.num_tracks > track_num \endcode + * \code object->data.cue_sheet.tracks[track_num].num_indices >= index_num \endcode + * \retval FLAC__bool + * \c false if realloc() fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_track_insert_index(FLAC__StreamMetadata *object, unsigned track_num, unsigned index_num, FLAC__StreamMetadata_CueSheet_Index index); + +/** Insert a blank index point in a CUESHEET track at the given index. + * + * A blank index point is one in which all field values are zero. + * + * \param object A pointer to an existing CUESHEET object. + * \param track_num The index of the track to modify. NOTE: this is not + * necessarily the same as the track's \a number field. + * \param index_num The index into the track's index array at which to + * insert the index point. NOTE: this is not necessarily + * the same as the index point's \a number field. The + * indices at and after \a index_num move right one + * position. To append an index point to the end, set + * \a index_num to + * \c object->data.cue_sheet.tracks[track_num].num_indices . + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode + * \code object->data.cue_sheet.num_tracks > track_num \endcode + * \code object->data.cue_sheet.tracks[track_num].num_indices >= index_num \endcode + * \retval FLAC__bool + * \c false if realloc() fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_track_insert_blank_index(FLAC__StreamMetadata *object, unsigned track_num, unsigned index_num); + +/** Delete an index point in a CUESHEET track at the given index. + * + * \param object A pointer to an existing CUESHEET object. + * \param track_num The index into the track array of the track to + * modify. NOTE: this is not necessarily the same + * as the track's \a number field. + * \param index_num The index into the track's index array of the index + * to delete. NOTE: this is not necessarily the same + * as the index's \a number field. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode + * \code object->data.cue_sheet.num_tracks > track_num \endcode + * \code object->data.cue_sheet.tracks[track_num].num_indices > index_num \endcode + * \retval FLAC__bool + * \c false if realloc() fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_track_delete_index(FLAC__StreamMetadata *object, unsigned track_num, unsigned index_num); + +/** Resize the track array. + * + * If the size shrinks, elements will truncated; if it grows, new blank + * tracks will be added to the end. + * + * \param object A pointer to an existing CUESHEET object. + * \param new_num_tracks The desired length of the array; may be \c 0. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode + * \code (object->data.cue_sheet.tracks == NULL && object->data.cue_sheet.num_tracks == 0) || + * (object->data.cue_sheet.tracks != NULL && object->data.cue_sheet.num_tracks > 0) \endcode + * \retval FLAC__bool + * \c false if memory allocation error, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_resize_tracks(FLAC__StreamMetadata *object, unsigned new_num_tracks); + +/** Sets a track in a CUESHEET block. + * + * If \a copy is \c true, a copy of the track is stored; otherwise, the object + * takes ownership of the \a track pointer. + * + * \param object A pointer to an existing CUESHEET object. + * \param track_num Index into track array to set. NOTE: this is not + * necessarily the same as the track's \a number field. + * \param track The track to set the track to. You may safely pass in + * a const pointer if \a copy is \c true. + * \param copy See above. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode + * \code track_num < object->data.cue_sheet.num_tracks \endcode + * \code (track->indices != NULL && track->num_indices > 0) || + * (track->indices == NULL && track->num_indices == 0) \endcode + * \retval FLAC__bool + * \c false if \a copy is \c true and malloc() fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_set_track(FLAC__StreamMetadata *object, unsigned track_num, FLAC__StreamMetadata_CueSheet_Track *track, FLAC__bool copy); + +/** Insert a track in a CUESHEET block at the given index. + * + * If \a copy is \c true, a copy of the track is stored; otherwise, the object + * takes ownership of the \a track pointer. + * + * \param object A pointer to an existing CUESHEET object. + * \param track_num The index at which to insert the track. NOTE: this + * is not necessarily the same as the track's \a number + * field. The tracks at and after \a track_num move right + * one position. To append a track to the end, set + * \a track_num to \c object->data.cue_sheet.num_tracks . + * \param track The track to insert. You may safely pass in a const + * pointer if \a copy is \c true. + * \param copy See above. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode + * \code object->data.cue_sheet.num_tracks >= track_num \endcode + * \retval FLAC__bool + * \c false if \a copy is \c true and malloc() fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_insert_track(FLAC__StreamMetadata *object, unsigned track_num, FLAC__StreamMetadata_CueSheet_Track *track, FLAC__bool copy); + +/** Insert a blank track in a CUESHEET block at the given index. + * + * A blank track is one in which all field values are zero. + * + * \param object A pointer to an existing CUESHEET object. + * \param track_num The index at which to insert the track. NOTE: this + * is not necessarily the same as the track's \a number + * field. The tracks at and after \a track_num move right + * one position. To append a track to the end, set + * \a track_num to \c object->data.cue_sheet.num_tracks . + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode + * \code object->data.cue_sheet.num_tracks >= track_num \endcode + * \retval FLAC__bool + * \c false if \a copy is \c true and malloc() fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_insert_blank_track(FLAC__StreamMetadata *object, unsigned track_num); + +/** Delete a track in a CUESHEET block at the given index. + * + * \param object A pointer to an existing CUESHEET object. + * \param track_num The index into the track array of the track to + * delete. NOTE: this is not necessarily the same + * as the track's \a number field. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode + * \code object->data.cue_sheet.num_tracks > track_num \endcode + * \retval FLAC__bool + * \c false if realloc() fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_delete_track(FLAC__StreamMetadata *object, unsigned track_num); + +/** Check a cue sheet to see if it conforms to the FLAC specification. + * See the format specification for limits on the contents of the + * cue sheet. + * + * \param object A pointer to an existing CUESHEET object. + * \param check_cd_da_subset If \c true, check CUESHEET against more + * stringent requirements for a CD-DA (audio) disc. + * \param violation Address of a pointer to a string. If there is a + * violation, a pointer to a string explanation of the + * violation will be returned here. \a violation may be + * \c NULL if you don't need the returned string. Do not + * free the returned string; it will always point to static + * data. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode + * \retval FLAC__bool + * \c false if cue sheet is illegal, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_is_legal(const FLAC__StreamMetadata *object, FLAC__bool check_cd_da_subset, const char **violation); + +/** Calculate and return the CDDB/freedb ID for a cue sheet. The function + * assumes the cue sheet corresponds to a CD; the result is undefined + * if the cuesheet's is_cd bit is not set. + * + * \param object A pointer to an existing CUESHEET object. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode + * \retval FLAC__uint32 + * The unsigned integer representation of the CDDB/freedb ID + */ +FLAC_API FLAC__uint32 FLAC__metadata_object_cuesheet_calculate_cddb_id(const FLAC__StreamMetadata *object); + +/** Sets the MIME type of a PICTURE block. + * + * If \a copy is \c true, a copy of the string is stored; otherwise, the object + * takes ownership of the pointer. The existing string will be freed if this + * function is successful, otherwise the original string will remain if \a copy + * is \c true and malloc() fails. + * + * \note It is safe to pass a const pointer to \a mime_type if \a copy is \c true. + * + * \param object A pointer to an existing PICTURE object. + * \param mime_type A pointer to the MIME type string. The string must be + * ASCII characters 0x20-0x7e, NUL-terminated. No validation + * is done. + * \param copy See above. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_PICTURE \endcode + * \code (mime_type != NULL) \endcode + * \retval FLAC__bool + * \c false if \a copy is \c true and malloc() fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_picture_set_mime_type(FLAC__StreamMetadata *object, char *mime_type, FLAC__bool copy); + +/** Sets the description of a PICTURE block. + * + * If \a copy is \c true, a copy of the string is stored; otherwise, the object + * takes ownership of the pointer. The existing string will be freed if this + * function is successful, otherwise the original string will remain if \a copy + * is \c true and malloc() fails. + * + * \note It is safe to pass a const pointer to \a description if \a copy is \c true. + * + * \param object A pointer to an existing PICTURE object. + * \param description A pointer to the description string. The string must be + * valid UTF-8, NUL-terminated. No validation is done. + * \param copy See above. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_PICTURE \endcode + * \code (description != NULL) \endcode + * \retval FLAC__bool + * \c false if \a copy is \c true and malloc() fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_picture_set_description(FLAC__StreamMetadata *object, FLAC__byte *description, FLAC__bool copy); + +/** Sets the picture data of a PICTURE block. + * + * If \a copy is \c true, a copy of the data is stored; otherwise, the object + * takes ownership of the pointer. Also sets the \a data_length field of the + * metadata object to what is passed in as the \a length parameter. The + * existing data will be freed if this function is successful, otherwise the + * original data and data_length will remain if \a copy is \c true and + * malloc() fails. + * + * \note It is safe to pass a const pointer to \a data if \a copy is \c true. + * + * \param object A pointer to an existing PICTURE object. + * \param data A pointer to the data to set. + * \param length The length of \a data in bytes. + * \param copy See above. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_PICTURE \endcode + * \code (data != NULL && length > 0) || + * (data == NULL && length == 0 && copy == false) \endcode + * \retval FLAC__bool + * \c false if \a copy is \c true and malloc() fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_picture_set_data(FLAC__StreamMetadata *object, FLAC__byte *data, FLAC__uint32 length, FLAC__bool copy); + +/** Check a PICTURE block to see if it conforms to the FLAC specification. + * See the format specification for limits on the contents of the + * PICTURE block. + * + * \param object A pointer to existing PICTURE block to be checked. + * \param violation Address of a pointer to a string. If there is a + * violation, a pointer to a string explanation of the + * violation will be returned here. \a violation may be + * \c NULL if you don't need the returned string. Do not + * free the returned string; it will always point to static + * data. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_PICTURE \endcode + * \retval FLAC__bool + * \c false if PICTURE block is illegal, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_picture_is_legal(const FLAC__StreamMetadata *object, const char **violation); + +/* \} */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/core/cd_hw/libchdr/deps/libFLAC/include/FLAC/ordinals.h b/core/cd_hw/libchdr/deps/libFLAC/include/FLAC/ordinals.h new file mode 100644 index 0000000..ea52ea6 --- /dev/null +++ b/core/cd_hw/libchdr/deps/libFLAC/include/FLAC/ordinals.h @@ -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 . + */ + +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 . */ + +#include + +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 diff --git a/core/cd_hw/libchdr/deps/libFLAC/include/FLAC/stream_decoder.h b/core/cd_hw/libchdr/deps/libFLAC/include/FLAC/stream_decoder.h new file mode 100644 index 0000000..39c958d --- /dev/null +++ b/core/cd_hw/libchdr/deps/libFLAC/include/FLAC/stream_decoder.h @@ -0,0 +1,1560 @@ +/* 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__STREAM_DECODER_H +#define FLAC__STREAM_DECODER_H + +#include /* for FILE */ +#include "export.h" +#include "format.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +/** \file include/FLAC/stream_decoder.h + * + * \brief + * This module contains the functions which implement the stream + * decoder. + * + * See the detailed documentation in the + * \link flac_stream_decoder stream decoder \endlink module. + */ + +/** \defgroup flac_decoder FLAC/ \*_decoder.h: decoder interfaces + * \ingroup flac + * + * \brief + * This module describes the decoder layers provided by libFLAC. + * + * The stream decoder can be used to decode complete streams either from + * the client via callbacks, or directly from a file, depending on how + * it is initialized. When decoding via callbacks, the client provides + * callbacks for reading FLAC data and writing decoded samples, and + * handling metadata and errors. If the client also supplies seek-related + * callback, the decoder function for sample-accurate seeking within the + * FLAC input is also available. When decoding from a file, the client + * needs only supply a filename or open \c FILE* and write/metadata/error + * callbacks; the rest of the callbacks are supplied internally. For more + * info see the \link flac_stream_decoder stream decoder \endlink module. + */ + +/** \defgroup flac_stream_decoder FLAC/stream_decoder.h: stream decoder interface + * \ingroup flac_decoder + * + * \brief + * This module contains the functions which implement the stream + * decoder. + * + * The stream decoder can decode native FLAC, and optionally Ogg FLAC + * (check FLAC_API_SUPPORTS_OGG_FLAC) streams and files. + * + * The basic usage of this decoder is as follows: + * - The program creates an instance of a decoder using + * FLAC__stream_decoder_new(). + * - The program overrides the default settings using + * FLAC__stream_decoder_set_*() functions. + * - The program initializes the instance to validate the settings and + * prepare for decoding using + * - FLAC__stream_decoder_init_stream() or FLAC__stream_decoder_init_FILE() + * or FLAC__stream_decoder_init_file() for native FLAC, + * - FLAC__stream_decoder_init_ogg_stream() or FLAC__stream_decoder_init_ogg_FILE() + * or FLAC__stream_decoder_init_ogg_file() for Ogg FLAC + * - The program calls the FLAC__stream_decoder_process_*() functions + * to decode data, which subsequently calls the callbacks. + * - The program finishes the decoding with FLAC__stream_decoder_finish(), + * which flushes the input and output and resets the decoder to the + * uninitialized state. + * - The instance may be used again or deleted with + * FLAC__stream_decoder_delete(). + * + * In more detail, the program will create a new instance by calling + * FLAC__stream_decoder_new(), then call FLAC__stream_decoder_set_*() + * functions to override the default decoder options, and call + * one of the FLAC__stream_decoder_init_*() functions. + * + * There are three initialization functions for native FLAC, one for + * setting up the decoder to decode FLAC data from the client via + * callbacks, and two for decoding directly from a FLAC file. + * + * For decoding via callbacks, use FLAC__stream_decoder_init_stream(). + * You must also supply several callbacks for handling I/O. Some (like + * seeking) are optional, depending on the capabilities of the input. + * + * For decoding directly from a file, use FLAC__stream_decoder_init_FILE() + * or FLAC__stream_decoder_init_file(). Then you must only supply an open + * \c FILE* or filename and fewer callbacks; the decoder will handle + * the other callbacks internally. + * + * There are three similarly-named init functions for decoding from Ogg + * FLAC streams. Check \c FLAC_API_SUPPORTS_OGG_FLAC to find out if the + * library has been built with Ogg support. + * + * Once the decoder is initialized, your program will call one of several + * functions to start the decoding process: + * + * - FLAC__stream_decoder_process_single() - Tells the decoder to process at + * most one metadata block or audio frame and return, calling either the + * metadata callback or write callback, respectively, once. If the decoder + * loses sync it will return with only the error callback being called. + * - FLAC__stream_decoder_process_until_end_of_metadata() - Tells the decoder + * to process the stream from the current location and stop upon reaching + * the first audio frame. The client will get one metadata, write, or error + * callback per metadata block, audio frame, or sync error, respectively. + * - FLAC__stream_decoder_process_until_end_of_stream() - Tells the decoder + * to process the stream from the current location until the read callback + * returns FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM or + * FLAC__STREAM_DECODER_READ_STATUS_ABORT. The client will get one metadata, + * write, or error callback per metadata block, audio frame, or sync error, + * respectively. + * + * When the decoder has finished decoding (normally or through an abort), + * the instance is finished by calling FLAC__stream_decoder_finish(), which + * ensures the decoder is in the correct state and frees memory. Then the + * instance may be deleted with FLAC__stream_decoder_delete() or initialized + * again to decode another stream. + * + * Seeking is exposed through the FLAC__stream_decoder_seek_absolute() method. + * At any point after the stream decoder has been initialized, the client can + * call this function to seek to an exact sample within the stream. + * Subsequently, the first time the write callback is called it will be + * passed a (possibly partial) block starting at that sample. + * + * If the client cannot seek via the callback interface provided, but still + * has another way of seeking, it can flush the decoder using + * FLAC__stream_decoder_flush() and start feeding data from the new position + * through the read callback. + * + * The stream decoder also provides MD5 signature checking. If this is + * turned on before initialization, FLAC__stream_decoder_finish() will + * report when the decoded MD5 signature does not match the one stored + * in the STREAMINFO block. MD5 checking is automatically turned off + * (until the next FLAC__stream_decoder_reset()) if there is no signature + * in the STREAMINFO block or when a seek is attempted. + * + * The FLAC__stream_decoder_set_metadata_*() functions deserve special + * attention. By default, the decoder only calls the metadata_callback for + * the STREAMINFO block. These functions allow you to tell the decoder + * explicitly which blocks to parse and return via the metadata_callback + * and/or which to skip. Use a FLAC__stream_decoder_set_metadata_respond_all(), + * FLAC__stream_decoder_set_metadata_ignore() ... or FLAC__stream_decoder_set_metadata_ignore_all(), + * FLAC__stream_decoder_set_metadata_respond() ... sequence to exactly specify + * which blocks to return. Remember that metadata blocks can potentially + * be big (for example, cover art) so filtering out the ones you don't + * use can reduce the memory requirements of the decoder. Also note the + * special forms FLAC__stream_decoder_set_metadata_respond_application(id) + * and FLAC__stream_decoder_set_metadata_ignore_application(id) for + * filtering APPLICATION blocks based on the application ID. + * + * STREAMINFO and SEEKTABLE blocks are always parsed and used internally, but + * they still can legally be filtered from the metadata_callback. + * + * \note + * The "set" functions may only be called when the decoder is in the + * state FLAC__STREAM_DECODER_UNINITIALIZED, i.e. after + * FLAC__stream_decoder_new() or FLAC__stream_decoder_finish(), but + * before FLAC__stream_decoder_init_*(). If this is the case they will + * return \c true, otherwise \c false. + * + * \note + * FLAC__stream_decoder_finish() resets all settings to the constructor + * defaults, including the callbacks. + * + * \{ + */ + + +/** State values for a FLAC__StreamDecoder + * + * The decoder's state can be obtained by calling FLAC__stream_decoder_get_state(). + */ +typedef enum { + + FLAC__STREAM_DECODER_SEARCH_FOR_METADATA = 0, + /**< The decoder is ready to search for metadata. */ + + FLAC__STREAM_DECODER_READ_METADATA, + /**< The decoder is ready to or is in the process of reading metadata. */ + + FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC, + /**< The decoder is ready to or is in the process of searching for the + * frame sync code. + */ + + FLAC__STREAM_DECODER_READ_FRAME, + /**< The decoder is ready to or is in the process of reading a frame. */ + + FLAC__STREAM_DECODER_END_OF_STREAM, + /**< The decoder has reached the end of the stream. */ + + FLAC__STREAM_DECODER_OGG_ERROR, + /**< An error occurred in the underlying Ogg layer. */ + + FLAC__STREAM_DECODER_SEEK_ERROR, + /**< An error occurred while seeking. The decoder must be flushed + * with FLAC__stream_decoder_flush() or reset with + * FLAC__stream_decoder_reset() before decoding can continue. + */ + + FLAC__STREAM_DECODER_ABORTED, + /**< The decoder was aborted by the read or write callback. */ + + FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR, + /**< An error occurred allocating memory. The decoder is in an invalid + * state and can no longer be used. + */ + + FLAC__STREAM_DECODER_UNINITIALIZED + /**< The decoder is in the uninitialized state; one of the + * FLAC__stream_decoder_init_*() functions must be called before samples + * can be processed. + */ + +} FLAC__StreamDecoderState; + +/** Maps a FLAC__StreamDecoderState to a C string. + * + * Using a FLAC__StreamDecoderState as the index to this array + * will give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__StreamDecoderStateString[]; + + +/** Possible return values for the FLAC__stream_decoder_init_*() functions. + */ +typedef enum { + + FLAC__STREAM_DECODER_INIT_STATUS_OK = 0, + /**< Initialization was successful. */ + + FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER, + /**< The library was not compiled with support for the given container + * format. + */ + + FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS, + /**< A required callback was not supplied. */ + + FLAC__STREAM_DECODER_INIT_STATUS_MEMORY_ALLOCATION_ERROR, + /**< An error occurred allocating memory. */ + + FLAC__STREAM_DECODER_INIT_STATUS_ERROR_OPENING_FILE, + /**< fopen() failed in FLAC__stream_decoder_init_file() or + * FLAC__stream_decoder_init_ogg_file(). */ + + FLAC__STREAM_DECODER_INIT_STATUS_ALREADY_INITIALIZED + /**< FLAC__stream_decoder_init_*() was called when the decoder was + * already initialized, usually because + * FLAC__stream_decoder_finish() was not called. + */ + +} FLAC__StreamDecoderInitStatus; + +/** Maps a FLAC__StreamDecoderInitStatus to a C string. + * + * Using a FLAC__StreamDecoderInitStatus as the index to this array + * will give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__StreamDecoderInitStatusString[]; + + +/** Return values for the FLAC__StreamDecoder read callback. + */ +typedef enum { + + FLAC__STREAM_DECODER_READ_STATUS_CONTINUE, + /**< The read was OK and decoding can continue. */ + + FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM, + /**< The read was attempted while at the end of the stream. Note that + * the client must only return this value when the read callback was + * called when already at the end of the stream. Otherwise, if the read + * itself moves to the end of the stream, the client should still return + * the data and \c FLAC__STREAM_DECODER_READ_STATUS_CONTINUE, and then on + * the next read callback it should return + * \c FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM with a byte count + * of \c 0. + */ + + FLAC__STREAM_DECODER_READ_STATUS_ABORT + /**< An unrecoverable error occurred. The decoder will return from the process call. */ + +} FLAC__StreamDecoderReadStatus; + +/** Maps a FLAC__StreamDecoderReadStatus to a C string. + * + * Using a FLAC__StreamDecoderReadStatus as the index to this array + * will give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__StreamDecoderReadStatusString[]; + + +/** Return values for the FLAC__StreamDecoder seek callback. + */ +typedef enum { + + FLAC__STREAM_DECODER_SEEK_STATUS_OK, + /**< The seek was OK and decoding can continue. */ + + FLAC__STREAM_DECODER_SEEK_STATUS_ERROR, + /**< An unrecoverable error occurred. The decoder will return from the process call. */ + + FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED + /**< Client does not support seeking. */ + +} FLAC__StreamDecoderSeekStatus; + +/** Maps a FLAC__StreamDecoderSeekStatus to a C string. + * + * Using a FLAC__StreamDecoderSeekStatus as the index to this array + * will give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__StreamDecoderSeekStatusString[]; + + +/** Return values for the FLAC__StreamDecoder tell callback. + */ +typedef enum { + + FLAC__STREAM_DECODER_TELL_STATUS_OK, + /**< The tell was OK and decoding can continue. */ + + FLAC__STREAM_DECODER_TELL_STATUS_ERROR, + /**< An unrecoverable error occurred. The decoder will return from the process call. */ + + FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED + /**< Client does not support telling the position. */ + +} FLAC__StreamDecoderTellStatus; + +/** Maps a FLAC__StreamDecoderTellStatus to a C string. + * + * Using a FLAC__StreamDecoderTellStatus as the index to this array + * will give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__StreamDecoderTellStatusString[]; + + +/** Return values for the FLAC__StreamDecoder length callback. + */ +typedef enum { + + FLAC__STREAM_DECODER_LENGTH_STATUS_OK, + /**< The length call was OK and decoding can continue. */ + + FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR, + /**< An unrecoverable error occurred. The decoder will return from the process call. */ + + FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED + /**< Client does not support reporting the length. */ + +} FLAC__StreamDecoderLengthStatus; + +/** Maps a FLAC__StreamDecoderLengthStatus to a C string. + * + * Using a FLAC__StreamDecoderLengthStatus as the index to this array + * will give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__StreamDecoderLengthStatusString[]; + + +/** Return values for the FLAC__StreamDecoder write callback. + */ +typedef enum { + + FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE, + /**< The write was OK and decoding can continue. */ + + FLAC__STREAM_DECODER_WRITE_STATUS_ABORT + /**< An unrecoverable error occurred. The decoder will return from the process call. */ + +} FLAC__StreamDecoderWriteStatus; + +/** Maps a FLAC__StreamDecoderWriteStatus to a C string. + * + * Using a FLAC__StreamDecoderWriteStatus as the index to this array + * will give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__StreamDecoderWriteStatusString[]; + + +/** Possible values passed back to the FLAC__StreamDecoder error callback. + * \c FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC is the generic catch- + * all. The rest could be caused by bad sync (false synchronization on + * data that is not the start of a frame) or corrupted data. The error + * itself is the decoder's best guess at what happened assuming a correct + * sync. For example \c FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER + * could be caused by a correct sync on the start of a frame, but some + * data in the frame header was corrupted. Or it could be the result of + * syncing on a point the stream that looked like the starting of a frame + * but was not. \c FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM + * could be because the decoder encountered a valid frame made by a future + * version of the encoder which it cannot parse, or because of a false + * sync making it appear as though an encountered frame was generated by + * a future encoder. + */ +typedef enum { + + FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC, + /**< An error in the stream caused the decoder to lose synchronization. */ + + FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER, + /**< The decoder encountered a corrupted frame header. */ + + FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH, + /**< The frame's data did not match the CRC in the footer. */ + + FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM + /**< The decoder encountered reserved fields in use in the stream. */ + +} FLAC__StreamDecoderErrorStatus; + +/** Maps a FLAC__StreamDecoderErrorStatus to a C string. + * + * Using a FLAC__StreamDecoderErrorStatus as the index to this array + * will give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__StreamDecoderErrorStatusString[]; + + +/*********************************************************************** + * + * class FLAC__StreamDecoder + * + ***********************************************************************/ + +struct FLAC__StreamDecoderProtected; +struct FLAC__StreamDecoderPrivate; +/** The opaque structure definition for the stream decoder type. + * See the \link flac_stream_decoder stream decoder module \endlink + * for a detailed description. + */ +typedef struct { + struct FLAC__StreamDecoderProtected *protected_; /* avoid the C++ keyword 'protected' */ + struct FLAC__StreamDecoderPrivate *private_; /* avoid the C++ keyword 'private' */ +} FLAC__StreamDecoder; + +/** Signature for the read callback. + * + * A function pointer matching this signature must be passed to + * FLAC__stream_decoder_init*_stream(). The supplied function will be + * called when the decoder needs more input data. The address of the + * buffer to be filled is supplied, along with the number of bytes the + * buffer can hold. The callback may choose to supply less data and + * modify the byte count but must be careful not to overflow the buffer. + * The callback then returns a status code chosen from + * FLAC__StreamDecoderReadStatus. + * + * Here is an example of a read callback for stdio streams: + * \code + * FLAC__StreamDecoderReadStatus read_cb(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data) + * { + * FILE *file = ((MyClientData*)client_data)->file; + * if(*bytes > 0) { + * *bytes = fread(buffer, sizeof(FLAC__byte), *bytes, file); + * if(ferror(file)) + * return FLAC__STREAM_DECODER_READ_STATUS_ABORT; + * else if(*bytes == 0) + * return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM; + * else + * return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; + * } + * else + * return FLAC__STREAM_DECODER_READ_STATUS_ABORT; + * } + * \endcode + * + * \note In general, FLAC__StreamDecoder functions which change the + * state should not be called on the \a decoder while in the callback. + * + * \param decoder The decoder instance calling the callback. + * \param buffer A pointer to a location for the callee to store + * data to be decoded. + * \param bytes A pointer to the size of the buffer. On entry + * to the callback, it contains the maximum number + * of bytes that may be stored in \a buffer. The + * callee must set it to the actual number of bytes + * stored (0 in case of error or end-of-stream) before + * returning. + * \param client_data The callee's client data set through + * FLAC__stream_decoder_init_*(). + * \retval FLAC__StreamDecoderReadStatus + * The callee's return status. Note that the callback should return + * \c FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM if and only if + * zero bytes were read and there is no more data to be read. + */ +typedef FLAC__StreamDecoderReadStatus (*FLAC__StreamDecoderReadCallback)(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data); + +/** Signature for the seek callback. + * + * A function pointer matching this signature may be passed to + * FLAC__stream_decoder_init*_stream(). The supplied function will be + * called when the decoder needs to seek the input stream. The decoder + * will pass the absolute byte offset to seek to, 0 meaning the + * beginning of the stream. + * + * Here is an example of a seek callback for stdio streams: + * \code + * FLAC__StreamDecoderSeekStatus seek_cb(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data) + * { + * FILE *file = ((MyClientData*)client_data)->file; + * if(file == stdin) + * return FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED; + * else if(fseeko(file, (off_t)absolute_byte_offset, SEEK_SET) < 0) + * return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR; + * else + * return FLAC__STREAM_DECODER_SEEK_STATUS_OK; + * } + * \endcode + * + * \note In general, FLAC__StreamDecoder functions which change the + * state should not be called on the \a decoder while in the callback. + * + * \param decoder The decoder instance calling the callback. + * \param absolute_byte_offset The offset from the beginning of the stream + * to seek to. + * \param client_data The callee's client data set through + * FLAC__stream_decoder_init_*(). + * \retval FLAC__StreamDecoderSeekStatus + * The callee's return status. + */ +typedef FLAC__StreamDecoderSeekStatus (*FLAC__StreamDecoderSeekCallback)(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data); + +/** Signature for the tell callback. + * + * A function pointer matching this signature may be passed to + * FLAC__stream_decoder_init*_stream(). The supplied function will be + * called when the decoder wants to know the current position of the + * stream. The callback should return the byte offset from the + * beginning of the stream. + * + * Here is an example of a tell callback for stdio streams: + * \code + * FLAC__StreamDecoderTellStatus tell_cb(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data) + * { + * FILE *file = ((MyClientData*)client_data)->file; + * off_t pos; + * if(file == stdin) + * return FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED; + * else if((pos = ftello(file)) < 0) + * return FLAC__STREAM_DECODER_TELL_STATUS_ERROR; + * else { + * *absolute_byte_offset = (FLAC__uint64)pos; + * return FLAC__STREAM_DECODER_TELL_STATUS_OK; + * } + * } + * \endcode + * + * \note In general, FLAC__StreamDecoder functions which change the + * state should not be called on the \a decoder while in the callback. + * + * \param decoder The decoder instance calling the callback. + * \param absolute_byte_offset A pointer to storage for the current offset + * from the beginning of the stream. + * \param client_data The callee's client data set through + * FLAC__stream_decoder_init_*(). + * \retval FLAC__StreamDecoderTellStatus + * The callee's return status. + */ +typedef FLAC__StreamDecoderTellStatus (*FLAC__StreamDecoderTellCallback)(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data); + +/** Signature for the length callback. + * + * A function pointer matching this signature may be passed to + * FLAC__stream_decoder_init*_stream(). The supplied function will be + * called when the decoder wants to know the total length of the stream + * in bytes. + * + * Here is an example of a length callback for stdio streams: + * \code + * FLAC__StreamDecoderLengthStatus length_cb(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data) + * { + * FILE *file = ((MyClientData*)client_data)->file; + * struct stat filestats; + * + * if(file == stdin) + * return FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED; + * else if(fstat(fileno(file), &filestats) != 0) + * return FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR; + * else { + * *stream_length = (FLAC__uint64)filestats.st_size; + * return FLAC__STREAM_DECODER_LENGTH_STATUS_OK; + * } + * } + * \endcode + * + * \note In general, FLAC__StreamDecoder functions which change the + * state should not be called on the \a decoder while in the callback. + * + * \param decoder The decoder instance calling the callback. + * \param stream_length A pointer to storage for the length of the stream + * in bytes. + * \param client_data The callee's client data set through + * FLAC__stream_decoder_init_*(). + * \retval FLAC__StreamDecoderLengthStatus + * The callee's return status. + */ +typedef FLAC__StreamDecoderLengthStatus (*FLAC__StreamDecoderLengthCallback)(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data); + +/** Signature for the EOF callback. + * + * A function pointer matching this signature may be passed to + * FLAC__stream_decoder_init*_stream(). The supplied function will be + * called when the decoder needs to know if the end of the stream has + * been reached. + * + * Here is an example of a EOF callback for stdio streams: + * FLAC__bool eof_cb(const FLAC__StreamDecoder *decoder, void *client_data) + * \code + * { + * FILE *file = ((MyClientData*)client_data)->file; + * return feof(file)? true : false; + * } + * \endcode + * + * \note In general, FLAC__StreamDecoder functions which change the + * state should not be called on the \a decoder while in the callback. + * + * \param decoder The decoder instance calling the callback. + * \param client_data The callee's client data set through + * FLAC__stream_decoder_init_*(). + * \retval FLAC__bool + * \c true if the currently at the end of the stream, else \c false. + */ +typedef FLAC__bool (*FLAC__StreamDecoderEofCallback)(const FLAC__StreamDecoder *decoder, void *client_data); + +/** Signature for the write callback. + * + * A function pointer matching this signature must be passed to one of + * the FLAC__stream_decoder_init_*() functions. + * The supplied function will be called when the decoder has decoded a + * single audio frame. The decoder will pass the frame metadata as well + * as an array of pointers (one for each channel) pointing to the + * decoded audio. + * + * \note In general, FLAC__StreamDecoder functions which change the + * state should not be called on the \a decoder while in the callback. + * + * \param decoder The decoder instance calling the callback. + * \param frame The description of the decoded frame. See + * FLAC__Frame. + * \param buffer An array of pointers to decoded channels of data. + * Each pointer will point to an array of signed + * samples of length \a frame->header.blocksize. + * Channels will be ordered according to the FLAC + * specification; see the documentation for the + * frame header. + * \param client_data The callee's client data set through + * FLAC__stream_decoder_init_*(). + * \retval FLAC__StreamDecoderWriteStatus + * The callee's return status. + */ +typedef FLAC__StreamDecoderWriteStatus (*FLAC__StreamDecoderWriteCallback)(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data); + +/** Signature for the metadata callback. + * + * A function pointer matching this signature must be passed to one of + * the FLAC__stream_decoder_init_*() functions. + * The supplied function will be called when the decoder has decoded a + * metadata block. In a valid FLAC file there will always be one + * \c STREAMINFO block, followed by zero or more other metadata blocks. + * These will be supplied by the decoder in the same order as they + * appear in the stream and always before the first audio frame (i.e. + * write callback). The metadata block that is passed in must not be + * modified, and it doesn't live beyond the callback, so you should make + * a copy of it with FLAC__metadata_object_clone() if you will need it + * elsewhere. Since metadata blocks can potentially be large, by + * default the decoder only calls the metadata callback for the + * \c STREAMINFO block; you can instruct the decoder to pass or filter + * other blocks with FLAC__stream_decoder_set_metadata_*() calls. + * + * \note In general, FLAC__StreamDecoder functions which change the + * state should not be called on the \a decoder while in the callback. + * + * \param decoder The decoder instance calling the callback. + * \param metadata The decoded metadata block. + * \param client_data The callee's client data set through + * FLAC__stream_decoder_init_*(). + */ +typedef void (*FLAC__StreamDecoderMetadataCallback)(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data); + +/** Signature for the error callback. + * + * A function pointer matching this signature must be passed to one of + * the FLAC__stream_decoder_init_*() functions. + * The supplied function will be called whenever an error occurs during + * decoding. + * + * \note In general, FLAC__StreamDecoder functions which change the + * state should not be called on the \a decoder while in the callback. + * + * \param decoder The decoder instance calling the callback. + * \param status The error encountered by the decoder. + * \param client_data The callee's client data set through + * FLAC__stream_decoder_init_*(). + */ +typedef void (*FLAC__StreamDecoderErrorCallback)(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data); + + +/*********************************************************************** + * + * Class constructor/destructor + * + ***********************************************************************/ + +/** Create a new stream decoder instance. The instance is created with + * default settings; see the individual FLAC__stream_decoder_set_*() + * functions for each setting's default. + * + * \retval FLAC__StreamDecoder* + * \c NULL if there was an error allocating memory, else the new instance. + */ +FLAC_API FLAC__StreamDecoder *FLAC__stream_decoder_new(void); + +/** Free a decoder instance. Deletes the object pointed to by \a decoder. + * + * \param decoder A pointer to an existing decoder. + * \assert + * \code decoder != NULL \endcode + */ +FLAC_API void FLAC__stream_decoder_delete(FLAC__StreamDecoder *decoder); + + +/*********************************************************************** + * + * Public class method prototypes + * + ***********************************************************************/ + +/** Set the serial number for the FLAC stream within the Ogg container. + * The default behavior is to use the serial number of the first Ogg + * page. Setting a serial number here will explicitly specify which + * stream is to be decoded. + * + * \note + * This does not need to be set for native FLAC decoding. + * + * \default \c use serial number of first page + * \param decoder A decoder instance to set. + * \param serial_number See above. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__bool + * \c false if the decoder is already initialized, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_decoder_set_ogg_serial_number(FLAC__StreamDecoder *decoder, long serial_number); + +/** Set the "MD5 signature checking" flag. If \c true, the decoder will + * compute the MD5 signature of the unencoded audio data while decoding + * and compare it to the signature from the STREAMINFO block, if it + * exists, during FLAC__stream_decoder_finish(). + * + * MD5 signature checking will be turned off (until the next + * FLAC__stream_decoder_reset()) if there is no signature in the + * STREAMINFO block or when a seek is attempted. + * + * Clients that do not use the MD5 check should leave this off to speed + * up decoding. + * + * \default \c false + * \param decoder A decoder instance to set. + * \param value Flag value (see above). + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__bool + * \c false if the decoder is already initialized, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_decoder_set_md5_checking(FLAC__StreamDecoder *decoder, FLAC__bool value); + +/** Direct the decoder to pass on all metadata blocks of type \a type. + * + * \default By default, only the \c STREAMINFO block is returned via the + * metadata callback. + * \param decoder A decoder instance to set. + * \param type See above. + * \assert + * \code decoder != NULL \endcode + * \a type is valid + * \retval FLAC__bool + * \c false if the decoder is already initialized, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_respond(FLAC__StreamDecoder *decoder, FLAC__MetadataType type); + +/** Direct the decoder to pass on all APPLICATION metadata blocks of the + * given \a id. + * + * \default By default, only the \c STREAMINFO block is returned via the + * metadata callback. + * \param decoder A decoder instance to set. + * \param id See above. + * \assert + * \code decoder != NULL \endcode + * \code id != NULL \endcode + * \retval FLAC__bool + * \c false if the decoder is already initialized, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_respond_application(FLAC__StreamDecoder *decoder, const FLAC__byte id[4]); + +/** Direct the decoder to pass on all metadata blocks of any type. + * + * \default By default, only the \c STREAMINFO block is returned via the + * metadata callback. + * \param decoder A decoder instance to set. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__bool + * \c false if the decoder is already initialized, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_respond_all(FLAC__StreamDecoder *decoder); + +/** Direct the decoder to filter out all metadata blocks of type \a type. + * + * \default By default, only the \c STREAMINFO block is returned via the + * metadata callback. + * \param decoder A decoder instance to set. + * \param type See above. + * \assert + * \code decoder != NULL \endcode + * \a type is valid + * \retval FLAC__bool + * \c false if the decoder is already initialized, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_ignore(FLAC__StreamDecoder *decoder, FLAC__MetadataType type); + +/** Direct the decoder to filter out all APPLICATION metadata blocks of + * the given \a id. + * + * \default By default, only the \c STREAMINFO block is returned via the + * metadata callback. + * \param decoder A decoder instance to set. + * \param id See above. + * \assert + * \code decoder != NULL \endcode + * \code id != NULL \endcode + * \retval FLAC__bool + * \c false if the decoder is already initialized, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_ignore_application(FLAC__StreamDecoder *decoder, const FLAC__byte id[4]); + +/** Direct the decoder to filter out all metadata blocks of any type. + * + * \default By default, only the \c STREAMINFO block is returned via the + * metadata callback. + * \param decoder A decoder instance to set. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__bool + * \c false if the decoder is already initialized, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_ignore_all(FLAC__StreamDecoder *decoder); + +/** Get the current decoder state. + * + * \param decoder A decoder instance to query. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__StreamDecoderState + * The current decoder state. + */ +FLAC_API FLAC__StreamDecoderState FLAC__stream_decoder_get_state(const FLAC__StreamDecoder *decoder); + +/** Get the current decoder state as a C string. + * + * \param decoder A decoder instance to query. + * \assert + * \code decoder != NULL \endcode + * \retval const char * + * The decoder state as a C string. Do not modify the contents. + */ +FLAC_API const char *FLAC__stream_decoder_get_resolved_state_string(const FLAC__StreamDecoder *decoder); + +/** Get the "MD5 signature checking" flag. + * This is the value of the setting, not whether or not the decoder is + * currently checking the MD5 (remember, it can be turned off automatically + * by a seek). When the decoder is reset the flag will be restored to the + * value returned by this function. + * + * \param decoder A decoder instance to query. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__bool + * See above. + */ +FLAC_API FLAC__bool FLAC__stream_decoder_get_md5_checking(const FLAC__StreamDecoder *decoder); + +/** Get the total number of samples in the stream being decoded. + * Will only be valid after decoding has started and will contain the + * value from the \c STREAMINFO block. A value of \c 0 means "unknown". + * + * \param decoder A decoder instance to query. + * \assert + * \code decoder != NULL \endcode + * \retval unsigned + * See above. + */ +FLAC_API FLAC__uint64 FLAC__stream_decoder_get_total_samples(const FLAC__StreamDecoder *decoder); + +/** Get the current number of channels in the stream being decoded. + * Will only be valid after decoding has started and will contain the + * value from the most recently decoded frame header. + * + * \param decoder A decoder instance to query. + * \assert + * \code decoder != NULL \endcode + * \retval unsigned + * See above. + */ +FLAC_API unsigned FLAC__stream_decoder_get_channels(const FLAC__StreamDecoder *decoder); + +/** Get the current channel assignment in the stream being decoded. + * Will only be valid after decoding has started and will contain the + * value from the most recently decoded frame header. + * + * \param decoder A decoder instance to query. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__ChannelAssignment + * See above. + */ +FLAC_API FLAC__ChannelAssignment FLAC__stream_decoder_get_channel_assignment(const FLAC__StreamDecoder *decoder); + +/** Get the current sample resolution in the stream being decoded. + * Will only be valid after decoding has started and will contain the + * value from the most recently decoded frame header. + * + * \param decoder A decoder instance to query. + * \assert + * \code decoder != NULL \endcode + * \retval unsigned + * See above. + */ +FLAC_API unsigned FLAC__stream_decoder_get_bits_per_sample(const FLAC__StreamDecoder *decoder); + +/** Get the current sample rate in Hz of the stream being decoded. + * Will only be valid after decoding has started and will contain the + * value from the most recently decoded frame header. + * + * \param decoder A decoder instance to query. + * \assert + * \code decoder != NULL \endcode + * \retval unsigned + * See above. + */ +FLAC_API unsigned FLAC__stream_decoder_get_sample_rate(const FLAC__StreamDecoder *decoder); + +/** Get the current blocksize of the stream being decoded. + * Will only be valid after decoding has started and will contain the + * value from the most recently decoded frame header. + * + * \param decoder A decoder instance to query. + * \assert + * \code decoder != NULL \endcode + * \retval unsigned + * See above. + */ +FLAC_API unsigned FLAC__stream_decoder_get_blocksize(const FLAC__StreamDecoder *decoder); + +/** Returns the decoder's current read position within the stream. + * The position is the byte offset from the start of the stream. + * Bytes before this position have been fully decoded. Note that + * there may still be undecoded bytes in the decoder's read FIFO. + * The returned position is correct even after a seek. + * + * \warning This function currently only works for native FLAC, + * not Ogg FLAC streams. + * + * \param decoder A decoder instance to query. + * \param position Address at which to return the desired position. + * \assert + * \code decoder != NULL \endcode + * \code position != NULL \endcode + * \retval FLAC__bool + * \c true if successful, \c false if the stream is not native FLAC, + * or there was an error from the 'tell' callback or it returned + * \c FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED. + */ +FLAC_API FLAC__bool FLAC__stream_decoder_get_decode_position(const FLAC__StreamDecoder *decoder, FLAC__uint64 *position); + +/** Initialize the decoder instance to decode native FLAC streams. + * + * This flavor of initialization sets up the decoder to decode from a + * native FLAC stream. I/O is performed via callbacks to the client. + * For decoding from a plain file via filename or open FILE*, + * FLAC__stream_decoder_init_file() and FLAC__stream_decoder_init_FILE() + * provide a simpler interface. + * + * This function should be called after FLAC__stream_decoder_new() and + * FLAC__stream_decoder_set_*() but before any of the + * FLAC__stream_decoder_process_*() functions. Will set and return the + * decoder state, which will be FLAC__STREAM_DECODER_SEARCH_FOR_METADATA + * if initialization succeeded. + * + * \param decoder An uninitialized decoder instance. + * \param read_callback See FLAC__StreamDecoderReadCallback. This + * pointer must not be \c NULL. + * \param seek_callback See FLAC__StreamDecoderSeekCallback. This + * pointer may be \c NULL if seeking is not + * supported. If \a seek_callback is not \c NULL then a + * \a tell_callback, \a length_callback, and \a eof_callback must also be supplied. + * Alternatively, a dummy seek callback that just + * returns \c FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED + * may also be supplied, all though this is slightly + * less efficient for the decoder. + * \param tell_callback See FLAC__StreamDecoderTellCallback. This + * pointer may be \c NULL if not supported by the client. If + * \a seek_callback is not \c NULL then a + * \a tell_callback must also be supplied. + * Alternatively, a dummy tell callback that just + * returns \c FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED + * may also be supplied, all though this is slightly + * less efficient for the decoder. + * \param length_callback See FLAC__StreamDecoderLengthCallback. This + * pointer may be \c NULL if not supported by the client. If + * \a seek_callback is not \c NULL then a + * \a length_callback must also be supplied. + * Alternatively, a dummy length callback that just + * returns \c FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED + * may also be supplied, all though this is slightly + * less efficient for the decoder. + * \param eof_callback See FLAC__StreamDecoderEofCallback. This + * pointer may be \c NULL if not supported by the client. If + * \a seek_callback is not \c NULL then a + * \a eof_callback must also be supplied. + * Alternatively, a dummy length callback that just + * returns \c false + * may also be supplied, all though this is slightly + * less efficient for the decoder. + * \param write_callback See FLAC__StreamDecoderWriteCallback. This + * pointer must not be \c NULL. + * \param metadata_callback See FLAC__StreamDecoderMetadataCallback. This + * pointer may be \c NULL if the callback is not + * desired. + * \param error_callback See FLAC__StreamDecoderErrorCallback. This + * pointer must not be \c NULL. + * \param client_data This value will be supplied to callbacks in their + * \a client_data argument. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__StreamDecoderInitStatus + * \c FLAC__STREAM_DECODER_INIT_STATUS_OK if initialization was successful; + * see FLAC__StreamDecoderInitStatus for the meanings of other return values. + */ +FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_stream( + FLAC__StreamDecoder *decoder, + FLAC__StreamDecoderReadCallback read_callback, + FLAC__StreamDecoderSeekCallback seek_callback, + FLAC__StreamDecoderTellCallback tell_callback, + FLAC__StreamDecoderLengthCallback length_callback, + FLAC__StreamDecoderEofCallback eof_callback, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data +); + +/** Initialize the decoder instance to decode Ogg FLAC streams. + * + * This flavor of initialization sets up the decoder to decode from a + * FLAC stream in an Ogg container. I/O is performed via callbacks to the + * client. For decoding from a plain file via filename or open FILE*, + * FLAC__stream_decoder_init_ogg_file() and FLAC__stream_decoder_init_ogg_FILE() + * provide a simpler interface. + * + * This function should be called after FLAC__stream_decoder_new() and + * FLAC__stream_decoder_set_*() but before any of the + * FLAC__stream_decoder_process_*() functions. Will set and return the + * decoder state, which will be FLAC__STREAM_DECODER_SEARCH_FOR_METADATA + * if initialization succeeded. + * + * \note Support for Ogg FLAC in the library is optional. If this + * library has been built without support for Ogg FLAC, this function + * will return \c FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER. + * + * \param decoder An uninitialized decoder instance. + * \param read_callback See FLAC__StreamDecoderReadCallback. This + * pointer must not be \c NULL. + * \param seek_callback See FLAC__StreamDecoderSeekCallback. This + * pointer may be \c NULL if seeking is not + * supported. If \a seek_callback is not \c NULL then a + * \a tell_callback, \a length_callback, and \a eof_callback must also be supplied. + * Alternatively, a dummy seek callback that just + * returns \c FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED + * may also be supplied, all though this is slightly + * less efficient for the decoder. + * \param tell_callback See FLAC__StreamDecoderTellCallback. This + * pointer may be \c NULL if not supported by the client. If + * \a seek_callback is not \c NULL then a + * \a tell_callback must also be supplied. + * Alternatively, a dummy tell callback that just + * returns \c FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED + * may also be supplied, all though this is slightly + * less efficient for the decoder. + * \param length_callback See FLAC__StreamDecoderLengthCallback. This + * pointer may be \c NULL if not supported by the client. If + * \a seek_callback is not \c NULL then a + * \a length_callback must also be supplied. + * Alternatively, a dummy length callback that just + * returns \c FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED + * may also be supplied, all though this is slightly + * less efficient for the decoder. + * \param eof_callback See FLAC__StreamDecoderEofCallback. This + * pointer may be \c NULL if not supported by the client. If + * \a seek_callback is not \c NULL then a + * \a eof_callback must also be supplied. + * Alternatively, a dummy length callback that just + * returns \c false + * may also be supplied, all though this is slightly + * less efficient for the decoder. + * \param write_callback See FLAC__StreamDecoderWriteCallback. This + * pointer must not be \c NULL. + * \param metadata_callback See FLAC__StreamDecoderMetadataCallback. This + * pointer may be \c NULL if the callback is not + * desired. + * \param error_callback See FLAC__StreamDecoderErrorCallback. This + * pointer must not be \c NULL. + * \param client_data This value will be supplied to callbacks in their + * \a client_data argument. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__StreamDecoderInitStatus + * \c FLAC__STREAM_DECODER_INIT_STATUS_OK if initialization was successful; + * see FLAC__StreamDecoderInitStatus for the meanings of other return values. + */ +FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_ogg_stream( + FLAC__StreamDecoder *decoder, + FLAC__StreamDecoderReadCallback read_callback, + FLAC__StreamDecoderSeekCallback seek_callback, + FLAC__StreamDecoderTellCallback tell_callback, + FLAC__StreamDecoderLengthCallback length_callback, + FLAC__StreamDecoderEofCallback eof_callback, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data +); + +/** Initialize the decoder instance to decode native FLAC files. + * + * This flavor of initialization sets up the decoder to decode from a + * plain native FLAC file. For non-stdio streams, you must use + * FLAC__stream_decoder_init_stream() and provide callbacks for the I/O. + * + * This function should be called after FLAC__stream_decoder_new() and + * FLAC__stream_decoder_set_*() but before any of the + * FLAC__stream_decoder_process_*() functions. Will set and return the + * decoder state, which will be FLAC__STREAM_DECODER_SEARCH_FOR_METADATA + * if initialization succeeded. + * + * \param decoder An uninitialized decoder instance. + * \param file An open FLAC file. The file should have been + * opened with mode \c "rb" and rewound. The file + * becomes owned by the decoder and should not be + * manipulated by the client while decoding. + * Unless \a file is \c stdin, it will be closed + * when FLAC__stream_decoder_finish() is called. + * Note however that seeking will not work when + * decoding from \c stdout since it is not seekable. + * \param write_callback See FLAC__StreamDecoderWriteCallback. This + * pointer must not be \c NULL. + * \param metadata_callback See FLAC__StreamDecoderMetadataCallback. This + * pointer may be \c NULL if the callback is not + * desired. + * \param error_callback See FLAC__StreamDecoderErrorCallback. This + * pointer must not be \c NULL. + * \param client_data This value will be supplied to callbacks in their + * \a client_data argument. + * \assert + * \code decoder != NULL \endcode + * \code file != NULL \endcode + * \retval FLAC__StreamDecoderInitStatus + * \c FLAC__STREAM_DECODER_INIT_STATUS_OK if initialization was successful; + * see FLAC__StreamDecoderInitStatus for the meanings of other return values. + */ +FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_FILE( + FLAC__StreamDecoder *decoder, + FILE *file, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data +); + +/** Initialize the decoder instance to decode Ogg FLAC files. + * + * This flavor of initialization sets up the decoder to decode from a + * plain Ogg FLAC file. For non-stdio streams, you must use + * FLAC__stream_decoder_init_ogg_stream() and provide callbacks for the I/O. + * + * This function should be called after FLAC__stream_decoder_new() and + * FLAC__stream_decoder_set_*() but before any of the + * FLAC__stream_decoder_process_*() functions. Will set and return the + * decoder state, which will be FLAC__STREAM_DECODER_SEARCH_FOR_METADATA + * if initialization succeeded. + * + * \note Support for Ogg FLAC in the library is optional. If this + * library has been built without support for Ogg FLAC, this function + * will return \c FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER. + * + * \param decoder An uninitialized decoder instance. + * \param file An open FLAC file. The file should have been + * opened with mode \c "rb" and rewound. The file + * becomes owned by the decoder and should not be + * manipulated by the client while decoding. + * Unless \a file is \c stdin, it will be closed + * when FLAC__stream_decoder_finish() is called. + * Note however that seeking will not work when + * decoding from \c stdout since it is not seekable. + * \param write_callback See FLAC__StreamDecoderWriteCallback. This + * pointer must not be \c NULL. + * \param metadata_callback See FLAC__StreamDecoderMetadataCallback. This + * pointer may be \c NULL if the callback is not + * desired. + * \param error_callback See FLAC__StreamDecoderErrorCallback. This + * pointer must not be \c NULL. + * \param client_data This value will be supplied to callbacks in their + * \a client_data argument. + * \assert + * \code decoder != NULL \endcode + * \code file != NULL \endcode + * \retval FLAC__StreamDecoderInitStatus + * \c FLAC__STREAM_DECODER_INIT_STATUS_OK if initialization was successful; + * see FLAC__StreamDecoderInitStatus for the meanings of other return values. + */ +FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_ogg_FILE( + FLAC__StreamDecoder *decoder, + FILE *file, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data +); + +/** Initialize the decoder instance to decode native FLAC files. + * + * This flavor of initialization sets up the decoder to decode from a plain + * native FLAC file. If POSIX fopen() semantics are not sufficient, (for + * example, with Unicode filenames on Windows), you must use + * FLAC__stream_decoder_init_FILE(), or FLAC__stream_decoder_init_stream() + * and provide callbacks for the I/O. + * + * This function should be called after FLAC__stream_decoder_new() and + * FLAC__stream_decoder_set_*() but before any of the + * FLAC__stream_decoder_process_*() functions. Will set and return the + * decoder state, which will be FLAC__STREAM_DECODER_SEARCH_FOR_METADATA + * if initialization succeeded. + * + * \param decoder An uninitialized decoder instance. + * \param filename The name of the file to decode from. The file will + * be opened with fopen(). Use \c NULL to decode from + * \c stdin. Note that \c stdin is not seekable. + * \param write_callback See FLAC__StreamDecoderWriteCallback. This + * pointer must not be \c NULL. + * \param metadata_callback See FLAC__StreamDecoderMetadataCallback. This + * pointer may be \c NULL if the callback is not + * desired. + * \param error_callback See FLAC__StreamDecoderErrorCallback. This + * pointer must not be \c NULL. + * \param client_data This value will be supplied to callbacks in their + * \a client_data argument. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__StreamDecoderInitStatus + * \c FLAC__STREAM_DECODER_INIT_STATUS_OK if initialization was successful; + * see FLAC__StreamDecoderInitStatus for the meanings of other return values. + */ +FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_file( + FLAC__StreamDecoder *decoder, + const char *filename, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data +); + +/** Initialize the decoder instance to decode Ogg FLAC files. + * + * This flavor of initialization sets up the decoder to decode from a plain + * Ogg FLAC file. If POSIX fopen() semantics are not sufficient, (for + * example, with Unicode filenames on Windows), you must use + * FLAC__stream_decoder_init_ogg_FILE(), or FLAC__stream_decoder_init_ogg_stream() + * and provide callbacks for the I/O. + * + * This function should be called after FLAC__stream_decoder_new() and + * FLAC__stream_decoder_set_*() but before any of the + * FLAC__stream_decoder_process_*() functions. Will set and return the + * decoder state, which will be FLAC__STREAM_DECODER_SEARCH_FOR_METADATA + * if initialization succeeded. + * + * \note Support for Ogg FLAC in the library is optional. If this + * library has been built without support for Ogg FLAC, this function + * will return \c FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER. + * + * \param decoder An uninitialized decoder instance. + * \param filename The name of the file to decode from. The file will + * be opened with fopen(). Use \c NULL to decode from + * \c stdin. Note that \c stdin is not seekable. + * \param write_callback See FLAC__StreamDecoderWriteCallback. This + * pointer must not be \c NULL. + * \param metadata_callback See FLAC__StreamDecoderMetadataCallback. This + * pointer may be \c NULL if the callback is not + * desired. + * \param error_callback See FLAC__StreamDecoderErrorCallback. This + * pointer must not be \c NULL. + * \param client_data This value will be supplied to callbacks in their + * \a client_data argument. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__StreamDecoderInitStatus + * \c FLAC__STREAM_DECODER_INIT_STATUS_OK if initialization was successful; + * see FLAC__StreamDecoderInitStatus for the meanings of other return values. + */ +FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_ogg_file( + FLAC__StreamDecoder *decoder, + const char *filename, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data +); + +/** Finish the decoding process. + * Flushes the decoding buffer, releases resources, resets the decoder + * settings to their defaults, and returns the decoder state to + * FLAC__STREAM_DECODER_UNINITIALIZED. + * + * In the event of a prematurely-terminated decode, it is not strictly + * necessary to call this immediately before FLAC__stream_decoder_delete() + * but it is good practice to match every FLAC__stream_decoder_init_*() + * with a FLAC__stream_decoder_finish(). + * + * \param decoder An uninitialized decoder instance. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__bool + * \c false if MD5 checking is on AND a STREAMINFO block was available + * AND the MD5 signature in the STREAMINFO block was non-zero AND the + * signature does not match the one computed by the decoder; else + * \c true. + */ +FLAC_API FLAC__bool FLAC__stream_decoder_finish(FLAC__StreamDecoder *decoder); + +/** Flush the stream input. + * The decoder's input buffer will be cleared and the state set to + * \c FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC. This will also turn + * off MD5 checking. + * + * \param decoder A decoder instance. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__bool + * \c true if successful, else \c false if a memory allocation + * error occurs (in which case the state will be set to + * \c FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR). + */ +FLAC_API FLAC__bool FLAC__stream_decoder_flush(FLAC__StreamDecoder *decoder); + +/** Reset the decoding process. + * The decoder's input buffer will be cleared and the state set to + * \c FLAC__STREAM_DECODER_SEARCH_FOR_METADATA. This is similar to + * FLAC__stream_decoder_finish() except that the settings are + * preserved; there is no need to call FLAC__stream_decoder_init_*() + * before decoding again. MD5 checking will be restored to its original + * setting. + * + * If the decoder is seekable, or was initialized with + * FLAC__stream_decoder_init*_FILE() or FLAC__stream_decoder_init*_file(), + * the decoder will also attempt to seek to the beginning of the file. + * If this rewind fails, this function will return \c false. It follows + * that FLAC__stream_decoder_reset() cannot be used when decoding from + * \c stdin. + * + * If the decoder was initialized with FLAC__stream_encoder_init*_stream() + * and is not seekable (i.e. no seek callback was provided or the seek + * callback returns \c FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED), it + * is the duty of the client to start feeding data from the beginning of + * the stream on the next FLAC__stream_decoder_process() or + * FLAC__stream_decoder_process_interleaved() call. + * + * \param decoder A decoder instance. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__bool + * \c true if successful, else \c false if a memory allocation occurs + * (in which case the state will be set to + * \c FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR) or a seek error + * occurs (the state will be unchanged). + */ +FLAC_API FLAC__bool FLAC__stream_decoder_reset(FLAC__StreamDecoder *decoder); + +/** Decode one metadata block or audio frame. + * This version instructs the decoder to decode a either a single metadata + * block or a single frame and stop, unless the callbacks return a fatal + * error or the read callback returns + * \c FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM. + * + * As the decoder needs more input it will call the read callback. + * Depending on what was decoded, the metadata or write callback will be + * called with the decoded metadata block or audio frame. + * + * Unless there is a fatal read error or end of stream, this function + * will return once one whole frame is decoded. In other words, if the + * stream is not synchronized or points to a corrupt frame header, the + * decoder will continue to try and resync until it gets to a valid + * frame, then decode one frame, then return. If the decoder points to + * a frame whose frame CRC in the frame footer does not match the + * computed frame CRC, this function will issue a + * FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH error to the + * error callback, and return, having decoded one complete, although + * corrupt, frame. (Such corrupted frames are sent as silence of the + * correct length to the write callback.) + * + * \param decoder An initialized decoder instance. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__bool + * \c false if any fatal read, write, or memory allocation error + * occurred (meaning decoding must stop), else \c true; for more + * information about the decoder, check the decoder state with + * FLAC__stream_decoder_get_state(). + */ +FLAC_API FLAC__bool FLAC__stream_decoder_process_single(FLAC__StreamDecoder *decoder); + +/** Decode until the end of the metadata. + * This version instructs the decoder to decode from the current position + * and continue until all the metadata has been read, or until the + * callbacks return a fatal error or the read callback returns + * \c FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM. + * + * As the decoder needs more input it will call the read callback. + * As each metadata block is decoded, the metadata callback will be called + * with the decoded metadata. + * + * \param decoder An initialized decoder instance. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__bool + * \c false if any fatal read, write, or memory allocation error + * occurred (meaning decoding must stop), else \c true; for more + * information about the decoder, check the decoder state with + * FLAC__stream_decoder_get_state(). + */ +FLAC_API FLAC__bool FLAC__stream_decoder_process_until_end_of_metadata(FLAC__StreamDecoder *decoder); + +/** Decode until the end of the stream. + * This version instructs the decoder to decode from the current position + * and continue until the end of stream (the read callback returns + * \c FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM), or until the + * callbacks return a fatal error. + * + * As the decoder needs more input it will call the read callback. + * As each metadata block and frame is decoded, the metadata or write + * callback will be called with the decoded metadata or frame. + * + * \param decoder An initialized decoder instance. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__bool + * \c false if any fatal read, write, or memory allocation error + * occurred (meaning decoding must stop), else \c true; for more + * information about the decoder, check the decoder state with + * FLAC__stream_decoder_get_state(). + */ +FLAC_API FLAC__bool FLAC__stream_decoder_process_until_end_of_stream(FLAC__StreamDecoder *decoder); + +/** Skip one audio frame. + * This version instructs the decoder to 'skip' a single frame and stop, + * unless the callbacks return a fatal error or the read callback returns + * \c FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM. + * + * The decoding flow is the same as what occurs when + * FLAC__stream_decoder_process_single() is called to process an audio + * frame, except that this function does not decode the parsed data into + * PCM or call the write callback. The integrity of the frame is still + * checked the same way as in the other process functions. + * + * This function will return once one whole frame is skipped, in the + * same way that FLAC__stream_decoder_process_single() will return once + * one whole frame is decoded. + * + * This function can be used in more quickly determining FLAC frame + * boundaries when decoding of the actual data is not needed, for + * example when an application is separating a FLAC stream into frames + * for editing or storing in a container. To do this, the application + * can use FLAC__stream_decoder_skip_single_frame() to quickly advance + * to the next frame, then use + * FLAC__stream_decoder_get_decode_position() to find the new frame + * boundary. + * + * This function should only be called when the stream has advanced + * past all the metadata, otherwise it will return \c false. + * + * \param decoder An initialized decoder instance not in a metadata + * state. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__bool + * \c false if any fatal read, write, or memory allocation error + * occurred (meaning decoding must stop), or if the decoder + * is in the FLAC__STREAM_DECODER_SEARCH_FOR_METADATA or + * FLAC__STREAM_DECODER_READ_METADATA state, else \c true; for more + * information about the decoder, check the decoder state with + * FLAC__stream_decoder_get_state(). + */ +FLAC_API FLAC__bool FLAC__stream_decoder_skip_single_frame(FLAC__StreamDecoder *decoder); + +/** Flush the input and seek to an absolute sample. + * Decoding will resume at the given sample. Note that because of + * this, the next write callback may contain a partial block. The + * client must support seeking the input or this function will fail + * and return \c false. Furthermore, if the decoder state is + * \c FLAC__STREAM_DECODER_SEEK_ERROR, then the decoder must be flushed + * with FLAC__stream_decoder_flush() or reset with + * FLAC__stream_decoder_reset() before decoding can continue. + * + * \param decoder A decoder instance. + * \param sample The target sample number to seek to. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__bool + * \c true if successful, else \c false. + */ +FLAC_API FLAC__bool FLAC__stream_decoder_seek_absolute(FLAC__StreamDecoder *decoder, FLAC__uint64 sample); + +/* \} */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/core/cd_hw/libchdr/deps/libFLAC/include/private/bitmath.h b/core/cd_hw/libchdr/deps/libFLAC/include/private/bitmath.h new file mode 100644 index 0000000..9c75f85 --- /dev/null +++ b/core/cd_hw/libchdr/deps/libFLAC/include/private/bitmath.h @@ -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 /* 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 diff --git a/core/cd_hw/libchdr/deps/libFLAC/include/private/bitreader.h b/core/cd_hw/libchdr/deps/libFLAC/include/private/bitreader.h new file mode 100644 index 0000000..7c73165 --- /dev/null +++ b/core/cd_hw/libchdr/deps/libFLAC/include/private/bitreader.h @@ -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 /* 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 diff --git a/core/cd_hw/libchdr/deps/libFLAC/include/private/cpu.h b/core/cd_hw/libchdr/deps/libFLAC/include/private/cpu.h new file mode 100644 index 0000000..7c65180 --- /dev/null +++ b/core/cd_hw/libchdr/deps/libFLAC/include/private/cpu.h @@ -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 +#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 diff --git a/core/cd_hw/libchdr/deps/libFLAC/include/private/crc.h b/core/cd_hw/libchdr/deps/libFLAC/include/private/crc.h new file mode 100644 index 0000000..294f60e --- /dev/null +++ b/core/cd_hw/libchdr/deps/libFLAC/include/private/crc.h @@ -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 diff --git a/core/cd_hw/libchdr/deps/libFLAC/include/private/fixed.h b/core/cd_hw/libchdr/deps/libFLAC/include/private/fixed.h new file mode 100644 index 0000000..68cdfce --- /dev/null +++ b/core/cd_hw/libchdr/deps/libFLAC/include/private/fixed.h @@ -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 +#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 diff --git a/core/cd_hw/libchdr/deps/libFLAC/include/private/float.h b/core/cd_hw/libchdr/deps/libFLAC/include/private/float.h new file mode 100644 index 0000000..12ece60 --- /dev/null +++ b/core/cd_hw/libchdr/deps/libFLAC/include/private/float.h @@ -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 +#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< +#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 diff --git a/core/cd_hw/libchdr/deps/libFLAC/include/private/macros.h b/core/cd_hw/libchdr/deps/libFLAC/include/private/macros.h new file mode 100644 index 0000000..becc59f --- /dev/null +++ b/core/cd_hw/libchdr/deps/libFLAC/include/private/macros.h @@ -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 +#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 +#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 diff --git a/core/cd_hw/libchdr/deps/libFLAC/include/private/md5.h b/core/cd_hw/libchdr/deps/libFLAC/include/private/md5.h new file mode 100644 index 0000000..c665ab3 --- /dev/null +++ b/core/cd_hw/libchdr/deps/libFLAC/include/private/md5.h @@ -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 . + * 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 diff --git a/core/cd_hw/libchdr/deps/libFLAC/include/private/memory.h b/core/cd_hw/libchdr/deps/libFLAC/include/private/memory.h new file mode 100644 index 0000000..f103c53 --- /dev/null +++ b/core/cd_hw/libchdr/deps/libFLAC/include/private/memory.h @@ -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 +#endif + +#include /* 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 diff --git a/core/cd_hw/libchdr/deps/libFLAC/include/protected/stream_decoder.h b/core/cd_hw/libchdr/deps/libFLAC/include/protected/stream_decoder.h new file mode 100644 index 0000000..5c31c16 --- /dev/null +++ b/core/cd_hw/libchdr/deps/libFLAC/include/protected/stream_decoder.h @@ -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 diff --git a/core/cd_hw/libchdr/deps/libFLAC/include/share/alloc.h b/core/cd_hw/libchdr/deps/libFLAC/include/share/alloc.h new file mode 100644 index 0000000..914de9b --- /dev/null +++ b/core/cd_hw/libchdr/deps/libFLAC/include/share/alloc.h @@ -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 +#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 /* for SIZE_MAX */ +#if HAVE_STDINT_H +#include /* for SIZE_MAX in case limits.h didn't get it */ +#endif +#include /* 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 diff --git a/core/cd_hw/libchdr/deps/libFLAC/include/share/compat.h b/core/cd_hw/libchdr/deps/libFLAC/include/share/compat.h new file mode 100644 index 0000000..4f33bc1 --- /dev/null +++ b/core/cd_hw/libchdr/deps/libFLAC/include/share/compat.h @@ -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 +#else +# include +#endif + +#if defined _MSC_VER || defined __BORLANDC__ || defined __MINGW32__ +#include /* 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 +#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 /* for _setmode(), chmod() */ +#include /* for _O_BINARY */ +#else +#include /* for chown(), unlink() */ +#endif + +#if defined _MSC_VER || defined __BORLANDC__ || defined __MINGW32__ +#if defined __BORLANDC__ +#include /* for utime() */ +#else +#include /* for utime() */ +#endif +#else +#include /* some flavors of BSD (like OS X) require this to get time_t */ +#include /* for utime() */ +#endif + +#if defined _MSC_VER +# if _MSC_VER >= 1800 +# include +# elif _MSC_VER >= 1600 +/* Visual Studio 2010 has decent C99 support */ +# include +# define PRIu64 "llu" +# define PRId64 "lld" +# define PRIx64 "llx" +# else +# include +# 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 +#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 */ diff --git a/core/cd_hw/libchdr/deps/libFLAC/include/share/endswap.h b/core/cd_hw/libchdr/deps/libFLAC/include/share/endswap.h new file mode 100644 index 0000000..9088a74 --- /dev/null +++ b/core/cd_hw/libchdr/deps/libFLAC/include/share/endswap.h @@ -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 + +#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 + +#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 diff --git a/core/cd_hw/libchdr/deps/libFLAC/lpc.c b/core/cd_hw/libchdr/deps/libFLAC/lpc.c new file mode 100644 index 0000000..531247b --- /dev/null +++ b/core/cd_hw/libchdr/deps/libFLAC/lpc.c @@ -0,0 +1,1357 @@ +/* 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 +#endif + +#include + +#include "FLAC/assert.h" +#include "FLAC/format.h" +#include "share/compat.h" +#include "private/bitmath.h" +#include "private/lpc.h" +#include "private/macros.h" +#if defined DEBUG || defined FLAC__OVERFLOW_DETECT || defined FLAC__OVERFLOW_DETECT_VERBOSE +#include +#endif + +/* OPT: #undef'ing this may improve the speed on some architectures */ +#define FLAC__LPC_UNROLLED_FILTER_LOOPS + +#ifndef FLAC__INTEGER_ONLY_LIBRARY + +#if defined(_MSC_VER) && (_MSC_VER < 1800) +#include +static inline long int lround(double x) { + return (long)(x + _copysign(0.5, x)); +} +#elif !defined(HAVE_LROUND) && defined(__GNUC__) +static inline long int lround(double x) { + return (long)(x + __builtin_copysign(0.5, x)); +} +/* If this fails, we are in the presence of a mid 90's compiler, move along... */ +#endif + +void FLAC__lpc_window_data(const FLAC__int32 in[], const FLAC__real window[], FLAC__real out[], unsigned data_len) +{ + unsigned i; + for(i = 0; i < data_len; i++) + out[i] = in[i] * window[i]; +} + +void FLAC__lpc_compute_autocorrelation(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]) +{ + /* a readable, but slower, version */ +#if 0 + FLAC__real d; + unsigned i; + + FLAC__ASSERT(lag > 0); + FLAC__ASSERT(lag <= data_len); + + /* + * Technically we should subtract the mean first like so: + * for(i = 0; i < data_len; i++) + * data[i] -= mean; + * but it appears not to make enough of a difference to matter, and + * most signals are already closely centered around zero + */ + while(lag--) { + for(i = lag, d = 0.0; i < data_len; i++) + d += data[i] * data[i - lag]; + autoc[lag] = d; + } +#endif + + /* + * this version tends to run faster because of better data locality + * ('data_len' is usually much larger than 'lag') + */ + FLAC__real d; + unsigned sample, coeff; + const unsigned limit = data_len - lag; + + FLAC__ASSERT(lag > 0); + FLAC__ASSERT(lag <= data_len); + + for(coeff = 0; coeff < lag; coeff++) + autoc[coeff] = 0.0; + for(sample = 0; sample <= limit; sample++) { + d = data[sample]; + for(coeff = 0; coeff < lag; coeff++) + autoc[coeff] += d * data[sample+coeff]; + } + for(; sample < data_len; sample++) { + d = data[sample]; + for(coeff = 0; coeff < data_len - sample; coeff++) + autoc[coeff] += d * data[sample+coeff]; + } +} + +void FLAC__lpc_compute_lp_coefficients(const FLAC__real autoc[], unsigned *max_order, FLAC__real lp_coeff[][FLAC__MAX_LPC_ORDER], double error[]) +{ + unsigned i, j; + double r, err, lpc[FLAC__MAX_LPC_ORDER]; + + FLAC__ASSERT(0 != max_order); + FLAC__ASSERT(0 < *max_order); + FLAC__ASSERT(*max_order <= FLAC__MAX_LPC_ORDER); + FLAC__ASSERT(autoc[0] != 0.0); + + err = autoc[0]; + + for(i = 0; i < *max_order; i++) { + /* Sum up this iteration's reflection coefficient. */ + r = -autoc[i+1]; + for(j = 0; j < i; j++) + r -= lpc[j] * autoc[i-j]; + r /= err; + + /* Update LPC coefficients and total error. */ + lpc[i]=r; + for(j = 0; j < (i>>1); j++) { + double tmp = lpc[j]; + lpc[j] += r * lpc[i-1-j]; + lpc[i-1-j] += r * tmp; + } + if(i & 1) + lpc[j] += lpc[j] * r; + + err *= (1.0 - r * r); + + /* save this order */ + for(j = 0; j <= i; j++) + lp_coeff[i][j] = (FLAC__real)(-lpc[j]); /* negate FIR filter coeff to get predictor coeff */ + error[i] = err; + + /* see SF bug https://sourceforge.net/p/flac/bugs/234/ */ + if(err == 0.0) { + *max_order = i+1; + return; + } + } +} + +int FLAC__lpc_quantize_coefficients(const FLAC__real lp_coeff[], unsigned order, unsigned precision, FLAC__int32 qlp_coeff[], int *shift) +{ + unsigned i; + double cmax; + FLAC__int32 qmax, qmin; + + FLAC__ASSERT(precision > 0); + FLAC__ASSERT(precision >= FLAC__MIN_QLP_COEFF_PRECISION); + + /* drop one bit for the sign; from here on out we consider only |lp_coeff[i]| */ + precision--; + qmax = 1 << precision; + qmin = -qmax; + qmax--; + + /* calc cmax = max( |lp_coeff[i]| ) */ + cmax = 0.0; + for(i = 0; i < order; i++) { + const double d = fabs(lp_coeff[i]); + if(d > cmax) + cmax = d; + } + + if(cmax <= 0.0) { + /* => coefficients are all 0, which means our constant-detect didn't work */ + return 2; + } + else { + const int max_shiftlimit = (1 << (FLAC__SUBFRAME_LPC_QLP_SHIFT_LEN-1)) - 1; + const int min_shiftlimit = -max_shiftlimit - 1; + int log2cmax; + + (void)frexp(cmax, &log2cmax); + log2cmax--; + *shift = (int)precision - log2cmax - 1; + + if(*shift > max_shiftlimit) + *shift = max_shiftlimit; + else if(*shift < min_shiftlimit) + return 1; + } + + if(*shift >= 0) { + double error = 0.0; + FLAC__int32 q; + for(i = 0; i < order; i++) { + error += lp_coeff[i] * (1 << *shift); + q = lround(error); + +#ifdef FLAC__OVERFLOW_DETECT + if(q > qmax+1) /* we expect q==qmax+1 occasionally due to rounding */ + fprintf(stderr,"FLAC__lpc_quantize_coefficients: quantizer overflow: q>qmax %d>%d shift=%d cmax=%f precision=%u lpc[%u]=%f\n",q,qmax,*shift,cmax,precision+1,i,lp_coeff[i]); + else if(q < qmin) + fprintf(stderr,"FLAC__lpc_quantize_coefficients: quantizer overflow: q qmax) + q = qmax; + else if(q < qmin) + q = qmin; + error -= q; + qlp_coeff[i] = q; + } + } + /* negative shift is very rare but due to design flaw, negative shift is + * not allowed in the decoder, so it must be handled specially by scaling + * down coeffs + */ + else { + const int nshift = -(*shift); + double error = 0.0; + FLAC__int32 q; +#ifdef DEBUG + fprintf(stderr,"FLAC__lpc_quantize_coefficients: negative shift=%d order=%u cmax=%f\n", *shift, order, cmax); +#endif + for(i = 0; i < order; i++) { + error += lp_coeff[i] / (1 << nshift); + q = lround(error); +#ifdef FLAC__OVERFLOW_DETECT + if(q > qmax+1) /* we expect q==qmax+1 occasionally due to rounding */ + fprintf(stderr,"FLAC__lpc_quantize_coefficients: quantizer overflow: q>qmax %d>%d shift=%d cmax=%f precision=%u lpc[%u]=%f\n",q,qmax,*shift,cmax,precision+1,i,lp_coeff[i]); + else if(q < qmin) + fprintf(stderr,"FLAC__lpc_quantize_coefficients: quantizer overflow: q qmax) + q = qmax; + else if(q < qmin) + q = qmin; + error -= q; + qlp_coeff[i] = q; + } + *shift = 0; + } + + return 0; +} + +#if defined(_MSC_VER) +// silence MSVC warnings about __restrict modifier +#pragma warning ( disable : 4028 ) +#endif + +void FLAC__lpc_compute_residual_from_qlp_coefficients(const FLAC__int32 * flac_restrict data, unsigned data_len, const FLAC__int32 * flac_restrict qlp_coeff, unsigned order, int lp_quantization, FLAC__int32 * flac_restrict residual) +#if defined(FLAC__OVERFLOW_DETECT) || !defined(FLAC__LPC_UNROLLED_FILTER_LOOPS) +{ + FLAC__int64 sumo; + unsigned i, j; + FLAC__int32 sum; + const FLAC__int32 *history; + +#ifdef FLAC__OVERFLOW_DETECT_VERBOSE + fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients: data_len=%d, order=%u, lpq=%d",data_len,order,lp_quantization); + for(i=0;i 0); + + for(i = 0; i < data_len; i++) { + sumo = 0; + sum = 0; + history = data; + for(j = 0; j < order; j++) { + sum += qlp_coeff[j] * (*(--history)); + sumo += (FLAC__int64)qlp_coeff[j] * (FLAC__int64)(*history); + if(sumo > 2147483647ll || sumo < -2147483648ll) + fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients: OVERFLOW, i=%u, j=%u, c=%d, d=%d, sumo=%" PRId64 "\n",i,j,qlp_coeff[j],*history,sumo); + } + *(residual++) = *(data++) - (sum >> lp_quantization); + } + + /* Here's a slower but clearer version: + for(i = 0; i < data_len; i++) { + sum = 0; + for(j = 0; j < order; j++) + sum += qlp_coeff[j] * data[i-j-1]; + residual[i] = data[i] - (sum >> lp_quantization); + } + */ +} +#else /* fully unrolled version for normal use */ +{ + int i; + FLAC__int32 sum; + + FLAC__ASSERT(order > 0); + FLAC__ASSERT(order <= 32); + + /* + * We do unique versions up to 12th order since that's the subset limit. + * Also they are roughly ordered to match frequency of occurrence to + * minimize branching. + */ + if(order <= 12) { + if(order > 8) { + if(order > 10) { + if(order == 12) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[11] * data[i-12]; + sum += qlp_coeff[10] * data[i-11]; + sum += qlp_coeff[9] * data[i-10]; + sum += qlp_coeff[8] * data[i-9]; + sum += qlp_coeff[7] * data[i-8]; + sum += qlp_coeff[6] * data[i-7]; + sum += qlp_coeff[5] * data[i-6]; + sum += qlp_coeff[4] * data[i-5]; + sum += qlp_coeff[3] * data[i-4]; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + residual[i] = data[i] - (sum >> lp_quantization); + } + } + else { /* order == 11 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[10] * data[i-11]; + sum += qlp_coeff[9] * data[i-10]; + sum += qlp_coeff[8] * data[i-9]; + sum += qlp_coeff[7] * data[i-8]; + sum += qlp_coeff[6] * data[i-7]; + sum += qlp_coeff[5] * data[i-6]; + sum += qlp_coeff[4] * data[i-5]; + sum += qlp_coeff[3] * data[i-4]; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + residual[i] = data[i] - (sum >> lp_quantization); + } + } + } + else { + if(order == 10) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[9] * data[i-10]; + sum += qlp_coeff[8] * data[i-9]; + sum += qlp_coeff[7] * data[i-8]; + sum += qlp_coeff[6] * data[i-7]; + sum += qlp_coeff[5] * data[i-6]; + sum += qlp_coeff[4] * data[i-5]; + sum += qlp_coeff[3] * data[i-4]; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + residual[i] = data[i] - (sum >> lp_quantization); + } + } + else { /* order == 9 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[8] * data[i-9]; + sum += qlp_coeff[7] * data[i-8]; + sum += qlp_coeff[6] * data[i-7]; + sum += qlp_coeff[5] * data[i-6]; + sum += qlp_coeff[4] * data[i-5]; + sum += qlp_coeff[3] * data[i-4]; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + residual[i] = data[i] - (sum >> lp_quantization); + } + } + } + } + else if(order > 4) { + if(order > 6) { + if(order == 8) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[7] * data[i-8]; + sum += qlp_coeff[6] * data[i-7]; + sum += qlp_coeff[5] * data[i-6]; + sum += qlp_coeff[4] * data[i-5]; + sum += qlp_coeff[3] * data[i-4]; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + residual[i] = data[i] - (sum >> lp_quantization); + } + } + else { /* order == 7 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[6] * data[i-7]; + sum += qlp_coeff[5] * data[i-6]; + sum += qlp_coeff[4] * data[i-5]; + sum += qlp_coeff[3] * data[i-4]; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + residual[i] = data[i] - (sum >> lp_quantization); + } + } + } + else { + if(order == 6) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[5] * data[i-6]; + sum += qlp_coeff[4] * data[i-5]; + sum += qlp_coeff[3] * data[i-4]; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + residual[i] = data[i] - (sum >> lp_quantization); + } + } + else { /* order == 5 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[4] * data[i-5]; + sum += qlp_coeff[3] * data[i-4]; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + residual[i] = data[i] - (sum >> lp_quantization); + } + } + } + } + else { + if(order > 2) { + if(order == 4) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[3] * data[i-4]; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + residual[i] = data[i] - (sum >> lp_quantization); + } + } + else { /* order == 3 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + residual[i] = data[i] - (sum >> lp_quantization); + } + } + } + else { + if(order == 2) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + residual[i] = data[i] - (sum >> lp_quantization); + } + } + else { /* order == 1 */ + for(i = 0; i < (int)data_len; i++) + residual[i] = data[i] - ((qlp_coeff[0] * data[i-1]) >> lp_quantization); + } + } + } + } + else { /* order > 12 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + switch(order) { + case 32: sum += qlp_coeff[31] * data[i-32]; + case 31: sum += qlp_coeff[30] * data[i-31]; + case 30: sum += qlp_coeff[29] * data[i-30]; + case 29: sum += qlp_coeff[28] * data[i-29]; + case 28: sum += qlp_coeff[27] * data[i-28]; + case 27: sum += qlp_coeff[26] * data[i-27]; + case 26: sum += qlp_coeff[25] * data[i-26]; + case 25: sum += qlp_coeff[24] * data[i-25]; + case 24: sum += qlp_coeff[23] * data[i-24]; + case 23: sum += qlp_coeff[22] * data[i-23]; + case 22: sum += qlp_coeff[21] * data[i-22]; + case 21: sum += qlp_coeff[20] * data[i-21]; + case 20: sum += qlp_coeff[19] * data[i-20]; + case 19: sum += qlp_coeff[18] * data[i-19]; + case 18: sum += qlp_coeff[17] * data[i-18]; + case 17: sum += qlp_coeff[16] * data[i-17]; + case 16: sum += qlp_coeff[15] * data[i-16]; + case 15: sum += qlp_coeff[14] * data[i-15]; + case 14: sum += qlp_coeff[13] * data[i-14]; + case 13: sum += qlp_coeff[12] * data[i-13]; + sum += qlp_coeff[11] * data[i-12]; + sum += qlp_coeff[10] * data[i-11]; + sum += qlp_coeff[ 9] * data[i-10]; + sum += qlp_coeff[ 8] * data[i- 9]; + sum += qlp_coeff[ 7] * data[i- 8]; + sum += qlp_coeff[ 6] * data[i- 7]; + sum += qlp_coeff[ 5] * data[i- 6]; + sum += qlp_coeff[ 4] * data[i- 5]; + sum += qlp_coeff[ 3] * data[i- 4]; + sum += qlp_coeff[ 2] * data[i- 3]; + sum += qlp_coeff[ 1] * data[i- 2]; + sum += qlp_coeff[ 0] * data[i- 1]; + } + residual[i] = data[i] - (sum >> lp_quantization); + } + } +} +#endif + +void FLAC__lpc_compute_residual_from_qlp_coefficients_wide(const FLAC__int32 * flac_restrict data, unsigned data_len, const FLAC__int32 * flac_restrict qlp_coeff, unsigned order, int lp_quantization, FLAC__int32 * flac_restrict residual) +#if defined(FLAC__OVERFLOW_DETECT) || !defined(FLAC__LPC_UNROLLED_FILTER_LOOPS) +{ + unsigned i, j; + FLAC__int64 sum; + const FLAC__int32 *history; + +#ifdef FLAC__OVERFLOW_DETECT_VERBOSE + fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients_wide: data_len=%d, order=%u, lpq=%d",data_len,order,lp_quantization); + for(i=0;i 0); + + for(i = 0; i < data_len; i++) { + sum = 0; + history = data; + for(j = 0; j < order; j++) + sum += (FLAC__int64)qlp_coeff[j] * (FLAC__int64)(*(--history)); + if(FLAC__bitmath_silog2(sum >> lp_quantization) > 32) { + fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients_wide: OVERFLOW, i=%u, sum=%" PRId64 "\n", i, (sum >> lp_quantization)); + break; + } + if(FLAC__bitmath_silog2((FLAC__int64)(*data) - (sum >> lp_quantization)) > 32) { + fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients_wide: OVERFLOW, i=%u, data=%d, sum=%" PRId64 ", residual=%" PRId64 "\n", i, *data, (int64_t)(sum >> lp_quantization), ((FLAC__int64)(*data) - (sum >> lp_quantization))); + break; + } + *(residual++) = *(data++) - (FLAC__int32)(sum >> lp_quantization); + } +} +#else /* fully unrolled version for normal use */ +{ + int i; + FLAC__int64 sum; + + FLAC__ASSERT(order > 0); + FLAC__ASSERT(order <= 32); + + /* + * We do unique versions up to 12th order since that's the subset limit. + * Also they are roughly ordered to match frequency of occurrence to + * minimize branching. + */ + if(order <= 12) { + if(order > 8) { + if(order > 10) { + if(order == 12) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[11] * (FLAC__int64)data[i-12]; + sum += qlp_coeff[10] * (FLAC__int64)data[i-11]; + sum += qlp_coeff[9] * (FLAC__int64)data[i-10]; + sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; + sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; + sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; + sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); + } + } + else { /* order == 11 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[10] * (FLAC__int64)data[i-11]; + sum += qlp_coeff[9] * (FLAC__int64)data[i-10]; + sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; + sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; + sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; + sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); + } + } + } + else { + if(order == 10) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[9] * (FLAC__int64)data[i-10]; + sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; + sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; + sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; + sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); + } + } + else { /* order == 9 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; + sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; + sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; + sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); + } + } + } + } + else if(order > 4) { + if(order > 6) { + if(order == 8) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; + sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; + sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); + } + } + else { /* order == 7 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; + sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); + } + } + } + else { + if(order == 6) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); + } + } + else { /* order == 5 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); + } + } + } + } + else { + if(order > 2) { + if(order == 4) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); + } + } + else { /* order == 3 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); + } + } + } + else { + if(order == 2) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); + } + } + else { /* order == 1 */ + for(i = 0; i < (int)data_len; i++) + residual[i] = data[i] - (FLAC__int32)((qlp_coeff[0] * (FLAC__int64)data[i-1]) >> lp_quantization); + } + } + } + } + else { /* order > 12 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + switch(order) { + case 32: sum += qlp_coeff[31] * (FLAC__int64)data[i-32]; + case 31: sum += qlp_coeff[30] * (FLAC__int64)data[i-31]; + case 30: sum += qlp_coeff[29] * (FLAC__int64)data[i-30]; + case 29: sum += qlp_coeff[28] * (FLAC__int64)data[i-29]; + case 28: sum += qlp_coeff[27] * (FLAC__int64)data[i-28]; + case 27: sum += qlp_coeff[26] * (FLAC__int64)data[i-27]; + case 26: sum += qlp_coeff[25] * (FLAC__int64)data[i-26]; + case 25: sum += qlp_coeff[24] * (FLAC__int64)data[i-25]; + case 24: sum += qlp_coeff[23] * (FLAC__int64)data[i-24]; + case 23: sum += qlp_coeff[22] * (FLAC__int64)data[i-23]; + case 22: sum += qlp_coeff[21] * (FLAC__int64)data[i-22]; + case 21: sum += qlp_coeff[20] * (FLAC__int64)data[i-21]; + case 20: sum += qlp_coeff[19] * (FLAC__int64)data[i-20]; + case 19: sum += qlp_coeff[18] * (FLAC__int64)data[i-19]; + case 18: sum += qlp_coeff[17] * (FLAC__int64)data[i-18]; + case 17: sum += qlp_coeff[16] * (FLAC__int64)data[i-17]; + case 16: sum += qlp_coeff[15] * (FLAC__int64)data[i-16]; + case 15: sum += qlp_coeff[14] * (FLAC__int64)data[i-15]; + case 14: sum += qlp_coeff[13] * (FLAC__int64)data[i-14]; + case 13: sum += qlp_coeff[12] * (FLAC__int64)data[i-13]; + sum += qlp_coeff[11] * (FLAC__int64)data[i-12]; + sum += qlp_coeff[10] * (FLAC__int64)data[i-11]; + sum += qlp_coeff[ 9] * (FLAC__int64)data[i-10]; + sum += qlp_coeff[ 8] * (FLAC__int64)data[i- 9]; + sum += qlp_coeff[ 7] * (FLAC__int64)data[i- 8]; + sum += qlp_coeff[ 6] * (FLAC__int64)data[i- 7]; + sum += qlp_coeff[ 5] * (FLAC__int64)data[i- 6]; + sum += qlp_coeff[ 4] * (FLAC__int64)data[i- 5]; + sum += qlp_coeff[ 3] * (FLAC__int64)data[i- 4]; + sum += qlp_coeff[ 2] * (FLAC__int64)data[i- 3]; + sum += qlp_coeff[ 1] * (FLAC__int64)data[i- 2]; + sum += qlp_coeff[ 0] * (FLAC__int64)data[i- 1]; + } + residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); + } + } +} +#endif + +#endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */ + +void FLAC__lpc_restore_signal(const FLAC__int32 * flac_restrict residual, unsigned data_len, const FLAC__int32 * flac_restrict qlp_coeff, unsigned order, int lp_quantization, FLAC__int32 * flac_restrict data) +#if defined(FLAC__OVERFLOW_DETECT) || !defined(FLAC__LPC_UNROLLED_FILTER_LOOPS) +{ + FLAC__int64 sumo; + unsigned i, j; + FLAC__int32 sum; + const FLAC__int32 *r = residual, *history; + +#ifdef FLAC__OVERFLOW_DETECT_VERBOSE + fprintf(stderr,"FLAC__lpc_restore_signal: data_len=%d, order=%u, lpq=%d",data_len,order,lp_quantization); + for(i=0;i 0); + + for(i = 0; i < data_len; i++) { + sumo = 0; + sum = 0; + history = data; + for(j = 0; j < order; j++) { + sum += qlp_coeff[j] * (*(--history)); + sumo += (FLAC__int64)qlp_coeff[j] * (FLAC__int64)(*history); + if(sumo > 2147483647ll || sumo < -2147483648ll) + fprintf(stderr,"FLAC__lpc_restore_signal: OVERFLOW, i=%u, j=%u, c=%d, d=%d, sumo=%" PRId64 "\n",i,j,qlp_coeff[j],*history,sumo); + } + *(data++) = *(r++) + (sum >> lp_quantization); + } + + /* Here's a slower but clearer version: + for(i = 0; i < data_len; i++) { + sum = 0; + for(j = 0; j < order; j++) + sum += qlp_coeff[j] * data[i-j-1]; + data[i] = residual[i] + (sum >> lp_quantization); + } + */ +} +#else /* fully unrolled version for normal use */ +{ + int i; + FLAC__int32 sum; + + FLAC__ASSERT(order > 0); + FLAC__ASSERT(order <= 32); + + /* + * We do unique versions up to 12th order since that's the subset limit. + * Also they are roughly ordered to match frequency of occurrence to + * minimize branching. + */ + if(order <= 12) { + if(order > 8) { + if(order > 10) { + if(order == 12) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[11] * data[i-12]; + sum += qlp_coeff[10] * data[i-11]; + sum += qlp_coeff[9] * data[i-10]; + sum += qlp_coeff[8] * data[i-9]; + sum += qlp_coeff[7] * data[i-8]; + sum += qlp_coeff[6] * data[i-7]; + sum += qlp_coeff[5] * data[i-6]; + sum += qlp_coeff[4] * data[i-5]; + sum += qlp_coeff[3] * data[i-4]; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + data[i] = residual[i] + (sum >> lp_quantization); + } + } + else { /* order == 11 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[10] * data[i-11]; + sum += qlp_coeff[9] * data[i-10]; + sum += qlp_coeff[8] * data[i-9]; + sum += qlp_coeff[7] * data[i-8]; + sum += qlp_coeff[6] * data[i-7]; + sum += qlp_coeff[5] * data[i-6]; + sum += qlp_coeff[4] * data[i-5]; + sum += qlp_coeff[3] * data[i-4]; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + data[i] = residual[i] + (sum >> lp_quantization); + } + } + } + else { + if(order == 10) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[9] * data[i-10]; + sum += qlp_coeff[8] * data[i-9]; + sum += qlp_coeff[7] * data[i-8]; + sum += qlp_coeff[6] * data[i-7]; + sum += qlp_coeff[5] * data[i-6]; + sum += qlp_coeff[4] * data[i-5]; + sum += qlp_coeff[3] * data[i-4]; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + data[i] = residual[i] + (sum >> lp_quantization); + } + } + else { /* order == 9 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[8] * data[i-9]; + sum += qlp_coeff[7] * data[i-8]; + sum += qlp_coeff[6] * data[i-7]; + sum += qlp_coeff[5] * data[i-6]; + sum += qlp_coeff[4] * data[i-5]; + sum += qlp_coeff[3] * data[i-4]; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + data[i] = residual[i] + (sum >> lp_quantization); + } + } + } + } + else if(order > 4) { + if(order > 6) { + if(order == 8) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[7] * data[i-8]; + sum += qlp_coeff[6] * data[i-7]; + sum += qlp_coeff[5] * data[i-6]; + sum += qlp_coeff[4] * data[i-5]; + sum += qlp_coeff[3] * data[i-4]; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + data[i] = residual[i] + (sum >> lp_quantization); + } + } + else { /* order == 7 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[6] * data[i-7]; + sum += qlp_coeff[5] * data[i-6]; + sum += qlp_coeff[4] * data[i-5]; + sum += qlp_coeff[3] * data[i-4]; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + data[i] = residual[i] + (sum >> lp_quantization); + } + } + } + else { + if(order == 6) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[5] * data[i-6]; + sum += qlp_coeff[4] * data[i-5]; + sum += qlp_coeff[3] * data[i-4]; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + data[i] = residual[i] + (sum >> lp_quantization); + } + } + else { /* order == 5 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[4] * data[i-5]; + sum += qlp_coeff[3] * data[i-4]; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + data[i] = residual[i] + (sum >> lp_quantization); + } + } + } + } + else { + if(order > 2) { + if(order == 4) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[3] * data[i-4]; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + data[i] = residual[i] + (sum >> lp_quantization); + } + } + else { /* order == 3 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + data[i] = residual[i] + (sum >> lp_quantization); + } + } + } + else { + if(order == 2) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + data[i] = residual[i] + (sum >> lp_quantization); + } + } + else { /* order == 1 */ + for(i = 0; i < (int)data_len; i++) + data[i] = residual[i] + ((qlp_coeff[0] * data[i-1]) >> lp_quantization); + } + } + } + } + else { /* order > 12 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + switch(order) { + case 32: sum += qlp_coeff[31] * data[i-32]; + case 31: sum += qlp_coeff[30] * data[i-31]; + case 30: sum += qlp_coeff[29] * data[i-30]; + case 29: sum += qlp_coeff[28] * data[i-29]; + case 28: sum += qlp_coeff[27] * data[i-28]; + case 27: sum += qlp_coeff[26] * data[i-27]; + case 26: sum += qlp_coeff[25] * data[i-26]; + case 25: sum += qlp_coeff[24] * data[i-25]; + case 24: sum += qlp_coeff[23] * data[i-24]; + case 23: sum += qlp_coeff[22] * data[i-23]; + case 22: sum += qlp_coeff[21] * data[i-22]; + case 21: sum += qlp_coeff[20] * data[i-21]; + case 20: sum += qlp_coeff[19] * data[i-20]; + case 19: sum += qlp_coeff[18] * data[i-19]; + case 18: sum += qlp_coeff[17] * data[i-18]; + case 17: sum += qlp_coeff[16] * data[i-17]; + case 16: sum += qlp_coeff[15] * data[i-16]; + case 15: sum += qlp_coeff[14] * data[i-15]; + case 14: sum += qlp_coeff[13] * data[i-14]; + case 13: sum += qlp_coeff[12] * data[i-13]; + sum += qlp_coeff[11] * data[i-12]; + sum += qlp_coeff[10] * data[i-11]; + sum += qlp_coeff[ 9] * data[i-10]; + sum += qlp_coeff[ 8] * data[i- 9]; + sum += qlp_coeff[ 7] * data[i- 8]; + sum += qlp_coeff[ 6] * data[i- 7]; + sum += qlp_coeff[ 5] * data[i- 6]; + sum += qlp_coeff[ 4] * data[i- 5]; + sum += qlp_coeff[ 3] * data[i- 4]; + sum += qlp_coeff[ 2] * data[i- 3]; + sum += qlp_coeff[ 1] * data[i- 2]; + sum += qlp_coeff[ 0] * data[i- 1]; + } + data[i] = residual[i] + (sum >> lp_quantization); + } + } +} +#endif + +void FLAC__lpc_restore_signal_wide(const FLAC__int32 * flac_restrict residual, unsigned data_len, const FLAC__int32 * flac_restrict qlp_coeff, unsigned order, int lp_quantization, FLAC__int32 * flac_restrict data) +#if defined(FLAC__OVERFLOW_DETECT) || !defined(FLAC__LPC_UNROLLED_FILTER_LOOPS) +{ + unsigned i, j; + FLAC__int64 sum; + const FLAC__int32 *r = residual, *history; + +#ifdef FLAC__OVERFLOW_DETECT_VERBOSE + fprintf(stderr,"FLAC__lpc_restore_signal_wide: data_len=%d, order=%u, lpq=%d",data_len,order,lp_quantization); + for(i=0;i 0); + + for(i = 0; i < data_len; i++) { + sum = 0; + history = data; + for(j = 0; j < order; j++) + sum += (FLAC__int64)qlp_coeff[j] * (FLAC__int64)(*(--history)); + if(FLAC__bitmath_silog2(sum >> lp_quantization) > 32) { + fprintf(stderr,"FLAC__lpc_restore_signal_wide: OVERFLOW, i=%u, sum=%" PRId64 "\n", i, (sum >> lp_quantization)); + break; + } + if(FLAC__bitmath_silog2((FLAC__int64)(*r) + (sum >> lp_quantization)) > 32) { + fprintf(stderr,"FLAC__lpc_restore_signal_wide: OVERFLOW, i=%u, residual=%d, sum=%" PRId64 ", data=%" PRId64 "\n", i, *r, (sum >> lp_quantization), ((FLAC__int64)(*r) + (sum >> lp_quantization))); + break; + } + *(data++) = *(r++) + (FLAC__int32)(sum >> lp_quantization); + } +} +#else /* fully unrolled version for normal use */ +{ + int i; + FLAC__int64 sum; + + FLAC__ASSERT(order > 0); + FLAC__ASSERT(order <= 32); + + /* + * We do unique versions up to 12th order since that's the subset limit. + * Also they are roughly ordered to match frequency of occurrence to + * minimize branching. + */ + if(order <= 12) { + if(order > 8) { + if(order > 10) { + if(order == 12) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[11] * (FLAC__int64)data[i-12]; + sum += qlp_coeff[10] * (FLAC__int64)data[i-11]; + sum += qlp_coeff[9] * (FLAC__int64)data[i-10]; + sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; + sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; + sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; + sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); + } + } + else { /* order == 11 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[10] * (FLAC__int64)data[i-11]; + sum += qlp_coeff[9] * (FLAC__int64)data[i-10]; + sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; + sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; + sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; + sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); + } + } + } + else { + if(order == 10) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[9] * (FLAC__int64)data[i-10]; + sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; + sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; + sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; + sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); + } + } + else { /* order == 9 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; + sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; + sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; + sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); + } + } + } + } + else if(order > 4) { + if(order > 6) { + if(order == 8) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; + sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; + sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); + } + } + else { /* order == 7 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; + sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); + } + } + } + else { + if(order == 6) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); + } + } + else { /* order == 5 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); + } + } + } + } + else { + if(order > 2) { + if(order == 4) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); + } + } + else { /* order == 3 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); + } + } + } + else { + if(order == 2) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); + } + } + else { /* order == 1 */ + for(i = 0; i < (int)data_len; i++) + data[i] = residual[i] + (FLAC__int32)((qlp_coeff[0] * (FLAC__int64)data[i-1]) >> lp_quantization); + } + } + } + } + else { /* order > 12 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + switch(order) { + case 32: sum += qlp_coeff[31] * (FLAC__int64)data[i-32]; + case 31: sum += qlp_coeff[30] * (FLAC__int64)data[i-31]; + case 30: sum += qlp_coeff[29] * (FLAC__int64)data[i-30]; + case 29: sum += qlp_coeff[28] * (FLAC__int64)data[i-29]; + case 28: sum += qlp_coeff[27] * (FLAC__int64)data[i-28]; + case 27: sum += qlp_coeff[26] * (FLAC__int64)data[i-27]; + case 26: sum += qlp_coeff[25] * (FLAC__int64)data[i-26]; + case 25: sum += qlp_coeff[24] * (FLAC__int64)data[i-25]; + case 24: sum += qlp_coeff[23] * (FLAC__int64)data[i-24]; + case 23: sum += qlp_coeff[22] * (FLAC__int64)data[i-23]; + case 22: sum += qlp_coeff[21] * (FLAC__int64)data[i-22]; + case 21: sum += qlp_coeff[20] * (FLAC__int64)data[i-21]; + case 20: sum += qlp_coeff[19] * (FLAC__int64)data[i-20]; + case 19: sum += qlp_coeff[18] * (FLAC__int64)data[i-19]; + case 18: sum += qlp_coeff[17] * (FLAC__int64)data[i-18]; + case 17: sum += qlp_coeff[16] * (FLAC__int64)data[i-17]; + case 16: sum += qlp_coeff[15] * (FLAC__int64)data[i-16]; + case 15: sum += qlp_coeff[14] * (FLAC__int64)data[i-15]; + case 14: sum += qlp_coeff[13] * (FLAC__int64)data[i-14]; + case 13: sum += qlp_coeff[12] * (FLAC__int64)data[i-13]; + sum += qlp_coeff[11] * (FLAC__int64)data[i-12]; + sum += qlp_coeff[10] * (FLAC__int64)data[i-11]; + sum += qlp_coeff[ 9] * (FLAC__int64)data[i-10]; + sum += qlp_coeff[ 8] * (FLAC__int64)data[i- 9]; + sum += qlp_coeff[ 7] * (FLAC__int64)data[i- 8]; + sum += qlp_coeff[ 6] * (FLAC__int64)data[i- 7]; + sum += qlp_coeff[ 5] * (FLAC__int64)data[i- 6]; + sum += qlp_coeff[ 4] * (FLAC__int64)data[i- 5]; + sum += qlp_coeff[ 3] * (FLAC__int64)data[i- 4]; + sum += qlp_coeff[ 2] * (FLAC__int64)data[i- 3]; + sum += qlp_coeff[ 1] * (FLAC__int64)data[i- 2]; + sum += qlp_coeff[ 0] * (FLAC__int64)data[i- 1]; + } + data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); + } + } +} +#endif + +#if defined(_MSC_VER) +#pragma warning ( default : 4028 ) +#endif + +#ifndef FLAC__INTEGER_ONLY_LIBRARY + +double FLAC__lpc_compute_expected_bits_per_residual_sample(double lpc_error, unsigned total_samples) +{ + double error_scale; + + FLAC__ASSERT(total_samples > 0); + + error_scale = 0.5 / (double)total_samples; + + return FLAC__lpc_compute_expected_bits_per_residual_sample_with_error_scale(lpc_error, error_scale); +} + +double FLAC__lpc_compute_expected_bits_per_residual_sample_with_error_scale(double lpc_error, double error_scale) +{ + if(lpc_error > 0.0) { + double bps = (double)0.5 * log(error_scale * lpc_error) / M_LN2; + if(bps >= 0.0) + return bps; + else + return 0.0; + } + else if(lpc_error < 0.0) { /* error should not be negative but can happen due to inadequate floating-point resolution */ + return 1e32; + } + else { + return 0.0; + } +} + +unsigned FLAC__lpc_compute_best_order(const double lpc_error[], unsigned max_order, unsigned total_samples, unsigned overhead_bits_per_order) +{ + unsigned order, indx, best_index; /* 'index' the index into lpc_error; index==order-1 since lpc_error[0] is for order==1, lpc_error[1] is for order==2, etc */ + double bits, best_bits, error_scale; + + FLAC__ASSERT(max_order > 0); + FLAC__ASSERT(total_samples > 0); + + error_scale = 0.5 / (double)total_samples; + + best_index = 0; + best_bits = (unsigned)(-1); + + for(indx = 0, order = 1; indx < max_order; indx++, order++) { + bits = FLAC__lpc_compute_expected_bits_per_residual_sample_with_error_scale(lpc_error[indx], error_scale) * (double)(total_samples - order) + (double)(order * overhead_bits_per_order); + if(bits < best_bits) { + best_index = indx; + best_bits = bits; + } + } + + return best_index+1; /* +1 since indx of lpc_error[] is order-1 */ +} + +#endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */ diff --git a/core/cd_hw/libchdr/deps/libFLAC/lpc_intrin_avx2.c b/core/cd_hw/libchdr/deps/libFLAC/lpc_intrin_avx2.c new file mode 100644 index 0000000..f9f5ccd --- /dev/null +++ b/core/cd_hw/libchdr/deps/libFLAC/lpc_intrin_avx2.c @@ -0,0 +1,1122 @@ +/* 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 +#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__AVX2_SUPPORTED + +#include "FLAC/assert.h" +#include "FLAC/format.h" + +#include /* AVX2 */ + +FLAC__SSE_TARGET("avx2") +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[]) +{ + int i; + FLAC__int32 sum; + __m128i cnt = _mm_cvtsi32_si128(lp_quantization); + + FLAC__ASSERT(order > 0); + FLAC__ASSERT(order <= 32); + + if(order <= 12) { + if(order > 8) { + if(order > 10) { + if(order == 12) { + __m256i q0, q1, q2, q3, q4, q5, q6, q7, q8, q9, q10, q11; + q0 = _mm256_set1_epi32(0xffff & qlp_coeff[0 ]); + q1 = _mm256_set1_epi32(0xffff & qlp_coeff[1 ]); + q2 = _mm256_set1_epi32(0xffff & qlp_coeff[2 ]); + q3 = _mm256_set1_epi32(0xffff & qlp_coeff[3 ]); + q4 = _mm256_set1_epi32(0xffff & qlp_coeff[4 ]); + q5 = _mm256_set1_epi32(0xffff & qlp_coeff[5 ]); + q6 = _mm256_set1_epi32(0xffff & qlp_coeff[6 ]); + q7 = _mm256_set1_epi32(0xffff & qlp_coeff[7 ]); + q8 = _mm256_set1_epi32(0xffff & qlp_coeff[8 ]); + q9 = _mm256_set1_epi32(0xffff & qlp_coeff[9 ]); + q10 = _mm256_set1_epi32(0xffff & qlp_coeff[10]); + q11 = _mm256_set1_epi32(0xffff & qlp_coeff[11]); + + for(i = 0; i < (int)data_len-7; i+=8) { + __m256i summ, mull; + summ = _mm256_madd_epi16(q11, _mm256_loadu_si256((const __m256i*)(data+i-12))); + mull = _mm256_madd_epi16(q10, _mm256_loadu_si256((const __m256i*)(data+i-11))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q9, _mm256_loadu_si256((const __m256i*)(data+i-10))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q8, _mm256_loadu_si256((const __m256i*)(data+i-9 ))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q7, _mm256_loadu_si256((const __m256i*)(data+i-8 ))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q6, _mm256_loadu_si256((const __m256i*)(data+i-7 ))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q5, _mm256_loadu_si256((const __m256i*)(data+i-6 ))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q4, _mm256_loadu_si256((const __m256i*)(data+i-5 ))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q3, _mm256_loadu_si256((const __m256i*)(data+i-4 ))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q2, _mm256_loadu_si256((const __m256i*)(data+i-3 ))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q1, _mm256_loadu_si256((const __m256i*)(data+i-2 ))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q0, _mm256_loadu_si256((const __m256i*)(data+i-1 ))); summ = _mm256_add_epi32(summ, mull); + summ = _mm256_sra_epi32(summ, cnt); + _mm256_storeu_si256((__m256i*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(data+i)), summ)); + } + } + else { /* order == 11 */ + __m256i q0, q1, q2, q3, q4, q5, q6, q7, q8, q9, q10; + q0 = _mm256_set1_epi32(0xffff & qlp_coeff[0 ]); + q1 = _mm256_set1_epi32(0xffff & qlp_coeff[1 ]); + q2 = _mm256_set1_epi32(0xffff & qlp_coeff[2 ]); + q3 = _mm256_set1_epi32(0xffff & qlp_coeff[3 ]); + q4 = _mm256_set1_epi32(0xffff & qlp_coeff[4 ]); + q5 = _mm256_set1_epi32(0xffff & qlp_coeff[5 ]); + q6 = _mm256_set1_epi32(0xffff & qlp_coeff[6 ]); + q7 = _mm256_set1_epi32(0xffff & qlp_coeff[7 ]); + q8 = _mm256_set1_epi32(0xffff & qlp_coeff[8 ]); + q9 = _mm256_set1_epi32(0xffff & qlp_coeff[9 ]); + q10 = _mm256_set1_epi32(0xffff & qlp_coeff[10]); + + for(i = 0; i < (int)data_len-7; i+=8) { + __m256i summ, mull; + summ = _mm256_madd_epi16(q10, _mm256_loadu_si256((const __m256i*)(data+i-11))); + mull = _mm256_madd_epi16(q9, _mm256_loadu_si256((const __m256i*)(data+i-10))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q8, _mm256_loadu_si256((const __m256i*)(data+i-9 ))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q7, _mm256_loadu_si256((const __m256i*)(data+i-8 ))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q6, _mm256_loadu_si256((const __m256i*)(data+i-7 ))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q5, _mm256_loadu_si256((const __m256i*)(data+i-6 ))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q4, _mm256_loadu_si256((const __m256i*)(data+i-5 ))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q3, _mm256_loadu_si256((const __m256i*)(data+i-4 ))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q2, _mm256_loadu_si256((const __m256i*)(data+i-3 ))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q1, _mm256_loadu_si256((const __m256i*)(data+i-2 ))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q0, _mm256_loadu_si256((const __m256i*)(data+i-1 ))); summ = _mm256_add_epi32(summ, mull); + summ = _mm256_sra_epi32(summ, cnt); + _mm256_storeu_si256((__m256i*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(data+i)), summ)); + } + } + } + else { + if(order == 10) { + __m256i q0, q1, q2, q3, q4, q5, q6, q7, q8, q9; + q0 = _mm256_set1_epi32(0xffff & qlp_coeff[0 ]); + q1 = _mm256_set1_epi32(0xffff & qlp_coeff[1 ]); + q2 = _mm256_set1_epi32(0xffff & qlp_coeff[2 ]); + q3 = _mm256_set1_epi32(0xffff & qlp_coeff[3 ]); + q4 = _mm256_set1_epi32(0xffff & qlp_coeff[4 ]); + q5 = _mm256_set1_epi32(0xffff & qlp_coeff[5 ]); + q6 = _mm256_set1_epi32(0xffff & qlp_coeff[6 ]); + q7 = _mm256_set1_epi32(0xffff & qlp_coeff[7 ]); + q8 = _mm256_set1_epi32(0xffff & qlp_coeff[8 ]); + q9 = _mm256_set1_epi32(0xffff & qlp_coeff[9 ]); + + for(i = 0; i < (int)data_len-7; i+=8) { + __m256i summ, mull; + summ = _mm256_madd_epi16(q9, _mm256_loadu_si256((const __m256i*)(data+i-10))); + mull = _mm256_madd_epi16(q8, _mm256_loadu_si256((const __m256i*)(data+i-9 ))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q7, _mm256_loadu_si256((const __m256i*)(data+i-8 ))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q6, _mm256_loadu_si256((const __m256i*)(data+i-7 ))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q5, _mm256_loadu_si256((const __m256i*)(data+i-6 ))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q4, _mm256_loadu_si256((const __m256i*)(data+i-5 ))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q3, _mm256_loadu_si256((const __m256i*)(data+i-4 ))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q2, _mm256_loadu_si256((const __m256i*)(data+i-3 ))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q1, _mm256_loadu_si256((const __m256i*)(data+i-2 ))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q0, _mm256_loadu_si256((const __m256i*)(data+i-1 ))); summ = _mm256_add_epi32(summ, mull); + summ = _mm256_sra_epi32(summ, cnt); + _mm256_storeu_si256((__m256i*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(data+i)), summ)); + } + } + else { /* order == 9 */ + __m256i q0, q1, q2, q3, q4, q5, q6, q7, q8; + q0 = _mm256_set1_epi32(0xffff & qlp_coeff[0 ]); + q1 = _mm256_set1_epi32(0xffff & qlp_coeff[1 ]); + q2 = _mm256_set1_epi32(0xffff & qlp_coeff[2 ]); + q3 = _mm256_set1_epi32(0xffff & qlp_coeff[3 ]); + q4 = _mm256_set1_epi32(0xffff & qlp_coeff[4 ]); + q5 = _mm256_set1_epi32(0xffff & qlp_coeff[5 ]); + q6 = _mm256_set1_epi32(0xffff & qlp_coeff[6 ]); + q7 = _mm256_set1_epi32(0xffff & qlp_coeff[7 ]); + q8 = _mm256_set1_epi32(0xffff & qlp_coeff[8 ]); + + for(i = 0; i < (int)data_len-7; i+=8) { + __m256i summ, mull; + summ = _mm256_madd_epi16(q8, _mm256_loadu_si256((const __m256i*)(data+i-9 ))); + mull = _mm256_madd_epi16(q7, _mm256_loadu_si256((const __m256i*)(data+i-8 ))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q6, _mm256_loadu_si256((const __m256i*)(data+i-7 ))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q5, _mm256_loadu_si256((const __m256i*)(data+i-6 ))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q4, _mm256_loadu_si256((const __m256i*)(data+i-5 ))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q3, _mm256_loadu_si256((const __m256i*)(data+i-4 ))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q2, _mm256_loadu_si256((const __m256i*)(data+i-3 ))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q1, _mm256_loadu_si256((const __m256i*)(data+i-2 ))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q0, _mm256_loadu_si256((const __m256i*)(data+i-1 ))); summ = _mm256_add_epi32(summ, mull); + summ = _mm256_sra_epi32(summ, cnt); + _mm256_storeu_si256((__m256i*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(data+i)), summ)); + } + } + } + } + else if(order > 4) { + if(order > 6) { + if(order == 8) { + __m256i q0, q1, q2, q3, q4, q5, q6, q7; + q0 = _mm256_set1_epi32(0xffff & qlp_coeff[0 ]); + q1 = _mm256_set1_epi32(0xffff & qlp_coeff[1 ]); + q2 = _mm256_set1_epi32(0xffff & qlp_coeff[2 ]); + q3 = _mm256_set1_epi32(0xffff & qlp_coeff[3 ]); + q4 = _mm256_set1_epi32(0xffff & qlp_coeff[4 ]); + q5 = _mm256_set1_epi32(0xffff & qlp_coeff[5 ]); + q6 = _mm256_set1_epi32(0xffff & qlp_coeff[6 ]); + q7 = _mm256_set1_epi32(0xffff & qlp_coeff[7 ]); + + for(i = 0; i < (int)data_len-7; i+=8) { + __m256i summ, mull; + summ = _mm256_madd_epi16(q7, _mm256_loadu_si256((const __m256i*)(data+i-8 ))); + mull = _mm256_madd_epi16(q6, _mm256_loadu_si256((const __m256i*)(data+i-7 ))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q5, _mm256_loadu_si256((const __m256i*)(data+i-6 ))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q4, _mm256_loadu_si256((const __m256i*)(data+i-5 ))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q3, _mm256_loadu_si256((const __m256i*)(data+i-4 ))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q2, _mm256_loadu_si256((const __m256i*)(data+i-3 ))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q1, _mm256_loadu_si256((const __m256i*)(data+i-2 ))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q0, _mm256_loadu_si256((const __m256i*)(data+i-1 ))); summ = _mm256_add_epi32(summ, mull); + summ = _mm256_sra_epi32(summ, cnt); + _mm256_storeu_si256((__m256i*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(data+i)), summ)); + } + } + else { /* order == 7 */ + __m256i q0, q1, q2, q3, q4, q5, q6; + q0 = _mm256_set1_epi32(0xffff & qlp_coeff[0 ]); + q1 = _mm256_set1_epi32(0xffff & qlp_coeff[1 ]); + q2 = _mm256_set1_epi32(0xffff & qlp_coeff[2 ]); + q3 = _mm256_set1_epi32(0xffff & qlp_coeff[3 ]); + q4 = _mm256_set1_epi32(0xffff & qlp_coeff[4 ]); + q5 = _mm256_set1_epi32(0xffff & qlp_coeff[5 ]); + q6 = _mm256_set1_epi32(0xffff & qlp_coeff[6 ]); + + for(i = 0; i < (int)data_len-7; i+=8) { + __m256i summ, mull; + summ = _mm256_madd_epi16(q6, _mm256_loadu_si256((const __m256i*)(data+i-7 ))); + mull = _mm256_madd_epi16(q5, _mm256_loadu_si256((const __m256i*)(data+i-6 ))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q4, _mm256_loadu_si256((const __m256i*)(data+i-5 ))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q3, _mm256_loadu_si256((const __m256i*)(data+i-4 ))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q2, _mm256_loadu_si256((const __m256i*)(data+i-3 ))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q1, _mm256_loadu_si256((const __m256i*)(data+i-2 ))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q0, _mm256_loadu_si256((const __m256i*)(data+i-1 ))); summ = _mm256_add_epi32(summ, mull); + summ = _mm256_sra_epi32(summ, cnt); + _mm256_storeu_si256((__m256i*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(data+i)), summ)); + } + } + } + else { + if(order == 6) { + __m256i q0, q1, q2, q3, q4, q5; + q0 = _mm256_set1_epi32(0xffff & qlp_coeff[0 ]); + q1 = _mm256_set1_epi32(0xffff & qlp_coeff[1 ]); + q2 = _mm256_set1_epi32(0xffff & qlp_coeff[2 ]); + q3 = _mm256_set1_epi32(0xffff & qlp_coeff[3 ]); + q4 = _mm256_set1_epi32(0xffff & qlp_coeff[4 ]); + q5 = _mm256_set1_epi32(0xffff & qlp_coeff[5 ]); + + for(i = 0; i < (int)data_len-7; i+=8) { + __m256i summ, mull; + summ = _mm256_madd_epi16(q5, _mm256_loadu_si256((const __m256i*)(data+i-6 ))); + mull = _mm256_madd_epi16(q4, _mm256_loadu_si256((const __m256i*)(data+i-5 ))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q3, _mm256_loadu_si256((const __m256i*)(data+i-4 ))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q2, _mm256_loadu_si256((const __m256i*)(data+i-3 ))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q1, _mm256_loadu_si256((const __m256i*)(data+i-2 ))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q0, _mm256_loadu_si256((const __m256i*)(data+i-1 ))); summ = _mm256_add_epi32(summ, mull); + summ = _mm256_sra_epi32(summ, cnt); + _mm256_storeu_si256((__m256i*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(data+i)), summ)); + } + } + else { /* order == 5 */ + __m256i q0, q1, q2, q3, q4; + q0 = _mm256_set1_epi32(0xffff & qlp_coeff[0 ]); + q1 = _mm256_set1_epi32(0xffff & qlp_coeff[1 ]); + q2 = _mm256_set1_epi32(0xffff & qlp_coeff[2 ]); + q3 = _mm256_set1_epi32(0xffff & qlp_coeff[3 ]); + q4 = _mm256_set1_epi32(0xffff & qlp_coeff[4 ]); + + for(i = 0; i < (int)data_len-7; i+=8) { + __m256i summ, mull; + summ = _mm256_madd_epi16(q4, _mm256_loadu_si256((const __m256i*)(data+i-5 ))); + mull = _mm256_madd_epi16(q3, _mm256_loadu_si256((const __m256i*)(data+i-4 ))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q2, _mm256_loadu_si256((const __m256i*)(data+i-3 ))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q1, _mm256_loadu_si256((const __m256i*)(data+i-2 ))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q0, _mm256_loadu_si256((const __m256i*)(data+i-1 ))); summ = _mm256_add_epi32(summ, mull); + summ = _mm256_sra_epi32(summ, cnt); + _mm256_storeu_si256((__m256i*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(data+i)), summ)); + } + } + } + } + else { + if(order > 2) { + if(order == 4) { + __m256i q0, q1, q2, q3; + q0 = _mm256_set1_epi32(0xffff & qlp_coeff[0 ]); + q1 = _mm256_set1_epi32(0xffff & qlp_coeff[1 ]); + q2 = _mm256_set1_epi32(0xffff & qlp_coeff[2 ]); + q3 = _mm256_set1_epi32(0xffff & qlp_coeff[3 ]); + + for(i = 0; i < (int)data_len-7; i+=8) { + __m256i summ, mull; + summ = _mm256_madd_epi16(q3, _mm256_loadu_si256((const __m256i*)(data+i-4 ))); + mull = _mm256_madd_epi16(q2, _mm256_loadu_si256((const __m256i*)(data+i-3 ))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q1, _mm256_loadu_si256((const __m256i*)(data+i-2 ))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q0, _mm256_loadu_si256((const __m256i*)(data+i-1 ))); summ = _mm256_add_epi32(summ, mull); + summ = _mm256_sra_epi32(summ, cnt); + _mm256_storeu_si256((__m256i*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(data+i)), summ)); + } + } + else { /* order == 3 */ + __m256i q0, q1, q2; + q0 = _mm256_set1_epi32(0xffff & qlp_coeff[0 ]); + q1 = _mm256_set1_epi32(0xffff & qlp_coeff[1 ]); + q2 = _mm256_set1_epi32(0xffff & qlp_coeff[2 ]); + + for(i = 0; i < (int)data_len-7; i+=8) { + __m256i summ, mull; + summ = _mm256_madd_epi16(q2, _mm256_loadu_si256((const __m256i*)(data+i-3 ))); + mull = _mm256_madd_epi16(q1, _mm256_loadu_si256((const __m256i*)(data+i-2 ))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_madd_epi16(q0, _mm256_loadu_si256((const __m256i*)(data+i-1 ))); summ = _mm256_add_epi32(summ, mull); + summ = _mm256_sra_epi32(summ, cnt); + _mm256_storeu_si256((__m256i*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(data+i)), summ)); + } + } + } + else { + if(order == 2) { + __m256i q0, q1; + q0 = _mm256_set1_epi32(0xffff & qlp_coeff[0 ]); + q1 = _mm256_set1_epi32(0xffff & qlp_coeff[1 ]); + + for(i = 0; i < (int)data_len-7; i+=8) { + __m256i summ, mull; + summ = _mm256_madd_epi16(q1, _mm256_loadu_si256((const __m256i*)(data+i-2 ))); + mull = _mm256_madd_epi16(q0, _mm256_loadu_si256((const __m256i*)(data+i-1 ))); summ = _mm256_add_epi32(summ, mull); + summ = _mm256_sra_epi32(summ, cnt); + _mm256_storeu_si256((__m256i*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(data+i)), summ)); + } + } + else { /* order == 1 */ + __m256i q0; + q0 = _mm256_set1_epi32(0xffff & qlp_coeff[0 ]); + + for(i = 0; i < (int)data_len-7; i+=8) { + __m256i summ; + summ = _mm256_madd_epi16(q0, _mm256_loadu_si256((const __m256i*)(data+i-1 ))); + summ = _mm256_sra_epi32(summ, cnt); + _mm256_storeu_si256((__m256i*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(data+i)), summ)); + } + } + } + } + for(; i < (int)data_len; i++) { + sum = 0; + switch(order) { + case 12: sum += qlp_coeff[11] * data[i-12]; + case 11: sum += qlp_coeff[10] * data[i-11]; + case 10: sum += qlp_coeff[ 9] * data[i-10]; + case 9: sum += qlp_coeff[ 8] * data[i- 9]; + case 8: sum += qlp_coeff[ 7] * data[i- 8]; + case 7: sum += qlp_coeff[ 6] * data[i- 7]; + case 6: sum += qlp_coeff[ 5] * data[i- 6]; + case 5: sum += qlp_coeff[ 4] * data[i- 5]; + case 4: sum += qlp_coeff[ 3] * data[i- 4]; + case 3: sum += qlp_coeff[ 2] * data[i- 3]; + case 2: sum += qlp_coeff[ 1] * data[i- 2]; + case 1: sum += qlp_coeff[ 0] * data[i- 1]; + } + residual[i] = data[i] - (sum >> lp_quantization); + } + } + else { /* order > 12 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + switch(order) { + case 32: sum += qlp_coeff[31] * data[i-32]; + case 31: sum += qlp_coeff[30] * data[i-31]; + case 30: sum += qlp_coeff[29] * data[i-30]; + case 29: sum += qlp_coeff[28] * data[i-29]; + case 28: sum += qlp_coeff[27] * data[i-28]; + case 27: sum += qlp_coeff[26] * data[i-27]; + case 26: sum += qlp_coeff[25] * data[i-26]; + case 25: sum += qlp_coeff[24] * data[i-25]; + case 24: sum += qlp_coeff[23] * data[i-24]; + case 23: sum += qlp_coeff[22] * data[i-23]; + case 22: sum += qlp_coeff[21] * data[i-22]; + case 21: sum += qlp_coeff[20] * data[i-21]; + case 20: sum += qlp_coeff[19] * data[i-20]; + case 19: sum += qlp_coeff[18] * data[i-19]; + case 18: sum += qlp_coeff[17] * data[i-18]; + case 17: sum += qlp_coeff[16] * data[i-17]; + case 16: sum += qlp_coeff[15] * data[i-16]; + case 15: sum += qlp_coeff[14] * data[i-15]; + case 14: sum += qlp_coeff[13] * data[i-14]; + case 13: sum += qlp_coeff[12] * data[i-13]; + sum += qlp_coeff[11] * data[i-12]; + sum += qlp_coeff[10] * data[i-11]; + sum += qlp_coeff[ 9] * data[i-10]; + sum += qlp_coeff[ 8] * data[i- 9]; + sum += qlp_coeff[ 7] * data[i- 8]; + sum += qlp_coeff[ 6] * data[i- 7]; + sum += qlp_coeff[ 5] * data[i- 6]; + sum += qlp_coeff[ 4] * data[i- 5]; + sum += qlp_coeff[ 3] * data[i- 4]; + sum += qlp_coeff[ 2] * data[i- 3]; + sum += qlp_coeff[ 1] * data[i- 2]; + sum += qlp_coeff[ 0] * data[i- 1]; + } + residual[i] = data[i] - (sum >> lp_quantization); + } + } + _mm256_zeroupper(); +} + +FLAC__SSE_TARGET("avx2") +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[]) +{ + int i; + FLAC__int32 sum; + __m128i cnt = _mm_cvtsi32_si128(lp_quantization); + + FLAC__ASSERT(order > 0); + FLAC__ASSERT(order <= 32); + + if(order <= 12) { + if(order > 8) { + if(order > 10) { + if(order == 12) { + __m256i q0, q1, q2, q3, q4, q5, q6, q7, q8, q9, q10, q11; + q0 = _mm256_set1_epi32(qlp_coeff[0 ]); + q1 = _mm256_set1_epi32(qlp_coeff[1 ]); + q2 = _mm256_set1_epi32(qlp_coeff[2 ]); + q3 = _mm256_set1_epi32(qlp_coeff[3 ]); + q4 = _mm256_set1_epi32(qlp_coeff[4 ]); + q5 = _mm256_set1_epi32(qlp_coeff[5 ]); + q6 = _mm256_set1_epi32(qlp_coeff[6 ]); + q7 = _mm256_set1_epi32(qlp_coeff[7 ]); + q8 = _mm256_set1_epi32(qlp_coeff[8 ]); + q9 = _mm256_set1_epi32(qlp_coeff[9 ]); + q10 = _mm256_set1_epi32(qlp_coeff[10]); + q11 = _mm256_set1_epi32(qlp_coeff[11]); + + for(i = 0; i < (int)data_len-7; i+=8) { + __m256i summ, mull; + summ = _mm256_mullo_epi32(q11, _mm256_loadu_si256((const __m256i*)(data+i-12))); + mull = _mm256_mullo_epi32(q10, _mm256_loadu_si256((const __m256i*)(data+i-11))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q9, _mm256_loadu_si256((const __m256i*)(data+i-10))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q8, _mm256_loadu_si256((const __m256i*)(data+i-9))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q7, _mm256_loadu_si256((const __m256i*)(data+i-8))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q6, _mm256_loadu_si256((const __m256i*)(data+i-7))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q5, _mm256_loadu_si256((const __m256i*)(data+i-6))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q4, _mm256_loadu_si256((const __m256i*)(data+i-5))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q3, _mm256_loadu_si256((const __m256i*)(data+i-4))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q2, _mm256_loadu_si256((const __m256i*)(data+i-3))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q1, _mm256_loadu_si256((const __m256i*)(data+i-2))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q0, _mm256_loadu_si256((const __m256i*)(data+i-1))); summ = _mm256_add_epi32(summ, mull); + summ = _mm256_sra_epi32(summ, cnt); + _mm256_storeu_si256((__m256i*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(data+i)), summ)); + } + } + else { /* order == 11 */ + __m256i q0, q1, q2, q3, q4, q5, q6, q7, q8, q9, q10; + q0 = _mm256_set1_epi32(qlp_coeff[0 ]); + q1 = _mm256_set1_epi32(qlp_coeff[1 ]); + q2 = _mm256_set1_epi32(qlp_coeff[2 ]); + q3 = _mm256_set1_epi32(qlp_coeff[3 ]); + q4 = _mm256_set1_epi32(qlp_coeff[4 ]); + q5 = _mm256_set1_epi32(qlp_coeff[5 ]); + q6 = _mm256_set1_epi32(qlp_coeff[6 ]); + q7 = _mm256_set1_epi32(qlp_coeff[7 ]); + q8 = _mm256_set1_epi32(qlp_coeff[8 ]); + q9 = _mm256_set1_epi32(qlp_coeff[9 ]); + q10 = _mm256_set1_epi32(qlp_coeff[10]); + + for(i = 0; i < (int)data_len-7; i+=8) { + __m256i summ, mull; + summ = _mm256_mullo_epi32(q10, _mm256_loadu_si256((const __m256i*)(data+i-11))); + mull = _mm256_mullo_epi32(q9, _mm256_loadu_si256((const __m256i*)(data+i-10))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q8, _mm256_loadu_si256((const __m256i*)(data+i-9))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q7, _mm256_loadu_si256((const __m256i*)(data+i-8))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q6, _mm256_loadu_si256((const __m256i*)(data+i-7))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q5, _mm256_loadu_si256((const __m256i*)(data+i-6))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q4, _mm256_loadu_si256((const __m256i*)(data+i-5))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q3, _mm256_loadu_si256((const __m256i*)(data+i-4))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q2, _mm256_loadu_si256((const __m256i*)(data+i-3))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q1, _mm256_loadu_si256((const __m256i*)(data+i-2))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q0, _mm256_loadu_si256((const __m256i*)(data+i-1))); summ = _mm256_add_epi32(summ, mull); + summ = _mm256_sra_epi32(summ, cnt); + _mm256_storeu_si256((__m256i*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(data+i)), summ)); + } + } + } + else { + if(order == 10) { + __m256i q0, q1, q2, q3, q4, q5, q6, q7, q8, q9; + q0 = _mm256_set1_epi32(qlp_coeff[0 ]); + q1 = _mm256_set1_epi32(qlp_coeff[1 ]); + q2 = _mm256_set1_epi32(qlp_coeff[2 ]); + q3 = _mm256_set1_epi32(qlp_coeff[3 ]); + q4 = _mm256_set1_epi32(qlp_coeff[4 ]); + q5 = _mm256_set1_epi32(qlp_coeff[5 ]); + q6 = _mm256_set1_epi32(qlp_coeff[6 ]); + q7 = _mm256_set1_epi32(qlp_coeff[7 ]); + q8 = _mm256_set1_epi32(qlp_coeff[8 ]); + q9 = _mm256_set1_epi32(qlp_coeff[9 ]); + + for(i = 0; i < (int)data_len-7; i+=8) { + __m256i summ, mull; + summ = _mm256_mullo_epi32(q9, _mm256_loadu_si256((const __m256i*)(data+i-10))); + mull = _mm256_mullo_epi32(q8, _mm256_loadu_si256((const __m256i*)(data+i-9))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q7, _mm256_loadu_si256((const __m256i*)(data+i-8))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q6, _mm256_loadu_si256((const __m256i*)(data+i-7))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q5, _mm256_loadu_si256((const __m256i*)(data+i-6))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q4, _mm256_loadu_si256((const __m256i*)(data+i-5))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q3, _mm256_loadu_si256((const __m256i*)(data+i-4))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q2, _mm256_loadu_si256((const __m256i*)(data+i-3))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q1, _mm256_loadu_si256((const __m256i*)(data+i-2))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q0, _mm256_loadu_si256((const __m256i*)(data+i-1))); summ = _mm256_add_epi32(summ, mull); + summ = _mm256_sra_epi32(summ, cnt); + _mm256_storeu_si256((__m256i*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(data+i)), summ)); + } + } + else { /* order == 9 */ + __m256i q0, q1, q2, q3, q4, q5, q6, q7, q8; + q0 = _mm256_set1_epi32(qlp_coeff[0 ]); + q1 = _mm256_set1_epi32(qlp_coeff[1 ]); + q2 = _mm256_set1_epi32(qlp_coeff[2 ]); + q3 = _mm256_set1_epi32(qlp_coeff[3 ]); + q4 = _mm256_set1_epi32(qlp_coeff[4 ]); + q5 = _mm256_set1_epi32(qlp_coeff[5 ]); + q6 = _mm256_set1_epi32(qlp_coeff[6 ]); + q7 = _mm256_set1_epi32(qlp_coeff[7 ]); + q8 = _mm256_set1_epi32(qlp_coeff[8 ]); + + for(i = 0; i < (int)data_len-7; i+=8) { + __m256i summ, mull; + summ = _mm256_mullo_epi32(q8, _mm256_loadu_si256((const __m256i*)(data+i-9))); + mull = _mm256_mullo_epi32(q7, _mm256_loadu_si256((const __m256i*)(data+i-8))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q6, _mm256_loadu_si256((const __m256i*)(data+i-7))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q5, _mm256_loadu_si256((const __m256i*)(data+i-6))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q4, _mm256_loadu_si256((const __m256i*)(data+i-5))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q3, _mm256_loadu_si256((const __m256i*)(data+i-4))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q2, _mm256_loadu_si256((const __m256i*)(data+i-3))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q1, _mm256_loadu_si256((const __m256i*)(data+i-2))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q0, _mm256_loadu_si256((const __m256i*)(data+i-1))); summ = _mm256_add_epi32(summ, mull); + summ = _mm256_sra_epi32(summ, cnt); + _mm256_storeu_si256((__m256i*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(data+i)), summ)); + } + } + } + } + else if(order > 4) { + if(order > 6) { + if(order == 8) { + __m256i q0, q1, q2, q3, q4, q5, q6, q7; + q0 = _mm256_set1_epi32(qlp_coeff[0 ]); + q1 = _mm256_set1_epi32(qlp_coeff[1 ]); + q2 = _mm256_set1_epi32(qlp_coeff[2 ]); + q3 = _mm256_set1_epi32(qlp_coeff[3 ]); + q4 = _mm256_set1_epi32(qlp_coeff[4 ]); + q5 = _mm256_set1_epi32(qlp_coeff[5 ]); + q6 = _mm256_set1_epi32(qlp_coeff[6 ]); + q7 = _mm256_set1_epi32(qlp_coeff[7 ]); + + for(i = 0; i < (int)data_len-7; i+=8) { + __m256i summ, mull; + summ = _mm256_mullo_epi32(q7, _mm256_loadu_si256((const __m256i*)(data+i-8))); + mull = _mm256_mullo_epi32(q6, _mm256_loadu_si256((const __m256i*)(data+i-7))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q5, _mm256_loadu_si256((const __m256i*)(data+i-6))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q4, _mm256_loadu_si256((const __m256i*)(data+i-5))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q3, _mm256_loadu_si256((const __m256i*)(data+i-4))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q2, _mm256_loadu_si256((const __m256i*)(data+i-3))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q1, _mm256_loadu_si256((const __m256i*)(data+i-2))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q0, _mm256_loadu_si256((const __m256i*)(data+i-1))); summ = _mm256_add_epi32(summ, mull); + summ = _mm256_sra_epi32(summ, cnt); + _mm256_storeu_si256((__m256i*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(data+i)), summ)); + } + } + else { /* order == 7 */ + __m256i q0, q1, q2, q3, q4, q5, q6; + q0 = _mm256_set1_epi32(qlp_coeff[0 ]); + q1 = _mm256_set1_epi32(qlp_coeff[1 ]); + q2 = _mm256_set1_epi32(qlp_coeff[2 ]); + q3 = _mm256_set1_epi32(qlp_coeff[3 ]); + q4 = _mm256_set1_epi32(qlp_coeff[4 ]); + q5 = _mm256_set1_epi32(qlp_coeff[5 ]); + q6 = _mm256_set1_epi32(qlp_coeff[6 ]); + + for(i = 0; i < (int)data_len-7; i+=8) { + __m256i summ, mull; + summ = _mm256_mullo_epi32(q6, _mm256_loadu_si256((const __m256i*)(data+i-7))); + mull = _mm256_mullo_epi32(q5, _mm256_loadu_si256((const __m256i*)(data+i-6))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q4, _mm256_loadu_si256((const __m256i*)(data+i-5))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q3, _mm256_loadu_si256((const __m256i*)(data+i-4))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q2, _mm256_loadu_si256((const __m256i*)(data+i-3))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q1, _mm256_loadu_si256((const __m256i*)(data+i-2))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q0, _mm256_loadu_si256((const __m256i*)(data+i-1))); summ = _mm256_add_epi32(summ, mull); + summ = _mm256_sra_epi32(summ, cnt); + _mm256_storeu_si256((__m256i*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(data+i)), summ)); + } + } + } + else { + if(order == 6) { + __m256i q0, q1, q2, q3, q4, q5; + q0 = _mm256_set1_epi32(qlp_coeff[0 ]); + q1 = _mm256_set1_epi32(qlp_coeff[1 ]); + q2 = _mm256_set1_epi32(qlp_coeff[2 ]); + q3 = _mm256_set1_epi32(qlp_coeff[3 ]); + q4 = _mm256_set1_epi32(qlp_coeff[4 ]); + q5 = _mm256_set1_epi32(qlp_coeff[5 ]); + + for(i = 0; i < (int)data_len-7; i+=8) { + __m256i summ, mull; + summ = _mm256_mullo_epi32(q5, _mm256_loadu_si256((const __m256i*)(data+i-6))); + mull = _mm256_mullo_epi32(q4, _mm256_loadu_si256((const __m256i*)(data+i-5))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q3, _mm256_loadu_si256((const __m256i*)(data+i-4))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q2, _mm256_loadu_si256((const __m256i*)(data+i-3))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q1, _mm256_loadu_si256((const __m256i*)(data+i-2))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q0, _mm256_loadu_si256((const __m256i*)(data+i-1))); summ = _mm256_add_epi32(summ, mull); + summ = _mm256_sra_epi32(summ, cnt); + _mm256_storeu_si256((__m256i*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(data+i)), summ)); + } + } + else { /* order == 5 */ + __m256i q0, q1, q2, q3, q4; + q0 = _mm256_set1_epi32(qlp_coeff[0 ]); + q1 = _mm256_set1_epi32(qlp_coeff[1 ]); + q2 = _mm256_set1_epi32(qlp_coeff[2 ]); + q3 = _mm256_set1_epi32(qlp_coeff[3 ]); + q4 = _mm256_set1_epi32(qlp_coeff[4 ]); + + for(i = 0; i < (int)data_len-7; i+=8) { + __m256i summ, mull; + summ = _mm256_mullo_epi32(q4, _mm256_loadu_si256((const __m256i*)(data+i-5))); + mull = _mm256_mullo_epi32(q3, _mm256_loadu_si256((const __m256i*)(data+i-4))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q2, _mm256_loadu_si256((const __m256i*)(data+i-3))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q1, _mm256_loadu_si256((const __m256i*)(data+i-2))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q0, _mm256_loadu_si256((const __m256i*)(data+i-1))); summ = _mm256_add_epi32(summ, mull); + summ = _mm256_sra_epi32(summ, cnt); + _mm256_storeu_si256((__m256i*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(data+i)), summ)); + } + } + } + } + else { + if(order > 2) { + if(order == 4) { + __m256i q0, q1, q2, q3; + q0 = _mm256_set1_epi32(qlp_coeff[0 ]); + q1 = _mm256_set1_epi32(qlp_coeff[1 ]); + q2 = _mm256_set1_epi32(qlp_coeff[2 ]); + q3 = _mm256_set1_epi32(qlp_coeff[3 ]); + + for(i = 0; i < (int)data_len-7; i+=8) { + __m256i summ, mull; + summ = _mm256_mullo_epi32(q3, _mm256_loadu_si256((const __m256i*)(data+i-4))); + mull = _mm256_mullo_epi32(q2, _mm256_loadu_si256((const __m256i*)(data+i-3))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q1, _mm256_loadu_si256((const __m256i*)(data+i-2))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q0, _mm256_loadu_si256((const __m256i*)(data+i-1))); summ = _mm256_add_epi32(summ, mull); + summ = _mm256_sra_epi32(summ, cnt); + _mm256_storeu_si256((__m256i*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(data+i)), summ)); + } + } + else { /* order == 3 */ + __m256i q0, q1, q2; + q0 = _mm256_set1_epi32(qlp_coeff[0 ]); + q1 = _mm256_set1_epi32(qlp_coeff[1 ]); + q2 = _mm256_set1_epi32(qlp_coeff[2 ]); + + for(i = 0; i < (int)data_len-7; i+=8) { + __m256i summ, mull; + summ = _mm256_mullo_epi32(q2, _mm256_loadu_si256((const __m256i*)(data+i-3))); + mull = _mm256_mullo_epi32(q1, _mm256_loadu_si256((const __m256i*)(data+i-2))); summ = _mm256_add_epi32(summ, mull); + mull = _mm256_mullo_epi32(q0, _mm256_loadu_si256((const __m256i*)(data+i-1))); summ = _mm256_add_epi32(summ, mull); + summ = _mm256_sra_epi32(summ, cnt); + _mm256_storeu_si256((__m256i*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(data+i)), summ)); + } + } + } + else { + if(order == 2) { + __m256i q0, q1; + q0 = _mm256_set1_epi32(qlp_coeff[0 ]); + q1 = _mm256_set1_epi32(qlp_coeff[1 ]); + + for(i = 0; i < (int)data_len-7; i+=8) { + __m256i summ, mull; + summ = _mm256_mullo_epi32(q1, _mm256_loadu_si256((const __m256i*)(data+i-2))); + mull = _mm256_mullo_epi32(q0, _mm256_loadu_si256((const __m256i*)(data+i-1))); summ = _mm256_add_epi32(summ, mull); + summ = _mm256_sra_epi32(summ, cnt); + _mm256_storeu_si256((__m256i*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(data+i)), summ)); + } + } + else { /* order == 1 */ + __m256i q0; + q0 = _mm256_set1_epi32(qlp_coeff[0 ]); + + for(i = 0; i < (int)data_len-7; i+=8) { + __m256i summ; + summ = _mm256_mullo_epi32(q0, _mm256_loadu_si256((const __m256i*)(data+i-1))); + summ = _mm256_sra_epi32(summ, cnt); + _mm256_storeu_si256((__m256i*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(data+i)), summ)); + } + } + } + } + for(; i < (int)data_len; i++) { + sum = 0; + switch(order) { + case 12: sum += qlp_coeff[11] * data[i-12]; + case 11: sum += qlp_coeff[10] * data[i-11]; + case 10: sum += qlp_coeff[ 9] * data[i-10]; + case 9: sum += qlp_coeff[ 8] * data[i- 9]; + case 8: sum += qlp_coeff[ 7] * data[i- 8]; + case 7: sum += qlp_coeff[ 6] * data[i- 7]; + case 6: sum += qlp_coeff[ 5] * data[i- 6]; + case 5: sum += qlp_coeff[ 4] * data[i- 5]; + case 4: sum += qlp_coeff[ 3] * data[i- 4]; + case 3: sum += qlp_coeff[ 2] * data[i- 3]; + case 2: sum += qlp_coeff[ 1] * data[i- 2]; + case 1: sum += qlp_coeff[ 0] * data[i- 1]; + } + residual[i] = data[i] - (sum >> lp_quantization); + } + } + else { /* order > 12 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + switch(order) { + case 32: sum += qlp_coeff[31] * data[i-32]; + case 31: sum += qlp_coeff[30] * data[i-31]; + case 30: sum += qlp_coeff[29] * data[i-30]; + case 29: sum += qlp_coeff[28] * data[i-29]; + case 28: sum += qlp_coeff[27] * data[i-28]; + case 27: sum += qlp_coeff[26] * data[i-27]; + case 26: sum += qlp_coeff[25] * data[i-26]; + case 25: sum += qlp_coeff[24] * data[i-25]; + case 24: sum += qlp_coeff[23] * data[i-24]; + case 23: sum += qlp_coeff[22] * data[i-23]; + case 22: sum += qlp_coeff[21] * data[i-22]; + case 21: sum += qlp_coeff[20] * data[i-21]; + case 20: sum += qlp_coeff[19] * data[i-20]; + case 19: sum += qlp_coeff[18] * data[i-19]; + case 18: sum += qlp_coeff[17] * data[i-18]; + case 17: sum += qlp_coeff[16] * data[i-17]; + case 16: sum += qlp_coeff[15] * data[i-16]; + case 15: sum += qlp_coeff[14] * data[i-15]; + case 14: sum += qlp_coeff[13] * data[i-14]; + case 13: sum += qlp_coeff[12] * data[i-13]; + sum += qlp_coeff[11] * data[i-12]; + sum += qlp_coeff[10] * data[i-11]; + sum += qlp_coeff[ 9] * data[i-10]; + sum += qlp_coeff[ 8] * data[i- 9]; + sum += qlp_coeff[ 7] * data[i- 8]; + sum += qlp_coeff[ 6] * data[i- 7]; + sum += qlp_coeff[ 5] * data[i- 6]; + sum += qlp_coeff[ 4] * data[i- 5]; + sum += qlp_coeff[ 3] * data[i- 4]; + sum += qlp_coeff[ 2] * data[i- 3]; + sum += qlp_coeff[ 1] * data[i- 2]; + sum += qlp_coeff[ 0] * data[i- 1]; + } + residual[i] = data[i] - (sum >> lp_quantization); + } + } + _mm256_zeroupper(); +} + +static FLAC__int32 pack_arr[8] = { 0, 2, 4, 6, 1, 3, 5, 7 }; + +FLAC__SSE_TARGET("avx2") +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[]) +{ + int i; + FLAC__int64 sum; + __m128i cnt = _mm_cvtsi32_si128(lp_quantization); + __m256i pack = _mm256_loadu_si256((const __m256i *)pack_arr); + + FLAC__ASSERT(order > 0); + FLAC__ASSERT(order <= 32); + FLAC__ASSERT(lp_quantization <= 32); /* there's no _mm256_sra_epi64() so we have to use _mm256_srl_epi64() */ + + if(order <= 12) { + if(order > 8) { + if(order > 10) { + if(order == 12) { + __m256i q0, q1, q2, q3, q4, q5, q6, q7, q8, q9, q10, q11; + q0 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[0 ])); + q1 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[1 ])); + q2 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[2 ])); + q3 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[3 ])); + q4 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[4 ])); + q5 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[5 ])); + q6 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[6 ])); + q7 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[7 ])); + q8 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[8 ])); + q9 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[9 ])); + q10 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[10])); + q11 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[11])); + + for(i = 0; i < (int)data_len-3; i+=4) { + __m256i summ, mull; + summ = _mm256_mul_epi32(q11, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-12)))); + mull = _mm256_mul_epi32(q10, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-11)))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q9, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-10)))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q8, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-9 )))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q7, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-8 )))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q6, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-7 )))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q5, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-6 )))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q4, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-5 )))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q3, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-4 )))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q2, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-3 )))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q1, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-2 )))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q0, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-1 )))); summ = _mm256_add_epi64(summ, mull); + summ = _mm256_permutevar8x32_epi32(_mm256_srl_epi64(summ, cnt), pack); + _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), _mm256_castsi256_si128(summ))); + } + } + else { /* order == 11 */ + __m256i q0, q1, q2, q3, q4, q5, q6, q7, q8, q9, q10; + q0 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[0 ])); + q1 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[1 ])); + q2 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[2 ])); + q3 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[3 ])); + q4 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[4 ])); + q5 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[5 ])); + q6 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[6 ])); + q7 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[7 ])); + q8 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[8 ])); + q9 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[9 ])); + q10 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[10])); + + for(i = 0; i < (int)data_len-3; i+=4) { + __m256i summ, mull; + summ = _mm256_mul_epi32(q10, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-11)))); + mull = _mm256_mul_epi32(q9, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-10)))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q8, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-9 )))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q7, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-8 )))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q6, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-7 )))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q5, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-6 )))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q4, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-5 )))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q3, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-4 )))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q2, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-3 )))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q1, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-2 )))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q0, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-1 )))); summ = _mm256_add_epi64(summ, mull); + summ = _mm256_permutevar8x32_epi32(_mm256_srl_epi64(summ, cnt), pack); + _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), _mm256_castsi256_si128(summ))); + } + } + } + else { + if(order == 10) { + __m256i q0, q1, q2, q3, q4, q5, q6, q7, q8, q9; + q0 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[0 ])); + q1 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[1 ])); + q2 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[2 ])); + q3 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[3 ])); + q4 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[4 ])); + q5 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[5 ])); + q6 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[6 ])); + q7 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[7 ])); + q8 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[8 ])); + q9 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[9 ])); + + for(i = 0; i < (int)data_len-3; i+=4) { + __m256i summ, mull; + summ = _mm256_mul_epi32(q9, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-10)))); + mull = _mm256_mul_epi32(q8, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-9 )))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q7, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-8 )))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q6, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-7 )))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q5, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-6 )))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q4, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-5 )))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q3, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-4 )))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q2, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-3 )))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q1, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-2 )))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q0, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-1 )))); summ = _mm256_add_epi64(summ, mull); + summ = _mm256_permutevar8x32_epi32(_mm256_srl_epi64(summ, cnt), pack); + _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), _mm256_castsi256_si128(summ))); + } + } + else { /* order == 9 */ + __m256i q0, q1, q2, q3, q4, q5, q6, q7, q8; + q0 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[0 ])); + q1 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[1 ])); + q2 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[2 ])); + q3 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[3 ])); + q4 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[4 ])); + q5 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[5 ])); + q6 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[6 ])); + q7 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[7 ])); + q8 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[8 ])); + + for(i = 0; i < (int)data_len-3; i+=4) { + __m256i summ, mull; + summ = _mm256_mul_epi32(q8, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-9 )))); + mull = _mm256_mul_epi32(q7, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-8 )))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q6, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-7 )))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q5, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-6 )))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q4, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-5 )))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q3, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-4 )))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q2, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-3 )))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q1, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-2 )))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q0, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-1 )))); summ = _mm256_add_epi64(summ, mull); + summ = _mm256_permutevar8x32_epi32(_mm256_srl_epi64(summ, cnt), pack); + _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), _mm256_castsi256_si128(summ))); + } + } + } + } + else if(order > 4) { + if(order > 6) { + if(order == 8) { + __m256i q0, q1, q2, q3, q4, q5, q6, q7; + q0 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[0 ])); + q1 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[1 ])); + q2 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[2 ])); + q3 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[3 ])); + q4 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[4 ])); + q5 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[5 ])); + q6 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[6 ])); + q7 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[7 ])); + + for(i = 0; i < (int)data_len-3; i+=4) { + __m256i summ, mull; + summ = _mm256_mul_epi32(q7, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-8 )))); + mull = _mm256_mul_epi32(q6, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-7 )))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q5, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-6 )))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q4, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-5 )))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q3, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-4 )))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q2, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-3 )))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q1, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-2 )))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q0, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-1 )))); summ = _mm256_add_epi64(summ, mull); + summ = _mm256_permutevar8x32_epi32(_mm256_srl_epi64(summ, cnt), pack); + _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), _mm256_castsi256_si128(summ))); + } + } + else { /* order == 7 */ + __m256i q0, q1, q2, q3, q4, q5, q6; + q0 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[0 ])); + q1 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[1 ])); + q2 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[2 ])); + q3 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[3 ])); + q4 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[4 ])); + q5 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[5 ])); + q6 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[6 ])); + + for(i = 0; i < (int)data_len-3; i+=4) { + __m256i summ, mull; + summ = _mm256_mul_epi32(q6, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-7 )))); + mull = _mm256_mul_epi32(q5, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-6 )))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q4, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-5 )))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q3, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-4 )))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q2, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-3 )))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q1, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-2 )))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q0, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-1 )))); summ = _mm256_add_epi64(summ, mull); + summ = _mm256_permutevar8x32_epi32(_mm256_srl_epi64(summ, cnt), pack); + _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), _mm256_castsi256_si128(summ))); + } + } + } + else { + if(order == 6) { + __m256i q0, q1, q2, q3, q4, q5; + q0 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[0 ])); + q1 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[1 ])); + q2 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[2 ])); + q3 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[3 ])); + q4 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[4 ])); + q5 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[5 ])); + + for(i = 0; i < (int)data_len-3; i+=4) { + __m256i summ, mull; + summ = _mm256_mul_epi32(q5, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-6 )))); + mull = _mm256_mul_epi32(q4, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-5 )))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q3, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-4 )))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q2, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-3 )))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q1, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-2 )))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q0, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-1 )))); summ = _mm256_add_epi64(summ, mull); + summ = _mm256_permutevar8x32_epi32(_mm256_srl_epi64(summ, cnt), pack); + _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), _mm256_castsi256_si128(summ))); + } + } + else { /* order == 5 */ + __m256i q0, q1, q2, q3, q4; + q0 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[0 ])); + q1 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[1 ])); + q2 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[2 ])); + q3 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[3 ])); + q4 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[4 ])); + + for(i = 0; i < (int)data_len-3; i+=4) { + __m256i summ, mull; + summ = _mm256_mul_epi32(q4, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-5 )))); + mull = _mm256_mul_epi32(q3, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-4 )))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q2, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-3 )))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q1, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-2 )))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q0, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-1 )))); summ = _mm256_add_epi64(summ, mull); + summ = _mm256_permutevar8x32_epi32(_mm256_srl_epi64(summ, cnt), pack); + _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), _mm256_castsi256_si128(summ))); + } + } + } + } + else { + if(order > 2) { + if(order == 4) { + __m256i q0, q1, q2, q3; + q0 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[0 ])); + q1 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[1 ])); + q2 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[2 ])); + q3 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[3 ])); + + for(i = 0; i < (int)data_len-3; i+=4) { + __m256i summ, mull; + summ = _mm256_mul_epi32(q3, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-4 )))); + mull = _mm256_mul_epi32(q2, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-3 )))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q1, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-2 )))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q0, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-1 )))); summ = _mm256_add_epi64(summ, mull); + summ = _mm256_permutevar8x32_epi32(_mm256_srl_epi64(summ, cnt), pack); + _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), _mm256_castsi256_si128(summ))); + } + } + else { /* order == 3 */ + __m256i q0, q1, q2; + q0 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[0 ])); + q1 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[1 ])); + q2 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[2 ])); + + for(i = 0; i < (int)data_len-3; i+=4) { + __m256i summ, mull; + summ = _mm256_mul_epi32(q2, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-3 )))); + mull = _mm256_mul_epi32(q1, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-2 )))); summ = _mm256_add_epi64(summ, mull); + mull = _mm256_mul_epi32(q0, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-1 )))); summ = _mm256_add_epi64(summ, mull); + summ = _mm256_permutevar8x32_epi32(_mm256_srl_epi64(summ, cnt), pack); + _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), _mm256_castsi256_si128(summ))); + } + } + } + else { + if(order == 2) { + __m256i q0, q1; + q0 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[0 ])); + q1 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[1 ])); + + for(i = 0; i < (int)data_len-3; i+=4) { + __m256i summ, mull; + summ = _mm256_mul_epi32(q1, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-2 )))); + mull = _mm256_mul_epi32(q0, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-1 )))); summ = _mm256_add_epi64(summ, mull); + summ = _mm256_permutevar8x32_epi32(_mm256_srl_epi64(summ, cnt), pack); + _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), _mm256_castsi256_si128(summ))); + } + } + else { /* order == 1 */ + __m256i q0; + q0 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[0 ])); + + for(i = 0; i < (int)data_len-3; i+=4) { + __m256i summ; + summ = _mm256_mul_epi32(q0, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-1 )))); + summ = _mm256_permutevar8x32_epi32(_mm256_srl_epi64(summ, cnt), pack); + _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), _mm256_castsi256_si128(summ))); + } + } + } + } + for(; i < (int)data_len; i++) { + sum = 0; + switch(order) { + case 12: sum += qlp_coeff[11] * (FLAC__int64)data[i-12]; + case 11: sum += qlp_coeff[10] * (FLAC__int64)data[i-11]; + case 10: sum += qlp_coeff[ 9] * (FLAC__int64)data[i-10]; + case 9: sum += qlp_coeff[ 8] * (FLAC__int64)data[i- 9]; + case 8: sum += qlp_coeff[ 7] * (FLAC__int64)data[i- 8]; + case 7: sum += qlp_coeff[ 6] * (FLAC__int64)data[i- 7]; + case 6: sum += qlp_coeff[ 5] * (FLAC__int64)data[i- 6]; + case 5: sum += qlp_coeff[ 4] * (FLAC__int64)data[i- 5]; + case 4: sum += qlp_coeff[ 3] * (FLAC__int64)data[i- 4]; + case 3: sum += qlp_coeff[ 2] * (FLAC__int64)data[i- 3]; + case 2: sum += qlp_coeff[ 1] * (FLAC__int64)data[i- 2]; + case 1: sum += qlp_coeff[ 0] * (FLAC__int64)data[i- 1]; + } + residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); + } + } + else { /* order > 12 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + switch(order) { + case 32: sum += qlp_coeff[31] * (FLAC__int64)data[i-32]; + case 31: sum += qlp_coeff[30] * (FLAC__int64)data[i-31]; + case 30: sum += qlp_coeff[29] * (FLAC__int64)data[i-30]; + case 29: sum += qlp_coeff[28] * (FLAC__int64)data[i-29]; + case 28: sum += qlp_coeff[27] * (FLAC__int64)data[i-28]; + case 27: sum += qlp_coeff[26] * (FLAC__int64)data[i-27]; + case 26: sum += qlp_coeff[25] * (FLAC__int64)data[i-26]; + case 25: sum += qlp_coeff[24] * (FLAC__int64)data[i-25]; + case 24: sum += qlp_coeff[23] * (FLAC__int64)data[i-24]; + case 23: sum += qlp_coeff[22] * (FLAC__int64)data[i-23]; + case 22: sum += qlp_coeff[21] * (FLAC__int64)data[i-22]; + case 21: sum += qlp_coeff[20] * (FLAC__int64)data[i-21]; + case 20: sum += qlp_coeff[19] * (FLAC__int64)data[i-20]; + case 19: sum += qlp_coeff[18] * (FLAC__int64)data[i-19]; + case 18: sum += qlp_coeff[17] * (FLAC__int64)data[i-18]; + case 17: sum += qlp_coeff[16] * (FLAC__int64)data[i-17]; + case 16: sum += qlp_coeff[15] * (FLAC__int64)data[i-16]; + case 15: sum += qlp_coeff[14] * (FLAC__int64)data[i-15]; + case 14: sum += qlp_coeff[13] * (FLAC__int64)data[i-14]; + case 13: sum += qlp_coeff[12] * (FLAC__int64)data[i-13]; + sum += qlp_coeff[11] * (FLAC__int64)data[i-12]; + sum += qlp_coeff[10] * (FLAC__int64)data[i-11]; + sum += qlp_coeff[ 9] * (FLAC__int64)data[i-10]; + sum += qlp_coeff[ 8] * (FLAC__int64)data[i- 9]; + sum += qlp_coeff[ 7] * (FLAC__int64)data[i- 8]; + sum += qlp_coeff[ 6] * (FLAC__int64)data[i- 7]; + sum += qlp_coeff[ 5] * (FLAC__int64)data[i- 6]; + sum += qlp_coeff[ 4] * (FLAC__int64)data[i- 5]; + sum += qlp_coeff[ 3] * (FLAC__int64)data[i- 4]; + sum += qlp_coeff[ 2] * (FLAC__int64)data[i- 3]; + sum += qlp_coeff[ 1] * (FLAC__int64)data[i- 2]; + sum += qlp_coeff[ 0] * (FLAC__int64)data[i- 1]; + } + residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); + } + } + _mm256_zeroupper(); +} + +#endif /* FLAC__AVX2_SUPPORTED */ +#endif /* (FLAC__CPU_IA32 || FLAC__CPU_X86_64) && FLAC__HAS_X86INTRIN */ +#endif /* FLAC__NO_ASM */ +#endif /* FLAC__INTEGER_ONLY_LIBRARY */ diff --git a/core/cd_hw/libchdr/deps/libFLAC/lpc_intrin_sse.c b/core/cd_hw/libchdr/deps/libFLAC/lpc_intrin_sse.c new file mode 100644 index 0000000..430e73f --- /dev/null +++ b/core/cd_hw/libchdr/deps/libFLAC/lpc_intrin_sse.c @@ -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 +#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 /* 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 */ diff --git a/core/cd_hw/libchdr/deps/libFLAC/lpc_intrin_sse2.c b/core/cd_hw/libchdr/deps/libFLAC/lpc_intrin_sse2.c new file mode 100644 index 0000000..1383394 --- /dev/null +++ b/core/cd_hw/libchdr/deps/libFLAC/lpc_intrin_sse2.c @@ -0,0 +1,1090 @@ +/* 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 +#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__SSE2_SUPPORTED + +#include "FLAC/assert.h" +#include "FLAC/format.h" + +#include /* SSE2 */ + +#define RESIDUAL16_RESULT(xmmN) curr = *data++; *residual++ = curr - (_mm_cvtsi128_si32(xmmN) >> lp_quantization); +#define DATA16_RESULT(xmmN) curr = *residual++ + (_mm_cvtsi128_si32(xmmN) >> lp_quantization); *data++ = curr; + +#define RESIDUAL32_RESULT(xmmN) residual[i] = data[i] - (_mm_cvtsi128_si32(xmmN) >> lp_quantization); +#define DATA32_RESULT(xmmN) data[i] = residual[i] + (_mm_cvtsi128_si32(xmmN) >> lp_quantization); + +FLAC__SSE_TARGET("sse2") +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[]) +{ + int i; + FLAC__int32 sum; + __m128i cnt = _mm_cvtsi32_si128(lp_quantization); + + FLAC__ASSERT(order > 0); + FLAC__ASSERT(order <= 32); + + if(order <= 12) { + if(order > 8) { + if(order > 10) { + if(order == 12) { + __m128i q0, q1, q2, q3, q4, q5, q6, q7, q8, q9, q10, q11; + q0 = _mm_cvtsi32_si128(0xffff & qlp_coeff[0]); q0 = _mm_shuffle_epi32(q0, _MM_SHUFFLE(0,0,0,0)); + q1 = _mm_cvtsi32_si128(0xffff & qlp_coeff[1]); q1 = _mm_shuffle_epi32(q1, _MM_SHUFFLE(0,0,0,0)); + q2 = _mm_cvtsi32_si128(0xffff & qlp_coeff[2]); q2 = _mm_shuffle_epi32(q2, _MM_SHUFFLE(0,0,0,0)); + q3 = _mm_cvtsi32_si128(0xffff & qlp_coeff[3]); q3 = _mm_shuffle_epi32(q3, _MM_SHUFFLE(0,0,0,0)); + q4 = _mm_cvtsi32_si128(0xffff & qlp_coeff[4]); q4 = _mm_shuffle_epi32(q4, _MM_SHUFFLE(0,0,0,0)); + q5 = _mm_cvtsi32_si128(0xffff & qlp_coeff[5]); q5 = _mm_shuffle_epi32(q5, _MM_SHUFFLE(0,0,0,0)); + q6 = _mm_cvtsi32_si128(0xffff & qlp_coeff[6]); q6 = _mm_shuffle_epi32(q6, _MM_SHUFFLE(0,0,0,0)); + q7 = _mm_cvtsi32_si128(0xffff & qlp_coeff[7]); q7 = _mm_shuffle_epi32(q7, _MM_SHUFFLE(0,0,0,0)); + q8 = _mm_cvtsi32_si128(0xffff & qlp_coeff[8]); q8 = _mm_shuffle_epi32(q8, _MM_SHUFFLE(0,0,0,0)); + q9 = _mm_cvtsi32_si128(0xffff & qlp_coeff[9]); q9 = _mm_shuffle_epi32(q9, _MM_SHUFFLE(0,0,0,0)); + q10 = _mm_cvtsi32_si128(0xffff & qlp_coeff[10]); q10 = _mm_shuffle_epi32(q10, _MM_SHUFFLE(0,0,0,0)); + q11 = _mm_cvtsi32_si128(0xffff & qlp_coeff[11]); q11 = _mm_shuffle_epi32(q11, _MM_SHUFFLE(0,0,0,0)); + + for(i = 0; i < (int)data_len-3; i+=4) { + __m128i summ, mull; + summ = _mm_madd_epi16(q11, _mm_loadu_si128((const __m128i*)(data+i-12))); + mull = _mm_madd_epi16(q10, _mm_loadu_si128((const __m128i*)(data+i-11))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q9, _mm_loadu_si128((const __m128i*)(data+i-10))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q8, _mm_loadu_si128((const __m128i*)(data+i-9))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q7, _mm_loadu_si128((const __m128i*)(data+i-8))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q6, _mm_loadu_si128((const __m128i*)(data+i-7))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q5, _mm_loadu_si128((const __m128i*)(data+i-6))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q4, _mm_loadu_si128((const __m128i*)(data+i-5))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q3, _mm_loadu_si128((const __m128i*)(data+i-4))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q2, _mm_loadu_si128((const __m128i*)(data+i-3))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q1, _mm_loadu_si128((const __m128i*)(data+i-2))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q0, _mm_loadu_si128((const __m128i*)(data+i-1))); summ = _mm_add_epi32(summ, mull); + summ = _mm_sra_epi32(summ, cnt); + _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), summ)); + } + } + else { /* order == 11 */ + __m128i q0, q1, q2, q3, q4, q5, q6, q7, q8, q9, q10; + q0 = _mm_cvtsi32_si128(0xffff & qlp_coeff[0]); q0 = _mm_shuffle_epi32(q0, _MM_SHUFFLE(0,0,0,0)); + q1 = _mm_cvtsi32_si128(0xffff & qlp_coeff[1]); q1 = _mm_shuffle_epi32(q1, _MM_SHUFFLE(0,0,0,0)); + q2 = _mm_cvtsi32_si128(0xffff & qlp_coeff[2]); q2 = _mm_shuffle_epi32(q2, _MM_SHUFFLE(0,0,0,0)); + q3 = _mm_cvtsi32_si128(0xffff & qlp_coeff[3]); q3 = _mm_shuffle_epi32(q3, _MM_SHUFFLE(0,0,0,0)); + q4 = _mm_cvtsi32_si128(0xffff & qlp_coeff[4]); q4 = _mm_shuffle_epi32(q4, _MM_SHUFFLE(0,0,0,0)); + q5 = _mm_cvtsi32_si128(0xffff & qlp_coeff[5]); q5 = _mm_shuffle_epi32(q5, _MM_SHUFFLE(0,0,0,0)); + q6 = _mm_cvtsi32_si128(0xffff & qlp_coeff[6]); q6 = _mm_shuffle_epi32(q6, _MM_SHUFFLE(0,0,0,0)); + q7 = _mm_cvtsi32_si128(0xffff & qlp_coeff[7]); q7 = _mm_shuffle_epi32(q7, _MM_SHUFFLE(0,0,0,0)); + q8 = _mm_cvtsi32_si128(0xffff & qlp_coeff[8]); q8 = _mm_shuffle_epi32(q8, _MM_SHUFFLE(0,0,0,0)); + q9 = _mm_cvtsi32_si128(0xffff & qlp_coeff[9]); q9 = _mm_shuffle_epi32(q9, _MM_SHUFFLE(0,0,0,0)); + q10 = _mm_cvtsi32_si128(0xffff & qlp_coeff[10]); q10 = _mm_shuffle_epi32(q10, _MM_SHUFFLE(0,0,0,0)); + + for(i = 0; i < (int)data_len-3; i+=4) { + __m128i summ, mull; + summ = _mm_madd_epi16(q10, _mm_loadu_si128((const __m128i*)(data+i-11))); + mull = _mm_madd_epi16(q9, _mm_loadu_si128((const __m128i*)(data+i-10))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q8, _mm_loadu_si128((const __m128i*)(data+i-9))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q7, _mm_loadu_si128((const __m128i*)(data+i-8))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q6, _mm_loadu_si128((const __m128i*)(data+i-7))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q5, _mm_loadu_si128((const __m128i*)(data+i-6))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q4, _mm_loadu_si128((const __m128i*)(data+i-5))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q3, _mm_loadu_si128((const __m128i*)(data+i-4))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q2, _mm_loadu_si128((const __m128i*)(data+i-3))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q1, _mm_loadu_si128((const __m128i*)(data+i-2))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q0, _mm_loadu_si128((const __m128i*)(data+i-1))); summ = _mm_add_epi32(summ, mull); + summ = _mm_sra_epi32(summ, cnt); + _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), summ)); + } + } + } + else { + if(order == 10) { + __m128i q0, q1, q2, q3, q4, q5, q6, q7, q8, q9; + q0 = _mm_cvtsi32_si128(0xffff & qlp_coeff[0]); q0 = _mm_shuffle_epi32(q0, _MM_SHUFFLE(0,0,0,0)); + q1 = _mm_cvtsi32_si128(0xffff & qlp_coeff[1]); q1 = _mm_shuffle_epi32(q1, _MM_SHUFFLE(0,0,0,0)); + q2 = _mm_cvtsi32_si128(0xffff & qlp_coeff[2]); q2 = _mm_shuffle_epi32(q2, _MM_SHUFFLE(0,0,0,0)); + q3 = _mm_cvtsi32_si128(0xffff & qlp_coeff[3]); q3 = _mm_shuffle_epi32(q3, _MM_SHUFFLE(0,0,0,0)); + q4 = _mm_cvtsi32_si128(0xffff & qlp_coeff[4]); q4 = _mm_shuffle_epi32(q4, _MM_SHUFFLE(0,0,0,0)); + q5 = _mm_cvtsi32_si128(0xffff & qlp_coeff[5]); q5 = _mm_shuffle_epi32(q5, _MM_SHUFFLE(0,0,0,0)); + q6 = _mm_cvtsi32_si128(0xffff & qlp_coeff[6]); q6 = _mm_shuffle_epi32(q6, _MM_SHUFFLE(0,0,0,0)); + q7 = _mm_cvtsi32_si128(0xffff & qlp_coeff[7]); q7 = _mm_shuffle_epi32(q7, _MM_SHUFFLE(0,0,0,0)); + q8 = _mm_cvtsi32_si128(0xffff & qlp_coeff[8]); q8 = _mm_shuffle_epi32(q8, _MM_SHUFFLE(0,0,0,0)); + q9 = _mm_cvtsi32_si128(0xffff & qlp_coeff[9]); q9 = _mm_shuffle_epi32(q9, _MM_SHUFFLE(0,0,0,0)); + + for(i = 0; i < (int)data_len-3; i+=4) { + __m128i summ, mull; + summ = _mm_madd_epi16(q9, _mm_loadu_si128((const __m128i*)(data+i-10))); + mull = _mm_madd_epi16(q8, _mm_loadu_si128((const __m128i*)(data+i-9))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q7, _mm_loadu_si128((const __m128i*)(data+i-8))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q6, _mm_loadu_si128((const __m128i*)(data+i-7))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q5, _mm_loadu_si128((const __m128i*)(data+i-6))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q4, _mm_loadu_si128((const __m128i*)(data+i-5))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q3, _mm_loadu_si128((const __m128i*)(data+i-4))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q2, _mm_loadu_si128((const __m128i*)(data+i-3))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q1, _mm_loadu_si128((const __m128i*)(data+i-2))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q0, _mm_loadu_si128((const __m128i*)(data+i-1))); summ = _mm_add_epi32(summ, mull); + summ = _mm_sra_epi32(summ, cnt); + _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), summ)); + } + } + else { /* order == 9 */ + __m128i q0, q1, q2, q3, q4, q5, q6, q7, q8; + q0 = _mm_cvtsi32_si128(0xffff & qlp_coeff[0]); q0 = _mm_shuffle_epi32(q0, _MM_SHUFFLE(0,0,0,0)); + q1 = _mm_cvtsi32_si128(0xffff & qlp_coeff[1]); q1 = _mm_shuffle_epi32(q1, _MM_SHUFFLE(0,0,0,0)); + q2 = _mm_cvtsi32_si128(0xffff & qlp_coeff[2]); q2 = _mm_shuffle_epi32(q2, _MM_SHUFFLE(0,0,0,0)); + q3 = _mm_cvtsi32_si128(0xffff & qlp_coeff[3]); q3 = _mm_shuffle_epi32(q3, _MM_SHUFFLE(0,0,0,0)); + q4 = _mm_cvtsi32_si128(0xffff & qlp_coeff[4]); q4 = _mm_shuffle_epi32(q4, _MM_SHUFFLE(0,0,0,0)); + q5 = _mm_cvtsi32_si128(0xffff & qlp_coeff[5]); q5 = _mm_shuffle_epi32(q5, _MM_SHUFFLE(0,0,0,0)); + q6 = _mm_cvtsi32_si128(0xffff & qlp_coeff[6]); q6 = _mm_shuffle_epi32(q6, _MM_SHUFFLE(0,0,0,0)); + q7 = _mm_cvtsi32_si128(0xffff & qlp_coeff[7]); q7 = _mm_shuffle_epi32(q7, _MM_SHUFFLE(0,0,0,0)); + q8 = _mm_cvtsi32_si128(0xffff & qlp_coeff[8]); q8 = _mm_shuffle_epi32(q8, _MM_SHUFFLE(0,0,0,0)); + + for(i = 0; i < (int)data_len-3; i+=4) { + __m128i summ, mull; + summ = _mm_madd_epi16(q8, _mm_loadu_si128((const __m128i*)(data+i-9))); + mull = _mm_madd_epi16(q7, _mm_loadu_si128((const __m128i*)(data+i-8))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q6, _mm_loadu_si128((const __m128i*)(data+i-7))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q5, _mm_loadu_si128((const __m128i*)(data+i-6))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q4, _mm_loadu_si128((const __m128i*)(data+i-5))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q3, _mm_loadu_si128((const __m128i*)(data+i-4))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q2, _mm_loadu_si128((const __m128i*)(data+i-3))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q1, _mm_loadu_si128((const __m128i*)(data+i-2))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q0, _mm_loadu_si128((const __m128i*)(data+i-1))); summ = _mm_add_epi32(summ, mull); + summ = _mm_sra_epi32(summ, cnt); + _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), summ)); + } + } + } + } + else if(order > 4) { + if(order > 6) { + if(order == 8) { + __m128i q0, q1, q2, q3, q4, q5, q6, q7; + q0 = _mm_cvtsi32_si128(0xffff & qlp_coeff[0]); q0 = _mm_shuffle_epi32(q0, _MM_SHUFFLE(0,0,0,0)); + q1 = _mm_cvtsi32_si128(0xffff & qlp_coeff[1]); q1 = _mm_shuffle_epi32(q1, _MM_SHUFFLE(0,0,0,0)); + q2 = _mm_cvtsi32_si128(0xffff & qlp_coeff[2]); q2 = _mm_shuffle_epi32(q2, _MM_SHUFFLE(0,0,0,0)); + q3 = _mm_cvtsi32_si128(0xffff & qlp_coeff[3]); q3 = _mm_shuffle_epi32(q3, _MM_SHUFFLE(0,0,0,0)); + q4 = _mm_cvtsi32_si128(0xffff & qlp_coeff[4]); q4 = _mm_shuffle_epi32(q4, _MM_SHUFFLE(0,0,0,0)); + q5 = _mm_cvtsi32_si128(0xffff & qlp_coeff[5]); q5 = _mm_shuffle_epi32(q5, _MM_SHUFFLE(0,0,0,0)); + q6 = _mm_cvtsi32_si128(0xffff & qlp_coeff[6]); q6 = _mm_shuffle_epi32(q6, _MM_SHUFFLE(0,0,0,0)); + q7 = _mm_cvtsi32_si128(0xffff & qlp_coeff[7]); q7 = _mm_shuffle_epi32(q7, _MM_SHUFFLE(0,0,0,0)); + + for(i = 0; i < (int)data_len-3; i+=4) { + __m128i summ, mull; + summ = _mm_madd_epi16(q7, _mm_loadu_si128((const __m128i*)(data+i-8))); + mull = _mm_madd_epi16(q6, _mm_loadu_si128((const __m128i*)(data+i-7))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q5, _mm_loadu_si128((const __m128i*)(data+i-6))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q4, _mm_loadu_si128((const __m128i*)(data+i-5))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q3, _mm_loadu_si128((const __m128i*)(data+i-4))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q2, _mm_loadu_si128((const __m128i*)(data+i-3))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q1, _mm_loadu_si128((const __m128i*)(data+i-2))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q0, _mm_loadu_si128((const __m128i*)(data+i-1))); summ = _mm_add_epi32(summ, mull); + summ = _mm_sra_epi32(summ, cnt); + _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), summ)); + } + } + else { /* order == 7 */ + __m128i q0, q1, q2, q3, q4, q5, q6; + q0 = _mm_cvtsi32_si128(0xffff & qlp_coeff[0]); q0 = _mm_shuffle_epi32(q0, _MM_SHUFFLE(0,0,0,0)); + q1 = _mm_cvtsi32_si128(0xffff & qlp_coeff[1]); q1 = _mm_shuffle_epi32(q1, _MM_SHUFFLE(0,0,0,0)); + q2 = _mm_cvtsi32_si128(0xffff & qlp_coeff[2]); q2 = _mm_shuffle_epi32(q2, _MM_SHUFFLE(0,0,0,0)); + q3 = _mm_cvtsi32_si128(0xffff & qlp_coeff[3]); q3 = _mm_shuffle_epi32(q3, _MM_SHUFFLE(0,0,0,0)); + q4 = _mm_cvtsi32_si128(0xffff & qlp_coeff[4]); q4 = _mm_shuffle_epi32(q4, _MM_SHUFFLE(0,0,0,0)); + q5 = _mm_cvtsi32_si128(0xffff & qlp_coeff[5]); q5 = _mm_shuffle_epi32(q5, _MM_SHUFFLE(0,0,0,0)); + q6 = _mm_cvtsi32_si128(0xffff & qlp_coeff[6]); q6 = _mm_shuffle_epi32(q6, _MM_SHUFFLE(0,0,0,0)); + + for(i = 0; i < (int)data_len-3; i+=4) { + __m128i summ, mull; + summ = _mm_madd_epi16(q6, _mm_loadu_si128((const __m128i*)(data+i-7))); + mull = _mm_madd_epi16(q5, _mm_loadu_si128((const __m128i*)(data+i-6))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q4, _mm_loadu_si128((const __m128i*)(data+i-5))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q3, _mm_loadu_si128((const __m128i*)(data+i-4))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q2, _mm_loadu_si128((const __m128i*)(data+i-3))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q1, _mm_loadu_si128((const __m128i*)(data+i-2))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q0, _mm_loadu_si128((const __m128i*)(data+i-1))); summ = _mm_add_epi32(summ, mull); + summ = _mm_sra_epi32(summ, cnt); + _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), summ)); + } + } + } + else { + if(order == 6) { + __m128i q0, q1, q2, q3, q4, q5; + q0 = _mm_cvtsi32_si128(0xffff & qlp_coeff[0]); q0 = _mm_shuffle_epi32(q0, _MM_SHUFFLE(0,0,0,0)); + q1 = _mm_cvtsi32_si128(0xffff & qlp_coeff[1]); q1 = _mm_shuffle_epi32(q1, _MM_SHUFFLE(0,0,0,0)); + q2 = _mm_cvtsi32_si128(0xffff & qlp_coeff[2]); q2 = _mm_shuffle_epi32(q2, _MM_SHUFFLE(0,0,0,0)); + q3 = _mm_cvtsi32_si128(0xffff & qlp_coeff[3]); q3 = _mm_shuffle_epi32(q3, _MM_SHUFFLE(0,0,0,0)); + q4 = _mm_cvtsi32_si128(0xffff & qlp_coeff[4]); q4 = _mm_shuffle_epi32(q4, _MM_SHUFFLE(0,0,0,0)); + q5 = _mm_cvtsi32_si128(0xffff & qlp_coeff[5]); q5 = _mm_shuffle_epi32(q5, _MM_SHUFFLE(0,0,0,0)); + + for(i = 0; i < (int)data_len-3; i+=4) { + __m128i summ, mull; + summ = _mm_madd_epi16(q5, _mm_loadu_si128((const __m128i*)(data+i-6))); + mull = _mm_madd_epi16(q4, _mm_loadu_si128((const __m128i*)(data+i-5))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q3, _mm_loadu_si128((const __m128i*)(data+i-4))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q2, _mm_loadu_si128((const __m128i*)(data+i-3))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q1, _mm_loadu_si128((const __m128i*)(data+i-2))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q0, _mm_loadu_si128((const __m128i*)(data+i-1))); summ = _mm_add_epi32(summ, mull); + summ = _mm_sra_epi32(summ, cnt); + _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), summ)); + } + } + else { /* order == 5 */ + __m128i q0, q1, q2, q3, q4; + q0 = _mm_cvtsi32_si128(0xffff & qlp_coeff[0]); q0 = _mm_shuffle_epi32(q0, _MM_SHUFFLE(0,0,0,0)); + q1 = _mm_cvtsi32_si128(0xffff & qlp_coeff[1]); q1 = _mm_shuffle_epi32(q1, _MM_SHUFFLE(0,0,0,0)); + q2 = _mm_cvtsi32_si128(0xffff & qlp_coeff[2]); q2 = _mm_shuffle_epi32(q2, _MM_SHUFFLE(0,0,0,0)); + q3 = _mm_cvtsi32_si128(0xffff & qlp_coeff[3]); q3 = _mm_shuffle_epi32(q3, _MM_SHUFFLE(0,0,0,0)); + q4 = _mm_cvtsi32_si128(0xffff & qlp_coeff[4]); q4 = _mm_shuffle_epi32(q4, _MM_SHUFFLE(0,0,0,0)); + + for(i = 0; i < (int)data_len-3; i+=4) { + __m128i summ, mull; + summ = _mm_madd_epi16(q4, _mm_loadu_si128((const __m128i*)(data+i-5))); + mull = _mm_madd_epi16(q3, _mm_loadu_si128((const __m128i*)(data+i-4))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q2, _mm_loadu_si128((const __m128i*)(data+i-3))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q1, _mm_loadu_si128((const __m128i*)(data+i-2))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q0, _mm_loadu_si128((const __m128i*)(data+i-1))); summ = _mm_add_epi32(summ, mull); + summ = _mm_sra_epi32(summ, cnt); + _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), summ)); + } + } + } + } + else { + if(order > 2) { + if(order == 4) { + __m128i q0, q1, q2, q3; + q0 = _mm_cvtsi32_si128(0xffff & qlp_coeff[0]); q0 = _mm_shuffle_epi32(q0, _MM_SHUFFLE(0,0,0,0)); + q1 = _mm_cvtsi32_si128(0xffff & qlp_coeff[1]); q1 = _mm_shuffle_epi32(q1, _MM_SHUFFLE(0,0,0,0)); + q2 = _mm_cvtsi32_si128(0xffff & qlp_coeff[2]); q2 = _mm_shuffle_epi32(q2, _MM_SHUFFLE(0,0,0,0)); + q3 = _mm_cvtsi32_si128(0xffff & qlp_coeff[3]); q3 = _mm_shuffle_epi32(q3, _MM_SHUFFLE(0,0,0,0)); + + for(i = 0; i < (int)data_len-3; i+=4) { + __m128i summ, mull; + summ = _mm_madd_epi16(q3, _mm_loadu_si128((const __m128i*)(data+i-4))); + mull = _mm_madd_epi16(q2, _mm_loadu_si128((const __m128i*)(data+i-3))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q1, _mm_loadu_si128((const __m128i*)(data+i-2))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q0, _mm_loadu_si128((const __m128i*)(data+i-1))); summ = _mm_add_epi32(summ, mull); + summ = _mm_sra_epi32(summ, cnt); + _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), summ)); + } + } + else { /* order == 3 */ + __m128i q0, q1, q2; + q0 = _mm_cvtsi32_si128(0xffff & qlp_coeff[0]); q0 = _mm_shuffle_epi32(q0, _MM_SHUFFLE(0,0,0,0)); + q1 = _mm_cvtsi32_si128(0xffff & qlp_coeff[1]); q1 = _mm_shuffle_epi32(q1, _MM_SHUFFLE(0,0,0,0)); + q2 = _mm_cvtsi32_si128(0xffff & qlp_coeff[2]); q2 = _mm_shuffle_epi32(q2, _MM_SHUFFLE(0,0,0,0)); + + for(i = 0; i < (int)data_len-3; i+=4) { + __m128i summ, mull; + summ = _mm_madd_epi16(q2, _mm_loadu_si128((const __m128i*)(data+i-3))); + mull = _mm_madd_epi16(q1, _mm_loadu_si128((const __m128i*)(data+i-2))); summ = _mm_add_epi32(summ, mull); + mull = _mm_madd_epi16(q0, _mm_loadu_si128((const __m128i*)(data+i-1))); summ = _mm_add_epi32(summ, mull); + summ = _mm_sra_epi32(summ, cnt); + _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), summ)); + } + } + } + else { + if(order == 2) { + __m128i q0, q1; + q0 = _mm_cvtsi32_si128(0xffff & qlp_coeff[0]); q0 = _mm_shuffle_epi32(q0, _MM_SHUFFLE(0,0,0,0)); + q1 = _mm_cvtsi32_si128(0xffff & qlp_coeff[1]); q1 = _mm_shuffle_epi32(q1, _MM_SHUFFLE(0,0,0,0)); + + for(i = 0; i < (int)data_len-3; i+=4) { + __m128i summ, mull; + summ = _mm_madd_epi16(q1, _mm_loadu_si128((const __m128i*)(data+i-2))); + mull = _mm_madd_epi16(q0, _mm_loadu_si128((const __m128i*)(data+i-1))); summ = _mm_add_epi32(summ, mull); + summ = _mm_sra_epi32(summ, cnt); + _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), summ)); + } + } + else { /* order == 1 */ + __m128i q0; + q0 = _mm_cvtsi32_si128(0xffff & qlp_coeff[0]); q0 = _mm_shuffle_epi32(q0, _MM_SHUFFLE(0,0,0,0)); + + for(i = 0; i < (int)data_len-3; i+=4) { + __m128i summ; + summ = _mm_madd_epi16(q0, _mm_loadu_si128((const __m128i*)(data+i-1))); + summ = _mm_sra_epi32(summ, cnt); + _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), summ)); + } + } + } + } + for(; i < (int)data_len; i++) { + sum = 0; + switch(order) { + case 12: sum += qlp_coeff[11] * data[i-12]; + case 11: sum += qlp_coeff[10] * data[i-11]; + case 10: sum += qlp_coeff[ 9] * data[i-10]; + case 9: sum += qlp_coeff[ 8] * data[i- 9]; + case 8: sum += qlp_coeff[ 7] * data[i- 8]; + case 7: sum += qlp_coeff[ 6] * data[i- 7]; + case 6: sum += qlp_coeff[ 5] * data[i- 6]; + case 5: sum += qlp_coeff[ 4] * data[i- 5]; + case 4: sum += qlp_coeff[ 3] * data[i- 4]; + case 3: sum += qlp_coeff[ 2] * data[i- 3]; + case 2: sum += qlp_coeff[ 1] * data[i- 2]; + case 1: sum += qlp_coeff[ 0] * data[i- 1]; + } + residual[i] = data[i] - (sum >> lp_quantization); + } + } + else { /* order > 12 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + switch(order) { + case 32: sum += qlp_coeff[31] * data[i-32]; + case 31: sum += qlp_coeff[30] * data[i-31]; + case 30: sum += qlp_coeff[29] * data[i-30]; + case 29: sum += qlp_coeff[28] * data[i-29]; + case 28: sum += qlp_coeff[27] * data[i-28]; + case 27: sum += qlp_coeff[26] * data[i-27]; + case 26: sum += qlp_coeff[25] * data[i-26]; + case 25: sum += qlp_coeff[24] * data[i-25]; + case 24: sum += qlp_coeff[23] * data[i-24]; + case 23: sum += qlp_coeff[22] * data[i-23]; + case 22: sum += qlp_coeff[21] * data[i-22]; + case 21: sum += qlp_coeff[20] * data[i-21]; + case 20: sum += qlp_coeff[19] * data[i-20]; + case 19: sum += qlp_coeff[18] * data[i-19]; + case 18: sum += qlp_coeff[17] * data[i-18]; + case 17: sum += qlp_coeff[16] * data[i-17]; + case 16: sum += qlp_coeff[15] * data[i-16]; + case 15: sum += qlp_coeff[14] * data[i-15]; + case 14: sum += qlp_coeff[13] * data[i-14]; + case 13: sum += qlp_coeff[12] * data[i-13]; + sum += qlp_coeff[11] * data[i-12]; + sum += qlp_coeff[10] * data[i-11]; + sum += qlp_coeff[ 9] * data[i-10]; + sum += qlp_coeff[ 8] * data[i- 9]; + sum += qlp_coeff[ 7] * data[i- 8]; + sum += qlp_coeff[ 6] * data[i- 7]; + sum += qlp_coeff[ 5] * data[i- 6]; + sum += qlp_coeff[ 4] * data[i- 5]; + sum += qlp_coeff[ 3] * data[i- 4]; + sum += qlp_coeff[ 2] * data[i- 3]; + sum += qlp_coeff[ 1] * data[i- 2]; + sum += qlp_coeff[ 0] * data[i- 1]; + } + residual[i] = data[i] - (sum >> lp_quantization); + } + } +} + +FLAC__SSE_TARGET("sse2") +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[]) +{ + int i; + + FLAC__ASSERT(order > 0); + FLAC__ASSERT(order <= 32); + + if(order <= 12) { + if(order > 8) { /* order == 9, 10, 11, 12 */ + if(order > 10) { /* order == 11, 12 */ + if(order == 12) { + __m128i xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7; + xmm0 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+0)); // 0 0 q[1] q[0] + xmm1 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+2)); // 0 0 q[3] q[2] + xmm2 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+4)); // 0 0 q[5] q[4] + xmm3 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+6)); // 0 0 q[7] q[6] + xmm4 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+8)); // 0 0 q[9] q[8] + xmm5 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+10)); // 0 0 q[11] q[10] + + xmm0 = _mm_shuffle_epi32(xmm0, _MM_SHUFFLE(3,1,2,0)); // 0 q[1] 0 q[0] + xmm1 = _mm_shuffle_epi32(xmm1, _MM_SHUFFLE(3,1,2,0)); // 0 q[3] 0 q[2] + xmm2 = _mm_shuffle_epi32(xmm2, _MM_SHUFFLE(3,1,2,0)); // 0 q[5] 0 q[4] + xmm3 = _mm_shuffle_epi32(xmm3, _MM_SHUFFLE(3,1,2,0)); // 0 q[7] 0 q[6] + xmm4 = _mm_shuffle_epi32(xmm4, _MM_SHUFFLE(3,1,2,0)); // 0 q[9] 0 q[8] + xmm5 = _mm_shuffle_epi32(xmm5, _MM_SHUFFLE(3,1,2,0)); // 0 q[11] 0 q[10] + + for(i = 0; i < (int)data_len; i++) { + //sum = 0; + //sum += qlp_coeff[11] * data[i-12]; + //sum += qlp_coeff[10] * data[i-11]; + xmm7 = _mm_loadl_epi64((const __m128i*)(data+i-12)); // 0 0 d[i-11] d[i-12] + xmm7 = _mm_shuffle_epi32(xmm7, _MM_SHUFFLE(2,0,3,1)); // 0 d[i-12] 0 d[i-11] + xmm7 = _mm_mul_epu32(xmm7, xmm5); /* we use _unsigned_ multiplication and discard high dword of the result values */ + + //sum += qlp_coeff[9] * data[i-10]; + //sum += qlp_coeff[8] * data[i-9]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-10)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epu32(xmm6, xmm4); + xmm7 = _mm_add_epi32(xmm7, xmm6); + + //sum += qlp_coeff[7] * data[i-8]; + //sum += qlp_coeff[6] * data[i-7]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-8)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epu32(xmm6, xmm3); + xmm7 = _mm_add_epi32(xmm7, xmm6); + + //sum += qlp_coeff[5] * data[i-6]; + //sum += qlp_coeff[4] * data[i-5]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-6)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epu32(xmm6, xmm2); + xmm7 = _mm_add_epi32(xmm7, xmm6); + + //sum += qlp_coeff[3] * data[i-4]; + //sum += qlp_coeff[2] * data[i-3]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-4)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epu32(xmm6, xmm1); + xmm7 = _mm_add_epi32(xmm7, xmm6); + + //sum += qlp_coeff[1] * data[i-2]; + //sum += qlp_coeff[0] * data[i-1]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-2)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epu32(xmm6, xmm0); + xmm7 = _mm_add_epi32(xmm7, xmm6); + + xmm7 = _mm_add_epi32(xmm7, _mm_srli_si128(xmm7, 8)); + RESIDUAL32_RESULT(xmm7); + } + } + else { /* order == 11 */ + __m128i xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7; + xmm0 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+0)); + xmm1 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+2)); + xmm2 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+4)); + xmm3 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+6)); + xmm4 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+8)); + xmm5 = _mm_cvtsi32_si128(qlp_coeff[10]); + + xmm0 = _mm_shuffle_epi32(xmm0, _MM_SHUFFLE(3,1,2,0)); + xmm1 = _mm_shuffle_epi32(xmm1, _MM_SHUFFLE(3,1,2,0)); + xmm2 = _mm_shuffle_epi32(xmm2, _MM_SHUFFLE(3,1,2,0)); + xmm3 = _mm_shuffle_epi32(xmm3, _MM_SHUFFLE(3,1,2,0)); + xmm4 = _mm_shuffle_epi32(xmm4, _MM_SHUFFLE(3,1,2,0)); + + for(i = 0; i < (int)data_len; i++) { + //sum = 0; + //sum = qlp_coeff[10] * data[i-11]; + xmm7 = _mm_cvtsi32_si128(data[i-11]); + xmm7 = _mm_mul_epu32(xmm7, xmm5); + + //sum += qlp_coeff[9] * data[i-10]; + //sum += qlp_coeff[8] * data[i-9]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-10)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epu32(xmm6, xmm4); + xmm7 = _mm_add_epi32(xmm7, xmm6); + + //sum += qlp_coeff[7] * data[i-8]; + //sum += qlp_coeff[6] * data[i-7]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-8)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epu32(xmm6, xmm3); + xmm7 = _mm_add_epi32(xmm7, xmm6); + + //sum += qlp_coeff[5] * data[i-6]; + //sum += qlp_coeff[4] * data[i-5]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-6)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epu32(xmm6, xmm2); + xmm7 = _mm_add_epi32(xmm7, xmm6); + + //sum += qlp_coeff[3] * data[i-4]; + //sum += qlp_coeff[2] * data[i-3]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-4)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epu32(xmm6, xmm1); + xmm7 = _mm_add_epi32(xmm7, xmm6); + + //sum += qlp_coeff[1] * data[i-2]; + //sum += qlp_coeff[0] * data[i-1]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-2)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epu32(xmm6, xmm0); + xmm7 = _mm_add_epi32(xmm7, xmm6); + + xmm7 = _mm_add_epi32(xmm7, _mm_srli_si128(xmm7, 8)); + RESIDUAL32_RESULT(xmm7); + } + } + } + else { /* order == 9, 10 */ + if(order == 10) { + __m128i xmm0, xmm1, xmm2, xmm3, xmm4, xmm6, xmm7; + xmm0 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+0)); + xmm1 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+2)); + xmm2 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+4)); + xmm3 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+6)); + xmm4 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+8)); + + xmm0 = _mm_shuffle_epi32(xmm0, _MM_SHUFFLE(3,1,2,0)); + xmm1 = _mm_shuffle_epi32(xmm1, _MM_SHUFFLE(3,1,2,0)); + xmm2 = _mm_shuffle_epi32(xmm2, _MM_SHUFFLE(3,1,2,0)); + xmm3 = _mm_shuffle_epi32(xmm3, _MM_SHUFFLE(3,1,2,0)); + xmm4 = _mm_shuffle_epi32(xmm4, _MM_SHUFFLE(3,1,2,0)); + + for(i = 0; i < (int)data_len; i++) { + //sum = 0; + //sum += qlp_coeff[9] * data[i-10]; + //sum += qlp_coeff[8] * data[i-9]; + xmm7 = _mm_loadl_epi64((const __m128i*)(data+i-10)); + xmm7 = _mm_shuffle_epi32(xmm7, _MM_SHUFFLE(2,0,3,1)); + xmm7 = _mm_mul_epu32(xmm7, xmm4); + + //sum += qlp_coeff[7] * data[i-8]; + //sum += qlp_coeff[6] * data[i-7]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-8)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epu32(xmm6, xmm3); + xmm7 = _mm_add_epi32(xmm7, xmm6); + + //sum += qlp_coeff[5] * data[i-6]; + //sum += qlp_coeff[4] * data[i-5]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-6)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epu32(xmm6, xmm2); + xmm7 = _mm_add_epi32(xmm7, xmm6); + + //sum += qlp_coeff[3] * data[i-4]; + //sum += qlp_coeff[2] * data[i-3]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-4)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epu32(xmm6, xmm1); + xmm7 = _mm_add_epi32(xmm7, xmm6); + + //sum += qlp_coeff[1] * data[i-2]; + //sum += qlp_coeff[0] * data[i-1]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-2)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epu32(xmm6, xmm0); + xmm7 = _mm_add_epi32(xmm7, xmm6); + + xmm7 = _mm_add_epi32(xmm7, _mm_srli_si128(xmm7, 8)); + RESIDUAL32_RESULT(xmm7); + } + } + else { /* order == 9 */ + __m128i xmm0, xmm1, xmm2, xmm3, xmm4, xmm6, xmm7; + xmm0 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+0)); + xmm1 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+2)); + xmm2 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+4)); + xmm3 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+6)); + xmm4 = _mm_cvtsi32_si128(qlp_coeff[8]); + + xmm0 = _mm_shuffle_epi32(xmm0, _MM_SHUFFLE(3,1,2,0)); + xmm1 = _mm_shuffle_epi32(xmm1, _MM_SHUFFLE(3,1,2,0)); + xmm2 = _mm_shuffle_epi32(xmm2, _MM_SHUFFLE(3,1,2,0)); + xmm3 = _mm_shuffle_epi32(xmm3, _MM_SHUFFLE(3,1,2,0)); + + for(i = 0; i < (int)data_len; i++) { + //sum = 0; + //sum = qlp_coeff[8] * data[i-9]; + xmm7 = _mm_cvtsi32_si128(data[i-9]); + xmm7 = _mm_mul_epu32(xmm7, xmm4); + + //sum += qlp_coeff[7] * data[i-8]; + //sum += qlp_coeff[6] * data[i-7]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-8)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epu32(xmm6, xmm3); + xmm7 = _mm_add_epi32(xmm7, xmm6); + + //sum += qlp_coeff[5] * data[i-6]; + //sum += qlp_coeff[4] * data[i-5]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-6)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epu32(xmm6, xmm2); + xmm7 = _mm_add_epi32(xmm7, xmm6); + + //sum += qlp_coeff[3] * data[i-4]; + //sum += qlp_coeff[2] * data[i-3]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-4)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epu32(xmm6, xmm1); + xmm7 = _mm_add_epi32(xmm7, xmm6); + + //sum += qlp_coeff[1] * data[i-2]; + //sum += qlp_coeff[0] * data[i-1]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-2)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epu32(xmm6, xmm0); + xmm7 = _mm_add_epi32(xmm7, xmm6); + + xmm7 = _mm_add_epi32(xmm7, _mm_srli_si128(xmm7, 8)); + RESIDUAL32_RESULT(xmm7); + } + } + } + } + else if(order > 4) { /* order == 5, 6, 7, 8 */ + if(order > 6) { /* order == 7, 8 */ + if(order == 8) { + __m128i xmm0, xmm1, xmm2, xmm3, xmm6, xmm7; + xmm0 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+0)); + xmm1 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+2)); + xmm2 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+4)); + xmm3 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+6)); + + xmm0 = _mm_shuffle_epi32(xmm0, _MM_SHUFFLE(3,1,2,0)); + xmm1 = _mm_shuffle_epi32(xmm1, _MM_SHUFFLE(3,1,2,0)); + xmm2 = _mm_shuffle_epi32(xmm2, _MM_SHUFFLE(3,1,2,0)); + xmm3 = _mm_shuffle_epi32(xmm3, _MM_SHUFFLE(3,1,2,0)); + + for(i = 0; i < (int)data_len; i++) { + //sum = 0; + //sum += qlp_coeff[7] * data[i-8]; + //sum += qlp_coeff[6] * data[i-7]; + xmm7 = _mm_loadl_epi64((const __m128i*)(data+i-8)); + xmm7 = _mm_shuffle_epi32(xmm7, _MM_SHUFFLE(2,0,3,1)); + xmm7 = _mm_mul_epu32(xmm7, xmm3); + + //sum += qlp_coeff[5] * data[i-6]; + //sum += qlp_coeff[4] * data[i-5]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-6)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epu32(xmm6, xmm2); + xmm7 = _mm_add_epi32(xmm7, xmm6); + + //sum += qlp_coeff[3] * data[i-4]; + //sum += qlp_coeff[2] * data[i-3]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-4)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epu32(xmm6, xmm1); + xmm7 = _mm_add_epi32(xmm7, xmm6); + + //sum += qlp_coeff[1] * data[i-2]; + //sum += qlp_coeff[0] * data[i-1]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-2)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epu32(xmm6, xmm0); + xmm7 = _mm_add_epi32(xmm7, xmm6); + + xmm7 = _mm_add_epi32(xmm7, _mm_srli_si128(xmm7, 8)); + RESIDUAL32_RESULT(xmm7); + } + } + else { /* order == 7 */ + __m128i xmm0, xmm1, xmm2, xmm3, xmm6, xmm7; + xmm0 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+0)); + xmm1 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+2)); + xmm2 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+4)); + xmm3 = _mm_cvtsi32_si128(qlp_coeff[6]); + + xmm0 = _mm_shuffle_epi32(xmm0, _MM_SHUFFLE(3,1,2,0)); + xmm1 = _mm_shuffle_epi32(xmm1, _MM_SHUFFLE(3,1,2,0)); + xmm2 = _mm_shuffle_epi32(xmm2, _MM_SHUFFLE(3,1,2,0)); + + for(i = 0; i < (int)data_len; i++) { + //sum = 0; + //sum = qlp_coeff[6] * data[i-7]; + xmm7 = _mm_cvtsi32_si128(data[i-7]); + xmm7 = _mm_mul_epu32(xmm7, xmm3); + + //sum += qlp_coeff[5] * data[i-6]; + //sum += qlp_coeff[4] * data[i-5]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-6)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epu32(xmm6, xmm2); + xmm7 = _mm_add_epi32(xmm7, xmm6); + + //sum += qlp_coeff[3] * data[i-4]; + //sum += qlp_coeff[2] * data[i-3]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-4)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epu32(xmm6, xmm1); + xmm7 = _mm_add_epi32(xmm7, xmm6); + + //sum += qlp_coeff[1] * data[i-2]; + //sum += qlp_coeff[0] * data[i-1]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-2)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epu32(xmm6, xmm0); + xmm7 = _mm_add_epi32(xmm7, xmm6); + + xmm7 = _mm_add_epi32(xmm7, _mm_srli_si128(xmm7, 8)); + RESIDUAL32_RESULT(xmm7); + } + } + } + else { /* order == 5, 6 */ + if(order == 6) { + __m128i xmm0, xmm1, xmm2, xmm6, xmm7; + xmm0 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+0)); + xmm1 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+2)); + xmm2 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+4)); + + xmm0 = _mm_shuffle_epi32(xmm0, _MM_SHUFFLE(3,1,2,0)); + xmm1 = _mm_shuffle_epi32(xmm1, _MM_SHUFFLE(3,1,2,0)); + xmm2 = _mm_shuffle_epi32(xmm2, _MM_SHUFFLE(3,1,2,0)); + + for(i = 0; i < (int)data_len; i++) { + //sum = 0; + //sum += qlp_coeff[5] * data[i-6]; + //sum += qlp_coeff[4] * data[i-5]; + xmm7 = _mm_loadl_epi64((const __m128i*)(data+i-6)); + xmm7 = _mm_shuffle_epi32(xmm7, _MM_SHUFFLE(2,0,3,1)); + xmm7 = _mm_mul_epu32(xmm7, xmm2); + + //sum += qlp_coeff[3] * data[i-4]; + //sum += qlp_coeff[2] * data[i-3]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-4)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epu32(xmm6, xmm1); + xmm7 = _mm_add_epi32(xmm7, xmm6); + + //sum += qlp_coeff[1] * data[i-2]; + //sum += qlp_coeff[0] * data[i-1]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-2)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epu32(xmm6, xmm0); + xmm7 = _mm_add_epi32(xmm7, xmm6); + + xmm7 = _mm_add_epi32(xmm7, _mm_srli_si128(xmm7, 8)); + RESIDUAL32_RESULT(xmm7); + } + } + else { /* order == 5 */ + __m128i xmm0, xmm1, xmm2, xmm6, xmm7; + xmm0 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+0)); + xmm1 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+2)); + xmm2 = _mm_cvtsi32_si128(qlp_coeff[4]); + + xmm0 = _mm_shuffle_epi32(xmm0, _MM_SHUFFLE(3,1,2,0)); + xmm1 = _mm_shuffle_epi32(xmm1, _MM_SHUFFLE(3,1,2,0)); + + for(i = 0; i < (int)data_len; i++) { + //sum = 0; + //sum = qlp_coeff[4] * data[i-5]; + xmm7 = _mm_cvtsi32_si128(data[i-5]); + xmm7 = _mm_mul_epu32(xmm7, xmm2); + + //sum += qlp_coeff[3] * data[i-4]; + //sum += qlp_coeff[2] * data[i-3]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-4)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epu32(xmm6, xmm1); + xmm7 = _mm_add_epi32(xmm7, xmm6); + + //sum += qlp_coeff[1] * data[i-2]; + //sum += qlp_coeff[0] * data[i-1]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-2)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epu32(xmm6, xmm0); + xmm7 = _mm_add_epi32(xmm7, xmm6); + + xmm7 = _mm_add_epi32(xmm7, _mm_srli_si128(xmm7, 8)); + RESIDUAL32_RESULT(xmm7); + } + } + } + } + else { /* order == 1, 2, 3, 4 */ + if(order > 2) { /* order == 3, 4 */ + if(order == 4) { + __m128i xmm0, xmm1, xmm6, xmm7; + xmm0 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+0)); + xmm1 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+2)); + + xmm0 = _mm_shuffle_epi32(xmm0, _MM_SHUFFLE(3,1,2,0)); + xmm1 = _mm_shuffle_epi32(xmm1, _MM_SHUFFLE(3,1,2,0)); + + for(i = 0; i < (int)data_len; i++) { + //sum = 0; + //sum += qlp_coeff[3] * data[i-4]; + //sum += qlp_coeff[2] * data[i-3]; + xmm7 = _mm_loadl_epi64((const __m128i*)(data+i-4)); + xmm7 = _mm_shuffle_epi32(xmm7, _MM_SHUFFLE(2,0,3,1)); + xmm7 = _mm_mul_epu32(xmm7, xmm1); + + //sum += qlp_coeff[1] * data[i-2]; + //sum += qlp_coeff[0] * data[i-1]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-2)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epu32(xmm6, xmm0); + xmm7 = _mm_add_epi32(xmm7, xmm6); + + xmm7 = _mm_add_epi32(xmm7, _mm_srli_si128(xmm7, 8)); + RESIDUAL32_RESULT(xmm7); + } + } + else { /* order == 3 */ + __m128i xmm0, xmm1, xmm6, xmm7; + xmm0 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+0)); + xmm1 = _mm_cvtsi32_si128(qlp_coeff[2]); + + xmm0 = _mm_shuffle_epi32(xmm0, _MM_SHUFFLE(3,1,2,0)); + + for(i = 0; i < (int)data_len; i++) { + //sum = 0; + //sum = qlp_coeff[2] * data[i-3]; + xmm7 = _mm_cvtsi32_si128(data[i-3]); + xmm7 = _mm_mul_epu32(xmm7, xmm1); + + //sum += qlp_coeff[1] * data[i-2]; + //sum += qlp_coeff[0] * data[i-1]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-2)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epu32(xmm6, xmm0); + xmm7 = _mm_add_epi32(xmm7, xmm6); + + xmm7 = _mm_add_epi32(xmm7, _mm_srli_si128(xmm7, 8)); + RESIDUAL32_RESULT(xmm7); + } + } + } + else { /* order == 1, 2 */ + if(order == 2) { + __m128i xmm0, xmm7; + xmm0 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+0)); + xmm0 = _mm_shuffle_epi32(xmm0, _MM_SHUFFLE(3,1,2,0)); + + for(i = 0; i < (int)data_len; i++) { + //sum = 0; + //sum += qlp_coeff[1] * data[i-2]; + //sum += qlp_coeff[0] * data[i-1]; + xmm7 = _mm_loadl_epi64((const __m128i*)(data+i-2)); + xmm7 = _mm_shuffle_epi32(xmm7, _MM_SHUFFLE(2,0,3,1)); + xmm7 = _mm_mul_epu32(xmm7, xmm0); + + xmm7 = _mm_add_epi32(xmm7, _mm_srli_si128(xmm7, 8)); + RESIDUAL32_RESULT(xmm7); + } + } + else { /* order == 1 */ + for(i = 0; i < (int)data_len; i++) + residual[i] = data[i] - ((qlp_coeff[0] * data[i-1]) >> lp_quantization); + } + } + } + } + else { /* order > 12 */ + FLAC__int32 sum; + for(i = 0; i < (int)data_len; i++) { + sum = 0; + switch(order) { + case 32: sum += qlp_coeff[31] * data[i-32]; + case 31: sum += qlp_coeff[30] * data[i-31]; + case 30: sum += qlp_coeff[29] * data[i-30]; + case 29: sum += qlp_coeff[28] * data[i-29]; + case 28: sum += qlp_coeff[27] * data[i-28]; + case 27: sum += qlp_coeff[26] * data[i-27]; + case 26: sum += qlp_coeff[25] * data[i-26]; + case 25: sum += qlp_coeff[24] * data[i-25]; + case 24: sum += qlp_coeff[23] * data[i-24]; + case 23: sum += qlp_coeff[22] * data[i-23]; + case 22: sum += qlp_coeff[21] * data[i-22]; + case 21: sum += qlp_coeff[20] * data[i-21]; + case 20: sum += qlp_coeff[19] * data[i-20]; + case 19: sum += qlp_coeff[18] * data[i-19]; + case 18: sum += qlp_coeff[17] * data[i-18]; + case 17: sum += qlp_coeff[16] * data[i-17]; + case 16: sum += qlp_coeff[15] * data[i-16]; + case 15: sum += qlp_coeff[14] * data[i-15]; + case 14: sum += qlp_coeff[13] * data[i-14]; + case 13: sum += qlp_coeff[12] * data[i-13]; + sum += qlp_coeff[11] * data[i-12]; + sum += qlp_coeff[10] * data[i-11]; + sum += qlp_coeff[ 9] * data[i-10]; + sum += qlp_coeff[ 8] * data[i- 9]; + sum += qlp_coeff[ 7] * data[i- 8]; + sum += qlp_coeff[ 6] * data[i- 7]; + sum += qlp_coeff[ 5] * data[i- 6]; + sum += qlp_coeff[ 4] * data[i- 5]; + sum += qlp_coeff[ 3] * data[i- 4]; + sum += qlp_coeff[ 2] * data[i- 3]; + sum += qlp_coeff[ 1] * data[i- 2]; + sum += qlp_coeff[ 0] * data[i- 1]; + } + residual[i] = data[i] - (sum >> lp_quantization); + } + } +} + +#if defined FLAC__CPU_IA32 && !defined FLAC__HAS_NASM /* unused for x64; not better than MMX asm */ + +FLAC__SSE_TARGET("sse2") +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[]) +{ + if (order < 8 || order > 12) { + FLAC__lpc_restore_signal(residual, data_len, qlp_coeff, order, lp_quantization, data); + return; + } + if (data_len == 0) + return; + + FLAC__ASSERT(order >= 8); + FLAC__ASSERT(order <= 12); + + if(order > 8) { /* order == 9, 10, 11, 12 */ + FLAC__int32 curr; + __m128i xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7; + xmm0 = _mm_loadu_si128((const __m128i*)(qlp_coeff+0)); + xmm6 = _mm_loadu_si128((const __m128i*)(qlp_coeff+4)); + xmm1 = _mm_loadu_si128((const __m128i*)(qlp_coeff+8)); /* read 0 to 3 uninitialized coeffs... */ + switch(order) /* ...and zero them out */ + { + case 9: + xmm1 = _mm_slli_si128(xmm1, 12); xmm1 = _mm_srli_si128(xmm1, 12); break; + case 10: + xmm1 = _mm_slli_si128(xmm1, 8); xmm1 = _mm_srli_si128(xmm1, 8); break; + case 11: + xmm1 = _mm_slli_si128(xmm1, 4); xmm1 = _mm_srli_si128(xmm1, 4); break; + } + xmm2 = _mm_setzero_si128(); + xmm0 = _mm_packs_epi32(xmm0, xmm6); + xmm1 = _mm_packs_epi32(xmm1, xmm2); + + xmm4 = _mm_loadu_si128((const __m128i*)(data-12)); + xmm5 = _mm_loadu_si128((const __m128i*)(data-8)); + xmm3 = _mm_loadu_si128((const __m128i*)(data-4)); + xmm4 = _mm_shuffle_epi32(xmm4, _MM_SHUFFLE(0,1,2,3)); + xmm5 = _mm_shuffle_epi32(xmm5, _MM_SHUFFLE(0,1,2,3)); + xmm3 = _mm_shuffle_epi32(xmm3, _MM_SHUFFLE(0,1,2,3)); + xmm4 = _mm_packs_epi32(xmm4, xmm2); + xmm3 = _mm_packs_epi32(xmm3, xmm5); + + xmm7 = _mm_slli_si128(xmm1, 2); + xmm7 = _mm_or_si128(xmm7, _mm_srli_si128(xmm0, 14)); + xmm2 = _mm_slli_si128(xmm0, 2); + + /* xmm0, xmm1: qlp_coeff + xmm2, xmm7: qlp_coeff << 16 bit + xmm3, xmm4: data */ + + xmm5 = _mm_madd_epi16(xmm4, xmm1); + xmm6 = _mm_madd_epi16(xmm3, xmm0); + xmm6 = _mm_add_epi32(xmm6, xmm5); + xmm6 = _mm_add_epi32(xmm6, _mm_srli_si128(xmm6, 8)); + xmm6 = _mm_add_epi32(xmm6, _mm_srli_si128(xmm6, 4)); + + DATA16_RESULT(xmm6); + + data_len--; + + if(data_len % 2) { + xmm6 = _mm_srli_si128(xmm3, 14); + xmm4 = _mm_slli_si128(xmm4, 2); + xmm3 = _mm_slli_si128(xmm3, 2); + xmm4 = _mm_or_si128(xmm4, xmm6); + xmm3 = _mm_insert_epi16(xmm3, curr, 0); + + xmm5 = _mm_madd_epi16(xmm4, xmm1); + xmm6 = _mm_madd_epi16(xmm3, xmm0); + xmm6 = _mm_add_epi32(xmm6, xmm5); + xmm6 = _mm_add_epi32(xmm6, _mm_srli_si128(xmm6, 8)); + xmm6 = _mm_add_epi32(xmm6, _mm_srli_si128(xmm6, 4)); + + DATA16_RESULT(xmm6); + + data_len--; + } + + while(data_len) { /* data_len is a multiple of 2 */ + /* 1 _mm_slli_si128 per data element less but we need shifted qlp_coeff in xmm2:xmm7 */ + xmm6 = _mm_srli_si128(xmm3, 12); + xmm4 = _mm_slli_si128(xmm4, 4); + xmm3 = _mm_slli_si128(xmm3, 4); + xmm4 = _mm_or_si128(xmm4, xmm6); + xmm3 = _mm_insert_epi16(xmm3, curr, 1); + + xmm5 = _mm_madd_epi16(xmm4, xmm7); + xmm6 = _mm_madd_epi16(xmm3, xmm2); + xmm6 = _mm_add_epi32(xmm6, xmm5); + xmm6 = _mm_add_epi32(xmm6, _mm_srli_si128(xmm6, 8)); + xmm6 = _mm_add_epi32(xmm6, _mm_srli_si128(xmm6, 4)); + + DATA16_RESULT(xmm6); + + xmm3 = _mm_insert_epi16(xmm3, curr, 0); + + xmm5 = _mm_madd_epi16(xmm4, xmm1); + xmm6 = _mm_madd_epi16(xmm3, xmm0); + xmm6 = _mm_add_epi32(xmm6, xmm5); + xmm6 = _mm_add_epi32(xmm6, _mm_srli_si128(xmm6, 8)); + xmm6 = _mm_add_epi32(xmm6, _mm_srli_si128(xmm6, 4)); + + DATA16_RESULT(xmm6); + + data_len-=2; + } + } /* endif(order > 8) */ + else + { + FLAC__int32 curr; + __m128i xmm0, xmm1, xmm3, xmm6; + xmm0 = _mm_loadu_si128((const __m128i*)(qlp_coeff+0)); + xmm1 = _mm_loadu_si128((const __m128i*)(qlp_coeff+4)); + xmm0 = _mm_packs_epi32(xmm0, xmm1); + + xmm1 = _mm_loadu_si128((const __m128i*)(data-8)); + xmm3 = _mm_loadu_si128((const __m128i*)(data-4)); + xmm1 = _mm_shuffle_epi32(xmm1, _MM_SHUFFLE(0,1,2,3)); + xmm3 = _mm_shuffle_epi32(xmm3, _MM_SHUFFLE(0,1,2,3)); + xmm3 = _mm_packs_epi32(xmm3, xmm1); + + /* xmm0: qlp_coeff + xmm3: data */ + + xmm6 = _mm_madd_epi16(xmm3, xmm0); + xmm6 = _mm_add_epi32(xmm6, _mm_srli_si128(xmm6, 8)); + xmm6 = _mm_add_epi32(xmm6, _mm_srli_si128(xmm6, 4)); + + DATA16_RESULT(xmm6); + + data_len--; + + while(data_len) { + xmm3 = _mm_slli_si128(xmm3, 2); + xmm3 = _mm_insert_epi16(xmm3, curr, 0); + + xmm6 = _mm_madd_epi16(xmm3, xmm0); + xmm6 = _mm_add_epi32(xmm6, _mm_srli_si128(xmm6, 8)); + xmm6 = _mm_add_epi32(xmm6, _mm_srli_si128(xmm6, 4)); + + DATA16_RESULT(xmm6); + + data_len--; + } + } +} + +#endif /* defined FLAC__CPU_IA32 && !defined FLAC__HAS_NASM */ + +#endif /* FLAC__SSE2_SUPPORTED */ +#endif /* (FLAC__CPU_IA32 || FLAC__CPU_X86_64) && FLAC__HAS_X86INTRIN */ +#endif /* FLAC__NO_ASM */ +#endif /* FLAC__INTEGER_ONLY_LIBRARY */ diff --git a/core/cd_hw/libchdr/deps/libFLAC/lpc_intrin_sse41.c b/core/cd_hw/libchdr/deps/libFLAC/lpc_intrin_sse41.c new file mode 100644 index 0000000..bef73f4 --- /dev/null +++ b/core/cd_hw/libchdr/deps/libFLAC/lpc_intrin_sse41.c @@ -0,0 +1,1314 @@ +/* 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 +#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__SSE4_1_SUPPORTED + +#include "FLAC/assert.h" +#include "FLAC/format.h" + +#include /* SSE4.1 */ + +#if defined FLAC__CPU_IA32 /* unused for x64 */ + +#define RESIDUAL64_RESULT(xmmN) residual[i] = data[i] - _mm_cvtsi128_si32(_mm_srl_epi64(xmmN, cnt)) +#define RESIDUAL64_RESULT1(xmmN) residual[i] = data[i] - _mm_cvtsi128_si32(_mm_srli_epi64(xmmN, lp_quantization)) + +FLAC__SSE_TARGET("sse4.1") +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[]) +{ + int i; + __m128i cnt = _mm_cvtsi32_si128(lp_quantization); + + FLAC__ASSERT(order > 0); + FLAC__ASSERT(order <= 32); + FLAC__ASSERT(lp_quantization <= 32); /* there's no _mm_sra_epi64() so we have to use _mm_srl_epi64() */ + + if(order <= 12) { + if(order > 8) { /* order == 9, 10, 11, 12 */ + if(order > 10) { /* order == 11, 12 */ + if(order == 12) { + __m128i xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7; + xmm0 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+0)); // 0 0 q[1] q[0] + xmm1 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+2)); // 0 0 q[3] q[2] + xmm2 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+4)); // 0 0 q[5] q[4] + xmm3 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+6)); // 0 0 q[7] q[6] + xmm4 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+8)); // 0 0 q[9] q[8] + xmm5 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+10)); // 0 0 q[11] q[10] + + xmm0 = _mm_shuffle_epi32(xmm0, _MM_SHUFFLE(3,1,2,0)); // 0 q[1] 0 q[0] + xmm1 = _mm_shuffle_epi32(xmm1, _MM_SHUFFLE(3,1,2,0)); // 0 q[3] 0 q[2] + xmm2 = _mm_shuffle_epi32(xmm2, _MM_SHUFFLE(3,1,2,0)); // 0 q[5] 0 q[4] + xmm3 = _mm_shuffle_epi32(xmm3, _MM_SHUFFLE(3,1,2,0)); // 0 q[7] 0 q[6] + xmm4 = _mm_shuffle_epi32(xmm4, _MM_SHUFFLE(3,1,2,0)); // 0 q[9] 0 q[8] + xmm5 = _mm_shuffle_epi32(xmm5, _MM_SHUFFLE(3,1,2,0)); // 0 q[11] 0 q[10] + + for(i = 0; i < (int)data_len; i++) { + //sum = 0; + //sum += qlp_coeff[11] * (FLAC__int64)data[i-12]; + //sum += qlp_coeff[10] * (FLAC__int64)data[i-11]; + xmm7 = _mm_loadl_epi64((const __m128i*)(data+i-12)); // 0 0 d[i-11] d[i-12] + xmm7 = _mm_shuffle_epi32(xmm7, _MM_SHUFFLE(2,0,3,1)); // 0 d[i-12] 0 d[i-11] + xmm7 = _mm_mul_epi32(xmm7, xmm5); + + //sum += qlp_coeff[9] * (FLAC__int64)data[i-10]; + //sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-10)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epi32(xmm6, xmm4); + xmm7 = _mm_add_epi64(xmm7, xmm6); + + //sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; + //sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-8)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epi32(xmm6, xmm3); + xmm7 = _mm_add_epi64(xmm7, xmm6); + + //sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; + //sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-6)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epi32(xmm6, xmm2); + xmm7 = _mm_add_epi64(xmm7, xmm6); + + //sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + //sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-4)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epi32(xmm6, xmm1); + xmm7 = _mm_add_epi64(xmm7, xmm6); + + //sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + //sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-2)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epi32(xmm6, xmm0); + xmm7 = _mm_add_epi64(xmm7, xmm6); + + xmm7 = _mm_add_epi64(xmm7, _mm_srli_si128(xmm7, 8)); + RESIDUAL64_RESULT1(xmm7); + } + } + else { /* order == 11 */ + __m128i xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7; + xmm0 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+0)); + xmm1 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+2)); + xmm2 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+4)); + xmm3 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+6)); + xmm4 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+8)); + xmm5 = _mm_cvtsi32_si128(qlp_coeff[10]); + + xmm0 = _mm_shuffle_epi32(xmm0, _MM_SHUFFLE(3,1,2,0)); + xmm1 = _mm_shuffle_epi32(xmm1, _MM_SHUFFLE(3,1,2,0)); + xmm2 = _mm_shuffle_epi32(xmm2, _MM_SHUFFLE(3,1,2,0)); + xmm3 = _mm_shuffle_epi32(xmm3, _MM_SHUFFLE(3,1,2,0)); + xmm4 = _mm_shuffle_epi32(xmm4, _MM_SHUFFLE(3,1,2,0)); + + for(i = 0; i < (int)data_len; i++) { + //sum = 0; + //sum = qlp_coeff[10] * (FLAC__int64)data[i-11]; + xmm7 = _mm_cvtsi32_si128(data[i-11]); + xmm7 = _mm_mul_epi32(xmm7, xmm5); + + //sum += qlp_coeff[9] * (FLAC__int64)data[i-10]; + //sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-10)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epi32(xmm6, xmm4); + xmm7 = _mm_add_epi64(xmm7, xmm6); + + //sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; + //sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-8)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epi32(xmm6, xmm3); + xmm7 = _mm_add_epi64(xmm7, xmm6); + + //sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; + //sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-6)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epi32(xmm6, xmm2); + xmm7 = _mm_add_epi64(xmm7, xmm6); + + //sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + //sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-4)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epi32(xmm6, xmm1); + xmm7 = _mm_add_epi64(xmm7, xmm6); + + //sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + //sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-2)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epi32(xmm6, xmm0); + xmm7 = _mm_add_epi64(xmm7, xmm6); + + xmm7 = _mm_add_epi64(xmm7, _mm_srli_si128(xmm7, 8)); + RESIDUAL64_RESULT1(xmm7); + } + } + } + else { /* order == 9, 10 */ + if(order == 10) { + __m128i xmm0, xmm1, xmm2, xmm3, xmm4, xmm6, xmm7; + xmm0 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+0)); + xmm1 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+2)); + xmm2 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+4)); + xmm3 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+6)); + xmm4 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+8)); + + xmm0 = _mm_shuffle_epi32(xmm0, _MM_SHUFFLE(3,1,2,0)); + xmm1 = _mm_shuffle_epi32(xmm1, _MM_SHUFFLE(3,1,2,0)); + xmm2 = _mm_shuffle_epi32(xmm2, _MM_SHUFFLE(3,1,2,0)); + xmm3 = _mm_shuffle_epi32(xmm3, _MM_SHUFFLE(3,1,2,0)); + xmm4 = _mm_shuffle_epi32(xmm4, _MM_SHUFFLE(3,1,2,0)); + + for(i = 0; i < (int)data_len; i++) { + //sum = 0; + //sum += qlp_coeff[9] * (FLAC__int64)data[i-10]; + //sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; + xmm7 = _mm_loadl_epi64((const __m128i*)(data+i-10)); + xmm7 = _mm_shuffle_epi32(xmm7, _MM_SHUFFLE(2,0,3,1)); + xmm7 = _mm_mul_epi32(xmm7, xmm4); + + //sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; + //sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-8)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epi32(xmm6, xmm3); + xmm7 = _mm_add_epi64(xmm7, xmm6); + + //sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; + //sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-6)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epi32(xmm6, xmm2); + xmm7 = _mm_add_epi64(xmm7, xmm6); + + //sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + //sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-4)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epi32(xmm6, xmm1); + xmm7 = _mm_add_epi64(xmm7, xmm6); + + //sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + //sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-2)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epi32(xmm6, xmm0); + xmm7 = _mm_add_epi64(xmm7, xmm6); + + xmm7 = _mm_add_epi64(xmm7, _mm_srli_si128(xmm7, 8)); + RESIDUAL64_RESULT(xmm7); + } + } + else { /* order == 9 */ + __m128i xmm0, xmm1, xmm2, xmm3, xmm4, xmm6, xmm7; + xmm0 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+0)); + xmm1 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+2)); + xmm2 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+4)); + xmm3 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+6)); + xmm4 = _mm_cvtsi32_si128(qlp_coeff[8]); + + xmm0 = _mm_shuffle_epi32(xmm0, _MM_SHUFFLE(3,1,2,0)); + xmm1 = _mm_shuffle_epi32(xmm1, _MM_SHUFFLE(3,1,2,0)); + xmm2 = _mm_shuffle_epi32(xmm2, _MM_SHUFFLE(3,1,2,0)); + xmm3 = _mm_shuffle_epi32(xmm3, _MM_SHUFFLE(3,1,2,0)); + + for(i = 0; i < (int)data_len; i++) { + //sum = 0; + //sum = qlp_coeff[8] * (FLAC__int64)data[i-9]; + xmm7 = _mm_cvtsi32_si128(data[i-9]); + xmm7 = _mm_mul_epi32(xmm7, xmm4); + + //sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; + //sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-8)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epi32(xmm6, xmm3); + xmm7 = _mm_add_epi64(xmm7, xmm6); + + //sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; + //sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-6)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epi32(xmm6, xmm2); + xmm7 = _mm_add_epi64(xmm7, xmm6); + + //sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + //sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-4)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epi32(xmm6, xmm1); + xmm7 = _mm_add_epi64(xmm7, xmm6); + + //sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + //sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-2)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epi32(xmm6, xmm0); + xmm7 = _mm_add_epi64(xmm7, xmm6); + + xmm7 = _mm_add_epi64(xmm7, _mm_srli_si128(xmm7, 8)); + RESIDUAL64_RESULT(xmm7); + } + } + } + } + else if(order > 4) { /* order == 5, 6, 7, 8 */ + if(order > 6) { /* order == 7, 8 */ + if(order == 8) { + __m128i xmm0, xmm1, xmm2, xmm3, xmm6, xmm7; + xmm0 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+0)); + xmm1 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+2)); + xmm2 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+4)); + xmm3 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+6)); + + xmm0 = _mm_shuffle_epi32(xmm0, _MM_SHUFFLE(3,1,2,0)); + xmm1 = _mm_shuffle_epi32(xmm1, _MM_SHUFFLE(3,1,2,0)); + xmm2 = _mm_shuffle_epi32(xmm2, _MM_SHUFFLE(3,1,2,0)); + xmm3 = _mm_shuffle_epi32(xmm3, _MM_SHUFFLE(3,1,2,0)); + + for(i = 0; i < (int)data_len; i++) { + //sum = 0; + //sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; + //sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; + xmm7 = _mm_loadl_epi64((const __m128i*)(data+i-8)); + xmm7 = _mm_shuffle_epi32(xmm7, _MM_SHUFFLE(2,0,3,1)); + xmm7 = _mm_mul_epi32(xmm7, xmm3); + + //sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; + //sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-6)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epi32(xmm6, xmm2); + xmm7 = _mm_add_epi64(xmm7, xmm6); + + //sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + //sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-4)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epi32(xmm6, xmm1); + xmm7 = _mm_add_epi64(xmm7, xmm6); + + //sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + //sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-2)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epi32(xmm6, xmm0); + xmm7 = _mm_add_epi64(xmm7, xmm6); + + xmm7 = _mm_add_epi64(xmm7, _mm_srli_si128(xmm7, 8)); + RESIDUAL64_RESULT(xmm7); + } + } + else { /* order == 7 */ + __m128i xmm0, xmm1, xmm2, xmm3, xmm6, xmm7; + xmm0 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+0)); + xmm1 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+2)); + xmm2 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+4)); + xmm3 = _mm_cvtsi32_si128(qlp_coeff[6]); + + xmm0 = _mm_shuffle_epi32(xmm0, _MM_SHUFFLE(3,1,2,0)); + xmm1 = _mm_shuffle_epi32(xmm1, _MM_SHUFFLE(3,1,2,0)); + xmm2 = _mm_shuffle_epi32(xmm2, _MM_SHUFFLE(3,1,2,0)); + + for(i = 0; i < (int)data_len; i++) { + //sum = 0; + //sum = qlp_coeff[6] * (FLAC__int64)data[i-7]; + xmm7 = _mm_cvtsi32_si128(data[i-7]); + xmm7 = _mm_mul_epi32(xmm7, xmm3); + + //sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; + //sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-6)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epi32(xmm6, xmm2); + xmm7 = _mm_add_epi64(xmm7, xmm6); + + //sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + //sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-4)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epi32(xmm6, xmm1); + xmm7 = _mm_add_epi64(xmm7, xmm6); + + //sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + //sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-2)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epi32(xmm6, xmm0); + xmm7 = _mm_add_epi64(xmm7, xmm6); + + xmm7 = _mm_add_epi64(xmm7, _mm_srli_si128(xmm7, 8)); + RESIDUAL64_RESULT(xmm7); + } + } + } + else { /* order == 5, 6 */ + if(order == 6) { + __m128i xmm0, xmm1, xmm2, xmm6, xmm7; + xmm0 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+0)); + xmm1 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+2)); + xmm2 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+4)); + + xmm0 = _mm_shuffle_epi32(xmm0, _MM_SHUFFLE(3,1,2,0)); + xmm1 = _mm_shuffle_epi32(xmm1, _MM_SHUFFLE(3,1,2,0)); + xmm2 = _mm_shuffle_epi32(xmm2, _MM_SHUFFLE(3,1,2,0)); + + for(i = 0; i < (int)data_len; i++) { + //sum = 0; + //sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; + //sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + xmm7 = _mm_loadl_epi64((const __m128i*)(data+i-6)); + xmm7 = _mm_shuffle_epi32(xmm7, _MM_SHUFFLE(2,0,3,1)); + xmm7 = _mm_mul_epi32(xmm7, xmm2); + + //sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + //sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-4)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epi32(xmm6, xmm1); + xmm7 = _mm_add_epi64(xmm7, xmm6); + + //sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + //sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-2)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epi32(xmm6, xmm0); + xmm7 = _mm_add_epi64(xmm7, xmm6); + + xmm7 = _mm_add_epi64(xmm7, _mm_srli_si128(xmm7, 8)); + RESIDUAL64_RESULT(xmm7); + } + } + else { /* order == 5 */ + __m128i xmm0, xmm1, xmm2, xmm6, xmm7; + xmm0 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+0)); + xmm1 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+2)); + xmm2 = _mm_cvtsi32_si128(qlp_coeff[4]); + + xmm0 = _mm_shuffle_epi32(xmm0, _MM_SHUFFLE(3,1,2,0)); + xmm1 = _mm_shuffle_epi32(xmm1, _MM_SHUFFLE(3,1,2,0)); + + for(i = 0; i < (int)data_len; i++) { + //sum = 0; + //sum = qlp_coeff[4] * (FLAC__int64)data[i-5]; + xmm7 = _mm_cvtsi32_si128(data[i-5]); + xmm7 = _mm_mul_epi32(xmm7, xmm2); + + //sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + //sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-4)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epi32(xmm6, xmm1); + xmm7 = _mm_add_epi64(xmm7, xmm6); + + //sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + //sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-2)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epi32(xmm6, xmm0); + xmm7 = _mm_add_epi64(xmm7, xmm6); + + xmm7 = _mm_add_epi64(xmm7, _mm_srli_si128(xmm7, 8)); + RESIDUAL64_RESULT(xmm7); + } + } + } + } + else { /* order == 1, 2, 3, 4 */ + if(order > 2) { /* order == 3, 4 */ + if(order == 4) { + __m128i xmm0, xmm1, xmm6, xmm7; + xmm0 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+0)); + xmm1 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+2)); + + xmm0 = _mm_shuffle_epi32(xmm0, _MM_SHUFFLE(3,1,2,0)); + xmm1 = _mm_shuffle_epi32(xmm1, _MM_SHUFFLE(3,1,2,0)); + + for(i = 0; i < (int)data_len; i++) { + //sum = 0; + //sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + //sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + xmm7 = _mm_loadl_epi64((const __m128i*)(data+i-4)); + xmm7 = _mm_shuffle_epi32(xmm7, _MM_SHUFFLE(2,0,3,1)); + xmm7 = _mm_mul_epi32(xmm7, xmm1); + + //sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + //sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-2)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epi32(xmm6, xmm0); + xmm7 = _mm_add_epi64(xmm7, xmm6); + + xmm7 = _mm_add_epi64(xmm7, _mm_srli_si128(xmm7, 8)); + RESIDUAL64_RESULT(xmm7); + } + } + else { /* order == 3 */ + __m128i xmm0, xmm1, xmm6, xmm7; + xmm0 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+0)); + xmm1 = _mm_cvtsi32_si128(qlp_coeff[2]); + + xmm0 = _mm_shuffle_epi32(xmm0, _MM_SHUFFLE(3,1,2,0)); + + for(i = 0; i < (int)data_len; i++) { + //sum = 0; + //sum = qlp_coeff[2] * (FLAC__int64)data[i-3]; + xmm7 = _mm_cvtsi32_si128(data[i-3]); + xmm7 = _mm_mul_epi32(xmm7, xmm1); + + //sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + //sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-2)); + xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); + xmm6 = _mm_mul_epi32(xmm6, xmm0); + xmm7 = _mm_add_epi64(xmm7, xmm6); + + xmm7 = _mm_add_epi64(xmm7, _mm_srli_si128(xmm7, 8)); + RESIDUAL64_RESULT(xmm7); + } + } + } + else { /* order == 1, 2 */ + if(order == 2) { + __m128i xmm0, xmm7; + xmm0 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+0)); + xmm0 = _mm_shuffle_epi32(xmm0, _MM_SHUFFLE(3,1,2,0)); + + for(i = 0; i < (int)data_len; i++) { + //sum = 0; + //sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + //sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + xmm7 = _mm_loadl_epi64((const __m128i*)(data+i-2)); + xmm7 = _mm_shuffle_epi32(xmm7, _MM_SHUFFLE(2,0,3,1)); + xmm7 = _mm_mul_epi32(xmm7, xmm0); + + xmm7 = _mm_add_epi64(xmm7, _mm_srli_si128(xmm7, 8)); + RESIDUAL64_RESULT(xmm7); + } + } + else { /* order == 1 */ + __m128i xmm0, xmm7; + xmm0 = _mm_cvtsi32_si128(qlp_coeff[0]); + + for(i = 0; i < (int)data_len; i++) { + //sum = qlp_coeff[0] * (FLAC__int64)data[i-1]; + xmm7 = _mm_cvtsi32_si128(data[i-1]); + xmm7 = _mm_mul_epi32(xmm7, xmm0); + RESIDUAL64_RESULT(xmm7); + } + } + } + } + } + else { /* order > 12 */ + FLAC__int64 sum; + for(i = 0; i < (int)data_len; i++) { + sum = 0; + switch(order) { + case 32: sum += qlp_coeff[31] * (FLAC__int64)data[i-32]; + case 31: sum += qlp_coeff[30] * (FLAC__int64)data[i-31]; + case 30: sum += qlp_coeff[29] * (FLAC__int64)data[i-30]; + case 29: sum += qlp_coeff[28] * (FLAC__int64)data[i-29]; + case 28: sum += qlp_coeff[27] * (FLAC__int64)data[i-28]; + case 27: sum += qlp_coeff[26] * (FLAC__int64)data[i-27]; + case 26: sum += qlp_coeff[25] * (FLAC__int64)data[i-26]; + case 25: sum += qlp_coeff[24] * (FLAC__int64)data[i-25]; + case 24: sum += qlp_coeff[23] * (FLAC__int64)data[i-24]; + case 23: sum += qlp_coeff[22] * (FLAC__int64)data[i-23]; + case 22: sum += qlp_coeff[21] * (FLAC__int64)data[i-22]; + case 21: sum += qlp_coeff[20] * (FLAC__int64)data[i-21]; + case 20: sum += qlp_coeff[19] * (FLAC__int64)data[i-20]; + case 19: sum += qlp_coeff[18] * (FLAC__int64)data[i-19]; + case 18: sum += qlp_coeff[17] * (FLAC__int64)data[i-18]; + case 17: sum += qlp_coeff[16] * (FLAC__int64)data[i-17]; + case 16: sum += qlp_coeff[15] * (FLAC__int64)data[i-16]; + case 15: sum += qlp_coeff[14] * (FLAC__int64)data[i-15]; + case 14: sum += qlp_coeff[13] * (FLAC__int64)data[i-14]; + case 13: sum += qlp_coeff[12] * (FLAC__int64)data[i-13]; + sum += qlp_coeff[11] * (FLAC__int64)data[i-12]; + sum += qlp_coeff[10] * (FLAC__int64)data[i-11]; + sum += qlp_coeff[ 9] * (FLAC__int64)data[i-10]; + sum += qlp_coeff[ 8] * (FLAC__int64)data[i- 9]; + sum += qlp_coeff[ 7] * (FLAC__int64)data[i- 8]; + sum += qlp_coeff[ 6] * (FLAC__int64)data[i- 7]; + sum += qlp_coeff[ 5] * (FLAC__int64)data[i- 6]; + sum += qlp_coeff[ 4] * (FLAC__int64)data[i- 5]; + sum += qlp_coeff[ 3] * (FLAC__int64)data[i- 4]; + sum += qlp_coeff[ 2] * (FLAC__int64)data[i- 3]; + sum += qlp_coeff[ 1] * (FLAC__int64)data[i- 2]; + sum += qlp_coeff[ 0] * (FLAC__int64)data[i- 1]; + } + residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); + } + } +} + +FLAC__SSE_TARGET("sse4.1") +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[]) +{ + int i; + __m128i cnt = _mm_cvtsi32_si128(lp_quantization); + + if (!data_len) + return; + + FLAC__ASSERT(order > 0); + FLAC__ASSERT(order <= 32); + FLAC__ASSERT(lp_quantization <= 32); /* there's no _mm_sra_epi64() so we have to use _mm_srl_epi64() */ + + if(order <= 12) { + if(order > 8) { /* order == 9, 10, 11, 12 */ + if(order > 10) { /* order == 11, 12 */ + __m128i qlp[6], dat[6]; + __m128i summ, temp; + qlp[0] = _mm_loadl_epi64((const __m128i*)(qlp_coeff+0)); // 0 0 q[1] q[0] + qlp[1] = _mm_loadl_epi64((const __m128i*)(qlp_coeff+2)); // 0 0 q[3] q[2] + qlp[2] = _mm_loadl_epi64((const __m128i*)(qlp_coeff+4)); // 0 0 q[5] q[4] + qlp[3] = _mm_loadl_epi64((const __m128i*)(qlp_coeff+6)); // 0 0 q[7] q[6] + qlp[4] = _mm_loadl_epi64((const __m128i*)(qlp_coeff+8)); // 0 0 q[9] q[8] + if (order == 12) + qlp[5] = _mm_loadl_epi64((const __m128i*)(qlp_coeff+10)); // 0 0 q[11] q[10] + else + qlp[5] = _mm_cvtsi32_si128(qlp_coeff[10]); // 0 0 0 q[10] + + qlp[0] = _mm_shuffle_epi32(qlp[0], _MM_SHUFFLE(2,0,3,1)); // 0 q[0] 0 q[1] + qlp[1] = _mm_shuffle_epi32(qlp[1], _MM_SHUFFLE(2,0,3,1)); // 0 q[2] 0 q[3] + qlp[2] = _mm_shuffle_epi32(qlp[2], _MM_SHUFFLE(2,0,3,1)); // 0 q[4] 0 q[5] + qlp[3] = _mm_shuffle_epi32(qlp[3], _MM_SHUFFLE(2,0,3,1)); // 0 q[5] 0 q[7] + qlp[4] = _mm_shuffle_epi32(qlp[4], _MM_SHUFFLE(2,0,3,1)); // 0 q[8] 0 q[9] + qlp[5] = _mm_shuffle_epi32(qlp[5], _MM_SHUFFLE(2,0,3,1)); // 0 q[10] 0 q[11] + + dat[5] = _mm_cvtepu32_epi64(_mm_loadl_epi64((const __m128i*)(data-12))); // ? d[i-11] ? d[i-12] + dat[4] = _mm_cvtepu32_epi64(_mm_loadl_epi64((const __m128i*)(data-10))); // ? d[i-9] ? d[i-10] + dat[3] = _mm_cvtepu32_epi64(_mm_loadl_epi64((const __m128i*)(data-8 ))); // ? d[i-7] ? d[i-8] + dat[2] = _mm_cvtepu32_epi64(_mm_loadl_epi64((const __m128i*)(data-6 ))); // ? d[i-5] ? d[i-6] + dat[1] = _mm_cvtepu32_epi64(_mm_loadl_epi64((const __m128i*)(data-4 ))); // ? d[i-3] ? d[i-4] + dat[0] = _mm_cvtepu32_epi64(_mm_loadl_epi64((const __m128i*)(data-2 ))); // ? d[i-1] ? d[i-2] + + summ = _mm_mul_epi32(dat[5], qlp[5]) ; + summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[4], qlp[4])); + summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[3], qlp[3])); + summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[2], qlp[2])); + summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[1], qlp[1])); + summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[0], qlp[0])); + + summ = _mm_add_epi64(summ, _mm_srli_si128(summ, 8)); // ?_64 sum_64 + summ = _mm_srl_epi64(summ, cnt); // ?_64 (sum >> lp_quantization)_64 == ?_32 ?_32 ?_32 (sum >> lp_quantization)_32 + temp = _mm_cvtsi32_si128(residual[0]); // 0 0 0 r[i] + temp = _mm_add_epi32(temp, summ); // ? ? ? d[i] + data[0] = _mm_cvtsi128_si32(temp); + + for(i = 1; i < (int)data_len; i++) { + dat[5] = _mm_alignr_epi8(dat[4], dat[5], 8); // ? d[i-10] ? d[i-11] + dat[4] = _mm_alignr_epi8(dat[3], dat[4], 8); // ? d[i-8] ? d[i-9] + dat[3] = _mm_alignr_epi8(dat[2], dat[3], 8); // ? d[i-6] ? d[i-7] + dat[2] = _mm_alignr_epi8(dat[1], dat[2], 8); // ? d[i-4] ? d[i-5] + dat[1] = _mm_alignr_epi8(dat[0], dat[1], 8); // ? d[i-2] ? d[i-3] + dat[0] = _mm_alignr_epi8(temp, dat[0], 8); // ? d[i ] ? d[i-1] + + summ = _mm_mul_epi32(dat[5], qlp[5]) ; + summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[4], qlp[4])); + summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[3], qlp[3])); + summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[2], qlp[2])); + summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[1], qlp[1])); + summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[0], qlp[0])); + + summ = _mm_add_epi64(summ, _mm_srli_si128(summ, 8)); // ?_64 sum_64 + summ = _mm_srl_epi64(summ, cnt); // ?_64 (sum >> lp_quantization)_64 == ?_32 ?_32 ?_32 (sum >> lp_quantization)_32 + temp = _mm_cvtsi32_si128(residual[i]); // 0 0 0 r[i] + temp = _mm_add_epi32(temp, summ); // ? ? ? d[i] + data[i] = _mm_cvtsi128_si32(temp); + } + } + else { /* order == 9, 10 */ + __m128i qlp[5], dat[5]; + __m128i summ, temp; + qlp[0] = _mm_loadl_epi64((const __m128i*)(qlp_coeff+0)); + qlp[1] = _mm_loadl_epi64((const __m128i*)(qlp_coeff+2)); + qlp[2] = _mm_loadl_epi64((const __m128i*)(qlp_coeff+4)); + qlp[3] = _mm_loadl_epi64((const __m128i*)(qlp_coeff+6)); + if (order == 10) + qlp[4] = _mm_loadl_epi64((const __m128i*)(qlp_coeff+8)); + else + qlp[4] = _mm_cvtsi32_si128(qlp_coeff[8]); + + qlp[0] = _mm_shuffle_epi32(qlp[0], _MM_SHUFFLE(2,0,3,1)); + qlp[1] = _mm_shuffle_epi32(qlp[1], _MM_SHUFFLE(2,0,3,1)); + qlp[2] = _mm_shuffle_epi32(qlp[2], _MM_SHUFFLE(2,0,3,1)); + qlp[3] = _mm_shuffle_epi32(qlp[3], _MM_SHUFFLE(2,0,3,1)); + qlp[4] = _mm_shuffle_epi32(qlp[4], _MM_SHUFFLE(2,0,3,1)); + + dat[4] = _mm_cvtepu32_epi64(_mm_loadl_epi64((const __m128i*)(data-10))); + dat[3] = _mm_cvtepu32_epi64(_mm_loadl_epi64((const __m128i*)(data-8 ))); + dat[2] = _mm_cvtepu32_epi64(_mm_loadl_epi64((const __m128i*)(data-6 ))); + dat[1] = _mm_cvtepu32_epi64(_mm_loadl_epi64((const __m128i*)(data-4 ))); + dat[0] = _mm_cvtepu32_epi64(_mm_loadl_epi64((const __m128i*)(data-2 ))); + + summ = _mm_mul_epi32(dat[4], qlp[4]) ; + summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[3], qlp[3])); + summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[2], qlp[2])); + summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[1], qlp[1])); + summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[0], qlp[0])); + + summ = _mm_add_epi64(summ, _mm_srli_si128(summ, 8)); + summ = _mm_srl_epi64(summ, cnt); + temp = _mm_cvtsi32_si128(residual[0]); + temp = _mm_add_epi32(temp, summ); + data[0] = _mm_cvtsi128_si32(temp); + + for(i = 1; i < (int)data_len; i++) { + dat[4] = _mm_alignr_epi8(dat[3], dat[4], 8); + dat[3] = _mm_alignr_epi8(dat[2], dat[3], 8); + dat[2] = _mm_alignr_epi8(dat[1], dat[2], 8); + dat[1] = _mm_alignr_epi8(dat[0], dat[1], 8); + dat[0] = _mm_alignr_epi8(temp, dat[0], 8); + + summ = _mm_mul_epi32(dat[4], qlp[4]) ; + summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[3], qlp[3])); + summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[2], qlp[2])); + summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[1], qlp[1])); + summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[0], qlp[0])); + + summ = _mm_add_epi64(summ, _mm_srli_si128(summ, 8)); + summ = _mm_srl_epi64(summ, cnt); + temp = _mm_cvtsi32_si128(residual[i]); + temp = _mm_add_epi32(temp, summ); + data[i] = _mm_cvtsi128_si32(temp); + } + } + } + else if(order > 4) { /* order == 5, 6, 7, 8 */ + if(order > 6) { /* order == 7, 8 */ + __m128i qlp[4], dat[4]; + __m128i summ, temp; + qlp[0] = _mm_loadl_epi64((const __m128i*)(qlp_coeff+0)); + qlp[1] = _mm_loadl_epi64((const __m128i*)(qlp_coeff+2)); + qlp[2] = _mm_loadl_epi64((const __m128i*)(qlp_coeff+4)); + if (order == 8) + qlp[3] = _mm_loadl_epi64((const __m128i*)(qlp_coeff+6)); + else + qlp[3] = _mm_cvtsi32_si128(qlp_coeff[6]); + + qlp[0] = _mm_shuffle_epi32(qlp[0], _MM_SHUFFLE(2,0,3,1)); + qlp[1] = _mm_shuffle_epi32(qlp[1], _MM_SHUFFLE(2,0,3,1)); + qlp[2] = _mm_shuffle_epi32(qlp[2], _MM_SHUFFLE(2,0,3,1)); + qlp[3] = _mm_shuffle_epi32(qlp[3], _MM_SHUFFLE(2,0,3,1)); + + dat[3] = _mm_cvtepu32_epi64(_mm_loadl_epi64((const __m128i*)(data-8 ))); + dat[2] = _mm_cvtepu32_epi64(_mm_loadl_epi64((const __m128i*)(data-6 ))); + dat[1] = _mm_cvtepu32_epi64(_mm_loadl_epi64((const __m128i*)(data-4 ))); + dat[0] = _mm_cvtepu32_epi64(_mm_loadl_epi64((const __m128i*)(data-2 ))); + + summ = _mm_mul_epi32(dat[3], qlp[3]) ; + summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[2], qlp[2])); + summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[1], qlp[1])); + summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[0], qlp[0])); + + summ = _mm_add_epi64(summ, _mm_srli_si128(summ, 8)); + summ = _mm_srl_epi64(summ, cnt); + temp = _mm_cvtsi32_si128(residual[0]); + temp = _mm_add_epi32(temp, summ); + data[0] = _mm_cvtsi128_si32(temp); + + for(i = 1; i < (int)data_len; i++) { + dat[3] = _mm_alignr_epi8(dat[2], dat[3], 8); + dat[2] = _mm_alignr_epi8(dat[1], dat[2], 8); + dat[1] = _mm_alignr_epi8(dat[0], dat[1], 8); + dat[0] = _mm_alignr_epi8(temp, dat[0], 8); + + summ = _mm_mul_epi32(dat[3], qlp[3]) ; + summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[2], qlp[2])); + summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[1], qlp[1])); + summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[0], qlp[0])); + + summ = _mm_add_epi64(summ, _mm_srli_si128(summ, 8)); + summ = _mm_srl_epi64(summ, cnt); + temp = _mm_cvtsi32_si128(residual[i]); + temp = _mm_add_epi32(temp, summ); + data[i] = _mm_cvtsi128_si32(temp); + } + } + else { /* order == 5, 6 */ + __m128i qlp[3], dat[3]; + __m128i summ, temp; + qlp[0] = _mm_loadl_epi64((const __m128i*)(qlp_coeff+0)); + qlp[1] = _mm_loadl_epi64((const __m128i*)(qlp_coeff+2)); + if (order == 6) + qlp[2] = _mm_loadl_epi64((const __m128i*)(qlp_coeff+4)); + else + qlp[2] = _mm_cvtsi32_si128(qlp_coeff[4]); + + qlp[0] = _mm_shuffle_epi32(qlp[0], _MM_SHUFFLE(2,0,3,1)); + qlp[1] = _mm_shuffle_epi32(qlp[1], _MM_SHUFFLE(2,0,3,1)); + qlp[2] = _mm_shuffle_epi32(qlp[2], _MM_SHUFFLE(2,0,3,1)); + + dat[2] = _mm_cvtepu32_epi64(_mm_loadl_epi64((const __m128i*)(data-6 ))); + dat[1] = _mm_cvtepu32_epi64(_mm_loadl_epi64((const __m128i*)(data-4 ))); + dat[0] = _mm_cvtepu32_epi64(_mm_loadl_epi64((const __m128i*)(data-2 ))); + + summ = _mm_mul_epi32(dat[2], qlp[2]) ; + summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[1], qlp[1])); + summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[0], qlp[0])); + + summ = _mm_add_epi64(summ, _mm_srli_si128(summ, 8)); + summ = _mm_srl_epi64(summ, cnt); + temp = _mm_cvtsi32_si128(residual[0]); + temp = _mm_add_epi32(temp, summ); + data[0] = _mm_cvtsi128_si32(temp); + + for(i = 1; i < (int)data_len; i++) { + dat[2] = _mm_alignr_epi8(dat[1], dat[2], 8); + dat[1] = _mm_alignr_epi8(dat[0], dat[1], 8); + dat[0] = _mm_alignr_epi8(temp, dat[0], 8); + + summ = _mm_mul_epi32(dat[2], qlp[2]) ; + summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[1], qlp[1])); + summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[0], qlp[0])); + + summ = _mm_add_epi64(summ, _mm_srli_si128(summ, 8)); + summ = _mm_srl_epi64(summ, cnt); + temp = _mm_cvtsi32_si128(residual[i]); + temp = _mm_add_epi32(temp, summ); + data[i] = _mm_cvtsi128_si32(temp); + } + } + } + else { /* order == 1, 2, 3, 4 */ + if(order > 2) { /* order == 3, 4 */ + __m128i qlp[2], dat[2]; + __m128i summ, temp; + qlp[0] = _mm_loadl_epi64((const __m128i*)(qlp_coeff+0)); + if (order == 4) + qlp[1] = _mm_loadl_epi64((const __m128i*)(qlp_coeff+2)); + else + qlp[1] = _mm_cvtsi32_si128(qlp_coeff[2]); + + qlp[0] = _mm_shuffle_epi32(qlp[0], _MM_SHUFFLE(2,0,3,1)); + qlp[1] = _mm_shuffle_epi32(qlp[1], _MM_SHUFFLE(2,0,3,1)); + + dat[1] = _mm_cvtepu32_epi64(_mm_loadl_epi64((const __m128i*)(data-4 ))); + dat[0] = _mm_cvtepu32_epi64(_mm_loadl_epi64((const __m128i*)(data-2 ))); + + summ = _mm_mul_epi32(dat[1], qlp[1]) ; + summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[0], qlp[0])); + + summ = _mm_add_epi64(summ, _mm_srli_si128(summ, 8)); + summ = _mm_srl_epi64(summ, cnt); + temp = _mm_cvtsi32_si128(residual[0]); + temp = _mm_add_epi32(temp, summ); + data[0] = _mm_cvtsi128_si32(temp); + + for(i = 1; i < (int)data_len; i++) { + dat[1] = _mm_alignr_epi8(dat[0], dat[1], 8); + dat[0] = _mm_alignr_epi8(temp, dat[0], 8); + + summ = _mm_mul_epi32(dat[1], qlp[1]) ; + summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[0], qlp[0])); + + summ = _mm_add_epi64(summ, _mm_srli_si128(summ, 8)); + summ = _mm_srl_epi64(summ, cnt); + temp = _mm_cvtsi32_si128(residual[i]); + temp = _mm_add_epi32(temp, summ); + data[i] = _mm_cvtsi128_si32(temp); + } + } + else { /* order == 1, 2 */ + if(order == 2) { + __m128i qlp0, dat0; + __m128i summ, temp; + qlp0 = _mm_loadl_epi64((const __m128i*)(qlp_coeff)); + qlp0 = _mm_shuffle_epi32(qlp0, _MM_SHUFFLE(2,0,3,1)); + + dat0 = _mm_cvtepu32_epi64(_mm_loadl_epi64((const __m128i*)(data-2 ))); + + summ = _mm_mul_epi32(dat0, qlp0) ; + + summ = _mm_add_epi64(summ, _mm_srli_si128(summ, 8)); + summ = _mm_srl_epi64(summ, cnt); + temp = _mm_cvtsi32_si128(residual[0]); + temp = _mm_add_epi32(temp, summ); + data[0] = _mm_cvtsi128_si32(temp); + + for(i = 1; i < (int)data_len; i++) { + dat0 = _mm_alignr_epi8(temp, dat0, 8); + + summ = _mm_mul_epi32(dat0, qlp0) ; + + summ = _mm_add_epi64(summ, _mm_srli_si128(summ, 8)); + summ = _mm_srl_epi64(summ, cnt); + temp = _mm_cvtsi32_si128(residual[i]); + temp = _mm_add_epi32(temp, summ); + data[i] = _mm_cvtsi128_si32(temp); + } + } + else { /* order == 1 */ + __m128i qlp0; + __m128i summ, temp; + qlp0 = _mm_cvtsi32_si128(qlp_coeff[0]); + temp = _mm_cvtsi32_si128(data[-1]); + + summ = _mm_mul_epi32(temp, qlp0); + summ = _mm_srl_epi64(summ, cnt); + temp = _mm_cvtsi32_si128(residual[0]); + temp = _mm_add_epi32(temp, summ); + data[0] = _mm_cvtsi128_si32(temp); + + for(i = 1; i < (int)data_len; i++) { + summ = _mm_mul_epi32(temp, qlp0) ; + summ = _mm_srl_epi64(summ, cnt); + temp = _mm_cvtsi32_si128(residual[i]); + temp = _mm_add_epi32(temp, summ); + data[i] = _mm_cvtsi128_si32(temp); + } + } + } + } + } + else { /* order > 12 */ + FLAC__int64 sum; + for(i = 0; i < (int)data_len; i++) { + sum = 0; + switch(order) { + case 32: sum += qlp_coeff[31] * (FLAC__int64)data[i-32]; + case 31: sum += qlp_coeff[30] * (FLAC__int64)data[i-31]; + case 30: sum += qlp_coeff[29] * (FLAC__int64)data[i-30]; + case 29: sum += qlp_coeff[28] * (FLAC__int64)data[i-29]; + case 28: sum += qlp_coeff[27] * (FLAC__int64)data[i-28]; + case 27: sum += qlp_coeff[26] * (FLAC__int64)data[i-27]; + case 26: sum += qlp_coeff[25] * (FLAC__int64)data[i-26]; + case 25: sum += qlp_coeff[24] * (FLAC__int64)data[i-25]; + case 24: sum += qlp_coeff[23] * (FLAC__int64)data[i-24]; + case 23: sum += qlp_coeff[22] * (FLAC__int64)data[i-23]; + case 22: sum += qlp_coeff[21] * (FLAC__int64)data[i-22]; + case 21: sum += qlp_coeff[20] * (FLAC__int64)data[i-21]; + case 20: sum += qlp_coeff[19] * (FLAC__int64)data[i-20]; + case 19: sum += qlp_coeff[18] * (FLAC__int64)data[i-19]; + case 18: sum += qlp_coeff[17] * (FLAC__int64)data[i-18]; + case 17: sum += qlp_coeff[16] * (FLAC__int64)data[i-17]; + case 16: sum += qlp_coeff[15] * (FLAC__int64)data[i-16]; + case 15: sum += qlp_coeff[14] * (FLAC__int64)data[i-15]; + case 14: sum += qlp_coeff[13] * (FLAC__int64)data[i-14]; + case 13: sum += qlp_coeff[12] * (FLAC__int64)data[i-13]; + sum += qlp_coeff[11] * (FLAC__int64)data[i-12]; + sum += qlp_coeff[10] * (FLAC__int64)data[i-11]; + sum += qlp_coeff[ 9] * (FLAC__int64)data[i-10]; + sum += qlp_coeff[ 8] * (FLAC__int64)data[i- 9]; + sum += qlp_coeff[ 7] * (FLAC__int64)data[i- 8]; + sum += qlp_coeff[ 6] * (FLAC__int64)data[i- 7]; + sum += qlp_coeff[ 5] * (FLAC__int64)data[i- 6]; + sum += qlp_coeff[ 4] * (FLAC__int64)data[i- 5]; + sum += qlp_coeff[ 3] * (FLAC__int64)data[i- 4]; + sum += qlp_coeff[ 2] * (FLAC__int64)data[i- 3]; + sum += qlp_coeff[ 1] * (FLAC__int64)data[i- 2]; + sum += qlp_coeff[ 0] * (FLAC__int64)data[i- 1]; + } + data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); + } + } +} + +#endif /* defined FLAC__CPU_IA32 */ + +FLAC__SSE_TARGET("sse4.1") +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[]) +{ + int i; + FLAC__int32 sum; + __m128i cnt = _mm_cvtsi32_si128(lp_quantization); + + FLAC__ASSERT(order > 0); + FLAC__ASSERT(order <= 32); + + if(order <= 12) { + if(order > 8) { + if(order > 10) { + if(order == 12) { + __m128i q0, q1, q2, q3, q4, q5, q6, q7, q8, q9, q10, q11; + q0 = _mm_cvtsi32_si128(qlp_coeff[0]); q0 = _mm_shuffle_epi32(q0, _MM_SHUFFLE(0,0,0,0)); + q1 = _mm_cvtsi32_si128(qlp_coeff[1]); q1 = _mm_shuffle_epi32(q1, _MM_SHUFFLE(0,0,0,0)); + q2 = _mm_cvtsi32_si128(qlp_coeff[2]); q2 = _mm_shuffle_epi32(q2, _MM_SHUFFLE(0,0,0,0)); + q3 = _mm_cvtsi32_si128(qlp_coeff[3]); q3 = _mm_shuffle_epi32(q3, _MM_SHUFFLE(0,0,0,0)); + q4 = _mm_cvtsi32_si128(qlp_coeff[4]); q4 = _mm_shuffle_epi32(q4, _MM_SHUFFLE(0,0,0,0)); + q5 = _mm_cvtsi32_si128(qlp_coeff[5]); q5 = _mm_shuffle_epi32(q5, _MM_SHUFFLE(0,0,0,0)); + q6 = _mm_cvtsi32_si128(qlp_coeff[6]); q6 = _mm_shuffle_epi32(q6, _MM_SHUFFLE(0,0,0,0)); + q7 = _mm_cvtsi32_si128(qlp_coeff[7]); q7 = _mm_shuffle_epi32(q7, _MM_SHUFFLE(0,0,0,0)); + q8 = _mm_cvtsi32_si128(qlp_coeff[8]); q8 = _mm_shuffle_epi32(q8, _MM_SHUFFLE(0,0,0,0)); + q9 = _mm_cvtsi32_si128(qlp_coeff[9]); q9 = _mm_shuffle_epi32(q9, _MM_SHUFFLE(0,0,0,0)); + q10 = _mm_cvtsi32_si128(qlp_coeff[10]); q10 = _mm_shuffle_epi32(q10, _MM_SHUFFLE(0,0,0,0)); + q11 = _mm_cvtsi32_si128(qlp_coeff[11]); q11 = _mm_shuffle_epi32(q11, _MM_SHUFFLE(0,0,0,0)); + + for(i = 0; i < (int)data_len-3; i+=4) { + __m128i summ, mull; + summ = _mm_mullo_epi32(q11, _mm_loadu_si128((const __m128i*)(data+i-12))); + mull = _mm_mullo_epi32(q10, _mm_loadu_si128((const __m128i*)(data+i-11))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q9, _mm_loadu_si128((const __m128i*)(data+i-10))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q8, _mm_loadu_si128((const __m128i*)(data+i-9))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q7, _mm_loadu_si128((const __m128i*)(data+i-8))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q6, _mm_loadu_si128((const __m128i*)(data+i-7))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q5, _mm_loadu_si128((const __m128i*)(data+i-6))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q4, _mm_loadu_si128((const __m128i*)(data+i-5))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q3, _mm_loadu_si128((const __m128i*)(data+i-4))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q2, _mm_loadu_si128((const __m128i*)(data+i-3))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q1, _mm_loadu_si128((const __m128i*)(data+i-2))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q0, _mm_loadu_si128((const __m128i*)(data+i-1))); summ = _mm_add_epi32(summ, mull); + summ = _mm_sra_epi32(summ, cnt); + _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), summ)); + } + } + else { /* order == 11 */ + __m128i q0, q1, q2, q3, q4, q5, q6, q7, q8, q9, q10; + q0 = _mm_cvtsi32_si128(qlp_coeff[0]); q0 = _mm_shuffle_epi32(q0, _MM_SHUFFLE(0,0,0,0)); + q1 = _mm_cvtsi32_si128(qlp_coeff[1]); q1 = _mm_shuffle_epi32(q1, _MM_SHUFFLE(0,0,0,0)); + q2 = _mm_cvtsi32_si128(qlp_coeff[2]); q2 = _mm_shuffle_epi32(q2, _MM_SHUFFLE(0,0,0,0)); + q3 = _mm_cvtsi32_si128(qlp_coeff[3]); q3 = _mm_shuffle_epi32(q3, _MM_SHUFFLE(0,0,0,0)); + q4 = _mm_cvtsi32_si128(qlp_coeff[4]); q4 = _mm_shuffle_epi32(q4, _MM_SHUFFLE(0,0,0,0)); + q5 = _mm_cvtsi32_si128(qlp_coeff[5]); q5 = _mm_shuffle_epi32(q5, _MM_SHUFFLE(0,0,0,0)); + q6 = _mm_cvtsi32_si128(qlp_coeff[6]); q6 = _mm_shuffle_epi32(q6, _MM_SHUFFLE(0,0,0,0)); + q7 = _mm_cvtsi32_si128(qlp_coeff[7]); q7 = _mm_shuffle_epi32(q7, _MM_SHUFFLE(0,0,0,0)); + q8 = _mm_cvtsi32_si128(qlp_coeff[8]); q8 = _mm_shuffle_epi32(q8, _MM_SHUFFLE(0,0,0,0)); + q9 = _mm_cvtsi32_si128(qlp_coeff[9]); q9 = _mm_shuffle_epi32(q9, _MM_SHUFFLE(0,0,0,0)); + q10 = _mm_cvtsi32_si128(qlp_coeff[10]); q10 = _mm_shuffle_epi32(q10, _MM_SHUFFLE(0,0,0,0)); + + for(i = 0; i < (int)data_len-3; i+=4) { + __m128i summ, mull; + summ = _mm_mullo_epi32(q10, _mm_loadu_si128((const __m128i*)(data+i-11))); + mull = _mm_mullo_epi32(q9, _mm_loadu_si128((const __m128i*)(data+i-10))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q8, _mm_loadu_si128((const __m128i*)(data+i-9))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q7, _mm_loadu_si128((const __m128i*)(data+i-8))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q6, _mm_loadu_si128((const __m128i*)(data+i-7))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q5, _mm_loadu_si128((const __m128i*)(data+i-6))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q4, _mm_loadu_si128((const __m128i*)(data+i-5))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q3, _mm_loadu_si128((const __m128i*)(data+i-4))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q2, _mm_loadu_si128((const __m128i*)(data+i-3))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q1, _mm_loadu_si128((const __m128i*)(data+i-2))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q0, _mm_loadu_si128((const __m128i*)(data+i-1))); summ = _mm_add_epi32(summ, mull); + summ = _mm_sra_epi32(summ, cnt); + _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), summ)); + } + } + } + else { + if(order == 10) { + __m128i q0, q1, q2, q3, q4, q5, q6, q7, q8, q9; + q0 = _mm_cvtsi32_si128(qlp_coeff[0]); q0 = _mm_shuffle_epi32(q0, _MM_SHUFFLE(0,0,0,0)); + q1 = _mm_cvtsi32_si128(qlp_coeff[1]); q1 = _mm_shuffle_epi32(q1, _MM_SHUFFLE(0,0,0,0)); + q2 = _mm_cvtsi32_si128(qlp_coeff[2]); q2 = _mm_shuffle_epi32(q2, _MM_SHUFFLE(0,0,0,0)); + q3 = _mm_cvtsi32_si128(qlp_coeff[3]); q3 = _mm_shuffle_epi32(q3, _MM_SHUFFLE(0,0,0,0)); + q4 = _mm_cvtsi32_si128(qlp_coeff[4]); q4 = _mm_shuffle_epi32(q4, _MM_SHUFFLE(0,0,0,0)); + q5 = _mm_cvtsi32_si128(qlp_coeff[5]); q5 = _mm_shuffle_epi32(q5, _MM_SHUFFLE(0,0,0,0)); + q6 = _mm_cvtsi32_si128(qlp_coeff[6]); q6 = _mm_shuffle_epi32(q6, _MM_SHUFFLE(0,0,0,0)); + q7 = _mm_cvtsi32_si128(qlp_coeff[7]); q7 = _mm_shuffle_epi32(q7, _MM_SHUFFLE(0,0,0,0)); + q8 = _mm_cvtsi32_si128(qlp_coeff[8]); q8 = _mm_shuffle_epi32(q8, _MM_SHUFFLE(0,0,0,0)); + q9 = _mm_cvtsi32_si128(qlp_coeff[9]); q9 = _mm_shuffle_epi32(q9, _MM_SHUFFLE(0,0,0,0)); + + for(i = 0; i < (int)data_len-3; i+=4) { + __m128i summ, mull; + summ = _mm_mullo_epi32(q9, _mm_loadu_si128((const __m128i*)(data+i-10))); + mull = _mm_mullo_epi32(q8, _mm_loadu_si128((const __m128i*)(data+i-9))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q7, _mm_loadu_si128((const __m128i*)(data+i-8))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q6, _mm_loadu_si128((const __m128i*)(data+i-7))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q5, _mm_loadu_si128((const __m128i*)(data+i-6))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q4, _mm_loadu_si128((const __m128i*)(data+i-5))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q3, _mm_loadu_si128((const __m128i*)(data+i-4))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q2, _mm_loadu_si128((const __m128i*)(data+i-3))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q1, _mm_loadu_si128((const __m128i*)(data+i-2))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q0, _mm_loadu_si128((const __m128i*)(data+i-1))); summ = _mm_add_epi32(summ, mull); + summ = _mm_sra_epi32(summ, cnt); + _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), summ)); + } + } + else { /* order == 9 */ + __m128i q0, q1, q2, q3, q4, q5, q6, q7, q8; + q0 = _mm_cvtsi32_si128(qlp_coeff[0]); q0 = _mm_shuffle_epi32(q0, _MM_SHUFFLE(0,0,0,0)); + q1 = _mm_cvtsi32_si128(qlp_coeff[1]); q1 = _mm_shuffle_epi32(q1, _MM_SHUFFLE(0,0,0,0)); + q2 = _mm_cvtsi32_si128(qlp_coeff[2]); q2 = _mm_shuffle_epi32(q2, _MM_SHUFFLE(0,0,0,0)); + q3 = _mm_cvtsi32_si128(qlp_coeff[3]); q3 = _mm_shuffle_epi32(q3, _MM_SHUFFLE(0,0,0,0)); + q4 = _mm_cvtsi32_si128(qlp_coeff[4]); q4 = _mm_shuffle_epi32(q4, _MM_SHUFFLE(0,0,0,0)); + q5 = _mm_cvtsi32_si128(qlp_coeff[5]); q5 = _mm_shuffle_epi32(q5, _MM_SHUFFLE(0,0,0,0)); + q6 = _mm_cvtsi32_si128(qlp_coeff[6]); q6 = _mm_shuffle_epi32(q6, _MM_SHUFFLE(0,0,0,0)); + q7 = _mm_cvtsi32_si128(qlp_coeff[7]); q7 = _mm_shuffle_epi32(q7, _MM_SHUFFLE(0,0,0,0)); + q8 = _mm_cvtsi32_si128(qlp_coeff[8]); q8 = _mm_shuffle_epi32(q8, _MM_SHUFFLE(0,0,0,0)); + + for(i = 0; i < (int)data_len-3; i+=4) { + __m128i summ, mull; + summ = _mm_mullo_epi32(q8, _mm_loadu_si128((const __m128i*)(data+i-9))); + mull = _mm_mullo_epi32(q7, _mm_loadu_si128((const __m128i*)(data+i-8))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q6, _mm_loadu_si128((const __m128i*)(data+i-7))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q5, _mm_loadu_si128((const __m128i*)(data+i-6))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q4, _mm_loadu_si128((const __m128i*)(data+i-5))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q3, _mm_loadu_si128((const __m128i*)(data+i-4))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q2, _mm_loadu_si128((const __m128i*)(data+i-3))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q1, _mm_loadu_si128((const __m128i*)(data+i-2))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q0, _mm_loadu_si128((const __m128i*)(data+i-1))); summ = _mm_add_epi32(summ, mull); + summ = _mm_sra_epi32(summ, cnt); + _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), summ)); + } + } + } + } + else if(order > 4) { + if(order > 6) { + if(order == 8) { + __m128i q0, q1, q2, q3, q4, q5, q6, q7; + q0 = _mm_cvtsi32_si128(qlp_coeff[0]); q0 = _mm_shuffle_epi32(q0, _MM_SHUFFLE(0,0,0,0)); + q1 = _mm_cvtsi32_si128(qlp_coeff[1]); q1 = _mm_shuffle_epi32(q1, _MM_SHUFFLE(0,0,0,0)); + q2 = _mm_cvtsi32_si128(qlp_coeff[2]); q2 = _mm_shuffle_epi32(q2, _MM_SHUFFLE(0,0,0,0)); + q3 = _mm_cvtsi32_si128(qlp_coeff[3]); q3 = _mm_shuffle_epi32(q3, _MM_SHUFFLE(0,0,0,0)); + q4 = _mm_cvtsi32_si128(qlp_coeff[4]); q4 = _mm_shuffle_epi32(q4, _MM_SHUFFLE(0,0,0,0)); + q5 = _mm_cvtsi32_si128(qlp_coeff[5]); q5 = _mm_shuffle_epi32(q5, _MM_SHUFFLE(0,0,0,0)); + q6 = _mm_cvtsi32_si128(qlp_coeff[6]); q6 = _mm_shuffle_epi32(q6, _MM_SHUFFLE(0,0,0,0)); + q7 = _mm_cvtsi32_si128(qlp_coeff[7]); q7 = _mm_shuffle_epi32(q7, _MM_SHUFFLE(0,0,0,0)); + + for(i = 0; i < (int)data_len-3; i+=4) { + __m128i summ, mull; + summ = _mm_mullo_epi32(q7, _mm_loadu_si128((const __m128i*)(data+i-8))); + mull = _mm_mullo_epi32(q6, _mm_loadu_si128((const __m128i*)(data+i-7))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q5, _mm_loadu_si128((const __m128i*)(data+i-6))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q4, _mm_loadu_si128((const __m128i*)(data+i-5))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q3, _mm_loadu_si128((const __m128i*)(data+i-4))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q2, _mm_loadu_si128((const __m128i*)(data+i-3))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q1, _mm_loadu_si128((const __m128i*)(data+i-2))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q0, _mm_loadu_si128((const __m128i*)(data+i-1))); summ = _mm_add_epi32(summ, mull); + summ = _mm_sra_epi32(summ, cnt); + _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), summ)); + } + } + else { /* order == 7 */ + __m128i q0, q1, q2, q3, q4, q5, q6; + q0 = _mm_cvtsi32_si128(qlp_coeff[0]); q0 = _mm_shuffle_epi32(q0, _MM_SHUFFLE(0,0,0,0)); + q1 = _mm_cvtsi32_si128(qlp_coeff[1]); q1 = _mm_shuffle_epi32(q1, _MM_SHUFFLE(0,0,0,0)); + q2 = _mm_cvtsi32_si128(qlp_coeff[2]); q2 = _mm_shuffle_epi32(q2, _MM_SHUFFLE(0,0,0,0)); + q3 = _mm_cvtsi32_si128(qlp_coeff[3]); q3 = _mm_shuffle_epi32(q3, _MM_SHUFFLE(0,0,0,0)); + q4 = _mm_cvtsi32_si128(qlp_coeff[4]); q4 = _mm_shuffle_epi32(q4, _MM_SHUFFLE(0,0,0,0)); + q5 = _mm_cvtsi32_si128(qlp_coeff[5]); q5 = _mm_shuffle_epi32(q5, _MM_SHUFFLE(0,0,0,0)); + q6 = _mm_cvtsi32_si128(qlp_coeff[6]); q6 = _mm_shuffle_epi32(q6, _MM_SHUFFLE(0,0,0,0)); + + for(i = 0; i < (int)data_len-3; i+=4) { + __m128i summ, mull; + summ = _mm_mullo_epi32(q6, _mm_loadu_si128((const __m128i*)(data+i-7))); + mull = _mm_mullo_epi32(q5, _mm_loadu_si128((const __m128i*)(data+i-6))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q4, _mm_loadu_si128((const __m128i*)(data+i-5))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q3, _mm_loadu_si128((const __m128i*)(data+i-4))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q2, _mm_loadu_si128((const __m128i*)(data+i-3))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q1, _mm_loadu_si128((const __m128i*)(data+i-2))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q0, _mm_loadu_si128((const __m128i*)(data+i-1))); summ = _mm_add_epi32(summ, mull); + summ = _mm_sra_epi32(summ, cnt); + _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), summ)); + } + } + } + else { + if(order == 6) { + __m128i q0, q1, q2, q3, q4, q5; + q0 = _mm_cvtsi32_si128(qlp_coeff[0]); q0 = _mm_shuffle_epi32(q0, _MM_SHUFFLE(0,0,0,0)); + q1 = _mm_cvtsi32_si128(qlp_coeff[1]); q1 = _mm_shuffle_epi32(q1, _MM_SHUFFLE(0,0,0,0)); + q2 = _mm_cvtsi32_si128(qlp_coeff[2]); q2 = _mm_shuffle_epi32(q2, _MM_SHUFFLE(0,0,0,0)); + q3 = _mm_cvtsi32_si128(qlp_coeff[3]); q3 = _mm_shuffle_epi32(q3, _MM_SHUFFLE(0,0,0,0)); + q4 = _mm_cvtsi32_si128(qlp_coeff[4]); q4 = _mm_shuffle_epi32(q4, _MM_SHUFFLE(0,0,0,0)); + q5 = _mm_cvtsi32_si128(qlp_coeff[5]); q5 = _mm_shuffle_epi32(q5, _MM_SHUFFLE(0,0,0,0)); + + for(i = 0; i < (int)data_len-3; i+=4) { + __m128i summ, mull; + summ = _mm_mullo_epi32(q5, _mm_loadu_si128((const __m128i*)(data+i-6))); + mull = _mm_mullo_epi32(q4, _mm_loadu_si128((const __m128i*)(data+i-5))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q3, _mm_loadu_si128((const __m128i*)(data+i-4))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q2, _mm_loadu_si128((const __m128i*)(data+i-3))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q1, _mm_loadu_si128((const __m128i*)(data+i-2))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q0, _mm_loadu_si128((const __m128i*)(data+i-1))); summ = _mm_add_epi32(summ, mull); + summ = _mm_sra_epi32(summ, cnt); + _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), summ)); + } + } + else { /* order == 5 */ + __m128i q0, q1, q2, q3, q4; + q0 = _mm_cvtsi32_si128(qlp_coeff[0]); q0 = _mm_shuffle_epi32(q0, _MM_SHUFFLE(0,0,0,0)); + q1 = _mm_cvtsi32_si128(qlp_coeff[1]); q1 = _mm_shuffle_epi32(q1, _MM_SHUFFLE(0,0,0,0)); + q2 = _mm_cvtsi32_si128(qlp_coeff[2]); q2 = _mm_shuffle_epi32(q2, _MM_SHUFFLE(0,0,0,0)); + q3 = _mm_cvtsi32_si128(qlp_coeff[3]); q3 = _mm_shuffle_epi32(q3, _MM_SHUFFLE(0,0,0,0)); + q4 = _mm_cvtsi32_si128(qlp_coeff[4]); q4 = _mm_shuffle_epi32(q4, _MM_SHUFFLE(0,0,0,0)); + + for(i = 0; i < (int)data_len-3; i+=4) { + __m128i summ, mull; + summ = _mm_mullo_epi32(q4, _mm_loadu_si128((const __m128i*)(data+i-5))); + mull = _mm_mullo_epi32(q3, _mm_loadu_si128((const __m128i*)(data+i-4))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q2, _mm_loadu_si128((const __m128i*)(data+i-3))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q1, _mm_loadu_si128((const __m128i*)(data+i-2))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q0, _mm_loadu_si128((const __m128i*)(data+i-1))); summ = _mm_add_epi32(summ, mull); + summ = _mm_sra_epi32(summ, cnt); + _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), summ)); + } + } + } + } + else { + if(order > 2) { + if(order == 4) { + __m128i q0, q1, q2, q3; + q0 = _mm_cvtsi32_si128(qlp_coeff[0]); q0 = _mm_shuffle_epi32(q0, _MM_SHUFFLE(0,0,0,0)); + q1 = _mm_cvtsi32_si128(qlp_coeff[1]); q1 = _mm_shuffle_epi32(q1, _MM_SHUFFLE(0,0,0,0)); + q2 = _mm_cvtsi32_si128(qlp_coeff[2]); q2 = _mm_shuffle_epi32(q2, _MM_SHUFFLE(0,0,0,0)); + q3 = _mm_cvtsi32_si128(qlp_coeff[3]); q3 = _mm_shuffle_epi32(q3, _MM_SHUFFLE(0,0,0,0)); + + for(i = 0; i < (int)data_len-3; i+=4) { + __m128i summ, mull; + summ = _mm_mullo_epi32(q3, _mm_loadu_si128((const __m128i*)(data+i-4))); + mull = _mm_mullo_epi32(q2, _mm_loadu_si128((const __m128i*)(data+i-3))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q1, _mm_loadu_si128((const __m128i*)(data+i-2))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q0, _mm_loadu_si128((const __m128i*)(data+i-1))); summ = _mm_add_epi32(summ, mull); + summ = _mm_sra_epi32(summ, cnt); + _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), summ)); + } + } + else { /* order == 3 */ + __m128i q0, q1, q2; + q0 = _mm_cvtsi32_si128(qlp_coeff[0]); q0 = _mm_shuffle_epi32(q0, _MM_SHUFFLE(0,0,0,0)); + q1 = _mm_cvtsi32_si128(qlp_coeff[1]); q1 = _mm_shuffle_epi32(q1, _MM_SHUFFLE(0,0,0,0)); + q2 = _mm_cvtsi32_si128(qlp_coeff[2]); q2 = _mm_shuffle_epi32(q2, _MM_SHUFFLE(0,0,0,0)); + + for(i = 0; i < (int)data_len-3; i+=4) { + __m128i summ, mull; + summ = _mm_mullo_epi32(q2, _mm_loadu_si128((const __m128i*)(data+i-3))); + mull = _mm_mullo_epi32(q1, _mm_loadu_si128((const __m128i*)(data+i-2))); summ = _mm_add_epi32(summ, mull); + mull = _mm_mullo_epi32(q0, _mm_loadu_si128((const __m128i*)(data+i-1))); summ = _mm_add_epi32(summ, mull); + summ = _mm_sra_epi32(summ, cnt); + _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), summ)); + } + } + } + else { + if(order == 2) { + __m128i q0, q1; + q0 = _mm_cvtsi32_si128(qlp_coeff[0]); q0 = _mm_shuffle_epi32(q0, _MM_SHUFFLE(0,0,0,0)); + q1 = _mm_cvtsi32_si128(qlp_coeff[1]); q1 = _mm_shuffle_epi32(q1, _MM_SHUFFLE(0,0,0,0)); + + for(i = 0; i < (int)data_len-3; i+=4) { + __m128i summ, mull; + summ = _mm_mullo_epi32(q1, _mm_loadu_si128((const __m128i*)(data+i-2))); + mull = _mm_mullo_epi32(q0, _mm_loadu_si128((const __m128i*)(data+i-1))); summ = _mm_add_epi32(summ, mull); + summ = _mm_sra_epi32(summ, cnt); + _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), summ)); + } + } + else { /* order == 1 */ + __m128i q0; + q0 = _mm_cvtsi32_si128(qlp_coeff[0]); q0 = _mm_shuffle_epi32(q0, _MM_SHUFFLE(0,0,0,0)); + + for(i = 0; i < (int)data_len-3; i+=4) { + __m128i summ; + summ = _mm_mullo_epi32(q0, _mm_loadu_si128((const __m128i*)(data+i-1))); + summ = _mm_sra_epi32(summ, cnt); + _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), summ)); + } + } + } + } + for(; i < (int)data_len; i++) { + sum = 0; + switch(order) { + case 12: sum += qlp_coeff[11] * data[i-12]; + case 11: sum += qlp_coeff[10] * data[i-11]; + case 10: sum += qlp_coeff[ 9] * data[i-10]; + case 9: sum += qlp_coeff[ 8] * data[i- 9]; + case 8: sum += qlp_coeff[ 7] * data[i- 8]; + case 7: sum += qlp_coeff[ 6] * data[i- 7]; + case 6: sum += qlp_coeff[ 5] * data[i- 6]; + case 5: sum += qlp_coeff[ 4] * data[i- 5]; + case 4: sum += qlp_coeff[ 3] * data[i- 4]; + case 3: sum += qlp_coeff[ 2] * data[i- 3]; + case 2: sum += qlp_coeff[ 1] * data[i- 2]; + case 1: sum += qlp_coeff[ 0] * data[i- 1]; + } + residual[i] = data[i] - (sum >> lp_quantization); + } + } + else { /* order > 12 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + switch(order) { + case 32: sum += qlp_coeff[31] * data[i-32]; + case 31: sum += qlp_coeff[30] * data[i-31]; + case 30: sum += qlp_coeff[29] * data[i-30]; + case 29: sum += qlp_coeff[28] * data[i-29]; + case 28: sum += qlp_coeff[27] * data[i-28]; + case 27: sum += qlp_coeff[26] * data[i-27]; + case 26: sum += qlp_coeff[25] * data[i-26]; + case 25: sum += qlp_coeff[24] * data[i-25]; + case 24: sum += qlp_coeff[23] * data[i-24]; + case 23: sum += qlp_coeff[22] * data[i-23]; + case 22: sum += qlp_coeff[21] * data[i-22]; + case 21: sum += qlp_coeff[20] * data[i-21]; + case 20: sum += qlp_coeff[19] * data[i-20]; + case 19: sum += qlp_coeff[18] * data[i-19]; + case 18: sum += qlp_coeff[17] * data[i-18]; + case 17: sum += qlp_coeff[16] * data[i-17]; + case 16: sum += qlp_coeff[15] * data[i-16]; + case 15: sum += qlp_coeff[14] * data[i-15]; + case 14: sum += qlp_coeff[13] * data[i-14]; + case 13: sum += qlp_coeff[12] * data[i-13]; + sum += qlp_coeff[11] * data[i-12]; + sum += qlp_coeff[10] * data[i-11]; + sum += qlp_coeff[ 9] * data[i-10]; + sum += qlp_coeff[ 8] * data[i- 9]; + sum += qlp_coeff[ 7] * data[i- 8]; + sum += qlp_coeff[ 6] * data[i- 7]; + sum += qlp_coeff[ 5] * data[i- 6]; + sum += qlp_coeff[ 4] * data[i- 5]; + sum += qlp_coeff[ 3] * data[i- 4]; + sum += qlp_coeff[ 2] * data[i- 3]; + sum += qlp_coeff[ 1] * data[i- 2]; + sum += qlp_coeff[ 0] * data[i- 1]; + } + residual[i] = data[i] - (sum >> lp_quantization); + } + } +} + +#endif /* FLAC__SSE4_1_SUPPORTED */ +#endif /* (FLAC__CPU_IA32 || FLAC__CPU_X86_64) && FLAC__HAS_X86INTRIN */ +#endif /* FLAC__NO_ASM */ +#endif /* FLAC__INTEGER_ONLY_LIBRARY */ diff --git a/core/cd_hw/libchdr/deps/libFLAC/md5.c b/core/cd_hw/libchdr/deps/libFLAC/md5.c new file mode 100644 index 0000000..e9013a9 --- /dev/null +++ b/core/cd_hw/libchdr/deps/libFLAC/md5.c @@ -0,0 +1,516 @@ +#ifdef HAVE_CONFIG_H +# include +#endif + +#include /* for malloc() */ +#include /* 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 . + * 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<>(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; +} diff --git a/core/cd_hw/libchdr/deps/libFLAC/memory.c b/core/cd_hw/libchdr/deps/libFLAC/memory.c new file mode 100644 index 0000000..a8ebd10 --- /dev/null +++ b/core/cd_hw/libchdr/deps/libFLAC/memory.c @@ -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 +#endif + +#ifdef HAVE_STDINT_H +#include +#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); +} diff --git a/core/cd_hw/libchdr/deps/libFLAC/stream_decoder.c b/core/cd_hw/libchdr/deps/libFLAC/stream_decoder.c new file mode 100644 index 0000000..d364b0c --- /dev/null +++ b/core/cd_hw/libchdr/deps/libFLAC/stream_decoder.c @@ -0,0 +1,3400 @@ +/* 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 +#endif + +#include +#include /* for malloc() */ +#include /* for memset/memcpy() */ +#include /* for stat() */ +#include /* for off_t */ +#include "share/compat.h" +#include "FLAC/assert.h" +#include "share/alloc.h" +#include "protected/stream_decoder.h" +#include "private/bitreader.h" +#include "private/bitmath.h" +#include "private/cpu.h" +#include "private/crc.h" +#include "private/fixed.h" +#include "private/format.h" +#include "private/lpc.h" +#include "private/md5.h" +#include "private/memory.h" +#include "private/macros.h" + + +/* technically this should be in an "export.c" but this is convenient enough */ +FLAC_API int FLAC_API_SUPPORTS_OGG_FLAC = FLAC__HAS_OGG; + + +/*********************************************************************** + * + * Private static data + * + ***********************************************************************/ + +static const FLAC__byte ID3V2_TAG_[3] = { 'I', 'D', '3' }; + +/*********************************************************************** + * + * Private class method prototypes + * + ***********************************************************************/ + +static void set_defaults_(FLAC__StreamDecoder *decoder); +static FILE *get_binary_stdin_(void); +static FLAC__bool allocate_output_(FLAC__StreamDecoder *decoder, unsigned size, unsigned channels); +static FLAC__bool has_id_filtered_(FLAC__StreamDecoder *decoder, FLAC__byte *id); +static FLAC__bool find_metadata_(FLAC__StreamDecoder *decoder); +static FLAC__bool read_metadata_(FLAC__StreamDecoder *decoder); +static FLAC__bool read_metadata_streaminfo_(FLAC__StreamDecoder *decoder, FLAC__bool is_last, unsigned length); +static FLAC__bool read_metadata_seektable_(FLAC__StreamDecoder *decoder, FLAC__bool is_last, unsigned length); +static FLAC__bool read_metadata_vorbiscomment_(FLAC__StreamDecoder *decoder, FLAC__StreamMetadata_VorbisComment *obj, unsigned length); +static FLAC__bool read_metadata_cuesheet_(FLAC__StreamDecoder *decoder, FLAC__StreamMetadata_CueSheet *obj); +static FLAC__bool read_metadata_picture_(FLAC__StreamDecoder *decoder, FLAC__StreamMetadata_Picture *obj); +static FLAC__bool skip_id3v2_tag_(FLAC__StreamDecoder *decoder); +static FLAC__bool frame_sync_(FLAC__StreamDecoder *decoder); +static FLAC__bool read_frame_(FLAC__StreamDecoder *decoder, FLAC__bool *got_a_frame, FLAC__bool do_full_decode); +static FLAC__bool read_frame_header_(FLAC__StreamDecoder *decoder); +static FLAC__bool read_subframe_(FLAC__StreamDecoder *decoder, unsigned channel, unsigned bps, FLAC__bool do_full_decode); +static FLAC__bool read_subframe_constant_(FLAC__StreamDecoder *decoder, unsigned channel, unsigned bps, FLAC__bool do_full_decode); +static FLAC__bool read_subframe_fixed_(FLAC__StreamDecoder *decoder, unsigned channel, unsigned bps, const unsigned order, FLAC__bool do_full_decode); +static FLAC__bool read_subframe_lpc_(FLAC__StreamDecoder *decoder, unsigned channel, unsigned bps, const unsigned order, FLAC__bool do_full_decode); +static FLAC__bool read_subframe_verbatim_(FLAC__StreamDecoder *decoder, unsigned channel, unsigned bps, FLAC__bool do_full_decode); +static FLAC__bool read_residual_partitioned_rice_(FLAC__StreamDecoder *decoder, unsigned predictor_order, unsigned partition_order, FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents, FLAC__int32 *residual, FLAC__bool is_extended); +static FLAC__bool read_zero_padding_(FLAC__StreamDecoder *decoder); +static FLAC__bool read_callback_(FLAC__byte buffer[], size_t *bytes, void *client_data); +#if FLAC__HAS_OGG +static FLAC__StreamDecoderReadStatus read_callback_ogg_aspect_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes); +static FLAC__OggDecoderAspectReadStatus read_callback_proxy_(const void *void_decoder, FLAC__byte buffer[], size_t *bytes, void *client_data); +#endif +static FLAC__StreamDecoderWriteStatus write_audio_frame_to_client_(FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[]); +static void send_error_to_client_(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status); +static FLAC__bool seek_to_absolute_sample_(FLAC__StreamDecoder *decoder, FLAC__uint64 stream_length, FLAC__uint64 target_sample); +#if FLAC__HAS_OGG +static FLAC__bool seek_to_absolute_sample_ogg_(FLAC__StreamDecoder *decoder, FLAC__uint64 stream_length, FLAC__uint64 target_sample); +#endif +static FLAC__StreamDecoderReadStatus file_read_callback_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data); +static FLAC__StreamDecoderSeekStatus file_seek_callback_(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data); +static FLAC__StreamDecoderTellStatus file_tell_callback_(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data); +static FLAC__StreamDecoderLengthStatus file_length_callback_(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data); +static FLAC__bool file_eof_callback_(const FLAC__StreamDecoder *decoder, void *client_data); + +/*********************************************************************** + * + * Private class data + * + ***********************************************************************/ + +typedef struct FLAC__StreamDecoderPrivate { + FLAC__bool is_ogg; + FLAC__StreamDecoderReadCallback read_callback; + FLAC__StreamDecoderSeekCallback seek_callback; + FLAC__StreamDecoderTellCallback tell_callback; + FLAC__StreamDecoderLengthCallback length_callback; + FLAC__StreamDecoderEofCallback eof_callback; + FLAC__StreamDecoderWriteCallback write_callback; + FLAC__StreamDecoderMetadataCallback metadata_callback; + FLAC__StreamDecoderErrorCallback error_callback; + /* generic 32-bit datapath: */ + void (*local_lpc_restore_signal)(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); + /* generic 64-bit datapath: */ + void (*local_lpc_restore_signal_64bit)(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); + /* for use when the signal is <= 16 bits-per-sample, or <= 15 bits-per-sample on a side channel (which requires 1 extra bit): */ + void (*local_lpc_restore_signal_16bit)(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); + void *client_data; + FILE *file; /* only used if FLAC__stream_decoder_init_file()/FLAC__stream_decoder_init_file() called, else NULL */ + FLAC__BitReader *input; + FLAC__int32 *output[FLAC__MAX_CHANNELS]; + FLAC__int32 *residual[FLAC__MAX_CHANNELS]; /* WATCHOUT: these are the aligned pointers; the real pointers that should be free()'d are residual_unaligned[] below */ + FLAC__EntropyCodingMethod_PartitionedRiceContents partitioned_rice_contents[FLAC__MAX_CHANNELS]; + unsigned output_capacity, output_channels; + FLAC__uint32 fixed_block_size, next_fixed_block_size; + FLAC__uint64 samples_decoded; + FLAC__bool has_stream_info, has_seek_table; + FLAC__StreamMetadata stream_info; + FLAC__StreamMetadata seek_table; + FLAC__bool metadata_filter[128]; /* MAGIC number 128 == total number of metadata block types == 1 << 7 */ + FLAC__byte *metadata_filter_ids; + size_t metadata_filter_ids_count, metadata_filter_ids_capacity; /* units for both are IDs, not bytes */ + FLAC__Frame frame; + FLAC__bool cached; /* true if there is a byte in lookahead */ + FLAC__CPUInfo cpuinfo; + FLAC__byte header_warmup[2]; /* contains the sync code and reserved bits */ + FLAC__byte lookahead; /* temp storage when we need to look ahead one byte in the stream */ + /* unaligned (original) pointers to allocated data */ + FLAC__int32 *residual_unaligned[FLAC__MAX_CHANNELS]; + FLAC__bool do_md5_checking; /* initially gets protected_->md5_checking but is turned off after a seek or if the metadata has a zero MD5 */ + FLAC__bool internal_reset_hack; /* used only during init() so we can call reset to set up the decoder without rewinding the input */ + FLAC__bool is_seeking; + FLAC__MD5Context md5context; + FLAC__byte computed_md5sum[16]; /* this is the sum we computed from the decoded data */ + /* (the rest of these are only used for seeking) */ + FLAC__Frame last_frame; /* holds the info of the last frame we seeked to */ + FLAC__uint64 first_frame_offset; /* hint to the seek routine of where in the stream the first audio frame starts */ + FLAC__uint64 target_sample; + unsigned unparseable_frame_count; /* used to tell whether we're decoding a future version of FLAC or just got a bad sync */ + FLAC__bool got_a_frame; /* hack needed in Ogg FLAC seek routine to check when process_single() actually writes a frame */ +} FLAC__StreamDecoderPrivate; + +/*********************************************************************** + * + * Public static class data + * + ***********************************************************************/ + +FLAC_API const char * const FLAC__StreamDecoderStateString[] = { + "FLAC__STREAM_DECODER_SEARCH_FOR_METADATA", + "FLAC__STREAM_DECODER_READ_METADATA", + "FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC", + "FLAC__STREAM_DECODER_READ_FRAME", + "FLAC__STREAM_DECODER_END_OF_STREAM", + "FLAC__STREAM_DECODER_OGG_ERROR", + "FLAC__STREAM_DECODER_SEEK_ERROR", + "FLAC__STREAM_DECODER_ABORTED", + "FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR", + "FLAC__STREAM_DECODER_UNINITIALIZED" +}; + +FLAC_API const char * const FLAC__StreamDecoderInitStatusString[] = { + "FLAC__STREAM_DECODER_INIT_STATUS_OK", + "FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER", + "FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS", + "FLAC__STREAM_DECODER_INIT_STATUS_MEMORY_ALLOCATION_ERROR", + "FLAC__STREAM_DECODER_INIT_STATUS_ERROR_OPENING_FILE", + "FLAC__STREAM_DECODER_INIT_STATUS_ALREADY_INITIALIZED" +}; + +FLAC_API const char * const FLAC__StreamDecoderReadStatusString[] = { + "FLAC__STREAM_DECODER_READ_STATUS_CONTINUE", + "FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM", + "FLAC__STREAM_DECODER_READ_STATUS_ABORT" +}; + +FLAC_API const char * const FLAC__StreamDecoderSeekStatusString[] = { + "FLAC__STREAM_DECODER_SEEK_STATUS_OK", + "FLAC__STREAM_DECODER_SEEK_STATUS_ERROR", + "FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED" +}; + +FLAC_API const char * const FLAC__StreamDecoderTellStatusString[] = { + "FLAC__STREAM_DECODER_TELL_STATUS_OK", + "FLAC__STREAM_DECODER_TELL_STATUS_ERROR", + "FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED" +}; + +FLAC_API const char * const FLAC__StreamDecoderLengthStatusString[] = { + "FLAC__STREAM_DECODER_LENGTH_STATUS_OK", + "FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR", + "FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED" +}; + +FLAC_API const char * const FLAC__StreamDecoderWriteStatusString[] = { + "FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE", + "FLAC__STREAM_DECODER_WRITE_STATUS_ABORT" +}; + +FLAC_API const char * const FLAC__StreamDecoderErrorStatusString[] = { + "FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC", + "FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER", + "FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH", + "FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM" +}; + +/*********************************************************************** + * + * Class constructor/destructor + * + ***********************************************************************/ +FLAC_API FLAC__StreamDecoder *FLAC__stream_decoder_new(void) +{ + FLAC__StreamDecoder *decoder; + unsigned i; + + FLAC__ASSERT(sizeof(int) >= 4); /* we want to die right away if this is not true */ + + decoder = calloc(1, sizeof(FLAC__StreamDecoder)); + if(decoder == 0) { + return 0; + } + + decoder->protected_ = calloc(1, sizeof(FLAC__StreamDecoderProtected)); + if(decoder->protected_ == 0) { + free(decoder); + return 0; + } + + decoder->private_ = calloc(1, sizeof(FLAC__StreamDecoderPrivate)); + if(decoder->private_ == 0) { + free(decoder->protected_); + free(decoder); + return 0; + } + + decoder->private_->input = FLAC__bitreader_new(); + if(decoder->private_->input == 0) { + free(decoder->private_); + free(decoder->protected_); + free(decoder); + return 0; + } + + decoder->private_->metadata_filter_ids_capacity = 16; + if(0 == (decoder->private_->metadata_filter_ids = malloc((FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8) * decoder->private_->metadata_filter_ids_capacity))) { + FLAC__bitreader_delete(decoder->private_->input); + free(decoder->private_); + free(decoder->protected_); + free(decoder); + return 0; + } + + for(i = 0; i < FLAC__MAX_CHANNELS; i++) { + decoder->private_->output[i] = 0; + decoder->private_->residual_unaligned[i] = decoder->private_->residual[i] = 0; + } + + decoder->private_->output_capacity = 0; + decoder->private_->output_channels = 0; + decoder->private_->has_seek_table = false; + + for(i = 0; i < FLAC__MAX_CHANNELS; i++) + FLAC__format_entropy_coding_method_partitioned_rice_contents_init(&decoder->private_->partitioned_rice_contents[i]); + + decoder->private_->file = 0; + + set_defaults_(decoder); + + decoder->protected_->state = FLAC__STREAM_DECODER_UNINITIALIZED; + + return decoder; +} + +FLAC_API void FLAC__stream_decoder_delete(FLAC__StreamDecoder *decoder) +{ + unsigned i; + + if (decoder == NULL) + return ; + + FLAC__ASSERT(0 != decoder->protected_); + FLAC__ASSERT(0 != decoder->private_); + FLAC__ASSERT(0 != decoder->private_->input); + + (void)FLAC__stream_decoder_finish(decoder); + + if(0 != decoder->private_->metadata_filter_ids) + free(decoder->private_->metadata_filter_ids); + + FLAC__bitreader_delete(decoder->private_->input); + + for(i = 0; i < FLAC__MAX_CHANNELS; i++) + FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(&decoder->private_->partitioned_rice_contents[i]); + + free(decoder->private_); + free(decoder->protected_); + free(decoder); +} + +/*********************************************************************** + * + * Public class methods + * + ***********************************************************************/ + +static FLAC__StreamDecoderInitStatus init_stream_internal_( + FLAC__StreamDecoder *decoder, + FLAC__StreamDecoderReadCallback read_callback, + FLAC__StreamDecoderSeekCallback seek_callback, + FLAC__StreamDecoderTellCallback tell_callback, + FLAC__StreamDecoderLengthCallback length_callback, + FLAC__StreamDecoderEofCallback eof_callback, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data, + FLAC__bool is_ogg +) +{ + FLAC__ASSERT(0 != decoder); + + if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) + return FLAC__STREAM_DECODER_INIT_STATUS_ALREADY_INITIALIZED; + + if(FLAC__HAS_OGG == 0 && is_ogg) + return FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER; + + if( + 0 == read_callback || + 0 == write_callback || + 0 == error_callback || + (seek_callback && (0 == tell_callback || 0 == length_callback || 0 == eof_callback)) + ) + return FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS; + +#if FLAC__HAS_OGG + decoder->private_->is_ogg = is_ogg; + if(is_ogg && !FLAC__ogg_decoder_aspect_init(&decoder->protected_->ogg_decoder_aspect)) + return decoder->protected_->initstate = FLAC__STREAM_DECODER_INIT_STATUS_ERROR_OPENING_FILE; +#endif + + /* + * get the CPU info and set the function pointers + */ + FLAC__cpu_info(&decoder->private_->cpuinfo); + /* first default to the non-asm routines */ + decoder->private_->local_lpc_restore_signal = FLAC__lpc_restore_signal; + decoder->private_->local_lpc_restore_signal_64bit = FLAC__lpc_restore_signal_wide; + decoder->private_->local_lpc_restore_signal_16bit = FLAC__lpc_restore_signal; + /* now override with asm where appropriate */ +#ifndef FLAC__NO_ASM + if(decoder->private_->cpuinfo.use_asm) { +#ifdef FLAC__CPU_IA32 + FLAC__ASSERT(decoder->private_->cpuinfo.type == FLAC__CPUINFO_TYPE_IA32); +#ifdef FLAC__HAS_NASM + decoder->private_->local_lpc_restore_signal_64bit = FLAC__lpc_restore_signal_wide_asm_ia32; /* OPT_IA32: was really necessary for GCC < 4.9 */ + if(decoder->private_->cpuinfo.ia32.mmx) { + decoder->private_->local_lpc_restore_signal = FLAC__lpc_restore_signal_asm_ia32; + decoder->private_->local_lpc_restore_signal_16bit = FLAC__lpc_restore_signal_asm_ia32_mmx; + } + else { + decoder->private_->local_lpc_restore_signal = FLAC__lpc_restore_signal_asm_ia32; + decoder->private_->local_lpc_restore_signal_16bit = FLAC__lpc_restore_signal_asm_ia32; + } +#endif +#if FLAC__HAS_X86INTRIN && ! defined FLAC__INTEGER_ONLY_LIBRARY +# if defined FLAC__SSE2_SUPPORTED && !defined FLAC__HAS_NASM /* OPT_SSE: not better than MMX asm */ + if(decoder->private_->cpuinfo.ia32.sse2) { + decoder->private_->local_lpc_restore_signal_16bit = FLAC__lpc_restore_signal_16_intrin_sse2; + } +# endif +# if defined FLAC__SSE4_1_SUPPORTED + if(decoder->private_->cpuinfo.ia32.sse41) { + decoder->private_->local_lpc_restore_signal_64bit = FLAC__lpc_restore_signal_wide_intrin_sse41; + } +# endif +#endif +#elif defined FLAC__CPU_X86_64 + FLAC__ASSERT(decoder->private_->cpuinfo.type == FLAC__CPUINFO_TYPE_X86_64); + /* No useful SSE optimizations yet */ +#endif + } +#endif + + /* from here on, errors are fatal */ + + if(!FLAC__bitreader_init(decoder->private_->input, read_callback_, decoder)) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return FLAC__STREAM_DECODER_INIT_STATUS_MEMORY_ALLOCATION_ERROR; + } + + decoder->private_->read_callback = read_callback; + decoder->private_->seek_callback = seek_callback; + decoder->private_->tell_callback = tell_callback; + decoder->private_->length_callback = length_callback; + decoder->private_->eof_callback = eof_callback; + decoder->private_->write_callback = write_callback; + decoder->private_->metadata_callback = metadata_callback; + decoder->private_->error_callback = error_callback; + decoder->private_->client_data = client_data; + decoder->private_->fixed_block_size = decoder->private_->next_fixed_block_size = 0; + decoder->private_->samples_decoded = 0; + decoder->private_->has_stream_info = false; + decoder->private_->cached = false; + + decoder->private_->do_md5_checking = decoder->protected_->md5_checking; + decoder->private_->is_seeking = false; + + decoder->private_->internal_reset_hack = true; /* so the following reset does not try to rewind the input */ + if(!FLAC__stream_decoder_reset(decoder)) { + /* above call sets the state for us */ + return FLAC__STREAM_DECODER_INIT_STATUS_MEMORY_ALLOCATION_ERROR; + } + + return FLAC__STREAM_DECODER_INIT_STATUS_OK; +} + +FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_stream( + FLAC__StreamDecoder *decoder, + FLAC__StreamDecoderReadCallback read_callback, + FLAC__StreamDecoderSeekCallback seek_callback, + FLAC__StreamDecoderTellCallback tell_callback, + FLAC__StreamDecoderLengthCallback length_callback, + FLAC__StreamDecoderEofCallback eof_callback, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data +) +{ + return init_stream_internal_( + decoder, + read_callback, + seek_callback, + tell_callback, + length_callback, + eof_callback, + write_callback, + metadata_callback, + error_callback, + client_data, + /*is_ogg=*/false + ); +} + +FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_ogg_stream( + FLAC__StreamDecoder *decoder, + FLAC__StreamDecoderReadCallback read_callback, + FLAC__StreamDecoderSeekCallback seek_callback, + FLAC__StreamDecoderTellCallback tell_callback, + FLAC__StreamDecoderLengthCallback length_callback, + FLAC__StreamDecoderEofCallback eof_callback, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data +) +{ + return init_stream_internal_( + decoder, + read_callback, + seek_callback, + tell_callback, + length_callback, + eof_callback, + write_callback, + metadata_callback, + error_callback, + client_data, + /*is_ogg=*/true + ); +} + +static FLAC__StreamDecoderInitStatus init_FILE_internal_( + FLAC__StreamDecoder *decoder, + FILE *file, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data, + FLAC__bool is_ogg +) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != file); + + if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) + return decoder->protected_->initstate = FLAC__STREAM_DECODER_INIT_STATUS_ALREADY_INITIALIZED; + + if(0 == write_callback || 0 == error_callback) + return decoder->protected_->initstate = FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS; + + /* + * To make sure that our file does not go unclosed after an error, we + * must assign the FILE pointer before any further error can occur in + * this routine. + */ + if(file == stdin) + file = get_binary_stdin_(); /* just to be safe */ + + decoder->private_->file = file; + + return init_stream_internal_( + decoder, + file_read_callback_, + decoder->private_->file == stdin? 0: file_seek_callback_, + decoder->private_->file == stdin? 0: file_tell_callback_, + decoder->private_->file == stdin? 0: file_length_callback_, + file_eof_callback_, + write_callback, + metadata_callback, + error_callback, + client_data, + is_ogg + ); +} + +FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_FILE( + FLAC__StreamDecoder *decoder, + FILE *file, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data +) +{ + return init_FILE_internal_(decoder, file, write_callback, metadata_callback, error_callback, client_data, /*is_ogg=*/false); +} + +FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_ogg_FILE( + FLAC__StreamDecoder *decoder, + FILE *file, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data +) +{ + return init_FILE_internal_(decoder, file, write_callback, metadata_callback, error_callback, client_data, /*is_ogg=*/true); +} + +static FLAC__StreamDecoderInitStatus init_file_internal_( + FLAC__StreamDecoder *decoder, + const char *filename, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data, + FLAC__bool is_ogg +) +{ + FILE *file; + + FLAC__ASSERT(0 != decoder); + + /* + * To make sure that our file does not go unclosed after an error, we + * have to do the same entrance checks here that are later performed + * in FLAC__stream_decoder_init_FILE() before the FILE* is assigned. + */ + if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) + return decoder->protected_->initstate = FLAC__STREAM_DECODER_INIT_STATUS_ALREADY_INITIALIZED; + + if(0 == write_callback || 0 == error_callback) + return decoder->protected_->initstate = FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS; + + file = filename? flac_fopen(filename, "rb") : stdin; + + if(0 == file) + return FLAC__STREAM_DECODER_INIT_STATUS_ERROR_OPENING_FILE; + + return init_FILE_internal_(decoder, file, write_callback, metadata_callback, error_callback, client_data, is_ogg); +} + +FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_file( + FLAC__StreamDecoder *decoder, + const char *filename, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data +) +{ + return init_file_internal_(decoder, filename, write_callback, metadata_callback, error_callback, client_data, /*is_ogg=*/false); +} + +FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_ogg_file( + FLAC__StreamDecoder *decoder, + const char *filename, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data +) +{ + return init_file_internal_(decoder, filename, write_callback, metadata_callback, error_callback, client_data, /*is_ogg=*/true); +} + +FLAC_API FLAC__bool FLAC__stream_decoder_finish(FLAC__StreamDecoder *decoder) +{ + FLAC__bool md5_failed = false; + unsigned i; + + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->private_); + FLAC__ASSERT(0 != decoder->protected_); + + if(decoder->protected_->state == FLAC__STREAM_DECODER_UNINITIALIZED) + return true; + + /* see the comment in FLAC__stream_decoder_reset() as to why we + * always call FLAC__MD5Final() + */ + FLAC__MD5Final(decoder->private_->computed_md5sum, &decoder->private_->md5context); + + free(decoder->private_->seek_table.data.seek_table.points); + decoder->private_->seek_table.data.seek_table.points = 0; + decoder->private_->has_seek_table = false; + + FLAC__bitreader_free(decoder->private_->input); + for(i = 0; i < FLAC__MAX_CHANNELS; i++) { + /* WATCHOUT: + * FLAC__lpc_restore_signal_asm_ia32_mmx() requires that the + * output arrays have a buffer of up to 3 zeroes in front + * (at negative indices) for alignment purposes; we use 4 + * to keep the data well-aligned. + */ + if(0 != decoder->private_->output[i]) { + free(decoder->private_->output[i]-4); + decoder->private_->output[i] = 0; + } + if(0 != decoder->private_->residual_unaligned[i]) { + free(decoder->private_->residual_unaligned[i]); + decoder->private_->residual_unaligned[i] = decoder->private_->residual[i] = 0; + } + } + decoder->private_->output_capacity = 0; + decoder->private_->output_channels = 0; + +#if FLAC__HAS_OGG + if(decoder->private_->is_ogg) + FLAC__ogg_decoder_aspect_finish(&decoder->protected_->ogg_decoder_aspect); +#endif + + if(0 != decoder->private_->file) { + if(decoder->private_->file != stdin) + fclose(decoder->private_->file); + decoder->private_->file = 0; + } + + if(decoder->private_->do_md5_checking) { + if(memcmp(decoder->private_->stream_info.data.stream_info.md5sum, decoder->private_->computed_md5sum, 16)) + md5_failed = true; + } + decoder->private_->is_seeking = false; + + set_defaults_(decoder); + + decoder->protected_->state = FLAC__STREAM_DECODER_UNINITIALIZED; + + return !md5_failed; +} + +FLAC_API FLAC__bool FLAC__stream_decoder_set_ogg_serial_number(FLAC__StreamDecoder *decoder, long value) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->private_); + FLAC__ASSERT(0 != decoder->protected_); + if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) + return false; +#if FLAC__HAS_OGG + /* can't check decoder->private_->is_ogg since that's not set until init time */ + FLAC__ogg_decoder_aspect_set_serial_number(&decoder->protected_->ogg_decoder_aspect, value); + return true; +#else + (void)value; + return false; +#endif +} + +FLAC_API FLAC__bool FLAC__stream_decoder_set_md5_checking(FLAC__StreamDecoder *decoder, FLAC__bool value) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->protected_); + if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) + return false; + decoder->protected_->md5_checking = value; + return true; +} + +FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_respond(FLAC__StreamDecoder *decoder, FLAC__MetadataType type) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->private_); + FLAC__ASSERT(0 != decoder->protected_); + FLAC__ASSERT((unsigned)type <= FLAC__MAX_METADATA_TYPE_CODE); + /* double protection */ + if((unsigned)type > FLAC__MAX_METADATA_TYPE_CODE) + return false; + if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) + return false; + decoder->private_->metadata_filter[type] = true; + if(type == FLAC__METADATA_TYPE_APPLICATION) + decoder->private_->metadata_filter_ids_count = 0; + return true; +} + +FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_respond_application(FLAC__StreamDecoder *decoder, const FLAC__byte id[4]) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->private_); + FLAC__ASSERT(0 != decoder->protected_); + FLAC__ASSERT(0 != id); + if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) + return false; + + if(decoder->private_->metadata_filter[FLAC__METADATA_TYPE_APPLICATION]) + return true; + + FLAC__ASSERT(0 != decoder->private_->metadata_filter_ids); + + if(decoder->private_->metadata_filter_ids_count == decoder->private_->metadata_filter_ids_capacity) { + if(0 == (decoder->private_->metadata_filter_ids = safe_realloc_mul_2op_(decoder->private_->metadata_filter_ids, decoder->private_->metadata_filter_ids_capacity, /*times*/2))) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + decoder->private_->metadata_filter_ids_capacity *= 2; + } + + memcpy(decoder->private_->metadata_filter_ids + decoder->private_->metadata_filter_ids_count * (FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8), id, (FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8)); + decoder->private_->metadata_filter_ids_count++; + + return true; +} + +FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_respond_all(FLAC__StreamDecoder *decoder) +{ + unsigned i; + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->private_); + FLAC__ASSERT(0 != decoder->protected_); + if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) + return false; + for(i = 0; i < sizeof(decoder->private_->metadata_filter) / sizeof(decoder->private_->metadata_filter[0]); i++) + decoder->private_->metadata_filter[i] = true; + decoder->private_->metadata_filter_ids_count = 0; + return true; +} + +FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_ignore(FLAC__StreamDecoder *decoder, FLAC__MetadataType type) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->private_); + FLAC__ASSERT(0 != decoder->protected_); + FLAC__ASSERT((unsigned)type <= FLAC__MAX_METADATA_TYPE_CODE); + /* double protection */ + if((unsigned)type > FLAC__MAX_METADATA_TYPE_CODE) + return false; + if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) + return false; + decoder->private_->metadata_filter[type] = false; + if(type == FLAC__METADATA_TYPE_APPLICATION) + decoder->private_->metadata_filter_ids_count = 0; + return true; +} + +FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_ignore_application(FLAC__StreamDecoder *decoder, const FLAC__byte id[4]) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->private_); + FLAC__ASSERT(0 != decoder->protected_); + FLAC__ASSERT(0 != id); + if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) + return false; + + if(!decoder->private_->metadata_filter[FLAC__METADATA_TYPE_APPLICATION]) + return true; + + FLAC__ASSERT(0 != decoder->private_->metadata_filter_ids); + + if(decoder->private_->metadata_filter_ids_count == decoder->private_->metadata_filter_ids_capacity) { + if(0 == (decoder->private_->metadata_filter_ids = safe_realloc_mul_2op_(decoder->private_->metadata_filter_ids, decoder->private_->metadata_filter_ids_capacity, /*times*/2))) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + decoder->private_->metadata_filter_ids_capacity *= 2; + } + + memcpy(decoder->private_->metadata_filter_ids + decoder->private_->metadata_filter_ids_count * (FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8), id, (FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8)); + decoder->private_->metadata_filter_ids_count++; + + return true; +} + +FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_ignore_all(FLAC__StreamDecoder *decoder) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->private_); + FLAC__ASSERT(0 != decoder->protected_); + if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) + return false; + memset(decoder->private_->metadata_filter, 0, sizeof(decoder->private_->metadata_filter)); + decoder->private_->metadata_filter_ids_count = 0; + return true; +} + +FLAC_API FLAC__StreamDecoderState FLAC__stream_decoder_get_state(const FLAC__StreamDecoder *decoder) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->protected_); + return decoder->protected_->state; +} + +FLAC_API const char *FLAC__stream_decoder_get_resolved_state_string(const FLAC__StreamDecoder *decoder) +{ + return FLAC__StreamDecoderStateString[decoder->protected_->state]; +} + +FLAC_API FLAC__bool FLAC__stream_decoder_get_md5_checking(const FLAC__StreamDecoder *decoder) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->protected_); + return decoder->protected_->md5_checking; +} + +FLAC_API FLAC__uint64 FLAC__stream_decoder_get_total_samples(const FLAC__StreamDecoder *decoder) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->protected_); + return decoder->private_->has_stream_info? decoder->private_->stream_info.data.stream_info.total_samples : 0; +} + +FLAC_API unsigned FLAC__stream_decoder_get_channels(const FLAC__StreamDecoder *decoder) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->protected_); + return decoder->protected_->channels; +} + +FLAC_API FLAC__ChannelAssignment FLAC__stream_decoder_get_channel_assignment(const FLAC__StreamDecoder *decoder) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->protected_); + return decoder->protected_->channel_assignment; +} + +FLAC_API unsigned FLAC__stream_decoder_get_bits_per_sample(const FLAC__StreamDecoder *decoder) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->protected_); + return decoder->protected_->bits_per_sample; +} + +FLAC_API unsigned FLAC__stream_decoder_get_sample_rate(const FLAC__StreamDecoder *decoder) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->protected_); + return decoder->protected_->sample_rate; +} + +FLAC_API unsigned FLAC__stream_decoder_get_blocksize(const FLAC__StreamDecoder *decoder) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->protected_); + return decoder->protected_->blocksize; +} + +FLAC_API FLAC__bool FLAC__stream_decoder_get_decode_position(const FLAC__StreamDecoder *decoder, FLAC__uint64 *position) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->private_); + FLAC__ASSERT(0 != position); + + if(FLAC__HAS_OGG && decoder->private_->is_ogg) + return false; + + if(0 == decoder->private_->tell_callback) + return false; + if(decoder->private_->tell_callback(decoder, position, decoder->private_->client_data) != FLAC__STREAM_DECODER_TELL_STATUS_OK) + return false; + /* should never happen since all FLAC frames and metadata blocks are byte aligned, but check just in case */ + if(!FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)) + return false; + FLAC__ASSERT(*position >= FLAC__stream_decoder_get_input_bytes_unconsumed(decoder)); + *position -= FLAC__stream_decoder_get_input_bytes_unconsumed(decoder); + return true; +} + +FLAC_API FLAC__bool FLAC__stream_decoder_flush(FLAC__StreamDecoder *decoder) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->private_); + FLAC__ASSERT(0 != decoder->protected_); + + if(!decoder->private_->internal_reset_hack && decoder->protected_->state == FLAC__STREAM_DECODER_UNINITIALIZED) + return false; + + decoder->private_->samples_decoded = 0; + decoder->private_->do_md5_checking = false; + +#if FLAC__HAS_OGG + if(decoder->private_->is_ogg) + FLAC__ogg_decoder_aspect_flush(&decoder->protected_->ogg_decoder_aspect); +#endif + + if(!FLAC__bitreader_clear(decoder->private_->input)) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + + return true; +} + +FLAC_API FLAC__bool FLAC__stream_decoder_reset(FLAC__StreamDecoder *decoder) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->private_); + FLAC__ASSERT(0 != decoder->protected_); + + if(!FLAC__stream_decoder_flush(decoder)) { + /* above call sets the state for us */ + return false; + } + +#if FLAC__HAS_OGG + /*@@@ could go in !internal_reset_hack block below */ + if(decoder->private_->is_ogg) + FLAC__ogg_decoder_aspect_reset(&decoder->protected_->ogg_decoder_aspect); +#endif + + /* Rewind if necessary. If FLAC__stream_decoder_init() is calling us, + * (internal_reset_hack) don't try to rewind since we are already at + * the beginning of the stream and don't want to fail if the input is + * not seekable. + */ + if(!decoder->private_->internal_reset_hack) { + if(decoder->private_->file == stdin) + return false; /* can't rewind stdin, reset fails */ + if(decoder->private_->seek_callback && decoder->private_->seek_callback(decoder, 0, decoder->private_->client_data) == FLAC__STREAM_DECODER_SEEK_STATUS_ERROR) + return false; /* seekable and seek fails, reset fails */ + } + else + decoder->private_->internal_reset_hack = false; + + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_METADATA; + + decoder->private_->has_stream_info = false; + + free(decoder->private_->seek_table.data.seek_table.points); + decoder->private_->seek_table.data.seek_table.points = 0; + decoder->private_->has_seek_table = false; + + decoder->private_->do_md5_checking = decoder->protected_->md5_checking; + /* + * This goes in reset() and not flush() because according to the spec, a + * fixed-blocksize stream must stay that way through the whole stream. + */ + decoder->private_->fixed_block_size = decoder->private_->next_fixed_block_size = 0; + + /* We initialize the FLAC__MD5Context even though we may never use it. This + * is because md5 checking may be turned on to start and then turned off if + * a seek occurs. So we init the context here and finalize it in + * FLAC__stream_decoder_finish() to make sure things are always cleaned up + * properly. + */ + FLAC__MD5Init(&decoder->private_->md5context); + + decoder->private_->first_frame_offset = 0; + decoder->private_->unparseable_frame_count = 0; + + return true; +} + +FLAC_API FLAC__bool FLAC__stream_decoder_process_single(FLAC__StreamDecoder *decoder) +{ + FLAC__bool got_a_frame; + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->protected_); + + while(1) { + switch(decoder->protected_->state) { + case FLAC__STREAM_DECODER_SEARCH_FOR_METADATA: + if(!find_metadata_(decoder)) + return false; /* above function sets the status for us */ + break; + case FLAC__STREAM_DECODER_READ_METADATA: + if(!read_metadata_(decoder)) + return false; /* above function sets the status for us */ + else + return true; + case FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC: + if(!frame_sync_(decoder)) + return true; /* above function sets the status for us */ + break; + case FLAC__STREAM_DECODER_READ_FRAME: + if(!read_frame_(decoder, &got_a_frame, /*do_full_decode=*/true)) + return false; /* above function sets the status for us */ + if(got_a_frame) + return true; /* above function sets the status for us */ + break; + case FLAC__STREAM_DECODER_END_OF_STREAM: + case FLAC__STREAM_DECODER_ABORTED: + return true; + default: + FLAC__ASSERT(0); + return false; + } + } +} + +FLAC_API FLAC__bool FLAC__stream_decoder_process_until_end_of_metadata(FLAC__StreamDecoder *decoder) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->protected_); + + while(1) { + switch(decoder->protected_->state) { + case FLAC__STREAM_DECODER_SEARCH_FOR_METADATA: + if(!find_metadata_(decoder)) + return false; /* above function sets the status for us */ + break; + case FLAC__STREAM_DECODER_READ_METADATA: + if(!read_metadata_(decoder)) + return false; /* above function sets the status for us */ + break; + case FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC: + case FLAC__STREAM_DECODER_READ_FRAME: + case FLAC__STREAM_DECODER_END_OF_STREAM: + case FLAC__STREAM_DECODER_ABORTED: + return true; + default: + FLAC__ASSERT(0); + return false; + } + } +} + +FLAC_API FLAC__bool FLAC__stream_decoder_process_until_end_of_stream(FLAC__StreamDecoder *decoder) +{ + FLAC__bool dummy; + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->protected_); + + while(1) { + switch(decoder->protected_->state) { + case FLAC__STREAM_DECODER_SEARCH_FOR_METADATA: + if(!find_metadata_(decoder)) + return false; /* above function sets the status for us */ + break; + case FLAC__STREAM_DECODER_READ_METADATA: + if(!read_metadata_(decoder)) + return false; /* above function sets the status for us */ + break; + case FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC: + if(!frame_sync_(decoder)) + return true; /* above function sets the status for us */ + break; + case FLAC__STREAM_DECODER_READ_FRAME: + if(!read_frame_(decoder, &dummy, /*do_full_decode=*/true)) + return false; /* above function sets the status for us */ + break; + case FLAC__STREAM_DECODER_END_OF_STREAM: + case FLAC__STREAM_DECODER_ABORTED: + return true; + default: + FLAC__ASSERT(0); + return false; + } + } +} + +FLAC_API FLAC__bool FLAC__stream_decoder_skip_single_frame(FLAC__StreamDecoder *decoder) +{ + FLAC__bool got_a_frame; + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->protected_); + + while(1) { + switch(decoder->protected_->state) { + case FLAC__STREAM_DECODER_SEARCH_FOR_METADATA: + case FLAC__STREAM_DECODER_READ_METADATA: + return false; /* above function sets the status for us */ + case FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC: + if(!frame_sync_(decoder)) + return true; /* above function sets the status for us */ + break; + case FLAC__STREAM_DECODER_READ_FRAME: + if(!read_frame_(decoder, &got_a_frame, /*do_full_decode=*/false)) + return false; /* above function sets the status for us */ + if(got_a_frame) + return true; /* above function sets the status for us */ + break; + case FLAC__STREAM_DECODER_END_OF_STREAM: + case FLAC__STREAM_DECODER_ABORTED: + return true; + default: + FLAC__ASSERT(0); + return false; + } + } +} + +FLAC_API FLAC__bool FLAC__stream_decoder_seek_absolute(FLAC__StreamDecoder *decoder, FLAC__uint64 sample) +{ + FLAC__uint64 length; + + FLAC__ASSERT(0 != decoder); + + if( + decoder->protected_->state != FLAC__STREAM_DECODER_SEARCH_FOR_METADATA && + decoder->protected_->state != FLAC__STREAM_DECODER_READ_METADATA && + decoder->protected_->state != FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC && + decoder->protected_->state != FLAC__STREAM_DECODER_READ_FRAME && + decoder->protected_->state != FLAC__STREAM_DECODER_END_OF_STREAM + ) + return false; + + if(0 == decoder->private_->seek_callback) + return false; + + FLAC__ASSERT(decoder->private_->seek_callback); + FLAC__ASSERT(decoder->private_->tell_callback); + FLAC__ASSERT(decoder->private_->length_callback); + FLAC__ASSERT(decoder->private_->eof_callback); + + if(FLAC__stream_decoder_get_total_samples(decoder) > 0 && sample >= FLAC__stream_decoder_get_total_samples(decoder)) + return false; + + decoder->private_->is_seeking = true; + + /* turn off md5 checking if a seek is attempted */ + decoder->private_->do_md5_checking = false; + + /* get the file length (currently our algorithm needs to know the length so it's also an error to get FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED) */ + if(decoder->private_->length_callback(decoder, &length, decoder->private_->client_data) != FLAC__STREAM_DECODER_LENGTH_STATUS_OK) { + decoder->private_->is_seeking = false; + return false; + } + + /* if we haven't finished processing the metadata yet, do that so we have the STREAMINFO, SEEK_TABLE, and first_frame_offset */ + if( + decoder->protected_->state == FLAC__STREAM_DECODER_SEARCH_FOR_METADATA || + decoder->protected_->state == FLAC__STREAM_DECODER_READ_METADATA + ) { + if(!FLAC__stream_decoder_process_until_end_of_metadata(decoder)) { + /* above call sets the state for us */ + decoder->private_->is_seeking = false; + return false; + } + /* check this again in case we didn't know total_samples the first time */ + if(FLAC__stream_decoder_get_total_samples(decoder) > 0 && sample >= FLAC__stream_decoder_get_total_samples(decoder)) { + decoder->private_->is_seeking = false; + return false; + } + } + + { + const FLAC__bool ok = +#if FLAC__HAS_OGG + decoder->private_->is_ogg? + seek_to_absolute_sample_ogg_(decoder, length, sample) : +#endif + seek_to_absolute_sample_(decoder, length, sample) + ; + decoder->private_->is_seeking = false; + return ok; + } +} + +/*********************************************************************** + * + * Protected class methods + * + ***********************************************************************/ + +unsigned FLAC__stream_decoder_get_input_bytes_unconsumed(const FLAC__StreamDecoder *decoder) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); + FLAC__ASSERT(!(FLAC__bitreader_get_input_bits_unconsumed(decoder->private_->input) & 7)); + return FLAC__bitreader_get_input_bits_unconsumed(decoder->private_->input) / 8; +} + +/*********************************************************************** + * + * Private class methods + * + ***********************************************************************/ + +void set_defaults_(FLAC__StreamDecoder *decoder) +{ + decoder->private_->is_ogg = false; + decoder->private_->read_callback = 0; + decoder->private_->seek_callback = 0; + decoder->private_->tell_callback = 0; + decoder->private_->length_callback = 0; + decoder->private_->eof_callback = 0; + decoder->private_->write_callback = 0; + decoder->private_->metadata_callback = 0; + decoder->private_->error_callback = 0; + decoder->private_->client_data = 0; + + memset(decoder->private_->metadata_filter, 0, sizeof(decoder->private_->metadata_filter)); + decoder->private_->metadata_filter[FLAC__METADATA_TYPE_STREAMINFO] = true; + decoder->private_->metadata_filter_ids_count = 0; + + decoder->protected_->md5_checking = false; + +#if FLAC__HAS_OGG + FLAC__ogg_decoder_aspect_set_defaults(&decoder->protected_->ogg_decoder_aspect); +#endif +} + +/* + * This will forcibly set stdin to binary mode (for OSes that require it) + */ +FILE *get_binary_stdin_(void) +{ + /* if something breaks here it is probably due to the presence or + * absence of an underscore before the identifiers 'setmode', + * 'fileno', and/or 'O_BINARY'; check your system header files. + */ +#if defined _MSC_VER || defined __MINGW32__ + _setmode(_fileno(stdin), _O_BINARY); +#elif defined __CYGWIN__ + /* almost certainly not needed for any modern Cygwin, but let's be safe... */ + setmode(_fileno(stdin), _O_BINARY); +#elif defined __EMX__ + setmode(fileno(stdin), O_BINARY); +#endif + + return stdin; +} + +FLAC__bool allocate_output_(FLAC__StreamDecoder *decoder, unsigned size, unsigned channels) +{ + unsigned i; + FLAC__int32 *tmp; + + if(size <= decoder->private_->output_capacity && channels <= decoder->private_->output_channels) + return true; + + /* simply using realloc() is not practical because the number of channels may change mid-stream */ + + for(i = 0; i < FLAC__MAX_CHANNELS; i++) { + if(0 != decoder->private_->output[i]) { + free(decoder->private_->output[i]-4); + decoder->private_->output[i] = 0; + } + if(0 != decoder->private_->residual_unaligned[i]) { + free(decoder->private_->residual_unaligned[i]); + decoder->private_->residual_unaligned[i] = decoder->private_->residual[i] = 0; + } + } + + for(i = 0; i < channels; i++) { + /* WATCHOUT: + * FLAC__lpc_restore_signal_asm_ia32_mmx() requires that the + * output arrays have a buffer of up to 3 zeroes in front + * (at negative indices) for alignment purposes; we use 4 + * to keep the data well-aligned. + */ + tmp = safe_malloc_muladd2_(sizeof(FLAC__int32), /*times (*/size, /*+*/4/*)*/); + if(tmp == 0) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + memset(tmp, 0, sizeof(FLAC__int32)*4); + decoder->private_->output[i] = tmp + 4; + + if(!FLAC__memory_alloc_aligned_int32_array(size, &decoder->private_->residual_unaligned[i], &decoder->private_->residual[i])) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + } + + decoder->private_->output_capacity = size; + decoder->private_->output_channels = channels; + + return true; +} + +FLAC__bool has_id_filtered_(FLAC__StreamDecoder *decoder, FLAC__byte *id) +{ + size_t i; + + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->private_); + + for(i = 0; i < decoder->private_->metadata_filter_ids_count; i++) + if(0 == memcmp(decoder->private_->metadata_filter_ids + i * (FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8), id, (FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8))) + return true; + + return false; +} + +FLAC__bool find_metadata_(FLAC__StreamDecoder *decoder) +{ + FLAC__uint32 x; + unsigned i, id; + FLAC__bool first = true; + + FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); + + for(i = id = 0; i < 4; ) { + if(decoder->private_->cached) { + x = (FLAC__uint32)decoder->private_->lookahead; + decoder->private_->cached = false; + } + else { + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) + return false; /* read_callback_ sets the state for us */ + } + if(x == FLAC__STREAM_SYNC_STRING[i]) { + first = true; + i++; + id = 0; + continue; + } + + if(id >= 3) + return false; + + if(x == ID3V2_TAG_[id]) { + id++; + i = 0; + if(id == 3) { + if(!skip_id3v2_tag_(decoder)) + return false; /* skip_id3v2_tag_ sets the state for us */ + } + continue; + } + id = 0; + if(x == 0xff) { /* MAGIC NUMBER for the first 8 frame sync bits */ + decoder->private_->header_warmup[0] = (FLAC__byte)x; + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) + return false; /* read_callback_ sets the state for us */ + + /* we have to check if we just read two 0xff's in a row; the second may actually be the beginning of the sync code */ + /* else we have to check if the second byte is the end of a sync code */ + if(x == 0xff) { /* MAGIC NUMBER for the first 8 frame sync bits */ + decoder->private_->lookahead = (FLAC__byte)x; + decoder->private_->cached = true; + } + else if(x >> 1 == 0x7c) { /* MAGIC NUMBER for the last 6 sync bits and reserved 7th bit */ + decoder->private_->header_warmup[1] = (FLAC__byte)x; + decoder->protected_->state = FLAC__STREAM_DECODER_READ_FRAME; + return true; + } + } + i = 0; + if(first) { + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC); + first = false; + } + } + + decoder->protected_->state = FLAC__STREAM_DECODER_READ_METADATA; + return true; +} + +FLAC__bool read_metadata_(FLAC__StreamDecoder *decoder) +{ + FLAC__bool is_last; + FLAC__uint32 i, x, type, length; + + FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); + + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_IS_LAST_LEN)) + return false; /* read_callback_ sets the state for us */ + is_last = x? true : false; + + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &type, FLAC__STREAM_METADATA_TYPE_LEN)) + return false; /* read_callback_ sets the state for us */ + + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &length, FLAC__STREAM_METADATA_LENGTH_LEN)) + return false; /* read_callback_ sets the state for us */ + + if(type == FLAC__METADATA_TYPE_STREAMINFO) { + if(!read_metadata_streaminfo_(decoder, is_last, length)) + return false; + + decoder->private_->has_stream_info = true; + if(0 == memcmp(decoder->private_->stream_info.data.stream_info.md5sum, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 16)) + decoder->private_->do_md5_checking = false; + if(!decoder->private_->is_seeking && decoder->private_->metadata_filter[FLAC__METADATA_TYPE_STREAMINFO] && decoder->private_->metadata_callback) + decoder->private_->metadata_callback(decoder, &decoder->private_->stream_info, decoder->private_->client_data); + } + else if(type == FLAC__METADATA_TYPE_SEEKTABLE) { + /* just in case we already have a seek table, and reading the next one fails: */ + decoder->private_->has_seek_table = false; + + if(!read_metadata_seektable_(decoder, is_last, length)) + return false; + + decoder->private_->has_seek_table = true; + if(!decoder->private_->is_seeking && decoder->private_->metadata_filter[FLAC__METADATA_TYPE_SEEKTABLE] && decoder->private_->metadata_callback) + decoder->private_->metadata_callback(decoder, &decoder->private_->seek_table, decoder->private_->client_data); + } + else { + FLAC__bool skip_it = !decoder->private_->metadata_filter[type]; + unsigned real_length = length; + FLAC__StreamMetadata block; + + memset(&block, 0, sizeof(block)); + block.is_last = is_last; + block.type = (FLAC__MetadataType)type; + block.length = length; + + if(type == FLAC__METADATA_TYPE_APPLICATION) { + if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, block.data.application.id, FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8)) + return false; /* read_callback_ sets the state for us */ + + if(real_length < FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8) { /* underflow check */ + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR;/*@@@@@@ maybe wrong error? need to resync?*/ + return false; + } + + real_length -= FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8; + + if(decoder->private_->metadata_filter_ids_count > 0 && has_id_filtered_(decoder, block.data.application.id)) + skip_it = !skip_it; + } + + if(skip_it) { + if(!FLAC__bitreader_skip_byte_block_aligned_no_crc(decoder->private_->input, real_length)) + return false; /* read_callback_ sets the state for us */ + } + else { + FLAC__bool ok = true; + switch(type) { + case FLAC__METADATA_TYPE_PADDING: + /* skip the padding bytes */ + if(!FLAC__bitreader_skip_byte_block_aligned_no_crc(decoder->private_->input, real_length)) + ok = false; /* read_callback_ sets the state for us */ + break; + case FLAC__METADATA_TYPE_APPLICATION: + /* remember, we read the ID already */ + if(real_length > 0) { + if(0 == (block.data.application.data = malloc(real_length))) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + ok = false; + } + else if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, block.data.application.data, real_length)) + ok = false; /* read_callback_ sets the state for us */ + } + else + block.data.application.data = 0; + break; + case FLAC__METADATA_TYPE_VORBIS_COMMENT: + if(!read_metadata_vorbiscomment_(decoder, &block.data.vorbis_comment, real_length)) + ok = false; + break; + case FLAC__METADATA_TYPE_CUESHEET: + if(!read_metadata_cuesheet_(decoder, &block.data.cue_sheet)) + ok = false; + break; + case FLAC__METADATA_TYPE_PICTURE: + if(!read_metadata_picture_(decoder, &block.data.picture)) + ok = false; + break; + case FLAC__METADATA_TYPE_STREAMINFO: + case FLAC__METADATA_TYPE_SEEKTABLE: + FLAC__ASSERT(0); + break; + default: + if(real_length > 0) { + if(0 == (block.data.unknown.data = malloc(real_length))) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + ok = false; + } + else if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, block.data.unknown.data, real_length)) + ok = false; /* read_callback_ sets the state for us */ + } + else + block.data.unknown.data = 0; + break; + } + if(ok && !decoder->private_->is_seeking && decoder->private_->metadata_callback) + decoder->private_->metadata_callback(decoder, &block, decoder->private_->client_data); + + /* now we have to free any malloc()ed data in the block */ + switch(type) { + case FLAC__METADATA_TYPE_PADDING: + break; + case FLAC__METADATA_TYPE_APPLICATION: + if(0 != block.data.application.data) + free(block.data.application.data); + break; + case FLAC__METADATA_TYPE_VORBIS_COMMENT: + if(0 != block.data.vorbis_comment.vendor_string.entry) + free(block.data.vorbis_comment.vendor_string.entry); + if(block.data.vorbis_comment.num_comments > 0) + for(i = 0; i < block.data.vorbis_comment.num_comments; i++) + if(0 != block.data.vorbis_comment.comments[i].entry) + free(block.data.vorbis_comment.comments[i].entry); + if(0 != block.data.vorbis_comment.comments) + free(block.data.vorbis_comment.comments); + break; + case FLAC__METADATA_TYPE_CUESHEET: + if(block.data.cue_sheet.num_tracks > 0) + for(i = 0; i < block.data.cue_sheet.num_tracks; i++) + if(0 != block.data.cue_sheet.tracks[i].indices) + free(block.data.cue_sheet.tracks[i].indices); + if(0 != block.data.cue_sheet.tracks) + free(block.data.cue_sheet.tracks); + break; + case FLAC__METADATA_TYPE_PICTURE: + if(0 != block.data.picture.mime_type) + free(block.data.picture.mime_type); + if(0 != block.data.picture.description) + free(block.data.picture.description); + if(0 != block.data.picture.data) + free(block.data.picture.data); + break; + case FLAC__METADATA_TYPE_STREAMINFO: + case FLAC__METADATA_TYPE_SEEKTABLE: + FLAC__ASSERT(0); + default: + if(0 != block.data.unknown.data) + free(block.data.unknown.data); + break; + } + + if(!ok) /* anything that unsets "ok" should also make sure decoder->protected_->state is updated */ + return false; + } + } + + if(is_last) { + /* if this fails, it's OK, it's just a hint for the seek routine */ + if(!FLAC__stream_decoder_get_decode_position(decoder, &decoder->private_->first_frame_offset)) + decoder->private_->first_frame_offset = 0; + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + } + + return true; +} + +FLAC__bool read_metadata_streaminfo_(FLAC__StreamDecoder *decoder, FLAC__bool is_last, unsigned length) +{ + FLAC__uint32 x; + unsigned bits, used_bits = 0; + + FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); + + decoder->private_->stream_info.type = FLAC__METADATA_TYPE_STREAMINFO; + decoder->private_->stream_info.is_last = is_last; + decoder->private_->stream_info.length = length; + + bits = FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN; + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, bits)) + return false; /* read_callback_ sets the state for us */ + decoder->private_->stream_info.data.stream_info.min_blocksize = x; + used_bits += bits; + + bits = FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN; + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN)) + return false; /* read_callback_ sets the state for us */ + decoder->private_->stream_info.data.stream_info.max_blocksize = x; + used_bits += bits; + + bits = FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN; + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN)) + return false; /* read_callback_ sets the state for us */ + decoder->private_->stream_info.data.stream_info.min_framesize = x; + used_bits += bits; + + bits = FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN; + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN)) + return false; /* read_callback_ sets the state for us */ + decoder->private_->stream_info.data.stream_info.max_framesize = x; + used_bits += bits; + + bits = FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN; + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN)) + return false; /* read_callback_ sets the state for us */ + decoder->private_->stream_info.data.stream_info.sample_rate = x; + used_bits += bits; + + bits = FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN; + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN)) + return false; /* read_callback_ sets the state for us */ + decoder->private_->stream_info.data.stream_info.channels = x+1; + used_bits += bits; + + bits = FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN; + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN)) + return false; /* read_callback_ sets the state for us */ + decoder->private_->stream_info.data.stream_info.bits_per_sample = x+1; + used_bits += bits; + + bits = FLAC__STREAM_METADATA_STREAMINFO_TOTAL_SAMPLES_LEN; + if(!FLAC__bitreader_read_raw_uint64(decoder->private_->input, &decoder->private_->stream_info.data.stream_info.total_samples, FLAC__STREAM_METADATA_STREAMINFO_TOTAL_SAMPLES_LEN)) + return false; /* read_callback_ sets the state for us */ + used_bits += bits; + + if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, decoder->private_->stream_info.data.stream_info.md5sum, 16)) + return false; /* read_callback_ sets the state for us */ + used_bits += 16*8; + + /* skip the rest of the block */ + FLAC__ASSERT(used_bits % 8 == 0); + length -= (used_bits / 8); + if(!FLAC__bitreader_skip_byte_block_aligned_no_crc(decoder->private_->input, length)) + return false; /* read_callback_ sets the state for us */ + + return true; +} + +FLAC__bool read_metadata_seektable_(FLAC__StreamDecoder *decoder, FLAC__bool is_last, unsigned length) +{ + FLAC__uint32 i, x; + FLAC__uint64 xx; + + FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); + + decoder->private_->seek_table.type = FLAC__METADATA_TYPE_SEEKTABLE; + decoder->private_->seek_table.is_last = is_last; + decoder->private_->seek_table.length = length; + + decoder->private_->seek_table.data.seek_table.num_points = length / FLAC__STREAM_METADATA_SEEKPOINT_LENGTH; + + /* use realloc since we may pass through here several times (e.g. after seeking) */ + if(0 == (decoder->private_->seek_table.data.seek_table.points = safe_realloc_mul_2op_(decoder->private_->seek_table.data.seek_table.points, decoder->private_->seek_table.data.seek_table.num_points, /*times*/sizeof(FLAC__StreamMetadata_SeekPoint)))) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + for(i = 0; i < decoder->private_->seek_table.data.seek_table.num_points; i++) { + if(!FLAC__bitreader_read_raw_uint64(decoder->private_->input, &xx, FLAC__STREAM_METADATA_SEEKPOINT_SAMPLE_NUMBER_LEN)) + return false; /* read_callback_ sets the state for us */ + decoder->private_->seek_table.data.seek_table.points[i].sample_number = xx; + + if(!FLAC__bitreader_read_raw_uint64(decoder->private_->input, &xx, FLAC__STREAM_METADATA_SEEKPOINT_STREAM_OFFSET_LEN)) + return false; /* read_callback_ sets the state for us */ + decoder->private_->seek_table.data.seek_table.points[i].stream_offset = xx; + + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_SEEKPOINT_FRAME_SAMPLES_LEN)) + return false; /* read_callback_ sets the state for us */ + decoder->private_->seek_table.data.seek_table.points[i].frame_samples = x; + } + length -= (decoder->private_->seek_table.data.seek_table.num_points * FLAC__STREAM_METADATA_SEEKPOINT_LENGTH); + /* if there is a partial point left, skip over it */ + if(length > 0) { + /*@@@ do a send_error_to_client_() here? there's an argument for either way */ + if(!FLAC__bitreader_skip_byte_block_aligned_no_crc(decoder->private_->input, length)) + return false; /* read_callback_ sets the state for us */ + } + + return true; +} + +FLAC__bool read_metadata_vorbiscomment_(FLAC__StreamDecoder *decoder, FLAC__StreamMetadata_VorbisComment *obj, unsigned length) +{ + FLAC__uint32 i; + + FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); + + /* read vendor string */ + if (length >= 8) { + length -= 8; /* vendor string length + num comments entries alone take 8 bytes */ + FLAC__ASSERT(FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN == 32); + if (!FLAC__bitreader_read_uint32_little_endian(decoder->private_->input, &obj->vendor_string.length)) + return false; /* read_callback_ sets the state for us */ + if (obj->vendor_string.length > 0) { + if (length < obj->vendor_string.length) { + obj->vendor_string.length = 0; + obj->vendor_string.entry = 0; + goto skip; + } + else + length -= obj->vendor_string.length; + if (0 == (obj->vendor_string.entry = safe_malloc_add_2op_(obj->vendor_string.length, /*+*/1))) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + if (!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, obj->vendor_string.entry, obj->vendor_string.length)) + return false; /* read_callback_ sets the state for us */ + obj->vendor_string.entry[obj->vendor_string.length] = '\0'; + } + else + obj->vendor_string.entry = 0; + + /* read num comments */ + FLAC__ASSERT(FLAC__STREAM_METADATA_VORBIS_COMMENT_NUM_COMMENTS_LEN == 32); + if (!FLAC__bitreader_read_uint32_little_endian(decoder->private_->input, &obj->num_comments)) + return false; /* read_callback_ sets the state for us */ + + /* read comments */ + if (obj->num_comments > 100000) { + /* Possibly malicious file. */ + obj->num_comments = 0; + return false; + } + if (obj->num_comments > 0) { + if (0 == (obj->comments = safe_malloc_mul_2op_p(obj->num_comments, /*times*/sizeof(FLAC__StreamMetadata_VorbisComment_Entry)))) { + obj->num_comments = 0; + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + for (i = 0; i < obj->num_comments; i++) { + /* Initialize here just to make sure. */ + obj->comments[i].length = 0; + obj->comments[i].entry = 0; + + FLAC__ASSERT(FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN == 32); + if (length < 4) { + obj->num_comments = i; + goto skip; + } + else + length -= 4; + if (!FLAC__bitreader_read_uint32_little_endian(decoder->private_->input, &obj->comments[i].length)) { + obj->num_comments = i; + return false; /* read_callback_ sets the state for us */ + } + if (obj->comments[i].length > 0) { + if (length < obj->comments[i].length) { + obj->num_comments = i; + goto skip; + } + else + length -= obj->comments[i].length; + if (0 == (obj->comments[i].entry = safe_malloc_add_2op_(obj->comments[i].length, /*+*/1))) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + obj->num_comments = i; + return false; + } + memset (obj->comments[i].entry, 0, obj->comments[i].length) ; + if (!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, obj->comments[i].entry, obj->comments[i].length)) { + obj->num_comments = i; + goto skip; + } + obj->comments[i].entry[obj->comments[i].length] = '\0'; + } + else + obj->comments[i].entry = 0; + } + } + } + + skip: + if (length > 0) { + /* length > 0 can only happen on files with invalid data in comments */ + if(obj->num_comments < 1) { + free(obj->comments); + obj->comments = NULL; + } + if(!FLAC__bitreader_skip_byte_block_aligned_no_crc(decoder->private_->input, length)) + return false; /* read_callback_ sets the state for us */ + } + + return true; +} + +FLAC__bool read_metadata_cuesheet_(FLAC__StreamDecoder *decoder, FLAC__StreamMetadata_CueSheet *obj) +{ + FLAC__uint32 i, j, x; + + FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); + + memset(obj, 0, sizeof(FLAC__StreamMetadata_CueSheet)); + + FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN % 8 == 0); + if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, (FLAC__byte*)obj->media_catalog_number, FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN/8)) + return false; /* read_callback_ sets the state for us */ + + if(!FLAC__bitreader_read_raw_uint64(decoder->private_->input, &obj->lead_in, FLAC__STREAM_METADATA_CUESHEET_LEAD_IN_LEN)) + return false; /* read_callback_ sets the state for us */ + + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN)) + return false; /* read_callback_ sets the state for us */ + obj->is_cd = x? true : false; + + if(!FLAC__bitreader_skip_bits_no_crc(decoder->private_->input, FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN)) + return false; /* read_callback_ sets the state for us */ + + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_NUM_TRACKS_LEN)) + return false; /* read_callback_ sets the state for us */ + obj->num_tracks = x; + + if(obj->num_tracks > 0) { + if(0 == (obj->tracks = safe_calloc_(obj->num_tracks, sizeof(FLAC__StreamMetadata_CueSheet_Track)))) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + for(i = 0; i < obj->num_tracks; i++) { + FLAC__StreamMetadata_CueSheet_Track *track = &obj->tracks[i]; + if(!FLAC__bitreader_read_raw_uint64(decoder->private_->input, &track->offset, FLAC__STREAM_METADATA_CUESHEET_TRACK_OFFSET_LEN)) + return false; /* read_callback_ sets the state for us */ + + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_TRACK_NUMBER_LEN)) + return false; /* read_callback_ sets the state for us */ + track->number = (FLAC__byte)x; + + FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN % 8 == 0); + if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, (FLAC__byte*)track->isrc, FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN/8)) + return false; /* read_callback_ sets the state for us */ + + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN)) + return false; /* read_callback_ sets the state for us */ + track->type = x; + + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN)) + return false; /* read_callback_ sets the state for us */ + track->pre_emphasis = x; + + if(!FLAC__bitreader_skip_bits_no_crc(decoder->private_->input, FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN)) + return false; /* read_callback_ sets the state for us */ + + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_TRACK_NUM_INDICES_LEN)) + return false; /* read_callback_ sets the state for us */ + track->num_indices = (FLAC__byte)x; + + if(track->num_indices > 0) { + if(0 == (track->indices = safe_calloc_(track->num_indices, sizeof(FLAC__StreamMetadata_CueSheet_Index)))) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + for(j = 0; j < track->num_indices; j++) { + FLAC__StreamMetadata_CueSheet_Index *indx = &track->indices[j]; + if(!FLAC__bitreader_read_raw_uint64(decoder->private_->input, &indx->offset, FLAC__STREAM_METADATA_CUESHEET_INDEX_OFFSET_LEN)) + return false; /* read_callback_ sets the state for us */ + + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_INDEX_NUMBER_LEN)) + return false; /* read_callback_ sets the state for us */ + indx->number = (FLAC__byte)x; + + if(!FLAC__bitreader_skip_bits_no_crc(decoder->private_->input, FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN)) + return false; /* read_callback_ sets the state for us */ + } + } + } + } + + return true; +} + +FLAC__bool read_metadata_picture_(FLAC__StreamDecoder *decoder, FLAC__StreamMetadata_Picture *obj) +{ + FLAC__uint32 x; + + FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); + + /* read type */ + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_PICTURE_TYPE_LEN)) + return false; /* read_callback_ sets the state for us */ + obj->type = x; + + /* read MIME type */ + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_PICTURE_MIME_TYPE_LENGTH_LEN)) + return false; /* read_callback_ sets the state for us */ + if(0 == (obj->mime_type = safe_malloc_add_2op_(x, /*+*/1))) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + if(x > 0) { + if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, (FLAC__byte*)obj->mime_type, x)) + return false; /* read_callback_ sets the state for us */ + } + obj->mime_type[x] = '\0'; + + /* read description */ + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_PICTURE_DESCRIPTION_LENGTH_LEN)) + return false; /* read_callback_ sets the state for us */ + if(0 == (obj->description = safe_malloc_add_2op_(x, /*+*/1))) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + if(x > 0) { + if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, obj->description, x)) + return false; /* read_callback_ sets the state for us */ + } + obj->description[x] = '\0'; + + /* read width */ + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &obj->width, FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN)) + return false; /* read_callback_ sets the state for us */ + + /* read height */ + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &obj->height, FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN)) + return false; /* read_callback_ sets the state for us */ + + /* read depth */ + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &obj->depth, FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN)) + return false; /* read_callback_ sets the state for us */ + + /* read colors */ + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &obj->colors, FLAC__STREAM_METADATA_PICTURE_COLORS_LEN)) + return false; /* read_callback_ sets the state for us */ + + /* read data */ + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &(obj->data_length), FLAC__STREAM_METADATA_PICTURE_DATA_LENGTH_LEN)) + return false; /* read_callback_ sets the state for us */ + if(0 == (obj->data = safe_malloc_(obj->data_length))) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + if(obj->data_length > 0) { + if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, obj->data, obj->data_length)) + return false; /* read_callback_ sets the state for us */ + } + + return true; +} + +FLAC__bool skip_id3v2_tag_(FLAC__StreamDecoder *decoder) +{ + FLAC__uint32 x; + unsigned i, skip; + + /* skip the version and flags bytes */ + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 24)) + return false; /* read_callback_ sets the state for us */ + /* get the size (in bytes) to skip */ + skip = 0; + for(i = 0; i < 4; i++) { + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) + return false; /* read_callback_ sets the state for us */ + skip <<= 7; + skip |= (x & 0x7f); + } + /* skip the rest of the tag */ + if(!FLAC__bitreader_skip_byte_block_aligned_no_crc(decoder->private_->input, skip)) + return false; /* read_callback_ sets the state for us */ + return true; +} + +FLAC__bool frame_sync_(FLAC__StreamDecoder *decoder) +{ + FLAC__uint32 x; + FLAC__bool first = true; + + /* If we know the total number of samples in the stream, stop if we've read that many. */ + /* This will stop us, for example, from wasting time trying to sync on an ID3V1 tag. */ + if(FLAC__stream_decoder_get_total_samples(decoder) > 0) { + if(decoder->private_->samples_decoded >= FLAC__stream_decoder_get_total_samples(decoder)) { + decoder->protected_->state = FLAC__STREAM_DECODER_END_OF_STREAM; + return true; + } + } + + /* make sure we're byte aligned */ + if(!FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)) { + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__bitreader_bits_left_for_byte_alignment(decoder->private_->input))) + return false; /* read_callback_ sets the state for us */ + } + + while(1) { + if(decoder->private_->cached) { + x = (FLAC__uint32)decoder->private_->lookahead; + decoder->private_->cached = false; + } + else { + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) + return false; /* read_callback_ sets the state for us */ + } + if(x == 0xff) { /* MAGIC NUMBER for the first 8 frame sync bits */ + decoder->private_->header_warmup[0] = (FLAC__byte)x; + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) + return false; /* read_callback_ sets the state for us */ + + /* we have to check if we just read two 0xff's in a row; the second may actually be the beginning of the sync code */ + /* else we have to check if the second byte is the end of a sync code */ + if(x == 0xff) { /* MAGIC NUMBER for the first 8 frame sync bits */ + decoder->private_->lookahead = (FLAC__byte)x; + decoder->private_->cached = true; + } + else if(x >> 1 == 0x7c) { /* MAGIC NUMBER for the last 6 sync bits and reserved 7th bit */ + decoder->private_->header_warmup[1] = (FLAC__byte)x; + decoder->protected_->state = FLAC__STREAM_DECODER_READ_FRAME; + return true; + } + } + if(first) { + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC); + first = false; + } + } + + return true; +} + +FLAC__bool read_frame_(FLAC__StreamDecoder *decoder, FLAC__bool *got_a_frame, FLAC__bool do_full_decode) +{ + unsigned channel; + unsigned i; + FLAC__int32 mid, side; + unsigned frame_crc; /* the one we calculate from the input stream */ + FLAC__uint32 x; + + *got_a_frame = false; + + /* init the CRC */ + frame_crc = 0; + frame_crc = FLAC__CRC16_UPDATE(decoder->private_->header_warmup[0], frame_crc); + frame_crc = FLAC__CRC16_UPDATE(decoder->private_->header_warmup[1], frame_crc); + FLAC__bitreader_reset_read_crc16(decoder->private_->input, (FLAC__uint16)frame_crc); + + if(!read_frame_header_(decoder)) + return false; + if(decoder->protected_->state == FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC) /* means we didn't sync on a valid header */ + return true; + if(!allocate_output_(decoder, decoder->private_->frame.header.blocksize, decoder->private_->frame.header.channels)) + return false; + for(channel = 0; channel < decoder->private_->frame.header.channels; channel++) { + /* + * first figure the correct bits-per-sample of the subframe + */ + unsigned bps = decoder->private_->frame.header.bits_per_sample; + switch(decoder->private_->frame.header.channel_assignment) { + case FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT: + /* no adjustment needed */ + break; + case FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE: + FLAC__ASSERT(decoder->private_->frame.header.channels == 2); + if(channel == 1) + bps++; + break; + case FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE: + FLAC__ASSERT(decoder->private_->frame.header.channels == 2); + if(channel == 0) + bps++; + break; + case FLAC__CHANNEL_ASSIGNMENT_MID_SIDE: + FLAC__ASSERT(decoder->private_->frame.header.channels == 2); + if(channel == 1) + bps++; + break; + default: + FLAC__ASSERT(0); + } + /* + * now read it + */ + if(!read_subframe_(decoder, channel, bps, do_full_decode)) + return false; + if(decoder->protected_->state == FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC) /* means bad sync or got corruption */ + return true; + } + if(!read_zero_padding_(decoder)) + return false; + if(decoder->protected_->state == FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC) /* means bad sync or got corruption (i.e. "zero bits" were not all zeroes) */ + return true; + + /* + * Read the frame CRC-16 from the footer and check + */ + frame_crc = FLAC__bitreader_get_read_crc16(decoder->private_->input); + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__FRAME_FOOTER_CRC_LEN)) + return false; /* read_callback_ sets the state for us */ + if(frame_crc == x) { + if(do_full_decode) { + /* Undo any special channel coding */ + switch(decoder->private_->frame.header.channel_assignment) { + case FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT: + /* do nothing */ + break; + case FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE: + FLAC__ASSERT(decoder->private_->frame.header.channels == 2); + for(i = 0; i < decoder->private_->frame.header.blocksize; i++) + decoder->private_->output[1][i] = decoder->private_->output[0][i] - decoder->private_->output[1][i]; + break; + case FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE: + FLAC__ASSERT(decoder->private_->frame.header.channels == 2); + for(i = 0; i < decoder->private_->frame.header.blocksize; i++) + decoder->private_->output[0][i] += decoder->private_->output[1][i]; + break; + case FLAC__CHANNEL_ASSIGNMENT_MID_SIDE: + FLAC__ASSERT(decoder->private_->frame.header.channels == 2); + for(i = 0; i < decoder->private_->frame.header.blocksize; i++) { +#if 1 + mid = decoder->private_->output[0][i]; + side = decoder->private_->output[1][i]; + mid = ((uint32_t) mid) << 1; + mid |= (side & 1); /* i.e. if 'side' is odd... */ + decoder->private_->output[0][i] = (mid + side) >> 1; + decoder->private_->output[1][i] = (mid - side) >> 1; +#else + /* OPT: without 'side' temp variable */ + mid = (decoder->private_->output[0][i] << 1) | (decoder->private_->output[1][i] & 1); /* i.e. if 'side' is odd... */ + decoder->private_->output[0][i] = (mid + decoder->private_->output[1][i]) >> 1; + decoder->private_->output[1][i] = (mid - decoder->private_->output[1][i]) >> 1; +#endif + } + break; + default: + FLAC__ASSERT(0); + break; + } + } + } + else { + /* Bad frame, emit error and zero the output signal */ + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH); + if(do_full_decode) { + for(channel = 0; channel < decoder->private_->frame.header.channels; channel++) { + memset(decoder->private_->output[channel], 0, sizeof(FLAC__int32) * decoder->private_->frame.header.blocksize); + } + } + } + + *got_a_frame = true; + + /* we wait to update fixed_block_size until here, when we're sure we've got a proper frame and hence a correct blocksize */ + if(decoder->private_->next_fixed_block_size) + decoder->private_->fixed_block_size = decoder->private_->next_fixed_block_size; + + /* put the latest values into the public section of the decoder instance */ + decoder->protected_->channels = decoder->private_->frame.header.channels; + decoder->protected_->channel_assignment = decoder->private_->frame.header.channel_assignment; + decoder->protected_->bits_per_sample = decoder->private_->frame.header.bits_per_sample; + decoder->protected_->sample_rate = decoder->private_->frame.header.sample_rate; + decoder->protected_->blocksize = decoder->private_->frame.header.blocksize; + + FLAC__ASSERT(decoder->private_->frame.header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER); + decoder->private_->samples_decoded = decoder->private_->frame.header.number.sample_number + decoder->private_->frame.header.blocksize; + + /* write it */ + if(do_full_decode) { + if(write_audio_frame_to_client_(decoder, &decoder->private_->frame, (const FLAC__int32 * const *)decoder->private_->output) != FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE) { + decoder->protected_->state = FLAC__STREAM_DECODER_ABORTED; + return false; + } + } + + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; +} + +FLAC__bool read_frame_header_(FLAC__StreamDecoder *decoder) +{ + FLAC__uint32 x; + FLAC__uint64 xx; + unsigned i, blocksize_hint = 0, sample_rate_hint = 0; + FLAC__byte crc8, raw_header[16]; /* MAGIC NUMBER based on the maximum frame header size, including CRC */ + unsigned raw_header_len; + FLAC__bool is_unparseable = false; + + FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); + + /* init the raw header with the saved bits from synchronization */ + raw_header[0] = decoder->private_->header_warmup[0]; + raw_header[1] = decoder->private_->header_warmup[1]; + raw_header_len = 2; + + /* check to make sure that reserved bit is 0 */ + if(raw_header[1] & 0x02) /* MAGIC NUMBER */ + is_unparseable = true; + + /* + * Note that along the way as we read the header, we look for a sync + * code inside. If we find one it would indicate that our original + * sync was bad since there cannot be a sync code in a valid header. + * + * Three kinds of things can go wrong when reading the frame header: + * 1) We may have sync'ed incorrectly and not landed on a frame header. + * If we don't find a sync code, it can end up looking like we read + * a valid but unparseable header, until getting to the frame header + * CRC. Even then we could get a false positive on the CRC. + * 2) We may have sync'ed correctly but on an unparseable frame (from a + * future encoder). + * 3) We may be on a damaged frame which appears valid but unparseable. + * + * For all these reasons, we try and read a complete frame header as + * long as it seems valid, even if unparseable, up until the frame + * header CRC. + */ + + /* + * read in the raw header as bytes so we can CRC it, and parse it on the way + */ + for(i = 0; i < 2; i++) { + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) + return false; /* read_callback_ sets the state for us */ + if(x == 0xff) { /* MAGIC NUMBER for the first 8 frame sync bits */ + /* if we get here it means our original sync was erroneous since the sync code cannot appear in the header */ + decoder->private_->lookahead = (FLAC__byte)x; + decoder->private_->cached = true; + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + } + raw_header[raw_header_len++] = (FLAC__byte)x; + } + + switch(x = raw_header[2] >> 4) { + case 0: + is_unparseable = true; + break; + case 1: + decoder->private_->frame.header.blocksize = 192; + break; + case 2: + case 3: + case 4: + case 5: + decoder->private_->frame.header.blocksize = 576 << (x-2); + break; + case 6: + case 7: + blocksize_hint = x; + break; + case 8: + case 9: + case 10: + case 11: + case 12: + case 13: + case 14: + case 15: + decoder->private_->frame.header.blocksize = 256 << (x-8); + break; + default: + FLAC__ASSERT(0); + break; + } + + switch(x = raw_header[2] & 0x0f) { + case 0: + if(decoder->private_->has_stream_info) + decoder->private_->frame.header.sample_rate = decoder->private_->stream_info.data.stream_info.sample_rate; + else + is_unparseable = true; + break; + case 1: + decoder->private_->frame.header.sample_rate = 88200; + break; + case 2: + decoder->private_->frame.header.sample_rate = 176400; + break; + case 3: + decoder->private_->frame.header.sample_rate = 192000; + break; + case 4: + decoder->private_->frame.header.sample_rate = 8000; + break; + case 5: + decoder->private_->frame.header.sample_rate = 16000; + break; + case 6: + decoder->private_->frame.header.sample_rate = 22050; + break; + case 7: + decoder->private_->frame.header.sample_rate = 24000; + break; + case 8: + decoder->private_->frame.header.sample_rate = 32000; + break; + case 9: + decoder->private_->frame.header.sample_rate = 44100; + break; + case 10: + decoder->private_->frame.header.sample_rate = 48000; + break; + case 11: + decoder->private_->frame.header.sample_rate = 96000; + break; + case 12: + case 13: + case 14: + sample_rate_hint = x; + break; + case 15: + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + default: + FLAC__ASSERT(0); + } + + x = (unsigned)(raw_header[3] >> 4); + if(x & 8) { + decoder->private_->frame.header.channels = 2; + switch(x & 7) { + case 0: + decoder->private_->frame.header.channel_assignment = FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE; + break; + case 1: + decoder->private_->frame.header.channel_assignment = FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE; + break; + case 2: + decoder->private_->frame.header.channel_assignment = FLAC__CHANNEL_ASSIGNMENT_MID_SIDE; + break; + default: + is_unparseable = true; + break; + } + } + else { + decoder->private_->frame.header.channels = (unsigned)x + 1; + decoder->private_->frame.header.channel_assignment = FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT; + } + + switch(x = (unsigned)(raw_header[3] & 0x0e) >> 1) { + case 0: + if(decoder->private_->has_stream_info) + decoder->private_->frame.header.bits_per_sample = decoder->private_->stream_info.data.stream_info.bits_per_sample; + else + is_unparseable = true; + break; + case 1: + decoder->private_->frame.header.bits_per_sample = 8; + break; + case 2: + decoder->private_->frame.header.bits_per_sample = 12; + break; + case 4: + decoder->private_->frame.header.bits_per_sample = 16; + break; + case 5: + decoder->private_->frame.header.bits_per_sample = 20; + break; + case 6: + decoder->private_->frame.header.bits_per_sample = 24; + break; + case 3: + case 7: + is_unparseable = true; + break; + default: + FLAC__ASSERT(0); + break; + } + + /* check to make sure that reserved bit is 0 */ + if(raw_header[3] & 0x01) /* MAGIC NUMBER */ + is_unparseable = true; + + /* read the frame's starting sample number (or frame number as the case may be) */ + if( + raw_header[1] & 0x01 || + /*@@@ this clause is a concession to the old way of doing variable blocksize; the only known implementation is flake and can probably be removed without inconveniencing anyone */ + (decoder->private_->has_stream_info && decoder->private_->stream_info.data.stream_info.min_blocksize != decoder->private_->stream_info.data.stream_info.max_blocksize) + ) { /* variable blocksize */ + if(!FLAC__bitreader_read_utf8_uint64(decoder->private_->input, &xx, raw_header, &raw_header_len)) + return false; /* read_callback_ sets the state for us */ + if(xx == FLAC__U64L(0xffffffffffffffff)) { /* i.e. non-UTF8 code... */ + decoder->private_->lookahead = raw_header[raw_header_len-1]; /* back up as much as we can */ + decoder->private_->cached = true; + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + } + decoder->private_->frame.header.number_type = FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER; + decoder->private_->frame.header.number.sample_number = xx; + } + else { /* fixed blocksize */ + if(!FLAC__bitreader_read_utf8_uint32(decoder->private_->input, &x, raw_header, &raw_header_len)) + return false; /* read_callback_ sets the state for us */ + if(x == 0xffffffff) { /* i.e. non-UTF8 code... */ + decoder->private_->lookahead = raw_header[raw_header_len-1]; /* back up as much as we can */ + decoder->private_->cached = true; + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + } + decoder->private_->frame.header.number_type = FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER; + decoder->private_->frame.header.number.frame_number = x; + } + + if(blocksize_hint) { + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) + return false; /* read_callback_ sets the state for us */ + raw_header[raw_header_len++] = (FLAC__byte)x; + if(blocksize_hint == 7) { + FLAC__uint32 _x; + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &_x, 8)) + return false; /* read_callback_ sets the state for us */ + raw_header[raw_header_len++] = (FLAC__byte)_x; + x = (x << 8) | _x; + } + decoder->private_->frame.header.blocksize = x+1; + } + + if(sample_rate_hint) { + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) + return false; /* read_callback_ sets the state for us */ + raw_header[raw_header_len++] = (FLAC__byte)x; + if(sample_rate_hint != 12) { + FLAC__uint32 _x; + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &_x, 8)) + return false; /* read_callback_ sets the state for us */ + raw_header[raw_header_len++] = (FLAC__byte)_x; + x = (x << 8) | _x; + } + if(sample_rate_hint == 12) + decoder->private_->frame.header.sample_rate = x*1000; + else if(sample_rate_hint == 13) + decoder->private_->frame.header.sample_rate = x; + else + decoder->private_->frame.header.sample_rate = x*10; + } + + /* read the CRC-8 byte */ + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) + return false; /* read_callback_ sets the state for us */ + crc8 = (FLAC__byte)x; + + if(FLAC__crc8(raw_header, raw_header_len) != crc8) { + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + } + + /* calculate the sample number from the frame number if needed */ + decoder->private_->next_fixed_block_size = 0; + if(decoder->private_->frame.header.number_type == FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER) { + x = decoder->private_->frame.header.number.frame_number; + decoder->private_->frame.header.number_type = FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER; + if(decoder->private_->fixed_block_size) + decoder->private_->frame.header.number.sample_number = (FLAC__uint64)decoder->private_->fixed_block_size * (FLAC__uint64)x; + else if(decoder->private_->has_stream_info) { + if(decoder->private_->stream_info.data.stream_info.min_blocksize == decoder->private_->stream_info.data.stream_info.max_blocksize) { + decoder->private_->frame.header.number.sample_number = (FLAC__uint64)decoder->private_->stream_info.data.stream_info.min_blocksize * (FLAC__uint64)x; + decoder->private_->next_fixed_block_size = decoder->private_->stream_info.data.stream_info.max_blocksize; + } + else + is_unparseable = true; + } + else if(x == 0) { + decoder->private_->frame.header.number.sample_number = 0; + decoder->private_->next_fixed_block_size = decoder->private_->frame.header.blocksize; + } + else { + /* can only get here if the stream has invalid frame numbering and no STREAMINFO, so assume it's not the last (possibly short) frame */ + decoder->private_->frame.header.number.sample_number = (FLAC__uint64)decoder->private_->frame.header.blocksize * (FLAC__uint64)x; + } + } + + if(is_unparseable) { + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + } + + return true; +} + +FLAC__bool read_subframe_(FLAC__StreamDecoder *decoder, unsigned channel, unsigned bps, FLAC__bool do_full_decode) +{ + FLAC__uint32 x; + FLAC__bool wasted_bits; + unsigned i; + + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) /* MAGIC NUMBER */ + return false; /* read_callback_ sets the state for us */ + + wasted_bits = (x & 1); + x &= 0xfe; + + if(wasted_bits) { + unsigned u; + if(!FLAC__bitreader_read_unary_unsigned(decoder->private_->input, &u)) + return false; /* read_callback_ sets the state for us */ + decoder->private_->frame.subframes[channel].wasted_bits = u+1; + if (decoder->private_->frame.subframes[channel].wasted_bits >= bps) + return false; + bps -= decoder->private_->frame.subframes[channel].wasted_bits; + } + else + decoder->private_->frame.subframes[channel].wasted_bits = 0; + + /* + * Lots of magic numbers here + */ + if(x & 0x80) { + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + } + else if(x == 0) { + if(!read_subframe_constant_(decoder, channel, bps, do_full_decode)) + return false; + } + else if(x == 2) { + if(!read_subframe_verbatim_(decoder, channel, bps, do_full_decode)) + return false; + } + else if(x < 16) { + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + } + else if(x <= 24) { + if(!read_subframe_fixed_(decoder, channel, bps, (x>>1)&7, do_full_decode)) + return false; + if(decoder->protected_->state == FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC) /* means bad sync or got corruption */ + return true; + } + else if(x < 64) { + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + } + else { + if(!read_subframe_lpc_(decoder, channel, bps, ((x>>1)&31)+1, do_full_decode)) + return false; + if(decoder->protected_->state == FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC) /* means bad sync or got corruption */ + return true; + } + + if(wasted_bits && do_full_decode) { + x = decoder->private_->frame.subframes[channel].wasted_bits; + for(i = 0; i < decoder->private_->frame.header.blocksize; i++) { + uint32_t val = decoder->private_->output[channel][i]; + decoder->private_->output[channel][i] = (val << x); + } + } + + return true; +} + +FLAC__bool read_subframe_constant_(FLAC__StreamDecoder *decoder, unsigned channel, unsigned bps, FLAC__bool do_full_decode) +{ + FLAC__Subframe_Constant *subframe = &decoder->private_->frame.subframes[channel].data.constant; + FLAC__int32 x; + unsigned i; + FLAC__int32 *output = decoder->private_->output[channel]; + + decoder->private_->frame.subframes[channel].type = FLAC__SUBFRAME_TYPE_CONSTANT; + + if(!FLAC__bitreader_read_raw_int32(decoder->private_->input, &x, bps)) + return false; /* read_callback_ sets the state for us */ + + subframe->value = x; + + /* decode the subframe */ + if(do_full_decode) { + for(i = 0; i < decoder->private_->frame.header.blocksize; i++) + output[i] = x; + } + + return true; +} + +FLAC__bool read_subframe_fixed_(FLAC__StreamDecoder *decoder, unsigned channel, unsigned bps, const unsigned order, FLAC__bool do_full_decode) +{ + FLAC__Subframe_Fixed *subframe = &decoder->private_->frame.subframes[channel].data.fixed; + FLAC__int32 i32; + FLAC__uint32 u32; + unsigned u; + + decoder->private_->frame.subframes[channel].type = FLAC__SUBFRAME_TYPE_FIXED; + + subframe->residual = decoder->private_->residual[channel]; + subframe->order = order; + + /* read warm-up samples */ + for(u = 0; u < order; u++) { + if(!FLAC__bitreader_read_raw_int32(decoder->private_->input, &i32, bps)) + return false; /* read_callback_ sets the state for us */ + subframe->warmup[u] = i32; + } + + /* read entropy coding method info */ + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &u32, FLAC__ENTROPY_CODING_METHOD_TYPE_LEN)) + return false; /* read_callback_ sets the state for us */ + subframe->entropy_coding_method.type = (FLAC__EntropyCodingMethodType)u32; + switch(subframe->entropy_coding_method.type) { + case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE: + case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2: + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &u32, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN)) + return false; /* read_callback_ sets the state for us */ + if(decoder->private_->frame.header.blocksize >> u32 < order) { + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + } + subframe->entropy_coding_method.data.partitioned_rice.order = u32; + subframe->entropy_coding_method.data.partitioned_rice.contents = &decoder->private_->partitioned_rice_contents[channel]; + break; + default: + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + } + + /* read residual */ + switch(subframe->entropy_coding_method.type) { + case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE: + case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2: + if(!read_residual_partitioned_rice_(decoder, order, subframe->entropy_coding_method.data.partitioned_rice.order, &decoder->private_->partitioned_rice_contents[channel], decoder->private_->residual[channel], /*is_extended=*/subframe->entropy_coding_method.type == FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2)) + return false; + break; + default: + FLAC__ASSERT(0); + } + + /* decode the subframe */ + if(do_full_decode) { + memcpy(decoder->private_->output[channel], subframe->warmup, sizeof(FLAC__int32) * order); + FLAC__fixed_restore_signal(decoder->private_->residual[channel], decoder->private_->frame.header.blocksize-order, order, decoder->private_->output[channel]+order); + } + + return true; +} + +FLAC__bool read_subframe_lpc_(FLAC__StreamDecoder *decoder, unsigned channel, unsigned bps, const unsigned order, FLAC__bool do_full_decode) +{ + FLAC__Subframe_LPC *subframe = &decoder->private_->frame.subframes[channel].data.lpc; + FLAC__int32 i32; + FLAC__uint32 u32; + unsigned u; + + decoder->private_->frame.subframes[channel].type = FLAC__SUBFRAME_TYPE_LPC; + + subframe->residual = decoder->private_->residual[channel]; + subframe->order = order; + + /* read warm-up samples */ + for(u = 0; u < order; u++) { + if(!FLAC__bitreader_read_raw_int32(decoder->private_->input, &i32, bps)) + return false; /* read_callback_ sets the state for us */ + subframe->warmup[u] = i32; + } + + /* read qlp coeff precision */ + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &u32, FLAC__SUBFRAME_LPC_QLP_COEFF_PRECISION_LEN)) + return false; /* read_callback_ sets the state for us */ + if(u32 == (1u << FLAC__SUBFRAME_LPC_QLP_COEFF_PRECISION_LEN) - 1) { + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + } + subframe->qlp_coeff_precision = u32+1; + + /* read qlp shift */ + if(!FLAC__bitreader_read_raw_int32(decoder->private_->input, &i32, FLAC__SUBFRAME_LPC_QLP_SHIFT_LEN)) + return false; /* read_callback_ sets the state for us */ + if(i32 < 0) { + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + } + subframe->quantization_level = i32; + + /* read quantized lp coefficiencts */ + for(u = 0; u < order; u++) { + if(!FLAC__bitreader_read_raw_int32(decoder->private_->input, &i32, subframe->qlp_coeff_precision)) + return false; /* read_callback_ sets the state for us */ + subframe->qlp_coeff[u] = i32; + } + + /* read entropy coding method info */ + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &u32, FLAC__ENTROPY_CODING_METHOD_TYPE_LEN)) + return false; /* read_callback_ sets the state for us */ + subframe->entropy_coding_method.type = (FLAC__EntropyCodingMethodType)u32; + switch(subframe->entropy_coding_method.type) { + case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE: + case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2: + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &u32, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN)) + return false; /* read_callback_ sets the state for us */ + if(decoder->private_->frame.header.blocksize >> u32 < order) { + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + } + subframe->entropy_coding_method.data.partitioned_rice.order = u32; + subframe->entropy_coding_method.data.partitioned_rice.contents = &decoder->private_->partitioned_rice_contents[channel]; + break; + default: + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + } + + /* read residual */ + switch(subframe->entropy_coding_method.type) { + case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE: + case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2: + if(!read_residual_partitioned_rice_(decoder, order, subframe->entropy_coding_method.data.partitioned_rice.order, &decoder->private_->partitioned_rice_contents[channel], decoder->private_->residual[channel], /*is_extended=*/subframe->entropy_coding_method.type == FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2)) + return false; + break; + default: + FLAC__ASSERT(0); + } + + /* decode the subframe */ + if(do_full_decode) { + memcpy(decoder->private_->output[channel], subframe->warmup, sizeof(FLAC__int32) * order); + if(bps + subframe->qlp_coeff_precision + FLAC__bitmath_ilog2(order) <= 32) + if(bps <= 16 && subframe->qlp_coeff_precision <= 16) + decoder->private_->local_lpc_restore_signal_16bit(decoder->private_->residual[channel], decoder->private_->frame.header.blocksize-order, subframe->qlp_coeff, order, subframe->quantization_level, decoder->private_->output[channel]+order); + else + decoder->private_->local_lpc_restore_signal(decoder->private_->residual[channel], decoder->private_->frame.header.blocksize-order, subframe->qlp_coeff, order, subframe->quantization_level, decoder->private_->output[channel]+order); + else + decoder->private_->local_lpc_restore_signal_64bit(decoder->private_->residual[channel], decoder->private_->frame.header.blocksize-order, subframe->qlp_coeff, order, subframe->quantization_level, decoder->private_->output[channel]+order); + } + + return true; +} + +FLAC__bool read_subframe_verbatim_(FLAC__StreamDecoder *decoder, unsigned channel, unsigned bps, FLAC__bool do_full_decode) +{ + FLAC__Subframe_Verbatim *subframe = &decoder->private_->frame.subframes[channel].data.verbatim; + FLAC__int32 x, *residual = decoder->private_->residual[channel]; + unsigned i; + + decoder->private_->frame.subframes[channel].type = FLAC__SUBFRAME_TYPE_VERBATIM; + + subframe->data = residual; + + for(i = 0; i < decoder->private_->frame.header.blocksize; i++) { + if(!FLAC__bitreader_read_raw_int32(decoder->private_->input, &x, bps)) + return false; /* read_callback_ sets the state for us */ + residual[i] = x; + } + + /* decode the subframe */ + if(do_full_decode) + memcpy(decoder->private_->output[channel], subframe->data, sizeof(FLAC__int32) * decoder->private_->frame.header.blocksize); + + return true; +} + +FLAC__bool read_residual_partitioned_rice_(FLAC__StreamDecoder *decoder, unsigned predictor_order, unsigned partition_order, FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents, FLAC__int32 *residual, FLAC__bool is_extended) +{ + FLAC__uint32 rice_parameter; + int i; + unsigned partition, sample, u; + const unsigned partitions = 1u << partition_order; + const unsigned partition_samples = partition_order > 0? decoder->private_->frame.header.blocksize >> partition_order : decoder->private_->frame.header.blocksize - predictor_order; + const unsigned plen = is_extended? FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_PARAMETER_LEN : FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN; + const unsigned pesc = is_extended? FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_ESCAPE_PARAMETER : FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER; + + /* invalid predictor and partition orders mush be handled in the callers */ + FLAC__ASSERT(partition_order > 0? partition_samples >= predictor_order : decoder->private_->frame.header.blocksize >= predictor_order); + + if(!FLAC__format_entropy_coding_method_partitioned_rice_contents_ensure_size(partitioned_rice_contents, flac_max(6u, partition_order))) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + + sample = 0; + for(partition = 0; partition < partitions; partition++) { + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &rice_parameter, plen)) + return false; /* read_callback_ sets the state for us */ + partitioned_rice_contents->parameters[partition] = rice_parameter; + if(rice_parameter < pesc) { + partitioned_rice_contents->raw_bits[partition] = 0; + u = (partition_order == 0 || partition > 0)? partition_samples : partition_samples - predictor_order; + if(!FLAC__bitreader_read_rice_signed_block(decoder->private_->input, residual + sample, u, rice_parameter)) + return false; /* read_callback_ sets the state for us */ + sample += u; + } + else { + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &rice_parameter, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_RAW_LEN)) + return false; /* read_callback_ sets the state for us */ + partitioned_rice_contents->raw_bits[partition] = rice_parameter; + for(u = (partition_order == 0 || partition > 0)? 0 : predictor_order; u < partition_samples; u++, sample++) { + if(!FLAC__bitreader_read_raw_int32(decoder->private_->input, &i, rice_parameter)) + return false; /* read_callback_ sets the state for us */ + residual[sample] = i; + } + } + } + + return true; +} + +FLAC__bool read_zero_padding_(FLAC__StreamDecoder *decoder) +{ + if(!FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)) { + FLAC__uint32 zero = 0; + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &zero, FLAC__bitreader_bits_left_for_byte_alignment(decoder->private_->input))) + return false; /* read_callback_ sets the state for us */ + if(zero != 0) { + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + } + } + return true; +} + +FLAC__bool read_callback_(FLAC__byte buffer[], size_t *bytes, void *client_data) +{ + FLAC__StreamDecoder *decoder = (FLAC__StreamDecoder *)client_data; + + if( +#if FLAC__HAS_OGG + /* see [1] HACK NOTE below for why we don't call the eof_callback when decoding Ogg FLAC */ + !decoder->private_->is_ogg && +#endif + decoder->private_->eof_callback && decoder->private_->eof_callback(decoder, decoder->private_->client_data) + ) { + *bytes = 0; + decoder->protected_->state = FLAC__STREAM_DECODER_END_OF_STREAM; + return false; + } + else if(*bytes > 0) { + /* While seeking, it is possible for our seek to land in the + * middle of audio data that looks exactly like a frame header + * from a future version of an encoder. When that happens, our + * error callback will get an + * FLAC__STREAM_DECODER_UNPARSEABLE_STREAM and increment its + * unparseable_frame_count. But there is a remote possibility + * that it is properly synced at such a "future-codec frame", + * so to make sure, we wait to see many "unparseable" errors in + * a row before bailing out. + */ + if(decoder->private_->is_seeking && decoder->private_->unparseable_frame_count > 20) { + decoder->protected_->state = FLAC__STREAM_DECODER_ABORTED; + return false; + } + else { + const FLAC__StreamDecoderReadStatus status = +#if FLAC__HAS_OGG + decoder->private_->is_ogg? + read_callback_ogg_aspect_(decoder, buffer, bytes) : +#endif + decoder->private_->read_callback(decoder, buffer, bytes, decoder->private_->client_data) + ; + if(status == FLAC__STREAM_DECODER_READ_STATUS_ABORT) { + decoder->protected_->state = FLAC__STREAM_DECODER_ABORTED; + return false; + } + else if(*bytes == 0) { + if( + status == FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM || + ( +#if FLAC__HAS_OGG + /* see [1] HACK NOTE below for why we don't call the eof_callback when decoding Ogg FLAC */ + !decoder->private_->is_ogg && +#endif + decoder->private_->eof_callback && decoder->private_->eof_callback(decoder, decoder->private_->client_data) + ) + ) { + decoder->protected_->state = FLAC__STREAM_DECODER_END_OF_STREAM; + return false; + } + else + return true; + } + else + return true; + } + } + else { + /* abort to avoid a deadlock */ + decoder->protected_->state = FLAC__STREAM_DECODER_ABORTED; + return false; + } + /* [1] @@@ HACK NOTE: The end-of-stream checking has to be hacked around + * for Ogg FLAC. This is because the ogg decoder aspect can lose sync + * and at the same time hit the end of the stream (for example, seeking + * to a point that is after the beginning of the last Ogg page). There + * is no way to report an Ogg sync loss through the callbacks (see note + * in read_callback_ogg_aspect_()) so it returns CONTINUE with *bytes==0. + * So to keep the decoder from stopping at this point we gate the call + * to the eof_callback and let the Ogg decoder aspect set the + * end-of-stream state when it is needed. + */ +} + +#if FLAC__HAS_OGG +FLAC__StreamDecoderReadStatus read_callback_ogg_aspect_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes) +{ + switch(FLAC__ogg_decoder_aspect_read_callback_wrapper(&decoder->protected_->ogg_decoder_aspect, buffer, bytes, read_callback_proxy_, decoder, decoder->private_->client_data)) { + case FLAC__OGG_DECODER_ASPECT_READ_STATUS_OK: + return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; + /* we don't really have a way to handle lost sync via read + * callback so we'll let it pass and let the underlying + * FLAC decoder catch the error + */ + case FLAC__OGG_DECODER_ASPECT_READ_STATUS_LOST_SYNC: + return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; + case FLAC__OGG_DECODER_ASPECT_READ_STATUS_END_OF_STREAM: + return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM; + case FLAC__OGG_DECODER_ASPECT_READ_STATUS_NOT_FLAC: + case FLAC__OGG_DECODER_ASPECT_READ_STATUS_UNSUPPORTED_MAPPING_VERSION: + case FLAC__OGG_DECODER_ASPECT_READ_STATUS_ABORT: + case FLAC__OGG_DECODER_ASPECT_READ_STATUS_ERROR: + case FLAC__OGG_DECODER_ASPECT_READ_STATUS_MEMORY_ALLOCATION_ERROR: + return FLAC__STREAM_DECODER_READ_STATUS_ABORT; + default: + FLAC__ASSERT(0); + /* double protection */ + return FLAC__STREAM_DECODER_READ_STATUS_ABORT; + } +} + +FLAC__OggDecoderAspectReadStatus read_callback_proxy_(const void *void_decoder, FLAC__byte buffer[], size_t *bytes, void *client_data) +{ + FLAC__StreamDecoder *decoder = (FLAC__StreamDecoder*)void_decoder; + + switch(decoder->private_->read_callback(decoder, buffer, bytes, client_data)) { + case FLAC__STREAM_DECODER_READ_STATUS_CONTINUE: + return FLAC__OGG_DECODER_ASPECT_READ_STATUS_OK; + case FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM: + return FLAC__OGG_DECODER_ASPECT_READ_STATUS_END_OF_STREAM; + case FLAC__STREAM_DECODER_READ_STATUS_ABORT: + return FLAC__OGG_DECODER_ASPECT_READ_STATUS_ABORT; + default: + /* double protection: */ + FLAC__ASSERT(0); + return FLAC__OGG_DECODER_ASPECT_READ_STATUS_ABORT; + } +} +#endif + +FLAC__StreamDecoderWriteStatus write_audio_frame_to_client_(FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[]) +{ + if(decoder->private_->is_seeking) { + FLAC__uint64 this_frame_sample = frame->header.number.sample_number; + FLAC__uint64 next_frame_sample = this_frame_sample + (FLAC__uint64)frame->header.blocksize; + FLAC__uint64 target_sample = decoder->private_->target_sample; + + FLAC__ASSERT(frame->header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER); + +#if FLAC__HAS_OGG + decoder->private_->got_a_frame = true; +#endif + decoder->private_->last_frame = *frame; /* save the frame */ + if(this_frame_sample <= target_sample && target_sample < next_frame_sample) { /* we hit our target frame */ + unsigned delta = (unsigned)(target_sample - this_frame_sample); + /* kick out of seek mode */ + decoder->private_->is_seeking = false; + /* shift out the samples before target_sample */ + if(delta > 0) { + unsigned channel; + const FLAC__int32 *newbuffer[FLAC__MAX_CHANNELS]; + for(channel = 0; channel < frame->header.channels; channel++) + newbuffer[channel] = buffer[channel] + delta; + decoder->private_->last_frame.header.blocksize -= delta; + decoder->private_->last_frame.header.number.sample_number += (FLAC__uint64)delta; + /* write the relevant samples */ + return decoder->private_->write_callback(decoder, &decoder->private_->last_frame, newbuffer, decoder->private_->client_data); + } + else { + /* write the relevant samples */ + return decoder->private_->write_callback(decoder, frame, buffer, decoder->private_->client_data); + } + } + else { + return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; + } + } + else { + /* + * If we never got STREAMINFO, turn off MD5 checking to save + * cycles since we don't have a sum to compare to anyway + */ + if(!decoder->private_->has_stream_info) + decoder->private_->do_md5_checking = false; + if(decoder->private_->do_md5_checking) { + if(!FLAC__MD5Accumulate(&decoder->private_->md5context, buffer, frame->header.channels, frame->header.blocksize, (frame->header.bits_per_sample+7) / 8)) + return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT; + } + return decoder->private_->write_callback(decoder, frame, buffer, decoder->private_->client_data); + } +} + +void send_error_to_client_(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status) +{ + if(!decoder->private_->is_seeking) + decoder->private_->error_callback(decoder, status, decoder->private_->client_data); + else if(status == FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM) + decoder->private_->unparseable_frame_count++; +} + +FLAC__bool seek_to_absolute_sample_(FLAC__StreamDecoder *decoder, FLAC__uint64 stream_length, FLAC__uint64 target_sample) +{ + FLAC__uint64 first_frame_offset = decoder->private_->first_frame_offset, lower_bound, upper_bound, lower_bound_sample, upper_bound_sample, this_frame_sample; + FLAC__int64 pos = -1; + int i; + unsigned approx_bytes_per_frame; + FLAC__bool first_seek = true; + const FLAC__uint64 total_samples = FLAC__stream_decoder_get_total_samples(decoder); + const unsigned min_blocksize = decoder->private_->stream_info.data.stream_info.min_blocksize; + const unsigned max_blocksize = decoder->private_->stream_info.data.stream_info.max_blocksize; + const unsigned max_framesize = decoder->private_->stream_info.data.stream_info.max_framesize; + const unsigned min_framesize = decoder->private_->stream_info.data.stream_info.min_framesize; + /* take these from the current frame in case they've changed mid-stream */ + unsigned channels = FLAC__stream_decoder_get_channels(decoder); + unsigned bps = FLAC__stream_decoder_get_bits_per_sample(decoder); + const FLAC__StreamMetadata_SeekTable *seek_table = decoder->private_->has_seek_table? &decoder->private_->seek_table.data.seek_table : 0; + + /* use values from stream info if we didn't decode a frame */ + if(channels == 0) + channels = decoder->private_->stream_info.data.stream_info.channels; + if(bps == 0) + bps = decoder->private_->stream_info.data.stream_info.bits_per_sample; + + /* we are just guessing here */ + if(max_framesize > 0) + approx_bytes_per_frame = (max_framesize + min_framesize) / 2 + 1; + /* + * Check if it's a known fixed-blocksize stream. Note that though + * the spec doesn't allow zeroes in the STREAMINFO block, we may + * never get a STREAMINFO block when decoding so the value of + * min_blocksize might be zero. + */ + else if(min_blocksize == max_blocksize && min_blocksize > 0) { + /* note there are no () around 'bps/8' to keep precision up since it's an integer calulation */ + approx_bytes_per_frame = min_blocksize * channels * bps/8 + 64; + } + else + approx_bytes_per_frame = 4096 * channels * bps/8 + 64; + + /* + * First, we set an upper and lower bound on where in the + * stream we will search. For now we assume the worst case + * scenario, which is our best guess at the beginning of + * the first frame and end of the stream. + */ + lower_bound = first_frame_offset; + lower_bound_sample = 0; + upper_bound = stream_length; + upper_bound_sample = total_samples > 0 ? total_samples : target_sample /*estimate it*/; + + /* + * Now we refine the bounds if we have a seektable with + * suitable points. Note that according to the spec they + * must be ordered by ascending sample number. + * + * Note: to protect against invalid seek tables we will ignore points + * that have frame_samples==0 or sample_number>=total_samples + */ + if(seek_table) { + FLAC__uint64 new_lower_bound = lower_bound; + FLAC__uint64 new_upper_bound = upper_bound; + FLAC__uint64 new_lower_bound_sample = lower_bound_sample; + FLAC__uint64 new_upper_bound_sample = upper_bound_sample; + + /* find the closest seek point <= target_sample, if it exists */ + for(i = (int)seek_table->num_points - 1; i >= 0; i--) { + if( + seek_table->points[i].sample_number != FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER && + seek_table->points[i].frame_samples > 0 && /* defense against bad seekpoints */ + (total_samples <= 0 || seek_table->points[i].sample_number < total_samples) && /* defense against bad seekpoints */ + seek_table->points[i].sample_number <= target_sample + ) + break; + } + if(i >= 0) { /* i.e. we found a suitable seek point... */ + new_lower_bound = first_frame_offset + seek_table->points[i].stream_offset; + new_lower_bound_sample = seek_table->points[i].sample_number; + } + + /* find the closest seek point > target_sample, if it exists */ + for(i = 0; i < (int)seek_table->num_points; i++) { + if( + seek_table->points[i].sample_number != FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER && + seek_table->points[i].frame_samples > 0 && /* defense against bad seekpoints */ + (total_samples <= 0 || seek_table->points[i].sample_number < total_samples) && /* defense against bad seekpoints */ + seek_table->points[i].sample_number > target_sample + ) + break; + } + if(i < (int)seek_table->num_points) { /* i.e. we found a suitable seek point... */ + new_upper_bound = first_frame_offset + seek_table->points[i].stream_offset; + new_upper_bound_sample = seek_table->points[i].sample_number; + } + /* final protection against unsorted seek tables; keep original values if bogus */ + if(new_upper_bound >= new_lower_bound) { + lower_bound = new_lower_bound; + upper_bound = new_upper_bound; + lower_bound_sample = new_lower_bound_sample; + upper_bound_sample = new_upper_bound_sample; + } + } + + FLAC__ASSERT(upper_bound_sample >= lower_bound_sample); + /* there are 2 insidious ways that the following equality occurs, which + * we need to fix: + * 1) total_samples is 0 (unknown) and target_sample is 0 + * 2) total_samples is 0 (unknown) and target_sample happens to be + * exactly equal to the last seek point in the seek table; this + * means there is no seek point above it, and upper_bound_samples + * remains equal to the estimate (of target_samples) we made above + * in either case it does not hurt to move upper_bound_sample up by 1 + */ + if(upper_bound_sample == lower_bound_sample) + upper_bound_sample++; + + decoder->private_->target_sample = target_sample; + while(1) { + /* check if the bounds are still ok */ + if (lower_bound_sample >= upper_bound_sample || lower_bound > upper_bound) { + decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; + return false; + } +#ifndef FLAC__INTEGER_ONLY_LIBRARY + pos = (FLAC__int64)lower_bound + (FLAC__int64)((double)(target_sample - lower_bound_sample) / (double)(upper_bound_sample - lower_bound_sample) * (double)(upper_bound - lower_bound)) - approx_bytes_per_frame; +#else + /* a little less accurate: */ + if(upper_bound - lower_bound < 0xffffffff) + pos = (FLAC__int64)lower_bound + (FLAC__int64)(((target_sample - lower_bound_sample) * (upper_bound - lower_bound)) / (upper_bound_sample - lower_bound_sample)) - approx_bytes_per_frame; + else /* @@@ WATCHOUT, ~2TB limit */ + pos = (FLAC__int64)lower_bound + (FLAC__int64)((((target_sample - lower_bound_sample)>>8) * ((upper_bound - lower_bound)>>8)) / ((upper_bound_sample - lower_bound_sample)>>16)) - approx_bytes_per_frame; +#endif + if(pos >= (FLAC__int64)upper_bound) + pos = (FLAC__int64)upper_bound - 1; + if(pos < (FLAC__int64)lower_bound) + pos = (FLAC__int64)lower_bound; + if(decoder->private_->seek_callback(decoder, (FLAC__uint64)pos, decoder->private_->client_data) != FLAC__STREAM_DECODER_SEEK_STATUS_OK) { + decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; + return false; + } + if(!FLAC__stream_decoder_flush(decoder)) { + /* above call sets the state for us */ + return false; + } + /* Now we need to get a frame. First we need to reset our + * unparseable_frame_count; if we get too many unparseable + * frames in a row, the read callback will return + * FLAC__STREAM_DECODER_READ_STATUS_ABORT, causing + * FLAC__stream_decoder_process_single() to return false. + */ + decoder->private_->unparseable_frame_count = 0; + if(!FLAC__stream_decoder_process_single(decoder) || + decoder->protected_->state == FLAC__STREAM_DECODER_ABORTED) { + decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; + return false; + } + /* our write callback will change the state when it gets to the target frame */ + /* actually, we could have got_a_frame if our decoder is at FLAC__STREAM_DECODER_END_OF_STREAM so we need to check for that also */ +#if 0 + /*@@@@@@ used to be the following; not clear if the check for end of stream is needed anymore */ + if(decoder->protected_->state != FLAC__SEEKABLE_STREAM_DECODER_SEEKING && decoder->protected_->state != FLAC__STREAM_DECODER_END_OF_STREAM) + break; +#endif + if(!decoder->private_->is_seeking) + break; + + FLAC__ASSERT(decoder->private_->last_frame.header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER); + this_frame_sample = decoder->private_->last_frame.header.number.sample_number; + + if (0 == decoder->private_->samples_decoded || (this_frame_sample + decoder->private_->last_frame.header.blocksize >= upper_bound_sample && !first_seek)) { + if (pos == (FLAC__int64)lower_bound) { + /* can't move back any more than the first frame, something is fatally wrong */ + decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; + return false; + } + /* our last move backwards wasn't big enough, try again */ + approx_bytes_per_frame = approx_bytes_per_frame? approx_bytes_per_frame * 2 : 16; + continue; + } + /* allow one seek over upper bound, so we can get a correct upper_bound_sample for streams with unknown total_samples */ + first_seek = false; + + /* make sure we are not seeking in corrupted stream */ + if (this_frame_sample < lower_bound_sample) { + decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; + return false; + } + + /* we need to narrow the search */ + if(target_sample < this_frame_sample) { + upper_bound_sample = this_frame_sample + decoder->private_->last_frame.header.blocksize; +/*@@@@@@ what will decode position be if at end of stream? */ + if(!FLAC__stream_decoder_get_decode_position(decoder, &upper_bound)) { + decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; + return false; + } + approx_bytes_per_frame = (unsigned)(2 * (upper_bound - pos) / 3 + 16); + } + else { /* target_sample >= this_frame_sample + this frame's blocksize */ + lower_bound_sample = this_frame_sample + decoder->private_->last_frame.header.blocksize; + if(!FLAC__stream_decoder_get_decode_position(decoder, &lower_bound)) { + decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; + return false; + } + approx_bytes_per_frame = (unsigned)(2 * (lower_bound - pos) / 3 + 16); + } + } + + return true; +} + +#if FLAC__HAS_OGG +FLAC__bool seek_to_absolute_sample_ogg_(FLAC__StreamDecoder *decoder, FLAC__uint64 stream_length, FLAC__uint64 target_sample) +{ + FLAC__uint64 left_pos = 0, right_pos = stream_length; + FLAC__uint64 left_sample = 0, right_sample = FLAC__stream_decoder_get_total_samples(decoder); + FLAC__uint64 this_frame_sample = (FLAC__uint64)0 - 1; + FLAC__uint64 pos = 0; /* only initialized to avoid compiler warning */ + FLAC__bool did_a_seek; + unsigned iteration = 0; + + /* In the first iterations, we will calculate the target byte position + * by the distance from the target sample to left_sample and + * right_sample (let's call it "proportional search"). After that, we + * will switch to binary search. + */ + unsigned BINARY_SEARCH_AFTER_ITERATION = 2; + + /* We will switch to a linear search once our current sample is less + * than this number of samples ahead of the target sample + */ + static const FLAC__uint64 LINEAR_SEARCH_WITHIN_SAMPLES = FLAC__MAX_BLOCK_SIZE * 2; + + /* If the total number of samples is unknown, use a large value, and + * force binary search immediately. + */ + if(right_sample == 0) { + right_sample = (FLAC__uint64)(-1); + BINARY_SEARCH_AFTER_ITERATION = 0; + } + + decoder->private_->target_sample = target_sample; + for( ; ; iteration++) { + if (iteration == 0 || this_frame_sample > target_sample || target_sample - this_frame_sample > LINEAR_SEARCH_WITHIN_SAMPLES) { + if (iteration >= BINARY_SEARCH_AFTER_ITERATION) { + pos = (right_pos + left_pos) / 2; + } + else { +#ifndef FLAC__INTEGER_ONLY_LIBRARY + pos = (FLAC__uint64)((double)(target_sample - left_sample) / (double)(right_sample - left_sample) * (double)(right_pos - left_pos)); +#else + /* a little less accurate: */ + if ((target_sample-left_sample <= 0xffffffff) && (right_pos-left_pos <= 0xffffffff)) + pos = (FLAC__int64)(((target_sample-left_sample) * (right_pos-left_pos)) / (right_sample-left_sample)); + else /* @@@ WATCHOUT, ~2TB limit */ + pos = (FLAC__int64)((((target_sample-left_sample)>>8) * ((right_pos-left_pos)>>8)) / ((right_sample-left_sample)>>16)); +#endif + /* @@@ TODO: might want to limit pos to some distance + * before EOF, to make sure we land before the last frame, + * thereby getting a this_frame_sample and so having a better + * estimate. + */ + } + + /* physical seek */ + if(decoder->private_->seek_callback((FLAC__StreamDecoder*)decoder, (FLAC__uint64)pos, decoder->private_->client_data) != FLAC__STREAM_DECODER_SEEK_STATUS_OK) { + decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; + return false; + } + if(!FLAC__stream_decoder_flush(decoder)) { + /* above call sets the state for us */ + return false; + } + did_a_seek = true; + } + else + did_a_seek = false; + + decoder->private_->got_a_frame = false; + if(!FLAC__stream_decoder_process_single(decoder) || + decoder->protected_->state == FLAC__STREAM_DECODER_ABORTED) { + decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; + return false; + } + if(!decoder->private_->got_a_frame) { + if(did_a_seek) { + /* this can happen if we seek to a point after the last frame; we drop + * to binary search right away in this case to avoid any wasted + * iterations of proportional search. + */ + right_pos = pos; + BINARY_SEARCH_AFTER_ITERATION = 0; + } + else { + /* this can probably only happen if total_samples is unknown and the + * target_sample is past the end of the stream + */ + decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; + return false; + } + } + /* our write callback will change the state when it gets to the target frame */ + else if(!decoder->private_->is_seeking) { + break; + } + else { + this_frame_sample = decoder->private_->last_frame.header.number.sample_number; + FLAC__ASSERT(decoder->private_->last_frame.header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER); + + if (did_a_seek) { + if (this_frame_sample <= target_sample) { + /* The 'equal' case should not happen, since + * FLAC__stream_decoder_process_single() + * should recognize that it has hit the + * target sample and we would exit through + * the 'break' above. + */ + FLAC__ASSERT(this_frame_sample != target_sample); + + left_sample = this_frame_sample; + /* sanity check to avoid infinite loop */ + if (left_pos == pos) { + decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; + return false; + } + left_pos = pos; + } + else if(this_frame_sample > target_sample) { + right_sample = this_frame_sample; + /* sanity check to avoid infinite loop */ + if (right_pos == pos) { + decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; + return false; + } + right_pos = pos; + } + } + } + } + + return true; +} +#endif + +FLAC__StreamDecoderReadStatus file_read_callback_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data) +{ + (void)client_data; + + if(*bytes > 0) { + *bytes = fread(buffer, sizeof(FLAC__byte), *bytes, decoder->private_->file); + if(ferror(decoder->private_->file)) + return FLAC__STREAM_DECODER_READ_STATUS_ABORT; + else if(*bytes == 0) + return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM; + else + return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; + } + else + return FLAC__STREAM_DECODER_READ_STATUS_ABORT; /* abort to avoid a deadlock */ +} + +FLAC__StreamDecoderSeekStatus file_seek_callback_(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data) +{ + (void)client_data; + + if(decoder->private_->file == stdin) + return FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED; + else if(fseeko(decoder->private_->file, (FLAC__off_t)absolute_byte_offset, SEEK_SET) < 0) + return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR; + else + return FLAC__STREAM_DECODER_SEEK_STATUS_OK; +} + +FLAC__StreamDecoderTellStatus file_tell_callback_(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data) +{ + FLAC__off_t pos; + (void)client_data; + + if(decoder->private_->file == stdin) + return FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED; + else if((pos = ftello(decoder->private_->file)) < 0) + return FLAC__STREAM_DECODER_TELL_STATUS_ERROR; + else { + *absolute_byte_offset = (FLAC__uint64)pos; + return FLAC__STREAM_DECODER_TELL_STATUS_OK; + } +} + +FLAC__StreamDecoderLengthStatus file_length_callback_(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data) +{ + struct flac_stat_s filestats; + (void)client_data; + + if(decoder->private_->file == stdin) + return FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED; + else if(flac_fstat(fileno(decoder->private_->file), &filestats) != 0) + return FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR; + else { + *stream_length = (FLAC__uint64)filestats.st_size; + return FLAC__STREAM_DECODER_LENGTH_STATUS_OK; + } +} + +FLAC__bool file_eof_callback_(const FLAC__StreamDecoder *decoder, void *client_data) +{ + (void)client_data; + + return feof(decoder->private_->file)? true : false; +} diff --git a/core/cd_hw/libchdr/deps/lzma/7zTypes.h b/core/cd_hw/libchdr/deps/lzma/7zTypes.h new file mode 100644 index 0000000..3034a3d --- /dev/null +++ b/core/cd_hw/libchdr/deps/lzma/7zTypes.h @@ -0,0 +1,258 @@ +/* 7zTypes.h -- Basic types +2013-11-12 : Igor Pavlov : Public domain */ + +#ifndef __7Z_TYPES_H +#define __7Z_TYPES_H + +#ifdef _WIN32 +/* #include */ +#endif + +#include + +#ifndef EXTERN_C_BEGIN +#ifdef __cplusplus +#define EXTERN_C_BEGIN extern "C" { +#define EXTERN_C_END } +#else +#define EXTERN_C_BEGIN +#define EXTERN_C_END +#endif +#endif + +EXTERN_C_BEGIN + +#define SZ_OK 0 + +#define SZ_ERROR_DATA 1 +#define SZ_ERROR_MEM 2 +#define SZ_ERROR_CRC 3 +#define SZ_ERROR_UNSUPPORTED 4 +#define SZ_ERROR_PARAM 5 +#define SZ_ERROR_INPUT_EOF 6 +#define SZ_ERROR_OUTPUT_EOF 7 +#define SZ_ERROR_READ 8 +#define SZ_ERROR_WRITE 9 +#define SZ_ERROR_PROGRESS 10 +#define SZ_ERROR_FAIL 11 +#define SZ_ERROR_THREAD 12 + +#define SZ_ERROR_ARCHIVE 16 +#define SZ_ERROR_NO_ARCHIVE 17 + +typedef int SRes; + +#ifdef _WIN32 +/* typedef DWORD WRes; */ +typedef unsigned WRes; +#else +typedef int WRes; +#endif + +#ifndef RINOK +#define RINOK(x) { int __result__ = (x); if (__result__ != 0) return __result__; } +#endif + +#ifndef ZCONF_H +typedef unsigned char Byte; +#endif +typedef short Int16; +typedef unsigned short UInt16; + +#ifdef _LZMA_UINT32_IS_ULONG +typedef long Int32; +typedef unsigned long UInt32; +#else +typedef int Int32; +typedef unsigned int UInt32; +#endif + +#ifdef _SZ_NO_INT_64 + +/* define _SZ_NO_INT_64, if your compiler doesn't support 64-bit integers. + NOTES: Some code will work incorrectly in that case! */ + +typedef long Int64; +typedef unsigned long UInt64; + +#else + +#if defined(_MSC_VER) || defined(__BORLANDC__) +typedef __int64 Int64; +typedef unsigned __int64 UInt64; +#define UINT64_CONST(n) n +#else +typedef long long int Int64; +typedef unsigned long long int UInt64; +#define UINT64_CONST(n) n ## ULL +#endif + +#endif + +#ifdef _LZMA_NO_SYSTEM_SIZE_T +typedef UInt32 SizeT; +#else +typedef size_t SizeT; +#endif + +typedef int Bool; +#define True 1 +#define False 0 + + +#ifdef _WIN32 +#define MY_STD_CALL __stdcall +#else +#define MY_STD_CALL +#endif + +#ifdef _MSC_VER + +#if _MSC_VER >= 1300 +#define MY_NO_INLINE __declspec(noinline) +#else +#define MY_NO_INLINE +#endif + +#define MY_CDECL __cdecl +#define MY_FAST_CALL __fastcall + +#else + +#define MY_NO_INLINE +#define MY_CDECL +#define MY_FAST_CALL + +#endif + + +/* The following interfaces use first parameter as pointer to structure */ + +typedef struct +{ + Byte (*Read)(void *p); /* reads one byte, returns 0 in case of EOF or error */ +} IByteIn; + +typedef struct +{ + void (*Write)(void *p, Byte b); +} IByteOut; + +typedef struct +{ + SRes (*Read)(void *p, void *buf, size_t *size); + /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream. + (output(*size) < input(*size)) is allowed */ +} ISeqInStream; + +/* it can return SZ_ERROR_INPUT_EOF */ +SRes SeqInStream_Read(ISeqInStream *stream, void *buf, size_t size); +SRes SeqInStream_Read2(ISeqInStream *stream, void *buf, size_t size, SRes errorType); +SRes SeqInStream_ReadByte(ISeqInStream *stream, Byte *buf); + +typedef struct +{ + size_t (*Write)(void *p, const void *buf, size_t size); + /* Returns: result - the number of actually written bytes. + (result < size) means error */ +} ISeqOutStream; + +typedef enum +{ + SZ_SEEK_SET = 0, + SZ_SEEK_CUR = 1, + SZ_SEEK_END = 2 +} ESzSeek; + +typedef struct +{ + SRes (*Read)(void *p, void *buf, size_t *size); /* same as ISeqInStream::Read */ + SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin); +} ISeekInStream; + +typedef struct +{ + SRes (*Look)(void *p, const void **buf, size_t *size); + /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream. + (output(*size) > input(*size)) is not allowed + (output(*size) < input(*size)) is allowed */ + SRes (*Skip)(void *p, size_t offset); + /* offset must be <= output(*size) of Look */ + + SRes (*Read)(void *p, void *buf, size_t *size); + /* reads directly (without buffer). It's same as ISeqInStream::Read */ + SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin); +} ILookInStream; + +SRes LookInStream_LookRead(ILookInStream *stream, void *buf, size_t *size); +SRes LookInStream_SeekTo(ILookInStream *stream, UInt64 offset); + +/* reads via ILookInStream::Read */ +SRes LookInStream_Read2(ILookInStream *stream, void *buf, size_t size, SRes errorType); +SRes LookInStream_Read(ILookInStream *stream, void *buf, size_t size); + +#define LookToRead_BUF_SIZE (1 << 14) + +typedef struct +{ + ILookInStream s; + ISeekInStream *realStream; + size_t pos; + size_t size; + Byte buf[LookToRead_BUF_SIZE]; +} CLookToRead; + +void LookToRead_CreateVTable(CLookToRead *p, int lookahead); +void LookToRead_Init(CLookToRead *p); + +typedef struct +{ + ISeqInStream s; + ILookInStream *realStream; +} CSecToLook; + +void SecToLook_CreateVTable(CSecToLook *p); + +typedef struct +{ + ISeqInStream s; + ILookInStream *realStream; +} CSecToRead; + +void SecToRead_CreateVTable(CSecToRead *p); + +typedef struct +{ + SRes (*Progress)(void *p, UInt64 inSize, UInt64 outSize); + /* Returns: result. (result != SZ_OK) means break. + Value (UInt64)(Int64)-1 for size means unknown value. */ +} ICompressProgress; + +typedef struct +{ + void *(*Alloc)(void *p, size_t size); + void (*Free)(void *p, void *address); /* address can be 0 */ +} ISzAlloc; + +#define IAlloc_Alloc(p, size) (p)->Alloc((p), size) +#define IAlloc_Free(p, a) (p)->Free((p), a) + +#ifdef _WIN32 + +#define CHAR_PATH_SEPARATOR '\\' +#define WCHAR_PATH_SEPARATOR L'\\' +#define STRING_PATH_SEPARATOR "\\" +#define WSTRING_PATH_SEPARATOR L"\\" + +#else + +#define CHAR_PATH_SEPARATOR '/' +#define WCHAR_PATH_SEPARATOR L'/' +#define STRING_PATH_SEPARATOR "/" +#define WSTRING_PATH_SEPARATOR L"/" + +#endif + +EXTERN_C_END + +#endif diff --git a/core/cd_hw/libchdr/deps/lzma/Compiler.h b/core/cd_hw/libchdr/deps/lzma/Compiler.h new file mode 100644 index 0000000..5bba7ee --- /dev/null +++ b/core/cd_hw/libchdr/deps/lzma/Compiler.h @@ -0,0 +1,32 @@ +/* Compiler.h +2015-08-02 : Igor Pavlov : Public domain */ + +#ifndef __7Z_COMPILER_H +#define __7Z_COMPILER_H + +#ifdef _MSC_VER + + #ifdef UNDER_CE + #define RPC_NO_WINDOWS_H + /* #pragma warning(disable : 4115) // '_RPC_ASYNC_STATE' : named type definition in parentheses */ + #pragma warning(disable : 4201) // nonstandard extension used : nameless struct/union + #pragma warning(disable : 4214) // nonstandard extension used : bit field types other than int + #endif + + #if _MSC_VER >= 1300 + #pragma warning(disable : 4996) // This function or variable may be unsafe + #else + #pragma warning(disable : 4511) // copy constructor could not be generated + #pragma warning(disable : 4512) // assignment operator could not be generated + #pragma warning(disable : 4514) // unreferenced inline function has been removed + #pragma warning(disable : 4702) // unreachable code + #pragma warning(disable : 4710) // not inlined + #pragma warning(disable : 4786) // identifier was truncated to '255' characters in the debug information + #endif + +#endif + +#define UNUSED_VAR(x) (void)x; +/* #define UNUSED_VAR(x) x=x; */ + +#endif diff --git a/core/cd_hw/libchdr/deps/lzma/DOC/lzma-history.txt b/core/cd_hw/libchdr/deps/lzma/DOC/lzma-history.txt new file mode 100644 index 0000000..cce5806 --- /dev/null +++ b/core/cd_hw/libchdr/deps/lzma/DOC/lzma-history.txt @@ -0,0 +1,363 @@ +HISTORY of the LZMA SDK +----------------------- + +16.04 2016-10-04 +------------------------- +- The bug was fixed in DllSecur.c. + + +16.03 2016-09-28 +------------------------- +- SFX modules now use some protection against DLL preloading attack. +- Some bugs in 7z code were fixed. + + +16.02 2016-05-21 +------------------------- +- The BUG in 16.00 - 16.01 was fixed: + Split Handler (SplitHandler.cpp) returned incorrect + total size value (kpidSize) for split archives. + + +16.01 2016-05-19 +------------------------- +- Some internal changes to reduce the number of compiler warnings. + + +16.00 2016-05-10 +------------------------- +- Some bugs were fixed. + + +15.12 2015-11-19 +------------------------- +- The BUG in C version of 7z decoder was fixed: + 7zDec.c : SzDecodeLzma2() + 7z decoder could mistakenly report about decoding error for some 7z archives + that use LZMA2 compression method. + The probability to get that mistaken decoding error report was about + one error per 16384 solid blocks for solid blocks larger than 16 KB (compressed size). +- The BUG (in 9.26-15.11) in C version of 7z decoder was fixed: + 7zArcIn.c : SzReadHeader2() + 7z decoder worked incorrectly for 7z archives that contain + empty solid blocks, that can be placed to 7z archive, if some file is + unavailable for reading during archive creation. + + +15.09 beta 2015-10-16 +------------------------- +- The BUG in LZMA / LZMA2 encoding code was fixed. + The BUG in LzFind.c::MatchFinder_ReadBlock() function. + If input data size is larger than (4 GiB - dictionary_size), + the following code worked incorrectly: + - LZMA : LzmaEnc_MemEncode(), LzmaEncode() : LZMA encoding functions + for compressing from memory to memory. + That BUG is not related to LZMA encoder version that works via streams. + - LZMA2 : multi-threaded version of LZMA2 encoder worked incorrectly, if + default value of chunk size (CLzma2EncProps::blockSize) is changed + to value larger than (4 GiB - dictionary_size). + + +9.38 beta 2015-01-03 +------------------------- +- The BUG in 9.31-9.37 was fixed: + IArchiveGetRawProps interface was disabled for 7z archives. +- The BUG in 9.26-9.36 was fixed: + Some code in CPP\7zip\Archive\7z\ worked correctly only under Windows. + + +9.36 beta 2014-12-26 +------------------------- +- The BUG in command line version was fixed: + 7-Zip created temporary archive in current folder during update archive + operation, if -w{Path} switch was not specified. + The fixed 7-Zip creates temporary archive in folder that contains updated archive. +- The BUG in 9.33-9.35 was fixed: + 7-Zip silently ignored file reading errors during 7z or gz archive creation, + and the created archive contained only part of file that was read before error. + The fixed 7-Zip stops archive creation and it reports about error. + + +9.35 beta 2014-12-07 +------------------------- +- 7zr.exe now support AES encryption. +- SFX mudules were added to LZMA SDK +- Some bugs were fixed. + + +9.21 beta 2011-04-11 +------------------------- +- New class FString for file names at file systems. +- Speed optimization in CRC code for big-endian CPUs. +- The BUG in Lzma2Dec.c was fixed: + Lzma2Decode function didn't work. + + +9.18 beta 2010-11-02 +------------------------- +- New small SFX module for installers (SfxSetup). + + +9.12 beta 2010-03-24 +------------------------- +- The BUG in LZMA SDK 9.* was fixed: LZMA2 codec didn't work, + if more than 10 threads were used (or more than 20 threads in some modes). + + +9.11 beta 2010-03-15 +------------------------- +- PPMd compression method support + + +9.09 2009-12-12 +------------------------- +- The bug was fixed: + Utf16_To_Utf8 funstions in UTFConvert.cpp and 7zMain.c + incorrectly converted surrogate characters (the code >= 0x10000) to UTF-8. +- Some bugs were fixed + + +9.06 2009-08-17 +------------------------- +- Some changes in ANSI-C 7z Decoder interfaces. + + +9.04 2009-05-30 +------------------------- +- LZMA2 compression method support +- xz format support + + +4.65 2009-02-03 +------------------------- +- Some minor fixes + + +4.63 2008-12-31 +------------------------- +- Some minor fixes + + +4.61 beta 2008-11-23 +------------------------- +- The bug in ANSI-C LZMA Decoder was fixed: + If encoded stream was corrupted, decoder could access memory + outside of allocated range. +- Some changes in ANSI-C 7z Decoder interfaces. +- LZMA SDK is placed in the public domain. + + +4.60 beta 2008-08-19 +------------------------- +- Some minor fixes. + + +4.59 beta 2008-08-13 +------------------------- +- The bug was fixed: + LZMA Encoder in fast compression mode could access memory outside of + allocated range in some rare cases. + + +4.58 beta 2008-05-05 +------------------------- +- ANSI-C LZMA Decoder was rewritten for speed optimizations. +- ANSI-C LZMA Encoder was included to LZMA SDK. +- C++ LZMA code now is just wrapper over ANSI-C code. + + +4.57 2007-12-12 +------------------------- +- Speed optimizations in Ņ++ LZMA Decoder. +- Small changes for more compatibility with some C/C++ compilers. + + +4.49 beta 2007-07-05 +------------------------- +- .7z ANSI-C Decoder: + - now it supports BCJ and BCJ2 filters + - now it supports files larger than 4 GB. + - now it supports "Last Write Time" field for files. +- C++ code for .7z archives compressing/decompressing from 7-zip + was included to LZMA SDK. + + +4.43 2006-06-04 +------------------------- +- Small changes for more compatibility with some C/C++ compilers. + + +4.42 2006-05-15 +------------------------- +- Small changes in .h files in ANSI-C version. + + +4.39 beta 2006-04-14 +------------------------- +- The bug in versions 4.33b:4.38b was fixed: + C++ version of LZMA encoder could not correctly compress + files larger than 2 GB with HC4 match finder (-mfhc4). + + +4.37 beta 2005-04-06 +------------------------- +- Fixes in C++ code: code could no be compiled if _NO_EXCEPTIONS was defined. + + +4.35 beta 2005-03-02 +------------------------- +- The bug was fixed in C++ version of LZMA Decoder: + If encoded stream was corrupted, decoder could access memory + outside of allocated range. + + +4.34 beta 2006-02-27 +------------------------- +- Compressing speed and memory requirements for compressing were increased +- LZMA now can use only these match finders: HC4, BT2, BT3, BT4 + + +4.32 2005-12-09 +------------------------- +- Java version of LZMA SDK was included + + +4.30 2005-11-20 +------------------------- +- Compression ratio was improved in -a2 mode +- Speed optimizations for compressing in -a2 mode +- -fb switch now supports values up to 273 +- The bug in 7z_C (7zIn.c) was fixed: + It used Alloc/Free functions from different memory pools. + So if program used two memory pools, it worked incorrectly. +- 7z_C: .7z format supporting was improved +- LZMA# SDK (C#.NET version) was included + + +4.27 (Updated) 2005-09-21 +------------------------- +- Some GUIDs/interfaces in C++ were changed. + IStream.h: + ISequentialInStream::Read now works as old ReadPart + ISequentialOutStream::Write now works as old WritePart + + +4.27 2005-08-07 +------------------------- +- The bug in LzmaDecodeSize.c was fixed: + if _LZMA_IN_CB and _LZMA_OUT_READ were defined, + decompressing worked incorrectly. + + +4.26 2005-08-05 +------------------------- +- Fixes in 7z_C code and LzmaTest.c: + previous versions could work incorrectly, + if malloc(0) returns 0 + + +4.23 2005-06-29 +------------------------- +- Small fixes in C++ code + + +4.22 2005-06-10 +------------------------- +- Small fixes + + +4.21 2005-06-08 +------------------------- +- Interfaces for ANSI-C LZMA Decoder (LzmaDecode.c) were changed +- New additional version of ANSI-C LZMA Decoder with zlib-like interface: + - LzmaStateDecode.h + - LzmaStateDecode.c + - LzmaStateTest.c +- ANSI-C LZMA Decoder now can decompress files larger than 4 GB + + +4.17 2005-04-18 +------------------------- +- New example for RAM->RAM compressing/decompressing: + LZMA + BCJ (filter for x86 code): + - LzmaRam.h + - LzmaRam.cpp + - LzmaRamDecode.h + - LzmaRamDecode.c + - -f86 switch for lzma.exe + + +4.16 2005-03-29 +------------------------- +- The bug was fixed in LzmaDecode.c (ANSI-C LZMA Decoder): + If _LZMA_OUT_READ was defined, and if encoded stream was corrupted, + decoder could access memory outside of allocated range. +- Speed optimization of ANSI-C LZMA Decoder (now it's about 20% faster). + Old version of LZMA Decoder now is in file LzmaDecodeSize.c. + LzmaDecodeSize.c can provide slightly smaller code than LzmaDecode.c +- Small speed optimization in LZMA C++ code +- filter for SPARC's code was added +- Simplified version of .7z ANSI-C Decoder was included + + +4.06 2004-09-05 +------------------------- +- The bug in v4.05 was fixed: + LZMA-Encoder didn't release output stream in some cases. + + +4.05 2004-08-25 +------------------------- +- Source code of filters for x86, IA-64, ARM, ARM-Thumb + and PowerPC code was included to SDK +- Some internal minor changes + + +4.04 2004-07-28 +------------------------- +- More compatibility with some C++ compilers + + +4.03 2004-06-18 +------------------------- +- "Benchmark" command was added. It measures compressing + and decompressing speed and shows rating values. + Also it checks hardware errors. + + +4.02 2004-06-10 +------------------------- +- C++ LZMA Encoder/Decoder code now is more portable + and it can be compiled by GCC on Linux. + + +4.01 2004-02-15 +------------------------- +- Some detection of data corruption was enabled. + LzmaDecode.c / RangeDecoderReadByte + ..... + { + rd->ExtraBytes = 1; + return 0xFF; + } + + +4.00 2004-02-13 +------------------------- +- Original version of LZMA SDK + + + +HISTORY of the LZMA +------------------- + 2001-2008: Improvements to LZMA compressing/decompressing code, + keeping compatibility with original LZMA format + 1996-2001: Development of LZMA compression format + + Some milestones: + + 2001-08-30: LZMA compression was added to 7-Zip + 1999-01-02: First version of 7-Zip was released + + +End of document diff --git a/core/cd_hw/libchdr/deps/lzma/DOC/lzma-sdk.txt b/core/cd_hw/libchdr/deps/lzma/DOC/lzma-sdk.txt new file mode 100644 index 0000000..b8fce26 --- /dev/null +++ b/core/cd_hw/libchdr/deps/lzma/DOC/lzma-sdk.txt @@ -0,0 +1,357 @@ +LZMA SDK 16.04 +-------------- + +LZMA SDK provides the documentation, samples, header files, +libraries, and tools you need to develop applications that +use 7z / LZMA / LZMA2 / XZ compression. + +LZMA is an improved version of famous LZ77 compression algorithm. +It was improved in way of maximum increasing of compression ratio, +keeping high decompression speed and low memory requirements for +decompressing. + +LZMA2 is a LZMA based compression method. LZMA2 provides better +multithreading support for compression than LZMA and some other improvements. + +7z is a file format for data compression and file archiving. +7z is a main file format for 7-Zip compression program (www.7-zip.org). +7z format supports different compression methods: LZMA, LZMA2 and others. +7z also supports AES-256 based encryption. + +XZ is a file format for data compression that uses LZMA2 compression. +XZ format provides additional features: SHA/CRC check, filters for +improved compression ratio, splitting to blocks and streams, + + + +LICENSE +------- + +LZMA SDK is written and placed in the public domain by Igor Pavlov. + +Some code in LZMA SDK is based on public domain code from another developers: + 1) PPMd var.H (2001): Dmitry Shkarin + 2) SHA-256: Wei Dai (Crypto++ library) + +Anyone is free to copy, modify, publish, use, compile, sell, or distribute the +original LZMA SDK code, either in source code form or as a compiled binary, for +any purpose, commercial or non-commercial, and by any means. + +LZMA SDK code is compatible with open source licenses, for example, you can +include it to GNU GPL or GNU LGPL code. + + +LZMA SDK Contents +----------------- + + Source code: + + - C / C++ / C# / Java - LZMA compression and decompression + - C / C++ - LZMA2 compression and decompression + - C / C++ - XZ compression and decompression + - C - 7z decompression + - C++ - 7z compression and decompression + - C - small SFXs for installers (7z decompression) + - C++ - SFXs and SFXs for installers (7z decompression) + + Precomiled binaries: + + - console programs for lzma / 7z / xz compression and decompression + - SFX modules for installers. + + +UNIX/Linux version +------------------ +To compile C++ version of file->file LZMA encoding, go to directory +CPP/7zip/Bundles/LzmaCon +and call make to recompile it: + make -f makefile.gcc clean all + +In some UNIX/Linux versions you must compile LZMA with static libraries. +To compile with static libraries, you can use +LIB = -lm -static + +Also you can use p7zip (port of 7-Zip for POSIX systems like Unix or Linux): + + http://p7zip.sourceforge.net/ + + +Files +----- + +DOC/7zC.txt - 7z ANSI-C Decoder description +DOC/7zFormat.txt - 7z Format description +DOC/installer.txt - information about 7-Zip for installers +DOC/lzma.txt - LZMA compression description +DOC/lzma-sdk.txt - LZMA SDK description (this file) +DOC/lzma-history.txt - history of LZMA SDK +DOC/lzma-specification.txt - Specification of LZMA +DOC/Methods.txt - Compression method IDs for .7z + +bin/installer/ - example script to create installer that uses SFX module, + +bin/7zdec.exe - simplified 7z archive decoder +bin/7zr.exe - 7-Zip console program (reduced version) +bin/x64/7zr.exe - 7-Zip console program (reduced version) (x64 version) +bin/lzma.exe - file->file LZMA encoder/decoder for Windows +bin/7zS2.sfx - small SFX module for installers (GUI version) +bin/7zS2con.sfx - small SFX module for installers (Console version) +bin/7zSD.sfx - SFX module for installers. + + +7zDec.exe +--------- +7zDec.exe is simplified 7z archive decoder. +It supports only LZMA, LZMA2, and PPMd methods. +7zDec decodes whole solid block from 7z archive to RAM. +The RAM consumption can be high. + + + + +Source code structure +--------------------- + + +Asm/ - asm files (optimized code for CRC calculation and Intel-AES encryption) + +C/ - C files (compression / decompression and other) + Util/ + 7z - 7z decoder program (decoding 7z files) + Lzma - LZMA program (file->file LZMA encoder/decoder). + LzmaLib - LZMA library (.DLL for Windows) + SfxSetup - small SFX module for installers + +CPP/ -- CPP files + + Common - common files for C++ projects + Windows - common files for Windows related code + + 7zip - files related to 7-Zip + + Archive - files related to archiving + + Common - common files for archive handling + 7z - 7z C++ Encoder/Decoder + + Bundles - Modules that are bundles of other modules (files) + + Alone7z - 7zr.exe: Standalone 7-Zip console program (reduced version) + Format7zExtractR - 7zxr.dll: Reduced version of 7z DLL: extracting from 7z/LZMA/BCJ/BCJ2. + Format7zR - 7zr.dll: Reduced version of 7z DLL: extracting/compressing to 7z/LZMA/BCJ/BCJ2 + LzmaCon - lzma.exe: LZMA compression/decompression + LzmaSpec - example code for LZMA Specification + SFXCon - 7zCon.sfx: Console 7z SFX module + SFXSetup - 7zS.sfx: 7z SFX module for installers + SFXWin - 7z.sfx: GUI 7z SFX module + + Common - common files for 7-Zip + + Compress - files for compression/decompression + + Crypto - files for encryption / decompression + + UI - User Interface files + + Client7z - Test application for 7za.dll, 7zr.dll, 7zxr.dll + Common - Common UI files + Console - Code for console program (7z.exe) + Explorer - Some code from 7-Zip Shell extension + FileManager - Some GUI code from 7-Zip File Manager + GUI - Some GUI code from 7-Zip + + +CS/ - C# files + 7zip + Common - some common files for 7-Zip + Compress - files related to compression/decompression + LZ - files related to LZ (Lempel-Ziv) compression algorithm + LZMA - LZMA compression/decompression + LzmaAlone - file->file LZMA compression/decompression + RangeCoder - Range Coder (special code of compression/decompression) + +Java/ - Java files + SevenZip + Compression - files related to compression/decompression + LZ - files related to LZ (Lempel-Ziv) compression algorithm + LZMA - LZMA compression/decompression + RangeCoder - Range Coder (special code of compression/decompression) + + +Note: + Asm / C / C++ source code of LZMA SDK is part of 7-Zip's source code. + 7-Zip's source code can be downloaded from 7-Zip's SourceForge page: + + http://sourceforge.net/projects/sevenzip/ + + + +LZMA features +------------- + - Variable dictionary size (up to 1 GB) + - Estimated compressing speed: about 2 MB/s on 2 GHz CPU + - Estimated decompressing speed: + - 20-30 MB/s on modern 2 GHz cpu + - 1-2 MB/s on 200 MHz simple RISC cpu: (ARM, MIPS, PowerPC) + - Small memory requirements for decompressing (16 KB + DictionarySize) + - Small code size for decompressing: 5-8 KB + +LZMA decoder uses only integer operations and can be +implemented in any modern 32-bit CPU (or on 16-bit CPU with some conditions). + +Some critical operations that affect the speed of LZMA decompression: + 1) 32*16 bit integer multiply + 2) Mispredicted branches (penalty mostly depends from pipeline length) + 3) 32-bit shift and arithmetic operations + +The speed of LZMA decompressing mostly depends from CPU speed. +Memory speed has no big meaning. But if your CPU has small data cache, +overall weight of memory speed will slightly increase. + + +How To Use +---------- + +Using LZMA encoder/decoder executable +-------------------------------------- + +Usage: LZMA inputFile outputFile [...] + + e: encode file + + d: decode file + + b: Benchmark. There are two tests: compressing and decompressing + with LZMA method. Benchmark shows rating in MIPS (million + instructions per second). Rating value is calculated from + measured speed and it is normalized with Intel's Core 2 results. + Also Benchmark checks possible hardware errors (RAM + errors in most cases). Benchmark uses these settings: + (-a1, -d21, -fb32, -mfbt4). You can change only -d parameter. + Also you can change the number of iterations. Example for 30 iterations: + LZMA b 30 + Default number of iterations is 10. + + + + + -a{N}: set compression mode 0 = fast, 1 = normal + default: 1 (normal) + + d{N}: Sets Dictionary size - [0, 30], default: 23 (8MB) + The maximum value for dictionary size is 1 GB = 2^30 bytes. + Dictionary size is calculated as DictionarySize = 2^N bytes. + For decompressing file compressed by LZMA method with dictionary + size D = 2^N you need about D bytes of memory (RAM). + + -fb{N}: set number of fast bytes - [5, 273], default: 128 + Usually big number gives a little bit better compression ratio + and slower compression process. + + -lc{N}: set number of literal context bits - [0, 8], default: 3 + Sometimes lc=4 gives gain for big files. + + -lp{N}: set number of literal pos bits - [0, 4], default: 0 + lp switch is intended for periodical data when period is + equal 2^N. For example, for 32-bit (4 bytes) + periodical data you can use lp=2. Often it's better to set lc0, + if you change lp switch. + + -pb{N}: set number of pos bits - [0, 4], default: 2 + pb switch is intended for periodical data + when period is equal 2^N. + + -mf{MF_ID}: set Match Finder. Default: bt4. + Algorithms from hc* group doesn't provide good compression + ratio, but they often works pretty fast in combination with + fast mode (-a0). + + Memory requirements depend from dictionary size + (parameter "d" in table below). + + MF_ID Memory Description + + bt2 d * 9.5 + 4MB Binary Tree with 2 bytes hashing. + bt3 d * 11.5 + 4MB Binary Tree with 3 bytes hashing. + bt4 d * 11.5 + 4MB Binary Tree with 4 bytes hashing. + hc4 d * 7.5 + 4MB Hash Chain with 4 bytes hashing. + + -eos: write End Of Stream marker. By default LZMA doesn't write + eos marker, since LZMA decoder knows uncompressed size + stored in .lzma file header. + + -si: Read data from stdin (it will write End Of Stream marker). + -so: Write data to stdout + + +Examples: + +1) LZMA e file.bin file.lzma -d16 -lc0 + +compresses file.bin to file.lzma with 64 KB dictionary (2^16=64K) +and 0 literal context bits. -lc0 allows to reduce memory requirements +for decompression. + + +2) LZMA e file.bin file.lzma -lc0 -lp2 + +compresses file.bin to file.lzma with settings suitable +for 32-bit periodical data (for example, ARM or MIPS code). + +3) LZMA d file.lzma file.bin + +decompresses file.lzma to file.bin. + + +Compression ratio hints +----------------------- + +Recommendations +--------------- + +To increase the compression ratio for LZMA compressing it's desirable +to have aligned data (if it's possible) and also it's desirable to locate +data in such order, where code is grouped in one place and data is +grouped in other place (it's better than such mixing: code, data, code, +data, ...). + + +Filters +------- +You can increase the compression ratio for some data types, using +special filters before compressing. For example, it's possible to +increase the compression ratio on 5-10% for code for those CPU ISAs: +x86, IA-64, ARM, ARM-Thumb, PowerPC, SPARC. + +You can find C source code of such filters in C/Bra*.* files + +You can check the compression ratio gain of these filters with such +7-Zip commands (example for ARM code): +No filter: + 7z a a1.7z a.bin -m0=lzma + +With filter for little-endian ARM code: + 7z a a2.7z a.bin -m0=arm -m1=lzma + +It works in such manner: +Compressing = Filter_encoding + LZMA_encoding +Decompressing = LZMA_decoding + Filter_decoding + +Compressing and decompressing speed of such filters is very high, +so it will not increase decompressing time too much. +Moreover, it reduces decompression time for LZMA_decoding, +since compression ratio with filtering is higher. + +These filters convert CALL (calling procedure) instructions +from relative offsets to absolute addresses, so such data becomes more +compressible. + +For some ISAs (for example, for MIPS) it's impossible to get gain from such filter. + + + +--- + +http://www.7-zip.org +http://www.7-zip.org/sdk.html +http://www.7-zip.org/support.html diff --git a/core/cd_hw/libchdr/deps/lzma/DOC/lzma-specification.txt b/core/cd_hw/libchdr/deps/lzma/DOC/lzma-specification.txt new file mode 100644 index 0000000..ac0cce7 --- /dev/null +++ b/core/cd_hw/libchdr/deps/lzma/DOC/lzma-specification.txt @@ -0,0 +1,1176 @@ +LZMA specification (DRAFT version) +---------------------------------- + +Author: Igor Pavlov +Date: 2015-06-14 + +This specification defines the format of LZMA compressed data and lzma file format. + +Notation +-------- + +We use the syntax of C++ programming language. +We use the following types in C++ code: + unsigned - unsigned integer, at least 16 bits in size + int - signed integer, at least 16 bits in size + UInt64 - 64-bit unsigned integer + UInt32 - 32-bit unsigned integer + UInt16 - 16-bit unsigned integer + Byte - 8-bit unsigned integer + bool - boolean type with two possible values: false, true + + +lzma file format +================ + +The lzma file contains the raw LZMA stream and the header with related properties. + +The files in that format use ".lzma" extension. + +The lzma file format layout: + +Offset Size Description + + 0 1 LZMA model properties (lc, lp, pb) in encoded form + 1 4 Dictionary size (32-bit unsigned integer, little-endian) + 5 8 Uncompressed size (64-bit unsigned integer, little-endian) + 13 Compressed data (LZMA stream) + +LZMA properties: + + name Range Description + + lc [0, 8] the number of "literal context" bits + lp [0, 4] the number of "literal pos" bits + pb [0, 4] the number of "pos" bits +dictSize [0, 2^32 - 1] the dictionary size + +The following code encodes LZMA properties: + +void EncodeProperties(Byte *properties) +{ + properties[0] = (Byte)((pb * 5 + lp) * 9 + lc); + Set_UInt32_LittleEndian(properties + 1, dictSize); +} + +If the value of dictionary size in properties is smaller than (1 << 12), +the LZMA decoder must set the dictionary size variable to (1 << 12). + +#define LZMA_DIC_MIN (1 << 12) + + unsigned lc, pb, lp; + UInt32 dictSize; + UInt32 dictSizeInProperties; + + void DecodeProperties(const Byte *properties) + { + unsigned d = properties[0]; + if (d >= (9 * 5 * 5)) + throw "Incorrect LZMA properties"; + lc = d % 9; + d /= 9; + pb = d / 5; + lp = d % 5; + dictSizeInProperties = 0; + for (int i = 0; i < 4; i++) + dictSizeInProperties |= (UInt32)properties[i + 1] << (8 * i); + dictSize = dictSizeInProperties; + if (dictSize < LZMA_DIC_MIN) + dictSize = LZMA_DIC_MIN; + } + +If "Uncompressed size" field contains ones in all 64 bits, it means that +uncompressed size is unknown and there is the "end marker" in stream, +that indicates the end of decoding point. +In opposite case, if the value from "Uncompressed size" field is not +equal to ((2^64) - 1), the LZMA stream decoding must be finished after +specified number of bytes (Uncompressed size) is decoded. And if there +is the "end marker", the LZMA decoder must read that marker also. + + +The new scheme to encode LZMA properties +---------------------------------------- + +If LZMA compression is used for some another format, it's recommended to +use a new improved scheme to encode LZMA properties. That new scheme was +used in xz format that uses the LZMA2 compression algorithm. +The LZMA2 is a new compression algorithm that is based on the LZMA algorithm. + +The dictionary size in LZMA2 is encoded with just one byte and LZMA2 supports +only reduced set of dictionary sizes: + (2 << 11), (3 << 11), + (2 << 12), (3 << 12), + ... + (2 << 30), (3 << 30), + (2 << 31) - 1 + +The dictionary size can be extracted from encoded value with the following code: + + dictSize = (p == 40) ? 0xFFFFFFFF : (((UInt32)2 | ((p) & 1)) << ((p) / 2 + 11)); + +Also there is additional limitation (lc + lp <= 4) in LZMA2 for values of +"lc" and "lp" properties: + + if (lc + lp > 4) + throw "Unsupported properties: (lc + lp) > 4"; + +There are some advantages for LZMA decoder with such (lc + lp) value +limitation. It reduces the maximum size of tables allocated by decoder. +And it reduces the complexity of initialization procedure, that can be +important to keep high speed of decoding of big number of small LZMA streams. + +It's recommended to use that limitation (lc + lp <= 4) for any new format +that uses LZMA compression. Note that the combinations of "lc" and "lp" +parameters, where (lc + lp > 4), can provide significant improvement in +compression ratio only in some rare cases. + +The LZMA properties can be encoded into two bytes in new scheme: + +Offset Size Description + + 0 1 The dictionary size encoded with LZMA2 scheme + 1 1 LZMA model properties (lc, lp, pb) in encoded form + + +The RAM usage +============= + +The RAM usage for LZMA decoder is determined by the following parts: + +1) The Sliding Window (from 4 KiB to 4 GiB). +2) The probability model counter arrays (arrays of 16-bit variables). +3) Some additional state variables (about 10 variables of 32-bit integers). + + +The RAM usage for Sliding Window +-------------------------------- + +There are two main scenarios of decoding: + +1) The decoding of full stream to one RAM buffer. + + If we decode full LZMA stream to one output buffer in RAM, the decoder + can use that output buffer as sliding window. So the decoder doesn't + need additional buffer allocated for sliding window. + +2) The decoding to some external storage. + + If we decode LZMA stream to external storage, the decoder must allocate + the buffer for sliding window. The size of that buffer must be equal + or larger than the value of dictionary size from properties of LZMA stream. + +In this specification we describe the code for decoding to some external +storage. The optimized version of code for decoding of full stream to one +output RAM buffer can require some minor changes in code. + + +The RAM usage for the probability model counters +------------------------------------------------ + +The size of the probability model counter arrays is calculated with the +following formula: + +size_of_prob_arrays = 1846 + 768 * (1 << (lp + lc)) + +Each probability model counter is 11-bit unsigned integer. +If we use 16-bit integer variables (2-byte integers) for these probability +model counters, the RAM usage required by probability model counter arrays +can be estimated with the following formula: + + RAM = 4 KiB + 1.5 KiB * (1 << (lp + lc)) + +For example, for default LZMA parameters (lp = 0 and lc = 3), the RAM usage is + + RAM_lc3_lp0 = 4 KiB + 1.5 KiB * 8 = 16 KiB + +The maximum RAM state usage is required for decoding the stream with lp = 4 +and lc = 8: + + RAM_lc8_lp4 = 4 KiB + 1.5 KiB * 4096 = 6148 KiB + +If the decoder uses LZMA2's limited property condition +(lc + lp <= 4), the RAM usage will be not larger than + + RAM_lc_lp_4 = 4 KiB + 1.5 KiB * 16 = 28 KiB + + +The RAM usage for encoder +------------------------- + +There are many variants for LZMA encoding code. +These variants have different values for memory consumption. +Note that memory consumption for LZMA Encoder can not be +smaller than memory consumption of LZMA Decoder for same stream. + +The RAM usage required by modern effective implementation of +LZMA Encoder can be estimated with the following formula: + + Encoder_RAM_Usage = 4 MiB + 11 * dictionarySize. + +But there are some modes of the encoder that require less memory. + + +LZMA Decoding +============= + +The LZMA compression algorithm uses LZ-based compression with Sliding Window +and Range Encoding as entropy coding method. + + +Sliding Window +-------------- + +LZMA uses Sliding Window compression similar to LZ77 algorithm. + +LZMA stream must be decoded to the sequence that consists +of MATCHES and LITERALS: + + - a LITERAL is a 8-bit character (one byte). + The decoder just puts that LITERAL to the uncompressed stream. + + - a MATCH is a pair of two numbers (DISTANCE-LENGTH pair). + The decoder takes one byte exactly "DISTANCE" characters behind + current position in the uncompressed stream and puts it to + uncompressed stream. The decoder must repeat it "LENGTH" times. + +The "DISTANCE" can not be larger than dictionary size. +And the "DISTANCE" can not be larger than the number of bytes in +the uncompressed stream that were decoded before that match. + +In this specification we use cyclic buffer to implement Sliding Window +for LZMA decoder: + +class COutWindow +{ + Byte *Buf; + UInt32 Pos; + UInt32 Size; + bool IsFull; + +public: + unsigned TotalPos; + COutStream OutStream; + + COutWindow(): Buf(NULL) {} + ~COutWindow() { delete []Buf; } + + void Create(UInt32 dictSize) + { + Buf = new Byte[dictSize]; + Pos = 0; + Size = dictSize; + IsFull = false; + TotalPos = 0; + } + + void PutByte(Byte b) + { + TotalPos++; + Buf[Pos++] = b; + if (Pos == Size) + { + Pos = 0; + IsFull = true; + } + OutStream.WriteByte(b); + } + + Byte GetByte(UInt32 dist) const + { + return Buf[dist <= Pos ? Pos - dist : Size - dist + Pos]; + } + + void CopyMatch(UInt32 dist, unsigned len) + { + for (; len > 0; len--) + PutByte(GetByte(dist)); + } + + bool CheckDistance(UInt32 dist) const + { + return dist <= Pos || IsFull; + } + + bool IsEmpty() const + { + return Pos == 0 && !IsFull; + } +}; + + +In another implementation it's possible to use one buffer that contains +Sliding Window and the whole data stream after uncompressing. + + +Range Decoder +------------- + +LZMA algorithm uses Range Encoding (1) as entropy coding method. + +LZMA stream contains just one very big number in big-endian encoding. +LZMA decoder uses the Range Decoder to extract a sequence of binary +symbols from that big number. + +The state of the Range Decoder: + +struct CRangeDecoder +{ + UInt32 Range; + UInt32 Code; + InputStream *InStream; + + bool Corrupted; +} + +The notes about UInt32 type for the "Range" and "Code" variables: + + It's possible to use 64-bit (unsigned or signed) integer type + for the "Range" and the "Code" variables instead of 32-bit unsigned, + but some additional code must be used to truncate the values to + low 32-bits after some operations. + + If the programming language does not support 32-bit unsigned integer type + (like in case of JAVA language), it's possible to use 32-bit signed integer, + but some code must be changed. For example, it's required to change the code + that uses comparison operations for UInt32 variables in this specification. + +The Range Decoder can be in some states that can be treated as +"Corruption" in LZMA stream. The Range Decoder uses the variable "Corrupted": + + (Corrupted == false), if the Range Decoder has not detected any corruption. + (Corrupted == true), if the Range Decoder has detected some corruption. + +The reference LZMA Decoder ignores the value of the "Corrupted" variable. +So it continues to decode the stream, even if the corruption can be detected +in the Range Decoder. To provide the full compatibility with output of the +reference LZMA Decoder, another LZMA Decoder implementations must also +ignore the value of the "Corrupted" variable. + +The LZMA Encoder is required to create only such LZMA streams, that will not +lead the Range Decoder to states, where the "Corrupted" variable is set to true. + +The Range Decoder reads first 5 bytes from input stream to initialize +the state: + +bool CRangeDecoder::Init() +{ + Corrupted = false; + Range = 0xFFFFFFFF; + Code = 0; + + Byte b = InStream->ReadByte(); + + for (int i = 0; i < 4; i++) + Code = (Code << 8) | InStream->ReadByte(); + + if (b != 0 || Code == Range) + Corrupted = true; + return b == 0; +} + +The LZMA Encoder always writes ZERO in initial byte of compressed stream. +That scheme allows to simplify the code of the Range Encoder in the +LZMA Encoder. If initial byte is not equal to ZERO, the LZMA Decoder must +stop decoding and report error. + +After the last bit of data was decoded by Range Decoder, the value of the +"Code" variable must be equal to 0. The LZMA Decoder must check it by +calling the IsFinishedOK() function: + + bool IsFinishedOK() const { return Code == 0; } + +If there is corruption in data stream, there is big probability that +the "Code" value will be not equal to 0 in the Finish() function. So that +check in the IsFinishedOK() function provides very good feature for +corruption detection. + +The value of the "Range" variable before each bit decoding can not be smaller +than ((UInt32)1 << 24). The Normalize() function keeps the "Range" value in +described range. + +#define kTopValue ((UInt32)1 << 24) + +void CRangeDecoder::Normalize() +{ + if (Range < kTopValue) + { + Range <<= 8; + Code = (Code << 8) | InStream->ReadByte(); + } +} + +Notes: if the size of the "Code" variable is larger than 32 bits, it's +required to keep only low 32 bits of the "Code" variable after the change +in Normalize() function. + +If the LZMA Stream is not corrupted, the value of the "Code" variable is +always smaller than value of the "Range" variable. +But the Range Decoder ignores some types of corruptions, so the value of +the "Code" variable can be equal or larger than value of the "Range" variable +for some "Corrupted" archives. + + +LZMA uses Range Encoding only with binary symbols of two types: + 1) binary symbols with fixed and equal probabilities (direct bits) + 2) binary symbols with predicted probabilities + +The DecodeDirectBits() function decodes the sequence of direct bits: + +UInt32 CRangeDecoder::DecodeDirectBits(unsigned numBits) +{ + UInt32 res = 0; + do + { + Range >>= 1; + Code -= Range; + UInt32 t = 0 - ((UInt32)Code >> 31); + Code += Range & t; + + if (Code == Range) + Corrupted = true; + + Normalize(); + res <<= 1; + res += t + 1; + } + while (--numBits); + return res; +} + + +The Bit Decoding with Probability Model +--------------------------------------- + +The task of Bit Probability Model is to estimate probabilities of binary +symbols. And then it provides the Range Decoder with that information. +The better prediction provides better compression ratio. +The Bit Probability Model uses statistical data of previous decoded +symbols. + +That estimated probability is presented as 11-bit unsigned integer value +that represents the probability of symbol "0". + +#define kNumBitModelTotalBits 11 + +Mathematical probabilities can be presented with the following formulas: + probability(symbol_0) = prob / 2048. + probability(symbol_1) = 1 - Probability(symbol_0) = + = 1 - prob / 2048 = + = (2048 - prob) / 2048 +where the "prob" variable contains 11-bit integer probability counter. + +It's recommended to use 16-bit unsigned integer type, to store these 11-bit +probability values: + +typedef UInt16 CProb; + +Each probability value must be initialized with value ((1 << 11) / 2), +that represents the state, where probabilities of symbols 0 and 1 +are equal to 0.5: + +#define PROB_INIT_VAL ((1 << kNumBitModelTotalBits) / 2) + +The INIT_PROBS macro is used to initialize the array of CProb variables: + +#define INIT_PROBS(p) \ + { for (unsigned i = 0; i < sizeof(p) / sizeof(p[0]); i++) p[i] = PROB_INIT_VAL; } + + +The DecodeBit() function decodes one bit. +The LZMA decoder provides the pointer to CProb variable that contains +information about estimated probability for symbol 0 and the Range Decoder +updates that CProb variable after decoding. The Range Decoder increases +estimated probability of the symbol that was decoded: + +#define kNumMoveBits 5 + +unsigned CRangeDecoder::DecodeBit(CProb *prob) +{ + unsigned v = *prob; + UInt32 bound = (Range >> kNumBitModelTotalBits) * v; + unsigned symbol; + if (Code < bound) + { + v += ((1 << kNumBitModelTotalBits) - v) >> kNumMoveBits; + Range = bound; + symbol = 0; + } + else + { + v -= v >> kNumMoveBits; + Code -= bound; + Range -= bound; + symbol = 1; + } + *prob = (CProb)v; + Normalize(); + return symbol; +} + + +The Binary Tree of bit model counters +------------------------------------- + +LZMA uses a tree of Bit model variables to decode symbol that needs +several bits for storing. There are two versions of such trees in LZMA: + 1) the tree that decodes bits from high bit to low bit (the normal scheme). + 2) the tree that decodes bits from low bit to high bit (the reverse scheme). + +Each binary tree structure supports different size of decoded symbol +(the size of binary sequence that contains value of symbol). +If that size of decoded symbol is "NumBits" bits, the tree structure +uses the array of (2 << NumBits) counters of CProb type. +But only ((2 << NumBits) - 1) items are used by encoder and decoder. +The first item (the item with index equal to 0) in array is unused. +That scheme with unused array's item allows to simplify the code. + +unsigned BitTreeReverseDecode(CProb *probs, unsigned numBits, CRangeDecoder *rc) +{ + unsigned m = 1; + unsigned symbol = 0; + for (unsigned i = 0; i < numBits; i++) + { + unsigned bit = rc->DecodeBit(&probs[m]); + m <<= 1; + m += bit; + symbol |= (bit << i); + } + return symbol; +} + +template +class CBitTreeDecoder +{ + CProb Probs[(unsigned)1 << NumBits]; + +public: + + void Init() + { + INIT_PROBS(Probs); + } + + unsigned Decode(CRangeDecoder *rc) + { + unsigned m = 1; + for (unsigned i = 0; i < NumBits; i++) + m = (m << 1) + rc->DecodeBit(&Probs[m]); + return m - ((unsigned)1 << NumBits); + } + + unsigned ReverseDecode(CRangeDecoder *rc) + { + return BitTreeReverseDecode(Probs, NumBits, rc); + } +}; + + +LZ part of LZMA +--------------- + +LZ part of LZMA describes details about the decoding of MATCHES and LITERALS. + + +The Literal Decoding +-------------------- + +The LZMA Decoder uses (1 << (lc + lp)) tables with CProb values, where +each table contains 0x300 CProb values: + + CProb *LitProbs; + + void CreateLiterals() + { + LitProbs = new CProb[(UInt32)0x300 << (lc + lp)]; + } + + void InitLiterals() + { + UInt32 num = (UInt32)0x300 << (lc + lp); + for (UInt32 i = 0; i < num; i++) + LitProbs[i] = PROB_INIT_VAL; + } + +To select the table for decoding it uses the context that consists of +(lc) high bits from previous literal and (lp) low bits from value that +represents current position in outputStream. + +If (State > 7), the Literal Decoder also uses "matchByte" that represents +the byte in OutputStream at position the is the DISTANCE bytes before +current position, where the DISTANCE is the distance in DISTANCE-LENGTH pair +of latest decoded match. + +The following code decodes one literal and puts it to Sliding Window buffer: + + void DecodeLiteral(unsigned state, UInt32 rep0) + { + unsigned prevByte = 0; + if (!OutWindow.IsEmpty()) + prevByte = OutWindow.GetByte(1); + + unsigned symbol = 1; + unsigned litState = ((OutWindow.TotalPos & ((1 << lp) - 1)) << lc) + (prevByte >> (8 - lc)); + CProb *probs = &LitProbs[(UInt32)0x300 * litState]; + + if (state >= 7) + { + unsigned matchByte = OutWindow.GetByte(rep0 + 1); + do + { + unsigned matchBit = (matchByte >> 7) & 1; + matchByte <<= 1; + unsigned bit = RangeDec.DecodeBit(&probs[((1 + matchBit) << 8) + symbol]); + symbol = (symbol << 1) | bit; + if (matchBit != bit) + break; + } + while (symbol < 0x100); + } + while (symbol < 0x100) + symbol = (symbol << 1) | RangeDec.DecodeBit(&probs[symbol]); + OutWindow.PutByte((Byte)(symbol - 0x100)); + } + + +The match length decoding +------------------------- + +The match length decoder returns normalized (zero-based value) +length of match. That value can be converted to real length of the match +with the following code: + +#define kMatchMinLen 2 + + matchLen = len + kMatchMinLen; + +The match length decoder can return the values from 0 to 271. +And the corresponded real match length values can be in the range +from 2 to 273. + +The following scheme is used for the match length encoding: + + Binary encoding Binary Tree structure Zero-based match length + sequence (binary + decimal): + + 0 xxx LowCoder[posState] xxx + 1 0 yyy MidCoder[posState] yyy + 8 + 1 1 zzzzzzzz HighCoder zzzzzzzz + 16 + +LZMA uses bit model variable "Choice" to decode the first selection bit. + +If the first selection bit is equal to 0, the decoder uses binary tree + LowCoder[posState] to decode 3-bit zero-based match length (xxx). + +If the first selection bit is equal to 1, the decoder uses bit model + variable "Choice2" to decode the second selection bit. + + If the second selection bit is equal to 0, the decoder uses binary tree + MidCoder[posState] to decode 3-bit "yyy" value, and zero-based match + length is equal to (yyy + 8). + + If the second selection bit is equal to 1, the decoder uses binary tree + HighCoder to decode 8-bit "zzzzzzzz" value, and zero-based + match length is equal to (zzzzzzzz + 16). + +LZMA uses "posState" value as context to select the binary tree +from LowCoder and MidCoder binary tree arrays: + + unsigned posState = OutWindow.TotalPos & ((1 << pb) - 1); + +The full code of the length decoder: + +class CLenDecoder +{ + CProb Choice; + CProb Choice2; + CBitTreeDecoder<3> LowCoder[1 << kNumPosBitsMax]; + CBitTreeDecoder<3> MidCoder[1 << kNumPosBitsMax]; + CBitTreeDecoder<8> HighCoder; + +public: + + void Init() + { + Choice = PROB_INIT_VAL; + Choice2 = PROB_INIT_VAL; + HighCoder.Init(); + for (unsigned i = 0; i < (1 << kNumPosBitsMax); i++) + { + LowCoder[i].Init(); + MidCoder[i].Init(); + } + } + + unsigned Decode(CRangeDecoder *rc, unsigned posState) + { + if (rc->DecodeBit(&Choice) == 0) + return LowCoder[posState].Decode(rc); + if (rc->DecodeBit(&Choice2) == 0) + return 8 + MidCoder[posState].Decode(rc); + return 16 + HighCoder.Decode(rc); + } +}; + +The LZMA decoder uses two instances of CLenDecoder class. +The first instance is for the matches of "Simple Match" type, +and the second instance is for the matches of "Rep Match" type: + + CLenDecoder LenDecoder; + CLenDecoder RepLenDecoder; + + +The match distance decoding +--------------------------- + +LZMA supports dictionary sizes up to 4 GiB minus 1. +The value of match distance (decoded by distance decoder) can be +from 1 to 2^32. But the distance value that is equal to 2^32 is used to +indicate the "End of stream" marker. So real largest match distance +that is used for LZ-window match is (2^32 - 1). + +LZMA uses normalized match length (zero-based length) +to calculate the context state "lenState" do decode the distance value: + +#define kNumLenToPosStates 4 + + unsigned lenState = len; + if (lenState > kNumLenToPosStates - 1) + lenState = kNumLenToPosStates - 1; + +The distance decoder returns the "dist" value that is zero-based value +of match distance. The real match distance can be calculated with the +following code: + + matchDistance = dist + 1; + +The state of the distance decoder and the initialization code: + + #define kEndPosModelIndex 14 + #define kNumFullDistances (1 << (kEndPosModelIndex >> 1)) + #define kNumAlignBits 4 + + CBitTreeDecoder<6> PosSlotDecoder[kNumLenToPosStates]; + CProb PosDecoders[1 + kNumFullDistances - kEndPosModelIndex]; + CBitTreeDecoder AlignDecoder; + + void InitDist() + { + for (unsigned i = 0; i < kNumLenToPosStates; i++) + PosSlotDecoder[i].Init(); + AlignDecoder.Init(); + INIT_PROBS(PosDecoders); + } + +At first stage the distance decoder decodes 6-bit "posSlot" value with bit +tree decoder from PosSlotDecoder array. It's possible to get 2^6=64 different +"posSlot" values. + + unsigned posSlot = PosSlotDecoder[lenState].Decode(&RangeDec); + +The encoding scheme for distance value is shown in the following table: + +posSlot (decimal) / + zero-based distance (binary) + 0 0 + 1 1 + 2 10 + 3 11 + + 4 10 x + 5 11 x + 6 10 xx + 7 11 xx + 8 10 xxx + 9 11 xxx +10 10 xxxx +11 11 xxxx +12 10 xxxxx +13 11 xxxxx + +14 10 yy zzzz +15 11 yy zzzz +16 10 yyy zzzz +17 11 yyy zzzz +... +62 10 yyyyyyyyyyyyyyyyyyyyyyyyyy zzzz +63 11 yyyyyyyyyyyyyyyyyyyyyyyyyy zzzz + +where + "x ... x" means the sequence of binary symbols encoded with binary tree and + "Reverse" scheme. It uses separated binary tree for each posSlot from 4 to 13. + "y" means direct bit encoded with range coder. + "zzzz" means the sequence of four binary symbols encoded with binary + tree with "Reverse" scheme, where one common binary tree "AlignDecoder" + is used for all posSlot values. + +If (posSlot < 4), the "dist" value is equal to posSlot value. + +If (posSlot >= 4), the decoder uses "posSlot" value to calculate the value of + the high bits of "dist" value and the number of the low bits. + + If (4 <= posSlot < kEndPosModelIndex), the decoder uses bit tree decoders. + (one separated bit tree decoder per one posSlot value) and "Reverse" scheme. + In this implementation we use one CProb array "PosDecoders" that contains + all CProb variables for all these bit decoders. + + if (posSlot >= kEndPosModelIndex), the middle bits are decoded as direct + bits from RangeDecoder and the low 4 bits are decoded with a bit tree + decoder "AlignDecoder" with "Reverse" scheme. + +The code to decode zero-based match distance: + + unsigned DecodeDistance(unsigned len) + { + unsigned lenState = len; + if (lenState > kNumLenToPosStates - 1) + lenState = kNumLenToPosStates - 1; + + unsigned posSlot = PosSlotDecoder[lenState].Decode(&RangeDec); + if (posSlot < 4) + return posSlot; + + unsigned numDirectBits = (unsigned)((posSlot >> 1) - 1); + UInt32 dist = ((2 | (posSlot & 1)) << numDirectBits); + if (posSlot < kEndPosModelIndex) + dist += BitTreeReverseDecode(PosDecoders + dist - posSlot, numDirectBits, &RangeDec); + else + { + dist += RangeDec.DecodeDirectBits(numDirectBits - kNumAlignBits) << kNumAlignBits; + dist += AlignDecoder.ReverseDecode(&RangeDec); + } + return dist; + } + + + +LZMA Decoding modes +------------------- + +There are 2 types of LZMA streams: + +1) The stream with "End of stream" marker. +2) The stream without "End of stream" marker. + +And the LZMA Decoder supports 3 modes of decoding: + +1) The unpack size is undefined. The LZMA decoder stops decoding after + getting "End of stream" marker. + The input variables for that case: + + markerIsMandatory = true + unpackSizeDefined = false + unpackSize contains any value + +2) The unpack size is defined and LZMA decoder supports both variants, + where the stream can contain "End of stream" marker or the stream is + finished without "End of stream" marker. The LZMA decoder must detect + any of these situations. + The input variables for that case: + + markerIsMandatory = false + unpackSizeDefined = true + unpackSize contains unpack size + +3) The unpack size is defined and the LZMA stream must contain + "End of stream" marker + The input variables for that case: + + markerIsMandatory = true + unpackSizeDefined = true + unpackSize contains unpack size + + +The main loop of decoder +------------------------ + +The main loop of LZMA decoder: + +Initialize the LZMA state. +loop +{ + // begin of loop + Check "end of stream" conditions. + Decode Type of MATCH / LITERAL. + If it's LITERAL, decode LITERAL value and put the LITERAL to Window. + If it's MATCH, decode the length of match and the match distance. + Check error conditions, check end of stream conditions and copy + the sequence of match bytes from sliding window to current position + in window. + Go to begin of loop +} + +The reference implementation of LZMA decoder uses "unpackSize" variable +to keep the number of remaining bytes in output stream. So it reduces +"unpackSize" value after each decoded LITERAL or MATCH. + +The following code contains the "end of stream" condition check at the start +of the loop: + + if (unpackSizeDefined && unpackSize == 0 && !markerIsMandatory) + if (RangeDec.IsFinishedOK()) + return LZMA_RES_FINISHED_WITHOUT_MARKER; + +LZMA uses three types of matches: + +1) "Simple Match" - the match with distance value encoded with bit models. + +2) "Rep Match" - the match that uses the distance from distance + history table. + +3) "Short Rep Match" - the match of single byte length, that uses the latest + distance from distance history table. + +The LZMA decoder keeps the history of latest 4 match distances that were used +by decoder. That set of 4 variables contains zero-based match distances and +these variables are initialized with zero values: + + UInt32 rep0 = 0, rep1 = 0, rep2 = 0, rep3 = 0; + +The LZMA decoder uses binary model variables to select type of MATCH or LITERAL: + +#define kNumStates 12 +#define kNumPosBitsMax 4 + + CProb IsMatch[kNumStates << kNumPosBitsMax]; + CProb IsRep[kNumStates]; + CProb IsRepG0[kNumStates]; + CProb IsRepG1[kNumStates]; + CProb IsRepG2[kNumStates]; + CProb IsRep0Long[kNumStates << kNumPosBitsMax]; + +The decoder uses "state" variable value to select exact variable +from "IsRep", "IsRepG0", "IsRepG1" and "IsRepG2" arrays. +The "state" variable can get the value from 0 to 11. +Initial value for "state" variable is zero: + + unsigned state = 0; + +The "state" variable is updated after each LITERAL or MATCH with one of the +following functions: + +unsigned UpdateState_Literal(unsigned state) +{ + if (state < 4) return 0; + else if (state < 10) return state - 3; + else return state - 6; +} +unsigned UpdateState_Match (unsigned state) { return state < 7 ? 7 : 10; } +unsigned UpdateState_Rep (unsigned state) { return state < 7 ? 8 : 11; } +unsigned UpdateState_ShortRep(unsigned state) { return state < 7 ? 9 : 11; } + +The decoder calculates "state2" variable value to select exact variable from +"IsMatch" and "IsRep0Long" arrays: + +unsigned posState = OutWindow.TotalPos & ((1 << pb) - 1); +unsigned state2 = (state << kNumPosBitsMax) + posState; + +The decoder uses the following code flow scheme to select exact +type of LITERAL or MATCH: + +IsMatch[state2] decode + 0 - the Literal + 1 - the Match + IsRep[state] decode + 0 - Simple Match + 1 - Rep Match + IsRepG0[state] decode + 0 - the distance is rep0 + IsRep0Long[state2] decode + 0 - Short Rep Match + 1 - Rep Match 0 + 1 - + IsRepG1[state] decode + 0 - Rep Match 1 + 1 - + IsRepG2[state] decode + 0 - Rep Match 2 + 1 - Rep Match 3 + + +LITERAL symbol +-------------- +If the value "0" was decoded with IsMatch[state2] decoding, we have "LITERAL" type. + +At first the LZMA decoder must check that it doesn't exceed +specified uncompressed size: + + if (unpackSizeDefined && unpackSize == 0) + return LZMA_RES_ERROR; + +Then it decodes literal value and puts it to sliding window: + + DecodeLiteral(state, rep0); + +Then the decoder must update the "state" value and "unpackSize" value; + + state = UpdateState_Literal(state); + unpackSize--; + +Then the decoder must go to the begin of main loop to decode next Match or Literal. + + +Simple Match +------------ + +If the value "1" was decoded with IsMatch[state2] decoding, +we have the "Simple Match" type. + +The distance history table is updated with the following scheme: + + rep3 = rep2; + rep2 = rep1; + rep1 = rep0; + +The zero-based length is decoded with "LenDecoder": + + len = LenDecoder.Decode(&RangeDec, posState); + +The state is update with UpdateState_Match function: + + state = UpdateState_Match(state); + +and the new "rep0" value is decoded with DecodeDistance: + + rep0 = DecodeDistance(len); + +That "rep0" will be used as zero-based distance for current match. + +If the value of "rep0" is equal to 0xFFFFFFFF, it means that we have +"End of stream" marker, so we can stop decoding and check finishing +condition in Range Decoder: + + if (rep0 == 0xFFFFFFFF) + return RangeDec.IsFinishedOK() ? + LZMA_RES_FINISHED_WITH_MARKER : + LZMA_RES_ERROR; + +If uncompressed size is defined, LZMA decoder must check that it doesn't +exceed that specified uncompressed size: + + if (unpackSizeDefined && unpackSize == 0) + return LZMA_RES_ERROR; + +Also the decoder must check that "rep0" value is not larger than dictionary size +and is not larger than the number of already decoded bytes: + + if (rep0 >= dictSize || !OutWindow.CheckDistance(rep0)) + return LZMA_RES_ERROR; + +Then the decoder must copy match bytes as described in +"The match symbols copying" section. + + +Rep Match +--------- + +If the LZMA decoder has decoded the value "1" with IsRep[state] variable, +we have "Rep Match" type. + +At first the LZMA decoder must check that it doesn't exceed +specified uncompressed size: + + if (unpackSizeDefined && unpackSize == 0) + return LZMA_RES_ERROR; + +Also the decoder must return error, if the LZ window is empty: + + if (OutWindow.IsEmpty()) + return LZMA_RES_ERROR; + +If the match type is "Rep Match", the decoder uses one of the 4 variables of +distance history table to get the value of distance for current match. +And there are 4 corresponding ways of decoding flow. + +The decoder updates the distance history with the following scheme +depending from type of match: + +- "Rep Match 0" or "Short Rep Match": + ; LZMA doesn't update the distance history + +- "Rep Match 1": + UInt32 dist = rep1; + rep1 = rep0; + rep0 = dist; + +- "Rep Match 2": + UInt32 dist = rep2; + rep2 = rep1; + rep1 = rep0; + rep0 = dist; + +- "Rep Match 3": + UInt32 dist = rep3; + rep3 = rep2; + rep2 = rep1; + rep1 = rep0; + rep0 = dist; + +Then the decoder decodes exact subtype of "Rep Match" using "IsRepG0", "IsRep0Long", +"IsRepG1", "IsRepG2". + +If the subtype is "Short Rep Match", the decoder updates the state, puts +the one byte from window to current position in window and goes to next +MATCH/LITERAL symbol (the begin of main loop): + + state = UpdateState_ShortRep(state); + OutWindow.PutByte(OutWindow.GetByte(rep0 + 1)); + unpackSize--; + continue; + +In other cases (Rep Match 0/1/2/3), it decodes the zero-based +length of match with "RepLenDecoder" decoder: + + len = RepLenDecoder.Decode(&RangeDec, posState); + +Then it updates the state: + + state = UpdateState_Rep(state); + +Then the decoder must copy match bytes as described in +"The Match symbols copying" section. + + +The match symbols copying +------------------------- + +If we have the match (Simple Match or Rep Match 0/1/2/3), the decoder must +copy the sequence of bytes with calculated match distance and match length. +If uncompressed size is defined, LZMA decoder must check that it doesn't +exceed that specified uncompressed size: + + len += kMatchMinLen; + bool isError = false; + if (unpackSizeDefined && unpackSize < len) + { + len = (unsigned)unpackSize; + isError = true; + } + OutWindow.CopyMatch(rep0 + 1, len); + unpackSize -= len; + if (isError) + return LZMA_RES_ERROR; + +Then the decoder must go to the begin of main loop to decode next MATCH or LITERAL. + + + +NOTES +----- + +This specification doesn't describe the variant of decoder implementation +that supports partial decoding. Such partial decoding case can require some +changes in "end of stream" condition checks code. Also such code +can use additional status codes, returned by decoder. + +This specification uses C++ code with templates to simplify describing. +The optimized version of LZMA decoder doesn't need templates. +Such optimized version can use just two arrays of CProb variables: + 1) The dynamic array of CProb variables allocated for the Literal Decoder. + 2) The one common array that contains all other CProb variables. + + +References: + +1. G. N. N. Martin, Range encoding: an algorithm for removing redundancy + from a digitized message, Video & Data Recording Conference, + Southampton, UK, July 24-27, 1979. diff --git a/core/cd_hw/libchdr/deps/lzma/DOC/lzma.txt b/core/cd_hw/libchdr/deps/lzma/DOC/lzma.txt new file mode 100644 index 0000000..87d727b --- /dev/null +++ b/core/cd_hw/libchdr/deps/lzma/DOC/lzma.txt @@ -0,0 +1,328 @@ +LZMA compression +---------------- +Version: 9.35 + +This file describes LZMA encoding and decoding functions written in C language. + +LZMA is an improved version of famous LZ77 compression algorithm. +It was improved in way of maximum increasing of compression ratio, +keeping high decompression speed and low memory requirements for +decompressing. + +Note: you can read also LZMA Specification (lzma-specification.txt from LZMA SDK) + +Also you can look source code for LZMA encoding and decoding: + C/Util/Lzma/LzmaUtil.c + + +LZMA compressed file format +--------------------------- +Offset Size Description + 0 1 Special LZMA properties (lc,lp, pb in encoded form) + 1 4 Dictionary size (little endian) + 5 8 Uncompressed size (little endian). -1 means unknown size + 13 Compressed data + + + +ANSI-C LZMA Decoder +~~~~~~~~~~~~~~~~~~~ + +Please note that interfaces for ANSI-C code were changed in LZMA SDK 4.58. +If you want to use old interfaces you can download previous version of LZMA SDK +from sourceforge.net site. + +To use ANSI-C LZMA Decoder you need the following files: +1) LzmaDec.h + LzmaDec.c + Types.h + +Look example code: + C/Util/Lzma/LzmaUtil.c + + +Memory requirements for LZMA decoding +------------------------------------- + +Stack usage of LZMA decoding function for local variables is not +larger than 200-400 bytes. + +LZMA Decoder uses dictionary buffer and internal state structure. +Internal state structure consumes + state_size = (4 + (1.5 << (lc + lp))) KB +by default (lc=3, lp=0), state_size = 16 KB. + + +How To decompress data +---------------------- + +LZMA Decoder (ANSI-C version) now supports 2 interfaces: +1) Single-call Decompressing +2) Multi-call State Decompressing (zlib-like interface) + +You must use external allocator: +Example: +void *SzAlloc(void *p, size_t size) { p = p; return malloc(size); } +void SzFree(void *p, void *address) { p = p; free(address); } +ISzAlloc alloc = { SzAlloc, SzFree }; + +You can use p = p; operator to disable compiler warnings. + + +Single-call Decompressing +------------------------- +When to use: RAM->RAM decompressing +Compile files: LzmaDec.h + LzmaDec.c + Types.h +Compile defines: no defines +Memory Requirements: + - Input buffer: compressed size + - Output buffer: uncompressed size + - LZMA Internal Structures: state_size (16 KB for default settings) + +Interface: + int LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, + const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode, + ELzmaStatus *status, ISzAlloc *alloc); + In: + dest - output data + destLen - output data size + src - input data + srcLen - input data size + propData - LZMA properties (5 bytes) + propSize - size of propData buffer (5 bytes) + finishMode - It has meaning only if the decoding reaches output limit (*destLen). + LZMA_FINISH_ANY - Decode just destLen bytes. + LZMA_FINISH_END - Stream must be finished after (*destLen). + You can use LZMA_FINISH_END, when you know that + current output buffer covers last bytes of stream. + alloc - Memory allocator. + + Out: + destLen - processed output size + srcLen - processed input size + + Output: + SZ_OK + status: + LZMA_STATUS_FINISHED_WITH_MARK + LZMA_STATUS_NOT_FINISHED + LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK + SZ_ERROR_DATA - Data error + SZ_ERROR_MEM - Memory allocation error + SZ_ERROR_UNSUPPORTED - Unsupported properties + SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src). + + If LZMA decoder sees end_marker before reaching output limit, it returns OK result, + and output value of destLen will be less than output buffer size limit. + + You can use multiple checks to test data integrity after full decompression: + 1) Check Result and "status" variable. + 2) Check that output(destLen) = uncompressedSize, if you know real uncompressedSize. + 3) Check that output(srcLen) = compressedSize, if you know real compressedSize. + You must use correct finish mode in that case. */ + + +Multi-call State Decompressing (zlib-like interface) +---------------------------------------------------- + +When to use: file->file decompressing +Compile files: LzmaDec.h + LzmaDec.c + Types.h + +Memory Requirements: + - Buffer for input stream: any size (for example, 16 KB) + - Buffer for output stream: any size (for example, 16 KB) + - LZMA Internal Structures: state_size (16 KB for default settings) + - LZMA dictionary (dictionary size is encoded in LZMA properties header) + +1) read LZMA properties (5 bytes) and uncompressed size (8 bytes, little-endian) to header: + unsigned char header[LZMA_PROPS_SIZE + 8]; + ReadFile(inFile, header, sizeof(header) + +2) Allocate CLzmaDec structures (state + dictionary) using LZMA properties + + CLzmaDec state; + LzmaDec_Constr(&state); + res = LzmaDec_Allocate(&state, header, LZMA_PROPS_SIZE, &g_Alloc); + if (res != SZ_OK) + return res; + +3) Init LzmaDec structure before any new LZMA stream. And call LzmaDec_DecodeToBuf in loop + + LzmaDec_Init(&state); + for (;;) + { + ... + int res = LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, + const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode); + ... + } + + +4) Free all allocated structures + LzmaDec_Free(&state, &g_Alloc); + +Look example code: + C/Util/Lzma/LzmaUtil.c + + +How To compress data +-------------------- + +Compile files: + Types.h + Threads.h + LzmaEnc.h + LzmaEnc.c + LzFind.h + LzFind.c + LzFindMt.h + LzFindMt.c + LzHash.h + +Memory Requirements: + - (dictSize * 11.5 + 6 MB) + state_size + +Lzma Encoder can use two memory allocators: +1) alloc - for small arrays. +2) allocBig - for big arrays. + +For example, you can use Large RAM Pages (2 MB) in allocBig allocator for +better compression speed. Note that Windows has bad implementation for +Large RAM Pages. +It's OK to use same allocator for alloc and allocBig. + + +Single-call Compression with callbacks +-------------------------------------- + +Look example code: + C/Util/Lzma/LzmaUtil.c + +When to use: file->file compressing + +1) you must implement callback structures for interfaces: +ISeqInStream +ISeqOutStream +ICompressProgress +ISzAlloc + +static void *SzAlloc(void *p, size_t size) { p = p; return MyAlloc(size); } +static void SzFree(void *p, void *address) { p = p; MyFree(address); } +static ISzAlloc g_Alloc = { SzAlloc, SzFree }; + + CFileSeqInStream inStream; + CFileSeqOutStream outStream; + + inStream.funcTable.Read = MyRead; + inStream.file = inFile; + outStream.funcTable.Write = MyWrite; + outStream.file = outFile; + + +2) Create CLzmaEncHandle object; + + CLzmaEncHandle enc; + + enc = LzmaEnc_Create(&g_Alloc); + if (enc == 0) + return SZ_ERROR_MEM; + + +3) initialize CLzmaEncProps properties; + + LzmaEncProps_Init(&props); + + Then you can change some properties in that structure. + +4) Send LZMA properties to LZMA Encoder + + res = LzmaEnc_SetProps(enc, &props); + +5) Write encoded properties to header + + Byte header[LZMA_PROPS_SIZE + 8]; + size_t headerSize = LZMA_PROPS_SIZE; + UInt64 fileSize; + int i; + + res = LzmaEnc_WriteProperties(enc, header, &headerSize); + fileSize = MyGetFileLength(inFile); + for (i = 0; i < 8; i++) + header[headerSize++] = (Byte)(fileSize >> (8 * i)); + MyWriteFileAndCheck(outFile, header, headerSize) + +6) Call encoding function: + res = LzmaEnc_Encode(enc, &outStream.funcTable, &inStream.funcTable, + NULL, &g_Alloc, &g_Alloc); + +7) Destroy LZMA Encoder Object + LzmaEnc_Destroy(enc, &g_Alloc, &g_Alloc); + + +If callback function return some error code, LzmaEnc_Encode also returns that code +or it can return the code like SZ_ERROR_READ, SZ_ERROR_WRITE or SZ_ERROR_PROGRESS. + + +Single-call RAM->RAM Compression +-------------------------------- + +Single-call RAM->RAM Compression is similar to Compression with callbacks, +but you provide pointers to buffers instead of pointers to stream callbacks: + +SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, + const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark, + ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig); + +Return code: + SZ_OK - OK + SZ_ERROR_MEM - Memory allocation error + SZ_ERROR_PARAM - Incorrect paramater + SZ_ERROR_OUTPUT_EOF - output buffer overflow + SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version) + + + +Defines +------- + +_LZMA_SIZE_OPT - Enable some optimizations in LZMA Decoder to get smaller executable code. + +_LZMA_PROB32 - It can increase the speed on some 32-bit CPUs, but memory usage for + some structures will be doubled in that case. + +_LZMA_UINT32_IS_ULONG - Define it if int is 16-bit on your compiler and long is 32-bit. + +_LZMA_NO_SYSTEM_SIZE_T - Define it if you don't want to use size_t type. + + +_7ZIP_PPMD_SUPPPORT - Define it if you don't want to support PPMD method in AMSI-C .7z decoder. + + +C++ LZMA Encoder/Decoder +~~~~~~~~~~~~~~~~~~~~~~~~ +C++ LZMA code use COM-like interfaces. So if you want to use it, +you can study basics of COM/OLE. +C++ LZMA code is just wrapper over ANSI-C code. + + +C++ Notes +~~~~~~~~~~~~~~~~~~~~~~~~ +If you use some C++ code folders in 7-Zip (for example, C++ code for .7z handling), +you must check that you correctly work with "new" operator. +7-Zip can be compiled with MSVC 6.0 that doesn't throw "exception" from "new" operator. +So 7-Zip uses "CPP\Common\NewHandler.cpp" that redefines "new" operator: +operator new(size_t size) +{ + void *p = ::malloc(size); + if (p == 0) + throw CNewException(); + return p; +} +If you use MSCV that throws exception for "new" operator, you can compile without +"NewHandler.cpp". So standard exception will be used. Actually some code of +7-Zip catches any exception in internal code and converts it to HRESULT code. +So you don't need to catch CNewException, if you call COM interfaces of 7-Zip. + +--- + +http://www.7-zip.org +http://www.7-zip.org/sdk.html +http://www.7-zip.org/support.html diff --git a/core/cd_hw/libchdr/deps/lzma/LzFind.c b/core/cd_hw/libchdr/deps/lzma/LzFind.c new file mode 100644 index 0000000..2d05fa3 --- /dev/null +++ b/core/cd_hw/libchdr/deps/lzma/LzFind.c @@ -0,0 +1,1044 @@ +/* LzFind.c -- Match finder for LZ algorithms +2015-10-15 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include + +#include "LzFind.h" +#include "LzHash.h" + +#define kEmptyHashValue 0 +#define kMaxValForNormalize ((UInt32)0xFFFFFFFF) +#define kNormalizeStepMin (1 << 10) /* it must be power of 2 */ +#define kNormalizeMask (~(UInt32)(kNormalizeStepMin - 1)) +#define kMaxHistorySize ((UInt32)7 << 29) + +#define kStartMaxLen 3 + +static void LzInWindow_Free(CMatchFinder *p, ISzAlloc *alloc) +{ + if (!p->directInput) + { + alloc->Free(alloc, p->bufferBase); + p->bufferBase = NULL; + } +} + +/* keepSizeBefore + keepSizeAfter + keepSizeReserv must be < 4G) */ + +static int LzInWindow_Create(CMatchFinder *p, UInt32 keepSizeReserv, ISzAlloc *alloc) +{ + UInt32 blockSize = p->keepSizeBefore + p->keepSizeAfter + keepSizeReserv; + if (p->directInput) + { + p->blockSize = blockSize; + return 1; + } + if (!p->bufferBase || p->blockSize != blockSize) + { + LzInWindow_Free(p, alloc); + p->blockSize = blockSize; + p->bufferBase = (Byte *)alloc->Alloc(alloc, (size_t)blockSize); + } + return (p->bufferBase != NULL); +} + +Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p) { return p->buffer; } + +UInt32 MatchFinder_GetNumAvailableBytes(CMatchFinder *p) { return p->streamPos - p->pos; } + +void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue) +{ + p->posLimit -= subValue; + p->pos -= subValue; + p->streamPos -= subValue; +} + +static void MatchFinder_ReadBlock(CMatchFinder *p) +{ + if (p->streamEndWasReached || p->result != SZ_OK) + return; + + /* We use (p->streamPos - p->pos) value. (p->streamPos < p->pos) is allowed. */ + + if (p->directInput) + { + UInt32 curSize = 0xFFFFFFFF - (p->streamPos - p->pos); + if (curSize > p->directInputRem) + curSize = (UInt32)p->directInputRem; + p->directInputRem -= curSize; + p->streamPos += curSize; + if (p->directInputRem == 0) + p->streamEndWasReached = 1; + return; + } + + for (;;) + { + Byte *dest = p->buffer + (p->streamPos - p->pos); + size_t size = (p->bufferBase + p->blockSize - dest); + if (size == 0) + return; + + p->result = p->stream->Read(p->stream, dest, &size); + if (p->result != SZ_OK) + return; + if (size == 0) + { + p->streamEndWasReached = 1; + return; + } + p->streamPos += (UInt32)size; + if (p->streamPos - p->pos > p->keepSizeAfter) + return; + } +} + +void MatchFinder_MoveBlock(CMatchFinder *p) +{ + memmove(p->bufferBase, + p->buffer - p->keepSizeBefore, + (size_t)(p->streamPos - p->pos) + p->keepSizeBefore); + p->buffer = p->bufferBase + p->keepSizeBefore; +} + +int MatchFinder_NeedMove(CMatchFinder *p) +{ + if (p->directInput) + return 0; + /* if (p->streamEndWasReached) return 0; */ + return ((size_t)(p->bufferBase + p->blockSize - p->buffer) <= p->keepSizeAfter); +} + +void MatchFinder_ReadIfRequired(CMatchFinder *p) +{ + if (p->streamEndWasReached) + return; + if (p->keepSizeAfter >= p->streamPos - p->pos) + MatchFinder_ReadBlock(p); +} + +static void MatchFinder_CheckAndMoveAndRead(CMatchFinder *p) +{ + if (MatchFinder_NeedMove(p)) + MatchFinder_MoveBlock(p); + MatchFinder_ReadBlock(p); +} + +static void MatchFinder_SetDefaultSettings(CMatchFinder *p) +{ + p->cutValue = 32; + p->btMode = 1; + p->numHashBytes = 4; + p->bigHash = 0; +} + +#define kCrcPoly 0xEDB88320 + +void MatchFinder_Construct(CMatchFinder *p) +{ + UInt32 i; + p->bufferBase = NULL; + p->directInput = 0; + p->hash = NULL; + MatchFinder_SetDefaultSettings(p); + + for (i = 0; i < 256; i++) + { + UInt32 r = i; + unsigned j; + for (j = 0; j < 8; j++) + r = (r >> 1) ^ (kCrcPoly & ~((r & 1) - 1)); + p->crc[i] = r; + } +} + +static void MatchFinder_FreeThisClassMemory(CMatchFinder *p, ISzAlloc *alloc) +{ + alloc->Free(alloc, p->hash); + p->hash = NULL; +} + +void MatchFinder_Free(CMatchFinder *p, ISzAlloc *alloc) +{ + MatchFinder_FreeThisClassMemory(p, alloc); + LzInWindow_Free(p, alloc); +} + +static CLzRef* AllocRefs(size_t num, ISzAlloc *alloc) +{ + size_t sizeInBytes = (size_t)num * sizeof(CLzRef); + if (sizeInBytes / sizeof(CLzRef) != num) + return NULL; + return (CLzRef *)alloc->Alloc(alloc, sizeInBytes); +} + +int MatchFinder_Create(CMatchFinder *p, UInt32 historySize, + UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter, + ISzAlloc *alloc) +{ + UInt32 sizeReserv; + + if (historySize > kMaxHistorySize) + { + MatchFinder_Free(p, alloc); + return 0; + } + + sizeReserv = historySize >> 1; + if (historySize >= ((UInt32)3 << 30)) sizeReserv = historySize >> 3; + else if (historySize >= ((UInt32)2 << 30)) sizeReserv = historySize >> 2; + + sizeReserv += (keepAddBufferBefore + matchMaxLen + keepAddBufferAfter) / 2 + (1 << 19); + + p->keepSizeBefore = historySize + keepAddBufferBefore + 1; + p->keepSizeAfter = matchMaxLen + keepAddBufferAfter; + + /* we need one additional byte, since we use MoveBlock after pos++ and before dictionary using */ + + if (LzInWindow_Create(p, sizeReserv, alloc)) + { + UInt32 newCyclicBufferSize = historySize + 1; + UInt32 hs; + p->matchMaxLen = matchMaxLen; + { + p->fixedHashSize = 0; + if (p->numHashBytes == 2) + hs = (1 << 16) - 1; + else + { + hs = historySize - 1; + hs |= (hs >> 1); + hs |= (hs >> 2); + hs |= (hs >> 4); + hs |= (hs >> 8); + hs >>= 1; + hs |= 0xFFFF; /* don't change it! It's required for Deflate */ + if (hs > (1 << 24)) + { + if (p->numHashBytes == 3) + hs = (1 << 24) - 1; + else + hs >>= 1; + /* if (bigHash) mode, GetHeads4b() in LzFindMt.c needs (hs >= ((1 << 24) - 1))) */ + } + } + p->hashMask = hs; + hs++; + if (p->numHashBytes > 2) p->fixedHashSize += kHash2Size; + if (p->numHashBytes > 3) p->fixedHashSize += kHash3Size; + if (p->numHashBytes > 4) p->fixedHashSize += kHash4Size; + hs += p->fixedHashSize; + } + + { + size_t newSize; + size_t numSons; + p->historySize = historySize; + p->hashSizeSum = hs; + p->cyclicBufferSize = newCyclicBufferSize; + + numSons = newCyclicBufferSize; + if (p->btMode) + numSons <<= 1; + newSize = hs + numSons; + + if (p->hash && p->numRefs == newSize) + return 1; + + MatchFinder_FreeThisClassMemory(p, alloc); + p->numRefs = newSize; + p->hash = AllocRefs(newSize, alloc); + + if (p->hash) + { + p->son = p->hash + p->hashSizeSum; + return 1; + } + } + } + + MatchFinder_Free(p, alloc); + return 0; +} + +static void MatchFinder_SetLimits(CMatchFinder *p) +{ + UInt32 limit = kMaxValForNormalize - p->pos; + UInt32 limit2 = p->cyclicBufferSize - p->cyclicBufferPos; + + if (limit2 < limit) + limit = limit2; + limit2 = p->streamPos - p->pos; + + if (limit2 <= p->keepSizeAfter) + { + if (limit2 > 0) + limit2 = 1; + } + else + limit2 -= p->keepSizeAfter; + + if (limit2 < limit) + limit = limit2; + + { + UInt32 lenLimit = p->streamPos - p->pos; + if (lenLimit > p->matchMaxLen) + lenLimit = p->matchMaxLen; + p->lenLimit = lenLimit; + } + p->posLimit = p->pos + limit; +} + +void MatchFinder_Init_2(CMatchFinder *p, int readData) +{ + UInt32 i; + UInt32 *hash = p->hash; + UInt32 num = p->hashSizeSum; + for (i = 0; i < num; i++) + hash[i] = kEmptyHashValue; + + p->cyclicBufferPos = 0; + p->buffer = p->bufferBase; + p->pos = p->streamPos = p->cyclicBufferSize; + p->result = SZ_OK; + p->streamEndWasReached = 0; + + if (readData) + MatchFinder_ReadBlock(p); + + MatchFinder_SetLimits(p); +} + +void MatchFinder_Init(CMatchFinder *p) +{ + MatchFinder_Init_2(p, True); +} + +static UInt32 MatchFinder_GetSubValue(CMatchFinder *p) +{ + return (p->pos - p->historySize - 1) & kNormalizeMask; +} + +void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, size_t numItems) +{ + size_t i; + for (i = 0; i < numItems; i++) + { + UInt32 value = items[i]; + if (value <= subValue) + value = kEmptyHashValue; + else + value -= subValue; + items[i] = value; + } +} + +static void MatchFinder_Normalize(CMatchFinder *p) +{ + UInt32 subValue = MatchFinder_GetSubValue(p); + MatchFinder_Normalize3(subValue, p->hash, p->numRefs); + MatchFinder_ReduceOffsets(p, subValue); +} + +static void MatchFinder_CheckLimits(CMatchFinder *p) +{ + if (p->pos == kMaxValForNormalize) + MatchFinder_Normalize(p); + if (!p->streamEndWasReached && p->keepSizeAfter == p->streamPos - p->pos) + MatchFinder_CheckAndMoveAndRead(p); + if (p->cyclicBufferPos == p->cyclicBufferSize) + p->cyclicBufferPos = 0; + MatchFinder_SetLimits(p); +} + +static UInt32 * Hc_GetMatchesSpec(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son, + UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue, + UInt32 *distances, UInt32 maxLen) +{ + son[_cyclicBufferPos] = curMatch; + for (;;) + { + UInt32 delta = pos - curMatch; + if (cutValue-- == 0 || delta >= _cyclicBufferSize) + return distances; + { + const Byte *pb = cur - delta; + curMatch = son[_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)]; + if (pb[maxLen] == cur[maxLen] && *pb == *cur) + { + UInt32 len = 0; + while (++len != lenLimit) + if (pb[len] != cur[len]) + break; + if (maxLen < len) + { + *distances++ = maxLen = len; + *distances++ = delta - 1; + if (len == lenLimit) + return distances; + } + } + } + } +} + +UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son, + UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue, + UInt32 *distances, UInt32 maxLen) +{ + CLzRef *ptr0 = son + (_cyclicBufferPos << 1) + 1; + CLzRef *ptr1 = son + (_cyclicBufferPos << 1); + UInt32 len0 = 0, len1 = 0; + for (;;) + { + UInt32 delta = pos - curMatch; + if (cutValue-- == 0 || delta >= _cyclicBufferSize) + { + *ptr0 = *ptr1 = kEmptyHashValue; + return distances; + } + { + CLzRef *pair = son + ((_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1); + const Byte *pb = cur - delta; + UInt32 len = (len0 < len1 ? len0 : len1); + if (pb[len] == cur[len]) + { + if (++len != lenLimit && pb[len] == cur[len]) + while (++len != lenLimit) + if (pb[len] != cur[len]) + break; + if (maxLen < len) + { + *distances++ = maxLen = len; + *distances++ = delta - 1; + if (len == lenLimit) + { + *ptr1 = pair[0]; + *ptr0 = pair[1]; + return distances; + } + } + } + if (pb[len] < cur[len]) + { + *ptr1 = curMatch; + ptr1 = pair + 1; + curMatch = *ptr1; + len1 = len; + } + else + { + *ptr0 = curMatch; + ptr0 = pair; + curMatch = *ptr0; + len0 = len; + } + } + } +} + +static void SkipMatchesSpec(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son, + UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue) +{ + CLzRef *ptr0 = son + (_cyclicBufferPos << 1) + 1; + CLzRef *ptr1 = son + (_cyclicBufferPos << 1); + UInt32 len0 = 0, len1 = 0; + for (;;) + { + UInt32 delta = pos - curMatch; + if (cutValue-- == 0 || delta >= _cyclicBufferSize) + { + *ptr0 = *ptr1 = kEmptyHashValue; + return; + } + { + CLzRef *pair = son + ((_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1); + const Byte *pb = cur - delta; + UInt32 len = (len0 < len1 ? len0 : len1); + if (pb[len] == cur[len]) + { + while (++len != lenLimit) + if (pb[len] != cur[len]) + break; + { + if (len == lenLimit) + { + *ptr1 = pair[0]; + *ptr0 = pair[1]; + return; + } + } + } + if (pb[len] < cur[len]) + { + *ptr1 = curMatch; + ptr1 = pair + 1; + curMatch = *ptr1; + len1 = len; + } + else + { + *ptr0 = curMatch; + ptr0 = pair; + curMatch = *ptr0; + len0 = len; + } + } + } +} + +#define MOVE_POS \ + ++p->cyclicBufferPos; \ + p->buffer++; \ + if (++p->pos == p->posLimit) MatchFinder_CheckLimits(p); + +#define MOVE_POS_RET MOVE_POS return offset; + +static void MatchFinder_MovePos(CMatchFinder *p) { MOVE_POS; } + +#define GET_MATCHES_HEADER2(minLen, ret_op) \ + UInt32 lenLimit; UInt32 hv; const Byte *cur; UInt32 curMatch; \ + lenLimit = p->lenLimit; { if (lenLimit < minLen) { MatchFinder_MovePos(p); ret_op; }} \ + cur = p->buffer; + +#define GET_MATCHES_HEADER(minLen) GET_MATCHES_HEADER2(minLen, return 0) +#define SKIP_HEADER(minLen) GET_MATCHES_HEADER2(minLen, continue) + +#define MF_PARAMS(p) p->pos, p->buffer, p->son, p->cyclicBufferPos, p->cyclicBufferSize, p->cutValue + +#define GET_MATCHES_FOOTER(offset, maxLen) \ + offset = (UInt32)(GetMatchesSpec1(lenLimit, curMatch, MF_PARAMS(p), \ + distances + offset, maxLen) - distances); MOVE_POS_RET; + +#define SKIP_FOOTER \ + SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); MOVE_POS; + +#define UPDATE_maxLen { \ + ptrdiff_t diff = (ptrdiff_t)0 - d2; \ + const Byte *c = cur + maxLen; \ + const Byte *lim = cur + lenLimit; \ + for (; c != lim; c++) if (*(c + diff) != *c) break; \ + maxLen = (UInt32)(c - cur); } + +static UInt32 Bt2_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) +{ + UInt32 offset; + GET_MATCHES_HEADER(2) + HASH2_CALC; + curMatch = p->hash[hv]; + p->hash[hv] = p->pos; + offset = 0; + GET_MATCHES_FOOTER(offset, 1) +} + +UInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) +{ + UInt32 offset; + GET_MATCHES_HEADER(3) + HASH_ZIP_CALC; + curMatch = p->hash[hv]; + p->hash[hv] = p->pos; + offset = 0; + GET_MATCHES_FOOTER(offset, 2) +} + +static UInt32 Bt3_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) +{ + UInt32 h2, d2, maxLen, offset, pos; + UInt32 *hash; + GET_MATCHES_HEADER(3) + + HASH3_CALC; + + hash = p->hash; + pos = p->pos; + + d2 = pos - hash[h2]; + + curMatch = hash[kFix3HashSize + hv]; + + hash[h2] = pos; + hash[kFix3HashSize + hv] = pos; + + maxLen = 2; + offset = 0; + + if (d2 < p->cyclicBufferSize && *(cur - d2) == *cur) + { + UPDATE_maxLen + distances[0] = maxLen; + distances[1] = d2 - 1; + offset = 2; + if (maxLen == lenLimit) + { + SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); + MOVE_POS_RET; + } + } + + GET_MATCHES_FOOTER(offset, maxLen) +} + +static UInt32 Bt4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) +{ + UInt32 h2, h3, d2, d3, maxLen, offset, pos; + UInt32 *hash; + GET_MATCHES_HEADER(4) + + HASH4_CALC; + + hash = p->hash; + pos = p->pos; + + d2 = pos - hash[ h2]; + d3 = pos - hash[kFix3HashSize + h3]; + + curMatch = hash[kFix4HashSize + hv]; + + hash[ h2] = pos; + hash[kFix3HashSize + h3] = pos; + hash[kFix4HashSize + hv] = pos; + + maxLen = 0; + offset = 0; + + if (d2 < p->cyclicBufferSize && *(cur - d2) == *cur) + { + distances[0] = maxLen = 2; + distances[1] = d2 - 1; + offset = 2; + } + + if (d2 != d3 && d3 < p->cyclicBufferSize && *(cur - d3) == *cur) + { + maxLen = 3; + distances[offset + 1] = d3 - 1; + offset += 2; + d2 = d3; + } + + if (offset != 0) + { + UPDATE_maxLen + distances[offset - 2] = maxLen; + if (maxLen == lenLimit) + { + SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); + MOVE_POS_RET; + } + } + + if (maxLen < 3) + maxLen = 3; + + GET_MATCHES_FOOTER(offset, maxLen) +} + +/* +static UInt32 Bt5_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) +{ + UInt32 h2, h3, h4, d2, d3, d4, maxLen, offset, pos; + UInt32 *hash; + GET_MATCHES_HEADER(5) + + HASH5_CALC; + + hash = p->hash; + pos = p->pos; + + d2 = pos - hash[ h2]; + d3 = pos - hash[kFix3HashSize + h3]; + d4 = pos - hash[kFix4HashSize + h4]; + + curMatch = hash[kFix5HashSize + hv]; + + hash[ h2] = pos; + hash[kFix3HashSize + h3] = pos; + hash[kFix4HashSize + h4] = pos; + hash[kFix5HashSize + hv] = pos; + + maxLen = 0; + offset = 0; + + if (d2 < p->cyclicBufferSize && *(cur - d2) == *cur) + { + distances[0] = maxLen = 2; + distances[1] = d2 - 1; + offset = 2; + if (*(cur - d2 + 2) == cur[2]) + distances[0] = maxLen = 3; + else if (d3 < p->cyclicBufferSize && *(cur - d3) == *cur) + { + distances[2] = maxLen = 3; + distances[3] = d3 - 1; + offset = 4; + d2 = d3; + } + } + else if (d3 < p->cyclicBufferSize && *(cur - d3) == *cur) + { + distances[0] = maxLen = 3; + distances[1] = d3 - 1; + offset = 2; + d2 = d3; + } + + if (d2 != d4 && d4 < p->cyclicBufferSize + && *(cur - d4) == *cur + && *(cur - d4 + 3) == *(cur + 3)) + { + maxLen = 4; + distances[offset + 1] = d4 - 1; + offset += 2; + d2 = d4; + } + + if (offset != 0) + { + UPDATE_maxLen + distances[offset - 2] = maxLen; + if (maxLen == lenLimit) + { + SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); + MOVE_POS_RET; + } + } + + if (maxLen < 4) + maxLen = 4; + + GET_MATCHES_FOOTER(offset, maxLen) +} +*/ + +static UInt32 Hc4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) +{ + UInt32 h2, h3, d2, d3, maxLen, offset, pos; + UInt32 *hash; + GET_MATCHES_HEADER(4) + + HASH4_CALC; + + hash = p->hash; + pos = p->pos; + + d2 = pos - hash[ h2]; + d3 = pos - hash[kFix3HashSize + h3]; + + curMatch = hash[kFix4HashSize + hv]; + + hash[ h2] = pos; + hash[kFix3HashSize + h3] = pos; + hash[kFix4HashSize + hv] = pos; + + maxLen = 0; + offset = 0; + + if (d2 < p->cyclicBufferSize && *(cur - d2) == *cur) + { + distances[0] = maxLen = 2; + distances[1] = d2 - 1; + offset = 2; + } + + if (d2 != d3 && d3 < p->cyclicBufferSize && *(cur - d3) == *cur) + { + maxLen = 3; + distances[offset + 1] = d3 - 1; + offset += 2; + d2 = d3; + } + + if (offset != 0) + { + UPDATE_maxLen + distances[offset - 2] = maxLen; + if (maxLen == lenLimit) + { + p->son[p->cyclicBufferPos] = curMatch; + MOVE_POS_RET; + } + } + + if (maxLen < 3) + maxLen = 3; + + offset = (UInt32)(Hc_GetMatchesSpec(lenLimit, curMatch, MF_PARAMS(p), + distances + offset, maxLen) - (distances)); + MOVE_POS_RET +} + +/* +static UInt32 Hc5_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) +{ + UInt32 h2, h3, h4, d2, d3, d4, maxLen, offset, pos + UInt32 *hash; + GET_MATCHES_HEADER(5) + + HASH5_CALC; + + hash = p->hash; + pos = p->pos; + + d2 = pos - hash[ h2]; + d3 = pos - hash[kFix3HashSize + h3]; + d4 = pos - hash[kFix4HashSize + h4]; + + curMatch = hash[kFix5HashSize + hv]; + + hash[ h2] = pos; + hash[kFix3HashSize + h3] = pos; + hash[kFix4HashSize + h4] = pos; + hash[kFix5HashSize + hv] = pos; + + maxLen = 0; + offset = 0; + + if (d2 < p->cyclicBufferSize && *(cur - d2) == *cur) + { + distances[0] = maxLen = 2; + distances[1] = d2 - 1; + offset = 2; + if (*(cur - d2 + 2) == cur[2]) + distances[0] = maxLen = 3; + else if (d3 < p->cyclicBufferSize && *(cur - d3) == *cur) + { + distances[2] = maxLen = 3; + distances[3] = d3 - 1; + offset = 4; + d2 = d3; + } + } + else if (d3 < p->cyclicBufferSize && *(cur - d3) == *cur) + { + distances[0] = maxLen = 3; + distances[1] = d3 - 1; + offset = 2; + d2 = d3; + } + + if (d2 != d4 && d4 < p->cyclicBufferSize + && *(cur - d4) == *cur + && *(cur - d4 + 3) == *(cur + 3)) + { + maxLen = 4; + distances[offset + 1] = d4 - 1; + offset += 2; + d2 = d4; + } + + if (offset != 0) + { + UPDATE_maxLen + distances[offset - 2] = maxLen; + if (maxLen == lenLimit) + { + p->son[p->cyclicBufferPos] = curMatch; + MOVE_POS_RET; + } + } + + if (maxLen < 4) + maxLen = 4; + + offset = (UInt32)(Hc_GetMatchesSpec(lenLimit, curMatch, MF_PARAMS(p), + distances + offset, maxLen) - (distances)); + MOVE_POS_RET +} +*/ + +UInt32 Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) +{ + UInt32 offset; + GET_MATCHES_HEADER(3) + HASH_ZIP_CALC; + curMatch = p->hash[hv]; + p->hash[hv] = p->pos; + offset = (UInt32)(Hc_GetMatchesSpec(lenLimit, curMatch, MF_PARAMS(p), + distances, 2) - (distances)); + MOVE_POS_RET +} + +static void Bt2_MatchFinder_Skip(CMatchFinder *p, UInt32 num) +{ + do + { + SKIP_HEADER(2) + HASH2_CALC; + curMatch = p->hash[hv]; + p->hash[hv] = p->pos; + SKIP_FOOTER + } + while (--num != 0); +} + +void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num) +{ + do + { + SKIP_HEADER(3) + HASH_ZIP_CALC; + curMatch = p->hash[hv]; + p->hash[hv] = p->pos; + SKIP_FOOTER + } + while (--num != 0); +} + +static void Bt3_MatchFinder_Skip(CMatchFinder *p, UInt32 num) +{ + do + { + UInt32 h2; + UInt32 *hash; + SKIP_HEADER(3) + HASH3_CALC; + hash = p->hash; + curMatch = hash[kFix3HashSize + hv]; + hash[h2] = + hash[kFix3HashSize + hv] = p->pos; + SKIP_FOOTER + } + while (--num != 0); +} + +static void Bt4_MatchFinder_Skip(CMatchFinder *p, UInt32 num) +{ + do + { + UInt32 h2, h3; + UInt32 *hash; + SKIP_HEADER(4) + HASH4_CALC; + hash = p->hash; + curMatch = hash[kFix4HashSize + hv]; + hash[ h2] = + hash[kFix3HashSize + h3] = + hash[kFix4HashSize + hv] = p->pos; + SKIP_FOOTER + } + while (--num != 0); +} + +/* +static void Bt5_MatchFinder_Skip(CMatchFinder *p, UInt32 num) +{ + do + { + UInt32 h2, h3, h4; + UInt32 *hash; + SKIP_HEADER(5) + HASH5_CALC; + hash = p->hash; + curMatch = hash[kFix5HashSize + hv]; + hash[ h2] = + hash[kFix3HashSize + h3] = + hash[kFix4HashSize + h4] = + hash[kFix5HashSize + hv] = p->pos; + SKIP_FOOTER + } + while (--num != 0); +} +*/ + +static void Hc4_MatchFinder_Skip(CMatchFinder *p, UInt32 num) +{ + do + { + UInt32 h2, h3; + UInt32 *hash; + SKIP_HEADER(4) + HASH4_CALC; + hash = p->hash; + curMatch = hash[kFix4HashSize + hv]; + hash[ h2] = + hash[kFix3HashSize + h3] = + hash[kFix4HashSize + hv] = p->pos; + p->son[p->cyclicBufferPos] = curMatch; + MOVE_POS + } + while (--num != 0); +} + +/* +static void Hc5_MatchFinder_Skip(CMatchFinder *p, UInt32 num) +{ + do + { + UInt32 h2, h3, h4; + UInt32 *hash; + SKIP_HEADER(5) + HASH5_CALC; + hash = p->hash; + curMatch = p->hash[kFix5HashSize + hv]; + hash[ h2] = + hash[kFix3HashSize + h3] = + hash[kFix4HashSize + h4] = + hash[kFix5HashSize + hv] = p->pos; + p->son[p->cyclicBufferPos] = curMatch; + MOVE_POS + } + while (--num != 0); +} +*/ + +void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num) +{ + do + { + SKIP_HEADER(3) + HASH_ZIP_CALC; + curMatch = p->hash[hv]; + p->hash[hv] = p->pos; + p->son[p->cyclicBufferPos] = curMatch; + MOVE_POS + } + while (--num != 0); +} + +void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder *vTable) +{ + vTable->Init = (Mf_Init_Func)MatchFinder_Init; + vTable->GetNumAvailableBytes = (Mf_GetNumAvailableBytes_Func)MatchFinder_GetNumAvailableBytes; + vTable->GetPointerToCurrentPos = (Mf_GetPointerToCurrentPos_Func)MatchFinder_GetPointerToCurrentPos; + if (!p->btMode) + { + /* if (p->numHashBytes <= 4) */ + { + vTable->GetMatches = (Mf_GetMatches_Func)Hc4_MatchFinder_GetMatches; + vTable->Skip = (Mf_Skip_Func)Hc4_MatchFinder_Skip; + } + /* + else + { + vTable->GetMatches = (Mf_GetMatches_Func)Hc5_MatchFinder_GetMatches; + vTable->Skip = (Mf_Skip_Func)Hc5_MatchFinder_Skip; + } + */ + } + else if (p->numHashBytes == 2) + { + vTable->GetMatches = (Mf_GetMatches_Func)Bt2_MatchFinder_GetMatches; + vTable->Skip = (Mf_Skip_Func)Bt2_MatchFinder_Skip; + } + else if (p->numHashBytes == 3) + { + vTable->GetMatches = (Mf_GetMatches_Func)Bt3_MatchFinder_GetMatches; + vTable->Skip = (Mf_Skip_Func)Bt3_MatchFinder_Skip; + } + else /* if (p->numHashBytes == 4) */ + { + vTable->GetMatches = (Mf_GetMatches_Func)Bt4_MatchFinder_GetMatches; + vTable->Skip = (Mf_Skip_Func)Bt4_MatchFinder_Skip; + } + /* + else + { + vTable->GetMatches = (Mf_GetMatches_Func)Bt5_MatchFinder_GetMatches; + vTable->Skip = (Mf_Skip_Func)Bt5_MatchFinder_Skip; + } + */ +} diff --git a/core/cd_hw/libchdr/deps/lzma/LzFind.h b/core/cd_hw/libchdr/deps/lzma/LzFind.h new file mode 100644 index 0000000..d119944 --- /dev/null +++ b/core/cd_hw/libchdr/deps/lzma/LzFind.h @@ -0,0 +1,117 @@ +/* LzFind.h -- Match finder for LZ algorithms +2015-10-15 : Igor Pavlov : Public domain */ + +#ifndef __LZ_FIND_H +#define __LZ_FIND_H + +#include "7zTypes.h" + +EXTERN_C_BEGIN + +typedef UInt32 CLzRef; + +typedef struct _CMatchFinder +{ + Byte *buffer; + UInt32 pos; + UInt32 posLimit; + UInt32 streamPos; + UInt32 lenLimit; + + UInt32 cyclicBufferPos; + UInt32 cyclicBufferSize; /* it must be = (historySize + 1) */ + + Byte streamEndWasReached; + Byte btMode; + Byte bigHash; + Byte directInput; + + UInt32 matchMaxLen; + CLzRef *hash; + CLzRef *son; + UInt32 hashMask; + UInt32 cutValue; + + Byte *bufferBase; + ISeqInStream *stream; + + UInt32 blockSize; + UInt32 keepSizeBefore; + UInt32 keepSizeAfter; + + UInt32 numHashBytes; + size_t directInputRem; + UInt32 historySize; + UInt32 fixedHashSize; + UInt32 hashSizeSum; + SRes result; + UInt32 crc[256]; + size_t numRefs; +} CMatchFinder; + +#define Inline_MatchFinder_GetPointerToCurrentPos(p) ((p)->buffer) + +#define Inline_MatchFinder_GetNumAvailableBytes(p) ((p)->streamPos - (p)->pos) + +#define Inline_MatchFinder_IsFinishedOK(p) \ + ((p)->streamEndWasReached \ + && (p)->streamPos == (p)->pos \ + && (!(p)->directInput || (p)->directInputRem == 0)) + +int MatchFinder_NeedMove(CMatchFinder *p); +Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p); +void MatchFinder_MoveBlock(CMatchFinder *p); +void MatchFinder_ReadIfRequired(CMatchFinder *p); + +void MatchFinder_Construct(CMatchFinder *p); + +/* Conditions: + historySize <= 3 GB + keepAddBufferBefore + matchMaxLen + keepAddBufferAfter < 511MB +*/ +int MatchFinder_Create(CMatchFinder *p, UInt32 historySize, + UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter, + ISzAlloc *alloc); +void MatchFinder_Free(CMatchFinder *p, ISzAlloc *alloc); +void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, size_t numItems); +void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue); + +UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *buffer, CLzRef *son, + UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 _cutValue, + UInt32 *distances, UInt32 maxLen); + +/* +Conditions: + Mf_GetNumAvailableBytes_Func must be called before each Mf_GetMatchLen_Func. + Mf_GetPointerToCurrentPos_Func's result must be used only before any other function +*/ + +typedef void (*Mf_Init_Func)(void *object); +typedef UInt32 (*Mf_GetNumAvailableBytes_Func)(void *object); +typedef const Byte * (*Mf_GetPointerToCurrentPos_Func)(void *object); +typedef UInt32 (*Mf_GetMatches_Func)(void *object, UInt32 *distances); +typedef void (*Mf_Skip_Func)(void *object, UInt32); + +typedef struct _IMatchFinder +{ + Mf_Init_Func Init; + Mf_GetNumAvailableBytes_Func GetNumAvailableBytes; + Mf_GetPointerToCurrentPos_Func GetPointerToCurrentPos; + Mf_GetMatches_Func GetMatches; + Mf_Skip_Func Skip; +} IMatchFinder; + +void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder *vTable); + +void MatchFinder_Init_2(CMatchFinder *p, int readData); +void MatchFinder_Init(CMatchFinder *p); + +UInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances); +UInt32 Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances); + +void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num); +void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num); + +EXTERN_C_END + +#endif diff --git a/core/cd_hw/libchdr/deps/lzma/LzHash.h b/core/cd_hw/libchdr/deps/lzma/LzHash.h new file mode 100644 index 0000000..e7c9423 --- /dev/null +++ b/core/cd_hw/libchdr/deps/lzma/LzHash.h @@ -0,0 +1,57 @@ +/* LzHash.h -- HASH functions for LZ algorithms +2015-04-12 : Igor Pavlov : Public domain */ + +#ifndef __LZ_HASH_H +#define __LZ_HASH_H + +#define kHash2Size (1 << 10) +#define kHash3Size (1 << 16) +#define kHash4Size (1 << 20) + +#define kFix3HashSize (kHash2Size) +#define kFix4HashSize (kHash2Size + kHash3Size) +#define kFix5HashSize (kHash2Size + kHash3Size + kHash4Size) + +#define HASH2_CALC hv = cur[0] | ((UInt32)cur[1] << 8); + +#define HASH3_CALC { \ + UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ + h2 = temp & (kHash2Size - 1); \ + hv = (temp ^ ((UInt32)cur[2] << 8)) & p->hashMask; } + +#define HASH4_CALC { \ + UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ + h2 = temp & (kHash2Size - 1); \ + temp ^= ((UInt32)cur[2] << 8); \ + h3 = temp & (kHash3Size - 1); \ + hv = (temp ^ (p->crc[cur[3]] << 5)) & p->hashMask; } + +#define HASH5_CALC { \ + UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ + h2 = temp & (kHash2Size - 1); \ + temp ^= ((UInt32)cur[2] << 8); \ + h3 = temp & (kHash3Size - 1); \ + temp ^= (p->crc[cur[3]] << 5); \ + h4 = temp & (kHash4Size - 1); \ + hv = (temp ^ (p->crc[cur[4]] << 3)) & p->hashMask; } + +/* #define HASH_ZIP_CALC hv = ((cur[0] | ((UInt32)cur[1] << 8)) ^ p->crc[cur[2]]) & 0xFFFF; */ +#define HASH_ZIP_CALC hv = ((cur[2] | ((UInt32)cur[0] << 8)) ^ p->crc[cur[1]]) & 0xFFFF; + + +#define MT_HASH2_CALC \ + h2 = (p->crc[cur[0]] ^ cur[1]) & (kHash2Size - 1); + +#define MT_HASH3_CALC { \ + UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ + h2 = temp & (kHash2Size - 1); \ + h3 = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); } + +#define MT_HASH4_CALC { \ + UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ + h2 = temp & (kHash2Size - 1); \ + temp ^= ((UInt32)cur[2] << 8); \ + h3 = temp & (kHash3Size - 1); \ + h4 = (temp ^ (p->crc[cur[3]] << 5)) & (kHash4Size - 1); } + +#endif diff --git a/core/cd_hw/libchdr/deps/lzma/LzmaDec.c b/core/cd_hw/libchdr/deps/lzma/LzmaDec.c new file mode 100644 index 0000000..12dce11 --- /dev/null +++ b/core/cd_hw/libchdr/deps/lzma/LzmaDec.c @@ -0,0 +1,1100 @@ +/* LzmaDec.c -- LZMA Decoder +2016-05-16 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include "LzmaDec.h" + +#include + +#define kNumTopBits 24 +#define kTopValue ((UInt32)1 << kNumTopBits) + +#define kNumBitModelTotalBits 11 +#define kBitModelTotal (1 << kNumBitModelTotalBits) +#define kNumMoveBits 5 + +#define RC_INIT_SIZE 5 + +#define NORMALIZE if (range < kTopValue) { range <<= 8; code = (code << 8) | (*buf++); } + +#define IF_BIT_0(p) ttt = *(p); NORMALIZE; bound = (range >> kNumBitModelTotalBits) * ttt; if (code < bound) +#define UPDATE_0(p) range = bound; *(p) = (CLzmaProb)(ttt + ((kBitModelTotal - ttt) >> kNumMoveBits)); +#define UPDATE_1(p) range -= bound; code -= bound; *(p) = (CLzmaProb)(ttt - (ttt >> kNumMoveBits)); +#define GET_BIT2(p, i, A0, A1) IF_BIT_0(p) \ + { UPDATE_0(p); i = (i + i); A0; } else \ + { UPDATE_1(p); i = (i + i) + 1; A1; } +#define GET_BIT(p, i) GET_BIT2(p, i, ; , ;) + +#define TREE_GET_BIT(probs, i) { GET_BIT((probs + i), i); } +#define TREE_DECODE(probs, limit, i) \ + { i = 1; do { TREE_GET_BIT(probs, i); } while (i < limit); i -= limit; } + +/* #define _LZMA_SIZE_OPT */ + +#ifdef _LZMA_SIZE_OPT +#define TREE_6_DECODE(probs, i) TREE_DECODE(probs, (1 << 6), i) +#else +#define TREE_6_DECODE(probs, i) \ + { i = 1; \ + TREE_GET_BIT(probs, i); \ + TREE_GET_BIT(probs, i); \ + TREE_GET_BIT(probs, i); \ + TREE_GET_BIT(probs, i); \ + TREE_GET_BIT(probs, i); \ + TREE_GET_BIT(probs, i); \ + i -= 0x40; } +#endif + +#define NORMAL_LITER_DEC GET_BIT(prob + symbol, symbol) +#define MATCHED_LITER_DEC \ + matchByte <<= 1; \ + bit = (matchByte & offs); \ + probLit = prob + offs + bit + symbol; \ + GET_BIT2(probLit, symbol, offs &= ~bit, offs &= bit) + +#define NORMALIZE_CHECK if (range < kTopValue) { if (buf >= bufLimit) return DUMMY_ERROR; range <<= 8; code = (code << 8) | (*buf++); } + +#define IF_BIT_0_CHECK(p) ttt = *(p); NORMALIZE_CHECK; bound = (range >> kNumBitModelTotalBits) * ttt; if (code < bound) +#define UPDATE_0_CHECK range = bound; +#define UPDATE_1_CHECK range -= bound; code -= bound; +#define GET_BIT2_CHECK(p, i, A0, A1) IF_BIT_0_CHECK(p) \ + { UPDATE_0_CHECK; i = (i + i); A0; } else \ + { UPDATE_1_CHECK; i = (i + i) + 1; A1; } +#define GET_BIT_CHECK(p, i) GET_BIT2_CHECK(p, i, ; , ;) +#define TREE_DECODE_CHECK(probs, limit, i) \ + { i = 1; do { GET_BIT_CHECK(probs + i, i) } while (i < limit); i -= limit; } + + +#define kNumPosBitsMax 4 +#define kNumPosStatesMax (1 << kNumPosBitsMax) + +#define kLenNumLowBits 3 +#define kLenNumLowSymbols (1 << kLenNumLowBits) +#define kLenNumMidBits 3 +#define kLenNumMidSymbols (1 << kLenNumMidBits) +#define kLenNumHighBits 8 +#define kLenNumHighSymbols (1 << kLenNumHighBits) + +#define LenChoice 0 +#define LenChoice2 (LenChoice + 1) +#define LenLow (LenChoice2 + 1) +#define LenMid (LenLow + (kNumPosStatesMax << kLenNumLowBits)) +#define LenHigh (LenMid + (kNumPosStatesMax << kLenNumMidBits)) +#define kNumLenProbs (LenHigh + kLenNumHighSymbols) + + +#define kNumStates 12 +#define kNumLitStates 7 + +#define kStartPosModelIndex 4 +#define kEndPosModelIndex 14 +#define kNumFullDistances (1 << (kEndPosModelIndex >> 1)) + +#define kNumPosSlotBits 6 +#define kNumLenToPosStates 4 + +#define kNumAlignBits 4 +#define kAlignTableSize (1 << kNumAlignBits) + +#define kMatchMinLen 2 +#define kMatchSpecLenStart (kMatchMinLen + kLenNumLowSymbols + kLenNumMidSymbols + kLenNumHighSymbols) + +#define IsMatch 0 +#define IsRep (IsMatch + (kNumStates << kNumPosBitsMax)) +#define IsRepG0 (IsRep + kNumStates) +#define IsRepG1 (IsRepG0 + kNumStates) +#define IsRepG2 (IsRepG1 + kNumStates) +#define IsRep0Long (IsRepG2 + kNumStates) +#define PosSlot (IsRep0Long + (kNumStates << kNumPosBitsMax)) +#define SpecPos (PosSlot + (kNumLenToPosStates << kNumPosSlotBits)) +#define Align (SpecPos + kNumFullDistances - kEndPosModelIndex) +#define LenCoder (Align + kAlignTableSize) +#define RepLenCoder (LenCoder + kNumLenProbs) +#define Literal (RepLenCoder + kNumLenProbs) + +#define LZMA_BASE_SIZE 1846 +#define LZMA_LIT_SIZE 0x300 + +#if Literal != LZMA_BASE_SIZE +StopCompilingDueBUG +#endif + +#define LzmaProps_GetNumProbs(p) (Literal + ((UInt32)LZMA_LIT_SIZE << ((p)->lc + (p)->lp))) + +#define LZMA_DIC_MIN (1 << 12) + +/* First LZMA-symbol is always decoded. +And it decodes new LZMA-symbols while (buf < bufLimit), but "buf" is without last normalization +Out: + Result: + SZ_OK - OK + SZ_ERROR_DATA - Error + p->remainLen: + < kMatchSpecLenStart : normal remain + = kMatchSpecLenStart : finished + = kMatchSpecLenStart + 1 : Flush marker (unused now) + = kMatchSpecLenStart + 2 : State Init Marker (unused now) +*/ + +static int MY_FAST_CALL LzmaDec_DecodeReal(CLzmaDec *p, SizeT limit, const Byte *bufLimit) +{ + CLzmaProb *probs = p->probs; + + unsigned state = p->state; + UInt32 rep0 = p->reps[0], rep1 = p->reps[1], rep2 = p->reps[2], rep3 = p->reps[3]; + unsigned pbMask = ((unsigned)1 << (p->prop.pb)) - 1; + unsigned lpMask = ((unsigned)1 << (p->prop.lp)) - 1; + unsigned lc = p->prop.lc; + + Byte *dic = p->dic; + SizeT dicBufSize = p->dicBufSize; + SizeT dicPos = p->dicPos; + + UInt32 processedPos = p->processedPos; + UInt32 checkDicSize = p->checkDicSize; + unsigned len = 0; + + const Byte *buf = p->buf; + UInt32 range = p->range; + UInt32 code = p->code; + + do + { + CLzmaProb *prob; + UInt32 bound; + unsigned ttt; + unsigned posState = processedPos & pbMask; + + prob = probs + IsMatch + (state << kNumPosBitsMax) + posState; + IF_BIT_0(prob) + { + unsigned symbol; + UPDATE_0(prob); + prob = probs + Literal; + if (processedPos != 0 || checkDicSize != 0) + prob += ((UInt32)LZMA_LIT_SIZE * (((processedPos & lpMask) << lc) + + (dic[(dicPos == 0 ? dicBufSize : dicPos) - 1] >> (8 - lc)))); + processedPos++; + + if (state < kNumLitStates) + { + state -= (state < 4) ? state : 3; + symbol = 1; + #ifdef _LZMA_SIZE_OPT + do { NORMAL_LITER_DEC } while (symbol < 0x100); + #else + NORMAL_LITER_DEC + NORMAL_LITER_DEC + NORMAL_LITER_DEC + NORMAL_LITER_DEC + NORMAL_LITER_DEC + NORMAL_LITER_DEC + NORMAL_LITER_DEC + NORMAL_LITER_DEC + #endif + } + else + { + unsigned matchByte = dic[dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0)]; + unsigned offs = 0x100; + state -= (state < 10) ? 3 : 6; + symbol = 1; + #ifdef _LZMA_SIZE_OPT + do + { + unsigned bit; + CLzmaProb *probLit; + MATCHED_LITER_DEC + } + while (symbol < 0x100); + #else + { + unsigned bit; + CLzmaProb *probLit; + MATCHED_LITER_DEC + MATCHED_LITER_DEC + MATCHED_LITER_DEC + MATCHED_LITER_DEC + MATCHED_LITER_DEC + MATCHED_LITER_DEC + MATCHED_LITER_DEC + MATCHED_LITER_DEC + } + #endif + } + + dic[dicPos++] = (Byte)symbol; + continue; + } + + { + UPDATE_1(prob); + prob = probs + IsRep + state; + IF_BIT_0(prob) + { + UPDATE_0(prob); + state += kNumStates; + prob = probs + LenCoder; + } + else + { + UPDATE_1(prob); + if (checkDicSize == 0 && processedPos == 0) + return SZ_ERROR_DATA; + prob = probs + IsRepG0 + state; + IF_BIT_0(prob) + { + UPDATE_0(prob); + prob = probs + IsRep0Long + (state << kNumPosBitsMax) + posState; + IF_BIT_0(prob) + { + UPDATE_0(prob); + dic[dicPos] = dic[dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0)]; + dicPos++; + processedPos++; + state = state < kNumLitStates ? 9 : 11; + continue; + } + UPDATE_1(prob); + } + else + { + UInt32 distance; + UPDATE_1(prob); + prob = probs + IsRepG1 + state; + IF_BIT_0(prob) + { + UPDATE_0(prob); + distance = rep1; + } + else + { + UPDATE_1(prob); + prob = probs + IsRepG2 + state; + IF_BIT_0(prob) + { + UPDATE_0(prob); + distance = rep2; + } + else + { + UPDATE_1(prob); + distance = rep3; + rep3 = rep2; + } + rep2 = rep1; + } + rep1 = rep0; + rep0 = distance; + } + state = state < kNumLitStates ? 8 : 11; + prob = probs + RepLenCoder; + } + + #ifdef _LZMA_SIZE_OPT + { + unsigned lim, offset; + CLzmaProb *probLen = prob + LenChoice; + IF_BIT_0(probLen) + { + UPDATE_0(probLen); + probLen = prob + LenLow + (posState << kLenNumLowBits); + offset = 0; + lim = (1 << kLenNumLowBits); + } + else + { + UPDATE_1(probLen); + probLen = prob + LenChoice2; + IF_BIT_0(probLen) + { + UPDATE_0(probLen); + probLen = prob + LenMid + (posState << kLenNumMidBits); + offset = kLenNumLowSymbols; + lim = (1 << kLenNumMidBits); + } + else + { + UPDATE_1(probLen); + probLen = prob + LenHigh; + offset = kLenNumLowSymbols + kLenNumMidSymbols; + lim = (1 << kLenNumHighBits); + } + } + TREE_DECODE(probLen, lim, len); + len += offset; + } + #else + { + CLzmaProb *probLen = prob + LenChoice; + IF_BIT_0(probLen) + { + UPDATE_0(probLen); + probLen = prob + LenLow + (posState << kLenNumLowBits); + len = 1; + TREE_GET_BIT(probLen, len); + TREE_GET_BIT(probLen, len); + TREE_GET_BIT(probLen, len); + len -= 8; + } + else + { + UPDATE_1(probLen); + probLen = prob + LenChoice2; + IF_BIT_0(probLen) + { + UPDATE_0(probLen); + probLen = prob + LenMid + (posState << kLenNumMidBits); + len = 1; + TREE_GET_BIT(probLen, len); + TREE_GET_BIT(probLen, len); + TREE_GET_BIT(probLen, len); + } + else + { + UPDATE_1(probLen); + probLen = prob + LenHigh; + TREE_DECODE(probLen, (1 << kLenNumHighBits), len); + len += kLenNumLowSymbols + kLenNumMidSymbols; + } + } + } + #endif + + if (state >= kNumStates) + { + UInt32 distance; + prob = probs + PosSlot + + ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) << kNumPosSlotBits); + TREE_6_DECODE(prob, distance); + if (distance >= kStartPosModelIndex) + { + unsigned posSlot = (unsigned)distance; + unsigned numDirectBits = (unsigned)(((distance >> 1) - 1)); + distance = (2 | (distance & 1)); + if (posSlot < kEndPosModelIndex) + { + distance <<= numDirectBits; + prob = probs + SpecPos + distance - posSlot - 1; + { + UInt32 mask = 1; + unsigned i = 1; + do + { + GET_BIT2(prob + i, i, ; , distance |= mask); + mask <<= 1; + } + while (--numDirectBits != 0); + } + } + else + { + numDirectBits -= kNumAlignBits; + do + { + NORMALIZE + range >>= 1; + + { + UInt32 t; + code -= range; + t = (0 - ((UInt32)code >> 31)); /* (UInt32)((Int32)code >> 31) */ + distance = (distance << 1) + (t + 1); + code += range & t; + } + /* + distance <<= 1; + if (code >= range) + { + code -= range; + distance |= 1; + } + */ + } + while (--numDirectBits != 0); + prob = probs + Align; + distance <<= kNumAlignBits; + { + unsigned i = 1; + GET_BIT2(prob + i, i, ; , distance |= 1); + GET_BIT2(prob + i, i, ; , distance |= 2); + GET_BIT2(prob + i, i, ; , distance |= 4); + GET_BIT2(prob + i, i, ; , distance |= 8); + } + if (distance == (UInt32)0xFFFFFFFF) + { + len += kMatchSpecLenStart; + state -= kNumStates; + break; + } + } + } + + rep3 = rep2; + rep2 = rep1; + rep1 = rep0; + rep0 = distance + 1; + if (checkDicSize == 0) + { + if (distance >= processedPos) + { + p->dicPos = dicPos; + return SZ_ERROR_DATA; + } + } + else if (distance >= checkDicSize) + { + p->dicPos = dicPos; + return SZ_ERROR_DATA; + } + state = (state < kNumStates + kNumLitStates) ? kNumLitStates : kNumLitStates + 3; + } + + len += kMatchMinLen; + + { + SizeT rem; + unsigned curLen; + SizeT pos; + + if ((rem = limit - dicPos) == 0) + { + p->dicPos = dicPos; + return SZ_ERROR_DATA; + } + + curLen = ((rem < len) ? (unsigned)rem : len); + pos = dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0); + + processedPos += curLen; + + len -= curLen; + if (curLen <= dicBufSize - pos) + { + Byte *dest = dic + dicPos; + ptrdiff_t src = (ptrdiff_t)pos - (ptrdiff_t)dicPos; + const Byte *lim = dest + curLen; + dicPos += curLen; + do + *(dest) = (Byte)*(dest + src); + while (++dest != lim); + } + else + { + do + { + dic[dicPos++] = dic[pos]; + if (++pos == dicBufSize) + pos = 0; + } + while (--curLen != 0); + } + } + } + } + while (dicPos < limit && buf < bufLimit); + + NORMALIZE; + + p->buf = buf; + p->range = range; + p->code = code; + p->remainLen = len; + p->dicPos = dicPos; + p->processedPos = processedPos; + p->reps[0] = rep0; + p->reps[1] = rep1; + p->reps[2] = rep2; + p->reps[3] = rep3; + p->state = state; + + return SZ_OK; +} + +static void MY_FAST_CALL LzmaDec_WriteRem(CLzmaDec *p, SizeT limit) +{ + if (p->remainLen != 0 && p->remainLen < kMatchSpecLenStart) + { + Byte *dic = p->dic; + SizeT dicPos = p->dicPos; + SizeT dicBufSize = p->dicBufSize; + unsigned len = p->remainLen; + SizeT rep0 = p->reps[0]; /* we use SizeT to avoid the BUG of VC14 for AMD64 */ + SizeT rem = limit - dicPos; + if (rem < len) + len = (unsigned)(rem); + + if (p->checkDicSize == 0 && p->prop.dicSize - p->processedPos <= len) + p->checkDicSize = p->prop.dicSize; + + p->processedPos += len; + p->remainLen -= len; + while (len != 0) + { + len--; + dic[dicPos] = dic[dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0)]; + dicPos++; + } + p->dicPos = dicPos; + } +} + +static int MY_FAST_CALL LzmaDec_DecodeReal2(CLzmaDec *p, SizeT limit, const Byte *bufLimit) +{ + do + { + SizeT limit2 = limit; + if (p->checkDicSize == 0) + { + UInt32 rem = p->prop.dicSize - p->processedPos; + if (limit - p->dicPos > rem) + limit2 = p->dicPos + rem; + } + + RINOK(LzmaDec_DecodeReal(p, limit2, bufLimit)); + + if (p->checkDicSize == 0 && p->processedPos >= p->prop.dicSize) + p->checkDicSize = p->prop.dicSize; + + LzmaDec_WriteRem(p, limit); + } + while (p->dicPos < limit && p->buf < bufLimit && p->remainLen < kMatchSpecLenStart); + + if (p->remainLen > kMatchSpecLenStart) + p->remainLen = kMatchSpecLenStart; + + return 0; +} + +typedef enum +{ + DUMMY_ERROR, /* unexpected end of input stream */ + DUMMY_LIT, + DUMMY_MATCH, + DUMMY_REP +} ELzmaDummy; + +static ELzmaDummy LzmaDec_TryDummy(const CLzmaDec *p, const Byte *buf, SizeT inSize) +{ + UInt32 range = p->range; + UInt32 code = p->code; + const Byte *bufLimit = buf + inSize; + const CLzmaProb *probs = p->probs; + unsigned state = p->state; + ELzmaDummy res; + + { + const CLzmaProb *prob; + UInt32 bound; + unsigned ttt; + unsigned posState = (p->processedPos) & ((1 << p->prop.pb) - 1); + + prob = probs + IsMatch + (state << kNumPosBitsMax) + posState; + IF_BIT_0_CHECK(prob) + { + UPDATE_0_CHECK + + /* if (bufLimit - buf >= 7) return DUMMY_LIT; */ + + prob = probs + Literal; + if (p->checkDicSize != 0 || p->processedPos != 0) + prob += ((UInt32)LZMA_LIT_SIZE * + ((((p->processedPos) & ((1 << (p->prop.lp)) - 1)) << p->prop.lc) + + (p->dic[(p->dicPos == 0 ? p->dicBufSize : p->dicPos) - 1] >> (8 - p->prop.lc)))); + + if (state < kNumLitStates) + { + unsigned symbol = 1; + do { GET_BIT_CHECK(prob + symbol, symbol) } while (symbol < 0x100); + } + else + { + unsigned matchByte = p->dic[p->dicPos - p->reps[0] + + (p->dicPos < p->reps[0] ? p->dicBufSize : 0)]; + unsigned offs = 0x100; + unsigned symbol = 1; + do + { + unsigned bit; + const CLzmaProb *probLit; + matchByte <<= 1; + bit = (matchByte & offs); + probLit = prob + offs + bit + symbol; + GET_BIT2_CHECK(probLit, symbol, offs &= ~bit, offs &= bit) + } + while (symbol < 0x100); + } + res = DUMMY_LIT; + } + else + { + unsigned len; + UPDATE_1_CHECK; + + prob = probs + IsRep + state; + IF_BIT_0_CHECK(prob) + { + UPDATE_0_CHECK; + state = 0; + prob = probs + LenCoder; + res = DUMMY_MATCH; + } + else + { + UPDATE_1_CHECK; + res = DUMMY_REP; + prob = probs + IsRepG0 + state; + IF_BIT_0_CHECK(prob) + { + UPDATE_0_CHECK; + prob = probs + IsRep0Long + (state << kNumPosBitsMax) + posState; + IF_BIT_0_CHECK(prob) + { + UPDATE_0_CHECK; + NORMALIZE_CHECK; + return DUMMY_REP; + } + else + { + UPDATE_1_CHECK; + } + } + else + { + UPDATE_1_CHECK; + prob = probs + IsRepG1 + state; + IF_BIT_0_CHECK(prob) + { + UPDATE_0_CHECK; + } + else + { + UPDATE_1_CHECK; + prob = probs + IsRepG2 + state; + IF_BIT_0_CHECK(prob) + { + UPDATE_0_CHECK; + } + else + { + UPDATE_1_CHECK; + } + } + } + state = kNumStates; + prob = probs + RepLenCoder; + } + { + unsigned limit, offset; + const CLzmaProb *probLen = prob + LenChoice; + IF_BIT_0_CHECK(probLen) + { + UPDATE_0_CHECK; + probLen = prob + LenLow + (posState << kLenNumLowBits); + offset = 0; + limit = 1 << kLenNumLowBits; + } + else + { + UPDATE_1_CHECK; + probLen = prob + LenChoice2; + IF_BIT_0_CHECK(probLen) + { + UPDATE_0_CHECK; + probLen = prob + LenMid + (posState << kLenNumMidBits); + offset = kLenNumLowSymbols; + limit = 1 << kLenNumMidBits; + } + else + { + UPDATE_1_CHECK; + probLen = prob + LenHigh; + offset = kLenNumLowSymbols + kLenNumMidSymbols; + limit = 1 << kLenNumHighBits; + } + } + TREE_DECODE_CHECK(probLen, limit, len); + len += offset; + } + + if (state < 4) + { + unsigned posSlot; + prob = probs + PosSlot + + ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) << + kNumPosSlotBits); + TREE_DECODE_CHECK(prob, 1 << kNumPosSlotBits, posSlot); + if (posSlot >= kStartPosModelIndex) + { + unsigned numDirectBits = ((posSlot >> 1) - 1); + + /* if (bufLimit - buf >= 8) return DUMMY_MATCH; */ + + if (posSlot < kEndPosModelIndex) + { + prob = probs + SpecPos + ((2 | (posSlot & 1)) << numDirectBits) - posSlot - 1; + } + else + { + numDirectBits -= kNumAlignBits; + do + { + NORMALIZE_CHECK + range >>= 1; + code -= range & (((code - range) >> 31) - 1); + /* if (code >= range) code -= range; */ + } + while (--numDirectBits != 0); + prob = probs + Align; + numDirectBits = kNumAlignBits; + } + { + unsigned i = 1; + do + { + GET_BIT_CHECK(prob + i, i); + } + while (--numDirectBits != 0); + } + } + } + } + } + NORMALIZE_CHECK; + return res; +} + + +void LzmaDec_InitDicAndState(CLzmaDec *p, Bool initDic, Bool initState) +{ + p->needFlush = 1; + p->remainLen = 0; + p->tempBufSize = 0; + + if (initDic) + { + p->processedPos = 0; + p->checkDicSize = 0; + p->needInitState = 1; + } + if (initState) + p->needInitState = 1; +} + +void LzmaDec_Init(CLzmaDec *p) +{ + p->dicPos = 0; + LzmaDec_InitDicAndState(p, True, True); +} + +static void LzmaDec_InitStateReal(CLzmaDec *p) +{ + SizeT numProbs = LzmaProps_GetNumProbs(&p->prop); + SizeT i; + CLzmaProb *probs = p->probs; + for (i = 0; i < numProbs; i++) + probs[i] = kBitModelTotal >> 1; + p->reps[0] = p->reps[1] = p->reps[2] = p->reps[3] = 1; + p->state = 0; + p->needInitState = 0; +} + +SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *srcLen, + ELzmaFinishMode finishMode, ELzmaStatus *status) +{ + SizeT inSize = *srcLen; + (*srcLen) = 0; + LzmaDec_WriteRem(p, dicLimit); + + *status = LZMA_STATUS_NOT_SPECIFIED; + + while (p->remainLen != kMatchSpecLenStart) + { + int checkEndMarkNow; + + if (p->needFlush) + { + for (; inSize > 0 && p->tempBufSize < RC_INIT_SIZE; (*srcLen)++, inSize--) + p->tempBuf[p->tempBufSize++] = *src++; + if (p->tempBufSize < RC_INIT_SIZE) + { + *status = LZMA_STATUS_NEEDS_MORE_INPUT; + return SZ_OK; + } + if (p->tempBuf[0] != 0) + return SZ_ERROR_DATA; + p->code = + ((UInt32)p->tempBuf[1] << 24) + | ((UInt32)p->tempBuf[2] << 16) + | ((UInt32)p->tempBuf[3] << 8) + | ((UInt32)p->tempBuf[4]); + p->range = 0xFFFFFFFF; + p->needFlush = 0; + p->tempBufSize = 0; + } + + checkEndMarkNow = 0; + if (p->dicPos >= dicLimit) + { + if (p->remainLen == 0 && p->code == 0) + { + *status = LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK; + return SZ_OK; + } + if (finishMode == LZMA_FINISH_ANY) + { + *status = LZMA_STATUS_NOT_FINISHED; + return SZ_OK; + } + if (p->remainLen != 0) + { + *status = LZMA_STATUS_NOT_FINISHED; + return SZ_ERROR_DATA; + } + checkEndMarkNow = 1; + } + + if (p->needInitState) + LzmaDec_InitStateReal(p); + + if (p->tempBufSize == 0) + { + SizeT processed; + const Byte *bufLimit; + if (inSize < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow) + { + int dummyRes = LzmaDec_TryDummy(p, src, inSize); + if (dummyRes == DUMMY_ERROR) + { + memcpy(p->tempBuf, src, inSize); + p->tempBufSize = (unsigned)inSize; + (*srcLen) += inSize; + *status = LZMA_STATUS_NEEDS_MORE_INPUT; + return SZ_OK; + } + if (checkEndMarkNow && dummyRes != DUMMY_MATCH) + { + *status = LZMA_STATUS_NOT_FINISHED; + return SZ_ERROR_DATA; + } + bufLimit = src; + } + else + bufLimit = src + inSize - LZMA_REQUIRED_INPUT_MAX; + p->buf = src; + if (LzmaDec_DecodeReal2(p, dicLimit, bufLimit) != 0) + return SZ_ERROR_DATA; + processed = (SizeT)(p->buf - src); + (*srcLen) += processed; + src += processed; + inSize -= processed; + } + else + { + unsigned rem = p->tempBufSize, lookAhead = 0; + while (rem < LZMA_REQUIRED_INPUT_MAX && lookAhead < inSize) + p->tempBuf[rem++] = src[lookAhead++]; + p->tempBufSize = rem; + if (rem < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow) + { + int dummyRes = LzmaDec_TryDummy(p, p->tempBuf, rem); + if (dummyRes == DUMMY_ERROR) + { + (*srcLen) += lookAhead; + *status = LZMA_STATUS_NEEDS_MORE_INPUT; + return SZ_OK; + } + if (checkEndMarkNow && dummyRes != DUMMY_MATCH) + { + *status = LZMA_STATUS_NOT_FINISHED; + return SZ_ERROR_DATA; + } + } + p->buf = p->tempBuf; + if (LzmaDec_DecodeReal2(p, dicLimit, p->buf) != 0) + return SZ_ERROR_DATA; + + { + unsigned kkk = (unsigned)(p->buf - p->tempBuf); + if (rem < kkk) + return SZ_ERROR_FAIL; /* some internal error */ + rem -= kkk; + if (lookAhead < rem) + return SZ_ERROR_FAIL; /* some internal error */ + lookAhead -= rem; + } + (*srcLen) += lookAhead; + src += lookAhead; + inSize -= lookAhead; + p->tempBufSize = 0; + } + } + if (p->code == 0) + *status = LZMA_STATUS_FINISHED_WITH_MARK; + return (p->code == 0) ? SZ_OK : SZ_ERROR_DATA; +} + +SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status) +{ + SizeT outSize = *destLen; + SizeT inSize = *srcLen; + *srcLen = *destLen = 0; + for (;;) + { + SizeT inSizeCur = inSize, outSizeCur, dicPos; + ELzmaFinishMode curFinishMode; + SRes res; + if (p->dicPos == p->dicBufSize) + p->dicPos = 0; + dicPos = p->dicPos; + if (outSize > p->dicBufSize - dicPos) + { + outSizeCur = p->dicBufSize; + curFinishMode = LZMA_FINISH_ANY; + } + else + { + outSizeCur = dicPos + outSize; + curFinishMode = finishMode; + } + + res = LzmaDec_DecodeToDic(p, outSizeCur, src, &inSizeCur, curFinishMode, status); + src += inSizeCur; + inSize -= inSizeCur; + *srcLen += inSizeCur; + outSizeCur = p->dicPos - dicPos; + memcpy(dest, p->dic + dicPos, outSizeCur); + dest += outSizeCur; + outSize -= outSizeCur; + *destLen += outSizeCur; + if (res != 0) + return res; + if (outSizeCur == 0 || outSize == 0) + return SZ_OK; + } +} + +void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc) +{ + alloc->Free(alloc, p->probs); + p->probs = NULL; +} + +static void LzmaDec_FreeDict(CLzmaDec *p, ISzAlloc *alloc) +{ + alloc->Free(alloc, p->dic); + p->dic = NULL; +} + +void LzmaDec_Free(CLzmaDec *p, ISzAlloc *alloc) +{ + LzmaDec_FreeProbs(p, alloc); + LzmaDec_FreeDict(p, alloc); +} + +SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size) +{ + UInt32 dicSize; + Byte d; + + if (size < LZMA_PROPS_SIZE) + return SZ_ERROR_UNSUPPORTED; + else + dicSize = data[1] | ((UInt32)data[2] << 8) | ((UInt32)data[3] << 16) | ((UInt32)data[4] << 24); + + if (dicSize < LZMA_DIC_MIN) + dicSize = LZMA_DIC_MIN; + p->dicSize = dicSize; + + d = data[0]; + if (d >= (9 * 5 * 5)) + return SZ_ERROR_UNSUPPORTED; + + p->lc = d % 9; + d /= 9; + p->pb = d / 5; + p->lp = d % 5; + + return SZ_OK; +} + +static SRes LzmaDec_AllocateProbs2(CLzmaDec *p, const CLzmaProps *propNew, ISzAlloc *alloc) +{ + UInt32 numProbs = LzmaProps_GetNumProbs(propNew); + if (!p->probs || numProbs != p->numProbs) + { + LzmaDec_FreeProbs(p, alloc); + p->probs = (CLzmaProb *)alloc->Alloc(alloc, numProbs * sizeof(CLzmaProb)); + p->numProbs = numProbs; + if (!p->probs) + return SZ_ERROR_MEM; + } + return SZ_OK; +} + +SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc) +{ + CLzmaProps propNew; + RINOK(LzmaProps_Decode(&propNew, props, propsSize)); + RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc)); + p->prop = propNew; + return SZ_OK; +} + +SRes LzmaDec_Allocate(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc) +{ + CLzmaProps propNew; + SizeT dicBufSize; + RINOK(LzmaProps_Decode(&propNew, props, propsSize)); + RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc)); + + { + UInt32 dictSize = propNew.dicSize; + SizeT mask = ((UInt32)1 << 12) - 1; + if (dictSize >= ((UInt32)1 << 30)) mask = ((UInt32)1 << 22) - 1; + else if (dictSize >= ((UInt32)1 << 22)) mask = ((UInt32)1 << 20) - 1;; + dicBufSize = ((SizeT)dictSize + mask) & ~mask; + if (dicBufSize < dictSize) + dicBufSize = dictSize; + } + + if (!p->dic || dicBufSize != p->dicBufSize) + { + LzmaDec_FreeDict(p, alloc); + p->dic = (Byte *)alloc->Alloc(alloc, dicBufSize); + if (!p->dic) + { + LzmaDec_FreeProbs(p, alloc); + return SZ_ERROR_MEM; + } + } + p->dicBufSize = dicBufSize; + p->prop = propNew; + return SZ_OK; +} + +SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, + const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode, + ELzmaStatus *status, ISzAlloc *alloc) +{ + CLzmaDec p; + SRes res; + SizeT outSize = *destLen, inSize = *srcLen; + *destLen = *srcLen = 0; + *status = LZMA_STATUS_NOT_SPECIFIED; + if (inSize < RC_INIT_SIZE) + return SZ_ERROR_INPUT_EOF; + LzmaDec_Construct(&p); + RINOK(LzmaDec_AllocateProbs(&p, propData, propSize, alloc)); + p.dic = dest; + p.dicBufSize = outSize; + LzmaDec_Init(&p); + *srcLen = inSize; + res = LzmaDec_DecodeToDic(&p, outSize, src, srcLen, finishMode, status); + *destLen = p.dicPos; + if (res == SZ_OK && *status == LZMA_STATUS_NEEDS_MORE_INPUT) + res = SZ_ERROR_INPUT_EOF; + LzmaDec_FreeProbs(&p, alloc); + return res; +} diff --git a/core/cd_hw/libchdr/deps/lzma/LzmaDec.h b/core/cd_hw/libchdr/deps/lzma/LzmaDec.h new file mode 100644 index 0000000..cc44dae --- /dev/null +++ b/core/cd_hw/libchdr/deps/lzma/LzmaDec.h @@ -0,0 +1,227 @@ +/* LzmaDec.h -- LZMA Decoder +2013-01-18 : Igor Pavlov : Public domain */ + +#ifndef __LZMA_DEC_H +#define __LZMA_DEC_H + +#include "7zTypes.h" + +EXTERN_C_BEGIN + +/* #define _LZMA_PROB32 */ +/* _LZMA_PROB32 can increase the speed on some CPUs, + but memory usage for CLzmaDec::probs will be doubled in that case */ + +#ifdef _LZMA_PROB32 +#define CLzmaProb UInt32 +#else +#define CLzmaProb UInt16 +#endif + + +/* ---------- LZMA Properties ---------- */ + +#define LZMA_PROPS_SIZE 5 + +typedef struct _CLzmaProps +{ + unsigned lc, lp, pb; + UInt32 dicSize; +} CLzmaProps; + +/* LzmaProps_Decode - decodes properties +Returns: + SZ_OK + SZ_ERROR_UNSUPPORTED - Unsupported properties +*/ + +SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size); + + +/* ---------- LZMA Decoder state ---------- */ + +/* LZMA_REQUIRED_INPUT_MAX = number of required input bytes for worst case. + Num bits = log2((2^11 / 31) ^ 22) + 26 < 134 + 26 = 160; */ + +#define LZMA_REQUIRED_INPUT_MAX 20 + +typedef struct +{ + CLzmaProps prop; + CLzmaProb *probs; + Byte *dic; + const Byte *buf; + UInt32 range, code; + SizeT dicPos; + SizeT dicBufSize; + UInt32 processedPos; + UInt32 checkDicSize; + unsigned state; + UInt32 reps[4]; + unsigned remainLen; + int needFlush; + int needInitState; + UInt32 numProbs; + unsigned tempBufSize; + Byte tempBuf[LZMA_REQUIRED_INPUT_MAX]; +} CLzmaDec; + +#define LzmaDec_Construct(p) { (p)->dic = 0; (p)->probs = 0; } + +void LzmaDec_Init(CLzmaDec *p); + +/* There are two types of LZMA streams: + 0) Stream with end mark. That end mark adds about 6 bytes to compressed size. + 1) Stream without end mark. You must know exact uncompressed size to decompress such stream. */ + +typedef enum +{ + LZMA_FINISH_ANY, /* finish at any point */ + LZMA_FINISH_END /* block must be finished at the end */ +} ELzmaFinishMode; + +/* ELzmaFinishMode has meaning only if the decoding reaches output limit !!! + + You must use LZMA_FINISH_END, when you know that current output buffer + covers last bytes of block. In other cases you must use LZMA_FINISH_ANY. + + If LZMA decoder sees end marker before reaching output limit, it returns SZ_OK, + and output value of destLen will be less than output buffer size limit. + You can check status result also. + + You can use multiple checks to test data integrity after full decompression: + 1) Check Result and "status" variable. + 2) Check that output(destLen) = uncompressedSize, if you know real uncompressedSize. + 3) Check that output(srcLen) = compressedSize, if you know real compressedSize. + You must use correct finish mode in that case. */ + +typedef enum +{ + LZMA_STATUS_NOT_SPECIFIED, /* use main error code instead */ + LZMA_STATUS_FINISHED_WITH_MARK, /* stream was finished with end mark. */ + LZMA_STATUS_NOT_FINISHED, /* stream was not finished */ + LZMA_STATUS_NEEDS_MORE_INPUT, /* you must provide more input bytes */ + LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK /* there is probability that stream was finished without end mark */ +} ELzmaStatus; + +/* ELzmaStatus is used only as output value for function call */ + + +/* ---------- Interfaces ---------- */ + +/* There are 3 levels of interfaces: + 1) Dictionary Interface + 2) Buffer Interface + 3) One Call Interface + You can select any of these interfaces, but don't mix functions from different + groups for same object. */ + + +/* There are two variants to allocate state for Dictionary Interface: + 1) LzmaDec_Allocate / LzmaDec_Free + 2) LzmaDec_AllocateProbs / LzmaDec_FreeProbs + You can use variant 2, if you set dictionary buffer manually. + For Buffer Interface you must always use variant 1. + +LzmaDec_Allocate* can return: + SZ_OK + SZ_ERROR_MEM - Memory allocation error + SZ_ERROR_UNSUPPORTED - Unsupported properties +*/ + +SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc); +void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc); + +SRes LzmaDec_Allocate(CLzmaDec *state, const Byte *prop, unsigned propsSize, ISzAlloc *alloc); +void LzmaDec_Free(CLzmaDec *state, ISzAlloc *alloc); + +/* ---------- Dictionary Interface ---------- */ + +/* You can use it, if you want to eliminate the overhead for data copying from + dictionary to some other external buffer. + You must work with CLzmaDec variables directly in this interface. + + STEPS: + LzmaDec_Constr() + LzmaDec_Allocate() + for (each new stream) + { + LzmaDec_Init() + while (it needs more decompression) + { + LzmaDec_DecodeToDic() + use data from CLzmaDec::dic and update CLzmaDec::dicPos + } + } + LzmaDec_Free() +*/ + +/* LzmaDec_DecodeToDic + + The decoding to internal dictionary buffer (CLzmaDec::dic). + You must manually update CLzmaDec::dicPos, if it reaches CLzmaDec::dicBufSize !!! + +finishMode: + It has meaning only if the decoding reaches output limit (dicLimit). + LZMA_FINISH_ANY - Decode just dicLimit bytes. + LZMA_FINISH_END - Stream must be finished after dicLimit. + +Returns: + SZ_OK + status: + LZMA_STATUS_FINISHED_WITH_MARK + LZMA_STATUS_NOT_FINISHED + LZMA_STATUS_NEEDS_MORE_INPUT + LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK + SZ_ERROR_DATA - Data error +*/ + +SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, + const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status); + + +/* ---------- Buffer Interface ---------- */ + +/* It's zlib-like interface. + See LzmaDec_DecodeToDic description for information about STEPS and return results, + but you must use LzmaDec_DecodeToBuf instead of LzmaDec_DecodeToDic and you don't need + to work with CLzmaDec variables manually. + +finishMode: + It has meaning only if the decoding reaches output limit (*destLen). + LZMA_FINISH_ANY - Decode just destLen bytes. + LZMA_FINISH_END - Stream must be finished after (*destLen). +*/ + +SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, + const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status); + + +/* ---------- One Call Interface ---------- */ + +/* LzmaDecode + +finishMode: + It has meaning only if the decoding reaches output limit (*destLen). + LZMA_FINISH_ANY - Decode just destLen bytes. + LZMA_FINISH_END - Stream must be finished after (*destLen). + +Returns: + SZ_OK + status: + LZMA_STATUS_FINISHED_WITH_MARK + LZMA_STATUS_NOT_FINISHED + LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK + SZ_ERROR_DATA - Data error + SZ_ERROR_MEM - Memory allocation error + SZ_ERROR_UNSUPPORTED - Unsupported properties + SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src). +*/ + +SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, + const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode, + ELzmaStatus *status, ISzAlloc *alloc); + +EXTERN_C_END + +#endif diff --git a/core/cd_hw/libchdr/deps/lzma/LzmaEnc.c b/core/cd_hw/libchdr/deps/lzma/LzmaEnc.c new file mode 100644 index 0000000..70df456 --- /dev/null +++ b/core/cd_hw/libchdr/deps/lzma/LzmaEnc.c @@ -0,0 +1,2351 @@ +/* LzmaEnc.c -- LZMA Encoder +2016-05-16 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include + +/* #define SHOW_STAT */ +/* #define SHOW_STAT2 */ + +#if defined(SHOW_STAT) || defined(SHOW_STAT2) +#include +#endif + +#include "LzmaEnc.h" + +#include "LzFind.h" +#ifndef _7ZIP_ST +#include "LzFindMt.h" +#endif + +#ifdef SHOW_STAT +static unsigned g_STAT_OFFSET = 0; +#endif + +#define kMaxHistorySize ((UInt32)3 << 29) +/* #define kMaxHistorySize ((UInt32)7 << 29) */ + +#define kBlockSizeMax ((1 << LZMA_NUM_BLOCK_SIZE_BITS) - 1) + +#define kBlockSize (9 << 10) +#define kUnpackBlockSize (1 << 18) +#define kMatchArraySize (1 << 21) +#define kMatchRecordMaxSize ((LZMA_MATCH_LEN_MAX * 2 + 3) * LZMA_MATCH_LEN_MAX) + +#define kNumMaxDirectBits (31) + +#define kNumTopBits 24 +#define kTopValue ((UInt32)1 << kNumTopBits) + +#define kNumBitModelTotalBits 11 +#define kBitModelTotal (1 << kNumBitModelTotalBits) +#define kNumMoveBits 5 +#define kProbInitValue (kBitModelTotal >> 1) + +#define kNumMoveReducingBits 4 +#define kNumBitPriceShiftBits 4 +#define kBitPrice (1 << kNumBitPriceShiftBits) + +void LzmaEncProps_Init(CLzmaEncProps *p) +{ + p->level = 5; + p->dictSize = p->mc = 0; + p->reduceSize = (UInt64)(Int64)-1; + p->lc = p->lp = p->pb = p->algo = p->fb = p->btMode = p->numHashBytes = p->numThreads = -1; + p->writeEndMark = 0; +} + +void LzmaEncProps_Normalize(CLzmaEncProps *p) +{ + int level = p->level; + if (level < 0) level = 5; + p->level = level; + + if (p->dictSize == 0) p->dictSize = (level <= 5 ? (1 << (level * 2 + 14)) : (level == 6 ? (1 << 25) : (1 << 26))); + if (p->dictSize > p->reduceSize) + { + unsigned i; + for (i = 11; i <= 30; i++) + { + if ((UInt32)p->reduceSize <= ((UInt32)2 << i)) { p->dictSize = ((UInt32)2 << i); break; } + if ((UInt32)p->reduceSize <= ((UInt32)3 << i)) { p->dictSize = ((UInt32)3 << i); break; } + } + } + + if (p->lc < 0) p->lc = 3; + if (p->lp < 0) p->lp = 0; + if (p->pb < 0) p->pb = 2; + + if (p->algo < 0) p->algo = (level < 5 ? 0 : 1); + if (p->fb < 0) p->fb = (level < 7 ? 32 : 64); + if (p->btMode < 0) p->btMode = (p->algo == 0 ? 0 : 1); + if (p->numHashBytes < 0) p->numHashBytes = 4; + if (p->mc == 0) p->mc = (16 + (p->fb >> 1)) >> (p->btMode ? 0 : 1); + + if (p->numThreads < 0) + p->numThreads = + #ifndef _7ZIP_ST + ((p->btMode && p->algo) ? 2 : 1); + #else + 1; + #endif +} + +UInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2) +{ + CLzmaEncProps props = *props2; + LzmaEncProps_Normalize(&props); + return props.dictSize; +} + +#if (_MSC_VER >= 1400) +/* BSR code is fast for some new CPUs */ +/* #define LZMA_LOG_BSR */ +#endif + +#ifdef LZMA_LOG_BSR + +#define kDicLogSizeMaxCompress 32 + +#define BSR2_RET(pos, res) { unsigned long zz; _BitScanReverse(&zz, (pos)); res = (zz + zz) + ((pos >> (zz - 1)) & 1); } + +static UInt32 GetPosSlot1(UInt32 pos) +{ + UInt32 res; + BSR2_RET(pos, res); + return res; +} +#define GetPosSlot2(pos, res) { BSR2_RET(pos, res); } +#define GetPosSlot(pos, res) { if (pos < 2) res = pos; else BSR2_RET(pos, res); } + +#else + +#define kNumLogBits (9 + sizeof(size_t) / 2) +/* #define kNumLogBits (11 + sizeof(size_t) / 8 * 3) */ + +#define kDicLogSizeMaxCompress ((kNumLogBits - 1) * 2 + 7) + +static void LzmaEnc_FastPosInit(Byte *g_FastPos) +{ + unsigned slot; + g_FastPos[0] = 0; + g_FastPos[1] = 1; + g_FastPos += 2; + + for (slot = 2; slot < kNumLogBits * 2; slot++) + { + size_t k = ((size_t)1 << ((slot >> 1) - 1)); + size_t j; + for (j = 0; j < k; j++) + g_FastPos[j] = (Byte)slot; + g_FastPos += k; + } +} + +/* we can use ((limit - pos) >> 31) only if (pos < ((UInt32)1 << 31)) */ +/* +#define BSR2_RET(pos, res) { UInt32 zz = 6 + ((kNumLogBits - 1) & \ + (0 - (((((UInt32)1 << (kNumLogBits + 6)) - 1) - pos) >> 31))); \ + res = p->g_FastPos[pos >> zz] + (zz * 2); } +*/ + +/* +#define BSR2_RET(pos, res) { UInt32 zz = 6 + ((kNumLogBits - 1) & \ + (0 - (((((UInt32)1 << (kNumLogBits)) - 1) - (pos >> 6)) >> 31))); \ + res = p->g_FastPos[pos >> zz] + (zz * 2); } +*/ + +#define BSR2_RET(pos, res) { UInt32 zz = (pos < (1 << (kNumLogBits + 6))) ? 6 : 6 + kNumLogBits - 1; \ + res = p->g_FastPos[pos >> zz] + (zz * 2); } + +/* +#define BSR2_RET(pos, res) { res = (pos < (1 << (kNumLogBits + 6))) ? \ + p->g_FastPos[pos >> 6] + 12 : \ + p->g_FastPos[pos >> (6 + kNumLogBits - 1)] + (6 + (kNumLogBits - 1)) * 2; } +*/ + +#define GetPosSlot1(pos) p->g_FastPos[pos] +#define GetPosSlot2(pos, res) { BSR2_RET(pos, res); } +#define GetPosSlot(pos, res) { if (pos < kNumFullDistances) res = p->g_FastPos[pos]; else BSR2_RET(pos, res); } + +#endif + + +#define LZMA_NUM_REPS 4 + +typedef unsigned CState; + +typedef struct +{ + UInt32 price; + + CState state; + int prev1IsChar; + int prev2; + + UInt32 posPrev2; + UInt32 backPrev2; + + UInt32 posPrev; + UInt32 backPrev; + UInt32 backs[LZMA_NUM_REPS]; +} COptimal; + +#define kNumOpts (1 << 12) + +#define kNumLenToPosStates 4 +#define kNumPosSlotBits 6 +#define kDicLogSizeMin 0 +#define kDicLogSizeMax 32 +#define kDistTableSizeMax (kDicLogSizeMax * 2) + + +#define kNumAlignBits 4 +#define kAlignTableSize (1 << kNumAlignBits) +#define kAlignMask (kAlignTableSize - 1) + +#define kStartPosModelIndex 4 +#define kEndPosModelIndex 14 +#define kNumPosModels (kEndPosModelIndex - kStartPosModelIndex) + +#define kNumFullDistances (1 << (kEndPosModelIndex >> 1)) + +#ifdef _LZMA_PROB32 +#define CLzmaProb UInt32 +#else +#define CLzmaProb UInt16 +#endif + +#define LZMA_PB_MAX 4 +#define LZMA_LC_MAX 8 +#define LZMA_LP_MAX 4 + +#define LZMA_NUM_PB_STATES_MAX (1 << LZMA_PB_MAX) + + +#define kLenNumLowBits 3 +#define kLenNumLowSymbols (1 << kLenNumLowBits) +#define kLenNumMidBits 3 +#define kLenNumMidSymbols (1 << kLenNumMidBits) +#define kLenNumHighBits 8 +#define kLenNumHighSymbols (1 << kLenNumHighBits) + +#define kLenNumSymbolsTotal (kLenNumLowSymbols + kLenNumMidSymbols + kLenNumHighSymbols) + +#define LZMA_MATCH_LEN_MIN 2 +#define LZMA_MATCH_LEN_MAX (LZMA_MATCH_LEN_MIN + kLenNumSymbolsTotal - 1) + +#define kNumStates 12 + + +typedef struct +{ + CLzmaProb choice; + CLzmaProb choice2; + CLzmaProb low[LZMA_NUM_PB_STATES_MAX << kLenNumLowBits]; + CLzmaProb mid[LZMA_NUM_PB_STATES_MAX << kLenNumMidBits]; + CLzmaProb high[kLenNumHighSymbols]; +} CLenEnc; + + +typedef struct +{ + CLenEnc p; + UInt32 tableSize; + UInt32 prices[LZMA_NUM_PB_STATES_MAX][kLenNumSymbolsTotal]; + UInt32 counters[LZMA_NUM_PB_STATES_MAX]; +} CLenPriceEnc; + + +typedef struct +{ + UInt32 range; + Byte cache; + UInt64 low; + UInt64 cacheSize; + Byte *buf; + Byte *bufLim; + Byte *bufBase; + ISeqOutStream *outStream; + UInt64 processed; + SRes res; +} CRangeEnc; + + +typedef struct +{ + CLzmaProb *litProbs; + + UInt32 state; + UInt32 reps[LZMA_NUM_REPS]; + + CLzmaProb isMatch[kNumStates][LZMA_NUM_PB_STATES_MAX]; + CLzmaProb isRep[kNumStates]; + CLzmaProb isRepG0[kNumStates]; + CLzmaProb isRepG1[kNumStates]; + CLzmaProb isRepG2[kNumStates]; + CLzmaProb isRep0Long[kNumStates][LZMA_NUM_PB_STATES_MAX]; + + CLzmaProb posSlotEncoder[kNumLenToPosStates][1 << kNumPosSlotBits]; + CLzmaProb posEncoders[kNumFullDistances - kEndPosModelIndex]; + CLzmaProb posAlignEncoder[1 << kNumAlignBits]; + + CLenPriceEnc lenEnc; + CLenPriceEnc repLenEnc; +} CSaveState; + + +typedef struct +{ + void *matchFinderObj; + IMatchFinder matchFinder; + + UInt32 optimumEndIndex; + UInt32 optimumCurrentIndex; + + UInt32 longestMatchLength; + UInt32 numPairs; + UInt32 numAvail; + + UInt32 numFastBytes; + UInt32 additionalOffset; + UInt32 reps[LZMA_NUM_REPS]; + UInt32 state; + + unsigned lc, lp, pb; + unsigned lpMask, pbMask; + unsigned lclp; + + CLzmaProb *litProbs; + + Bool fastMode; + Bool writeEndMark; + Bool finished; + Bool multiThread; + Bool needInit; + + UInt64 nowPos64; + + UInt32 matchPriceCount; + UInt32 alignPriceCount; + + UInt32 distTableSize; + + UInt32 dictSize; + SRes result; + + CRangeEnc rc; + + #ifndef _7ZIP_ST + Bool mtMode; + CMatchFinderMt matchFinderMt; + #endif + + CMatchFinder matchFinderBase; + + #ifndef _7ZIP_ST + Byte pad[128]; + #endif + + COptimal opt[kNumOpts]; + + #ifndef LZMA_LOG_BSR + Byte g_FastPos[1 << kNumLogBits]; + #endif + + UInt32 ProbPrices[kBitModelTotal >> kNumMoveReducingBits]; + UInt32 matches[LZMA_MATCH_LEN_MAX * 2 + 2 + 1]; + + UInt32 posSlotPrices[kNumLenToPosStates][kDistTableSizeMax]; + UInt32 distancesPrices[kNumLenToPosStates][kNumFullDistances]; + UInt32 alignPrices[kAlignTableSize]; + + CLzmaProb isMatch[kNumStates][LZMA_NUM_PB_STATES_MAX]; + CLzmaProb isRep[kNumStates]; + CLzmaProb isRepG0[kNumStates]; + CLzmaProb isRepG1[kNumStates]; + CLzmaProb isRepG2[kNumStates]; + CLzmaProb isRep0Long[kNumStates][LZMA_NUM_PB_STATES_MAX]; + + CLzmaProb posSlotEncoder[kNumLenToPosStates][1 << kNumPosSlotBits]; + CLzmaProb posEncoders[kNumFullDistances - kEndPosModelIndex]; + CLzmaProb posAlignEncoder[1 << kNumAlignBits]; + + CLenPriceEnc lenEnc; + CLenPriceEnc repLenEnc; + + CSaveState saveState; + + #ifndef _7ZIP_ST + Byte pad2[128]; + #endif +} CLzmaEnc; + + +void LzmaEnc_SaveState(CLzmaEncHandle pp) +{ + CLzmaEnc *p = (CLzmaEnc *)pp; + CSaveState *dest = &p->saveState; + int i; + dest->lenEnc = p->lenEnc; + dest->repLenEnc = p->repLenEnc; + dest->state = p->state; + + for (i = 0; i < kNumStates; i++) + { + memcpy(dest->isMatch[i], p->isMatch[i], sizeof(p->isMatch[i])); + memcpy(dest->isRep0Long[i], p->isRep0Long[i], sizeof(p->isRep0Long[i])); + } + for (i = 0; i < kNumLenToPosStates; i++) + memcpy(dest->posSlotEncoder[i], p->posSlotEncoder[i], sizeof(p->posSlotEncoder[i])); + memcpy(dest->isRep, p->isRep, sizeof(p->isRep)); + memcpy(dest->isRepG0, p->isRepG0, sizeof(p->isRepG0)); + memcpy(dest->isRepG1, p->isRepG1, sizeof(p->isRepG1)); + memcpy(dest->isRepG2, p->isRepG2, sizeof(p->isRepG2)); + memcpy(dest->posEncoders, p->posEncoders, sizeof(p->posEncoders)); + memcpy(dest->posAlignEncoder, p->posAlignEncoder, sizeof(p->posAlignEncoder)); + memcpy(dest->reps, p->reps, sizeof(p->reps)); + memcpy(dest->litProbs, p->litProbs, ((UInt32)0x300 << p->lclp) * sizeof(CLzmaProb)); +} + +void LzmaEnc_RestoreState(CLzmaEncHandle pp) +{ + CLzmaEnc *dest = (CLzmaEnc *)pp; + const CSaveState *p = &dest->saveState; + int i; + dest->lenEnc = p->lenEnc; + dest->repLenEnc = p->repLenEnc; + dest->state = p->state; + + for (i = 0; i < kNumStates; i++) + { + memcpy(dest->isMatch[i], p->isMatch[i], sizeof(p->isMatch[i])); + memcpy(dest->isRep0Long[i], p->isRep0Long[i], sizeof(p->isRep0Long[i])); + } + for (i = 0; i < kNumLenToPosStates; i++) + memcpy(dest->posSlotEncoder[i], p->posSlotEncoder[i], sizeof(p->posSlotEncoder[i])); + memcpy(dest->isRep, p->isRep, sizeof(p->isRep)); + memcpy(dest->isRepG0, p->isRepG0, sizeof(p->isRepG0)); + memcpy(dest->isRepG1, p->isRepG1, sizeof(p->isRepG1)); + memcpy(dest->isRepG2, p->isRepG2, sizeof(p->isRepG2)); + memcpy(dest->posEncoders, p->posEncoders, sizeof(p->posEncoders)); + memcpy(dest->posAlignEncoder, p->posAlignEncoder, sizeof(p->posAlignEncoder)); + memcpy(dest->reps, p->reps, sizeof(p->reps)); + memcpy(dest->litProbs, p->litProbs, ((UInt32)0x300 << dest->lclp) * sizeof(CLzmaProb)); +} + +SRes LzmaEnc_SetProps(CLzmaEncHandle pp, const CLzmaEncProps *props2) +{ + CLzmaEnc *p = (CLzmaEnc *)pp; + CLzmaEncProps props = *props2; + LzmaEncProps_Normalize(&props); + + if (props.lc > LZMA_LC_MAX + || props.lp > LZMA_LP_MAX + || props.pb > LZMA_PB_MAX + || props.dictSize > ((UInt64)1 << kDicLogSizeMaxCompress) + || props.dictSize > kMaxHistorySize) + return SZ_ERROR_PARAM; + + p->dictSize = props.dictSize; + { + unsigned fb = props.fb; + if (fb < 5) + fb = 5; + if (fb > LZMA_MATCH_LEN_MAX) + fb = LZMA_MATCH_LEN_MAX; + p->numFastBytes = fb; + } + p->lc = props.lc; + p->lp = props.lp; + p->pb = props.pb; + p->fastMode = (props.algo == 0); + p->matchFinderBase.btMode = (Byte)(props.btMode ? 1 : 0); + { + UInt32 numHashBytes = 4; + if (props.btMode) + { + if (props.numHashBytes < 2) + numHashBytes = 2; + else if (props.numHashBytes < 4) + numHashBytes = props.numHashBytes; + } + p->matchFinderBase.numHashBytes = numHashBytes; + } + + p->matchFinderBase.cutValue = props.mc; + + p->writeEndMark = props.writeEndMark; + + #ifndef _7ZIP_ST + /* + if (newMultiThread != _multiThread) + { + ReleaseMatchFinder(); + _multiThread = newMultiThread; + } + */ + p->multiThread = (props.numThreads > 1); + #endif + + return SZ_OK; +} + +static const int kLiteralNextStates[kNumStates] = {0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 4, 5}; +static const int kMatchNextStates[kNumStates] = {7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10}; +static const int kRepNextStates[kNumStates] = {8, 8, 8, 8, 8, 8, 8, 11, 11, 11, 11, 11}; +static const int kShortRepNextStates[kNumStates]= {9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 11, 11}; + +#define IsCharState(s) ((s) < 7) + +#define GetLenToPosState(len) (((len) < kNumLenToPosStates + 1) ? (len) - 2 : kNumLenToPosStates - 1) + +#define kInfinityPrice (1 << 30) + +static void RangeEnc_Construct(CRangeEnc *p) +{ + p->outStream = NULL; + p->bufBase = NULL; +} + +#define RangeEnc_GetProcessed(p) ((p)->processed + ((p)->buf - (p)->bufBase) + (p)->cacheSize) + +#define RC_BUF_SIZE (1 << 16) +static int RangeEnc_Alloc(CRangeEnc *p, ISzAlloc *alloc) +{ + if (!p->bufBase) + { + p->bufBase = (Byte *)alloc->Alloc(alloc, RC_BUF_SIZE); + if (!p->bufBase) + return 0; + p->bufLim = p->bufBase + RC_BUF_SIZE; + } + return 1; +} + +static void RangeEnc_Free(CRangeEnc *p, ISzAlloc *alloc) +{ + alloc->Free(alloc, p->bufBase); + p->bufBase = 0; +} + +static void RangeEnc_Init(CRangeEnc *p) +{ + /* Stream.Init(); */ + p->low = 0; + p->range = 0xFFFFFFFF; + p->cacheSize = 1; + p->cache = 0; + + p->buf = p->bufBase; + + p->processed = 0; + p->res = SZ_OK; +} + +static void RangeEnc_FlushStream(CRangeEnc *p) +{ + size_t num; + if (p->res != SZ_OK) + return; + num = p->buf - p->bufBase; + if (num != p->outStream->Write(p->outStream, p->bufBase, num)) + p->res = SZ_ERROR_WRITE; + p->processed += num; + p->buf = p->bufBase; +} + +static void MY_FAST_CALL RangeEnc_ShiftLow(CRangeEnc *p) +{ + if ((UInt32)p->low < (UInt32)0xFF000000 || (unsigned)(p->low >> 32) != 0) + { + Byte temp = p->cache; + do + { + Byte *buf = p->buf; + *buf++ = (Byte)(temp + (Byte)(p->low >> 32)); + p->buf = buf; + if (buf == p->bufLim) + RangeEnc_FlushStream(p); + temp = 0xFF; + } + while (--p->cacheSize != 0); + p->cache = (Byte)((UInt32)p->low >> 24); + } + p->cacheSize++; + p->low = (UInt32)p->low << 8; +} + +static void RangeEnc_FlushData(CRangeEnc *p) +{ + int i; + for (i = 0; i < 5; i++) + RangeEnc_ShiftLow(p); +} + +static void RangeEnc_EncodeDirectBits(CRangeEnc *p, UInt32 value, unsigned numBits) +{ + do + { + p->range >>= 1; + p->low += p->range & (0 - ((value >> --numBits) & 1)); + if (p->range < kTopValue) + { + p->range <<= 8; + RangeEnc_ShiftLow(p); + } + } + while (numBits != 0); +} + +static void RangeEnc_EncodeBit(CRangeEnc *p, CLzmaProb *prob, UInt32 symbol) +{ + UInt32 ttt = *prob; + UInt32 newBound = (p->range >> kNumBitModelTotalBits) * ttt; + if (symbol == 0) + { + p->range = newBound; + ttt += (kBitModelTotal - ttt) >> kNumMoveBits; + } + else + { + p->low += newBound; + p->range -= newBound; + ttt -= ttt >> kNumMoveBits; + } + *prob = (CLzmaProb)ttt; + if (p->range < kTopValue) + { + p->range <<= 8; + RangeEnc_ShiftLow(p); + } +} + +static void LitEnc_Encode(CRangeEnc *p, CLzmaProb *probs, UInt32 symbol) +{ + symbol |= 0x100; + do + { + RangeEnc_EncodeBit(p, probs + (symbol >> 8), (symbol >> 7) & 1); + symbol <<= 1; + } + while (symbol < 0x10000); +} + +static void LitEnc_EncodeMatched(CRangeEnc *p, CLzmaProb *probs, UInt32 symbol, UInt32 matchByte) +{ + UInt32 offs = 0x100; + symbol |= 0x100; + do + { + matchByte <<= 1; + RangeEnc_EncodeBit(p, probs + (offs + (matchByte & offs) + (symbol >> 8)), (symbol >> 7) & 1); + symbol <<= 1; + offs &= ~(matchByte ^ symbol); + } + while (symbol < 0x10000); +} + +static void LzmaEnc_InitPriceTables(UInt32 *ProbPrices) +{ + UInt32 i; + for (i = (1 << kNumMoveReducingBits) / 2; i < kBitModelTotal; i += (1 << kNumMoveReducingBits)) + { + const int kCyclesBits = kNumBitPriceShiftBits; + UInt32 w = i; + UInt32 bitCount = 0; + int j; + for (j = 0; j < kCyclesBits; j++) + { + w = w * w; + bitCount <<= 1; + while (w >= ((UInt32)1 << 16)) + { + w >>= 1; + bitCount++; + } + } + ProbPrices[i >> kNumMoveReducingBits] = ((kNumBitModelTotalBits << kCyclesBits) - 15 - bitCount); + } +} + + +#define GET_PRICE(prob, symbol) \ + p->ProbPrices[((prob) ^ (((-(int)(symbol))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits]; + +#define GET_PRICEa(prob, symbol) \ + ProbPrices[((prob) ^ ((-((int)(symbol))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits]; + +#define GET_PRICE_0(prob) p->ProbPrices[(prob) >> kNumMoveReducingBits] +#define GET_PRICE_1(prob) p->ProbPrices[((prob) ^ (kBitModelTotal - 1)) >> kNumMoveReducingBits] + +#define GET_PRICE_0a(prob) ProbPrices[(prob) >> kNumMoveReducingBits] +#define GET_PRICE_1a(prob) ProbPrices[((prob) ^ (kBitModelTotal - 1)) >> kNumMoveReducingBits] + +static UInt32 LitEnc_GetPrice(const CLzmaProb *probs, UInt32 symbol, const UInt32 *ProbPrices) +{ + UInt32 price = 0; + symbol |= 0x100; + do + { + price += GET_PRICEa(probs[symbol >> 8], (symbol >> 7) & 1); + symbol <<= 1; + } + while (symbol < 0x10000); + return price; +} + +static UInt32 LitEnc_GetPriceMatched(const CLzmaProb *probs, UInt32 symbol, UInt32 matchByte, const UInt32 *ProbPrices) +{ + UInt32 price = 0; + UInt32 offs = 0x100; + symbol |= 0x100; + do + { + matchByte <<= 1; + price += GET_PRICEa(probs[offs + (matchByte & offs) + (symbol >> 8)], (symbol >> 7) & 1); + symbol <<= 1; + offs &= ~(matchByte ^ symbol); + } + while (symbol < 0x10000); + return price; +} + + +static void RcTree_Encode(CRangeEnc *rc, CLzmaProb *probs, int numBitLevels, UInt32 symbol) +{ + UInt32 m = 1; + int i; + for (i = numBitLevels; i != 0;) + { + UInt32 bit; + i--; + bit = (symbol >> i) & 1; + RangeEnc_EncodeBit(rc, probs + m, bit); + m = (m << 1) | bit; + } +} + +static void RcTree_ReverseEncode(CRangeEnc *rc, CLzmaProb *probs, int numBitLevels, UInt32 symbol) +{ + UInt32 m = 1; + int i; + for (i = 0; i < numBitLevels; i++) + { + UInt32 bit = symbol & 1; + RangeEnc_EncodeBit(rc, probs + m, bit); + m = (m << 1) | bit; + symbol >>= 1; + } +} + +static UInt32 RcTree_GetPrice(const CLzmaProb *probs, int numBitLevels, UInt32 symbol, const UInt32 *ProbPrices) +{ + UInt32 price = 0; + symbol |= (1 << numBitLevels); + while (symbol != 1) + { + price += GET_PRICEa(probs[symbol >> 1], symbol & 1); + symbol >>= 1; + } + return price; +} + +static UInt32 RcTree_ReverseGetPrice(const CLzmaProb *probs, int numBitLevels, UInt32 symbol, const UInt32 *ProbPrices) +{ + UInt32 price = 0; + UInt32 m = 1; + int i; + for (i = numBitLevels; i != 0; i--) + { + UInt32 bit = symbol & 1; + symbol >>= 1; + price += GET_PRICEa(probs[m], bit); + m = (m << 1) | bit; + } + return price; +} + + +static void LenEnc_Init(CLenEnc *p) +{ + unsigned i; + p->choice = p->choice2 = kProbInitValue; + for (i = 0; i < (LZMA_NUM_PB_STATES_MAX << kLenNumLowBits); i++) + p->low[i] = kProbInitValue; + for (i = 0; i < (LZMA_NUM_PB_STATES_MAX << kLenNumMidBits); i++) + p->mid[i] = kProbInitValue; + for (i = 0; i < kLenNumHighSymbols; i++) + p->high[i] = kProbInitValue; +} + +static void LenEnc_Encode(CLenEnc *p, CRangeEnc *rc, UInt32 symbol, UInt32 posState) +{ + if (symbol < kLenNumLowSymbols) + { + RangeEnc_EncodeBit(rc, &p->choice, 0); + RcTree_Encode(rc, p->low + (posState << kLenNumLowBits), kLenNumLowBits, symbol); + } + else + { + RangeEnc_EncodeBit(rc, &p->choice, 1); + if (symbol < kLenNumLowSymbols + kLenNumMidSymbols) + { + RangeEnc_EncodeBit(rc, &p->choice2, 0); + RcTree_Encode(rc, p->mid + (posState << kLenNumMidBits), kLenNumMidBits, symbol - kLenNumLowSymbols); + } + else + { + RangeEnc_EncodeBit(rc, &p->choice2, 1); + RcTree_Encode(rc, p->high, kLenNumHighBits, symbol - kLenNumLowSymbols - kLenNumMidSymbols); + } + } +} + +static void LenEnc_SetPrices(CLenEnc *p, UInt32 posState, UInt32 numSymbols, UInt32 *prices, const UInt32 *ProbPrices) +{ + UInt32 a0 = GET_PRICE_0a(p->choice); + UInt32 a1 = GET_PRICE_1a(p->choice); + UInt32 b0 = a1 + GET_PRICE_0a(p->choice2); + UInt32 b1 = a1 + GET_PRICE_1a(p->choice2); + UInt32 i = 0; + for (i = 0; i < kLenNumLowSymbols; i++) + { + if (i >= numSymbols) + return; + prices[i] = a0 + RcTree_GetPrice(p->low + (posState << kLenNumLowBits), kLenNumLowBits, i, ProbPrices); + } + for (; i < kLenNumLowSymbols + kLenNumMidSymbols; i++) + { + if (i >= numSymbols) + return; + prices[i] = b0 + RcTree_GetPrice(p->mid + (posState << kLenNumMidBits), kLenNumMidBits, i - kLenNumLowSymbols, ProbPrices); + } + for (; i < numSymbols; i++) + prices[i] = b1 + RcTree_GetPrice(p->high, kLenNumHighBits, i - kLenNumLowSymbols - kLenNumMidSymbols, ProbPrices); +} + +static void MY_FAST_CALL LenPriceEnc_UpdateTable(CLenPriceEnc *p, UInt32 posState, const UInt32 *ProbPrices) +{ + LenEnc_SetPrices(&p->p, posState, p->tableSize, p->prices[posState], ProbPrices); + p->counters[posState] = p->tableSize; +} + +static void LenPriceEnc_UpdateTables(CLenPriceEnc *p, UInt32 numPosStates, const UInt32 *ProbPrices) +{ + UInt32 posState; + for (posState = 0; posState < numPosStates; posState++) + LenPriceEnc_UpdateTable(p, posState, ProbPrices); +} + +static void LenEnc_Encode2(CLenPriceEnc *p, CRangeEnc *rc, UInt32 symbol, UInt32 posState, Bool updatePrice, const UInt32 *ProbPrices) +{ + LenEnc_Encode(&p->p, rc, symbol, posState); + if (updatePrice) + if (--p->counters[posState] == 0) + LenPriceEnc_UpdateTable(p, posState, ProbPrices); +} + + + + +static void MovePos(CLzmaEnc *p, UInt32 num) +{ + #ifdef SHOW_STAT + g_STAT_OFFSET += num; + printf("\n MovePos %u", num); + #endif + + if (num != 0) + { + p->additionalOffset += num; + p->matchFinder.Skip(p->matchFinderObj, num); + } +} + +static UInt32 ReadMatchDistances(CLzmaEnc *p, UInt32 *numDistancePairsRes) +{ + UInt32 lenRes = 0, numPairs; + p->numAvail = p->matchFinder.GetNumAvailableBytes(p->matchFinderObj); + numPairs = p->matchFinder.GetMatches(p->matchFinderObj, p->matches); + + #ifdef SHOW_STAT + printf("\n i = %u numPairs = %u ", g_STAT_OFFSET, numPairs / 2); + g_STAT_OFFSET++; + { + UInt32 i; + for (i = 0; i < numPairs; i += 2) + printf("%2u %6u | ", p->matches[i], p->matches[i + 1]); + } + #endif + + if (numPairs > 0) + { + lenRes = p->matches[numPairs - 2]; + if (lenRes == p->numFastBytes) + { + UInt32 numAvail = p->numAvail; + if (numAvail > LZMA_MATCH_LEN_MAX) + numAvail = LZMA_MATCH_LEN_MAX; + { + const Byte *pbyCur = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; + const Byte *pby = pbyCur + lenRes; + ptrdiff_t dif = (ptrdiff_t)-1 - p->matches[numPairs - 1]; + const Byte *pbyLim = pbyCur + numAvail; + for (; pby != pbyLim && *pby == pby[dif]; pby++); + lenRes = (UInt32)(pby - pbyCur); + } + } + } + p->additionalOffset++; + *numDistancePairsRes = numPairs; + return lenRes; +} + + +#define MakeAsChar(p) (p)->backPrev = (UInt32)(-1); (p)->prev1IsChar = False; +#define MakeAsShortRep(p) (p)->backPrev = 0; (p)->prev1IsChar = False; +#define IsShortRep(p) ((p)->backPrev == 0) + +static UInt32 GetRepLen1Price(CLzmaEnc *p, UInt32 state, UInt32 posState) +{ + return + GET_PRICE_0(p->isRepG0[state]) + + GET_PRICE_0(p->isRep0Long[state][posState]); +} + +static UInt32 GetPureRepPrice(CLzmaEnc *p, UInt32 repIndex, UInt32 state, UInt32 posState) +{ + UInt32 price; + if (repIndex == 0) + { + price = GET_PRICE_0(p->isRepG0[state]); + price += GET_PRICE_1(p->isRep0Long[state][posState]); + } + else + { + price = GET_PRICE_1(p->isRepG0[state]); + if (repIndex == 1) + price += GET_PRICE_0(p->isRepG1[state]); + else + { + price += GET_PRICE_1(p->isRepG1[state]); + price += GET_PRICE(p->isRepG2[state], repIndex - 2); + } + } + return price; +} + +static UInt32 GetRepPrice(CLzmaEnc *p, UInt32 repIndex, UInt32 len, UInt32 state, UInt32 posState) +{ + return p->repLenEnc.prices[posState][len - LZMA_MATCH_LEN_MIN] + + GetPureRepPrice(p, repIndex, state, posState); +} + +static UInt32 Backward(CLzmaEnc *p, UInt32 *backRes, UInt32 cur) +{ + UInt32 posMem = p->opt[cur].posPrev; + UInt32 backMem = p->opt[cur].backPrev; + p->optimumEndIndex = cur; + do + { + if (p->opt[cur].prev1IsChar) + { + MakeAsChar(&p->opt[posMem]) + p->opt[posMem].posPrev = posMem - 1; + if (p->opt[cur].prev2) + { + p->opt[posMem - 1].prev1IsChar = False; + p->opt[posMem - 1].posPrev = p->opt[cur].posPrev2; + p->opt[posMem - 1].backPrev = p->opt[cur].backPrev2; + } + } + { + UInt32 posPrev = posMem; + UInt32 backCur = backMem; + + backMem = p->opt[posPrev].backPrev; + posMem = p->opt[posPrev].posPrev; + + p->opt[posPrev].backPrev = backCur; + p->opt[posPrev].posPrev = cur; + cur = posPrev; + } + } + while (cur != 0); + *backRes = p->opt[0].backPrev; + p->optimumCurrentIndex = p->opt[0].posPrev; + return p->optimumCurrentIndex; +} + +#define LIT_PROBS(pos, prevByte) (p->litProbs + ((((pos) & p->lpMask) << p->lc) + ((prevByte) >> (8 - p->lc))) * (UInt32)0x300) + +static UInt32 GetOptimum(CLzmaEnc *p, UInt32 position, UInt32 *backRes) +{ + UInt32 lenEnd, cur; + UInt32 reps[LZMA_NUM_REPS], repLens[LZMA_NUM_REPS]; + UInt32 *matches; + + { + + UInt32 numAvail, mainLen, numPairs, repMaxIndex, i, posState, len; + UInt32 matchPrice, repMatchPrice, normalMatchPrice; + const Byte *data; + Byte curByte, matchByte; + + if (p->optimumEndIndex != p->optimumCurrentIndex) + { + const COptimal *opt = &p->opt[p->optimumCurrentIndex]; + UInt32 lenRes = opt->posPrev - p->optimumCurrentIndex; + *backRes = opt->backPrev; + p->optimumCurrentIndex = opt->posPrev; + return lenRes; + } + p->optimumCurrentIndex = p->optimumEndIndex = 0; + + if (p->additionalOffset == 0) + mainLen = ReadMatchDistances(p, &numPairs); + else + { + mainLen = p->longestMatchLength; + numPairs = p->numPairs; + } + + numAvail = p->numAvail; + if (numAvail < 2) + { + *backRes = (UInt32)(-1); + return 1; + } + if (numAvail > LZMA_MATCH_LEN_MAX) + numAvail = LZMA_MATCH_LEN_MAX; + + data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; + repMaxIndex = 0; + for (i = 0; i < LZMA_NUM_REPS; i++) + { + UInt32 lenTest; + const Byte *data2; + reps[i] = p->reps[i]; + data2 = data - reps[i] - 1; + if (data[0] != data2[0] || data[1] != data2[1]) + { + repLens[i] = 0; + continue; + } + for (lenTest = 2; lenTest < numAvail && data[lenTest] == data2[lenTest]; lenTest++); + repLens[i] = lenTest; + if (lenTest > repLens[repMaxIndex]) + repMaxIndex = i; + } + if (repLens[repMaxIndex] >= p->numFastBytes) + { + UInt32 lenRes; + *backRes = repMaxIndex; + lenRes = repLens[repMaxIndex]; + MovePos(p, lenRes - 1); + return lenRes; + } + + matches = p->matches; + if (mainLen >= p->numFastBytes) + { + *backRes = matches[numPairs - 1] + LZMA_NUM_REPS; + MovePos(p, mainLen - 1); + return mainLen; + } + curByte = *data; + matchByte = *(data - (reps[0] + 1)); + + if (mainLen < 2 && curByte != matchByte && repLens[repMaxIndex] < 2) + { + *backRes = (UInt32)-1; + return 1; + } + + p->opt[0].state = (CState)p->state; + + posState = (position & p->pbMask); + + { + const CLzmaProb *probs = LIT_PROBS(position, *(data - 1)); + p->opt[1].price = GET_PRICE_0(p->isMatch[p->state][posState]) + + (!IsCharState(p->state) ? + LitEnc_GetPriceMatched(probs, curByte, matchByte, p->ProbPrices) : + LitEnc_GetPrice(probs, curByte, p->ProbPrices)); + } + + MakeAsChar(&p->opt[1]); + + matchPrice = GET_PRICE_1(p->isMatch[p->state][posState]); + repMatchPrice = matchPrice + GET_PRICE_1(p->isRep[p->state]); + + if (matchByte == curByte) + { + UInt32 shortRepPrice = repMatchPrice + GetRepLen1Price(p, p->state, posState); + if (shortRepPrice < p->opt[1].price) + { + p->opt[1].price = shortRepPrice; + MakeAsShortRep(&p->opt[1]); + } + } + lenEnd = ((mainLen >= repLens[repMaxIndex]) ? mainLen : repLens[repMaxIndex]); + + if (lenEnd < 2) + { + *backRes = p->opt[1].backPrev; + return 1; + } + + p->opt[1].posPrev = 0; + for (i = 0; i < LZMA_NUM_REPS; i++) + p->opt[0].backs[i] = reps[i]; + + len = lenEnd; + do + p->opt[len--].price = kInfinityPrice; + while (len >= 2); + + for (i = 0; i < LZMA_NUM_REPS; i++) + { + UInt32 repLen = repLens[i]; + UInt32 price; + if (repLen < 2) + continue; + price = repMatchPrice + GetPureRepPrice(p, i, p->state, posState); + do + { + UInt32 curAndLenPrice = price + p->repLenEnc.prices[posState][repLen - 2]; + COptimal *opt = &p->opt[repLen]; + if (curAndLenPrice < opt->price) + { + opt->price = curAndLenPrice; + opt->posPrev = 0; + opt->backPrev = i; + opt->prev1IsChar = False; + } + } + while (--repLen >= 2); + } + + normalMatchPrice = matchPrice + GET_PRICE_0(p->isRep[p->state]); + + len = ((repLens[0] >= 2) ? repLens[0] + 1 : 2); + if (len <= mainLen) + { + UInt32 offs = 0; + while (len > matches[offs]) + offs += 2; + for (; ; len++) + { + COptimal *opt; + UInt32 distance = matches[offs + 1]; + + UInt32 curAndLenPrice = normalMatchPrice + p->lenEnc.prices[posState][len - LZMA_MATCH_LEN_MIN]; + UInt32 lenToPosState = GetLenToPosState(len); + if (distance < kNumFullDistances) + curAndLenPrice += p->distancesPrices[lenToPosState][distance]; + else + { + UInt32 slot; + GetPosSlot2(distance, slot); + curAndLenPrice += p->alignPrices[distance & kAlignMask] + p->posSlotPrices[lenToPosState][slot]; + } + opt = &p->opt[len]; + if (curAndLenPrice < opt->price) + { + opt->price = curAndLenPrice; + opt->posPrev = 0; + opt->backPrev = distance + LZMA_NUM_REPS; + opt->prev1IsChar = False; + } + if (len == matches[offs]) + { + offs += 2; + if (offs == numPairs) + break; + } + } + } + + cur = 0; + + #ifdef SHOW_STAT2 + /* if (position >= 0) */ + { + unsigned i; + printf("\n pos = %4X", position); + for (i = cur; i <= lenEnd; i++) + printf("\nprice[%4X] = %u", position - cur + i, p->opt[i].price); + } + #endif + + } + + for (;;) + { + UInt32 numAvail; + UInt32 numAvailFull, newLen, numPairs, posPrev, state, posState, startLen; + UInt32 curPrice, curAnd1Price, matchPrice, repMatchPrice; + Bool nextIsChar; + Byte curByte, matchByte; + const Byte *data; + COptimal *curOpt; + COptimal *nextOpt; + + cur++; + if (cur == lenEnd) + return Backward(p, backRes, cur); + + newLen = ReadMatchDistances(p, &numPairs); + if (newLen >= p->numFastBytes) + { + p->numPairs = numPairs; + p->longestMatchLength = newLen; + return Backward(p, backRes, cur); + } + position++; + curOpt = &p->opt[cur]; + posPrev = curOpt->posPrev; + if (curOpt->prev1IsChar) + { + posPrev--; + if (curOpt->prev2) + { + state = p->opt[curOpt->posPrev2].state; + if (curOpt->backPrev2 < LZMA_NUM_REPS) + state = kRepNextStates[state]; + else + state = kMatchNextStates[state]; + } + else + state = p->opt[posPrev].state; + state = kLiteralNextStates[state]; + } + else + state = p->opt[posPrev].state; + if (posPrev == cur - 1) + { + if (IsShortRep(curOpt)) + state = kShortRepNextStates[state]; + else + state = kLiteralNextStates[state]; + } + else + { + UInt32 pos; + const COptimal *prevOpt; + if (curOpt->prev1IsChar && curOpt->prev2) + { + posPrev = curOpt->posPrev2; + pos = curOpt->backPrev2; + state = kRepNextStates[state]; + } + else + { + pos = curOpt->backPrev; + if (pos < LZMA_NUM_REPS) + state = kRepNextStates[state]; + else + state = kMatchNextStates[state]; + } + prevOpt = &p->opt[posPrev]; + if (pos < LZMA_NUM_REPS) + { + UInt32 i; + reps[0] = prevOpt->backs[pos]; + for (i = 1; i <= pos; i++) + reps[i] = prevOpt->backs[i - 1]; + for (; i < LZMA_NUM_REPS; i++) + reps[i] = prevOpt->backs[i]; + } + else + { + UInt32 i; + reps[0] = (pos - LZMA_NUM_REPS); + for (i = 1; i < LZMA_NUM_REPS; i++) + reps[i] = prevOpt->backs[i - 1]; + } + } + curOpt->state = (CState)state; + + curOpt->backs[0] = reps[0]; + curOpt->backs[1] = reps[1]; + curOpt->backs[2] = reps[2]; + curOpt->backs[3] = reps[3]; + + curPrice = curOpt->price; + nextIsChar = False; + data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; + curByte = *data; + matchByte = *(data - (reps[0] + 1)); + + posState = (position & p->pbMask); + + curAnd1Price = curPrice + GET_PRICE_0(p->isMatch[state][posState]); + { + const CLzmaProb *probs = LIT_PROBS(position, *(data - 1)); + curAnd1Price += + (!IsCharState(state) ? + LitEnc_GetPriceMatched(probs, curByte, matchByte, p->ProbPrices) : + LitEnc_GetPrice(probs, curByte, p->ProbPrices)); + } + + nextOpt = &p->opt[cur + 1]; + + if (curAnd1Price < nextOpt->price) + { + nextOpt->price = curAnd1Price; + nextOpt->posPrev = cur; + MakeAsChar(nextOpt); + nextIsChar = True; + } + + matchPrice = curPrice + GET_PRICE_1(p->isMatch[state][posState]); + repMatchPrice = matchPrice + GET_PRICE_1(p->isRep[state]); + + if (matchByte == curByte && !(nextOpt->posPrev < cur && nextOpt->backPrev == 0)) + { + UInt32 shortRepPrice = repMatchPrice + GetRepLen1Price(p, state, posState); + if (shortRepPrice <= nextOpt->price) + { + nextOpt->price = shortRepPrice; + nextOpt->posPrev = cur; + MakeAsShortRep(nextOpt); + nextIsChar = True; + } + } + numAvailFull = p->numAvail; + { + UInt32 temp = kNumOpts - 1 - cur; + if (temp < numAvailFull) + numAvailFull = temp; + } + + if (numAvailFull < 2) + continue; + numAvail = (numAvailFull <= p->numFastBytes ? numAvailFull : p->numFastBytes); + + if (!nextIsChar && matchByte != curByte) /* speed optimization */ + { + /* try Literal + rep0 */ + UInt32 temp; + UInt32 lenTest2; + const Byte *data2 = data - reps[0] - 1; + UInt32 limit = p->numFastBytes + 1; + if (limit > numAvailFull) + limit = numAvailFull; + + for (temp = 1; temp < limit && data[temp] == data2[temp]; temp++); + lenTest2 = temp - 1; + if (lenTest2 >= 2) + { + UInt32 state2 = kLiteralNextStates[state]; + UInt32 posStateNext = (position + 1) & p->pbMask; + UInt32 nextRepMatchPrice = curAnd1Price + + GET_PRICE_1(p->isMatch[state2][posStateNext]) + + GET_PRICE_1(p->isRep[state2]); + /* for (; lenTest2 >= 2; lenTest2--) */ + { + UInt32 curAndLenPrice; + COptimal *opt; + UInt32 offset = cur + 1 + lenTest2; + while (lenEnd < offset) + p->opt[++lenEnd].price = kInfinityPrice; + curAndLenPrice = nextRepMatchPrice + GetRepPrice(p, 0, lenTest2, state2, posStateNext); + opt = &p->opt[offset]; + if (curAndLenPrice < opt->price) + { + opt->price = curAndLenPrice; + opt->posPrev = cur + 1; + opt->backPrev = 0; + opt->prev1IsChar = True; + opt->prev2 = False; + } + } + } + } + + startLen = 2; /* speed optimization */ + { + UInt32 repIndex; + for (repIndex = 0; repIndex < LZMA_NUM_REPS; repIndex++) + { + UInt32 lenTest; + UInt32 lenTestTemp; + UInt32 price; + const Byte *data2 = data - reps[repIndex] - 1; + if (data[0] != data2[0] || data[1] != data2[1]) + continue; + for (lenTest = 2; lenTest < numAvail && data[lenTest] == data2[lenTest]; lenTest++); + while (lenEnd < cur + lenTest) + p->opt[++lenEnd].price = kInfinityPrice; + lenTestTemp = lenTest; + price = repMatchPrice + GetPureRepPrice(p, repIndex, state, posState); + do + { + UInt32 curAndLenPrice = price + p->repLenEnc.prices[posState][lenTest - 2]; + COptimal *opt = &p->opt[cur + lenTest]; + if (curAndLenPrice < opt->price) + { + opt->price = curAndLenPrice; + opt->posPrev = cur; + opt->backPrev = repIndex; + opt->prev1IsChar = False; + } + } + while (--lenTest >= 2); + lenTest = lenTestTemp; + + if (repIndex == 0) + startLen = lenTest + 1; + + /* if (_maxMode) */ + { + UInt32 lenTest2 = lenTest + 1; + UInt32 limit = lenTest2 + p->numFastBytes; + if (limit > numAvailFull) + limit = numAvailFull; + for (; lenTest2 < limit && data[lenTest2] == data2[lenTest2]; lenTest2++); + lenTest2 -= lenTest + 1; + if (lenTest2 >= 2) + { + UInt32 nextRepMatchPrice; + UInt32 state2 = kRepNextStates[state]; + UInt32 posStateNext = (position + lenTest) & p->pbMask; + UInt32 curAndLenCharPrice = + price + p->repLenEnc.prices[posState][lenTest - 2] + + GET_PRICE_0(p->isMatch[state2][posStateNext]) + + LitEnc_GetPriceMatched(LIT_PROBS(position + lenTest, data[lenTest - 1]), + data[lenTest], data2[lenTest], p->ProbPrices); + state2 = kLiteralNextStates[state2]; + posStateNext = (position + lenTest + 1) & p->pbMask; + nextRepMatchPrice = curAndLenCharPrice + + GET_PRICE_1(p->isMatch[state2][posStateNext]) + + GET_PRICE_1(p->isRep[state2]); + + /* for (; lenTest2 >= 2; lenTest2--) */ + { + UInt32 curAndLenPrice; + COptimal *opt; + UInt32 offset = cur + lenTest + 1 + lenTest2; + while (lenEnd < offset) + p->opt[++lenEnd].price = kInfinityPrice; + curAndLenPrice = nextRepMatchPrice + GetRepPrice(p, 0, lenTest2, state2, posStateNext); + opt = &p->opt[offset]; + if (curAndLenPrice < opt->price) + { + opt->price = curAndLenPrice; + opt->posPrev = cur + lenTest + 1; + opt->backPrev = 0; + opt->prev1IsChar = True; + opt->prev2 = True; + opt->posPrev2 = cur; + opt->backPrev2 = repIndex; + } + } + } + } + } + } + /* for (UInt32 lenTest = 2; lenTest <= newLen; lenTest++) */ + if (newLen > numAvail) + { + newLen = numAvail; + for (numPairs = 0; newLen > matches[numPairs]; numPairs += 2); + matches[numPairs] = newLen; + numPairs += 2; + } + if (newLen >= startLen) + { + UInt32 normalMatchPrice = matchPrice + GET_PRICE_0(p->isRep[state]); + UInt32 offs, curBack, posSlot; + UInt32 lenTest; + while (lenEnd < cur + newLen) + p->opt[++lenEnd].price = kInfinityPrice; + + offs = 0; + while (startLen > matches[offs]) + offs += 2; + curBack = matches[offs + 1]; + GetPosSlot2(curBack, posSlot); + for (lenTest = /*2*/ startLen; ; lenTest++) + { + UInt32 curAndLenPrice = normalMatchPrice + p->lenEnc.prices[posState][lenTest - LZMA_MATCH_LEN_MIN]; + { + UInt32 lenToPosState = GetLenToPosState(lenTest); + COptimal *opt; + if (curBack < kNumFullDistances) + curAndLenPrice += p->distancesPrices[lenToPosState][curBack]; + else + curAndLenPrice += p->posSlotPrices[lenToPosState][posSlot] + p->alignPrices[curBack & kAlignMask]; + + opt = &p->opt[cur + lenTest]; + if (curAndLenPrice < opt->price) + { + opt->price = curAndLenPrice; + opt->posPrev = cur; + opt->backPrev = curBack + LZMA_NUM_REPS; + opt->prev1IsChar = False; + } + } + + if (/*_maxMode && */lenTest == matches[offs]) + { + /* Try Match + Literal + Rep0 */ + const Byte *data2 = data - curBack - 1; + UInt32 lenTest2 = lenTest + 1; + UInt32 limit = lenTest2 + p->numFastBytes; + if (limit > numAvailFull) + limit = numAvailFull; + for (; lenTest2 < limit && data[lenTest2] == data2[lenTest2]; lenTest2++); + lenTest2 -= lenTest + 1; + if (lenTest2 >= 2) + { + UInt32 nextRepMatchPrice; + UInt32 state2 = kMatchNextStates[state]; + UInt32 posStateNext = (position + lenTest) & p->pbMask; + UInt32 curAndLenCharPrice = curAndLenPrice + + GET_PRICE_0(p->isMatch[state2][posStateNext]) + + LitEnc_GetPriceMatched(LIT_PROBS(position + lenTest, data[lenTest - 1]), + data[lenTest], data2[lenTest], p->ProbPrices); + state2 = kLiteralNextStates[state2]; + posStateNext = (posStateNext + 1) & p->pbMask; + nextRepMatchPrice = curAndLenCharPrice + + GET_PRICE_1(p->isMatch[state2][posStateNext]) + + GET_PRICE_1(p->isRep[state2]); + + /* for (; lenTest2 >= 2; lenTest2--) */ + { + UInt32 offset = cur + lenTest + 1 + lenTest2; + UInt32 curAndLenPrice2; + COptimal *opt; + while (lenEnd < offset) + p->opt[++lenEnd].price = kInfinityPrice; + curAndLenPrice2 = nextRepMatchPrice + GetRepPrice(p, 0, lenTest2, state2, posStateNext); + opt = &p->opt[offset]; + if (curAndLenPrice2 < opt->price) + { + opt->price = curAndLenPrice2; + opt->posPrev = cur + lenTest + 1; + opt->backPrev = 0; + opt->prev1IsChar = True; + opt->prev2 = True; + opt->posPrev2 = cur; + opt->backPrev2 = curBack + LZMA_NUM_REPS; + } + } + } + offs += 2; + if (offs == numPairs) + break; + curBack = matches[offs + 1]; + if (curBack >= kNumFullDistances) + GetPosSlot2(curBack, posSlot); + } + } + } + } +} + +#define ChangePair(smallDist, bigDist) (((bigDist) >> 7) > (smallDist)) + +static UInt32 GetOptimumFast(CLzmaEnc *p, UInt32 *backRes) +{ + UInt32 numAvail, mainLen, mainDist, numPairs, repIndex, repLen, i; + const Byte *data; + const UInt32 *matches; + + if (p->additionalOffset == 0) + mainLen = ReadMatchDistances(p, &numPairs); + else + { + mainLen = p->longestMatchLength; + numPairs = p->numPairs; + } + + numAvail = p->numAvail; + *backRes = (UInt32)-1; + if (numAvail < 2) + return 1; + if (numAvail > LZMA_MATCH_LEN_MAX) + numAvail = LZMA_MATCH_LEN_MAX; + data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; + + repLen = repIndex = 0; + for (i = 0; i < LZMA_NUM_REPS; i++) + { + UInt32 len; + const Byte *data2 = data - p->reps[i] - 1; + if (data[0] != data2[0] || data[1] != data2[1]) + continue; + for (len = 2; len < numAvail && data[len] == data2[len]; len++); + if (len >= p->numFastBytes) + { + *backRes = i; + MovePos(p, len - 1); + return len; + } + if (len > repLen) + { + repIndex = i; + repLen = len; + } + } + + matches = p->matches; + if (mainLen >= p->numFastBytes) + { + *backRes = matches[numPairs - 1] + LZMA_NUM_REPS; + MovePos(p, mainLen - 1); + return mainLen; + } + + mainDist = 0; /* for GCC */ + if (mainLen >= 2) + { + mainDist = matches[numPairs - 1]; + while (numPairs > 2 && mainLen == matches[numPairs - 4] + 1) + { + if (!ChangePair(matches[numPairs - 3], mainDist)) + break; + numPairs -= 2; + mainLen = matches[numPairs - 2]; + mainDist = matches[numPairs - 1]; + } + if (mainLen == 2 && mainDist >= 0x80) + mainLen = 1; + } + + if (repLen >= 2 && ( + (repLen + 1 >= mainLen) || + (repLen + 2 >= mainLen && mainDist >= (1 << 9)) || + (repLen + 3 >= mainLen && mainDist >= (1 << 15)))) + { + *backRes = repIndex; + MovePos(p, repLen - 1); + return repLen; + } + + if (mainLen < 2 || numAvail <= 2) + return 1; + + p->longestMatchLength = ReadMatchDistances(p, &p->numPairs); + if (p->longestMatchLength >= 2) + { + UInt32 newDistance = matches[p->numPairs - 1]; + if ((p->longestMatchLength >= mainLen && newDistance < mainDist) || + (p->longestMatchLength == mainLen + 1 && !ChangePair(mainDist, newDistance)) || + (p->longestMatchLength > mainLen + 1) || + (p->longestMatchLength + 1 >= mainLen && mainLen >= 3 && ChangePair(newDistance, mainDist))) + return 1; + } + + data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; + for (i = 0; i < LZMA_NUM_REPS; i++) + { + UInt32 len, limit; + const Byte *data2 = data - p->reps[i] - 1; + if (data[0] != data2[0] || data[1] != data2[1]) + continue; + limit = mainLen - 1; + for (len = 2; len < limit && data[len] == data2[len]; len++); + if (len >= limit) + return 1; + } + *backRes = mainDist + LZMA_NUM_REPS; + MovePos(p, mainLen - 2); + return mainLen; +} + +static void WriteEndMarker(CLzmaEnc *p, UInt32 posState) +{ + UInt32 len; + RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][posState], 1); + RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 0); + p->state = kMatchNextStates[p->state]; + len = LZMA_MATCH_LEN_MIN; + LenEnc_Encode2(&p->lenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices); + RcTree_Encode(&p->rc, p->posSlotEncoder[GetLenToPosState(len)], kNumPosSlotBits, (1 << kNumPosSlotBits) - 1); + RangeEnc_EncodeDirectBits(&p->rc, (((UInt32)1 << 30) - 1) >> kNumAlignBits, 30 - kNumAlignBits); + RcTree_ReverseEncode(&p->rc, p->posAlignEncoder, kNumAlignBits, kAlignMask); +} + +static SRes CheckErrors(CLzmaEnc *p) +{ + if (p->result != SZ_OK) + return p->result; + if (p->rc.res != SZ_OK) + p->result = SZ_ERROR_WRITE; + if (p->matchFinderBase.result != SZ_OK) + p->result = SZ_ERROR_READ; + if (p->result != SZ_OK) + p->finished = True; + return p->result; +} + +static SRes Flush(CLzmaEnc *p, UInt32 nowPos) +{ + /* ReleaseMFStream(); */ + p->finished = True; + if (p->writeEndMark) + WriteEndMarker(p, nowPos & p->pbMask); + RangeEnc_FlushData(&p->rc); + RangeEnc_FlushStream(&p->rc); + return CheckErrors(p); +} + +static void FillAlignPrices(CLzmaEnc *p) +{ + UInt32 i; + for (i = 0; i < kAlignTableSize; i++) + p->alignPrices[i] = RcTree_ReverseGetPrice(p->posAlignEncoder, kNumAlignBits, i, p->ProbPrices); + p->alignPriceCount = 0; +} + +static void FillDistancesPrices(CLzmaEnc *p) +{ + UInt32 tempPrices[kNumFullDistances]; + UInt32 i, lenToPosState; + for (i = kStartPosModelIndex; i < kNumFullDistances; i++) + { + UInt32 posSlot = GetPosSlot1(i); + UInt32 footerBits = ((posSlot >> 1) - 1); + UInt32 base = ((2 | (posSlot & 1)) << footerBits); + tempPrices[i] = RcTree_ReverseGetPrice(p->posEncoders + base - posSlot - 1, footerBits, i - base, p->ProbPrices); + } + + for (lenToPosState = 0; lenToPosState < kNumLenToPosStates; lenToPosState++) + { + UInt32 posSlot; + const CLzmaProb *encoder = p->posSlotEncoder[lenToPosState]; + UInt32 *posSlotPrices = p->posSlotPrices[lenToPosState]; + for (posSlot = 0; posSlot < p->distTableSize; posSlot++) + posSlotPrices[posSlot] = RcTree_GetPrice(encoder, kNumPosSlotBits, posSlot, p->ProbPrices); + for (posSlot = kEndPosModelIndex; posSlot < p->distTableSize; posSlot++) + posSlotPrices[posSlot] += ((((posSlot >> 1) - 1) - kNumAlignBits) << kNumBitPriceShiftBits); + + { + UInt32 *distancesPrices = p->distancesPrices[lenToPosState]; + for (i = 0; i < kStartPosModelIndex; i++) + distancesPrices[i] = posSlotPrices[i]; + for (; i < kNumFullDistances; i++) + distancesPrices[i] = posSlotPrices[GetPosSlot1(i)] + tempPrices[i]; + } + } + p->matchPriceCount = 0; +} + +void LzmaEnc_Construct(CLzmaEnc *p) +{ + RangeEnc_Construct(&p->rc); + MatchFinder_Construct(&p->matchFinderBase); + + #ifndef _7ZIP_ST + MatchFinderMt_Construct(&p->matchFinderMt); + p->matchFinderMt.MatchFinder = &p->matchFinderBase; + #endif + + { + CLzmaEncProps props; + LzmaEncProps_Init(&props); + LzmaEnc_SetProps(p, &props); + } + + #ifndef LZMA_LOG_BSR + LzmaEnc_FastPosInit(p->g_FastPos); + #endif + + LzmaEnc_InitPriceTables(p->ProbPrices); + p->litProbs = NULL; + p->saveState.litProbs = NULL; +} + +CLzmaEncHandle LzmaEnc_Create(ISzAlloc *alloc) +{ + void *p; + p = alloc->Alloc(alloc, sizeof(CLzmaEnc)); + if (p) + LzmaEnc_Construct((CLzmaEnc *)p); + return p; +} + +void LzmaEnc_FreeLits(CLzmaEnc *p, ISzAlloc *alloc) +{ + alloc->Free(alloc, p->litProbs); + alloc->Free(alloc, p->saveState.litProbs); + p->litProbs = NULL; + p->saveState.litProbs = NULL; +} + +void LzmaEnc_Destruct(CLzmaEnc *p, ISzAlloc *alloc, ISzAlloc *allocBig) +{ + #ifndef _7ZIP_ST + MatchFinderMt_Destruct(&p->matchFinderMt, allocBig); + #endif + + MatchFinder_Free(&p->matchFinderBase, allocBig); + LzmaEnc_FreeLits(p, alloc); + RangeEnc_Free(&p->rc, alloc); +} + +void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAlloc *alloc, ISzAlloc *allocBig) +{ + LzmaEnc_Destruct((CLzmaEnc *)p, alloc, allocBig); + alloc->Free(alloc, p); +} + +static SRes LzmaEnc_CodeOneBlock(CLzmaEnc *p, Bool useLimits, UInt32 maxPackSize, UInt32 maxUnpackSize) +{ + UInt32 nowPos32, startPos32; + if (p->needInit) + { + p->matchFinder.Init(p->matchFinderObj); + p->needInit = 0; + } + + if (p->finished) + return p->result; + RINOK(CheckErrors(p)); + + nowPos32 = (UInt32)p->nowPos64; + startPos32 = nowPos32; + + if (p->nowPos64 == 0) + { + UInt32 numPairs; + Byte curByte; + if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) == 0) + return Flush(p, nowPos32); + ReadMatchDistances(p, &numPairs); + RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][0], 0); + p->state = kLiteralNextStates[p->state]; + curByte = *(p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset); + LitEnc_Encode(&p->rc, p->litProbs, curByte); + p->additionalOffset--; + nowPos32++; + } + + if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) != 0) + for (;;) + { + UInt32 pos, len, posState; + + if (p->fastMode) + len = GetOptimumFast(p, &pos); + else + len = GetOptimum(p, nowPos32, &pos); + + #ifdef SHOW_STAT2 + printf("\n pos = %4X, len = %u pos = %u", nowPos32, len, pos); + #endif + + posState = nowPos32 & p->pbMask; + if (len == 1 && pos == (UInt32)-1) + { + Byte curByte; + CLzmaProb *probs; + const Byte *data; + + RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][posState], 0); + data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset; + curByte = *data; + probs = LIT_PROBS(nowPos32, *(data - 1)); + if (IsCharState(p->state)) + LitEnc_Encode(&p->rc, probs, curByte); + else + LitEnc_EncodeMatched(&p->rc, probs, curByte, *(data - p->reps[0] - 1)); + p->state = kLiteralNextStates[p->state]; + } + else + { + RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][posState], 1); + if (pos < LZMA_NUM_REPS) + { + RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 1); + if (pos == 0) + { + RangeEnc_EncodeBit(&p->rc, &p->isRepG0[p->state], 0); + RangeEnc_EncodeBit(&p->rc, &p->isRep0Long[p->state][posState], ((len == 1) ? 0 : 1)); + } + else + { + UInt32 distance = p->reps[pos]; + RangeEnc_EncodeBit(&p->rc, &p->isRepG0[p->state], 1); + if (pos == 1) + RangeEnc_EncodeBit(&p->rc, &p->isRepG1[p->state], 0); + else + { + RangeEnc_EncodeBit(&p->rc, &p->isRepG1[p->state], 1); + RangeEnc_EncodeBit(&p->rc, &p->isRepG2[p->state], pos - 2); + if (pos == 3) + p->reps[3] = p->reps[2]; + p->reps[2] = p->reps[1]; + } + p->reps[1] = p->reps[0]; + p->reps[0] = distance; + } + if (len == 1) + p->state = kShortRepNextStates[p->state]; + else + { + LenEnc_Encode2(&p->repLenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices); + p->state = kRepNextStates[p->state]; + } + } + else + { + UInt32 posSlot; + RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 0); + p->state = kMatchNextStates[p->state]; + LenEnc_Encode2(&p->lenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices); + pos -= LZMA_NUM_REPS; + GetPosSlot(pos, posSlot); + RcTree_Encode(&p->rc, p->posSlotEncoder[GetLenToPosState(len)], kNumPosSlotBits, posSlot); + + if (posSlot >= kStartPosModelIndex) + { + UInt32 footerBits = ((posSlot >> 1) - 1); + UInt32 base = ((2 | (posSlot & 1)) << footerBits); + UInt32 posReduced = pos - base; + + if (posSlot < kEndPosModelIndex) + RcTree_ReverseEncode(&p->rc, p->posEncoders + base - posSlot - 1, footerBits, posReduced); + else + { + RangeEnc_EncodeDirectBits(&p->rc, posReduced >> kNumAlignBits, footerBits - kNumAlignBits); + RcTree_ReverseEncode(&p->rc, p->posAlignEncoder, kNumAlignBits, posReduced & kAlignMask); + p->alignPriceCount++; + } + } + p->reps[3] = p->reps[2]; + p->reps[2] = p->reps[1]; + p->reps[1] = p->reps[0]; + p->reps[0] = pos; + p->matchPriceCount++; + } + } + p->additionalOffset -= len; + nowPos32 += len; + if (p->additionalOffset == 0) + { + UInt32 processed; + if (!p->fastMode) + { + if (p->matchPriceCount >= (1 << 7)) + FillDistancesPrices(p); + if (p->alignPriceCount >= kAlignTableSize) + FillAlignPrices(p); + } + if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) == 0) + break; + processed = nowPos32 - startPos32; + if (useLimits) + { + if (processed + kNumOpts + 300 >= maxUnpackSize || + RangeEnc_GetProcessed(&p->rc) + kNumOpts * 2 >= maxPackSize) + break; + } + else if (processed >= (1 << 17)) + { + p->nowPos64 += nowPos32 - startPos32; + return CheckErrors(p); + } + } + } + p->nowPos64 += nowPos32 - startPos32; + return Flush(p, nowPos32); +} + +#define kBigHashDicLimit ((UInt32)1 << 24) + +static SRes LzmaEnc_Alloc(CLzmaEnc *p, UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig) +{ + UInt32 beforeSize = kNumOpts; + if (!RangeEnc_Alloc(&p->rc, alloc)) + return SZ_ERROR_MEM; + + #ifndef _7ZIP_ST + p->mtMode = (p->multiThread && !p->fastMode && (p->matchFinderBase.btMode != 0)); + #endif + + { + unsigned lclp = p->lc + p->lp; + if (!p->litProbs || !p->saveState.litProbs || p->lclp != lclp) + { + LzmaEnc_FreeLits(p, alloc); + p->litProbs = (CLzmaProb *)alloc->Alloc(alloc, ((UInt32)0x300 << lclp) * sizeof(CLzmaProb)); + p->saveState.litProbs = (CLzmaProb *)alloc->Alloc(alloc, ((UInt32)0x300 << lclp) * sizeof(CLzmaProb)); + if (!p->litProbs || !p->saveState.litProbs) + { + LzmaEnc_FreeLits(p, alloc); + return SZ_ERROR_MEM; + } + p->lclp = lclp; + } + } + + p->matchFinderBase.bigHash = (Byte)(p->dictSize > kBigHashDicLimit ? 1 : 0); + + if (beforeSize + p->dictSize < keepWindowSize) + beforeSize = keepWindowSize - p->dictSize; + + #ifndef _7ZIP_ST + if (p->mtMode) + { + RINOK(MatchFinderMt_Create(&p->matchFinderMt, p->dictSize, beforeSize, p->numFastBytes, LZMA_MATCH_LEN_MAX, allocBig)); + p->matchFinderObj = &p->matchFinderMt; + MatchFinderMt_CreateVTable(&p->matchFinderMt, &p->matchFinder); + } + else + #endif + { + if (!MatchFinder_Create(&p->matchFinderBase, p->dictSize, beforeSize, p->numFastBytes, LZMA_MATCH_LEN_MAX, allocBig)) + return SZ_ERROR_MEM; + p->matchFinderObj = &p->matchFinderBase; + MatchFinder_CreateVTable(&p->matchFinderBase, &p->matchFinder); + } + + return SZ_OK; +} + +void LzmaEnc_Init(CLzmaEnc *p) +{ + UInt32 i; + p->state = 0; + for (i = 0 ; i < LZMA_NUM_REPS; i++) + p->reps[i] = 0; + + RangeEnc_Init(&p->rc); + + + for (i = 0; i < kNumStates; i++) + { + UInt32 j; + for (j = 0; j < LZMA_NUM_PB_STATES_MAX; j++) + { + p->isMatch[i][j] = kProbInitValue; + p->isRep0Long[i][j] = kProbInitValue; + } + p->isRep[i] = kProbInitValue; + p->isRepG0[i] = kProbInitValue; + p->isRepG1[i] = kProbInitValue; + p->isRepG2[i] = kProbInitValue; + } + + { + UInt32 num = (UInt32)0x300 << (p->lp + p->lc); + CLzmaProb *probs = p->litProbs; + for (i = 0; i < num; i++) + probs[i] = kProbInitValue; + } + + { + for (i = 0; i < kNumLenToPosStates; i++) + { + CLzmaProb *probs = p->posSlotEncoder[i]; + UInt32 j; + for (j = 0; j < (1 << kNumPosSlotBits); j++) + probs[j] = kProbInitValue; + } + } + { + for (i = 0; i < kNumFullDistances - kEndPosModelIndex; i++) + p->posEncoders[i] = kProbInitValue; + } + + LenEnc_Init(&p->lenEnc.p); + LenEnc_Init(&p->repLenEnc.p); + + for (i = 0; i < (1 << kNumAlignBits); i++) + p->posAlignEncoder[i] = kProbInitValue; + + p->optimumEndIndex = 0; + p->optimumCurrentIndex = 0; + p->additionalOffset = 0; + + p->pbMask = (1 << p->pb) - 1; + p->lpMask = (1 << p->lp) - 1; +} + +void LzmaEnc_InitPrices(CLzmaEnc *p) +{ + if (!p->fastMode) + { + FillDistancesPrices(p); + FillAlignPrices(p); + } + + p->lenEnc.tableSize = + p->repLenEnc.tableSize = + p->numFastBytes + 1 - LZMA_MATCH_LEN_MIN; + LenPriceEnc_UpdateTables(&p->lenEnc, 1 << p->pb, p->ProbPrices); + LenPriceEnc_UpdateTables(&p->repLenEnc, 1 << p->pb, p->ProbPrices); +} + +static SRes LzmaEnc_AllocAndInit(CLzmaEnc *p, UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig) +{ + UInt32 i; + for (i = 0; i < (UInt32)kDicLogSizeMaxCompress; i++) + if (p->dictSize <= ((UInt32)1 << i)) + break; + p->distTableSize = i * 2; + + p->finished = False; + p->result = SZ_OK; + RINOK(LzmaEnc_Alloc(p, keepWindowSize, alloc, allocBig)); + LzmaEnc_Init(p); + LzmaEnc_InitPrices(p); + p->nowPos64 = 0; + return SZ_OK; +} + +static SRes LzmaEnc_Prepare(CLzmaEncHandle pp, ISeqOutStream *outStream, ISeqInStream *inStream, + ISzAlloc *alloc, ISzAlloc *allocBig) +{ + CLzmaEnc *p = (CLzmaEnc *)pp; + p->matchFinderBase.stream = inStream; + p->needInit = 1; + p->rc.outStream = outStream; + return LzmaEnc_AllocAndInit(p, 0, alloc, allocBig); +} + +SRes LzmaEnc_PrepareForLzma2(CLzmaEncHandle pp, + ISeqInStream *inStream, UInt32 keepWindowSize, + ISzAlloc *alloc, ISzAlloc *allocBig) +{ + CLzmaEnc *p = (CLzmaEnc *)pp; + p->matchFinderBase.stream = inStream; + p->needInit = 1; + return LzmaEnc_AllocAndInit(p, keepWindowSize, alloc, allocBig); +} + +static void LzmaEnc_SetInputBuf(CLzmaEnc *p, const Byte *src, SizeT srcLen) +{ + p->matchFinderBase.directInput = 1; + p->matchFinderBase.bufferBase = (Byte *)src; + p->matchFinderBase.directInputRem = srcLen; +} + +SRes LzmaEnc_MemPrepare(CLzmaEncHandle pp, const Byte *src, SizeT srcLen, + UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig) +{ + CLzmaEnc *p = (CLzmaEnc *)pp; + LzmaEnc_SetInputBuf(p, src, srcLen); + p->needInit = 1; + + return LzmaEnc_AllocAndInit(p, keepWindowSize, alloc, allocBig); +} + +void LzmaEnc_Finish(CLzmaEncHandle pp) +{ + #ifndef _7ZIP_ST + CLzmaEnc *p = (CLzmaEnc *)pp; + if (p->mtMode) + MatchFinderMt_ReleaseStream(&p->matchFinderMt); + #else + UNUSED_VAR(pp); + #endif +} + + +typedef struct +{ + ISeqOutStream funcTable; + Byte *data; + SizeT rem; + Bool overflow; +} CSeqOutStreamBuf; + +static size_t MyWrite(void *pp, const void *data, size_t size) +{ + CSeqOutStreamBuf *p = (CSeqOutStreamBuf *)pp; + if (p->rem < size) + { + size = p->rem; + p->overflow = True; + } + memcpy(p->data, data, size); + p->rem -= size; + p->data += size; + return size; +} + + +UInt32 LzmaEnc_GetNumAvailableBytes(CLzmaEncHandle pp) +{ + const CLzmaEnc *p = (CLzmaEnc *)pp; + return p->matchFinder.GetNumAvailableBytes(p->matchFinderObj); +} + + +const Byte *LzmaEnc_GetCurBuf(CLzmaEncHandle pp) +{ + const CLzmaEnc *p = (CLzmaEnc *)pp; + return p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset; +} + + +SRes LzmaEnc_CodeOneMemBlock(CLzmaEncHandle pp, Bool reInit, + Byte *dest, size_t *destLen, UInt32 desiredPackSize, UInt32 *unpackSize) +{ + CLzmaEnc *p = (CLzmaEnc *)pp; + UInt64 nowPos64; + SRes res; + CSeqOutStreamBuf outStream; + + outStream.funcTable.Write = MyWrite; + outStream.data = dest; + outStream.rem = *destLen; + outStream.overflow = False; + + p->writeEndMark = False; + p->finished = False; + p->result = SZ_OK; + + if (reInit) + LzmaEnc_Init(p); + LzmaEnc_InitPrices(p); + nowPos64 = p->nowPos64; + RangeEnc_Init(&p->rc); + p->rc.outStream = &outStream.funcTable; + + res = LzmaEnc_CodeOneBlock(p, True, desiredPackSize, *unpackSize); + + *unpackSize = (UInt32)(p->nowPos64 - nowPos64); + *destLen -= outStream.rem; + if (outStream.overflow) + return SZ_ERROR_OUTPUT_EOF; + + return res; +} + + +static SRes LzmaEnc_Encode2(CLzmaEnc *p, ICompressProgress *progress) +{ + SRes res = SZ_OK; + + #ifndef _7ZIP_ST + Byte allocaDummy[0x300]; + allocaDummy[0] = 0; + allocaDummy[1] = allocaDummy[0]; + #endif + + for (;;) + { + res = LzmaEnc_CodeOneBlock(p, False, 0, 0); + if (res != SZ_OK || p->finished) + break; + if (progress) + { + res = progress->Progress(progress, p->nowPos64, RangeEnc_GetProcessed(&p->rc)); + if (res != SZ_OK) + { + res = SZ_ERROR_PROGRESS; + break; + } + } + } + + LzmaEnc_Finish(p); + + /* + if (res == S_OK && !Inline_MatchFinder_IsFinishedOK(&p->matchFinderBase)) + res = SZ_ERROR_FAIL; + } + */ + + return res; +} + + +SRes LzmaEnc_Encode(CLzmaEncHandle pp, ISeqOutStream *outStream, ISeqInStream *inStream, ICompressProgress *progress, + ISzAlloc *alloc, ISzAlloc *allocBig) +{ + RINOK(LzmaEnc_Prepare(pp, outStream, inStream, alloc, allocBig)); + return LzmaEnc_Encode2((CLzmaEnc *)pp, progress); +} + + +SRes LzmaEnc_WriteProperties(CLzmaEncHandle pp, Byte *props, SizeT *size) +{ + CLzmaEnc *p = (CLzmaEnc *)pp; + unsigned i; + UInt32 dictSize = p->dictSize; + if (*size < LZMA_PROPS_SIZE) + return SZ_ERROR_PARAM; + *size = LZMA_PROPS_SIZE; + props[0] = (Byte)((p->pb * 5 + p->lp) * 9 + p->lc); + + if (dictSize >= ((UInt32)1 << 22)) + { + UInt32 kDictMask = ((UInt32)1 << 20) - 1; + if (dictSize < (UInt32)0xFFFFFFFF - kDictMask) + dictSize = (dictSize + kDictMask) & ~kDictMask; + } + else for (i = 11; i <= 30; i++) + { + if (dictSize <= ((UInt32)2 << i)) { dictSize = (2 << i); break; } + if (dictSize <= ((UInt32)3 << i)) { dictSize = (3 << i); break; } + } + + for (i = 0; i < 4; i++) + props[1 + i] = (Byte)(dictSize >> (8 * i)); + return SZ_OK; +} + + +SRes LzmaEnc_MemEncode(CLzmaEncHandle pp, Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, + int writeEndMark, ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig) +{ + SRes res; + CLzmaEnc *p = (CLzmaEnc *)pp; + + CSeqOutStreamBuf outStream; + + outStream.funcTable.Write = MyWrite; + outStream.data = dest; + outStream.rem = *destLen; + outStream.overflow = False; + + p->writeEndMark = writeEndMark; + p->rc.outStream = &outStream.funcTable; + + res = LzmaEnc_MemPrepare(pp, src, srcLen, 0, alloc, allocBig); + + if (res == SZ_OK) + { + res = LzmaEnc_Encode2(p, progress); + if (res == SZ_OK && p->nowPos64 != srcLen) + res = SZ_ERROR_FAIL; + } + + *destLen -= outStream.rem; + if (outStream.overflow) + return SZ_ERROR_OUTPUT_EOF; + return res; +} + + +SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, + const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark, + ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig) +{ + CLzmaEnc *p = (CLzmaEnc *)LzmaEnc_Create(alloc); + SRes res; + if (!p) + return SZ_ERROR_MEM; + + res = LzmaEnc_SetProps(p, props); + if (res == SZ_OK) + { + res = LzmaEnc_WriteProperties(p, propsEncoded, propsSize); + if (res == SZ_OK) + res = LzmaEnc_MemEncode(p, dest, destLen, src, srcLen, + writeEndMark, progress, alloc, allocBig); + } + + LzmaEnc_Destroy(p, alloc, allocBig); + return res; +} diff --git a/core/cd_hw/libchdr/deps/lzma/LzmaEnc.h b/core/cd_hw/libchdr/deps/lzma/LzmaEnc.h new file mode 100644 index 0000000..cffe220 --- /dev/null +++ b/core/cd_hw/libchdr/deps/lzma/LzmaEnc.h @@ -0,0 +1,78 @@ +/* LzmaEnc.h -- LZMA Encoder +2013-01-18 : Igor Pavlov : Public domain */ + +#ifndef __LZMA_ENC_H +#define __LZMA_ENC_H + +#include "7zTypes.h" + +EXTERN_C_BEGIN + +#define LZMA_PROPS_SIZE 5 + +typedef struct _CLzmaEncProps +{ + int level; /* 0 <= level <= 9 */ + UInt32 dictSize; /* (1 << 12) <= dictSize <= (1 << 27) for 32-bit version + (1 << 12) <= dictSize <= (1 << 30) for 64-bit version + default = (1 << 24) */ + UInt64 reduceSize; /* estimated size of data that will be compressed. default = 0xFFFFFFFF. + Encoder uses this value to reduce dictionary size */ + int lc; /* 0 <= lc <= 8, default = 3 */ + int lp; /* 0 <= lp <= 4, default = 0 */ + int pb; /* 0 <= pb <= 4, default = 2 */ + int algo; /* 0 - fast, 1 - normal, default = 1 */ + int fb; /* 5 <= fb <= 273, default = 32 */ + int btMode; /* 0 - hashChain Mode, 1 - binTree mode - normal, default = 1 */ + int numHashBytes; /* 2, 3 or 4, default = 4 */ + UInt32 mc; /* 1 <= mc <= (1 << 30), default = 32 */ + unsigned writeEndMark; /* 0 - do not write EOPM, 1 - write EOPM, default = 0 */ + int numThreads; /* 1 or 2, default = 2 */ +} CLzmaEncProps; + +void LzmaEncProps_Init(CLzmaEncProps *p); +void LzmaEncProps_Normalize(CLzmaEncProps *p); +UInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2); + + +/* ---------- CLzmaEncHandle Interface ---------- */ + +/* LzmaEnc_* functions can return the following exit codes: +Returns: + SZ_OK - OK + SZ_ERROR_MEM - Memory allocation error + SZ_ERROR_PARAM - Incorrect paramater in props + SZ_ERROR_WRITE - Write callback error. + SZ_ERROR_PROGRESS - some break from progress callback + SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version) +*/ + +typedef void * CLzmaEncHandle; + +CLzmaEncHandle LzmaEnc_Create(ISzAlloc *alloc); +void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAlloc *alloc, ISzAlloc *allocBig); +SRes LzmaEnc_SetProps(CLzmaEncHandle p, const CLzmaEncProps *props); +SRes LzmaEnc_WriteProperties(CLzmaEncHandle p, Byte *properties, SizeT *size); +SRes LzmaEnc_Encode(CLzmaEncHandle p, ISeqOutStream *outStream, ISeqInStream *inStream, + ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig); +SRes LzmaEnc_MemEncode(CLzmaEncHandle p, Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, + int writeEndMark, ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig); + +/* ---------- One Call Interface ---------- */ + +/* LzmaEncode +Return code: + SZ_OK - OK + SZ_ERROR_MEM - Memory allocation error + SZ_ERROR_PARAM - Incorrect paramater + SZ_ERROR_OUTPUT_EOF - output buffer overflow + SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version) +*/ + +SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, + const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark, + ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig); + +EXTERN_C_END + +#endif diff --git a/core/cd_hw/libchdr/deps/lzma/Precomp.h b/core/cd_hw/libchdr/deps/lzma/Precomp.h new file mode 100644 index 0000000..e8ff8b4 --- /dev/null +++ b/core/cd_hw/libchdr/deps/lzma/Precomp.h @@ -0,0 +1,10 @@ +/* Precomp.h -- StdAfx +2013-11-12 : Igor Pavlov : Public domain */ + +#ifndef __7Z_PRECOMP_H +#define __7Z_PRECOMP_H + +#include "Compiler.h" +/* #include "7zTypes.h" */ + +#endif diff --git a/core/cd_hw/libchdr/deps/zlib/ChangeLog b/core/cd_hw/libchdr/deps/zlib/ChangeLog new file mode 100644 index 0000000..30199a6 --- /dev/null +++ b/core/cd_hw/libchdr/deps/zlib/ChangeLog @@ -0,0 +1,1515 @@ + + ChangeLog file for zlib + +Changes in 1.2.11 (15 Jan 2017) +- Fix deflate stored bug when pulling last block from window +- Permit immediate deflateParams changes before any deflate input + +Changes in 1.2.10 (2 Jan 2017) +- Avoid warnings on snprintf() return value +- Fix bug in deflate_stored() for zero-length input +- Fix bug in gzwrite.c that produced corrupt gzip files +- Remove files to be installed before copying them in Makefile.in +- Add warnings when compiling with assembler code + +Changes in 1.2.9 (31 Dec 2016) +- Fix contrib/minizip to permit unzipping with desktop API [Zouzou] +- Improve contrib/blast to return unused bytes +- Assure that gzoffset() is correct when appending +- Improve compress() and uncompress() to support large lengths +- Fix bug in test/example.c where error code not saved +- Remedy Coverity warning [Randers-Pehrson] +- Improve speed of gzprintf() in transparent mode +- Fix inflateInit2() bug when windowBits is 16 or 32 +- Change DEBUG macro to ZLIB_DEBUG +- Avoid uninitialized access by gzclose_w() +- Allow building zlib outside of the source directory +- Fix bug that accepted invalid zlib header when windowBits is zero +- Fix gzseek() problem on MinGW due to buggy _lseeki64 there +- Loop on write() calls in gzwrite.c in case of non-blocking I/O +- Add --warn (-w) option to ./configure for more compiler warnings +- Reject a window size of 256 bytes if not using the zlib wrapper +- Fix bug when level 0 used with Z_HUFFMAN or Z_RLE +- Add --debug (-d) option to ./configure to define ZLIB_DEBUG +- Fix bugs in creating a very large gzip header +- Add uncompress2() function, which returns the input size used +- Assure that deflateParams() will not switch functions mid-block +- Dramatically speed up deflation for level 0 (storing) +- Add gzfread(), duplicating the interface of fread() +- Add gzfwrite(), duplicating the interface of fwrite() +- Add deflateGetDictionary() function +- Use snprintf() for later versions of Microsoft C +- Fix *Init macros to use z_ prefix when requested +- Replace as400 with os400 for OS/400 support [Monnerat] +- Add crc32_z() and adler32_z() functions with size_t lengths +- Update Visual Studio project files [AraHaan] + +Changes in 1.2.8 (28 Apr 2013) +- Update contrib/minizip/iowin32.c for Windows RT [Vollant] +- Do not force Z_CONST for C++ +- Clean up contrib/vstudio [Roß] +- Correct spelling error in zlib.h +- Fix mixed line endings in contrib/vstudio + +Changes in 1.2.7.3 (13 Apr 2013) +- Fix version numbers and DLL names in contrib/vstudio/*/zlib.rc + +Changes in 1.2.7.2 (13 Apr 2013) +- Change check for a four-byte type back to hexadecimal +- Fix typo in win32/Makefile.msc +- Add casts in gzwrite.c for pointer differences + +Changes in 1.2.7.1 (24 Mar 2013) +- Replace use of unsafe string functions with snprintf if available +- Avoid including stddef.h on Windows for Z_SOLO compile [Niessink] +- Fix gzgetc undefine when Z_PREFIX set [Turk] +- Eliminate use of mktemp in Makefile (not always available) +- Fix bug in 'F' mode for gzopen() +- Add inflateGetDictionary() function +- Correct comment in deflate.h +- Use _snprintf for snprintf in Microsoft C +- On Darwin, only use /usr/bin/libtool if libtool is not Apple +- Delete "--version" file if created by "ar --version" [Richard G.] +- Fix configure check for veracity of compiler error return codes +- Fix CMake compilation of static lib for MSVC2010 x64 +- Remove unused variable in infback9.c +- Fix argument checks in gzlog_compress() and gzlog_write() +- Clean up the usage of z_const and respect const usage within zlib +- Clean up examples/gzlog.[ch] comparisons of different types +- Avoid shift equal to bits in type (caused endless loop) +- Fix uninitialized value bug in gzputc() introduced by const patches +- Fix memory allocation error in examples/zran.c [Nor] +- Fix bug where gzopen(), gzclose() would write an empty file +- Fix bug in gzclose() when gzwrite() runs out of memory +- Check for input buffer malloc failure in examples/gzappend.c +- Add note to contrib/blast to use binary mode in stdio +- Fix comparisons of differently signed integers in contrib/blast +- Check for invalid code length codes in contrib/puff +- Fix serious but very rare decompression bug in inftrees.c +- Update inflateBack() comments, since inflate() can be faster +- Use underscored I/O function names for WINAPI_FAMILY +- Add _tr_flush_bits to the external symbols prefixed by --zprefix +- Add contrib/vstudio/vc10 pre-build step for static only +- Quote --version-script argument in CMakeLists.txt +- Don't specify --version-script on Apple platforms in CMakeLists.txt +- Fix casting error in contrib/testzlib/testzlib.c +- Fix types in contrib/minizip to match result of get_crc_table() +- Simplify contrib/vstudio/vc10 with 'd' suffix +- Add TOP support to win32/Makefile.msc +- Suport i686 and amd64 assembler builds in CMakeLists.txt +- Fix typos in the use of _LARGEFILE64_SOURCE in zconf.h +- Add vc11 and vc12 build files to contrib/vstudio +- Add gzvprintf() as an undocumented function in zlib +- Fix configure for Sun shell +- Remove runtime check in configure for four-byte integer type +- Add casts and consts to ease user conversion to C++ +- Add man pages for minizip and miniunzip +- In Makefile uninstall, don't rm if preceding cd fails +- Do not return Z_BUF_ERROR if deflateParam() has nothing to write + +Changes in 1.2.7 (2 May 2012) +- Replace use of memmove() with a simple copy for portability +- Test for existence of strerror +- Restore gzgetc_ for backward compatibility with 1.2.6 +- Fix build with non-GNU make on Solaris +- Require gcc 4.0 or later on Mac OS X to use the hidden attribute +- Include unistd.h for Watcom C +- Use __WATCOMC__ instead of __WATCOM__ +- Do not use the visibility attribute if NO_VIZ defined +- Improve the detection of no hidden visibility attribute +- Avoid using __int64 for gcc or solo compilation +- Cast to char * in gzprintf to avoid warnings [Zinser] +- Fix make_vms.com for VAX [Zinser] +- Don't use library or built-in byte swaps +- Simplify test and use of gcc hidden attribute +- Fix bug in gzclose_w() when gzwrite() fails to allocate memory +- Add "x" (O_EXCL) and "e" (O_CLOEXEC) modes support to gzopen() +- Fix bug in test/minigzip.c for configure --solo +- Fix contrib/vstudio project link errors [Mohanathas] +- Add ability to choose the builder in make_vms.com [Schweda] +- Add DESTDIR support to mingw32 win32/Makefile.gcc +- Fix comments in win32/Makefile.gcc for proper usage +- Allow overriding the default install locations for cmake +- Generate and install the pkg-config file with cmake +- Build both a static and a shared version of zlib with cmake +- Include version symbols for cmake builds +- If using cmake with MSVC, add the source directory to the includes +- Remove unneeded EXTRA_CFLAGS from win32/Makefile.gcc [Truta] +- Move obsolete emx makefile to old [Truta] +- Allow the use of -Wundef when compiling or using zlib +- Avoid the use of the -u option with mktemp +- Improve inflate() documentation on the use of Z_FINISH +- Recognize clang as gcc +- Add gzopen_w() in Windows for wide character path names +- Rename zconf.h in CMakeLists.txt to move it out of the way +- Add source directory in CMakeLists.txt for building examples +- Look in build directory for zlib.pc in CMakeLists.txt +- Remove gzflags from zlibvc.def in vc9 and vc10 +- Fix contrib/minizip compilation in the MinGW environment +- Update ./configure for Solaris, support --64 [Mooney] +- Remove -R. from Solaris shared build (possible security issue) +- Avoid race condition for parallel make (-j) running example +- Fix type mismatch between get_crc_table() and crc_table +- Fix parsing of version with "-" in CMakeLists.txt [Snider, Ziegler] +- Fix the path to zlib.map in CMakeLists.txt +- Force the native libtool in Mac OS X to avoid GNU libtool [Beebe] +- Add instructions to win32/Makefile.gcc for shared install [Torri] + +Changes in 1.2.6.1 (12 Feb 2012) +- Avoid the use of the Objective-C reserved name "id" +- Include io.h in gzguts.h for Microsoft compilers +- Fix problem with ./configure --prefix and gzgetc macro +- Include gz_header definition when compiling zlib solo +- Put gzflags() functionality back in zutil.c +- Avoid library header include in crc32.c for Z_SOLO +- Use name in GCC_CLASSIC as C compiler for coverage testing, if set +- Minor cleanup in contrib/minizip/zip.c [Vollant] +- Update make_vms.com [Zinser] +- Remove unnecessary gzgetc_ function +- Use optimized byte swap operations for Microsoft and GNU [Snyder] +- Fix minor typo in zlib.h comments [Rzesniowiecki] + +Changes in 1.2.6 (29 Jan 2012) +- Update the Pascal interface in contrib/pascal +- Fix function numbers for gzgetc_ in zlibvc.def files +- Fix configure.ac for contrib/minizip [Schiffer] +- Fix large-entry detection in minizip on 64-bit systems [Schiffer] +- Have ./configure use the compiler return code for error indication +- Fix CMakeLists.txt for cross compilation [McClure] +- Fix contrib/minizip/zip.c for 64-bit architectures [Dalsnes] +- Fix compilation of contrib/minizip on FreeBSD [Marquez] +- Correct suggested usages in win32/Makefile.msc [Shachar, Horvath] +- Include io.h for Turbo C / Borland C on all platforms [Truta] +- Make version explicit in contrib/minizip/configure.ac [Bosmans] +- Avoid warning for no encryption in contrib/minizip/zip.c [Vollant] +- Minor cleanup up contrib/minizip/unzip.c [Vollant] +- Fix bug when compiling minizip with C++ [Vollant] +- Protect for long name and extra fields in contrib/minizip [Vollant] +- Avoid some warnings in contrib/minizip [Vollant] +- Add -I../.. -L../.. to CFLAGS for minizip and miniunzip +- Add missing libs to minizip linker command +- Add support for VPATH builds in contrib/minizip +- Add an --enable-demos option to contrib/minizip/configure +- Add the generation of configure.log by ./configure +- Exit when required parameters not provided to win32/Makefile.gcc +- Have gzputc return the character written instead of the argument +- Use the -m option on ldconfig for BSD systems [Tobias] +- Correct in zlib.map when deflateResetKeep was added + +Changes in 1.2.5.3 (15 Jan 2012) +- Restore gzgetc function for binary compatibility +- Do not use _lseeki64 under Borland C++ [Truta] +- Update win32/Makefile.msc to build test/*.c [Truta] +- Remove old/visualc6 given CMakefile and other alternatives +- Update AS400 build files and documentation [Monnerat] +- Update win32/Makefile.gcc to build test/*.c [Truta] +- Permit stronger flushes after Z_BLOCK flushes +- Avoid extraneous empty blocks when doing empty flushes +- Permit Z_NULL arguments to deflatePending +- Allow deflatePrime() to insert bits in the middle of a stream +- Remove second empty static block for Z_PARTIAL_FLUSH +- Write out all of the available bits when using Z_BLOCK +- Insert the first two strings in the hash table after a flush + +Changes in 1.2.5.2 (17 Dec 2011) +- fix ld error: unable to find version dependency 'ZLIB_1.2.5' +- use relative symlinks for shared libs +- Avoid searching past window for Z_RLE strategy +- Assure that high-water mark initialization is always applied in deflate +- Add assertions to fill_window() in deflate.c to match comments +- Update python link in README +- Correct spelling error in gzread.c +- Fix bug in gzgets() for a concatenated empty gzip stream +- Correct error in comment for gz_make() +- Change gzread() and related to ignore junk after gzip streams +- Allow gzread() and related to continue after gzclearerr() +- Allow gzrewind() and gzseek() after a premature end-of-file +- Simplify gzseek() now that raw after gzip is ignored +- Change gzgetc() to a macro for speed (~40% speedup in testing) +- Fix gzclose() to return the actual error last encountered +- Always add large file support for windows +- Include zconf.h for windows large file support +- Include zconf.h.cmakein for windows large file support +- Update zconf.h.cmakein on make distclean +- Merge vestigial vsnprintf determination from zutil.h to gzguts.h +- Clarify how gzopen() appends in zlib.h comments +- Correct documentation of gzdirect() since junk at end now ignored +- Add a transparent write mode to gzopen() when 'T' is in the mode +- Update python link in zlib man page +- Get inffixed.h and MAKEFIXED result to match +- Add a ./config --solo option to make zlib subset with no library use +- Add undocumented inflateResetKeep() function for CAB file decoding +- Add --cover option to ./configure for gcc coverage testing +- Add #define ZLIB_CONST option to use const in the z_stream interface +- Add comment to gzdopen() in zlib.h to use dup() when using fileno() +- Note behavior of uncompress() to provide as much data as it can +- Add files in contrib/minizip to aid in building libminizip +- Split off AR options in Makefile.in and configure +- Change ON macro to Z_ARG to avoid application conflicts +- Facilitate compilation with Borland C++ for pragmas and vsnprintf +- Include io.h for Turbo C / Borland C++ +- Move example.c and minigzip.c to test/ +- Simplify incomplete code table filling in inflate_table() +- Remove code from inflate.c and infback.c that is impossible to execute +- Test the inflate code with full coverage +- Allow deflateSetDictionary, inflateSetDictionary at any time (in raw) +- Add deflateResetKeep and fix inflateResetKeep to retain dictionary +- Fix gzwrite.c to accommodate reduced memory zlib compilation +- Have inflate() with Z_FINISH avoid the allocation of a window +- Do not set strm->adler when doing raw inflate +- Fix gzeof() to behave just like feof() when read is not past end of file +- Fix bug in gzread.c when end-of-file is reached +- Avoid use of Z_BUF_ERROR in gz* functions except for premature EOF +- Document gzread() capability to read concurrently written files +- Remove hard-coding of resource compiler in CMakeLists.txt [Blammo] + +Changes in 1.2.5.1 (10 Sep 2011) +- Update FAQ entry on shared builds (#13) +- Avoid symbolic argument to chmod in Makefile.in +- Fix bug and add consts in contrib/puff [Oberhumer] +- Update contrib/puff/zeros.raw test file to have all block types +- Add full coverage test for puff in contrib/puff/Makefile +- Fix static-only-build install in Makefile.in +- Fix bug in unzGetCurrentFileInfo() in contrib/minizip [Kuno] +- Add libz.a dependency to shared in Makefile.in for parallel builds +- Spell out "number" (instead of "nb") in zlib.h for total_in, total_out +- Replace $(...) with `...` in configure for non-bash sh [Bowler] +- Add darwin* to Darwin* and solaris* to SunOS\ 5* in configure [Groffen] +- Add solaris* to Linux* in configure to allow gcc use [Groffen] +- Add *bsd* to Linux* case in configure [Bar-Lev] +- Add inffast.obj to dependencies in win32/Makefile.msc +- Correct spelling error in deflate.h [Kohler] +- Change libzdll.a again to libz.dll.a (!) in win32/Makefile.gcc +- Add test to configure for GNU C looking for gcc in output of $cc -v +- Add zlib.pc generation to win32/Makefile.gcc [Weigelt] +- Fix bug in zlib.h for _FILE_OFFSET_BITS set and _LARGEFILE64_SOURCE not +- Add comment in zlib.h that adler32_combine with len2 < 0 makes no sense +- Make NO_DIVIDE option in adler32.c much faster (thanks to John Reiser) +- Make stronger test in zconf.h to include unistd.h for LFS +- Apply Darwin patches for 64-bit file offsets to contrib/minizip [Slack] +- Fix zlib.h LFS support when Z_PREFIX used +- Add updated as400 support (removed from old) [Monnerat] +- Avoid deflate sensitivity to volatile input data +- Avoid division in adler32_combine for NO_DIVIDE +- Clarify the use of Z_FINISH with deflateBound() amount of space +- Set binary for output file in puff.c +- Use u4 type for crc_table to avoid conversion warnings +- Apply casts in zlib.h to avoid conversion warnings +- Add OF to prototypes for adler32_combine_ and crc32_combine_ [Miller] +- Improve inflateSync() documentation to note indeterminancy +- Add deflatePending() function to return the amount of pending output +- Correct the spelling of "specification" in FAQ [Randers-Pehrson] +- Add a check in configure for stdarg.h, use for gzprintf() +- Check that pointers fit in ints when gzprint() compiled old style +- Add dummy name before $(SHAREDLIBV) in Makefile [Bar-Lev, Bowler] +- Delete line in configure that adds -L. libz.a to LDFLAGS [Weigelt] +- Add debug records in assmebler code [Londer] +- Update RFC references to use http://tools.ietf.org/html/... [Li] +- Add --archs option, use of libtool to configure for Mac OS X [Borstel] + +Changes in 1.2.5 (19 Apr 2010) +- Disable visibility attribute in win32/Makefile.gcc [Bar-Lev] +- Default to libdir as sharedlibdir in configure [Nieder] +- Update copyright dates on modified source files +- Update trees.c to be able to generate modified trees.h +- Exit configure for MinGW, suggesting win32/Makefile.gcc +- Check for NULL path in gz_open [Homurlu] + +Changes in 1.2.4.5 (18 Apr 2010) +- Set sharedlibdir in configure [Torok] +- Set LDFLAGS in Makefile.in [Bar-Lev] +- Avoid mkdir objs race condition in Makefile.in [Bowler] +- Add ZLIB_INTERNAL in front of internal inter-module functions and arrays +- Define ZLIB_INTERNAL to hide internal functions and arrays for GNU C +- Don't use hidden attribute when it is a warning generator (e.g. Solaris) + +Changes in 1.2.4.4 (18 Apr 2010) +- Fix CROSS_PREFIX executable testing, CHOST extract, mingw* [Torok] +- Undefine _LARGEFILE64_SOURCE in zconf.h if it is zero, but not if empty +- Try to use bash or ksh regardless of functionality of /bin/sh +- Fix configure incompatibility with NetBSD sh +- Remove attempt to run under bash or ksh since have better NetBSD fix +- Fix win32/Makefile.gcc for MinGW [Bar-Lev] +- Add diagnostic messages when using CROSS_PREFIX in configure +- Added --sharedlibdir option to configure [Weigelt] +- Use hidden visibility attribute when available [Frysinger] + +Changes in 1.2.4.3 (10 Apr 2010) +- Only use CROSS_PREFIX in configure for ar and ranlib if they exist +- Use CROSS_PREFIX for nm [Bar-Lev] +- Assume _LARGEFILE64_SOURCE defined is equivalent to true +- Avoid use of undefined symbols in #if with && and || +- Make *64 prototypes in gzguts.h consistent with functions +- Add -shared load option for MinGW in configure [Bowler] +- Move z_off64_t to public interface, use instead of off64_t +- Remove ! from shell test in configure (not portable to Solaris) +- Change +0 macro tests to -0 for possibly increased portability + +Changes in 1.2.4.2 (9 Apr 2010) +- Add consistent carriage returns to readme.txt's in masmx86 and masmx64 +- Really provide prototypes for *64 functions when building without LFS +- Only define unlink() in minigzip.c if unistd.h not included +- Update README to point to contrib/vstudio project files +- Move projects/vc6 to old/ and remove projects/ +- Include stdlib.h in minigzip.c for setmode() definition under WinCE +- Clean up assembler builds in win32/Makefile.msc [Rowe] +- Include sys/types.h for Microsoft for off_t definition +- Fix memory leak on error in gz_open() +- Symbolize nm as $NM in configure [Weigelt] +- Use TEST_LDSHARED instead of LDSHARED to link test programs [Weigelt] +- Add +0 to _FILE_OFFSET_BITS and _LFS64_LARGEFILE in case not defined +- Fix bug in gzeof() to take into account unused input data +- Avoid initialization of structures with variables in puff.c +- Updated win32/README-WIN32.txt [Rowe] + +Changes in 1.2.4.1 (28 Mar 2010) +- Remove the use of [a-z] constructs for sed in configure [gentoo 310225] +- Remove $(SHAREDLIB) from LIBS in Makefile.in [Creech] +- Restore "for debugging" comment on sprintf() in gzlib.c +- Remove fdopen for MVS from gzguts.h +- Put new README-WIN32.txt in win32 [Rowe] +- Add check for shell to configure and invoke another shell if needed +- Fix big fat stinking bug in gzseek() on uncompressed files +- Remove vestigial F_OPEN64 define in zutil.h +- Set and check the value of _LARGEFILE_SOURCE and _LARGEFILE64_SOURCE +- Avoid errors on non-LFS systems when applications define LFS macros +- Set EXE to ".exe" in configure for MINGW [Kahle] +- Match crc32() in crc32.c exactly to the prototype in zlib.h [Sherrill] +- Add prefix for cross-compilation in win32/makefile.gcc [Bar-Lev] +- Add DLL install in win32/makefile.gcc [Bar-Lev] +- Allow Linux* or linux* from uname in configure [Bar-Lev] +- Allow ldconfig to be redefined in configure and Makefile.in [Bar-Lev] +- Add cross-compilation prefixes to configure [Bar-Lev] +- Match type exactly in gz_load() invocation in gzread.c +- Match type exactly of zcalloc() in zutil.c to zlib.h alloc_func +- Provide prototypes for *64 functions when building zlib without LFS +- Don't use -lc when linking shared library on MinGW +- Remove errno.h check in configure and vestigial errno code in zutil.h + +Changes in 1.2.4 (14 Mar 2010) +- Fix VER3 extraction in configure for no fourth subversion +- Update zlib.3, add docs to Makefile.in to make .pdf out of it +- Add zlib.3.pdf to distribution +- Don't set error code in gzerror() if passed pointer is NULL +- Apply destination directory fixes to CMakeLists.txt [Lowman] +- Move #cmakedefine's to a new zconf.in.cmakein +- Restore zconf.h for builds that don't use configure or cmake +- Add distclean to dummy Makefile for convenience +- Update and improve INDEX, README, and FAQ +- Update CMakeLists.txt for the return of zconf.h [Lowman] +- Update contrib/vstudio/vc9 and vc10 [Vollant] +- Change libz.dll.a back to libzdll.a in win32/Makefile.gcc +- Apply license and readme changes to contrib/asm686 [Raiter] +- Check file name lengths and add -c option in minigzip.c [Li] +- Update contrib/amd64 and contrib/masmx86/ [Vollant] +- Avoid use of "eof" parameter in trees.c to not shadow library variable +- Update make_vms.com for removal of zlibdefs.h [Zinser] +- Update assembler code and vstudio projects in contrib [Vollant] +- Remove outdated assembler code contrib/masm686 and contrib/asm586 +- Remove old vc7 and vc8 from contrib/vstudio +- Update win32/Makefile.msc, add ZLIB_VER_SUBREVISION [Rowe] +- Fix memory leaks in gzclose_r() and gzclose_w(), file leak in gz_open() +- Add contrib/gcc_gvmat64 for longest_match and inflate_fast [Vollant] +- Remove *64 functions from win32/zlib.def (they're not 64-bit yet) +- Fix bug in void-returning vsprintf() case in gzwrite.c +- Fix name change from inflate.h in contrib/inflate86/inffas86.c +- Check if temporary file exists before removing in make_vms.com [Zinser] +- Fix make install and uninstall for --static option +- Fix usage of _MSC_VER in gzguts.h and zutil.h [Truta] +- Update readme.txt in contrib/masmx64 and masmx86 to assemble + +Changes in 1.2.3.9 (21 Feb 2010) +- Expunge gzio.c +- Move as400 build information to old +- Fix updates in contrib/minizip and contrib/vstudio +- Add const to vsnprintf test in configure to avoid warnings [Weigelt] +- Delete zconf.h (made by configure) [Weigelt] +- Change zconf.in.h to zconf.h.in per convention [Weigelt] +- Check for NULL buf in gzgets() +- Return empty string for gzgets() with len == 1 (like fgets()) +- Fix description of gzgets() in zlib.h for end-of-file, NULL return +- Update minizip to 1.1 [Vollant] +- Avoid MSVC loss of data warnings in gzread.c, gzwrite.c +- Note in zlib.h that gzerror() should be used to distinguish from EOF +- Remove use of snprintf() from gzlib.c +- Fix bug in gzseek() +- Update contrib/vstudio, adding vc9 and vc10 [Kuno, Vollant] +- Fix zconf.h generation in CMakeLists.txt [Lowman] +- Improve comments in zconf.h where modified by configure + +Changes in 1.2.3.8 (13 Feb 2010) +- Clean up text files (tabs, trailing whitespace, etc.) [Oberhumer] +- Use z_off64_t in gz_zero() and gz_skip() to match state->skip +- Avoid comparison problem when sizeof(int) == sizeof(z_off64_t) +- Revert to Makefile.in from 1.2.3.6 (live with the clutter) +- Fix missing error return in gzflush(), add zlib.h note +- Add *64 functions to zlib.map [Levin] +- Fix signed/unsigned comparison in gz_comp() +- Use SFLAGS when testing shared linking in configure +- Add --64 option to ./configure to use -m64 with gcc +- Fix ./configure --help to correctly name options +- Have make fail if a test fails [Levin] +- Avoid buffer overrun in contrib/masmx64/gvmat64.asm [Simpson] +- Remove assembler object files from contrib + +Changes in 1.2.3.7 (24 Jan 2010) +- Always gzopen() with O_LARGEFILE if available +- Fix gzdirect() to work immediately after gzopen() or gzdopen() +- Make gzdirect() more precise when the state changes while reading +- Improve zlib.h documentation in many places +- Catch memory allocation failure in gz_open() +- Complete close operation if seek forward in gzclose_w() fails +- Return Z_ERRNO from gzclose_r() if close() fails +- Return Z_STREAM_ERROR instead of EOF for gzclose() being passed NULL +- Return zero for gzwrite() errors to match zlib.h description +- Return -1 on gzputs() error to match zlib.h description +- Add zconf.in.h to allow recovery from configure modification [Weigelt] +- Fix static library permissions in Makefile.in [Weigelt] +- Avoid warnings in configure tests that hide functionality [Weigelt] +- Add *BSD and DragonFly to Linux case in configure [gentoo 123571] +- Change libzdll.a to libz.dll.a in win32/Makefile.gcc [gentoo 288212] +- Avoid access of uninitialized data for first inflateReset2 call [Gomes] +- Keep object files in subdirectories to reduce the clutter somewhat +- Remove default Makefile and zlibdefs.h, add dummy Makefile +- Add new external functions to Z_PREFIX, remove duplicates, z_z_ -> z_ +- Remove zlibdefs.h completely -- modify zconf.h instead + +Changes in 1.2.3.6 (17 Jan 2010) +- Avoid void * arithmetic in gzread.c and gzwrite.c +- Make compilers happier with const char * for gz_error message +- Avoid unused parameter warning in inflate.c +- Avoid signed-unsigned comparison warning in inflate.c +- Indent #pragma's for traditional C +- Fix usage of strwinerror() in glib.c, change to gz_strwinerror() +- Correct email address in configure for system options +- Update make_vms.com and add make_vms.com to contrib/minizip [Zinser] +- Update zlib.map [Brown] +- Fix Makefile.in for Solaris 10 make of example64 and minizip64 [Torok] +- Apply various fixes to CMakeLists.txt [Lowman] +- Add checks on len in gzread() and gzwrite() +- Add error message for no more room for gzungetc() +- Remove zlib version check in gzwrite() +- Defer compression of gzprintf() result until need to +- Use snprintf() in gzdopen() if available +- Remove USE_MMAP configuration determination (only used by minigzip) +- Remove examples/pigz.c (available separately) +- Update examples/gun.c to 1.6 + +Changes in 1.2.3.5 (8 Jan 2010) +- Add space after #if in zutil.h for some compilers +- Fix relatively harmless bug in deflate_fast() [Exarevsky] +- Fix same problem in deflate_slow() +- Add $(SHAREDLIBV) to LIBS in Makefile.in [Brown] +- Add deflate_rle() for faster Z_RLE strategy run-length encoding +- Add deflate_huff() for faster Z_HUFFMAN_ONLY encoding +- Change name of "write" variable in inffast.c to avoid library collisions +- Fix premature EOF from gzread() in gzio.c [Brown] +- Use zlib header window size if windowBits is 0 in inflateInit2() +- Remove compressBound() call in deflate.c to avoid linking compress.o +- Replace use of errno in gz* with functions, support WinCE [Alves] +- Provide alternative to perror() in minigzip.c for WinCE [Alves] +- Don't use _vsnprintf on later versions of MSVC [Lowman] +- Add CMake build script and input file [Lowman] +- Update contrib/minizip to 1.1 [Svensson, Vollant] +- Moved nintendods directory from contrib to . +- Replace gzio.c with a new set of routines with the same functionality +- Add gzbuffer(), gzoffset(), gzclose_r(), gzclose_w() as part of above +- Update contrib/minizip to 1.1b +- Change gzeof() to return 0 on error instead of -1 to agree with zlib.h + +Changes in 1.2.3.4 (21 Dec 2009) +- Use old school .SUFFIXES in Makefile.in for FreeBSD compatibility +- Update comments in configure and Makefile.in for default --shared +- Fix test -z's in configure [Marquess] +- Build examplesh and minigzipsh when not testing +- Change NULL's to Z_NULL's in deflate.c and in comments in zlib.h +- Import LDFLAGS from the environment in configure +- Fix configure to populate SFLAGS with discovered CFLAGS options +- Adapt make_vms.com to the new Makefile.in [Zinser] +- Add zlib2ansi script for C++ compilation [Marquess] +- Add _FILE_OFFSET_BITS=64 test to make test (when applicable) +- Add AMD64 assembler code for longest match to contrib [Teterin] +- Include options from $SFLAGS when doing $LDSHARED +- Simplify 64-bit file support by introducing z_off64_t type +- Make shared object files in objs directory to work around old Sun cc +- Use only three-part version number for Darwin shared compiles +- Add rc option to ar in Makefile.in for when ./configure not run +- Add -WI,-rpath,. to LDFLAGS for OSF 1 V4* +- Set LD_LIBRARYN32_PATH for SGI IRIX shared compile +- Protect against _FILE_OFFSET_BITS being defined when compiling zlib +- Rename Makefile.in targets allstatic to static and allshared to shared +- Fix static and shared Makefile.in targets to be independent +- Correct error return bug in gz_open() by setting state [Brown] +- Put spaces before ;;'s in configure for better sh compatibility +- Add pigz.c (parallel implementation of gzip) to examples/ +- Correct constant in crc32.c to UL [Leventhal] +- Reject negative lengths in crc32_combine() +- Add inflateReset2() function to work like inflateEnd()/inflateInit2() +- Include sys/types.h for _LARGEFILE64_SOURCE [Brown] +- Correct typo in doc/algorithm.txt [Janik] +- Fix bug in adler32_combine() [Zhu] +- Catch missing-end-of-block-code error in all inflates and in puff + Assures that random input to inflate eventually results in an error +- Added enough.c (calculation of ENOUGH for inftrees.h) to examples/ +- Update ENOUGH and its usage to reflect discovered bounds +- Fix gzerror() error report on empty input file [Brown] +- Add ush casts in trees.c to avoid pedantic runtime errors +- Fix typo in zlib.h uncompress() description [Reiss] +- Correct inflate() comments with regard to automatic header detection +- Remove deprecation comment on Z_PARTIAL_FLUSH (it stays) +- Put new version of gzlog (2.0) in examples with interruption recovery +- Add puff compile option to permit invalid distance-too-far streams +- Add puff TEST command options, ability to read piped input +- Prototype the *64 functions in zlib.h when _FILE_OFFSET_BITS == 64, but + _LARGEFILE64_SOURCE not defined +- Fix Z_FULL_FLUSH to truly erase the past by resetting s->strstart +- Fix deflateSetDictionary() to use all 32K for output consistency +- Remove extraneous #define MIN_LOOKAHEAD in deflate.c (in deflate.h) +- Clear bytes after deflate lookahead to avoid use of uninitialized data +- Change a limit in inftrees.c to be more transparent to Coverity Prevent +- Update win32/zlib.def with exported symbols from zlib.h +- Correct spelling errors in zlib.h [Willem, Sobrado] +- Allow Z_BLOCK for deflate() to force a new block +- Allow negative bits in inflatePrime() to delete existing bit buffer +- Add Z_TREES flush option to inflate() to return at end of trees +- Add inflateMark() to return current state information for random access +- Add Makefile for NintendoDS to contrib [Costa] +- Add -w in configure compile tests to avoid spurious warnings [Beucler] +- Fix typos in zlib.h comments for deflateSetDictionary() +- Fix EOF detection in transparent gzread() [Maier] + +Changes in 1.2.3.3 (2 October 2006) +- Make --shared the default for configure, add a --static option +- Add compile option to permit invalid distance-too-far streams +- Add inflateUndermine() function which is required to enable above +- Remove use of "this" variable name for C++ compatibility [Marquess] +- Add testing of shared library in make test, if shared library built +- Use ftello() and fseeko() if available instead of ftell() and fseek() +- Provide two versions of all functions that use the z_off_t type for + binary compatibility -- a normal version and a 64-bit offset version, + per the Large File Support Extension when _LARGEFILE64_SOURCE is + defined; use the 64-bit versions by default when _FILE_OFFSET_BITS + is defined to be 64 +- Add a --uname= option to configure to perhaps help with cross-compiling + +Changes in 1.2.3.2 (3 September 2006) +- Turn off silly Borland warnings [Hay] +- Use off64_t and define _LARGEFILE64_SOURCE when present +- Fix missing dependency on inffixed.h in Makefile.in +- Rig configure --shared to build both shared and static [Teredesai, Truta] +- Remove zconf.in.h and instead create a new zlibdefs.h file +- Fix contrib/minizip/unzip.c non-encrypted after encrypted [Vollant] +- Add treebuild.xml (see http://treebuild.metux.de/) [Weigelt] + +Changes in 1.2.3.1 (16 August 2006) +- Add watcom directory with OpenWatcom make files [Daniel] +- Remove #undef of FAR in zconf.in.h for MVS [Fedtke] +- Update make_vms.com [Zinser] +- Use -fPIC for shared build in configure [Teredesai, Nicholson] +- Use only major version number for libz.so on IRIX and OSF1 [Reinholdtsen] +- Use fdopen() (not _fdopen()) for Interix in zutil.h [BÃĪck] +- Add some FAQ entries about the contrib directory +- Update the MVS question in the FAQ +- Avoid extraneous reads after EOF in gzio.c [Brown] +- Correct spelling of "successfully" in gzio.c [Randers-Pehrson] +- Add comments to zlib.h about gzerror() usage [Brown] +- Set extra flags in gzip header in gzopen() like deflate() does +- Make configure options more compatible with double-dash conventions + [Weigelt] +- Clean up compilation under Solaris SunStudio cc [Rowe, Reinholdtsen] +- Fix uninstall target in Makefile.in [Truta] +- Add pkgconfig support [Weigelt] +- Use $(DESTDIR) macro in Makefile.in [Reinholdtsen, Weigelt] +- Replace set_data_type() with a more accurate detect_data_type() in + trees.c, according to the txtvsbin.txt document [Truta] +- Swap the order of #include and #include "zlib.h" in + gzio.c, example.c and minigzip.c [Truta] +- Shut up annoying VS2005 warnings about standard C deprecation [Rowe, + Truta] (where?) +- Fix target "clean" from win32/Makefile.bor [Truta] +- Create .pdb and .manifest files in win32/makefile.msc [Ziegler, Rowe] +- Update zlib www home address in win32/DLL_FAQ.txt [Truta] +- Update contrib/masmx86/inffas32.asm for VS2005 [Vollant, Van Wassenhove] +- Enable browse info in the "Debug" and "ASM Debug" configurations in + the Visual C++ 6 project, and set (non-ASM) "Debug" as default [Truta] +- Add pkgconfig support [Weigelt] +- Add ZLIB_VER_MAJOR, ZLIB_VER_MINOR and ZLIB_VER_REVISION in zlib.h, + for use in win32/zlib1.rc [Polushin, Rowe, Truta] +- Add a document that explains the new text detection scheme to + doc/txtvsbin.txt [Truta] +- Add rfc1950.txt, rfc1951.txt and rfc1952.txt to doc/ [Truta] +- Move algorithm.txt into doc/ [Truta] +- Synchronize FAQ with website +- Fix compressBound(), was low for some pathological cases [Fearnley] +- Take into account wrapper variations in deflateBound() +- Set examples/zpipe.c input and output to binary mode for Windows +- Update examples/zlib_how.html with new zpipe.c (also web site) +- Fix some warnings in examples/gzlog.c and examples/zran.c (it seems + that gcc became pickier in 4.0) +- Add zlib.map for Linux: "All symbols from zlib-1.1.4 remain + un-versioned, the patch adds versioning only for symbols introduced in + zlib-1.2.0 or later. It also declares as local those symbols which are + not designed to be exported." [Levin] +- Update Z_PREFIX list in zconf.in.h, add --zprefix option to configure +- Do not initialize global static by default in trees.c, add a response + NO_INIT_GLOBAL_POINTERS to initialize them if needed [Marquess] +- Don't use strerror() in gzio.c under WinCE [Yakimov] +- Don't use errno.h in zutil.h under WinCE [Yakimov] +- Move arguments for AR to its usage to allow replacing ar [Marot] +- Add HAVE_VISIBILITY_PRAGMA in zconf.in.h for Mozilla [Randers-Pehrson] +- Improve inflateInit() and inflateInit2() documentation +- Fix structure size comment in inflate.h +- Change configure help option from --h* to --help [Santos] + +Changes in 1.2.3 (18 July 2005) +- Apply security vulnerability fixes to contrib/infback9 as well +- Clean up some text files (carriage returns, trailing space) +- Update testzlib, vstudio, masmx64, and masmx86 in contrib [Vollant] + +Changes in 1.2.2.4 (11 July 2005) +- Add inflatePrime() function for starting inflation at bit boundary +- Avoid some Visual C warnings in deflate.c +- Avoid more silly Visual C warnings in inflate.c and inftrees.c for 64-bit + compile +- Fix some spelling errors in comments [Betts] +- Correct inflateInit2() error return documentation in zlib.h +- Add zran.c example of compressed data random access to examples + directory, shows use of inflatePrime() +- Fix cast for assignments to strm->state in inflate.c and infback.c +- Fix zlibCompileFlags() in zutil.c to use 1L for long shifts [Oberhumer] +- Move declarations of gf2 functions to right place in crc32.c [Oberhumer] +- Add cast in trees.c t avoid a warning [Oberhumer] +- Avoid some warnings in fitblk.c, gun.c, gzjoin.c in examples [Oberhumer] +- Update make_vms.com [Zinser] +- Initialize state->write in inflateReset() since copied in inflate_fast() +- Be more strict on incomplete code sets in inflate_table() and increase + ENOUGH and MAXD -- this repairs a possible security vulnerability for + invalid inflate input. Thanks to Tavis Ormandy and Markus Oberhumer for + discovering the vulnerability and providing test cases. +- Add ia64 support to configure for HP-UX [Smith] +- Add error return to gzread() for format or i/o error [Levin] +- Use malloc.h for OS/2 [Necasek] + +Changes in 1.2.2.3 (27 May 2005) +- Replace 1U constants in inflate.c and inftrees.c for 64-bit compile +- Typecast fread() return values in gzio.c [Vollant] +- Remove trailing space in minigzip.c outmode (VC++ can't deal with it) +- Fix crc check bug in gzread() after gzungetc() [Heiner] +- Add the deflateTune() function to adjust internal compression parameters +- Add a fast gzip decompressor, gun.c, to examples (use of inflateBack) +- Remove an incorrect assertion in examples/zpipe.c +- Add C++ wrapper in infback9.h [Donais] +- Fix bug in inflateCopy() when decoding fixed codes +- Note in zlib.h how much deflateSetDictionary() actually uses +- Remove USE_DICT_HEAD in deflate.c (would mess up inflate if used) +- Add _WIN32_WCE to define WIN32 in zconf.in.h [Spencer] +- Don't include stderr.h or errno.h for _WIN32_WCE in zutil.h [Spencer] +- Add gzdirect() function to indicate transparent reads +- Update contrib/minizip [Vollant] +- Fix compilation of deflate.c when both ASMV and FASTEST [Oberhumer] +- Add casts in crc32.c to avoid warnings [Oberhumer] +- Add contrib/masmx64 [Vollant] +- Update contrib/asm586, asm686, masmx86, testzlib, vstudio [Vollant] + +Changes in 1.2.2.2 (30 December 2004) +- Replace structure assignments in deflate.c and inflate.c with zmemcpy to + avoid implicit memcpy calls (portability for no-library compilation) +- Increase sprintf() buffer size in gzdopen() to allow for large numbers +- Add INFLATE_STRICT to check distances against zlib header +- Improve WinCE errno handling and comments [Chang] +- Remove comment about no gzip header processing in FAQ +- Add Z_FIXED strategy option to deflateInit2() to force fixed trees +- Add updated make_vms.com [Coghlan], update README +- Create a new "examples" directory, move gzappend.c there, add zpipe.c, + fitblk.c, gzlog.[ch], gzjoin.c, and zlib_how.html. +- Add FAQ entry and comments in deflate.c on uninitialized memory access +- Add Solaris 9 make options in configure [Gilbert] +- Allow strerror() usage in gzio.c for STDC +- Fix DecompressBuf in contrib/delphi/ZLib.pas [ManChesTer] +- Update contrib/masmx86/inffas32.asm and gvmat32.asm [Vollant] +- Use z_off_t for adler32_combine() and crc32_combine() lengths +- Make adler32() much faster for small len +- Use OS_CODE in deflate() default gzip header + +Changes in 1.2.2.1 (31 October 2004) +- Allow inflateSetDictionary() call for raw inflate +- Fix inflate header crc check bug for file names and comments +- Add deflateSetHeader() and gz_header structure for custom gzip headers +- Add inflateGetheader() to retrieve gzip headers +- Add crc32_combine() and adler32_combine() functions +- Add alloc_func, free_func, in_func, out_func to Z_PREFIX list +- Use zstreamp consistently in zlib.h (inflate_back functions) +- Remove GUNZIP condition from definition of inflate_mode in inflate.h + and in contrib/inflate86/inffast.S [Truta, Anderson] +- Add support for AMD64 in contrib/inflate86/inffas86.c [Anderson] +- Update projects/README.projects and projects/visualc6 [Truta] +- Update win32/DLL_FAQ.txt [Truta] +- Avoid warning under NO_GZCOMPRESS in gzio.c; fix typo [Truta] +- Deprecate Z_ASCII; use Z_TEXT instead [Truta] +- Use a new algorithm for setting strm->data_type in trees.c [Truta] +- Do not define an exit() prototype in zutil.c unless DEBUG defined +- Remove prototype of exit() from zutil.c, example.c, minigzip.c [Truta] +- Add comment in zlib.h for Z_NO_FLUSH parameter to deflate() +- Fix Darwin build version identification [Peterson] + +Changes in 1.2.2 (3 October 2004) +- Update zlib.h comments on gzip in-memory processing +- Set adler to 1 in inflateReset() to support Java test suite [Walles] +- Add contrib/dotzlib [Ravn] +- Update win32/DLL_FAQ.txt [Truta] +- Update contrib/minizip [Vollant] +- Move contrib/visual-basic.txt to old/ [Truta] +- Fix assembler builds in projects/visualc6/ [Truta] + +Changes in 1.2.1.2 (9 September 2004) +- Update INDEX file +- Fix trees.c to update strm->data_type (no one ever noticed!) +- Fix bug in error case in inflate.c, infback.c, and infback9.c [Brown] +- Add "volatile" to crc table flag declaration (for DYNAMIC_CRC_TABLE) +- Add limited multitasking protection to DYNAMIC_CRC_TABLE +- Add NO_vsnprintf for VMS in zutil.h [Mozilla] +- Don't declare strerror() under VMS [Mozilla] +- Add comment to DYNAMIC_CRC_TABLE to use get_crc_table() to initialize +- Update contrib/ada [Anisimkov] +- Update contrib/minizip [Vollant] +- Fix configure to not hardcode directories for Darwin [Peterson] +- Fix gzio.c to not return error on empty files [Brown] +- Fix indentation; update version in contrib/delphi/ZLib.pas and + contrib/pascal/zlibpas.pas [Truta] +- Update mkasm.bat in contrib/masmx86 [Truta] +- Update contrib/untgz [Truta] +- Add projects/README.projects [Truta] +- Add project for MS Visual C++ 6.0 in projects/visualc6 [Cadieux, Truta] +- Update win32/DLL_FAQ.txt [Truta] +- Update list of Z_PREFIX symbols in zconf.h [Randers-Pehrson, Truta] +- Remove an unnecessary assignment to curr in inftrees.c [Truta] +- Add OS/2 to exe builds in configure [Poltorak] +- Remove err dummy parameter in zlib.h [Kientzle] + +Changes in 1.2.1.1 (9 January 2004) +- Update email address in README +- Several FAQ updates +- Fix a big fat bug in inftrees.c that prevented decoding valid + dynamic blocks with only literals and no distance codes -- + Thanks to "Hot Emu" for the bug report and sample file +- Add a note to puff.c on no distance codes case. + +Changes in 1.2.1 (17 November 2003) +- Remove a tab in contrib/gzappend/gzappend.c +- Update some interfaces in contrib for new zlib functions +- Update zlib version number in some contrib entries +- Add Windows CE definition for ptrdiff_t in zutil.h [Mai, Truta] +- Support shared libraries on Hurd and KFreeBSD [Brown] +- Fix error in NO_DIVIDE option of adler32.c + +Changes in 1.2.0.8 (4 November 2003) +- Update version in contrib/delphi/ZLib.pas and contrib/pascal/zlibpas.pas +- Add experimental NO_DIVIDE #define in adler32.c + - Possibly faster on some processors (let me know if it is) +- Correct Z_BLOCK to not return on first inflate call if no wrap +- Fix strm->data_type on inflate() return to correctly indicate EOB +- Add deflatePrime() function for appending in the middle of a byte +- Add contrib/gzappend for an example of appending to a stream +- Update win32/DLL_FAQ.txt [Truta] +- Delete Turbo C comment in README [Truta] +- Improve some indentation in zconf.h [Truta] +- Fix infinite loop on bad input in configure script [Church] +- Fix gzeof() for concatenated gzip files [Johnson] +- Add example to contrib/visual-basic.txt [Michael B.] +- Add -p to mkdir's in Makefile.in [vda] +- Fix configure to properly detect presence or lack of printf functions +- Add AS400 support [Monnerat] +- Add a little Cygwin support [Wilson] + +Changes in 1.2.0.7 (21 September 2003) +- Correct some debug formats in contrib/infback9 +- Cast a type in a debug statement in trees.c +- Change search and replace delimiter in configure from % to # [Beebe] +- Update contrib/untgz to 0.2 with various fixes [Truta] +- Add build support for Amiga [Nikl] +- Remove some directories in old that have been updated to 1.2 +- Add dylib building for Mac OS X in configure and Makefile.in +- Remove old distribution stuff from Makefile +- Update README to point to DLL_FAQ.txt, and add comment on Mac OS X +- Update links in README + +Changes in 1.2.0.6 (13 September 2003) +- Minor FAQ updates +- Update contrib/minizip to 1.00 [Vollant] +- Remove test of gz functions in example.c when GZ_COMPRESS defined [Truta] +- Update POSTINC comment for 68060 [Nikl] +- Add contrib/infback9 with deflate64 decoding (unsupported) +- For MVS define NO_vsnprintf and undefine FAR [van Burik] +- Add pragma for fdopen on MVS [van Burik] + +Changes in 1.2.0.5 (8 September 2003) +- Add OF to inflateBackEnd() declaration in zlib.h +- Remember start when using gzdopen in the middle of a file +- Use internal off_t counters in gz* functions to properly handle seeks +- Perform more rigorous check for distance-too-far in inffast.c +- Add Z_BLOCK flush option to return from inflate at block boundary +- Set strm->data_type on return from inflate + - Indicate bits unused, if at block boundary, and if in last block +- Replace size_t with ptrdiff_t in crc32.c, and check for correct size +- Add condition so old NO_DEFLATE define still works for compatibility +- FAQ update regarding the Windows DLL [Truta] +- INDEX update: add qnx entry, remove aix entry [Truta] +- Install zlib.3 into mandir [Wilson] +- Move contrib/zlib_dll_FAQ.txt to win32/DLL_FAQ.txt; update [Truta] +- Adapt the zlib interface to the new DLL convention guidelines [Truta] +- Introduce ZLIB_WINAPI macro to allow the export of functions using + the WINAPI calling convention, for Visual Basic [Vollant, Truta] +- Update msdos and win32 scripts and makefiles [Truta] +- Export symbols by name, not by ordinal, in win32/zlib.def [Truta] +- Add contrib/ada [Anisimkov] +- Move asm files from contrib/vstudio/vc70_32 to contrib/asm386 [Truta] +- Rename contrib/asm386 to contrib/masmx86 [Truta, Vollant] +- Add contrib/masm686 [Truta] +- Fix offsets in contrib/inflate86 and contrib/masmx86/inffas32.asm + [Truta, Vollant] +- Update contrib/delphi; rename to contrib/pascal; add example [Truta] +- Remove contrib/delphi2; add a new contrib/delphi [Truta] +- Avoid inclusion of the nonstandard in contrib/iostream, + and fix some method prototypes [Truta] +- Fix the ZCR_SEED2 constant to avoid warnings in contrib/minizip + [Truta] +- Avoid the use of backslash (\) in contrib/minizip [Vollant] +- Fix file time handling in contrib/untgz; update makefiles [Truta] +- Update contrib/vstudio/vc70_32 to comply with the new DLL guidelines + [Vollant] +- Remove contrib/vstudio/vc15_16 [Vollant] +- Rename contrib/vstudio/vc70_32 to contrib/vstudio/vc7 [Truta] +- Update README.contrib [Truta] +- Invert the assignment order of match_head and s->prev[...] in + INSERT_STRING [Truta] +- Compare TOO_FAR with 32767 instead of 32768, to avoid 16-bit warnings + [Truta] +- Compare function pointers with 0, not with NULL or Z_NULL [Truta] +- Fix prototype of syncsearch in inflate.c [Truta] +- Introduce ASMINF macro to be enabled when using an ASM implementation + of inflate_fast [Truta] +- Change NO_DEFLATE to NO_GZCOMPRESS [Truta] +- Modify test_gzio in example.c to take a single file name as a + parameter [Truta] +- Exit the example.c program if gzopen fails [Truta] +- Add type casts around strlen in example.c [Truta] +- Remove casting to sizeof in minigzip.c; give a proper type + to the variable compared with SUFFIX_LEN [Truta] +- Update definitions of STDC and STDC99 in zconf.h [Truta] +- Synchronize zconf.h with the new Windows DLL interface [Truta] +- Use SYS16BIT instead of __32BIT__ to distinguish between + 16- and 32-bit platforms [Truta] +- Use far memory allocators in small 16-bit memory models for + Turbo C [Truta] +- Add info about the use of ASMV, ASMINF and ZLIB_WINAPI in + zlibCompileFlags [Truta] +- Cygwin has vsnprintf [Wilson] +- In Windows16, OS_CODE is 0, as in MSDOS [Truta] +- In Cygwin, OS_CODE is 3 (Unix), not 11 (Windows32) [Wilson] + +Changes in 1.2.0.4 (10 August 2003) +- Minor FAQ updates +- Be more strict when checking inflateInit2's windowBits parameter +- Change NO_GUNZIP compile option to NO_GZIP to cover deflate as well +- Add gzip wrapper option to deflateInit2 using windowBits +- Add updated QNX rule in configure and qnx directory [Bonnefoy] +- Make inflate distance-too-far checks more rigorous +- Clean up FAR usage in inflate +- Add casting to sizeof() in gzio.c and minigzip.c + +Changes in 1.2.0.3 (19 July 2003) +- Fix silly error in gzungetc() implementation [Vollant] +- Update contrib/minizip and contrib/vstudio [Vollant] +- Fix printf format in example.c +- Correct cdecl support in zconf.in.h [Anisimkov] +- Minor FAQ updates + +Changes in 1.2.0.2 (13 July 2003) +- Add ZLIB_VERNUM in zlib.h for numerical preprocessor comparisons +- Attempt to avoid warnings in crc32.c for pointer-int conversion +- Add AIX to configure, remove aix directory [Bakker] +- Add some casts to minigzip.c +- Improve checking after insecure sprintf() or vsprintf() calls +- Remove #elif's from crc32.c +- Change leave label to inf_leave in inflate.c and infback.c to avoid + library conflicts +- Remove inflate gzip decoding by default--only enable gzip decoding by + special request for stricter backward compatibility +- Add zlibCompileFlags() function to return compilation information +- More typecasting in deflate.c to avoid warnings +- Remove leading underscore from _Capital #defines [Truta] +- Fix configure to link shared library when testing +- Add some Windows CE target adjustments [Mai] +- Remove #define ZLIB_DLL in zconf.h [Vollant] +- Add zlib.3 [Rodgers] +- Update RFC URL in deflate.c and algorithm.txt [Mai] +- Add zlib_dll_FAQ.txt to contrib [Truta] +- Add UL to some constants [Truta] +- Update minizip and vstudio [Vollant] +- Remove vestigial NEED_DUMMY_RETURN from zconf.in.h +- Expand use of NO_DUMMY_DECL to avoid all dummy structures +- Added iostream3 to contrib [Schwardt] +- Replace rewind() with fseek() for WinCE [Truta] +- Improve setting of zlib format compression level flags + - Report 0 for huffman and rle strategies and for level == 0 or 1 + - Report 2 only for level == 6 +- Only deal with 64K limit when necessary at compile time [Truta] +- Allow TOO_FAR check to be turned off at compile time [Truta] +- Add gzclearerr() function [Souza] +- Add gzungetc() function + +Changes in 1.2.0.1 (17 March 2003) +- Add Z_RLE strategy for run-length encoding [Truta] + - When Z_RLE requested, restrict matches to distance one + - Update zlib.h, minigzip.c, gzopen(), gzdopen() for Z_RLE +- Correct FASTEST compilation to allow level == 0 +- Clean up what gets compiled for FASTEST +- Incorporate changes to zconf.in.h [Vollant] + - Refine detection of Turbo C need for dummy returns + - Refine ZLIB_DLL compilation + - Include additional header file on VMS for off_t typedef +- Try to use _vsnprintf where it supplants vsprintf [Vollant] +- Add some casts in inffast.c +- Enchance comments in zlib.h on what happens if gzprintf() tries to + write more than 4095 bytes before compression +- Remove unused state from inflateBackEnd() +- Remove exit(0) from minigzip.c, example.c +- Get rid of all those darn tabs +- Add "check" target to Makefile.in that does the same thing as "test" +- Add "mostlyclean" and "maintainer-clean" targets to Makefile.in +- Update contrib/inflate86 [Anderson] +- Update contrib/testzlib, contrib/vstudio, contrib/minizip [Vollant] +- Add msdos and win32 directories with makefiles [Truta] +- More additions and improvements to the FAQ + +Changes in 1.2.0 (9 March 2003) +- New and improved inflate code + - About 20% faster + - Does not allocate 32K window unless and until needed + - Automatically detects and decompresses gzip streams + - Raw inflate no longer needs an extra dummy byte at end + - Added inflateBack functions using a callback interface--even faster + than inflate, useful for file utilities (gzip, zip) + - Added inflateCopy() function to record state for random access on + externally generated deflate streams (e.g. in gzip files) + - More readable code (I hope) +- New and improved crc32() + - About 50% faster, thanks to suggestions from Rodney Brown +- Add deflateBound() and compressBound() functions +- Fix memory leak in deflateInit2() +- Permit setting dictionary for raw deflate (for parallel deflate) +- Fix const declaration for gzwrite() +- Check for some malloc() failures in gzio.c +- Fix bug in gzopen() on single-byte file 0x1f +- Fix bug in gzread() on concatenated file with 0x1f at end of buffer + and next buffer doesn't start with 0x8b +- Fix uncompress() to return Z_DATA_ERROR on truncated input +- Free memory at end of example.c +- Remove MAX #define in trees.c (conflicted with some libraries) +- Fix static const's in deflate.c, gzio.c, and zutil.[ch] +- Declare malloc() and free() in gzio.c if STDC not defined +- Use malloc() instead of calloc() in zutil.c if int big enough +- Define STDC for AIX +- Add aix/ with approach for compiling shared library on AIX +- Add HP-UX support for shared libraries in configure +- Add OpenUNIX support for shared libraries in configure +- Use $cc instead of gcc to build shared library +- Make prefix directory if needed when installing +- Correct Macintosh avoidance of typedef Byte in zconf.h +- Correct Turbo C memory allocation when under Linux +- Use libz.a instead of -lz in Makefile (assure use of compiled library) +- Update configure to check for snprintf or vsnprintf functions and their + return value, warn during make if using an insecure function +- Fix configure problem with compile-time knowledge of HAVE_UNISTD_H that + is lost when library is used--resolution is to build new zconf.h +- Documentation improvements (in zlib.h): + - Document raw deflate and inflate + - Update RFCs URL + - Point out that zlib and gzip formats are different + - Note that Z_BUF_ERROR is not fatal + - Document string limit for gzprintf() and possible buffer overflow + - Note requirement on avail_out when flushing + - Note permitted values of flush parameter of inflate() +- Add some FAQs (and even answers) to the FAQ +- Add contrib/inflate86/ for x86 faster inflate +- Add contrib/blast/ for PKWare Data Compression Library decompression +- Add contrib/puff/ simple inflate for deflate format description + +Changes in 1.1.4 (11 March 2002) +- ZFREE was repeated on same allocation on some error conditions. + This creates a security problem described in + http://www.zlib.org/advisory-2002-03-11.txt +- Returned incorrect error (Z_MEM_ERROR) on some invalid data +- Avoid accesses before window for invalid distances with inflate window + less than 32K. +- force windowBits > 8 to avoid a bug in the encoder for a window size + of 256 bytes. (A complete fix will be available in 1.1.5). + +Changes in 1.1.3 (9 July 1998) +- fix "an inflate input buffer bug that shows up on rare but persistent + occasions" (Mark) +- fix gzread and gztell for concatenated .gz files (Didier Le Botlan) +- fix gzseek(..., SEEK_SET) in write mode +- fix crc check after a gzeek (Frank Faubert) +- fix miniunzip when the last entry in a zip file is itself a zip file + (J Lillge) +- add contrib/asm586 and contrib/asm686 (Brian Raiter) + See http://www.muppetlabs.com/~breadbox/software/assembly.html +- add support for Delphi 3 in contrib/delphi (Bob Dellaca) +- add support for C++Builder 3 and Delphi 3 in contrib/delphi2 (Davide Moretti) +- do not exit prematurely in untgz if 0 at start of block (Magnus Holmgren) +- use macro EXTERN instead of extern to support DLL for BeOS (Sander Stoks) +- added a FAQ file + +- Support gzdopen on Mac with Metrowerks (Jason Linhart) +- Do not redefine Byte on Mac (Brad Pettit & Jason Linhart) +- define SEEK_END too if SEEK_SET is not defined (Albert Chin-A-Young) +- avoid some warnings with Borland C (Tom Tanner) +- fix a problem in contrib/minizip/zip.c for 16-bit MSDOS (Gilles Vollant) +- emulate utime() for WIN32 in contrib/untgz (Gilles Vollant) +- allow several arguments to configure (Tim Mooney, Frodo Looijaard) +- use libdir and includedir in Makefile.in (Tim Mooney) +- support shared libraries on OSF1 V4 (Tim Mooney) +- remove so_locations in "make clean" (Tim Mooney) +- fix maketree.c compilation error (Glenn, Mark) +- Python interface to zlib now in Python 1.5 (Jeremy Hylton) +- new Makefile.riscos (Rich Walker) +- initialize static descriptors in trees.c for embedded targets (Nick Smith) +- use "foo-gz" in example.c for RISCOS and VMS (Nick Smith) +- add the OS/2 files in Makefile.in too (Andrew Zabolotny) +- fix fdopen and halloc macros for Microsoft C 6.0 (Tom Lane) +- fix maketree.c to allow clean compilation of inffixed.h (Mark) +- fix parameter check in deflateCopy (Gunther Nikl) +- cleanup trees.c, use compressed_len only in debug mode (Christian Spieler) +- Many portability patches by Christian Spieler: + . zutil.c, zutil.h: added "const" for zmem* + . Make_vms.com: fixed some typos + . Make_vms.com: msdos/Makefile.*: removed zutil.h from some dependency lists + . msdos/Makefile.msc: remove "default rtl link library" info from obj files + . msdos/Makefile.*: use model-dependent name for the built zlib library + . msdos/Makefile.emx, nt/Makefile.emx, nt/Makefile.gcc: + new makefiles, for emx (DOS/OS2), emx&rsxnt and mingw32 (Windows 9x / NT) +- use define instead of typedef for Bytef also for MSC small/medium (Tom Lane) +- replace __far with _far for better portability (Christian Spieler, Tom Lane) +- fix test for errno.h in configure (Tim Newsham) + +Changes in 1.1.2 (19 March 98) +- added contrib/minzip, mini zip and unzip based on zlib (Gilles Vollant) + See http://www.winimage.com/zLibDll/unzip.html +- preinitialize the inflate tables for fixed codes, to make the code + completely thread safe (Mark) +- some simplifications and slight speed-up to the inflate code (Mark) +- fix gzeof on non-compressed files (Allan Schrum) +- add -std1 option in configure for OSF1 to fix gzprintf (Martin Mokrejs) +- use default value of 4K for Z_BUFSIZE for 16-bit MSDOS (Tim Wegner + Glenn) +- added os2/Makefile.def and os2/zlib.def (Andrew Zabolotny) +- add shared lib support for UNIX_SV4.2MP (MATSUURA Takanori) +- do not wrap extern "C" around system includes (Tom Lane) +- mention zlib binding for TCL in README (Andreas Kupries) +- added amiga/Makefile.pup for Amiga powerUP SAS/C PPC (Andreas Kleinert) +- allow "make install prefix=..." even after configure (Glenn Randers-Pehrson) +- allow "configure --prefix $HOME" (Tim Mooney) +- remove warnings in example.c and gzio.c (Glenn Randers-Pehrson) +- move Makefile.sas to amiga/Makefile.sas + +Changes in 1.1.1 (27 Feb 98) +- fix macros _tr_tally_* in deflate.h for debug mode (Glenn Randers-Pehrson) +- remove block truncation heuristic which had very marginal effect for zlib + (smaller lit_bufsize than in gzip 1.2.4) and degraded a little the + compression ratio on some files. This also allows inlining _tr_tally for + matches in deflate_slow. +- added msdos/Makefile.w32 for WIN32 Microsoft Visual C++ (Bob Frazier) + +Changes in 1.1.0 (24 Feb 98) +- do not return STREAM_END prematurely in inflate (John Bowler) +- revert to the zlib 1.0.8 inflate to avoid the gcc 2.8.0 bug (Jeremy Buhler) +- compile with -DFASTEST to get compression code optimized for speed only +- in minigzip, try mmap'ing the input file first (Miguel Albrecht) +- increase size of I/O buffers in minigzip.c and gzio.c (not a big gain + on Sun but significant on HP) + +- add a pointer to experimental unzip library in README (Gilles Vollant) +- initialize variable gcc in configure (Chris Herborth) + +Changes in 1.0.9 (17 Feb 1998) +- added gzputs and gzgets functions +- do not clear eof flag in gzseek (Mark Diekhans) +- fix gzseek for files in transparent mode (Mark Diekhans) +- do not assume that vsprintf returns the number of bytes written (Jens Krinke) +- replace EXPORT with ZEXPORT to avoid conflict with other programs +- added compress2 in zconf.h, zlib.def, zlib.dnt +- new asm code from Gilles Vollant in contrib/asm386 +- simplify the inflate code (Mark): + . Replace ZALLOC's in huft_build() with single ZALLOC in inflate_blocks_new() + . ZALLOC the length list in inflate_trees_fixed() instead of using stack + . ZALLOC the value area for huft_build() instead of using stack + . Simplify Z_FINISH check in inflate() + +- Avoid gcc 2.8.0 comparison bug a little differently than zlib 1.0.8 +- in inftrees.c, avoid cc -O bug on HP (Farshid Elahi) +- in zconf.h move the ZLIB_DLL stuff earlier to avoid problems with + the declaration of FAR (Gilles VOllant) +- install libz.so* with mode 755 (executable) instead of 644 (Marc Lehmann) +- read_buf buf parameter of type Bytef* instead of charf* +- zmemcpy parameters are of type Bytef*, not charf* (Joseph Strout) +- do not redeclare unlink in minigzip.c for WIN32 (John Bowler) +- fix check for presence of directories in "make install" (Ian Willis) + +Changes in 1.0.8 (27 Jan 1998) +- fixed offsets in contrib/asm386/gvmat32.asm (Gilles Vollant) +- fix gzgetc and gzputc for big endian systems (Markus Oberhumer) +- added compress2() to allow setting the compression level +- include sys/types.h to get off_t on some systems (Marc Lehmann & QingLong) +- use constant arrays for the static trees in trees.c instead of computing + them at run time (thanks to Ken Raeburn for this suggestion). To create + trees.h, compile with GEN_TREES_H and run "make test". +- check return code of example in "make test" and display result +- pass minigzip command line options to file_compress +- simplifying code of inflateSync to avoid gcc 2.8 bug + +- support CC="gcc -Wall" in configure -s (QingLong) +- avoid a flush caused by ftell in gzopen for write mode (Ken Raeburn) +- fix test for shared library support to avoid compiler warnings +- zlib.lib -> zlib.dll in msdos/zlib.rc (Gilles Vollant) +- check for TARGET_OS_MAC in addition to MACOS (Brad Pettit) +- do not use fdopen for Metrowerks on Mac (Brad Pettit)) +- add checks for gzputc and gzputc in example.c +- avoid warnings in gzio.c and deflate.c (Andreas Kleinert) +- use const for the CRC table (Ken Raeburn) +- fixed "make uninstall" for shared libraries +- use Tracev instead of Trace in infblock.c +- in example.c use correct compressed length for test_sync +- suppress +vnocompatwarnings in configure for HPUX (not always supported) + +Changes in 1.0.7 (20 Jan 1998) +- fix gzseek which was broken in write mode +- return error for gzseek to negative absolute position +- fix configure for Linux (Chun-Chung Chen) +- increase stack space for MSC (Tim Wegner) +- get_crc_table and inflateSyncPoint are EXPORTed (Gilles Vollant) +- define EXPORTVA for gzprintf (Gilles Vollant) +- added man page zlib.3 (Rick Rodgers) +- for contrib/untgz, fix makedir() and improve Makefile + +- check gzseek in write mode in example.c +- allocate extra buffer for seeks only if gzseek is actually called +- avoid signed/unsigned comparisons (Tim Wegner, Gilles Vollant) +- add inflateSyncPoint in zconf.h +- fix list of exported functions in nt/zlib.dnt and mdsos/zlib.def + +Changes in 1.0.6 (19 Jan 1998) +- add functions gzprintf, gzputc, gzgetc, gztell, gzeof, gzseek, gzrewind and + gzsetparams (thanks to Roland Giersig and Kevin Ruland for some of this code) +- Fix a deflate bug occurring only with compression level 0 (thanks to + Andy Buckler for finding this one). +- In minigzip, pass transparently also the first byte for .Z files. +- return Z_BUF_ERROR instead of Z_OK if output buffer full in uncompress() +- check Z_FINISH in inflate (thanks to Marc Schluper) +- Implement deflateCopy (thanks to Adam Costello) +- make static libraries by default in configure, add --shared option. +- move MSDOS or Windows specific files to directory msdos +- suppress the notion of partial flush to simplify the interface + (but the symbol Z_PARTIAL_FLUSH is kept for compatibility with 1.0.4) +- suppress history buffer provided by application to simplify the interface + (this feature was not implemented anyway in 1.0.4) +- next_in and avail_in must be initialized before calling inflateInit or + inflateInit2 +- add EXPORT in all exported functions (for Windows DLL) +- added Makefile.nt (thanks to Stephen Williams) +- added the unsupported "contrib" directory: + contrib/asm386/ by Gilles Vollant + 386 asm code replacing longest_match(). + contrib/iostream/ by Kevin Ruland + A C++ I/O streams interface to the zlib gz* functions + contrib/iostream2/ by Tyge LÃļvset + Another C++ I/O streams interface + contrib/untgz/ by "Pedro A. Aranda Guti\irrez" + A very simple tar.gz file extractor using zlib + contrib/visual-basic.txt by Carlos Rios + How to use compress(), uncompress() and the gz* functions from VB. +- pass params -f (filtered data), -h (huffman only), -1 to -9 (compression + level) in minigzip (thanks to Tom Lane) + +- use const for rommable constants in deflate +- added test for gzseek and gztell in example.c +- add undocumented function inflateSyncPoint() (hack for Paul Mackerras) +- add undocumented function zError to convert error code to string + (for Tim Smithers) +- Allow compilation of gzio with -DNO_DEFLATE to avoid the compression code. +- Use default memcpy for Symantec MSDOS compiler. +- Add EXPORT keyword for check_func (needed for Windows DLL) +- add current directory to LD_LIBRARY_PATH for "make test" +- create also a link for libz.so.1 +- added support for FUJITSU UXP/DS (thanks to Toshiaki Nomura) +- use $(SHAREDLIB) instead of libz.so in Makefile.in (for HPUX) +- added -soname for Linux in configure (Chun-Chung Chen, +- assign numbers to the exported functions in zlib.def (for Windows DLL) +- add advice in zlib.h for best usage of deflateSetDictionary +- work around compiler bug on Atari (cast Z_NULL in call of s->checkfn) +- allow compilation with ANSI keywords only enabled for TurboC in large model +- avoid "versionString"[0] (Borland bug) +- add NEED_DUMMY_RETURN for Borland +- use variable z_verbose for tracing in debug mode (L. Peter Deutsch). +- allow compilation with CC +- defined STDC for OS/2 (David Charlap) +- limit external names to 8 chars for MVS (Thomas Lund) +- in minigzip.c, use static buffers only for 16-bit systems +- fix suffix check for "minigzip -d foo.gz" +- do not return an error for the 2nd of two consecutive gzflush() (Felix Lee) +- use _fdopen instead of fdopen for MSC >= 6.0 (Thomas Fanslau) +- added makelcc.bat for lcc-win32 (Tom St Denis) +- in Makefile.dj2, use copy and del instead of install and rm (Frank Donahoe) +- Avoid expanded $Id$. Use "rcs -kb" or "cvs admin -kb" to avoid Id expansion. +- check for unistd.h in configure (for off_t) +- remove useless check parameter in inflate_blocks_free +- avoid useless assignment of s->check to itself in inflate_blocks_new +- do not flush twice in gzclose (thanks to Ken Raeburn) +- rename FOPEN as F_OPEN to avoid clash with /usr/include/sys/file.h +- use NO_ERRNO_H instead of enumeration of operating systems with errno.h +- work around buggy fclose on pipes for HP/UX +- support zlib DLL with BORLAND C++ 5.0 (thanks to Glenn Randers-Pehrson) +- fix configure if CC is already equal to gcc + +Changes in 1.0.5 (3 Jan 98) +- Fix inflate to terminate gracefully when fed corrupted or invalid data +- Use const for rommable constants in inflate +- Eliminate memory leaks on error conditions in inflate +- Removed some vestigial code in inflate +- Update web address in README + +Changes in 1.0.4 (24 Jul 96) +- In very rare conditions, deflate(s, Z_FINISH) could fail to produce an EOF + bit, so the decompressor could decompress all the correct data but went + on to attempt decompressing extra garbage data. This affected minigzip too. +- zlibVersion and gzerror return const char* (needed for DLL) +- port to RISCOS (no fdopen, no multiple dots, no unlink, no fileno) +- use z_error only for DEBUG (avoid problem with DLLs) + +Changes in 1.0.3 (2 Jul 96) +- use z_streamp instead of z_stream *, which is now a far pointer in MSDOS + small and medium models; this makes the library incompatible with previous + versions for these models. (No effect in large model or on other systems.) +- return OK instead of BUF_ERROR if previous deflate call returned with + avail_out as zero but there is nothing to do +- added memcmp for non STDC compilers +- define NO_DUMMY_DECL for more Mac compilers (.h files merged incorrectly) +- define __32BIT__ if __386__ or i386 is defined (pb. with Watcom and SCO) +- better check for 16-bit mode MSC (avoids problem with Symantec) + +Changes in 1.0.2 (23 May 96) +- added Windows DLL support +- added a function zlibVersion (for the DLL support) +- fixed declarations using Bytef in infutil.c (pb with MSDOS medium model) +- Bytef is define's instead of typedef'd only for Borland C +- avoid reading uninitialized memory in example.c +- mention in README that the zlib format is now RFC1950 +- updated Makefile.dj2 +- added algorithm.doc + +Changes in 1.0.1 (20 May 96) [1.0 skipped to avoid confusion] +- fix array overlay in deflate.c which sometimes caused bad compressed data +- fix inflate bug with empty stored block +- fix MSDOS medium model which was broken in 0.99 +- fix deflateParams() which could generate bad compressed data. +- Bytef is define'd instead of typedef'ed (work around Borland bug) +- added an INDEX file +- new makefiles for DJGPP (Makefile.dj2), 32-bit Borland (Makefile.b32), + Watcom (Makefile.wat), Amiga SAS/C (Makefile.sas) +- speed up adler32 for modern machines without auto-increment +- added -ansi for IRIX in configure +- static_init_done in trees.c is an int +- define unlink as delete for VMS +- fix configure for QNX +- add configure branch for SCO and HPUX +- avoid many warnings (unused variables, dead assignments, etc...) +- no fdopen for BeOS +- fix the Watcom fix for 32 bit mode (define FAR as empty) +- removed redefinition of Byte for MKWERKS +- work around an MWKERKS bug (incorrect merge of all .h files) + +Changes in 0.99 (27 Jan 96) +- allow preset dictionary shared between compressor and decompressor +- allow compression level 0 (no compression) +- add deflateParams in zlib.h: allow dynamic change of compression level + and compression strategy. +- test large buffers and deflateParams in example.c +- add optional "configure" to build zlib as a shared library +- suppress Makefile.qnx, use configure instead +- fixed deflate for 64-bit systems (detected on Cray) +- fixed inflate_blocks for 64-bit systems (detected on Alpha) +- declare Z_DEFLATED in zlib.h (possible parameter for deflateInit2) +- always return Z_BUF_ERROR when deflate() has nothing to do +- deflateInit and inflateInit are now macros to allow version checking +- prefix all global functions and types with z_ with -DZ_PREFIX +- make falloc completely reentrant (inftrees.c) +- fixed very unlikely race condition in ct_static_init +- free in reverse order of allocation to help memory manager +- use zlib-1.0/* instead of zlib/* inside the tar.gz +- make zlib warning-free with "gcc -O3 -Wall -Wwrite-strings -Wpointer-arith + -Wconversion -Wstrict-prototypes -Wmissing-prototypes" +- allow gzread on concatenated .gz files +- deflateEnd now returns Z_DATA_ERROR if it was premature +- deflate is finally (?) fully deterministic (no matches beyond end of input) +- Document Z_SYNC_FLUSH +- add uninstall in Makefile +- Check for __cpluplus in zlib.h +- Better test in ct_align for partial flush +- avoid harmless warnings for Borland C++ +- initialize hash_head in deflate.c +- avoid warning on fdopen (gzio.c) for HP cc -Aa +- include stdlib.h for STDC compilers +- include errno.h for Cray +- ignore error if ranlib doesn't exist +- call ranlib twice for NeXTSTEP +- use exec_prefix instead of prefix for libz.a +- renamed ct_* as _tr_* to avoid conflict with applications +- clear z->msg in inflateInit2 before any error return +- initialize opaque in example.c, gzio.c, deflate.c and inflate.c +- fixed typo in zconf.h (_GNUC__ => __GNUC__) +- check for WIN32 in zconf.h and zutil.c (avoid farmalloc in 32-bit mode) +- fix typo in Make_vms.com (f$trnlnm -> f$getsyi) +- in fcalloc, normalize pointer if size > 65520 bytes +- don't use special fcalloc for 32 bit Borland C++ +- use STDC instead of __GO32__ to avoid redeclaring exit, calloc, etc... +- use Z_BINARY instead of BINARY +- document that gzclose after gzdopen will close the file +- allow "a" as mode in gzopen. +- fix error checking in gzread +- allow skipping .gz extra-field on pipes +- added reference to Perl interface in README +- put the crc table in FAR data (I dislike more and more the medium model :) +- added get_crc_table +- added a dimension to all arrays (Borland C can't count). +- workaround Borland C bug in declaration of inflate_codes_new & inflate_fast +- guard against multiple inclusion of *.h (for precompiled header on Mac) +- Watcom C pretends to be Microsoft C small model even in 32 bit mode. +- don't use unsized arrays to avoid silly warnings by Visual C++: + warning C4746: 'inflate_mask' : unsized array treated as '__far' + (what's wrong with far data in far model?). +- define enum out of inflate_blocks_state to allow compilation with C++ + +Changes in 0.95 (16 Aug 95) +- fix MSDOS small and medium model (now easier to adapt to any compiler) +- inlined send_bits +- fix the final (:-) bug for deflate with flush (output was correct but + not completely flushed in rare occasions). +- default window size is same for compression and decompression + (it's now sufficient to set MAX_WBITS in zconf.h). +- voidp -> voidpf and voidnp -> voidp (for consistency with other + typedefs and because voidnp was not near in large model). + +Changes in 0.94 (13 Aug 95) +- support MSDOS medium model +- fix deflate with flush (could sometimes generate bad output) +- fix deflateReset (zlib header was incorrectly suppressed) +- added support for VMS +- allow a compression level in gzopen() +- gzflush now calls fflush +- For deflate with flush, flush even if no more input is provided. +- rename libgz.a as libz.a +- avoid complex expression in infcodes.c triggering Turbo C bug +- work around a problem with gcc on Alpha (in INSERT_STRING) +- don't use inline functions (problem with some gcc versions) +- allow renaming of Byte, uInt, etc... with #define. +- avoid warning about (unused) pointer before start of array in deflate.c +- avoid various warnings in gzio.c, example.c, infblock.c, adler32.c, zutil.c +- avoid reserved word 'new' in trees.c + +Changes in 0.93 (25 June 95) +- temporarily disable inline functions +- make deflate deterministic +- give enough lookahead for PARTIAL_FLUSH +- Set binary mode for stdin/stdout in minigzip.c for OS/2 +- don't even use signed char in inflate (not portable enough) +- fix inflate memory leak for segmented architectures + +Changes in 0.92 (3 May 95) +- don't assume that char is signed (problem on SGI) +- Clear bit buffer when starting a stored block +- no memcpy on Pyramid +- suppressed inftest.c +- optimized fill_window, put longest_match inline for gcc +- optimized inflate on stored blocks. +- untabify all sources to simplify patches + +Changes in 0.91 (2 May 95) +- Default MEM_LEVEL is 8 (not 9 for Unix) as documented in zlib.h +- Document the memory requirements in zconf.h +- added "make install" +- fix sync search logic in inflateSync +- deflate(Z_FULL_FLUSH) now works even if output buffer too short +- after inflateSync, don't scare people with just "lo world" +- added support for DJGPP + +Changes in 0.9 (1 May 95) +- don't assume that zalloc clears the allocated memory (the TurboC bug + was Mark's bug after all :) +- let again gzread copy uncompressed data unchanged (was working in 0.71) +- deflate(Z_FULL_FLUSH), inflateReset and inflateSync are now fully implemented +- added a test of inflateSync in example.c +- moved MAX_WBITS to zconf.h because users might want to change that. +- document explicitly that zalloc(64K) on MSDOS must return a normalized + pointer (zero offset) +- added Makefiles for Microsoft C, Turbo C, Borland C++ +- faster crc32() + +Changes in 0.8 (29 April 95) +- added fast inflate (inffast.c) +- deflate(Z_FINISH) now returns Z_STREAM_END when done. Warning: this + is incompatible with previous versions of zlib which returned Z_OK. +- work around a TurboC compiler bug (bad code for b << 0, see infutil.h) + (actually that was not a compiler bug, see 0.81 above) +- gzread no longer reads one extra byte in certain cases +- In gzio destroy(), don't reference a freed structure +- avoid many warnings for MSDOS +- avoid the ERROR symbol which is used by MS Windows + +Changes in 0.71 (14 April 95) +- Fixed more MSDOS compilation problems :( There is still a bug with + TurboC large model. + +Changes in 0.7 (14 April 95) +- Added full inflate support. +- Simplified the crc32() interface. The pre- and post-conditioning + (one's complement) is now done inside crc32(). WARNING: this is + incompatible with previous versions; see zlib.h for the new usage. + +Changes in 0.61 (12 April 95) +- workaround for a bug in TurboC. example and minigzip now work on MSDOS. + +Changes in 0.6 (11 April 95) +- added minigzip.c +- added gzdopen to reopen a file descriptor as gzFile +- added transparent reading of non-gziped files in gzread. +- fixed bug in gzread (don't read crc as data) +- fixed bug in destroy (gzio.c) (don't return Z_STREAM_END for gzclose). +- don't allocate big arrays in the stack (for MSDOS) +- fix some MSDOS compilation problems + +Changes in 0.5: +- do real compression in deflate.c. Z_PARTIAL_FLUSH is supported but + not yet Z_FULL_FLUSH. +- support decompression but only in a single step (forced Z_FINISH) +- added opaque object for zalloc and zfree. +- added deflateReset and inflateReset +- added a variable zlib_version for consistency checking. +- renamed the 'filter' parameter of deflateInit2 as 'strategy'. + Added Z_FILTERED and Z_HUFFMAN_ONLY constants. + +Changes in 0.4: +- avoid "zip" everywhere, use zlib instead of ziplib. +- suppress Z_BLOCK_FLUSH, interpret Z_PARTIAL_FLUSH as block flush + if compression method == 8. +- added adler32 and crc32 +- renamed deflateOptions as deflateInit2, call one or the other but not both +- added the method parameter for deflateInit2. +- added inflateInit2 +- simplied considerably deflateInit and inflateInit by not supporting + user-provided history buffer. This is supported only in deflateInit2 + and inflateInit2. + +Changes in 0.3: +- prefix all macro names with Z_ +- use Z_FINISH instead of deflateEnd to finish compression. +- added Z_HUFFMAN_ONLY +- added gzerror() diff --git a/core/cd_hw/libchdr/deps/zlib/README b/core/cd_hw/libchdr/deps/zlib/README new file mode 100644 index 0000000..51106de --- /dev/null +++ b/core/cd_hw/libchdr/deps/zlib/README @@ -0,0 +1,115 @@ +ZLIB DATA COMPRESSION LIBRARY + +zlib 1.2.11 is a general purpose data compression library. All the code is +thread safe. The data format used by the zlib library is described by RFCs +(Request for Comments) 1950 to 1952 in the files +http://tools.ietf.org/html/rfc1950 (zlib format), rfc1951 (deflate format) and +rfc1952 (gzip format). + +All functions of the compression library are documented in the file zlib.h +(volunteer to write man pages welcome, contact zlib@gzip.org). A usage example +of the library is given in the file test/example.c which also tests that +the library is working correctly. Another example is given in the file +test/minigzip.c. The compression library itself is composed of all source +files in the root directory. + +To compile all files and run the test program, follow the instructions given at +the top of Makefile.in. In short "./configure; make test", and if that goes +well, "make install" should work for most flavors of Unix. For Windows, use +one of the special makefiles in win32/ or contrib/vstudio/ . For VMS, use +make_vms.com. + +Questions about zlib should be sent to , or to Gilles Vollant + for the Windows DLL version. The zlib home page is +http://zlib.net/ . Before reporting a problem, please check this site to +verify that you have the latest version of zlib; otherwise get the latest +version and check whether the problem still exists or not. + +PLEASE read the zlib FAQ http://zlib.net/zlib_faq.html before asking for help. + +Mark Nelson wrote an article about zlib for the Jan. 1997 +issue of Dr. Dobb's Journal; a copy of the article is available at +http://marknelson.us/1997/01/01/zlib-engine/ . + +The changes made in version 1.2.11 are documented in the file ChangeLog. + +Unsupported third party contributions are provided in directory contrib/ . + +zlib is available in Java using the java.util.zip package, documented at +http://java.sun.com/developer/technicalArticles/Programming/compression/ . + +A Perl interface to zlib written by Paul Marquess is available +at CPAN (Comprehensive Perl Archive Network) sites, including +http://search.cpan.org/~pmqs/IO-Compress-Zlib/ . + +A Python interface to zlib written by A.M. Kuchling is +available in Python 1.5 and later versions, see +http://docs.python.org/library/zlib.html . + +zlib is built into tcl: http://wiki.tcl.tk/4610 . + +An experimental package to read and write files in .zip format, written on top +of zlib by Gilles Vollant , is available in the +contrib/minizip directory of zlib. + + +Notes for some targets: + +- For Windows DLL versions, please see win32/DLL_FAQ.txt + +- For 64-bit Irix, deflate.c must be compiled without any optimization. With + -O, one libpng test fails. The test works in 32 bit mode (with the -n32 + compiler flag). The compiler bug has been reported to SGI. + +- zlib doesn't work with gcc 2.6.3 on a DEC 3000/300LX under OSF/1 2.1 it works + when compiled with cc. + +- On Digital Unix 4.0D (formely OSF/1) on AlphaServer, the cc option -std1 is + necessary to get gzprintf working correctly. This is done by configure. + +- zlib doesn't work on HP-UX 9.05 with some versions of /bin/cc. It works with + other compilers. Use "make test" to check your compiler. + +- gzdopen is not supported on RISCOS or BEOS. + +- For PalmOs, see http://palmzlib.sourceforge.net/ + + +Acknowledgments: + + The deflate format used by zlib was defined by Phil Katz. The deflate and + zlib specifications were written by L. Peter Deutsch. Thanks to all the + people who reported problems and suggested various improvements in zlib; they + are too numerous to cite here. + +Copyright notice: + + (C) 1995-2017 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + +If you use the zlib library in a product, we would appreciate *not* receiving +lengthy legal documents to sign. The sources are provided for free but without +warranty of any kind. The library has been entirely written by Jean-loup +Gailly and Mark Adler; it does not include third-party code. + +If you redistribute modified sources, we would appreciate that you include in +the file ChangeLog history information documenting your changes. Please read +the FAQ for more information on the distribution of modified source versions. diff --git a/core/cd_hw/libchdr/deps/zlib/adler32.c b/core/cd_hw/libchdr/deps/zlib/adler32.c new file mode 100644 index 0000000..d0be438 --- /dev/null +++ b/core/cd_hw/libchdr/deps/zlib/adler32.c @@ -0,0 +1,186 @@ +/* adler32.c -- compute the Adler-32 checksum of a data stream + * Copyright (C) 1995-2011, 2016 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#include "zutil.h" + +local uLong adler32_combine_ OF((uLong adler1, uLong adler2, z_off64_t len2)); + +#define BASE 65521U /* largest prime smaller than 65536 */ +#define NMAX 5552 +/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ + +#define DO1(buf,i) {adler += (buf)[i]; sum2 += adler;} +#define DO2(buf,i) DO1(buf,i); DO1(buf,i+1); +#define DO4(buf,i) DO2(buf,i); DO2(buf,i+2); +#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); +#define DO16(buf) DO8(buf,0); DO8(buf,8); + +/* use NO_DIVIDE if your processor does not do division in hardware -- + try it both ways to see which is faster */ +#ifdef NO_DIVIDE +/* note that this assumes BASE is 65521, where 65536 % 65521 == 15 + (thank you to John Reiser for pointing this out) */ +# define CHOP(a) \ + do { \ + unsigned long tmp = a >> 16; \ + a &= 0xffffUL; \ + a += (tmp << 4) - tmp; \ + } while (0) +# define MOD28(a) \ + do { \ + CHOP(a); \ + if (a >= BASE) a -= BASE; \ + } while (0) +# define MOD(a) \ + do { \ + CHOP(a); \ + MOD28(a); \ + } while (0) +# define MOD63(a) \ + do { /* this assumes a is not negative */ \ + z_off64_t tmp = a >> 32; \ + a &= 0xffffffffL; \ + a += (tmp << 8) - (tmp << 5) + tmp; \ + tmp = a >> 16; \ + a &= 0xffffL; \ + a += (tmp << 4) - tmp; \ + tmp = a >> 16; \ + a &= 0xffffL; \ + a += (tmp << 4) - tmp; \ + if (a >= BASE) a -= BASE; \ + } while (0) +#else +# define MOD(a) a %= BASE +# define MOD28(a) a %= BASE +# define MOD63(a) a %= BASE +#endif + +/* ========================================================================= */ +uLong ZEXPORT adler32_z(adler, buf, len) + uLong adler; + const Bytef *buf; + z_size_t len; +{ + unsigned long sum2; + unsigned n; + + /* split Adler-32 into component sums */ + sum2 = (adler >> 16) & 0xffff; + adler &= 0xffff; + + /* in case user likes doing a byte at a time, keep it fast */ + if (len == 1) { + adler += buf[0]; + if (adler >= BASE) + adler -= BASE; + sum2 += adler; + if (sum2 >= BASE) + sum2 -= BASE; + return adler | (sum2 << 16); + } + + /* initial Adler-32 value (deferred check for len == 1 speed) */ + if (buf == Z_NULL) + return 1L; + + /* in case short lengths are provided, keep it somewhat fast */ + if (len < 16) { + while (len--) { + adler += *buf++; + sum2 += adler; + } + if (adler >= BASE) + adler -= BASE; + MOD28(sum2); /* only added so many BASE's */ + return adler | (sum2 << 16); + } + + /* do length NMAX blocks -- requires just one modulo operation */ + while (len >= NMAX) { + len -= NMAX; + n = NMAX / 16; /* NMAX is divisible by 16 */ + do { + DO16(buf); /* 16 sums unrolled */ + buf += 16; + } while (--n); + MOD(adler); + MOD(sum2); + } + + /* do remaining bytes (less than NMAX, still just one modulo) */ + if (len) { /* avoid modulos if none remaining */ + while (len >= 16) { + len -= 16; + DO16(buf); + buf += 16; + } + while (len--) { + adler += *buf++; + sum2 += adler; + } + MOD(adler); + MOD(sum2); + } + + /* return recombined sums */ + return adler | (sum2 << 16); +} + +/* ========================================================================= */ +uLong ZEXPORT adler32(adler, buf, len) + uLong adler; + const Bytef *buf; + uInt len; +{ + return adler32_z(adler, buf, len); +} + +/* ========================================================================= */ +local uLong adler32_combine_(adler1, adler2, len2) + uLong adler1; + uLong adler2; + z_off64_t len2; +{ + unsigned long sum1; + unsigned long sum2; + unsigned rem; + + /* for negative len, return invalid adler32 as a clue for debugging */ + if (len2 < 0) + return 0xffffffffUL; + + /* the derivation of this formula is left as an exercise for the reader */ + MOD63(len2); /* assumes len2 >= 0 */ + rem = (unsigned)len2; + sum1 = adler1 & 0xffff; + sum2 = rem * sum1; + MOD(sum2); + sum1 += (adler2 & 0xffff) + BASE - 1; + sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem; + if (sum1 >= BASE) sum1 -= BASE; + if (sum1 >= BASE) sum1 -= BASE; + if (sum2 >= ((unsigned long)BASE << 1)) sum2 -= ((unsigned long)BASE << 1); + if (sum2 >= BASE) sum2 -= BASE; + return sum1 | (sum2 << 16); +} + +/* ========================================================================= */ +uLong ZEXPORT adler32_combine(adler1, adler2, len2) + uLong adler1; + uLong adler2; + z_off_t len2; +{ + return adler32_combine_(adler1, adler2, len2); +} + +uLong ZEXPORT adler32_combine64(adler1, adler2, len2) + uLong adler1; + uLong adler2; + z_off64_t len2; +{ + return adler32_combine_(adler1, adler2, len2); +} diff --git a/core/cd_hw/libchdr/deps/zlib/gzguts.h b/core/cd_hw/libchdr/deps/zlib/gzguts.h new file mode 100644 index 0000000..990a4d2 --- /dev/null +++ b/core/cd_hw/libchdr/deps/zlib/gzguts.h @@ -0,0 +1,218 @@ +/* gzguts.h -- zlib internal header definitions for gz* operations + * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013, 2016 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#ifdef _LARGEFILE64_SOURCE +# ifndef _LARGEFILE_SOURCE +# define _LARGEFILE_SOURCE 1 +# endif +# ifdef _FILE_OFFSET_BITS +# undef _FILE_OFFSET_BITS +# endif +#endif + +#ifdef HAVE_HIDDEN +# define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) +#else +# define ZLIB_INTERNAL +#endif + +#include +#include "zlib.h" +#ifdef STDC +# include +# include +# include +#endif + +#ifndef _POSIX_SOURCE +# define _POSIX_SOURCE +#endif +#include + +#ifdef _WIN32 +# include +#endif + +#if defined(__TURBOC__) || defined(_MSC_VER) || defined(_WIN32) +# include +#endif + +#if defined(_WIN32) || defined(__CYGWIN__) +# define WIDECHAR +#endif + +#ifdef WINAPI_FAMILY +# define open _open +# define read _read +# define write _write +# define close _close +#endif + +#ifdef NO_DEFLATE /* for compatibility with old definition */ +# define NO_GZCOMPRESS +#endif + +#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif + +#if defined(__CYGWIN__) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif + +#if defined(MSDOS) && defined(__BORLANDC__) && (BORLANDC > 0x410) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif + +#ifndef HAVE_VSNPRINTF +# ifdef MSDOS +/* vsnprintf may exist on some MS-DOS compilers (DJGPP?), + but for now we just assume it doesn't. */ +# define NO_vsnprintf +# endif +# ifdef __TURBOC__ +# define NO_vsnprintf +# endif +# ifdef WIN32 +/* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */ +# if !defined(vsnprintf) && !defined(NO_vsnprintf) +# if !defined(_MSC_VER) || ( defined(_MSC_VER) && _MSC_VER < 1500 ) +# define vsnprintf _vsnprintf +# endif +# endif +# endif +# ifdef __SASC +# define NO_vsnprintf +# endif +# ifdef VMS +# define NO_vsnprintf +# endif +# ifdef __OS400__ +# define NO_vsnprintf +# endif +# ifdef __MVS__ +# define NO_vsnprintf +# endif +#endif + +/* unlike snprintf (which is required in C99), _snprintf does not guarantee + null termination of the result -- however this is only used in gzlib.c where + the result is assured to fit in the space provided */ +#if defined(_MSC_VER) && _MSC_VER < 1900 +# define snprintf _snprintf +#endif + +#ifndef local +# define local static +#endif +/* since "static" is used to mean two completely different things in C, we + define "local" for the non-static meaning of "static", for readability + (compile with -Dlocal if your debugger can't find static symbols) */ + +/* gz* functions always use library allocation functions */ +#ifndef STDC + extern voidp malloc OF((uInt size)); + extern void free OF((voidpf ptr)); +#endif + +/* get errno and strerror definition */ +#if defined UNDER_CE +# include +# define zstrerror() gz_strwinerror((DWORD)GetLastError()) +#else +# ifndef NO_STRERROR +# include +# define zstrerror() strerror(errno) +# else +# define zstrerror() "stdio error (consult errno)" +# endif +#endif + +/* provide prototypes for these when building zlib without LFS */ +#if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0 + ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); + ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); + ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); + ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); +#endif + +/* default memLevel */ +#if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +#else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +#endif + +/* default i/o buffer size -- double this for output when reading (this and + twice this must be able to fit in an unsigned type) */ +#define GZBUFSIZE 8192 + +/* gzip modes, also provide a little integrity check on the passed structure */ +#define GZ_NONE 0 +#define GZ_READ 7247 +#define GZ_WRITE 31153 +#define GZ_APPEND 1 /* mode set to GZ_WRITE after the file is opened */ + +/* values for gz_state how */ +#define LOOK 0 /* look for a gzip header */ +#define COPY 1 /* copy input directly */ +#define GZIP 2 /* decompress a gzip stream */ + +/* internal gzip file state data structure */ +typedef struct { + /* exposed contents for gzgetc() macro */ + struct gzFile_s x; /* "x" for exposed */ + /* x.have: number of bytes available at x.next */ + /* x.next: next output data to deliver or write */ + /* x.pos: current position in uncompressed data */ + /* used for both reading and writing */ + int mode; /* see gzip modes above */ + int fd; /* file descriptor */ + char *path; /* path or fd for error messages */ + unsigned size; /* buffer size, zero if not allocated yet */ + unsigned want; /* requested buffer size, default is GZBUFSIZE */ + unsigned char *in; /* input buffer (double-sized when writing) */ + unsigned char *out; /* output buffer (double-sized when reading) */ + int direct; /* 0 if processing gzip, 1 if transparent */ + /* just for reading */ + int how; /* 0: get header, 1: copy, 2: decompress */ + z_off64_t start; /* where the gzip data started, for rewinding */ + int eof; /* true if end of input file reached */ + int past; /* true if read requested past end */ + /* just for writing */ + int level; /* compression level */ + int strategy; /* compression strategy */ + /* seek request */ + z_off64_t skip; /* amount to skip (already rewound if backwards) */ + int seek; /* true if seek request pending */ + /* error information */ + int err; /* error code */ + char *msg; /* error message */ + /* zlib inflate or deflate stream */ + z_stream strm; /* stream structure in-place (not a pointer) */ +} gz_state; +typedef gz_state FAR *gz_statep; + +/* shared functions */ +void ZLIB_INTERNAL gz_error OF((gz_statep, int, const char *)); +#if defined UNDER_CE +char ZLIB_INTERNAL *gz_strwinerror OF((DWORD error)); +#endif + +/* GT_OFF(x), where x is an unsigned value, is true if x > maximum z_off64_t + value -- needed when comparing unsigned to z_off64_t, which is signed + (possible z_off64_t types off_t, off64_t, and long are all signed) */ +#ifdef INT_MAX +# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > INT_MAX) +#else +unsigned ZLIB_INTERNAL gz_intmax OF((void)); +# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax()) +#endif diff --git a/core/cd_hw/libchdr/deps/zlib/inffast.c b/core/cd_hw/libchdr/deps/zlib/inffast.c new file mode 100644 index 0000000..0dbd1db --- /dev/null +++ b/core/cd_hw/libchdr/deps/zlib/inffast.c @@ -0,0 +1,323 @@ +/* inffast.c -- fast decoding + * Copyright (C) 1995-2017 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +#ifdef ASMINF +# pragma message("Assembler code may have bugs -- use at your own risk") +#else + +/* + Decode literal, length, and distance codes and write out the resulting + literal and match bytes until either not enough input or output is + available, an end-of-block is encountered, or a data error is encountered. + When large enough input and output buffers are supplied to inflate(), for + example, a 16K input buffer and a 64K output buffer, more than 95% of the + inflate execution time is spent in this routine. + + Entry assumptions: + + state->mode == LEN + strm->avail_in >= 6 + strm->avail_out >= 258 + start >= strm->avail_out + state->bits < 8 + + On return, state->mode is one of: + + LEN -- ran out of enough output space or enough available input + TYPE -- reached end of block code, inflate() to interpret next block + BAD -- error in block data + + Notes: + + - The maximum input bits used by a length/distance pair is 15 bits for the + length code, 5 bits for the length extra, 15 bits for the distance code, + and 13 bits for the distance extra. This totals 48 bits, or six bytes. + Therefore if strm->avail_in >= 6, then there is enough input to avoid + checking for available input while decoding. + + - The maximum bytes that a single length/distance pair can output is 258 + bytes, which is the maximum length that can be coded. inflate_fast() + requires strm->avail_out >= 258 for each loop to avoid checking for + output space. + */ +void ZLIB_INTERNAL inflate_fast(strm, start) +z_streamp strm; +unsigned start; /* inflate()'s starting value for strm->avail_out */ +{ + struct inflate_state FAR *state; + z_const unsigned char FAR *in; /* local strm->next_in */ + z_const unsigned char FAR *last; /* have enough input while in < last */ + unsigned char FAR *out; /* local strm->next_out */ + unsigned char FAR *beg; /* inflate()'s initial strm->next_out */ + unsigned char FAR *end; /* while out < end, enough space available */ +#ifdef INFLATE_STRICT + unsigned dmax; /* maximum distance from zlib header */ +#endif + unsigned wsize; /* window size or zero if not using window */ + unsigned whave; /* valid bytes in the window */ + unsigned wnext; /* window write index */ + unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */ + unsigned long hold; /* local strm->hold */ + unsigned bits; /* local strm->bits */ + code const FAR *lcode; /* local strm->lencode */ + code const FAR *dcode; /* local strm->distcode */ + unsigned lmask; /* mask for first level of length codes */ + unsigned dmask; /* mask for first level of distance codes */ + code here; /* retrieved table entry */ + unsigned op; /* code bits, operation, extra bits, or */ + /* window position, window bytes to copy */ + unsigned len; /* match length, unused bytes */ + unsigned dist; /* match distance */ + unsigned char FAR *from; /* where to copy match from */ + + /* copy state to local variables */ + state = (struct inflate_state FAR *)strm->state; + in = strm->next_in; + last = in + (strm->avail_in - 5); + out = strm->next_out; + beg = out - (start - strm->avail_out); + end = out + (strm->avail_out - 257); +#ifdef INFLATE_STRICT + dmax = state->dmax; +#endif + wsize = state->wsize; + whave = state->whave; + wnext = state->wnext; + window = state->window; + hold = state->hold; + bits = state->bits; + lcode = state->lencode; + dcode = state->distcode; + lmask = (1U << state->lenbits) - 1; + dmask = (1U << state->distbits) - 1; + + /* decode literals and length/distances until end-of-block or not enough + input data or output space */ + do { + if (bits < 15) { + hold += (unsigned long)(*in++) << bits; + bits += 8; + hold += (unsigned long)(*in++) << bits; + bits += 8; + } + here = lcode[hold & lmask]; + dolen: + op = (unsigned)(here.bits); + hold >>= op; + bits -= op; + op = (unsigned)(here.op); + if (op == 0) { /* literal */ + Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", here.val)); + *out++ = (unsigned char)(here.val); + } + else if (op & 16) { /* length base */ + len = (unsigned)(here.val); + op &= 15; /* number of extra bits */ + if (op) { + if (bits < op) { + hold += (unsigned long)(*in++) << bits; + bits += 8; + } + len += (unsigned)hold & ((1U << op) - 1); + hold >>= op; + bits -= op; + } + Tracevv((stderr, "inflate: length %u\n", len)); + if (bits < 15) { + hold += (unsigned long)(*in++) << bits; + bits += 8; + hold += (unsigned long)(*in++) << bits; + bits += 8; + } + here = dcode[hold & dmask]; + dodist: + op = (unsigned)(here.bits); + hold >>= op; + bits -= op; + op = (unsigned)(here.op); + if (op & 16) { /* distance base */ + dist = (unsigned)(here.val); + op &= 15; /* number of extra bits */ + if (bits < op) { + hold += (unsigned long)(*in++) << bits; + bits += 8; + if (bits < op) { + hold += (unsigned long)(*in++) << bits; + bits += 8; + } + } + dist += (unsigned)hold & ((1U << op) - 1); +#ifdef INFLATE_STRICT + if (dist > dmax) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#endif + hold >>= op; + bits -= op; + Tracevv((stderr, "inflate: distance %u\n", dist)); + op = (unsigned)(out - beg); /* max distance in output */ + if (dist > op) { /* see if copy from window */ + op = dist - op; /* distance back in window */ + if (op > whave) { + if (state->sane) { + strm->msg = + (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + if (len <= op - whave) { + do { + *out++ = 0; + } while (--len); + continue; + } + len -= op - whave; + do { + *out++ = 0; + } while (--op > whave); + if (op == 0) { + from = out - dist; + do { + *out++ = *from++; + } while (--len); + continue; + } +#endif + } + from = window; + if (wnext == 0) { /* very common case */ + from += wsize - op; + if (op < len) { /* some from window */ + len -= op; + do { + *out++ = *from++; + } while (--op); + from = out - dist; /* rest from output */ + } + } + else if (wnext < op) { /* wrap around window */ + from += wsize + wnext - op; + op -= wnext; + if (op < len) { /* some from end of window */ + len -= op; + do { + *out++ = *from++; + } while (--op); + from = window; + if (wnext < len) { /* some from start of window */ + op = wnext; + len -= op; + do { + *out++ = *from++; + } while (--op); + from = out - dist; /* rest from output */ + } + } + } + else { /* contiguous in window */ + from += wnext - op; + if (op < len) { /* some from window */ + len -= op; + do { + *out++ = *from++; + } while (--op); + from = out - dist; /* rest from output */ + } + } + while (len > 2) { + *out++ = *from++; + *out++ = *from++; + *out++ = *from++; + len -= 3; + } + if (len) { + *out++ = *from++; + if (len > 1) + *out++ = *from++; + } + } + else { + from = out - dist; /* copy direct from output */ + do { /* minimum length is three */ + *out++ = *from++; + *out++ = *from++; + *out++ = *from++; + len -= 3; + } while (len > 2); + if (len) { + *out++ = *from++; + if (len > 1) + *out++ = *from++; + } + } + } + else if ((op & 64) == 0) { /* 2nd level distance code */ + here = dcode[here.val + (hold & ((1U << op) - 1))]; + goto dodist; + } + else { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + } + else if ((op & 64) == 0) { /* 2nd level length code */ + here = lcode[here.val + (hold & ((1U << op) - 1))]; + goto dolen; + } + else if (op & 32) { /* end-of-block */ + Tracevv((stderr, "inflate: end of block\n")); + state->mode = TYPE; + break; + } + else { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + } while (in < last && out < end); + + /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ + len = bits >> 3; + in -= len; + bits -= len << 3; + hold &= (1U << bits) - 1; + + /* update state and return */ + strm->next_in = in; + strm->next_out = out; + strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last)); + strm->avail_out = (unsigned)(out < end ? + 257 + (end - out) : 257 - (out - end)); + state->hold = hold; + state->bits = bits; + return; +} + +/* + inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe): + - Using bit fields for code structure + - Different op definition to avoid & for extra bits (do & for table bits) + - Three separate decoding do-loops for direct, window, and wnext == 0 + - Special case for distance > 1 copies to do overlapped load and store copy + - Explicit branch predictions (based on measured branch probabilities) + - Deferring match copy and interspersed it with decoding subsequent codes + - Swapping literal/length else + - Swapping window/direct else + - Larger unrolled copy loops (three is about right) + - Moving len -= 3 statement into middle of loop + */ + +#endif /* !ASMINF */ diff --git a/core/cd_hw/libchdr/deps/zlib/inffast.h b/core/cd_hw/libchdr/deps/zlib/inffast.h new file mode 100644 index 0000000..e5c1aa4 --- /dev/null +++ b/core/cd_hw/libchdr/deps/zlib/inffast.h @@ -0,0 +1,11 @@ +/* inffast.h -- header to use inffast.c + * Copyright (C) 1995-2003, 2010 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +void ZLIB_INTERNAL inflate_fast OF((z_streamp strm, unsigned start)); diff --git a/core/cd_hw/libchdr/deps/zlib/inffixed.h b/core/cd_hw/libchdr/deps/zlib/inffixed.h new file mode 100644 index 0000000..d628327 --- /dev/null +++ b/core/cd_hw/libchdr/deps/zlib/inffixed.h @@ -0,0 +1,94 @@ + /* inffixed.h -- table for decoding fixed codes + * Generated automatically by makefixed(). + */ + + /* WARNING: this file should *not* be used by applications. + It is part of the implementation of this library and is + subject to change. Applications should only use zlib.h. + */ + + static const code lenfix[512] = { + {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48}, + {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128}, + {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59}, + {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176}, + {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20}, + {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100}, + {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8}, + {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216}, + {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76}, + {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114}, + {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2}, + {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148}, + {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42}, + {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86}, + {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15}, + {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236}, + {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62}, + {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142}, + {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31}, + {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162}, + {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25}, + {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105}, + {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4}, + {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202}, + {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69}, + {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125}, + {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13}, + {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195}, + {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35}, + {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91}, + {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19}, + {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246}, + {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55}, + {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135}, + {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99}, + {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190}, + {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16}, + {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96}, + {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6}, + {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209}, + {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72}, + {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116}, + {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4}, + {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153}, + {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44}, + {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82}, + {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11}, + {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229}, + {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58}, + {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138}, + {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51}, + {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173}, + {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30}, + {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110}, + {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0}, + {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195}, + {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65}, + {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121}, + {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9}, + {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258}, + {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37}, + {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93}, + {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23}, + {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251}, + {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51}, + {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131}, + {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67}, + {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183}, + {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23}, + {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103}, + {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9}, + {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223}, + {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79}, + {0,9,255} + }; + + static const code distfix[32] = { + {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025}, + {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193}, + {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385}, + {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577}, + {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073}, + {22,5,193},{64,5,0} + }; diff --git a/core/cd_hw/libchdr/deps/zlib/inflate.c b/core/cd_hw/libchdr/deps/zlib/inflate.c new file mode 100644 index 0000000..ac333e8 --- /dev/null +++ b/core/cd_hw/libchdr/deps/zlib/inflate.c @@ -0,0 +1,1561 @@ +/* inflate.c -- zlib decompression + * Copyright (C) 1995-2016 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * Change history: + * + * 1.2.beta0 24 Nov 2002 + * - First version -- complete rewrite of inflate to simplify code, avoid + * creation of window when not needed, minimize use of window when it is + * needed, make inffast.c even faster, implement gzip decoding, and to + * improve code readability and style over the previous zlib inflate code + * + * 1.2.beta1 25 Nov 2002 + * - Use pointers for available input and output checking in inffast.c + * - Remove input and output counters in inffast.c + * - Change inffast.c entry and loop from avail_in >= 7 to >= 6 + * - Remove unnecessary second byte pull from length extra in inffast.c + * - Unroll direct copy to three copies per loop in inffast.c + * + * 1.2.beta2 4 Dec 2002 + * - Change external routine names to reduce potential conflicts + * - Correct filename to inffixed.h for fixed tables in inflate.c + * - Make hbuf[] unsigned char to match parameter type in inflate.c + * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset) + * to avoid negation problem on Alphas (64 bit) in inflate.c + * + * 1.2.beta3 22 Dec 2002 + * - Add comments on state->bits assertion in inffast.c + * - Add comments on op field in inftrees.h + * - Fix bug in reuse of allocated window after inflateReset() + * - Remove bit fields--back to byte structure for speed + * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths + * - Change post-increments to pre-increments in inflate_fast(), PPC biased? + * - Add compile time option, POSTINC, to use post-increments instead (Intel?) + * - Make MATCH copy in inflate() much faster for when inflate_fast() not used + * - Use local copies of stream next and avail values, as well as local bit + * buffer and bit count in inflate()--for speed when inflate_fast() not used + * + * 1.2.beta4 1 Jan 2003 + * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings + * - Move a comment on output buffer sizes from inffast.c to inflate.c + * - Add comments in inffast.c to introduce the inflate_fast() routine + * - Rearrange window copies in inflate_fast() for speed and simplification + * - Unroll last copy for window match in inflate_fast() + * - Use local copies of window variables in inflate_fast() for speed + * - Pull out common wnext == 0 case for speed in inflate_fast() + * - Make op and len in inflate_fast() unsigned for consistency + * - Add FAR to lcode and dcode declarations in inflate_fast() + * - Simplified bad distance check in inflate_fast() + * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new + * source file infback.c to provide a call-back interface to inflate for + * programs like gzip and unzip -- uses window as output buffer to avoid + * window copying + * + * 1.2.beta5 1 Jan 2003 + * - Improved inflateBack() interface to allow the caller to provide initial + * input in strm. + * - Fixed stored blocks bug in inflateBack() + * + * 1.2.beta6 4 Jan 2003 + * - Added comments in inffast.c on effectiveness of POSTINC + * - Typecasting all around to reduce compiler warnings + * - Changed loops from while (1) or do {} while (1) to for (;;), again to + * make compilers happy + * - Changed type of window in inflateBackInit() to unsigned char * + * + * 1.2.beta7 27 Jan 2003 + * - Changed many types to unsigned or unsigned short to avoid warnings + * - Added inflateCopy() function + * + * 1.2.0 9 Mar 2003 + * - Changed inflateBack() interface to provide separate opaque descriptors + * for the in() and out() functions + * - Changed inflateBack() argument and in_func typedef to swap the length + * and buffer address return values for the input function + * - Check next_in and next_out for Z_NULL on entry to inflate() + * + * The history for versions after 1.2.0 are in ChangeLog in zlib distribution. + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +#ifdef MAKEFIXED +# ifndef BUILDFIXED +# define BUILDFIXED +# endif +#endif + +/* function prototypes */ +local int inflateStateCheck OF((z_streamp strm)); +local void fixedtables OF((struct inflate_state FAR *state)); +local int updatewindow OF((z_streamp strm, const unsigned char FAR *end, + unsigned copy)); +#ifdef BUILDFIXED + void makefixed OF((void)); +#endif +local unsigned syncsearch OF((unsigned FAR *have, const unsigned char FAR *buf, + unsigned len)); + +local int inflateStateCheck(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + if (strm == Z_NULL || + strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) + return 1; + state = (struct inflate_state FAR *)strm->state; + if (state == Z_NULL || state->strm != strm || + state->mode < HEAD || state->mode > SYNC) + return 1; + return 0; +} + +int ZEXPORT inflateResetKeep(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + strm->total_in = strm->total_out = state->total = 0; + strm->msg = Z_NULL; + if (state->wrap) /* to support ill-conceived Java test suite */ + strm->adler = state->wrap & 1; + state->mode = HEAD; + state->last = 0; + state->havedict = 0; + state->dmax = 32768U; + state->head = Z_NULL; + state->hold = 0; + state->bits = 0; + state->lencode = state->distcode = state->next = state->codes; + state->sane = 1; + state->back = -1; + Tracev((stderr, "inflate: reset\n")); + return Z_OK; +} + +int ZEXPORT inflateReset(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + state->wsize = 0; + state->whave = 0; + state->wnext = 0; + return inflateResetKeep(strm); +} + +int ZEXPORT inflateReset2(strm, windowBits) +z_streamp strm; +int windowBits; +{ + int wrap; + struct inflate_state FAR *state; + + /* get the state */ + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + + /* extract wrap request from windowBits parameter */ + if (windowBits < 0) { + wrap = 0; + windowBits = -windowBits; + } + else { + wrap = (windowBits >> 4) + 5; +#ifdef GUNZIP + if (windowBits < 48) + windowBits &= 15; +#endif + } + + /* set number of window bits, free window if different */ + if (windowBits && (windowBits < 8 || windowBits > 15)) + return Z_STREAM_ERROR; + if (state->window != Z_NULL && state->wbits != (unsigned)windowBits) { + ZFREE(strm, state->window); + state->window = Z_NULL; + } + + /* update state and reset the rest of it */ + state->wrap = wrap; + state->wbits = (unsigned)windowBits; + return inflateReset(strm); +} + +int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size) +z_streamp strm; +int windowBits; +const char *version; +int stream_size; +{ + int ret; + struct inflate_state FAR *state; + + if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || + stream_size != (int)(sizeof(z_stream))) + return Z_VERSION_ERROR; + if (strm == Z_NULL) return Z_STREAM_ERROR; + strm->msg = Z_NULL; /* in case we return an error */ + if (strm->zalloc == (alloc_func)0) { +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; +#endif + } + if (strm->zfree == (free_func)0) +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zfree = zcfree; +#endif + state = (struct inflate_state FAR *) + ZALLOC(strm, 1, sizeof(struct inflate_state)); + if (state == Z_NULL) return Z_MEM_ERROR; + Tracev((stderr, "inflate: allocated\n")); + strm->state = (struct internal_state FAR *)state; + state->strm = strm; + state->window = Z_NULL; + state->mode = HEAD; /* to pass state test in inflateReset2() */ + ret = inflateReset2(strm, windowBits); + if (ret != Z_OK) { + ZFREE(strm, state); + strm->state = Z_NULL; + } + return ret; +} + +int ZEXPORT inflateInit_(strm, version, stream_size) +z_streamp strm; +const char *version; +int stream_size; +{ + return inflateInit2_(strm, DEF_WBITS, version, stream_size); +} + +int ZEXPORT inflatePrime(strm, bits, value) +z_streamp strm; +int bits; +int value; +{ + struct inflate_state FAR *state; + + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (bits < 0) { + state->hold = 0; + state->bits = 0; + return Z_OK; + } + if (bits > 16 || state->bits + (uInt)bits > 32) return Z_STREAM_ERROR; + value &= (1L << bits) - 1; + state->hold += (unsigned)value << state->bits; + state->bits += (uInt)bits; + return Z_OK; +} + +/* + Return state with length and distance decoding tables and index sizes set to + fixed code decoding. Normally this returns fixed tables from inffixed.h. + If BUILDFIXED is defined, then instead this routine builds the tables the + first time it's called, and returns those tables the first time and + thereafter. This reduces the size of the code by about 2K bytes, in + exchange for a little execution time. However, BUILDFIXED should not be + used for threaded applications, since the rewriting of the tables and virgin + may not be thread-safe. + */ +local void fixedtables(state) +struct inflate_state FAR *state; +{ +#ifdef BUILDFIXED + static int virgin = 1; + static code *lenfix, *distfix; + static code fixed[544]; + + /* build fixed huffman tables if first call (may not be thread safe) */ + if (virgin) { + unsigned sym, bits; + static code *next; + + /* literal/length table */ + sym = 0; + while (sym < 144) state->lens[sym++] = 8; + while (sym < 256) state->lens[sym++] = 9; + while (sym < 280) state->lens[sym++] = 7; + while (sym < 288) state->lens[sym++] = 8; + next = fixed; + lenfix = next; + bits = 9; + inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); + + /* distance table */ + sym = 0; + while (sym < 32) state->lens[sym++] = 5; + distfix = next; + bits = 5; + inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); + + /* do this just once */ + virgin = 0; + } +#else /* !BUILDFIXED */ +# include "inffixed.h" +#endif /* BUILDFIXED */ + state->lencode = lenfix; + state->lenbits = 9; + state->distcode = distfix; + state->distbits = 5; +} + +#ifdef MAKEFIXED +#include + +/* + Write out the inffixed.h that is #include'd above. Defining MAKEFIXED also + defines BUILDFIXED, so the tables are built on the fly. makefixed() writes + those tables to stdout, which would be piped to inffixed.h. A small program + can simply call makefixed to do this: + + void makefixed(void); + + int main(void) + { + makefixed(); + return 0; + } + + Then that can be linked with zlib built with MAKEFIXED defined and run: + + a.out > inffixed.h + */ +void makefixed() +{ + unsigned low, size; + struct inflate_state state; + + fixedtables(&state); + puts(" /* inffixed.h -- table for decoding fixed codes"); + puts(" * Generated automatically by makefixed()."); + puts(" */"); + puts(""); + puts(" /* WARNING: this file should *not* be used by applications."); + puts(" It is part of the implementation of this library and is"); + puts(" subject to change. Applications should only use zlib.h."); + puts(" */"); + puts(""); + size = 1U << 9; + printf(" static const code lenfix[%u] = {", size); + low = 0; + for (;;) { + if ((low % 7) == 0) printf("\n "); + printf("{%u,%u,%d}", (low & 127) == 99 ? 64 : state.lencode[low].op, + state.lencode[low].bits, state.lencode[low].val); + if (++low == size) break; + putchar(','); + } + puts("\n };"); + size = 1U << 5; + printf("\n static const code distfix[%u] = {", size); + low = 0; + for (;;) { + if ((low % 6) == 0) printf("\n "); + printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits, + state.distcode[low].val); + if (++low == size) break; + putchar(','); + } + puts("\n };"); +} +#endif /* MAKEFIXED */ + +/* + Update the window with the last wsize (normally 32K) bytes written before + returning. If window does not exist yet, create it. This is only called + when a window is already in use, or when output has been written during this + inflate call, but the end of the deflate stream has not been reached yet. + It is also called to create a window for dictionary data when a dictionary + is loaded. + + Providing output buffers larger than 32K to inflate() should provide a speed + advantage, since only the last 32K of output is copied to the sliding window + upon return from inflate(), and since all distances after the first 32K of + output will fall in the output data, making match copies simpler and faster. + The advantage may be dependent on the size of the processor's data caches. + */ +local int updatewindow(strm, end, copy) +z_streamp strm; +const Bytef *end; +unsigned copy; +{ + struct inflate_state FAR *state; + unsigned dist; + + state = (struct inflate_state FAR *)strm->state; + + /* if it hasn't been done already, allocate space for the window */ + if (state->window == Z_NULL) { + state->window = (unsigned char FAR *) + ZALLOC(strm, 1U << state->wbits, + sizeof(unsigned char)); + if (state->window == Z_NULL) return 1; + } + + /* if window not in use yet, initialize */ + if (state->wsize == 0) { + state->wsize = 1U << state->wbits; + state->wnext = 0; + state->whave = 0; + } + + /* copy state->wsize or less output bytes into the circular window */ + if (copy >= state->wsize) { + zmemcpy(state->window, end - state->wsize, state->wsize); + state->wnext = 0; + state->whave = state->wsize; + } + else { + dist = state->wsize - state->wnext; + if (dist > copy) dist = copy; + zmemcpy(state->window + state->wnext, end - copy, dist); + copy -= dist; + if (copy) { + zmemcpy(state->window, end - copy, copy); + state->wnext = copy; + state->whave = state->wsize; + } + else { + state->wnext += dist; + if (state->wnext == state->wsize) state->wnext = 0; + if (state->whave < state->wsize) state->whave += dist; + } + } + return 0; +} + +/* Macros for inflate(): */ + +/* check function to use adler32() for zlib or crc32() for gzip */ +#ifdef GUNZIP +# define UPDATE(check, buf, len) \ + (state->flags ? crc32(check, buf, len) : adler32(check, buf, len)) +#else +# define UPDATE(check, buf, len) adler32(check, buf, len) +#endif + +/* check macros for header crc */ +#ifdef GUNZIP +# define CRC2(check, word) \ + do { \ + hbuf[0] = (unsigned char)(word); \ + hbuf[1] = (unsigned char)((word) >> 8); \ + check = crc32(check, hbuf, 2); \ + } while (0) + +# define CRC4(check, word) \ + do { \ + hbuf[0] = (unsigned char)(word); \ + hbuf[1] = (unsigned char)((word) >> 8); \ + hbuf[2] = (unsigned char)((word) >> 16); \ + hbuf[3] = (unsigned char)((word) >> 24); \ + check = crc32(check, hbuf, 4); \ + } while (0) +#endif + +/* Load registers with state in inflate() for speed */ +#define LOAD() \ + do { \ + put = strm->next_out; \ + left = strm->avail_out; \ + next = strm->next_in; \ + have = strm->avail_in; \ + hold = state->hold; \ + bits = state->bits; \ + } while (0) + +/* Restore state from registers in inflate() */ +#define RESTORE() \ + do { \ + strm->next_out = put; \ + strm->avail_out = left; \ + strm->next_in = next; \ + strm->avail_in = have; \ + state->hold = hold; \ + state->bits = bits; \ + } while (0) + +/* Clear the input bit accumulator */ +#define INITBITS() \ + do { \ + hold = 0; \ + bits = 0; \ + } while (0) + +/* Get a byte of input into the bit accumulator, or return from inflate() + if there is no input available. */ +#define PULLBYTE() \ + do { \ + if (have == 0) goto inf_leave; \ + have--; \ + hold += (unsigned long)(*next++) << bits; \ + bits += 8; \ + } while (0) + +/* Assure that there are at least n bits in the bit accumulator. If there is + not enough available input to do that, then return from inflate(). */ +#define NEEDBITS(n) \ + do { \ + while (bits < (unsigned)(n)) \ + PULLBYTE(); \ + } while (0) + +/* Return the low n bits of the bit accumulator (n < 16) */ +#define BITS(n) \ + ((unsigned)hold & ((1U << (n)) - 1)) + +/* Remove n bits from the bit accumulator */ +#define DROPBITS(n) \ + do { \ + hold >>= (n); \ + bits -= (unsigned)(n); \ + } while (0) + +/* Remove zero to seven bits as needed to go to a byte boundary */ +#define BYTEBITS() \ + do { \ + hold >>= bits & 7; \ + bits -= bits & 7; \ + } while (0) + +/* + inflate() uses a state machine to process as much input data and generate as + much output data as possible before returning. The state machine is + structured roughly as follows: + + for (;;) switch (state) { + ... + case STATEn: + if (not enough input data or output space to make progress) + return; + ... make progress ... + state = STATEm; + break; + ... + } + + so when inflate() is called again, the same case is attempted again, and + if the appropriate resources are provided, the machine proceeds to the + next state. The NEEDBITS() macro is usually the way the state evaluates + whether it can proceed or should return. NEEDBITS() does the return if + the requested bits are not available. The typical use of the BITS macros + is: + + NEEDBITS(n); + ... do something with BITS(n) ... + DROPBITS(n); + + where NEEDBITS(n) either returns from inflate() if there isn't enough + input left to load n bits into the accumulator, or it continues. BITS(n) + gives the low n bits in the accumulator. When done, DROPBITS(n) drops + the low n bits off the accumulator. INITBITS() clears the accumulator + and sets the number of available bits to zero. BYTEBITS() discards just + enough bits to put the accumulator on a byte boundary. After BYTEBITS() + and a NEEDBITS(8), then BITS(8) would return the next byte in the stream. + + NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return + if there is no input available. The decoding of variable length codes uses + PULLBYTE() directly in order to pull just enough bytes to decode the next + code, and no more. + + Some states loop until they get enough input, making sure that enough + state information is maintained to continue the loop where it left off + if NEEDBITS() returns in the loop. For example, want, need, and keep + would all have to actually be part of the saved state in case NEEDBITS() + returns: + + case STATEw: + while (want < need) { + NEEDBITS(n); + keep[want++] = BITS(n); + DROPBITS(n); + } + state = STATEx; + case STATEx: + + As shown above, if the next state is also the next case, then the break + is omitted. + + A state may also return if there is not enough output space available to + complete that state. Those states are copying stored data, writing a + literal byte, and copying a matching string. + + When returning, a "goto inf_leave" is used to update the total counters, + update the check value, and determine whether any progress has been made + during that inflate() call in order to return the proper return code. + Progress is defined as a change in either strm->avail_in or strm->avail_out. + When there is a window, goto inf_leave will update the window with the last + output written. If a goto inf_leave occurs in the middle of decompression + and there is no window currently, goto inf_leave will create one and copy + output to the window for the next call of inflate(). + + In this implementation, the flush parameter of inflate() only affects the + return code (per zlib.h). inflate() always writes as much as possible to + strm->next_out, given the space available and the provided input--the effect + documented in zlib.h of Z_SYNC_FLUSH. Furthermore, inflate() always defers + the allocation of and copying into a sliding window until necessary, which + provides the effect documented in zlib.h for Z_FINISH when the entire input + stream available. So the only thing the flush parameter actually does is: + when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it + will return Z_BUF_ERROR if it has not reached the end of the stream. + */ + +int ZEXPORT inflate(strm, flush) +z_streamp strm; +int flush; +{ + struct inflate_state FAR *state; + z_const unsigned char FAR *next; /* next input */ + unsigned char FAR *put; /* next output */ + unsigned have, left; /* available input and output */ + unsigned long hold; /* bit buffer */ + unsigned bits; /* bits in bit buffer */ + unsigned in, out; /* save starting available input and output */ + unsigned copy; /* number of stored or match bytes to copy */ + unsigned char FAR *from; /* where to copy match bytes from */ + code here; /* current decoding table entry */ + code last; /* parent table entry */ + unsigned len; /* length to copy for repeats, bits to drop */ + int ret; /* return code */ +#ifdef GUNZIP + unsigned char hbuf[4]; /* buffer for gzip header crc calculation */ +#endif + static const unsigned short order[19] = /* permutation of code lengths */ + {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + + if (inflateStateCheck(strm) || strm->next_out == Z_NULL || + (strm->next_in == Z_NULL && strm->avail_in != 0)) + return Z_STREAM_ERROR; + + state = (struct inflate_state FAR *)strm->state; + if (state->mode == TYPE) state->mode = TYPEDO; /* skip check */ + LOAD(); + in = have; + out = left; + ret = Z_OK; + for (;;) + switch (state->mode) { + case HEAD: + if (state->wrap == 0) { + state->mode = TYPEDO; + break; + } + NEEDBITS(16); +#ifdef GUNZIP + if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */ + if (state->wbits == 0) + state->wbits = 15; + state->check = crc32(0L, Z_NULL, 0); + CRC2(state->check, hold); + INITBITS(); + state->mode = FLAGS; + break; + } + state->flags = 0; /* expect zlib header */ + if (state->head != Z_NULL) + state->head->done = -1; + if (!(state->wrap & 1) || /* check if zlib header allowed */ +#else + if ( +#endif + ((BITS(8) << 8) + (hold >> 8)) % 31) { + strm->msg = (char *)"incorrect header check"; + state->mode = BAD; + break; + } + if (BITS(4) != Z_DEFLATED) { + strm->msg = (char *)"unknown compression method"; + state->mode = BAD; + break; + } + DROPBITS(4); + len = BITS(4) + 8; + if (state->wbits == 0) + state->wbits = len; + if (len > 15 || len > state->wbits) { + strm->msg = (char *)"invalid window size"; + state->mode = BAD; + break; + } + state->dmax = 1U << len; + Tracev((stderr, "inflate: zlib header ok\n")); + strm->adler = state->check = adler32(0L, Z_NULL, 0); + state->mode = hold & 0x200 ? DICTID : TYPE; + INITBITS(); + break; +#ifdef GUNZIP + case FLAGS: + NEEDBITS(16); + state->flags = (int)(hold); + if ((state->flags & 0xff) != Z_DEFLATED) { + strm->msg = (char *)"unknown compression method"; + state->mode = BAD; + break; + } + if (state->flags & 0xe000) { + strm->msg = (char *)"unknown header flags set"; + state->mode = BAD; + break; + } + if (state->head != Z_NULL) + state->head->text = (int)((hold >> 8) & 1); + if ((state->flags & 0x0200) && (state->wrap & 4)) + CRC2(state->check, hold); + INITBITS(); + state->mode = TIME; + case TIME: + NEEDBITS(32); + if (state->head != Z_NULL) + state->head->time = hold; + if ((state->flags & 0x0200) && (state->wrap & 4)) + CRC4(state->check, hold); + INITBITS(); + state->mode = OS; + case OS: + NEEDBITS(16); + if (state->head != Z_NULL) { + state->head->xflags = (int)(hold & 0xff); + state->head->os = (int)(hold >> 8); + } + if ((state->flags & 0x0200) && (state->wrap & 4)) + CRC2(state->check, hold); + INITBITS(); + state->mode = EXLEN; + case EXLEN: + if (state->flags & 0x0400) { + NEEDBITS(16); + state->length = (unsigned)(hold); + if (state->head != Z_NULL) + state->head->extra_len = (unsigned)hold; + if ((state->flags & 0x0200) && (state->wrap & 4)) + CRC2(state->check, hold); + INITBITS(); + } + else if (state->head != Z_NULL) + state->head->extra = Z_NULL; + state->mode = EXTRA; + case EXTRA: + if (state->flags & 0x0400) { + copy = state->length; + if (copy > have) copy = have; + if (copy) { + if (state->head != Z_NULL && + state->head->extra != Z_NULL) { + len = state->head->extra_len - state->length; + zmemcpy(state->head->extra + len, next, + len + copy > state->head->extra_max ? + state->head->extra_max - len : copy); + } + if ((state->flags & 0x0200) && (state->wrap & 4)) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + state->length -= copy; + } + if (state->length) goto inf_leave; + } + state->length = 0; + state->mode = NAME; + case NAME: + if (state->flags & 0x0800) { + if (have == 0) goto inf_leave; + copy = 0; + do { + len = (unsigned)(next[copy++]); + if (state->head != Z_NULL && + state->head->name != Z_NULL && + state->length < state->head->name_max) + state->head->name[state->length++] = (Bytef)len; + } while (len && copy < have); + if ((state->flags & 0x0200) && (state->wrap & 4)) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + if (len) goto inf_leave; + } + else if (state->head != Z_NULL) + state->head->name = Z_NULL; + state->length = 0; + state->mode = COMMENT; + case COMMENT: + if (state->flags & 0x1000) { + if (have == 0) goto inf_leave; + copy = 0; + do { + len = (unsigned)(next[copy++]); + if (state->head != Z_NULL && + state->head->comment != Z_NULL && + state->length < state->head->comm_max) + state->head->comment[state->length++] = (Bytef)len; + } while (len && copy < have); + if ((state->flags & 0x0200) && (state->wrap & 4)) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + if (len) goto inf_leave; + } + else if (state->head != Z_NULL) + state->head->comment = Z_NULL; + state->mode = HCRC; + case HCRC: + if (state->flags & 0x0200) { + NEEDBITS(16); + if ((state->wrap & 4) && hold != (state->check & 0xffff)) { + strm->msg = (char *)"header crc mismatch"; + state->mode = BAD; + break; + } + INITBITS(); + } + if (state->head != Z_NULL) { + state->head->hcrc = (int)((state->flags >> 9) & 1); + state->head->done = 1; + } + strm->adler = state->check = crc32(0L, Z_NULL, 0); + state->mode = TYPE; + break; +#endif + case DICTID: + NEEDBITS(32); + strm->adler = state->check = ZSWAP32(hold); + INITBITS(); + state->mode = DICT; + case DICT: + if (state->havedict == 0) { + RESTORE(); + return Z_NEED_DICT; + } + strm->adler = state->check = adler32(0L, Z_NULL, 0); + state->mode = TYPE; + case TYPE: + if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave; + case TYPEDO: + if (state->last) { + BYTEBITS(); + state->mode = CHECK; + break; + } + NEEDBITS(3); + state->last = BITS(1); + DROPBITS(1); + switch (BITS(2)) { + case 0: /* stored block */ + Tracev((stderr, "inflate: stored block%s\n", + state->last ? " (last)" : "")); + state->mode = STORED; + break; + case 1: /* fixed block */ + fixedtables(state); + Tracev((stderr, "inflate: fixed codes block%s\n", + state->last ? " (last)" : "")); + state->mode = LEN_; /* decode codes */ + if (flush == Z_TREES) { + DROPBITS(2); + goto inf_leave; + } + break; + case 2: /* dynamic block */ + Tracev((stderr, "inflate: dynamic codes block%s\n", + state->last ? " (last)" : "")); + state->mode = TABLE; + break; + case 3: + strm->msg = (char *)"invalid block type"; + state->mode = BAD; + } + DROPBITS(2); + break; + case STORED: + BYTEBITS(); /* go to byte boundary */ + NEEDBITS(32); + if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { + strm->msg = (char *)"invalid stored block lengths"; + state->mode = BAD; + break; + } + state->length = (unsigned)hold & 0xffff; + Tracev((stderr, "inflate: stored length %u\n", + state->length)); + INITBITS(); + state->mode = COPY_; + if (flush == Z_TREES) goto inf_leave; + case COPY_: + state->mode = COPY; + case COPY: + copy = state->length; + if (copy) { + if (copy > have) copy = have; + if (copy > left) copy = left; + if (copy == 0) goto inf_leave; + zmemcpy(put, next, copy); + have -= copy; + next += copy; + left -= copy; + put += copy; + state->length -= copy; + break; + } + Tracev((stderr, "inflate: stored end\n")); + state->mode = TYPE; + break; + case TABLE: + NEEDBITS(14); + state->nlen = BITS(5) + 257; + DROPBITS(5); + state->ndist = BITS(5) + 1; + DROPBITS(5); + state->ncode = BITS(4) + 4; + DROPBITS(4); +#ifndef PKZIP_BUG_WORKAROUND + if (state->nlen > 286 || state->ndist > 30) { + strm->msg = (char *)"too many length or distance symbols"; + state->mode = BAD; + break; + } +#endif + Tracev((stderr, "inflate: table sizes ok\n")); + state->have = 0; + state->mode = LENLENS; + case LENLENS: + while (state->have < state->ncode) { + NEEDBITS(3); + state->lens[order[state->have++]] = (unsigned short)BITS(3); + DROPBITS(3); + } + while (state->have < 19) + state->lens[order[state->have++]] = 0; + state->next = state->codes; + state->lencode = (const code FAR *)(state->next); + state->lenbits = 7; + ret = inflate_table(CODES, state->lens, 19, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid code lengths set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: code lengths ok\n")); + state->have = 0; + state->mode = CODELENS; + case CODELENS: + while (state->have < state->nlen + state->ndist) { + for (;;) { + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.val < 16) { + DROPBITS(here.bits); + state->lens[state->have++] = here.val; + } + else { + if (here.val == 16) { + NEEDBITS(here.bits + 2); + DROPBITS(here.bits); + if (state->have == 0) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + len = state->lens[state->have - 1]; + copy = 3 + BITS(2); + DROPBITS(2); + } + else if (here.val == 17) { + NEEDBITS(here.bits + 3); + DROPBITS(here.bits); + len = 0; + copy = 3 + BITS(3); + DROPBITS(3); + } + else { + NEEDBITS(here.bits + 7); + DROPBITS(here.bits); + len = 0; + copy = 11 + BITS(7); + DROPBITS(7); + } + if (state->have + copy > state->nlen + state->ndist) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + while (copy--) + state->lens[state->have++] = (unsigned short)len; + } + } + + /* handle error breaks in while */ + if (state->mode == BAD) break; + + /* check for end-of-block code (better have one) */ + if (state->lens[256] == 0) { + strm->msg = (char *)"invalid code -- missing end-of-block"; + state->mode = BAD; + break; + } + + /* build code tables -- note: do not change the lenbits or distbits + values here (9 and 6) without reading the comments in inftrees.h + concerning the ENOUGH constants, which depend on those values */ + state->next = state->codes; + state->lencode = (const code FAR *)(state->next); + state->lenbits = 9; + ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid literal/lengths set"; + state->mode = BAD; + break; + } + state->distcode = (const code FAR *)(state->next); + state->distbits = 6; + ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, + &(state->next), &(state->distbits), state->work); + if (ret) { + strm->msg = (char *)"invalid distances set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: codes ok\n")); + state->mode = LEN_; + if (flush == Z_TREES) goto inf_leave; + case LEN_: + state->mode = LEN; + case LEN: + if (have >= 6 && left >= 258) { + RESTORE(); + inflate_fast(strm, out); + LOAD(); + if (state->mode == TYPE) + state->back = -1; + break; + } + state->back = 0; + for (;;) { + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.op && (here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = state->lencode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + state->back += last.bits; + } + DROPBITS(here.bits); + state->back += here.bits; + state->length = (unsigned)here.val; + if ((int)(here.op) == 0) { + Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", here.val)); + state->mode = LIT; + break; + } + if (here.op & 32) { + Tracevv((stderr, "inflate: end of block\n")); + state->back = -1; + state->mode = TYPE; + break; + } + if (here.op & 64) { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + state->extra = (unsigned)(here.op) & 15; + state->mode = LENEXT; + case LENEXT: + if (state->extra) { + NEEDBITS(state->extra); + state->length += BITS(state->extra); + DROPBITS(state->extra); + state->back += state->extra; + } + Tracevv((stderr, "inflate: length %u\n", state->length)); + state->was = state->length; + state->mode = DIST; + case DIST: + for (;;) { + here = state->distcode[BITS(state->distbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if ((here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = state->distcode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + state->back += last.bits; + } + DROPBITS(here.bits); + state->back += here.bits; + if (here.op & 64) { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + state->offset = (unsigned)here.val; + state->extra = (unsigned)(here.op) & 15; + state->mode = DISTEXT; + case DISTEXT: + if (state->extra) { + NEEDBITS(state->extra); + state->offset += BITS(state->extra); + DROPBITS(state->extra); + state->back += state->extra; + } +#ifdef INFLATE_STRICT + if (state->offset > state->dmax) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#endif + Tracevv((stderr, "inflate: distance %u\n", state->offset)); + state->mode = MATCH; + case MATCH: + if (left == 0) goto inf_leave; + copy = out - left; + if (state->offset > copy) { /* copy from window */ + copy = state->offset - copy; + if (copy > state->whave) { + if (state->sane) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + Trace((stderr, "inflate.c too far\n")); + copy -= state->whave; + if (copy > state->length) copy = state->length; + if (copy > left) copy = left; + left -= copy; + state->length -= copy; + do { + *put++ = 0; + } while (--copy); + if (state->length == 0) state->mode = LEN; + break; +#endif + } + if (copy > state->wnext) { + copy -= state->wnext; + from = state->window + (state->wsize - copy); + } + else + from = state->window + (state->wnext - copy); + if (copy > state->length) copy = state->length; + } + else { /* copy from output */ + from = put - state->offset; + copy = state->length; + } + if (copy > left) copy = left; + left -= copy; + state->length -= copy; + do { + *put++ = *from++; + } while (--copy); + if (state->length == 0) state->mode = LEN; + break; + case LIT: + if (left == 0) goto inf_leave; + *put++ = (unsigned char)(state->length); + left--; + state->mode = LEN; + break; + case CHECK: + if (state->wrap) { + NEEDBITS(32); + out -= left; + strm->total_out += out; + state->total += out; + if ((state->wrap & 4) && out) + strm->adler = state->check = + UPDATE(state->check, put - out, out); + out = left; + if ((state->wrap & 4) && ( +#ifdef GUNZIP + state->flags ? hold : +#endif + ZSWAP32(hold)) != state->check) { + strm->msg = (char *)"incorrect data check"; + state->mode = BAD; + break; + } + INITBITS(); + Tracev((stderr, "inflate: check matches trailer\n")); + } +#ifdef GUNZIP + state->mode = LENGTH; + case LENGTH: + if (state->wrap && state->flags) { + NEEDBITS(32); + if (hold != (state->total & 0xffffffffUL)) { + strm->msg = (char *)"incorrect length check"; + state->mode = BAD; + break; + } + INITBITS(); + Tracev((stderr, "inflate: length matches trailer\n")); + } +#endif + state->mode = DONE; + case DONE: + ret = Z_STREAM_END; + goto inf_leave; + case BAD: + ret = Z_DATA_ERROR; + goto inf_leave; + case MEM: + return Z_MEM_ERROR; + case SYNC: + default: + return Z_STREAM_ERROR; + } + + /* + Return from inflate(), updating the total counts and the check value. + If there was no progress during the inflate() call, return a buffer + error. Call updatewindow() to create and/or update the window state. + Note: a memory error from inflate() is non-recoverable. + */ + inf_leave: + RESTORE(); + if (state->wsize || (out != strm->avail_out && state->mode < BAD && + (state->mode < CHECK || flush != Z_FINISH))) + if (updatewindow(strm, strm->next_out, out - strm->avail_out)) { + state->mode = MEM; + return Z_MEM_ERROR; + } + in -= strm->avail_in; + out -= strm->avail_out; + strm->total_in += in; + strm->total_out += out; + state->total += out; + if ((state->wrap & 4) && out) + strm->adler = state->check = + UPDATE(state->check, strm->next_out - out, out); + strm->data_type = (int)state->bits + (state->last ? 64 : 0) + + (state->mode == TYPE ? 128 : 0) + + (state->mode == LEN_ || state->mode == COPY_ ? 256 : 0); + if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) + ret = Z_BUF_ERROR; + return ret; +} + +int ZEXPORT inflateEnd(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + if (inflateStateCheck(strm)) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (state->window != Z_NULL) ZFREE(strm, state->window); + ZFREE(strm, strm->state); + strm->state = Z_NULL; + Tracev((stderr, "inflate: end\n")); + return Z_OK; +} + +int ZEXPORT inflateGetDictionary(strm, dictionary, dictLength) +z_streamp strm; +Bytef *dictionary; +uInt *dictLength; +{ + struct inflate_state FAR *state; + + /* check state */ + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + + /* copy dictionary */ + if (state->whave && dictionary != Z_NULL) { + zmemcpy(dictionary, state->window + state->wnext, + state->whave - state->wnext); + zmemcpy(dictionary + state->whave - state->wnext, + state->window, state->wnext); + } + if (dictLength != Z_NULL) + *dictLength = state->whave; + return Z_OK; +} + +int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength) +z_streamp strm; +const Bytef *dictionary; +uInt dictLength; +{ + struct inflate_state FAR *state; + unsigned long dictid; + int ret; + + /* check state */ + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (state->wrap != 0 && state->mode != DICT) + return Z_STREAM_ERROR; + + /* check for correct dictionary identifier */ + if (state->mode == DICT) { + dictid = adler32(0L, Z_NULL, 0); + dictid = adler32(dictid, dictionary, dictLength); + if (dictid != state->check) + return Z_DATA_ERROR; + } + + /* copy dictionary to window using updatewindow(), which will amend the + existing dictionary if appropriate */ + ret = updatewindow(strm, dictionary + dictLength, dictLength); + if (ret) { + state->mode = MEM; + return Z_MEM_ERROR; + } + state->havedict = 1; + Tracev((stderr, "inflate: dictionary set\n")); + return Z_OK; +} + +int ZEXPORT inflateGetHeader(strm, head) +z_streamp strm; +gz_headerp head; +{ + struct inflate_state FAR *state; + + /* check state */ + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if ((state->wrap & 2) == 0) return Z_STREAM_ERROR; + + /* save header structure */ + state->head = head; + head->done = 0; + return Z_OK; +} + +/* + Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff. Return when found + or when out of input. When called, *have is the number of pattern bytes + found in order so far, in 0..3. On return *have is updated to the new + state. If on return *have equals four, then the pattern was found and the + return value is how many bytes were read including the last byte of the + pattern. If *have is less than four, then the pattern has not been found + yet and the return value is len. In the latter case, syncsearch() can be + called again with more data and the *have state. *have is initialized to + zero for the first call. + */ +local unsigned syncsearch(have, buf, len) +unsigned FAR *have; +const unsigned char FAR *buf; +unsigned len; +{ + unsigned got; + unsigned next; + + got = *have; + next = 0; + while (next < len && got < 4) { + if ((int)(buf[next]) == (got < 2 ? 0 : 0xff)) + got++; + else if (buf[next]) + got = 0; + else + got = 4 - got; + next++; + } + *have = got; + return next; +} + +int ZEXPORT inflateSync(strm) +z_streamp strm; +{ + unsigned len; /* number of bytes to look at or looked at */ + unsigned long in, out; /* temporary to save total_in and total_out */ + unsigned char buf[4]; /* to restore bit buffer to byte string */ + struct inflate_state FAR *state; + + /* check parameters */ + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR; + + /* if first time, start search in bit buffer */ + if (state->mode != SYNC) { + state->mode = SYNC; + state->hold <<= state->bits & 7; + state->bits -= state->bits & 7; + len = 0; + while (state->bits >= 8) { + buf[len++] = (unsigned char)(state->hold); + state->hold >>= 8; + state->bits -= 8; + } + state->have = 0; + syncsearch(&(state->have), buf, len); + } + + /* search available input */ + len = syncsearch(&(state->have), strm->next_in, strm->avail_in); + strm->avail_in -= len; + strm->next_in += len; + strm->total_in += len; + + /* return no joy or set up to restart inflate() on a new block */ + if (state->have != 4) return Z_DATA_ERROR; + in = strm->total_in; out = strm->total_out; + inflateReset(strm); + strm->total_in = in; strm->total_out = out; + state->mode = TYPE; + return Z_OK; +} + +/* + Returns true if inflate is currently at the end of a block generated by + Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP + implementation to provide an additional safety check. PPP uses + Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored + block. When decompressing, PPP checks that at the end of input packet, + inflate is waiting for these length bytes. + */ +int ZEXPORT inflateSyncPoint(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + return state->mode == STORED && state->bits == 0; +} + +int ZEXPORT inflateCopy(dest, source) +z_streamp dest; +z_streamp source; +{ + struct inflate_state FAR *state; + struct inflate_state FAR *copy; + unsigned char FAR *window; + unsigned wsize; + + /* check input */ + if (inflateStateCheck(source) || dest == Z_NULL) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)source->state; + + /* allocate space */ + copy = (struct inflate_state FAR *) + ZALLOC(source, 1, sizeof(struct inflate_state)); + if (copy == Z_NULL) return Z_MEM_ERROR; + window = Z_NULL; + if (state->window != Z_NULL) { + window = (unsigned char FAR *) + ZALLOC(source, 1U << state->wbits, sizeof(unsigned char)); + if (window == Z_NULL) { + ZFREE(source, copy); + return Z_MEM_ERROR; + } + } + + /* copy state */ + zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream)); + zmemcpy((voidpf)copy, (voidpf)state, sizeof(struct inflate_state)); + copy->strm = dest; + if (state->lencode >= state->codes && + state->lencode <= state->codes + ENOUGH - 1) { + copy->lencode = copy->codes + (state->lencode - state->codes); + copy->distcode = copy->codes + (state->distcode - state->codes); + } + copy->next = copy->codes + (state->next - state->codes); + if (window != Z_NULL) { + wsize = 1U << state->wbits; + zmemcpy(window, state->window, wsize); + } + copy->window = window; + dest->state = (struct internal_state FAR *)copy; + return Z_OK; +} + +int ZEXPORT inflateUndermine(strm, subvert) +z_streamp strm; +int subvert; +{ + struct inflate_state FAR *state; + + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; +#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + state->sane = !subvert; + return Z_OK; +#else + (void)subvert; + state->sane = 1; + return Z_DATA_ERROR; +#endif +} + +int ZEXPORT inflateValidate(strm, check) +z_streamp strm; +int check; +{ + struct inflate_state FAR *state; + + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (check) + state->wrap |= 4; + else + state->wrap &= ~4; + return Z_OK; +} + +long ZEXPORT inflateMark(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (inflateStateCheck(strm)) + return -(1L << 16); + state = (struct inflate_state FAR *)strm->state; + return (long)(((unsigned long)((long)state->back)) << 16) + + (state->mode == COPY ? state->length : + (state->mode == MATCH ? state->was - state->length : 0)); +} + +unsigned long ZEXPORT inflateCodesUsed(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + if (inflateStateCheck(strm)) return (unsigned long)-1; + state = (struct inflate_state FAR *)strm->state; + return (unsigned long)(state->next - state->codes); +} diff --git a/core/cd_hw/libchdr/deps/zlib/inflate.h b/core/cd_hw/libchdr/deps/zlib/inflate.h new file mode 100644 index 0000000..a46cce6 --- /dev/null +++ b/core/cd_hw/libchdr/deps/zlib/inflate.h @@ -0,0 +1,125 @@ +/* inflate.h -- internal inflate state definition + * Copyright (C) 1995-2016 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* define NO_GZIP when compiling if you want to disable gzip header and + trailer decoding by inflate(). NO_GZIP would be used to avoid linking in + the crc code when it is not needed. For shared libraries, gzip decoding + should be left enabled. */ +#ifndef NO_GZIP +# define GUNZIP +#endif + +/* Possible inflate modes between inflate() calls */ +typedef enum { + HEAD = 16180, /* i: waiting for magic header */ + FLAGS, /* i: waiting for method and flags (gzip) */ + TIME, /* i: waiting for modification time (gzip) */ + OS, /* i: waiting for extra flags and operating system (gzip) */ + EXLEN, /* i: waiting for extra length (gzip) */ + EXTRA, /* i: waiting for extra bytes (gzip) */ + NAME, /* i: waiting for end of file name (gzip) */ + COMMENT, /* i: waiting for end of comment (gzip) */ + HCRC, /* i: waiting for header crc (gzip) */ + DICTID, /* i: waiting for dictionary check value */ + DICT, /* waiting for inflateSetDictionary() call */ + TYPE, /* i: waiting for type bits, including last-flag bit */ + TYPEDO, /* i: same, but skip check to exit inflate on new block */ + STORED, /* i: waiting for stored size (length and complement) */ + COPY_, /* i/o: same as COPY below, but only first time in */ + COPY, /* i/o: waiting for input or output to copy stored block */ + TABLE, /* i: waiting for dynamic block table lengths */ + LENLENS, /* i: waiting for code length code lengths */ + CODELENS, /* i: waiting for length/lit and distance code lengths */ + LEN_, /* i: same as LEN below, but only first time in */ + LEN, /* i: waiting for length/lit/eob code */ + LENEXT, /* i: waiting for length extra bits */ + DIST, /* i: waiting for distance code */ + DISTEXT, /* i: waiting for distance extra bits */ + MATCH, /* o: waiting for output space to copy string */ + LIT, /* o: waiting for output space to write literal */ + CHECK, /* i: waiting for 32-bit check value */ + LENGTH, /* i: waiting for 32-bit length (gzip) */ + DONE, /* finished check, done -- remain here until reset */ + BAD, /* got a data error -- remain here until reset */ + MEM, /* got an inflate() memory error -- remain here until reset */ + SYNC /* looking for synchronization bytes to restart inflate() */ +} inflate_mode; + +/* + State transitions between above modes - + + (most modes can go to BAD or MEM on error -- not shown for clarity) + + Process header: + HEAD -> (gzip) or (zlib) or (raw) + (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME -> COMMENT -> + HCRC -> TYPE + (zlib) -> DICTID or TYPE + DICTID -> DICT -> TYPE + (raw) -> TYPEDO + Read deflate blocks: + TYPE -> TYPEDO -> STORED or TABLE or LEN_ or CHECK + STORED -> COPY_ -> COPY -> TYPE + TABLE -> LENLENS -> CODELENS -> LEN_ + LEN_ -> LEN + Read deflate codes in fixed or dynamic block: + LEN -> LENEXT or LIT or TYPE + LENEXT -> DIST -> DISTEXT -> MATCH -> LEN + LIT -> LEN + Process trailer: + CHECK -> LENGTH -> DONE + */ + +/* State maintained between inflate() calls -- approximately 7K bytes, not + including the allocated sliding window, which is up to 32K bytes. */ +struct inflate_state { + z_streamp strm; /* pointer back to this zlib stream */ + inflate_mode mode; /* current inflate mode */ + int last; /* true if processing last block */ + int wrap; /* bit 0 true for zlib, bit 1 true for gzip, + bit 2 true to validate check value */ + int havedict; /* true if dictionary provided */ + int flags; /* gzip header method and flags (0 if zlib) */ + unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */ + unsigned long check; /* protected copy of check value */ + unsigned long total; /* protected copy of output count */ + gz_headerp head; /* where to save gzip header information */ + /* sliding window */ + unsigned wbits; /* log base 2 of requested window size */ + unsigned wsize; /* window size or zero if not using window */ + unsigned whave; /* valid bytes in the window */ + unsigned wnext; /* window write index */ + unsigned char FAR *window; /* allocated sliding window, if needed */ + /* bit accumulator */ + unsigned long hold; /* input bit accumulator */ + unsigned bits; /* number of bits in "in" */ + /* for string and stored block copying */ + unsigned length; /* literal or length of data to copy */ + unsigned offset; /* distance back to copy string from */ + /* for table and code decoding */ + unsigned extra; /* extra bits needed */ + /* fixed and dynamic code tables */ + code const FAR *lencode; /* starting table for length/literal codes */ + code const FAR *distcode; /* starting table for distance codes */ + unsigned lenbits; /* index bits for lencode */ + unsigned distbits; /* index bits for distcode */ + /* dynamic table building */ + unsigned ncode; /* number of code length code lengths */ + unsigned nlen; /* number of length code lengths */ + unsigned ndist; /* number of distance code lengths */ + unsigned have; /* number of code lengths in lens[] */ + code FAR *next; /* next available space in codes[] */ + unsigned short lens[320]; /* temporary storage for code lengths */ + unsigned short work[288]; /* work area for code table building */ + code codes[ENOUGH]; /* space for code tables */ + int sane; /* if false, allow invalid distance too far */ + int back; /* bits back of last unprocessed length/lit */ + unsigned was; /* initial length of match */ +}; diff --git a/core/cd_hw/libchdr/deps/zlib/inftrees.c b/core/cd_hw/libchdr/deps/zlib/inftrees.c new file mode 100644 index 0000000..2ea08fc --- /dev/null +++ b/core/cd_hw/libchdr/deps/zlib/inftrees.c @@ -0,0 +1,304 @@ +/* inftrees.c -- generate Huffman trees for efficient decoding + * Copyright (C) 1995-2017 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "inftrees.h" + +#define MAXBITS 15 + +const char inflate_copyright[] = + " inflate 1.2.11 Copyright 1995-2017 Mark Adler "; +/* + If you use the zlib library in a product, an acknowledgment is welcome + in the documentation of your product. If for some reason you cannot + include such an acknowledgment, I would appreciate that you keep this + copyright string in the executable of your product. + */ + +/* + Build a set of tables to decode the provided canonical Huffman code. + The code lengths are lens[0..codes-1]. The result starts at *table, + whose indices are 0..2^bits-1. work is a writable array of at least + lens shorts, which is used as a work area. type is the type of code + to be generated, CODES, LENS, or DISTS. On return, zero is success, + -1 is an invalid code, and +1 means that ENOUGH isn't enough. table + on return points to the next available entry's address. bits is the + requested root table index bits, and on return it is the actual root + table index bits. It will differ if the request is greater than the + longest code or if it is less than the shortest code. + */ +int ZLIB_INTERNAL inflate_table(type, lens, codes, table, bits, work) +codetype type; +unsigned short FAR *lens; +unsigned codes; +code FAR * FAR *table; +unsigned FAR *bits; +unsigned short FAR *work; +{ + unsigned len; /* a code's length in bits */ + unsigned sym; /* index of code symbols */ + unsigned min, max; /* minimum and maximum code lengths */ + unsigned root; /* number of index bits for root table */ + unsigned curr; /* number of index bits for current table */ + unsigned drop; /* code bits to drop for sub-table */ + int left; /* number of prefix codes available */ + unsigned used; /* code entries in table used */ + unsigned huff; /* Huffman code */ + unsigned incr; /* for incrementing code, index */ + unsigned fill; /* index for replicating entries */ + unsigned low; /* low bits for current root entry */ + unsigned mask; /* mask for low root bits */ + code here; /* table entry for duplication */ + code FAR *next; /* next available space in table */ + const unsigned short FAR *base; /* base value table to use */ + const unsigned short FAR *extra; /* extra bits table to use */ + unsigned match; /* use base and extra for symbol >= match */ + unsigned short count[MAXBITS+1]; /* number of codes of each length */ + unsigned short offs[MAXBITS+1]; /* offsets in table for each length */ + static const unsigned short lbase[31] = { /* Length codes 257..285 base */ + 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, + 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; + static const unsigned short lext[31] = { /* Length codes 257..285 extra */ + 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, + 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 77, 202}; + static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ + 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, + 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, + 8193, 12289, 16385, 24577, 0, 0}; + static const unsigned short dext[32] = { /* Distance codes 0..29 extra */ + 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, + 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, + 28, 28, 29, 29, 64, 64}; + + /* + Process a set of code lengths to create a canonical Huffman code. The + code lengths are lens[0..codes-1]. Each length corresponds to the + symbols 0..codes-1. The Huffman code is generated by first sorting the + symbols by length from short to long, and retaining the symbol order + for codes with equal lengths. Then the code starts with all zero bits + for the first code of the shortest length, and the codes are integer + increments for the same length, and zeros are appended as the length + increases. For the deflate format, these bits are stored backwards + from their more natural integer increment ordering, and so when the + decoding tables are built in the large loop below, the integer codes + are incremented backwards. + + This routine assumes, but does not check, that all of the entries in + lens[] are in the range 0..MAXBITS. The caller must assure this. + 1..MAXBITS is interpreted as that code length. zero means that that + symbol does not occur in this code. + + The codes are sorted by computing a count of codes for each length, + creating from that a table of starting indices for each length in the + sorted table, and then entering the symbols in order in the sorted + table. The sorted table is work[], with that space being provided by + the caller. + + The length counts are used for other purposes as well, i.e. finding + the minimum and maximum length codes, determining if there are any + codes at all, checking for a valid set of lengths, and looking ahead + at length counts to determine sub-table sizes when building the + decoding tables. + */ + + /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ + for (len = 0; len <= MAXBITS; len++) + count[len] = 0; + for (sym = 0; sym < codes; sym++) + count[lens[sym]]++; + + /* bound code lengths, force root to be within code lengths */ + root = *bits; + for (max = MAXBITS; max >= 1; max--) + if (count[max] != 0) break; + if (root > max) root = max; + if (max == 0) { /* no symbols to code at all */ + here.op = (unsigned char)64; /* invalid code marker */ + here.bits = (unsigned char)1; + here.val = (unsigned short)0; + *(*table)++ = here; /* make a table to force an error */ + *(*table)++ = here; + *bits = 1; + return 0; /* no symbols, but wait for decoding to report error */ + } + for (min = 1; min < max; min++) + if (count[min] != 0) break; + if (root < min) root = min; + + /* check for an over-subscribed or incomplete set of lengths */ + left = 1; + for (len = 1; len <= MAXBITS; len++) { + left <<= 1; + left -= count[len]; + if (left < 0) return -1; /* over-subscribed */ + } + if (left > 0 && (type == CODES || max != 1)) + return -1; /* incomplete set */ + + /* generate offsets into symbol table for each length for sorting */ + offs[1] = 0; + for (len = 1; len < MAXBITS; len++) + offs[len + 1] = offs[len] + count[len]; + + /* sort symbols by length, by symbol order within each length */ + for (sym = 0; sym < codes; sym++) + if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym; + + /* + Create and fill in decoding tables. In this loop, the table being + filled is at next and has curr index bits. The code being used is huff + with length len. That code is converted to an index by dropping drop + bits off of the bottom. For codes where len is less than drop + curr, + those top drop + curr - len bits are incremented through all values to + fill the table with replicated entries. + + root is the number of index bits for the root table. When len exceeds + root, sub-tables are created pointed to by the root entry with an index + of the low root bits of huff. This is saved in low to check for when a + new sub-table should be started. drop is zero when the root table is + being filled, and drop is root when sub-tables are being filled. + + When a new sub-table is needed, it is necessary to look ahead in the + code lengths to determine what size sub-table is needed. The length + counts are used for this, and so count[] is decremented as codes are + entered in the tables. + + used keeps track of how many table entries have been allocated from the + provided *table space. It is checked for LENS and DIST tables against + the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in + the initial root table size constants. See the comments in inftrees.h + for more information. + + sym increments through all symbols, and the loop terminates when + all codes of length max, i.e. all codes, have been processed. This + routine permits incomplete codes, so another loop after this one fills + in the rest of the decoding tables with invalid code markers. + */ + + /* set up for code type */ + switch (type) { + case CODES: + base = extra = work; /* dummy value--not used */ + match = 20; + break; + case LENS: + base = lbase; + extra = lext; + match = 257; + break; + default: /* DISTS */ + base = dbase; + extra = dext; + match = 0; + } + + /* initialize state for loop */ + huff = 0; /* starting code */ + sym = 0; /* starting code symbol */ + len = min; /* starting code length */ + next = *table; /* current table to fill in */ + curr = root; /* current table index bits */ + drop = 0; /* current bits to drop from code for index */ + low = (unsigned)(-1); /* trigger new sub-table when len > root */ + used = 1U << root; /* use root table entries */ + mask = used - 1; /* mask for comparing low */ + + /* check available table space */ + if ((type == LENS && used > ENOUGH_LENS) || + (type == DISTS && used > ENOUGH_DISTS)) + return 1; + + /* process all codes and make table entries */ + for (;;) { + /* create table entry */ + here.bits = (unsigned char)(len - drop); + if (work[sym] + 1U < match) { + here.op = (unsigned char)0; + here.val = work[sym]; + } + else if (work[sym] >= match) { + here.op = (unsigned char)(extra[work[sym] - match]); + here.val = base[work[sym] - match]; + } + else { + here.op = (unsigned char)(32 + 64); /* end of block */ + here.val = 0; + } + + /* replicate for those indices with low len bits equal to huff */ + incr = 1U << (len - drop); + fill = 1U << curr; + min = fill; /* save offset to next table */ + do { + fill -= incr; + next[(huff >> drop) + fill] = here; + } while (fill != 0); + + /* backwards increment the len-bit code huff */ + incr = 1U << (len - 1); + while (huff & incr) + incr >>= 1; + if (incr != 0) { + huff &= incr - 1; + huff += incr; + } + else + huff = 0; + + /* go to next symbol, update count, len */ + sym++; + if (--(count[len]) == 0) { + if (len == max) break; + len = lens[work[sym]]; + } + + /* create new sub-table if needed */ + if (len > root && (huff & mask) != low) { + /* if first time, transition to sub-tables */ + if (drop == 0) + drop = root; + + /* increment past last table */ + next += min; /* here min is 1 << curr */ + + /* determine length of next table */ + curr = len - drop; + left = (int)(1 << curr); + while (curr + drop < max) { + left -= count[curr + drop]; + if (left <= 0) break; + curr++; + left <<= 1; + } + + /* check for enough space */ + used += 1U << curr; + if ((type == LENS && used > ENOUGH_LENS) || + (type == DISTS && used > ENOUGH_DISTS)) + return 1; + + /* point entry in root table to sub-table */ + low = huff & mask; + (*table)[low].op = (unsigned char)curr; + (*table)[low].bits = (unsigned char)root; + (*table)[low].val = (unsigned short)(next - *table); + } + } + + /* fill in remaining table entry if code is incomplete (guaranteed to have + at most one remaining entry, since if the code is incomplete, the + maximum code length that was allowed to get this far is one bit) */ + if (huff != 0) { + here.op = (unsigned char)64; /* invalid code marker */ + here.bits = (unsigned char)(len - drop); + here.val = (unsigned short)0; + next[huff] = here; + } + + /* set return parameters */ + *table += used; + *bits = root; + return 0; +} diff --git a/core/cd_hw/libchdr/deps/zlib/inftrees.h b/core/cd_hw/libchdr/deps/zlib/inftrees.h new file mode 100644 index 0000000..baa53a0 --- /dev/null +++ b/core/cd_hw/libchdr/deps/zlib/inftrees.h @@ -0,0 +1,62 @@ +/* inftrees.h -- header to use inftrees.c + * Copyright (C) 1995-2005, 2010 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* Structure for decoding tables. Each entry provides either the + information needed to do the operation requested by the code that + indexed that table entry, or it provides a pointer to another + table that indexes more bits of the code. op indicates whether + the entry is a pointer to another table, a literal, a length or + distance, an end-of-block, or an invalid code. For a table + pointer, the low four bits of op is the number of index bits of + that table. For a length or distance, the low four bits of op + is the number of extra bits to get after the code. bits is + the number of bits in this code or part of the code to drop off + of the bit buffer. val is the actual byte to output in the case + of a literal, the base length or distance, or the offset from + the current table to the next table. Each entry is four bytes. */ +typedef struct { + unsigned char op; /* operation, extra bits, table bits */ + unsigned char bits; /* bits in this part of the code */ + unsigned short val; /* offset in table or code value */ +} code; + +/* op values as set by inflate_table(): + 00000000 - literal + 0000tttt - table link, tttt != 0 is the number of table index bits + 0001eeee - length or distance, eeee is the number of extra bits + 01100000 - end of block + 01000000 - invalid code + */ + +/* Maximum size of the dynamic table. The maximum number of code structures is + 1444, which is the sum of 852 for literal/length codes and 592 for distance + codes. These values were found by exhaustive searches using the program + examples/enough.c found in the zlib distribtution. The arguments to that + program are the number of symbols, the initial root table size, and the + maximum bit length of a code. "enough 286 9 15" for literal/length codes + returns returns 852, and "enough 30 6 15" for distance codes returns 592. + The initial root table size (9 or 6) is found in the fifth argument of the + inflate_table() calls in inflate.c and infback.c. If the root table size is + changed, then these maximum sizes would be need to be recalculated and + updated. */ +#define ENOUGH_LENS 852 +#define ENOUGH_DISTS 592 +#define ENOUGH (ENOUGH_LENS+ENOUGH_DISTS) + +/* Type of code to build for inflate_table() */ +typedef enum { + CODES, + LENS, + DISTS +} codetype; + +int ZLIB_INTERNAL inflate_table OF((codetype type, unsigned short FAR *lens, + unsigned codes, code FAR * FAR *table, + unsigned FAR *bits, unsigned short FAR *work)); diff --git a/core/cd_hw/libchdr/deps/zlib/zconf.h b/core/cd_hw/libchdr/deps/zlib/zconf.h new file mode 100644 index 0000000..5e1d68a --- /dev/null +++ b/core/cd_hw/libchdr/deps/zlib/zconf.h @@ -0,0 +1,534 @@ +/* zconf.h -- configuration of the zlib compression library + * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#ifndef ZCONF_H +#define ZCONF_H + +/* + * If you *really* need a unique prefix for all types and library functions, + * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. + * Even better than compiling with -DZ_PREFIX would be to use configure to set + * this permanently in zconf.h using "./configure --zprefix". + */ +#ifdef Z_PREFIX /* may be set to #if 1 by ./configure */ +# define Z_PREFIX_SET + +/* all linked symbols and init macros */ +# define _dist_code z__dist_code +# define _length_code z__length_code +# define _tr_align z__tr_align +# define _tr_flush_bits z__tr_flush_bits +# define _tr_flush_block z__tr_flush_block +# define _tr_init z__tr_init +# define _tr_stored_block z__tr_stored_block +# define _tr_tally z__tr_tally +# define adler32 z_adler32 +# define adler32_combine z_adler32_combine +# define adler32_combine64 z_adler32_combine64 +# define adler32_z z_adler32_z +# ifndef Z_SOLO +# define compress z_compress +# define compress2 z_compress2 +# define compressBound z_compressBound +# endif +# define crc32 z_crc32 +# define crc32_combine z_crc32_combine +# define crc32_combine64 z_crc32_combine64 +# define crc32_z z_crc32_z +# define deflate z_deflate +# define deflateBound z_deflateBound +# define deflateCopy z_deflateCopy +# define deflateEnd z_deflateEnd +# define deflateGetDictionary z_deflateGetDictionary +# define deflateInit z_deflateInit +# define deflateInit2 z_deflateInit2 +# define deflateInit2_ z_deflateInit2_ +# define deflateInit_ z_deflateInit_ +# define deflateParams z_deflateParams +# define deflatePending z_deflatePending +# define deflatePrime z_deflatePrime +# define deflateReset z_deflateReset +# define deflateResetKeep z_deflateResetKeep +# define deflateSetDictionary z_deflateSetDictionary +# define deflateSetHeader z_deflateSetHeader +# define deflateTune z_deflateTune +# define deflate_copyright z_deflate_copyright +# define get_crc_table z_get_crc_table +# ifndef Z_SOLO +# define gz_error z_gz_error +# define gz_intmax z_gz_intmax +# define gz_strwinerror z_gz_strwinerror +# define gzbuffer z_gzbuffer +# define gzclearerr z_gzclearerr +# define gzclose z_gzclose +# define gzclose_r z_gzclose_r +# define gzclose_w z_gzclose_w +# define gzdirect z_gzdirect +# define gzdopen z_gzdopen +# define gzeof z_gzeof +# define gzerror z_gzerror +# define gzflush z_gzflush +# define gzfread z_gzfread +# define gzfwrite z_gzfwrite +# define gzgetc z_gzgetc +# define gzgetc_ z_gzgetc_ +# define gzgets z_gzgets +# define gzoffset z_gzoffset +# define gzoffset64 z_gzoffset64 +# define gzopen z_gzopen +# define gzopen64 z_gzopen64 +# ifdef _WIN32 +# define gzopen_w z_gzopen_w +# endif +# define gzprintf z_gzprintf +# define gzputc z_gzputc +# define gzputs z_gzputs +# define gzread z_gzread +# define gzrewind z_gzrewind +# define gzseek z_gzseek +# define gzseek64 z_gzseek64 +# define gzsetparams z_gzsetparams +# define gztell z_gztell +# define gztell64 z_gztell64 +# define gzungetc z_gzungetc +# define gzvprintf z_gzvprintf +# define gzwrite z_gzwrite +# endif +# define inflate z_inflate +# define inflateBack z_inflateBack +# define inflateBackEnd z_inflateBackEnd +# define inflateBackInit z_inflateBackInit +# define inflateBackInit_ z_inflateBackInit_ +# define inflateCodesUsed z_inflateCodesUsed +# define inflateCopy z_inflateCopy +# define inflateEnd z_inflateEnd +# define inflateGetDictionary z_inflateGetDictionary +# define inflateGetHeader z_inflateGetHeader +# define inflateInit z_inflateInit +# define inflateInit2 z_inflateInit2 +# define inflateInit2_ z_inflateInit2_ +# define inflateInit_ z_inflateInit_ +# define inflateMark z_inflateMark +# define inflatePrime z_inflatePrime +# define inflateReset z_inflateReset +# define inflateReset2 z_inflateReset2 +# define inflateResetKeep z_inflateResetKeep +# define inflateSetDictionary z_inflateSetDictionary +# define inflateSync z_inflateSync +# define inflateSyncPoint z_inflateSyncPoint +# define inflateUndermine z_inflateUndermine +# define inflateValidate z_inflateValidate +# define inflate_copyright z_inflate_copyright +# define inflate_fast z_inflate_fast +# define inflate_table z_inflate_table +# ifndef Z_SOLO +# define uncompress z_uncompress +# define uncompress2 z_uncompress2 +# endif +# define zError z_zError +# ifndef Z_SOLO +# define zcalloc z_zcalloc +# define zcfree z_zcfree +# endif +# define zlibCompileFlags z_zlibCompileFlags +# define zlibVersion z_zlibVersion + +/* all zlib typedefs in zlib.h and zconf.h */ +# define Byte z_Byte +# define Bytef z_Bytef +# define alloc_func z_alloc_func +# define charf z_charf +# define free_func z_free_func +# ifndef Z_SOLO +# define gzFile z_gzFile +# endif +# define gz_header z_gz_header +# define gz_headerp z_gz_headerp +# define in_func z_in_func +# define intf z_intf +# define out_func z_out_func +# define uInt z_uInt +# define uIntf z_uIntf +# define uLong z_uLong +# define uLongf z_uLongf +# define voidp z_voidp +# define voidpc z_voidpc +# define voidpf z_voidpf + +/* all zlib structs in zlib.h and zconf.h */ +# define gz_header_s z_gz_header_s +# define internal_state z_internal_state + +#endif + +#if defined(__MSDOS__) && !defined(MSDOS) +# define MSDOS +#endif +#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) +# define OS2 +#endif +#if defined(_WINDOWS) && !defined(WINDOWS) +# define WINDOWS +#endif +#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) +# ifndef WIN32 +# define WIN32 +# endif +#endif +#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) +# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) +# ifndef SYS16BIT +# define SYS16BIT +# endif +# endif +#endif + +/* + * Compile with -DMAXSEG_64K if the alloc function cannot allocate more + * than 64k bytes at a time (needed on systems with 16-bit int). + */ +#ifdef SYS16BIT +# define MAXSEG_64K +#endif +#ifdef MSDOS +# define UNALIGNED_OK +#endif + +#ifdef __STDC_VERSION__ +# ifndef STDC +# define STDC +# endif +# if __STDC_VERSION__ >= 199901L +# ifndef STDC99 +# define STDC99 +# endif +# endif +#endif +#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) +# define STDC +#endif +#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) +# define STDC +#endif +#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) +# define STDC +#endif +#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) +# define STDC +#endif + +#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ +# define STDC +#endif + +#ifndef STDC +# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ +# define const /* note: need a more gentle solution here */ +# endif +#endif + +#if defined(ZLIB_CONST) && !defined(z_const) +# define z_const const +#else +# define z_const +#endif + +#ifdef Z_SOLO + typedef unsigned long z_size_t; +#else +# define z_longlong long long +# if defined(NO_SIZE_T) + typedef unsigned NO_SIZE_T z_size_t; +# elif defined(STDC) +# include + typedef size_t z_size_t; +# else + typedef unsigned long z_size_t; +# endif +# undef z_longlong +#endif + +/* Maximum value for memLevel in deflateInit2 */ +#ifndef MAX_MEM_LEVEL +# ifdef MAXSEG_64K +# define MAX_MEM_LEVEL 8 +# else +# define MAX_MEM_LEVEL 9 +# endif +#endif + +/* Maximum value for windowBits in deflateInit2 and inflateInit2. + * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files + * created by gzip. (Files created by minigzip can still be extracted by + * gzip.) + */ +#ifndef MAX_WBITS +# define MAX_WBITS 15 /* 32K LZ77 window */ +#endif + +/* The memory requirements for deflate are (in bytes): + (1 << (windowBits+2)) + (1 << (memLevel+9)) + that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) + plus a few kilobytes for small objects. For example, if you want to reduce + the default memory requirements from 256K to 128K, compile with + make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" + Of course this will generally degrade compression (there's no free lunch). + + The memory requirements for inflate are (in bytes) 1 << windowBits + that is, 32K for windowBits=15 (default value) plus about 7 kilobytes + for small objects. +*/ + + /* Type declarations */ + +#ifndef OF /* function prototypes */ +# ifdef STDC +# define OF(args) args +# else +# define OF(args) () +# endif +#endif + +#ifndef Z_ARG /* function prototypes for stdarg */ +# if defined(STDC) || defined(Z_HAVE_STDARG_H) +# define Z_ARG(args) args +# else +# define Z_ARG(args) () +# endif +#endif + +/* The following definitions for FAR are needed only for MSDOS mixed + * model programming (small or medium model with some far allocations). + * This was tested only with MSC; for other MSDOS compilers you may have + * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, + * just define FAR to be empty. + */ +#ifdef SYS16BIT +# if defined(M_I86SM) || defined(M_I86MM) + /* MSC small or medium model */ +# define SMALL_MEDIUM +# ifdef _MSC_VER +# define FAR _far +# else +# define FAR far +# endif +# endif +# if (defined(__SMALL__) || defined(__MEDIUM__)) + /* Turbo C small or medium model */ +# define SMALL_MEDIUM +# ifdef __BORLANDC__ +# define FAR _far +# else +# define FAR far +# endif +# endif +#endif + +#if defined(WINDOWS) || defined(WIN32) + /* If building or using zlib as a DLL, define ZLIB_DLL. + * This is not mandatory, but it offers a little performance increase. + */ +# ifdef ZLIB_DLL +# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) +# ifdef ZLIB_INTERNAL +# define ZEXTERN extern __declspec(dllexport) +# else +# define ZEXTERN extern __declspec(dllimport) +# endif +# endif +# endif /* ZLIB_DLL */ + /* If building or using zlib with the WINAPI/WINAPIV calling convention, + * define ZLIB_WINAPI. + * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. + */ +# ifdef ZLIB_WINAPI +# ifdef FAR +# undef FAR +# endif +# include + /* No need for _export, use ZLIB.DEF instead. */ + /* For complete Windows compatibility, use WINAPI, not __stdcall. */ +# define ZEXPORT WINAPI +# ifdef WIN32 +# define ZEXPORTVA WINAPIV +# else +# define ZEXPORTVA FAR CDECL +# endif +# endif +#endif + +#if defined (__BEOS__) +# ifdef ZLIB_DLL +# ifdef ZLIB_INTERNAL +# define ZEXPORT __declspec(dllexport) +# define ZEXPORTVA __declspec(dllexport) +# else +# define ZEXPORT __declspec(dllimport) +# define ZEXPORTVA __declspec(dllimport) +# endif +# endif +#endif + +#ifndef ZEXTERN +# define ZEXTERN extern +#endif +#ifndef ZEXPORT +# define ZEXPORT +#endif +#ifndef ZEXPORTVA +# define ZEXPORTVA +#endif + +#ifndef FAR +# define FAR +#endif + +#if !defined(__MACTYPES__) +typedef unsigned char Byte; /* 8 bits */ +#endif +typedef unsigned int uInt; /* 16 bits or more */ +typedef unsigned long uLong; /* 32 bits or more */ + +#ifdef SMALL_MEDIUM + /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ +# define Bytef Byte FAR +#else + typedef Byte FAR Bytef; +#endif +typedef char FAR charf; +typedef int FAR intf; +typedef uInt FAR uIntf; +typedef uLong FAR uLongf; + +#ifdef STDC + typedef void const *voidpc; + typedef void FAR *voidpf; + typedef void *voidp; +#else + typedef Byte const *voidpc; + typedef Byte FAR *voidpf; + typedef Byte *voidp; +#endif + +#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC) +# include +# if (UINT_MAX == 0xffffffffUL) +# define Z_U4 unsigned +# elif (ULONG_MAX == 0xffffffffUL) +# define Z_U4 unsigned long +# elif (USHRT_MAX == 0xffffffffUL) +# define Z_U4 unsigned short +# endif +#endif + +#ifdef Z_U4 + typedef Z_U4 z_crc_t; +#else + typedef unsigned long z_crc_t; +#endif + +#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_UNISTD_H +#endif + +#ifdef HAVE_STDARG_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_STDARG_H +#endif + +#ifdef STDC +# ifndef Z_SOLO +# include /* for off_t */ +# endif +#endif + +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +# ifndef Z_SOLO +# include /* for va_list */ +# endif +#endif + +#ifdef _WIN32 +# ifndef Z_SOLO +# include /* for wchar_t */ +# endif +#endif + +/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and + * "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even + * though the former does not conform to the LFS document), but considering + * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as + * equivalently requesting no 64-bit operations + */ +#if defined(_LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1 +# undef _LARGEFILE64_SOURCE +#endif + +#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H) +# define Z_HAVE_UNISTD_H +#endif +#ifndef Z_SOLO +# if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) +# include /* for SEEK_*, off_t, and _LFS64_LARGEFILE */ +# ifdef VMS +# include /* for off_t */ +# endif +# ifndef z_off_t +# define z_off_t off_t +# endif +# endif +#endif + +#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0 +# define Z_LFS64 +#endif + +#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64) +# define Z_LARGE64 +#endif + +#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64) +# define Z_WANT64 +#endif + +#if !defined(SEEK_SET) && !defined(Z_SOLO) +# define SEEK_SET 0 /* Seek from beginning of file. */ +# define SEEK_CUR 1 /* Seek from current position. */ +# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ +#endif + +#ifndef z_off_t +# define z_off_t long +#endif + +#if !defined(_WIN32) && defined(Z_LARGE64) +# define z_off64_t off64_t +#else +# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO) +# define z_off64_t __int64 +# else +# define z_off64_t z_off_t +# endif +#endif + +/* MVS linker does not support external names larger than 8 bytes */ +#if defined(__MVS__) + #pragma map(deflateInit_,"DEIN") + #pragma map(deflateInit2_,"DEIN2") + #pragma map(deflateEnd,"DEEND") + #pragma map(deflateBound,"DEBND") + #pragma map(inflateInit_,"ININ") + #pragma map(inflateInit2_,"ININ2") + #pragma map(inflateEnd,"INEND") + #pragma map(inflateSync,"INSY") + #pragma map(inflateSetDictionary,"INSEDI") + #pragma map(compressBound,"CMBND") + #pragma map(inflate_table,"INTABL") + #pragma map(inflate_fast,"INFA") + #pragma map(inflate_copyright,"INCOPY") +#endif + +#endif /* ZCONF_H */ diff --git a/core/cd_hw/libchdr/deps/zlib/zlib.h b/core/cd_hw/libchdr/deps/zlib/zlib.h new file mode 100644 index 0000000..f09cdaf --- /dev/null +++ b/core/cd_hw/libchdr/deps/zlib/zlib.h @@ -0,0 +1,1912 @@ +/* zlib.h -- interface of the 'zlib' general purpose compression library + version 1.2.11, January 15th, 2017 + + Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + + + The data format used by the zlib library is described by RFCs (Request for + Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950 + (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format). +*/ + +#ifndef ZLIB_H +#define ZLIB_H + +#include "zconf.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define ZLIB_VERSION "1.2.11" +#define ZLIB_VERNUM 0x12b0 +#define ZLIB_VER_MAJOR 1 +#define ZLIB_VER_MINOR 2 +#define ZLIB_VER_REVISION 11 +#define ZLIB_VER_SUBREVISION 0 + +/* + The 'zlib' compression library provides in-memory compression and + decompression functions, including integrity checks of the uncompressed data. + This version of the library supports only one compression method (deflation) + but other algorithms will be added later and will have the same stream + interface. + + Compression can be done in a single step if the buffers are large enough, + or can be done by repeated calls of the compression function. In the latter + case, the application must provide more input and/or consume the output + (providing more output space) before each call. + + The compressed data format used by default by the in-memory functions is + the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped + around a deflate stream, which is itself documented in RFC 1951. + + The library also supports reading and writing files in gzip (.gz) format + with an interface similar to that of stdio using the functions that start + with "gz". The gzip format is different from the zlib format. gzip is a + gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. + + This library can optionally read and write gzip and raw deflate streams in + memory as well. + + The zlib format was designed to be compact and fast for use in memory + and on communications channels. The gzip format was designed for single- + file compression on file systems, has a larger header than zlib to maintain + directory information, and uses a different, slower check method than zlib. + + The library does not install any signal handler. The decoder checks + the consistency of the compressed data, so the library should never crash + even in the case of corrupted input. +*/ + +typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); +typedef void (*free_func) OF((voidpf opaque, voidpf address)); + +struct internal_state; + +typedef struct z_stream_s { + z_const Bytef *next_in; /* next input byte */ + uInt avail_in; /* number of bytes available at next_in */ + uLong total_in; /* total number of input bytes read so far */ + + Bytef *next_out; /* next output byte will go here */ + uInt avail_out; /* remaining free space at next_out */ + uLong total_out; /* total number of bytes output so far */ + + z_const char *msg; /* last error message, NULL if no error */ + struct internal_state FAR *state; /* not visible by applications */ + + alloc_func zalloc; /* used to allocate the internal state */ + free_func zfree; /* used to free the internal state */ + voidpf opaque; /* private data object passed to zalloc and zfree */ + + int data_type; /* best guess about the data type: binary or text + for deflate, or the decoding state for inflate */ + uLong adler; /* Adler-32 or CRC-32 value of the uncompressed data */ + uLong reserved; /* reserved for future use */ +} z_stream; + +typedef z_stream FAR *z_streamp; + +/* + gzip header information passed to and from zlib routines. See RFC 1952 + for more details on the meanings of these fields. +*/ +typedef struct gz_header_s { + int text; /* true if compressed data believed to be text */ + uLong time; /* modification time */ + int xflags; /* extra flags (not used when writing a gzip file) */ + int os; /* operating system */ + Bytef *extra; /* pointer to extra field or Z_NULL if none */ + uInt extra_len; /* extra field length (valid if extra != Z_NULL) */ + uInt extra_max; /* space at extra (only when reading header) */ + Bytef *name; /* pointer to zero-terminated file name or Z_NULL */ + uInt name_max; /* space at name (only when reading header) */ + Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */ + uInt comm_max; /* space at comment (only when reading header) */ + int hcrc; /* true if there was or will be a header crc */ + int done; /* true when done reading gzip header (not used + when writing a gzip file) */ +} gz_header; + +typedef gz_header FAR *gz_headerp; + +/* + The application must update next_in and avail_in when avail_in has dropped + to zero. It must update next_out and avail_out when avail_out has dropped + to zero. The application must initialize zalloc, zfree and opaque before + calling the init function. All other fields are set by the compression + library and must not be updated by the application. + + The opaque value provided by the application will be passed as the first + parameter for calls of zalloc and zfree. This can be useful for custom + memory management. The compression library attaches no meaning to the + opaque value. + + zalloc must return Z_NULL if there is not enough memory for the object. + If zlib is used in a multi-threaded application, zalloc and zfree must be + thread safe. In that case, zlib is thread-safe. When zalloc and zfree are + Z_NULL on entry to the initialization function, they are set to internal + routines that use the standard library functions malloc() and free(). + + On 16-bit systems, the functions zalloc and zfree must be able to allocate + exactly 65536 bytes, but will not be required to allocate more than this if + the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, pointers + returned by zalloc for objects of exactly 65536 bytes *must* have their + offset normalized to zero. The default allocation function provided by this + library ensures this (see zutil.c). To reduce memory requirements and avoid + any allocation of 64K objects, at the expense of compression ratio, compile + the library with -DMAX_WBITS=14 (see zconf.h). + + The fields total_in and total_out can be used for statistics or progress + reports. After compression, total_in holds the total size of the + uncompressed data and may be saved for use by the decompressor (particularly + if the decompressor wants to decompress everything in a single step). +*/ + + /* constants */ + +#define Z_NO_FLUSH 0 +#define Z_PARTIAL_FLUSH 1 +#define Z_SYNC_FLUSH 2 +#define Z_FULL_FLUSH 3 +#define Z_FINISH 4 +#define Z_BLOCK 5 +#define Z_TREES 6 +/* Allowed flush values; see deflate() and inflate() below for details */ + +#define Z_OK 0 +#define Z_STREAM_END 1 +#define Z_NEED_DICT 2 +#define Z_ERRNO (-1) +#define Z_STREAM_ERROR (-2) +#define Z_DATA_ERROR (-3) +#define Z_MEM_ERROR (-4) +#define Z_BUF_ERROR (-5) +#define Z_VERSION_ERROR (-6) +/* Return codes for the compression/decompression functions. Negative values + * are errors, positive values are used for special but normal events. + */ + +#define Z_NO_COMPRESSION 0 +#define Z_BEST_SPEED 1 +#define Z_BEST_COMPRESSION 9 +#define Z_DEFAULT_COMPRESSION (-1) +/* compression levels */ + +#define Z_FILTERED 1 +#define Z_HUFFMAN_ONLY 2 +#define Z_RLE 3 +#define Z_FIXED 4 +#define Z_DEFAULT_STRATEGY 0 +/* compression strategy; see deflateInit2() below for details */ + +#define Z_BINARY 0 +#define Z_TEXT 1 +#define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */ +#define Z_UNKNOWN 2 +/* Possible values of the data_type field for deflate() */ + +#define Z_DEFLATED 8 +/* The deflate compression method (the only one supported in this version) */ + +#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ + +#define zlib_version zlibVersion() +/* for compatibility with versions < 1.0.2 */ + + + /* basic functions */ + +ZEXTERN const char * ZEXPORT zlibVersion OF((void)); +/* The application can compare zlibVersion and ZLIB_VERSION for consistency. + If the first character differs, the library code actually used is not + compatible with the zlib.h header file used by the application. This check + is automatically made by deflateInit and inflateInit. + */ + +/* +ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); + + Initializes the internal stream state for compression. The fields + zalloc, zfree and opaque must be initialized before by the caller. If + zalloc and zfree are set to Z_NULL, deflateInit updates them to use default + allocation functions. + + The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: + 1 gives best speed, 9 gives best compression, 0 gives no compression at all + (the input data is simply copied a block at a time). Z_DEFAULT_COMPRESSION + requests a default compromise between speed and compression (currently + equivalent to level 6). + + deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if level is not a valid compression level, or + Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible + with the version assumed by the caller (ZLIB_VERSION). msg is set to null + if there is no error message. deflateInit does not perform any compression: + this will be done by deflate(). +*/ + + +ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); +/* + deflate compresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce + some output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. deflate performs one or both of the + following actions: + + - Compress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in and avail_in are updated and + processing will resume at this point for the next call of deflate(). + + - Generate more output starting at next_out and update next_out and avail_out + accordingly. This action is forced if the parameter flush is non zero. + Forcing flush frequently degrades the compression ratio, so this parameter + should be set only when necessary. Some output may be provided even if + flush is zero. + + Before the call of deflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming more + output, and updating avail_in or avail_out accordingly; avail_out should + never be zero before the call. The application can consume the compressed + output when it wants, for example when the output buffer is full (avail_out + == 0), or after each call of deflate(). If deflate returns Z_OK and with + zero avail_out, it must be called again after making room in the output + buffer because there might be more output pending. See deflatePending(), + which can be used if desired to determine whether or not there is more ouput + in that case. + + Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to + decide how much data to accumulate before producing output, in order to + maximize compression. + + If the parameter flush is set to Z_SYNC_FLUSH, all pending output is + flushed to the output buffer and the output is aligned on a byte boundary, so + that the decompressor can get all input data available so far. (In + particular avail_in is zero after the call if enough output space has been + provided before the call.) Flushing may degrade compression for some + compression algorithms and so it should be used only when necessary. This + completes the current deflate block and follows it with an empty stored block + that is three bits plus filler bits to the next byte, followed by four bytes + (00 00 ff ff). + + If flush is set to Z_PARTIAL_FLUSH, all pending output is flushed to the + output buffer, but the output is not aligned to a byte boundary. All of the + input data so far will be available to the decompressor, as for Z_SYNC_FLUSH. + This completes the current deflate block and follows it with an empty fixed + codes block that is 10 bits long. This assures that enough bytes are output + in order for the decompressor to finish the block before the empty fixed + codes block. + + If flush is set to Z_BLOCK, a deflate block is completed and emitted, as + for Z_SYNC_FLUSH, but the output is not aligned on a byte boundary, and up to + seven bits of the current block are held to be written as the next byte after + the next deflate block is completed. In this case, the decompressor may not + be provided enough bits at this point in order to complete decompression of + the data provided so far to the compressor. It may need to wait for the next + block to be emitted. This is for advanced applications that need to control + the emission of deflate blocks. + + If flush is set to Z_FULL_FLUSH, all output is flushed as with + Z_SYNC_FLUSH, and the compression state is reset so that decompression can + restart from this point if previous compressed data has been damaged or if + random access is desired. Using Z_FULL_FLUSH too often can seriously degrade + compression. + + If deflate returns with avail_out == 0, this function must be called again + with the same value of the flush parameter and more output space (updated + avail_out), until the flush is complete (deflate returns with non-zero + avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that + avail_out is greater than six to avoid repeated flush markers due to + avail_out == 0 on return. + + If the parameter flush is set to Z_FINISH, pending input is processed, + pending output is flushed and deflate returns with Z_STREAM_END if there was + enough output space. If deflate returns with Z_OK or Z_BUF_ERROR, this + function must be called again with Z_FINISH and more output space (updated + avail_out) but no more input data, until it returns with Z_STREAM_END or an + error. After deflate has returned Z_STREAM_END, the only possible operations + on the stream are deflateReset or deflateEnd. + + Z_FINISH can be used in the first deflate call after deflateInit if all the + compression is to be done in a single step. In order to complete in one + call, avail_out must be at least the value returned by deflateBound (see + below). Then deflate is guaranteed to return Z_STREAM_END. If not enough + output space is provided, deflate will not return Z_STREAM_END, and it must + be called again as described above. + + deflate() sets strm->adler to the Adler-32 checksum of all input read + so far (that is, total_in bytes). If a gzip stream is being generated, then + strm->adler will be the CRC-32 checksum of the input read so far. (See + deflateInit2 below.) + + deflate() may update strm->data_type if it can make a good guess about + the input data type (Z_BINARY or Z_TEXT). If in doubt, the data is + considered binary. This field is only for information purposes and does not + affect the compression algorithm in any manner. + + deflate() returns Z_OK if some progress has been made (more input + processed or more output produced), Z_STREAM_END if all input has been + consumed and all output has been produced (only when flush is set to + Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example + if next_in or next_out was Z_NULL or the state was inadvertently written over + by the application), or Z_BUF_ERROR if no progress is possible (for example + avail_in or avail_out was zero). Note that Z_BUF_ERROR is not fatal, and + deflate() can be called again with more input and more output space to + continue compressing. +*/ + + +ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any pending + output. + + deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the + stream state was inconsistent, Z_DATA_ERROR if the stream was freed + prematurely (some input or output was discarded). In the error case, msg + may be set but then points to a static string (which must not be + deallocated). +*/ + + +/* +ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); + + Initializes the internal stream state for decompression. The fields + next_in, avail_in, zalloc, zfree and opaque must be initialized before by + the caller. In the current version of inflate, the provided input is not + read or consumed. The allocation of a sliding window will be deferred to + the first call of inflate (if the decompression does not complete on the + first call). If zalloc and zfree are set to Z_NULL, inflateInit updates + them to use default allocation functions. + + inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller, or Z_STREAM_ERROR if the parameters are + invalid, such as a null pointer to the structure. msg is set to null if + there is no error message. inflateInit does not perform any decompression. + Actual decompression will be done by inflate(). So next_in, and avail_in, + next_out, and avail_out are unused and unchanged. The current + implementation of inflateInit() does not process any header information -- + that is deferred until inflate() is called. +*/ + + +ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); +/* + inflate decompresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce + some output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. inflate performs one or both of the + following actions: + + - Decompress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), then next_in and avail_in are updated + accordingly, and processing will resume at this point for the next call of + inflate(). + + - Generate more output starting at next_out and update next_out and avail_out + accordingly. inflate() provides as much output as possible, until there is + no more input data or no more space in the output buffer (see below about + the flush parameter). + + Before the call of inflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming more + output, and updating the next_* and avail_* values accordingly. If the + caller of inflate() does not provide both available input and available + output space, it is possible that there will be no progress made. The + application can consume the uncompressed output when it wants, for example + when the output buffer is full (avail_out == 0), or after each call of + inflate(). If inflate returns Z_OK and with zero avail_out, it must be + called again after making room in the output buffer because there might be + more output pending. + + The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FINISH, + Z_BLOCK, or Z_TREES. Z_SYNC_FLUSH requests that inflate() flush as much + output as possible to the output buffer. Z_BLOCK requests that inflate() + stop if and when it gets to the next deflate block boundary. When decoding + the zlib or gzip format, this will cause inflate() to return immediately + after the header and before the first block. When doing a raw inflate, + inflate() will go ahead and process the first block, and will return when it + gets to the end of that block, or when it runs out of data. + + The Z_BLOCK option assists in appending to or combining deflate streams. + To assist in this, on return inflate() always sets strm->data_type to the + number of unused bits in the last byte taken from strm->next_in, plus 64 if + inflate() is currently decoding the last block in the deflate stream, plus + 128 if inflate() returned immediately after decoding an end-of-block code or + decoding the complete header up to just before the first byte of the deflate + stream. The end-of-block will not be indicated until all of the uncompressed + data from that block has been written to strm->next_out. The number of + unused bits may in general be greater than seven, except when bit 7 of + data_type is set, in which case the number of unused bits will be less than + eight. data_type is set as noted here every time inflate() returns for all + flush options, and so can be used to determine the amount of currently + consumed input in bits. + + The Z_TREES option behaves as Z_BLOCK does, but it also returns when the + end of each deflate block header is reached, before any actual data in that + block is decoded. This allows the caller to determine the length of the + deflate block header for later use in random access within a deflate block. + 256 is added to the value of strm->data_type when inflate() returns + immediately after reaching the end of the deflate block header. + + inflate() should normally be called until it returns Z_STREAM_END or an + error. However if all decompression is to be performed in a single step (a + single call of inflate), the parameter flush should be set to Z_FINISH. In + this case all pending input is processed and all pending output is flushed; + avail_out must be large enough to hold all of the uncompressed data for the + operation to complete. (The size of the uncompressed data may have been + saved by the compressor for this purpose.) The use of Z_FINISH is not + required to perform an inflation in one step. However it may be used to + inform inflate that a faster approach can be used for the single inflate() + call. Z_FINISH also informs inflate to not maintain a sliding window if the + stream completes, which reduces inflate's memory footprint. If the stream + does not complete, either because not all of the stream is provided or not + enough output space is provided, then a sliding window will be allocated and + inflate() can be called again to continue the operation as if Z_NO_FLUSH had + been used. + + In this implementation, inflate() always flushes as much output as + possible to the output buffer, and always uses the faster approach on the + first call. So the effects of the flush parameter in this implementation are + on the return value of inflate() as noted below, when inflate() returns early + when Z_BLOCK or Z_TREES is used, and when inflate() avoids the allocation of + memory for a sliding window when Z_FINISH is used. + + If a preset dictionary is needed after this call (see inflateSetDictionary + below), inflate sets strm->adler to the Adler-32 checksum of the dictionary + chosen by the compressor and returns Z_NEED_DICT; otherwise it sets + strm->adler to the Adler-32 checksum of all output produced so far (that is, + total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described + below. At the end of the stream, inflate() checks that its computed Adler-32 + checksum is equal to that saved by the compressor and returns Z_STREAM_END + only if the checksum is correct. + + inflate() can decompress and check either zlib-wrapped or gzip-wrapped + deflate data. The header type is detected automatically, if requested when + initializing with inflateInit2(). Any information contained in the gzip + header is not retained unless inflateGetHeader() is used. When processing + gzip-wrapped deflate data, strm->adler32 is set to the CRC-32 of the output + produced so far. The CRC-32 is checked against the gzip trailer, as is the + uncompressed length, modulo 2^32. + + inflate() returns Z_OK if some progress has been made (more input processed + or more output produced), Z_STREAM_END if the end of the compressed data has + been reached and all uncompressed output has been produced, Z_NEED_DICT if a + preset dictionary is needed at this point, Z_DATA_ERROR if the input data was + corrupted (input stream not conforming to the zlib format or incorrect check + value, in which case strm->msg points to a string with a more specific + error), Z_STREAM_ERROR if the stream structure was inconsistent (for example + next_in or next_out was Z_NULL, or the state was inadvertently written over + by the application), Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR + if no progress was possible or if there was not enough room in the output + buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and + inflate() can be called again with more input and more output space to + continue decompressing. If Z_DATA_ERROR is returned, the application may + then call inflateSync() to look for a good compression block if a partial + recovery of the data is to be attempted. +*/ + + +ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any pending + output. + + inflateEnd returns Z_OK if success, or Z_STREAM_ERROR if the stream state + was inconsistent. +*/ + + + /* Advanced functions */ + +/* + The following functions are needed only in some special applications. +*/ + +/* +ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, + int level, + int method, + int windowBits, + int memLevel, + int strategy)); + + This is another version of deflateInit with more compression options. The + fields next_in, zalloc, zfree and opaque must be initialized before by the + caller. + + The method parameter is the compression method. It must be Z_DEFLATED in + this version of the library. + + The windowBits parameter is the base two logarithm of the window size + (the size of the history buffer). It should be in the range 8..15 for this + version of the library. Larger values of this parameter result in better + compression at the expense of memory usage. The default value is 15 if + deflateInit is used instead. + + For the current implementation of deflate(), a windowBits value of 8 (a + window size of 256 bytes) is not supported. As a result, a request for 8 + will result in 9 (a 512-byte window). In that case, providing 8 to + inflateInit2() will result in an error when the zlib header with 9 is + checked against the initialization of inflate(). The remedy is to not use 8 + with deflateInit2() with this initialization, or at least in that case use 9 + with inflateInit2(). + + windowBits can also be -8..-15 for raw deflate. In this case, -windowBits + determines the window size. deflate() will then generate raw deflate data + with no zlib header or trailer, and will not compute a check value. + + windowBits can also be greater than 15 for optional gzip encoding. Add + 16 to windowBits to write a simple gzip header and trailer around the + compressed data instead of a zlib wrapper. The gzip header will have no + file name, no extra data, no comment, no modification time (set to zero), no + header crc, and the operating system will be set to the appropriate value, + if the operating system was determined at compile time. If a gzip stream is + being written, strm->adler is a CRC-32 instead of an Adler-32. + + For raw deflate or gzip encoding, a request for a 256-byte window is + rejected as invalid, since only the zlib header provides a means of + transmitting the window size to the decompressor. + + The memLevel parameter specifies how much memory should be allocated + for the internal compression state. memLevel=1 uses minimum memory but is + slow and reduces compression ratio; memLevel=9 uses maximum memory for + optimal speed. The default value is 8. See zconf.h for total memory usage + as a function of windowBits and memLevel. + + The strategy parameter is used to tune the compression algorithm. Use the + value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a + filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no + string match), or Z_RLE to limit match distances to one (run-length + encoding). Filtered data consists mostly of small values with a somewhat + random distribution. In this case, the compression algorithm is tuned to + compress them better. The effect of Z_FILTERED is to force more Huffman + coding and less string matching; it is somewhat intermediate between + Z_DEFAULT_STRATEGY and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as + fast as Z_HUFFMAN_ONLY, but give better compression for PNG image data. The + strategy parameter only affects the compression ratio but not the + correctness of the compressed output even if it is not set appropriately. + Z_FIXED prevents the use of dynamic Huffman codes, allowing for a simpler + decoder for special applications. + + deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if any parameter is invalid (such as an invalid + method), or Z_VERSION_ERROR if the zlib library version (zlib_version) is + incompatible with the version assumed by the caller (ZLIB_VERSION). msg is + set to null if there is no error message. deflateInit2 does not perform any + compression: this will be done by deflate(). +*/ + +ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the compression dictionary from the given byte sequence + without producing any compressed output. When using the zlib format, this + function must be called immediately after deflateInit, deflateInit2 or + deflateReset, and before any call of deflate. When doing raw deflate, this + function must be called either before any call of deflate, or immediately + after the completion of a deflate block, i.e. after all input has been + consumed and all output has been delivered when using any of the flush + options Z_BLOCK, Z_PARTIAL_FLUSH, Z_SYNC_FLUSH, or Z_FULL_FLUSH. The + compressor and decompressor must use exactly the same dictionary (see + inflateSetDictionary). + + The dictionary should consist of strings (byte sequences) that are likely + to be encountered later in the data to be compressed, with the most commonly + used strings preferably put towards the end of the dictionary. Using a + dictionary is most useful when the data to be compressed is short and can be + predicted with good accuracy; the data can then be compressed better than + with the default empty dictionary. + + Depending on the size of the compression data structures selected by + deflateInit or deflateInit2, a part of the dictionary may in effect be + discarded, for example if the dictionary is larger than the window size + provided in deflateInit or deflateInit2. Thus the strings most likely to be + useful should be put at the end of the dictionary, not at the front. In + addition, the current implementation of deflate will use at most the window + size minus 262 bytes of the provided dictionary. + + Upon return of this function, strm->adler is set to the Adler-32 value + of the dictionary; the decompressor may later use this value to determine + which dictionary has been used by the compressor. (The Adler-32 value + applies to the whole dictionary even if only a subset of the dictionary is + actually used by the compressor.) If a raw deflate was requested, then the + Adler-32 value is not computed and strm->adler is not set. + + deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a + parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is + inconsistent (for example if deflate has already been called for this stream + or if not at a block boundary for raw deflate). deflateSetDictionary does + not perform any compression: this will be done by deflate(). +*/ + +ZEXTERN int ZEXPORT deflateGetDictionary OF((z_streamp strm, + Bytef *dictionary, + uInt *dictLength)); +/* + Returns the sliding dictionary being maintained by deflate. dictLength is + set to the number of bytes in the dictionary, and that many bytes are copied + to dictionary. dictionary must have enough space, where 32768 bytes is + always enough. If deflateGetDictionary() is called with dictionary equal to + Z_NULL, then only the dictionary length is returned, and nothing is copied. + Similary, if dictLength is Z_NULL, then it is not set. + + deflateGetDictionary() may return a length less than the window size, even + when more than the window size in input has been provided. It may return up + to 258 bytes less in that case, due to how zlib's implementation of deflate + manages the sliding window and lookahead for matches, where matches can be + up to 258 bytes long. If the application needs the last window-size bytes of + input, then that would need to be saved by the application outside of zlib. + + deflateGetDictionary returns Z_OK on success, or Z_STREAM_ERROR if the + stream state is inconsistent. +*/ + +ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when several compression strategies will be + tried, for example when there are several ways of pre-processing the input + data with a filter. The streams that will be discarded should then be freed + by calling deflateEnd. Note that deflateCopy duplicates the internal + compression state which can be quite large, so this strategy is slow and can + consume lots of memory. + + deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being Z_NULL). msg is left unchanged in both source and + destination. +*/ + +ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); +/* + This function is equivalent to deflateEnd followed by deflateInit, but + does not free and reallocate the internal compression state. The stream + will leave the compression level and any other attributes that may have been + set unchanged. + + deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL). +*/ + +ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, + int level, + int strategy)); +/* + Dynamically update the compression level and compression strategy. The + interpretation of level and strategy is as in deflateInit2(). This can be + used to switch between compression and straight copy of the input data, or + to switch to a different kind of input data requiring a different strategy. + If the compression approach (which is a function of the level) or the + strategy is changed, and if any input has been consumed in a previous + deflate() call, then the input available so far is compressed with the old + level and strategy using deflate(strm, Z_BLOCK). There are three approaches + for the compression levels 0, 1..3, and 4..9 respectively. The new level + and strategy will take effect at the next call of deflate(). + + If a deflate(strm, Z_BLOCK) is performed by deflateParams(), and it does + not have enough output space to complete, then the parameter change will not + take effect. In this case, deflateParams() can be called again with the + same parameters and more output space to try again. + + In order to assure a change in the parameters on the first try, the + deflate stream should be flushed using deflate() with Z_BLOCK or other flush + request until strm.avail_out is not zero, before calling deflateParams(). + Then no more input data should be provided before the deflateParams() call. + If this is done, the old level and strategy will be applied to the data + compressed before deflateParams(), and the new level and strategy will be + applied to the the data compressed after deflateParams(). + + deflateParams returns Z_OK on success, Z_STREAM_ERROR if the source stream + state was inconsistent or if a parameter was invalid, or Z_BUF_ERROR if + there was not enough output space to complete the compression of the + available input data before a change in the strategy or approach. Note that + in the case of a Z_BUF_ERROR, the parameters are not changed. A return + value of Z_BUF_ERROR is not fatal, in which case deflateParams() can be + retried with more output space. +*/ + +ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, + int good_length, + int max_lazy, + int nice_length, + int max_chain)); +/* + Fine tune deflate's internal compression parameters. This should only be + used by someone who understands the algorithm used by zlib's deflate for + searching for the best matching string, and even then only by the most + fanatic optimizer trying to squeeze out the last compressed bit for their + specific input data. Read the deflate.c source code for the meaning of the + max_lazy, good_length, nice_length, and max_chain parameters. + + deflateTune() can be called after deflateInit() or deflateInit2(), and + returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. + */ + +ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, + uLong sourceLen)); +/* + deflateBound() returns an upper bound on the compressed size after + deflation of sourceLen bytes. It must be called after deflateInit() or + deflateInit2(), and after deflateSetHeader(), if used. This would be used + to allocate an output buffer for deflation in a single pass, and so would be + called before deflate(). If that first deflate() call is provided the + sourceLen input bytes, an output buffer allocated to the size returned by + deflateBound(), and the flush value Z_FINISH, then deflate() is guaranteed + to return Z_STREAM_END. Note that it is possible for the compressed size to + be larger than the value returned by deflateBound() if flush options other + than Z_FINISH or Z_NO_FLUSH are used. +*/ + +ZEXTERN int ZEXPORT deflatePending OF((z_streamp strm, + unsigned *pending, + int *bits)); +/* + deflatePending() returns the number of bytes and bits of output that have + been generated, but not yet provided in the available output. The bytes not + provided would be due to the available output space having being consumed. + The number of bits of output not provided are between 0 and 7, where they + await more bits to join them in order to fill out a full byte. If pending + or bits are Z_NULL, then those values are not set. + + deflatePending returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. + */ + +ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, + int bits, + int value)); +/* + deflatePrime() inserts bits in the deflate output stream. The intent + is that this function is used to start off the deflate output with the bits + leftover from a previous deflate stream when appending to it. As such, this + function can only be used for raw deflate, and must be used before the first + deflate() call after a deflateInit2() or deflateReset(). bits must be less + than or equal to 16, and that many of the least significant bits of value + will be inserted in the output. + + deflatePrime returns Z_OK if success, Z_BUF_ERROR if there was not enough + room in the internal buffer to insert the bits, or Z_STREAM_ERROR if the + source stream state was inconsistent. +*/ + +ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, + gz_headerp head)); +/* + deflateSetHeader() provides gzip header information for when a gzip + stream is requested by deflateInit2(). deflateSetHeader() may be called + after deflateInit2() or deflateReset() and before the first call of + deflate(). The text, time, os, extra field, name, and comment information + in the provided gz_header structure are written to the gzip header (xflag is + ignored -- the extra flags are set according to the compression level). The + caller must assure that, if not Z_NULL, name and comment are terminated with + a zero byte, and that if extra is not Z_NULL, that extra_len bytes are + available there. If hcrc is true, a gzip header crc is included. Note that + the current versions of the command-line version of gzip (up through version + 1.3.x) do not support header crc's, and will report that it is a "multi-part + gzip file" and give up. + + If deflateSetHeader is not used, the default gzip header has text false, + the time set to zero, and os set to 255, with no extra, name, or comment + fields. The gzip header is returned to the default state by deflateReset(). + + deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, + int windowBits)); + + This is another version of inflateInit with an extra parameter. The + fields next_in, avail_in, zalloc, zfree and opaque must be initialized + before by the caller. + + The windowBits parameter is the base two logarithm of the maximum window + size (the size of the history buffer). It should be in the range 8..15 for + this version of the library. The default value is 15 if inflateInit is used + instead. windowBits must be greater than or equal to the windowBits value + provided to deflateInit2() while compressing, or it must be equal to 15 if + deflateInit2() was not used. If a compressed stream with a larger window + size is given as input, inflate() will return with the error code + Z_DATA_ERROR instead of trying to allocate a larger window. + + windowBits can also be zero to request that inflate use the window size in + the zlib header of the compressed stream. + + windowBits can also be -8..-15 for raw inflate. In this case, -windowBits + determines the window size. inflate() will then process raw deflate data, + not looking for a zlib or gzip header, not generating a check value, and not + looking for any check values for comparison at the end of the stream. This + is for use with other formats that use the deflate compressed data format + such as zip. Those formats provide their own check values. If a custom + format is developed using the raw deflate format for compressed data, it is + recommended that a check value such as an Adler-32 or a CRC-32 be applied to + the uncompressed data as is done in the zlib, gzip, and zip formats. For + most applications, the zlib format should be used as is. Note that comments + above on the use in deflateInit2() applies to the magnitude of windowBits. + + windowBits can also be greater than 15 for optional gzip decoding. Add + 32 to windowBits to enable zlib and gzip decoding with automatic header + detection, or add 16 to decode only the gzip format (the zlib format will + return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is a + CRC-32 instead of an Adler-32. Unlike the gunzip utility and gzread() (see + below), inflate() will not automatically decode concatenated gzip streams. + inflate() will return Z_STREAM_END at the end of the gzip stream. The state + would need to be reset to continue decoding a subsequent gzip stream. + + inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller, or Z_STREAM_ERROR if the parameters are + invalid, such as a null pointer to the structure. msg is set to null if + there is no error message. inflateInit2 does not perform any decompression + apart from possibly reading the zlib header if present: actual decompression + will be done by inflate(). (So next_in and avail_in may be modified, but + next_out and avail_out are unused and unchanged.) The current implementation + of inflateInit2() does not process any header information -- that is + deferred until inflate() is called. +*/ + +ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the decompression dictionary from the given uncompressed byte + sequence. This function must be called immediately after a call of inflate, + if that call returned Z_NEED_DICT. The dictionary chosen by the compressor + can be determined from the Adler-32 value returned by that call of inflate. + The compressor and decompressor must use exactly the same dictionary (see + deflateSetDictionary). For raw inflate, this function can be called at any + time to set the dictionary. If the provided dictionary is smaller than the + window and there is already data in the window, then the provided dictionary + will amend what's there. The application must insure that the dictionary + that was used for compression is provided. + + inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a + parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is + inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the + expected one (incorrect Adler-32 value). inflateSetDictionary does not + perform any decompression: this will be done by subsequent calls of + inflate(). +*/ + +ZEXTERN int ZEXPORT inflateGetDictionary OF((z_streamp strm, + Bytef *dictionary, + uInt *dictLength)); +/* + Returns the sliding dictionary being maintained by inflate. dictLength is + set to the number of bytes in the dictionary, and that many bytes are copied + to dictionary. dictionary must have enough space, where 32768 bytes is + always enough. If inflateGetDictionary() is called with dictionary equal to + Z_NULL, then only the dictionary length is returned, and nothing is copied. + Similary, if dictLength is Z_NULL, then it is not set. + + inflateGetDictionary returns Z_OK on success, or Z_STREAM_ERROR if the + stream state is inconsistent. +*/ + +ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); +/* + Skips invalid compressed data until a possible full flush point (see above + for the description of deflate with Z_FULL_FLUSH) can be found, or until all + available input is skipped. No output is provided. + + inflateSync searches for a 00 00 FF FF pattern in the compressed data. + All full flush points have this pattern, but not all occurrences of this + pattern are full flush points. + + inflateSync returns Z_OK if a possible full flush point has been found, + Z_BUF_ERROR if no more input was provided, Z_DATA_ERROR if no flush point + has been found, or Z_STREAM_ERROR if the stream structure was inconsistent. + In the success case, the application may save the current current value of + total_in which indicates where valid compressed data was found. In the + error case, the application may repeatedly call inflateSync, providing more + input each time, until success or end of the input data. +*/ + +ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when randomly accessing a large stream. The + first pass through the stream can periodically record the inflate state, + allowing restarting inflate at those points when randomly accessing the + stream. + + inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being Z_NULL). msg is left unchanged in both source and + destination. +*/ + +ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); +/* + This function is equivalent to inflateEnd followed by inflateInit, + but does not free and reallocate the internal decompression state. The + stream will keep attributes that may have been set by inflateInit2. + + inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL). +*/ + +ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm, + int windowBits)); +/* + This function is the same as inflateReset, but it also permits changing + the wrap and window size requests. The windowBits parameter is interpreted + the same as it is for inflateInit2. If the window size is changed, then the + memory allocated for the window is freed, and the window will be reallocated + by inflate() if needed. + + inflateReset2 returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL), or if + the windowBits parameter is invalid. +*/ + +ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, + int bits, + int value)); +/* + This function inserts bits in the inflate input stream. The intent is + that this function is used to start inflating at a bit position in the + middle of a byte. The provided bits will be used before any bytes are used + from next_in. This function should only be used with raw inflate, and + should be used before the first inflate() call after inflateInit2() or + inflateReset(). bits must be less than or equal to 16, and that many of the + least significant bits of value will be inserted in the input. + + If bits is negative, then the input stream bit buffer is emptied. Then + inflatePrime() can be called again to put bits in the buffer. This is used + to clear out bits leftover after feeding inflate a block description prior + to feeding inflate codes. + + inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm)); +/* + This function returns two values, one in the lower 16 bits of the return + value, and the other in the remaining upper bits, obtained by shifting the + return value down 16 bits. If the upper value is -1 and the lower value is + zero, then inflate() is currently decoding information outside of a block. + If the upper value is -1 and the lower value is non-zero, then inflate is in + the middle of a stored block, with the lower value equaling the number of + bytes from the input remaining to copy. If the upper value is not -1, then + it is the number of bits back from the current bit position in the input of + the code (literal or length/distance pair) currently being processed. In + that case the lower value is the number of bytes already emitted for that + code. + + A code is being processed if inflate is waiting for more input to complete + decoding of the code, or if it has completed decoding but is waiting for + more output space to write the literal or match data. + + inflateMark() is used to mark locations in the input data for random + access, which may be at bit positions, and to note those cases where the + output of a code may span boundaries of random access blocks. The current + location in the input stream can be determined from avail_in and data_type + as noted in the description for the Z_BLOCK flush parameter for inflate. + + inflateMark returns the value noted above, or -65536 if the provided + source stream state was inconsistent. +*/ + +ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, + gz_headerp head)); +/* + inflateGetHeader() requests that gzip header information be stored in the + provided gz_header structure. inflateGetHeader() may be called after + inflateInit2() or inflateReset(), and before the first call of inflate(). + As inflate() processes the gzip stream, head->done is zero until the header + is completed, at which time head->done is set to one. If a zlib stream is + being decoded, then head->done is set to -1 to indicate that there will be + no gzip header information forthcoming. Note that Z_BLOCK or Z_TREES can be + used to force inflate() to return immediately after header processing is + complete and before any actual data is decompressed. + + The text, time, xflags, and os fields are filled in with the gzip header + contents. hcrc is set to true if there is a header CRC. (The header CRC + was valid if done is set to one.) If extra is not Z_NULL, then extra_max + contains the maximum number of bytes to write to extra. Once done is true, + extra_len contains the actual extra field length, and extra contains the + extra field, or that field truncated if extra_max is less than extra_len. + If name is not Z_NULL, then up to name_max characters are written there, + terminated with a zero unless the length is greater than name_max. If + comment is not Z_NULL, then up to comm_max characters are written there, + terminated with a zero unless the length is greater than comm_max. When any + of extra, name, or comment are not Z_NULL and the respective field is not + present in the header, then that field is set to Z_NULL to signal its + absence. This allows the use of deflateSetHeader() with the returned + structure to duplicate the header. However if those fields are set to + allocated memory, then the application will need to save those pointers + elsewhere so that they can be eventually freed. + + If inflateGetHeader is not used, then the header information is simply + discarded. The header is always checked for validity, including the header + CRC if present. inflateReset() will reset the process to discard the header + information. The application would need to call inflateGetHeader() again to + retrieve the header from the next gzip stream. + + inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, + unsigned char FAR *window)); + + Initialize the internal stream state for decompression using inflateBack() + calls. The fields zalloc, zfree and opaque in strm must be initialized + before the call. If zalloc and zfree are Z_NULL, then the default library- + derived memory allocation routines are used. windowBits is the base two + logarithm of the window size, in the range 8..15. window is a caller + supplied buffer of that size. Except for special applications where it is + assured that deflate was used with small window sizes, windowBits must be 15 + and a 32K byte window must be supplied to be able to decompress general + deflate streams. + + See inflateBack() for the usage of these routines. + + inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of + the parameters are invalid, Z_MEM_ERROR if the internal state could not be + allocated, or Z_VERSION_ERROR if the version of the library does not match + the version of the header file. +*/ + +typedef unsigned (*in_func) OF((void FAR *, + z_const unsigned char FAR * FAR *)); +typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); + +ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, + in_func in, void FAR *in_desc, + out_func out, void FAR *out_desc)); +/* + inflateBack() does a raw inflate with a single call using a call-back + interface for input and output. This is potentially more efficient than + inflate() for file i/o applications, in that it avoids copying between the + output and the sliding window by simply making the window itself the output + buffer. inflate() can be faster on modern CPUs when used with large + buffers. inflateBack() trusts the application to not change the output + buffer passed by the output function, at least until inflateBack() returns. + + inflateBackInit() must be called first to allocate the internal state + and to initialize the state with the user-provided window buffer. + inflateBack() may then be used multiple times to inflate a complete, raw + deflate stream with each call. inflateBackEnd() is then called to free the + allocated state. + + A raw deflate stream is one with no zlib or gzip header or trailer. + This routine would normally be used in a utility that reads zip or gzip + files and writes out uncompressed files. The utility would decode the + header and process the trailer on its own, hence this routine expects only + the raw deflate stream to decompress. This is different from the default + behavior of inflate(), which expects a zlib header and trailer around the + deflate stream. + + inflateBack() uses two subroutines supplied by the caller that are then + called by inflateBack() for input and output. inflateBack() calls those + routines until it reads a complete deflate stream and writes out all of the + uncompressed data, or until it encounters an error. The function's + parameters and return types are defined above in the in_func and out_func + typedefs. inflateBack() will call in(in_desc, &buf) which should return the + number of bytes of provided input, and a pointer to that input in buf. If + there is no input available, in() must return zero -- buf is ignored in that + case -- and inflateBack() will return a buffer error. inflateBack() will + call out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. + out() should return zero on success, or non-zero on failure. If out() + returns non-zero, inflateBack() will return with an error. Neither in() nor + out() are permitted to change the contents of the window provided to + inflateBackInit(), which is also the buffer that out() uses to write from. + The length written by out() will be at most the window size. Any non-zero + amount of input may be provided by in(). + + For convenience, inflateBack() can be provided input on the first call by + setting strm->next_in and strm->avail_in. If that input is exhausted, then + in() will be called. Therefore strm->next_in must be initialized before + calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called + immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in + must also be initialized, and then if strm->avail_in is not zero, input will + initially be taken from strm->next_in[0 .. strm->avail_in - 1]. + + The in_desc and out_desc parameters of inflateBack() is passed as the + first parameter of in() and out() respectively when they are called. These + descriptors can be optionally used to pass any information that the caller- + supplied in() and out() functions need to do their job. + + On return, inflateBack() will set strm->next_in and strm->avail_in to + pass back any unused input that was provided by the last in() call. The + return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR + if in() or out() returned an error, Z_DATA_ERROR if there was a format error + in the deflate stream (in which case strm->msg is set to indicate the nature + of the error), or Z_STREAM_ERROR if the stream was not properly initialized. + In the case of Z_BUF_ERROR, an input or output error can be distinguished + using strm->next_in which will be Z_NULL only if in() returned an error. If + strm->next_in is not Z_NULL, then the Z_BUF_ERROR was due to out() returning + non-zero. (in() will always be called before out(), so strm->next_in is + assured to be defined if out() returns non-zero.) Note that inflateBack() + cannot return Z_OK. +*/ + +ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); +/* + All memory allocated by inflateBackInit() is freed. + + inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream + state was inconsistent. +*/ + +ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); +/* Return flags indicating compile-time options. + + Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: + 1.0: size of uInt + 3.2: size of uLong + 5.4: size of voidpf (pointer) + 7.6: size of z_off_t + + Compiler, assembler, and debug options: + 8: ZLIB_DEBUG + 9: ASMV or ASMINF -- use ASM code + 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention + 11: 0 (reserved) + + One-time table building (smaller code, but not thread-safe if true): + 12: BUILDFIXED -- build static block decoding tables when needed + 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed + 14,15: 0 (reserved) + + Library content (indicates missing functionality): + 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking + deflate code when not needed) + 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect + and decode gzip streams (to avoid linking crc code) + 18-19: 0 (reserved) + + Operation variations (changes in library functionality): + 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate + 21: FASTEST -- deflate algorithm with only one, lowest compression level + 22,23: 0 (reserved) + + The sprintf variant used by gzprintf (zero is best): + 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format + 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! + 26: 0 = returns value, 1 = void -- 1 means inferred string length returned + + Remainder: + 27-31: 0 (reserved) + */ + +#ifndef Z_SOLO + + /* utility functions */ + +/* + The following utility functions are implemented on top of the basic + stream-oriented functions. To simplify the interface, some default options + are assumed (compression level and memory usage, standard memory allocation + functions). The source code of these utility functions can be modified if + you need special options. +*/ + +ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Compresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total size + of the destination buffer, which must be at least the value returned by + compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed data. compress() is equivalent to compress2() with a level + parameter of Z_DEFAULT_COMPRESSION. + + compress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer. +*/ + +ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen, + int level)); +/* + Compresses the source buffer into the destination buffer. The level + parameter has the same meaning as in deflateInit. sourceLen is the byte + length of the source buffer. Upon entry, destLen is the total size of the + destination buffer, which must be at least the value returned by + compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed data. + + compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_BUF_ERROR if there was not enough room in the output buffer, + Z_STREAM_ERROR if the level parameter is invalid. +*/ + +ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); +/* + compressBound() returns an upper bound on the compressed size after + compress() or compress2() on sourceLen bytes. It would be used before a + compress() or compress2() call to allocate the destination buffer. +*/ + +ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Decompresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total size + of the destination buffer, which must be large enough to hold the entire + uncompressed data. (The size of the uncompressed data must have been saved + previously by the compressor and transmitted to the decompressor by some + mechanism outside the scope of this compression library.) Upon exit, destLen + is the actual size of the uncompressed data. + + uncompress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. In + the case where there is not enough room, uncompress() will fill the output + buffer with the uncompressed data up to that point. +*/ + +ZEXTERN int ZEXPORT uncompress2 OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong *sourceLen)); +/* + Same as uncompress, except that sourceLen is a pointer, where the + length of the source is *sourceLen. On return, *sourceLen is the number of + source bytes consumed. +*/ + + /* gzip file access functions */ + +/* + This library supports reading and writing files in gzip (.gz) format with + an interface similar to that of stdio, using the functions that start with + "gz". The gzip format is different from the zlib format. gzip is a gzip + wrapper, documented in RFC 1952, wrapped around a deflate stream. +*/ + +typedef struct gzFile_s *gzFile; /* semi-opaque gzip file descriptor */ + +/* +ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); + + Opens a gzip (.gz) file for reading or writing. The mode parameter is as + in fopen ("rb" or "wb") but can also include a compression level ("wb9") or + a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman-only + compression as in "wb1h", 'R' for run-length encoding as in "wb1R", or 'F' + for fixed code compression as in "wb9F". (See the description of + deflateInit2 for more information about the strategy parameter.) 'T' will + request transparent writing or appending with no compression and not using + the gzip format. + + "a" can be used instead of "w" to request that the gzip stream that will + be written be appended to the file. "+" will result in an error, since + reading and writing to the same gzip file is not supported. The addition of + "x" when writing will create the file exclusively, which fails if the file + already exists. On systems that support it, the addition of "e" when + reading or writing will set the flag to close the file on an execve() call. + + These functions, as well as gzip, will read and decode a sequence of gzip + streams in a file. The append function of gzopen() can be used to create + such a file. (Also see gzflush() for another way to do this.) When + appending, gzopen does not test whether the file begins with a gzip stream, + nor does it look for the end of the gzip streams to begin appending. gzopen + will simply append a gzip stream to the existing file. + + gzopen can be used to read a file which is not in gzip format; in this + case gzread will directly read from the file without decompression. When + reading, this will be detected automatically by looking for the magic two- + byte gzip header. + + gzopen returns NULL if the file could not be opened, if there was + insufficient memory to allocate the gzFile state, or if an invalid mode was + specified (an 'r', 'w', or 'a' was not provided, or '+' was provided). + errno can be checked to determine if the reason gzopen failed was that the + file could not be opened. +*/ + +ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); +/* + gzdopen associates a gzFile with the file descriptor fd. File descriptors + are obtained from calls like open, dup, creat, pipe or fileno (if the file + has been previously opened with fopen). The mode parameter is as in gzopen. + + The next call of gzclose on the returned gzFile will also close the file + descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor + fd. If you want to keep fd open, use fd = dup(fd_keep); gz = gzdopen(fd, + mode);. The duplicated descriptor should be saved to avoid a leak, since + gzdopen does not close fd if it fails. If you are using fileno() to get the + file descriptor from a FILE *, then you will have to use dup() to avoid + double-close()ing the file descriptor. Both gzclose() and fclose() will + close the associated file descriptor, so they need to have different file + descriptors. + + gzdopen returns NULL if there was insufficient memory to allocate the + gzFile state, if an invalid mode was specified (an 'r', 'w', or 'a' was not + provided, or '+' was provided), or if fd is -1. The file descriptor is not + used until the next gz* read, write, seek, or close operation, so gzdopen + will not detect if fd is invalid (unless fd is -1). +*/ + +ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size)); +/* + Set the internal buffer size used by this library's functions. The + default buffer size is 8192 bytes. This function must be called after + gzopen() or gzdopen(), and before any other calls that read or write the + file. The buffer memory allocation is always deferred to the first read or + write. Three times that size in buffer space is allocated. A larger buffer + size of, for example, 64K or 128K bytes will noticeably increase the speed + of decompression (reading). + + The new buffer size also affects the maximum length for gzprintf(). + + gzbuffer() returns 0 on success, or -1 on failure, such as being called + too late. +*/ + +ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); +/* + Dynamically update the compression level or strategy. See the description + of deflateInit2 for the meaning of these parameters. Previously provided + data is flushed before the parameter change. + + gzsetparams returns Z_OK if success, Z_STREAM_ERROR if the file was not + opened for writing, Z_ERRNO if there is an error writing the flushed data, + or Z_MEM_ERROR if there is a memory allocation error. +*/ + +ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); +/* + Reads the given number of uncompressed bytes from the compressed file. If + the input file is not in gzip format, gzread copies the given number of + bytes into the buffer directly from the file. + + After reaching the end of a gzip stream in the input, gzread will continue + to read, looking for another gzip stream. Any number of gzip streams may be + concatenated in the input file, and will all be decompressed by gzread(). + If something other than a gzip stream is encountered after a gzip stream, + that remaining trailing garbage is ignored (and no error is returned). + + gzread can be used to read a gzip file that is being concurrently written. + Upon reaching the end of the input, gzread will return with the available + data. If the error code returned by gzerror is Z_OK or Z_BUF_ERROR, then + gzclearerr can be used to clear the end of file indicator in order to permit + gzread to be tried again. Z_OK indicates that a gzip stream was completed + on the last gzread. Z_BUF_ERROR indicates that the input file ended in the + middle of a gzip stream. Note that gzread does not return -1 in the event + of an incomplete gzip stream. This error is deferred until gzclose(), which + will return Z_BUF_ERROR if the last gzread ended in the middle of a gzip + stream. Alternatively, gzerror can be used before gzclose to detect this + case. + + gzread returns the number of uncompressed bytes actually read, less than + len for end of file, or -1 for error. If len is too large to fit in an int, + then nothing is read, -1 is returned, and the error state is set to + Z_STREAM_ERROR. +*/ + +ZEXTERN z_size_t ZEXPORT gzfread OF((voidp buf, z_size_t size, z_size_t nitems, + gzFile file)); +/* + Read up to nitems items of size size from file to buf, otherwise operating + as gzread() does. This duplicates the interface of stdio's fread(), with + size_t request and return types. If the library defines size_t, then + z_size_t is identical to size_t. If not, then z_size_t is an unsigned + integer type that can contain a pointer. + + gzfread() returns the number of full items read of size size, or zero if + the end of the file was reached and a full item could not be read, or if + there was an error. gzerror() must be consulted if zero is returned in + order to determine if there was an error. If the multiplication of size and + nitems overflows, i.e. the product does not fit in a z_size_t, then nothing + is read, zero is returned, and the error state is set to Z_STREAM_ERROR. + + In the event that the end of file is reached and only a partial item is + available at the end, i.e. the remaining uncompressed data length is not a + multiple of size, then the final partial item is nevetheless read into buf + and the end-of-file flag is set. The length of the partial item read is not + provided, but could be inferred from the result of gztell(). This behavior + is the same as the behavior of fread() implementations in common libraries, + but it prevents the direct use of gzfread() to read a concurrently written + file, reseting and retrying on end-of-file, when size is not 1. +*/ + +ZEXTERN int ZEXPORT gzwrite OF((gzFile file, + voidpc buf, unsigned len)); +/* + Writes the given number of uncompressed bytes into the compressed file. + gzwrite returns the number of uncompressed bytes written or 0 in case of + error. +*/ + +ZEXTERN z_size_t ZEXPORT gzfwrite OF((voidpc buf, z_size_t size, + z_size_t nitems, gzFile file)); +/* + gzfwrite() writes nitems items of size size from buf to file, duplicating + the interface of stdio's fwrite(), with size_t request and return types. If + the library defines size_t, then z_size_t is identical to size_t. If not, + then z_size_t is an unsigned integer type that can contain a pointer. + + gzfwrite() returns the number of full items written of size size, or zero + if there was an error. If the multiplication of size and nitems overflows, + i.e. the product does not fit in a z_size_t, then nothing is written, zero + is returned, and the error state is set to Z_STREAM_ERROR. +*/ + +ZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...)); +/* + Converts, formats, and writes the arguments to the compressed file under + control of the format string, as in fprintf. gzprintf returns the number of + uncompressed bytes actually written, or a negative zlib error code in case + of error. The number of uncompressed bytes written is limited to 8191, or + one less than the buffer size given to gzbuffer(). The caller should assure + that this limit is not exceeded. If it is exceeded, then gzprintf() will + return an error (0) with nothing written. In this case, there may also be a + buffer overflow with unpredictable consequences, which is possible only if + zlib was compiled with the insecure functions sprintf() or vsprintf() + because the secure snprintf() or vsnprintf() functions were not available. + This can be determined using zlibCompileFlags(). +*/ + +ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); +/* + Writes the given null-terminated string to the compressed file, excluding + the terminating null character. + + gzputs returns the number of characters written, or -1 in case of error. +*/ + +ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); +/* + Reads bytes from the compressed file until len-1 characters are read, or a + newline character is read and transferred to buf, or an end-of-file + condition is encountered. If any characters are read or if len == 1, the + string is terminated with a null character. If no characters are read due + to an end-of-file or len < 1, then the buffer is left untouched. + + gzgets returns buf which is a null-terminated string, or it returns NULL + for end-of-file or in case of error. If there was an error, the contents at + buf are indeterminate. +*/ + +ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); +/* + Writes c, converted to an unsigned char, into the compressed file. gzputc + returns the value that was written, or -1 in case of error. +*/ + +ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); +/* + Reads one byte from the compressed file. gzgetc returns this byte or -1 + in case of end of file or error. This is implemented as a macro for speed. + As such, it does not do all of the checking the other functions do. I.e. + it does not check to see if file is NULL, nor whether the structure file + points to has been clobbered or not. +*/ + +ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); +/* + Push one character back onto the stream to be read as the first character + on the next read. At least one character of push-back is allowed. + gzungetc() returns the character pushed, or -1 on failure. gzungetc() will + fail if c is -1, and may fail if a character has been pushed but not read + yet. If gzungetc is used immediately after gzopen or gzdopen, at least the + output buffer size of pushed characters is allowed. (See gzbuffer above.) + The pushed character will be discarded if the stream is repositioned with + gzseek() or gzrewind(). +*/ + +ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); +/* + Flushes all pending output into the compressed file. The parameter flush + is as in the deflate() function. The return value is the zlib error number + (see function gzerror below). gzflush is only permitted when writing. + + If the flush parameter is Z_FINISH, the remaining data is written and the + gzip stream is completed in the output. If gzwrite() is called again, a new + gzip stream will be started in the output. gzread() is able to read such + concatenated gzip streams. + + gzflush should be called only when strictly necessary because it will + degrade compression if called too often. +*/ + +/* +ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, + z_off_t offset, int whence)); + + Sets the starting position for the next gzread or gzwrite on the given + compressed file. The offset represents a number of bytes in the + uncompressed data stream. The whence parameter is defined as in lseek(2); + the value SEEK_END is not supported. + + If the file is opened for reading, this function is emulated but can be + extremely slow. If the file is opened for writing, only forward seeks are + supported; gzseek then compresses a sequence of zeroes up to the new + starting position. + + gzseek returns the resulting offset location as measured in bytes from + the beginning of the uncompressed stream, or -1 in case of error, in + particular if the file is opened for writing and the new starting position + would be before the current position. +*/ + +ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); +/* + Rewinds the given file. This function is supported only for reading. + + gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) +*/ + +/* +ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); + + Returns the starting position for the next gzread or gzwrite on the given + compressed file. This position represents a number of bytes in the + uncompressed data stream, and is zero when starting, even if appending or + reading a gzip stream from the middle of a file using gzdopen(). + + gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) +*/ + +/* +ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file)); + + Returns the current offset in the file being read or written. This offset + includes the count of bytes that precede the gzip stream, for example when + appending or when using gzdopen() for reading. When reading, the offset + does not include as yet unused buffered input. This information can be used + for a progress indicator. On error, gzoffset() returns -1. +*/ + +ZEXTERN int ZEXPORT gzeof OF((gzFile file)); +/* + Returns true (1) if the end-of-file indicator has been set while reading, + false (0) otherwise. Note that the end-of-file indicator is set only if the + read tried to go past the end of the input, but came up short. Therefore, + just like feof(), gzeof() may return false even if there is no more data to + read, in the event that the last read request was for the exact number of + bytes remaining in the input file. This will happen if the input file size + is an exact multiple of the buffer size. + + If gzeof() returns true, then the read functions will return no more data, + unless the end-of-file indicator is reset by gzclearerr() and the input file + has grown since the previous end of file was detected. +*/ + +ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); +/* + Returns true (1) if file is being copied directly while reading, or false + (0) if file is a gzip stream being decompressed. + + If the input file is empty, gzdirect() will return true, since the input + does not contain a gzip stream. + + If gzdirect() is used immediately after gzopen() or gzdopen() it will + cause buffers to be allocated to allow reading the file to determine if it + is a gzip file. Therefore if gzbuffer() is used, it should be called before + gzdirect(). + + When writing, gzdirect() returns true (1) if transparent writing was + requested ("wT" for the gzopen() mode), or false (0) otherwise. (Note: + gzdirect() is not needed when writing. Transparent writing must be + explicitly requested, so the application already knows the answer. When + linking statically, using gzdirect() will include all of the zlib code for + gzip file reading and decompression, which may not be desired.) +*/ + +ZEXTERN int ZEXPORT gzclose OF((gzFile file)); +/* + Flushes all pending output if necessary, closes the compressed file and + deallocates the (de)compression state. Note that once file is closed, you + cannot call gzerror with file, since its structures have been deallocated. + gzclose must not be called more than once on the same file, just as free + must not be called more than once on the same allocation. + + gzclose will return Z_STREAM_ERROR if file is not valid, Z_ERRNO on a + file operation error, Z_MEM_ERROR if out of memory, Z_BUF_ERROR if the + last read ended in the middle of a gzip stream, or Z_OK on success. +*/ + +ZEXTERN int ZEXPORT gzclose_r OF((gzFile file)); +ZEXTERN int ZEXPORT gzclose_w OF((gzFile file)); +/* + Same as gzclose(), but gzclose_r() is only for use when reading, and + gzclose_w() is only for use when writing or appending. The advantage to + using these instead of gzclose() is that they avoid linking in zlib + compression or decompression code that is not used when only reading or only + writing respectively. If gzclose() is used, then both compression and + decompression code will be included the application when linking to a static + zlib library. +*/ + +ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); +/* + Returns the error message for the last error which occurred on the given + compressed file. errnum is set to zlib error number. If an error occurred + in the file system and not in the compression library, errnum is set to + Z_ERRNO and the application may consult errno to get the exact error code. + + The application must not modify the returned string. Future calls to + this function may invalidate the previously returned string. If file is + closed, then the string previously returned by gzerror will no longer be + available. + + gzerror() should be used to distinguish errors from end-of-file for those + functions above that do not distinguish those cases in their return values. +*/ + +ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); +/* + Clears the error and end-of-file flags for file. This is analogous to the + clearerr() function in stdio. This is useful for continuing to read a gzip + file that is being written concurrently. +*/ + +#endif /* !Z_SOLO */ + + /* checksum functions */ + +/* + These functions are not related to compression but are exported + anyway because they might be useful in applications using the compression + library. +*/ + +ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); +/* + Update a running Adler-32 checksum with the bytes buf[0..len-1] and + return the updated checksum. If buf is Z_NULL, this function returns the + required initial value for the checksum. + + An Adler-32 checksum is almost as reliable as a CRC-32 but can be computed + much faster. + + Usage example: + + uLong adler = adler32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + adler = adler32(adler, buffer, length); + } + if (adler != original_adler) error(); +*/ + +ZEXTERN uLong ZEXPORT adler32_z OF((uLong adler, const Bytef *buf, + z_size_t len)); +/* + Same as adler32(), but with a size_t length. +*/ + +/* +ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, + z_off_t len2)); + + Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 + and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for + each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of + seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. Note + that the z_off_t type (like off_t) is a signed integer. If len2 is + negative, the result has no meaning or utility. +*/ + +ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); +/* + Update a running CRC-32 with the bytes buf[0..len-1] and return the + updated CRC-32. If buf is Z_NULL, this function returns the required + initial value for the crc. Pre- and post-conditioning (one's complement) is + performed within this function so it shouldn't be done by the application. + + Usage example: + + uLong crc = crc32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + crc = crc32(crc, buffer, length); + } + if (crc != original_crc) error(); +*/ + +ZEXTERN uLong ZEXPORT crc32_z OF((uLong adler, const Bytef *buf, + z_size_t len)); +/* + Same as crc32(), but with a size_t length. +*/ + +/* +ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); + + Combine two CRC-32 check values into one. For two sequences of bytes, + seq1 and seq2 with lengths len1 and len2, CRC-32 check values were + calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 + check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and + len2. +*/ + + + /* various hacks, don't look :) */ + +/* deflateInit and inflateInit are macros to allow checking the zlib version + * and the compiler's view of z_stream: + */ +ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, + int windowBits, int memLevel, + int strategy, const char *version, + int stream_size)); +ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, + unsigned char FAR *window, + const char *version, + int stream_size)); +#ifdef Z_PREFIX_SET +# define z_deflateInit(strm, level) \ + deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream)) +# define z_inflateInit(strm) \ + inflateInit_((strm), ZLIB_VERSION, (int)sizeof(z_stream)) +# define z_deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ + deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ + (strategy), ZLIB_VERSION, (int)sizeof(z_stream)) +# define z_inflateInit2(strm, windowBits) \ + inflateInit2_((strm), (windowBits), ZLIB_VERSION, \ + (int)sizeof(z_stream)) +# define z_inflateBackInit(strm, windowBits, window) \ + inflateBackInit_((strm), (windowBits), (window), \ + ZLIB_VERSION, (int)sizeof(z_stream)) +#else +# define deflateInit(strm, level) \ + deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream)) +# define inflateInit(strm) \ + inflateInit_((strm), ZLIB_VERSION, (int)sizeof(z_stream)) +# define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ + deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ + (strategy), ZLIB_VERSION, (int)sizeof(z_stream)) +# define inflateInit2(strm, windowBits) \ + inflateInit2_((strm), (windowBits), ZLIB_VERSION, \ + (int)sizeof(z_stream)) +# define inflateBackInit(strm, windowBits, window) \ + inflateBackInit_((strm), (windowBits), (window), \ + ZLIB_VERSION, (int)sizeof(z_stream)) +#endif + +#ifndef Z_SOLO + +/* gzgetc() macro and its supporting function and exposed data structure. Note + * that the real internal state is much larger than the exposed structure. + * This abbreviated structure exposes just enough for the gzgetc() macro. The + * user should not mess with these exposed elements, since their names or + * behavior could change in the future, perhaps even capriciously. They can + * only be used by the gzgetc() macro. You have been warned. + */ +struct gzFile_s { + unsigned have; + unsigned char *next; + z_off64_t pos; +}; +ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ +#ifdef Z_PREFIX_SET +# undef z_gzgetc +# define z_gzgetc(g) \ + ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : (gzgetc)(g)) +#else +# define gzgetc(g) \ + ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : (gzgetc)(g)) +#endif + +/* provide 64-bit offset functions if _LARGEFILE64_SOURCE defined, and/or + * change the regular functions to 64 bits if _FILE_OFFSET_BITS is 64 (if + * both are true, the application gets the *64 functions, and the regular + * functions are changed to 64 bits) -- in case these are set on systems + * without large file support, _LFS64_LARGEFILE must also be true + */ +#ifdef Z_LARGE64 + ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); + ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); + ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); + ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off64_t)); + ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t)); +#endif + +#if !defined(ZLIB_INTERNAL) && defined(Z_WANT64) +# ifdef Z_PREFIX_SET +# define z_gzopen z_gzopen64 +# define z_gzseek z_gzseek64 +# define z_gztell z_gztell64 +# define z_gzoffset z_gzoffset64 +# define z_adler32_combine z_adler32_combine64 +# define z_crc32_combine z_crc32_combine64 +# else +# define gzopen gzopen64 +# define gzseek gzseek64 +# define gztell gztell64 +# define gzoffset gzoffset64 +# define adler32_combine adler32_combine64 +# define crc32_combine crc32_combine64 +# endif +# ifndef Z_LARGE64 + ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); + ZEXTERN z_off_t ZEXPORT gzseek64 OF((gzFile, z_off_t, int)); + ZEXTERN z_off_t ZEXPORT gztell64 OF((gzFile)); + ZEXTERN z_off_t ZEXPORT gzoffset64 OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); +# endif +#else + ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *)); + ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile, z_off_t, int)); + ZEXTERN z_off_t ZEXPORT gztell OF((gzFile)); + ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); +#endif + +#else /* Z_SOLO */ + + ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); + +#endif /* !Z_SOLO */ + +/* undocumented functions */ +ZEXTERN const char * ZEXPORT zError OF((int)); +ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp)); +ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table OF((void)); +ZEXTERN int ZEXPORT inflateUndermine OF((z_streamp, int)); +ZEXTERN int ZEXPORT inflateValidate OF((z_streamp, int)); +ZEXTERN unsigned long ZEXPORT inflateCodesUsed OF ((z_streamp)); +ZEXTERN int ZEXPORT inflateResetKeep OF((z_streamp)); +ZEXTERN int ZEXPORT deflateResetKeep OF((z_streamp)); +#if (defined(_WIN32) || defined(__CYGWIN__)) && !defined(Z_SOLO) +ZEXTERN gzFile ZEXPORT gzopen_w OF((const wchar_t *path, + const char *mode)); +#endif +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +# ifndef Z_SOLO +ZEXTERN int ZEXPORTVA gzvprintf Z_ARG((gzFile file, + const char *format, + va_list va)); +# endif +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* ZLIB_H */ diff --git a/core/cd_hw/libchdr/deps/zlib/zutil.c b/core/cd_hw/libchdr/deps/zlib/zutil.c new file mode 100644 index 0000000..a76c6b0 --- /dev/null +++ b/core/cd_hw/libchdr/deps/zlib/zutil.c @@ -0,0 +1,325 @@ +/* zutil.c -- target dependent utility functions for the compression library + * Copyright (C) 1995-2017 Jean-loup Gailly + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#include "zutil.h" +#ifndef Z_SOLO +# include "gzguts.h" +#endif + +z_const char * const z_errmsg[10] = { + (z_const char *)"need dictionary", /* Z_NEED_DICT 2 */ + (z_const char *)"stream end", /* Z_STREAM_END 1 */ + (z_const char *)"", /* Z_OK 0 */ + (z_const char *)"file error", /* Z_ERRNO (-1) */ + (z_const char *)"stream error", /* Z_STREAM_ERROR (-2) */ + (z_const char *)"data error", /* Z_DATA_ERROR (-3) */ + (z_const char *)"insufficient memory", /* Z_MEM_ERROR (-4) */ + (z_const char *)"buffer error", /* Z_BUF_ERROR (-5) */ + (z_const char *)"incompatible version",/* Z_VERSION_ERROR (-6) */ + (z_const char *)"" +}; + + +const char * ZEXPORT zlibVersion() +{ + return ZLIB_VERSION; +} + +uLong ZEXPORT zlibCompileFlags() +{ + uLong flags; + + flags = 0; + switch ((int)(sizeof(uInt))) { + case 2: break; + case 4: flags += 1; break; + case 8: flags += 2; break; + default: flags += 3; + } + switch ((int)(sizeof(uLong))) { + case 2: break; + case 4: flags += 1 << 2; break; + case 8: flags += 2 << 2; break; + default: flags += 3 << 2; + } + switch ((int)(sizeof(voidpf))) { + case 2: break; + case 4: flags += 1 << 4; break; + case 8: flags += 2 << 4; break; + default: flags += 3 << 4; + } + switch ((int)(sizeof(z_off_t))) { + case 2: break; + case 4: flags += 1 << 6; break; + case 8: flags += 2 << 6; break; + default: flags += 3 << 6; + } +#ifdef ZLIB_DEBUG + flags += 1 << 8; +#endif +#if defined(ASMV) || defined(ASMINF) + flags += 1 << 9; +#endif +#ifdef ZLIB_WINAPI + flags += 1 << 10; +#endif +#ifdef BUILDFIXED + flags += 1 << 12; +#endif +#ifdef DYNAMIC_CRC_TABLE + flags += 1 << 13; +#endif +#ifdef NO_GZCOMPRESS + flags += 1L << 16; +#endif +#ifdef NO_GZIP + flags += 1L << 17; +#endif +#ifdef PKZIP_BUG_WORKAROUND + flags += 1L << 20; +#endif +#ifdef FASTEST + flags += 1L << 21; +#endif +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +# ifdef NO_vsnprintf + flags += 1L << 25; +# ifdef HAS_vsprintf_void + flags += 1L << 26; +# endif +# else +# ifdef HAS_vsnprintf_void + flags += 1L << 26; +# endif +# endif +#else + flags += 1L << 24; +# ifdef NO_snprintf + flags += 1L << 25; +# ifdef HAS_sprintf_void + flags += 1L << 26; +# endif +# else +# ifdef HAS_snprintf_void + flags += 1L << 26; +# endif +# endif +#endif + return flags; +} + +#ifdef ZLIB_DEBUG +#include +# ifndef verbose +# define verbose 0 +# endif +int ZLIB_INTERNAL z_verbose = verbose; + +void ZLIB_INTERNAL z_error (m) + char *m; +{ + fprintf(stderr, "%s\n", m); + exit(1); +} +#endif + +/* exported to allow conversion of error code to string for compress() and + * uncompress() + */ +const char * ZEXPORT zError(err) + int err; +{ + return ERR_MSG(err); +} + +#if defined(_WIN32_WCE) + /* The Microsoft C Run-Time Library for Windows CE doesn't have + * errno. We define it as a global variable to simplify porting. + * Its value is always 0 and should not be used. + */ + int errno = 0; +#endif + +#ifndef HAVE_MEMCPY + +void ZLIB_INTERNAL zmemcpy(dest, source, len) + Bytef* dest; + const Bytef* source; + uInt len; +{ + if (len == 0) return; + do { + *dest++ = *source++; /* ??? to be unrolled */ + } while (--len != 0); +} + +int ZLIB_INTERNAL zmemcmp(s1, s2, len) + const Bytef* s1; + const Bytef* s2; + uInt len; +{ + uInt j; + + for (j = 0; j < len; j++) { + if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1; + } + return 0; +} + +void ZLIB_INTERNAL zmemzero(dest, len) + Bytef* dest; + uInt len; +{ + if (len == 0) return; + do { + *dest++ = 0; /* ??? to be unrolled */ + } while (--len != 0); +} +#endif + +#ifndef Z_SOLO + +#ifdef SYS16BIT + +#ifdef __TURBOC__ +/* Turbo C in 16-bit mode */ + +# define MY_ZCALLOC + +/* Turbo C malloc() does not allow dynamic allocation of 64K bytes + * and farmalloc(64K) returns a pointer with an offset of 8, so we + * must fix the pointer. Warning: the pointer must be put back to its + * original form in order to free it, use zcfree(). + */ + +#define MAX_PTR 10 +/* 10*64K = 640K */ + +local int next_ptr = 0; + +typedef struct ptr_table_s { + voidpf org_ptr; + voidpf new_ptr; +} ptr_table; + +local ptr_table table[MAX_PTR]; +/* This table is used to remember the original form of pointers + * to large buffers (64K). Such pointers are normalized with a zero offset. + * Since MSDOS is not a preemptive multitasking OS, this table is not + * protected from concurrent access. This hack doesn't work anyway on + * a protected system like OS/2. Use Microsoft C instead. + */ + +voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, unsigned items, unsigned size) +{ + voidpf buf; + ulg bsize = (ulg)items*size; + + (void)opaque; + + /* If we allocate less than 65520 bytes, we assume that farmalloc + * will return a usable pointer which doesn't have to be normalized. + */ + if (bsize < 65520L) { + buf = farmalloc(bsize); + if (*(ush*)&buf != 0) return buf; + } else { + buf = farmalloc(bsize + 16L); + } + if (buf == NULL || next_ptr >= MAX_PTR) return NULL; + table[next_ptr].org_ptr = buf; + + /* Normalize the pointer to seg:0 */ + *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4; + *(ush*)&buf = 0; + table[next_ptr++].new_ptr = buf; + return buf; +} + +void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) +{ + int n; + + (void)opaque; + + if (*(ush*)&ptr != 0) { /* object < 64K */ + farfree(ptr); + return; + } + /* Find the original pointer */ + for (n = 0; n < next_ptr; n++) { + if (ptr != table[n].new_ptr) continue; + + farfree(table[n].org_ptr); + while (++n < next_ptr) { + table[n-1] = table[n]; + } + next_ptr--; + return; + } + Assert(0, "zcfree: ptr not found"); +} + +#endif /* __TURBOC__ */ + + +#ifdef M_I86 +/* Microsoft C in 16-bit mode */ + +# define MY_ZCALLOC + +#if (!defined(_MSC_VER) || (_MSC_VER <= 600)) +# define _halloc halloc +# define _hfree hfree +#endif + +voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, uInt items, uInt size) +{ + (void)opaque; + return _halloc((long)items, size); +} + +void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) +{ + (void)opaque; + _hfree(ptr); +} + +#endif /* M_I86 */ + +#endif /* SYS16BIT */ + + +#ifndef MY_ZCALLOC /* Any system without a special alloc function */ + +#ifndef STDC +extern voidp malloc OF((uInt size)); +extern voidp calloc OF((uInt items, uInt size)); +extern void free OF((voidpf ptr)); +#endif + +voidpf ZLIB_INTERNAL zcalloc (opaque, items, size) + voidpf opaque; + unsigned items; + unsigned size; +{ + (void)opaque; + return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) : + (voidpf)calloc(items, size); +} + +void ZLIB_INTERNAL zcfree (opaque, ptr) + voidpf opaque; + voidpf ptr; +{ + (void)opaque; + free(ptr); +} + +#endif /* MY_ZCALLOC */ + +#endif /* !Z_SOLO */ diff --git a/core/cd_hw/libchdr/deps/zlib/zutil.h b/core/cd_hw/libchdr/deps/zlib/zutil.h new file mode 100644 index 0000000..b079ea6 --- /dev/null +++ b/core/cd_hw/libchdr/deps/zlib/zutil.h @@ -0,0 +1,271 @@ +/* zutil.h -- internal interface and configuration of the compression library + * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* @(#) $Id$ */ + +#ifndef ZUTIL_H +#define ZUTIL_H + +#ifdef HAVE_HIDDEN +# define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) +#else +# define ZLIB_INTERNAL +#endif + +#include "zlib.h" + +#if defined(STDC) && !defined(Z_SOLO) +# if !(defined(_WIN32_WCE) && defined(_MSC_VER)) +# include +# endif +# include +# include +#endif + +#ifdef Z_SOLO + typedef long ptrdiff_t; /* guess -- will be caught if guess is wrong */ +#endif + +#ifndef local +# define local static +#endif +/* since "static" is used to mean two completely different things in C, we + define "local" for the non-static meaning of "static", for readability + (compile with -Dlocal if your debugger can't find static symbols) */ + +typedef unsigned char uch; +typedef uch FAR uchf; +typedef unsigned short ush; +typedef ush FAR ushf; +typedef unsigned long ulg; + +extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ +/* (size given to avoid silly warnings with Visual C++) */ + +#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] + +#define ERR_RETURN(strm,err) \ + return (strm->msg = ERR_MSG(err), (err)) +/* To be used only when the state is known to be valid */ + + /* common constants */ + +#ifndef DEF_WBITS +# define DEF_WBITS MAX_WBITS +#endif +/* default windowBits for decompression. MAX_WBITS is for compression only */ + +#if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +#else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +#endif +/* default memLevel */ + +#define STORED_BLOCK 0 +#define STATIC_TREES 1 +#define DYN_TREES 2 +/* The three kinds of block type */ + +#define MIN_MATCH 3 +#define MAX_MATCH 258 +/* The minimum and maximum match lengths */ + +#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ + + /* target dependencies */ + +#if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32)) +# define OS_CODE 0x00 +# ifndef Z_SOLO +# if defined(__TURBOC__) || defined(__BORLANDC__) +# if (__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) + /* Allow compilation with ANSI keywords only enabled */ + void _Cdecl farfree( void *block ); + void *_Cdecl farmalloc( unsigned long nbytes ); +# else +# include +# endif +# else /* MSC or DJGPP */ +# include +# endif +# endif +#endif + +#ifdef AMIGA +# define OS_CODE 1 +#endif + +#if defined(VAXC) || defined(VMS) +# define OS_CODE 2 +# define F_OPEN(name, mode) \ + fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") +#endif + +#ifdef __370__ +# if __TARGET_LIB__ < 0x20000000 +# define OS_CODE 4 +# elif __TARGET_LIB__ < 0x40000000 +# define OS_CODE 11 +# else +# define OS_CODE 8 +# endif +#endif + +#if defined(ATARI) || defined(atarist) +# define OS_CODE 5 +#endif + +#ifdef OS2 +# define OS_CODE 6 +# if defined(M_I86) && !defined(Z_SOLO) +# include +# endif +#endif + +#if defined(MACOS) || defined(TARGET_OS_MAC) +# define OS_CODE 7 +# ifndef Z_SOLO +# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os +# include /* for fdopen */ +# else +# ifndef fdopen +# define fdopen(fd,mode) NULL /* No fdopen() */ +# endif +# endif +# endif +#endif + +#ifdef __acorn +# define OS_CODE 13 +#endif + +#if defined(WIN32) && !defined(__CYGWIN__) +# define OS_CODE 10 +#endif + +#ifdef _BEOS_ +# define OS_CODE 16 +#endif + +#ifdef __TOS_OS400__ +# define OS_CODE 18 +#endif + +#ifdef __APPLE__ +# define OS_CODE 19 +#endif + +#if defined(_BEOS_) || defined(RISCOS) +# define fdopen(fd,mode) NULL /* No fdopen() */ +#endif + +#if (defined(_MSC_VER) && (_MSC_VER > 600)) && !defined __INTERIX +# if defined(_WIN32_WCE) +# define fdopen(fd,mode) NULL /* No fdopen() */ +# ifndef _PTRDIFF_T_DEFINED + typedef int ptrdiff_t; +# define _PTRDIFF_T_DEFINED +# endif +# else +# define fdopen(fd,type) _fdopen(fd,type) +# endif +#endif + +#if defined(__BORLANDC__) && !defined(MSDOS) + #pragma warn -8004 + #pragma warn -8008 + #pragma warn -8066 +#endif + +/* provide prototypes for these when building zlib without LFS */ +#if !defined(_WIN32) && \ + (!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0) + ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); +#endif + + /* common defaults */ + +#ifndef OS_CODE +# define OS_CODE 3 /* assume Unix */ +#endif + +#ifndef F_OPEN +# define F_OPEN(name, mode) fopen((name), (mode)) +#endif + + /* functions */ + +#if defined(pyr) || defined(Z_SOLO) +# define NO_MEMCPY +#endif +#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__) + /* Use our own functions for small and medium model with MSC <= 5.0. + * You may have to use the same strategy for Borland C (untested). + * The __SC__ check is for Symantec. + */ +# define NO_MEMCPY +#endif +#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY) +# define HAVE_MEMCPY +#endif +#ifdef HAVE_MEMCPY +# ifdef SMALL_MEDIUM /* MSDOS small or medium model */ +# define zmemcpy _fmemcpy +# define zmemcmp _fmemcmp +# define zmemzero(dest, len) _fmemset(dest, 0, len) +# else +# define zmemcpy memcpy +# define zmemcmp memcmp +# define zmemzero(dest, len) memset(dest, 0, len) +# endif +#else + void ZLIB_INTERNAL zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); + int ZLIB_INTERNAL zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len)); + void ZLIB_INTERNAL zmemzero OF((Bytef* dest, uInt len)); +#endif + +/* Diagnostic functions */ +#ifdef ZLIB_DEBUG +# include + extern int ZLIB_INTERNAL z_verbose; + extern void ZLIB_INTERNAL z_error OF((char *m)); +# define Assert(cond,msg) {if(!(cond)) z_error(msg);} +# define Trace(x) {if (z_verbose>=0) fprintf x ;} +# define Tracev(x) {if (z_verbose>0) fprintf x ;} +# define Tracevv(x) {if (z_verbose>1) fprintf x ;} +# define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;} +# define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;} +#else +# define Assert(cond,msg) +# define Trace(x) +# define Tracev(x) +# define Tracevv(x) +# define Tracec(c,x) +# define Tracecv(c,x) +#endif + +#ifndef Z_SOLO + voidpf ZLIB_INTERNAL zcalloc OF((voidpf opaque, unsigned items, + unsigned size)); + void ZLIB_INTERNAL zcfree OF((voidpf opaque, voidpf ptr)); +#endif + +#define ZALLOC(strm, items, size) \ + (*((strm)->zalloc))((strm)->opaque, (items), (size)) +#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) +#define TRY_FREE(s, p) {if (p) ZFREE(s, p);} + +/* Reverse the bytes in a 32-bit value */ +#define ZSWAP32(q) ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ + (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) + +#endif /* ZUTIL_H */ diff --git a/core/cd_hw/libchdr/src/bitstream.c b/core/cd_hw/libchdr/src/bitstream.c new file mode 100644 index 0000000..735b97f --- /dev/null +++ b/core/cd_hw/libchdr/src/bitstream.c @@ -0,0 +1,118 @@ +// license:BSD-3-Clause +// copyright-holders:Aaron Giles +/*************************************************************************** + + bitstream.c + + Helper classes for reading/writing at the bit level. + +***************************************************************************/ + +#include "bitstream.h" +#include + +//************************************************************************** +// INLINE FUNCTIONS +//************************************************************************** + +int bitstream_overflow(struct bitstream* bitstream) { return ((bitstream->doffset - bitstream->bits / 8) > bitstream->dlength); } + +//------------------------------------------------- +// create_bitstream - constructor +//------------------------------------------------- + +struct bitstream* create_bitstream(const void *src, uint32_t srclength) +{ + struct bitstream* bitstream = (struct bitstream*)malloc(sizeof(struct bitstream)); + bitstream->buffer = 0; + bitstream->bits = 0; + bitstream->read = (const uint8_t*)src; + bitstream->doffset = 0; + bitstream->dlength = srclength; + return bitstream; +} + + +//----------------------------------------------------- +// bitstream_peek - fetch the requested number of bits +// but don't advance the input pointer +//----------------------------------------------------- + +uint32_t bitstream_peek(struct bitstream* bitstream, int numbits) +{ + if (numbits == 0) + return 0; + + // fetch data if we need more + if (numbits > bitstream->bits) + { + while (bitstream->bits <= 24) + { + if (bitstream->doffset < bitstream->dlength) + bitstream->buffer |= bitstream->read[bitstream->doffset] << (24 - bitstream->bits); + bitstream->doffset++; + bitstream->bits += 8; + } + } + + // return the data + return bitstream->buffer >> (32 - numbits); +} + + +//----------------------------------------------------- +// bitstream_remove - advance the input pointer by the +// specified number of bits +//----------------------------------------------------- + +void bitstream_remove(struct bitstream* bitstream, int numbits) +{ + bitstream->buffer <<= numbits; + bitstream->bits -= numbits; +} + + +//----------------------------------------------------- +// bitstream_read - fetch the requested number of bits +//----------------------------------------------------- + +uint32_t bitstream_read(struct bitstream* bitstream, int numbits) +{ + uint32_t result = bitstream_peek(bitstream, numbits); + bitstream_remove(bitstream, numbits); + return result; +} + + +//------------------------------------------------- +// read_offset - return the current read offset +//------------------------------------------------- + +uint32_t bitstream_read_offset(struct bitstream* bitstream) +{ + uint32_t result = bitstream->doffset; + int bits = bitstream->bits; + while (bits >= 8) + { + result--; + bits -= 8; + } + return result; +} + + +//------------------------------------------------- +// flush - flush to the nearest byte +//------------------------------------------------- + +uint32_t bitstream_flush(struct bitstream* bitstream) +{ + while (bitstream->bits >= 8) + { + bitstream->doffset--; + bitstream->bits -= 8; + } + bitstream->bits = bitstream->buffer = 0; + return bitstream->doffset; +} + diff --git a/core/cd_hw/libchdr/src/bitstream.h b/core/cd_hw/libchdr/src/bitstream.h new file mode 100644 index 0000000..af9d162 --- /dev/null +++ b/core/cd_hw/libchdr/src/bitstream.h @@ -0,0 +1,42 @@ +// license:BSD-3-Clause +// copyright-holders:Aaron Giles +/*************************************************************************** + + bitstream.h + + Helper classes for reading/writing at the bit level. + +***************************************************************************/ + +#pragma once + +#ifndef __BITSTREAM_H__ +#define __BITSTREAM_H__ + +#include + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// helper class for reading from a bit buffer +struct bitstream +{ + uint32_t buffer; // current bit accumulator + int bits; // number of bits in the accumulator + const uint8_t * read; // read pointer + uint32_t doffset; // byte offset within the data + uint32_t dlength; // length of the data +}; + +struct bitstream* create_bitstream(const void *src, uint32_t srclength); +int bitstream_overflow(struct bitstream* bitstream); +uint32_t bitstream_read_offset(struct bitstream* bitstream); + +uint32_t bitstream_read(struct bitstream* bitstream, int numbits); +uint32_t bitstream_peek(struct bitstream* bitstream, int numbits); +void bitstream_remove(struct bitstream* bitstream, int numbits); +uint32_t bitstream_flush(struct bitstream* bitstream); + + +#endif diff --git a/core/cd_hw/libchdr/src/cdrom.c b/core/cd_hw/libchdr/src/cdrom.c new file mode 100644 index 0000000..159b358 --- /dev/null +++ b/core/cd_hw/libchdr/src/cdrom.c @@ -0,0 +1,416 @@ +// license:BSD-3-Clause +// copyright-holders:Aaron Giles +/*************************************************************************** + + cdrom.c + + Generic MAME CD-ROM utilties - build IDE and SCSI CD-ROMs on top of this + +**************************************************************************** + + IMPORTANT: + "physical" block addresses are the actual addresses on the emulated CD. + "chd" block addresses are the block addresses in the CHD file. + Because we pad each track to a 4-frame boundary, these addressing + schemes will differ after track 1! + +***************************************************************************/ +#ifdef WANT_RAW_DATA_SECTOR + +#include +#include + +#include "cdrom.h" + +/*************************************************************************** + DEBUGGING +***************************************************************************/ + +/** @brief The verbose. */ +#define VERBOSE (0) +#if VERBOSE + +/** + * @def LOG(x) do + * + * @brief A macro that defines log. + * + * @param x The void to process. + */ + +#define LOG(x) do { if (VERBOSE) logerror x; } while (0) + +/** + * @fn void CLIB_DECL logerror(const char *text, ...) ATTR_PRINTF(1,2); + * + * @brief Logerrors the given text. + * + * @param text The text. + * + * @return A CLIB_DECL. + */ + +void CLIB_DECL logerror(const char *text, ...) ATTR_PRINTF(1,2); +#else + +/** + * @def LOG(x); + * + * @brief A macro that defines log. + * + * @param x The void to process. + */ + +#define LOG(x) +#endif + + + +/*************************************************************************** + CONSTANTS +***************************************************************************/ + +/** @brief offset within sector. */ +#define SYNC_OFFSET 0x000 +/** @brief 12 bytes. */ +#define SYNC_NUM_BYTES 12 + +/** @brief offset within sector. */ +#define MODE_OFFSET 0x00f + +/** @brief offset within sector. */ +#define ECC_P_OFFSET 0x81c +/** @brief 2 lots of 86. */ +#define ECC_P_NUM_BYTES 86 +/** @brief 24 bytes each. */ +#define ECC_P_COMP 24 + +/** @brief The ECC q offset. */ +#define ECC_Q_OFFSET (ECC_P_OFFSET + 2 * ECC_P_NUM_BYTES) +/** @brief 2 lots of 52. */ +#define ECC_Q_NUM_BYTES 52 +/** @brief 43 bytes each. */ +#define ECC_Q_COMP 43 + + + +/** + * @brief ------------------------------------------------- + * ECC lookup tables pre-calculated tables for ECC data calcs + * -------------------------------------------------. + */ + +static const uint8_t ecclow[256] = +{ + 0x00, 0x02, 0x04, 0x06, 0x08, 0x0a, 0x0c, 0x0e, 0x10, 0x12, 0x14, 0x16, 0x18, 0x1a, 0x1c, 0x1e, + 0x20, 0x22, 0x24, 0x26, 0x28, 0x2a, 0x2c, 0x2e, 0x30, 0x32, 0x34, 0x36, 0x38, 0x3a, 0x3c, 0x3e, + 0x40, 0x42, 0x44, 0x46, 0x48, 0x4a, 0x4c, 0x4e, 0x50, 0x52, 0x54, 0x56, 0x58, 0x5a, 0x5c, 0x5e, + 0x60, 0x62, 0x64, 0x66, 0x68, 0x6a, 0x6c, 0x6e, 0x70, 0x72, 0x74, 0x76, 0x78, 0x7a, 0x7c, 0x7e, + 0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c, 0x8e, 0x90, 0x92, 0x94, 0x96, 0x98, 0x9a, 0x9c, 0x9e, + 0xa0, 0xa2, 0xa4, 0xa6, 0xa8, 0xaa, 0xac, 0xae, 0xb0, 0xb2, 0xb4, 0xb6, 0xb8, 0xba, 0xbc, 0xbe, + 0xc0, 0xc2, 0xc4, 0xc6, 0xc8, 0xca, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc, 0xde, + 0xe0, 0xe2, 0xe4, 0xe6, 0xe8, 0xea, 0xec, 0xee, 0xf0, 0xf2, 0xf4, 0xf6, 0xf8, 0xfa, 0xfc, 0xfe, + 0x1d, 0x1f, 0x19, 0x1b, 0x15, 0x17, 0x11, 0x13, 0x0d, 0x0f, 0x09, 0x0b, 0x05, 0x07, 0x01, 0x03, + 0x3d, 0x3f, 0x39, 0x3b, 0x35, 0x37, 0x31, 0x33, 0x2d, 0x2f, 0x29, 0x2b, 0x25, 0x27, 0x21, 0x23, + 0x5d, 0x5f, 0x59, 0x5b, 0x55, 0x57, 0x51, 0x53, 0x4d, 0x4f, 0x49, 0x4b, 0x45, 0x47, 0x41, 0x43, + 0x7d, 0x7f, 0x79, 0x7b, 0x75, 0x77, 0x71, 0x73, 0x6d, 0x6f, 0x69, 0x6b, 0x65, 0x67, 0x61, 0x63, + 0x9d, 0x9f, 0x99, 0x9b, 0x95, 0x97, 0x91, 0x93, 0x8d, 0x8f, 0x89, 0x8b, 0x85, 0x87, 0x81, 0x83, + 0xbd, 0xbf, 0xb9, 0xbb, 0xb5, 0xb7, 0xb1, 0xb3, 0xad, 0xaf, 0xa9, 0xab, 0xa5, 0xa7, 0xa1, 0xa3, + 0xdd, 0xdf, 0xd9, 0xdb, 0xd5, 0xd7, 0xd1, 0xd3, 0xcd, 0xcf, 0xc9, 0xcb, 0xc5, 0xc7, 0xc1, 0xc3, + 0xfd, 0xff, 0xf9, 0xfb, 0xf5, 0xf7, 0xf1, 0xf3, 0xed, 0xef, 0xe9, 0xeb, 0xe5, 0xe7, 0xe1, 0xe3 +}; + +/** @brief The ecchigh[ 256]. */ +static const uint8_t ecchigh[256] = +{ + 0x00, 0xf4, 0xf5, 0x01, 0xf7, 0x03, 0x02, 0xf6, 0xf3, 0x07, 0x06, 0xf2, 0x04, 0xf0, 0xf1, 0x05, + 0xfb, 0x0f, 0x0e, 0xfa, 0x0c, 0xf8, 0xf9, 0x0d, 0x08, 0xfc, 0xfd, 0x09, 0xff, 0x0b, 0x0a, 0xfe, + 0xeb, 0x1f, 0x1e, 0xea, 0x1c, 0xe8, 0xe9, 0x1d, 0x18, 0xec, 0xed, 0x19, 0xef, 0x1b, 0x1a, 0xee, + 0x10, 0xe4, 0xe5, 0x11, 0xe7, 0x13, 0x12, 0xe6, 0xe3, 0x17, 0x16, 0xe2, 0x14, 0xe0, 0xe1, 0x15, + 0xcb, 0x3f, 0x3e, 0xca, 0x3c, 0xc8, 0xc9, 0x3d, 0x38, 0xcc, 0xcd, 0x39, 0xcf, 0x3b, 0x3a, 0xce, + 0x30, 0xc4, 0xc5, 0x31, 0xc7, 0x33, 0x32, 0xc6, 0xc3, 0x37, 0x36, 0xc2, 0x34, 0xc0, 0xc1, 0x35, + 0x20, 0xd4, 0xd5, 0x21, 0xd7, 0x23, 0x22, 0xd6, 0xd3, 0x27, 0x26, 0xd2, 0x24, 0xd0, 0xd1, 0x25, + 0xdb, 0x2f, 0x2e, 0xda, 0x2c, 0xd8, 0xd9, 0x2d, 0x28, 0xdc, 0xdd, 0x29, 0xdf, 0x2b, 0x2a, 0xde, + 0x8b, 0x7f, 0x7e, 0x8a, 0x7c, 0x88, 0x89, 0x7d, 0x78, 0x8c, 0x8d, 0x79, 0x8f, 0x7b, 0x7a, 0x8e, + 0x70, 0x84, 0x85, 0x71, 0x87, 0x73, 0x72, 0x86, 0x83, 0x77, 0x76, 0x82, 0x74, 0x80, 0x81, 0x75, + 0x60, 0x94, 0x95, 0x61, 0x97, 0x63, 0x62, 0x96, 0x93, 0x67, 0x66, 0x92, 0x64, 0x90, 0x91, 0x65, + 0x9b, 0x6f, 0x6e, 0x9a, 0x6c, 0x98, 0x99, 0x6d, 0x68, 0x9c, 0x9d, 0x69, 0x9f, 0x6b, 0x6a, 0x9e, + 0x40, 0xb4, 0xb5, 0x41, 0xb7, 0x43, 0x42, 0xb6, 0xb3, 0x47, 0x46, 0xb2, 0x44, 0xb0, 0xb1, 0x45, + 0xbb, 0x4f, 0x4e, 0xba, 0x4c, 0xb8, 0xb9, 0x4d, 0x48, 0xbc, 0xbd, 0x49, 0xbf, 0x4b, 0x4a, 0xbe, + 0xab, 0x5f, 0x5e, 0xaa, 0x5c, 0xa8, 0xa9, 0x5d, 0x58, 0xac, 0xad, 0x59, 0xaf, 0x5b, 0x5a, 0xae, + 0x50, 0xa4, 0xa5, 0x51, 0xa7, 0x53, 0x52, 0xa6, 0xa3, 0x57, 0x56, 0xa2, 0x54, 0xa0, 0xa1, 0x55 +}; + +/** + * @brief ------------------------------------------------- + * poffsets - each row represents the addresses used to calculate a byte of the ECC P + * data 86 (*2) ECC P bytes, 24 values represented by each + * -------------------------------------------------. + */ + +static const uint16_t poffsets[ECC_P_NUM_BYTES][ECC_P_COMP] = +{ + { 0x000,0x056,0x0ac,0x102,0x158,0x1ae,0x204,0x25a,0x2b0,0x306,0x35c,0x3b2,0x408,0x45e,0x4b4,0x50a,0x560,0x5b6,0x60c,0x662,0x6b8,0x70e,0x764,0x7ba }, + { 0x001,0x057,0x0ad,0x103,0x159,0x1af,0x205,0x25b,0x2b1,0x307,0x35d,0x3b3,0x409,0x45f,0x4b5,0x50b,0x561,0x5b7,0x60d,0x663,0x6b9,0x70f,0x765,0x7bb }, + { 0x002,0x058,0x0ae,0x104,0x15a,0x1b0,0x206,0x25c,0x2b2,0x308,0x35e,0x3b4,0x40a,0x460,0x4b6,0x50c,0x562,0x5b8,0x60e,0x664,0x6ba,0x710,0x766,0x7bc }, + { 0x003,0x059,0x0af,0x105,0x15b,0x1b1,0x207,0x25d,0x2b3,0x309,0x35f,0x3b5,0x40b,0x461,0x4b7,0x50d,0x563,0x5b9,0x60f,0x665,0x6bb,0x711,0x767,0x7bd }, + { 0x004,0x05a,0x0b0,0x106,0x15c,0x1b2,0x208,0x25e,0x2b4,0x30a,0x360,0x3b6,0x40c,0x462,0x4b8,0x50e,0x564,0x5ba,0x610,0x666,0x6bc,0x712,0x768,0x7be }, + { 0x005,0x05b,0x0b1,0x107,0x15d,0x1b3,0x209,0x25f,0x2b5,0x30b,0x361,0x3b7,0x40d,0x463,0x4b9,0x50f,0x565,0x5bb,0x611,0x667,0x6bd,0x713,0x769,0x7bf }, + { 0x006,0x05c,0x0b2,0x108,0x15e,0x1b4,0x20a,0x260,0x2b6,0x30c,0x362,0x3b8,0x40e,0x464,0x4ba,0x510,0x566,0x5bc,0x612,0x668,0x6be,0x714,0x76a,0x7c0 }, + { 0x007,0x05d,0x0b3,0x109,0x15f,0x1b5,0x20b,0x261,0x2b7,0x30d,0x363,0x3b9,0x40f,0x465,0x4bb,0x511,0x567,0x5bd,0x613,0x669,0x6bf,0x715,0x76b,0x7c1 }, + { 0x008,0x05e,0x0b4,0x10a,0x160,0x1b6,0x20c,0x262,0x2b8,0x30e,0x364,0x3ba,0x410,0x466,0x4bc,0x512,0x568,0x5be,0x614,0x66a,0x6c0,0x716,0x76c,0x7c2 }, + { 0x009,0x05f,0x0b5,0x10b,0x161,0x1b7,0x20d,0x263,0x2b9,0x30f,0x365,0x3bb,0x411,0x467,0x4bd,0x513,0x569,0x5bf,0x615,0x66b,0x6c1,0x717,0x76d,0x7c3 }, + { 0x00a,0x060,0x0b6,0x10c,0x162,0x1b8,0x20e,0x264,0x2ba,0x310,0x366,0x3bc,0x412,0x468,0x4be,0x514,0x56a,0x5c0,0x616,0x66c,0x6c2,0x718,0x76e,0x7c4 }, + { 0x00b,0x061,0x0b7,0x10d,0x163,0x1b9,0x20f,0x265,0x2bb,0x311,0x367,0x3bd,0x413,0x469,0x4bf,0x515,0x56b,0x5c1,0x617,0x66d,0x6c3,0x719,0x76f,0x7c5 }, + { 0x00c,0x062,0x0b8,0x10e,0x164,0x1ba,0x210,0x266,0x2bc,0x312,0x368,0x3be,0x414,0x46a,0x4c0,0x516,0x56c,0x5c2,0x618,0x66e,0x6c4,0x71a,0x770,0x7c6 }, + { 0x00d,0x063,0x0b9,0x10f,0x165,0x1bb,0x211,0x267,0x2bd,0x313,0x369,0x3bf,0x415,0x46b,0x4c1,0x517,0x56d,0x5c3,0x619,0x66f,0x6c5,0x71b,0x771,0x7c7 }, + { 0x00e,0x064,0x0ba,0x110,0x166,0x1bc,0x212,0x268,0x2be,0x314,0x36a,0x3c0,0x416,0x46c,0x4c2,0x518,0x56e,0x5c4,0x61a,0x670,0x6c6,0x71c,0x772,0x7c8 }, + { 0x00f,0x065,0x0bb,0x111,0x167,0x1bd,0x213,0x269,0x2bf,0x315,0x36b,0x3c1,0x417,0x46d,0x4c3,0x519,0x56f,0x5c5,0x61b,0x671,0x6c7,0x71d,0x773,0x7c9 }, + { 0x010,0x066,0x0bc,0x112,0x168,0x1be,0x214,0x26a,0x2c0,0x316,0x36c,0x3c2,0x418,0x46e,0x4c4,0x51a,0x570,0x5c6,0x61c,0x672,0x6c8,0x71e,0x774,0x7ca }, + { 0x011,0x067,0x0bd,0x113,0x169,0x1bf,0x215,0x26b,0x2c1,0x317,0x36d,0x3c3,0x419,0x46f,0x4c5,0x51b,0x571,0x5c7,0x61d,0x673,0x6c9,0x71f,0x775,0x7cb }, + { 0x012,0x068,0x0be,0x114,0x16a,0x1c0,0x216,0x26c,0x2c2,0x318,0x36e,0x3c4,0x41a,0x470,0x4c6,0x51c,0x572,0x5c8,0x61e,0x674,0x6ca,0x720,0x776,0x7cc }, + { 0x013,0x069,0x0bf,0x115,0x16b,0x1c1,0x217,0x26d,0x2c3,0x319,0x36f,0x3c5,0x41b,0x471,0x4c7,0x51d,0x573,0x5c9,0x61f,0x675,0x6cb,0x721,0x777,0x7cd }, + { 0x014,0x06a,0x0c0,0x116,0x16c,0x1c2,0x218,0x26e,0x2c4,0x31a,0x370,0x3c6,0x41c,0x472,0x4c8,0x51e,0x574,0x5ca,0x620,0x676,0x6cc,0x722,0x778,0x7ce }, + { 0x015,0x06b,0x0c1,0x117,0x16d,0x1c3,0x219,0x26f,0x2c5,0x31b,0x371,0x3c7,0x41d,0x473,0x4c9,0x51f,0x575,0x5cb,0x621,0x677,0x6cd,0x723,0x779,0x7cf }, + { 0x016,0x06c,0x0c2,0x118,0x16e,0x1c4,0x21a,0x270,0x2c6,0x31c,0x372,0x3c8,0x41e,0x474,0x4ca,0x520,0x576,0x5cc,0x622,0x678,0x6ce,0x724,0x77a,0x7d0 }, + { 0x017,0x06d,0x0c3,0x119,0x16f,0x1c5,0x21b,0x271,0x2c7,0x31d,0x373,0x3c9,0x41f,0x475,0x4cb,0x521,0x577,0x5cd,0x623,0x679,0x6cf,0x725,0x77b,0x7d1 }, + { 0x018,0x06e,0x0c4,0x11a,0x170,0x1c6,0x21c,0x272,0x2c8,0x31e,0x374,0x3ca,0x420,0x476,0x4cc,0x522,0x578,0x5ce,0x624,0x67a,0x6d0,0x726,0x77c,0x7d2 }, + { 0x019,0x06f,0x0c5,0x11b,0x171,0x1c7,0x21d,0x273,0x2c9,0x31f,0x375,0x3cb,0x421,0x477,0x4cd,0x523,0x579,0x5cf,0x625,0x67b,0x6d1,0x727,0x77d,0x7d3 }, + { 0x01a,0x070,0x0c6,0x11c,0x172,0x1c8,0x21e,0x274,0x2ca,0x320,0x376,0x3cc,0x422,0x478,0x4ce,0x524,0x57a,0x5d0,0x626,0x67c,0x6d2,0x728,0x77e,0x7d4 }, + { 0x01b,0x071,0x0c7,0x11d,0x173,0x1c9,0x21f,0x275,0x2cb,0x321,0x377,0x3cd,0x423,0x479,0x4cf,0x525,0x57b,0x5d1,0x627,0x67d,0x6d3,0x729,0x77f,0x7d5 }, + { 0x01c,0x072,0x0c8,0x11e,0x174,0x1ca,0x220,0x276,0x2cc,0x322,0x378,0x3ce,0x424,0x47a,0x4d0,0x526,0x57c,0x5d2,0x628,0x67e,0x6d4,0x72a,0x780,0x7d6 }, + { 0x01d,0x073,0x0c9,0x11f,0x175,0x1cb,0x221,0x277,0x2cd,0x323,0x379,0x3cf,0x425,0x47b,0x4d1,0x527,0x57d,0x5d3,0x629,0x67f,0x6d5,0x72b,0x781,0x7d7 }, + { 0x01e,0x074,0x0ca,0x120,0x176,0x1cc,0x222,0x278,0x2ce,0x324,0x37a,0x3d0,0x426,0x47c,0x4d2,0x528,0x57e,0x5d4,0x62a,0x680,0x6d6,0x72c,0x782,0x7d8 }, + { 0x01f,0x075,0x0cb,0x121,0x177,0x1cd,0x223,0x279,0x2cf,0x325,0x37b,0x3d1,0x427,0x47d,0x4d3,0x529,0x57f,0x5d5,0x62b,0x681,0x6d7,0x72d,0x783,0x7d9 }, + { 0x020,0x076,0x0cc,0x122,0x178,0x1ce,0x224,0x27a,0x2d0,0x326,0x37c,0x3d2,0x428,0x47e,0x4d4,0x52a,0x580,0x5d6,0x62c,0x682,0x6d8,0x72e,0x784,0x7da }, + { 0x021,0x077,0x0cd,0x123,0x179,0x1cf,0x225,0x27b,0x2d1,0x327,0x37d,0x3d3,0x429,0x47f,0x4d5,0x52b,0x581,0x5d7,0x62d,0x683,0x6d9,0x72f,0x785,0x7db }, + { 0x022,0x078,0x0ce,0x124,0x17a,0x1d0,0x226,0x27c,0x2d2,0x328,0x37e,0x3d4,0x42a,0x480,0x4d6,0x52c,0x582,0x5d8,0x62e,0x684,0x6da,0x730,0x786,0x7dc }, + { 0x023,0x079,0x0cf,0x125,0x17b,0x1d1,0x227,0x27d,0x2d3,0x329,0x37f,0x3d5,0x42b,0x481,0x4d7,0x52d,0x583,0x5d9,0x62f,0x685,0x6db,0x731,0x787,0x7dd }, + { 0x024,0x07a,0x0d0,0x126,0x17c,0x1d2,0x228,0x27e,0x2d4,0x32a,0x380,0x3d6,0x42c,0x482,0x4d8,0x52e,0x584,0x5da,0x630,0x686,0x6dc,0x732,0x788,0x7de }, + { 0x025,0x07b,0x0d1,0x127,0x17d,0x1d3,0x229,0x27f,0x2d5,0x32b,0x381,0x3d7,0x42d,0x483,0x4d9,0x52f,0x585,0x5db,0x631,0x687,0x6dd,0x733,0x789,0x7df }, + { 0x026,0x07c,0x0d2,0x128,0x17e,0x1d4,0x22a,0x280,0x2d6,0x32c,0x382,0x3d8,0x42e,0x484,0x4da,0x530,0x586,0x5dc,0x632,0x688,0x6de,0x734,0x78a,0x7e0 }, + { 0x027,0x07d,0x0d3,0x129,0x17f,0x1d5,0x22b,0x281,0x2d7,0x32d,0x383,0x3d9,0x42f,0x485,0x4db,0x531,0x587,0x5dd,0x633,0x689,0x6df,0x735,0x78b,0x7e1 }, + { 0x028,0x07e,0x0d4,0x12a,0x180,0x1d6,0x22c,0x282,0x2d8,0x32e,0x384,0x3da,0x430,0x486,0x4dc,0x532,0x588,0x5de,0x634,0x68a,0x6e0,0x736,0x78c,0x7e2 }, + { 0x029,0x07f,0x0d5,0x12b,0x181,0x1d7,0x22d,0x283,0x2d9,0x32f,0x385,0x3db,0x431,0x487,0x4dd,0x533,0x589,0x5df,0x635,0x68b,0x6e1,0x737,0x78d,0x7e3 }, + { 0x02a,0x080,0x0d6,0x12c,0x182,0x1d8,0x22e,0x284,0x2da,0x330,0x386,0x3dc,0x432,0x488,0x4de,0x534,0x58a,0x5e0,0x636,0x68c,0x6e2,0x738,0x78e,0x7e4 }, + { 0x02b,0x081,0x0d7,0x12d,0x183,0x1d9,0x22f,0x285,0x2db,0x331,0x387,0x3dd,0x433,0x489,0x4df,0x535,0x58b,0x5e1,0x637,0x68d,0x6e3,0x739,0x78f,0x7e5 }, + { 0x02c,0x082,0x0d8,0x12e,0x184,0x1da,0x230,0x286,0x2dc,0x332,0x388,0x3de,0x434,0x48a,0x4e0,0x536,0x58c,0x5e2,0x638,0x68e,0x6e4,0x73a,0x790,0x7e6 }, + { 0x02d,0x083,0x0d9,0x12f,0x185,0x1db,0x231,0x287,0x2dd,0x333,0x389,0x3df,0x435,0x48b,0x4e1,0x537,0x58d,0x5e3,0x639,0x68f,0x6e5,0x73b,0x791,0x7e7 }, + { 0x02e,0x084,0x0da,0x130,0x186,0x1dc,0x232,0x288,0x2de,0x334,0x38a,0x3e0,0x436,0x48c,0x4e2,0x538,0x58e,0x5e4,0x63a,0x690,0x6e6,0x73c,0x792,0x7e8 }, + { 0x02f,0x085,0x0db,0x131,0x187,0x1dd,0x233,0x289,0x2df,0x335,0x38b,0x3e1,0x437,0x48d,0x4e3,0x539,0x58f,0x5e5,0x63b,0x691,0x6e7,0x73d,0x793,0x7e9 }, + { 0x030,0x086,0x0dc,0x132,0x188,0x1de,0x234,0x28a,0x2e0,0x336,0x38c,0x3e2,0x438,0x48e,0x4e4,0x53a,0x590,0x5e6,0x63c,0x692,0x6e8,0x73e,0x794,0x7ea }, + { 0x031,0x087,0x0dd,0x133,0x189,0x1df,0x235,0x28b,0x2e1,0x337,0x38d,0x3e3,0x439,0x48f,0x4e5,0x53b,0x591,0x5e7,0x63d,0x693,0x6e9,0x73f,0x795,0x7eb }, + { 0x032,0x088,0x0de,0x134,0x18a,0x1e0,0x236,0x28c,0x2e2,0x338,0x38e,0x3e4,0x43a,0x490,0x4e6,0x53c,0x592,0x5e8,0x63e,0x694,0x6ea,0x740,0x796,0x7ec }, + { 0x033,0x089,0x0df,0x135,0x18b,0x1e1,0x237,0x28d,0x2e3,0x339,0x38f,0x3e5,0x43b,0x491,0x4e7,0x53d,0x593,0x5e9,0x63f,0x695,0x6eb,0x741,0x797,0x7ed }, + { 0x034,0x08a,0x0e0,0x136,0x18c,0x1e2,0x238,0x28e,0x2e4,0x33a,0x390,0x3e6,0x43c,0x492,0x4e8,0x53e,0x594,0x5ea,0x640,0x696,0x6ec,0x742,0x798,0x7ee }, + { 0x035,0x08b,0x0e1,0x137,0x18d,0x1e3,0x239,0x28f,0x2e5,0x33b,0x391,0x3e7,0x43d,0x493,0x4e9,0x53f,0x595,0x5eb,0x641,0x697,0x6ed,0x743,0x799,0x7ef }, + { 0x036,0x08c,0x0e2,0x138,0x18e,0x1e4,0x23a,0x290,0x2e6,0x33c,0x392,0x3e8,0x43e,0x494,0x4ea,0x540,0x596,0x5ec,0x642,0x698,0x6ee,0x744,0x79a,0x7f0 }, + { 0x037,0x08d,0x0e3,0x139,0x18f,0x1e5,0x23b,0x291,0x2e7,0x33d,0x393,0x3e9,0x43f,0x495,0x4eb,0x541,0x597,0x5ed,0x643,0x699,0x6ef,0x745,0x79b,0x7f1 }, + { 0x038,0x08e,0x0e4,0x13a,0x190,0x1e6,0x23c,0x292,0x2e8,0x33e,0x394,0x3ea,0x440,0x496,0x4ec,0x542,0x598,0x5ee,0x644,0x69a,0x6f0,0x746,0x79c,0x7f2 }, + { 0x039,0x08f,0x0e5,0x13b,0x191,0x1e7,0x23d,0x293,0x2e9,0x33f,0x395,0x3eb,0x441,0x497,0x4ed,0x543,0x599,0x5ef,0x645,0x69b,0x6f1,0x747,0x79d,0x7f3 }, + { 0x03a,0x090,0x0e6,0x13c,0x192,0x1e8,0x23e,0x294,0x2ea,0x340,0x396,0x3ec,0x442,0x498,0x4ee,0x544,0x59a,0x5f0,0x646,0x69c,0x6f2,0x748,0x79e,0x7f4 }, + { 0x03b,0x091,0x0e7,0x13d,0x193,0x1e9,0x23f,0x295,0x2eb,0x341,0x397,0x3ed,0x443,0x499,0x4ef,0x545,0x59b,0x5f1,0x647,0x69d,0x6f3,0x749,0x79f,0x7f5 }, + { 0x03c,0x092,0x0e8,0x13e,0x194,0x1ea,0x240,0x296,0x2ec,0x342,0x398,0x3ee,0x444,0x49a,0x4f0,0x546,0x59c,0x5f2,0x648,0x69e,0x6f4,0x74a,0x7a0,0x7f6 }, + { 0x03d,0x093,0x0e9,0x13f,0x195,0x1eb,0x241,0x297,0x2ed,0x343,0x399,0x3ef,0x445,0x49b,0x4f1,0x547,0x59d,0x5f3,0x649,0x69f,0x6f5,0x74b,0x7a1,0x7f7 }, + { 0x03e,0x094,0x0ea,0x140,0x196,0x1ec,0x242,0x298,0x2ee,0x344,0x39a,0x3f0,0x446,0x49c,0x4f2,0x548,0x59e,0x5f4,0x64a,0x6a0,0x6f6,0x74c,0x7a2,0x7f8 }, + { 0x03f,0x095,0x0eb,0x141,0x197,0x1ed,0x243,0x299,0x2ef,0x345,0x39b,0x3f1,0x447,0x49d,0x4f3,0x549,0x59f,0x5f5,0x64b,0x6a1,0x6f7,0x74d,0x7a3,0x7f9 }, + { 0x040,0x096,0x0ec,0x142,0x198,0x1ee,0x244,0x29a,0x2f0,0x346,0x39c,0x3f2,0x448,0x49e,0x4f4,0x54a,0x5a0,0x5f6,0x64c,0x6a2,0x6f8,0x74e,0x7a4,0x7fa }, + { 0x041,0x097,0x0ed,0x143,0x199,0x1ef,0x245,0x29b,0x2f1,0x347,0x39d,0x3f3,0x449,0x49f,0x4f5,0x54b,0x5a1,0x5f7,0x64d,0x6a3,0x6f9,0x74f,0x7a5,0x7fb }, + { 0x042,0x098,0x0ee,0x144,0x19a,0x1f0,0x246,0x29c,0x2f2,0x348,0x39e,0x3f4,0x44a,0x4a0,0x4f6,0x54c,0x5a2,0x5f8,0x64e,0x6a4,0x6fa,0x750,0x7a6,0x7fc }, + { 0x043,0x099,0x0ef,0x145,0x19b,0x1f1,0x247,0x29d,0x2f3,0x349,0x39f,0x3f5,0x44b,0x4a1,0x4f7,0x54d,0x5a3,0x5f9,0x64f,0x6a5,0x6fb,0x751,0x7a7,0x7fd }, + { 0x044,0x09a,0x0f0,0x146,0x19c,0x1f2,0x248,0x29e,0x2f4,0x34a,0x3a0,0x3f6,0x44c,0x4a2,0x4f8,0x54e,0x5a4,0x5fa,0x650,0x6a6,0x6fc,0x752,0x7a8,0x7fe }, + { 0x045,0x09b,0x0f1,0x147,0x19d,0x1f3,0x249,0x29f,0x2f5,0x34b,0x3a1,0x3f7,0x44d,0x4a3,0x4f9,0x54f,0x5a5,0x5fb,0x651,0x6a7,0x6fd,0x753,0x7a9,0x7ff }, + { 0x046,0x09c,0x0f2,0x148,0x19e,0x1f4,0x24a,0x2a0,0x2f6,0x34c,0x3a2,0x3f8,0x44e,0x4a4,0x4fa,0x550,0x5a6,0x5fc,0x652,0x6a8,0x6fe,0x754,0x7aa,0x800 }, + { 0x047,0x09d,0x0f3,0x149,0x19f,0x1f5,0x24b,0x2a1,0x2f7,0x34d,0x3a3,0x3f9,0x44f,0x4a5,0x4fb,0x551,0x5a7,0x5fd,0x653,0x6a9,0x6ff,0x755,0x7ab,0x801 }, + { 0x048,0x09e,0x0f4,0x14a,0x1a0,0x1f6,0x24c,0x2a2,0x2f8,0x34e,0x3a4,0x3fa,0x450,0x4a6,0x4fc,0x552,0x5a8,0x5fe,0x654,0x6aa,0x700,0x756,0x7ac,0x802 }, + { 0x049,0x09f,0x0f5,0x14b,0x1a1,0x1f7,0x24d,0x2a3,0x2f9,0x34f,0x3a5,0x3fb,0x451,0x4a7,0x4fd,0x553,0x5a9,0x5ff,0x655,0x6ab,0x701,0x757,0x7ad,0x803 }, + { 0x04a,0x0a0,0x0f6,0x14c,0x1a2,0x1f8,0x24e,0x2a4,0x2fa,0x350,0x3a6,0x3fc,0x452,0x4a8,0x4fe,0x554,0x5aa,0x600,0x656,0x6ac,0x702,0x758,0x7ae,0x804 }, + { 0x04b,0x0a1,0x0f7,0x14d,0x1a3,0x1f9,0x24f,0x2a5,0x2fb,0x351,0x3a7,0x3fd,0x453,0x4a9,0x4ff,0x555,0x5ab,0x601,0x657,0x6ad,0x703,0x759,0x7af,0x805 }, + { 0x04c,0x0a2,0x0f8,0x14e,0x1a4,0x1fa,0x250,0x2a6,0x2fc,0x352,0x3a8,0x3fe,0x454,0x4aa,0x500,0x556,0x5ac,0x602,0x658,0x6ae,0x704,0x75a,0x7b0,0x806 }, + { 0x04d,0x0a3,0x0f9,0x14f,0x1a5,0x1fb,0x251,0x2a7,0x2fd,0x353,0x3a9,0x3ff,0x455,0x4ab,0x501,0x557,0x5ad,0x603,0x659,0x6af,0x705,0x75b,0x7b1,0x807 }, + { 0x04e,0x0a4,0x0fa,0x150,0x1a6,0x1fc,0x252,0x2a8,0x2fe,0x354,0x3aa,0x400,0x456,0x4ac,0x502,0x558,0x5ae,0x604,0x65a,0x6b0,0x706,0x75c,0x7b2,0x808 }, + { 0x04f,0x0a5,0x0fb,0x151,0x1a7,0x1fd,0x253,0x2a9,0x2ff,0x355,0x3ab,0x401,0x457,0x4ad,0x503,0x559,0x5af,0x605,0x65b,0x6b1,0x707,0x75d,0x7b3,0x809 }, + { 0x050,0x0a6,0x0fc,0x152,0x1a8,0x1fe,0x254,0x2aa,0x300,0x356,0x3ac,0x402,0x458,0x4ae,0x504,0x55a,0x5b0,0x606,0x65c,0x6b2,0x708,0x75e,0x7b4,0x80a }, + { 0x051,0x0a7,0x0fd,0x153,0x1a9,0x1ff,0x255,0x2ab,0x301,0x357,0x3ad,0x403,0x459,0x4af,0x505,0x55b,0x5b1,0x607,0x65d,0x6b3,0x709,0x75f,0x7b5,0x80b }, + { 0x052,0x0a8,0x0fe,0x154,0x1aa,0x200,0x256,0x2ac,0x302,0x358,0x3ae,0x404,0x45a,0x4b0,0x506,0x55c,0x5b2,0x608,0x65e,0x6b4,0x70a,0x760,0x7b6,0x80c }, + { 0x053,0x0a9,0x0ff,0x155,0x1ab,0x201,0x257,0x2ad,0x303,0x359,0x3af,0x405,0x45b,0x4b1,0x507,0x55d,0x5b3,0x609,0x65f,0x6b5,0x70b,0x761,0x7b7,0x80d }, + { 0x054,0x0aa,0x100,0x156,0x1ac,0x202,0x258,0x2ae,0x304,0x35a,0x3b0,0x406,0x45c,0x4b2,0x508,0x55e,0x5b4,0x60a,0x660,0x6b6,0x70c,0x762,0x7b8,0x80e }, + { 0x055,0x0ab,0x101,0x157,0x1ad,0x203,0x259,0x2af,0x305,0x35b,0x3b1,0x407,0x45d,0x4b3,0x509,0x55f,0x5b5,0x60b,0x661,0x6b7,0x70d,0x763,0x7b9,0x80f } +}; + +/** + * @brief ------------------------------------------------- + * qoffsets - each row represents the addresses used to calculate a byte of the ECC Q + * data 52 (*2) ECC Q bytes, 43 values represented by each + * -------------------------------------------------. + */ + +static const uint16_t qoffsets[ECC_Q_NUM_BYTES][ECC_Q_COMP] = +{ + { 0x000,0x058,0x0b0,0x108,0x160,0x1b8,0x210,0x268,0x2c0,0x318,0x370,0x3c8,0x420,0x478,0x4d0,0x528,0x580,0x5d8,0x630,0x688,0x6e0,0x738,0x790,0x7e8,0x840,0x898,0x034,0x08c,0x0e4,0x13c,0x194,0x1ec,0x244,0x29c,0x2f4,0x34c,0x3a4,0x3fc,0x454,0x4ac,0x504,0x55c,0x5b4 }, + { 0x001,0x059,0x0b1,0x109,0x161,0x1b9,0x211,0x269,0x2c1,0x319,0x371,0x3c9,0x421,0x479,0x4d1,0x529,0x581,0x5d9,0x631,0x689,0x6e1,0x739,0x791,0x7e9,0x841,0x899,0x035,0x08d,0x0e5,0x13d,0x195,0x1ed,0x245,0x29d,0x2f5,0x34d,0x3a5,0x3fd,0x455,0x4ad,0x505,0x55d,0x5b5 }, + { 0x056,0x0ae,0x106,0x15e,0x1b6,0x20e,0x266,0x2be,0x316,0x36e,0x3c6,0x41e,0x476,0x4ce,0x526,0x57e,0x5d6,0x62e,0x686,0x6de,0x736,0x78e,0x7e6,0x83e,0x896,0x032,0x08a,0x0e2,0x13a,0x192,0x1ea,0x242,0x29a,0x2f2,0x34a,0x3a2,0x3fa,0x452,0x4aa,0x502,0x55a,0x5b2,0x60a }, + { 0x057,0x0af,0x107,0x15f,0x1b7,0x20f,0x267,0x2bf,0x317,0x36f,0x3c7,0x41f,0x477,0x4cf,0x527,0x57f,0x5d7,0x62f,0x687,0x6df,0x737,0x78f,0x7e7,0x83f,0x897,0x033,0x08b,0x0e3,0x13b,0x193,0x1eb,0x243,0x29b,0x2f3,0x34b,0x3a3,0x3fb,0x453,0x4ab,0x503,0x55b,0x5b3,0x60b }, + { 0x0ac,0x104,0x15c,0x1b4,0x20c,0x264,0x2bc,0x314,0x36c,0x3c4,0x41c,0x474,0x4cc,0x524,0x57c,0x5d4,0x62c,0x684,0x6dc,0x734,0x78c,0x7e4,0x83c,0x894,0x030,0x088,0x0e0,0x138,0x190,0x1e8,0x240,0x298,0x2f0,0x348,0x3a0,0x3f8,0x450,0x4a8,0x500,0x558,0x5b0,0x608,0x660 }, + { 0x0ad,0x105,0x15d,0x1b5,0x20d,0x265,0x2bd,0x315,0x36d,0x3c5,0x41d,0x475,0x4cd,0x525,0x57d,0x5d5,0x62d,0x685,0x6dd,0x735,0x78d,0x7e5,0x83d,0x895,0x031,0x089,0x0e1,0x139,0x191,0x1e9,0x241,0x299,0x2f1,0x349,0x3a1,0x3f9,0x451,0x4a9,0x501,0x559,0x5b1,0x609,0x661 }, + { 0x102,0x15a,0x1b2,0x20a,0x262,0x2ba,0x312,0x36a,0x3c2,0x41a,0x472,0x4ca,0x522,0x57a,0x5d2,0x62a,0x682,0x6da,0x732,0x78a,0x7e2,0x83a,0x892,0x02e,0x086,0x0de,0x136,0x18e,0x1e6,0x23e,0x296,0x2ee,0x346,0x39e,0x3f6,0x44e,0x4a6,0x4fe,0x556,0x5ae,0x606,0x65e,0x6b6 }, + { 0x103,0x15b,0x1b3,0x20b,0x263,0x2bb,0x313,0x36b,0x3c3,0x41b,0x473,0x4cb,0x523,0x57b,0x5d3,0x62b,0x683,0x6db,0x733,0x78b,0x7e3,0x83b,0x893,0x02f,0x087,0x0df,0x137,0x18f,0x1e7,0x23f,0x297,0x2ef,0x347,0x39f,0x3f7,0x44f,0x4a7,0x4ff,0x557,0x5af,0x607,0x65f,0x6b7 }, + { 0x158,0x1b0,0x208,0x260,0x2b8,0x310,0x368,0x3c0,0x418,0x470,0x4c8,0x520,0x578,0x5d0,0x628,0x680,0x6d8,0x730,0x788,0x7e0,0x838,0x890,0x02c,0x084,0x0dc,0x134,0x18c,0x1e4,0x23c,0x294,0x2ec,0x344,0x39c,0x3f4,0x44c,0x4a4,0x4fc,0x554,0x5ac,0x604,0x65c,0x6b4,0x70c }, + { 0x159,0x1b1,0x209,0x261,0x2b9,0x311,0x369,0x3c1,0x419,0x471,0x4c9,0x521,0x579,0x5d1,0x629,0x681,0x6d9,0x731,0x789,0x7e1,0x839,0x891,0x02d,0x085,0x0dd,0x135,0x18d,0x1e5,0x23d,0x295,0x2ed,0x345,0x39d,0x3f5,0x44d,0x4a5,0x4fd,0x555,0x5ad,0x605,0x65d,0x6b5,0x70d }, + { 0x1ae,0x206,0x25e,0x2b6,0x30e,0x366,0x3be,0x416,0x46e,0x4c6,0x51e,0x576,0x5ce,0x626,0x67e,0x6d6,0x72e,0x786,0x7de,0x836,0x88e,0x02a,0x082,0x0da,0x132,0x18a,0x1e2,0x23a,0x292,0x2ea,0x342,0x39a,0x3f2,0x44a,0x4a2,0x4fa,0x552,0x5aa,0x602,0x65a,0x6b2,0x70a,0x762 }, + { 0x1af,0x207,0x25f,0x2b7,0x30f,0x367,0x3bf,0x417,0x46f,0x4c7,0x51f,0x577,0x5cf,0x627,0x67f,0x6d7,0x72f,0x787,0x7df,0x837,0x88f,0x02b,0x083,0x0db,0x133,0x18b,0x1e3,0x23b,0x293,0x2eb,0x343,0x39b,0x3f3,0x44b,0x4a3,0x4fb,0x553,0x5ab,0x603,0x65b,0x6b3,0x70b,0x763 }, + { 0x204,0x25c,0x2b4,0x30c,0x364,0x3bc,0x414,0x46c,0x4c4,0x51c,0x574,0x5cc,0x624,0x67c,0x6d4,0x72c,0x784,0x7dc,0x834,0x88c,0x028,0x080,0x0d8,0x130,0x188,0x1e0,0x238,0x290,0x2e8,0x340,0x398,0x3f0,0x448,0x4a0,0x4f8,0x550,0x5a8,0x600,0x658,0x6b0,0x708,0x760,0x7b8 }, + { 0x205,0x25d,0x2b5,0x30d,0x365,0x3bd,0x415,0x46d,0x4c5,0x51d,0x575,0x5cd,0x625,0x67d,0x6d5,0x72d,0x785,0x7dd,0x835,0x88d,0x029,0x081,0x0d9,0x131,0x189,0x1e1,0x239,0x291,0x2e9,0x341,0x399,0x3f1,0x449,0x4a1,0x4f9,0x551,0x5a9,0x601,0x659,0x6b1,0x709,0x761,0x7b9 }, + { 0x25a,0x2b2,0x30a,0x362,0x3ba,0x412,0x46a,0x4c2,0x51a,0x572,0x5ca,0x622,0x67a,0x6d2,0x72a,0x782,0x7da,0x832,0x88a,0x026,0x07e,0x0d6,0x12e,0x186,0x1de,0x236,0x28e,0x2e6,0x33e,0x396,0x3ee,0x446,0x49e,0x4f6,0x54e,0x5a6,0x5fe,0x656,0x6ae,0x706,0x75e,0x7b6,0x80e }, + { 0x25b,0x2b3,0x30b,0x363,0x3bb,0x413,0x46b,0x4c3,0x51b,0x573,0x5cb,0x623,0x67b,0x6d3,0x72b,0x783,0x7db,0x833,0x88b,0x027,0x07f,0x0d7,0x12f,0x187,0x1df,0x237,0x28f,0x2e7,0x33f,0x397,0x3ef,0x447,0x49f,0x4f7,0x54f,0x5a7,0x5ff,0x657,0x6af,0x707,0x75f,0x7b7,0x80f }, + { 0x2b0,0x308,0x360,0x3b8,0x410,0x468,0x4c0,0x518,0x570,0x5c8,0x620,0x678,0x6d0,0x728,0x780,0x7d8,0x830,0x888,0x024,0x07c,0x0d4,0x12c,0x184,0x1dc,0x234,0x28c,0x2e4,0x33c,0x394,0x3ec,0x444,0x49c,0x4f4,0x54c,0x5a4,0x5fc,0x654,0x6ac,0x704,0x75c,0x7b4,0x80c,0x864 }, + { 0x2b1,0x309,0x361,0x3b9,0x411,0x469,0x4c1,0x519,0x571,0x5c9,0x621,0x679,0x6d1,0x729,0x781,0x7d9,0x831,0x889,0x025,0x07d,0x0d5,0x12d,0x185,0x1dd,0x235,0x28d,0x2e5,0x33d,0x395,0x3ed,0x445,0x49d,0x4f5,0x54d,0x5a5,0x5fd,0x655,0x6ad,0x705,0x75d,0x7b5,0x80d,0x865 }, + { 0x306,0x35e,0x3b6,0x40e,0x466,0x4be,0x516,0x56e,0x5c6,0x61e,0x676,0x6ce,0x726,0x77e,0x7d6,0x82e,0x886,0x022,0x07a,0x0d2,0x12a,0x182,0x1da,0x232,0x28a,0x2e2,0x33a,0x392,0x3ea,0x442,0x49a,0x4f2,0x54a,0x5a2,0x5fa,0x652,0x6aa,0x702,0x75a,0x7b2,0x80a,0x862,0x8ba }, + { 0x307,0x35f,0x3b7,0x40f,0x467,0x4bf,0x517,0x56f,0x5c7,0x61f,0x677,0x6cf,0x727,0x77f,0x7d7,0x82f,0x887,0x023,0x07b,0x0d3,0x12b,0x183,0x1db,0x233,0x28b,0x2e3,0x33b,0x393,0x3eb,0x443,0x49b,0x4f3,0x54b,0x5a3,0x5fb,0x653,0x6ab,0x703,0x75b,0x7b3,0x80b,0x863,0x8bb }, + { 0x35c,0x3b4,0x40c,0x464,0x4bc,0x514,0x56c,0x5c4,0x61c,0x674,0x6cc,0x724,0x77c,0x7d4,0x82c,0x884,0x020,0x078,0x0d0,0x128,0x180,0x1d8,0x230,0x288,0x2e0,0x338,0x390,0x3e8,0x440,0x498,0x4f0,0x548,0x5a0,0x5f8,0x650,0x6a8,0x700,0x758,0x7b0,0x808,0x860,0x8b8,0x054 }, + { 0x35d,0x3b5,0x40d,0x465,0x4bd,0x515,0x56d,0x5c5,0x61d,0x675,0x6cd,0x725,0x77d,0x7d5,0x82d,0x885,0x021,0x079,0x0d1,0x129,0x181,0x1d9,0x231,0x289,0x2e1,0x339,0x391,0x3e9,0x441,0x499,0x4f1,0x549,0x5a1,0x5f9,0x651,0x6a9,0x701,0x759,0x7b1,0x809,0x861,0x8b9,0x055 }, + { 0x3b2,0x40a,0x462,0x4ba,0x512,0x56a,0x5c2,0x61a,0x672,0x6ca,0x722,0x77a,0x7d2,0x82a,0x882,0x01e,0x076,0x0ce,0x126,0x17e,0x1d6,0x22e,0x286,0x2de,0x336,0x38e,0x3e6,0x43e,0x496,0x4ee,0x546,0x59e,0x5f6,0x64e,0x6a6,0x6fe,0x756,0x7ae,0x806,0x85e,0x8b6,0x052,0x0aa }, + { 0x3b3,0x40b,0x463,0x4bb,0x513,0x56b,0x5c3,0x61b,0x673,0x6cb,0x723,0x77b,0x7d3,0x82b,0x883,0x01f,0x077,0x0cf,0x127,0x17f,0x1d7,0x22f,0x287,0x2df,0x337,0x38f,0x3e7,0x43f,0x497,0x4ef,0x547,0x59f,0x5f7,0x64f,0x6a7,0x6ff,0x757,0x7af,0x807,0x85f,0x8b7,0x053,0x0ab }, + { 0x408,0x460,0x4b8,0x510,0x568,0x5c0,0x618,0x670,0x6c8,0x720,0x778,0x7d0,0x828,0x880,0x01c,0x074,0x0cc,0x124,0x17c,0x1d4,0x22c,0x284,0x2dc,0x334,0x38c,0x3e4,0x43c,0x494,0x4ec,0x544,0x59c,0x5f4,0x64c,0x6a4,0x6fc,0x754,0x7ac,0x804,0x85c,0x8b4,0x050,0x0a8,0x100 }, + { 0x409,0x461,0x4b9,0x511,0x569,0x5c1,0x619,0x671,0x6c9,0x721,0x779,0x7d1,0x829,0x881,0x01d,0x075,0x0cd,0x125,0x17d,0x1d5,0x22d,0x285,0x2dd,0x335,0x38d,0x3e5,0x43d,0x495,0x4ed,0x545,0x59d,0x5f5,0x64d,0x6a5,0x6fd,0x755,0x7ad,0x805,0x85d,0x8b5,0x051,0x0a9,0x101 }, + { 0x45e,0x4b6,0x50e,0x566,0x5be,0x616,0x66e,0x6c6,0x71e,0x776,0x7ce,0x826,0x87e,0x01a,0x072,0x0ca,0x122,0x17a,0x1d2,0x22a,0x282,0x2da,0x332,0x38a,0x3e2,0x43a,0x492,0x4ea,0x542,0x59a,0x5f2,0x64a,0x6a2,0x6fa,0x752,0x7aa,0x802,0x85a,0x8b2,0x04e,0x0a6,0x0fe,0x156 }, + { 0x45f,0x4b7,0x50f,0x567,0x5bf,0x617,0x66f,0x6c7,0x71f,0x777,0x7cf,0x827,0x87f,0x01b,0x073,0x0cb,0x123,0x17b,0x1d3,0x22b,0x283,0x2db,0x333,0x38b,0x3e3,0x43b,0x493,0x4eb,0x543,0x59b,0x5f3,0x64b,0x6a3,0x6fb,0x753,0x7ab,0x803,0x85b,0x8b3,0x04f,0x0a7,0x0ff,0x157 }, + { 0x4b4,0x50c,0x564,0x5bc,0x614,0x66c,0x6c4,0x71c,0x774,0x7cc,0x824,0x87c,0x018,0x070,0x0c8,0x120,0x178,0x1d0,0x228,0x280,0x2d8,0x330,0x388,0x3e0,0x438,0x490,0x4e8,0x540,0x598,0x5f0,0x648,0x6a0,0x6f8,0x750,0x7a8,0x800,0x858,0x8b0,0x04c,0x0a4,0x0fc,0x154,0x1ac }, + { 0x4b5,0x50d,0x565,0x5bd,0x615,0x66d,0x6c5,0x71d,0x775,0x7cd,0x825,0x87d,0x019,0x071,0x0c9,0x121,0x179,0x1d1,0x229,0x281,0x2d9,0x331,0x389,0x3e1,0x439,0x491,0x4e9,0x541,0x599,0x5f1,0x649,0x6a1,0x6f9,0x751,0x7a9,0x801,0x859,0x8b1,0x04d,0x0a5,0x0fd,0x155,0x1ad }, + { 0x50a,0x562,0x5ba,0x612,0x66a,0x6c2,0x71a,0x772,0x7ca,0x822,0x87a,0x016,0x06e,0x0c6,0x11e,0x176,0x1ce,0x226,0x27e,0x2d6,0x32e,0x386,0x3de,0x436,0x48e,0x4e6,0x53e,0x596,0x5ee,0x646,0x69e,0x6f6,0x74e,0x7a6,0x7fe,0x856,0x8ae,0x04a,0x0a2,0x0fa,0x152,0x1aa,0x202 }, + { 0x50b,0x563,0x5bb,0x613,0x66b,0x6c3,0x71b,0x773,0x7cb,0x823,0x87b,0x017,0x06f,0x0c7,0x11f,0x177,0x1cf,0x227,0x27f,0x2d7,0x32f,0x387,0x3df,0x437,0x48f,0x4e7,0x53f,0x597,0x5ef,0x647,0x69f,0x6f7,0x74f,0x7a7,0x7ff,0x857,0x8af,0x04b,0x0a3,0x0fb,0x153,0x1ab,0x203 }, + { 0x560,0x5b8,0x610,0x668,0x6c0,0x718,0x770,0x7c8,0x820,0x878,0x014,0x06c,0x0c4,0x11c,0x174,0x1cc,0x224,0x27c,0x2d4,0x32c,0x384,0x3dc,0x434,0x48c,0x4e4,0x53c,0x594,0x5ec,0x644,0x69c,0x6f4,0x74c,0x7a4,0x7fc,0x854,0x8ac,0x048,0x0a0,0x0f8,0x150,0x1a8,0x200,0x258 }, + { 0x561,0x5b9,0x611,0x669,0x6c1,0x719,0x771,0x7c9,0x821,0x879,0x015,0x06d,0x0c5,0x11d,0x175,0x1cd,0x225,0x27d,0x2d5,0x32d,0x385,0x3dd,0x435,0x48d,0x4e5,0x53d,0x595,0x5ed,0x645,0x69d,0x6f5,0x74d,0x7a5,0x7fd,0x855,0x8ad,0x049,0x0a1,0x0f9,0x151,0x1a9,0x201,0x259 }, + { 0x5b6,0x60e,0x666,0x6be,0x716,0x76e,0x7c6,0x81e,0x876,0x012,0x06a,0x0c2,0x11a,0x172,0x1ca,0x222,0x27a,0x2d2,0x32a,0x382,0x3da,0x432,0x48a,0x4e2,0x53a,0x592,0x5ea,0x642,0x69a,0x6f2,0x74a,0x7a2,0x7fa,0x852,0x8aa,0x046,0x09e,0x0f6,0x14e,0x1a6,0x1fe,0x256,0x2ae }, + { 0x5b7,0x60f,0x667,0x6bf,0x717,0x76f,0x7c7,0x81f,0x877,0x013,0x06b,0x0c3,0x11b,0x173,0x1cb,0x223,0x27b,0x2d3,0x32b,0x383,0x3db,0x433,0x48b,0x4e3,0x53b,0x593,0x5eb,0x643,0x69b,0x6f3,0x74b,0x7a3,0x7fb,0x853,0x8ab,0x047,0x09f,0x0f7,0x14f,0x1a7,0x1ff,0x257,0x2af }, + { 0x60c,0x664,0x6bc,0x714,0x76c,0x7c4,0x81c,0x874,0x010,0x068,0x0c0,0x118,0x170,0x1c8,0x220,0x278,0x2d0,0x328,0x380,0x3d8,0x430,0x488,0x4e0,0x538,0x590,0x5e8,0x640,0x698,0x6f0,0x748,0x7a0,0x7f8,0x850,0x8a8,0x044,0x09c,0x0f4,0x14c,0x1a4,0x1fc,0x254,0x2ac,0x304 }, + { 0x60d,0x665,0x6bd,0x715,0x76d,0x7c5,0x81d,0x875,0x011,0x069,0x0c1,0x119,0x171,0x1c9,0x221,0x279,0x2d1,0x329,0x381,0x3d9,0x431,0x489,0x4e1,0x539,0x591,0x5e9,0x641,0x699,0x6f1,0x749,0x7a1,0x7f9,0x851,0x8a9,0x045,0x09d,0x0f5,0x14d,0x1a5,0x1fd,0x255,0x2ad,0x305 }, + { 0x662,0x6ba,0x712,0x76a,0x7c2,0x81a,0x872,0x00e,0x066,0x0be,0x116,0x16e,0x1c6,0x21e,0x276,0x2ce,0x326,0x37e,0x3d6,0x42e,0x486,0x4de,0x536,0x58e,0x5e6,0x63e,0x696,0x6ee,0x746,0x79e,0x7f6,0x84e,0x8a6,0x042,0x09a,0x0f2,0x14a,0x1a2,0x1fa,0x252,0x2aa,0x302,0x35a }, + { 0x663,0x6bb,0x713,0x76b,0x7c3,0x81b,0x873,0x00f,0x067,0x0bf,0x117,0x16f,0x1c7,0x21f,0x277,0x2cf,0x327,0x37f,0x3d7,0x42f,0x487,0x4df,0x537,0x58f,0x5e7,0x63f,0x697,0x6ef,0x747,0x79f,0x7f7,0x84f,0x8a7,0x043,0x09b,0x0f3,0x14b,0x1a3,0x1fb,0x253,0x2ab,0x303,0x35b }, + { 0x6b8,0x710,0x768,0x7c0,0x818,0x870,0x00c,0x064,0x0bc,0x114,0x16c,0x1c4,0x21c,0x274,0x2cc,0x324,0x37c,0x3d4,0x42c,0x484,0x4dc,0x534,0x58c,0x5e4,0x63c,0x694,0x6ec,0x744,0x79c,0x7f4,0x84c,0x8a4,0x040,0x098,0x0f0,0x148,0x1a0,0x1f8,0x250,0x2a8,0x300,0x358,0x3b0 }, + { 0x6b9,0x711,0x769,0x7c1,0x819,0x871,0x00d,0x065,0x0bd,0x115,0x16d,0x1c5,0x21d,0x275,0x2cd,0x325,0x37d,0x3d5,0x42d,0x485,0x4dd,0x535,0x58d,0x5e5,0x63d,0x695,0x6ed,0x745,0x79d,0x7f5,0x84d,0x8a5,0x041,0x099,0x0f1,0x149,0x1a1,0x1f9,0x251,0x2a9,0x301,0x359,0x3b1 }, + { 0x70e,0x766,0x7be,0x816,0x86e,0x00a,0x062,0x0ba,0x112,0x16a,0x1c2,0x21a,0x272,0x2ca,0x322,0x37a,0x3d2,0x42a,0x482,0x4da,0x532,0x58a,0x5e2,0x63a,0x692,0x6ea,0x742,0x79a,0x7f2,0x84a,0x8a2,0x03e,0x096,0x0ee,0x146,0x19e,0x1f6,0x24e,0x2a6,0x2fe,0x356,0x3ae,0x406 }, + { 0x70f,0x767,0x7bf,0x817,0x86f,0x00b,0x063,0x0bb,0x113,0x16b,0x1c3,0x21b,0x273,0x2cb,0x323,0x37b,0x3d3,0x42b,0x483,0x4db,0x533,0x58b,0x5e3,0x63b,0x693,0x6eb,0x743,0x79b,0x7f3,0x84b,0x8a3,0x03f,0x097,0x0ef,0x147,0x19f,0x1f7,0x24f,0x2a7,0x2ff,0x357,0x3af,0x407 }, + { 0x764,0x7bc,0x814,0x86c,0x008,0x060,0x0b8,0x110,0x168,0x1c0,0x218,0x270,0x2c8,0x320,0x378,0x3d0,0x428,0x480,0x4d8,0x530,0x588,0x5e0,0x638,0x690,0x6e8,0x740,0x798,0x7f0,0x848,0x8a0,0x03c,0x094,0x0ec,0x144,0x19c,0x1f4,0x24c,0x2a4,0x2fc,0x354,0x3ac,0x404,0x45c }, + { 0x765,0x7bd,0x815,0x86d,0x009,0x061,0x0b9,0x111,0x169,0x1c1,0x219,0x271,0x2c9,0x321,0x379,0x3d1,0x429,0x481,0x4d9,0x531,0x589,0x5e1,0x639,0x691,0x6e9,0x741,0x799,0x7f1,0x849,0x8a1,0x03d,0x095,0x0ed,0x145,0x19d,0x1f5,0x24d,0x2a5,0x2fd,0x355,0x3ad,0x405,0x45d }, + { 0x7ba,0x812,0x86a,0x006,0x05e,0x0b6,0x10e,0x166,0x1be,0x216,0x26e,0x2c6,0x31e,0x376,0x3ce,0x426,0x47e,0x4d6,0x52e,0x586,0x5de,0x636,0x68e,0x6e6,0x73e,0x796,0x7ee,0x846,0x89e,0x03a,0x092,0x0ea,0x142,0x19a,0x1f2,0x24a,0x2a2,0x2fa,0x352,0x3aa,0x402,0x45a,0x4b2 }, + { 0x7bb,0x813,0x86b,0x007,0x05f,0x0b7,0x10f,0x167,0x1bf,0x217,0x26f,0x2c7,0x31f,0x377,0x3cf,0x427,0x47f,0x4d7,0x52f,0x587,0x5df,0x637,0x68f,0x6e7,0x73f,0x797,0x7ef,0x847,0x89f,0x03b,0x093,0x0eb,0x143,0x19b,0x1f3,0x24b,0x2a3,0x2fb,0x353,0x3ab,0x403,0x45b,0x4b3 }, + { 0x810,0x868,0x004,0x05c,0x0b4,0x10c,0x164,0x1bc,0x214,0x26c,0x2c4,0x31c,0x374,0x3cc,0x424,0x47c,0x4d4,0x52c,0x584,0x5dc,0x634,0x68c,0x6e4,0x73c,0x794,0x7ec,0x844,0x89c,0x038,0x090,0x0e8,0x140,0x198,0x1f0,0x248,0x2a0,0x2f8,0x350,0x3a8,0x400,0x458,0x4b0,0x508 }, + { 0x811,0x869,0x005,0x05d,0x0b5,0x10d,0x165,0x1bd,0x215,0x26d,0x2c5,0x31d,0x375,0x3cd,0x425,0x47d,0x4d5,0x52d,0x585,0x5dd,0x635,0x68d,0x6e5,0x73d,0x795,0x7ed,0x845,0x89d,0x039,0x091,0x0e9,0x141,0x199,0x1f1,0x249,0x2a1,0x2f9,0x351,0x3a9,0x401,0x459,0x4b1,0x509 }, + { 0x866,0x002,0x05a,0x0b2,0x10a,0x162,0x1ba,0x212,0x26a,0x2c2,0x31a,0x372,0x3ca,0x422,0x47a,0x4d2,0x52a,0x582,0x5da,0x632,0x68a,0x6e2,0x73a,0x792,0x7ea,0x842,0x89a,0x036,0x08e,0x0e6,0x13e,0x196,0x1ee,0x246,0x29e,0x2f6,0x34e,0x3a6,0x3fe,0x456,0x4ae,0x506,0x55e }, + { 0x867,0x003,0x05b,0x0b3,0x10b,0x163,0x1bb,0x213,0x26b,0x2c3,0x31b,0x373,0x3cb,0x423,0x47b,0x4d3,0x52b,0x583,0x5db,0x633,0x68b,0x6e3,0x73b,0x793,0x7eb,0x843,0x89b,0x037,0x08f,0x0e7,0x13f,0x197,0x1ef,0x247,0x29f,0x2f7,0x34f,0x3a7,0x3ff,0x457,0x4af,0x507,0x55f } +}; + + +//------------------------------------------------- +// ecc_source_byte - return data from the sector +// at the given offset, masking anything +// particular to a mode +//------------------------------------------------- + +static inline uint8_t ecc_source_byte(const uint8_t *sector, uint32_t offset) +{ + // in mode 2 always treat these as 0 bytes + return (sector[MODE_OFFSET] == 2 && offset < 4) ? 0x00 : sector[SYNC_OFFSET + SYNC_NUM_BYTES + offset]; +} + +/** + * @fn void ecc_compute_bytes(const uint8_t *sector, const uint16_t *row, int rowlen, uint8_t &val1, uint8_t &val2) + * + * @brief ------------------------------------------------- + * ecc_compute_bytes - calculate an ECC value (P or Q) + * -------------------------------------------------. + * + * @param sector The sector. + * @param row The row. + * @param rowlen The rowlen. + * @param [in,out] val1 The first value. + * @param [in,out] val2 The second value. + */ + +void ecc_compute_bytes(const uint8_t *sector, const uint16_t *row, int rowlen, uint8_t *val1, uint8_t *val2) +{ + *val1 = *val2 = 0; + for (int component = 0; component < rowlen; component++) + { + *val1 ^= ecc_source_byte(sector, row[component]); + *val2 ^= ecc_source_byte(sector, row[component]); + *val1 = ecclow[*val1]; + } + *val1 = ecchigh[ecclow[*val1] ^ *val2]; + *val2 ^= *val1; +} + +/** + * @fn int ecc_verify(const uint8_t *sector) + * + * @brief ------------------------------------------------- + * ecc_verify - verify the P and Q ECC codes in a sector + * -------------------------------------------------. + * + * @param sector The sector. + * + * @return true if it succeeds, false if it fails. + */ + +int ecc_verify(const uint8_t *sector) +{ + // first verify P bytes + for (int byte = 0; byte < ECC_P_NUM_BYTES; byte++) + { + uint8_t val1, val2; + ecc_compute_bytes(sector, poffsets[byte], ECC_P_COMP, &val1, &val2); + if (sector[ECC_P_OFFSET + byte] != val1 || sector[ECC_P_OFFSET + ECC_P_NUM_BYTES + byte] != val2) + return 0; + } + + // then verify Q bytes + for (int byte = 0; byte < ECC_Q_NUM_BYTES; byte++) + { + uint8_t val1, val2; + ecc_compute_bytes(sector, qoffsets[byte], ECC_Q_COMP, &val1, &val2); + if (sector[ECC_Q_OFFSET + byte] != val1 || sector[ECC_Q_OFFSET + ECC_Q_NUM_BYTES + byte] != val2) + return 0; + } + return 1; +} + +/** + * @fn void ecc_generate(uint8_t *sector) + * + * @brief ------------------------------------------------- + * ecc_generate - generate the P and Q ECC codes for a sector, overwriting any + * existing codes + * -------------------------------------------------. + * + * @param [in,out] sector If non-null, the sector. + */ + +void ecc_generate(uint8_t *sector) +{ + // first verify P bytes + for (int byte = 0; byte < ECC_P_NUM_BYTES; byte++) + ecc_compute_bytes(sector, poffsets[byte], ECC_P_COMP, §or[ECC_P_OFFSET + byte], §or[ECC_P_OFFSET + ECC_P_NUM_BYTES + byte]); + + // then verify Q bytes + for (int byte = 0; byte < ECC_Q_NUM_BYTES; byte++) + ecc_compute_bytes(sector, qoffsets[byte], ECC_Q_COMP, §or[ECC_Q_OFFSET + byte], §or[ECC_Q_OFFSET + ECC_Q_NUM_BYTES + byte]); +} + +/** + * @fn void ecc_clear(uint8_t *sector) + * + * @brief ------------------------------------------------- + * ecc_clear - erase the ECC P and Q cods to 0 within a sector + * -------------------------------------------------. + * + * @param [in,out] sector If non-null, the sector. + */ + +void ecc_clear(uint8_t *sector) +{ + memset(§or[ECC_P_OFFSET], 0, 2 * ECC_P_NUM_BYTES); + memset(§or[ECC_Q_OFFSET], 0, 2 * ECC_Q_NUM_BYTES); +} + +#endif /* WANT_RAW_DATA_SECTOR */ diff --git a/core/cd_hw/libchdr/src/cdrom.h b/core/cd_hw/libchdr/src/cdrom.h new file mode 100644 index 0000000..609492f --- /dev/null +++ b/core/cd_hw/libchdr/src/cdrom.h @@ -0,0 +1,70 @@ +/* license:BSD-3-Clause */ +/* copyright-holders:Aaron Giles */ +/*************************************************************************** + + cdrom.h + + Generic MAME cd-rom implementation + +***************************************************************************/ + +#pragma once + +#ifndef __CDROM_H__ +#define __CDROM_H__ + +#include + + +/*************************************************************************** + CONSTANTS +***************************************************************************/ + +/* tracks are padded to a multiple of this many frames */ +#define CD_TRACK_PADDING (4) + +#define CD_MAX_TRACKS (99) /* AFAIK the theoretical limit */ +#define CD_MAX_SECTOR_DATA (2352) +#define CD_MAX_SUBCODE_DATA (96) + +#define CD_FRAME_SIZE (CD_MAX_SECTOR_DATA + CD_MAX_SUBCODE_DATA) +#define CD_FRAMES_PER_HUNK (8) + +#define CD_METADATA_WORDS (1+(CD_MAX_TRACKS * 6)) + +enum +{ + CD_TRACK_MODE1 = 0, /* mode 1 2048 bytes/sector */ + CD_TRACK_MODE1_RAW, /* mode 1 2352 bytes/sector */ + CD_TRACK_MODE2, /* mode 2 2336 bytes/sector */ + CD_TRACK_MODE2_FORM1, /* mode 2 2048 bytes/sector */ + CD_TRACK_MODE2_FORM2, /* mode 2 2324 bytes/sector */ + CD_TRACK_MODE2_FORM_MIX, /* mode 2 2336 bytes/sector */ + CD_TRACK_MODE2_RAW, /* mode 2 2352 bytes / sector */ + CD_TRACK_AUDIO, /* redbook audio track 2352 bytes/sector (588 samples) */ + + CD_TRACK_RAW_DONTCARE /* special flag for cdrom_read_data: just return me whatever is there */ +}; + +enum +{ + CD_SUB_NORMAL = 0, /* "cooked" 96 bytes per sector */ + CD_SUB_RAW, /* raw uninterleaved 96 bytes per sector */ + CD_SUB_NONE /* no subcode data stored */ +}; + +#define CD_FLAG_GDROM 0x00000001 // disc is a GD-ROM, all tracks should be stored with GD-ROM metadata +#define CD_FLAG_GDROMLE 0x00000002 // legacy GD-ROM, with little-endian CDDA data + +/*************************************************************************** + FUNCTION PROTOTYPES +***************************************************************************/ + +#ifdef WANT_RAW_DATA_SECTOR +/* ECC utilities */ +int ecc_verify(const uint8_t *sector); +void ecc_generate(uint8_t *sector); +void ecc_clear(uint8_t *sector); +#endif + +#endif /* __CDROM_H__ */ diff --git a/core/cd_hw/libchdr/src/chd.c b/core/cd_hw/libchdr/src/chd.c new file mode 100644 index 0000000..e51e303 --- /dev/null +++ b/core/cd_hw/libchdr/src/chd.c @@ -0,0 +1,2469 @@ +/*************************************************************************** + + chd.c + + MAME Compressed Hunks of Data file format + +**************************************************************************** + + Copyright Aaron Giles + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + * Neither the name 'MAME' 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 AARON GILES ''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 AARON GILES BE LIABLE FOR ANY DIRECT, + INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + +***************************************************************************/ + +#include +#include +#include +#include +#include "chd.h" +#include "cdrom.h" +#include "flac.h" +#include "huffman.h" +#include "zlib.h" +#include "LzmaEnc.h" +#include "LzmaDec.h" + +#define TRUE 1 +#define FALSE 0 + +#define MAX(x, y) (((x) > (y)) ? (x) : (y)) +#define MIN(x, y) (((x) < (y)) ? (x) : (y)) + +#define CHD_MAKE_TAG(a,b,c,d) (((a) << 24) | ((b) << 16) | ((c) << 8) | (d)) + +/*************************************************************************** + DEBUGGING +***************************************************************************/ + +#define PRINTF_MAX_HUNK (0) + + + +/*************************************************************************** + CONSTANTS +***************************************************************************/ + +#define MAP_STACK_ENTRIES 512 /* max number of entries to use on the stack */ +#define MAP_ENTRY_SIZE 16 /* V3 and later */ +#define OLD_MAP_ENTRY_SIZE 8 /* V1-V2 */ +#define METADATA_HEADER_SIZE 16 /* metadata header size */ + +#define MAP_ENTRY_FLAG_TYPE_MASK 0x0f /* what type of hunk */ +#define MAP_ENTRY_FLAG_NO_CRC 0x10 /* no CRC is present */ + +#define CHD_V1_SECTOR_SIZE 512 /* size of a "sector" in the V1 header */ + +#define COOKIE_VALUE 0xbaadf00d +#define MAX_ZLIB_ALLOCS 64 + +#define END_OF_LIST_COOKIE "EndOfListCookie" + +#define NO_MATCH (~0) + +#ifdef WANT_RAW_DATA_SECTOR +static const uint8_t s_cd_sync_header[12] = { 0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00 }; +#endif + +// V3-V4 entry types +enum +{ + V34_MAP_ENTRY_TYPE_INVALID = 0, // invalid type + V34_MAP_ENTRY_TYPE_COMPRESSED = 1, // standard compression + V34_MAP_ENTRY_TYPE_UNCOMPRESSED = 2, // uncompressed data + V34_MAP_ENTRY_TYPE_MINI = 3, // mini: use offset as raw data + V34_MAP_ENTRY_TYPE_SELF_HUNK = 4, // same as another hunk in this file + V34_MAP_ENTRY_TYPE_PARENT_HUNK = 5, // same as a hunk in the parent file + V34_MAP_ENTRY_TYPE_2ND_COMPRESSED = 6 // compressed with secondary algorithm (usually FLAC CDDA) +}; + +// V5 compression types +enum +{ + ///< codec #0 + // these types are live when running + COMPRESSION_TYPE_0 = 0, + ///< codec #1 + COMPRESSION_TYPE_1 = 1, + ///< codec #2 + COMPRESSION_TYPE_2 = 2, + ///< codec #3 + COMPRESSION_TYPE_3 = 3, + ///< no compression; implicit length = hunkbytes + COMPRESSION_NONE = 4, + ///< same as another block in this chd + COMPRESSION_SELF = 5, + ///< same as a hunk's worth of units in the parent chd + COMPRESSION_PARENT = 6, + + ///< start of small RLE run (4-bit length) + // these additional pseudo-types are used for compressed encodings: + COMPRESSION_RLE_SMALL, + ///< start of large RLE run (8-bit length) + COMPRESSION_RLE_LARGE, + ///< same as the last COMPRESSION_SELF block + COMPRESSION_SELF_0, + ///< same as the last COMPRESSION_SELF block + 1 + COMPRESSION_SELF_1, + ///< same block in the parent + COMPRESSION_PARENT_SELF, + ///< same as the last COMPRESSION_PARENT block + COMPRESSION_PARENT_0, + ///< same as the last COMPRESSION_PARENT block + 1 + COMPRESSION_PARENT_1 +}; + + +/*************************************************************************** + MACROS +***************************************************************************/ + +#define EARLY_EXIT(x) do { (void)(x); goto cleanup; } while (0) + + + +/*************************************************************************** + TYPE DEFINITIONS +***************************************************************************/ + +/* interface to a codec */ +typedef struct _codec_interface codec_interface; +struct _codec_interface +{ + UINT32 compression; /* type of compression */ + const char *compname; /* name of the algorithm */ + UINT8 lossy; /* is this a lossy algorithm? */ + chd_error (*init)(void *codec, UINT32 hunkbytes); /* codec initialize */ + void (*free)(void *codec); /* codec free */ + chd_error (*decompress)(void *codec, const uint8_t *src, uint32_t complen, uint8_t *dest, uint32_t destlen); /* decompress data */ + chd_error (*config)(void *codec, int param, void *config); /* configure */ +}; + + +/* a single map entry */ +typedef struct _map_entry map_entry; +struct _map_entry +{ + UINT64 offset; /* offset within the file of the data */ + UINT32 crc; /* 32-bit CRC of the data */ + UINT32 length; /* length of the data */ + UINT8 flags; /* misc flags */ +}; + + +/* a single metadata entry */ +typedef struct _metadata_entry metadata_entry; +struct _metadata_entry +{ + UINT64 offset; /* offset within the file of the header */ + UINT64 next; /* offset within the file of the next header */ + UINT64 prev; /* offset within the file of the previous header */ + UINT32 length; /* length of the metadata */ + UINT32 metatag; /* metadata tag */ + UINT8 flags; /* flag bits */ +}; + +/* codec-private data for the ZLIB codec */ + +typedef struct _zlib_allocator zlib_allocator; +struct _zlib_allocator +{ + UINT32 * allocptr[MAX_ZLIB_ALLOCS]; +}; + +typedef struct _zlib_codec_data zlib_codec_data; +struct _zlib_codec_data +{ + z_stream inflater; + zlib_allocator allocator; +}; + +/* codec-private data for the LZMA codec */ +#define MAX_LZMA_ALLOCS 64 + +typedef struct _lzma_allocator lzma_allocator; +struct _lzma_allocator +{ + void *(*Alloc)(void *p, size_t size); + void (*Free)(void *p, void *address); /* address can be 0 */ + void (*FreeSz)(void *p, void *address, size_t size); /* address can be 0 */ + uint32_t* allocptr[MAX_LZMA_ALLOCS]; +}; + +typedef struct _lzma_codec_data lzma_codec_data; +struct _lzma_codec_data +{ + CLzmaDec decoder; + lzma_allocator allocator; +}; + +/* codec-private data for the CDZL codec */ +typedef struct _cdzl_codec_data cdzl_codec_data; +struct _cdzl_codec_data { + // internal state + zlib_codec_data base_decompressor; +#ifdef WANT_SUBCODE + zlib_codec_data subcode_decompressor; +#endif + uint8_t* buffer; +}; + +/* codec-private data for the CDLZ codec */ +typedef struct _cdlz_codec_data cdlz_codec_data; +struct _cdlz_codec_data { + // internal state + lzma_codec_data base_decompressor; +#ifdef WANT_SUBCODE + zlib_codec_data subcode_decompressor; +#endif + uint8_t* buffer; +}; + +/* codec-private data for the CDFL codec */ +typedef struct _cdfl_codec_data cdfl_codec_data; +struct _cdfl_codec_data { + // internal state + int swap_endian; + flac_decoder decoder; +#ifdef WANT_SUBCODE + zlib_codec_data subcode_decompressor; +#endif + uint8_t* buffer; +}; + +/* internal representation of an open CHD file */ +struct _chd_file +{ + UINT32 cookie; /* cookie, should equal COOKIE_VALUE */ + + core_file * file; /* handle to the open core file */ + UINT8 owns_file; /* flag indicating if this file should be closed on chd_close() */ + chd_header header; /* header, extracted from file */ + + chd_file * parent; /* pointer to parent file, or NULL */ + + map_entry * map; /* array of map entries */ + +#ifdef NEED_CACHE_HUNK + UINT8 * cache; /* hunk cache pointer */ + UINT32 cachehunk; /* index of currently cached hunk */ + + UINT8 * compare; /* hunk compare pointer */ + UINT32 comparehunk; /* index of current compare data */ +#endif + + UINT8 * compressed; /* pointer to buffer for compressed data */ + const codec_interface * codecintf[4]; /* interface to the codec */ + + zlib_codec_data zlib_codec_data; /* zlib codec data */ + cdzl_codec_data cdzl_codec_data; /* cdzl codec data */ + cdlz_codec_data cdlz_codec_data; /* cdlz codec data */ + cdfl_codec_data cdfl_codec_data; /* cdfl codec data */ + +#ifdef NEED_CACHE_HUNK + UINT32 maxhunk; /* maximum hunk accessed */ +#endif +}; + + +/*************************************************************************** + GLOBAL VARIABLES +***************************************************************************/ + +static const UINT8 nullmd5[CHD_MD5_BYTES] = { 0 }; +static const UINT8 nullsha1[CHD_SHA1_BYTES] = { 0 }; + + + +/*************************************************************************** + PROTOTYPES +***************************************************************************/ + +/* internal header operations */ +static chd_error header_validate(const chd_header *header); +static chd_error header_read(core_file *file, chd_header *header); + + +/* internal hunk read/write */ +#ifdef NEED_CACHE_HUNK +static chd_error hunk_read_into_cache(chd_file *chd, UINT32 hunknum); +#endif +static chd_error hunk_read_into_memory(chd_file *chd, UINT32 hunknum, UINT8 *dest); + +/* internal map access */ +static chd_error map_read(chd_file *chd); + +/* metadata management */ +static chd_error metadata_find_entry(chd_file *chd, UINT32 metatag, UINT32 metaindex, metadata_entry *metaentry); + + +/* zlib compression codec */ +static chd_error zlib_codec_init(void *codec, uint32_t hunkbytes); +static void zlib_codec_free(void *codec); +static chd_error zlib_codec_decompress(void *codec, const uint8_t *src, uint32_t complen, uint8_t *dest, uint32_t destlen); +static voidpf zlib_fast_alloc(voidpf opaque, uInt items, uInt size); +static void zlib_fast_free(voidpf opaque, voidpf address); + +/* lzma compression codec */ +static chd_error lzma_codec_init(void *codec, uint32_t hunkbytes); +static void lzma_codec_free(void *codec); +static chd_error lzma_codec_decompress(void *codec, const uint8_t *src, uint32_t complen, uint8_t *dest, uint32_t destlen); + +/* cdzl compression codec */ +static chd_error cdzl_codec_init(void* codec, uint32_t hunkbytes); +static void cdzl_codec_free(void* codec); +static chd_error cdzl_codec_decompress(void *codec, const uint8_t *src, uint32_t complen, uint8_t *dest, uint32_t destlen); + +/* cdlz compression codec */ +static chd_error cdlz_codec_init(void* codec, uint32_t hunkbytes); +static void cdlz_codec_free(void* codec); +static chd_error cdlz_codec_decompress(void *codec, const uint8_t *src, uint32_t complen, uint8_t *dest, uint32_t destlen); + +/* cdfl compression codec */ +static chd_error cdfl_codec_init(void* codec, uint32_t hunkbytes); +static void cdfl_codec_free(void* codec); +static chd_error cdfl_codec_decompress(void *codec, const uint8_t *src, uint32_t complen, uint8_t *dest, uint32_t destlen); + +//************************************************************************** +// LZMA ALLOCATOR HELPER +//************************************************************************** + +void *lzma_fast_alloc(void *p, size_t size); +void lzma_fast_free(void *p, void *address); + +//------------------------------------------------- +// lzma_allocator_init +//------------------------------------------------- + +void lzma_allocator_init(void* p) +{ + lzma_allocator *codec = (lzma_allocator *)(p); + + // reset pointer list + memset(codec->allocptr, 0, sizeof(codec->allocptr)); + codec->Alloc = lzma_fast_alloc; + codec->Free = lzma_fast_free; +} + +//------------------------------------------------- +// lzma_allocator_free +//------------------------------------------------- + +void lzma_allocator_free(void* p ) +{ + lzma_allocator *codec = (lzma_allocator *)(p); + + // free our memory + int i; + for (i = 0 ; i < MAX_LZMA_ALLOCS ; i++) + { + if (codec->allocptr[i] != NULL) + free(codec->allocptr[i]); + } +} + +//------------------------------------------------- +// lzma_fast_alloc - fast malloc for lzma, which +// allocates and frees memory frequently +//------------------------------------------------- + +void *lzma_fast_alloc(void *p, size_t size) +{ + int scan; + lzma_allocator *codec = (lzma_allocator *)(p); + + // compute the size, rounding to the nearest 1k + size = (size + 0x3ff) & ~0x3ff; + + // reuse a hunk if we can + for (scan = 0; scan < MAX_LZMA_ALLOCS; scan++) + { + uint32_t *ptr = codec->allocptr[scan]; + if (ptr != NULL && size == *ptr) + { + // set the low bit of the size so we don't match next time + *ptr |= 1; + return ptr + 1; + } + } + + // alloc a new one and put it into the list + uint32_t *addr = (uint32_t *)malloc(sizeof(uint8_t) * (size + sizeof(uint32_t))); + if (addr==NULL) + return NULL; + for (scan = 0; scan < MAX_LZMA_ALLOCS; scan++) + { + if (codec->allocptr[scan] == NULL) + { + codec->allocptr[scan] = addr; + break; + } + } + + // set the low bit of the size so we don't match next time + *addr = size | 1; + return addr + 1; +} + + +//------------------------------------------------- +// lzma_fast_free - fast free for lzma, which +// allocates and frees memory frequently +//------------------------------------------------- + +void lzma_fast_free(void *p, void *address) +{ + if (address == NULL) + return; + + int scan; + lzma_allocator *codec = (lzma_allocator *)(p); + + // find the hunk + uint32_t *ptr = (uint32_t *)(address) - 1; + for (scan = 0; scan < MAX_LZMA_ALLOCS; scan++) + { + if (ptr == codec->allocptr[scan]) + { + // clear the low bit of the size to allow matches + *ptr &= ~1; + return; + } + } +} + +//************************************************************************** +// LZMA DECOMPRESSOR +//************************************************************************** + + +//------------------------------------------------- +// lzma_codec_init - constructor +//------------------------------------------------- + +chd_error lzma_codec_init(void* codec, uint32_t hunkbytes) +{ + lzma_codec_data* lzma_codec = (lzma_codec_data*) codec; + + // construct the decoder + LzmaDec_Construct(&lzma_codec->decoder); + + // FIXME: this code is written in a way that makes it impossible to safely upgrade the LZMA SDK + // This code assumes that the current version of the encoder imposes the same requirements on the + // decoder as the encoder used to produce the file. This is not necessarily true. The format + // needs to be changed so the encoder properties are written to the file. + + // configure the properties like the compressor did + CLzmaEncProps encoder_props; + LzmaEncProps_Init(&encoder_props); + encoder_props.level = 9; + encoder_props.reduceSize = hunkbytes; + LzmaEncProps_Normalize(&encoder_props); + + // convert to decoder properties + lzma_allocator* alloc = &lzma_codec->allocator; + lzma_allocator_init(alloc); + CLzmaEncHandle enc = LzmaEnc_Create((ISzAlloc*)alloc); + if (!enc) + return CHDERR_DECOMPRESSION_ERROR; + if (LzmaEnc_SetProps(enc, &encoder_props) != SZ_OK) + { + LzmaEnc_Destroy(enc, (ISzAlloc*)&alloc, (ISzAlloc*)&alloc); + return CHDERR_DECOMPRESSION_ERROR; + } + Byte decoder_props[LZMA_PROPS_SIZE]; + SizeT props_size = sizeof(decoder_props); + if (LzmaEnc_WriteProperties(enc, decoder_props, &props_size) != SZ_OK) + { + LzmaEnc_Destroy(enc, (ISzAlloc*)alloc, (ISzAlloc*)alloc); + return CHDERR_DECOMPRESSION_ERROR; + } + LzmaEnc_Destroy(enc, (ISzAlloc*)alloc, (ISzAlloc*)alloc); + + // do memory allocations + if (LzmaDec_Allocate(&lzma_codec->decoder, decoder_props, LZMA_PROPS_SIZE, (ISzAlloc*)alloc) != SZ_OK) + return CHDERR_DECOMPRESSION_ERROR; + + // Okay + return CHDERR_NONE; +} + + +//------------------------------------------------- +// lzma_codec_free +//------------------------------------------------- + +void lzma_codec_free(void* codec) +{ + lzma_codec_data* lzma_codec = (lzma_codec_data*) codec; + lzma_allocator* alloc = &lzma_codec->allocator; + + // free memory + lzma_allocator_free(alloc); + LzmaDec_Free(&lzma_codec->decoder, (ISzAlloc*)&lzma_codec->allocator); +} + + +//------------------------------------------------- +// decompress - decompress data using the LZMA +// codec +//------------------------------------------------- + +chd_error lzma_codec_decompress(void* codec, const uint8_t *src, uint32_t complen, uint8_t *dest, uint32_t destlen) +{ + // initialize + lzma_codec_data* lzma_codec = (lzma_codec_data*) codec; + LzmaDec_Init(&lzma_codec->decoder); + + // decode + SizeT consumedlen = complen; + SizeT decodedlen = destlen; + ELzmaStatus status; + SRes res = LzmaDec_DecodeToBuf(&lzma_codec->decoder, dest, &decodedlen, src, &consumedlen, LZMA_FINISH_END, &status); + if ((res != SZ_OK && res != LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK) || consumedlen != complen || decodedlen != destlen) + return CHDERR_DECOMPRESSION_ERROR; + return CHDERR_NONE; +} + +// cdlz +chd_error cdlz_codec_init(void* codec, uint32_t hunkbytes) +{ + chd_error ret; + cdlz_codec_data* cdlz = (cdlz_codec_data*) codec; + + // allocate buffer + cdlz->buffer = (uint8_t*)malloc(sizeof(uint8_t) * hunkbytes); + if (cdlz->buffer == NULL) + return CHDERR_OUT_OF_MEMORY; + + ret = lzma_codec_init(&cdlz->base_decompressor, (hunkbytes / CD_FRAME_SIZE) * CD_MAX_SECTOR_DATA); + if (ret != CHDERR_NONE) + return ret; + +#ifdef WANT_SUBCODE + ret = zlib_codec_init(&cdlz->subcode_decompressor, (hunkbytes / CD_FRAME_SIZE) * CD_MAX_SECTOR_DATA); + if (ret != CHDERR_NONE) + return ret; +#endif + + return CHDERR_NONE; +} + +void cdlz_codec_free(void* codec) +{ + cdlz_codec_data* cdlz = (cdlz_codec_data*) codec; + + lzma_codec_free(&cdlz->base_decompressor); +#ifdef WANT_SUBCODE + zlib_codec_free(&cdlz->subcode_decompressor); +#endif + if (cdlz->buffer) + free(cdlz->buffer); +} + +chd_error cdlz_codec_decompress(void *codec, const uint8_t *src, uint32_t complen, uint8_t *dest, uint32_t destlen) +{ + uint32_t framenum; + cdlz_codec_data* cdlz = (cdlz_codec_data*)codec; + + // determine header bytes + uint32_t frames = destlen / CD_FRAME_SIZE; + uint32_t complen_bytes = (destlen < 65536) ? 2 : 3; + uint32_t ecc_bytes = (frames + 7) / 8; + uint32_t header_bytes = ecc_bytes + complen_bytes; + + // extract compressed length of base + uint32_t complen_base = (src[ecc_bytes + 0] << 8) | src[ecc_bytes + 1]; + if (complen_bytes > 2) + complen_base = (complen_base << 8) | src[ecc_bytes + 2]; + + // reset and decode + lzma_codec_decompress(&cdlz->base_decompressor, &src[header_bytes], complen_base, &cdlz->buffer[0], frames * CD_MAX_SECTOR_DATA); +#ifdef WANT_SUBCODE + zlib_codec_decompress(&cdlz->subcode_decompressor, &src[header_bytes + complen_base], complen - complen_base - header_bytes, &cdlz->buffer[frames * CD_MAX_SECTOR_DATA], frames * CD_MAX_SUBCODE_DATA); +#endif + + // reassemble the data + for (framenum = 0; framenum < frames; framenum++) + { + memcpy(&dest[framenum * CD_FRAME_SIZE], &cdlz->buffer[framenum * CD_MAX_SECTOR_DATA], CD_MAX_SECTOR_DATA); +#ifdef WANT_SUBCODE + memcpy(&dest[framenum * CD_FRAME_SIZE + CD_MAX_SECTOR_DATA], &cdlz->buffer[frames * CD_MAX_SECTOR_DATA + framenum * CD_MAX_SUBCODE_DATA], CD_MAX_SUBCODE_DATA); +#endif + +#ifdef WANT_RAW_DATA_SECTOR + // reconstitute the ECC data and sync header + uint8_t *sector = &dest[framenum * CD_FRAME_SIZE]; + if ((src[framenum / 8] & (1 << (framenum % 8))) != 0) + { + memcpy(sector, s_cd_sync_header, sizeof(s_cd_sync_header)); + ecc_generate(sector); + } +#endif + } + return CHDERR_NONE; +} + + +// cdzl + +chd_error cdzl_codec_init(void *codec, uint32_t hunkbytes) +{ + chd_error ret; + cdzl_codec_data* cdzl = (cdzl_codec_data*)codec; + + // make sure the CHD's hunk size is an even multiple of the frame size + if (hunkbytes % CD_FRAME_SIZE != 0) + return CHDERR_CODEC_ERROR; + + cdzl->buffer = (uint8_t*)malloc(sizeof(uint8_t) * hunkbytes); + if (cdzl->buffer == NULL) + return CHDERR_OUT_OF_MEMORY; + + ret = zlib_codec_init(&cdzl->base_decompressor, (hunkbytes / CD_FRAME_SIZE) * CD_MAX_SECTOR_DATA); + if (ret != CHDERR_NONE) + return ret; + +#ifdef WANT_SUBCODE + ret = zlib_codec_init(&cdzl->subcode_decompressor, (hunkbytes / CD_FRAME_SIZE) * CD_MAX_SECTOR_DATA); + if (ret != CHDERR_NONE) + return ret; +#endif + + return CHDERR_NONE; +} + +void cdzl_codec_free(void *codec) +{ + cdzl_codec_data* cdzl = (cdzl_codec_data*)codec; + + zlib_codec_free(&cdzl->base_decompressor); +#ifdef WANT_SUBCODE + zlib_codec_free(&cdzl->subcode_decompressor); +#endif + if (cdzl->buffer) + free(cdzl->buffer); +} + +chd_error cdzl_codec_decompress(void *codec, const uint8_t *src, uint32_t complen, uint8_t *dest, uint32_t destlen) +{ + uint32_t framenum; + cdzl_codec_data* cdzl = (cdzl_codec_data*)codec; + + // determine header bytes + uint32_t frames = destlen / CD_FRAME_SIZE; + uint32_t complen_bytes = (destlen < 65536) ? 2 : 3; + uint32_t ecc_bytes = (frames + 7) / 8; + uint32_t header_bytes = ecc_bytes + complen_bytes; + + // extract compressed length of base + uint32_t complen_base = (src[ecc_bytes + 0] << 8) | src[ecc_bytes + 1]; + if (complen_bytes > 2) + complen_base = (complen_base << 8) | src[ecc_bytes + 2]; + + // reset and decode + zlib_codec_decompress(&cdzl->base_decompressor, &src[header_bytes], complen_base, &cdzl->buffer[0], frames * CD_MAX_SECTOR_DATA); +#ifdef WANT_SUBCODE + zlib_codec_decompress(&cdzl->subcode_decompressor, &src[header_bytes + complen_base], complen - complen_base - header_bytes, &cdzl->buffer[frames * CD_MAX_SECTOR_DATA], frames * CD_MAX_SUBCODE_DATA); +#endif + + // reassemble the data + for (framenum = 0; framenum < frames; framenum++) + { + memcpy(&dest[framenum * CD_FRAME_SIZE], &cdzl->buffer[framenum * CD_MAX_SECTOR_DATA], CD_MAX_SECTOR_DATA); +#ifdef WANT_SUBCODE + memcpy(&dest[framenum * CD_FRAME_SIZE + CD_MAX_SECTOR_DATA], &cdzl->buffer[frames * CD_MAX_SECTOR_DATA + framenum * CD_MAX_SUBCODE_DATA], CD_MAX_SUBCODE_DATA); +#endif + +#ifdef WANT_RAW_DATA_SECTOR + // reconstitute the ECC data and sync header + uint8_t *sector = &dest[framenum * CD_FRAME_SIZE]; + if ((src[framenum / 8] & (1 << (framenum % 8))) != 0) + { + memcpy(sector, s_cd_sync_header, sizeof(s_cd_sync_header)); + ecc_generate(sector); + } +#endif + } + return CHDERR_NONE; +} + +//************************************************************************** +// CD FLAC DECOMPRESSOR +//************************************************************************** + + + +//------------------------------------------------------ +// cdfl_codec_blocksize - return the optimal block size +//------------------------------------------------------ + +static uint32_t cdfl_codec_blocksize(uint32_t bytes) +{ + // determine FLAC block size, which must be 16-65535 + // clamp to 2k since that's supposed to be the sweet spot + uint32_t hunkbytes = bytes / 4; + while (hunkbytes > 2048) + hunkbytes /= 2; + return hunkbytes; +} + +chd_error cdfl_codec_init(void *codec, uint32_t hunkbytes) +{ + cdfl_codec_data *cdfl = (cdfl_codec_data*)codec; + + // make sure the CHD's hunk size is an even multiple of the frame size + if (hunkbytes % CD_FRAME_SIZE != 0) + return CHDERR_CODEC_ERROR; + + cdfl->buffer = (uint8_t*)malloc(sizeof(uint8_t) * hunkbytes); + if (cdfl->buffer == NULL) + return CHDERR_OUT_OF_MEMORY; + + // determine whether we want native or swapped samples + uint16_t native_endian = 0; + *(uint8_t *)(&native_endian) = 1; + cdfl->swap_endian = (native_endian & 1); + +#ifdef WANT_SUBCODE + // init zlib inflater + chd_error ret = zlib_codec_init(&cdfl->subcode_decompressor, (hunkbytes / CD_FRAME_SIZE) * CD_MAX_SECTOR_DATA); + if (ret != CHDERR_NONE) + return ret; +#endif + + // flac decoder init + flac_decoder_init(&cdfl->decoder); + if (cdfl->decoder.decoder == NULL) + return CHDERR_OUT_OF_MEMORY; + + return CHDERR_NONE; +} + +void cdfl_codec_free(void *codec) +{ + cdfl_codec_data *cdfl = (cdfl_codec_data*)codec; + flac_decoder_free(&cdfl->decoder); +#ifdef WANT_SUBCODE + zlib_codec_free(&cdfl->subcode_decompressor); +#endif + if (cdfl->buffer) + free(cdfl->buffer); +} + +chd_error cdfl_codec_decompress(void *codec, const uint8_t *src, uint32_t complen, uint8_t *dest, uint32_t destlen) +{ + uint32_t framenum; + cdfl_codec_data *cdfl = (cdfl_codec_data*)codec; + + // reset and decode + uint32_t frames = destlen / CD_FRAME_SIZE; + if (!flac_decoder_reset(&cdfl->decoder, 44100, 2, cdfl_codec_blocksize(frames * CD_MAX_SECTOR_DATA), src, complen)) + return CHDERR_DECOMPRESSION_ERROR; + uint8_t *buffer = &cdfl->buffer[0]; + if (!flac_decoder_decode_interleaved(&cdfl->decoder, (int16_t *)(buffer), frames * CD_MAX_SECTOR_DATA/4, cdfl->swap_endian)) + return CHDERR_DECOMPRESSION_ERROR; + +#ifdef WANT_SUBCODE + // inflate the subcode data + uint32_t offset = flac_decoder_finish(&cdfl->decoder); + chd_error ret = zlib_codec_decompress(&cdfl->subcode_decompressor, src + offset, complen - offset, &cdfl->buffer[frames * CD_MAX_SECTOR_DATA], frames * CD_MAX_SUBCODE_DATA); + if (ret != CHDERR_NONE) + return ret; +#else + flac_decoder_finish(&cdfl->decoder); +#endif + + // reassemble the data + for (framenum = 0; framenum < frames; framenum++) + { + memcpy(&dest[framenum * CD_FRAME_SIZE], &cdfl->buffer[framenum * CD_MAX_SECTOR_DATA], CD_MAX_SECTOR_DATA); +#ifdef WANT_SUBCODE + memcpy(&dest[framenum * CD_FRAME_SIZE + CD_MAX_SECTOR_DATA], &cdfl->buffer[frames * CD_MAX_SECTOR_DATA + framenum * CD_MAX_SUBCODE_DATA], CD_MAX_SUBCODE_DATA); +#endif + } + + return CHDERR_NONE; +} +/*************************************************************************** + CODEC INTERFACES +***************************************************************************/ + +#define CHD_MAKE_TAG(a,b,c,d) (((a) << 24) | ((b) << 16) | ((c) << 8) | (d)) + +// general codecs with CD frontend +#define CHD_CODEC_CD_ZLIB CHD_MAKE_TAG('c','d','z','l') +#define CHD_CODEC_CD_LZMA CHD_MAKE_TAG('c','d','l','z') +#define CHD_CODEC_CD_FLAC CHD_MAKE_TAG('c','d','f','l') + +static const codec_interface codec_interfaces[] = +{ + /* "none" or no compression */ + { + CHDCOMPRESSION_NONE, + "none", + FALSE, + NULL, + NULL, + NULL, + NULL + }, + + /* standard zlib compression */ + { + CHDCOMPRESSION_ZLIB, + "zlib", + FALSE, + zlib_codec_init, + zlib_codec_free, + zlib_codec_decompress, + NULL + }, + + /* zlib+ compression */ + { + CHDCOMPRESSION_ZLIB_PLUS, + "zlib+", + FALSE, + zlib_codec_init, + zlib_codec_free, + zlib_codec_decompress, + NULL + }, + + /* V5 CD zlib compression */ + { + CHD_CODEC_CD_ZLIB, + "cdzl (CD Deflate)", + FALSE, + cdzl_codec_init, + cdzl_codec_free, + cdzl_codec_decompress, + NULL + }, + + /* V5 CD lzma compression */ + { + CHD_CODEC_CD_LZMA, + "cdlz (CD LZMA)", + FALSE, + cdlz_codec_init, + cdlz_codec_free, + cdlz_codec_decompress, + NULL + }, + + /* V5 CD flac compression */ + { + CHD_CODEC_CD_FLAC, + "cdfl (CD FLAC)", + FALSE, + cdfl_codec_init, + cdfl_codec_free, + cdfl_codec_decompress, + NULL + }, +}; + +/*************************************************************************** + INLINE FUNCTIONS +***************************************************************************/ + +/*------------------------------------------------- + get_bigendian_uint64 - fetch a UINT64 from + the data stream in bigendian order +-------------------------------------------------*/ + +static inline UINT64 get_bigendian_uint64(const UINT8 *base) +{ + return ((UINT64)base[0] << 56) | ((UINT64)base[1] << 48) | ((UINT64)base[2] << 40) | ((UINT64)base[3] << 32) | + ((UINT64)base[4] << 24) | ((UINT64)base[5] << 16) | ((UINT64)base[6] << 8) | (UINT64)base[7]; +} + + +/*------------------------------------------------- + put_bigendian_uint64 - write a UINT64 to + the data stream in bigendian order +-------------------------------------------------*/ + +static inline void put_bigendian_uint64(UINT8 *base, UINT64 value) +{ + base[0] = value >> 56; + base[1] = value >> 48; + base[2] = value >> 40; + base[3] = value >> 32; + base[4] = value >> 24; + base[5] = value >> 16; + base[6] = value >> 8; + base[7] = value; +} + +/*------------------------------------------------- + get_bigendian_uint48 - fetch a UINT48 from + the data stream in bigendian order +-------------------------------------------------*/ + +static inline UINT64 get_bigendian_uint48(const UINT8 *base) +{ + return ((UINT64)base[0] << 40) | ((UINT64)base[1] << 32) | + ((UINT64)base[2] << 24) | ((UINT64)base[3] << 16) | ((UINT64)base[4] << 8) | (UINT64)base[5]; +} + +/*------------------------------------------------- + put_bigendian_uint48 - write a UINT48 to + the data stream in bigendian order +-------------------------------------------------*/ + +static inline void put_bigendian_uint48(UINT8 *base, UINT64 value) +{ + value &= 0xffffffffffff; + base[0] = value >> 40; + base[1] = value >> 32; + base[2] = value >> 24; + base[3] = value >> 16; + base[4] = value >> 8; + base[5] = value; +} +/*------------------------------------------------- + get_bigendian_uint32 - fetch a UINT32 from + the data stream in bigendian order +-------------------------------------------------*/ + +static inline UINT32 get_bigendian_uint32(const UINT8 *base) +{ + return (base[0] << 24) | (base[1] << 16) | (base[2] << 8) | base[3]; +} + + +/*------------------------------------------------- + put_bigendian_uint32 - write a UINT32 to + the data stream in bigendian order +-------------------------------------------------*/ + +static inline void put_bigendian_uint24(UINT8 *base, UINT32 value) +{ + value &= 0xffffff; + base[0] = value >> 16; + base[1] = value >> 8; + base[2] = value; +} + + +/*------------------------------------------------- + put_bigendian_uint24 - write a UINT24 to + the data stream in bigendian order +-------------------------------------------------*/ + +static inline void put_bigendian_uint32(UINT8 *base, UINT32 value) +{ + value &= 0xffffff; + base[0] = value >> 16; + base[1] = value >> 8; + base[2] = value; +} + +/*------------------------------------------------- + get_bigendian_uint24 - fetch a UINT24 from + the data stream in bigendian order +-------------------------------------------------*/ + +static inline UINT32 get_bigendian_uint24(const UINT8 *base) +{ + return (base[0] << 16) | (base[1] << 8) | base[2]; +} + +/*------------------------------------------------- + get_bigendian_uint16 - fetch a UINT16 from + the data stream in bigendian order +-------------------------------------------------*/ + +static inline UINT16 get_bigendian_uint16(const UINT8 *base) +{ + return (base[0] << 8) | base[1]; +} + + +/*------------------------------------------------- + put_bigendian_uint16 - write a UINT16 to + the data stream in bigendian order +-------------------------------------------------*/ + +static inline void put_bigendian_uint16(UINT8 *base, UINT16 value) +{ + base[0] = value >> 8; + base[1] = value; +} + + +/*------------------------------------------------- + map_extract - extract a single map + entry from the datastream +-------------------------------------------------*/ + +static inline void map_extract(const UINT8 *base, map_entry *entry) +{ + entry->offset = get_bigendian_uint64(&base[0]); + entry->crc = get_bigendian_uint32(&base[8]); + entry->length = get_bigendian_uint16(&base[12]) | (base[14] << 16); + entry->flags = base[15]; +} + + +/*------------------------------------------------- + map_assemble - write a single map + entry to the datastream +-------------------------------------------------*/ + +static inline void map_assemble(UINT8 *base, map_entry *entry) +{ + put_bigendian_uint64(&base[0], entry->offset); + put_bigendian_uint32(&base[8], entry->crc); + put_bigendian_uint16(&base[12], entry->length); + base[14] = entry->length >> 16; + base[15] = entry->flags; +} + +/*------------------------------------------------- + map_size_v5 - calculate CHDv5 map size +-------------------------------------------------*/ +static inline int map_size_v5(chd_header* header) +{ + return header->hunkcount * header->mapentrybytes; +} + + +/*------------------------------------------------- + crc16 - calculate CRC16 (from hashing.cpp) +-------------------------------------------------*/ +uint16_t crc16(const void *data, uint32_t length) +{ + uint16_t crc = 0xffff; + + static const uint16_t s_table[256] = + { + 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, + 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, + 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, + 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, + 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485, + 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, + 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4, + 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, + 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, + 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, + 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, + 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, + 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, + 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, + 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, + 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, + 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, + 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067, + 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, + 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, + 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, + 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, + 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c, + 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634, + 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, + 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3, + 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, + 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, + 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, + 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, + 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, + 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0 + }; + + const uint8_t *src = (uint8_t*)data; + + // fetch the current value into a local and rip through the source data + while (length-- != 0) + crc = (crc << 8) ^ s_table[(crc >> 8) ^ *src++]; + return crc; +} + +/*------------------------------------------------- + decompress_v5_map - decompress the v5 map +-------------------------------------------------*/ + +static chd_error decompress_v5_map(chd_file* chd, chd_header* header) +{ + if (header->mapoffset == 0) + { + //memset(header->rawmap, 0xff,map_size_v5(header)); + return CHDERR_READ_ERROR; + } + + // read the reader + uint8_t rawbuf[16]; + core_fseek(chd->file, header->mapoffset, SEEK_SET); + core_fread(chd->file, rawbuf, sizeof(rawbuf)); + uint32_t const mapbytes = get_bigendian_uint32(&rawbuf[0]); + uint64_t const firstoffs = get_bigendian_uint48(&rawbuf[4]); + uint16_t const mapcrc = get_bigendian_uint16(&rawbuf[10]); + uint8_t const lengthbits = rawbuf[12]; + uint8_t const selfbits = rawbuf[13]; + uint8_t const parentbits = rawbuf[14]; + + // now read the map + uint8_t* compressed = (uint8_t*)malloc(sizeof(uint8_t) * mapbytes); + if (compressed == NULL) + return CHDERR_OUT_OF_MEMORY; + + core_fseek(chd->file, header->mapoffset + 16, SEEK_SET); + core_fread(chd->file, compressed, mapbytes); + struct bitstream* bitbuf = create_bitstream(compressed, sizeof(uint8_t) * mapbytes); + if (bitbuf == NULL) + { + free(compressed); + return CHDERR_OUT_OF_MEMORY; + } + + header->rawmap = (uint8_t*)malloc(sizeof(uint8_t) * map_size_v5(header)); + if (header->rawmap == NULL) + { + free(compressed); + free(bitbuf); + return CHDERR_OUT_OF_MEMORY; + } + + // first decode the compression types + struct huffman_decoder* decoder = create_huffman_decoder(16, 8); + if (decoder == NULL) + { + free(compressed); + free(bitbuf); + return CHDERR_OUT_OF_MEMORY; + } + + enum huffman_error err = huffman_import_tree_rle(decoder, bitbuf); + if (err != HUFFERR_NONE) + { + free(compressed); + free(bitbuf); + delete_huffman_decoder(decoder); + return CHDERR_DECOMPRESSION_ERROR; + } + + uint8_t lastcomp = 0; + int hunknum, repcount = 0; + for (hunknum = 0; hunknum < header->hunkcount; hunknum++) + { + uint8_t *rawmap = header->rawmap + (hunknum * 12); + if (repcount > 0) + rawmap[0] = lastcomp, repcount--; + else + { + uint8_t val = huffman_decode_one(decoder, bitbuf); + if (val == COMPRESSION_RLE_SMALL) + rawmap[0] = lastcomp, repcount = 2 + huffman_decode_one(decoder, bitbuf); + else if (val == COMPRESSION_RLE_LARGE) + rawmap[0] = lastcomp, repcount = 2 + 16 + (huffman_decode_one(decoder, bitbuf) << 4), repcount += huffman_decode_one(decoder, bitbuf); + else + rawmap[0] = lastcomp = val; + } + } + + // then iterate through the hunks and extract the needed data + uint64_t curoffset = firstoffs; + uint32_t last_self = 0; + uint64_t last_parent = 0; + for (hunknum = 0; hunknum < header->hunkcount; hunknum++) + { + uint8_t *rawmap = header->rawmap + (hunknum * 12); + uint64_t offset = curoffset; + uint32_t length = 0; + uint16_t crc = 0; + switch (rawmap[0]) + { + // base types + case COMPRESSION_TYPE_0: + case COMPRESSION_TYPE_1: + case COMPRESSION_TYPE_2: + case COMPRESSION_TYPE_3: + curoffset += length = bitstream_read(bitbuf, lengthbits); + crc = bitstream_read(bitbuf, 16); + break; + + case COMPRESSION_NONE: + curoffset += length = header->hunkbytes; + crc = bitstream_read(bitbuf, 16); + break; + + case COMPRESSION_SELF: + last_self = offset = bitstream_read(bitbuf, selfbits); + break; + + case COMPRESSION_PARENT: + offset = bitstream_read(bitbuf, parentbits); + last_parent = offset; + break; + + // pseudo-types; convert into base types + case COMPRESSION_SELF_1: + last_self++; + case COMPRESSION_SELF_0: + rawmap[0] = COMPRESSION_SELF; + offset = last_self; + break; + + case COMPRESSION_PARENT_SELF: + rawmap[0] = COMPRESSION_PARENT; + last_parent = offset = ( ((uint64_t)hunknum) * ((uint64_t)header->hunkbytes) ) / header->unitbytes; + break; + + case COMPRESSION_PARENT_1: + last_parent += header->hunkbytes / header->unitbytes; + case COMPRESSION_PARENT_0: + rawmap[0] = COMPRESSION_PARENT; + offset = last_parent; + break; + } + // UINT24 length + put_bigendian_uint24(&rawmap[1], length); + + // UINT48 offset + put_bigendian_uint48(&rawmap[4], offset); + + // crc16 + put_bigendian_uint16(&rawmap[10], crc); + } + + // free memory + free(compressed); + free(bitbuf); + delete_huffman_decoder(decoder); + + // verify the final CRC + if (crc16(&header->rawmap[0], header->hunkcount * 12) != mapcrc) + return CHDERR_DECOMPRESSION_ERROR; + + return CHDERR_NONE; +} + +/*------------------------------------------------- + map_extract_old - extract a single map + entry in old format from the datastream +-------------------------------------------------*/ + +static inline void map_extract_old(const UINT8 *base, map_entry *entry, UINT32 hunkbytes) +{ + entry->offset = get_bigendian_uint64(&base[0]); + entry->crc = 0; + entry->length = entry->offset >> 44; + entry->flags = MAP_ENTRY_FLAG_NO_CRC | ((entry->length == hunkbytes) ? V34_MAP_ENTRY_TYPE_UNCOMPRESSED : V34_MAP_ENTRY_TYPE_COMPRESSED); +#ifdef __MWERKS__ + entry->offset = entry->offset & 0x00000FFFFFFFFFFFLL; +#else + entry->offset = (entry->offset << 20) >> 20; +#endif +} + + +/*************************************************************************** + CHD FILE MANAGEMENT +***************************************************************************/ + + +/*------------------------------------------------- + chd_open_file - open a CHD file for access +-------------------------------------------------*/ + +chd_error chd_open_file(core_file *file, int mode, chd_file *parent, chd_file **chd) +{ + chd_file *newchd = NULL; + chd_error err; + int intfnum; + + /* verify parameters */ + if (file == NULL) + EARLY_EXIT(err = CHDERR_INVALID_PARAMETER); + + /* punt if invalid parent */ + if (parent != NULL && parent->cookie != COOKIE_VALUE) + EARLY_EXIT(err = CHDERR_INVALID_PARAMETER); + + /* allocate memory for the final result */ + newchd = (chd_file *)malloc(sizeof(**chd)); + if (newchd == NULL) + EARLY_EXIT(err = CHDERR_OUT_OF_MEMORY); + memset(newchd, 0, sizeof(*newchd)); + newchd->cookie = COOKIE_VALUE; + newchd->parent = parent; + newchd->file = file; + + /* now attempt to read the header */ + err = header_read(newchd->file, &newchd->header); + if (err != CHDERR_NONE) + EARLY_EXIT(err); + + /* validate the header */ + err = header_validate(&newchd->header); + if (err != CHDERR_NONE) + EARLY_EXIT(err); + + /* make sure we don't open a read-only file writeable */ + if (mode == CHD_OPEN_READWRITE && !(newchd->header.flags & CHDFLAGS_IS_WRITEABLE)) + EARLY_EXIT(err = CHDERR_FILE_NOT_WRITEABLE); + + /* also, never open an older version writeable */ + if (mode == CHD_OPEN_READWRITE && newchd->header.version < CHD_HEADER_VERSION) + EARLY_EXIT(err = CHDERR_UNSUPPORTED_VERSION); + + /* if we need a parent, make sure we have one */ + if (parent == NULL && (newchd->header.flags & CHDFLAGS_HAS_PARENT)) + EARLY_EXIT(err = CHDERR_REQUIRES_PARENT); + + /* make sure we have a valid parent */ + if (parent != NULL) + { + /* check MD5 if it isn't empty */ + if (memcmp(nullmd5, newchd->header.parentmd5, sizeof(newchd->header.parentmd5)) != 0 && + memcmp(nullmd5, newchd->parent->header.md5, sizeof(newchd->parent->header.md5)) != 0 && + memcmp(newchd->parent->header.md5, newchd->header.parentmd5, sizeof(newchd->header.parentmd5)) != 0) + EARLY_EXIT(err = CHDERR_INVALID_PARENT); + + /* check SHA1 if it isn't empty */ + if (memcmp(nullsha1, newchd->header.parentsha1, sizeof(newchd->header.parentsha1)) != 0 && + memcmp(nullsha1, newchd->parent->header.sha1, sizeof(newchd->parent->header.sha1)) != 0 && + memcmp(newchd->parent->header.sha1, newchd->header.parentsha1, sizeof(newchd->header.parentsha1)) != 0) + EARLY_EXIT(err = CHDERR_INVALID_PARENT); + } + + /* now read the hunk map */ + if (newchd->header.version < 5) + { + err = map_read(newchd); + if (err != CHDERR_NONE) + EARLY_EXIT(err); + } + else + { + err = decompress_v5_map(newchd, &(newchd->header)); + } + +#ifdef NEED_CACHE_HUNK + /* allocate and init the hunk cache */ + newchd->cache = (UINT8 *)malloc(newchd->header.hunkbytes); + newchd->compare = (UINT8 *)malloc(newchd->header.hunkbytes); + if (newchd->cache == NULL || newchd->compare == NULL) + EARLY_EXIT(err = CHDERR_OUT_OF_MEMORY); + newchd->cachehunk = ~0; + newchd->comparehunk = ~0; +#endif + + /* allocate the temporary compressed buffer */ + newchd->compressed = (UINT8 *)malloc(newchd->header.hunkbytes); + if (newchd->compressed == NULL) + EARLY_EXIT(err = CHDERR_OUT_OF_MEMORY); + + /* find the codec interface */ + if (newchd->header.version < 5) + { + for (intfnum = 0; intfnum < ARRAY_LENGTH(codec_interfaces); intfnum++) + if (codec_interfaces[intfnum].compression == newchd->header.compression[0]) + { + newchd->codecintf[0] = &codec_interfaces[intfnum]; + break; + } + if (intfnum == ARRAY_LENGTH(codec_interfaces)) + EARLY_EXIT(err = CHDERR_UNSUPPORTED_FORMAT); + + /* initialize the codec */ + if (newchd->codecintf[0]->init != NULL) + err = (*newchd->codecintf[0]->init)(&newchd->zlib_codec_data, newchd->header.hunkbytes); + } + else + { + int i, decompnum; + // verify the compression types and initialize the codecs + for (decompnum = 0; decompnum < ARRAY_LENGTH(newchd->header.compression); decompnum++) + { + for (i = 0 ; i < ARRAY_LENGTH(codec_interfaces) ; i++) + { + if (codec_interfaces[i].compression == newchd->header.compression[decompnum]) + { + newchd->codecintf[decompnum] = &codec_interfaces[i]; + if (newchd->codecintf[decompnum] == NULL && newchd->header.compression[decompnum] != 0) + err = CHDERR_UNSUPPORTED_FORMAT; + + /* initialize the codec */ + if (newchd->codecintf[decompnum]->init != NULL) + { + void* codec = NULL; + switch (newchd->header.compression[decompnum]) + { + case CHD_CODEC_CD_ZLIB: + codec = &newchd->cdzl_codec_data; + break; + + case CHD_CODEC_CD_LZMA: + codec = &newchd->cdlz_codec_data; + break; + + case CHD_CODEC_CD_FLAC: + codec = &newchd->cdfl_codec_data; + break; + } + if (codec != NULL) + err = (*newchd->codecintf[decompnum]->init)(codec, newchd->header.hunkbytes); + } + + } + } + } + } + + // HACK + //if (err != CHDERR_NONE) + // EARLY_EXIT(err); + + /* all done */ + *chd = newchd; + return CHDERR_NONE; + +cleanup: + if (newchd != NULL) + chd_close(newchd); + return err; +} + +/*------------------------------------------------- + chd_open - open a CHD file by + filename +-------------------------------------------------*/ + +chd_error chd_open(const char *filename, int mode, chd_file *parent, chd_file **chd) +{ + chd_error err; + core_file *file = NULL; + + /* choose the proper mode */ + switch(mode) + { + case CHD_OPEN_READ: + break; + + default: + err = CHDERR_INVALID_PARAMETER; + goto cleanup; + } + + /* open the file */ + file = core_fopen(filename); + if (file == 0) + { + err = CHDERR_FILE_NOT_FOUND; + goto cleanup; + } + + /* now open the CHD */ + err = chd_open_file(file, mode, parent, chd); + if (err != CHDERR_NONE) + goto cleanup; + + /* we now own this file */ + (*chd)->owns_file = TRUE; + +cleanup: + if ((err != CHDERR_NONE) && (file != NULL)) + core_fclose(file); + return err; +} + + +/*------------------------------------------------- + chd_close - close a CHD file for access +-------------------------------------------------*/ + +void chd_close(chd_file *chd) +{ + /* punt if NULL or invalid */ + if (chd == NULL || chd->cookie != COOKIE_VALUE) + return; + + /* deinit the codec */ + if (chd->header.version < 5) + { + if (chd->codecintf[0] != NULL && chd->codecintf[0]->free != NULL) + (*chd->codecintf[0]->free)(&chd->zlib_codec_data); + } + else + { + int i; + // Free the codecs + for (i = 0 ; i < 4 ; i++) + { + void* codec = NULL; + switch (chd->codecintf[i]->compression) + { + case CHD_CODEC_CD_LZMA: + codec = &chd->cdlz_codec_data; + break; + + case CHD_CODEC_CD_ZLIB: + codec = &chd->cdzl_codec_data; + break; + + case CHD_CODEC_CD_FLAC: + codec = &chd->cdfl_codec_data; + break; + } + if (codec) + { + (*chd->codecintf[i]->free)(codec); + } + } + + // Free the raw map + if (chd->header.rawmap != NULL) + free(chd->header.rawmap); + } + + /* free the compressed data buffer */ + if (chd->compressed != NULL) + free(chd->compressed); + +#ifdef NEED_CACHE_HUNK + /* free the hunk cache and compare data */ + if (chd->compare != NULL) + free(chd->compare); + if (chd->cache != NULL) + free(chd->cache); +#endif + + /* free the hunk map */ + if (chd->map != NULL) + free(chd->map); + + /* close the file */ + if (chd->owns_file && chd->file != NULL) + core_fclose(chd->file); + +#ifdef NEED_CACHE_HUNK + if (PRINTF_MAX_HUNK) printf("Max hunk = %d/%d\n", chd->maxhunk, chd->header.totalhunks); +#endif + + /* free our memory */ + free(chd); +} + + +/*------------------------------------------------- + chd_core_file - return the associated + core_file +-------------------------------------------------*/ + +core_file *chd_core_file(chd_file *chd) +{ + return chd->file; +} + + +/*------------------------------------------------- + chd_error_string - return an error string for + the given CHD error +-------------------------------------------------*/ + +const char *chd_error_string(chd_error err) +{ + switch (err) + { + case CHDERR_NONE: return "no error"; + case CHDERR_NO_INTERFACE: return "no drive interface"; + case CHDERR_OUT_OF_MEMORY: return "out of memory"; + case CHDERR_INVALID_FILE: return "invalid file"; + case CHDERR_INVALID_PARAMETER: return "invalid parameter"; + case CHDERR_INVALID_DATA: return "invalid data"; + case CHDERR_FILE_NOT_FOUND: return "file not found"; + case CHDERR_REQUIRES_PARENT: return "requires parent"; + case CHDERR_FILE_NOT_WRITEABLE: return "file not writeable"; + case CHDERR_READ_ERROR: return "read error"; + case CHDERR_WRITE_ERROR: return "write error"; + case CHDERR_CODEC_ERROR: return "codec error"; + case CHDERR_INVALID_PARENT: return "invalid parent"; + case CHDERR_HUNK_OUT_OF_RANGE: return "hunk out of range"; + case CHDERR_DECOMPRESSION_ERROR: return "decompression error"; + case CHDERR_COMPRESSION_ERROR: return "compression error"; + case CHDERR_CANT_CREATE_FILE: return "can't create file"; + case CHDERR_CANT_VERIFY: return "can't verify file"; + case CHDERR_NOT_SUPPORTED: return "operation not supported"; + case CHDERR_METADATA_NOT_FOUND: return "can't find metadata"; + case CHDERR_INVALID_METADATA_SIZE: return "invalid metadata size"; + case CHDERR_UNSUPPORTED_VERSION: return "unsupported CHD version"; + case CHDERR_VERIFY_INCOMPLETE: return "incomplete verify"; + case CHDERR_INVALID_METADATA: return "invalid metadata"; + case CHDERR_INVALID_STATE: return "invalid state"; + case CHDERR_OPERATION_PENDING: return "operation pending"; + case CHDERR_NO_ASYNC_OPERATION: return "no async operation in progress"; + case CHDERR_UNSUPPORTED_FORMAT: return "unsupported format"; + default: return "undocumented error"; + } +} + + + +/*************************************************************************** + CHD HEADER MANAGEMENT +***************************************************************************/ + +/*------------------------------------------------- + chd_get_header - return a pointer to the + extracted header data +-------------------------------------------------*/ + +const chd_header *chd_get_header(chd_file *chd) +{ + /* punt if NULL or invalid */ + if (chd == NULL || chd->cookie != COOKIE_VALUE) + return NULL; + + return &chd->header; +} + + + +/*************************************************************************** + CORE DATA READ/WRITE +***************************************************************************/ + +/*------------------------------------------------- + chd_read - read a single hunk from the CHD + file +-------------------------------------------------*/ + +chd_error chd_read(chd_file *chd, UINT32 hunknum, void *buffer) +{ + /* punt if NULL or invalid */ + if (chd == NULL || chd->cookie != COOKIE_VALUE) + return CHDERR_INVALID_PARAMETER; + + /* perform the read */ + return hunk_read_into_memory(chd, hunknum, (UINT8 *)buffer); +} + + + + + +/*************************************************************************** + METADATA MANAGEMENT +***************************************************************************/ + +/*------------------------------------------------- + chd_get_metadata - get the indexed metadata + of the given type +-------------------------------------------------*/ + +chd_error chd_get_metadata(chd_file *chd, UINT32 searchtag, UINT32 searchindex, void *output, UINT32 outputlen, UINT32 *resultlen, UINT32 *resulttag, UINT8 *resultflags) +{ + metadata_entry metaentry; + chd_error err; + UINT32 count; + + /* if we didn't find it, just return */ + err = metadata_find_entry(chd, searchtag, searchindex, &metaentry); + if (err != CHDERR_NONE) + { + /* unless we're an old version and they are requesting hard disk metadata */ + if (chd->header.version < 3 && (searchtag == HARD_DISK_METADATA_TAG || searchtag == CHDMETATAG_WILDCARD) && searchindex == 0) + { + char faux_metadata[256]; + UINT32 faux_length; + + /* fill in the faux metadata */ + sprintf(faux_metadata, HARD_DISK_METADATA_FORMAT, chd->header.obsolete_cylinders, chd->header.obsolete_heads, chd->header.obsolete_sectors, chd->header.hunkbytes / chd->header.obsolete_hunksize); + faux_length = (UINT32)strlen(faux_metadata) + 1; + + /* copy the metadata itself */ + memcpy(output, faux_metadata, MIN(outputlen, faux_length)); + + /* return the length of the data and the tag */ + if (resultlen != NULL) + *resultlen = faux_length; + if (resulttag != NULL) + *resulttag = HARD_DISK_METADATA_TAG; + return CHDERR_NONE; + } + return err; + } + + /* read the metadata */ + outputlen = MIN(outputlen, metaentry.length); + core_fseek(chd->file, metaentry.offset + METADATA_HEADER_SIZE, SEEK_SET); + count = core_fread(chd->file, output, outputlen); + if (count != outputlen) + return CHDERR_READ_ERROR; + + /* return the length of the data and the tag */ + if (resultlen != NULL) + *resultlen = metaentry.length; + if (resulttag != NULL) + *resulttag = metaentry.metatag; + if (resultflags != NULL) + *resultflags = metaentry.flags; + return CHDERR_NONE; +} + + + +/*************************************************************************** + CODEC INTERFACES +***************************************************************************/ + +/*------------------------------------------------- + chd_codec_config - set internal codec + parameters +-------------------------------------------------*/ + +chd_error chd_codec_config(chd_file *chd, int param, void *config) +{ + return CHDERR_INVALID_PARAMETER; +} + + +/*------------------------------------------------- + chd_get_codec_name - get the name of a + particular codec +-------------------------------------------------*/ + +const char *chd_get_codec_name(UINT32 codec) +{ + return "Unknown"; +} + + +/*************************************************************************** + INTERNAL HEADER OPERATIONS +***************************************************************************/ + +/*------------------------------------------------- + header_validate - check the validity of a + CHD header +-------------------------------------------------*/ + +static chd_error header_validate(const chd_header *header) +{ + int intfnum; + + /* require a valid version */ + if (header->version == 0 || header->version > CHD_HEADER_VERSION) + return CHDERR_UNSUPPORTED_VERSION; + + /* require a valid length */ + if ((header->version == 1 && header->length != CHD_V1_HEADER_SIZE) || + (header->version == 2 && header->length != CHD_V2_HEADER_SIZE) || + (header->version == 3 && header->length != CHD_V3_HEADER_SIZE) || + (header->version == 4 && header->length != CHD_V4_HEADER_SIZE) || + (header->version == 5 && header->length != CHD_V5_HEADER_SIZE)) + return CHDERR_INVALID_PARAMETER; + + /* Do not validate v5 header */ + if (header->version <= 4) + { + /* require valid flags */ + if (header->flags & CHDFLAGS_UNDEFINED) + return CHDERR_INVALID_PARAMETER; + + /* require a supported compression mechanism */ + for (intfnum = 0; intfnum < ARRAY_LENGTH(codec_interfaces); intfnum++) + if (codec_interfaces[intfnum].compression == header->compression[0]) + break; + + if (intfnum == ARRAY_LENGTH(codec_interfaces)) + return CHDERR_INVALID_PARAMETER; + + /* require a valid hunksize */ + if (header->hunkbytes == 0 || header->hunkbytes >= 65536 * 256) + return CHDERR_INVALID_PARAMETER; + + /* require a valid hunk count */ + if (header->totalhunks == 0) + return CHDERR_INVALID_PARAMETER; + + /* require a valid MD5 and/or SHA1 if we're using a parent */ + if ((header->flags & CHDFLAGS_HAS_PARENT) && memcmp(header->parentmd5, nullmd5, sizeof(nullmd5)) == 0 && memcmp(header->parentsha1, nullsha1, sizeof(nullsha1)) == 0) + return CHDERR_INVALID_PARAMETER; + + /* if we're V3 or later, the obsolete fields must be 0 */ + if (header->version >= 3 && + (header->obsolete_cylinders != 0 || header->obsolete_sectors != 0 || + header->obsolete_heads != 0 || header->obsolete_hunksize != 0)) + return CHDERR_INVALID_PARAMETER; + + /* if we're pre-V3, the obsolete fields must NOT be 0 */ + if (header->version < 3 && + (header->obsolete_cylinders == 0 || header->obsolete_sectors == 0 || + header->obsolete_heads == 0 || header->obsolete_hunksize == 0)) + return CHDERR_INVALID_PARAMETER; + } + + return CHDERR_NONE; +} + + +/*------------------------------------------------- + header_read - read a CHD header into the + internal data structure +-------------------------------------------------*/ + +static chd_error header_read(core_file *file, chd_header *header) +{ + UINT8 rawheader[CHD_MAX_HEADER_SIZE]; + UINT32 count; + + /* punt if NULL */ + if (header == NULL) + return CHDERR_INVALID_PARAMETER; + + /* punt if invalid file */ + if (file == NULL) + return CHDERR_INVALID_FILE; + + /* seek and read */ + core_fseek(file, 0, SEEK_SET); + count = core_fread(file, rawheader, sizeof(rawheader)); + if (count != sizeof(rawheader)) + return CHDERR_READ_ERROR; + + /* verify the tag */ + if (strncmp((char *)rawheader, "MComprHD", 8) != 0) + return CHDERR_INVALID_DATA; + + /* extract the direct data */ + memset(header, 0, sizeof(*header)); + header->length = get_bigendian_uint32(&rawheader[8]); + header->version = get_bigendian_uint32(&rawheader[12]); + + /* make sure it's a version we understand */ + if (header->version == 0 || header->version > CHD_HEADER_VERSION) + return CHDERR_UNSUPPORTED_VERSION; + + /* make sure the length is expected */ + if ((header->version == 1 && header->length != CHD_V1_HEADER_SIZE) || + (header->version == 2 && header->length != CHD_V2_HEADER_SIZE) || + (header->version == 3 && header->length != CHD_V3_HEADER_SIZE) || + (header->version == 4 && header->length != CHD_V4_HEADER_SIZE) || + (header->version == 5 && header->length != CHD_V5_HEADER_SIZE)) + + return CHDERR_INVALID_DATA; + + /* extract the common data */ + header->flags = get_bigendian_uint32(&rawheader[16]); + header->compression[0] = get_bigendian_uint32(&rawheader[20]); + + /* extract the V1/V2-specific data */ + if (header->version < 3) + { + int seclen = (header->version == 1) ? CHD_V1_SECTOR_SIZE : get_bigendian_uint32(&rawheader[76]); + header->obsolete_hunksize = get_bigendian_uint32(&rawheader[24]); + header->totalhunks = get_bigendian_uint32(&rawheader[28]); + header->obsolete_cylinders = get_bigendian_uint32(&rawheader[32]); + header->obsolete_heads = get_bigendian_uint32(&rawheader[36]); + header->obsolete_sectors = get_bigendian_uint32(&rawheader[40]); + memcpy(header->md5, &rawheader[44], CHD_MD5_BYTES); + memcpy(header->parentmd5, &rawheader[60], CHD_MD5_BYTES); + header->logicalbytes = (UINT64)header->obsolete_cylinders * (UINT64)header->obsolete_heads * (UINT64)header->obsolete_sectors * (UINT64)seclen; + header->hunkbytes = seclen * header->obsolete_hunksize; + header->metaoffset = 0; + } + + /* extract the V3-specific data */ + else if (header->version == 3) + { + header->totalhunks = get_bigendian_uint32(&rawheader[24]); + header->logicalbytes = get_bigendian_uint64(&rawheader[28]); + header->metaoffset = get_bigendian_uint64(&rawheader[36]); + memcpy(header->md5, &rawheader[44], CHD_MD5_BYTES); + memcpy(header->parentmd5, &rawheader[60], CHD_MD5_BYTES); + header->hunkbytes = get_bigendian_uint32(&rawheader[76]); + memcpy(header->sha1, &rawheader[80], CHD_SHA1_BYTES); + memcpy(header->parentsha1, &rawheader[100], CHD_SHA1_BYTES); + } + + /* extract the V4-specific data */ + else if (header->version == 4) + { + header->totalhunks = get_bigendian_uint32(&rawheader[24]); + header->logicalbytes = get_bigendian_uint64(&rawheader[28]); + header->metaoffset = get_bigendian_uint64(&rawheader[36]); + header->hunkbytes = get_bigendian_uint32(&rawheader[44]); + memcpy(header->sha1, &rawheader[48], CHD_SHA1_BYTES); + memcpy(header->parentsha1, &rawheader[68], CHD_SHA1_BYTES); + memcpy(header->rawsha1, &rawheader[88], CHD_SHA1_BYTES); + } + + /* extract the V5-specific data */ + else if (header->version == 5) + { + /* TODO */ + header->compression[0] = get_bigendian_uint32(&rawheader[16]); + header->compression[1] = get_bigendian_uint32(&rawheader[20]); + header->compression[2] = get_bigendian_uint32(&rawheader[24]); + header->compression[3] = get_bigendian_uint32(&rawheader[28]); + header->logicalbytes = get_bigendian_uint64(&rawheader[32]); + header->mapoffset = get_bigendian_uint64(&rawheader[40]); + header->metaoffset = get_bigendian_uint64(&rawheader[48]); + header->hunkbytes = get_bigendian_uint32(&rawheader[56]); + header->hunkcount = (header->logicalbytes + header->hunkbytes - 1) / header->hunkbytes; + header->unitbytes = get_bigendian_uint32(&rawheader[60]); + header->unitcount = (header->logicalbytes + header->unitbytes - 1) / header->unitbytes; + memcpy(header->sha1, &rawheader[84], CHD_SHA1_BYTES); + memcpy(header->parentsha1, &rawheader[104], CHD_SHA1_BYTES); + memcpy(header->rawsha1, &rawheader[64], CHD_SHA1_BYTES); + + // determine properties of map entries + header->mapentrybytes = 12; //TODO compressed() ? 12 : 4; + + // hack + header->totalhunks = header->hunkcount; + } + + /* Unknown version */ + else + { + /* TODO */ + } + + /* guess it worked */ + return CHDERR_NONE; +} + + +/*************************************************************************** + INTERNAL HUNK READ/WRITE +***************************************************************************/ + +#ifdef NEED_CACHE_HUNK +/*------------------------------------------------- + hunk_read_into_cache - read a hunk into + the CHD's hunk cache +-------------------------------------------------*/ + +static chd_error hunk_read_into_cache(chd_file *chd, UINT32 hunknum) +{ + chd_error err; + + /* track the max */ + if (hunknum > chd->maxhunk) + chd->maxhunk = hunknum; + + /* if we're already in the cache, we're done */ + if (chd->cachehunk == hunknum) + return CHDERR_NONE; + chd->cachehunk = ~0; + + /* otherwise, read the data */ + err = hunk_read_into_memory(chd, hunknum, chd->cache); + if (err != CHDERR_NONE) + return err; + + /* mark the hunk successfully cached in */ + chd->cachehunk = hunknum; + return CHDERR_NONE; +} +#endif + +/*------------------------------------------------- + hunk_read_into_memory - read a hunk into + memory at the given location +-------------------------------------------------*/ + +static chd_error hunk_read_into_memory(chd_file *chd, UINT32 hunknum, UINT8 *dest) +{ + chd_error err; + + // punt if no file + if (chd->file == NULL) + return CHDERR_INVALID_FILE; + + /* return an error if out of range */ + if (hunknum >= chd->header.totalhunks) + return CHDERR_HUNK_OUT_OF_RANGE; + + if (dest == NULL) + return CHDERR_INVALID_PARAMETER; + + if (chd->header.version < 5) + { + map_entry *entry = &chd->map[hunknum]; + UINT32 bytes; + + /* switch off the entry type */ + switch (entry->flags & MAP_ENTRY_FLAG_TYPE_MASK) + { + /* compressed data */ + case V34_MAP_ENTRY_TYPE_COMPRESSED: + + /* read it into the decompression buffer */ + core_fseek(chd->file, entry->offset, SEEK_SET); + bytes = core_fread(chd->file, chd->compressed, entry->length); + if (bytes != entry->length) + return CHDERR_READ_ERROR; + + /* now decompress using the codec */ + err = CHDERR_NONE; + void* codec = &chd->zlib_codec_data; + if (chd->codecintf[0]->decompress != NULL) + err = (*chd->codecintf[0]->decompress)(codec, chd->compressed, entry->length, dest, chd->header.hunkbytes); + if (err != CHDERR_NONE) + return err; + break; + + /* uncompressed data */ + case V34_MAP_ENTRY_TYPE_UNCOMPRESSED: + core_fseek(chd->file, entry->offset, SEEK_SET); + bytes = core_fread(chd->file, dest, chd->header.hunkbytes); + if (bytes != chd->header.hunkbytes) + return CHDERR_READ_ERROR; + break; + + /* mini-compressed data */ + case V34_MAP_ENTRY_TYPE_MINI: + put_bigendian_uint64(&dest[0], entry->offset); + for (bytes = 8; bytes < chd->header.hunkbytes; bytes++) + dest[bytes] = dest[bytes - 8]; + break; + + /* self-referenced data */ + case V34_MAP_ENTRY_TYPE_SELF_HUNK: +#ifdef NEED_CACHE_HUNK + if (chd->cachehunk == entry->offset && dest == chd->cache) + break; +#endif + return hunk_read_into_memory(chd, entry->offset, dest); + + /* parent-referenced data */ + case V34_MAP_ENTRY_TYPE_PARENT_HUNK: + err = hunk_read_into_memory(chd->parent, entry->offset, dest); + if (err != CHDERR_NONE) + return err; + break; + } + return CHDERR_NONE; + } + else + { + + // get a pointer to the map entry + uint64_t blockoffs; + uint32_t blocklen; +#ifdef VERIFY_BLOCK_CRC + uint16_t blockcrc; +#endif + uint8_t *rawmap = &chd->header.rawmap[chd->header.mapentrybytes * hunknum]; + + // uncompressed case + /* TODO + if (!compressed()) + { + blockoffs = uint64_t(be_read(rawmap, 4)) * uint64_t(m_hunkbytes); + if (blockoffs != 0) + file_read(blockoffs, dest, m_hunkbytes); + else if (m_parent_missing) + throw CHDERR_REQUIRES_PARENT; + else if (m_parent != nullptr) + m_parent->read_hunk(hunknum, dest); + else + memset(dest, 0, m_hunkbytes); + return CHDERR_NONE; + }*/ + + // compressed case + blocklen = get_bigendian_uint24(&rawmap[1]); + blockoffs = get_bigendian_uint48(&rawmap[4]); +#ifdef VERIFY_BLOCK_CRC + blockcrc = get_bigendian_uint16(&rawmap[10]); +#endif + void* codec = NULL; + switch (rawmap[0]) + { + case COMPRESSION_TYPE_0: + case COMPRESSION_TYPE_1: + case COMPRESSION_TYPE_2: + case COMPRESSION_TYPE_3: + core_fseek(chd->file, blockoffs, SEEK_SET); + core_fread(chd->file, chd->compressed, blocklen); + switch (chd->codecintf[rawmap[0]]->compression) + { + case CHD_CODEC_CD_LZMA: + codec = &chd->cdlz_codec_data; + break; + + case CHD_CODEC_CD_ZLIB: + codec = &chd->cdzl_codec_data; + break; + + case CHD_CODEC_CD_FLAC: + codec = &chd->cdfl_codec_data; + break; + } + if (codec==NULL) + return CHDERR_CODEC_ERROR; + err = (*chd->codecintf[rawmap[0]]->decompress)(codec, chd->compressed, blocklen, dest, chd->header.hunkbytes); + if (err != CHDERR_NONE) + return err; +#ifdef VERIFY_BLOCK_CRC + if (crc16(dest, chd->header.hunkbytes) != blockcrc) + return CHDERR_DECOMPRESSION_ERROR; +#endif + return CHDERR_NONE; + + case COMPRESSION_NONE: + core_fseek(chd->file, blockoffs, SEEK_SET); + core_fread(chd->file, dest, chd->header.hunkbytes); +#ifdef VERIFY_BLOCK_CRC + if (crc16(dest, chd->header.hunkbytes) != blockcrc) + return CHDERR_DECOMPRESSION_ERROR; +#endif + return CHDERR_NONE; + + case COMPRESSION_SELF: + return hunk_read_into_memory(chd, blockoffs, dest); + + case COMPRESSION_PARENT: + // TODO + //if (m_parent_missing) + // return CHDERR_REQUIRES_PARENT; + //return m_parent->read_bytes(uint64_t(blockoffs) * uint64_t(m_parent->unit_bytes()), dest, m_hunkbytes); + return CHDERR_DECOMPRESSION_ERROR; + } + return CHDERR_NONE; + } + + // We should not reach this code + return CHDERR_DECOMPRESSION_ERROR; +} + + +/*************************************************************************** + INTERNAL MAP ACCESS +***************************************************************************/ + +static size_t core_fsize(core_file *f) +{ + long rv,p = ftell(f); + fseek(f, 0, SEEK_END); + rv = ftell(f); + fseek(f, p, SEEK_SET); + return rv; +} + +/*------------------------------------------------- + map_read - read the initial sector map +-------------------------------------------------*/ + +static chd_error map_read(chd_file *chd) +{ + UINT32 entrysize = (chd->header.version < 3) ? OLD_MAP_ENTRY_SIZE : MAP_ENTRY_SIZE; + UINT8 raw_map_entries[MAP_STACK_ENTRIES * MAP_ENTRY_SIZE]; + UINT64 fileoffset, maxoffset = 0; + UINT8 cookie[MAP_ENTRY_SIZE]; + UINT32 count; + chd_error err; + int i; + + /* first allocate memory */ + chd->map = (map_entry *)malloc(sizeof(chd->map[0]) * chd->header.totalhunks); + if (!chd->map) + return CHDERR_OUT_OF_MEMORY; + + /* read the map entries in in chunks and extract to the map list */ + fileoffset = chd->header.length; + for (i = 0; i < chd->header.totalhunks; i += MAP_STACK_ENTRIES) + { + /* compute how many entries this time */ + int entries = chd->header.totalhunks - i, j; + if (entries > MAP_STACK_ENTRIES) + entries = MAP_STACK_ENTRIES; + + /* read that many */ + core_fseek(chd->file, fileoffset, SEEK_SET); + count = core_fread(chd->file, raw_map_entries, entries * entrysize); + if (count != entries * entrysize) + { + err = CHDERR_READ_ERROR; + goto cleanup; + } + fileoffset += entries * entrysize; + + /* process that many */ + if (entrysize == MAP_ENTRY_SIZE) + { + for (j = 0; j < entries; j++) + map_extract(&raw_map_entries[j * MAP_ENTRY_SIZE], &chd->map[i + j]); + } + else + { + for (j = 0; j < entries; j++) + map_extract_old(&raw_map_entries[j * OLD_MAP_ENTRY_SIZE], &chd->map[i + j], chd->header.hunkbytes); + } + + /* track the maximum offset */ + for (j = 0; j < entries; j++) + if ((chd->map[i + j].flags & MAP_ENTRY_FLAG_TYPE_MASK) == V34_MAP_ENTRY_TYPE_COMPRESSED || + (chd->map[i + j].flags & MAP_ENTRY_FLAG_TYPE_MASK) == V34_MAP_ENTRY_TYPE_UNCOMPRESSED) + maxoffset = MAX(maxoffset, chd->map[i + j].offset + chd->map[i + j].length); + } + + /* verify the cookie */ + core_fseek(chd->file, fileoffset, SEEK_SET); + count = core_fread(chd->file, &cookie, entrysize); + if (count != entrysize || memcmp(&cookie, END_OF_LIST_COOKIE, entrysize)) + { + err = CHDERR_INVALID_FILE; + goto cleanup; + } + + /* verify the length */ + if (maxoffset > core_fsize(chd->file)) + { + err = CHDERR_INVALID_FILE; + goto cleanup; + } + return CHDERR_NONE; + +cleanup: + if (chd->map) + free(chd->map); + chd->map = NULL; + return err; +} + + + + +/*************************************************************************** + INTERNAL METADATA ACCESS +***************************************************************************/ + +/*------------------------------------------------- + metadata_find_entry - find a metadata entry +-------------------------------------------------*/ + +static chd_error metadata_find_entry(chd_file *chd, UINT32 metatag, UINT32 metaindex, metadata_entry *metaentry) +{ + /* start at the beginning */ + metaentry->offset = chd->header.metaoffset; + metaentry->prev = 0; + + /* loop until we run out of options */ + while (metaentry->offset != 0) + { + UINT8 raw_meta_header[METADATA_HEADER_SIZE]; + UINT32 count; + + /* read the raw header */ + core_fseek(chd->file, metaentry->offset, SEEK_SET); + count = core_fread(chd->file, raw_meta_header, sizeof(raw_meta_header)); + if (count != sizeof(raw_meta_header)) + break; + + /* extract the data */ + metaentry->metatag = get_bigendian_uint32(&raw_meta_header[0]); + metaentry->length = get_bigendian_uint32(&raw_meta_header[4]); + metaentry->next = get_bigendian_uint64(&raw_meta_header[8]); + + /* flags are encoded in the high byte of length */ + metaentry->flags = metaentry->length >> 24; + metaentry->length &= 0x00ffffff; + + /* if we got a match, proceed */ + if (metatag == CHDMETATAG_WILDCARD || metaentry->metatag == metatag) + if (metaindex-- == 0) + return CHDERR_NONE; + + /* no match, fetch the next link */ + metaentry->prev = metaentry->offset; + metaentry->offset = metaentry->next; + } + + /* if we get here, we didn't find it */ + return CHDERR_METADATA_NOT_FOUND; +} + + + +/*************************************************************************** + ZLIB COMPRESSION CODEC +***************************************************************************/ + +/*------------------------------------------------- + zlib_codec_init - initialize the ZLIB codec +-------------------------------------------------*/ + +static chd_error zlib_codec_init(void *codec, uint32_t hunkbytes) +{ + int zerr; + chd_error err; + zlib_codec_data *data = (zlib_codec_data*)codec; + + /* clear the buffers */ + memset(data, 0, sizeof(zlib_codec_data)); + + /* init the inflater first */ + data->inflater.next_in = (Bytef *)data; /* bogus, but that's ok */ + data->inflater.avail_in = 0; + data->inflater.zalloc = zlib_fast_alloc; + data->inflater.zfree = zlib_fast_free; + data->inflater.opaque = &data->allocator; + zerr = inflateInit2(&data->inflater, -MAX_WBITS); + + /* convert errors */ + if (zerr == Z_MEM_ERROR) + err = CHDERR_OUT_OF_MEMORY; + else if (zerr != Z_OK) + err = CHDERR_CODEC_ERROR; + else + err = CHDERR_NONE; + + return err; +} + + +/*------------------------------------------------- + zlib_codec_free - free data for the ZLIB + codec +-------------------------------------------------*/ + +static void zlib_codec_free(void *codec) +{ + zlib_codec_data *data = (zlib_codec_data *)codec; + + /* deinit the streams */ + if (data != NULL) + { + int i; + + inflateEnd(&data->inflater); + + /* free our fast memory */ + zlib_allocator alloc = data->allocator; + for (i = 0; i < MAX_ZLIB_ALLOCS; i++) + if (alloc.allocptr[i]) + free(alloc.allocptr[i]); + } +} + + +/*------------------------------------------------- + zlib_codec_decompress - decomrpess data using + the ZLIB codec +-------------------------------------------------*/ + +static chd_error zlib_codec_decompress(void *codec, const uint8_t *src, uint32_t complen, uint8_t *dest, uint32_t destlen) +{ + zlib_codec_data *data = (zlib_codec_data *)codec; + int zerr; + + /* reset the decompressor */ + data->inflater.next_in = (Bytef *)src; + data->inflater.avail_in = complen; + data->inflater.total_in = 0; + data->inflater.next_out = (Bytef *)dest; + data->inflater.avail_out = destlen; + data->inflater.total_out = 0; + zerr = inflateReset(&data->inflater); + if (zerr != Z_OK) + return CHDERR_DECOMPRESSION_ERROR; + + /* do it */ + zerr = inflate(&data->inflater, Z_FINISH); + if (data->inflater.total_out != destlen) + return CHDERR_DECOMPRESSION_ERROR; + + return CHDERR_NONE; +} + + +/*------------------------------------------------- + zlib_fast_alloc - fast malloc for ZLIB, which + allocates and frees memory frequently +-------------------------------------------------*/ + +static voidpf zlib_fast_alloc(voidpf opaque, uInt items, uInt size) +{ + zlib_allocator *alloc = (zlib_allocator *)opaque; + UINT32 *ptr; + int i; + + /* compute the size, rounding to the nearest 1k */ + size = (size * items + 0x3ff) & ~0x3ff; + + /* reuse a hunk if we can */ + for (i = 0; i < MAX_ZLIB_ALLOCS; i++) + { + ptr = alloc->allocptr[i]; + if (ptr && size == *ptr) + { + /* set the low bit of the size so we don't match next time */ + *ptr |= 1; + return ptr + 1; + } + } + + /* alloc a new one */ + ptr = (UINT32 *)malloc(size + sizeof(UINT32)); + if (!ptr) + return NULL; + + /* put it into the list */ + for (i = 0; i < MAX_ZLIB_ALLOCS; i++) + if (!alloc->allocptr[i]) + { + alloc->allocptr[i] = ptr; + break; + } + + /* set the low bit of the size so we don't match next time */ + *ptr = size | 1; + return ptr + 1; +} + + +/*------------------------------------------------- + zlib_fast_free - fast free for ZLIB, which + allocates and frees memory frequently +-------------------------------------------------*/ + +static void zlib_fast_free(voidpf opaque, voidpf address) +{ + zlib_allocator *alloc = (zlib_allocator *)opaque; + UINT32 *ptr = (UINT32 *)address - 1; + int i; + + /* find the hunk */ + for (i = 0; i < MAX_ZLIB_ALLOCS; i++) + if (ptr == alloc->allocptr[i]) + { + /* clear the low bit of the size to allow matches */ + *ptr &= ~1; + return; + } +} diff --git a/core/cd_hw/libchdr/src/chd.h b/core/cd_hw/libchdr/src/chd.h new file mode 100644 index 0000000..4fe3e64 --- /dev/null +++ b/core/cd_hw/libchdr/src/chd.h @@ -0,0 +1,400 @@ +/*************************************************************************** + + chd.h + + MAME Compressed Hunks of Data file format + +**************************************************************************** + + Copyright Aaron Giles + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + * Neither the name 'MAME' 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 AARON GILES ''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 AARON GILES BE LIABLE FOR ANY DIRECT, + INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + +***************************************************************************/ + +#pragma once + +#ifndef __CHD_H__ +#define __CHD_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "coretypes.h" + + +/*************************************************************************** + + Compressed Hunks of Data header format. All numbers are stored in + Motorola (big-endian) byte ordering. The header is 76 (V1) or 80 (V2) + bytes long. + + V1 header: + + [ 0] char tag[8]; // 'MComprHD' + [ 8] UINT32 length; // length of header (including tag and length fields) + [ 12] UINT32 version; // drive format version + [ 16] UINT32 flags; // flags (see below) + [ 20] UINT32 compression; // compression type + [ 24] UINT32 hunksize; // 512-byte sectors per hunk + [ 28] UINT32 totalhunks; // total # of hunks represented + [ 32] UINT32 cylinders; // number of cylinders on hard disk + [ 36] UINT32 heads; // number of heads on hard disk + [ 40] UINT32 sectors; // number of sectors on hard disk + [ 44] UINT8 md5[16]; // MD5 checksum of raw data + [ 60] UINT8 parentmd5[16]; // MD5 checksum of parent file + [ 76] (V1 header length) + + V2 header: + + [ 0] char tag[8]; // 'MComprHD' + [ 8] UINT32 length; // length of header (including tag and length fields) + [ 12] UINT32 version; // drive format version + [ 16] UINT32 flags; // flags (see below) + [ 20] UINT32 compression; // compression type + [ 24] UINT32 hunksize; // seclen-byte sectors per hunk + [ 28] UINT32 totalhunks; // total # of hunks represented + [ 32] UINT32 cylinders; // number of cylinders on hard disk + [ 36] UINT32 heads; // number of heads on hard disk + [ 40] UINT32 sectors; // number of sectors on hard disk + [ 44] UINT8 md5[16]; // MD5 checksum of raw data + [ 60] UINT8 parentmd5[16]; // MD5 checksum of parent file + [ 76] UINT32 seclen; // number of bytes per sector + [ 80] (V2 header length) + + V3 header: + + [ 0] char tag[8]; // 'MComprHD' + [ 8] UINT32 length; // length of header (including tag and length fields) + [ 12] UINT32 version; // drive format version + [ 16] UINT32 flags; // flags (see below) + [ 20] UINT32 compression; // compression type + [ 24] UINT32 totalhunks; // total # of hunks represented + [ 28] UINT64 logicalbytes; // logical size of the data (in bytes) + [ 36] UINT64 metaoffset; // offset to the first blob of metadata + [ 44] UINT8 md5[16]; // MD5 checksum of raw data + [ 60] UINT8 parentmd5[16]; // MD5 checksum of parent file + [ 76] UINT32 hunkbytes; // number of bytes per hunk + [ 80] UINT8 sha1[20]; // SHA1 checksum of raw data + [100] UINT8 parentsha1[20];// SHA1 checksum of parent file + [120] (V3 header length) + + V4 header: + + [ 0] char tag[8]; // 'MComprHD' + [ 8] UINT32 length; // length of header (including tag and length fields) + [ 12] UINT32 version; // drive format version + [ 16] UINT32 flags; // flags (see below) + [ 20] UINT32 compression; // compression type + [ 24] UINT32 totalhunks; // total # of hunks represented + [ 28] UINT64 logicalbytes; // logical size of the data (in bytes) + [ 36] UINT64 metaoffset; // offset to the first blob of metadata + [ 44] UINT32 hunkbytes; // number of bytes per hunk + [ 48] UINT8 sha1[20]; // combined raw+meta SHA1 + [ 68] UINT8 parentsha1[20];// combined raw+meta SHA1 of parent + [ 88] UINT8 rawsha1[20]; // raw data SHA1 + [108] (V4 header length) + + Flags: + 0x00000001 - set if this drive has a parent + 0x00000002 - set if this drive allows writes + + ========================================================================= + + V5 header: + + [ 0] char tag[8]; // 'MComprHD' + [ 8] uint32_t length; // length of header (including tag and length fields) + [ 12] uint32_t version; // drive format version + [ 16] uint32_t compressors[4];// which custom compressors are used? + [ 32] uint64_t logicalbytes; // logical size of the data (in bytes) + [ 40] uint64_t mapoffset; // offset to the map + [ 48] uint64_t metaoffset; // offset to the first blob of metadata + [ 56] uint32_t hunkbytes; // number of bytes per hunk (512k maximum) + [ 60] uint32_t unitbytes; // number of bytes per unit within each hunk + [ 64] uint8_t rawsha1[20]; // raw data SHA1 + [ 84] uint8_t sha1[20]; // combined raw+meta SHA1 + [104] uint8_t parentsha1[20];// combined raw+meta SHA1 of parent + [124] (V5 header length) + + If parentsha1 != 0, we have a parent (no need for flags) + If compressors[0] == 0, we are uncompressed (including maps) + + V5 uncompressed map format: + + [ 0] uint32_t offset; // starting offset / hunk size + + V5 compressed map format header: + + [ 0] uint32_t length; // length of compressed map + [ 4] UINT48 datastart; // offset of first block + [ 10] uint16_t crc; // crc-16 of the map + [ 12] uint8_t lengthbits; // bits used to encode complength + [ 13] uint8_t hunkbits; // bits used to encode self-refs + [ 14] uint8_t parentunitbits; // bits used to encode parent unit refs + [ 15] uint8_t reserved; // future use + [ 16] (compressed header length) + + Each compressed map entry, once expanded, looks like: + + [ 0] uint8_t compression; // compression type + [ 1] UINT24 complength; // compressed length + [ 4] UINT48 offset; // offset + [ 10] uint16_t crc; // crc-16 of the data + +***************************************************************************/ + + +/*************************************************************************** + CONSTANTS +***************************************************************************/ + +/* header information */ +#define CHD_HEADER_VERSION 5 +#define CHD_V1_HEADER_SIZE 76 +#define CHD_V2_HEADER_SIZE 80 +#define CHD_V3_HEADER_SIZE 120 +#define CHD_V4_HEADER_SIZE 108 +#define CHD_V5_HEADER_SIZE 124 + +#define CHD_MAX_HEADER_SIZE CHD_V5_HEADER_SIZE + +/* checksumming information */ +#define CHD_MD5_BYTES 16 +#define CHD_SHA1_BYTES 20 + +/* CHD global flags */ +#define CHDFLAGS_HAS_PARENT 0x00000001 +#define CHDFLAGS_IS_WRITEABLE 0x00000002 +#define CHDFLAGS_UNDEFINED 0xfffffffc + +/* compression types */ +#define CHDCOMPRESSION_NONE 0 +#define CHDCOMPRESSION_ZLIB 1 +#define CHDCOMPRESSION_ZLIB_PLUS 2 +#define CHDCOMPRESSION_AV 3 + +/* A/V codec configuration parameters */ +#define AV_CODEC_COMPRESS_CONFIG 1 +#define AV_CODEC_DECOMPRESS_CONFIG 2 + +/* metadata parameters */ +#define CHDMETATAG_WILDCARD 0 +#define CHD_METAINDEX_APPEND ((UINT32)-1) + +/* metadata flags */ +#define CHD_MDFLAGS_CHECKSUM 0x01 /* indicates data is checksummed */ + +/* standard hard disk metadata */ +#define HARD_DISK_METADATA_TAG 0x47444444 /* 'GDDD' */ +#define HARD_DISK_METADATA_FORMAT "CYLS:%d,HEADS:%d,SECS:%d,BPS:%d" + +/* hard disk identify information */ +#define HARD_DISK_IDENT_METADATA_TAG 0x49444e54 /* 'IDNT' */ + +/* hard disk key information */ +#define HARD_DISK_KEY_METADATA_TAG 0x4b455920 /* 'KEY ' */ + +/* pcmcia CIS information */ +#define PCMCIA_CIS_METADATA_TAG 0x43495320 /* 'CIS ' */ + +/* standard CD-ROM metadata */ +#define CDROM_OLD_METADATA_TAG 0x43484344 /* 'CHCD' */ +#define CDROM_TRACK_METADATA_TAG 0x43485452 /* 'CHTR' */ +#define CDROM_TRACK_METADATA_FORMAT "TRACK:%d TYPE:%s SUBTYPE:%s FRAMES:%d" +#define CDROM_TRACK_METADATA2_TAG 0x43485432 /* 'CHT2' */ +#define CDROM_TRACK_METADATA2_FORMAT "TRACK:%d TYPE:%s SUBTYPE:%s FRAMES:%d PREGAP:%d PGTYPE:%s PGSUB:%s POSTGAP:%d" +#define GDROM_TRACK_METADATA_TAG 0x43484744 /* 'CHTD' */ +#define GDROM_TRACK_METADATA_FORMAT "TRACK:%d TYPE:%s SUBTYPE:%s FRAMES:%d PAD:%d PREGAP:%d PGTYPE:%s PGSUB:%s POSTGAP:%d" + +/* standard A/V metadata */ +#define AV_METADATA_TAG 0x41564156 /* 'AVAV' */ +#define AV_METADATA_FORMAT "FPS:%d.%06d WIDTH:%d HEIGHT:%d INTERLACED:%d CHANNELS:%d SAMPLERATE:%d" + +/* A/V laserdisc frame metadata */ +#define AV_LD_METADATA_TAG 0x41564C44 /* 'AVLD' */ + +/* CHD open values */ +#define CHD_OPEN_READ 1 +#define CHD_OPEN_READWRITE 2 + +/* error types */ +enum _chd_error +{ + CHDERR_NONE, + CHDERR_NO_INTERFACE, + CHDERR_OUT_OF_MEMORY, + CHDERR_INVALID_FILE, + CHDERR_INVALID_PARAMETER, + CHDERR_INVALID_DATA, + CHDERR_FILE_NOT_FOUND, + CHDERR_REQUIRES_PARENT, + CHDERR_FILE_NOT_WRITEABLE, + CHDERR_READ_ERROR, + CHDERR_WRITE_ERROR, + CHDERR_CODEC_ERROR, + CHDERR_INVALID_PARENT, + CHDERR_HUNK_OUT_OF_RANGE, + CHDERR_DECOMPRESSION_ERROR, + CHDERR_COMPRESSION_ERROR, + CHDERR_CANT_CREATE_FILE, + CHDERR_CANT_VERIFY, + CHDERR_NOT_SUPPORTED, + CHDERR_METADATA_NOT_FOUND, + CHDERR_INVALID_METADATA_SIZE, + CHDERR_UNSUPPORTED_VERSION, + CHDERR_VERIFY_INCOMPLETE, + CHDERR_INVALID_METADATA, + CHDERR_INVALID_STATE, + CHDERR_OPERATION_PENDING, + CHDERR_NO_ASYNC_OPERATION, + CHDERR_UNSUPPORTED_FORMAT +}; +typedef enum _chd_error chd_error; + + + +/*************************************************************************** + TYPE DEFINITIONS +***************************************************************************/ + +/* opaque types */ +typedef struct _chd_file chd_file; + + +/* extract header structure (NOT the on-disk header structure) */ +typedef struct _chd_header chd_header; +struct _chd_header +{ + UINT32 length; /* length of header data */ + UINT32 version; /* drive format version */ + UINT32 flags; /* flags field */ + UINT32 compression[4]; /* compression type */ + UINT32 hunkbytes; /* number of bytes per hunk */ + UINT32 totalhunks; /* total # of hunks represented */ + UINT64 logicalbytes; /* logical size of the data */ + UINT64 metaoffset; /* offset in file of first metadata */ + UINT64 mapoffset; /* TOOD V5 */ + UINT8 md5[CHD_MD5_BYTES]; /* overall MD5 checksum */ + UINT8 parentmd5[CHD_MD5_BYTES]; /* overall MD5 checksum of parent */ + UINT8 sha1[CHD_SHA1_BYTES]; /* overall SHA1 checksum */ + UINT8 rawsha1[CHD_SHA1_BYTES]; /* SHA1 checksum of raw data */ + UINT8 parentsha1[CHD_SHA1_BYTES]; /* overall SHA1 checksum of parent */ + UINT32 unitbytes; /* TODO V5 */ + UINT64 unitcount; /* TODO V5 */ + UINT32 hunkcount; /* TODO V5 */ + + /* map information */ + UINT32 mapentrybytes; /* length of each entry in a map (V5) */ + UINT8* rawmap; /* raw map data */ + + UINT32 obsolete_cylinders; /* obsolete field -- do not use! */ + UINT32 obsolete_sectors; /* obsolete field -- do not use! */ + UINT32 obsolete_heads; /* obsolete field -- do not use! */ + UINT32 obsolete_hunksize; /* obsolete field -- do not use! */ +}; + + +/* structure for returning information about a verification pass */ +typedef struct _chd_verify_result chd_verify_result; +struct _chd_verify_result +{ + UINT8 md5[CHD_MD5_BYTES]; /* overall MD5 checksum */ + UINT8 sha1[CHD_SHA1_BYTES]; /* overall SHA1 checksum */ + UINT8 rawsha1[CHD_SHA1_BYTES]; /* SHA1 checksum of raw data */ + UINT8 metasha1[CHD_SHA1_BYTES]; /* SHA1 checksum of metadata */ +}; + + + +/*************************************************************************** + FUNCTION PROTOTYPES +***************************************************************************/ + + +/* ----- CHD file management ----- */ + +/* create a new CHD file fitting the given description */ +/* chd_error chd_create(const char *filename, UINT64 logicalbytes, UINT32 hunkbytes, UINT32 compression, chd_file *parent); */ + +/* same as chd_create(), but accepts an already-opened core_file object */ +/* chd_error chd_create_file(core_file *file, UINT64 logicalbytes, UINT32 hunkbytes, UINT32 compression, chd_file *parent); */ + +/* open an existing CHD file */ +chd_error chd_open_file(core_file *file, int mode, chd_file *parent, chd_file **chd); +chd_error chd_open(const char *filename, int mode, chd_file *parent, chd_file **chd); + + +/* close a CHD file */ +void chd_close(chd_file *chd); + +/* return the associated core_file */ +core_file *chd_core_file(chd_file *chd); + +/* return an error string for the given CHD error */ +const char *chd_error_string(chd_error err); + + + +/* ----- CHD header management ----- */ + +/* return a pointer to the extracted CHD header data */ +const chd_header *chd_get_header(chd_file *chd); + + + + +/* ----- core data read/write ----- */ + +/* read one hunk from the CHD file */ +chd_error chd_read(chd_file *chd, UINT32 hunknum, void *buffer); + + + +/* ----- metadata management ----- */ + +/* get indexed metadata of a particular sort */ +chd_error chd_get_metadata(chd_file *chd, UINT32 searchtag, UINT32 searchindex, void *output, UINT32 outputlen, UINT32 *resultlen, UINT32 *resulttag, UINT8 *resultflags); + + + + +/* ----- codec interfaces ----- */ + +/* set internal codec parameters */ +chd_error chd_codec_config(chd_file *chd, int param, void *config); + +/* return a string description of a codec */ +const char *chd_get_codec_name(UINT32 codec); + +#ifdef __cplusplus +} +#endif + +#endif /* __CHD_H__ */ diff --git a/core/cd_hw/libchdr/src/coretypes.h b/core/cd_hw/libchdr/src/coretypes.h new file mode 100644 index 0000000..5a769f6 --- /dev/null +++ b/core/cd_hw/libchdr/src/coretypes.h @@ -0,0 +1,30 @@ +#ifndef __CORETYPES_H__ +#define __CORETYPES_H__ + +#include +#include + +#define ARRAY_LENGTH(x) (sizeof(x)/sizeof(x[0])) + +typedef uint64_t UINT64; +#ifndef OSD_CPU_H +typedef uint32_t UINT32; +typedef uint16_t UINT16; +typedef uint8_t UINT8; +#endif + +typedef int64_t INT64; +#ifndef OSD_CPU_H +typedef int32_t INT32; +typedef int16_t INT16; +typedef int8_t INT8; +#endif + +#define core_file FILE +#define core_fopen(file) fopen(file, "rb") +#define core_fseek fseek +#define core_fread(fc, buff, len) fread(buff, 1, len, fc) +#define core_fclose fclose +#define core_ftell ftell + +#endif diff --git a/core/cd_hw/libchdr/src/flac.c b/core/cd_hw/libchdr/src/flac.c new file mode 100644 index 0000000..835ee52 --- /dev/null +++ b/core/cd_hw/libchdr/src/flac.c @@ -0,0 +1,319 @@ +// license:BSD-3-Clause +// copyright-holders:Aaron Giles +/*************************************************************************** + + flac.c + + FLAC compression wrappers + +***************************************************************************/ + +#include +#include +#include "flac.h" + +//************************************************************************** +// FLAC DECODER +//************************************************************************** + +static FLAC__StreamDecoderReadStatus flac_decoder_read_callback_static(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data); +FLAC__StreamDecoderReadStatus flac_decoder_read_callback(void* client_data, FLAC__byte buffer[], size_t *bytes); +static void flac_decoder_metadata_callback_static(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data); +static FLAC__StreamDecoderTellStatus flac_decoder_tell_callback_static(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data); +static FLAC__StreamDecoderWriteStatus flac_decoder_write_callback_static(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data); +FLAC__StreamDecoderWriteStatus flac_decoder_write_callback(void* client_data, const FLAC__Frame *frame, const FLAC__int32 * const buffer[]); +static void flac_decoder_error_callback_static(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data); + +//------------------------------------------------- +// flac_decoder - constructor +//------------------------------------------------- + +void flac_decoder_init(flac_decoder *decoder) +{ + decoder->decoder = FLAC__stream_decoder_new(); + decoder->sample_rate = 0; + decoder->channels = 0; + decoder->bits_per_sample = 0; + decoder->compressed_offset = 0; + decoder->compressed_start = NULL; + decoder->compressed_length = 0; + decoder->compressed2_start = NULL; + decoder->compressed2_length = 0; + decoder->uncompressed_offset = 0; + decoder->uncompressed_length = 0; + decoder->uncompressed_swap = 0; +} + +//------------------------------------------------- +// flac_decoder - destructor +//------------------------------------------------- + +void flac_decoder_free(flac_decoder* decoder) +{ + if ((decoder != NULL) && (decoder->decoder != NULL)) + FLAC__stream_decoder_delete(decoder->decoder); +} + + +//------------------------------------------------- +// reset - reset state with the original +// parameters +//------------------------------------------------- + +static int flac_decoder_internal_reset(flac_decoder* decoder) +{ + decoder->compressed_offset = 0; + if (FLAC__stream_decoder_init_stream(decoder->decoder, + &flac_decoder_read_callback_static, + NULL, + &flac_decoder_tell_callback_static, + NULL, + NULL, + &flac_decoder_write_callback_static, + &flac_decoder_metadata_callback_static, + &flac_decoder_error_callback_static, decoder) != FLAC__STREAM_DECODER_INIT_STATUS_OK) + return 0; + return FLAC__stream_decoder_process_until_end_of_metadata(decoder->decoder); +} + + + +//------------------------------------------------- +// reset - reset state with new memory parameters +// and a custom-generated header +//------------------------------------------------- + +int flac_decoder_reset(flac_decoder* decoder, uint32_t sample_rate, uint8_t num_channels, uint32_t block_size, const void *buffer, uint32_t length) +{ + // modify the template header with our parameters + static const uint8_t s_header_template[0x2a] = + { + 0x66, 0x4C, 0x61, 0x43, // +00: 'fLaC' stream header + 0x80, // +04: metadata block type 0 (STREAMINFO), + // flagged as last block + 0x00, 0x00, 0x22, // +05: metadata block length = 0x22 + 0x00, 0x00, // +08: minimum block size + 0x00, 0x00, // +0A: maximum block size + 0x00, 0x00, 0x00, // +0C: minimum frame size (0 == unknown) + 0x00, 0x00, 0x00, // +0F: maximum frame size (0 == unknown) + 0x0A, 0xC4, 0x42, 0xF0, 0x00, 0x00, 0x00, 0x00, // +12: sample rate (0x0ac44 == 44100), + // numchannels (2), sample bits (16), + // samples in stream (0 == unknown) + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // +1A: MD5 signature (0 == none) + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // + // +2A: start of stream data + }; + memcpy(decoder->custom_header, s_header_template, sizeof(s_header_template)); + decoder->custom_header[0x08] = decoder->custom_header[0x0a] = block_size >> 8; + decoder->custom_header[0x09] = decoder->custom_header[0x0b] = block_size & 0xff; + decoder->custom_header[0x12] = sample_rate >> 12; + decoder->custom_header[0x13] = sample_rate >> 4; + decoder->custom_header[0x14] = (sample_rate << 4) | ((num_channels - 1) << 1); + + // configure the header ahead of the provided buffer + decoder->compressed_start = (const FLAC__byte *)(decoder->custom_header); + decoder->compressed_length = sizeof(decoder->custom_header); + decoder->compressed2_start = (const FLAC__byte *)(buffer); + decoder->compressed2_length = length; + return flac_decoder_internal_reset(decoder); +} + + +//------------------------------------------------- +// decode_interleaved - decode to an interleaved +// sound stream +//------------------------------------------------- + +int flac_decoder_decode_interleaved(flac_decoder* decoder, int16_t *samples, uint32_t num_samples, int swap_endian) +{ + // configure the uncompressed buffer + memset(decoder->uncompressed_start, 0, sizeof(decoder->uncompressed_start)); + decoder->uncompressed_start[0] = samples; + decoder->uncompressed_offset = 0; + decoder->uncompressed_length = num_samples; + decoder->uncompressed_swap = swap_endian; + + // loop until we get everything we want + while (decoder->uncompressed_offset < decoder->uncompressed_length) + if (!FLAC__stream_decoder_process_single(decoder->decoder)) + return 0; + return 1; +} + + +/* +//------------------------------------------------- +// decode - decode to an multiple independent +// data streams +//------------------------------------------------- + +bool flac_decoder::decode(int16_t **samples, uint32_t num_samples, bool swap_endian) +{ + // make sure we don't have too many channels + int chans = channels(); + if (chans > ARRAY_LENGTH(m_uncompressed_start)) + return false; + + // configure the uncompressed buffer + memset(m_uncompressed_start, 0, sizeof(m_uncompressed_start)); + for (int curchan = 0; curchan < chans; curchan++) + m_uncompressed_start[curchan] = samples[curchan]; + m_uncompressed_offset = 0; + m_uncompressed_length = num_samples; + m_uncompressed_swap = swap_endian; + + // loop until we get everything we want + while (m_uncompressed_offset < m_uncompressed_length) + if (!FLAC__stream_decoder_process_single(m_decoder)) + return false; + return true; +} +*/ + +//------------------------------------------------- +// finish - finish up the decode +//------------------------------------------------- + +uint32_t flac_decoder_finish(flac_decoder* decoder) +{ + // get the final decoding position and move forward + FLAC__uint64 position = 0; + FLAC__stream_decoder_get_decode_position(decoder->decoder, &position); + FLAC__stream_decoder_finish(decoder->decoder); + + // adjust position if we provided the header + if (position == 0) + return 0; + if (decoder->compressed_start == (const FLAC__byte *)(decoder->custom_header)) + position -= decoder->compressed_length; + return position; +} + + +//------------------------------------------------- +// read_callback - handle reads from the input +// stream +//------------------------------------------------- + +#define MIN(x, y) ((x) < (y) ? (x) : (y)) + +FLAC__StreamDecoderReadStatus flac_decoder_read_callback_static(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data) +{ + return flac_decoder_read_callback(client_data, buffer, bytes); +} + +FLAC__StreamDecoderReadStatus flac_decoder_read_callback(void* client_data, FLAC__byte buffer[], size_t *bytes) +{ + flac_decoder* decoder = (flac_decoder*)client_data; + + uint32_t expected = *bytes; + + // copy from primary buffer first + uint32_t outputpos = 0; + if (outputpos < *bytes && decoder->compressed_offset < decoder->compressed_length) + { + uint32_t bytes_to_copy = MIN(*bytes - outputpos, decoder->compressed_length - decoder->compressed_offset); + memcpy(&buffer[outputpos], decoder->compressed_start + decoder->compressed_offset, bytes_to_copy); + outputpos += bytes_to_copy; + decoder->compressed_offset += bytes_to_copy; + } + + // once we're out of that, copy from the secondary buffer + if (outputpos < *bytes && decoder->compressed_offset < decoder->compressed_length + decoder->compressed2_length) + { + uint32_t bytes_to_copy = MIN(*bytes - outputpos, decoder->compressed2_length - (decoder->compressed_offset - decoder->compressed_length)); + memcpy(&buffer[outputpos], decoder->compressed2_start + decoder->compressed_offset - decoder->compressed_length, bytes_to_copy); + outputpos += bytes_to_copy; + decoder->compressed_offset += bytes_to_copy; + } + *bytes = outputpos; + + // return based on whether we ran out of data + return (*bytes < expected) ? FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM : FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; +} + + +//------------------------------------------------- +// metadata_callback - handle STREAMINFO metadata +//------------------------------------------------- + +void flac_decoder_metadata_callback_static(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data) +{ + // ignore all but STREAMINFO metadata + if (metadata->type != FLAC__METADATA_TYPE_STREAMINFO) + return; + + // parse out the data we care about + flac_decoder *fldecoder = (flac_decoder *)(client_data); + fldecoder->sample_rate = metadata->data.stream_info.sample_rate; + fldecoder->bits_per_sample = metadata->data.stream_info.bits_per_sample; + fldecoder->channels = metadata->data.stream_info.channels; +} + + +//------------------------------------------------- +// tell_callback - handle requests to find out +// where in the input stream we are +//------------------------------------------------- + +FLAC__StreamDecoderTellStatus flac_decoder_tell_callback_static(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data) +{ + *absolute_byte_offset = ((flac_decoder *)client_data)->compressed_offset; + return FLAC__STREAM_DECODER_TELL_STATUS_OK; +} + + +//------------------------------------------------- +// write_callback - handle writes to the output +// stream +//------------------------------------------------- + +FLAC__StreamDecoderWriteStatus flac_decoder_write_callback_static(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data) +{ + return flac_decoder_write_callback(client_data, frame, buffer); +} + +FLAC__StreamDecoderWriteStatus flac_decoder_write_callback(void *client_data, const FLAC__Frame *frame, const FLAC__int32 * const buffer[]) +{ + flac_decoder * decoder = (flac_decoder *)client_data; + + assert(frame->header.channels == decoder->channels); + + // interleaved case + int sampnum, chan; + int shift = decoder->uncompressed_swap ? 8 : 0; + int blocksize = frame->header.blocksize; + if (decoder->uncompressed_start[1] == NULL) + { + int16_t *dest = decoder->uncompressed_start[0] + decoder->uncompressed_offset * frame->header.channels; + for (sampnum = 0; sampnum < blocksize && decoder->uncompressed_offset < decoder->uncompressed_length; sampnum++, decoder->uncompressed_offset++) + for (chan = 0; chan < frame->header.channels; chan++) + *dest++ = (int16_t)((((uint16_t)buffer[chan][sampnum]) << shift) | (((uint16_t)buffer[chan][sampnum]) >> shift)); + } + + // non-interleaved case + else + { + for (sampnum = 0; sampnum < blocksize && decoder->uncompressed_offset < decoder->uncompressed_length; sampnum++, decoder->uncompressed_offset++) + for (chan = 0; chan < frame->header.channels; chan++) + if (decoder->uncompressed_start[chan] != NULL) + decoder->uncompressed_start[chan][decoder->uncompressed_offset] = (int16_t) ( (((uint16_t)(buffer[chan][sampnum])) << shift) | ( ((uint16_t)(buffer[chan][sampnum])) >> shift) ); + } + return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; +} + +/** + * @fn void flac_decoder::error_callback_static(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data) + * + * @brief ------------------------------------------------- + * error_callback - handle errors (ignore them) + * -------------------------------------------------. + * + * @param decoder The decoder. + * @param status The status. + * @param [in,out] client_data If non-null, information describing the client. + */ + +void flac_decoder_error_callback_static(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data) +{ +} diff --git a/core/cd_hw/libchdr/src/flac.h b/core/cd_hw/libchdr/src/flac.h new file mode 100644 index 0000000..03721c9 --- /dev/null +++ b/core/cd_hw/libchdr/src/flac.h @@ -0,0 +1,51 @@ +// license:BSD-3-Clause +// copyright-holders:Aaron Giles +/*************************************************************************** + + flac.h + + FLAC compression wrappers + +***************************************************************************/ + +#pragma once + +#ifndef __FLAC_H__ +#define __FLAC_H__ + +#include +#include "FLAC/ordinals.h" +#include "FLAC/stream_decoder.h" + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +typedef struct _flac_decoder flac_decoder; +struct _flac_decoder { + // output state + FLAC__StreamDecoder* decoder; // actual encoder + uint32_t sample_rate; // decoded sample rate + uint8_t channels; // decoded number of channels + uint8_t bits_per_sample; // decoded bits per sample + uint32_t compressed_offset; // current offset in compressed data + const FLAC__byte * compressed_start; // start of compressed data + uint32_t compressed_length; // length of compressed data + const FLAC__byte * compressed2_start; // start of compressed data + uint32_t compressed2_length; // length of compressed data + int16_t * uncompressed_start[8]; // pointer to start of uncompressed data (up to 8 streams) + uint32_t uncompressed_offset; // current position in uncompressed data + uint32_t uncompressed_length; // length of uncompressed data + int uncompressed_swap; // swap uncompressed sample data + uint8_t custom_header[0x2a]; // custom header +}; + +// ======================> flac_decoder + +void flac_decoder_init(flac_decoder* decoder); +void flac_decoder_free(flac_decoder* decoder); +int flac_decoder_reset(flac_decoder* decoder, uint32_t sample_rate, uint8_t num_channels, uint32_t block_size, const void *buffer, uint32_t length); +int flac_decoder_decode_interleaved(flac_decoder* decoder, int16_t *samples, uint32_t num_samples, int swap_endian); +uint32_t flac_decoder_finish(flac_decoder* decoder); + +#endif // __FLAC_H__ diff --git a/core/cd_hw/libchdr/src/huffman.c b/core/cd_hw/libchdr/src/huffman.c new file mode 100644 index 0000000..c6bc0eb --- /dev/null +++ b/core/cd_hw/libchdr/src/huffman.c @@ -0,0 +1,521 @@ +// license:BSD-3-Clause +// copyright-holders:Aaron Giles +/*************************************************************************** + + huffman.c + + Static Huffman compression and decompression helpers. + +**************************************************************************** + + Maximum codelength is officially (alphabetsize - 1). This would be 255 bits + (since we use 1 byte values). However, it is also dependent upon the number + of samples used, as follows: + + 2 bits -> 3..4 samples + 3 bits -> 5..7 samples + 4 bits -> 8..12 samples + 5 bits -> 13..20 samples + 6 bits -> 21..33 samples + 7 bits -> 34..54 samples + 8 bits -> 55..88 samples + 9 bits -> 89..143 samples + 10 bits -> 144..232 samples + 11 bits -> 233..376 samples + 12 bits -> 377..609 samples + 13 bits -> 610..986 samples + 14 bits -> 987..1596 samples + 15 bits -> 1597..2583 samples + 16 bits -> 2584..4180 samples -> note that a 4k data size guarantees codelength <= 16 bits + 17 bits -> 4181..6764 samples + 18 bits -> 6765..10945 samples + 19 bits -> 10946..17710 samples + 20 bits -> 17711..28656 samples + 21 bits -> 28657..46367 samples + 22 bits -> 46368..75024 samples + 23 bits -> 75025..121392 samples + 24 bits -> 121393..196417 samples + 25 bits -> 196418..317810 samples + 26 bits -> 317811..514228 samples + 27 bits -> 514229..832039 samples + 28 bits -> 832040..1346268 samples + 29 bits -> 1346269..2178308 samples + 30 bits -> 2178309..3524577 samples + 31 bits -> 3524578..5702886 samples + 32 bits -> 5702887..9227464 samples + + Looking at it differently, here is where powers of 2 fall into these buckets: + + 256 samples -> 11 bits max + 512 samples -> 12 bits max + 1k samples -> 14 bits max + 2k samples -> 15 bits max + 4k samples -> 16 bits max + 8k samples -> 18 bits max + 16k samples -> 19 bits max + 32k samples -> 21 bits max + 64k samples -> 22 bits max + 128k samples -> 24 bits max + 256k samples -> 25 bits max + 512k samples -> 27 bits max + 1M samples -> 28 bits max + 2M samples -> 29 bits max + 4M samples -> 31 bits max + 8M samples -> 32 bits max + +**************************************************************************** + + Delta-RLE encoding works as follows: + + Starting value is assumed to be 0. All data is encoded as a delta + from the previous value, such that final[i] = final[i - 1] + delta. + Long runs of 0s are RLE-encoded as follows: + + 0x100 = repeat count of 8 + 0x101 = repeat count of 9 + 0x102 = repeat count of 10 + 0x103 = repeat count of 11 + 0x104 = repeat count of 12 + 0x105 = repeat count of 13 + 0x106 = repeat count of 14 + 0x107 = repeat count of 15 + 0x108 = repeat count of 16 + 0x109 = repeat count of 32 + 0x10a = repeat count of 64 + 0x10b = repeat count of 128 + 0x10c = repeat count of 256 + 0x10d = repeat count of 512 + 0x10e = repeat count of 1024 + 0x10f = repeat count of 2048 + + Note that repeat counts are reset at the end of a row, so if a 0 run + extends to the end of a row, a large repeat count may be used. + + The reason for starting the run counts at 8 is that 0 is expected to + be the most common symbol, and is typically encoded in 1 or 2 bits. + +***************************************************************************/ + +#include +#include +#include +#include + +#include "huffman.h" + +#define MAX(x,y) ((x) > (y) ? (x) : (y)) + +//************************************************************************** +// MACROS +//************************************************************************** + +#define MAKE_LOOKUP(code,bits) (((code) << 5) | ((bits) & 0x1f)) + + +//************************************************************************** +// IMPLEMENTATION +//************************************************************************** + +//------------------------------------------------- +// huffman_context_base - create an encoding/ +// decoding context +//------------------------------------------------- + +struct huffman_decoder* create_huffman_decoder(int numcodes, int maxbits) +{ + // limit to 24 bits + if (maxbits > 24) + return NULL; + + struct huffman_decoder* decoder = (struct huffman_decoder*)malloc(sizeof(struct huffman_decoder)); + decoder->numcodes = numcodes; + decoder->maxbits = maxbits; + decoder->lookup = (lookup_value*)malloc(sizeof(lookup_value) * (1 << maxbits)); + decoder->huffnode = (struct node_t*)malloc(sizeof(struct node_t) * numcodes); + decoder->datahisto = NULL; + decoder->prevdata = 0; + decoder->rleremaining = 0; + return decoder; +} + +void delete_huffman_decoder(struct huffman_decoder* decoder) +{ + if (decoder != NULL) + { + if (decoder->lookup != NULL) + free(decoder->lookup); + if (decoder->huffnode != NULL) + free(decoder->huffnode); + free(decoder); + } +} + +//------------------------------------------------- +// decode_one - decode a single code from the +// huffman stream +//------------------------------------------------- + +uint32_t huffman_decode_one(struct huffman_decoder* decoder, struct bitstream* bitbuf) +{ + // peek ahead to get maxbits worth of data + uint32_t bits = bitstream_peek(bitbuf, decoder->maxbits); + + // look it up, then remove the actual number of bits for this code + lookup_value lookup = decoder->lookup[bits]; + bitstream_remove(bitbuf, lookup & 0x1f); + + // return the value + return lookup >> 5; +} + +//------------------------------------------------- +// import_tree_rle - import an RLE-encoded +// huffman tree from a source data stream +//------------------------------------------------- + +enum huffman_error huffman_import_tree_rle(struct huffman_decoder* decoder, struct bitstream* bitbuf) +{ + // bits per entry depends on the maxbits + int numbits; + if (decoder->maxbits >= 16) + numbits = 5; + else if (decoder->maxbits >= 8) + numbits = 4; + else + numbits = 3; + + // loop until we read all the nodes + int curnode; + for (curnode = 0; curnode < decoder->numcodes; ) + { + // a non-one value is just raw + int nodebits = bitstream_read(bitbuf, numbits); + if (nodebits != 1) + decoder->huffnode[curnode++].numbits = nodebits; + + // a one value is an escape code + else + { + // a double 1 is just a single 1 + nodebits = bitstream_read(bitbuf, numbits); + if (nodebits == 1) + decoder->huffnode[curnode++].numbits = nodebits; + + // otherwise, we need one for value for the repeat count + else + { + int repcount = bitstream_read(bitbuf, numbits) + 3; + while (repcount--) + decoder->huffnode[curnode++].numbits = nodebits; + } + } + } + + // make sure we ended up with the right number + if (curnode != decoder->numcodes) + return HUFFERR_INVALID_DATA; + + // assign canonical codes for all nodes based on their code lengths + enum huffman_error error = huffman_assign_canonical_codes(decoder); + if (error != HUFFERR_NONE) + return error; + + // build the lookup table + huffman_build_lookup_table(decoder); + + // determine final input length and report errors + return bitstream_overflow(bitbuf) ? HUFFERR_INPUT_BUFFER_TOO_SMALL : HUFFERR_NONE; +} + + +//------------------------------------------------- +// import_tree_huffman - import a huffman-encoded +// huffman tree from a source data stream +//------------------------------------------------- + +enum huffman_error huffman_import_tree_huffman(struct huffman_decoder* decoder, struct bitstream* bitbuf) +{ + // start by parsing the lengths for the small tree + struct huffman_decoder* smallhuff = create_huffman_decoder(24, 6); + smallhuff->huffnode[0].numbits = bitstream_read(bitbuf, 3); + int start = bitstream_read(bitbuf, 3) + 1; + int index, count = 0; + for (index = 1; index < 24; index++) + { + if (index < start || count == 7) + smallhuff->huffnode[index].numbits = 0; + else + { + count = bitstream_read(bitbuf, 3); + smallhuff->huffnode[index].numbits = (count == 7) ? 0 : count; + } + } + + // then regenerate the tree + enum huffman_error error = huffman_assign_canonical_codes(smallhuff); + if (error != HUFFERR_NONE) + return error; + huffman_build_lookup_table(smallhuff); + + // determine the maximum length of an RLE count + uint32_t temp = decoder->numcodes - 9; + uint8_t rlefullbits = 0; + while (temp != 0) + temp >>= 1, rlefullbits++; + + // now process the rest of the data + int last = 0; + int curcode; + for (curcode = 0; curcode < decoder->numcodes; ) + { + int value = huffman_decode_one(smallhuff, bitbuf); + if (value != 0) + decoder->huffnode[curcode++].numbits = last = value - 1; + else + { + int count = bitstream_read(bitbuf, 3) + 2; + if (count == 7+2) + count += bitstream_read(bitbuf, rlefullbits); + for ( ; count != 0 && curcode < decoder->numcodes; count--) + decoder->huffnode[curcode++].numbits = last; + } + } + + // make sure we ended up with the right number + if (curcode != decoder->numcodes) + return HUFFERR_INVALID_DATA; + + // assign canonical codes for all nodes based on their code lengths + error = huffman_assign_canonical_codes(decoder); + if (error != HUFFERR_NONE) + return error; + + // build the lookup table + huffman_build_lookup_table(decoder); + + // determine final input length and report errors + return bitstream_overflow(bitbuf) ? HUFFERR_INPUT_BUFFER_TOO_SMALL : HUFFERR_NONE; +} + + +//------------------------------------------------- +// compute_tree_from_histo - common backend for +// computing a tree based on the data histogram +//------------------------------------------------- + +enum huffman_error huffman_compute_tree_from_histo(struct huffman_decoder* decoder) +{ + // compute the number of data items in the histogram + int i; + uint32_t sdatacount = 0; + for (i = 0; i < decoder->numcodes; i++) + sdatacount += decoder->datahisto[i]; + + // binary search to achieve the optimum encoding + uint32_t lowerweight = 0; + uint32_t upperweight = sdatacount * 2; + while (1) + { + // build a tree using the current weight + uint32_t curweight = (upperweight + lowerweight) / 2; + int curmaxbits = huffman_build_tree(decoder, sdatacount, curweight); + + // apply binary search here + if (curmaxbits <= decoder->maxbits) + { + lowerweight = curweight; + + // early out if it worked with the raw weights, or if we're done searching + if (curweight == sdatacount || (upperweight - lowerweight) <= 1) + break; + } + else + upperweight = curweight; + } + + // assign canonical codes for all nodes based on their code lengths + return huffman_assign_canonical_codes(decoder); +} + + + +//************************************************************************** +// INTERNAL FUNCTIONS +//************************************************************************** + +//------------------------------------------------- +// tree_node_compare - compare two tree nodes +// by weight +//------------------------------------------------- + +static int huffman_tree_node_compare(const void *item1, const void *item2) +{ + const struct node_t *node1 = *(const struct node_t **)item1; + const struct node_t *node2 = *(const struct node_t **)item2; + if (node2->weight != node1->weight) + return node2->weight - node1->weight; + if (node2->bits - node1->bits == 0) + fprintf(stderr, "identical node sort keys, should not happen!\n"); + return (int)node1->bits - (int)node2->bits; +} + + +//------------------------------------------------- +// build_tree - build a huffman tree based on the +// data distribution +//------------------------------------------------- + +int huffman_build_tree(struct huffman_decoder* decoder, uint32_t totaldata, uint32_t totalweight) +{ + // make a list of all non-zero nodes + struct node_t** list = (struct node_t**)malloc(sizeof(struct node_t*) * decoder->numcodes * 2); + int curcode, listitems = 0; + memset(decoder->huffnode, 0, decoder->numcodes * sizeof(decoder->huffnode[0])); + for (curcode = 0; curcode < decoder->numcodes; curcode++) + if (decoder->datahisto[curcode] != 0) + { + list[listitems++] = &decoder->huffnode[curcode]; + decoder->huffnode[curcode].count = decoder->datahisto[curcode]; + decoder->huffnode[curcode].bits = curcode; + + // scale the weight by the current effective length, ensuring we don't go to 0 + decoder->huffnode[curcode].weight = ((uint64_t)decoder->datahisto[curcode]) * ((uint64_t)totalweight) / ((uint64_t)totaldata); + if (decoder->huffnode[curcode].weight == 0) + decoder->huffnode[curcode].weight = 1; + } +/* + fprintf(stderr, "Pre-sort:\n"); + for (int i = 0; i < listitems; i++) { + fprintf(stderr, "weight: %d code: %d\n", list[i]->m_weight, list[i]->m_bits); + } +*/ + // sort the list by weight, largest weight first + qsort(&list[0], listitems, sizeof(list[0]), huffman_tree_node_compare); +/* + fprintf(stderr, "Post-sort:\n"); + for (int i = 0; i < listitems; i++) { + fprintf(stderr, "weight: %d code: %d\n", list[i]->m_weight, list[i]->m_bits); + } + fprintf(stderr, "===================\n"); +*/ + // now build the tree + int nextalloc = decoder->numcodes; + while (listitems > 1) + { + // remove lowest two items + struct node_t* node1 = &(*list[--listitems]); + struct node_t* node0 = &(*list[--listitems]); + + // create new node + struct node_t* newnode = &decoder->huffnode[nextalloc++]; + newnode->parent = NULL; + node0->parent = node1->parent = newnode; + newnode->weight = node0->weight + node1->weight; + + // insert into list at appropriate location + int curitem; + for (curitem = 0; curitem < listitems; curitem++) + if (newnode->weight > list[curitem]->weight) + { + memmove(&list[curitem+1], &list[curitem], (listitems - curitem) * sizeof(list[0])); + break; + } + list[curitem] = newnode; + listitems++; + } + + // compute the number of bits in each code, and fill in another histogram + int maxbits = 0; + for (curcode = 0; curcode < decoder->numcodes; curcode++) + { + struct node_t *curnode; + struct node_t* node = &decoder->huffnode[curcode]; + node->numbits = 0; + node->bits = 0; + + // if we have a non-zero weight, compute the number of bits + if (node->weight > 0) + { + // determine the number of bits for this node + for (curnode = node; curnode->parent != NULL; curnode = curnode->parent) + node->numbits++; + if (node->numbits == 0) + node->numbits = 1; + + // keep track of the max + maxbits = MAX(maxbits, ((int)node->numbits)); + } + } + return maxbits; +} + + +//------------------------------------------------- +// assign_canonical_codes - assign canonical codes +// to all the nodes based on the number of bits +// in each +//------------------------------------------------- + +enum huffman_error huffman_assign_canonical_codes(struct huffman_decoder* decoder) +{ + // build up a histogram of bit lengths + int curcode, codelen; + uint32_t bithisto[33] = { 0 }; + for (curcode = 0; curcode < decoder->numcodes; curcode++) + { + struct node_t* node = &decoder->huffnode[curcode]; + if (node->numbits > decoder->maxbits) + return HUFFERR_INTERNAL_INCONSISTENCY; + if (node->numbits <= 32) + bithisto[node->numbits]++; + } + + // for each code length, determine the starting code number + uint32_t curstart = 0; + for (codelen = 32; codelen > 0; codelen--) + { + uint32_t nextstart = (curstart + bithisto[codelen]) >> 1; + if (codelen != 1 && nextstart * 2 != (curstart + bithisto[codelen])) + return HUFFERR_INTERNAL_INCONSISTENCY; + bithisto[codelen] = curstart; + curstart = nextstart; + } + + // now assign canonical codes + for (curcode = 0; curcode < decoder->numcodes; curcode++) + { + struct node_t* node = &decoder->huffnode[curcode]; + if (node->numbits > 0) + node->bits = bithisto[node->numbits]++; + } + return HUFFERR_NONE; +} + + +//------------------------------------------------- +// build_lookup_table - build a lookup table for +// fast decoding +//------------------------------------------------- + +void huffman_build_lookup_table(struct huffman_decoder* decoder) +{ + // iterate over all codes + int curcode; + for (curcode = 0; curcode < decoder->numcodes; curcode++) + { + // process all nodes which have non-zero bits + struct node_t* node = &decoder->huffnode[curcode]; + if (node->numbits > 0) + { + // set up the entry + lookup_value value = MAKE_LOOKUP(curcode, node->numbits); + + // fill all matching entries + int shift = decoder->maxbits - node->numbits; + lookup_value *dest = &decoder->lookup[node->bits << shift]; + lookup_value *destend = &decoder->lookup[((node->bits + 1) << shift) - 1]; + while (dest <= destend) + *dest++ = value; + } + } +} \ No newline at end of file diff --git a/core/cd_hw/libchdr/src/huffman.h b/core/cd_hw/libchdr/src/huffman.h new file mode 100644 index 0000000..777ca4e --- /dev/null +++ b/core/cd_hw/libchdr/src/huffman.h @@ -0,0 +1,88 @@ +// license:BSD-3-Clause +// copyright-holders:Aaron Giles +/*************************************************************************** + + huffman.h + + Static Huffman compression and decompression helpers. + +***************************************************************************/ + +#pragma once + +#ifndef __HUFFMAN_H__ +#define __HUFFMAN_H__ + +#include "bitstream.h" + + +//************************************************************************** +// CONSTANTS +//************************************************************************** + +enum huffman_error +{ + HUFFERR_NONE = 0, + HUFFERR_TOO_MANY_BITS, + HUFFERR_INVALID_DATA, + HUFFERR_INPUT_BUFFER_TOO_SMALL, + HUFFERR_OUTPUT_BUFFER_TOO_SMALL, + HUFFERR_INTERNAL_INCONSISTENCY, + HUFFERR_TOO_MANY_CONTEXTS +}; + + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +typedef uint16_t lookup_value; + +// a node in the huffman tree +struct node_t +{ + struct node_t* parent; // pointer to parent node + uint32_t count; // number of hits on this node + uint32_t weight; // assigned weight of this node + uint32_t bits; // bits used to encode the node + uint8_t numbits; // number of bits needed for this node +}; + +// ======================> huffman_context_base + +// context class for decoding +struct huffman_decoder +{ + // internal state + uint32_t numcodes; // number of total codes being processed + uint8_t maxbits; // maximum bits per code + uint8_t prevdata; // value of the previous data (for delta-RLE encoding) + int rleremaining; // number of RLE bytes remaining (for delta-RLE encoding) + lookup_value * lookup; // pointer to the lookup table + struct node_t * huffnode; // array of nodes + uint32_t * datahisto; // histogram of data values + + // array versions of the info we need + //node_t* huffnode_array; //[_NumCodes]; + //lookup_value* lookup_array; //[1 << _MaxBits]; +}; + +// ======================> huffman_decoder + +struct huffman_decoder* create_huffman_decoder(int numcodes, int maxbits); +void delete_huffman_decoder(struct huffman_decoder* decoder); + +// single item operations +uint32_t huffman_decode_one(struct huffman_decoder* decoder, struct bitstream* bitbuf); + +enum huffman_error huffman_import_tree_rle(struct huffman_decoder* decoder, struct bitstream* bitbuf); +enum huffman_error huffman_import_tree_huffman(struct huffman_decoder* decoder, struct bitstream* bitbuf); + +int huffman_build_tree(struct huffman_decoder* decoder, uint32_t totaldata, uint32_t totalweight); +enum huffman_error huffman_assign_canonical_codes(struct huffman_decoder* decoder); +enum huffman_error huffman_compute_tree_from_histo(struct huffman_decoder* decoder); + +void huffman_build_lookup_table(struct huffman_decoder* decoder); + +#endif diff --git a/gx/gui/menu.c b/gx/gui/menu.c index 0aeafb8..77e0194 100644 --- a/gx/gui/menu.c +++ b/gx/gui/menu.c @@ -3,7 +3,7 @@ * * Genesis Plus GX menu * - * Copyright Eke-Eke (2009-2016) + * Copyright Eke-Eke (2009-2017) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: @@ -3634,9 +3634,9 @@ static void showcredits(void) if (texture) gxDrawTexture(texture, (640-texture->width)/2, (480-texture->height)/2, texture->width, texture->height,255); - FONT_writeCenter("Genesis Plus Core", 24, 0, 640, 480 - offset, (GXColor)LIGHT_BLUE); - FONT_writeCenter("improved emulation code & extra features by Eke-Eke", 18, 0, 640, 516 - offset, (GXColor)WHITE); - FONT_writeCenter("original 1.3 version by Charles MacDonald", 18, 0, 640, 534 - offset, (GXColor)WHITE); + FONT_writeCenter("Genesis Plus GX Core", 24, 0, 640, 480 - offset, (GXColor)LIGHT_BLUE); + FONT_writeCenter("improved emulation code & additional features by Eke-Eke", 18, 0, 640, 516 - offset, (GXColor)WHITE); + FONT_writeCenter("original Genesis Plus (1.3) version by Charles MacDonald", 18, 0, 640, 534 - offset, (GXColor)WHITE); FONT_writeCenter("original Z80 core by Juergen Buchmueller", 18, 0, 640, 552 - offset, (GXColor)WHITE); FONT_writeCenter("original 68k core (Musashi) by Karl Stenerud", 18, 0, 640, 570 - offset, (GXColor)WHITE); FONT_writeCenter("original YM2612/2413 cores by Jarek Burczynski, Tatsuyuki Satoh", 18, 0, 640, 588 - offset, (GXColor)WHITE); @@ -3644,36 +3644,40 @@ static void showcredits(void) FONT_writeCenter("Blip Buffer Library & NTSC Video Filter by Shay Green (Blargg)", 18, 0, 640, 624 - offset, (GXColor)WHITE); FONT_writeCenter("3-Band EQ implementation by Neil C", 18, 0, 640, 642 - offset, (GXColor)WHITE); FONT_writeCenter("Ogg Vorbis 'Tremor' Library by Xiph.org Foundation", 18, 0, 640, 660 - offset, (GXColor)WHITE); + FONT_writeCenter("CHD Library by Aaron Giles, Romain Tisserand", 18, 0, 640, 678 - offset, (GXColor)WHITE); + FONT_writeCenter("FLAC Library by Josh Coalson & Xiph.org Foundation", 18, 0, 640, 696 - offset, (GXColor)WHITE); + FONT_writeCenter("ZLIB Library by Jean-loup Gailly & Mark Adler", 18, 0, 640, 714 - offset, (GXColor)WHITE); + FONT_writeCenter("LZMA Library by Igor Pavlov", 18, 0, 640, 732 - offset, (GXColor)WHITE); - FONT_writeCenter("Special thanks to ...", 20, 0, 640, 700 - offset, (GXColor)LIGHT_GREEN); - FONT_writeCenter("Nemesis, Tasco Deluxe, Bart Trzynadlowski, Jorge Cwik, Haze,", 18, 0, 640, 736 - offset, (GXColor)WHITE); - FONT_writeCenter("Stef Dallongeville, Notaz, AamirM, Steve Snake, Charles MacDonald", 18, 0, 640, 754 - offset, (GXColor)WHITE); - FONT_writeCenter("Spritesmind & SMS Power forums members for their technical help", 18, 0, 640, 772 - offset, (GXColor)WHITE); + FONT_writeCenter("Special thanks to ...", 20, 0, 640, 772 - offset, (GXColor)LIGHT_GREEN); + FONT_writeCenter("Nemesis, Tasco Deluxe, Mask of Destiny, Bart Trzynadlowski, Haze,", 18, 0, 640, 808 - offset, (GXColor)WHITE); + FONT_writeCenter("Jorge Cwik, Stef, Notaz, AamirM, Steve Snake, Charles MacDonald", 18, 0, 640, 826 - offset, (GXColor)WHITE); + FONT_writeCenter("Spritesmind & SMS Power forums members for their technical help", 18, 0, 640, 844 - offset, (GXColor)WHITE); - FONT_writeCenter("Gamecube & Wii port", 24, 0, 640, 830 - offset, (GXColor)LIGHT_BLUE); - FONT_writeCenter("porting code, GUI engine & design by Eke-Eke", 18, 0, 640, 866 - offset, (GXColor)WHITE); - FONT_writeCenter("original Gamecube port by Softdev, Honkeykong & Markcube", 18, 0, 640, 884 - offset, (GXColor)WHITE); - FONT_writeCenter("original icons, logo & button design by Low Lines", 18, 0, 640, 906 - offset, (GXColor)WHITE); - FONT_writeCenter("credit illustration by Orioto (Deviant Art)", 18, 0, 640, 924 - offset, (GXColor)WHITE); - FONT_writeCenter("memory card icon design by Brakken", 18, 0, 640, 942 - offset, (GXColor)WHITE); - FONT_writeCenter("libogc by Shagkur & various other contibutors", 18, 0, 640, 960 - offset, (GXColor)WHITE); - FONT_writeCenter("libfat by Chism", 18, 0, 640, 978 - offset, (GXColor)WHITE); - FONT_writeCenter("wiiuse by Michael Laforest (Para)", 18, 0, 640, 996 - offset, (GXColor)WHITE); - FONT_writeCenter("asndlib & OGG player by Francisco Muņoz (Hermes)", 18, 0, 640, 1014 - offset, (GXColor)WHITE); - FONT_writeCenter("zlib & libpng by their respective authors", 18, 0, 640, 1032 - offset, (GXColor)WHITE); - FONT_writeCenter("devkitPPC by Wintermute", 18, 0, 640, 1050 - offset, (GXColor)WHITE); + FONT_writeCenter("Gamecube & Wii port", 24, 0, 640, 902 - offset, (GXColor)LIGHT_BLUE); + FONT_writeCenter("porting code, GUI engine & design by Eke-Eke", 18, 0, 640, 938 - offset, (GXColor)WHITE); + FONT_writeCenter("original Gamecube port by Softdev, Honkeykong & Markcube", 18, 0, 640, 956 - offset, (GXColor)WHITE); + FONT_writeCenter("original icons, logo & button design by Low Lines", 18, 0, 640, 974 - offset, (GXColor)WHITE); + FONT_writeCenter("credit illustration by Orioto (Deviant Art)", 18, 0, 640, 992 - offset, (GXColor)WHITE); + FONT_writeCenter("memory card icon design by Brakken", 18, 0, 640, 1010 - offset, (GXColor)WHITE); + FONT_writeCenter("libogc by Shagkur & various other contibutors", 18, 0, 640, 1028 - offset, (GXColor)WHITE); + FONT_writeCenter("libfat by Chism", 18, 0, 640, 1046 - offset, (GXColor)WHITE); + FONT_writeCenter("wiiuse by Michael Laforest (Para)", 18, 0, 640, 1064 - offset, (GXColor)WHITE); + FONT_writeCenter("asndlib & OGG player by Francisco Muņoz (Hermes)", 18, 0, 640, 1082 - offset, (GXColor)WHITE); + FONT_writeCenter("libpng by their respective authors", 18, 0, 640, 1100 - offset, (GXColor)WHITE); + FONT_writeCenter("devkitPPC by Wintermute", 18, 0, 640, 1118 - offset, (GXColor)WHITE); - FONT_writeCenter("Special thanks to ...", 20, 0, 640, 1090 - offset, (GXColor)LIGHT_GREEN); - FONT_writeCenter("Softdev, Tmbinc, Costis, Emukiddid, Team Twiizer", 18, 0, 640, 1126 - offset, (GXColor)WHITE); - FONT_writeCenter("Brakken & former Tehskeen members for their support", 18, 0, 640, 1144 - offset, (GXColor)WHITE); - FONT_writeCenter("Anca, my wife, for her patience & various ideas", 18, 0, 640, 1162 - offset, (GXColor)WHITE); + FONT_writeCenter("Special thanks to ...", 20, 0, 640, 1158 - offset, (GXColor)LIGHT_GREEN); + FONT_writeCenter("Softdev, Tmbinc, Costis, Emukiddid, Team Twiizer", 18, 0, 640, 1194 - offset, (GXColor)WHITE); + FONT_writeCenter("Brakken & former Tehskeen members for their support", 18, 0, 640, 1212 - offset, (GXColor)WHITE); + FONT_writeCenter("Anca, my wife, for her patience & various ideas", 18, 0, 640, 1230 - offset, (GXColor)WHITE); gxSetScreen(); p = m_input.keys; gxSetScreen(); p |= m_input.keys; offset ++; - if (offset > 1144) + if (offset > 1222) offset = 0; } diff --git a/gx/gui/menu.h b/gx/gui/menu.h index 6a75eab..dbd14be 100644 --- a/gx/gui/menu.h +++ b/gx/gui/menu.h @@ -3,7 +3,7 @@ * * Genesis Plus GX menus * - * Copyright Eke-Eke (2009-2016) + * Copyright Eke-Eke (2009-2017) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: diff --git a/libretro/Makefile.common b/libretro/Makefile.common index acb620a..0c303d2 100644 --- a/libretro/Makefile.common +++ b/libretro/Makefile.common @@ -8,6 +8,14 @@ GENPLUS_SRC_DIR := $(CORE_DIR)/core \ $(CORE_DIR)/core/cart_hw \ $(CORE_DIR)/core/cart_hw/svp +ifeq ($(HAVE_CHD), 1) + INCFLAGS += -I$(CHDLIBDIR)/src -I$(CHDLIBDIR)/deps/libFLAC/include -I$(CHDLIBDIR)/deps/lzma -I$(CHDLIBDIR)/deps/zlib + GENPLUS_SRC_DIR += $(CHDLIBDIR)/src + GENPLUS_SRC_DIR += $(CHDLIBDIR)/deps/libFLAC + GENPLUS_SRC_DIR += $(CHDLIBDIR)/deps/lzma + GENPLUS_SRC_DIR += $(CHDLIBDIR)/deps/zlib +endif + SOURCES_C = $(foreach dir,$(GENPLUS_SRC_DIR),$(wildcard $(dir)/*.c)) ifeq ($(SHARED_LIBVORBIS),) diff --git a/libretro/libretro.c b/libretro/libretro.c index cd1f530..a8da8e3 100644 --- a/libretro/libretro.c +++ b/libretro/libretro.c @@ -1764,7 +1764,7 @@ void retro_get_system_info(struct retro_system_info *info) #define GIT_VERSION "" #endif info->library_version = "v1.7.4" GIT_VERSION; - info->valid_extensions = "mdx|md|smd|gen|bin|cue|iso|sms|gg|sg"; + info->valid_extensions = "mdx|md|smd|gen|bin|cue|iso|chd|sms|gg|sg"; info->block_extract = false; info->need_fullpath = true; }