source: Sophya/trunk/AddOn/TAcq/brpaqu.cc@ 3670

Last change on this file since 3670 was 3659, checked in by ansari, 16 years ago

amelioration classe BRPaqChecker et ajout methode d'acces en SByte et TwoByteComplex aux donnees de la classe BRPaquet - Reza 19/10/2009

File size: 17.5 KB
Line 
1#include <string.h>
2
3#include "brpaqu.h"
4
5
6static inline void bswap4(void* p)
7{
8 UInt32 tmp = *(UInt32*)p;
9 *(UInt32*)p = ((tmp >> 24) & 0x000000FF) |
10 ((tmp >> 8) & 0x0000FF00) |
11 ((tmp & 0x0000FF00) << 8) |
12 ((tmp & 0x000000FF) << 24);
13}
14
15/* --Methode__ */
16BRPaquet::BRPaquet(Byte* src, Byte* dst, int paqsz, BRDataFmtConv fgswap,int binMin,int nbBin )
17 // swapall = true -> on swap tout le paquet, sinon swap entete seulement
18{
19 dst_ = dst;
20 sz_ = paqsz;
21 if ((src == NULL) || (dst == NULL)) return;
22 // Il faut mettre une protection (throw) si dst==NULL ou sz==0
23
24 UInt32* src32 = (UInt32*)src;
25 UInt32* dst32 = (UInt32*)dst;
26 Byte* tmp = new Byte[sz_];
27
28 switch ( fgswap ) {
29 case BR_DoNothing : // rien a faire
30 break;
31 case BR_Copy : // copie directe
32 memcpy(dst_, src, sz_);
33 break;
34 case BR_Copy_Reduc : // copie directe
35 memcpy(dst_, src, HeaderSize());
36
37 memcpy(dst_+ HeaderSize(), src+(binMin+ HeaderSize()), nbBin);
38 memcpy(dst_+ (HeaderSize()+ nbBin ), src+(binMin+ HeaderSize()+sz_/2), nbBin);
39 memcpy(dst_+( HeaderSize()+( 2* nbBin)),src+(HeaderSize()+DataSize()),TrailerSize());
40
41 SetPaqLen( nbBin/2);
42 break;
43
44 case BR_Swap32 : // On swappe toutes les donnees du paquet
45 // les bytes sont dans l'ordre par paquet de 4 octets (Int32) , les deux Int32 de
46 // On copie la zone donnees en faisant un byte-swap correspondant a 8 octets (4->8 Reza/firmware SGDMA)
47 for(int ka=0; ka<sz_/4; ka+=2) {
48 dst32[ka] = src32[ka+1];
49 dst32[ka+1] = src32[ka];
50 }
51 break;
52 case BR_SwapAll:
53 for(int ka=0; ka<sz_; ka+=8) {
54 for(int kb=0; kb<4; kb++) {
55 dst_[ka+kb] = src[ka+3-kb+4];
56 dst_[ka+kb+4] = src[ka+3-kb];
57 }
58 }
59 for(int ka=HeaderSize()+DataSize(); ka<sz_; ka+=8) {
60 for(int kb=0; kb<4; kb++) {
61 dst_[ka+kb] = src[ka+3-kb+4];
62 dst_[ka+kb+4] = src[ka+3-kb];
63 }
64 }
65 break;
66 case BR_SwapHDR :
67 case BR_FFTOneChan :
68 case BR_FFTTwoChan :
69 // Byte swap (sur 8 octets) de l'entete
70 // ByteSwap 8 (4->8 Reza/firmware SGDMA) de l'enete
71 for(int ka=0; ka<BRHDRSIZE; ka+=8) {
72 for(int kb=0; kb<4; kb++) {
73 dst_[ka+kb] = src[ka+3-kb+4];
74 dst_[ka+kb+4] = src[ka+3-kb];
75 }
76 }
77
78 // on reoordonne les coeff FFT et on swappe en mem temps (Byte-swap sur 8 octets)
79 if (fgswap == BR_FFTOneChan) ReorderFFTData((SByte*)(src+HeaderSize()), (SByte*)(dst_+HeaderSize()), DataSize());
80 else if (fgswap == BR_FFTTwoChan) {
81 ReorderFFTData((SByte*)(src+HeaderSize()), (SByte*)(dst_+HeaderSize()), DataSize()/2);
82 ReorderFFTData((SByte*)(src+HeaderSize()+DataSize()/2), (SByte*)(dst_+HeaderSize()+DataSize()/2), DataSize()/2);
83 }
84 // Byte swap (sur 8 octets) du trailer
85 for(int ka=HeaderSize()+DataSize(); ka<sz_; ka+=8) {
86 for(int kb=0; kb<4; kb++) {
87 dst_[ka+kb] = src[ka+3-kb+4];
88 dst_[ka+kb+4] = src[ka+3-kb];
89 }
90 }
91 break;
92
93 case BR_FFTOneChan32 :
94 case BR_FFTTwoChan32 :
95 // swap du header uniquement : Echange de deux mots de 4 octets
96 for(int ka=0; ka<BRHDRSIZE/4; ka+=2) {
97 dst32[ka] = src32[ka+1];
98 dst32[ka+1] = src32[ka];
99 }
100
101 // on reoordonne et on swappe en mem temps (Echange de deux mots de 4 octets)
102 if (fgswap == BR_FFTOneChan32) ReorderFFTData32((SByte*)(src+HeaderSize()), (SByte*)(dst_+HeaderSize()), DataSize());
103 else if (fgswap == BR_FFTTwoChan32) {
104 ReorderFFTData32((SByte*)(src+HeaderSize()), (SByte*)(dst_+HeaderSize()), DataSize()/2);
105 ReorderFFTData32((SByte*)(src+HeaderSize()+DataSize()/2), (SByte*)(dst_+HeaderSize()+DataSize()/2), DataSize()/2);
106 }
107 // swap du trailler uniquement : Echange de deux mots de 4 octets
108 for(int ka=(HeaderSize()+DataSize())/4;ka < sz_/4; ka+=2) {
109 dst32[ka] = src32[ka+1];
110 dst32[ka+1] = src32[ka];
111 }
112 break;
113 case BR_FFTOneChanNoSwap :
114 case BR_FFTTwoChanNoSwap :
115 // copie du header uniquement
116 for(int ka=0; ka<BRHDRSIZE/4; ka++) dst32[ka] = src32[ka];
117
118 //DEL on a plus de swapdonc il faut copier dans dst
119 //DEL memcpy(dst_, src, sz_);
120
121 // on reoordonne les coeff FFT (pas de swap)
122 if (fgswap == BR_FFTOneChanNoSwap) ReorderFFTDataNoSwap((SByte*)(src+HeaderSize()), (SByte*)(dst_+HeaderSize()), DataSize());
123 else if (fgswap == BR_FFTTwoChanNoSwap) {
124 ReorderFFTDataNoSwap((SByte*)(src+HeaderSize()), (SByte*)(dst_+HeaderSize()), DataSize()/2);
125 ReorderFFTDataNoSwap((SByte*)(src+HeaderSize()+DataSize()/2), (SByte*)(dst_+HeaderSize()+DataSize()/2), DataSize()/2);
126 }
127 // copie du trailler uniquement :
128 for(int ka=(HeaderSize()+DataSize())/4;ka < sz_/4; ka++) dst32[ka] = src32[ka];
129 break;
130 case BR_CpHdrTrl :
131 for(int ka=0; ka<BRHDRSIZE/4; ka++) dst32[ka] = src32[ka];
132 for(int ka=(HeaderSize()+DataSize())/4;ka < sz_/4; ka++) dst32[ka] = src32[ka];
133 break;
134
135 case BR_FFTOneChanNoSwapReduct :
136 case BR_FFTTwoChanNoSwapReduct :
137 // copie du header uniquement
138
139 for(int ka=0; ka<BRHDRSIZE/4; ka++) dst32[ka] = src32[ka];
140
141 //DEL on a plus de swapdonc il faut copier dans dst
142 //DEL memcpy(dst_, src, sz_);
143
144 // on reoordonne les coeff FFT (pas de swap)
145 if (fgswap == BR_FFTOneChanNoSwap) ReorderFFTDataNoSwap((SByte*)(src+HeaderSize()), (SByte*)(tmp+HeaderSize()), DataSize());
146 else if (fgswap == BR_FFTTwoChanNoSwap) {
147 ReorderFFTDataNoSwap((SByte*)(src+HeaderSize()), (SByte*)(tmp+HeaderSize()), DataSize()/2);
148 ReorderFFTDataNoSwap((SByte*)(src+HeaderSize()+DataSize()/2), (SByte*)(tmp+HeaderSize()+DataSize()/2), DataSize()/2);
149 }
150 memcpy(tmp+ HeaderSize(), src+(binMin+ HeaderSize()), nbBin);
151 memcpy(tmp+ (HeaderSize()+ nbBin ), src+(binMin+ HeaderSize()+sz_/2), nbBin);
152 memcpy(tmp+( HeaderSize()+( 2* nbBin)),src+(HeaderSize()+DataSize()),TrailerSize());
153 memcpy(dst_+ HeaderSize(),tmp+ HeaderSize(),( 2* nbBin)+TrailerSize());
154 SetPaqLen( nbBin/2);
155
156 // copie du trailler uniquement :
157 // for(int ka=(HeaderSize()+DataSize())/4;ka < sz_/4; ka++) dst32[ka] = src32[ka];
158 break;
159 } // Fin switch
160
161}
162
163/* --Methode__ */
164BRPaquet::BRPaquet(Byte* srcdst, int paqsz)
165{
166 dst_ = srcdst;
167 sz_ = paqsz;
168 // Il faut mettre une protection (throw) si srcdst==NULL ou sz==0
169}
170
171
172/* --Methode__ */
173UInt16 BRPaquet::ChannelID()
174{
175
176 UInt16 ChnId=ChanId();
177 UInt16 ChpId=ChipId();
178
179
180 if (ChpId == 2)
181 {
182 if (ChnId == 1) ChnId = Ch3;
183 if (ChnId == 2) ChnId = Ch4;
184 if (ChnId == 3) ChnId = Ch3_4;
185 }
186 return(ChnId);
187}
188
189/* --Methode__ */
190UInt16 BRPaquet::ModeAcquisition()
191{
192 UInt16 ModAq;
193//DEL printf("Mod Acq %x \n",ModeAcq());
194 ModAq = ((ModeAcq() & 0x30)>> 4);
195 return(ModAq);
196}
197
198/* --Methode__ */
199void BRPaquet::SetHDRMarker64(UInt64 htag)
200{
201 *((UInt64*)(dst_+OFFSET)) = htag;
202 return;
203}
204
205/* --Methode__ */
206void BRPaquet::SetTRLMarker64(UInt64 ttag)
207{
208 *((UInt64*)(dst_+(sz_-BRTRLSIZE+OFFSET+1))) = 0;
209 *((UInt64*)(dst_+(sz_-BRTRLSIZE+OFFSET))) = ttag;
210 return;
211}
212
213/* --Methode__ */
214void BRPaquet::SetFrameCounter(UInt32 fc)
215{
216 UInt32* wp = (UInt32*)(dst_+(BRFRCPTOFF+OFFSET));
217 *wp = (*wp & 0x0000FFFF) | ((fc<<16) & 0xFFFF0000);
218 return;
219}
220
221/* --Methode__ */
222void BRPaquet::SetTimeTag(UInt64 timtag)
223{
224 UInt32* wp = (UInt32*)(dst_+(BRFRCPTOFF+OFFSET));
225 UInt32 fc = *wp;
226 *((UInt64*)(dst_+(BRTMTAGOFF+OFFSET))) = timtag;
227 *wp = (*wp & 0x0000FFFF) | (fc & 0xFFFF0000);
228 return;
229}
230
231/* --Methode__ */
232ostream& BRPaquet::Print(ostream & os, int nelt, bool prht)
233{
234 os << endl << "BRPaquet::Print() PaqSz=" << PaquetSize() << " DataSize=" << DataSize()
235 << " dst_pointer=(hex)" << hex << (unsigned long)dst_ << dec << endl;
236 if (dst_ == NULL) {
237 os << " ...NULL paquet " << endl;
238 return os;
239 }
240 os << " BR AcqMode: " << ModeAcquisition() << " Channel: " << ChannelID()
241 << " FrameCounter=" << FrameCounter() << " FrameDataLen=" << PaqLen() << endl;
242 if (TrailerSize() > 0)
243 os << " ...HDRMarker(hex)=" << hex << HDRMarker() << " TRLMarker=" << TRLMarker() << dec << endl;
244 else
245 os << " ...HDRMarker(hex)=" << hex << HDRMarker() << " NO TRLMarker=" << dec << endl;
246 UInt32 tt1, tt2;
247 tt2 = TimeTag1();
248 tt1 = TimeTag2();
249 os << " ...TimeTag (hex)=" << hex << " TT1= " << tt1 << " TT2=" << tt2
250 << dec << " ->TimeTag()=" << TimeTag() << endl;
251 // os << " ...Position Chariot (hex)= " << hex << PositionChariot() << endl;
252 if (nelt > DataSize()/2) nelt = DataSize()/2;
253 os << " ...Data[1.." << nelt << "]= ";
254
255 for(int k=0; k<nelt; k++) os << (int)(*(Data1()+k)) << " , ";
256 os << endl;
257 os << " ...Data[" << DataSize()-nelt << ".." << DataSize()-1 << "]= ";
258 for(int k=DataSize()-nelt; k<DataSize(); k++) os << (int)(*(Data1()+k)) << " , ";
259 os << endl;
260 if (prht) { // Impression header / trailer
261 UInt32* hdr = (UInt32*)Header();
262 os << " ...Header (hex):" << hex ;
263 for(int k=0; k<HeaderSize()/sizeof(UInt32); k++)
264 os << hdr[k] << " , " ;
265 os << dec << endl;
266 if (TrailerSize() > 0) {
267 UInt32* trl = (UInt32*)Trailer();
268 os << " ...Trailer (hex):" << hex ;
269 for(int k=0; k<TrailerSize()/sizeof(UInt32); k++)
270 os << trl[k] << " , " ;
271 os << dec << endl;
272 }
273 }
274 return os;
275}
276
277
278// ---------------------------------------------------------
279// **** REMARQUE N/2+1 complexes -> N/2 complexes *****
280// N = Nb d'echantillon en temps -> N/2 paires (real, imag)
281// Il y a le continu, et N/2 frequences ---> N/2+1 nombres complexes,
282// mais avec la contrainte Z(0).imag = 0 Z(N/2).imag = 0
283// f(i) i=0...N-1 ===> Z(k) ( Z complexe , k=0...N/2 )
284// mais avec la contrainte Z(0).imag = 0 Z(N/2).imag = 0
285// On peut donc tout mettre ds N/2 complexes en choisissant
286// de mettre ds Z(0).imag Z(N/2).real
287// ----------------------------------------------------------
288
289// Fonction magique qui donne le pointeur permettant de tenir compte du byte-swp sur 8 octets
290static inline int IndexByteSwap8(int idx)
291{
292 return ( (idx-(idx%8))+(7-idx%8) ) ;
293}
294
295/* --Methode__ */
296void BRPaquet::ReorderFFTData(SByte* src, SByte* dst, int N)
297{
298 // Code recopie depuis /Dev/DisplayData/HistoWindow.cc
299 // fonction TraceWind::DisplayBaoDatasFFT() et adapte aux structures BRPaquet et Cie
300 // Modif par rapport au code de Bruno : N/2 elements complexes au lieu de N/2+1 - Remarque ci-dessus
301
302 int nCoef = N / 2; // to change
303 int debutIndex = N / 4 + 1;
304 int fifoSize = N / 4 - 1;
305 int i;
306
307 TwoByteComplex* dstcmplx = (TwoByteComplex*)dst;
308
309 // cout << " Display BAO Datas FFT (" << N << ")" << " : from 0 to "<< nCoef << endl;
310 // cout << " Variables : debutIndex, fifoSize " << debutIndex << ", " << fifoSize << endl;
311
312
313 // Sortie 1
314 for (i = 0; i < fifoSize ; i++)
315 {
316 dstcmplx[debutIndex + i].realB() = src[IndexByteSwap8(2*i)];
317 dstcmplx[debutIndex + i].imagB() = src[IndexByteSwap8(2*i + 1)];
318 }
319
320 // element au milieu
321 dstcmplx[N / 4].realB() = src[IndexByteSwap8(2*fifoSize)];
322 dstcmplx[N / 4].imagB() = src[IndexByteSwap8(2*fifoSize + 1)];
323
324 // Sortie 2
325 for (i = 0; i < fifoSize ; i++)
326 {
327 dstcmplx[fifoSize - i].realB() = src[IndexByteSwap8(nCoef + 2*i)];
328 dstcmplx[fifoSize - i].imagB() = src[IndexByteSwap8(nCoef + 2*i + 1)];
329 }
330
331 // k = 0 et k = N/2
332 dstcmplx[0].realB() = src[IndexByteSwap8(N - 2)];
333 // Voir Remarque ci-dessus Z(N/2).real -> Z(0).image
334 dstcmplx[0].imagB() = src[IndexByteSwap8(N - 1)]; // Attention, on met ici la real(fmax)
335
336 return ;
337}
338
339static inline int IndexByteSwap8_32(int idx)
340{
341 return ( (idx-(idx%8))+((4+idx%8)%8) ) ;
342}
343
344void BRPaquet::ReorderFFTData32(SByte* src, SByte* dst, int N)
345{
346 // Code recopie depuis /Dev/DisplayData/HistoWindow.cc
347 // fonction TraceWind::DisplayBaoDatasFFT() et adapte aux structures BRPaquet et Cie
348 // Modif par rapport au code de Bruno : N/2 elements complexes au lieu de N/2+1 - Remarque ci-dessus
349
350 int nCoef = N / 2; // to change
351 int debutIndex = N / 4 + 1;
352 int fifoSize = N / 4 - 1;
353 int i;
354
355 TwoByteComplex* dstcmplx = (TwoByteComplex*)dst;
356
357 // cout << " Display BAO Datas FFT (" << N << ")" << " : from 0 to "<< nCoef << endl;
358 // cout << " Variables : debutIndex, fifoSize " << debutIndex << ", " << fifoSize << endl;
359
360
361 // Sortie 1
362 for (i = 0; i < fifoSize ; i++)
363 {
364 dstcmplx[debutIndex + i].realB() = src[IndexByteSwap8_32(2*i)];
365 dstcmplx[debutIndex + i].imagB() = src[IndexByteSwap8_32(2*i + 1)];
366 }
367
368 // element au milieu
369 dstcmplx[N / 4].realB() = src[IndexByteSwap8_32(2*fifoSize)];
370 dstcmplx[N / 4].imagB() = src[IndexByteSwap8_32(2*fifoSize + 1)];
371
372 // Sortie 2
373 for (i = 0; i < fifoSize ; i++)
374 {
375 dstcmplx[fifoSize - i].realB() = src[IndexByteSwap8_32(nCoef + 2*i)];
376 dstcmplx[fifoSize - i].imagB() = src[IndexByteSwap8_32(nCoef + 2*i + 1)];
377 }
378
379 // k = 0 et k = N/2
380 dstcmplx[0].realB() = src[IndexByteSwap8_32(N - 2)];
381 // Voir Remarque ci-dessus Z(N/2).real -> Z(0).image
382 dstcmplx[0].imagB() = src[IndexByteSwap8_32(N - 1)]; // Attention, on met ici la real(fmax)
383
384 return ;
385}
386void BRPaquet::ReorderFFTDataNoSwap(SByte* src, SByte* dst, int N)
387{
388 // Code recopie depuis /Dev/DisplayData/HistoWindow.cc
389 // fonction TraceWind::DisplayBaoDatasFFT() et adapte aux structures BRPaquet et Cie
390 // Modif par rapport au code de Bruno : N/2 elements complexes au lieu de N/2+1 - Remarque ci-dessus
391
392 int nCoef = N / 2; // to change
393 int debutIndex = N / 4 + 1;
394 int fifoSize = N / 4 - 1;
395 int i;
396
397 TwoByteComplex* dstcmplx = (TwoByteComplex*)dst;
398
399 // cout << " Display BAO Datas FFT (" << N << ")" << " : from 0 to "<< nCoef << endl;
400 // cout << " Variables : debutIndex, fifoSize " << debutIndex << ", " << fifoSize << endl;
401
402
403 // Sortie 1
404 for (i = 0; i < fifoSize ; i++)
405 {
406 dstcmplx[debutIndex + i].realB() = src[(2*i)];
407 dstcmplx[debutIndex + i].imagB() = src[(2*i + 1)];
408 }
409
410 // element au milieu
411 dstcmplx[N / 4].realB() = src[(2*fifoSize)];
412 dstcmplx[N / 4].imagB() = src[(2*fifoSize + 1)];
413
414 // Sortie 2
415 for (i = 0; i < fifoSize ; i++)
416 {
417 dstcmplx[fifoSize - i].realB() = src[(nCoef + 2*i)];
418 dstcmplx[fifoSize - i].imagB() = src[(nCoef + 2*i + 1)];
419 }
420
421 // k = 0 et k = N/2
422 dstcmplx[0].realB() = src[(N - 2)];
423 // Voir Remarque ci-dessus Z(N/2).real -> Z(0).image
424 dstcmplx[0].imagB() = src[(N - 1)]; // Attention, on met ici la real(fmax)
425
426 return ;
427}
428
429/* --Methode__ */
430const char* BRPaquet::FmtConvToString(BRDataFmtConv fgswap)
431{
432 const char * rs="";
433 switch ( fgswap ) {
434 case BR_DoNothing :
435 rs = "BR_DoNothing";
436 break;
437 case BR_Copy :
438 rs = "BR_Copy";
439 break;
440 case BR_SwapAll :
441 rs = "BR_SwapAll";
442 break;
443 case BR_SwapHDR :
444 rs = "BR_SwapHDR";
445 break;
446 case BR_FFTOneChan :
447 rs = "BR_FFTOneChan";
448 break;
449 case BR_FFTTwoChan :
450 rs = "BR_FFTTwoChan";
451 break;
452 case BR_Swap32 :
453 rs = "BR_Swap32";
454 break;
455 case BR_FFTOneChan32 :
456 rs = "BR_FFTOneChan32";
457 break;
458 case BR_FFTTwoChan32 :
459 rs = "BR_FFTTwoChan32";
460 break;
461 case BR_FFTOneChanNoSwap :
462 rs = "BR_FFTOneChanNoSwap";
463 break;
464 case BR_FFTTwoChanNoSwap :
465 rs = "BR_FFTTwoChanNoSwap";
466 break;
467 default:
468 rs = "?????";
469 break;
470 } // Fin switch
471 return rs;
472}
473
474// --------------------------------------------------------------------------
475// Classe pour effectuer des verifications d'integrite sur les paquets/frames
476// --------------------------------------------------------------------------
477
478BRPaqChecker::BRPaqChecker(bool cktrl, int maxprt)
479{
480 cktrl_ = cktrl;
481 totnframes = 0;
482 nframeok = 0;
483 lostframes = 0;
484 frclst = 0;
485 lastframenum = 0;
486 cnt_saut = 0;
487 maxprt_ = maxprt;
488 DefineHDRTag();
489 DefineTRLTag();
490}
491
492BRPaqChecker::~BRPaqChecker()
493{
494}
495
496UInt64 BRPaqChecker::DefineHDRTag(UInt32 hdr1, UInt32 hdr2)
497{
498 hdrtag_ = (UInt64)hdr1 + ((UInt64)hdr2 << 32);
499 return hdrtag_;
500}
501
502UInt64 BRPaqChecker::DefineTRLTag(UInt32 trl1, UInt32 trl2)
503{
504 trltag_ = (UInt64)trl1 + ((UInt64)trl2 << 32);
505 return trltag_;
506}
507
508
509bool BRPaqChecker::Check(BRPaquet& paq, UInt64& numframe)
510{
511 totnframes++;
512 numframe=0;
513 if (paq.HDRMarker64() != HDRTag()) return false;
514 if (cktrl_&&(paq.TRLMarker64() != TRLTag())) return false;
515 /* DBG
516 if (paq.TRLMarker64() != TRLTag()) {
517 cnt_pb++;
518 if (cnt_pb < 5) paq.Print();
519 return false;
520 }
521 */
522 unsigned int curfc = paq.FrameCounter();
523 unsigned int delfc = 0;
524 if (nframeok > 0) {
525 if (curfc>frclst) delfc = (curfc-frclst);
526 else delfc = (65536-frclst+curfc);
527 lostframes += (unsigned long long)delfc - 1;
528 if (delfc != 1) {
529 cnt_saut++;
530 if (cnt_saut < maxprt_) {
531 cout << "BRPaqChecker::Check([NumFrameOK=" << nframeok
532 << ")/Debug FrameCounter Cur=" << curfc
533 << " Last=" << frclst << " -> delta=" << delfc << endl;
534 paq.Print();
535 }
536 }
537 }
538 nframeok++; frclst=curfc;
539 lastframenum+=(unsigned long long)delfc; // numero de frame sans repliement a 65535
540 numframe=lastframenum;
541//DBG if (cnt_pb<5) { cnt_pb++; paq.Print(); }
542 return true;
543}
544
545ostream& BRPaqChecker::Print(ostream& os) const
546{
547 // os << "BRPaqChecker: HDRTag=" << hex << HDRTag() << " TRLTag=" << TRLTag() << dec << "\n"
548 // << " ... Tot.Nb.Frames.Proc=" << totnframes << " NbFrame HDR/TRL OK=" << nframeok
549 os << "BRPaqChecker: Tot.Nb.Frames.Proc=" << totnframes << " Nb.HDR/TRL OK=" << nframeok;
550 if (cktrl_) os << " (Check Header AND Trailer)" << endl;
551 else os << " (Header Check only)" << endl;
552 float meangap = (cnt_saut>0)?((float)lostframes/(float)cnt_saut):0.;
553 os << " ... LostFrames=" << lostframes
554 << " LossRate=" << (double)lostframes*100./(double)totnframes << " %"
555 << " NbGaps=" << cnt_saut << " MeanGap=" << meangap << endl;
556 return os;
557}
Note: See TracBrowser for help on using the repository browser.