Oodle Data Compression and IO

Oodle Development History

This change log includes the Oodle development history.

Release 2.9.12 - Jan 25, 2024

NOTE: Windows libs in Jan 23, 2024 accidentally had an unnecessary dependency on "getenv" in uCRT from internal testing code. Jan 25 re-release fixes this without any other behavioral changes.

  • change : OODLETEX_MAX_SURFACE_DIMENSION increased to 2097152 (from 16384)

  • change : PS4 built with SDK 11.000
  • change : PS5 built with SDK 8.000

  • enhancement : Texture : OodleTex_RMSE_Normalized_BCNAware allocates less memory and is faster in typical use cases (on-the-fly instead of up-front pixel format conversion)
  • enhancement : Texture : Slight improvements to BC7 quality and encoding speed, especially at "Low" effort level.

  • fix : Texture : Fix incorrect assertion in debug builds when BC7 RDO encoding in ignore alpha mode and the texture has pixels with non-255 source alpha
  • fix : Texture : Fix incorrect handling of very large positive and NaN float input pixels on x86 (ARM was already correct)

  • fix : Data : Fix very rare assertion failure in OodleX workmgr.cpp PopQueue (spurious wake-ups are possible in certain conditions, just highly unlikely). Oodle Data without OodleX is uanffected.

Release 2.9.11 - Oct 9, 2023

  • new : Oodle Data and Oodle Network for Apple VisionOS (beta).

  • change : Xbox One legacy XDK support removed. Xbox One GDK/GameCore continues to be suppported.
  • change : Xbox built with GDK March 2023 Update 6
  • change : PS4 built with SDK 10.508
  • change : PS5 built with SDK 7.00
  • change : Switch built with SDK 16.2.3

  • change : Data : Usage warning when decoding to slow-to-read (likely uncached) memory updated to provide more detail.

  • enhancement : Texture : Improved end-to-end latency in multi-threaded encoding, especially for BC1 and BC4/5. (Activity tiling)
  • enhancement : Texture : AVX-512 paths are significantly faster on AMD Zen 4 CPUs. (Avoid memory-destination forms of VPCOMPRESSD)
  • enhancement : Texture : re-designed BC7 mode/partition selection logic that typically gives better quality while simultaneously encoding faster. Especially for diffuse albedo, we've seen RMS error reduced by 2-3% while simultaneously being about 2x faster to encode at "Normal" or "High" effort level.

  • fix : Texture : BC7 RDO fix bug in "preserve extremes" mode where extremal alpha values weren't correctly preserved in certain rare cases. (Add check for mode 7 pbit mismatch in are_indices_permitted check)

  • regression : PS4 Leviathan decode speed about 2-3% slower after compiler update

Release 2.9.10b - Apr 19, 2023

NOTE: re-release due to a buffer overflow issue in Oodle Texture 2.9.10 (Apr 17), please update immediately.

  • new : Data : OodleLZ_GetCompressScratchMemBoundEx which can estimate typical, not just worst-case compression scratch memory bounds.

  • enhancement : Data : Mermaid "Optimal1" (level 5) and higher levels now encode much faster (35-50% encode time reduction is typical), usually with slightly increased compression ratio as well.
  • enhancement : Data : Selkie, Kraken and Leviathan "Optimal1" (level 5) levels have faster encoding (10-25% encode time reduction is typical). "Optimal2" and higher levels slightly faster as well.
  • enhancement : Texture : Speed-ups to RDO activity mask generation, RDO encoding of all formats got slightly faster as a result.

  • fix : Texture : RDO threading changes in 2.9.6 disabled threading of activity calc in most cases, re-tune heuristics.
  • fix : Texture : Fix assertion failure when encoding 16384x16384 pixel BC5 textures from 4x U16 source data.
  • fix : Texture : Fix float input pixels for non-BC6 formats triggering assertions when RDO encoding except for tiny input images.
  • fix : Texture : Fix incorrect RDO encoding of BC6H surfaces with non-multiple-of-4 width or height and at least 16 blocks. Due to the interaction of these two criteria, typical power-of-2 textures with aspect ratios between 1:4 and 4:1 were generally unaffected. The bug typically results in higher visual fidelity and lower compression ratio than indicated by the target lambda, i.e. sub-optimal compression but no objectionable artifacts.
  • fix : Texture : Input pixel format validation is now stricter. Previous versions erroneously accepted some unsupported input formats, e.g. 4x U16 pixel formats for BC1 encoding, then failed with internal errors later.

  • note : Oodle 2.9.10 will be the last release with Xbox One XDK libraries. Xbox One support in upcoming releases will be GDK only.

