import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.github.sarxos.webcam.Webcam;
import com.github.sarxos.webcam.WebcamEvent;
import com.github.sarxos.webcam.WebcamListener;
import com.github.sarxos.webcam.WebcamUpdater;
public class WebcamCache implements WebcamUpdater.DelayCalculator, WebcamListener {
private static final Logger LOG = LoggerFactory.getLogger(WebcamCache.class);
/**
* How often images are updated on Dasding server.
*/
private static final long DELAY = 10000;
/**
* Webcams list.
*/
private Map<String, Webcam> webcams = new HashMap<String, Webcam>();
/**
* WebSocket handlers.
*/
private List<WebcamWebSocketHandler> handlers = new ArrayList<WebcamWebSocketHandler>();
/**
* Static instance to make access easier.
*/
private static final WebcamCache CACHE = new WebcamCache();
public WebcamCache() {
for (Webcam webcam : Webcam.getWebcams()) {
webcam.addWebcamListener(this);
webcam.open(true, this);
webcams.put(webcam.getName(), webcam);
}
}
@Override
public long calculateDelay(long snapshotDuration, double deviceFps) {
return Math.max(DELAY - snapshotDuration, 0);
}
public static BufferedImage getImage(String name) {
Webcam webcam = CACHE.webcams.get(name);
try {
return webcam.getImage();
} catch (Exception e) {
LOG.error("Exception when getting image from webcam", e);
}
return null;
}
public static List<String> getWebcamNames() {
return new ArrayList<String>(CACHE.webcams.keySet());
}
@Override
public void webcamOpen(WebcamEvent we) {
// do nothing
}
@Override
public void webcamClosed(WebcamEvent we) {
// do nothing
}
@Override
public void webcamDisposed(WebcamEvent we) {
// do nothing
}
@Override
public void webcamImageObtained(WebcamEvent we) {
for (WebcamWebSocketHandler handler : handlers) {
handler.newImage(we.getSource(), we.getImage());
}
}
public static void subscribe(WebcamWebSocketHandler handler) {
CACHE.handlers.add(handler);
}
public static void unsubscribe(WebcamWebSocketHandler handler) {
CACHE.handlers.remove(handler);
}
}