summaryrefslogtreecommitdiffstats
path: root/tools/h52jpeg/h52jpeg.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/h52jpeg/h52jpeg.c')
-rw-r--r--tools/h52jpeg/h52jpeg.c429
1 files changed, 250 insertions, 179 deletions
diff --git a/tools/h52jpeg/h52jpeg.c b/tools/h52jpeg/h52jpeg.c
index eccf8f7..c7fb59e 100644
--- a/tools/h52jpeg/h52jpeg.c
+++ b/tools/h52jpeg/h52jpeg.c
@@ -64,7 +64,9 @@ typedef struct
/* prototypes */
static void usage(const char *prog);
-static int h52jpeg(h52jpeg_opt_t options);
+static int h52jpeg(h52jpeg_opt_t opt);
+static void make_jpeg_name( const char* template_name, const char* image_name, char* jpeg_name);
+static int do_image(hid_t fid, h52jpeg_opt_t opt, const char* image_name);
static void write_JPEG_file(char *filename, JSAMPLE *image_buffer, int image_height, int image_width, int planes);
@@ -81,17 +83,17 @@ static void write_JPEG_file(char *filename, JSAMPLE *image_buffer, int image_hei
*/
int main(int argc, const char *argv[])
{
- h52jpeg_opt_t options;
+ h52jpeg_opt_t opt;
const char *image_type = NULL;
- int opt;
+ int op;
/* initialze options to 0 */
- memset(&options,0,sizeof(h52jpeg_opt_t));
+ memset(&opt,0,sizeof(h52jpeg_opt_t));
/* parse command line options */
- while ((opt = get_option(argc, argv, s_opts, l_opts)) != EOF)
+ while ((op = get_option(argc, argv, s_opts, l_opts)) != EOF)
{
- switch ((char)opt)
+ switch ((char)op)
{
case 'h':
usage(progname);
@@ -100,10 +102,10 @@ int main(int argc, const char *argv[])
print_version(progname);
exit(EXIT_SUCCESS);
case 'v':
- options.verbose = 1;
+ opt.verbose = 1;
break;
case 'i':
- options.image_name = opt_arg;
+ opt.image_name = opt_arg;
break;
case 't':
image_type = opt_arg;
@@ -117,8 +119,8 @@ int main(int argc, const char *argv[])
/* check for file names to be processed */
if ( argv[ opt_ind ] != NULL && argv[ opt_ind + 1 ] != NULL )
{
- options.file_name = argv[ opt_ind ];
- options.template_name = argv[ opt_ind + 1 ];
+ opt.file_name = argv[ opt_ind ];
+ opt.template_name = argv[ opt_ind + 1 ];
}
else
@@ -127,7 +129,7 @@ int main(int argc, const char *argv[])
exit(EXIT_FAILURE);
}
- if ( h52jpeg(options) < 0 )
+ if ( h52jpeg(opt) < 0 )
return 1;
@@ -178,8 +180,114 @@ static void usage(const char *prog)
*/
static int h52jpeg(h52jpeg_opt_t opt)
{
- hid_t fid;
- trav_table_t *travt = NULL;
+ hid_t fid;
+ trav_table_t *travt = NULL;
+ size_t i;
+
+
+ /* open the HDF5 file */
+ if (( fid = h5tools_fopen(opt.file_name, H5F_ACC_RDONLY, H5P_DEFAULT, NULL, NULL, (size_t)0)) < 0)
+ {
+ error_msg(progname, "cannot open file <%s>\n", opt.file_name );
+ return -1;
+ }
+
+ /*-------------------------------------------------------------------------
+ * image/dataset name was specified at command line
+ *-------------------------------------------------------------------------
+ */
+
+ if ( opt.image_name )
+ {
+
+ /* read HDF5 image/dataset, save jpeg image */
+ do_image(fid, opt, opt.image_name);
+
+ }
+
+ /*-------------------------------------------------------------------------
+ * image name was not specified; traverse the file
+ *-------------------------------------------------------------------------
+ */
+
+ else
+
+ {
+
+ /* initialize traversal table */
+ trav_table_init(&travt);
+
+ /* get the list of objects in the file */
+ if ( h5trav_gettable(fid, travt) < 0 )
+ goto out;
+
+ /* search for images/datasets in file */
+ for ( i = 0; i < travt->nobjs; i++)
+ {
+
+ switch ( travt->objs[i].type )
+ {
+ default:
+ goto out;
+
+ case H5TRAV_TYPE_GROUP:
+ case H5TRAV_TYPE_NAMED_DATATYPE:
+ case H5TRAV_TYPE_LINK:
+ case H5TRAV_TYPE_UDLINK:
+
+ break;
+
+ case H5TRAV_TYPE_DATASET:
+
+ /* read HDF5 image/dataset, save jpeg image */
+ do_image(fid, opt, travt->objs[i].name);
+
+ break; /* H5TRAV_TYPE_DATASET */
+
+ } /* switch */
+
+ } /* i */
+
+
+ /* free table */
+ trav_table_free(travt);
+
+ } /* image_name */
+
+
+ /* close */
+ if ( H5Fclose(fid) < 0 )
+ return -1;
+
+ return 0;
+
+out:
+ H5E_BEGIN_TRY
+ {
+ H5Fclose(fid);
+
+ } H5E_END_TRY;
+
+
+ return -1;
+}
+
+
+
+/*-------------------------------------------------------------------------
+ * Function: do_image
+ *
+ * Parameters: OPT, command line options
+ *
+ * Purpose: read HDF5 image/dataset, save jpeg image
+ *
+ * Return: int
+ *
+ *-------------------------------------------------------------------------
+ */
+static
+int do_image(hid_t fid, h52jpeg_opt_t opt, const char* image_name)
+{
hsize_t width;
hsize_t height;
hsize_t planes;
@@ -195,216 +303,179 @@ static int h52jpeg(h52jpeg_opt_t opt)
hsize_t maxdim[H5S_MAX_RANK];
size_t size;
hsize_t nelmts;
- char* name;
- size_t i;
+ const char* name;
int j;
int done;
char jpeg_name[1024];
- int len;
-
- /* open the HDF5 file */
- if (( fid = h5tools_fopen(opt.file_name, H5F_ACC_RDONLY, H5P_DEFAULT, NULL, NULL, (size_t)0)) < 0)
+ name = image_name;
+
+ /* build the jpeg file name */
+ make_jpeg_name( opt.template_name, image_name, jpeg_name);
+
+ done = 0;
+
+ if ( opt.verbose)
{
- error_msg(progname, "cannot open file <%s>\n", opt.file_name );
- return -1;
+ printf("%s ...", name );
}
- /* initialize traversal table */
- trav_table_init(&travt);
+ /*-------------------------------------------------------------------------
+ * HDF5 Image
+ *-------------------------------------------------------------------------
+ */
- /* get the list of objects in the file */
- if ( h5trav_gettable(fid, travt) < 0 )
- goto out;
-
- /* search for images/datasets in file */
- for ( i = 0; i < travt->nobjs; i++)
+ if ( H5IMis_image( fid, name ) )
{
- switch ( travt->objs[i].type )
- {
- default:
+ if ( H5IMget_image_info( fid, name, &width, &height, &planes, interlace, &npals ) < 0 )
goto out;
-
- case H5TRAV_TYPE_GROUP:
- case H5TRAV_TYPE_NAMED_DATATYPE:
- case H5TRAV_TYPE_LINK:
- case H5TRAV_TYPE_UDLINK:
-
- break;
-
- case H5TRAV_TYPE_DATASET:
-
- name = travt->objs[i].name;
-
- HDstrcpy( jpeg_name, opt.template_name );
- HDstrcat( jpeg_name, name );
- HDstrcat( jpeg_name, ".jpeg" );
- len = HDstrlen( jpeg_name);
-
- /* HDF5 path names might contain '/', replace with '_' */
- for (j = 0; j < len; j++)
- {
- if (jpeg_name[j] == '/')
- {
- jpeg_name[j] = '_';
- }
- }
-
-
- done = 0;
-
- if ( opt.verbose)
- printf("%s ...", name );
+ if (NULL == (buf = HDmalloc( (size_t)width * (size_t)height * (size_t)planes )))
+ goto out;
+
+ if ( H5IMread_image( fid, name, buf ) < 0 )
+ goto out;
+
+ write_JPEG_file (jpeg_name,
+ buf,
+ (int) height,
+ (int) width,
+ (int) planes);
+
+
+ free( buf );
+ buf = NULL;
+
+ done = 1;
+
+
+
+ }
+
+ /*-------------------------------------------------------------------------
+ * regular dataset
+ *-------------------------------------------------------------------------
+ */
+
+ else
+ {
+
+ if (( did = H5Dopen2( fid, name, H5P_DEFAULT )) < 0)
+ goto out;
+ if (( sid = H5Dget_space( did )) < 0 )
+ goto out;
+ if (( rank = H5Sget_simple_extent_ndims(sid)) < 0 )
+ goto out;
+ if (( tid = H5Dget_type( did )) < 0 )
+ goto out;
+ if (( tclass = H5Tget_class(tid)) < 0)
+ goto out;
+
+ if ( ( H5T_FLOAT == tclass || H5T_INTEGER == tclass) &&
+ ( rank == 2 ) )
+ {
- /*-------------------------------------------------------------------------
- * HDF5 Image
- *-------------------------------------------------------------------------
- */
-
- if ( H5IMis_image( fid, name ) )
- {
-
- if ( H5IMget_image_info( fid, name, &width, &height, &planes, interlace, &npals ) < 0 )
- goto out;
-
- if (NULL == (buf = HDmalloc( (size_t)width * (size_t)height * (size_t)planes )))
- goto out;
-
- if ( H5IMread_image( fid, name, buf ) < 0 )
- goto out;
-
- write_JPEG_file (jpeg_name,
- buf,
- (int) height,
- (int) width,
- (int) planes);
-
-
- free( buf );
- buf = NULL;
-
- done = 1;
-
-
-
- }
-
- /*-------------------------------------------------------------------------
- * regular dataset
- *-------------------------------------------------------------------------
- */
-
- else
- {
-
- if (( did = H5Dopen2( fid, name, H5P_DEFAULT )) < 0)
- goto out;
- if (( sid = H5Dget_space( did )) < 0 )
- goto out;
- if (( rank = H5Sget_simple_extent_ndims(sid)) < 0 )
- goto out;
- if (( tid = H5Dget_type( did )) < 0 )
- goto out;
- if (( tclass = H5Tget_class(tid)) < 0)
- goto out;
-
- if ( ( H5T_FLOAT == tclass || H5T_INTEGER == tclass) &&
- ( rank == 2 ) )
- {
-
- if ( H5Sget_simple_extent_dims( sid, dims, maxdim ) < 0 )
- goto out;
-
- size = H5Tget_size( tid );
-
- nelmts = 1;
- for ( j = 0; j < rank; j++)
- {
- nelmts *= dims[j];
- }
-
- if ( NULL == (buf = HDmalloc( (size_t)nelmts * size )))
- goto out;
- if ( H5Dread(did,tid,H5S_ALL,H5S_ALL,H5P_DEFAULT,buf) < 0 )
- goto out;
-
-
- free( buf );
- buf = NULL;
-
- }
-
-
-
- H5Sclose(sid);
- H5Tclose(tid);
- H5Dclose(did);
-
-
-
-
- } /* else */
+ if ( H5Sget_simple_extent_dims( sid, dims, maxdim ) < 0 )
+ goto out;
+ size = H5Tget_size( tid );
- if ( opt.verbose)
- {
- if ( done )
- {
- printf("saved to %s\n", jpeg_name );
- }
- else
- {
- printf("\n");
- }
-
+ nelmts = 1;
+ for ( j = 0; j < rank; j++)
+ {
+ nelmts *= dims[j];
}
+ if ( NULL == (buf = HDmalloc( (size_t)nelmts * size )))
+ goto out;
+ if ( H5Dread(did,tid,H5S_ALL,H5S_ALL,H5P_DEFAULT,buf) < 0 )
+ goto out;
- break; /* H5TRAV_TYPE_DATASET */
+ free( buf );
+ buf = NULL;
-
-
- } /* switch */
+ }
- } /* i */
-
-
-
- /* free table */
- trav_table_free(travt);
+ H5Sclose(sid);
+ H5Tclose(tid);
+ H5Dclose(did);
+
+
+
+
+ } /* else */
- /* close */
- if ( H5Fclose(fid) < 0 )
- return -1;
+ if ( opt.verbose)
+ {
+ if ( done )
+ {
+ printf("saved to %s\n", jpeg_name );
+ }
+ else
+ {
+ printf("\n");
+ }
+
+ }
return 0;
out:
H5E_BEGIN_TRY
{
-
+
H5Sclose(sid);
H5Tclose(tid);
H5Dclose(did);
- H5Fclose(fid);
} H5E_END_TRY;
-
+
if ( buf != NULL )
free( buf );
return -1;
+
}
+/*-------------------------------------------------------------------------
+ * Function: make_jpeg_name
+ *
+ * Parameters: template name (IN), image name (IN), jpeg name (IN/OUT)
+ *
+ * Purpose: build a name for the jpeg image file upon a template name
+ * and the HDF5 image name
+ *
+ * Return: void
+ *
+ *-------------------------------------------------------------------------
+ */
+static
+void make_jpeg_name( const char* template_name, const char* image_name, char* jpeg_name)
+{
+ int j;
+ int len;
-
+ HDstrcpy( jpeg_name, template_name );
+ HDstrcat( jpeg_name, image_name );
+ HDstrcat( jpeg_name, ".jpeg" );
+ len = HDstrlen( jpeg_name);
+
+ /* HDF5 path names might contain '/', replace with '_' */
+ for (j = 0; j < len; j++)
+ {
+ if (jpeg_name[j] == '/')
+ {
+ jpeg_name[j] = '_';
+ }
+ }
+
+}
/*
* Sample routine for JPEG compression. We assume that the target file name