Oodle Development History
This change log includes the Oodle development history.
Release 2.9.0 - March 23, 2021
- fix : OodleLZ_Compress had an encoder crash bug in the Optimal level encodes on data in sizes just slightly over a 256KB chunk (eg. 262145) with a repeated substring at the very end
- change : Mac libs and dylibs are now fat binaries with x64 and ARM64
- change : Tex : Oodle Texture no longer checks for license file
- change : defining OODLE_IMPORT_LIB / OODLE_IMPORT_DLL is no longer needed; you can link with either type of lib without setting a define
- change : Oodle public headers no longer define types like U8, SINTa, they are instead OO_U8, OO_SINTa, etc.
- change : Oodle public headers now require stdint.h which on Windows/MSVC means VC2010 or higher
- change : Net : OODLE_PLATFORM_HAS_SELECTDICTIONARYANDTRAIN define removed. Call OodleNetwork1_SelectDictionarySupported instead.
- removed : Core : support for the deprecated LZ compressors is now removed (LZH,LZA,etc.). Only newlz (Kraken,Mermaid,Selkie,Leviathan,Hydra) and LZB16 are supported.
- removed : Core : OodleLZ_CompressContext_* functions removed; streaming encoders no longer supported
- removed : Ext : OODLEX_PATH_* public defines removed.
- removed : Ext : OODLEX_WCHAR_SIZE public define removed.
- removed : Tex : OodleTex_CheckLicense func removed ; Oodle Texture no longer checks for license files
- deprecation : OodleConfigValues::m_OodleLZ_Small_Buffer_LZ_Fallback_Size no longer used; newlz compressors no longer ever drop down to LZB16 (default behavior unchanged)
Release 2.8.14 - 2.8.x long term support release version
update March 21, 2021
- fix : OodleLZ_Compress had an encoder crash bug in the Optimal level encodes on data in sizes just slightly over a 256KB chunk (eg. 262145) with a repeated substring at the very end
- fix : PS4 decode speed regression fixed
Release 2.8.14 - February 15, 2021
- enhancement : BC7 encoding is faster ; slightly different encodings at higher speed with similar quality
- new : Mac ARM64 build now provided ; Mac example exes are fat x64+arm64
- new : Apple tvOS build now provided
- deprecation : Mac 32 bit x86 build no longer provided
- change : Xbox built with Nov 2020 GDK
- change : PS5 built with SDK 2.0
- change : PS4 built with SDK 8.0
- note : NX built with SDK 9.4.1
- note : Windows built with MSVC 2017
- regression : PS4 decode speed worse due to clang 10 in SDK 8.0
Release 2.8.13 - November 4, 2020
- fix : BC1 RDO could compute different results on Intel and AMD processors
- change : remove use of CRT in MSVC builds to remove -MT/-MD incompatibility
Release 2.8.12 - September 18, 2020
- change : Unreal Oodle Texture plugin now has support for all consoles
- change : Unreal Oodle Data plugin better support for soft disable and per-platform disable
- change : Texture full license files never stop working even if they are expired; eval licenses add 30 day grace period
- enhancement : Fix some regressions from 2.6.3 in OodleLZ encode & decode speed, particularly with Mermaid and Selkie on tiny buffers (tested on 1k and 4k)
- enhancement : clang10 Linux build with Jcc erratum mitigation workaround, and vc 2019, optional builds (gcc 47 and vc 2017 primary builds still available)
Release 2.8.11 - August 20, 2020
- change : OodleTex_BC1_WithTransparency and OodleTex_BC2 now also support RDO ; OodleTex_BC1_WithTransparency can be used to preserve opaque alpha in the BC1 encoding.
- fix : Unreal integration for Oodle Texture was incorrectly using OodleTex_BC1 which has undefined alpha value; Unreal requires OodleTex_BC1_WithTransparency to output opaque alpha
- enhancement : OodleTex_BC1_WithTransparency non-RDO encode faster (was slower than BC1, now roughly same speed)
- enhancement : BC1-BC3 RDO quality very slightly better
Release 2.8.10 - August 4, 2020
- new : OodleTex_PixelFormat_GetName and OodleTex_BC_GetName helpers
- change : OodleTex_EncodeBCN_RDO and OodleTex_EncodeBCN_LinearSurfaces now accept more than 1 input surface with layout = NULL, so all mips/slices can be encoded in one call
- change : otexdds example now does all mips/volumes as a single Encode call for better parallelism
- change : default OodlePlugins_SetPrintf log plugin in MSVC platforms now uses stdio, creating a ucrt VC 2015+ dependency (previously all other platforms used stdio but MSVC platforms did not)
- change : (Windows only) when license is expired, it shows a message box and allows you to keep running rather than just failing
- fix : license file date compare could incorrectly report an expired license when it wasn't
- fix : potential race causing a crash in example_jobify_linuxtbb.inl (same as example_jobify_win32tp.inl fix in last release)
Release 2.8.9 - July 25, 2020
- new : Oodle Texture integration for UE4 (TextureFormatOodle for UE4.25.1)
- enhancement : Oodle Texture RDO encode much faster on large images
- change : Oodle Windows static lib build was using static lib CRT, changed to DLL CRT.
- change : OODLE_WORKERS_COUNT_ALL_HYPER_CORES can be used with OodleXInitOptions m_OodleInit_Workers_Count
- change : iOS libs incorrectly had the version number in the name (Oodle static libs do not have version number in the name, dynamic libs do)
- fix : Oodle Network training could fail on input larger than 2 GB (32 bit count overflow)
- fix : potential race causing a crash in example_jobify_win32tp.inl in dep link lifetime
Release 2.8.8 - July 7, 2020
- new : OodleTexRT_PS5GPU_BC7Prep_DecodeMulti to decode multiple BC7Prep chunks at once with reduced memory use and GPU synchronization overhead
- new : GPU-side BC7Prep decoding now supported on Xbox Series X, Xbox One and PS4
- enhancement : CPU-side BC7Prep decoding is significantly faster for large textures or when decoding to write-combined memory, and requires less scratch memory
- enhancement : PS5 GPU BC7Prep decode is 2x-3x faster, uses less GPU memory bandwidth, and significantly less scratch memory
- change : rename OodleTex_PixelFormat_3_F32_RGBA to OodleTex_PixelFormat_3_F32_RGB
- change : PS5 GPU BC7Prep no longer implicitly performs any cache invalidations; this is now up to the app.
- deprecation : OodleTexRT_BC7Prep_PS5GPU_Init is deprecated, call OodleTexRT_PS5GPU_Init instead
- deprecation : OodleTexRT_BC7Prep_PS5GPU_MinDecodeScratchSize is deprecated, call OodleTexRT_PS5GPU_BC7Prep_MinDecodeScratchSize instead
- deprecation : OodleTexRT_BC7Prep_PS5GPU_Decode is deprecated, use OodleTexRT_PS5GPU_BC7Prep_DecodeMulti instead
- fix : Xbox import lib names for DLLs had version number in the lib name; remove to match Windows names. Version number is in the DLL but not the import lib name.
- fix : 1 and 2 channel U16 promotion to 4 channel was not filling the implicit opaque alpha correctly, affected BC4 and BC5 decodes to 4 channel formats
Release 2.8.7 - June 8, 2020
- new : Oodle Texture! Oodle Texture is a new product separate from Oodle Data. Oodle Texture dramatically reduces the size of block-compressed BC1-BC7 textures.
- change : executables provided with SDK are now in bin dir
- change : oodle2base.h header with basic types now shared by Oodle Data, Net, and Texture
- change : example_jobify now provides a plug-in job system that can be used with Oodle Data, Net, and Texture
- change : t_fp_Oodle_Job common data type for Jobify functions in Oodle Data, Net, and Texture (replaces t_fp_OodleCore_Plugin_Job)
- change : OODLE_JOB_MAX_DEPENDENCIES common define for Jobify in Oodle Data, Net, and Texture (replaces OODLECORE_PLUGIN_JOB_MAX_DEPENDENCIES)
- change : _SALSA_ define no longer needed for PS5 Oodle header
- change : remove OodleLZ_CompressionLevel_Count ; the correct range is [Min,Max] because of negative levels
Release 2.8.6 - May 9, 2020
- new: OodlePlugins_SetJobSystemAndCount replaces OodlePlugins_SetJobSystem with desired parallelism argument
- enhancement : Leviathan decodes 5-10% faster on modern x86/64 platforms.
- change : Oodle build for Windows now compiled with MSVC 2017 and uses ucrt
- change : Oodle build for Mustard now compiled with MSVC 2017
- change : fix Mac and Linux debug & dead stripping
- deprecation : remove async Cancels from the public API (OodleX_CancelOrWait_AndDelete, OodleX_WaitCancelAllPending, OodleXIOQ_Pause, OodleXIOQ_WaitCancelAllPending)
- deprecation : m_OodleLZ_Desired_Parallel_BranchFactor removed from OodleXConfigValues, now automatically scaled to worker count
- deprecation : OodlePlugins_SetJobSystem is deprecated. Prefer OodlePlugins_SetJobSystemAndCount.
- deprecation : OodleXPriority levels are no longer exposed to the client. Client work should be OodleXPriority_Normal only. Prevents a potential deadlock bug mixing high priority client work with Core Jobs.
Release 2.8.5 - March 10, 2020
- fix : iOS build could assert "OodleAssert, 32 >= 48" in debug builds; this was also a bug in release builds on iOS that could cause stack variable corruption; do not use sendQuantumCRCs on iOS before this version!
- new: initial Mustard release version
- new: Xbox One GDK release version
- change : Stadia build variant
Release 2.8.4 - October 31, 2019
- fix : OodleNetwork1UDP_Encode could read one byte past the end of the input buffer, causing an access violation. The extra byte read was not used in coding, there's no problem with the compressed packets made. Allocating the input buffer with padding is an acceptable workaround for older versions.
Release 2.8.3 - October 4, 2019
- new: initial Salsa release version
- change : Stadia build SO extracts debug info to .debug file and uses add-gnu-debuglink to link to it
- change : disable debug info in Linux ARM64 build because of TLS debug relocation bug in clang
Release 2.8.2 - September 19, 2019
- fix : Rare non-critical issue : "WARNING: Too many indices for decoder scratch!" could be logged by the encoder in Leviathan Level 9. Valid compressed data was still made, but in some cases it was suboptimal.
- fix : Rare crash bug in Optimal level encoders on large buffers (LRM degeneracy jumpInShift 32) (since 2.8.1)
- fix : fix some spurious valgrind detections in Oodle (there were no bugs)
Release 2.8.1 - July 7, 2019
- new: Oodle Core API : OodleLZ_GetFirstChunkCompressor preferred name of old API OodleLZ_GetChunkCompressor
- new: Oodle Core API : OodleLZ_GetAllChunksCompressor should be used when chunks may have heterogeneous compressors (eg. with Hydra)
- new: Oodle Ext API : OodleX_CorePlugin_RunJob and OodleX_CorePlugin_WaitJob
- new: Oodle Ext API : OodleX_GetNumWorkerThreads
- enhancement : reduce OodleLZ_GetCompressScratchMemBound, particularly on small buffers and small hash table options, and more so for Mermaid/Selkie
- enhancement : OodleLZDecoder_MemorySizeNeeded was increased in version 2.8.0 to allow for apparent Mermaid/Selkie data possibly being Hydra ; it is now reduced back down and OodleLZ_GetAllChunksCompressor should be used to detect Hydra data.
- enhancement : Optimal level encoders 5-10% faster on large buffers (LRM Bloom filter)
- change : Hydra data now needs to be explicitly identified when used as the OodleLZ_Compressor type in functions like OodleLZDecoder_MemorySizeNeeded (or use OodleLZ_GetAllChunksCompressor)
- change : built with Switch SDK 7.4.0 (clang 7.0.1)
- change : built with PS4 SDK 6.5 (clang 7.0.1)
- fix : Switch : fix intermittent problem with debugging in the VSI in apps that use Oodle; Oodle linkage confused the debugger.
- fix : OodleLZ_GetCompressedStepForRawStep was incorrectly casting the return value to 32 bit, making it wrong for steps over 2 GB
- fix : fix rare read out of array bounds in Kraken & Leviathan encoder (multiarrays non-indexed splitter), would not be an access violation or compression failure, but could cause unexpected behavior and non-deterministic encoding.
- deprecation : OodleLZ_GetChunkCompressor will be removed in the future; use OodleLZ_GetAllChunksCompressor or OodleLZ_GetFirstChunkCompressor
- deprecation : OodleXMallocCall family of functions were incorrectly public, removed
Release 2.8.0 - April 9, 2019
- new : OodleCore_Plugins_SetJobSystem for Job plugin system to thread work in Oodle Core using a user-provided worker thread system (see Oodle_About_Job_Threading_Plugins)
- new : OodleLZ_GetCompressScratchMemBound to query how much scratch is needed for OodleLZ_Compress to avoid additional allocations
- new : example_lz_noallocs : example demonstrating Oodle compression & decompression with no allocations done by Oodle
- enhancement : Optimal level encoders are faster, particularly Kraken, and even more so with Jobify threading (but also faster single threaded)
- enhancement : Leviathan fast levels (SuperFast-Normal) encode much faster with a small decrease in compression ratio
- change : API : WARNING CompressOptions struct changed. Old fields have not moved, new fields have been added at the end of the struct. Zero initializing the new fields means "use default".
- change : CompressOptions:jobify option to control threading of the OodleLZ_Compress encoder in Oodle Core (see Oodle_About_Job_Threading_Plugins)
- change : CompressOptions:farMatchMinLen option to allow decode platform cache targeting of the encoded stream
- change : CompressOptions:spaceSpeedTradeoffBytes value of zero now means "use default" (256) to make it consistent with all other Options taking zero for "default". Use negative to get zero.
- change : docs are now html instead of chm
- change : Android x86_64 build
- change : add a Mermaid HyperFast4 level (previously HF4 was the same as HF3 in Mermaid)
- change : API : OodleLZ_GetDecodeBufferSize, OodleLZ_GetCompressedBufferSizeNeeded and OodleLZ_GetInPlaceDecodeBufferSize : take compressor argument to return smaller padding for the new codecs.
- change : API : OodleLZ_GetChunkCompressor : take compressed size argument to ensure it doesn't read past end
- change : Kraken Optimal1 level gets a bit less compression in trade off for much faster encoding
- fix : WARNING! Nasty destructive bug in the example code : examples calling "make_example_input" were stomping the input file. This was not in the Oodle libs, just the example code.
- fix : Leviathan no longer uses the allocator if sufficient scratch mem is passed in to OodleLZ_Compress
- fix : bug in Leviathan scratch accounting could rarely make it refuse to encode some chunks (valid compressed data would still be made, but it might be suboptimal)
- fix : Mermaid/Selkie in-place decompression could fail ("in place" decoding is when the input compressed and output decompressed buffers overlap)
- fix : OodleX worker threads restored to LIFO wakeup order after being incorrectly FIFO for a few versions (improves cache coherence)
- deprecation : OodleXLZ_ReadCompressWrite_Async API removed
- deprecation : CompressOptions previously deprecated maxHuffmansPerChunk now unused
- deprecation : CompressOptions verbosity deprecated; wasn't used by the new compressors anyway
Release 2.7.6 - December 18, 2018
- enhancement : Linux ARM64 : Mermaid/Selkie decode faster
- change : Android libs now in abi subdirectories
- change : added new usage warning that verifies the compressed buffer passed in to OodleLZ_Compress is at least OodleLZ_GetCompressedBufferSizeNeeded bytes long; can be disabled with Oodle_SetUsageWarnings
- fix : Fix Leviathan at Optimal levels using a large amount of stack memory (was 512k, now fits in 64k)
- fix : Fix the Unreal .build.cs rules for the Oodle integration on non-Windows platforms, for Unreal 4.20
- fix : Fix the Unreal data integration with bAsync compression turned on there could be a crash due to a race
- fix : Fix Oodle Network lib name on Switch ; was "oo2corenet" should be "oo2netswitch"
- fix : Fix a bug in the Mermaid/Selkie decode on Switch that could cause a fuzz safety failure (overrun on corrupt data)
Release 2.7.5 - October 31, 2018
- new : OodleLZ_Compressor_RespectsDictionarySize property query tells if a compressor obeys OodleLZ_CompressOptions:dictionarySize (all the new codecs do, some old ones do not)
- new : ozip -b (benchmark) command line argument, similar to zstd -b
- enhancement : Linux ARM64 : enable ASM optimized kernels in build
- change : clarify that seek chunk boundaries are relative to dictionary base, not current raw buffer
- change : old compressor LZH was doing archaic RLE mode at level 1 (superfast), now removed
- change : Oodle Windows SDK import libs back in the "lib" folder (temporarily was "import_lib")
- fix : Fix bug with seekChunkReset on very large buffers (over 1 GB)
- fix : OodleLZ_CompressOptions_Validate was not making seekChunkLen power of 2, which it must be
- fix : change OODLELZ_SEEKCHUNKLEN_MAX from 1 GB to half GB. (recommend using OodleLZ_MakeSeekChunkLen)
Release 2.7.4 - October 25, 2018
- fix : Fix bug in Leviathan Optimal5 (level 9) encoder reading uninitialized memory. The encoder did not crash and always made valid data, but it was not deterministic.
Release 2.7.3 - October 10, 2018
- enhancement : Mermaid, Kraken & Leviathan decompress faster in 32-bit by about 5% on x86, even more on ARM.
- change : Oodle windows SDK now ships DLLs and static libs. Libs are in "import_lib" and "static_lib". (dir names changed in 2.7.5). To use the static lib define OODLE_IMPORT_LIB.
- fix : Fix bug that could cause the Kraken & Leviathan encoder to crash at level 8 and 9.
Release 2.7.2 - September 10, 2018
- fix : Fix linkage in 32-bit iOS build
Release 2.7.1 SDK Update - August 13, 2018
- change : Switch SDK updated to 5.5
- change : PS4 SDK updated to 5.5
Release 2.7.1 - August 8, 2018
- fix : Fix a fuzz safety failure. Decoding corrupt or attack data with Mermaid or Selkie could cause a read access violation.
Release 2.7.0 - August 6, 2018
- change : Oodle Network is now a separate SDK and lib from Oodle Data compression (Core & Ext).
- new : OodleLZ_CompressOptions::profile option added (replaces "unused")
- new : example_lz / lz_test_13 shows how static dictionaries can be used with Oodle LZ via memcpy
- enhancement : Mermaid, Kraken & Leviathan decompress faster by 5-10%
- change : OodleHuffman public APIs removed
- change : OodlePlugins_ API set renamed to OodleCore_Plugins_ and OodleNet_Plugins_ eg. OodlePlugins_SetPrintf -> OodleCore_Plugins_SetPrintf and OodleNet_Plugins_SetPrintf added
- change : PS3 and Xbox 360 builds removed
- change : Oodle Mac SDK now requires min OSX version 10.9 with libc++ instead of libstdc++ (note using the dylib prevents most of these problems; it's recommended to use the shared libs instead of the static libs if possible)
- deprecation : begin removal of archaic option; rename OodleLZ_CompressOptions::maxHuffmansPerChunk -> deprecated_maxHuffmansPerChunk
Release 2.6.3 Update 1 - July 3, 2018
- fix : iOS lib didn't include bitcode correctly
Release 2.6.3 - June 6, 2018
- new : new faster "HyperFast" compression levels; OodleLZ_CompressionLevel_HyperFast1-4 provide super fast encoding with lower compression ratios for real-time encoding needs. Available in Kraken, Mermaid & Selkie.
- new : example_lz_chart is now provided as a pre-built executable for evaluators on desktop platforms
- new : ozip executable provided on desktop platforms which acts like gzip; can be used for pipe or file compression.
- fix : Mermaid Normal encoder wasn't doing dictionary preload; this made compression ratio worse than it should be in parallel encodes (a tiny bit).
- fix : OodleXLZ_Compress_Async was running wide even when OodleXAsyncSelect_Wide flag was not set. Now uses only one thread if Wide is not set.
- fix : Compression of buffers larger than 1 GB, with Options enabled for seekChunkReset with seekChunkLen of 0.5 GB or less could create invalid compressed data which would fail to decode or not respect the requested seek chunking
Release 2.6.2 - April 30, 2018
- enhancement : improve parallelism of the OodleX Async wide compression
- fix : Some SIMD code could try to run the SSE4 variant even on CPU's that don't have SSE4, causing a crash. (Affects x86/x64 Windows, Linux & Mac)
- fix : XBox One libs failed BinScope due to NASM assembly objects setting wrong MASM version number
Release 2.6.1 - April 4, 2018
- enhancement : Huffman encoders slightly faster. Fast levels of Mermaid, Kraken, etc. about 1% faster to encode.
- fix : setting OodleLZ_CompressOptions::maxLocalDictionarySize above 2^26 could cause a crash in the optimal encoders due to S32 wrapping to negative
- fix : OodleLZ in backward compatible mode for version < 6 would not compress memset chunks correctly (would send them uncompressed); they did not fail to encode or decode, it was just inefficient
- fix : Selkie wasn't sending memset chunks; now does
- fix : Oodle Network could assert if only one packet was given to SelectDictionaryFromPackets. This bug affected the debug lib only.
- deprecation : Optimal encode levels of old codecs LZNIB, LZBLW and LZA removed. Optimal encodes with those codecs now use Normal level encoder.
Release 2.6.0 - Feb 27, 2018
- new : new compressor Leviathan !!
- new : new API Oodle_SetUsageWarnings ; usage warnings are on by default
- new : OodlePlugin_Printf_Verbose added; can be installed in Oodle Core via OodlePlugins_SetPrintf
- enhancement : Kraken & Mermaid optimal levels now get more compression (chunk adaptation & TLL parse)
- enhancement : Mermaid optimal levels now get more compression on some files (costing of entropy offsets)
- enhancement : Kraken & Mermaid generally achieve better space-speed with the >= 2.6.0 bit stream changes (smaller sizes and/or faster to decode)
- enhancement : Kraken, Mermaid & Selkie fast levels are now much faster to encode! (especially SuperFast and VeryFast)
- change : WARNING Kraken & Mermaid data made by 2.6.0 by default cannot be loaded by Oodle 2.5 and earlier ; set m_OodleLZ_BackwardsCompatible_MajorVersion if you need that. Oodle can always load data made by previous versions, but the reverse is not necessarily true.
- change : WARNING Oodle Network Compact/Uncompact is not compatible between before 2.6.0 and after 2.6.0
- change : OodleLZ_Small_Buffer_LZ_Fallback_Size default value changed to 0 so it never happens unless the client modifies this value to something larger.
- change : example_lz : added lz_test_12 showing in place decoding
- change : Hydra can select Leviathan. Hydra-compressed data cannot be loaded by Oodle 2.5 and earlier because they don't contain Leviathan. To use Hydra to make data compatible with previous versions, set m_OodleLZ_BackwardsCompatible_MajorVersion.
- change : OodleLZ_Compress API change , added scratch memory arguments so client can pass in pre-allocated memory to eliminate internal Oodle alloc calls. (non-optimal levels only in the new compressor family; optimal levels & old compressors will still do allocations even if scratch is provided)
- change : fix name of enums to match OodleX convention : OodleLog_VerboseLevel renamed to OodleXLog_VerboseLevel , OodleLog_StateFlags renamed to OodleXLog_StateFlags
- change : secret level 8 (OodleLZ_CompressionLevel_Optimal4) is now public ; no longer modifies compress options or changes space-speed tradeoff target
- change : OodleLZ_CompressionLevel_Optimal4 Mermaid & Kraken higher compression optimal parse
- change : Oodle for Switch is now built with SDK 3.4
- change : OodleHuffman_EncodeArrayU8 takes scratch memory argument to avoid internal allocation
- change : OodleXLZ_Decompress_ThreadPhased_Narrow_Async takes scratch memory argument to avoid internal allocation
- change : OodleLZ_Decompress API : default argument value of OodleLZ_FuzzSafe_No removed; recommend passing OodleLZ_FuzzSafe_Yes
- change : LZH and LZHLW removed from FuzzSafe set. If you were previously decoding them using FuzzSafe_Yes they will now fail.
- change : OodleXLZ_ReadAndDecompress_Stream_Async API : added decBufBase argument
- change : OodleLZ_CompressOptions_GetDefault at level 8 was returning a lower spaceSpeedTradeoffBytes ; don't do that anymore, the default is always 256 ; decode speed is mostly independent of compression level.
- fix : Mermaid/Selkie : some of the non-optimal encode levels were not respecting the dictionarySize option to limit the match window
- fix : Kraken/Mermaid/Selkie didn't support CompressionLevel_None correctly. They now pass through data uncompressed at that level.
- fix : Kraken/Mermaid/Selkie decoders had some potential fuzz safety violations (long matches at end of buffer)
- fix : OodleHuffman_DecodeArrayU8 wasn't doing CPU detection; it was slower than it should be if you didn't call other Oodle functions
- fix : the OodleXLZ_Compress_WriteOOZ family of functions took seekChunkLen as both as a function argument and via the OodleLZ_CompressOptions , creating a potential for mismatch ; the function argument is now removed.
- fix : Mermaid encoder was not putting backwards compatible streams correctly for major version 3 (2.3) compatibility (was always making streams for version >= 2.4.0)
- fix : Mermaid/Selkie encoder could overrun compressed buffer beyond OodleLZ_GetCompressedBufferSizeNeeded on some blocks. In parallel encoding mode this could cause corrupted compressed streams.
- fix : OodleXLZ_Decompress_ThreadPhased_Narrow_Async had a race in its finalization that could cause a read from freed memory
- fix : OodleLZDecoder_DecodeSome was incorrectly returning false when compAvail was too small to parse the first header (typically < 16 bytes); now returns true with no progress
- fix : OodleLZ_Decompress could return -1 for failure; it should always return 0 for failure (OODLELZ_FAILED); check <= 0 in previous versions
- warning : DEPRECATION : Oodle compressors that predate Kraken are being gradually deprecated. (eg. LZH, LZNA, etc.) You should always be encoding with compressors from the new Kraken family (Kraken, Mermaid, Selkie, Leviathan, Hydra). Old decompressors will be supported for the forseeable future, so old data will still be loaded but the encoders will be removed in some future version. Attempts to encode with outdated compressors is now logged as an Oodle Usage Warning. This can be disabled with Oodle_SetUsageWarnings. The OodleLZ_Compressor enums for the old codecs are now hidden; you must define OODLE_ALLOW_DEPRECATED_COMPRESSORS before including oodle2.h to get them.
- obsolescence : EASTL is no longer used
- deprecation : old OodleLZ_CompressionLevel_RLE removed
- deprecation : OodleX OOZ functions removed (OodleXLZ_Compress_WriteOOZ_Async, etc)
- deprecation : OodleXLZ_Decompress_ThreadPhased_Wide_Async removed
Release 2.5.5 - August 22, 2017
- fix : A bug in the Kraken & Mermaid encoders was introduced in Oodle 2.5.0 ; any data encoded with Kraken or Mermaid from Oodle 2.5.0 - 2.5.4 should be checked for correct decompression and re-encoded if needed. Those versions may have made data which will fail to decode, or might claim to succeed decoding but produce bad bytes. The cause was that huff streams in the encoder could collide and overwrite each other without detection. This was most likely in whole-huff chunks at 128k boundaries, on trinary-aligned data (such as RGB BMP data). This was more likely with m_OodleLZ_BackwardsCompatible_MajorVersion <= 2 but could happen in other cases.
Release 2.5.4 - August 8, 2017
- new : Windows UWP build added
- change : Oodle PS4 now built with SDK 4.500
- fix : omit-frame-pointer was set on too many builds; it is now only used in x86 (32-bit) builds
Release 2.5.3 - June 14, 2017
- fix : remove alloca use in rrHuffman that could cause crash on threads with small stack size on Linux
Release 2.5.2 - May 25, 2017
- fix : Kraken decoder had a bug that caused it to incorrectly return failure on valid compressed chunks (due to the header corruption check not counting the scratch space needed with correct accounting of the thread phasing header) - NOTE this change means OodleLZDecoder_MemorySizeNeeded is slightly larger now
- fix : fix handle leak in OodleXLZ_Compress_WriteOOZFile_AsyncAndWait when file open failed
Release 2.5.1 - May 13, 2017
- enhancement : Mermaid & Selkie encoding improved (faster and better ratio) on buffers <= 64k bytes long
- change : Oodle Mac OSX build now includes static libs and dynamic libs.
- change : Xbox One build is made with March 2017 XDK , still VC 2012 (but VC 2015 compatible)
- deprecation : LZB16 and LZBLW Optimal level encoders are gone. LZB with CompressionLevel >= Optimal1 now drops down to Normal. Use Selkie instead.
- obsolescence : libdivsufsort is no longer used
Release 2.5.0 - April 20, 2017
- new : OodleHuffman_EncodeArrayU8 and OodleHuffman_DecodeArrayU8 reintroduced as public APIs. (not compatible with old public Huffman API)
- enhancement : Kraken, Mermaid & Selkie - the non-optimal encode levels (SuperFast - Normal) get more compression and encode faster
- enhancement : Kraken, Mermaid & Selkie - faster to decode, especially on ARM (Android, iOS, Switch)
- enhancement : Hydra encoding now works in levels below Optimal
- change : NX now uses SDK 3.0
- fix : Kraken, Mermaid & Selkie - SuperFast encode level had bugs causing it to get much worse compression than necessary
- fix : LZB16 encoder at the Optimal1 level could crash due to uninitialized memory
Release 2.4.3 - February 14, 2017
- fix : Mermaid & Selkie encoders could cause an access violation reading past the end of the raw buffer if the length was just over 64k mod 128k
- fix : Some compressors failed to decode files that were (128k+1)mod 256k bytes long due to bug in fuzz safety checks
- fix : Selkie encoder was incorrectly choosing offset compression in some cases, causing slower decodes
Release 2.4.2 - January 25, 2017
- new : Nintendo NX (Switch) support (SDK 0.17.13 and 1.0.0)
- new : example_lz_outputchunking : Example demonstrating cutting OodleLZ compressed output into fixed size chunks
- enhancement : Kraken, Mermaid & Selkie now support "in-place" decoding ; OodleLZ_Compressor_CanDecodeInPlace now returns true for all OodleLZ decoders
- fix : a bug could occur in Oodle Ext 32-bit builds on systems with user memory in the top 2 GB
- fix : rename OodleLog_Printf macro to OodleXLog_Printf to match OodleX lib naming convention
- fix : LZB16 decoder crashed on 32-bit ARM Android. LZB16 was also used as the fallback for tiny buffers in Kraken/Mermaid/Selkie/Hydra.
Release 2.4.1 - October 3, 2016
- new : OodleX_ReleaseThreadTLS function to release OodleX TLS resources in the rare usage that you churn through a huge number of thread creates and destroys
- change : Clean up the behavior of OodleLZ_GetCompressedStepForRawStep when it is not given the entire compressed data; now returns -1 for error and 0 for not enough data.
- fix : Fix race in the OodleThinSemaphore used in the example code via OodleX_Semaphore_Post; this was only used by example_lz_threadphased , so should not affect any production code
- fix : Out of memory default handler would just infinite busy-loop on fgetc on non-Windows platforms
- fix : Android distribution didn't contain AArch64 libs
Release 2.4.0 - August 22, 2016
- new : Hydra ; automatically selects Kraken/Mermaid/Selkie
- new : example_lz lz_test_11 demonstrates sliding window with Kraken using memcpy
- new : Mermaid+ ; slightly higher compression, slightly lower speed ; control Mermaid vs Mermaid+ using spaceSpeedTradeoffBytes
- enhancement : LZNA level 8 (Optimal 3) tries several min match lengths
- fix : Selkie & Mermaid encoders could overrun the compressed buffer when data expanded
- fix : fix Mac dylib having a different name for its self-reference
- fix : fix Linux link error with gold on the Oodle static lib
- fix : fix iOS version min lowered to 7.0 (was 8.1)
- fix : fix race in some low level thread primitives caused by the threadprofiler. Showed up as ThreadPhased decodes hanging.
Release 2.3.0 - July 14, 2016
- new : Mermaid ! - Mermaid is a new super-fast-to-decode compressor with good compression ratios (comparable to ZLib)
- new : Selkie ! - Selkie is the fastest-decoding compressor, with low compression ratios (comparable to LZ4)
- new : new compressor property query OodleLZ_Compressor_CanDecodeFuzzSafe
- new : OodleConfigValues for core-only compressor config
- new : OodleConfigValues::m_OodleLZ_BackwardsCompatible_MajorVersion - set to 2 to make Kraken data that can be loaded by Oodle version 2.2.0
- new : lz_test_10 in example_lz demonstrates decoding quanta from a finite io buffer
- enhancement : Kraken is even faster to decode (10-20%) on all platforms
- enhancement : Kraken significantly faster to decode on ARM
- change : WARNING Kraken data made by 2.3.0 by default cannot be loaded by Oodle 2.2.0 ; set m_OodleLZ_BackwardsCompatible_MajorVersion if you need that. Oodle can always load data made by previous versions, but the reverse is not necessarily true.
- change : OodleLZ Decompress functions args changed. New OodleLZ_FuzzSafe argument. Removed the allowed_compressor_mask.
- change : OodleLZ_CompressOptions dictionarySize option added to limit offsets
- change : OodleLZ_CompressOptions offsetShift option for old LZH encoder removed (now always 0)
- change : LZB16 decoder is now fuzz safe. Very slightly slower to decode.
- fix : LZB16 Optimal1 level could crash in encode of files > 2GB
- fix : OodleLZ_GetInPlaceDecodeBufferSize was too big on tiny buffers (it's now never bigger than complen + rawlen)
- fix : iOS is shipped as static libs with extension .a
Release 2.2.0 - May 11, 2016
- new : threaded Kraken decoder! See OodleLZ_About_ThreadPhasedDecode
- new : example_lz_threadphased contains a client-side implementation of a ThreadPhased decoder
- new : Kraken Optimal3 (Level 7) mode with higher compression ratio
- enhancement : Kraken optimized for ARM processors
- enhancement : Kraken optimal parse levels improved, about 1% more compression
- change : XBox1 now built with VS 2012, but Core lib is compatible with VS 2015 (Ext will work in VC 2012 but not in VC 2015)
- change : Windows SDK redist64 dir removed; 64-bit DLL's are just in "redist"
- change : examples now include oodle2.h with a relative path so they compile out of the box
- change : Oodle2 Core lib default plugins no longer use the CRT on Microsoft platforms. See OodleAPI_OodleCore_Plugins
- change : minor version bumped for API incompatibilities
- change : OodleLZ_Decode_ThreadPhase argument added to OodleLZ_Decompress and OodleLZ_DecodeSome for 2-threaded Kraken decode. To retain previous behavior, add OodleLZ_Decode_Unthreaded to your call (or use default argument).
- change : allowed_compressor_mask argument added to OodleLZ_Decompress and OodleLZ_DecodeSome for fuzz safety. To retain previous behavior, add OODLELZ_ALLOWED_COMPRESSOR_ALL to your call (or use default argument).
- removed : Oodle Huffman public APIs removed
Release 2.1.5 - April 26, 2016
- new : Kraken !! An amazing new compressor with high compression and fast decode speed!
- change : example_packet : remove some rarely used options
- change : PS4 library now built with SDK 3.0
- change : Xbox One library now built with March 2016 QFE1 , VS 2015
- fix : LZB16 and LZBLW decoders could over-read compressed data if the last quantum was memset
- fix : example_packet : better randomization of subsets and limits in TestOodleNetwork_SelectDictionaryAndTrain
- removed : OodleLZ_GetZipLikeCompressionSettings is gone
- deprecation : LZHLW and LZNIB and LZBLW compressors are now deprecated, use Kraken instead
Release 2.1.4 - March 20, 2016
- new : example_lz lz_test_9 demonstrating block composability rules
- enhancement : LZNA Normal parse compression improved
- enhancement : LZNA wasn't using SSE on Linux or Mac ; it now does, which makes those platforms much faster
- change : Oodle Logs at verbosity level 2 are now compiled out of release builds
- change : example_lz_chart compressor set changed
- change : OodlePlugins_SetAssertion can now be called with a NULL function pointer argument as an easy way to disable all assert handling
- change : example_lz test_8 shows how to use the WithContext calls for independent buffers
- change : OodleNetwork1UDP_State_Uncompact return bool to indicate success or failure on bad data
- fix : OodleLZ_CompressWithContext with NULL CompressOptions crashed
- fix : LZBLW Normal level encoder would crash when called with dictionary preload (or large buffers)
- fix : OodleNetwork1UDP fix fuzz safety for split large packets
- fix : OodleNetwork1UDP fix fuzz safety prevent reading past end of dictionary
- fix : OodleNetwork1UDP removed all used of release-asserts, now returns failure in those cases
- fix : OodleNetwork1UDP properly document OODLENETWORK1_DECOMP_BUF_OVERREAD_LEN
Release 2.1.3 - Feb 1, 2016
- enhancement : OodleNetwork1UDP_Decode faster
- fix : OodleNetwork1UDP_Decode fuzz safety
- fix : OodleNetwork1UDP - fix possible bug in large split packet handling; now properly ensures that complen <= rawlen, and complen == rawlen always means a pass-through uncompressed packet
- deprecation : OodleLZ_Compressor_CanSPUDecompress function removed
Release 2.1.2 - Jan 16, 2016
- new : BitKnit ! BitKnit is a new LZ compressor with high compression and good speed, between LZNA and LZHLW
- enhancement : Most LZ encoders are faster
- enhancement : LZNA Fast & Normal levels get more compression
Release 2.1.1 - Nov 25, 2015
- new : example_lz_chart make a neat text chart of the Oodle compressors & levels to test performance
- new : example_network_client simple Oodle Network client example
- fix : don't store OODLE_HEADER_VERSION in the example_packet data header; use OODLE2_VERSION_MAJOR instead
- enhancement : most decoders faster by around 10% !
- enhancement : LZNIB Normal & Optimal1 parsers much improved, more compression and faster decodes!
- enhancement : LZNIB decodes faster
- enhancement : LZNA about 10% faster to decode
- enhancement : LZHLW decoder about 10% faster in 64-bit
- enhancement : LZB encoder must faster in 32-bit
- enhancement : LZNA on iOS now uses NEON, almost 2X faster to decode!
- deprecation : LZH and LZA compressors are now deprecated; use LZHLW and LZNA instead
- PS4 library now built with SDK 2.5
- Windows library now built with MSVC 2013
- Mac & iOS libraries now built with XCode 7.1
Release 2.1.0 - Oct 10, 2015
- new : Oodle2 first Beta release
Release 1.45.1 - May 13, 2015
- fix : fix bug in the LZNA level 7 (Optimal3) encoder
Release 1.45.0 - May 11, 2015
- new : New LZNA compressor! More compression than LZA and fast to decode on modern CPUs.
Release 1.44.2 - March 4, 2015
- enhancement : LZA new optimal parse; faster at Optimal1 and more compression at Optimal3
- enhancement : LZNib Normal encoder faster, better optimal parse
- enhancement : LZB Fast & VeryFast encoder faster
Release 1.44.1 - December 9, 2014
- fix : example_packet state header was not the same in 32-bit and 64-bit builds
- enhancement : example_packet LZ compression level option added
Release 1.44.0 - November 16, 2014
- new : Mac sdk now includes 64 bit libraries
- new : Android and IOS sdk's available, for Oodle Network only
- new : Unreal Engine integration of Oodle Network is available
- change : example_packet has better trained model IO
Release 1.43.0 - September 8, 2014
- fix : LZA packet compressor introduced in 1.42 was getting much less compression than it should due a bug; fixed!
Release 1.42.0 - September 3, 2014
- change : reduce memory use of LZNib and LZBLW compressors at Optimal level
- new : LZA compressor now has sliding window encoding and decoding
- new : OodleLZ_CompressWithContext incremental API now supports LZA
- change : example_packet LZA option added
- change : Oodle is using the new "radtypes.h" shared header
- enhancement : OodleNetwork1 UDP new implementation - faster, a little more compression.
- fix : Optimal parse compressors could hang on very large degenerate files
Release 1.41.0 - July 10, 2014
- new : OodleNetwork dictionary selection by string matching; see OodleNetwork1_SelectDictionaryFromPackets and example_packet ; usually improves compression
- enhancement : OodleNetwork1 TCP memory use reduced to 84104 bytes per channel
- enhancement : OodleNetwork1 UDP is faster to encode ; saved states are incompatible with older versions
- enhancement : LZNIB VeryFast and Normal much faster to encode; see Oodle_FAQ_LZCompareTable for speeds
- enhancement : LZB16-Fast and VeryFast much faster to encode; see Oodle_FAQ_LZCompareTable for speeds
- change : rename OodleNetwork1 TCP variant to OodleNetwork1TCP for clarity
- change : better default hash table sizes for LZB16
- fix : Fix bug in which packets that expanded in OodleNetwork1 TCP could cause a write at compbuf[-1]
Release 1.40.0 - June 27, 2014
- change : OodleStaticLZP renamed to OodleNetwork1
- enhancement : LZHLW compressor significantly faster to encode at all levels, especially Normal
- new : New compressor LZA for very high compression!
- fix : example_packet had a hard-coded limit of 64k for packet sizes; that was removed
- fix : OodleLZDecoder_Reset was in the header but not implemented
- new : OodleNetwork1 compressed buffer size is now limited by OodleNetwork1_CompressedBufferSizeNeeded
Release 1.30.0 - April 14, 2014
- new : Minimal library initialization; see OodleX_Init_GetDefaults_Minimal , OodleX_Init_NoThreads , OodleX_Shutdown_NoThreads
- change : OodleX_Init no longer accepts NULL options
- change : Windows : OodleX_Init no longer does timeBeginPeriod(1) ; it's now left up to the app to decide if they want to do that
- change : api simplified; many unused APIs removed
Release 1.22.0 - March 31, 2014
- new : redo docs for Oodle Network packet compression
Release 1.21.2 - March 11, 2014
- fix : OOP tool failed to extract large packages due to exceeding threading limits
- fix : SPU LZ match offsets fixed again
- fix : ThreadProfiler code stripped completely in final build
Release 1.21.0 - March 1, 2014
- new : OodleNetwork1UDP_StateCompacted added to persist the trained state more compactly
- enhancement : OodleLZH and LZHLW decompressors further optimized; 5-10% faster
- enhancement : OodleLZH and LZHLW no longer does an allocation to prevent overrun
- enhancement : OodleNetwork1 for UDP networking significantly faster (about 300%)
- fix : SPU LZ match offsets could be too large by 1, causing corruption in rare cases
Release 1.20.0 - November 25, 2013
- new : Oodle now shipping "final" build without debug facilities
- new : OodleLZ_GetZipLikeCompressionSettings to make it easier to select compressor settings
- fix : fix possible mismatch between structs in the public header and structs in the lib
- fix : matchTableSizeLog2 wasn't being used correctly; made LZB and LZNIB compress less than they should
Release 1.19.0 - November 14, 2013
- new : OodleNetwork1 now provides a UDP (stateless) variant for unordered packet compression (beta)
- new : OodleHuffman_MultiHuffEncode for UDP unordered packet compression (beta)
- note : version 119 numbering adjusted to match its intention better. 1.major.minor
- fix : LZNib could fail when using "in-place" decompression
- fix : LZH and LZHLW could speculatively read past the end of compbuf in rare cases, potentially causing a (benign) access violation
- fix : LZ parallel compression with long-range-matcher could fail when parallel chunks didn't align to LRM chunks
Release 1.1.8 - November 4, 2013
- new : add OodleXLZ_Decompress_MakeSeekTable_Wide_Async , a simple parallel version of OodleLZ_Decompress
- new : add matchTableSizeLog2 to OodleLZ_CompressOptions ; controls encoder memory use and speed
- new : add Oodle_FAQ_LZCompareTable to make choosing a compressor and level easier
- enhancement : LZB16 encoder faster
- fix : LZ decoders could speculatively read past the end of compressed buffers; this could cause an access violation if the memory after the compressed buffer was not readable. Fixed.
- fix : Fix issues with the WithContext family of functions when used with circular window encoding.
- fix : Fix issues with combining heterogenous OodleLZ data (with different seek chunk settings) causing the decoder to make invalid parallel decodes
- fix : Fix issues with LZB when used with packed-raw-overlap decode mode
- enhancement : PS4 : OodleMalloc goes to "default" memory instead of heap memory for large allocations
Release 1.1.7 - October 23, 2013
- new : unified OodleLZ_CompressContext functions for incremental encoding, with and without sliding window
- new : LZB16 can encode & decode in a circular window
- fix : fix scheduling bug in OOZ IO->Decompression loader
- fix : Linux : fix LZB16 generation page faults due to movdqa gcc bug
- fix : don't lock Oodle threads to cores except on platforms where it is necessary
Release 1.1.6 - October 7, 2013
- new : new LZB compressor - LZ-Bytewise (and LZB-LargeWindow), the fastest of all, for when even LZNib isn't fast enough
- fix : OodleLZ_FillSeekTable could incorrectly mark heterogenous streams as being entirely independent seek chunks
- fix : Linux & Mac : Fix worker thread stack sizes too small, could crash OOP tool and other uses of the worker threads.
- fix : In-place decompression of incompressible data could fail if source overlapped dest.
- fix : Fix OodleLZ_Compress_Async not working (and related APIs, such as OodleLZ_Compress_WriteOOZ_Async) when OodleAsyncSelect_None was passed for asyncSelect (now runs synchronously on the calling thread).
Release 1.1.5 - August 8, 2013
- enhancement : LZNib now has a sliding window encoder for streaming compression
- new : new OodleHuffman functions expose huffman-only coding
- new : OodleNetwork1 compressor, static dictionary ideal for MMO network compression (Beta)
Release 1.1.4 - May 6, 2013
- enhancement : large IO ops are now broken on the IO thread instead of at call time
- enhancement : large IO aps are now cancellable in progress and return correct status
- fix : OOP header could fail to read when it had a seek table
- enhancement : rev the OOZ header; add the size of the header
Release 1.1.3 - May 1, 2013
- fix : OOP header reader was truncating 64-bit file sizes to 32-bit
- new : lzadvanced_output_chunking in example_lz_advanced
- enhancement: OodleLZ_GetCompressedStepForRawStep allowed to seek quanta
Release 1.1.2 - April 28, 2013
- fix : Linux dir enumeration was including "."
- fix : Linux Open for WriteCreate was overwriting existing files too aggressively
- fix : Linux Open failure had debug perror left in
- change : better default log dirs and log names
- change : log file will open in "." if default log dir is not accessible
- change : Linux & Mac do log->prev cycle like Windows
- change : disable stack trace on .map file platforms for now
- enhancement: OodlePackage_FillWithFiles only decompresses chunks it needs (not all)
- enhancement: OodlePackage_SortFiles now uses extention file groups
Release 1.1.1 - April 24, 2013
- fix : Oodle_GetExtensionKey was not doing tolower as it should
- fix : OodlePackage_FillWithFiles could crash if files failed to load
- fix : fix memory overrun crash in DirListing
- fix : fix null deref in arg parse in OOP tool
- change: rename IOQ_DeleteFile_ to IOQ_Delete_ and make it work on dirs as well
- new: add OodleDirListing_DeleteDirContents
Release 1.1.0 - April 11, 2013
- new: LZNIB super fast to decode LZ variant added
- new: LosslessFilters for some common data transformations that improve compression
- change: Low level IO now allows aligned and unaligned IO modes
- enhancement: Compression seek chunk size now variable, set by client
- enhancement: All compressors can run encode and decode in parallel
- enhancement: Long Range Matcher for LZ on big buffers
- enhancement: (PS3) SPU waits now without thread switches
- enhancement: (PS3) SPU after_decompress replaceable function
Release 1.0.0 - August 24, 2012
- Initial Release.