diff --git a/pom.xml b/pom.xml index a47d870..83b0abe 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ io.github.eduramiba webcam-capture-driver-native - 1.0.0 + 1.0.1 4.0.0 jar diff --git a/src/main/java/com/github/eduramiba/webcamcapture/drivers/WebcamDeviceExtended.java b/src/main/java/com/github/eduramiba/webcamcapture/drivers/WebcamDeviceExtended.java index b07bf23..2b02ca1 100644 --- a/src/main/java/com/github/eduramiba/webcamcapture/drivers/WebcamDeviceExtended.java +++ b/src/main/java/com/github/eduramiba/webcamcapture/drivers/WebcamDeviceExtended.java @@ -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 { } \ No newline at end of file diff --git a/src/main/java/com/github/eduramiba/webcamcapture/drivers/WebcamDeviceWithCustomEvents.java b/src/main/java/com/github/eduramiba/webcamcapture/drivers/WebcamDeviceWithCustomEvents.java new file mode 100644 index 0000000..f94d4ba --- /dev/null +++ b/src/main/java/com/github/eduramiba/webcamcapture/drivers/WebcamDeviceWithCustomEvents.java @@ -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); +} diff --git a/src/main/java/com/github/eduramiba/webcamcapture/drivers/avfoundation/driver/AVFVideoDevice.java b/src/main/java/com/github/eduramiba/webcamcapture/drivers/avfoundation/driver/AVFVideoDevice.java index c7b0320..b0209a7 100644 --- a/src/main/java/com/github/eduramiba/webcamcapture/drivers/avfoundation/driver/AVFVideoDevice.java +++ b/src/main/java/com/github/eduramiba/webcamcapture/drivers/avfoundation/driver/AVFVideoDevice.java @@ -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; + } } diff --git a/src/main/java/com/github/eduramiba/webcamcapture/drivers/capturemanager/CaptureManagerFrameGrabberSession.java b/src/main/java/com/github/eduramiba/webcamcapture/drivers/capturemanager/CaptureManagerFrameGrabberSession.java index 1a5ad76..18da135 100644 --- a/src/main/java/com/github/eduramiba/webcamcapture/drivers/capturemanager/CaptureManagerFrameGrabberSession.java +++ b/src/main/java/com/github/eduramiba/webcamcapture/drivers/capturemanager/CaptureManagerFrameGrabberSession.java @@ -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 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 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) { diff --git a/src/main/java/com/github/eduramiba/webcamcapture/drivers/capturemanager/CaptureManagerVideoDevice.java b/src/main/java/com/github/eduramiba/webcamcapture/drivers/capturemanager/CaptureManagerVideoDevice.java index 8a9b76a..b7b96a8 100644 --- a/src/main/java/com/github/eduramiba/webcamcapture/drivers/capturemanager/CaptureManagerVideoDevice.java +++ b/src/main/java/com/github/eduramiba/webcamcapture/drivers/capturemanager/CaptureManagerVideoDevice.java @@ -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 listeners = new LinkedHashSet<>(); + private CaptureManagerFrameGrabberSession session = null; public CaptureManagerVideoDevice(CaptureManagerSource source, List sinksFactories) { @@ -103,6 +106,8 @@ public class CaptureManagerVideoDevice implements WebcamDeviceExtended { session = new CaptureManagerFrameGrabberSession(); + session.setCustomEventListener(this::customEventReceived); + final Pair 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); + } + } }