Warning: session_start(): open(/var/lib/php/sessions/sess_he3ht0t8feoh3g4449l9ddjf6q, O_RDWR) failed: No space left on device (28) in /var/www/tb-usercake/models/config.php on line 51
Warning: session_start(): Failed to read session data: files (path: /var/lib/php/sessions) in /var/www/tb-usercake/models/config.php on line 51
sclass JFFMPEGVideoPlayer is Swingable {
SurfaceShowingAutoZoomedImage imageSurface;
JPanel buttons = rightAlignedLine();
JButton btnPlayPause = jbutton("Pause", r playPause);
ImageStreamFromVideoFile stream;
long playStartTime;
new BoolVar paused;
void init {
imageSurface = swing(-> new SurfaceShowingAutoZoomedImage);
buttons.add(btnPlayPause);
buttons.add(jbutton("Open video...", rThread openDialog));
bindToComponent(imageSurface, null, rThread closeStream);
}
*() { init(); }
*(File videoFile) {
init();
if (videoFile != null)
onFirstShow(imageSurface, rThread { play(videoFile) });
}
visual
centerAndSouth(
imageSurface,
withMargin(buttons)
);
void openDialog swing {
new JFileChooser fc;
fc.setDialogTitle("Open video");
play(execFileChooser(fc));
}
void play(File videoFile) {
if (videoFile == null) ret;
pcall-infobox {
closeStream();
stream = new ImageStreamFromVideoFile;
stream.open(videoFile);
stream.onHaveImage((image, pos) -> {
waitWhileTrue(paused);
if (playStartTime == 0 || playStartTime+pos.toMillis() < sysNow())
playStartTime = sysNow()-pos.toMillis();
else
sleepUntilSysTime(playStartTime+pos.toMillis());
imageSurface.setImage(image);
});
paused.set(false);
stream.startDecodeThread();
}
}
void closeStream {
imageSurface.noImage();
dispose stream;
playStartTime = 0;
}
void playPause() swing {
paused.set(!paused!);
setText(btnPlayPause, paused! ? "Play" : "Pause);
}
}