/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package webcamstudio.mixers; import java.awt.image.BufferedImage; import static java.awt.image.BufferedImage.TYPE_INT_RGB; import java.awt.image.DataBufferInt; import java.util.ArrayList; import static webcamstudio.mixers.MasterMixer.BUFFER_SIZE; import static webcamstudio.util.Tools.sleep; /** * * @author patrick */ public class ImageBuffer { private final ArrayList<WSImage> buffer = new ArrayList<>(); private int bufferSize = BUFFER_SIZE; private boolean abort = false; private int currentIndex = 0; private long framePushed = 0; private long framePopped = 0; public ImageBuffer(int w,int h){ for (int i = 0;i<bufferSize;i++){ WSImage img = new WSImage(w,h, TYPE_INT_RGB); buffer.add(img); } } public ImageBuffer(int w,int h,int bufferSize){ this.bufferSize=bufferSize; for (int i = 0;i<bufferSize;i++){ WSImage img = new WSImage(w,h, TYPE_INT_RGB); buffer.add(img); } } public void push(BufferedImage img){ while(!abort && (framePushed - framePopped) >= bufferSize){ sleep(30); } currentIndex++; currentIndex %= bufferSize; int[] data = ((DataBufferInt) img.getRaster().getDataBuffer()).getData(); WSImage image = buffer.get(currentIndex); image.setData(data); framePushed++; } public void doneUpdate(){ currentIndex++; currentIndex %= bufferSize; framePushed++; } public WSImage getImageToUpdate(){ while(!abort && (framePushed - framePopped) >= bufferSize){ sleep(30); } return buffer.get((currentIndex+1)%bufferSize); } public WSImage pop(){ while(!abort && framePopped >= framePushed){ sleep(10); } framePopped++; return buffer.get(currentIndex); } public void abort(){ abort=true; currentIndex=0; } public void clear(){ abort=false; currentIndex=0; } }