/Main/GStreamer/Source/gstreamer-sharp/gstreamer-sharp/Application.cs

http://ossbuild.googlecode.com/ · C# · 179 lines · 135 code · 32 blank · 12 comment · 15 complexity · 6bafb2e9f3e7a68b32982c642ce4f6e8 MD5 · raw file

  1. //
  2. // Application.cs: Framework initialization for GStreamer
  3. //
  4. // Authors:
  5. // Aaron Bockover (abockover@novell.com)
  6. // Alp Toker (alp@atoker.com)
  7. //
  8. // Copyright (C) 2002 Alp Toker
  9. // Copyright (C) 2006 Novell, Inc.
  10. // Copyright (C) 2009 Sebastian Dr??ge <sebastian.droege@collabora.co.uk>
  11. //
  12. using System;
  13. using System.Reflection;
  14. using System.IO;
  15. using System.Runtime.InteropServices;
  16. namespace Gst {
  17. [AttributeUsage (AttributeTargets.Enum | AttributeTargets.Class | AttributeTargets.Struct) ]
  18. public sealed class GTypeNameAttribute : Attribute {
  19. string type_name;
  20. public GTypeNameAttribute (string gtype_name) {
  21. this.type_name = gtype_name;
  22. }
  23. public string TypeName {
  24. get {
  25. return type_name;
  26. } set {
  27. type_name = value;
  28. }
  29. }
  30. }
  31. public static class Application {
  32. public static void Init() {
  33. IntPtr argv = new IntPtr (0);
  34. int argc = 0;
  35. gst_init (ref argc, ref argv);
  36. gst_controller_init (ref argc, ref argv);
  37. gst_pb_utils_init ();
  38. RegisterManagedTypes ();
  39. }
  40. public static void Init (string progname, ref string [] args) {
  41. FullInit (progname, ref args, false);
  42. }
  43. public static void InitCheck (string progname, ref string [] args) {
  44. FullInit (progname, ref args, true);
  45. }
  46. public static void Deinit() {
  47. gst_deinit();
  48. }
  49. private static System.Type GstResolveType (Gst.GLib.GType gtype, string gtype_name) {
  50. Assembly[] assemblies = (Assembly[]) AppDomain.CurrentDomain.GetAssemblies ().Clone ();
  51. foreach (Assembly asm in assemblies) {
  52. Type[] ts = asm.GetTypes ();
  53. foreach (Type t in ts) {
  54. if (t.IsDefined (typeof (Gst.GTypeNameAttribute), false)) {
  55. GTypeNameAttribute gattr = (GTypeNameAttribute) Attribute.GetCustomAttribute (t, typeof (GTypeNameAttribute), false);
  56. if (gtype_name.Equals (gattr.TypeName)) {
  57. return t;
  58. }
  59. }
  60. }
  61. }
  62. foreach (Assembly asm in assemblies) {
  63. foreach (AssemblyName ref_name in asm.GetReferencedAssemblies ()) {
  64. string asm_dir = Path.GetDirectoryName (asm.Location);
  65. try {
  66. Assembly ref_asm;
  67. if (File.Exists (Path.Combine (asm_dir, ref_name.Name + ".dll")))
  68. ref_asm = Assembly.LoadFrom (Path.Combine (asm_dir, ref_name.Name + ".dll"));
  69. else
  70. ref_asm = Assembly.Load (ref_name);
  71. Type[] ts = asm.GetTypes ();
  72. foreach (Type t in ts) {
  73. if (t.IsDefined (typeof (Gst.GTypeNameAttribute), false)) {
  74. GTypeNameAttribute gattr = (GTypeNameAttribute) Attribute.GetCustomAttribute (t, typeof (GTypeNameAttribute), false);
  75. if (gtype_name.Equals (gattr.TypeName)) {
  76. return t;
  77. }
  78. }
  79. }
  80. } catch (Exception) {
  81. /* Failure to load a referenced assembly is not an error */
  82. }
  83. }
  84. }
  85. return null;
  86. }
  87. private static void RegisterManagedTypes() {
  88. Gst.GLib.GType.ResolveType += GstResolveType;
  89. Gst.GLib.GType.Register (Fraction.GType, typeof (Fraction));
  90. Gst.GLib.GType.Register (IntRange.GType, typeof (IntRange));
  91. Gst.GLib.GType.Register (DoubleRange.GType, typeof (DoubleRange));
  92. Gst.GLib.GType.Register (FractionRange.GType, typeof (FractionRange));
  93. Gst.GLib.GType.Register (Fourcc.GType, typeof (Fourcc));
  94. Gst.GLib.GType.Register (Date.GType, typeof (Date));
  95. Gst.GLib.GType.Register (List.GType, typeof (List));
  96. Gst.GLib.GType.Register (Array.GType, typeof (Array));
  97. Gst.GLib.GType.Register (Caps.GType, typeof (Caps));
  98. Gst.GLib.GType.Register (Structure.GType, typeof (Structure));
  99. Gst.GLib.GType.Register (TagList.GType, typeof (TagList));
  100. Gst.GLib.GType.Register (MiniObject.GType, typeof (MiniObject));
  101. GtkSharp.GstreamerSharp.ObjectManager.Initialize ();
  102. }
  103. private static void FullInit (string progname, ref string [] args, bool check) {
  104. string [] progargs = new string[args.Length + 1];
  105. progargs[0] = progname;
  106. args.CopyTo (progargs, 1);
  107. Gst.GLib.Argv argv = new Gst.GLib.Argv (progargs);
  108. IntPtr argv_ptr = argv.Handle;
  109. int argc = progargs.Length;
  110. if (check) {
  111. IntPtr error_ptr;
  112. bool result = gst_init_check (ref argc, ref argv_ptr, out error_ptr);
  113. if (error_ptr != IntPtr.Zero) {
  114. throw new Gst.GLib.GException (error_ptr);
  115. } else if (!result) {
  116. throw new ApplicationException ("gst_init_check() failed: Reason unknown");
  117. }
  118. } else {
  119. gst_init (ref argc, ref argv_ptr);
  120. }
  121. if (argv_ptr != argv.Handle) {
  122. string init_call = check ? "gst_init_check()" : "gst_init()";
  123. throw new ApplicationException (init_call + " returned a new argv handle");
  124. }
  125. gst_controller_init (ref argc, ref argv_ptr);
  126. gst_pb_utils_init ();
  127. if (argc <= 1) {
  128. args = new string[0];
  129. } else {
  130. progargs = argv.GetArgs (argc);
  131. args = new string[argc - 1];
  132. System.Array.Copy (progargs, 1, args, 0, argc - 1);
  133. }
  134. RegisterManagedTypes ();
  135. }
  136. [DllImport ("libgstreamer-0.10.dll") ]
  137. private static extern void gst_init (ref int argc, ref IntPtr argv);
  138. [DllImport ("libgstreamer-0.10.dll") ]
  139. private static extern bool gst_init_check (ref int argc, ref IntPtr argv, out IntPtr error);
  140. [DllImport ("libgstcontroller-0.10.dll") ]
  141. private static extern void gst_controller_init (ref int argc, ref IntPtr argv);
  142. [DllImport ("libgstpbutils-0.10.dll") ]
  143. private static extern void gst_pb_utils_init ();
  144. [DllImport ("libgstreamer-0.10.dll") ]
  145. private static extern void gst_deinit();
  146. }
  147. }