package org.myrobotlab.opencv;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.FrameGrabber;
import org.myrobotlab.logging.LoggerFactory;
import org.myrobotlab.logging.Logging;
import org.slf4j.Logger;
/**
* @author GroG
*
* A pipeline frame grabber can attach to another OpenCV's output and
* perform its own processing. They can be stacked creating much more
* complex image pipelines.
*
*/
public class PipelineFrameGrabber extends FrameGrabber {
public final static Logger log = LoggerFactory.getLogger(PipelineFrameGrabber.class.getCanonicalName());
transient BlockingQueue<Frame> blockingData;
String sourceKey = "";
public PipelineFrameGrabber(BlockingQueue<Frame> queue) {
blockingData = queue;
}
public PipelineFrameGrabber(int cameraIndex) {
}
public PipelineFrameGrabber(String sourceKey) {
log.info("attaching video feed to {}");
this.sourceKey = sourceKey;
}
public void add(Frame image) {
blockingData.add(image);
}
@Override
public Frame grab() {
try {
// added non blocking allowing thread to terminate
Frame image = blockingData.poll(1000, TimeUnit.MILLISECONDS);
return image;
} catch (InterruptedException e) {
Logging.logError(e);
return null;
}
}
@Override
public void release() throws Exception {
}
public void setQueue(BlockingQueue<Frame> queue) {
blockingData = queue;
}
@Override
public void start() {
if (blockingData == null) {
blockingData = new LinkedBlockingQueue<Frame>();
}
}
@Override
public void stop() {
}
@Override
public void trigger() throws Exception {
}
}