[rygel] core: encodebin-based MP3 transcoder



commit f2826cd5447cd779a90544da542417cbea25397b
Author: Luis de Bethencourt <luis debethencourt com>
Date:   Mon Mar 14 18:02:42 2011 +0100

    core: encodebin-based MP3 transcoder
    
    Co-author: Zeeshan Ali (Khattak) <zeeshanak gnome org>

 po/POTFILES.in                          |    1 -
 po/POTFILES.skip                        |    1 -
 src/rygel/Makefile.am                   |    1 -
 src/rygel/rygel-mp3-transcoder-bin.vala |   77 --------------------------
 src/rygel/rygel-mp3-transcoder.vala     |   91 +++++++++++++++++--------------
 src/rygel/rygel-transcode-manager.vala  |    2 +-
 6 files changed, 52 insertions(+), 121 deletions(-)
---
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 75ee862..99a4487 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -115,7 +115,6 @@ src/rygel/rygel-media-object.vala
 src/rygel/rygel-media-receiver-registrar.vala
 src/rygel/rygel-meta-config.vala
 src/rygel/rygel-mp2ts-transcoder.vala
-src/rygel/rygel-mp3-transcoder-bin.vala
 src/rygel/rygel-mp3-transcoder.vala
 src/rygel/rygel-plugin-loader.vala
 src/rygel/rygel-plugin.vala
diff --git a/po/POTFILES.skip b/po/POTFILES.skip
index b781977..0aad253 100644
--- a/po/POTFILES.skip
+++ b/po/POTFILES.skip
@@ -72,7 +72,6 @@ src/rygel/rygel-video-item.c
 src/rygel/rygel-visual-item.c
 src/rygel/rygel-meta-config.c
 src/rygel/rygel-metadata-extractor.c
-src/rygel/rygel-mp3-transcoder-bin.c
 src/rygel/rygel-plugin-loader.c
 src/rygel/rygel-root-device-factory.c
 src/rygel/rygel-search.c
diff --git a/src/rygel/Makefile.am b/src/rygel/Makefile.am
index c0fb6b7..0b11356 100644
--- a/src/rygel/Makefile.am
+++ b/src/rygel/Makefile.am
@@ -95,7 +95,6 @@ VAPI_SOURCE_FILES = \
 	rygel-mp2ts-transcoder.vala \
 	rygel-mp3-transcoder.vala \
 	rygel-l16-transcoder.vala \
-	rygel-mp3-transcoder-bin.vala \
 	rygel-l16-transcoder-bin.vala \
 	rygel-wma-transcoder.vala \
 	rygel-wma-transcoder-bin.vala \
