@@ -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
464465NDArray *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
535606NDArray *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);
0 commit comments