View Javadoc

1   package de.desy.acop.video.displayer;
2   
3   /**
4    * Images counter. Calculates dropped frames and dropped frames percentage for
5    * each new subsequent incoming frame
6    * 
7    * @author sweisse, mdavid
8    * 
9    */
10  public class ImageCounter {
11  
12  	/**
13  	 * logged if there is a "big" frame number gap (missing frames in between
14  	 * two received frames)
15  	 */
16  	private static final long BIG_FRAME_NUMBER_GAP = 20;
17  
18  	/**
19  	 * last received frame number. This value is updated if a video image is
20  	 * scheduled for displaying. It is reset to -1 on startup of live transfer.
21  	 */
22  	private long _lastFrameNumber = -1;
23  
24  	/**
25  	 * total dropped frames counter. This value is updated if a video image is
26  	 * scheduled for displaying. It is reset to zero on startup of live
27  	 * transfer.
28  	 */
29  	private long _droppedFrames;
30  
31  	/**
32  	 * total subsequent received frames counter. This value is updated if a
33  	 * video image is scheduled for displaying. It is reset to zero on startup
34  	 * of live transfer.
35  	 */
36  	private long _receivedFrames;
37  
38  	/**
39  	 * ratio (percentage) of dropped vs. total number of received frames. This
40  	 * value is updated if a video images is scheduled for displaying.
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  			// (may be) because the maximum integer number is exceeded.
61  			// reset of dropped frames counter is not allowed.
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(); // reset counter
68  			calculate(frameNumber); // recalculate dropped frames number
69  
70  		} else { // (frameNumber > _lastFrameNumber)
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 	 * Resets image counter
107 	 */
108 	public void reset() {
109 		_lastFrameNumber = -1;
110 		_droppedFrames = 0;
111 		_receivedFrames = 0;
112 		_ratio = 0.0;
113 	}
114 }