1   /*
2    * Copyright (c) 2006 Stiftung Deutsches Elektronen-Synchroton,
3    * Member of the Helmholtz Association, (DESY), HAMBURG, GERMANY.
4    *
5    * THIS SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN "../AS IS" BASIS.
6    * WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED
7    * TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR PARTICULAR PURPOSE AND
8    * NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
9    * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
10   * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
11   * THE USE OR OTHER DEALINGS IN THE SOFTWARE. SHOULD THE SOFTWARE PROVE DEFECTIVE
12   * IN ANY RESPECT, THE USER ASSUMES THE COST OF ANY NECESSARY SERVICING, REPAIR OR
13   * CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE.
14   * NO USE OF ANY SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
15   * DESY HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,
16   * OR MODIFICATIONS.
17   * THE FULL LICENSE SPECIFYING FOR THE SOFTWARE THE REDISTRIBUTION, MODIFICATION,
18   * USAGE AND OTHER RIGHTS AND OBLIGATIONS IS INCLUDED WITH THE DISTRIBUTION OF THIS
19   * PROJECT IN THE FILE LICENSE.HTML. IF THE LICENSE IS NOT INCLUDED YOU MAY FIND A COPY
20   * AT HTTP://WWW.DESY.DE/LEGAL/LICENSE.HTM
21   */
22  
23  package de.desy.acop.demo.example;
24  
25  import java.beans.PropertyVetoException;
26  
27  import com.cosylab.util.CommonException;
28  
29  import de.desy.acop.transport.AccessMode;
30  import de.desy.acop.transport.ConnectionParameters;
31  import de.desy.acop.video.AcopVideo;
32  
33  //mdavid: added
34  import de.desy.acop.video.displayer.ColorMap;
35  import de.desy.acop.video.displayer.OverlayState;
36  import de.desy.acop.video.displayer.ImageCLUT;
37  
38  //mdavid: commented
39  //import de.desy.video.sw.ImageDisplayer.ColorMap;
40  //import de.desy.video.sw.ImageDisplayer.OverlayState;
41  
42  public class VideoExample {
43  
44  	public static void main(String[] args) {
45  
46  		// How to connect video bean to a remote property?
47  		// First we create an instance of the AcopVideo object.
48  		AcopVideo video = new AcopVideo();
49  
50  		// We require ConnectionParameters which describe the remote property
51  		ConnectionParameters parameters = new ConnectionParameters("TINE", "context", "server", "device", "property", AccessMode.POLL, 1000);
52  
53  		// These parameters describe a remote property 'context/server/device/property'
54  		// in the TINE control system that delivers either a VSv2 video image blob or a
55  		// VSv3 CF_IMAGE type back.
56  		//
57  		// Examples for VSv2:
58  		//
59  		// (1) scheduled transfer
60  		// context = "PITZ" // usually general context of facility
61  		// server = "ZNPPITZFG1F" // usually server dns name in upper case plus "F"
62  		// device = "device_0" // always "device_0" for VSv2
63  		// property = "FRAME.GET" // scheduled property
64  		// AccessMode = AccessMode.POLL // constant monitoring
65  		// AccessRate = 1000 ms // contract refresh time on scheduling
66  		//
67  		// Note: This is a scheduled transfer mode, so any image should be seen even if the
68  		// images are send out with a faster rate than the accessrate is. It is
69  		// the recommended mode for live viewing.
70  		//
71  		// (2) nonscheduled transfer
72  		//
73  		// context = "PITZ" // usually general context of facility
74  		// server = "ZNPPITZFG1F" // usually server dns name in upper case plus "F"
75  		// device = "device_0" // always "device_0" for VSv2
76  		// property = "NONSCHED.GET" // current video image-property
77  		// AccessMode = AccessMode.POLL // constant monitoring
78  		// AccessRate = 1000 ms // update data every second
79  		//
80  		// Note: This is a NONscheduled transfer mode, so the maximum image update rate is
81  		// one frame per second according to the AccessRate.
82  		//		
83  		//
84  		// Examples for VSv3:
85  		//
86  		// (1) scheduled transfer
87  		// context = "PITZ" // usually general context of facility
88  		// server = "SGP_PRSGE1" // TINE server name
89  		// device = "Output" // usually "Output" is used for general output
90  		// property = "Frame.Sched" // scheduled property
91  		// AccessMode = AccessMode.POLL // constant monitoring
92  		// AccessRate = 1000 ms // contract refresh time on scheduling
93  		//
94  		// Note: This is a scheduled transfer mode, so any image should be seen even if the
95  		// images are send out with a faster rate than the accessrate is. It is
96  		// the recommended mode for live viewing.
97  		//
98  		// (2) nonscheduled transfer
99  		//
100 		// context = "PITZ" // usually general context of facility
101 		// server = "SGP_PRSGR1" // TINE server name
102 		// device = "Output" // usually "Output" is used for general output
103 		// property = "Frame" // current video image-property (non-scheduled)
104 		// AccessMode = AccessMode.POLL // constant monitoring
105 		// AccessRate = 1000 ms // update data every second
106 		//
107 		// Note: These parameters will use a NONscheduled transfer mode, so the maximum
108 		// image update rate is one frame per second according to the AccessRate.
109 		//
110 
111 		// Parameters are then attached to the video bean.
112 		try {
113 			video.setConnectionParameters(parameters);
114 		} catch (CommonException e) {
115 			e.printStackTrace();
116 		} catch (PropertyVetoException e) {
117 			e.printStackTrace();
118 		}
119 
120 		// Due to heavy-duty task the connection is not established automatically. Instead
121 		// the user has to invoke the start method to establish a connection and
122 		// start image rendering
123 
124 		video.start();
125 
126 		// If no exception occurred, video bean should now show images from remote peer.
127 
128 		// mdavid: commented
129 		// // Other properties of the video can also simply be adjusted by calling the
130 		// // appropriate setter methods. Let's say that we want to display image
131 		// // metaproperties (connection data, width, height, ...) as overlay (like
132 		// // an on-screen-display). In this case one has to enable the overlay
133 		// //
134 		// // For general information on False colours, please refer to user documentation.
135 		// //
136 		// video.setOverlayEnabled(true);
137 
138 		// to enable the overlay information
139 		video.getImageDisplayer().setOverlayState(OverlayState.ON); // mdavid
140 
141 		//
142 		// We can also change the color map of the image. There are several different
143 		// type we can choose from:
144 		// ColorMap.GRAYSCALE - basic linear gray scaling like B/W TV
145 		// ColorMap.JET - MATLAB jet false colour
146 		// ColorMap.PITZ - a False colour table invented at PITZ 1
147 		//
148 		// For general information on False colours, please refer to user documentation.
149 		//
150 //		video.getImageDisplayer().setColorMap(ColorMap.JET); // mdavid: changed
151 		video.getImageDisplayer().setCLUT(new ImageCLUT(ColorMap.JET, new int[]{8})); // mdavid: changed
152 
153 		//
154 		// Similarly we can enable AOIZoom of the image
155 		//
156 		// For general information on AOI zooming, please refer to user documentation.
157 		//
158 		video.getImageDisplayer().setAOIZoom(true);
159 
160 		//
161 		// Activates histogram equalisation (aka normalisation, aka contrast enhancement)
162 		// of the image. This can increase recognizability by eye significantly.
163 		//
164 		// For general information on Histogram Equalisation, please refer to user
165 		// documentation.
166 		//
167 		video.getImageDisplayer().setHistogramEqualisation(true);
168 
169 		//
170 		// Activates maintaining of aspect ratio of the displayed images. So width and height
171 		// are kept in relation to the original scene.
172 		//
173 		// For general information on Aspect ratio, please refer to user
174 		// documentation.
175 		//
176 		video.getImageDisplayer().setKeepAspectRatio(true);
177 
178 		// similar to most of the above, one can check the current setting of properties
179 		// by calling
180 
181 		if (video.getImageDisplayer().isHistogramEqualisation() == false)
182 			System.out.println("Histogram equalisation is not activated.");
183 
184 		if (video.getImageDisplayer().isKeepAspectRatio() == false)
185 			System.out.println("Source scene aspect ratio is not maintained.");
186 
187 		if (video.getImageDisplayer().isAOIZoom() == false)
188 			System.out.println("AOI is not zoomed. If there is an AOI, it should be " + "seen as black frame surrounding the image.");
189 
190 		// if (video.isOverlayEnabled() == false) // mdavid: commented
191 		// System.out.println("On-Screen-Display is currently not shown.");
192 
193 		System.out.println("On-Screen-Display state is: " + video.getImageDisplayer().getOverlayState()); // mdavid: added
194 
195 //		if (video.getImageDisplayer().getColorMap() == ColorMap.JET) // mdavid: changed
196 		if (video.getImageDisplayer().getCLUT().getColorMap() == ColorMap.JET) // mdavid: changed
197 			System.out.println("MATLAB JET False Colour is used on greyscale displaying.");
198 
199 		//
200 		// on special event or shutdown, one may stops an active, running transfer
201 		// (which was activated before by start() method)
202 		//
203 		video.stop();
204 
205 		//
206 		// saves the currently displayed image to colour png file, saves additional
207 		// image metainformation as text file (dump of image header)
208 		//
209 		// any image enhancement option (like false colour mode, normalisation) will be
210 		// seen also in the png file (WYSIWYYG)
211 		//
212 		if (video.getImageDisplayer().saveAsPNGImage("test.png") == false) {
213 			System.out.println("Could not save image (plus metadata) to test.png and test.txt");
214 		}
215 
216 	}
217 }