[rygel] core: encodebin-based MP3 transcoder
- From: Zeeshan Ali Khattak <zeeshanak src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [rygel] core: encodebin-based MP3 transcoder
- Date: Mon, 11 Apr 2011 13:33:39 +0000 (UTC)
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]