24 #include <core/exceptions/system.h>
25 #include <fvutils/fileformat/fvfile.h>
26 #include <netinet/in.h>
28 #include <utils/misc/strndup.h>
36 namespace firevision {
90 FireVisionDataFile::FireVisionDataFile(
unsigned short int magic_token,
unsigned short int version)
94 magic_token_ = magic_token;
96 comment_ = strdup(
"");
99 _spec_header_size = 0;
103 FireVisionDataFile::clear();
107 FireVisionDataFile::~FireVisionDataFile()
109 FireVisionDataFile::clear();
122 FireVisionDataFile::clear()
125 for (bi_ = blocks_.begin(); bi_ != blocks_.end(); ++bi_) {
133 header_->magic_token = htons(magic_token_);
134 header_->version = version_;
135 header_->num_blocks = 0;
136 #if BYTE_ORDER_ == BIG_ENDIAN_
137 header_->endianess = 1;
139 header_->endianess = 0;
142 comment_ = strdup(
"");
149 FireVisionDataFile::magic_token()
151 return header_->magic_token;
158 FireVisionDataFile::version()
160 return header_->version;
167 FireVisionDataFile::is_big_endian()
169 return (header_->endianess == 1);
176 FireVisionDataFile::is_little_endian()
178 return (header_->endianess == 0);
185 FireVisionDataFile::get_comment()
const
194 FireVisionDataFile::set_comment(
const char *comment)
197 comment_ = strndup(comment, FVFF_COMMENT_SIZE);
198 strncpy(header_->comment, comment, FVFF_COMMENT_SIZE - 1);
207 FireVisionDataFile::set_owns_blocks(
bool owns_blocks)
209 owns_blocks_ = owns_blocks;
216 FireVisionDataFile::num_blocks()
218 return blocks_.size();
227 blocks_.push_back(block);
234 FireVisionDataFile::blocks()
243 FireVisionDataFile::write(
const char *file_name)
245 FILE *f = fopen(file_name,
"w");
249 "Could not open rectlut file "
253 header_->num_blocks = (
unsigned int)blocks_.size();
255 gettimeofday(&t, NULL);
256 header_->created_sec = t.tv_sec;
257 header_->created_usec = t.tv_usec;
258 header_->spec_head_size = _spec_header_size;
266 if (_spec_header_size > 0) {
268 if (fwrite(_spec_header, _spec_header_size, 1, f) != 1) {
274 for (bi_ = blocks_.begin(); bi_ != blocks_.end(); ++bi_) {
277 if (fwrite((*bi_)->block_memptr(), (*bi_)->block_size(), 1, f) != 1) {
290 FireVisionDataFile::read(
const char *file_name)
292 FILE *f = fopen(file_name,
"r");
296 "Could not open rectlut file "
308 if (header_->magic_token != htons(magic_token_)) {
310 throw Exception(
"Unknown magic in fvff file (read: 0x%04x req: 0x%04x)",
311 header_->magic_token,
315 if (header_->version != version_) {
317 throw Exception(
"Unsupported version of fvff file (read: %u req: %u)",
322 if (header_->endianess ==
323 #
if BYTE_ORDER_ == BIG_ENDIAN_
330 throw Exception(
"FVFile header cannot be translated for endianess by now");
334 comment_ = strndup(header_->comment, FVFF_COMMENT_SIZE);
339 _spec_header = calloc(1, header_->spec_head_size);
344 if (header_->spec_head_size > 0) {
346 if (fread(_spec_header, header_->spec_head_size, 1, f) != 1) {
348 throw FileReadException(file_name, errno,
"Reading content specific header failed");
353 for (
unsigned int b = 0; b < header_->num_blocks && !feof(f); ++b) {
356 if (fread(&bh,
sizeof(bh), 1, f) != 1) {
360 "Could not read block info header while there should be one");
362 void *spec_header = NULL;
376 throw FileReadException(file_name, errno,
"Could not read content specific block header");
392 blocks_.push_back(block);
403 FireVisionDataFile::read_magic_token(
const char *filename)
405 uint16_t magic_token = 0;
408 f = fopen(filename,
"r");
410 if (fread((
char *)&magic_token,
sizeof(magic_token), 1, f) != 1) {
412 throw FileReadException(filename, errno,
"Could not read magic token from file");
416 throw FileReadException(filename, errno,
"Could not read magic token from file");
428 FireVisionDataFile::has_magic_token(
const char *filename,
unsigned short int magic_token)
430 uint16_t file_magic_token = read_magic_token(filename);
431 return (htons(magic_token) == file_magic_token);