diff options
author | Bihemo Kimasa <b.kimasa@jacobs-university.de> | 2011-02-07 15:50:15 +0100 |
---|---|---|
committer | www-data <www-data@ubuntu.localdomain> | 2011-02-16 09:59:33 +0100 |
commit | 5471d638899dbf3f52178f8840d0016b0f76f4b2 (patch) | |
tree | 90a218e5bad721db0eb85b97940179eb38c02327 /conversion/hdf.cc | |
parent | f5d248cd24523ea2d8a4085f30be44b045aeac0a (diff) | |
download | rasdaman-upstream-5471d638899dbf3f52178f8840d0016b0f76f4b2.tar.gz rasdaman-upstream-5471d638899dbf3f52178f8840d0016b0f76f4b2.tar.xz rasdaman-upstream-5471d638899dbf3f52178f8840d0016b0f76f4b2.zip |
Message: Addition of optional hdf functionality on rasdaman. Please see documentation for more information.
Diffstat (limited to 'conversion/hdf.cc')
-rwxr-xr-x[-rw-r--r--] | conversion/hdf.cc | 555 |
1 files changed, 279 insertions, 276 deletions
diff --git a/conversion/hdf.cc b/conversion/hdf.cc index 3cf8bf7..adb4d56 100644..100755 --- a/conversion/hdf.cc +++ b/conversion/hdf.cc @@ -1,24 +1,24 @@ /* -* This file is part of rasdaman community. -* -* Rasdaman community is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Rasdaman community is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with rasdaman community. If not, see <http://www.gnu.org/licenses/>. -* -* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 Peter Baumann / + * This file is part of rasdaman community. + * + * Rasdaman community is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Rasdaman community is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with rasdaman community. If not, see <http://www.gnu.org/licenses/>. + * + * Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 Peter Baumann / rasdaman GmbH. -* -* For more information please see <http://www.rasdaman.org> -* or contact Peter Baumann via <baumann@rasdaman.com>. + * + * For more information please see <http://www.rasdaman.org> + * or contact Peter Baumann via <baumann@rasdaman.com>. / /** * SOURCE: hdf.cc @@ -31,13 +31,16 @@ rasdaman GmbH. * * Provides functions to convert data to HDF SD and back. * -*/ + */ /* Added by Sorin Stancu-Mara. Definition clashed for type int8, define in both -* /usr/include/hdf.h and in /usr/include/tiff.h -* This will supress the tiff.h definition. -* Both definitions are similar -*/ + * /usr/include/hdf.h and in /usr/include/tiff.h + * This will supress the tiff.h definition. + * Both definitions are similar + */ + +#ifdef HAVE_HDF + #define HAVE_INT8 #include "conversion/hdf.hh" @@ -46,27 +49,26 @@ rasdaman GmbH. #include "raslib/parseparams.hh" #include "raslib/primitivetype.hh" - #ifdef HAVE_HDF_H - #include "hdf.h" +#include "hdf.h" #elif HAVE_HDF_HDF_H - #include "hdf/hdf.h" +#include "hdf/hdf.h" #else - #error "No hdf.h header available." +#error "No hdf.h header available." #endif #ifdef HAVE_MFHDF_H - #include "mfhdf.h" +#include "mfhdf.h" #elif HAVE_HDF_MFHDF_H - #include "hdf/mfhdf.h" +#include "hdf/mfhdf.h" #else - #error "No mfhdf.h header available." +#error "No mfhdf.h header available." #endif // HDF changed from MAX_VAR_DIMS to H4_MAX_VAR_DIMS around 9/5/2007 // to avoid potential conflicts with NetCDF-3 library #ifndef H4_MAX_VAR_DIMS - #define H4_MAX_VAR_DIMS MAX_VAR_DIMS +#define H4_MAX_VAR_DIMS MAX_VAR_DIMS #endif #include <stdio.h> @@ -74,15 +76,15 @@ rasdaman GmbH. // make this code robust against different HDF versions and trouble: #ifndef MAX_VAR_DIMS - #define MAX_VAR_DIMS 32 +#define MAX_VAR_DIMS 32 #endif const r_Convertor::convert_string_t r_Conv_HDF::compNames[] = { - {"none", COMP_CODE_NONE}, - {"rle", COMP_CODE_RLE}, - {"huffman", COMP_CODE_SKPHUFF}, - {"deflate", COMP_CODE_DEFLATE}, - {NULL, COMP_CODE_NONE} + {"none", COMP_CODE_NONE}, + {"rle", COMP_CODE_RLE}, + {"huffman", COMP_CODE_SKPHUFF}, + {"deflate", COMP_CODE_DEFLATE}, + {NULL, COMP_CODE_NONE} }; // Buffer used for switching the majorness (column <--> row) of the array data @@ -93,62 +95,62 @@ const int r_Conv_HDF::MaxSwapBufferSize = 0x10000; void r_Conv_HDF::initHDF( void ) { - compType = NULL; - quality = 80; - skiphuff = 0; + compType = NULL; + quality = 80; + skiphuff = 0; - if (params == NULL) - params = new r_Parse_Params; + if (params == NULL) + params = new r_Parse_Params; - params->add("comptype", &compType, r_Parse_Params::param_type_string); - params->add("quality", &quality, r_Parse_Params::param_type_int); - params->add("skiphuff", &skiphuff, r_Parse_Params::param_type_int); + params->add("comptype", &compType, r_Parse_Params::param_type_string); + params->add("quality", &quality, r_Parse_Params::param_type_int); + params->add("skiphuff", &skiphuff, r_Parse_Params::param_type_int); } int r_Conv_HDF::getHDFtype(int intType, int &size) { - int result=0; - - switch (intType) - { - case ctype_int8: result = DFNT_CHAR8; size = 1; break; - case ctype_uint8: - case ctype_char: - case ctype_bool: result = DFNT_UCHAR8; size = 1; break; - case ctype_int16: result = DFNT_INT16; size = 2; break; - case ctype_uint16: result = DFNT_UINT16; size = 2; break; - case ctype_int32: result = DFNT_INT32; size = 4; break; - case ctype_uint32: result = DFNT_UINT32; size = 4; break; - case ctype_int64: result = DFNT_INT64; size = 8; break; - case ctype_uint64: result = DFNT_UINT64; size = 8; break; - case ctype_float32: result = DFNT_FLOAT32; size = 4; break; - case ctype_float64: result = DFNT_FLOAT64; size = 8; break; - default: result = 0; size = 1; break; - } - return result; + int result=0; + + switch (intType) + { + case ctype_int8: result = DFNT_CHAR8; size = 1; break; + case ctype_uint8: + case ctype_char: + case ctype_bool: result = DFNT_UCHAR8; size = 1; break; + case ctype_int16: result = DFNT_INT16; size = 2; break; + case ctype_uint16: result = DFNT_UINT16; size = 2; break; + case ctype_int32: result = DFNT_INT32; size = 4; break; + case ctype_uint32: result = DFNT_UINT32; size = 4; break; + case ctype_int64: result = DFNT_INT64; size = 8; break; + case ctype_uint64: result = DFNT_UINT64; size = 8; break; + case ctype_float32: result = DFNT_FLOAT32; size = 4; break; + case ctype_float64: result = DFNT_FLOAT64; size = 8; break; + default: result = 0; size = 1; break; + } + return result; } int r_Conv_HDF::getIntType( int hdfType, int &size ) { - int result=0; - - switch (hdfType) - { - case DFNT_CHAR8: result = ctype_int8; size = 1; break; - case DFNT_UCHAR8: result = ctype_uint8; size = 1; break; - case DFNT_INT16: result = ctype_int16; size = 2; break; - case DFNT_UINT16: result = ctype_uint16; size = 2; break; - case DFNT_INT32: result = ctype_int32; size = 4; break; - case DFNT_UINT32: result = ctype_uint32; size = 4; break; - case DFNT_INT64: result = ctype_int64; size = 8; break; - case DFNT_UINT64: result = ctype_uint64; size = 8; break; - case DFNT_FLOAT32: result = ctype_float32; size = 4; break; - case DFNT_FLOAT64: result = ctype_float64; size = 8; break; - default: result = ctype_void; size = 1; break; - } - return result; + int result=0; + + switch (hdfType) + { + case DFNT_CHAR8: result = ctype_int8; size = 1; break; + case DFNT_UCHAR8: result = ctype_uint8; size = 1; break; + case DFNT_INT16: result = ctype_int16; size = 2; break; + case DFNT_UINT16: result = ctype_uint16; size = 2; break; + case DFNT_INT32: result = ctype_int32; size = 4; break; + case DFNT_UINT32: result = ctype_uint32; size = 4; break; + case DFNT_INT64: result = ctype_int64; size = 8; break; + case DFNT_UINT64: result = ctype_uint64; size = 8; break; + case DFNT_FLOAT32: result = ctype_float32; size = 4; break; + case DFNT_FLOAT64: result = ctype_float64; size = 8; break; + default: result = ctype_void; size = 1; break; + } + return result; } @@ -156,13 +158,13 @@ int r_Conv_HDF::getIntType( int hdfType, int &size ) r_Conv_HDF::r_Conv_HDF(const char *src, const r_Minterval &interv, const r_Type *tp) throw(r_Error) : r_Convertor(src, interv, tp, true) { - initHDF(); + initHDF(); - if (tp->isStructType()) - { - RMInit::logOut << "r_Conv_HDF::r_Conv_HDF(): structured types not supported." << endl; - throw r_Error(r_Error::r_Error_General); - } + if (tp->isStructType()) + { + RMInit::logOut << "r_Conv_HDF::r_Conv_HDF(): structured types not supported." << endl; + throw r_Error(r_Error::r_Error_General); + } } @@ -170,226 +172,227 @@ r_Conv_HDF::r_Conv_HDF(const char *src, const r_Minterval &interv, const r_Type r_Conv_HDF::r_Conv_HDF(const char *src, const r_Minterval &interv, int tp) throw(r_Error) : r_Convertor(src, interv, tp) { - initHDF(); + initHDF(); } r_Conv_HDF::~r_Conv_HDF(void) { - if (compType != NULL) - { - delete [] compType; - compType = NULL; - } + if (compType != NULL) + { + delete [] compType; + compType = NULL; + } } r_convDesc &r_Conv_HDF::convertTo( const char *options ) throw(r_Error) { - char name[256]; - int32 handle=0, sds_id=0, rank=0; - comp_coder_t comp_type=COMP_CODE_NONE; - int32 *dimsizes=NULL, *start=NULL; - size_t filesize=0; - int i=0, j=0; - FILE *fp=NULL; - comp_info c_info; - - strncpy(name, tmpnam(NULL), 256); - //name = "testfile.hdf"; - - if ((handle = SDstart(name, DFACC_CREATE)) == FAIL) - { - RMInit::logOut << "r_Conv_HDF::convertTo(): unable to open output file." << endl; - throw r_Error(r_Error::r_Error_General); - } - rank = desc.srcInterv.dimension(); - - dimsizes = new int32[rank]; start = new int32[rank]; - datatype = getHDFtype(desc.baseType, datasize); - - for (i=0; i<rank; i++) - { - dimsizes[i] = desc.srcInterv[i].high() - desc.srcInterv[i].low() + 1; - start[i] = 0; - } - - if ((sds_id = SDcreate(handle, "RasDaMan object", datatype, rank, dimsizes)) == FAIL) - { - RMInit::logOut << "r_Conv_HDF::convertTo(): unable to create object." << endl; - SDend(handle); remove(name); - throw r_Error(r_Error::r_Error_General); - } - SDsetfillmode(sds_id, SD_NOFILL); - - params->process(options); - - comp_type = COMP_CODE_DEFLATE; - if (compType != NULL) - { - for (i=0; compNames[i].key != NULL; i++) - { - if (strcasecmp(compNames[i].key, compType) == 0) - { - comp_type = (comp_coder_t)compNames[i].id; - break; - } - } - if (compNames[i].key == NULL) - { - RMInit::logOut << "r_Conv_HDF::convertTo(): unsupported compression type " << compType << endl; - } - } - c_info.skphuff.skp_size = skiphuff; - c_info.deflate.level = quality; - - SDsetcompress(sds_id, comp_type, &c_info); - - SDwritedata(sds_id, start, NULL, dimsizes, (VOIDP)(desc.src)); - - delete [] dimsizes; dimsizes=NULL; - delete [] start; start=NULL; - - SDendaccess(sds_id); - - SDend(handle); - - if ((fp = fopen(name, "rb")) == NULL) - { - RMInit::logOut << "r_Conv_HDF::convertTo(): unable to read back file." << endl; - throw r_Error(r_Error::r_Error_General); - } - fseek(fp, 0, SEEK_END); - filesize = ftell(fp); - - desc.destInterv = r_Minterval(1); - desc.destInterv << r_Sinterval((r_Range)0, (r_Range)filesize - 1); - - if ((desc.dest = (char*)mystore.storage_alloc(filesize)) == NULL) - { - RMInit::logOut << "r_Conv_HDF::convertTo(): out of memory error" << endl; - fclose(fp); - throw r_Error(MEMMORYALLOCATIONERROR); - } - fseek(fp, 0, SEEK_SET); - fread(desc.dest, 1, filesize, fp); - - fclose(fp); - - remove(name); - - // Result is just a bytestream - desc.destType = r_Type::get_any_type("char"); - - return desc; + char name[256]; + int32 handle=0, sds_id=0, rank=0; + comp_coder_t comp_type=COMP_CODE_NONE; + int32 *dimsizes=NULL, *start=NULL; + size_t filesize=0; + int i=0, j=0; + FILE *fp=NULL; + comp_info c_info; + + strncpy(name, tmpnam(NULL), 256); + //name = "testfile.hdf"; + + if ((handle = SDstart(name, DFACC_CREATE)) == FAIL) + { + RMInit::logOut << "r_Conv_HDF::convertTo(): unable to open output file." << endl; + throw r_Error(r_Error::r_Error_General); + } + rank = desc.srcInterv.dimension(); + + dimsizes = new int32[rank]; start = new int32[rank]; + datatype = getHDFtype(desc.baseType, datasize); + + for (i=0; i<rank; i++) + { + dimsizes[i] = desc.srcInterv[i].high() - desc.srcInterv[i].low() + 1; + start[i] = 0; + } + + if ((sds_id = SDcreate(handle, "RasDaMan object", datatype, rank, dimsizes)) == FAIL) + { + RMInit::logOut << "r_Conv_HDF::convertTo(): unable to create object." << endl; + SDend(handle); remove(name); + throw r_Error(r_Error::r_Error_General); + } + SDsetfillmode(sds_id, SD_NOFILL); + + params->process(options); + + comp_type = COMP_CODE_DEFLATE; + if (compType != NULL) + { + for (i=0; compNames[i].key != NULL; i++) + { + if (strcasecmp(compNames[i].key, compType) == 0) + { + comp_type = (comp_coder_t)compNames[i].id; + break; + } + } + if (compNames[i].key == NULL) + { + RMInit::logOut << "r_Conv_HDF::convertTo(): unsupported compression type " << compType << endl; + } + } + c_info.skphuff.skp_size = skiphuff; + c_info.deflate.level = quality; + + SDsetcompress(sds_id, comp_type, &c_info); + + SDwritedata(sds_id, start, NULL, dimsizes, (VOIDP)(desc.src)); + + delete [] dimsizes; dimsizes=NULL; + delete [] start; start=NULL; + + SDendaccess(sds_id); + + SDend(handle); + + if ((fp = fopen(name, "rb")) == NULL) + { + RMInit::logOut << "r_Conv_HDF::convertTo(): unable to read back file." << endl; + throw r_Error(r_Error::r_Error_General); + } + fseek(fp, 0, SEEK_END); + filesize = ftell(fp); + + desc.destInterv = r_Minterval(1); + desc.destInterv << r_Sinterval((r_Range)0, (r_Range)filesize - 1); + + if ((desc.dest = (char*)mystore.storage_alloc(filesize)) == NULL) + { + RMInit::logOut << "r_Conv_HDF::convertTo(): out of memory error" << endl; + fclose(fp); + throw r_Error(MEMMORYALLOCATIONERROR); + } + fseek(fp, 0, SEEK_SET); + fread(desc.dest, 1, filesize, fp); + + fclose(fp); + + remove(name); + + // Result is just a bytestream + desc.destType = r_Type::get_any_type("char"); + + return desc; } r_convDesc &r_Conv_HDF::convertFrom(const char *options) throw(r_Error) { - char name[256]; - int32 handle=0, sds_id=0, rank=0, dtype=0, numattr=0, array_size=0; - int32 dimsizes[H4_MAX_VAR_DIMS]; - int32 *start=NULL; - int dsize=0; - size_t filesize=0; - FILE *fp=NULL; - int i=0; - - if (desc.srcInterv.dimension() != 1) - { - RMInit::logOut << "r_Conv_HDF::convertFrom(): source data must be a bytestream!" << endl; - throw r_Error(r_Error::r_Error_General); - } - - strncpy(name, tmpnam(NULL), 256); - if ((fp = fopen(name, "wb")) == NULL) - { - RMInit::logOut << "r_Conv_HDF::convertFrom(): unable to write temporary file!" << endl; - throw r_Error(r_Error::r_Error_General); - } - filesize = desc.srcInterv[0].high() - desc.srcInterv[0].low() + 1; - if ((i = fwrite(desc.src, 1, filesize, fp)) != filesize) - { - RMInit::logOut << "r_Conv_HDF::convertFrom(): error writing to temporary file (" - << i << " / " << filesize << ')' << endl; - throw r_Error(r_Error::r_Error_General); - } - fclose(fp); - - if ((handle = SDstart(name, DFACC_READ)) == FAIL) - { - RMInit::logOut << "r_Conv_HDF::convertFrom(): can't read temporary file!" << endl; - throw r_Error(r_Error::r_Error_General); - } - // Only read the first object in the file - if ((sds_id = SDselect(handle, 0)) == FAIL) - { - RMInit::logOut << "r_Conv_HDF::convertFrom(): unable to open first object" << endl; - SDend(handle); remove(name); - throw r_Error(r_Error::r_Error_General); - } - - SDgetinfo(sds_id, NULL, &rank, dimsizes, &dtype, &numattr); - - // Ignore native datatype flag - dtype &= ~DFNT_NATIVE; - - desc.destType = get_external_type(getIntType(dtype, dsize)); - - start = new int32[rank]; - desc.destInterv = r_Minterval(rank); - array_size = (int32)dsize; - for (i=0; i<rank; i++) - { - desc.destInterv << r_Sinterval(r_Range(0), r_Range(dimsizes[i]-1)); - array_size *= dimsizes[i]; - start[i] = 0; - } - - if ((desc.dest = (char*)mystore.storage_alloc(array_size)) == NULL) - { - RMInit::logOut << "r_Conv_HDF::convertFrom(): out of memory error!" << endl; - SDend(handle); remove(name); - throw r_Error(MEMMORYALLOCATIONERROR); - } - - if (SDreaddata(sds_id, start, NULL, dimsizes, (VOIDP)desc.dest) == FAIL) - { - RMInit::logOut << "r_Conv_HDF::convertFrom(): error reading data" << endl; - SDend(handle); remove(name); - throw r_Error(r_Error::r_Error_General); - } - - delete [] start; start=NULL; - - SDendaccess(sds_id); - - SDend(handle); - - remove(name); - - return desc; + char name[256]; + int32 handle=0, sds_id=0, rank=0, dtype=0, numattr=0, array_size=0; + int32 dimsizes[H4_MAX_VAR_DIMS]; + int32 *start=NULL; + int dsize=0; + size_t filesize=0; + FILE *fp=NULL; + int i=0; + + if (desc.srcInterv.dimension() != 1) + { + RMInit::logOut << "r_Conv_HDF::convertFrom(): source data must be a bytestream!" << endl; + throw r_Error(r_Error::r_Error_General); + } + + strncpy(name, tmpnam(NULL), 256); + if ((fp = fopen(name, "wb")) == NULL) + { + RMInit::logOut << "r_Conv_HDF::convertFrom(): unable to write temporary file!" << endl; + throw r_Error(r_Error::r_Error_General); + } + filesize = desc.srcInterv[0].high() - desc.srcInterv[0].low() + 1; + if ((i = fwrite(desc.src, 1, filesize, fp)) != filesize) + { + RMInit::logOut << "r_Conv_HDF::convertFrom(): error writing to temporary file (" + << i << " / " << filesize << ')' << endl; + throw r_Error(r_Error::r_Error_General); + } + fclose(fp); + + if ((handle = SDstart(name, DFACC_READ)) == FAIL) + { + RMInit::logOut << "r_Conv_HDF::convertFrom(): can't read temporary file!" << endl; + throw r_Error(r_Error::r_Error_General); + } + // Only read the first object in the file + if ((sds_id = SDselect(handle, 0)) == FAIL) + { + RMInit::logOut << "r_Conv_HDF::convertFrom(): unable to open first object" << endl; + SDend(handle); remove(name); + throw r_Error(r_Error::r_Error_General); + } + + SDgetinfo(sds_id, NULL, &rank, dimsizes, &dtype, &numattr); + + // Ignore native datatype flag + dtype &= ~DFNT_NATIVE; + + desc.destType = get_external_type(getIntType(dtype, dsize)); + + start = new int32[rank]; + desc.destInterv = r_Minterval(rank); + array_size = (int32)dsize; + for (i=0; i<rank; i++) + { + desc.destInterv << r_Sinterval(r_Range(0), r_Range(dimsizes[i]-1)); + array_size *= dimsizes[i]; + start[i] = 0; + } + + if ((desc.dest = (char*)mystore.storage_alloc(array_size)) == NULL) + { + RMInit::logOut << "r_Conv_HDF::convertFrom(): out of memory error!" << endl; + SDend(handle); remove(name); + throw r_Error(MEMMORYALLOCATIONERROR); + } + + if (SDreaddata(sds_id, start, NULL, dimsizes, (VOIDP)desc.dest) == FAIL) + { + RMInit::logOut << "r_Conv_HDF::convertFrom(): error reading data" << endl; + SDend(handle); remove(name); + throw r_Error(r_Error::r_Error_General); + } + + delete [] start; start=NULL; + + SDendaccess(sds_id); + + SDend(handle); + + remove(name); + + return desc; } const char *r_Conv_HDF::get_name( void ) const { - return format_name_hdf; + return format_name_hdf; } r_Data_Format r_Conv_HDF::get_data_format( void ) const { - return r_HDF; + return r_HDF; } r_Convertor *r_Conv_HDF::clone( void ) const { - return new r_Conv_HDF(desc.src, desc.srcInterv, desc.baseType); + return new r_Conv_HDF(desc.src, desc.srcInterv, desc.baseType); } +#endif |