Release 2.9.9 - Feb 8, 2023

This release focuses on Oodle Data compression speed.

  • new : AArch64 (ARM 64-bit) simulator libraries for tvOS. tvOS distributions now also include the libs/headers packaged as an .xcframework.

  • enhancement : Data : Kraken "Fast" (level 3) now takes typically around 10% less time.
  • enhancement : Data : Kraken "Optimal1" (level 5) and higher levels encode in typically around 7-10% less time. This is independent of speed-ups from encoder scratch memory (see below) which can be in the same ballpark when encoding lots of independent chunks, sometimes much larger.
  • enhancement : Data : Optimal1 and higher levels for all codecs now use provided scratch memory much more extensively and can sometimes avoid separate allocations completely if enough scratch memory is supplied. Especially when encoding many small, independent chunks, reusing allocations in this way can be a massive throughput increase on many-core machines. We've observed speed-ups of around 8.5x when encoding 256k Kraken chunks at Optimal2 level on a 64-core Threadripper. See "About Compression Scratch Memory" in the docs.
  • enhancement : Data : OodleX parallel compress calls set up and reuse encoder scratch memory by default.
  • enhancement : Data : "Optimal1" (level 5) compression on 64-bit ARM typically 10-15% faster independent of other changes noted above. (CTMF improvements)
  • enhancement : Texture : BC7 RDO encoding is slightly faster, 5-8% reduction on typical textures in our test set.

  • fix : Data : fix incorrect Linux 64-bit build settings for some files resulting in missing .note.GNU-stack sections and thus executable stacks.
  • fix : Data : fix OodleX not balancing worker threads across multiple processor groups correctly if number of cores in a processor group wasn't 64. (Incorrect SetThreadGroupAffinity with ~0 affinity mask.)
  • fix : Texture : Fix bug in float->sRGB conversion on x86 targets

