diff options
Diffstat (limited to 'HDF5Examples/C/H5FLT/h5ex_d_jpeg.c')
-rw-r--r-- | HDF5Examples/C/H5FLT/h5ex_d_jpeg.c | 249 |
1 files changed, 249 insertions, 0 deletions
diff --git a/HDF5Examples/C/H5FLT/h5ex_d_jpeg.c b/HDF5Examples/C/H5FLT/h5ex_d_jpeg.c new file mode 100644 index 0000000..78a4252 --- /dev/null +++ b/HDF5Examples/C/H5FLT/h5ex_d_jpeg.c @@ -0,0 +1,249 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by The HDF Group. * + * All rights reserved. * + * * + * This file is part of the HDF5 JPEG 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 JPEG 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 jpeg compression. + jpeg 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_jpeg.h5" +#define DATASET "DS1" +#define DIM0 512 +#define DIM1 1024 +#define NUM_IMAGES 2 +#define JPEG_QUALITY 100 +#define CHUNK0 1 +#define CHUNK1 DIM0 +#define CHUNK2 DIM1 +#define H5Z_FILTER_JPEG 32019 + +int +main(void) +{ + hid_t file_id = H5I_INVALID_HID; /* Handles */ + hid_t space_id = H5I_INVALID_HID; /* Handles */ + hid_t dset_id = H5I_INVALID_HID; /* Handles */ + hid_t dcpl_id = H5I_INVALID_HID; /* Handles */ + herr_t status; + htri_t avail; + H5Z_filter_t filter_id = 0; + char filter_name[80]; + hsize_t dims[3] = {NUM_IMAGES, DIM0, DIM1}, chunk[3] = {CHUNK0, CHUNK1, CHUNK2}; + size_t nelmts = 4; /* number of elements in cd_values */ + unsigned int flags; + unsigned filter_config; + size_t data_size = DIM0 * DIM1 * NUM_IMAGES; + + /* JPEG filter requires 4 parameters */ + /* JPEG quality factor (1-100) */ + /* Number of columns */ + /* Number of rows */ + /* Color mode (0=Mono, 1=RGB) */ + const unsigned int cd_values[4] = {JPEG_QUALITY, DIM1, DIM0, 0}; /* jpeg default level is 2 */ + unsigned int values_out[4] = {99, 99, 99, 99}; + unsigned char *wdata, /* Write buffer */ + *rdata; /* Read buffer */ + int num_diff = 0; + hsize_t i; + int ret_value = 1; + + wdata = (unsigned char *)malloc(sizeof(unsigned char) * data_size); + rdata = (unsigned char *)malloc(sizeof(unsigned char) * data_size); + + for (i = 0; i < data_size; i++) { + wdata[i] = i; + } + + /* + * 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(3, 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; + + status = H5Pset_filter(dcpl_id, H5Z_FILTER_JPEG, H5Z_FLAG_MANDATORY, nelmts, 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_JPEG); + if (avail) { + status = H5Zget_filter_info(H5Z_FILTER_JPEG, &filter_config); + if ((filter_config & H5Z_FILTER_CONFIG_ENCODE_ENABLED) && + (filter_config & H5Z_FILTER_CONFIG_DECODE_ENABLED)) + fprintf(stdout, "jpeg filter is available for encoding and decoding.\n"); + } + else { + fprintf(stdout, "H5Zfilter_avail - not found.\n"); + goto done; + } + status = H5Pset_chunk(dcpl_id, 3, chunk); + if (status < 0) + fprintf(stdout, "failed to set chunk.\n"); + + /* + * Create the dataset. + */ + fprintf(stdout, "....Create dataset ................\n"); + dset_id = H5Dcreate(file_id, DATASET, H5T_NATIVE_UINT8, space_id, H5P_DEFAULT, dcpl_id, H5P_DEFAULT); + if (dset_id < 0) { + fprintf(stdout, "failed to create dataset.\n"); + goto done; + } + fflush(stdout); + + /* + * Write the data to the dataset. + */ + fprintf(stdout, "....Writing jpeg compressed data ................\n"); + status = H5Dwrite(dset_id, H5T_NATIVE_UINT8, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata); + if (status < 0) + fprintf(stdout, "failed to write data.\n"); + fflush(stdout); + + /* + * 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) { + fprintf(stdout, "/nFAILED to close library/n"); + goto done; + } + + fprintf(stdout, "....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 jpeg. + */ + filter_id = H5Pget_filter2(dcpl_id, (unsigned)0, &flags, &nelmts, values_out, sizeof(filter_name), + filter_name, NULL); + fprintf(stdout, "Filter info is available from the dataset creation property \n "); + fprintf(stdout, " Filter identifier is "); + switch (filter_id) { + case H5Z_FILTER_JPEG: + fprintf(stdout, "%d\n", filter_id); + fprintf(stdout, " Number of parameters is %d with the value %u\n", nelmts, values_out[0]); + fprintf(stdout, " To find more about the filter check %s\n", filter_name); + break; + default: + fprintf(stdout, "Not expected filter\n"); + break; + } + fflush(stdout); + + /* + * Read the data using the default properties. + */ + fprintf(stdout, "....Reading jpeg compressed data ................\n"); + status = H5Dread(dset_id, H5T_NATIVE_UINT8, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata); + if (status < 0) + fprintf(stdout, "failed to read data.\n"); + fflush(stdout); + + /* + * Find the maximum value in the dataset, to verify that it was + * read correctly. + */ + for (i = 0; i < data_size; i++) { + /*printf("%d \n", rdata[i]); */ + if (rdata[i] != wdata[i]) + num_diff++; + } + /* + * Print the number of differences. + */ + fprintf(stdout, "JPEG quality=%d, percent of differing array elements=%f\n", JPEG_QUALITY, + 100. * (double)num_diff / data_size); + /* + * Check that filter is registered with the library now. + */ + avail = H5Zfilter_avail(H5Z_FILTER_JPEG); + if (avail) + fprintf(stdout, "jpeg filter is available now since H5Dread triggered loading of the filter.\n"); + + ret_value = 0; + +done: + fflush(stdout); + free(rdata); + free(wdata); + /* + * 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; +} |