diff --git a/src/rygel/rygel-mp3-transcoder.vala b/src/rygel/rygel-mp3-transcoder.vala
index 96ace8c..39490f4 100644
--- a/src/rygel/rygel-mp3-transcoder.vala
+++ b/src/rygel/rygel-mp3-transcoder.vala
@@ -25,29 +25,40 @@ using GUPnP;
 using Gee;
 
 /**
- * Transcoder for mpeg 1 layer 2 and 3 audio. This element uses MP3TrancoderBin
- * for actual transcoding.
+ * Transcoder for mpeg 1 layer 3 audio.
  */
 internal class Rygel.MP3Transcoder : Rygel.Transcoder {
     public const int BITRATE = 256;
 
-    private const string[] AUDIO_ENCODER = {null, "twolame", "lame"};
-    private const string AUDIO_PARSER = "mp3parse";
+    private const string DECODE_BIN = "decodebin2";
+    private const string ENCODE_BIN = "encodebin";
 
-    private const string CONVERT_SINK_PAD = "convert-sink-pad";
-
-    private MP3Layer layer;
-
-    public MP3Transcoder (MP3Layer layer) {
+    public MP3Transcoder () {
         base ("audio/mpeg", "MP3", AudioItem.UPNP_CLASS);
-
-        this.layer = layer;
     }
 
     public override Element create_source (MediaItem item,
                                            Element   src)
                                            throws Error {
-        return new MP3TranscoderBin (item, src, this);
+        dynamic Element decoder = GstUtils.create_element (DECODE_BIN,
+                                                           DECODE_BIN);
+        dynamic Element encoder = GstUtils.create_element (ENCODE_BIN,
+                                                           ENCODE_BIN);
+
+        encoder.profile = this.get_encoding_profile ();
+
+        var bin = new Bin ("mp3-transcoder-bin");
+        bin.add_many (src, decoder, encoder);
+
+        src.link (decoder);
+
+        decoder.pad_added.connect (this.on_decoder_pad_added);
+
+        var pad = encoder.get_static_pad ("src");
+        var ghost = new GhostPad (null, pad);
+        bin.add_pad (ghost);
+
+        return bin;
     }
 
     public override DIDLLiteResource? add_resource (DIDLLiteItem     didl_item,
@@ -79,39 +90,39 @@ internal class Rygel.MP3Transcoder : Rygel.Transcoder {
         return distance;
     }
 
-    public Element create_encoder (MediaItem item,
-                                   string?   src_pad_name,
-                                   string?   sink_pad_name)
-                                   throws Error {
-        var l16_transcoder = new L16Transcoder (Endianness.LITTLE);
-        dynamic Element convert = l16_transcoder.create_encoder
-                                        (item, null, CONVERT_SINK_PAD);
-        dynamic Element encoder = GstUtils.create_element
-                                        (AUDIO_ENCODER[this.layer],
-                                         AUDIO_ENCODER[this.layer]);
-        dynamic Element parser = GstUtils.create_element (AUDIO_PARSER,
-                                                          AUDIO_PARSER);
-
-        if (this.layer == MP3Layer.THREE) {
-            // Best quality
-            encoder.quality = 0;
-        }
+    private void on_decoder_pad_added (Element decodebin, Pad new_pad) {
+        var bin = decodebin.get_parent () as Bin;
+        assert (bin != null);
 
-        encoder.bitrate = BITRATE;
+        var encoder = bin.get_by_name (ENCODE_BIN);
+        assert (encoder != null);
 
-        var bin = new Bin ("mp3-encoder-bin");
-        bin.add_many (convert, encoder, parser);
+        var encoder_pad = encoder.get_compatible_pad (new_pad, null);
+        if (encoder_pad == null) {
+            debug ("No compatible encodebin pad found for pad '%s', ignoring..",
+                   new_pad.name);
 
-        convert.link_many (encoder, parser);
+            return;
+        } else {
+            debug ("pad '%s' with caps '%s' is compatible with '%s'",
+                   new_pad.name,
+                   new_pad.get_caps ().to_string (),
+                   encoder_pad.name);
+        }
 
-        var pad = convert.get_static_pad (CONVERT_SINK_PAD);
-        var ghost = new GhostPad (sink_pad_name, pad);
-        bin.add_pad (ghost);
+        if (new_pad.link (encoder_pad) != PadLinkReturn.OK) {
+            var error = new GstError.LINK (_("Failed to link pad %s to %s"),
+                                           new_pad.name,
+                                           encoder_pad.name);
+            GstUtils.post_error (bin, error);
+        }
+    }
 
-        pad = parser.get_static_pad ("src");
-        ghost = new GhostPad (src_pad_name, pad);
-        bin.add_pad (ghost);
+    private EncodingProfile get_encoding_profile () {
+        var format = Caps.from_string ("audio/mpeg,mpegversion=1,layer=3");
+        // FIXME: We should use the preset to set bitrate
+        var encoding_profile = new EncodingAudioProfile (format, null, null, 1);
 
-        return bin;
+        return encoding_profile;
     }
 }
diff --git a/src/rygel/rygel-transcode-manager.vala b/src/rygel/rygel-transcode-manager.vala
index f6dff1e..08ab9b9 100644
--- a/src/rygel/rygel-transcode-manager.vala
+++ b/src/rygel/rygel-transcode-manager.vala
@@ -69,7 +69,7 @@ internal abstract class Rygel.TranscodeManager : GLib.Object {
             }
 
             if (mp3_transcoder) {
-                transcoders.add (new MP3Transcoder (MP3Layer.THREE));
+                transcoders.add (new MP3Transcoder ());
             }
 
             if (mp2ts_transcoder) {



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