package kellerkinder.HomeFlix.player; import java.nio.ByteBuffer; import javafx.application.Platform; import javafx.scene.Scene; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.image.PixelBuffer; import javafx.scene.image.PixelFormat; import javafx.scene.image.WritableImage; import javafx.scene.layout.StackPane; import javafx.stage.Stage; import kellerkinder.HomeFlix.application.Main; import uk.co.caprica.vlcj.factory.MediaPlayerFactory; import uk.co.caprica.vlcj.player.base.MediaPlayer; import uk.co.caprica.vlcj.player.embedded.EmbeddedMediaPlayer; import uk.co.caprica.vlcj.player.embedded.videosurface.CallbackVideoSurface; import uk.co.caprica.vlcj.player.embedded.videosurface.VideoSurfaceAdapters; import uk.co.caprica.vlcj.player.embedded.videosurface.callback.BufferFormat; import uk.co.caprica.vlcj.player.embedded.videosurface.callback.BufferFormatCallback; import uk.co.caprica.vlcj.player.embedded.videosurface.callback.RenderCallback; import uk.co.caprica.vlcj.player.embedded.videosurface.callback.format.RV32BufferFormat; public class NewMediaPlayer { private MediaPlayerFactory mediaPlayerFactory; private EmbeddedMediaPlayer embeddedMediaPlayer; private WritableImage videoImage; private PixelBuffer videoPixelBuffer; private ImageView videoImageView; private Stage stage; private StackPane pane; private Scene scene; public NewMediaPlayer() { mediaPlayerFactory = new MediaPlayerFactory(); embeddedMediaPlayer = mediaPlayerFactory.mediaPlayers().newEmbeddedMediaPlayer(); embeddedMediaPlayer.videoSurface().set(new FXCallbackVideoSurface()); } public void init() { // Auto-generated method stub stage = new Stage(); pane = new StackPane(); scene = new Scene(pane); videoImageView = new ImageView(); videoImageView.setPreserveRatio(true); videoImageView.fitWidthProperty().bind(pane.widthProperty()); videoImageView.fitHeightProperty().bind(pane.heightProperty()); pane.getChildren().add(videoImageView); stage.setScene(scene); stage.setTitle("HomeFlix"); stage.getIcons().add(new Image(Main.class.getResourceAsStream("/icons/Homeflix_Icon_64x64.png"))); stage.setOnCloseRequest(event -> { //DBController.getInstance().setCurrentTime(streamURL, playerController.getCurrentTime()); //playerController.getMediaPlayer().stop(); stop(); stage.close(); }); stage.show(); } public void play(String streamURL) { embeddedMediaPlayer.media().play(streamURL); } public void stop() { embeddedMediaPlayer.controls().stop(); embeddedMediaPlayer.release(); mediaPlayerFactory.release(); System.out.println("released"); } private class FXCallbackVideoSurface extends CallbackVideoSurface { FXCallbackVideoSurface() { super(new FXBufferFormatCallback(), new FXRenderCallback(), true, VideoSurfaceAdapters.getVideoSurfaceAdapter()); } } private class FXBufferFormatCallback implements BufferFormatCallback { private int sourceWidth; private int sourceHeight; @Override public BufferFormat getBufferFormat(int sourceWidth, int sourceHeight) { this.sourceWidth = sourceWidth; this.sourceHeight = sourceHeight; return new RV32BufferFormat(sourceWidth, sourceHeight); } @Override public void allocatedBuffers(ByteBuffer[] buffers) { assert buffers[0].capacity() == sourceWidth * sourceHeight * 4; PixelFormat pixelFormat = PixelFormat.getByteBgraPreInstance(); videoPixelBuffer = new PixelBuffer<>(sourceWidth, sourceHeight, buffers[0], pixelFormat); videoImage = new WritableImage(videoPixelBuffer); videoImageView.setImage(videoImage); } } private class FXRenderCallback implements RenderCallback { @Override public void display(MediaPlayer mediaPlayer, ByteBuffer[] nativeBuffers, BufferFormat bufferFormat) { Platform.runLater(() -> { videoPixelBuffer.updateBuffer(pb -> null); }); } } }