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

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

1/ Gestion multi-fibre ds RAcqMemZoneMgr et les DMAReader/DiskWriter (brproc.cc)
2/ Possibilite d'ajout de mot cle ds l'entete FITS par la classe MiniFITSFile

Reza , 18/10/2009

File size: 17.1 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(src+HeaderSize(), dst_+HeaderSize(), DataSize());
80 else if (fgswap == BR_FFTTwoChan) {
81 ReorderFFTData(src+HeaderSize(), dst_+HeaderSize(), DataSize()/2);
82 ReorderFFTData(src+HeaderSize()+DataSize()/2, 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(src+HeaderSize(), dst_+HeaderSize(), DataSize());
103 else if (fgswap == BR_FFTTwoChan32) {
104 ReorderFFTData32(src+HeaderSize(), dst_+HeaderSize(), DataSize()/2);
105 ReorderFFTData32(src+HeaderSize()+DataSize()/2, 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(src+HeaderSize(), dst_+HeaderSize(), DataSize());
123 else if (fgswap == BR_FFTTwoChanNoSwap) {
124 ReorderFFTDataNoSwap(src+HeaderSize(), dst_+HeaderSize(), DataSize()/2);
125 ReorderFFTDataNoSwap(src+HeaderSize()+DataSize()/2, 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(src+HeaderSize(), tmp+HeaderSize(), DataSize());
146 else if (fgswap == BR_FFTTwoChanNoSwap) {
147 ReorderFFTDataNoSwap(src+HeaderSize(), tmp+HeaderSize(), DataSize()/2);
148 ReorderFFTDataNoSwap(src+HeaderSize()+DataSize()/2, 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(Byte* src, Byte* 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(Byte* src, Byte* 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(Byte* src, Byte* 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 cnt_saut = 0;
486 maxprt_ = maxprt;
487 DefineHDRTag();
488 DefineTRLTag();
489}
490
491BRPaqChecker::~BRPaqChecker()
492{
493}
494
495UInt64 BRPaqChecker::DefineHDRTag(UInt32 hdr1, UInt32 hdr2)
496{
497 hdrtag_ = (UInt64)hdr1 + ((UInt64)hdr2 << 32);
498 return hdrtag_;
499}
500
501UInt64 BRPaqChecker::DefineTRLTag(UInt32 trl1, UInt32 trl2)
502{
503 trltag_ = (UInt64)trl1 + ((UInt64)trl2 << 32);
504 return trltag_;
505}
506
507
508bool BRPaqChecker::Check(BRPaquet& paq)
509{
510 totnframes++;
511 if (paq.HDRMarker64() != HDRTag()) return false;
512 if (cktrl_&&(paq.TRLMarker64() != TRLTag())) return false;
513 /* DBG
514 if (paq.TRLMarker64() != TRLTag()) {
515 cnt_pb++;
516 if (cnt_pb < 5) paq.Print();
517 return false;
518 }
519 */
520 unsigned int curfc = paq.FrameCounter();
521 unsigned int delfc = 0;
522 if (nframeok > 0) {
523 if (curfc>frclst) delfc = (curfc-frclst);
524 else delfc = (65536-frclst+curfc);
525 lostframes += (unsigned long long)delfc - 1;
526 if (delfc != 1) {
527 cnt_saut++;
528 if (cnt_saut < maxprt_) {
529 cout << "BRPaqChecker::Check([NumFrameOK=" << nframeok
530 << ")/Debug FrameCounter Cur=" << curfc
531 << " Last=" << frclst << " -> delta=" << delfc << endl;
532 paq.Print();
533 }
534 }
535 }
536 nframeok++; frclst = curfc;
537//DBG if (cnt_pb<5) { cnt_pb++; paq.Print(); }
538 return true;
539}
540
541ostream& BRPaqChecker::Print(ostream& os) const
542{
543 // os << "BRPaqChecker: HDRTag=" << hex << HDRTag() << " TRLTag=" << TRLTag() << dec << "\n"
544 // << " ... Tot.Nb.Frames.Proc=" << totnframes << " NbFrame HDR/TRL OK=" << nframeok
545 os << "BRPaqChecker: Tot.Nb.Frames.Proc=" << totnframes << " Nb.HDR/TRL OK=" << nframeok;
546 if (cktrl_) os << " (Check Header AND Trailer)" << endl;
547 else os << " (Header Check only)" << endl;
548 float meangap = (cnt_saut>0)?((float)lostframes/(float)cnt_saut):0.;
549 os << " ... LostFrames=" << lostframes
550 << " LossRate=" << (double)lostframes*100./(double)totnframes << " %"
551 << " NbGaps=" << cnt_saut << " MeanGap=" << meangap << endl;
552 return os;
553}
Note: See TracBrowser for help on using the repository browser.