Release 2.9.8 - Sep 28, 2022

  • new : Oodle Data for WASM is now out of beta! Beta customers are encouraged to update due to smaller library size and encoder/decoder speed improvements. Please read "About Oodle on WASM" in the docs for integration notes.
  • new : AArch64 (ARM 64-bit) simulator libraries for iOS. iOS distributions now also include the libs/headers packaged as an .xcframework.
  • new : Texture : Support encoding from and decoding to float for BC1-5 and BC7 too, not just BC6H.
  • new : Texture : BC1-3 and BC7 encode from float can now convert linear->sRGB (OodleTex_BCNFlag_LinearToSRGB), decode to float can convert sRGB->linear (OodleTex_BCNDecodeFlag_SRGBToLinear).
  • new : Texture : Added OodleTex_DecodeBCN_Blocks_Ex and OodleTex_DecodeBCN_LinearSurfaces_Ex with "decode flags" argument to enable sRGB->linear encoding.

  • change : iOS static libs now come as pairs of libs, libfoo.a and libfoo.sim.a, with the latter being for simulator. AArch64 (ARM64) targets exist for both device and sim so a single lib is no longer possible.

  • enhancement : Data : Enable "destination is in write-combined memory" usage warnings for Windows/Linux/Mac x64 targets, not just game consoles
  • enhancement : Texture : significantly improved rate-distortion performance of BC7 "preserve extremes" encoding
  • enhancement : Texture : reduced worst-case memory use for BC1, BC3, BC4, BC5, BC7 RDO encoding (index merge heap size limit enforced).

  • fix : Data : fix confusing symbol table entries around address 0 showing up in backtraces on NULL pointer fn calls on some ELF targets (NASM issue)
  • fix : Data : fix memory leak in certain cases for Optimal2+ compression levels introduced in 2.9.6 (rrPool leak when allocation was attempted from scratch arena, but failed and fell back to user allocator instead)
  • fix : Texture : Fix incorrect constant for "prefer wide vectors"/AVX-512 flag in public API (which didn't work correctly as a result)
  • fix : Texture : Fix "preserve extremes" mode for BC7 RDO not preserving pixels correctly in certain rare cases (sometimes not round-tripping mode 7 endpoints in in-loop matrix pass)
  • fix : Setting malloc/free allocator pointers to 0 through the plugin mechanism now installs always-failing dummy allocators instead of crashing on allocation.

Release 2.9.7 - June 30, 2022

  • fix : Network : fix a crash bug in the dictionary builder introduced in 2.9.6 (m_scratch uninitialized)

  • change : Data : OodleX Handle Table size is now growable up to 2048 times what it was before (2^m_num_handles_log2), making it practically unlimited
  • change : Data : DirectStorage example updated for DirectStorage 1.0.2
  • change : Texture : Encoder enables AVX-512 by default on more machine types.

  • enhancement : Texture : Encoder now gives bitwise same results on all supported host platforms (Windows x64, Linux x64/ARM64, Mac x64/ARM64). This will be guaranteed going forward.
  • enhancement : Texture : Significantly decreased memory usage for BC3-5 RDO encoding, slightly decreased for BC1-2.
  • enhancement : Texture : "Preserve extremes" mode (preserves 0/1 in alpha channel exactly) is now supported for BC7. New BCNFlag name is OodleTex_BCNFlag_PreserveExtremes_BC3457, but the old OodleTex_BCNFlag_PreserveExtremes_BC345 will continue to be supported.
  • enhancement : Texture : Encoding on ARM64 hosts is now significantly faster. On M1 Macs in particular, native ARM64 is now around ~2x faster than Rosetta x86_64 emulation, which used to be the faster path.

  • note : Oodle 2.9.7 will be the last Oodle release to support 32-bit iOS, tvOS, MacOS targets or 32-bit x86 Linux. (Windows and Android 32-bit targets, as well as 32-bit ARM Linux, continue to be supported.)

Release 2.9.6 - May 2, 2022

  • fix : Texture : fix an int overflow on textures 2 GB or larger, causing an effective under 2 GB limit for earlier versions, for example on RGBA float textures of 16k x 8k or larger.
  • fix : Texture : fix incorrect assert in BC1 RDO encoder in debug builds when encoding BC1 textures without transparency that had fully black pixels
  • fix : Texture : decreased error in baseline/RDO BC7 encodings for areas with certain singular covariance matrices

  • new : Data : New example showing how to use Oodle Data with DirectStorage on Windows

  • change : Data : improve error messages when trying to decode data that is not an Oodle stream
  • change : Texture : Linux builds now enable AVX2 and higher support (previously disabled). Texture encoding on Linux should be significantly faster.
  • change : Texture : Reduce number of small OodleJobs spawned, especially when compressing small mip levels.

  • enhancement : Texture : BC1 RDO now produces slightly smaller results at same perceptual quality (or equivalently, better quality at the same size). The same improvement applies to RGB portion of BC2 and BC3.
  • enhancement : Texture : AVX-512 support. We've seen up to 30% encode time reduction on AVX-512-supporting machines when encoding BC1, less for other formats. See "AVX-512" in the "Oodle Texture overviews" section in the documentation for usage notes.

Release 2.9.5 - October 13, 2021

  • fix : Texture : fix bug in BC1 RDO encoder incorrectly emitting transparent black blocks in very rare cases
  • fix : Texture : fix bug in BC1 RDO encoder not preserving BC1 transparency correctly in certain rare circumstances

  • new : UWP ARM64 builds now provided

  • change : Texture : BC1-3 decoders have changed, and the encoders now target the new decoders instead of the old ones (which matched the D3D reference). See "BCn decoding" in the "Oodle Texture overviews" section of the docs for rationale.

  • enhancement : Texture : BC1-5 RDO encoding is significantly faster (often 3x or more); BC1 non-RDO encoding up to 2x faster; BC7 RDO encoding typically 1.13x faster.

Release 2.9.4 - September 2, 2021

This is a re-release of 2.9.3 with a change in compiler switches to fix a binary compatibility issue on platforms compiled using MSVC. There are no other changes.

  • fix : Disable FH4 exception handling for link compatibility with VC 2017

Release 2.9.3 - July 26, 2021

  • fix : Data : Fix crash encoding at level Optimal1 on buffers just over block size (eg. 256k+2 bytes) when matches cross block boundary (CTMF)
  • fix : Data : Fix crash when calling OodleLZ_GetCompressScratchMemBound for OodleLZ_Compressor_None introduced in 2.9.1
  • fix : Data : Fix debug lib on 32-bit Linux inadvertently using SSE4.1 in some static initializers prior to CPUID check
  • fix : Data : Fix Oodle decompress erroneously reporting input as corrupted when the compressed data buffer is very close to the top of virtual memory

  • new : Network : OodleNetwork1UDP_State_Compact_ForVersion and OodleNetwork1UDP_State_Uncompact_ForVersion allow you to read/write compacted Network state for old versions (eg. 5 for 2.5.x); compacted binary state changed from v5 to v6

  • change : Linux built with Clang 12
  • change : Linux built with Jcc erratum mitigation (-mbranches-within-32B-boundaries)
  • change : NX built with SDK 11.4.3
  • change : PS4 built with SDK 8.500

  • enhancement : Faster Leviathan encoding at "Normal" and "Optimal" levels
  • enhancement : CPU BC7Prep decode will now use AVX2 256-bit instructions when available, for a speed win of about 25% typically (it's frequently memory bound). You can disable usage of wide vectors when desired via OodleTexRT_BC7PrepDecodeFlags_AvoidWideVectors (see docs).

  • regression : minor regression (5-6%) in encode speed for Mermaid/Selkie on PS4 at some compression levels after update to SDK 8.5 and clang 11

Release 2.9.2 - June 16, 2021

  • fix : Texture : fix crash bug in RDO encoding with Universal Tiling option enabled on some texture sizes

Release 2.9.1 - June 7, 2021

  • fix : Data : Fix incorrect warnings about OodleLZ_Compressor_None being deprecated
  • fix : Texture : fix bug where large textures (eg. 8k x 8k) and high job worker counts (eg. 128) could cause an int overflow leading to a crash or huge alloc. Previous versions can work around this issue by clamping image size or worker count in OodleTex_Plugins_SetJobSystemAndCount.
  • fix : Texture : fix bug in negative signed float values in BC6H RDO encoding producing garbage results.
  • fix : Texture : fix high-error blocks in certain very rare cases when encoding BC1-3 textures without RDO at "High" setting

  • change : MS platforms built with VC 2019 (except Durango-XDK still built with 2017)
  • change : Windows built with JCC mitigation (/QIntel-jcc-erratum) and new FH4 exception handler
  • change : Oodle Texture functions now have an explicit, enforced limit on surface dimensions (OODLETEX_MAX_SURFACE_DIMENSION)
  • change : OodleTex_RMSE_Normalized_BCNAware on BC6/float changed metric, values will not compare to previous versions

  • enhancement : Faster Kraken decompression on Zen
  • enhancement : Faster decompression on Mac M1 ARM64
  • enhancement : Faster Oodle Texture RDO encoding of BC4/BC5 even at highest quality level.
  • enhancement : New entry point OodleTex_EncodeBCN_RDO_Ex that enables several new features like RDO effort levels and Universal Tiling.
  • enhancement : Oodle Texure RDO encoding now has an "effort level" parameter, just like baseline encode. Lower effort levels are significantly faster to encode but reduce quality/compression slightly. Use for fast iteration, higher effort for final builds.
  • enhancement : Oodle Texture Universal Tiling, to share a single RDO encode for linear and platform-specific tiled formats. Minor hit in compression rate, but much better than always RDO encoding in linear layout and much faster than encoding per-platform.
  • enhancement : Can pass OODLETEX_JOBS_DISABLE to Oodle Texture functions to cause them not to spawn any jobs even when a job system is installed. Intended for cases that run many encodes in parallel anyway (e.g. Virtual Texture tiles) where spawning more fine-grained jobs isn't useful.

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 - rerelease - April 11, 2022

  • license check removed

  • Call to rsqrt removed. Encoding will match previous behavior on Intel. Use of reciprocal sqrt instruction caused texture encodings to be different on Intel and AMD processors.

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.
  • 425.893.4300 ph
  • Email us!
  • © 1991 - 2024 Epic Games Tools LLC
  • 1/25/24