Skip to content

Commit da74a17

Browse files
committed
Use CameraServer functionality directly instead of duplicating it
1 parent ac667e8 commit da74a17

File tree

1 file changed

+3
-92
lines changed

1 file changed

+3
-92
lines changed

photon-core/src/main/java/org/photonvision/vision/frame/consumer/MJPGFrameConsumer.java

+3-92
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,9 @@
1717

1818
package org.photonvision.vision.frame.consumer;
1919

20+
import edu.wpi.first.cameraserver.CameraServer;
2021
import edu.wpi.first.cscore.*;
21-
import edu.wpi.first.networktables.NetworkTable;
22-
import edu.wpi.first.networktables.NetworkTableInstance;
2322
import edu.wpi.first.util.PixelFormat;
24-
import java.util.ArrayList;
2523
import org.photonvision.common.util.math.MathUtils;
2624
import org.photonvision.vision.frame.StaticFrames;
2725
import org.photonvision.vision.opencv.CVMat;
@@ -34,59 +32,13 @@ public class MJPGFrameConsumer implements AutoCloseable {
3432
private CvSource cvSource;
3533
private MjpegServer mjpegServer;
3634

37-
private VideoListener listener;
38-
39-
private final NetworkTable table;
40-
4135
public MJPGFrameConsumer(String sourceName, int width, int height, int port) {
4236
this.cvSource = new CvSource(sourceName, PixelFormat.kMJPEG, width, height, 30);
43-
this.table =
44-
NetworkTableInstance.getDefault().getTable("/CameraPublisher").getSubTable(sourceName);
4537

4638
this.mjpegServer = new MjpegServer("serve_" + cvSource.getName(), port);
4739
mjpegServer.setSource(cvSource);
4840
mjpegServer.setCompression(75);
49-
50-
listener =
51-
new VideoListener(
52-
event -> {
53-
if (event.kind == VideoEvent.Kind.kNetworkInterfacesChanged) {
54-
table.getEntry("source").setString("cv:");
55-
table.getEntry("streams");
56-
table.getEntry("connected").setBoolean(true);
57-
table.getEntry("mode").setString(videoModeToString(cvSource.getVideoMode()));
58-
table.getEntry("modes").setStringArray(getSourceModeValues(cvSource.getHandle()));
59-
updateStreamValues();
60-
}
61-
},
62-
0x4fff,
63-
true);
64-
}
65-
66-
private synchronized void updateStreamValues() {
67-
// Get port
68-
int port = mjpegServer.getPort();
69-
70-
// Generate values
71-
var addresses = CameraServerJNI.getNetworkInterfaces();
72-
ArrayList<String> values = new ArrayList<>(addresses.length + 1);
73-
String listenAddress = CameraServerJNI.getMjpegServerListenAddress(mjpegServer.getHandle());
74-
if (!listenAddress.isEmpty()) {
75-
// If a listen address is specified, only use that
76-
values.add(makeStreamValue(listenAddress, port));
77-
} else {
78-
// Otherwise generate for hostname and all interface addresses
79-
values.add(makeStreamValue(CameraServerJNI.getHostname() + ".local", port));
80-
for (String addr : addresses) {
81-
if ("127.0.0.1".equals(addr)) {
82-
continue; // ignore localhost
83-
}
84-
values.add(makeStreamValue(addr, port));
85-
}
86-
}
87-
88-
String[] streamAddresses = values.toArray(new String[0]);
89-
table.getEntry("streams").setStringArray(streamAddresses);
41+
CameraServer.addServer(mjpegServer);
9042
}
9143

9244
public MJPGFrameConsumer(String name, int port) {
@@ -106,53 +58,12 @@ public void accept(CVMat image) {
10658
}
10759
}
10860

109-
public int getCurrentStreamPort() {
110-
return mjpegServer.getPort();
111-
}
112-
113-
private static String makeStreamValue(String address, int port) {
114-
return "mjpg:http://" + address + ":" + port + "/?action=stream";
115-
}
116-
117-
private static String[] getSourceModeValues(int sourceHandle) {
118-
VideoMode[] modes = CameraServerJNI.enumerateSourceVideoModes(sourceHandle);
119-
String[] modeStrings = new String[modes.length];
120-
for (int i = 0; i < modes.length; i++) {
121-
modeStrings[i] = videoModeToString(modes[i]);
122-
}
123-
return modeStrings;
124-
}
125-
126-
private static String videoModeToString(VideoMode mode) {
127-
return mode.width
128-
+ "x"
129-
+ mode.height
130-
+ " "
131-
+ pixelFormatToString(mode.pixelFormat)
132-
+ " "
133-
+ mode.fps
134-
+ " fps";
135-
}
136-
137-
private static String pixelFormatToString(PixelFormat pixelFormat) {
138-
return switch (pixelFormat) {
139-
case kMJPEG -> "MJPEG";
140-
case kYUYV -> "YUYV";
141-
case kRGB565 -> "RGB565";
142-
case kBGR -> "BGR";
143-
case kGray -> "Gray";
144-
case kUYVY, kUnknown, kY16, kBGRA -> "Unknown";
145-
};
146-
}
147-
14861
@Override
14962
public void close() {
150-
table.getEntry("connected").setBoolean(false);
63+
CameraServer.removeServer(mjpegServer.getName());
15164
mjpegServer.close();
15265
cvSource.close();
153-
listener.close();
15466
mjpegServer = null;
15567
cvSource = null;
156-
listener = null;
15768
}
15869
}

0 commit comments

Comments
 (0)