31 #include <sys/types.h>
47 mpName =
new char[ strlen(filename)+1 ];
48 strncpy( mpName, filename, strlen(filename)+1 );
59 if (mMode==
eInput) mode = O_RDONLY;
60 if (mMode==
eOutput) mode = O_WRONLY|O_CREAT|O_TRUNC;
70 mFile = open(mpName,mode,0644);
78 mSize = lseek(mFile,0,SEEK_END);
79 lseek(mFile,0,SEEK_SET);
104 typedef std::list<Frame*>::const_iterator iterator;
106 iterator it = storage.
Begin();
107 iterator end = storage.
End();
117 void File::Read(
TypeId& type)
122 void File::Write(
const TypeId& type)
127 void File::Read(FrameHeader& header)
133 void File::Write(
const FrameHeader& header)
136 TWrite(header.mSize);
139 void File::Read(DataFrameHeader& header)
141 Read((FrameHeader&)header);
143 TRead(header.mStreamId);
144 TRead(header.mnMatrices);
147 void File::Write(
const DataFrameHeader& header)
149 Write((FrameHeader&)header);
150 TWrite(header.mTime);
151 TWrite(header.mStreamId);
152 TWrite(header.mnMatrices);
159 mFirstAccess =
false;
173 for (
int i=0;i<tmp;i++)
194 std::cerr <<
"SDIFFile.Read(Frame). Received a matrix header with an unknown type: <" << header.
mDataType <<
">" << std::endl;
197 File::ReadMatrixData(*pMatrix);
201 if (readSize-frame.mHeader.
mSize==8)
223 if (t==
"1STF" || t==
"1FQ0" || t==
"1TRC")
230 "Reading Frame, calculated size does not match read size");
232 "Reading Frame, size-in-file does not match read size");
235 void File::Write(
const Frame& frame)
239 mFirstAccess =
false;
247 Write(frame.mHeader);
249 typedef std::list<Matrix*>::const_iterator iterator;
251 iterator it = frame.mMatrixList.begin();
252 iterator end = frame.mMatrixList.end();
257 File::Write(*pMatrix);
262 "Incorrect framesize written in SDIF file");
272 void File::Write(
const OpeningsFrame& frame)
274 Write(frame.mHeader);
275 TWrite(frame.mSpecVersion);
276 TWrite(frame.mStandardTypesVersion);
279 void File::Read(MatrixHeader& header)
285 TRead(header.mnRows);
286 TRead(header.mnColumns);
289 void File::Write(
const MatrixHeader& header)
294 TWrite(header.mnRows);
295 TWrite(header.mnColumns);
298 void File::Read(
Matrix& matrix)
300 Read(matrix.mHeader);
303 SkipMatrixData(matrix);
305 ReadMatrixData(matrix);
309 void File::Write(
const Matrix& matrix)
311 Write(matrix.mHeader);
312 WriteMatrixData(matrix);
315 void File::SkipMatrixData(
const Matrix& matrix)
317 CLAM::TUInt32 size = matrix.mHeader.mnColumns*matrix.mHeader.mnRows*
318 ((matrix.mHeader.mDataType)&0xFF);
324 #include <byteswap.h>
334 return bswap_16(val);
340 return (val>>8)|(val<<8);
347 return bswap_32(val);
356 tmp=ptr[0]; ptr[0]=ptr[3]; ptr[3]=tmp;
357 tmp=ptr[1]; ptr[1]=ptr[2]; ptr[2]=tmp;
365 return bswap_64(val);
374 tmp=ptr[0]; ptr[0]=ptr[7]; ptr[7]=tmp;
375 tmp=ptr[1]; ptr[1]=ptr[6]; ptr[6]=tmp;
376 tmp=ptr[2]; ptr[2]=ptr[5]; ptr[5]=tmp;
377 tmp=ptr[3]; ptr[3]=ptr[4]; ptr[4]=tmp;
382 void File::_FixByteOrder(
419 std::cerr <<
"SDIFFile._FixByteOrder; Received an unsupported element size. size <" << elemSize <<
">" << std::endl;
424 void File::ReadMatrixData(
Matrix& matrix)
427 CLAM::TUInt32 nElems = matrix.mHeader.mnColumns*matrix.mHeader.mnRows;
433 matrix.Resize(nElems);
434 matrix.SetSize(nElems);
437 FixByteOrder((
CLAM::TByte*) matrix.GetPtr(),nElems,elemSize);
442 void File::WriteMatrixData(
const Matrix& matrix)
445 CLAM::TUInt32 nElems = matrix.mHeader.mnColumns*matrix.mHeader.mnRows;
455 int blocksize = size;
456 if (blocksize>1024) blocksize = 1024;
457 memcpy(tmp,ptr,blocksize);
459 FixByteOrder(tmp,blocksize/elemSize,elemSize);