[rygel/wip/media-engine: 4/17] core: Move transcoder knowledge into MediaEngine



commit 8b7fc4413651d956a7762bb21bd6e6ef62bddc10
Author: Jens Georg <jensg openismus org>
Date:   Fri Aug 31 09:37:48 2012 +0200

    core: Move transcoder knowledge into MediaEngine

 src/librygel-server/rygel-gst-media-engine.vala  |   56 ++++++++++++++++++
 src/librygel-server/rygel-media-engine.vala      |    7 ++
 src/librygel-server/rygel-transcode-manager.vala |   66 +++-------------------
 tests/rygel-item-creator-test.vala               |    7 ++
 4 files changed, 78 insertions(+), 58 deletions(-)
---
diff --git a/src/librygel-server/rygel-gst-media-engine.vala b/src/librygel-server/rygel-gst-media-engine.vala
index e8de758..5868598 100644
--- a/src/librygel-server/rygel-gst-media-engine.vala
+++ b/src/librygel-server/rygel-gst-media-engine.vala
@@ -24,6 +24,7 @@ using Gst;
 
 internal class Rygel.GstMediaEngine : Rygel.MediaEngine {
     private GLib.List<DLNAProfile> dlna_profiles = null;
+    private GLib.List<Transcoder> transcoders = null;
 
     public GstMediaEngine () {
         var discoverer = new GUPnP.DLNADiscoverer ((ClockTime) SECOND,
@@ -35,9 +36,64 @@ internal class Rygel.GstMediaEngine : Rygel.MediaEngine {
         }
 
         this.dlna_profiles.reverse ();
+
+        var transcoding = true;
+        var lpcm_transcoder = true;
+        var mp3_transcoder = true;
+        var mp2ts_transcoder = true;
+        var wmv_transcoder = true;
+        var aac_transcoder = true;
+        var avc_transcoder = true;
+
+        var config = MetaConfig.get_default ();
+        try {
+            transcoding = config.get_transcoding ();
+
+            if (transcoding) {
+                lpcm_transcoder = config.get_lpcm_transcoder ();
+                mp3_transcoder = config.get_mp3_transcoder ();
+                mp2ts_transcoder = config.get_mp2ts_transcoder ();
+                wmv_transcoder = config.get_wmv_transcoder ();
+                aac_transcoder = config.get_aac_transcoder ();
+                avc_transcoder = config.get_avc_transcoder ();
+            }
+        } catch (Error err) {}
+
+        if (transcoding) {
+            if (lpcm_transcoder) {
+                this.transcoders.prepend (new L16Transcoder ());
+            }
+
+            if (mp3_transcoder) {
+                this.transcoders.prepend (new MP3Transcoder ());
+            }
+
+            if (mp2ts_transcoder) {
+                this.transcoders.prepend (new MP2TSTranscoder(MP2TSProfile.SD));
+                this.transcoders.prepend (new MP2TSTranscoder(MP2TSProfile.HD));
+            }
+
+            if (wmv_transcoder) {
+                this.transcoders.prepend (new WMVTranscoder ());
+            }
+
+            if (aac_transcoder) {
+                this.transcoders.prepend (new AACTranscoder ());
+            }
+
+            if (avc_transcoder) {
+                this.transcoders.prepend (new AVCTranscoder ());
+            }
+
+            this.transcoders.reverse ();
+        }
     }
 
     public override unowned GLib.List<DLNAProfile> get_dlna_profiles () {
         return this.dlna_profiles;
     }
+
+    public override unowned GLib.List<Transcoder>? get_transcoders () {
+        return this.transcoders;
+    }
 }
diff --git a/src/librygel-server/rygel-media-engine.vala b/src/librygel-server/rygel-media-engine.vala
index 79fbacf..04e374f 100644
--- a/src/librygel-server/rygel-media-engine.vala
+++ b/src/librygel-server/rygel-media-engine.vala
@@ -70,4 +70,11 @@ public abstract class Rygel.MediaEngine : GLib.Object {
      * @return A list of #DLNAProfile<!-- -->s
      */
     public abstract unowned List<DLNAProfile> get_dlna_profiles ();
+
+    /**
+     * Get a list of the Transcoders that are supported by this media engine.
+     *
+     * @return A list of #Transcoder<!-- -->s or null if not supported.
+     */
+    public abstract unowned List<Transcoder>? get_transcoders ();
 }
diff --git a/src/librygel-server/rygel-transcode-manager.vala b/src/librygel-server/rygel-transcode-manager.vala
index b7eebcd..3bea5ec 100644
--- a/src/librygel-server/rygel-transcode-manager.vala
+++ b/src/librygel-server/rygel-transcode-manager.vala
@@ -25,7 +25,6 @@
 
 using GUPnP;
 using Gee;
-using Gst;
 
 /**
  * Responsible for management of all transcoders:
@@ -33,7 +32,6 @@ using Gst;
  * # Provide all possible transcoding resources for items.
  */
 public abstract class Rygel.TranscodeManager : GLib.Object {
-    private ArrayList<Transcoder> transcoders;
 
     private static bool protocol_equal_func (void *a, void *b) {
         var protocol_a = a as ProtocolInfo;
@@ -43,59 +41,7 @@ public abstract class Rygel.TranscodeManager : GLib.Object {
                protocol_a.mime_type == protocol_b.mime_type;
     }
 
-    public TranscodeManager () {
-        transcoders = new ArrayList<Transcoder> ();
-
-        var config = MetaConfig.get_default ();
-
-        var transcoding = true;
-        var lpcm_transcoder = true;
-        var mp3_transcoder = true;
-        var mp2ts_transcoder = true;
-        var wmv_transcoder = true;
-        var aac_transcoder = true;
-        var avc_transcoder = true;
-
-        try {
-            transcoding = config.get_transcoding ();
-
-            if (transcoding) {
-                lpcm_transcoder = config.get_lpcm_transcoder ();
-                mp3_transcoder = config.get_mp3_transcoder ();
-                mp2ts_transcoder = config.get_mp2ts_transcoder ();
-                wmv_transcoder = config.get_wmv_transcoder ();
-                aac_transcoder = config.get_aac_transcoder ();
-                avc_transcoder = config.get_avc_transcoder ();
-            }
-        } catch (Error err) {}
-
-        if (transcoding) {
-            if (lpcm_transcoder) {
-                transcoders.add (new L16Transcoder ());
-            }
-
-            if (mp3_transcoder) {
-                transcoders.add (new MP3Transcoder ());
-            }
-
-            if (mp2ts_transcoder) {
-                transcoders.add (new MP2TSTranscoder(MP2TSProfile.SD));
-                transcoders.add (new MP2TSTranscoder(MP2TSProfile.HD));
-            }
-
-            if (wmv_transcoder) {
-                transcoders.add (new WMVTranscoder ());
-            }
-
-            if (aac_transcoder) {
-                transcoders.add (new AACTranscoder ());
-            }
-
-            if (avc_transcoder) {
-                transcoders.add (new AVCTranscoder ());
-            }
-        }
-    }
+    public TranscodeManager () { }
 
     public abstract string create_uri_for_item (MediaItem  item,
                                                 int        thumbnail_index,
@@ -104,9 +50,11 @@ public abstract class Rygel.TranscodeManager : GLib.Object {
 
     public void add_resources (DIDLLiteItem didl_item, MediaItem item)
                                throws Error {
+        var engine = MediaEngine.get_default ();
         var list = new GLib.List<Transcoder> ();
+        unowned GLib.List<Transcoder> transcoders = engine.get_transcoders ();
 
-        foreach (var transcoder in this.transcoders) {
+        foreach (var transcoder in transcoders) {
             if (transcoder.get_distance (item) != uint.MAX) {
                 list.append (transcoder);
             }
@@ -121,7 +69,7 @@ public abstract class Rygel.TranscodeManager : GLib.Object {
     public Transcoder get_transcoder (string  target) throws Error {
         Transcoder transcoder = null;
 
-        foreach (var iter in this.transcoders) {
+        foreach (var iter in MediaEngine.get_default ().get_transcoders ()) {
             if (iter.can_handle (target)) {
                 transcoder = iter;
             }
@@ -139,9 +87,11 @@ public abstract class Rygel.TranscodeManager : GLib.Object {
     internal abstract string get_protocol ();
 
     internal virtual ArrayList<ProtocolInfo> get_protocol_info () {
+        var engine = MediaEngine.get_default ();
         var protocol_infos = new ArrayList<ProtocolInfo> (protocol_equal_func);
+        unowned GLib.List<Transcoder> transcoders = engine.get_transcoders ();
 
-        foreach (var transcoder in this.transcoders) {
+        foreach (var transcoder in transcoders) {
             var protocol_info = new ProtocolInfo ();
 
             protocol_info.protocol = this.get_protocol ();
diff --git a/tests/rygel-item-creator-test.vala b/tests/rygel-item-creator-test.vala
index 84e17b8..482693d 100644
--- a/tests/rygel-item-creator-test.vala
+++ b/tests/rygel-item-creator-test.vala
@@ -242,10 +242,17 @@ public errordomain Rygel.ContentDirectoryError {
     ERROR
 }
 
+public class Rygel.Transcoder {
+}
+
 public class Rygel.GstMediaEngine : Rygel.MediaEngine {
     public override unowned GLib.List<DLNAProfile> get_dlna_profiles () {
         return null;
     }
+
+    public override unowned GLib.List<Transcoder>? get_transcoders () {
+        return null;
+    }
 }
 
 public class Rygel.HTTPItemCreatorTest : GLib.Object {



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