Add support for custom device events and implement for CaptureManagerSDK driver
This commit is contained in:
parent
d417760b30
commit
395d76a752
2
pom.xml
2
pom.xml
|
@ -3,7 +3,7 @@
|
|||
|
||||
<groupId>io.github.eduramiba</groupId>
|
||||
<artifactId>webcam-capture-driver-native</artifactId>
|
||||
<version>1.0.0</version>
|
||||
<version>1.0.1</version>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
|
|
|
@ -2,5 +2,5 @@ package com.github.eduramiba.webcamcapture.drivers;
|
|||
|
||||
import com.github.sarxos.webcam.WebcamDevice;
|
||||
|
||||
public interface WebcamDeviceExtended extends WebcamDevice, WebcamDevice.FPSSource, WebcamDevice.BufferAccess, WebcamDeviceWithId, WebcamDeviceWithBufferOperations {
|
||||
public interface WebcamDeviceExtended extends WebcamDevice, WebcamDevice.FPSSource, WebcamDevice.BufferAccess, WebcamDeviceWithId, WebcamDeviceWithBufferOperations, WebcamDeviceWithCustomEvents {
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
package com.github.eduramiba.webcamcapture.drivers;
|
||||
|
||||
import com.github.sarxos.webcam.WebcamDevice;
|
||||
|
||||
public interface WebcamDeviceWithCustomEvents extends WebcamDevice {
|
||||
|
||||
interface Listener {
|
||||
void customEventReceived(String type, Object event);
|
||||
}
|
||||
|
||||
void addCustomEventsListener(Listener listener);
|
||||
|
||||
boolean removeCustomEventsListener(Listener listener);
|
||||
}
|
|
@ -296,4 +296,15 @@ public class AVFVideoDevice implements WebcamDeviceExtended {
|
|||
final Raster raster = Raster.createRaster(sampleModel, dataBuffer, null);
|
||||
bufferedImage.setData(raster);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addCustomEventsListener(Listener listener) {
|
||||
// NOOP. To be improved with custom events from AVFoundation
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean removeCustomEventsListener(Listener listener) {
|
||||
// NOOP
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -12,6 +12,8 @@ import java.awt.image.*;
|
|||
import java.nio.ByteBuffer;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import javafx.scene.image.PixelFormat;
|
||||
import javafx.scene.image.PixelWriter;
|
||||
import javafx.scene.image.WritableImage;
|
||||
|
@ -40,6 +42,8 @@ public class CaptureManagerFrameGrabberSession {
|
|||
private int bufferSizeBytes = -1;
|
||||
private long lastFrameTimestamp = -1;
|
||||
|
||||
private Consumer<String> customEventListener = (eventType) -> {};
|
||||
|
||||
public boolean init(
|
||||
final CaptureManagerSource source,
|
||||
final CaptureManagerStreamDescriptor stream,
|
||||
|
@ -190,7 +194,11 @@ public class CaptureManagerFrameGrabberSession {
|
|||
session.addUpdateStateListener(new IUpdateStateListener() {
|
||||
@Override
|
||||
public void invoke(int aCallEventCode, int aSessionDescriptor) {
|
||||
LOG.info("invoke with (aCallEventCode, aSessionDescriptor) = ({}, {})", aCallEventCode, aSessionDescriptor);
|
||||
final String eventType = eventCodeToEventName(aCallEventCode);
|
||||
|
||||
LOG.info("IUpdateStateListener invoked with (eventType, aSessionDescriptor) = ({}, {})", eventType, aSessionDescriptor);
|
||||
|
||||
customEventListener.accept("CaptureManagerSDK::" + eventType);
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -199,6 +207,23 @@ public class CaptureManagerFrameGrabberSession {
|
|||
return true;
|
||||
}
|
||||
|
||||
private String eventCodeToEventName(int code) {
|
||||
switch(code) {
|
||||
case 1: return "Error";
|
||||
case 2: return "Status_Error";
|
||||
case 3: return "Execution_Error";
|
||||
case 4: return "ItIsReadyToStart";
|
||||
case 5: return "ItIsStarted";
|
||||
case 6: return "ItIsPaused";
|
||||
case 7: return "ItIsStopped";
|
||||
case 8: return "ItIsEnded";
|
||||
case 9: return "ItIsClosed";
|
||||
case 10: return "VideoCaptureDeviceRemoved";
|
||||
case 11: return "SnapTrigger";
|
||||
default: return "UnknownEvent(" + code + ")";
|
||||
}
|
||||
}
|
||||
|
||||
private SinkValuePart findSinkValuePart(final CaptureManagerSinkFactory sinkFactory, final String name) {
|
||||
return sinkFactory.getValueParts().stream()
|
||||
.filter(s -> name == null || s.getValue().equalsIgnoreCase(name))
|
||||
|
@ -321,6 +346,10 @@ public class CaptureManagerFrameGrabberSession {
|
|||
copyBuffer(target, directBuffer);
|
||||
}
|
||||
|
||||
public void setCustomEventListener(final Consumer<String> customEventListener) {
|
||||
this.customEventListener = customEventListener != null ? customEventListener : (eventType -> {});
|
||||
}
|
||||
|
||||
private static int copyBuffer(ByteBuffer dest, ByteBuffer src) {
|
||||
final int nTransfer = Math.min(dest.remaining(), src.remaining());
|
||||
if (nTransfer > 0) {
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package com.github.eduramiba.webcamcapture.drivers.capturemanager;
|
||||
|
||||
import com.github.eduramiba.webcamcapture.drivers.WebcamDeviceExtended;
|
||||
import com.github.eduramiba.webcamcapture.drivers.WebcamDeviceWithCustomEvents;
|
||||
import com.github.eduramiba.webcamcapture.drivers.capturemanager.model.CaptureManagerMediaType;
|
||||
import com.github.eduramiba.webcamcapture.drivers.capturemanager.model.CaptureManagerSource;
|
||||
import com.github.eduramiba.webcamcapture.drivers.capturemanager.model.CaptureManagerStreamDescriptor;
|
||||
|
@ -26,6 +27,8 @@ public class CaptureManagerVideoDevice implements WebcamDeviceExtended {
|
|||
private final Dimension[] resolutions;
|
||||
private Dimension resolution;
|
||||
|
||||
private final LinkedHashSet<WebcamDeviceWithCustomEvents.Listener> listeners = new LinkedHashSet<>();
|
||||
|
||||
private CaptureManagerFrameGrabberSession session = null;
|
||||
|
||||
public CaptureManagerVideoDevice(CaptureManagerSource source, List<CaptureManagerSinkFactory> sinksFactories) {
|
||||
|
@ -103,6 +106,8 @@ public class CaptureManagerVideoDevice implements WebcamDeviceExtended {
|
|||
|
||||
session = new CaptureManagerFrameGrabberSession();
|
||||
|
||||
session.setCustomEventListener(this::customEventReceived);
|
||||
|
||||
final Pair<CaptureManagerStreamDescriptor, CaptureManagerMediaType> best = findBestMediaTypeInStreams(
|
||||
source.getStreamDescriptors(),
|
||||
resolution
|
||||
|
@ -281,4 +286,20 @@ public class CaptureManagerVideoDevice implements WebcamDeviceExtended {
|
|||
|
||||
return session.toBufferedImage(byteBuffer);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addCustomEventsListener(Listener listener) {
|
||||
listeners.add(listener);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean removeCustomEventsListener(Listener listener) {
|
||||
return listeners.remove(listener);
|
||||
}
|
||||
|
||||
public void customEventReceived(String eventType) {
|
||||
for (Listener l: listeners) {
|
||||
l.customEventReceived(eventType, eventType);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue