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.StackPane;
|
||||
import javafx.scene.layout.VBox;
|
||||
import javafx.scene.media.MediaView;
|
||||
import javafx.scene.text.Text;
|
||||
import javafx.util.StringConverter;
|
||||
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.TrackDescription;
|
||||
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 {
|
||||
|
||||
@FXML private AnchorPane panePlayer;
|
||||
@FXML private MediaView mediaView;
|
||||
@FXML private ImageView videoImageView;
|
||||
|
||||
@FXML private HBox hBoxTop;
|
||||
|
@ -128,6 +129,7 @@ public class PlayerController {
|
|||
|
||||
private int season = 0;
|
||||
private int episode = 0;
|
||||
|
||||
private boolean mousePressed = false;
|
||||
private boolean showControls = true;
|
||||
private boolean autoplay;
|
||||
|
@ -139,6 +141,10 @@ public class PlayerController {
|
|||
|
||||
private JFXPopup audioPopup;
|
||||
|
||||
// fix wrong buffer resolution
|
||||
private int videoWidth = 0;
|
||||
private int videoHeigth = 0;
|
||||
|
||||
/**
|
||||
* create a new PlayerWindow object
|
||||
* @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;
|
||||
episode = !media.getEpisode().isEmpty() ? Integer.parseInt(media.getEpisode()) : 0;
|
||||
|
||||
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();
|
||||
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);
|
||||
}
|
||||
|
||||
// Start the parsing the media meta data
|
||||
public void start() {
|
||||
embeddedMediaPlayer.media().play(media.getStreamUrl());
|
||||
embeddedMediaPlayer.controls().skipTime((long) startTime); // skipt to the start time
|
||||
// parse meta data
|
||||
embeddedMediaPlayer.media().prepare(media.getStreamUrl());
|
||||
embeddedMediaPlayer.media().parsing().parse();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -433,13 +459,8 @@ public class PlayerController {
|
|||
|
||||
@FXML
|
||||
void btnFullscreenAction(ActionEvent event) {
|
||||
if (player.getStage().isFullScreen()) {
|
||||
player.getStage().setFullScreen(false);
|
||||
fullscreenIcon.setImage(fullscreen);
|
||||
} else {
|
||||
player.getStage().setFullScreen(true);
|
||||
fullscreenIcon.setImage(fullscreenExit);
|
||||
}
|
||||
player.getStage().setFullScreen(!player.getStage().isFullScreen());
|
||||
fullscreenIcon.setImage(player.getStage().isFullScreen() ? fullscreenExit : fullscreen);
|
||||
}
|
||||
|
||||
@FXML
|
||||
|
@ -483,21 +504,20 @@ public class PlayerController {
|
|||
}
|
||||
|
||||
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);
|
||||
|
||||
// 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);
|
||||
videoImageView.setImage(videoImage);
|
||||
}
|
||||
|
@ -506,11 +526,8 @@ public class PlayerController {
|
|||
private class FXRenderCallback implements RenderCallback {
|
||||
|
||||
@Override
|
||||
public void display(uk.co.caprica.vlcj.player.base.MediaPlayer mediaPlayer, ByteBuffer[] nativeBuffers,
|
||||
BufferFormat bufferFormat) {
|
||||
Platform.runLater(() -> {
|
||||
videoPixelBuffer.updateBuffer(pb -> null);
|
||||
});
|
||||
public void display(MediaPlayer mediaPlayer, ByteBuffer[] nativeBuffers, BufferFormat bufferFormat) {
|
||||
Platform.runLater(() -> videoPixelBuffer.updateBuffer(pb -> null));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue