From 07d02747534340530fe0bbb695ef18ebc783bc6f Mon Sep 17 00:00:00 2001 From: Banks Troutman Date: Sun, 22 Sep 2019 13:35:19 -0400 Subject: [PATCH] Fixed video mode not being set when loading from json --- .../chameleonvision/vision/camera/Camera.java | 41 +++++++++---------- .../vision/camera/CameraDeserializer.java | 4 +- .../vision/process/CameraProcess.java | 2 +- .../chameleonvision/web/ServerHandler.java | 2 +- 4 files changed, 25 insertions(+), 24 deletions(-) diff --git a/Main/src/main/java/com/chameleonvision/vision/camera/Camera.java b/Main/src/main/java/com/chameleonvision/vision/camera/Camera.java index 8d784e5b9..863359556 100644 --- a/Main/src/main/java/com/chameleonvision/vision/camera/Camera.java +++ b/Main/src/main/java/com/chameleonvision/vision/camera/Camera.java @@ -20,7 +20,7 @@ public class Camera { public final String name; public final String path; - final UsbCamera UsbCam; + private final UsbCamera UsbCam; private final VideoMode[] availableVideoModes; private final CameraServer cs = CameraServer.getInstance(); @@ -38,23 +38,23 @@ public class Camera { this(cameraName, DEFAULT_FOV); } - public Camera(UsbCameraInfo usbCamInfo) { - this(usbCamInfo, DEFAULT_FOV); - } - public Camera(String cameraName, double fov) { this(CameraManager.AllUsbCameraInfosByName.get(cameraName), fov); } public Camera(UsbCameraInfo usbCamInfo, double fov) { - this(usbCamInfo, fov, new HashMap<>()); + this(usbCamInfo, fov, new HashMap<>(), 0); } - public Camera(String cameraName, double fov, HashMap pipelines) { - this(CameraManager.AllUsbCameraInfosByName.get(cameraName), fov, pipelines); + public Camera(String cameraName, double fov, int videoModeIndex) { + this(cameraName, fov, new HashMap<>(), videoModeIndex); } - public Camera(UsbCameraInfo usbCamInfo, double fov, HashMap pipelines) { + public Camera(String cameraName, double fov, HashMap pipelines, int videoModeIndex) { + this(CameraManager.AllUsbCameraInfosByName.get(cameraName), fov, pipelines, videoModeIndex); + } + + public Camera(UsbCameraInfo usbCamInfo, double fov, HashMap pipelines, int videoModeIndex) { FOV = fov; name = usbCamInfo.name; path = usbCamInfo.path; @@ -65,7 +65,11 @@ public class Camera { // set up video modes according to minimums availableVideoModes = Arrays.stream(UsbCam.enumerateVideoModes()).filter(v -> v.fps >= MINIMUM_FPS && v.width >= MINIMUM_WIDTH && v.height >= MINIMUM_HEIGHT).toArray(VideoMode[]::new); - setCamVideoMode(new CamVideoMode(availableVideoModes[0])); + if (videoModeIndex <= availableVideoModes.length - 1) { + setCamVideoMode(videoModeIndex, false); + } else { + setCamVideoMode(0, false); + } cvSink = cs.getVideo(UsbCam); cvSource = cs.putVideo(name, camVals.ImageWidth, camVals.ImageHeight); @@ -73,7 +77,7 @@ public class Camera { CameraManager.CameraPorts.put(name, s.getPort()); } - public VideoMode[] getAvailableVideoModes() { + VideoMode[] getAvailableVideoModes() { return availableVideoModes; } @@ -82,15 +86,11 @@ public class Camera { return s.getPort(); } - public void setCamVideoMode(int videoMode) { - setCamVideoMode(availableVideoModes[videoMode]); + public void setCamVideoMode(int videoMode, boolean updateCvSource) { + setCamVideoMode(new CamVideoMode(availableVideoModes[videoMode]), updateCvSource); } - private void setCamVideoMode(VideoMode videoMode) { - setCamVideoMode(new CamVideoMode(videoMode)); - } - - private void setCamVideoMode(CamVideoMode newVideoMode) { + private void setCamVideoMode(CamVideoMode newVideoMode, boolean updateCvSource) { var prevVideoMode = this.camVideoMode; this.camVideoMode = newVideoMode; UsbCam.setPixelFormat(newVideoMode.getActualPixelFormat()); @@ -99,12 +99,11 @@ public class Camera { // update camera values camVals = new CameraValues(this); - if (prevVideoMode != null && !prevVideoMode.equals(newVideoMode)) { // if resolution changed + if (prevVideoMode != null && !prevVideoMode.equals(newVideoMode) && updateCvSource) { // if resolution changed synchronized (cvSourceLock) { - cvSource = cs.putVideo(name, newVideoMode.width, newVideoMode.height); + cvSource = cs.putVideo(name, newVideoMode.width, newVideoMode.height); } ServerHandler.sendFullSettings(); -// ServerHandler.broadcastMessage(new HashMap(){}.put("port", getStreamPort())); } } diff --git a/Main/src/main/java/com/chameleonvision/vision/camera/CameraDeserializer.java b/Main/src/main/java/com/chameleonvision/vision/camera/CameraDeserializer.java index afb1b7155..18e35823f 100644 --- a/Main/src/main/java/com/chameleonvision/vision/camera/CameraDeserializer.java +++ b/Main/src/main/java/com/chameleonvision/vision/camera/CameraDeserializer.java @@ -16,6 +16,8 @@ public class CameraDeserializer implements JsonDeserializer { var jsonObj = jsonElement.getAsJsonObject(); var camFOV = jsonObj.get("FOV").getAsDouble(); var camName = jsonObj.get("name").getAsString(); + var videoModeIndex = jsonObj.get("resolution").getAsInt(); + var pipelines = jsonObj.get("pipelines"); HashMap actualPipelines = new HashMap<>(); @@ -28,6 +30,6 @@ public class CameraDeserializer implements JsonDeserializer { e.printStackTrace(); } - return actualPipelines != null ? new Camera(camName, camFOV, actualPipelines) : new Camera(camName, camFOV); + return actualPipelines != null ? new Camera(camName, camFOV, actualPipelines, videoModeIndex) : new Camera(camName, camFOV, videoModeIndex); } } diff --git a/Main/src/main/java/com/chameleonvision/vision/process/CameraProcess.java b/Main/src/main/java/com/chameleonvision/vision/process/CameraProcess.java index 86aaf71c9..7885dec91 100644 --- a/Main/src/main/java/com/chameleonvision/vision/process/CameraProcess.java +++ b/Main/src/main/java/com/chameleonvision/vision/process/CameraProcess.java @@ -33,7 +33,7 @@ public class CameraProcess implements Runnable { } void updateFrame(Mat inputFrame) { - synchronized (inputFrameLock) { + synchronized (inputFrameLock) { inputFrame.copyTo(this.inputFrame); } } diff --git a/Main/src/main/java/com/chameleonvision/web/ServerHandler.java b/Main/src/main/java/com/chameleonvision/web/ServerHandler.java index ac2c327b9..e26058cde 100644 --- a/Main/src/main/java/com/chameleonvision/web/ServerHandler.java +++ b/Main/src/main/java/com/chameleonvision/web/ServerHandler.java @@ -98,7 +98,7 @@ public class ServerHandler { case "resolution": int newVideoMode = (int) value; System.out.printf("Changing video mode to %d\n", newVideoMode); - CameraManager.getCurrentCamera().setCamVideoMode(newVideoMode); + CameraManager.getCurrentCamera().setCamVideoMode(newVideoMode, true); break; case "FOV": double newFov = (double) value;