fix player resolution mismatch
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
This commit is contained in:
parent
fb390e3169
commit
e29bcc5da3
|
@ -60,10 +60,12 @@ import javafx.scene.layout.AnchorPane;
|
||||||
import javafx.scene.layout.HBox;
|
import javafx.scene.layout.HBox;
|
||||||
import javafx.scene.layout.StackPane;
|
import javafx.scene.layout.StackPane;
|
||||||
import javafx.scene.layout.VBox;
|
import javafx.scene.layout.VBox;
|
||||||
import javafx.scene.media.MediaView;
|
|
||||||
import javafx.scene.text.Text;
|
import javafx.scene.text.Text;
|
||||||
import javafx.util.StringConverter;
|
import javafx.util.StringConverter;
|
||||||
import uk.co.caprica.vlcj.factory.MediaPlayerFactory;
|
import uk.co.caprica.vlcj.factory.MediaPlayerFactory;
|
||||||
|
import uk.co.caprica.vlcj.media.Media;
|
||||||
|
import uk.co.caprica.vlcj.media.MediaEventAdapter;
|
||||||
|
import uk.co.caprica.vlcj.media.MediaParsedStatus;
|
||||||
import uk.co.caprica.vlcj.player.base.MediaPlayer;
|
import uk.co.caprica.vlcj.player.base.MediaPlayer;
|
||||||
import uk.co.caprica.vlcj.player.base.TrackDescription;
|
import uk.co.caprica.vlcj.player.base.TrackDescription;
|
||||||
import uk.co.caprica.vlcj.player.embedded.EmbeddedMediaPlayer;
|
import uk.co.caprica.vlcj.player.embedded.EmbeddedMediaPlayer;
|
||||||
|
@ -86,7 +88,6 @@ import uk.co.caprica.vlcj.player.embedded.videosurface.callback.format.RV32Buffe
|
||||||
public class PlayerController {
|
public class PlayerController {
|
||||||
|
|
||||||
@FXML private AnchorPane panePlayer;
|
@FXML private AnchorPane panePlayer;
|
||||||
@FXML private MediaView mediaView;
|
|
||||||
@FXML private ImageView videoImageView;
|
@FXML private ImageView videoImageView;
|
||||||
|
|
||||||
@FXML private HBox hBoxTop;
|
@FXML private HBox hBoxTop;
|
||||||
|
@ -128,6 +129,7 @@ public class PlayerController {
|
||||||
|
|
||||||
private int season = 0;
|
private int season = 0;
|
||||||
private int episode = 0;
|
private int episode = 0;
|
||||||
|
|
||||||
private boolean mousePressed = false;
|
private boolean mousePressed = false;
|
||||||
private boolean showControls = true;
|
private boolean showControls = true;
|
||||||
private boolean autoplay;
|
private boolean autoplay;
|
||||||
|
@ -139,6 +141,10 @@ public class PlayerController {
|
||||||
|
|
||||||
private JFXPopup audioPopup;
|
private JFXPopup audioPopup;
|
||||||
|
|
||||||
|
// fix wrong buffer resolution
|
||||||
|
private int videoWidth = 0;
|
||||||
|
private int videoHeigth = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* create a new PlayerWindow object
|
* create a new PlayerWindow object
|
||||||
* @param player the player object (needed for closing action)
|
* @param player the player object (needed for closing action)
|
||||||
|
@ -165,7 +171,12 @@ public class PlayerController {
|
||||||
season = !media.getSeason().isEmpty() ? Integer.parseInt(media.getSeason()) : 0;
|
season = !media.getSeason().isEmpty() ? Integer.parseInt(media.getSeason()) : 0;
|
||||||
episode = !media.getEpisode().isEmpty() ? Integer.parseInt(media.getEpisode()) : 0;
|
episode = !media.getEpisode().isEmpty() ? Integer.parseInt(media.getEpisode()) : 0;
|
||||||
|
|
||||||
lblTitle.setText(media.getTitle());
|
if (episode > 0) {
|
||||||
|
// if the media is a TV show, add season + episode to the title
|
||||||
|
lblTitle.setText(media.getTitle() + " S" + season + ":E" + episode);
|
||||||
|
} else {
|
||||||
|
lblTitle.setText(media.getTitle());
|
||||||
|
}
|
||||||
|
|
||||||
initPlayerWindow();
|
initPlayerWindow();
|
||||||
initMediaPlayer();
|
initMediaPlayer();
|
||||||
|
@ -247,6 +258,19 @@ public class PlayerController {
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
embeddedMediaPlayer.events().addMediaEventListener(new MediaEventAdapter() {
|
||||||
|
@Override
|
||||||
|
public void mediaParsedChanged(Media media, MediaParsedStatus newStatus) {
|
||||||
|
super.mediaParsedChanged(media, newStatus);
|
||||||
|
videoWidth = embeddedMediaPlayer.video().videoDimension().width;
|
||||||
|
videoHeigth= embeddedMediaPlayer.video().videoDimension().height;
|
||||||
|
|
||||||
|
// start the video
|
||||||
|
embeddedMediaPlayer.media().play(media.newMediaRef());
|
||||||
|
embeddedMediaPlayer.controls().skipTime((long) startTime); // skip to the start time
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -317,9 +341,11 @@ public class PlayerController {
|
||||||
// animatedThumb.getChildren().add(iv);
|
// animatedThumb.getChildren().add(iv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Start the parsing the media meta data
|
||||||
public void start() {
|
public void start() {
|
||||||
embeddedMediaPlayer.media().play(media.getStreamUrl());
|
// parse meta data
|
||||||
embeddedMediaPlayer.controls().skipTime((long) startTime); // skipt to the start time
|
embeddedMediaPlayer.media().prepare(media.getStreamUrl());
|
||||||
|
embeddedMediaPlayer.media().parsing().parse();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -433,13 +459,8 @@ public class PlayerController {
|
||||||
|
|
||||||
@FXML
|
@FXML
|
||||||
void btnFullscreenAction(ActionEvent event) {
|
void btnFullscreenAction(ActionEvent event) {
|
||||||
if (player.getStage().isFullScreen()) {
|
player.getStage().setFullScreen(!player.getStage().isFullScreen());
|
||||||
player.getStage().setFullScreen(false);
|
fullscreenIcon.setImage(player.getStage().isFullScreen() ? fullscreenExit : fullscreen);
|
||||||
fullscreenIcon.setImage(fullscreen);
|
|
||||||
} else {
|
|
||||||
player.getStage().setFullScreen(true);
|
|
||||||
fullscreenIcon.setImage(fullscreenExit);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@FXML
|
@FXML
|
||||||
|
@ -483,21 +504,20 @@ public class PlayerController {
|
||||||
}
|
}
|
||||||
|
|
||||||
private class FXBufferFormatCallback implements BufferFormatCallback {
|
private class FXBufferFormatCallback implements BufferFormatCallback {
|
||||||
private int sourceWidth;
|
|
||||||
private int sourceHeight;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BufferFormat getBufferFormat(int sourceWidth, int sourceHeight) {
|
public BufferFormat getBufferFormat(int sourceWidth, int sourceHeight) {
|
||||||
this.sourceWidth = sourceWidth;
|
|
||||||
this.sourceHeight = sourceHeight;
|
|
||||||
return new RV32BufferFormat(sourceWidth, sourceHeight);
|
return new RV32BufferFormat(sourceWidth, sourceHeight);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void allocatedBuffers(ByteBuffer[] buffers) {
|
public void allocatedBuffers(ByteBuffer[] buffers) {
|
||||||
assert buffers[0].capacity() == sourceWidth * sourceHeight * 4;
|
|
||||||
PixelFormat<ByteBuffer> pixelFormat = PixelFormat.getByteBgraPreInstance();
|
PixelFormat<ByteBuffer> pixelFormat = PixelFormat.getByteBgraPreInstance();
|
||||||
videoPixelBuffer = new PixelBuffer<>(sourceWidth, sourceHeight, buffers[0], pixelFormat);
|
|
||||||
|
// fixes buffer resolution, video resolution mismatch
|
||||||
|
videoPixelBuffer = new PixelBuffer<>(videoWidth, videoHeigth, buffers[0], pixelFormat);
|
||||||
|
//videoPixelBuffer = new PixelBuffer<>(sourceWidth, sourceHeight, buffers[0], pixelFormat);
|
||||||
|
|
||||||
videoImage = new WritableImage(videoPixelBuffer);
|
videoImage = new WritableImage(videoPixelBuffer);
|
||||||
videoImageView.setImage(videoImage);
|
videoImageView.setImage(videoImage);
|
||||||
}
|
}
|
||||||
|
@ -506,11 +526,8 @@ public class PlayerController {
|
||||||
private class FXRenderCallback implements RenderCallback {
|
private class FXRenderCallback implements RenderCallback {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void display(uk.co.caprica.vlcj.player.base.MediaPlayer mediaPlayer, ByteBuffer[] nativeBuffers,
|
public void display(MediaPlayer mediaPlayer, ByteBuffer[] nativeBuffers, BufferFormat bufferFormat) {
|
||||||
BufferFormat bufferFormat) {
|
Platform.runLater(() -> videoPixelBuffer.updateBuffer(pb -> null));
|
||||||
Platform.runLater(() -> {
|
|
||||||
videoPixelBuffer.updateBuffer(pb -> null);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue