aboutsummaryrefslogtreecommitdiffstats
path: root/src/jogl/classes/jogamp/opengl/util/av/impl/FFMPEGDynamicLibraryBundleInfo.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/jogl/classes/jogamp/opengl/util/av/impl/FFMPEGDynamicLibraryBundleInfo.java')
-rw-r--r--src/jogl/classes/jogamp/opengl/util/av/impl/FFMPEGDynamicLibraryBundleInfo.java219
1 files changed, 219 insertions, 0 deletions
diff --git a/src/jogl/classes/jogamp/opengl/util/av/impl/FFMPEGDynamicLibraryBundleInfo.java b/src/jogl/classes/jogamp/opengl/util/av/impl/FFMPEGDynamicLibraryBundleInfo.java
new file mode 100644
index 000000000..4c4870545
--- /dev/null
+++ b/src/jogl/classes/jogamp/opengl/util/av/impl/FFMPEGDynamicLibraryBundleInfo.java
@@ -0,0 +1,219 @@
+/**
+ * Copyright 2012 JogAmp Community. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of JogAmp Community.
+ */
+
+package jogamp.opengl.util.av.impl;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import javax.media.opengl.GLProfile;
+
+import com.jogamp.common.os.DynamicLibraryBundle;
+import com.jogamp.common.os.DynamicLibraryBundleInfo;
+import com.jogamp.common.util.RunnableExecutor;
+
+class FFMPEGDynamicLibraryBundleInfo implements DynamicLibraryBundleInfo {
+ private static List<String> glueLibNames = new ArrayList<String>(); // none
+
+ private static final int symbolCount = 29;
+ private static String[] symbolNames = {
+ "avcodec_version",
+ "avformat_version",
+/* 3 */ "avutil_version",
+
+ // libavcodec
+ "avcodec_close",
+ "avcodec_string",
+ "avcodec_find_decoder",
+ "avcodec_open2", // 53.6.0 (opt)
+ "avcodec_open",
+ "avcodec_alloc_frame",
+ "avcodec_default_get_buffer",
+ "avcodec_default_release_buffer",
+ "av_free_packet",
+ "avcodec_decode_audio4", // 53.25.0 (opt)
+ "avcodec_decode_audio3", // 52.23.0
+/* 15 */ "avcodec_decode_video2", // 52.23.0
+
+ // libavutil
+ "av_pix_fmt_descriptors",
+ "av_free",
+/* 18 */ "av_get_bits_per_pixel",
+
+ // libavformat
+ "avformat_close_input", // 53.17.0 (opt)
+ "av_close_input_file",
+ "av_register_all",
+ "avformat_open_input",
+ "av_dump_format",
+ "av_read_frame",
+ "av_seek_frame",
+ "avformat_network_init", // 53.13.0 (opt)
+ "avformat_network_deinit", // 53.13.0 (opt)
+ "avformat_find_stream_info", // 53.3.0 (opt)
+/* 29 */ "av_find_stream_info"
+ };
+
+ private static String[] optionalSymbolNames = {
+ "avcodec_open2", // 53.6.0 (opt)
+ "avcodec_decode_audio4", // 53.25.0 (opt)
+ "avformat_close_input", // 53.17.0 (opt)
+ "avformat_network_init", // 53.13.0 (opt)
+ "avformat_network_deinit", // 53.13.0 (opt)
+ "avformat_find_stream_info" // 53.3.0 (opt)
+ };
+
+ private static long[] symbolAddr;
+ private static final boolean ready;
+
+ static {
+ // native ffmpeg media player implementation is included in jogl_desktop and jogl_mobile
+ GLProfile.initSingleton();
+ boolean _ready = false;
+ try {
+ _ready = initSymbols();
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ ready = _ready;
+ if(!ready) {
+ System.err.println("FFMPEG: Not Available");
+ }
+ }
+
+ static boolean initSingleton() { return ready; }
+
+ private static boolean initSymbols() {
+ final DynamicLibraryBundle dl = new DynamicLibraryBundle(new FFMPEGDynamicLibraryBundleInfo());
+ final boolean avutilLoaded = dl.isToolLibLoaded(0);
+ final boolean avformatLoaded = dl.isToolLibLoaded(1);
+ final boolean avcodecLoaded = dl.isToolLibLoaded(2);
+ if(!avutilLoaded || !avformatLoaded || !avcodecLoaded) {
+ throw new RuntimeException("FFMPEG Tool library incomplete: [ avutil "+avutilLoaded+", avformat "+avformatLoaded+", avcodec "+avcodecLoaded+"]");
+ }
+ if(!dl.isToolLibComplete()) {
+ throw new RuntimeException("FFMPEG Tool libraries incomplete");
+ }
+ symbolAddr = new long[symbolCount];
+
+ final Set<String> optionalSet = new HashSet<String>();
+ optionalSet.addAll(Arrays.asList(optionalSymbolNames));
+
+ if(!lookupSymbols(dl, symbolNames, optionalSet, symbolAddr, symbolCount)) {
+ return false;
+ }
+ return initSymbols0(symbolAddr, symbolAddr.length);
+ }
+
+ private static boolean lookupSymbols(DynamicLibraryBundle dl,
+ String[] symbols, Set<String> optionalSymbols,
+ long[] addresses, int symbolCount) {
+ for(int i = 0; i<symbolCount; i++) {
+ final long addr = dl.dynamicLookupFunction(symbols[i]);
+ if( 0 == addr ) {
+ if(!optionalSymbols.contains(symbols[i])) {
+ System.err.println("Could not resolve mandatory symbol <"+symbols[i]+">");
+ return false;
+ } else if(true || DEBUG ) { // keep it verbose per default for now ..
+ System.err.println("Could not resolve optional symbol <"+symbols[i]+">");
+ }
+ }
+ addresses[i] = addr;
+ }
+ return true;
+ }
+
+ protected FFMPEGDynamicLibraryBundleInfo() {
+ }
+
+ @Override
+ public boolean shallLinkGlobal() { return true; }
+
+ @Override
+ public boolean shallLookupGlobal() { return true; }
+
+ @Override
+ public final List<String> getGlueLibNames() {
+ return glueLibNames;
+ }
+
+ @Override
+ public List<List<String>> getToolLibNames() {
+ List<List<String>> libsList = new ArrayList<List<String>>();
+
+ final List<String> avutil = new ArrayList<String>();
+ avutil.add("avutil"); // default
+ avutil.add("avutil-52"); // dummy future proof
+ avutil.add("avutil-51"); // 0.8
+ avutil.add("avutil-50"); // 0.7
+ libsList.add(avutil);
+
+ final List<String> avformat = new ArrayList<String>();
+ avformat.add("avformat"); // default
+ avformat.add("avformat-55"); // dummy future proof
+ avformat.add("avformat-54"); // 0.?
+ avformat.add("avformat-53"); // 0.8
+ avformat.add("avformat-52"); // 0.7
+ libsList.add(avformat);
+
+ final List<String> avcodec = new ArrayList<String>();
+ avcodec.add("avcodec"); // default
+ avcodec.add("avcodec-55"); // dummy future proof
+ avcodec.add("avcodec-54"); // 0.?
+ avcodec.add("avcodec-53"); // 0.8
+ avcodec.add("avcodec-52"); // 0.7
+ libsList.add(avcodec);
+
+ return libsList;
+ }
+
+ @Override
+ public final List<String> getToolGetProcAddressFuncNameList() {
+ return null;
+ }
+
+ @Override
+ public final long toolGetProcAddress(long toolGetProcAddressHandle, String funcName) {
+ return 0;
+ }
+
+ @Override
+ public boolean useToolGetProcAdressFirst(String funcName) {
+ return false;
+ }
+
+ @Override
+ public RunnableExecutor getLibLoaderExecutor() {
+ return DynamicLibraryBundle.getDefaultRunnableExecutor();
+ }
+
+ private static native boolean initSymbols0(long[] symbols, int count);
+}