Skip to content

Commit 175ca80

Browse files
committed
Add support for lz4hdf5 codec
1 parent 6c53844 commit 175ca80

File tree

7 files changed

+108
-5
lines changed

7 files changed

+108
-5
lines changed

ADApp/ADSrc/Codec.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ static std::string codecName[] = {
66
"jpeg",
77
"blosc",
88
"lz4",
9+
"lz4hdf5",
910
"bslz4"
1011
};
1112

@@ -14,6 +15,7 @@ typedef enum {
1415
NDCODEC_JPEG,
1516
NDCODEC_BLOSC,
1617
NDCODEC_LZ4,
18+
NDCODEC_LZ4HDF5,
1719
NDCODEC_BSLZ4
1820
} NDCodecCompressor_t;
1921

ADApp/Db/NDCodec.template

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,10 @@ record(mbbo, "$(P)$(R)Compressor")
4242
field(TWVL, "2")
4343
field(THST, "LZ4")
4444
field(THVL, "3")
45-
field(FRST, "BSLZ4")
45+
field(FRST, "LZ4HDF5")
4646
field(FRVL, "4")
47+
field(FVST, "BSLZ4")
48+
field(FVVL, "5")
4749
info(autosaveFields, "VAL")
4850
}
4951

@@ -59,8 +61,10 @@ record(mbbi, "$(P)$(R)Compressor_RBV")
5961
field(TWVL, "2")
6062
field(THST, "LZ4")
6163
field(THVL, "3")
62-
field(FRST, "BSLZ4")
64+
field(FRST, "LZ4HDF5")
6365
field(FRVL, "4")
66+
field(FVST, "BSLZ4")
67+
field(FVVL, "5")
6468
field(SCAN, "I/O Intr")
6569
}
6670

ADApp/commonDriverMakefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@ ifeq ($(WITH_BITSHUFFLE),YES)
153153
PROD_SYS_LIBS += bitshuffle
154154
endif
155155
endif
156+
PROD_LIBS += lz4hdf5
156157
endif
157158

158159
ifeq ($(WITH_BLOSC),YES)

ADApp/commonLibraryMakefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ ifeq ($(WITH_BITSHUFFLE),YES)
118118
LIB_SYS_LIBS += bitshuffle
119119
endif
120120
endif
121+
LIB_LIBS += lz4hdf5
121122
endif
122123

123124
ifeq ($(WITH_BLOSC),YES)

