package org.myrobotlab.opencv;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.FrameGrabber;
import org.bytedeco.javacv.Java2DFrameConverter;
import org.myrobotlab.logging.LoggerFactory;
import org.slf4j.Logger;
import net.sf.jipcam.axis.MjpegInputStream;
public class MJpegFrameGrabber extends FrameGrabber {
transient public final static Logger log = LoggerFactory.getLogger(MJpegFrameGrabber.class);
private URL url;
private MjpegInputStream mStream;
transient private Java2DFrameConverter converter = new Java2DFrameConverter();
public MJpegFrameGrabber(String uri) {
super();
try {
url = new URL(uri);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void start() throws Exception {
try {
mStream = new MjpegInputStream(url.openStream());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return;
}
log.info("MJPEG Stream Open {}", url.toString());
}
@Override
public void stop() throws Exception {
log.info("Framegrabber stop called");
try {
mStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return;
}
}
@Override
public void trigger() throws Exception {
log.info("Framegrabber tigger called");
}
@Override
public Frame grab() throws Exception {
BufferedImage img;
try {
img = (BufferedImage)(mStream.readMjpegFrame().getImage());
// Frame frame = converter.getFrame(img, 1.0, true);
Frame frame = converter.getFrame(img);
return frame;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
@Override
public void release() throws Exception {
// should we close here? or somewhere else?
log.info("Framegrabber release called");
try {
mStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}