summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tools/h5repack/h5repack.h1
-rw-r--r--tools/h5repack/h5repack_copy.c5
-rw-r--r--tools/h5repack/h5repack_filters.c29
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