1 package de.desy.acop.video.displayer;
2
3
4
5
6
7
8
9
10 public class ImageCounter {
11
12
13
14
15
16 private static final long BIG_FRAME_NUMBER_GAP = 20;
17
18
19
20
21
22 private long _lastFrameNumber = -1;
23
24
25
26
27
28
29 private long _droppedFrames;
30
31
32
33
34
35
36 private long _receivedFrames;
37
38
39
40
41
42 private double _ratio;
43
44 public ImageCounter() {
45 super();
46 }
47
48 public long getLastFrameNumber() {
49 return _lastFrameNumber;
50 }
51
52 public void setLastFrameNumber(long lastFrameNumber) {
53 _lastFrameNumber = lastFrameNumber;
54 }
55
56 public void calculate(long frameNumber) {
57 _receivedFrames++;
58
59 if (frameNumber < 0) {
60
61
62 System.out.println("WARN: negative number of frame: " + frameNumber);
63
64 } else if (frameNumber <= _lastFrameNumber) {
65 System.out.println("WARN: current frame number (" + frameNumber
66 + ") is less/equal than/to last frame number (" + frameNumber + ")");
67 reset();
68 calculate(frameNumber);
69
70 } else {
71 if (_lastFrameNumber == -1) {
72 _lastFrameNumber = frameNumber;
73 _droppedFrames = 0;
74
75 } else {
76 long diff = frameNumber - _lastFrameNumber;
77 _droppedFrames += (diff - 1);
78 _lastFrameNumber = frameNumber;
79 if (diff > BIG_FRAME_NUMBER_GAP)
80 System.out.println("WARN: more than " + BIG_FRAME_NUMBER_GAP + " missing frames: " + diff);
81 }
82 }
83 }
84
85 public long getDroppedFrames() {
86 return _droppedFrames;
87 }
88
89 public long getReceivedFrames() {
90 return _receivedFrames;
91 }
92
93 public double getRatio() {
94 if (_receivedFrames != 0)
95 _ratio = (double) _droppedFrames / (double) _receivedFrames;
96
97 return _ratio;
98 }
99
100 public double getDroppedPercent() {
101 long allFrames = _droppedFrames + _receivedFrames;
102 return (allFrames == 0) ? 0.0 : (double) _droppedFrames / (double) allFrames;
103 }
104
105
106
107
108 public void reset() {
109 _lastFrameNumber = -1;
110 _droppedFrames = 0;
111 _receivedFrames = 0;
112 _ratio = 0.0;
113 }
114 }