From 6a21745ce346dde83e714b77f9fb1fea4a5da1dd Mon Sep 17 00:00:00 2001 From: Jens Georg Date: Fri, 31 Aug 2012 09:37:48 +0200 Subject: [PATCH] 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 dlna_profiles = null; + private GLib.List 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 get_dlna_profiles () { return this.dlna_profiles; } + + public override unowned GLib.List? 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 #DLNAProfiles */ public abstract unowned List get_dlna_profiles (); + + /** + * Get a list of the Transcoders that are supported by this media engine. + * + * @return A list of #Transcoders or null if not supported. + */ + public abstract unowned List? 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 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 (); - - 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 (); + unowned GLib.List 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 get_protocol_info () { + var engine = MediaEngine.get_default (); var protocol_infos = new ArrayList (protocol_equal_func); + unowned GLib.List 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 get_dlna_profiles () { return null; } + + public override unowned GLib.List? get_transcoders () { + return null; + } } public class Rygel.HTTPItemCreatorTest : GLib.Object { -- 2.7.4