X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=src%2Fkaka%2Fcakelight%2FFrameGrabber.java;h=dbf620a217c2b72270ba3a45b9544b3ec4afbef4;hb=e9e4a88732e23b350bb8d2a98a662cbca850cd47;hp=d228b7bc189faa2f17859f12c6f226e13cb4d470;hpb=e59e98fcf77a104e31dd97641b0ceea6d0a79e00;p=kaka%2Fcakelight.git diff --git a/src/kaka/cakelight/FrameGrabber.java b/src/kaka/cakelight/FrameGrabber.java index d228b7b..dbf620a 100644 --- a/src/kaka/cakelight/FrameGrabber.java +++ b/src/kaka/cakelight/FrameGrabber.java @@ -1,8 +1,11 @@ package kaka.cakelight; import java.io.*; +import java.util.Optional; -public class FrameGrabber { +import static kaka.cakelight.Main.log; + +public class FrameGrabber implements Closeable { private Configuration config; private File file; private int bytesPerFrame; @@ -11,42 +14,44 @@ public class FrameGrabber { private FrameGrabber() { } - public static FrameGrabber from(Configuration config) { + public static FrameGrabber from(File videoDevice, Configuration config) { FrameGrabber fg = new FrameGrabber(); fg.config = config; - fg.file = new File(config.video.device); + fg.file = videoDevice; fg.bytesPerFrame = config.video.width * config.video.height * config.video.bpp; + fg.prepare(); return fg; } - public boolean prepare() { + private boolean prepare() { try { fileStream = new FileInputStream(file); return true; } catch (FileNotFoundException e) { + // TODO: handle java.io.FileNotFoundException: /dev/video1 (Permission denied) e.printStackTrace(); return false; } } - public Frame grabFrame() { + /** + * Must be run in the same thread as {@link #prepare}. + */ + public Optional grabFrame() { try { byte[] data = new byte[bytesPerFrame]; int count = fileStream.read(data); - System.out.println("count = " + count); - return Frame.of(data, config); + log("# of bytes read = " + count); + return Optional.of(Frame.of(data, config)); } catch (IOException e) { e.printStackTrace(); } - return null; + return Optional.empty(); } - public void close() { - try { - fileStream.close(); - } catch (IOException e) { - e.printStackTrace(); - } + @Override + public void close() throws IOException { + fileStream.close(); } }