001/*----------------------------------------------------------------------------*/
002/* Copyright (c) 2016-2018 FIRST. All Rights Reserved.                        */
003/* Open Source Software - may be modified and shared by FRC teams. The code   */
004/* must be accompanied by the FIRST BSD license file in the root directory of */
005/* the project.                                                               */
006/*----------------------------------------------------------------------------*/
007
008package edu.wpi.cscore;
009
010import java.io.File;
011import java.io.InputStream;
012import java.io.OutputStream;
013import java.io.FileOutputStream;
014import java.io.IOException;
015import java.nio.ByteBuffer;
016import java.util.function.Consumer;
017import org.opencv.core.Core;
018import edu.wpi.first.wpiutil.RuntimeDetector;
019
020public class CameraServerJNI {
021  static boolean libraryLoaded = false;
022  static File jniLibrary = null;
023  static boolean cvLibraryLoaded = false;
024  static File cvJniLibrary = null;
025  static {
026    if (!libraryLoaded) {
027      try {
028        System.loadLibrary("cscore");
029      } catch (UnsatisfiedLinkError e) {
030        try {
031          String resname = RuntimeDetector.getLibraryResource("cscore");
032          InputStream is = CameraServerJNI.class.getResourceAsStream(resname);
033          if (is != null) {
034            // create temporary file
035            if (System.getProperty("os.name").startsWith("Windows"))
036              jniLibrary = File.createTempFile("CameraServerJNI", ".dll");
037            else if (System.getProperty("os.name").startsWith("Mac"))
038              jniLibrary = File.createTempFile("libCameraServerJNI", ".dylib");
039            else
040              jniLibrary = File.createTempFile("libCameraServerJNI", ".so");
041            // flag for delete on exit
042            jniLibrary.deleteOnExit();
043            OutputStream os = new FileOutputStream(jniLibrary);
044
045            byte[] buffer = new byte[1024];
046            int readBytes;
047            try {
048              while ((readBytes = is.read(buffer)) != -1) {
049                os.write(buffer, 0, readBytes);
050              }
051            } finally {
052              os.close();
053              is.close();
054            }
055            System.load(jniLibrary.getAbsolutePath());
056          } else {
057            System.loadLibrary("cscore");
058          }
059        } catch (IOException ex) {
060          ex.printStackTrace();
061          System.exit(1);
062        }
063      }
064      libraryLoaded = true;
065    }
066
067    String opencvName = Core.NATIVE_LIBRARY_NAME;
068    if (!cvLibraryLoaded) {
069      try {
070
071        System.loadLibrary(opencvName);
072      } catch (UnsatisfiedLinkError e) {
073        try {
074          String resname = RuntimeDetector.getLibraryResource(opencvName);
075          InputStream is = CameraServerJNI.class.getResourceAsStream(resname);
076          if (is != null) {
077            // create temporary file
078            if (System.getProperty("os.name").startsWith("Windows"))
079              cvJniLibrary = File.createTempFile("OpenCVJNI", ".dll");
080            else if (System.getProperty("os.name").startsWith("Mac"))
081              cvJniLibrary = File.createTempFile("libOpenCVJNI", ".dylib");
082            else
083              cvJniLibrary = File.createTempFile("libOpenCVJNI", ".so");
084            // flag for delete on exit
085            cvJniLibrary.deleteOnExit();
086            OutputStream os = new FileOutputStream(cvJniLibrary);
087
088            byte[] buffer = new byte[1024];
089            int readBytes;
090            try {
091              while ((readBytes = is.read(buffer)) != -1) {
092                os.write(buffer, 0, readBytes);
093              }
094            } finally {
095              os.close();
096              is.close();
097            }
098            System.load(cvJniLibrary.getAbsolutePath());
099          } else {
100            System.loadLibrary(opencvName);
101          }
102        } catch (IOException ex) {
103          ex.printStackTrace();
104          System.exit(1);
105        }
106      }
107      cvLibraryLoaded = true;
108    }
109  }
110
111  public static void ForceLoad() {}
112
113  //
114  // Property Functions
115  //
116  public static native int getPropertyKind(int property);
117  public static native String getPropertyName(int property);
118  public static native int getProperty(int property);
119  public static native void setProperty(int property, int value);
120  public static native int getPropertyMin(int property);
121  public static native int getPropertyMax(int property);
122  public static native int getPropertyStep(int property);
123  public static native int getPropertyDefault(int property);
124  public static native String getStringProperty(int property);
125  public static native void setStringProperty(int property, String value);
126  public static native String[] getEnumPropertyChoices(int property);
127
128  //
129  // Source Creation Functions
130  //
131  public static native int createUsbCameraDev(String name, int dev);
132  public static native int createUsbCameraPath(String name, String path);
133  public static native int createHttpCamera(String name, String url, int kind);
134  public static native int createHttpCameraMulti(String name, String[] urls, int kind);
135  public static native int createCvSource(String name, int pixelFormat, int width, int height, int fps);
136
137  //
138  // Source Functions
139  //
140  public static native int getSourceKind(int source);
141  public static native String getSourceName(int source);
142  public static native String getSourceDescription(int source);
143  public static native long getSourceLastFrameTime(int source);
144  public static native boolean isSourceConnected(int source);
145  public static native int getSourceProperty(int source, String name);
146  public static native int[] enumerateSourceProperties(int source);
147  public static native VideoMode getSourceVideoMode(int source);
148  public static native boolean setSourceVideoMode(int source, int pixelFormat, int width, int height, int fps);
149  public static native boolean setSourcePixelFormat(int source, int pixelFormat);
150  public static native boolean setSourceResolution(int source, int width, int height);
151  public static native boolean setSourceFPS(int source, int fps);
152  public static native VideoMode[] enumerateSourceVideoModes(int source);
153  public static native int[] enumerateSourceSinks(int source);
154  public static native int copySource(int source);
155  public static native void releaseSource(int source);
156
157  //
158  // Camera Source Common Property Fuctions
159  //
160  public static native void setCameraBrightness(int source, int brightness);
161  public static native int getCameraBrightness(int source);
162  public static native void setCameraWhiteBalanceAuto(int source);
163  public static native void setCameraWhiteBalanceHoldCurrent(int source);
164  public static native void setCameraWhiteBalanceManual(int source, int value);
165  public static native void setCameraExposureAuto(int source);
166  public static native void setCameraExposureHoldCurrent(int source);
167  public static native void setCameraExposureManual(int source, int value);
168
169  //
170  // UsbCamera Source Functions
171  //
172  public static native String getUsbCameraPath(int source);
173
174  //
175  // HttpCamera Source Functions
176  //
177  public static native int getHttpCameraKind(int source);
178  public static native void setHttpCameraUrls(int source, String[] urls);
179  public static native String[] getHttpCameraUrls(int source);
180
181  //
182  // OpenCV Source Functions
183  //
184  public static native void putSourceFrame(int source, long imageNativeObj);
185  public static native void notifySourceError(int source, String msg);
186  public static native void setSourceConnected(int source, boolean connected);
187  public static native void setSourceDescription(int source, String description);
188  public static native int createSourceProperty(int source, String name, int kind, int minimum, int maximum, int step, int defaultValue, int value);
189  public static native void setSourceEnumPropertyChoices(int source, int property, String[] choices);
190
191  //
192  // Sink Creation Functions
193  //
194  public static native int createMjpegServer(String name, String listenAddress, int port);
195  public static native int createCvSink(String name);
196  //public static native int createCvSinkCallback(String name,
197  //                            void (*processFrame)(long time));
198
199  //
200  // Sink Functions
201  //
202  public static native int getSinkKind(int sink);
203  public static native String getSinkName(int sink);
204  public static native String getSinkDescription(int sink);
205  public static native void setSinkSource(int sink, int source);
206  public static native int getSinkSourceProperty(int sink, String name);
207  public static native int getSinkSource(int sink);
208  public static native int copySink(int sink);
209  public static native void releaseSink(int sink);
210
211  //
212  // MjpegServer Sink Functions
213  //
214  public static native String getMjpegServerListenAddress(int sink);
215  public static native int getMjpegServerPort(int sink);
216
217  //
218  // OpenCV Sink Functions
219  //
220  public static native void setSinkDescription(int sink, String description);
221  public static native long grabSinkFrame(int sink, long imageNativeObj);
222  public static native long grabSinkFrameTimeout(int sink, long imageNativeObj, double timeout);
223  public static native String getSinkError(int sink);
224  public static native void setSinkEnabled(int sink, boolean enabled);
225
226  //
227  // Listener Functions
228  //
229  public static native int addListener(Consumer<VideoEvent> listener,
230                                       int eventMask, boolean immediateNotify);
231
232  public static native void removeListener(int handle);
233
234  //
235  // Logging Functions
236  //
237  @FunctionalInterface
238  public interface LoggerFunction {
239    void apply(int level, String file, int line, String msg);
240  }
241  public static native void setLogger(LoggerFunction func, int minLevel);
242
243  //
244  // Utility Functions
245  //
246  public static native UsbCameraInfo[] enumerateUsbCameras();
247
248  public static native int[] enumerateSources();
249
250  public static native int[] enumerateSinks();
251
252  public static native String getHostname();
253
254  public static native String[] getNetworkInterfaces();
255}