00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <fvutils/fileformat/fvfile_block.h>
00025
00026 #include <cstdlib>
00027 #include <cstring>
00028
00029
00030 namespace firevision {
00031 #if 0
00032 }
00033 #endif
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059 FireVisionDataFileBlock::FireVisionDataFileBlock(unsigned int type, size_t data_size,
00060 void *spec_header, size_t spec_header_size)
00061 {
00062 constructor(type, data_size, spec_header, spec_header_size);
00063 }
00064
00065
00066
00067
00068
00069
00070
00071 FireVisionDataFileBlock::FireVisionDataFileBlock(unsigned int type, size_t data_size,
00072 size_t spec_header_size)
00073 {
00074 constructor(type, data_size, NULL, spec_header_size);
00075 }
00076
00077
00078
00079
00080
00081
00082
00083 FireVisionDataFileBlock::FireVisionDataFileBlock(unsigned int type, size_t data_size)
00084 {
00085 constructor(type, data_size, NULL, 0);
00086 }
00087
00088
00089
00090
00091
00092
00093
00094
00095 FireVisionDataFileBlock::FireVisionDataFileBlock(FireVisionDataFileBlock *block)
00096 {
00097 _data_size = block->_data_size;
00098 __spec_header_size = block->__spec_header_size;
00099 __block_size = block->__block_size;
00100 __block_memptr = block->__block_memptr;
00101 __block_header = (fvff_block_header_t *)__block_memptr;
00102 _spec_header = (char *)__block_memptr + sizeof(fvff_block_header_t);
00103 _data = (char *)__block_memptr + sizeof(fvff_block_header_t) + __spec_header_size;
00104 __block_owner = false;
00105 }
00106
00107
00108
00109
00110
00111
00112
00113
00114 void
00115 FireVisionDataFileBlock::constructor(unsigned int type, size_t data_size,
00116 void *spec_header, size_t spec_header_size)
00117 {
00118 _data_size = data_size;
00119 __spec_header_size = spec_header_size;
00120 __block_size = _data_size + sizeof(fvff_block_header_t) + spec_header_size;
00121
00122 __block_memptr = calloc(1, __block_size);
00123 __block_owner = true;
00124 __block_header = (fvff_block_header_t *)__block_memptr;
00125 _spec_header = (char *)__block_memptr + sizeof(fvff_block_header_t);
00126 _data = (char *)__block_memptr + sizeof(fvff_block_header_t) + spec_header_size;
00127
00128 if ( (spec_header != NULL) && (spec_header_size > 0) ) {
00129 memcpy((char *)__block_memptr + sizeof(fvff_block_header_t), spec_header, spec_header_size);
00130 }
00131
00132 __block_header->type = type;
00133 __block_header->size = _data_size;
00134 __block_header->spec_head_size = spec_header_size;
00135 }
00136
00137
00138
00139
00140
00141
00142
00143
00144 void
00145 FireVisionDataFileBlock::set_spec_header(void *spec_header, size_t spec_header_size)
00146 {
00147 if( spec_header_size != __spec_header_size ) {
00148
00149 __spec_header_size = spec_header_size;
00150 __block_size = _data_size + sizeof(fvff_block_header_t) + spec_header_size;
00151
00152 void *newblock = calloc(1, __block_size);
00153
00154 memcpy(newblock, __block_memptr, sizeof(fvff_block_header_t));
00155 memcpy((char *)newblock + sizeof(fvff_block_header_t) + spec_header_size, _data, _data_size);
00156
00157 free(__block_memptr);
00158 __block_memptr = newblock;
00159 __block_header = (fvff_block_header_t *)__block_memptr;
00160 _spec_header = (char *)__block_memptr + sizeof(fvff_block_header_t);
00161 _data = (char *)__block_memptr + sizeof(fvff_block_header_t) + spec_header_size;
00162
00163 __block_header->spec_head_size = spec_header_size;
00164 }
00165
00166 if ( (spec_header != NULL) && (spec_header_size > 0) ) {
00167 memcpy((char *)__block_memptr + sizeof(fvff_block_header_t), spec_header, spec_header_size);
00168 }
00169 }
00170
00171
00172
00173 FireVisionDataFileBlock::~FireVisionDataFileBlock()
00174 {
00175 if ( __block_owner) {
00176 free(__block_memptr);
00177 }
00178 }
00179
00180
00181
00182
00183
00184 unsigned int
00185 FireVisionDataFileBlock::type() const
00186 {
00187 return __block_header->type;
00188 }
00189
00190
00191
00192
00193
00194 void *
00195 FireVisionDataFileBlock::block_memptr() const
00196 {
00197 return __block_memptr;
00198 }
00199
00200
00201
00202
00203
00204 size_t
00205 FireVisionDataFileBlock::block_size() const
00206 {
00207 return __block_size;
00208 }
00209
00210
00211
00212
00213
00214 void *
00215 FireVisionDataFileBlock::data_ptr() const
00216 {
00217 return _data;
00218 }
00219
00220
00221
00222
00223
00224 size_t
00225 FireVisionDataFileBlock::data_size() const
00226 {
00227 return _data_size;
00228 }
00229
00230 }