001package com.github.sarxos.webcam.ds.openimaj;
002
003import java.util.ArrayList;
004import java.util.Collections;
005import java.util.List;
006
007import org.openimaj.video.capture.Device;
008import org.openimaj.video.capture.VideoCapture;
009import org.slf4j.Logger;
010import org.slf4j.LoggerFactory;
011
012import com.github.sarxos.webcam.WebcamDevice;
013import com.github.sarxos.webcam.WebcamDriver;
014import com.github.sarxos.webcam.WebcamTask;
015
016
017/**
018 * This is webcam driver for OpenIMAJ library.
019 *
020 * @author Bartosz Firyn (SarXos)
021 */
022public class OpenImajDriver implements WebcamDriver {
023
024        static {
025                if (!"true".equals(System.getProperty("webcam.debug"))) {
026                        System.setProperty("bridj.quiet", "true");
027                }
028        }
029
030        private static final Logger LOG = LoggerFactory.getLogger(OpenImajDriver.class);
031
032        private static class GetDevicesTask extends WebcamTask {
033
034                private volatile List<WebcamDevice> devices = null;
035
036                public GetDevicesTask(WebcamDriver driver) {
037                        super(driver, null);
038                }
039
040                /**
041                 * Return camera devices.
042                 *
043                 * @return Camera devices.
044                 */
045                public List<WebcamDevice> getDevices() {
046                        try {
047                                process();
048                        } catch (InterruptedException e) {
049                                LOG.debug("Interrupted", e);
050                                return Collections.emptyList();
051                        }
052                        return devices;
053                }
054
055                @Override
056                protected void handle() {
057                        devices = new ArrayList<WebcamDevice>();
058                        for (Device device : VideoCapture.getVideoDevices()) {
059                                devices.add(new OpenImajDevice(device));
060                        }
061                }
062        }
063
064        @Override
065        public List<WebcamDevice> getDevices() {
066
067                List<WebcamDevice> devices = new GetDevicesTask(this).getDevices();
068
069                if (LOG.isDebugEnabled()) {
070                        for (WebcamDevice device : devices) {
071                                LOG.debug("OpenIMAJ found device {}", device.getName());
072                        }
073                }
074
075                return devices;
076
077        }
078
079        @Override
080        public boolean isThreadSafe() {
081                return false;
082        }
083
084        @Override
085        public String toString() {
086                return getClass().getSimpleName();
087        }
088}