PageRenderTime 53ms CodeModel.GetById 26ms RepoModel.GetById 0ms app.codeStats 0ms

/spectrometry_kit/libraries/GSVideo/src/codeanticode/gsvideo/GSLibraryLoader.java

https://github.com/samn/spectral-workbench
Java | 263 lines | 196 code | 41 blank | 26 comment | 15 complexity | 1e90db8e111932154b6f08994e9117ce MD5 | raw file
  1. /**
  2. * Part of the GSVideo library: http://gsvideo.sourceforge.net/
  3. * Copyright (c) 2008-11 Andres Colubri
  4. *
  5. * This library is free software; you can redistribute it and/or
  6. * modify it under the terms of the GNU Lesser General Public
  7. * License as published by the Free Software Foundation, version 2.1.
  8. *
  9. * This library is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  12. * Lesser General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU Lesser General
  15. * Public License along with this library; if not, write to the
  16. * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
  17. * Boston, MA 02111-1307 USA
  18. */
  19. package codeanticode.gsvideo;
  20. import java.util.HashMap;
  21. import java.util.Map;
  22. import com.sun.jna.Library;
  23. import com.sun.jna.Native;
  24. import com.sun.jna.Platform;
  25. // Library loader class by Tal Shalif
  26. public class GSLibraryLoader {
  27. public interface DummyLibrary extends Library {
  28. }
  29. private static GSLibraryLoader instance;
  30. // These dependencies correspond to gstreamer-winbuilds 0.10.6
  31. static final Object[][] WIN32_DEPENDENCIES = {
  32. { "SDL", new String[] {}, false }, { "glew32", new String[] {}, false },
  33. { "iconv-2", new String[] {}, false },
  34. { "liba52-0", new String[] {}, false },
  35. { "libbz2", new String[] {}, false },
  36. { "libcairo-2", new String[] {}, false },
  37. { "libdca-0", new String[] {}, false },
  38. { "libdvdcss-2", new String[] {}, false },
  39. { "libdvdnav-4", new String[] {}, false },
  40. { "libdvdnavmini-4", new String[] {}, false },
  41. { "libdvdread-4", new String[] {}, false },
  42. { "libfaac-0", new String[] {}, false },
  43. { "libfaad-2", new String[] {}, false },
  44. { "libfontconfig-1", new String[] {}, false },
  45. { "libfreetype-6", new String[] {}, false },
  46. { "libgcrypt-11", new String[] {}, false },
  47. { "libgnutls-26", new String[] {}, false },
  48. { "libgnutls-extra-26", new String[] {}, false },
  49. { "libgnutls-openssl-26", new String[] {}, false },
  50. { "libgpg-error-0", new String[] {}, false },
  51. { "libid3tag-0", new String[] {}, false },
  52. { "libjpeg-8", new String[] {}, false },
  53. { "libmad-0", new String[] {}, false },
  54. { "libmms-0", new String[] {}, false },
  55. { "libmp3lame-0", new String[] {}, false },
  56. { "libmpeg2-0", new String[] {}, false },
  57. { "libmpeg2convert-0", new String[] {}, false },
  58. { "libneon-27", new String[] {}, false },
  59. { "libnice-0", new String[] {}, false },
  60. { "libogg-0", new String[] {}, false },
  61. { "liboil-0.3-0", new String[] {}, false },
  62. { "libopenjpeg-2", new String[] {}, false },
  63. { "libpango-1.0-0", new String[] {}, false },
  64. { "libpangocairo-1.0-0", new String[] {}, false },
  65. { "libpangoft2-1.0-0", new String[] {}, false },
  66. { "libpangowin32-1.0-0", new String[] {}, false },
  67. { "libpixman-1-0", new String[] {}, true },
  68. { "libpng14-14", new String[] {}, false },
  69. { "liborc-0.4-0", new String[] {}, false },
  70. { "libschroedinger-1.0-0", new String[] {}, false },
  71. { "libsoup-2.4-1", new String[] {}, false },
  72. { "libspeex-1", new String[] {}, false },
  73. { "libtheora-0", new String[] {}, false },
  74. { "libtheoradec-1", new String[] {}, false },
  75. { "libtheoraenc-1", new String[] {}, false },
  76. { "libvorbis-0", new String[] {}, false },
  77. { "libvorbisenc-2", new String[] {}, false },
  78. { "libvorbisfile-3", new String[] {}, false },
  79. { "libwavpack-1", new String[] {}, false },
  80. { "libx264-107", new String[] {}, false },
  81. { "libxml2-2", new String[] {}, false },
  82. { "pthreadGC2", new String[] {}, false },
  83. { "xvidcore", new String[] {}, false },
  84. { "z", new String[] {}, false },
  85. { "avutil-gpl-50", new String[] {}, false },
  86. { "avformat-gpl-52", new String[] {}, false },
  87. { "avcodec-gpl-52", new String[] {}, false },
  88. { "swscale-gpl-0", new String[] {}, false },
  89. { "libcelt-0", new String[] {}, false },
  90. { "libgdk_pixbuf-2.0-0", new String[] {}, false },
  91. { "librsvg-2-2", new String[] {}, false },
  92. { "libflac-8", new String[] {}, false },
  93. { "gio-2.0", new String[] {}, true },
  94. { "glib-2.0", new String[] {}, true },
  95. { "gmodule-2.0", new String[] {}, true },
  96. { "gobject-2.0", new String[] {}, true },
  97. { "gthread-2.0", new String[] {}, true },
  98. { "gstapp-0.10", new String[] {}, true },
  99. { "gstaudio-0.10", new String[] {}, true },
  100. { "gstbase-0.10", new String[] {}, true },
  101. { "gstcdda-0.10", new String[] {}, true },
  102. { "gstcontroller-0.10", new String[] {}, true },
  103. { "gstdataprotocol-0.10", new String[] {}, true },
  104. { "gstfarsight-0.10", new String[] {}, true },
  105. { "gstfft-0.10", new String[] {}, true },
  106. { "gstgl-0.10", new String[] {}, true },
  107. { "gstinterfaces-0.10", new String[] {}, true },
  108. { "gstnet-0.10", new String[] {}, true },
  109. { "gstnetbuffer-0.10", new String[] {}, true },
  110. { "gstpbutils-0.10", new String[] {}, true },
  111. { "gstphotography-0.10", new String[] {}, true },
  112. { "gstreamer-0.10", new String[] {}, true },
  113. { "gstriff-0.10", new String[] {}, true },
  114. { "gstrtp-0.10", new String[] {}, true },
  115. { "gstrtsp-0.10", new String[] {}, true },
  116. { "gstsdp-0.10", new String[] {}, true },
  117. { "gsttag-0.10", new String[] {}, true },
  118. { "gstvideo-0.10", new String[] {}, true },
  119. { "gstbasevideo-0.10", new String[] {}, true } };
  120. static final Object[][] OSX_DEPENDENCIES = {
  121. { "gstbase-0.10", new String[] { "gstreamer-0.10" }, true },
  122. { "gstinterfaces-0.10", new String[] { "gstreamer-0.10" }, true },
  123. { "gstcontroller-0.10", new String[] { "gstreamer-0.10" }, true },
  124. { "gstaudio-0.10", new String[] { "gstbase-0.10" }, true },
  125. { "gstvideo-0.10", new String[] { "gstbase-0.10" }, true } };
  126. static final Object[][] DEFAULT_DEPENDENCIES = {
  127. { "gstreamer-0.10", new String[] {}, true },
  128. { "gstbase-0.10", new String[] { "gstreamer-0.10" }, true },
  129. { "gstinterfaces-0.10", new String[] { "gstreamer-0.10" }, true },
  130. { "gstcontroller-0.10", new String[] { "gstreamer-0.10" }, true },
  131. { "gstaudio-0.10", new String[] { "gstbase-0.10" }, true },
  132. { "gstvideo-0.10", new String[] { "gstbase-0.10" }, true }, };
  133. static final Object[][] dependencies = Platform.isWindows() ? WIN32_DEPENDENCIES
  134. : Platform.isMac() ? OSX_DEPENDENCIES : DEFAULT_DEPENDENCIES;
  135. private static final Map<String, Object> loadedMap = new HashMap<String, Object>();
  136. private static final int RECURSIVE_LOAD_MAX_DEPTH = 5;
  137. private GSLibraryLoader() {
  138. }
  139. private void preLoadLibs() {
  140. for (Object[] a : dependencies) {
  141. load(a[0].toString(), DummyLibrary.class, true, 0, (Boolean) a[2]);
  142. }
  143. }
  144. private String[] findDeps(String name) {
  145. for (Object[] a : dependencies) {
  146. if (name.equals(a[0])) {
  147. return (String[]) a[1];
  148. }
  149. }
  150. return new String[] {}; // library dependancy load chain unspecified -
  151. // probably client call
  152. }
  153. public Object load(String name, Class<?> clazz, boolean reqLib) {
  154. return load(name, clazz, true, 0, reqLib);
  155. }
  156. private Object load(String name, Class<?> clazz, boolean forceReload,
  157. int depth, boolean reqLib) {
  158. assert depth < RECURSIVE_LOAD_MAX_DEPTH : String.format(
  159. "recursive max load depth %s has been exceeded", depth);
  160. Object library = loadedMap.get(name);
  161. if (null == library || forceReload) {
  162. // Logger.getAnonymousLogger().info(String.format("%" + ((depth + 1) * 2)
  163. // + "sloading %s", "->", name));
  164. try {
  165. String[] deps = findDeps(name);
  166. for (String lib : deps) {
  167. load(lib, DummyLibrary.class, false, depth + 1, reqLib);
  168. }
  169. library = loadLibrary(name, clazz, reqLib);
  170. if (library != null) {
  171. loadedMap.put(name, library);
  172. }
  173. } catch (Exception e) {
  174. if (reqLib)
  175. throw new RuntimeException(String.format("can not load library %s",
  176. name, e));
  177. else
  178. System.out.println(String.format("can not load library %s", name, e));
  179. }
  180. }
  181. return library;
  182. }
  183. private static Object loadLibrary(String name, Class<?> clazz, boolean reqLib) {
  184. // Logger.getAnonymousLogger().info(String.format("loading %s", name));
  185. String[] nameFormats;
  186. nameFormats = Platform.isWindows() ? new String[] { "lib%s", "lib%s-0",
  187. "%s" } : new String[] { "%s-0", "%s" };
  188. UnsatisfiedLinkError linkError = null;
  189. for (String fmt : nameFormats) {
  190. try {
  191. String s = String.format(fmt, name);
  192. //System.out.println("Trying to load library file " + s);
  193. Object obj = Native.loadLibrary(s, clazz);
  194. //System.out.println("Loaded library " + s + " succesfully!");
  195. return obj;
  196. } catch (UnsatisfiedLinkError ex) {
  197. linkError = ex;
  198. }
  199. }
  200. if (reqLib)
  201. throw new UnsatisfiedLinkError(
  202. String
  203. .format(
  204. "can't load library %s (%1$s|lib%1$s|lib%1$s-0) with -Djna.library.path=%s. Last error:%s",
  205. name, System.getProperty("jna.library.path"), linkError));
  206. else {
  207. System.out
  208. .println(String
  209. .format(
  210. "can't load library %s (%1$s|lib%1$s|lib%1$s-0) with -Djna.library.path=%s. Last error:%s",
  211. name, System.getProperty("jna.library.path"), linkError));
  212. return null;
  213. }
  214. }
  215. public static synchronized GSLibraryLoader getInstance() {
  216. if (null == instance) {
  217. instance = new GSLibraryLoader();
  218. instance.preLoadLibs();
  219. }
  220. return instance;
  221. }
  222. }