Moenchstuff (#358)

* using standard header in moench03T1Receiver
* restructure slsDetectorData added override to moench03T1ReceiverDataNew
* removed unused function
This commit is contained in:
Erik Fröjdh 2022-01-31 11:55:12 +01:00 committed by GitHub
parent 92c767859f
commit 328279d315
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 299 additions and 433 deletions

View File

@ -2,49 +2,9 @@
// Copyright (C) 2021 Contributors to the SLS Detector Package // Copyright (C) 2021 Contributors to the SLS Detector Package
#ifndef MOENCH03T1RECDATANEW_H #ifndef MOENCH03T1RECDATANEW_H
#define MOENCH03T1RECDATANEW_H #define MOENCH03T1RECDATANEW_H
#include "sls/sls_detector_defs.h"
#include "slsDetectorData.h" #include "slsDetectorData.h"
//#define VERSION_V2
/**
@short structure for a Detector Packet or Image Header
@li frameNumber is the frame number
@li expLength is the subframe number (32 bit eiger) or real time exposure
time in 100ns (others)
@li packetNumber is the packet number
@li bunchId is the bunch id from beamline
@li timestamp is the time stamp with 10 MHz clock
@li modId is the unique module id (unique even for left, right, top, bottom)
@li xCoord is the x coordinate in the complete detector system
@li yCoord is the y coordinate in the complete detector system
@li zCoord is the z coordinate in the complete detector system
@li debug is for debugging purposes
@li roundRNumber is the round robin set number
@li detType is the detector type see :: detectorType
@li version is the version number of this structure format
*/
typedef struct {
uint64_t frameNumber; /**< is the frame number */
uint32_t expLength; /**< is the subframe number (32 bit eiger) or real time
exposure time in 100ns (others) */
uint32_t packetNumber; /**< is the packet number */
uint64_t bunchId; /**< is the bunch id from beamline */
uint64_t timestamp; /**< is the time stamp with 10 MHz clock */
uint16_t modId; /**< is the unique module id (unique even for left, right,
top, bottom) */
uint16_t xCoord; /**< is the x coordinate in the complete detector system */
uint16_t yCoord; /**< is the y coordinate in the complete detector system */
uint16_t zCoord; /**< is the z coordinate in the complete detector system */
uint32_t debug; /**< is for debugging purposes */
uint16_t roundRNumber; /**< is the round robin set number */
uint8_t detType; /**< is the detector type see :: detectorType */
uint8_t version; /**< is the version number of this structure format */
#ifndef VERSION_V1
uint64_t
packetCaught[8]; /**< is the version number of this structure format */
#endif
} sls_detector_header;
class moench03T1ReceiverDataNew : public slsDetectorData<uint16_t> { class moench03T1ReceiverDataNew : public slsDetectorData<uint16_t> {
private: private:
@ -56,6 +16,9 @@ class moench03T1ReceiverDataNew : public slsDetectorData<uint16_t> {
double ghost[200][25]; double ghost[200][25];
// Single point of definition if we need to customize
using header = sls::defs::sls_receiver_header;
public: public:
/** /**
Implements the slsReceiverData structure for the moench02 prototype read Implements the slsReceiverData structure for the moench02 prototype read
@ -64,8 +27,7 @@ class moench03T1ReceiverDataNew : public slsDetectorData<uint16_t> {
*/ */
moench03T1ReceiverDataNew(int ns = 5000) moench03T1ReceiverDataNew(int ns = 5000)
: slsDetectorData<uint16_t>(400, 400, : slsDetectorData<uint16_t>(400, 400, ns * 2 * 32 + sizeof(header)),
ns * 2 * 32 + sizeof(sls_detector_header)),
nSamples(ns) { nSamples(ns) {
int nadc = 32; int nadc = 32;
@ -100,7 +62,7 @@ class moench03T1ReceiverDataNew : public slsDetectorData<uint16_t> {
} else { } else {
row = 200 + i / sc_width; row = 200 + i / sc_width;
} }
dataMap[row][col] = sizeof(sls_detector_header) + dataMap[row][col] = sizeof(header) +
(nadc * i + iadc) * 2; //+16*(ip+1); (nadc * i + iadc) * 2; //+16*(ip+1);
#ifdef HIGHZ #ifdef HIGHZ
dataMask[row][col] = 0x3fff; // invert data dataMask[row][col] = 0x3fff; // invert data
@ -122,11 +84,11 @@ class moench03T1ReceiverDataNew : public slsDetectorData<uint16_t> {
int ipacket; int ipacket;
uint ibyte; uint ibyte;
int ii = 0; int ii = 0;
for (ibyte = 0; ibyte < sizeof(sls_detector_header) / 2; ibyte++) { for (ibyte = 0; ibyte < sizeof(header) / 2; ibyte++) {
xmap[ibyte] = -1; xmap[ibyte] = -1;
ymap[ibyte] = -1; ymap[ibyte] = -1;
} }
int off = sizeof(sls_detector_header) / 2; int off = sizeof(header) / 2;
for (ipacket = 0; ipacket < npackets; ipacket++) { for (ipacket = 0; ipacket < npackets; ipacket++) {
for (ibyte = 0; ibyte < 8192 / 2; ibyte++) { for (ibyte = 0; ibyte < 8192 / 2; ibyte++) {
i = ipacket * 8208 / 2 + ibyte; i = ipacket * 8208 / 2 + ibyte;
@ -161,20 +123,7 @@ class moench03T1ReceiverDataNew : public slsDetectorData<uint16_t> {
required as double required as double
*/ */
virtual double getValue(char *data, int ix, int iy = 0) { double getValue(char *data, int ix, int iy = 0) override {
/* cout << " x "<< ix << " y"<< iy << " val " << getChannel(data, ix,
* iy)<< endl;*/
/* double val=0, vout=getChannel(data, ix, iy); */
/* int x1=ix%25; */
/* for (int ix=0; ix<16; ix++) { */
/* for (int ii=0; ii<2; ii++) { */
/* val+=getChannel(data,x1+25*ix,iy); */
/* val+=getChannel(data,x1+25*ix,399-iy); */
/* } */
/* } */
/* vout+=0.0008*val-6224; */
/* return vout; //(double)getChannel(data, ix, iy);
*/
uint16_t val = getChannel(data, ix, iy) & 0x3fff; uint16_t val = getChannel(data, ix, iy) & 0x3fff;
return val; return val;
}; };
@ -225,17 +174,9 @@ class moench03T1ReceiverDataNew : public slsDetectorData<uint16_t> {
*/ */
/* class jfrau_packet_header_t { */
/* public: */
/* unsigned char reserved[4]; */
/* unsigned char packetNumber[1]; */
/* unsigned char frameNumber[3]; */
/* unsigned char bunchid[8]; */
/* }; */
int getFrameNumber(char *buff) { int getFrameNumber(char *buff) {
return ((sls_detector_header *)buff)->frameNumber; return ((header *)buff)->detHeader.frameNumber;
}; //*((int*)(buff+5))&0xffffff;}; }
/** /**
@ -247,67 +188,21 @@ class moench03T1ReceiverDataNew : public slsDetectorData<uint16_t> {
*/ */
int getPacketNumber(char *buff) { int getPacketNumber(char *buff) {
return ((sls_detector_header *)buff)->packetNumber; return ((header *)buff)->detHeader.packetNumber;
} //((*(((int*)(buff+4))))&0xff)+1;}; }
/* /\** */ char *readNextFrame(std::ifstream &filebin) override {
/* Loops over a memory slot until a complete frame is found (i.e. all
* packets 0 to nPackets, same frame number). purely virtual func */
/* \param data pointer to the memory to be analyzed */
/* \param ndata reference to the amount of data found for the frame, in
* case the frame is incomplete at the end of the memory slot */
/* \param dsize size of the memory slot to be analyzed */
/* \returns pointer to the beginning of the last good frame (might be
* incomplete if ndata smaller than dataSize), or NULL if no frame is found
*/
/* *\/ */
/* virtual char *findNextFrame(char *data, int &ndata, int
* dsize){ndata=dsize; setDataSize(dsize); return data;}; */
/* /\** */
/* Loops over a file stream until a complete frame is found (i.e. all
* packets 0 to nPackets, same frame number). Can be overloaded for
* different kind of detectors! */
/* \param filebin input file stream (binary) */
/* \returns pointer to the begin of the last good frame, NULL if no
* frame is found or last frame is incomplete */
/* *\/ */
/* virtual char *readNextFrame(ifstream &filebin){ */
/* // int afifo_length=0; */
/* uint16_t *afifo_cont; */
/* int ib=0; */
/* if (filebin.is_open()) { */
/* afifo_cont=new uint16_t[dataSize/2]; */
/* while (filebin.read(((char*)afifo_cont)+ib,2)) { */
/* ib+=2; */
/* if (ib==dataSize) break; */
/* } */
/* if (ib>0) { */
/* iframe++; */
/* // cout << ib << "-" << endl; */
/* return (char*)afifo_cont; */
/* } else { */
/* delete [] afifo_cont; */
/* return NULL; */
/* } */
/* } */
/* return NULL; */
/* }; */
virtual char *readNextFrame(std::ifstream &filebin) {
int ff = -1, np = -1; int ff = -1, np = -1;
return readNextFrame(filebin, ff, np); return readNextFrame(filebin, ff, np);
}; }
// not present in base class
virtual char *readNextFrame(std::ifstream &filebin, int &ff) { virtual char *readNextFrame(std::ifstream &filebin, int &ff) {
int np = -1; int np = -1;
return readNextFrame(filebin, ff, np); return readNextFrame(filebin, ff, np);
}; };
// not present in base class
virtual char *readNextFrame(std::ifstream &filebin, int &ff, int &np) { virtual char *readNextFrame(std::ifstream &filebin, int &ff, int &np) {
char *data = new char[dataSize]; char *data = new char[dataSize];
char *d = readNextFrame(filebin, ff, np, data); char *d = readNextFrame(filebin, ff, np, data);
@ -318,14 +213,10 @@ class moench03T1ReceiverDataNew : public slsDetectorData<uint16_t> {
return data; return data;
} }
// not present in base class
virtual char *readNextFrame(std::ifstream &filebin, int &ff, int &np, virtual char *readNextFrame(std::ifstream &filebin, int &ff, int &np,
char *data) { char *data) {
np = 0; np = 0;
// cout << dataSize << endl;
if (filebin.is_open()) { if (filebin.is_open()) {
if (filebin.read(data, dataSize)) { if (filebin.read(data, dataSize)) {
ff = getFrameNumber(data); ff = getFrameNumber(data);
@ -333,8 +224,8 @@ class moench03T1ReceiverDataNew : public slsDetectorData<uint16_t> {
return data; return data;
} }
} }
return NULL; return nullptr;
}; }
/** /**
@ -348,7 +239,7 @@ class moench03T1ReceiverDataNew : public slsDetectorData<uint16_t> {
found found
*/ */
virtual char *findNextFrame(char *data, int &ndata, int dsize) { char *findNextFrame(char *data, int &ndata, int dsize) override {
if (dsize < dataSize) if (dsize < dataSize)
ndata = dsize; ndata = dsize;
else else

View File

@ -26,8 +26,6 @@ template <class dataType> class slsDetectorData {
public: public:
/** /**
General slsDetectors data structure. Works for data acquired using the General slsDetectors data structure. Works for data acquired using the
slsDetectorReceiver. Can be generalized to other detectors (many virtual slsDetectorReceiver. Can be generalized to other detectors (many virtual
funcs). funcs).
@ -42,10 +40,115 @@ template <class dataType> class slsDetectorData {
is inversion is required) \param dROI Array of size nx*ny. The elements are is inversion is required) \param dROI Array of size nx*ny. The elements are
1s if the channel is good or in the ROI, 0 is bad or out of the ROI. NULL 1s if the channel is good or in the ROI, 0 is bad or out of the ROI. NULL
(default) means all 1s. (default) means all 1s.
*/ */
slsDetectorData(int npx, int npy, int dsize, int **dMap = NULL, slsDetectorData(int npx, int npy, int dsize, int **dMap = NULL,
dataType **dMask = NULL, int **dROI = NULL) dataType **dMask = NULL, int **dROI = NULL);
virtual ~slsDetectorData();
// Virtual functions
virtual int getPointer(int ix, int iy) { return dataMap[iy][ix]; };
virtual void getPixel(int ip, int &x, int &y);
virtual dataType **getData(char *ptr, int dsize = -1);
virtual double **getImage(char *ptr, int dsize = -1);
virtual dataType getChannel(char *data, int ix, int iy = 0);
virtual int getGain(char *data, int ix, int iy = 0) { return 0; };
virtual double getValue(char *data, int ix, int iy = 0) {
return (double)getChannel(data, ix, iy);
};
virtual int getFrameNumber(char *buff) = 0;
/**
Loops over a memory slot until a complete frame is found (i.e. all
packets 0 to nPackets, same frame number). purely virtual func \param
data pointer to the memory to be analyzed \param ndata reference to the
amount of data found for the frame, in case the frame is incomplete at
the end of the memory slot \param dsize size of the memory slot to be
analyzed \returns pointer to the beginning of the last good frame (might
be incomplete if ndata smaller than dataSize), or NULL if no frame is
found
*/
virtual char *findNextFrame(char *data, int &ndata, int dsize) = 0;
//Returns a pointer to the next complete frame, if none found nullptr
//data needs to be deallocated by caller
virtual char *readNextFrame(std::ifstream &filebin) = 0;
//END Virtual functions
/**
defines the data map (as offset) - no error checking if datasize and
offsets are compatible! \param dMap array of size nx*ny storing the
pointers to the data in the dataset (as offset). If NULL (default),the
data are arranged as if read out row by row
(dataMap[iy][ix]=(iy*nx+ix)*sizeof(dataType);)
*/
void setDataMap(int **dMap = NULL);
/**
defines the data mask i.e. the polarity of the data
\param dMask Array of size nx*ny storing the polarity of the data in the
dataset (should be 0 if no inversion is required, 0xffffffff is inversion
is required)
*/
void setDataMask(dataType **dMask = NULL);
/**
defines the region of interest and/or the bad channels mask
\param dROI Array of size nx*ny. The ements are 1s if the channel is
good or in the ROI, 0 is bad or out of the ROI. NULL (default) means all
1s.
*/
void setDataROIMask(int **dROI = NULL);
/**
Define bad channel or roi mask for a single channel
\param ix channel x coordinate
\param iy channel y coordinate (1 for strips)
\param i 1 if pixel is good (or in the roi), 0 if bad
\returns 1 if pixel is good, 0 if it's bad, -1 if pixel is out of range
*/
int setGood(int ix, int iy, int i = 1);
// returns 1 if pixel is good, 0 if it's bad, -1 if pixel is out of range
int isGood(int ix, int iy);
// returns total number of channels, outparam npx and npy x,y dimensions
int getDetectorSize(int &npx, int &npy);
/** Returns the size of the data frame */
int getDataSize() { return dataSize; };
/** changes the size of the data frame */
int setDataSize(int d) {
dataSize = d;
return dataSize;
};
void newFrame() { isOrdered = 0; };
/**
Returns the value of the selected channel for the given dataset. Virtual
function, can be overloaded. \param data pointer to the dataset
(including headers etc) \param ix pixel number in the x direction \param
iy pixel number in the y direction \returns data for the selected
channel, with inversion if required
*/
};
template <typename dataType>
slsDetectorData<dataType>::slsDetectorData(int npx, int npy, int dsize,
int **dMap, dataType **dMask,
int **dROI)
: nx(npx), ny(npy), dataSize(dsize), orderedData(NULL), isOrdered(0) { : nx(npx), ny(npy), dataSize(dsize), orderedData(NULL), isOrdered(0) {
int el = dsize / sizeof(dataType); int el = dsize / sizeof(dataType);
@ -75,7 +178,7 @@ template <class dataType> class slsDetectorData {
setDataROIMask(dROI); setDataROIMask(dROI);
} }
virtual ~slsDetectorData() { template <typename dataType> slsDetectorData<dataType>::~slsDetectorData() {
for (int i = 0; i < ny; i++) { for (int i = 0; i < ny; i++) {
delete[] dataMap[i]; delete[] dataMap[i];
delete[] dataMask[i]; delete[] dataMask[i];
@ -88,17 +191,10 @@ template <class dataType> class slsDetectorData {
delete[] orderedData; delete[] orderedData;
delete[] xmap; delete[] xmap;
delete[] ymap; delete[] ymap;
}; }
virtual int getPointer(int ix, int iy) { return dataMap[iy][ix]; }; template <typename dataType>
/** void slsDetectorData<dataType>::setDataMap(int **dMap) {
defines the data map (as offset) - no error checking if datasize and
offsets are compatible! \param dMap array of size nx*ny storing the
pointers to the data in the dataset (as offset). If NULL (default),the
data are arranged as if read out row by row
(dataMap[iy][ix]=(iy*nx+ix)*sizeof(dataType);)
*/
void setDataMap(int **dMap = NULL) {
int ip = 0; int ip = 0;
int ix, iy; int ix, iy;
@ -130,16 +226,10 @@ template <class dataType> class slsDetectorData {
} }
// cout << "nx:" <<nx << " ny:" << ny << endl; // cout << "nx:" <<nx << " ny:" << ny << endl;
}; }
/** template <typename dataType>
defines the data mask i.e. the polarity of the data void slsDetectorData<dataType>::setDataMask(dataType **dMask) {
\param dMask Array of size nx*ny storing the polarity of the data in the
dataset (should be 0 if no inversion is required, 0xffffffff is inversion
is required)
*/
void setDataMask(dataType **dMask = NULL) {
if (dMask != NULL) { if (dMask != NULL) {
@ -151,16 +241,10 @@ template <class dataType> class slsDetectorData {
for (int ix = 0; ix < nx; ix++) for (int ix = 0; ix < nx; ix++)
dataMask[iy][ix] = 0; dataMask[iy][ix] = 0;
} }
}; }
/**
defines the region of interest and/or the bad channels mask
\param dROI Array of size nx*ny. The lements are 1s if the channel is
good or in the ROI, 0 is bad or out of the ROI. NULL (default) means all
1s.
*/
void setDataROIMask(int **dROI = NULL) {
template <typename dataType>
void slsDetectorData<dataType>::setDataROIMask(int **dROI) {
if (dROI != NULL) { if (dROI != NULL) {
for (int iy = 0; iy < ny; iy++) for (int iy = 0; iy < ny; iy++)
@ -172,60 +256,38 @@ template <class dataType> class slsDetectorData {
for (int ix = 0; ix < nx; ix++) for (int ix = 0; ix < nx; ix++)
dataROIMask[iy][ix] = 1; dataROIMask[iy][ix] = 1;
} }
}; }
/** template <typename dataType>
Define bad channel or roi mask for a single channel int slsDetectorData<dataType>::setGood(int ix, int iy, int i) {
\param ix channel x coordinate
\param iy channel y coordinate (1 for strips)
\param i 1 if pixel is good (or in the roi), 0 if bad
\returns 1 if pixel is good, 0 if it's bad, -1 if pixel is out of range
*/
int setGood(int ix, int iy, int i = 1) {
if (ix >= 0 && ix < nx && iy >= 0 && iy < ny) if (ix >= 0 && ix < nx && iy >= 0 && iy < ny)
dataROIMask[iy][ix] = i; dataROIMask[iy][ix] = i;
return isGood(ix, iy); return isGood(ix, iy);
}; }
/**
Define bad channel or roi mask for a single channel template <typename dataType>
\param ix channel x coordinate int slsDetectorData<dataType>::isGood(int ix, int iy) {
\param iy channel y coordinate (1 for strips)
\returns 1 if pixel is good, 0 if it's bad, -1 if pixel is out of range
*/
int isGood(int ix, int iy) {
if (ix >= 0 && ix < nx && iy >= 0 && iy < ny) if (ix >= 0 && ix < nx && iy >= 0 && iy < ny)
return dataROIMask[iy][ix]; return dataROIMask[iy][ix];
else else
return -1; return -1;
}; };
/** template <typename dataType>
Returns detector size in x,y int slsDetectorData<dataType>::getDetectorSize(int &npx, int &npy) {
\param npx reference to number of channels in x
\param npy reference to number of channels in y (will be 1 for strips)
\returns total number of channels
*/
int getDetectorSize(int &npx, int &npy) {
npx = nx; npx = nx;
npy = ny; npy = ny;
return nx * ny; return nx * ny;
}; }
/** Returns the size of the data frame */ template <typename dataType>
int getDataSize() { return dataSize; }; void slsDetectorData<dataType>::getPixel(int ip, int &x, int &y) {
/** changes the size of the data frame */
int setDataSize(int d) {
dataSize = d;
return dataSize;
};
virtual void getPixel(int ip, int &x, int &y) {
x = xmap[ip]; x = xmap[ip];
y = ymap[ip]; y = ymap[ip];
}; }
virtual dataType **getData(char *ptr, int dsize = -1) { template <typename dataType>
dataType **slsDetectorData<dataType>::getData(char *ptr, int dsize) {
int el = dsize / sizeof(dataType); int el = dsize / sizeof(dataType);
// dataType **data; // dataType **data;
int ix, iy; int ix, iy;
@ -248,9 +310,8 @@ template <class dataType> class slsDetectorData {
return orderedData; return orderedData;
} }
void newFrame() { isOrdered = 0; }; template <typename dataType>
double **slsDetectorData<dataType>::getImage(char *ptr, int dsize) {
virtual double **getImage(char *ptr, int dsize = -1) {
double **data; double **data;
int ix, iy; int ix, iy;
@ -268,23 +329,12 @@ template <class dataType> class slsDetectorData {
} }
} }
return data; return data;
}; }
template <typename dataType>
/** dataType slsDetectorData<dataType>::getChannel(char *data, int ix, int iy) {
Returns the value of the selected channel for the given dataset. Virtual
function, can be overloaded. \param data pointer to the dataset
(including headers etc) \param ix pixel number in the x direction \param
iy pixel number in the y direction \returns data for the selected
channel, with inversion if required
*/
virtual dataType getChannel(char *data, int ix, int iy = 0) {
dataType m = 0, d = 0; dataType m = 0, d = 0;
if (ix >= 0 && ix < nx && iy >= 0 && iy < ny && dataMap[iy][ix] >= 0 && if (ix >= 0 && ix < nx && iy >= 0 && iy < ny && dataMap[iy][ix] >= 0 &&
dataMap[iy][ix] < dataSize) { dataMap[iy][ix] < dataSize) {
// cout << ix << " " << iy << " " ;
// cout << dataMap[ix][iy] << " " << (void*)data << " " <<
// dataSize<< endl;
m = dataMask[iy][ix]; m = dataMask[iy][ix];
if (isOrdered == 0) if (isOrdered == 0)
d = *((dataType *)(data + getPointer(ix, iy))); d = *((dataType *)(data + getPointer(ix, iy)));
@ -294,79 +344,4 @@ template <class dataType> class slsDetectorData {
return d ^ m; return d ^ m;
}; };
virtual int getGain(char *data, int ix, int iy = 0) { return 0; };
/**
Returns the value of the selected channel for the given dataset. Virtual
function, can be overloaded. \param data pointer to the dataset
(including headers etc) \param ix pixel number in the x direction \param
iy pixel number in the y direction \returns data for the selected
channel, with inversion if required or -1 if its a missing packet
*/
virtual int getChannelwithMissingPackets(char *data, int ix, int iy) {
return 0;
};
/**
Returns the value of the selected channel for the given dataset as
double. \param data pointer to the dataset (including headers etc) \param
ix pixel number in the x direction \param iy pixel number in the y
direction \returns data for the selected channel, with inversion if
required as double
*/
virtual double getValue(char *data, int ix, int iy = 0) {
/* cout << " x "<< ix << " y"<< iy << " val " << getChannel(data, ix,
* iy)<< endl;*/
return (double)getChannel(data, ix, iy);
};
/**
Returns the frame number for the given dataset. Purely virtual func.
\param buff pointer to the dataset
\returns frame number
*/
virtual int getFrameNumber(char *buff) = 0;
/**
Returns the packet number for the given dataset. purely virtual func
\param buff pointer to the dataset
\returns packet number number
virtual int getPacketNumber(char *buff)=0;
*/
/**
Loops over a memory slot until a complete frame is found (i.e. all
packets 0 to nPackets, same frame number). purely virtual func \param
data pointer to the memory to be analyzed \param ndata reference to the
amount of data found for the frame, in case the frame is incomplete at
the end of the memory slot \param dsize size of the memory slot to be
analyzed \returns pointer to the beginning of the last good frame (might
be incomplete if ndata smaller than dataSize), or NULL if no frame is
found
*/
virtual char *findNextFrame(char *data, int &ndata, int dsize) = 0;
/**
Loops over a file stream until a complete frame is found (i.e. all packets
0 to nPackets, same frame number). Can be overloaded for different kind of
detectors! \param filebin input file stream (binary) \returns pointer to
the begin of the last good frame, NULL if no frame is found or last frame
is incomplete
*/
virtual char *readNextFrame(std::ifstream &filebin) = 0;
};
#endif #endif