aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSven Gothel <[email protected]>2020-01-03 02:32:31 +0100
committerSven Gothel <[email protected]>2020-01-03 02:32:31 +0100
commit2be7001101dbb16e5264c9c38b9764ba1e39ab5c (patch)
tree0659fafd9d633c9ffdefff10038517b800dd7f3b
parentcb092e517461b3047c966c38e92668010a3b7ef6 (diff)
Bug 1420: Add FFMpeg 4.* versioned lib-names and provide optional internal lib lookup
New property 'jogl.ffmpeg.lib' may be set to 'internal', setting PREFER_SYSTEM_LIBS:=false (default it true) Non system internal libraries are named 'internal_<basename>', e.g. 'internal_avutil'. System default libraries are named '<basename>', e.g. 'avutil'. If PREFER_SYSTEM_LIBS is true (default), we lookup the default library first, then the versioned library names and last the internal library. If PREFER_SYSTEM_LIBS is false, we lookup the internal library first, then the versioned library names and last the default library.
-rw-r--r--make/scripts/tests.sh17
-rw-r--r--src/jogl/classes/jogamp/opengl/util/av/impl/FFMPEGDynamicLibraryBundleInfo.java179
-rw-r--r--src/jogl/classes/jogamp/opengl/util/av/impl/FFMPEGMediaPlayer.java33
3 files changed, 156 insertions, 73 deletions
diff --git a/make/scripts/tests.sh b/make/scripts/tests.sh
index cbb561e6c..5e9f75361 100644
--- a/make/scripts/tests.sh
+++ b/make/scripts/tests.sh
@@ -355,7 +355,7 @@ function jrun() {
#D_ARGS="-Djogamp.debug.NativeLibrary -Djogamp.debug.NativeLibrary.Lookup -Djogamp.debug.JNILibLoader -Djogl.debug.AudioSink -Djogl.debug.GLMediaPlayer"
#D_ARGS="-Djogamp.debug.NativeLibrary -Djogl.debug.AudioSink"
#D_ARGS="-Djogamp.debug.NativeLibrary -Djogl.debug.AudioSink -Djoal.openal.lib=system"
- #D_ARGS="-Djogl.debug.GLMediaPlayer -Djogl.debug.GLMediaPlayer.Native"
+ D_ARGS="-Djogl.debug.GLMediaPlayer -Djogl.debug.GLMediaPlayer.Native"
#D_ARGS="-Djogl.debug.GLMediaPlayer -Djogl.debug.GLSLCode"
#D_ARGS="-Djogl.debug.GLMediaPlayer.StreamWorker.delay=25 -Djogl.debug.GLMediaPlayer"
#D_ARGS="-Djogl.debug.GLMediaPlayer.Native"
@@ -529,7 +529,7 @@ function testawtswt() {
#
#testnoawt jogamp.opengl.openal.av.ALDummyUsage $*
#testnoawt com.jogamp.opengl.test.junit.jogl.demos.es2.av.MovieCube $*
-#testnoawt com.jogamp.opengl.test.junit.jogl.demos.es2.av.MovieSimple $*
+testnoawt com.jogamp.opengl.test.junit.jogl.demos.es2.av.MovieSimple $*
#testnoawt com.jogamp.opengl.test.junit.jogl.demos.es2.av.CrossFadePlayer $*
#
@@ -955,24 +955,13 @@ function testawtswt() {
#testnoawt com.jogamp.opengl.test.junit.jogl.acore.TestGLReadBuffer01GLWindowNEWT $*
#
-# OSX bugs
-#
-
-#testawt com.jogamp.opengl.test.junit.newt.parenting.TestParentingFocus02SwingAWTRobot $*
-#testawt com.jogamp.opengl.test.junit.newt.parenting.TestParentingFocus03KeyTraversalAWT $*
-
-# test rotation change
-#testnoawt com.jogamp.opengl.test.junit.newt.mm.TestScreenMode02aNEWT
-
-#
# 2.4.0 Regressions
#
# OSX OpenJDK11U
# Always
#testawt com.jogamp.opengl.test.junit.jogl.newt.TestSwingAWTRobotUsageBeforeJOGLInitBug411 $*
-testawt com.jogamp.opengl.test.junit.newt.event.TestNewtEventModifiersNewtCanvasAWT $*
#testawt com.jogamp.opengl.test.junit.newt.event.TestParentingFocus02SwingAWTRobot $*
-# Sometimes
+# Sometimes, might be removed
#testawt com.jogamp.opengl.test.junit.jogl.awt.TestBug572AWT $*
#testawt com.jogamp.opengl.test.junit.jogl.perf.TestPerf001GLJPanelInit02AWT $*
#testawt com.jogamp.opengl.test.junit.newt.event.TestNewtEventModifiersAWTCanvas $*
diff --git a/src/jogl/classes/jogamp/opengl/util/av/impl/FFMPEGDynamicLibraryBundleInfo.java b/src/jogl/classes/jogamp/opengl/util/av/impl/FFMPEGDynamicLibraryBundleInfo.java
index 6a4257ade..e42cc7af9 100644
--- a/src/jogl/classes/jogamp/opengl/util/av/impl/FFMPEGDynamicLibraryBundleInfo.java
+++ b/src/jogl/classes/jogamp/opengl/util/av/impl/FFMPEGDynamicLibraryBundleInfo.java
@@ -252,6 +252,7 @@ class FFMPEGDynamicLibraryBundleInfo implements DynamicLibraryBundleInfo {
static {
// native ffmpeg media player implementation is included in jogl_desktop and jogl_mobile
GLProfile.initSingleton();
+
boolean _ready = false;
/** util, format, codec, avresample, swresample */
final VersionNumber[] _versions = new VersionNumber[5];
@@ -348,97 +349,157 @@ class FFMPEGDynamicLibraryBundleInfo implements DynamicLibraryBundleInfo {
// 6: util, format, codec, device, avresample, swresample
final List<String> avutil = new ArrayList<String>();
- avutil.add("avutil"); // default
-
- avutil.add("libavutil.so.55"); // dummy future proof
+ if( FFMPEGMediaPlayer.PREFER_SYSTEM_LIBS ) {
+ avutil.add("avutil"); // system default
+ } else {
+ avutil.add("internal_avutil"); // internal
+ }
+ avutil.add("libavutil.so.56"); // ffmpeg 4.[0-x] (Debian-10)
+ avutil.add("libavutil.so.55"); //
avutil.add("libavutil.so.54"); // ffmpeg 2.[4-x] / libav 11
avutil.add("libavutil.so.53"); // ffmpeg 2.[0-3] / libav 10
avutil.add("libavutil.so.52"); // ffmpeg 1.2 + 2.[0-3] / libav 9
avutil.add("libavutil.so.51"); // 0.8
avutil.add("libavutil.so.50"); // 0.7
- avutil.add("avutil-55"); // dummy future proof
- avutil.add("avutil-54"); // ffmpeg 2.[4-x] / libav 11
- avutil.add("avutil-53"); // ffmpeg 2.[0-3] / libav 10
- avutil.add("avutil-52"); // ffmpeg 1.2 + 2.[0-3] / libav 9
- avutil.add("avutil-51"); // 0.8
- avutil.add("avutil-50"); // 0.7
+ avutil.add("avutil-56"); // ffmpeg 4.[0-x]
+ avutil.add("avutil-55"); //
+ avutil.add("avutil-54"); // ffmpeg 2.[4-x] / libav 11
+ avutil.add("avutil-53"); // ffmpeg 2.[0-3] / libav 10
+ avutil.add("avutil-52"); // ffmpeg 1.2 + 2.[0-3] / libav 9
+ avutil.add("avutil-51"); // 0.8
+ avutil.add("avutil-50"); // 0.7
+ if( FFMPEGMediaPlayer.PREFER_SYSTEM_LIBS ) {
+ avutil.add("internal_avutil"); // internal
+ } else {
+ avutil.add("avutil"); // system default
+ }
libsList.add(avutil);
final List<String> avformat = new ArrayList<String>();
- avformat.add("avformat"); // default
-
- avformat.add("libavformat.so.57"); // dummy future proof
- avformat.add("libavformat.so.56"); // ffmpeg 2.[4-x] / libav 11
- avformat.add("libavformat.so.55"); // ffmpeg 2.[0-3] / libav 10
- avformat.add("libavformat.so.54"); // ffmpeg 1.2 / libav 9
- avformat.add("libavformat.so.53"); // 0.8
- avformat.add("libavformat.so.52"); // 0.7
-
- avformat.add("avformat-57"); // dummy future proof
- avformat.add("avformat-56"); // ffmpeg 2.[4-x] / libav 11
- avformat.add("avformat-55"); // ffmpeg 2.[0-3] / libav 10
- avformat.add("avformat-54"); // ffmpeg 1.2 / libav 9
- avformat.add("avformat-53"); // 0.8
- avformat.add("avformat-52"); // 0.7
+ if( FFMPEGMediaPlayer.PREFER_SYSTEM_LIBS ) {
+ avformat.add("avformat"); // system default
+ } else {
+ avformat.add("internal_avformat"); // internal
+ }
+ avformat.add("libavformat.so.58"); // ffmpeg 4.[0-x] (Debian-10)
+ avformat.add("libavformat.so.57"); //
+ avformat.add("libavformat.so.56"); // ffmpeg 2.[4-x] / libav 11
+ avformat.add("libavformat.so.55"); // ffmpeg 2.[0-3] / libav 10
+ avformat.add("libavformat.so.54"); // ffmpeg 1.2 / libav 9
+ avformat.add("libavformat.so.53"); // 0.8
+ avformat.add("libavformat.so.52"); // 0.7
+
+ avformat.add("avformat-58"); // ffmpeg 4.[0-x]
+ avformat.add("avformat-57"); //
+ avformat.add("avformat-56"); // ffmpeg 2.[4-x] / libav 11
+ avformat.add("avformat-55"); // ffmpeg 2.[0-3] / libav 10
+ avformat.add("avformat-54"); // ffmpeg 1.2 / libav 9
+ avformat.add("avformat-53"); // 0.8
+ avformat.add("avformat-52"); // 0.7
+ if( FFMPEGMediaPlayer.PREFER_SYSTEM_LIBS ) {
+ avformat.add("internal_avformat"); // internal
+ } else {
+ avformat.add("avformat"); // system default
+ }
libsList.add(avformat);
final List<String> avcodec = new ArrayList<String>();
- avcodec.add("avcodec"); // default
-
- avcodec.add("libavcodec.so.57"); // dummy future proof
- avcodec.add("libavcodec.so.56"); // ffmpeg 2.[4-x] / libav 11
- avcodec.add("libavcodec.so.55"); // ffmpeg 2.[0-3] / libav 10
- avcodec.add("libavcodec.so.54"); // ffmpeg 1.2 / libav 9
- avcodec.add("libavcodec.so.53"); // 0.8
- avcodec.add("libavcodec.so.52"); // 0.7
-
- avcodec.add("avcodec-57"); // dummy future proof
- avcodec.add("avcodec-56"); // ffmpeg 2.[4-x] / libav 11
- avcodec.add("avcodec-55"); // ffmpeg 2.[0-3] / libav 10
- avcodec.add("avcodec-54"); // ffmpeg 1.2 / libav 9
- avcodec.add("avcodec-53"); // 0.8
- avcodec.add("avcodec-52"); // 0.7
+ if( FFMPEGMediaPlayer.PREFER_SYSTEM_LIBS ) {
+ avcodec.add("avcodec"); // system default
+ } else {
+ avcodec.add("internal_avcodec"); // internal
+ }
+ avcodec.add("libavcodec.so.58"); // ffmpeg 4.[0-x] (Debian-10)
+ avcodec.add("libavcodec.so.57"); //
+ avcodec.add("libavcodec.so.56"); // ffmpeg 2.[4-x] / libav 11
+ avcodec.add("libavcodec.so.55"); // ffmpeg 2.[0-3] / libav 10
+ avcodec.add("libavcodec.so.54"); // ffmpeg 1.2 / libav 9
+ avcodec.add("libavcodec.so.53"); // 0.8
+ avcodec.add("libavcodec.so.52"); // 0.7
+
+ avcodec.add("avcodec-58"); // ffmpeg 4.[0-x]
+ avcodec.add("avcodec-57"); //
+ avcodec.add("avcodec-56"); // ffmpeg 2.[4-x] / libav 11
+ avcodec.add("avcodec-55"); // ffmpeg 2.[0-3] / libav 10
+ avcodec.add("avcodec-54"); // ffmpeg 1.2 / libav 9
+ avcodec.add("avcodec-53"); // 0.8
+ avcodec.add("avcodec-52"); // 0.7
+ if( FFMPEGMediaPlayer.PREFER_SYSTEM_LIBS ) {
+ avcodec.add("internal_avcodec"); // internal
+ } else {
+ avcodec.add("avcodec"); // system default
+ }
libsList.add(avcodec);
final List<String> avdevice = new ArrayList<String>();
- avdevice.add("avdevice"); // default
-
- avdevice.add("libavdevice.so.57"); // dummy future proof
+ if( FFMPEGMediaPlayer.PREFER_SYSTEM_LIBS ) {
+ avdevice.add("avdevice"); // system default
+ } else {
+ avdevice.add("internal_avdevice"); // internal
+ }
+ avdevice.add("libavdevice.so.58"); // ffmpeg 4.[0-x] (Debian-10)
+ avdevice.add("libavdevice.so.57"); //
avdevice.add("libavdevice.so.56"); // ffmpeg 2.[4-x]
avdevice.add("libavdevice.so.55"); // ffmpeg 2.[0-3] / libav 11
avdevice.add("libavdevice.so.54"); // ffmpeg 1.2 / libav 10
avdevice.add("libavdevice.so.53"); // 0.8 && libav 9
- avdevice.add("avdevice-57"); // dummy future proof
- avdevice.add("avdevice-56"); // ffmpeg 2.[4-x]
- avdevice.add("avdevice-55"); // ffmpeg 2.[0-3] / libav 11
- avdevice.add("avdevice-54"); // ffmpeg 1.2 / libav 10
- avdevice.add("avdevice-53"); // 0.8 && libav 9
+ avdevice.add("avdevice-58"); // ffmpeg 4.[0-x]
+ avdevice.add("avdevice-57"); //
+ avdevice.add("avdevice-56"); // ffmpeg 2.[4-x]
+ avdevice.add("avdevice-55"); // ffmpeg 2.[0-3] / libav 11
+ avdevice.add("avdevice-54"); // ffmpeg 1.2 / libav 10
+ avdevice.add("avdevice-53"); // 0.8 && libav 9
+ if( FFMPEGMediaPlayer.PREFER_SYSTEM_LIBS ) {
+ avdevice.add("internal_avdevice"); // internal
+ } else {
+ avdevice.add("avdevice"); // system default
+ }
libsList.add(avdevice);
final List<String> avresample = new ArrayList<String>();
- avresample.add("avresample"); // default
-
- avresample.add("libavresample.so.3"); // dummy future proof
+ if( FFMPEGMediaPlayer.PREFER_SYSTEM_LIBS ) {
+ avresample.add("avresample"); // system default
+ } else {
+ avresample.add("internal_avresample");// internal
+ }
+ avresample.add("libavresample.so.4"); // ffmpeg 4.[0-x] (Debian-10)
+ avresample.add("libavresample.so.3"); //
avresample.add("libavresample.so.2"); // libav 11
avresample.add("libavresample.so.1"); // libav 9 + 10
- avresample.add("avresample-3"); // dummy future proof
- avresample.add("avresample-2"); // libav 11
- avresample.add("avresample-1"); // libav 9 + 10
+ avresample.add("avresample-4"); // ffmpeg 4.[0-x]
+ avresample.add("avresample-3"); //
+ avresample.add("avresample-2"); // libav 11
+ avresample.add("avresample-1"); // libav 9 + 10
+ if( FFMPEGMediaPlayer.PREFER_SYSTEM_LIBS ) {
+ avresample.add("internal_avresample");// internal
+ } else {
+ avresample.add("avresample"); // system default
+ }
libsList.add(avresample);
final List<String> swresample = new ArrayList<String>();
- swresample.add("swresample"); // default
-
- swresample.add("libswresample.so.2"); // dummy future proof
+ if( FFMPEGMediaPlayer.PREFER_SYSTEM_LIBS ) {
+ swresample.add("swresample"); // system default
+ } else {
+ swresample.add("internal_swresample");// internal
+ }
+ swresample.add("libswresample.so.3"); // ffmpeg 4.[0-x] (Debian-10)
+ swresample.add("libswresample.so.2"); //
swresample.add("libswresample.so.1"); // ffmpeg 2.[4-x]
swresample.add("libswresample.so.0"); // ffmpeg 1.2 + 2.[0-3]
- swresample.add("swresample-2"); // dummy future proof
- swresample.add("swresample-1"); // ffmpeg 2.[4-x]
- swresample.add("swresample-0"); // ffmpeg 1.2 + 2.[0-3]
+ swresample.add("swresample-3"); // ffmpeg 4.[0-x]
+ swresample.add("swresample-2"); //
+ swresample.add("swresample-1"); // ffmpeg 2.[4-x]
+ swresample.add("swresample-0"); // ffmpeg 1.2 + 2.[0-3]
+ if( FFMPEGMediaPlayer.PREFER_SYSTEM_LIBS ) {
+ swresample.add("internal_swresample");// internal
+ } else {
+ swresample.add("swresample"); // system default
+ }
libsList.add(swresample);
return libsList;
diff --git a/src/jogl/classes/jogamp/opengl/util/av/impl/FFMPEGMediaPlayer.java b/src/jogl/classes/jogamp/opengl/util/av/impl/FFMPEGMediaPlayer.java
index b5cccdb6d..74103fe31 100644
--- a/src/jogl/classes/jogamp/opengl/util/av/impl/FFMPEGMediaPlayer.java
+++ b/src/jogl/classes/jogamp/opengl/util/av/impl/FFMPEGMediaPlayer.java
@@ -38,6 +38,7 @@ import com.jogamp.opengl.GL2ES2;
import com.jogamp.opengl.GLException;
import com.jogamp.common.util.IOUtil;
+import com.jogamp.common.util.PropertyAccess;
import com.jogamp.common.util.VersionNumber;
import com.jogamp.gluegen.runtime.ProcAddressTable;
import com.jogamp.opengl.util.TimeFrameI;
@@ -174,6 +175,34 @@ pkt install pkg:/video/ffmpeg
*/
public class FFMPEGMediaPlayer extends GLMediaPlayerImpl {
+ /**
+ * Defaults to {@code true} for now.
+ * However, in case we ship our own ffmpeg library this may change.
+ * <p>
+ * Property {@code jogl.ffmpeg.lib} set to {@code internal}
+ * will set {@code PREFER_SYSTEM_LIBS} to {@code false}.
+ * </p>
+ * <p>
+ * Non system internal libraries are named 'internal_<basename>',
+ * e.g. 'internal_avutil'.
+ * </p>
+ * <p>
+ * System default libraries are named '<basename>',
+ * e.g. 'avutil'.
+ * </p>
+ * <p>
+ * If {@code PREFER_SYSTEM_LIBS} is {@code true} (default),
+ * we lookup the default library first,
+ * then the versioned library names and last the internal library.
+ * </p>
+ * <p>
+ * If {@code PREFER_SYSTEM_LIBS} is {@code false},
+ * we lookup the internal library first,
+ * then the versioned library names and last the default library.
+ * </p>
+ */
+ /* pp */ static final boolean PREFER_SYSTEM_LIBS;
+
/** POSIX ENOSYS {@value}: Function not implemented. FIXME: Move to GlueGen ?!*/
private static final int ENOSYS = 38;
@@ -189,6 +218,10 @@ public class FFMPEGMediaPlayer extends GLMediaPlayerImpl {
private static final boolean enableSwResample;
static {
+ // PREFER_SYSTEM_LIBS default on all systems is true for now!
+ final String choice = PropertyAccess.getProperty("jogl.ffmpeg.lib", true);
+ PREFER_SYSTEM_LIBS = null == choice || !choice.equals("internal");
+
final boolean libAVGood = FFMPEGDynamicLibraryBundleInfo.initSingleton();
final boolean libAVVersionGood;
if( FFMPEGDynamicLibraryBundleInfo.libsLoaded() ) {