1 C++ Plugin API for CPU compressors {#data}
4 This document specifies a modern API for the in-memory C plugin API for
5 lossless byte data compressors. It will not replace the 2D image
6 compressors and CPU-GPU transfer plugins.
10 * Support all features used by current lossless byte compressors:
11 * Lossless compression of binary blobs
12 * Unified API for all compression engines
13 * Other components can add compression engines
14 * Information provided for each compressor:
15 * Compression speed (relative to RLE compressor)
16 * Compression ratio (relative to uncompressed data)
17 * Compressors may produce multiple output chunks
18 * Compressor engines are instantiated to allow reuse of internal state
19 and memory allocations
20 * Easy to use API for plugin implementers
24 * New: Using Lunchbox plugin API for loading plugins
32 float ratio; //!< Normalized 0..1 size after compression
33 float speed; //!< Relative speed compared to RLE compressor
35 typedef std::function< Compressor* ()> Constructor;
38 typedef std::vector< CompressorInfo > CompressorInfos;
43 static Registry& getInstance();
44 template< class P > bool registerEngine( CompressorInfo info )
46 const CompressorInfos& getInfos() const;
47 CompressorInfo choose();
48 CompressorInfo find( const std::string& name );
54 typedef lunchbox::Bufferb Result;
55 typedef std::vector< Result > Results;
57 virtual const Results& compress( const uint8_t* data, size_t size ) = 0;
59 // data points to pre-allocated memory of size decompressed result
60 virtual void decompress( const Results& input, uint8_t* data,
69 CompressorInfo Registry::choose()
71 CompressorInfo candidate;
72 float rating = powf( 1.0f, .3f );
74 for( const CompressorInfo& info : _impl->compressorInfos )
76 float newRating = powf( info.speed, .3f ) / info.ratio;
77 if( newRating > rating )
87 Compressor implementation:
89 #include "zstd/lib/zstd.h"
97 static const bool LB_UNUSED _initialized = []()
99 Registry::registerEngine( { "pression::CompressorZSTD",
101 CompressorZSTD::newInstance );
106 const Results& CompressorZSTD::compress( const void* const data,
107 const size_t inSize )
109 if( _results.empty( ))
110 _results.push_back( new pression::plugin::Compressor::Result );
111 _results[0]->reserve( ZSTD_compressBound( inSize ));
113 const size_t size = ZSTD_compress( _results[0]->getData(),
114 _results[0]->getSize(), inData,
115 inSize, 2 /* level */ );
116 _results[0]->setSize( size );
120 void CompressorZSTD::decompress( const Results& input, uint8_t* data,
126 ZSTD_decompress( data, size,
127 input[0].getData(), input[0].getSize( ));