ADApp/pluginSrc/NDFileHDF5.cpp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ enum HDF5Compression_t {HDF5CompressNone=0,
4040
HDF5CompressBlosc,
4141
HDF5CompressBshuf,
4242
HDF5CompressLZ4,
43+
HDF5CompressLZ4HDF5,
4344
HDF5CompressJPEG};
4445
/* Filter ID officially assigned to blosc */
4546
#define FILTER_BLOSC 32001
@@ -1940,6 +1941,7 @@ asynStatus NDFileHDF5::writeInt32(asynUser *pasynUser, epicsInt32 value)
19401941
filterId = FILTER_BSHUF;
19411942
break;
19421943
case HDF5CompressLZ4:
1944+
case HDF5CompressLZ4HDF5:
19431945
filterId = FILTER_LZ4;
19441946
break;
19451947
case HDF5CompressJPEG:
@@ -3325,6 +3327,8 @@ asynStatus NDFileHDF5::configureCompression(NDArray *pArray)
33253327
setIntegerParam(NDFileHDF5_compressionType, HDF5CompressBshuf);
33263328
} else if (pArray->codec.name == codecName[NDCODEC_LZ4]) {
33273329
setIntegerParam(NDFileHDF5_compressionType, HDF5CompressLZ4);
3330+
} else if (pArray->codec.name == codecName[NDCODEC_LZ4HDF5]) {
3331+
setIntegerParam(NDFileHDF5_compressionType, HDF5CompressLZ4HDF5);
33283332
} else if (pArray->codec.name == codecName[NDCODEC_JPEG]) {
33293333
setIntegerParam(NDFileHDF5_compressionType, HDF5CompressJPEG);
33303334
}
@@ -3411,7 +3415,8 @@ asynStatus NDFileHDF5::configureCompression(NDArray *pArray)
34113415
this->codec.name = codecName[NDCODEC_BSLZ4];
34123416
}
34133417
break;
3414-
case HDF5CompressLZ4: {
3418+
case HDF5CompressLZ4:
3419+
case HDF5CompressLZ4HDF5: {
34153420
unsigned int cds[2];
34163421
cds[0] = 0; /* lz4 selects the block size automatically */
34173422
cds[1] = 0; /* Number of threads (not implemented) */
@@ -3420,7 +3425,11 @@ asynStatus NDFileHDF5::configureCompression(NDArray *pArray)
34203425
asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, "Failed to set h5 lz4 filter\n");
34213426
break;
34223427
}
3423-
this->codec.name = codecName[NDCODEC_LZ4];
3428+
if (compressionScheme == HDF5CompressLZ4) {
3429+
this->codec.name = codecName[NDCODEC_LZ4];
3430+
} else {
3431+
this->codec.name = codecName[NDCODEC_LZ4HDF5];
3432+
}
34243433
}
34253434
break;
34263435
case HDF5CompressJPEG: {

ADApp/pluginSrc/NDPluginCodec.cpp

Lines changed: 84 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -460,6 +460,7 @@ NDArray *decompressBlosc(NDArray *input, int numThreads, NDCodecStatus_t *status
460460
#ifdef HAVE_BITSHUFFLE
461461
#include <bitshuffle.h>
462462
#include <lz4.h>
463+
#include <lz4hdf5.h>
463464

464465
NDArray *compressLZ4(NDArray *input, NDCodecStatus_t *status, char *errorMessage)
465466
{
@@ -517,7 +518,7 @@ NDArray *decompressLZ4(NDArray *input, NDCodecStatus_t *status, char *errorMessa
517518
return NULL;
518519
}
519520

520-
int ret = LZ4_decompress_fast((const char*)input->pData, (char*)output->pData, (int)info.totalBytes);
521+
int ret = LZ4_decompress_safe((const char*)input->pData, (char*)output->pData, (int)input->compressedSize, (int)info.totalBytes);
521522

522523
if (ret <= 0){
523524
output->release();
@@ -531,6 +532,76 @@ NDArray *decompressLZ4(NDArray *input, NDCodecStatus_t *status, char *errorMessa
531532
return output;
532533
}
533534

535+
NDArray *compressLZ4HDF5(NDArray *input, NDCodecStatus_t *status, char *errorMessage)
536+
{
537+
if (!input->codec.empty()) {
538+
sprintf(errorMessage, "Array is already compressed");
539+
*status = NDCODEC_WARNING;
540+
return NULL;
541+
}
542+
543+
NDArrayInfo_t info;
544+
input->getInfo(&info);
545+
int outputSize = LZ4_compressBound((int)info.totalBytes);
546+
NDArray *output = allocArray(input, -1, outputSize);
547+
548+
if (!output) {
549+
sprintf(errorMessage, "Failed to allocate LZ4HDF5 output array");
550+
*status = NDCODEC_ERROR;
551+
return NULL;
552+
}
553+
554+
int compSize = compress_lz4hdf5((const char*)input->pData, (char*)output->pData, info.totalBytes, outputSize);
555+
556+
if (compSize <= 0) {
557+
output->release();
558+
sprintf(errorMessage, "Internal LZ4HDF5 error");
559+
*status = NDCODEC_ERROR;
560+
return NULL;
561+
}
562+
563+
output->codec.name = codecName[NDCODEC_LZ4HDF5];
564+
output->compressedSize = compSize;
565+
566+
return output;
567+
}
568+
569+
570+
NDArray *decompressLZ4HDF5(NDArray *input, NDCodecStatus_t *status, char *errorMessage)
571+
{
572+
// Sanity check
573+
if (input->codec.name != codecName[NDCODEC_LZ4HDF5]) {
574+
sprintf(errorMessage, "Invalid codec '%s', expected '%s'",
575+
input->codec.name.c_str(), codecName[NDCODEC_LZ4HDF5].c_str());
576+
*status = NDCODEC_ERROR;
577+
return NULL;
578+
}
579+
580+
NDArrayInfo_t info;
581+
input->getInfo(&info);
582+
583+
NDArray *output = allocArray(input);
584+
585+
if (!output) {
586+
sprintf(errorMessage, "Failed to allocate LZ4HDF5 output array");
587+
*status = NDCODEC_ERROR;
588+
return NULL;
589+
}
590+
591+
int ret = decompress_lz4hdf5((const char*)input->pData, (char*)output->pData, info.totalBytes);
592+
593+
if (ret <= 0){
594+
output->release();
595+
sprintf(errorMessage, "Failed to LZ4HDF5 decompress");
596+
*status = NDCODEC_ERROR;
597+
return NULL;
598+
}
599+
600+
output->codec.clear();
601+
602+
return output;
603+
}
604+
534605

535606
NDArray *compressBSLZ4(NDArray *input, NDCodecStatus_t *status, char *errorMessage)
536607
{
@@ -714,6 +785,13 @@ void NDPluginCodec::processCallbacks(NDArray *pArray)
714785
break;
715786
}
716787

788+
case NDCODEC_LZ4HDF5: {
789+
unlock();
790+
result = compressLZ4HDF5(pArray, &codecStatus, errorMessage);
791+
lock();
792+
break;
793+
}
794+
717795
case NDCODEC_BSLZ4: {
718796
unlock();
719797
result = compressBSLZ4(pArray, &codecStatus, errorMessage);
@@ -750,6 +828,11 @@ void NDPluginCodec::processCallbacks(NDArray *pArray)
750828
result = decompressLZ4(pArray, &codecStatus, errorMessage);
751829
lock();
752830
setIntegerParam(NDCodecCompressor, NDCODEC_LZ4);
831+
} else if (pArray->codec.name == codecName[NDCODEC_LZ4HDF5]) {
832+
unlock();
833+
result = decompressLZ4HDF5(pArray, &codecStatus, errorMessage);
834+
lock();
835+
setIntegerParam(NDCodecCompressor, NDCODEC_LZ4HDF5);
753836
} else if (pArray->codec.name == codecName[NDCODEC_BSLZ4]) {
754837
unlock();
755838
result = decompressBSLZ4(pArray, &codecStatus, errorMessage);

ADApp/pluginSrc/NDPluginCodec.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ typedef enum {
3333
typedef enum {
3434
NDCODEC_BLOSC_BLOSCLZ,
3535
NDCODEC_BLOSC_LZ4,
36+
NDCODEC_BLOSC_LZ4HDF5,
3637
NDCODEC_BLOSC_LZ4HC,
3738
NDCODEC_BLOSC_SNAPPY,
3839
NDCODEC_BLOSC_ZLIB,
@@ -60,6 +61,8 @@ NDArray *compressBlosc(NDArray *input, int clevel, int shuffle, NDCodecBloscComp
6061
NDArray *decompressBlosc(NDArray *input, int numThreads, NDCodecStatus_t *status, char *errorMessage);
6162
NDArray *compressLZ4(NDArray *input, NDCodecStatus_t *status, char *errorMessage);
6263
NDArray *decompressLZ4(NDArray *input, NDCodecStatus_t *status, char *errorMessage);
64+
NDArray *compressLZ4HDF5(NDArray *input, NDCodecStatus_t *status, char *errorMessage);
65+
NDArray *decompressLZ4HDF5(NDArray *input, NDCodecStatus_t *status, char *errorMessage);
6366
NDArray *compressBSLZ4(NDArray *input, NDCodecStatus_t *status, char *errorMessage);
6467
NDArray *decompressBSLZ4(NDArray *input, NDCodecStatus_t *status, char *errorMessage);
6568

0 commit comments

Comments
 (0)