NetCDF 4.10.1
Loading...
Searching...
No Matches
dfilter.c
Go to the documentation of this file.
1/*
2 * Copyright 2018, University Corporation for Atmospheric Research
3 * See netcdf/COPYRIGHT file for copying and redistribution conditions.
4 */
9
10#include "config.h"
11#include <stdlib.h>
12#include <stdio.h>
13#include <string.h>
14#ifdef _MSC_VER
15#include <io.h>
16#endif
17
18#include "netcdf.h"
19#include "netcdf_filter.h"
20#include "ncdispatch.h"
21#include "nc4internal.h"
22#include "nclog.h"
23
24#ifdef USE_HDF5
25#include "hdf5internal.h"
26#endif
27
28#ifdef NETCDF_ENABLE_NCZARR
29#include "zdispatch.h"
30#endif
31
32static void byteswap8(unsigned char*);
33static void byteswap4(unsigned char*);
34
35/*
36Unified filter related code
37*/
38
39/**************************************************/
40/* Per-variable filters */
41
61EXTERNL int
62nc_inq_var_filter_ids(int ncid, int varid, size_t* nfiltersp, unsigned int* ids)
63{
64 NC* ncp;
65 int stat = NC_check_id(ncid,&ncp);
66 if(stat != NC_NOERR) return stat;
68 if((stat = ncp->dispatch->inq_var_filter_ids(ncid,varid,nfiltersp,ids))) goto done;
69
70done:
71 return stat;
72}
73
97EXTERNL int
98nc_inq_var_filter_info(int ncid, int varid, unsigned int id, size_t* nparamsp, unsigned int* params)
99{
100 NC* ncp;
101 int stat = NC_check_id(ncid,&ncp);
102 if(stat != NC_NOERR) return stat;
104 if((stat = ncp->dispatch->inq_var_filter_info(ncid,varid,id,nparamsp,params))) goto done;
105
106done:
107 if(stat == NC_ENOFILTER) nclog(NCLOGWARN,"Undefined filter: %u",(unsigned)id);
108 return stat;
109}
110
127
128EXTERNL int
129nc_def_var_filter(int ncid, int varid, unsigned int id, size_t nparams, const unsigned int* params)
130{
131 int stat = NC_NOERR;
132 NC* ncp;
133
134 TRACE(nc_inq_var_filter);
135 if((stat = NC_check_id(ncid,&ncp))) return stat;
136 if((stat = ncp->dispatch->def_var_filter(ncid,varid,id,nparams,params))) goto done;
137done:
138 if(stat == NC_ENOFILTER) nclog(NCLOGWARN,"Undefined filter: %u",(unsigned)id);
139 return stat;
140}
141
169EXTERNL int
170nc_inq_var_filter(int ncid, int varid, unsigned int* idp, size_t* nparamsp, unsigned int* params)
171{
172 NC* ncp;
173 size_t nfilters;
174 unsigned int* ids = NULL;
175 int stat = NC_check_id(ncid,&ncp);
176
177 if(stat != NC_NOERR) return stat;
178 TRACE(nc_inq_var_filter);
179
180 /* Get the number of filters on this variable */
181 if((stat = nc_inq_var_filter_ids(ncid,varid,&nfilters, NULL))) goto done;
182 /* If no filters, then return zero */
183 if(nfilters == 0) {
184 if(idp) *idp = 0;
185 goto done;
186 }
187 /* Get the filter ids */
188 if((ids = calloc(sizeof(unsigned int),nfilters)) == NULL) {stat = NC_ENOMEM; goto done;}
189 if((stat = nc_inq_var_filter_ids(ncid,varid,&nfilters, ids))) goto done;
190 /* Get params for the first filter */
191 if((stat = nc_inq_var_filter_info(ncid,varid,ids[0],nparamsp,params))) goto done;
192 if(idp) *idp = ids[0];
193 done:
194 nullfree(ids);
195 return stat;
196}
197
210
211EXTERNL int
212nc_inq_filter_avail(int ncid, unsigned id)
213{
214 int stat = NC_NOERR;
215 NC* ncp;
216
217 stat = NC_check_id(ncid,&ncp);
218 if(stat != NC_NOERR) return stat;
219 if((stat = ncp->dispatch->inq_filter_avail(ncid,id))) goto done;
220done:
221 return stat;
222}
223
224/**************************************************/
225/* Functions for accessing standardized filters */
226
240int
241nc_def_var_bzip2(int ncid, int varid, int level)
242{
243 int stat = NC_NOERR;
244 unsigned ulevel;
245
246 if((stat = nc_inq_filter_avail(ncid,H5Z_FILTER_BZIP2))) goto done;
247 /* Filter is available */
248 /* 1 <= Level <= 9 */
249 if (level < 1 || level > 9)
250 return NC_EINVAL;
251 ulevel = (unsigned) level; /* Keep bit pattern */
252 if((stat = nc_def_var_filter(ncid,varid,H5Z_FILTER_BZIP2,1,&ulevel))) goto done;
253done:
254 return stat;
255}
256
273int
274nc_inq_var_bzip2(int ncid, int varid, int* hasfilterp, int *levelp)
275{
276 int stat = NC_NOERR;
277 size_t nparams;
278 unsigned params = 0;
279 int hasfilter = 0;
280
281 if((stat = nc_inq_filter_avail(ncid,H5Z_FILTER_BZIP2))) goto done;
282 /* Filter is available */
283 /* Get filter info */
284 stat = nc_inq_var_filter_info(ncid,varid,H5Z_FILTER_BZIP2,&nparams,NULL);
285 if(stat == NC_ENOFILTER) {stat = NC_NOERR; hasfilter = 0; goto done;}
286 if(stat != NC_NOERR) goto done;
287 hasfilter = 1;
288 if(nparams != 1) {stat = NC_EFILTER; goto done;}
289 if((stat = nc_inq_var_filter_info(ncid,varid,H5Z_FILTER_BZIP2,&nparams,&params))) goto done;
290done:
291 if(levelp) *levelp = (int)params;
292 if(hasfilterp) *hasfilterp = hasfilter;
293 return stat;
294}
295
312int
313nc_def_var_zstandard(int ncid, int varid, int level)
314{
315#ifdef HAVE_ZSTD
316 int stat = NC_NOERR;
317 unsigned ulevel;
318
319 if((stat = nc_inq_filter_avail(ncid,H5Z_FILTER_ZSTD))) goto done;
320 /* Filter is available */
321 /* Level must be between -131072 and 22 on Zstandard v. 1.4.5 (~202009)
322 Earlier versions have fewer levels (especially fewer negative levels) */
323 if (level < -131072 || level > 22)
324 return NC_EINVAL;
325 ulevel = (unsigned) level; /* Keep bit pattern */
326 if((stat = nc_def_var_filter(ncid,varid,H5Z_FILTER_ZSTD,1,&ulevel))) goto done;
327done:
328 return stat;
329#else
330 return NC_NOERR;
331#endif /*HAVE_ZSTD*/
332}
333
350int
351nc_inq_var_zstandard(int ncid, int varid, int* hasfilterp, int *levelp)
352{
353#ifdef HAVE_ZSTD
354 int stat = NC_NOERR;
355 size_t nparams;
356 unsigned params = 0;
357 int hasfilter = 0;
358
359 if((stat = nc_inq_filter_avail(ncid,H5Z_FILTER_ZSTD))) goto done;
360 /* Filter is available */
361 /* Get filter info */
362 stat = nc_inq_var_filter_info(ncid,varid,H5Z_FILTER_ZSTD,&nparams,NULL);
363 if(stat == NC_ENOFILTER) {stat = NC_NOERR; hasfilter = 0; goto done;}
364 if(stat != NC_NOERR) goto done;
365 hasfilter = 1;
366 if(nparams != 1) {stat = NC_EFILTER; goto done;}
367 if((stat = nc_inq_var_filter_info(ncid,varid,H5Z_FILTER_ZSTD,&nparams,&params))) goto done;
368done:
369 if(levelp) *levelp = (int)params;
370 if(hasfilterp) *hasfilterp = hasfilter;
371 return stat;
372#else
373 return NC_NOERR;
374#endif /*HAVE_ZSTD*/
375}
376
392int
393nc_def_var_blosc(int ncid, int varid, unsigned subcompressor, unsigned level, unsigned blocksize, unsigned addshuffle)
394{
395#ifdef HAVE_BLOSC
396 int stat = NC_NOERR;
397 unsigned params[7];;
398
399 if((stat = nc_inq_filter_avail(ncid,H5Z_FILTER_BLOSC))) goto done;
400 /* Filter is available */
401
402 /* Verify parameters */
403 if(addshuffle > (unsigned)BLOSC_BITSHUFFLE) {stat = NC_EINVAL; goto done;}
404 if(subcompressor > (unsigned)BLOSC_ZSTD) {stat = NC_EINVAL; goto done;}
405
406 /* Set the parameters */
407 params[0] = 0;
408 params[1] = 0;
409 params[2] = 0;
410 params[3] = blocksize;
411 params[4] = level;
412 params[5] = addshuffle;
413 params[6] = subcompressor;
414 if((stat = nc_def_var_filter(ncid,varid,H5Z_FILTER_BLOSC,7,params))) goto done;
415done:
416 return stat;
417#else
418 return NC_NOERR;
419#endif
420}
421
444int
445nc_inq_var_blosc(int ncid, int varid, int* hasfilterp, unsigned* subcompressorp,
446 unsigned* levelp, unsigned* blocksizep, unsigned* addshufflep)
447{
448#ifdef HAVE_BLOSC
449 int stat = NC_NOERR;
450 size_t nparams;
451 unsigned params[7];
452 int hasfilter = 0;
453
454 if((stat = nc_inq_filter_avail(ncid,H5Z_FILTER_BLOSC))) goto done;
455 /* Filter is available */
456
457 /* Get filter info */
458 stat = nc_inq_var_filter_info(ncid,varid,H5Z_FILTER_BLOSC,&nparams,NULL);
459 if(stat == NC_ENOFILTER) {stat = NC_NOERR; hasfilter = 0; goto done;}
460 if(stat != NC_NOERR) goto done;
461 hasfilter = 1;
462 if(nparams != 7) {stat = NC_EFILTER; goto done;}
463 if((stat = nc_inq_var_filter_info(ncid,varid,H5Z_FILTER_BLOSC,&nparams,params))) goto done;
464 if(blocksizep) *blocksizep = params[3];
465 if(levelp) *levelp = params[4];
466 if(addshufflep) *addshufflep = params[5];
467 if(subcompressorp) *subcompressorp = params[6];
468done:
469 if(hasfilterp) *hasfilterp = hasfilter;
470 return stat;
471#else
472 return NC_NOERR;
473#endif
474}
EXTERNL int nc_inq_filter_avail(int ncid, unsigned id)
Test if filter is available.
Definition dfilter.c:212
EXTERNL int nc_def_var_filter(int ncid, int varid, unsigned int id, size_t nparams, const unsigned int *params)
Define a new variable filter Assumes HDF5 format using unsigned ints.
Definition dfilter.c:129
int nc_inq_var_blosc(int ncid, int varid, int *hasfilterp, unsigned *subcompressorp, unsigned *levelp, unsigned *blocksizep, unsigned *addshufflep)
Learn whether Blosc compression is on for a variable, and, if so, the settings.
Definition dfilter.c:445
int nc_def_var_zstandard(int ncid, int varid, int level)
Turn on Zstandard compression for a variable.
Definition dfilter.c:313
int nc_def_var_blosc(int ncid, int varid, unsigned subcompressor, unsigned level, unsigned blocksize, unsigned addshuffle)
Turn on blosc for a variable.
Definition dfilter.c:393
int nc_inq_var_bzip2(int ncid, int varid, int *hasfilterp, int *levelp)
Learn whether bzip2 compression is on for a variable, and, if so, the level setting.
Definition dfilter.c:274
EXTERNL int nc_inq_var_filter_info(int ncid, int varid, unsigned int id, size_t *nparamsp, unsigned int *params)
Find the param info about filter (if any) associated with a variable and with specified id.
Definition dfilter.c:98
int nc_def_var_bzip2(int ncid, int varid, int level)
Turn on bzip2 compression for a variable.
Definition dfilter.c:241
EXTERNL int nc_inq_var_filter(int ncid, int varid, unsigned int *idp, size_t *nparams, unsigned int *params)
Find the first filter (if any) associated with a variable.
Definition dfilter.c:170
int nc_inq_var_zstandard(int ncid, int varid, int *hasfilterp, int *levelp)
Learn whether Zstandard compression is on for a variable, and, if so, the level setting.
Definition dfilter.c:351
EXTERNL int nc_inq_var_filter_ids(int ncid, int varid, size_t *nfiltersp, unsigned int *ids)
Find the set of filters (if any) associated with a variable.
Definition dfilter.c:62
Main header file for the C API.
#define NC_EFILTER
Filter operation failed.
Definition netcdf.h:562
#define NC_ENOMEM
Memory allocation (malloc) failure.
Definition netcdf.h:497
#define EXTERNL
Needed for DLL build.
Definition netcdf.h:612
#define NC_EINVAL
Invalid Argument.
Definition netcdf.h:427
#define NC_NOERR
No Error.
Definition netcdf.h:417
#define NC_ENOFILTER
Filter not defined on variable.
Definition netcdf.h:566