[longomatch] Add a support for multimedia backends plugins



commit 0a9bc85002045974bd93f46c79bfe799a39e06ff
Author: Andoni Morales Alastruey <ylatuya gmail com>
Date:   Fri Apr 11 02:02:24 2014 +0200

    Add a support for multimedia backends plugins

 LongoMatch.Addins/AddinsManager.cs                 |   12 ++++
 .../ExtensionPoints/IMultimediaBackend.cs          |   33 +++++++++++
 LongoMatch.Addins/LongoMatch.Addins.mdp            |    1 +
 .../Interfaces/Multimedia/IMultimediaToolkit.cs    |    6 ++
 LongoMatch.GUI.Multimedia/Gui/CapturerBin.cs       |    3 +-
 LongoMatch.GUI.Multimedia/Gui/PlayerBin.cs         |    3 +-
 LongoMatch.Multimedia/LongoMatch.Multimedia.mdp    |    1 +
 LongoMatch.Multimedia/Utils/MultimediaFactory.cs   |   58 ++++++++++++++++----
 LongoMatch/Main.cs                                 |    4 +-
 9 files changed, 105 insertions(+), 16 deletions(-)
---
diff --git a/LongoMatch.Addins/AddinsManager.cs b/LongoMatch.Addins/AddinsManager.cs
index 8829b39..3129de8 100644
--- a/LongoMatch.Addins/AddinsManager.cs
+++ b/LongoMatch.Addins/AddinsManager.cs
@@ -23,6 +23,7 @@ using LongoMatch;
 using LongoMatch.Addins.ExtensionPoints;
 using LongoMatch.Interfaces.GUI;
 using LongoMatch.Store;
+using LongoMatch.Interfaces.Multimedia;
 
 [assembly:AddinRoot ("LongoMatch", "1.0")]
 
@@ -71,6 +72,17 @@ namespace LongoMatch.Addins
                                }
                        }
                }
+               
+               public void LoadMultimediaBackendsAddins(IMultimediaToolkit mtoolkit) {
+                       foreach (IMultimediaBackend backend in 
AddinManager.GetExtensionObjects<IMultimediaBackend> ()) {
+                               try{
+                                       backend.RegisterElements (mtoolkit);
+                               } catch (Exception ex) {
+                                       Log.Error ("Error registering multimedia backend");
+                                       Log.Exception (ex);
+                               }
+                       }
+               }
        }
 }
 
diff --git a/LongoMatch.Addins/ExtensionPoints/IMultimediaBackend.cs 
b/LongoMatch.Addins/ExtensionPoints/IMultimediaBackend.cs
new file mode 100644
index 0000000..dd8ab2f
--- /dev/null
+++ b/LongoMatch.Addins/ExtensionPoints/IMultimediaBackend.cs
@@ -0,0 +1,33 @@
+// IPlayer.cs
+//
+//  Copyright (C) 2007-2009 Andoni Morales Alastruey
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+//
+//
+
+using System;
+using Mono.Addins;
+using LongoMatch.Interfaces.Multimedia;
+
+
+namespace LongoMatch.Addins.ExtensionPoints 
+{
+    [TypeExtensionPoint]
+       public interface IMultimediaBackend
+       {
+               void RegisterElements (IMultimediaToolkit mtoolkit);
+       }
+}
diff --git a/LongoMatch.Addins/LongoMatch.Addins.mdp b/LongoMatch.Addins/LongoMatch.Addins.mdp
index fa6c26d..2ad0171 100644
--- a/LongoMatch.Addins/LongoMatch.Addins.mdp
+++ b/LongoMatch.Addins/LongoMatch.Addins.mdp
@@ -19,6 +19,7 @@
     <File subtype="Code" buildaction="Compile" name="AddinsManager.cs" />
     <File subtype="Directory" buildaction="Compile" name="." />
     <File subtype="Code" buildaction="Compile" name="ExtensionPoints/IImportProject.cs" />
+    <File subtype="Code" buildaction="Compile" name="ExtensionPoints/IMultimediaBackend.cs" />
   </Contents>
   <References>
     <ProjectReference type="Gac" localcopy="True" refto="Mono.Addins, Version=0.6.0.0, Culture=neutral, 
