!include once #1025007 // JCodec static int framesFromVideo_bufferSize = 7; static bool framesFromVideo_verbose; static IterableIterator framesFromVideo_reordering(File video) ctex { final int bufferSize = framesFromVideo_bufferSize; final bool verbose = framesFromVideo_verbose; final FileChannelWrapper ch = NIOUtils.readableChannel(video); final AWTFrameGrab8Bit grab = AWTFrameGrab8Bit.createAWTFrameGrab8Bit(ch); ret iteratorFromFunction(new O { new TreeMap reorderBuffer; bool done; void grab ctex { if (verbose) print("Grabbing (" + l(reorderBuffer) + ")"); PictureWithMetadata8Bit pmd = grab.getNativeFrameWithMetadata(); if (pmd == null) { done = true; NIOUtils.closeQuietly(ch); } else { BufferedImage img = AWTUtil.toBufferedImage8Bit(pmd.getPicture()); reorderBuffer.put(pmd.getTimestamp(), img); } } O get() { while (!done && l(reorderBuffer) < bufferSize) grab(); if (done || reorderBuffer.size() >= bufferSize) { if (empty(reorderBuffer)) null; double leastPts = firstKey(reorderBuffer); BufferedImage img = reorderBuffer.get(leastPts); reorderBuffer.remove(leastPts); if (verbose) print("Giving (" + l(reorderBuffer) + ")"); ret img; } null; } }); // TODO: close file when not all frames are grabbed }