package main; import java.io.File; import java.nio.IntBuffer; import static org.lwjgl.opengl.GL11.*; import static org.lwjgl.opengl.GL12.GL_CLAMP_TO_EDGE; import org.gstreamer.Gst; import org.gstreamer.State; import org.gstreamer.elements.PlayBin2; import org.gstreamer.elements.RGBDataSink; import org.lwjgl.opengl.Display; public class GStreamer_TestPlayer { private int WIDTH, HEIGHT; private int texture; private IntBuffer buffer = null; private long before, msLength; private boolean done = false; private PlayBin2 playbin; public GStreamer_TestPlayer(int _w, int _h, String strToPlay, long _msLength) { WIDTH = _w; HEIGHT = _h; msLength = _msLength; texture = glGenTextures(); glBindTexture(GL_TEXTURE_2D, texture); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, WIDTH, HEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, (IntBuffer)null); //Gstreamer stuff try { LibraryLoaderImpl.getInstance().load(); } catch (Exception e){e.printStackTrace();} Gst.init("VideoPlayer", null); playbin = new PlayBin2("VideoPlayer"); RGBListener listener = new RGBListener(); playbin.setInputFile(new File(strToPlay)); RGBDataSink sink = new RGBDataSink(("sink"), listener); sink.setPassDirectBuffer(true); playbin.setVideoSink(sink); Gst.getExecutor().execute(new Runnable() { public void run() { // playbin.setState(State.PLAYING) playbin.play(); } }); before = System.currentTimeMillis(); } public boolean isDone() { return done; } public void update() { float scaleFactor = 1.0f; if (Display.getWidth() >= Display.getHeight()) { scaleFactor = (float)Display.getHeight()/(float)HEIGHT; } else { scaleFactor = (float)Display.getWidth()/(float)WIDTH; } glClear(GL_COLOR_BUFFER_BIT); glBindTexture(GL_TEXTURE_2D, texture); if(buffer != null){ glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, WIDTH, HEIGHT, GL_RGBA, GL_UNSIGNED_BYTE, buffer); } float x1, x2, y1, y2; y1 = (Display.getHeight()-(HEIGHT*scaleFactor))/2.0f; y2 = y1 + HEIGHT*scaleFactor; x1 = (Display.getWidth()-(WIDTH*scaleFactor))/2.0f; x2 = x1 + WIDTH*scaleFactor; glBegin(GL_QUADS); { glTexCoord2f(0, 0); glVertex2f(x1, y1); glTexCoord2f(1, 0); glVertex2f(x2, y1); glTexCoord2f(1, 1); glVertex2f(x2, y2); glTexCoord2f(0, 1); glVertex2f(x1, y2); } glEnd(); if (System.currentTimeMillis() >= before+msLength) { done = true; } } public void destroy() { } private class RGBListener implements RGBDataSink.Listener { public void rgbFrame(boolean preroll, int width, int height, IntBuffer rgb) { buffer = rgb; } } }