PublicKeyToken=0738eb9f132ed756" />
diff --git a/LongoMatch.Core/Interfaces/Multimedia/IMultimediaToolkit.cs 
b/LongoMatch.Core/Interfaces/Multimedia/IMultimediaToolkit.cs
index 953515f..039ca2b 100644
--- a/LongoMatch.Core/Interfaces/Multimedia/IMultimediaToolkit.cs
+++ b/LongoMatch.Core/Interfaces/Multimedia/IMultimediaToolkit.cs
@@ -25,6 +25,10 @@ namespace LongoMatch.Interfaces.Multimedia
 {
        public interface IMultimediaToolkit
        {
+               void Register (int priority, Type interfac, Type elementType);
+
+               IPlayer GetPlayer();
+
                IVideoEditor GetVideoEditor();
                
                IVideoConverter GetVideoConverter (string filename);
@@ -33,6 +37,8 @@ namespace LongoMatch.Interfaces.Multimedia
                
                IRemuxer GetRemuxer(MediaFile inputFile, string outputFile, VideoMuxerType muxer);
                
+               ICapturer GetCapturer(CapturerType type);
+               
                MediaFile DiscoverFile(string path);
                
                List<Device> VideoDevices {get;}
diff --git a/LongoMatch.GUI.Multimedia/Gui/CapturerBin.cs b/LongoMatch.GUI.Multimedia/Gui/CapturerBin.cs
index 7bf83fb..80d3e24 100644
--- a/LongoMatch.GUI.Multimedia/Gui/CapturerBin.cs
+++ b/LongoMatch.GUI.Multimedia/Gui/CapturerBin.cs
@@ -130,8 +130,7 @@ namespace LongoMatch.Gui
                        /* Close any previous instance of the capturer */
                        Close ();
 
-                       MultimediaToolkit factory = new MultimediaToolkit();
-                       capturer = factory.GetCapturer(type);
+                       capturer = Config.MultimediaToolkit.GetCapturer(type);
                        capturer.EllapsedTime += OnTick;
                        this.settings = settings;
                        if (type != CapturerType.Live) {
diff --git a/LongoMatch.GUI.Multimedia/Gui/PlayerBin.cs b/LongoMatch.GUI.Multimedia/Gui/PlayerBin.cs
index 0933452..7f4b8cd 100644
--- a/LongoMatch.GUI.Multimedia/Gui/PlayerBin.cs
+++ b/LongoMatch.GUI.Multimedia/Gui/PlayerBin.cs
@@ -366,9 +366,8 @@ namespace LongoMatch.Gui
                
                void CreatePlayer ()
                {
-                       MultimediaToolkit factory = new MultimediaToolkit();
                        videodrawingarea.DoubleBuffered = false;
-                       player = factory.GetPlayer ();
+                       player = Config.MultimediaToolkit.GetPlayer ();
 
                        player.Tick += OnTick;
                        player.StateChange += OnStateChanged;
diff --git a/LongoMatch.Multimedia/LongoMatch.Multimedia.mdp b/LongoMatch.Multimedia/LongoMatch.Multimedia.mdp
index 2ba1937..6ac8102 100644
--- a/LongoMatch.Multimedia/LongoMatch.Multimedia.mdp
+++ b/LongoMatch.Multimedia/LongoMatch.Multimedia.mdp
@@ -68,5 +68,6 @@
     <ProjectReference type="Gac" localcopy="True" refto="System, Version=4.0.0.0, Culture=neutral, 
PublicKeyToken=b77a5c561934e089" />
     <ProjectReference type="Gac" localcopy="False" refto="gdk-sharp, Version=2.12.0.0, Culture=neutral, 
PublicKeyToken=35e10195dab3c99f" />
     <ProjectReference type="Gac" localcopy="True" refto="gtk-sharp, Version=2.12.0.0, Culture=neutral, 
PublicKeyToken=35e10195dab3c99f" />
+    <ProjectReference specificVersion="False" type="Gac" localcopy="False" refto="System.Core, 
Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
   </References>
 </Project>
\ No newline at end of file
diff --git a/LongoMatch.Multimedia/Utils/MultimediaFactory.cs 
b/LongoMatch.Multimedia/Utils/MultimediaFactory.cs
index 0583725..3deaaa7 100644
--- a/LongoMatch.Multimedia/Utils/MultimediaFactory.cs
+++ b/LongoMatch.Multimedia/Utils/MultimediaFactory.cs
@@ -19,12 +19,12 @@
 //
 
 using System;
+using System.Linq;
 using System.Collections.Generic;
 using System.Runtime.InteropServices;
 
 using LongoMatch.Common;
 using LongoMatch.Interfaces.Multimedia;
-using LongoMatch.Multimedia.Interfaces;
 using LongoMatch.Multimedia.Utils;
 using LongoMatch.Store;
 using LongoMatch.Video.Capturer;
@@ -40,35 +40,49 @@ namespace LongoMatch.Video
 
        public class MultimediaFactory
        {
+               Dictionary<Type, List<BackendElement>> elements;
 
                public MultimediaFactory()
                {
+                       elements = new Dictionary<Type, List<BackendElement>>();
+                       /* Register default elements */
+                       Register (0, typeof (IPlayer), typeof (GstPlayer));
+                       Register (0, typeof (IFramesCapturer), typeof (GstPlayer));
+                       Register (0, typeof (IVideoConverter), typeof (GstVideoConverter));
+                       Register (0, typeof (IVideoEditor), typeof (GstVideoSplitter));
+                       Register (0, typeof (IRemuxer), typeof (GstRemuxer));
+                       Register (0, typeof (ICapturer), typeof (GstCameraCapturer));
+               }
+               
+               public void Register (int priority, Type interfac, Type elementType) {
+                       if (!elements.ContainsKey (interfac)) {
+                               elements[interfac] = new List<BackendElement> ();
+                       }
+                       elements[interfac].Add (new BackendElement(elementType, priority));
                }
 
                public IPlayer GetPlayer () {
-                       return new GstPlayer (PlayerUseType.Video);
+                       return GetDefaultElement<IPlayer> (typeof (IPlayer),
+                                                           PlayerUseType.Video);
                }
 
                public IFramesCapturer GetFramesCapturer() {
-                       return new GstPlayer (PlayerUseType.Capture);
+                       return GetDefaultElement<IFramesCapturer> (typeof (IFramesCapturer),
+                                                                   PlayerUseType.Capture);
                }
 
                public IVideoEditor GetVideoEditor() {
-                       return new GstVideoSplitter();
+                       return GetDefaultElement<IVideoEditor> (typeof (IVideoEditor));
                }
 
                public IVideoConverter GetVideoConverter(string filename) {
-                       return new GstVideoConverter (filename);
+                       return GetDefaultElement<IVideoConverter> (typeof (IVideoConverter));
                }
 
                public ICapturer GetCapturer(CapturerType type) {
                        switch(type) {
-                       case CapturerType.Fake:
-                               return new FakeCapturer();
-
                        case CapturerType.Live:
-                               return new GstCameraCapturer("test.avi");
-
+                               return GetDefaultElement<ICapturer> (typeof (ICapturer), "test.avi");
                        default:
                                return new FakeCapturer();
                        }
@@ -80,7 +94,9 @@ namespace LongoMatch.Video
                            inputFile.Container == GStreamer.MPEG2_TS) {
                                return new MpegRemuxer (inputFile.FilePath, outputFile);
                        } else {
-                               return new GstRemuxer (inputFile.FilePath, outputFile, muxer);
+                               return GetDefaultElement<IRemuxer> (typeof (IRemuxer),
+                                                                   inputFile.FilePath,
+                                                                   outputFile, muxer);
                        }
                }
                
@@ -103,5 +119,25 @@ namespace LongoMatch.Video
                public static void InitBackend() {
                        gst_init(0, "");
                }
+               
+               T GetDefaultElement<T>(Type interfac, params object[] args) {
+                       Type elementType;
+                       
+                       if (!elements.ContainsKey (interfac)) {
+                               throw new Exception (String.Format ("No {0} available in the multimedia 
backend", interfac));
+                       }
+                       elementType = elements[interfac].OrderByDescending (e => e.priority).First().type;
+                       return (T)Activator.CreateInstance(elementType, args);
+               }
+               
+               internal class BackendElement {
+                       public Type type;
+                       public int priority;
+                       
+                       public BackendElement (Type type, int priority) {
+                               this.type = type;
+                               this.priority = priority;
+                       }
+               }
        }
 }
diff --git a/LongoMatch/Main.cs b/LongoMatch/Main.cs
index 1f24889..bf514de 100644
--- a/LongoMatch/Main.cs
+++ b/LongoMatch/Main.cs
@@ -61,10 +61,12 @@ namespace LongoMatch
                        try {
                                AddinsManager manager = new AddinsManager(Config.PluginsConfigDir, 
Config.PluginsDir);
                                manager.LoadConfigModifierAddins();
-                           GUIToolkit guiToolkit = new GUIToolkit(version);
                            IMultimediaToolkit multimediaToolkit = new MultimediaToolkit();
+                           Config.MultimediaToolkit = multimediaToolkit;
+                           GUIToolkit guiToolkit = new GUIToolkit(version);
                            manager.LoadExportProjectAddins(guiToolkit.MainController);
                            manager.LoadImportProjectAddins(guiToolkit.MainController);
+                           manager.LoadMultimediaBackendsAddins(multimediaToolkit);
                            try {
                                        Core.Start(guiToolkit, multimediaToolkit);
                            } catch (DBLockedException locked) {


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]