I try to work out another version of the DirectShow for Processing classes in the last post. In this version, I write the movie data directly to an OpenGL texture object. Below is the modified version of the DMovie class. The DCapture class can also be modified in the same way.
The modified DMovie class
import de.humatic.dsj.*; import java.awt.image.BufferedImage; import com.sun.opengl.util.texture.*; class DMovie implements java.beans.PropertyChangeListener { private DSMovie movie; public int width, height; public Texture tex; DMovie(String _s) { movie = new DSMovie(dataPath(_s), DSFiltergraph.DD7, this); movie.setVolume(1.0); movie.setLoop(false); movie.play(); width = movie.getDisplaySize().width; height = movie.getDisplaySize().height; tex = TextureIO.newTexture(movie.getImage(), false); } public void updateImage() { BufferedImage bimg = movie.getImage(); TextureData td = TextureIO.newTextureData(bimg, false); tex.updateImage(td); } public void loop() { movie.setLoop(true); movie.play(); } public void play() { movie.play(); } public void propertyChange(java.beans.PropertyChangeEvent e) { switch (DSJUtils.getEventType(e)) { } } } |
Sample code that uses the new DMovie class
import processing.opengl.*; import javax.media.opengl.*; DMovie mov; PGraphicsOpenGL pgl; void setup() { size(1280, 692, OPENGL); pgl = (PGraphicsOpenGL) g; GL gl = pgl.beginGL(); background(0); mov = new DMovie("Hugo.mp4"); mov.loop(); mov.tex.bind(); pgl.endGL(); ; } void draw() { GL gl = pgl.beginGL(); mov.updateImage(); mov.tex.enable(); gl.glBegin(GL.GL_QUADS); gl.glTexCoord2f(0, 0); gl.glVertex2f(0, 0); gl.glTexCoord2f(1, 0); gl.glVertex2f(width, 0); gl.glTexCoord2f(1, 1); gl.glVertex2f(width, height); gl.glTexCoord2f(0, 1); gl.glVertex2f(0, height); gl.glEnd(); mov.tex.disable(); pgl.endGL(); } |