[longomatch] Add a support for multimedia backends plugins
- From: Andoni Morales Alastruey <amorales src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [longomatch] Add a support for multimedia backends plugins
- Date: Mon, 7 Jul 2014 11:20:49 +0000 (UTC)
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]