1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Copyright by The HDF Group. *
* All rights reserved. *
* *
* This file is part of the HDF5 BLOSC filter plugin source. The full *
* copyright notice, including terms governing use, modification, and *
* terms governing use, modification, and redistribution, is contained in *
* the file COPYING, which can be found at the root of the BLOSC source code *
* distribution tree. If you do not have access to this file, you may *
* request a copy from help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/************************************************************
This example shows how to write data and read it from a dataset
using blosc compression.
blosc filter is not available in HDF5.
The example uses a new feature available in HDF5 version 1.8.11
to discover, load and register filters at run time.
************************************************************/
#include "hdf5.h"
#include <stdio.h>
#include <stdlib.h>
#define FILE "h5ex_d_blosc.h5"
#define DATASET "DS1"
#define DIM0 32
#define DIM1 64
#define CHUNK0 4
#define CHUNK1 8
#define H5Z_FILTER_BLOSC 32001
int
main (void)
{
hid_t file_id = -1; /* Handles */
hid_t space_id = -1; /* Handles */
hid_t dset_id = -1; /* Handles */
hid_t dcpl_id = -1; /* Handles */
herr_t status;
htri_t avail;
H5Z_filter_t filter_id = 0;
char filter_name[80];
hsize_t dims[2] = {DIM0, DIM1},
chunk[2] = {CHUNK0, CHUNK1};
size_t nelmts = 6; /* number of elements in cd_values */
unsigned int flags;
unsigned filter_config;
unsigned int cd_values[6]; /* blosc iparameters */
unsigned int values_out[6] = {99, 99, 99, 99, 99, 99};
int wdata[DIM0][DIM1], /* Write buffer */
rdata[DIM0][DIM1], /* Read buffer */
max;
hsize_t i, j;
int ret_value = 1;
/*
* Initialize data.
*/
for (i=0; i<DIM0; i++)
for (j=0; j<DIM1; j++)
wdata[i][j] = i * j - j;
/*
* Create a new file using the default properties.
*/
file_id = H5Fcreate (FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
if (file_id < 0) goto done;
/*
* Create dataspace. Setting maximum size to NULL sets the maximum
* size to be the current size.
*/
space_id = H5Screate_simple (2, dims, NULL);
if (space_id < 0) goto done;
/*
* Create the dataset creation property list, add the gzip
* compression filter and set the chunk size.
*/
dcpl_id = H5Pcreate (H5P_DATASET_CREATE);
if (dcpl_id < 0) goto done;
cd_values[4] = 5;
cd_values[5] = 1;
status = H5Pset_filter (dcpl_id, H5Z_FILTER_BLOSC, H5Z_FLAG_OPTIONAL, (size_t)6, cd_values);
if (status < 0) goto done;
/*
* Check that filter is registered with the library now.
* If it is registered, retrieve filter's configuration.
*/
avail = H5Zfilter_avail(H5Z_FILTER_BLOSC);
if (avail) {
status = H5Zget_filter_info (H5Z_FILTER_BLOSC, &filter_config);
if ( (filter_config & H5Z_FILTER_CONFIG_ENCODE_ENABLED) &&
(filter_config & H5Z_FILTER_CONFIG_DECODE_ENABLED) )
printf ("blosc filter is available for encoding and decoding.\n");
}
status = H5Pset_chunk (dcpl_id, 2, chunk);
if (status < 0) printf ("failed to set chunk.\n");
/*
* Create the dataset.
*/
printf ("....Writing blosc compressed data ................\n");
dset_id = H5Dcreate (file_id, DATASET, H5T_STD_I32LE, space_id, H5P_DEFAULT, dcpl_id, H5P_DEFAULT);
if (dset_id < 0) goto done;
/*
* Write the data to the dataset.
*/
status = H5Dwrite (dset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata[0]);
if (status < 0) printf ("failed to write data.\n");
/*
* Close and release resources.
*/
H5Dclose (dset_id);
dset_id = -1;
H5Pclose (dcpl_id);
dcpl_id = -1;
H5Sclose (space_id);
space_id = -1;
H5Fclose (file_id);
file_id = -1;
status = H5close();
if (status < 0) {
printf ("/nFAILED to close library/n");
goto done;
}
printf ("....Close the file and reopen for reading ........\n");
/*
* Now we begin the read section of this example.
*/
/*
* Open file and dataset using the default properties.
*/
file_id = H5Fopen (FILE, H5F_ACC_RDONLY, H5P_DEFAULT);
if (file_id < 0) goto done;
dset_id = H5Dopen (file_id, DATASET, H5P_DEFAULT);
if (dset_id < 0) goto done;
/*
* Retrieve dataset creation property list.
*/
dcpl_id = H5Dget_create_plist (dset_id);
if (dcpl_id < 0) goto done;
/*
* Retrieve and print the filter id, compression level and filter's name for blosc.
*/
filter_id = H5Pget_filter2 (dcpl_id, (unsigned) 0, &flags, &nelmts, values_out, sizeof(filter_name), filter_name, NULL);
printf ("Filter info is available from the dataset creation property \n ");
printf (" Filter identifier is ");
switch (filter_id) {
case H5Z_FILTER_BLOSC:
printf ("%d\n", filter_id);
printf (" Number of parameters is %d with the value %u %u\n", nelmts, values_out[4], values_out[5]);
printf (" To find more about the filter check %s\n", filter_name);
break;
default:
printf ("Not expected filter\n");
break;
}
/*
* Read the data using the default properties.
*/
printf ("....Reading blosc compressed data ................\n");
status = H5Dread (dset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata[0]);
if (status < 0) printf ("failed to read data.\n");
/*
* Find the maximum value in the dataset, to verify that it was
* read correctly.
*/
max = rdata[0][0];
for (i=0; i<DIM0; i++)
for (j=0; j<DIM1; j++) {
/*printf("%d \n", rdata[i][j]); */
if (max < rdata[i][j])
max = rdata[i][j];
}
/*
* Print the maximum value.
*/
printf ("Maximum value in %s is %d\n", DATASET, max);
/*
* Check that filter is registered with the library now.
*/
avail = H5Zfilter_avail(H5Z_FILTER_BLOSC);
if (avail)
printf ("blosc filter is available now since H5Dread triggered loading of the filter.\n");
ret_value = 0;
done:
/*
* Close and release resources.
*/
if (dcpl_id >= 0) H5Pclose (dcpl_id);
if (dset_id >= 0) H5Dclose (dset_id);
if (space_id >= 0) H5Sclose (space_id);
if (file_id >= 0) H5Fclose (file_id);
return ret_value;
}
|