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}