From 3003cc3f24c77106317b0ead95dda71162a8c2b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Mon, 5 Dec 2022 20:14:10 +0100 Subject: [PATCH] Read VLC path from registry --- .../flash/configuration/Configuration.java | 7 +- .../flash/tags/DefineVideoStreamTag.java | 2 +- .../com/jpexs/video/SimpleMediaPlayer.java | 118 +++++++++++------- .../com/sun/jna/platform/win32/Advapi32.java | 2 + .../sun/jna/platform/win32/Advapi32Util.java | 0 .../com/sun/jna/platform/win32/W32Errors.java | 0 .../jna/platform/win32/Win32Exception.java | 0 .../com/sun/jna/platform/win32/WinBase.java | 0 .../com/sun/jna/platform/win32/WinNT.java | 0 .../com/sun/jna/platform/win32/WinReg.java | 0 .../jpexs/decompiler/flash/gui/MainPanel.java | 3 +- .../locales/AdvancedSettingsDialog.properties | 5 - 12 files changed, 77 insertions(+), 60 deletions(-) rename {src => libsrc/ffdec_lib/src}/com/sun/jna/platform/win32/Advapi32.java (99%) rename {src => libsrc/ffdec_lib/src}/com/sun/jna/platform/win32/Advapi32Util.java (100%) rename {src => libsrc/ffdec_lib/src}/com/sun/jna/platform/win32/W32Errors.java (100%) rename {src => libsrc/ffdec_lib/src}/com/sun/jna/platform/win32/Win32Exception.java (100%) rename {src => libsrc/ffdec_lib/src}/com/sun/jna/platform/win32/WinBase.java (100%) rename {src => libsrc/ffdec_lib/src}/com/sun/jna/platform/win32/WinNT.java (100%) rename {src => libsrc/ffdec_lib/src}/com/sun/jna/platform/win32/WinReg.java (100%) diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/configuration/Configuration.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/configuration/Configuration.java index 65e0f6d80..a75af835f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/configuration/Configuration.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/configuration/Configuration.java @@ -816,12 +816,7 @@ public final class Configuration { @ConfigurationDefaultDouble(1.0) @ConfigurationCategory("display") @ConfigurationName("gui.scale") - public static ConfigurationItem uiScale = null; - - @ConfigurationDefaultString("") - @ConfigurationCategory("paths") - @ConfigurationDirectory - public static ConfigurationItem vlcPlayerLocation = null; + public static ConfigurationItem uiScale = null; private enum OSId { WINDOWS, OSX, UNIX diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineVideoStreamTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineVideoStreamTag.java index 3e3406d47..da913f9c7 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineVideoStreamTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineVideoStreamTag.java @@ -252,7 +252,7 @@ public class DefineVideoStreamTag extends DrawableTag implements BoundedTag, Tim @Override public synchronized void toImage(int frame, int time, int ratio, RenderContext renderContext, SerializableImage image, SerializableImage fullImage, boolean isClip, Matrix transformation, Matrix prevTransformation, Matrix absoluteTransformation, Matrix fullTransformation, ColorTransform colorTransform, double unzoom, boolean sameImage, ExportRectangle viewRect, boolean scaleStrokes, int drawMode, int blendMode) { - if (!Configuration.vlcPlayerLocation.hasValue() || !new File(Configuration.vlcPlayerLocation.get()).exists()) { + if (!SimpleMediaPlayer.isAvailable()) { Graphics2D g = (Graphics2D) image.getBufferedImage().getGraphics(); Matrix mat = transformation; AffineTransform trans = mat.preConcatenate(Matrix.getScaleInstance(1 / SWF.unitDivisor)).toTransform(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/video/SimpleMediaPlayer.java b/libsrc/ffdec_lib/src/com/jpexs/video/SimpleMediaPlayer.java index a7aea887d..7248ed6f3 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/video/SimpleMediaPlayer.java +++ b/libsrc/ffdec_lib/src/com/jpexs/video/SimpleMediaPlayer.java @@ -7,6 +7,9 @@ import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.List; import com.sun.jna.NativeLibrary; +import com.sun.jna.Platform; +import com.sun.jna.platform.win32.Advapi32Util; +import com.sun.jna.platform.win32.WinReg; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; @@ -33,6 +36,7 @@ import uk.co.caprica.vlcj.player.embedded.videosurface.callback.format.RV32Buffe import uk.co.caprica.vlcj.player.list.MediaListPlayer; import uk.co.caprica.vlcj.player.list.MediaListPlayerEventAdapter; import uk.co.caprica.vlcj.player.list.PlaybackMode; +import uk.co.caprica.vlcj.support.version.LibVlcVersion; public class SimpleMediaPlayer { @@ -51,17 +55,50 @@ public class SimpleMediaPlayer { private boolean positionSet = false; private boolean loaded = false; - + private boolean finished = false; private boolean singleFrame = false; private final Object displayLock = new Object(); - + private String file; - - private MyRenderCallback callback; - + + private MyRenderCallback callback; + + private static boolean available = true; + + static { + if (Platform.isWindows()) { + final String VLC_REGISTRY_KEY = "SOFTWARE\\VideoLAN\\VLC"; + if (Advapi32Util.registryKeyExists(WinReg.HKEY_LOCAL_MACHINE, VLC_REGISTRY_KEY)) { + if (Advapi32Util.registryValueExists(WinReg.HKEY_LOCAL_MACHINE, VLC_REGISTRY_KEY, "InstallDir")) { + String vlcInstallDir = Advapi32Util.registryGetStringValue(WinReg.HKEY_LOCAL_MACHINE, VLC_REGISTRY_KEY, "InstallDir"); + NativeLibrary.addSearchPath("libvlc", vlcInstallDir); + } else { + available = false; + } + } else { + available = false; + } + } + + if (available) { + try { + LibVlcVersion version = new LibVlcVersion(); + if (!version.isSupported()) { + available = false; + } + } catch (UnsatisfiedLinkError err) { + available = false; + } + } + } + + public static boolean isAvailable() { + return available; + } + public long getLength() { return length; } @@ -78,7 +115,7 @@ public class SimpleMediaPlayer { loaded = false; this.file = file; //embeddedMediaPlayer.media().play(file); //.play(file); - + MediaList mediaList = mediaPlayerFactory.media().newMediaList(); mediaList.media().add(file); @@ -93,7 +130,7 @@ public class SimpleMediaPlayer { public void stop() { embeddedMediaPlayer.controls().stop(); - } + } public void setPosition(float position) { synchronized (displayLock) { @@ -101,22 +138,21 @@ public class SimpleMediaPlayer { positionSet = true; singleFrame = true; } - //System.out.println("setting position: "+ position); - if (!isPaused()) { - embeddedMediaPlayer.controls().pause(); - } - embeddedMediaPlayer.controls().setPosition(position); - //embeddedMediaPlayer.controls().nextFrame(); - setPaused(false); - embeddedMediaPlayer.controls().play(); - /*if (paused) { + //System.out.println("setting position: "+ position); + if (!isPaused()) { + embeddedMediaPlayer.controls().pause(); + } + embeddedMediaPlayer.controls().setPosition(position); + //embeddedMediaPlayer.controls().nextFrame(); + setPaused(false); + embeddedMediaPlayer.controls().play(); + /*if (paused) { try { displayLock.wait(); } catch (InterruptedException ex) { Logger.getLogger(SimpleMediaPlayer.class.getName()).log(Level.SEVERE, null, ex); } }*/ - //embeddedMediaPlayer.controls().play(); } @@ -124,11 +160,11 @@ public class SimpleMediaPlayer { public synchronized boolean isPaused() { return paused; } - + public synchronized void setPaused(boolean val) { this.paused = val; } - + /*public void rewind() { System.out.println("rewinding"); //embeddedMediaPlayer.controls().stop(); @@ -140,7 +176,6 @@ public class SimpleMediaPlayer { //embeddedMediaPlayer.controls().play(); System.out.println("rewound"); }*/ - public SimpleMediaPlayer() { BufferFormatCallback bufferFormatCallback = new BufferFormatCallback() { @@ -158,15 +193,14 @@ public class SimpleMediaPlayer { callback = new MyRenderCallback(listeners); CallbackVideoSurface callbackVideoSurface = new CallbackVideoSurface(bufferFormatCallback, callback, false, VideoSurfaceAdapters.getVideoSurfaceAdapter()); - - NativeLibrary.addSearchPath("libvlc", Configuration.vlcPlayerLocation.get()); + mediaPlayerFactory = new MediaPlayerFactory(); embeddedMediaPlayer = mediaPlayerFactory.mediaPlayers().newEmbeddedMediaPlayer(); callbackVideoSurface.attach(embeddedMediaPlayer); embeddedMediaPlayer.videoSurface().set(callbackVideoSurface); - embeddedMediaPlayer.videoSurface().attachVideoSurface(); - + embeddedMediaPlayer.videoSurface().attachVideoSurface(); + embeddedMediaPlayer.events().addMediaPlayerEventListener(new MediaPlayerEventAdapter() { @Override public void lengthChanged(uk.co.caprica.vlcj.player.base.MediaPlayer mediaPlayer, long newLength) { @@ -185,7 +219,7 @@ public class SimpleMediaPlayer { } @Override - public void finished(MediaPlayer mediaPlayer) { + public void finished(MediaPlayer mediaPlayer) { /*System.out.println("finished"); finished = true; callback.sendImage(); @@ -199,20 +233,17 @@ public class SimpleMediaPlayer { System.out.println("/finished"); } }.start();*/ - } - + } @Override public void stopped(MediaPlayer mediaPlayer) { //System.out.println("stopped"); - } + } @Override public void paused(MediaPlayer mediaPlayer) { setPaused(true); } - - @Override public void playing(uk.co.caprica.vlcj.player.base.MediaPlayer mediaPlayer) { @@ -221,7 +252,7 @@ public class SimpleMediaPlayer { embeddedMediaPlayer.controls().setPosition(position); } else { embeddedMediaPlayer.controls().setPosition(((float) time) / length); - } + } } //System.out.println("playing"); finished = false; @@ -241,8 +272,6 @@ public class SimpleMediaPlayer { }); mediaListPlayer.mediaPlayer().setMediaPlayer(embeddedMediaPlayer); - - mediaListPlayer.controls().setMode(PlaybackMode.LOOP); } @@ -251,8 +280,6 @@ public class SimpleMediaPlayer { return finished; } - - private class MyRenderCallback implements RenderCallback { private List videoSurfaces; @@ -264,23 +291,21 @@ public class SimpleMediaPlayer { public BufferedImage getImage() { return image; } - + public void sendImage() { for (FrameListener fl : videoSurfaces) { fl.newFrameRecieved(this.image); } } - - public MyRenderCallback(List listeners) { this.videoSurfaces = listeners; } @Override - public void display(uk.co.caprica.vlcj.player.base.MediaPlayer mediaPlayer, ByteBuffer[] nativeBuffers, BufferFormat bufferFormat) { - synchronized (displayLock) { - if (singleFrame) { + public void display(uk.co.caprica.vlcj.player.base.MediaPlayer mediaPlayer, ByteBuffer[] nativeBuffers, BufferFormat bufferFormat) { + synchronized (displayLock) { + if (singleFrame) { singleFrame = false; if (image == null) { this.width = bufferFormat.getWidth(); @@ -291,10 +316,9 @@ public class SimpleMediaPlayer { nativeBuffers[0].asIntBuffer().get(rgbBuffer, 0, bufferFormat.getHeight() * bufferFormat.getWidth()); image.setRGB(0, 0, image.getWidth(), image.getHeight(), rgbBuffer, 0, image.getWidth()); - - - } - + + } + if (!loaded) { loaded = true; //System.out.println("just loaded"); @@ -303,12 +327,12 @@ public class SimpleMediaPlayer { } else { embeddedMediaPlayer.controls().setPosition(((float) time) / length); } - } + } } if (!isPaused()) { embeddedMediaPlayer.controls().pause(); } - sendImage(); + sendImage(); //System.out.println("display return"); } } diff --git a/src/com/sun/jna/platform/win32/Advapi32.java b/libsrc/ffdec_lib/src/com/sun/jna/platform/win32/Advapi32.java similarity index 99% rename from src/com/sun/jna/platform/win32/Advapi32.java rename to libsrc/ffdec_lib/src/com/sun/jna/platform/win32/Advapi32.java index 526fe0da7..c53d94687 100644 --- a/src/com/sun/jna/platform/win32/Advapi32.java +++ b/libsrc/ffdec_lib/src/com/sun/jna/platform/win32/Advapi32.java @@ -35,7 +35,9 @@ package com.sun.jna.platform.win32; import com.sun.jna.Native; import com.sun.jna.Pointer; import com.sun.jna.Structure; +import com.sun.jna.platform.win32.WinBase; import com.sun.jna.platform.win32.WinBase.SECURITY_ATTRIBUTES; +import com.sun.jna.platform.win32.WinNT; import com.sun.jna.platform.win32.WinNT.HANDLE; import com.sun.jna.platform.win32.WinNT.HANDLEByReference; import com.sun.jna.platform.win32.WinReg.HKEY; diff --git a/src/com/sun/jna/platform/win32/Advapi32Util.java b/libsrc/ffdec_lib/src/com/sun/jna/platform/win32/Advapi32Util.java similarity index 100% rename from src/com/sun/jna/platform/win32/Advapi32Util.java rename to libsrc/ffdec_lib/src/com/sun/jna/platform/win32/Advapi32Util.java diff --git a/src/com/sun/jna/platform/win32/W32Errors.java b/libsrc/ffdec_lib/src/com/sun/jna/platform/win32/W32Errors.java similarity index 100% rename from src/com/sun/jna/platform/win32/W32Errors.java rename to libsrc/ffdec_lib/src/com/sun/jna/platform/win32/W32Errors.java diff --git a/src/com/sun/jna/platform/win32/Win32Exception.java b/libsrc/ffdec_lib/src/com/sun/jna/platform/win32/Win32Exception.java similarity index 100% rename from src/com/sun/jna/platform/win32/Win32Exception.java rename to libsrc/ffdec_lib/src/com/sun/jna/platform/win32/Win32Exception.java diff --git a/src/com/sun/jna/platform/win32/WinBase.java b/libsrc/ffdec_lib/src/com/sun/jna/platform/win32/WinBase.java similarity index 100% rename from src/com/sun/jna/platform/win32/WinBase.java rename to libsrc/ffdec_lib/src/com/sun/jna/platform/win32/WinBase.java diff --git a/src/com/sun/jna/platform/win32/WinNT.java b/libsrc/ffdec_lib/src/com/sun/jna/platform/win32/WinNT.java similarity index 100% rename from src/com/sun/jna/platform/win32/WinNT.java rename to libsrc/ffdec_lib/src/com/sun/jna/platform/win32/WinNT.java diff --git a/src/com/sun/jna/platform/win32/WinReg.java b/libsrc/ffdec_lib/src/com/sun/jna/platform/win32/WinReg.java similarity index 100% rename from src/com/sun/jna/platform/win32/WinReg.java rename to libsrc/ffdec_lib/src/com/sun/jna/platform/win32/WinReg.java diff --git a/src/com/jpexs/decompiler/flash/gui/MainPanel.java b/src/com/jpexs/decompiler/flash/gui/MainPanel.java index f82a57347..03ff8c348 100644 --- a/src/com/jpexs/decompiler/flash/gui/MainPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/MainPanel.java @@ -198,6 +198,7 @@ import com.jpexs.helpers.Path; import com.jpexs.helpers.ProgressListener; import com.jpexs.helpers.Reference; import com.jpexs.helpers.SerializableImage; +import com.jpexs.video.SimpleMediaPlayer; import java.awt.BorderLayout; import java.awt.CardLayout; import java.awt.Color; @@ -4610,7 +4611,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se } boolean internalViewer = !isAdobeFlashPlayerEnabled(); - boolean isVideoButNotDrawable = (treeItem instanceof DefineVideoStreamTag) && (!Configuration.vlcPlayerLocation.hasValue() || !new File(Configuration.vlcPlayerLocation.get()).exists()); + boolean isVideoButNotDrawable = (treeItem instanceof DefineVideoStreamTag) && (!SimpleMediaPlayer.isAvailable()); if (treeItem instanceof SWF) { SWF swf = (SWF) treeItem; diff --git a/src/com/jpexs/decompiler/flash/gui/locales/AdvancedSettingsDialog.properties b/src/com/jpexs/decompiler/flash/gui/locales/AdvancedSettingsDialog.properties index fd00bb7c3..fd9bb5cbf 100644 --- a/src/com/jpexs/decompiler/flash/gui/locales/AdvancedSettingsDialog.properties +++ b/src/com/jpexs/decompiler/flash/gui/locales/AdvancedSettingsDialog.properties @@ -623,8 +623,3 @@ config.description.flattenASPackages = Make one item per package instead of pack config.name.gui.scale = UI scale factor config.description.gui.scale = Scaling factor of graphics interface. Set this to 2.0 on Mac retina displays. Application true exit (not just restart after asking) is required. - - -config.name.vlcPlayerLocation = 7) VLC Player directory location -config.description.vlcPlayerLocation = VLC player directory location. It is used for video tags playback. -