32 #include "blosc/blosc.h" 42 #define BLOSC_LZ4_ID BLOSC_LZ4_COMPNAME 43 #define BLOSC_LZ4HC_ID BLOSC_LZ4HC_COMPNAME 44 #define BLOSC_DEFAULT_ID BLOSC_BLOSCLZ_COMPNAME 45 #define QLIN16_ID "QLIN16" 46 #define QLOG16_ID "QLOG16" 49 #define COMPRESSOR_DEFAULT_ID BLOSC_DEFAULT_ID 85 void* (*m_Allocator)(
size_t szBytes );
114 if( m_result && !m_result_is_const )
119 m_result_is_const =
true;
131 m_rdata_is_double_type =
false;
163 void setAllocator(
void* (*Allocator)(
size_t),
void (*DeAllocator)(
void*) )
165 if( Allocator && DeAllocator )
183 bool setCompressor(
const char *strCompressorType,
int iCompressionLevel = -1 )
185 compressor_type_e eCompressorType =
CT_NONE;
191 if( 0 == iCompressionLevel || !strCompressorType || !*strCompressorType )
194 iCompressionLevel = 0;
198 if( 0 == _strcmpi( strCompressorType, BLOSC_LZ4_ID ) )
202 else if( 0 == _strcmpi( strCompressorType, BLOSC_LZ4HC_ID ) )
206 else if( 0 == _strcmpi( strCompressorType, BLOSC_DEFAULT_ID ) )
210 else if( 0 == _strcmpi( strCompressorType, QLIN16_ID ) )
214 else if( 0 == _strcmpi( strCompressorType, QLOG16_ID ) )
220 if(
CT_NONE != eCompressorType )
222 m_strCompressorType = strCompressorType;
223 m_eCompressorType = eCompressorType;
225 if( iCompressionLevel >= 0 )
227 m_iCompressionLevel = iCompressionLevel;
232 blosc_set_compressor( m_strCompressorType );
264 bool pack(
void* rdata,
size_t rdata_size,
size_t rdata_element_size,
bool isDoubleClass )
274 m_rdata_size = rdata_size;
275 m_rdata_element_size = rdata_element_size;
276 m_rdata_is_double_type = isDoubleClass;
279 switch( m_eCompressorType )
298 m_result_is_const =
false;
316 bool unpack(
void* cdata,
size_t cdata_size,
void* rdata,
size_t rdata_size,
size_t rdata_element_size )
320 assert( rdata && rdata_size > 0 );
328 m_cdata_size = cdata_size;
330 m_rdata_size = rdata_size;
331 m_rdata_element_size = rdata_element_size;
334 switch( m_eCompressorType )
353 m_result_is_const =
true;
369 assert( m_rdata && !m_cdata );
373 m_cdata_size = m_rdata_size + BLOSC_MAX_OVERHEAD;
376 if( NULL == m_cdata )
378 m_err.
set( MSG_ERRMEMORY );
383 m_cdata_size = blosc_compress(
386 m_rdata_element_size,
406 assert( m_rdata && m_cdata );
408 size_t blosc_nbytes, blosc_cbytes, blosc_blocksize;
411 blosc_cbuffer_sizes( m_cdata, &blosc_nbytes, &blosc_cbytes, &blosc_blocksize );
414 if( blosc_nbytes != m_rdata_size )
416 m_err.
set( MSG_ERRCOMPRESSION );
421 if( blosc_decompress( m_cdata, m_rdata, m_rdata_size ) <= 0 )
423 m_err.
set( MSG_ERRCOMPRESSION );
441 assert( m_rdata && !m_cdata &&
442 m_rdata_element_size ==
sizeof(
double ) &&
443 m_rdata_size % m_rdata_element_size == 0 );
445 double dOffset = 0.0, dScale = 1.0;
446 double dMinVal, dMaxVal;
447 bool bMinValSet =
false, bMaxValSet =
false;
448 double* rdata = (
double*)m_rdata;
449 size_t cntElements = m_rdata_size /
sizeof(*rdata);
454 if( !m_rdata_is_double_type )
456 m_err.
set( MSG_ERRCOMPRARG );
461 for(
size_t i = 0; i < cntElements; i++ )
463 if( DBL_ISFINITE( rdata[i] ) && rdata[i] != 0.0 )
465 if( !bMinValSet || rdata[i] < dMinVal )
471 if( !bMaxValSet || rdata[i] > dMaxVal )
480 if( bDoLog && dMinVal < 0.0 )
482 m_err.
set( MSG_ERRCOMPRLOGMINVALS );
488 m_cdata_size = 2 *
sizeof( float ) + cntElements *
sizeof( uint16_t );
493 m_err.
set( MSG_ERRMEMORY );
497 pFloatData = (
float*)m_cdata;
498 pUintData = (uint16_t*)&pFloatData[2];
503 dOffset = bDoLog ? log( dMinVal ) : dMinVal;
509 double dValue = bDoLog ? log( dMaxVal ) : dMaxVal;
512 dScale = ( dValue - dOffset ) / 0xFFF8u;
524 pFloatData[0] = (float)dOffset;
525 pFloatData[1] = (float)dScale;
528 for(
size_t i = 0; i < cntElements; i++ )
531 if( DBL_ISFINITE( rdata[i] ) && rdata[i] != 0.0 )
533 double dValue = bDoLog ? log( rdata[i] ) : rdata[i];
535 *pUintData++ = (uint16_t) ( (dValue - dOffset ) / dScale ) & 0xFFF8u;
540 if( fabs( rdata[i] ) == 0.0 )
542 *pUintData++ = 0xFFF8u + 1 + ( _copysign( 1.0, rdata[i] ) < 0.0 );
544 else if( DBL_ISINF( rdata[i] ) )
546 *pUintData++ = 0xFFF8u + 3 + ( _copysign( 1.0, rdata[i] ) < 0.0 );
548 else if( DBL_ISNAN( rdata[i] ) )
550 *pUintData++ = 0xFFF8u + 5;
572 assert( m_rdata && m_cdata &&
573 m_rdata_element_size ==
sizeof(
double ) &&
574 m_rdata_size % m_rdata_element_size == 0 );
576 double dOffset = 0.0, dScale = 1.0;
577 double* rdata = (
double*)m_rdata;
578 size_t cntElements = m_rdata_size /
sizeof(*rdata);
579 float* pFloatData = (
float*)m_cdata;
580 uint16_t* pUintData = (uint16_t*)&pFloatData[2];
583 if( m_rdata_is_double_type )
585 m_err.
set( MSG_ERRCOMPRARG );
590 dOffset = pFloatData[0];
591 dScale = pFloatData[1];
594 for(
size_t i = 0; i < cntElements; i++ )
596 if( *pUintData > 0xFFF8u )
599 switch( *pUintData - 0xFFF8u )
601 case 1: *rdata = +0.0;
break;
602 case 2: *rdata = -0.0;
break;
603 case 3: *rdata = +DBL_INF;
break;
604 case 4: *rdata = -DBL_INF;
break;
605 case 5: *rdata = DBL_NAN;
break;
616 *rdata++ = exp( (
double)*pUintData++ * dScale + dOffset );
620 *rdata++ = (double)*pUintData++ * dScale + dOffset;
void * m_result
compressor output
bool linlogQuantizerDecompress(bool bDoLog)
void clear_data()
Reset input data (compressed and uncompressed) memory without deallocation!
bool linlogQuantizerCompress(bool bDoLog)
Lossy data compression by linear or logarithmic quantization (16 bit)
void setAllocator(void *(*Allocator)(size_t), void(*DeAllocator)(void *))
Set memory management.
void *(* m_Allocator)(size_t szBytes)
memory allocator
const char * m_strCompressorType
name of compressor to use
(Error-)messages in english and german.
const char * getCompressorName()
Get compressor name.
bool bloscCompress()
Allocates memory for compressed data and use it to store results (lossless data compression) ...
compressor_type_e m_eCompressorType
enum type of compressor to use
compressor_type_e
supported compressor types
size_t m_rdata_element_size
size of one element in bytes
bool pack(void *rdata, size_t rdata_size, size_t rdata_element_size, bool isDoubleClass)
Calls the qualified compressor (deflate) which always allocates sufficient memory (m_cdata) ...
size_t m_cdata_size
size of compressed data in bytes
bool isLossy()
Returns true, if current compressor modifies value data.
void clear()
Reset error message.
void * m_cdata
compressed data
size_t m_rdata_size
size of uncompressed data in bytes
int m_iCompressionLevel
compression level (0 to 9)
Helperclass for error message transport.
void clear_err()
Reset recent error message.
bool m_rdata_is_double_type
Flag type is mxDOUBLE_CLASS.
void set(const char *strMsg, const char *strId=NULL)
Set error message to a constant string (without translation)
void free_result()
Clear self created results with memory deallocation.
void(* m_DeAllocator)(void *ptr)
memory deallocator
using linear quantization (lossy)
int get_err()
Get recent error message id.
using BLOSC compressor (lossless)
bool unpack(void *cdata, size_t cdata_size, void *rdata, size_t rdata_size, size_t rdata_element_size)
Calls the qualified compressor (inflate)
int getMsgId()
Get the current message identifier.
void * m_rdata
uncompressed data
bool m_result_is_const
true, if result is const type
size_t m_result_size
size of compressor output in bytes
bool setCompressor(const char *strCompressorType, int iCompressionLevel=-1)
Converts compressor ID string to category enum.
#define COMPRESSOR_DEFAULT_ID
Which compression method is to use, if its name is empty.
using logarithmic quantization (lossy)
bool bloscDecompress()
Uncompress compressed data m_cdata to data m_rdata.