diff options
-rw-r--r-- | tools/h5repack/h5repack.h | 1 | ||||
-rw-r--r-- | tools/h5repack/h5repack_copy.c | 5 | ||||
-rw-r--r-- | tools/h5repack/h5repack_filters.c | 29 |
3 files changed, 24 insertions, 11 deletions
diff --git a/tools/h5repack/h5repack.h b/tools/h5repack/h5repack.h index 7411085..b5906ae 100644 --- a/tools/h5repack/h5repack.h +++ b/tools/h5repack/h5repack.h @@ -189,6 +189,7 @@ int apply_filters(const char* name, /* object name from traverse list */ hid_t dcpl_id, /* dataset creation property list */ hid_t type_id, /* datatype */ pack_opt_t *options, /* repack options */ + int has_layout, /* input chunk */ pack_info_t *obj); /* info about object to filter */ int has_filter(hid_t dcpl_id, diff --git a/tools/h5repack/h5repack_copy.c b/tools/h5repack/h5repack_copy.c index a5b6a3f..aeeded0 100644 --- a/tools/h5repack/h5repack_copy.c +++ b/tools/h5repack/h5repack_copy.c @@ -259,6 +259,7 @@ int do_copy_objects(hid_t fidin, #endif /* LATER */ int i, j; int wrote=0; + int has_layout; /*------------------------------------------------------------------------- * copy the suppplied object list @@ -269,6 +270,7 @@ int do_copy_objects(hid_t fidin, { buf=NULL; + has_layout=0; switch ( travt->objs[i].type ) { /*------------------------------------------------------------------------- @@ -387,13 +389,14 @@ int do_copy_objects(hid_t fidin, obj.chunk.rank=rank; if (apply_layout(dcpl_id,&obj)<0) goto error; + has_layout=1; } /*------------------------------------------------------------------------- * apply the filter; check if the object is to be filtered. *------------------------------------------------------------------------- */ - if (apply_filters(travt->objs[i].name,rank,dims,dcpl_id,mtype_id,options,&obj)<0) + if (apply_filters(travt->objs[i].name,rank,dims,dcpl_id,mtype_id,options,has_layout,&obj)<0) goto error; }/*nelmts*/ diff --git a/tools/h5repack/h5repack_filters.c b/tools/h5repack/h5repack_filters.c index b506b16..5056a3f 100644 --- a/tools/h5repack/h5repack_filters.c +++ b/tools/h5repack/h5repack_filters.c @@ -116,6 +116,7 @@ int apply_filters(const char* name, /* object name from traverse list */ hid_t dcpl_id, /* dataset creation property list */ hid_t type_id, /* dataset datatype */ pack_opt_t *options, /* repack options */ + int has_layout, /* input chunk */ pack_info_t *obj) /* info about object to filter */ { int nfilters; /* number of filters in DCPL */ @@ -131,6 +132,22 @@ int apply_filters(const char* name, /* object name from traverse list */ if (rank==0) goto out; +/*------------------------------------------------------------------------- + * filters require CHUNK layout; if we do not have one define a default + *------------------------------------------------------------------------- + */ + if (has_layout) + { + layout_this(dcpl_id,name,options,obj); + } + else + { + obj->chunk.rank=rank; + for (i=0; i<rank; i++) + obj->chunk.chunk_lengths[i] = dims[i]; + } + + /* check for datasets too small */ if ((size=H5Tget_size(type_id))==0) return 0; @@ -157,16 +174,8 @@ int apply_filters(const char* name, /* object name from traverse list */ if (H5Premove_filter(dcpl_id,H5Z_FILTER_ALL)<0) return -1; } -/*------------------------------------------------------------------------- - * filters require CHUNK layout; if we do not have one define a default - *------------------------------------------------------------------------- - */ - if (obj->chunk.rank<=0) - { - obj->chunk.rank=rank; - for (i=0; i<rank; i++) - obj->chunk.chunk_lengths[i] = dims[i]; - } + + /*------------------------------------------------------------------------- * the type of filter and additional parameter |