/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package webcamstudio.streams; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.net.URL; import webcamstudio.components.GifDecoder; import webcamstudio.mixers.Frame; import webcamstudio.mixers.MasterFrameBuilder; import webcamstudio.mixers.PreviewFrameBuilder; import webcamstudio.util.Tools; /** * * @author patrick */ public class SourceImageGif extends Stream { BufferedImage image = null; boolean playing = false; boolean stop = true; Frame frame = null; GifDecoder decoder = new GifDecoder(); int index = 0; public SourceImageGif(File img) { super(); file = img; name = img.getName(); } public SourceImageGif(String name, URL url) { this.url = url.toString(); this.name = name; } private void loadImage() throws IOException { if (file != null) { decoder.read(file.toURI().toURL().openStream()); } else if (url != null) { decoder.read(new URL(url).openStream()); } image = new BufferedImage(decoder.getImage().getWidth(), decoder.getImage().getHeight(), BufferedImage.TYPE_4BYTE_ABGR); new Thread(new Runnable() { @Override public void run() { updateImage(); } }).start(); } private void updateImage() { if (decoder != null) { while (!stop) { index++; if (index >= decoder.getFrameCount()) { index = 0; } Tools.sleep(decoder.getDelay(index)); } } } @Override public void read() { playing=true; stop = false; try { loadImage(); frame = new Frame(uuid, image, null); frame.setOutputFormat(x, y, width, height, opacity, volume); frame.setZOrder(zorder); if (getPreView()){ PreviewFrameBuilder.register(this); } else { MasterFrameBuilder.register(this); } } catch (IOException e) { e.printStackTrace(); } } @Override public void pause() { // nothing here. } @Override public void stop() { playing=false; stop = true; if (getPreView()){ PreviewFrameBuilder.unregister(this); } else { MasterFrameBuilder.unregister(this); } } @Override public boolean needSeek() { return needSeekCTRL=false; } @Override public Frame getFrame() { return nextFrame; } @Override public boolean isPlaying() { return playing; } @Override public void setIsPlaying(boolean setIsPlaying) { playing = setIsPlaying; } @Override public BufferedImage getPreview() { return image; } @Override public boolean hasAudio() { return false; } @Override public boolean hasVideo() { return true; } @Override public void readNext() { image = decoder.getFrame(index); frame = new Frame(uuid, image, null); if (frame != null) { frame.setOutputFormat(x, y, width, height, opacity, volume); frame.setZOrder(zorder); } nextFrame=frame; } @Override public void play() { // nothing Here. } }