Browse Source
* openjfx 12.0.2 -> 14 * log4j 2.13.0 -> 2.13.1 * maven-shade-plugin 3.2.1 -> 3.2.2dev
7 changed files with 460 additions and 75 deletions
@ -0,0 +1,172 @@
|
||||
/** |
||||
* Project-HomeFlix |
||||
* |
||||
* Copyright 2016-2020 <seil0@mosad.xyz> |
||||
* |
||||
* This program is free software; you can redistribute it and/or modify |
||||
* it under the terms of the GNU General Public License as published by |
||||
* the Free Software Foundation; either version 3 of the License, or |
||||
* (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program; if not, write to the Free Software |
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, |
||||
* MA 02110-1301, USA. |
||||
* |
||||
*/ |
||||
|
||||
package kellerkinder.HomeFlix.player; |
||||
|
||||
import uk.co.caprica.vlcj.media.MediaRef; |
||||
import uk.co.caprica.vlcj.media.TrackType; |
||||
import uk.co.caprica.vlcj.player.base.MediaPlayer; |
||||
import uk.co.caprica.vlcj.player.base.MediaPlayerEventListener; |
||||
|
||||
public class HFMediaPlayerEventListener implements MediaPlayerEventListener { |
||||
|
||||
@Override |
||||
public void mediaChanged(MediaPlayer mediaPlayer, MediaRef media) { |
||||
// Auto-generated method stub
|
||||
} |
||||
|
||||
@Override |
||||
public void opening(MediaPlayer mediaPlayer) { |
||||
// Auto-generated method stub
|
||||
} |
||||
|
||||
@Override |
||||
public void buffering(MediaPlayer mediaPlayer, float newCache) { |
||||
// Auto-generated method stub
|
||||
} |
||||
|
||||
@Override |
||||
public void playing(MediaPlayer mediaPlayer) { |
||||
// Auto-generated method stub
|
||||
} |
||||
|
||||
@Override |
||||
public void paused(MediaPlayer mediaPlayer) { |
||||
// Auto-generated method stub
|
||||
} |
||||
|
||||
@Override |
||||
public void stopped(MediaPlayer mediaPlayer) { |
||||
// Auto-generated method stub
|
||||
} |
||||
|
||||
@Override |
||||
public void forward(MediaPlayer mediaPlayer) { |
||||
// Auto-generated method stub
|
||||
} |
||||
|
||||
@Override |
||||
public void backward(MediaPlayer mediaPlayer) { |
||||
// Auto-generated method stub
|
||||
} |
||||
|
||||
@Override |
||||
public void finished(MediaPlayer mediaPlayer) { |
||||
// Auto-generated method stub
|
||||
} |
||||
|
||||
@Override |
||||
public void timeChanged(MediaPlayer mediaPlayer, long newTime) { |
||||
// Auto-generated method stub
|
||||
} |
||||
|
||||
@Override |
||||
public void positionChanged(MediaPlayer mediaPlayer, float newPosition) { |
||||
// Auto-generated method stub
|
||||
} |
||||
|
||||
@Override |
||||
public void seekableChanged(MediaPlayer mediaPlayer, int newSeekable) { |
||||
// Auto-generated method stub
|
||||
} |
||||
|
||||
@Override |
||||
public void pausableChanged(MediaPlayer mediaPlayer, int newPausable) { |
||||
// Auto-generated method stub
|
||||
} |
||||
|
||||
@Override |
||||
public void titleChanged(MediaPlayer mediaPlayer, int newTitle) { |
||||
// Auto-generated method stub
|
||||
} |
||||
|
||||
@Override |
||||
public void snapshotTaken(MediaPlayer mediaPlayer, String filename) { |
||||
// Auto-generated method stub
|
||||
} |
||||
|
||||
@Override |
||||
public void lengthChanged(MediaPlayer mediaPlayer, long newLength) { |
||||
// Auto-generated method stub
|
||||
} |
||||
|
||||
@Override |
||||
public void videoOutput(MediaPlayer mediaPlayer, int newCount) { |
||||
// Auto-generated method stub
|
||||
} |
||||
|
||||
@Override |
||||
public void scrambledChanged(MediaPlayer mediaPlayer, int newScrambled) { |
||||
// Auto-generated method stub
|
||||
} |
||||
|
||||
@Override |
||||
public void elementaryStreamAdded(MediaPlayer mediaPlayer, TrackType type, int id) { |
||||
// Auto-generated method stub
|
||||
} |
||||
|
||||
@Override |
||||
public void elementaryStreamDeleted(MediaPlayer mediaPlayer, TrackType type, int id) { |
||||
// Auto-generated method stub
|
||||
} |
||||
|
||||
@Override |
||||
public void elementaryStreamSelected(MediaPlayer mediaPlayer, TrackType type, int id) { |
||||
// Auto-generated method stub
|
||||
} |
||||
|
||||
@Override |
||||
public void corked(MediaPlayer mediaPlayer, boolean corked) { |
||||
// Auto-generated method stub
|
||||
} |
||||
|
||||
@Override |
||||
public void muted(MediaPlayer mediaPlayer, boolean muted) { |
||||
// Auto-generated method stub
|
||||
} |
||||
|
||||
@Override |
||||
public void volumeChanged(MediaPlayer mediaPlayer, float volume) { |
||||
// Auto-generated method stub
|
||||
} |
||||
|
||||
@Override |
||||
public void audioDeviceChanged(MediaPlayer mediaPlayer, String audioDevice) { |
||||
// Auto-generated method stub
|
||||
} |
||||
|
||||
@Override |
||||
public void chapterChanged(MediaPlayer mediaPlayer, int newChapter) { |
||||
// Auto-generated method stub
|
||||
} |
||||
|
||||
@Override |
||||
public void error(MediaPlayer mediaPlayer) { |
||||
// Auto-generated method stub
|
||||
} |
||||
|
||||
@Override |
||||
public void mediaPlayerReady(MediaPlayer mediaPlayer) { |
||||
// Auto-generated method stub
|
||||
} |
||||
|
||||
} |
@ -0,0 +1,115 @@
|
||||
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<ByteBuffer> 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<ByteBuffer> 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); |
||||
}); |
||||
} |
||||
} |
||||
|
||||
} |
Loading…
Reference in new issue