예제 #1
0
파일: darx.cpp 프로젝트: g-i-o-/libdarx
	/**  Loads a darx data archive from a file into the structure.
	 * 
	 * @param[in] darx - reference to the darx structure to fill
	 * @param[in] file - pointer to the file containing the darx data
	 * 
	 * @returns an error code indicating success or reson of failure
	 * @note reads only uncompressed 8,16 and 32 bit-per-pixel bmp images.
	 */
	ErrorCode load_image_from(darx& darx, FILE* file){
		data_type_info dtinfo;
		char magic[DARX_MAGIC_LEN+1];
		fread(magic, sizeof(char), DARX_MAGIC_LEN, file);
		magic[DARX_MAGIC_LEN] = 0;
if(VERBOSE){ std::cout << "# read magic number : '" << magic << "' == " << DARX_MAGIC << std::endl; }
if(VERBOSE){ std::cout << "#     " << magic[0] << magic[1] << magic[2] << magic[3] << std::endl; }
		if(strncmp(magic, DARX_MAGIC, DARX_MAGIC_LEN)){
			return INVALID_STRUCT;
		}
		char magic2[4];
		fread(&magic2, sizeof(char), 4, file);
		bool storedAsBE = ( magic2[3] ==  ((uint8_t)( DARX_MAGIC_BE&0xff)));
		darx.isBigEndian = storedAsBE;
if(VERBOSE){ std::cout << "# file endianness ["<<magic2[3]<<" == " << ((uint8_t)(DARX_MAGIC_BE&0xff)) << "]: " << (storedAsBE ? "big" : "little") << std::endl; }
		int endianness_i = 0x00010203;
		bool systemIsBE = ( ((char*)&endianness_i)[0] ==  0x00);
if(VERBOSE){ std::cout << "# system endianness : " << (systemIsBE ? "big" : "little") << std::endl; }
		
		dtinfo.swapEndian = (systemIsBE == storedAsBE);
		if(dtinfo.swapEndian){
if(VERBOSE){ std::cout << "# need to swap endianness.." << std::endl; }
		}
		fread(&dtinfo.int_size, sizeof(uint8_t), 1, file);
		fread(&dtinfo.long_size, sizeof(uint8_t), 1, file);
		
if(VERBOSE){ std::cout << "# data sizes [int:" << ((int)dtinfo.int_size) << ", long:" << ((long)dtinfo.long_size) << "]" << std::endl; }
		fread(&darx.number_of_tensors, sizeof(uint16_t), 1, file);
if(VERBOSE){ std::cout << "# tensors : " << darx.number_of_tensors << std::endl; }
		long int *tensor_indices  = new long int[darx.number_of_tensors];
		assert(sizeof(long int) >= dtinfo.long_size);
if(VERBOSE){ std::cout << "#  tensor file locations : ["; }
		for(int i=0; i < darx.number_of_tensors; i++){
			fread(&(tensor_indices[i]), dtinfo.long_size, 1, file);
if(VERBOSE){ std::cout << tensor_indices[i] << "   "; }
		}
if(VERBOSE){ std::cout << "]" << std::endl; }
		fread(&darx.metadata_size, sizeof(uint16_t), 1, file);
		if(darx.metadata_size > 0){
if(VERBOSE){ std::cout << "# metadata size:" << darx.metadata_size << std::endl; }
			darx.metadata = new char[darx.metadata_size];
			fread(&darx.metadata, 1, darx.metadata_size, file);
		} else {
if(VERBOSE){ std::cout << "# no metadata (size:0)." << std::endl; }
			darx.metadata = 0;
		}
if(VERBOSE){ std::cout << "# readin tensors ("<< darx.number_of_tensors <<")." << std::endl; }
		darx.tensors = new datatensor[darx.number_of_tensors];
		for(int tensor_idx=0; tensor_idx < darx.number_of_tensors; tensor_idx++){
			fseek(file, tensor_indices[tensor_idx], SEEK_SET);
			read_tensor(darx.tensors[tensor_idx], darx, file, dtinfo);
		}
		
if(VERBOSE){ std::cout << "# darx file read successfully." << std::endl; }
		delete[] tensor_indices;
		return SUCCESS;
	}
예제 #2
0
void DataBuffer<DT>::read (const ParaFileData &pd)
{ if (pd.type == "tensor")
    read_tensor (pd);
}