[rygel-gst-0-10-media-engine] Porting to C: Split into h and c files.



commit 66e0cadb113a3b7a6236bfa9899d65a2eff1e8aa
Author: Murray Cumming <murrayc murrayc com>
Date:   Tue Dec 18 12:04:50 2012 +0100

    Porting to C: Split into h and c files.

 po/POTFILES.in               |    4 +-
 src/rygel-aac-transcoder.c   |  102 +------
 src/rygel-aac-transcoder.h   |   65 ++++
 src/rygel-audio-transcoder.c |  555 ++++++++++++-----------------
 src/rygel-audio-transcoder.h |   71 ++++
 src/rygel-avc-transcoder.c   |  131 +-------
 src/rygel-avc-transcoder.h   |   53 +++
 src/rygel-gst-data-source.c  |   92 +-----
 src/rygel-gst-data-source.h  |   72 ++++
 src/rygel-gst-media-engine.c |  756 ++++++++++------------------------------
 src/rygel-gst-media-engine.h |   67 ++++
 src/rygel-gst-sink.c         |   56 +---
 src/rygel-gst-sink.h         |   67 ++++
 src/rygel-gst-transcoder.c   |  804 +++++++++++++-----------------------------
 src/rygel-gst-transcoder.h   |   68 ++++
 src/rygel-gst-utils.c        |  235 +------------
 src/rygel-gst-utils.h        |   46 +++
 src/rygel-l16-transcoder.c   |  674 +++++++++++++++--------------------
 src/rygel-l16-transcoder.h   |   63 ++++
 src/rygel-mp2ts-transcoder.c |  133 +-------
 src/rygel-mp2ts-transcoder.h |   68 ++++
 src/rygel-mp3-transcoder.c   |  104 +-----
 src/rygel-mp3-transcoder.h   |   63 ++++
 src/rygel-video-transcoder.c |  490 ++++++++++----------------
 src/rygel-video-transcoder.h |   64 ++++
 src/rygel-wmv-transcoder.c   |  122 +------
 src/rygel-wmv-transcoder.h   |   53 +++
 27 files changed, 1997 insertions(+), 3081 deletions(-)
---
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 93c3a77..1b109c9 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -1,5 +1,5 @@
 # List of source files containing translatable strings.
 # Please keep this file sorted alphabetically.
 [encoding: UTF-8]
-src/rygel-gst-data-source.vala
-src/rygel-gst-utils.vala
+src/rygel-gst-data-source.c
+src/rygel-gst-utils.c
diff --git a/src/rygel-aac-transcoder.c b/src/rygel-aac-transcoder.c
index 8e7a0dc..a147758 100644
--- a/src/rygel-aac-transcoder.c
+++ b/src/rygel-aac-transcoder.c
@@ -20,94 +20,14 @@
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  */
 
-#include <glib.h>
-#include <glib-object.h>
-#include <rygel-server.h>
-#include <gst/pbutils/pbutils.h>
-#include <gst/gst.h>
-#include <stdlib.h>
-#include <string.h>
+#include "rygel-aac-transcoder.h"
 
+G_DEFINE_TYPE (RygelAACTranscoder, rygel_aac_transcoder, RYGEL_TYPE_AUDIO_TRANSCODER)
 
-#define RYGEL_TYPE_GST_TRANSCODER (rygel_gst_transcoder_get_type ())
-#define RYGEL_GST_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_GST_TRANSCODER, RygelGstTranscoder))
-#define RYGEL_GST_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_GST_TRANSCODER, RygelGstTranscoderClass))
-#define RYGEL_IS_GST_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_GST_TRANSCODER))
-#define RYGEL_IS_GST_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_GST_TRANSCODER))
-#define RYGEL_GST_TRANSCODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_GST_TRANSCODER, RygelGstTranscoderClass))
-
-typedef struct _RygelGstTranscoder RygelGstTranscoder;
-typedef struct _RygelGstTranscoderClass RygelGstTranscoderClass;
-typedef struct _RygelGstTranscoderPrivate RygelGstTranscoderPrivate;
-
-#define RYGEL_TYPE_AUDIO_TRANSCODER (rygel_audio_transcoder_get_type ())
-#define RYGEL_AUDIO_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_AUDIO_TRANSCODER, RygelAudioTranscoder))
-#define RYGEL_AUDIO_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_AUDIO_TRANSCODER, RygelAudioTranscoderClass))
-#define RYGEL_IS_AUDIO_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_AUDIO_TRANSCODER))
-#define RYGEL_IS_AUDIO_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_AUDIO_TRANSCODER))
-#define RYGEL_AUDIO_TRANSCODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_AUDIO_TRANSCODER, RygelAudioTranscoderClass))
-
-typedef struct _RygelAudioTranscoder RygelAudioTranscoder;
-typedef struct _RygelAudioTranscoderClass RygelAudioTranscoderClass;
-typedef struct _RygelAudioTranscoderPrivate RygelAudioTranscoderPrivate;
-
-#define RYGEL_TYPE_AAC_TRANSCODER (rygel_aac_transcoder_get_type ())
-#define RYGEL_AAC_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_AAC_TRANSCODER, RygelAACTranscoder))
-#define RYGEL_AAC_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_AAC_TRANSCODER, RygelAACTranscoderClass))
-#define RYGEL_IS_AAC_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_AAC_TRANSCODER))
-#define RYGEL_IS_AAC_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_AAC_TRANSCODER))
-#define RYGEL_AAC_TRANSCODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_AAC_TRANSCODER, RygelAACTranscoderClass))
-
-typedef struct _RygelAACTranscoder RygelAACTranscoder;
-typedef struct _RygelAACTranscoderClass RygelAACTranscoderClass;
-typedef struct _RygelAACTranscoderPrivate RygelAACTranscoderPrivate;
-
-struct _RygelGstTranscoder {
-	RygelTranscoder parent_instance;
-	RygelGstTranscoderPrivate * priv;
-};
-
-struct _RygelGstTranscoderClass {
-	RygelTranscoderClass parent_class;
-	GstEncodingProfile* (*get_encoding_profile) (RygelGstTranscoder* self);
-};
-
-struct _RygelAudioTranscoder {
-	RygelGstTranscoder parent_instance;
-	RygelAudioTranscoderPrivate * priv;
-	gint audio_bitrate;
-	GstCaps* container_format;
-	GstCaps* audio_codec_format;
-};
-
-struct _RygelAudioTranscoderClass {
-	RygelGstTranscoderClass parent_class;
-};
-
-struct _RygelAACTranscoder {
-	RygelAudioTranscoder parent_instance;
-	RygelAACTranscoderPrivate * priv;
-};
-
-struct _RygelAACTranscoderClass {
-	RygelAudioTranscoderClass parent_class;
-};
-
-
-static gpointer rygel_aac_transcoder_parent_class = NULL;
-
-GType rygel_gst_transcoder_get_type (void) G_GNUC_CONST;
-GType rygel_audio_transcoder_get_type (void) G_GNUC_CONST;
-GType rygel_aac_transcoder_get_type (void) G_GNUC_CONST;
-enum  {
-	RYGEL_AAC_TRANSCODER_DUMMY_PROPERTY
-};
 #define RYGEL_AAC_TRANSCODER_BITRATE 256
 #define RYGEL_AAC_TRANSCODER_CODEC "audio/mpeg,mpegversion=4," "stream-format=adts,rate=44100,base-profile=lc"
 RygelAACTranscoder* rygel_aac_transcoder_new (void);
 RygelAACTranscoder* rygel_aac_transcoder_construct (GType object_type);
-RygelAudioTranscoder* rygel_audio_transcoder_new (const gchar* content_type, const gchar* dlna_profile, gint audio_bitrate, const gchar* container_caps, const gchar* audio_codec_caps, const gchar* extension);
-RygelAudioTranscoder* rygel_audio_transcoder_construct (GType object_type, const gchar* content_type, const gchar* dlna_profile, gint audio_bitrate, const gchar* container_caps, const gchar* audio_codec_caps, const gchar* extension);
 void rygel_gst_transcoder_set_preset (RygelGstTranscoder* self, const gchar* value);
 
 
@@ -129,23 +49,7 @@ static void rygel_aac_transcoder_class_init (RygelAACTranscoderClass * klass) {
 }
 
 
-static void rygel_aac_transcoder_instance_init (RygelAACTranscoder * self) {
+static void rygel_aac_transcoder_init (RygelAACTranscoder * self) {
 }
 
 
-/**
- * Transcoder for 3GP stream containing MPEG4 audio (AAC).
- */
-GType rygel_aac_transcoder_get_type (void) {
-	static volatile gsize rygel_aac_transcoder_type_id__volatile = 0;
-	if (g_once_init_enter (&rygel_aac_transcoder_type_id__volatile)) {
-		static const GTypeInfo g_define_type_info = { sizeof (RygelAACTranscoderClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) rygel_aac_transcoder_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (RygelAACTranscoder), 0, (GInstanceInitFunc) rygel_aac_transcoder_instance_init, NULL };
-		GType rygel_aac_transcoder_type_id;
-		rygel_aac_transcoder_type_id = g_type_register_static (RYGEL_TYPE_AUDIO_TRANSCODER, "RygelAACTranscoder", &g_define_type_info, 0);
-		g_once_init_leave (&rygel_aac_transcoder_type_id__volatile, rygel_aac_transcoder_type_id);
-	}
-	return rygel_aac_transcoder_type_id__volatile;
-}
-
-
-
diff --git a/src/rygel-aac-transcoder.h b/src/rygel-aac-transcoder.h
new file mode 100644
index 0000000..e3d19e5
--- /dev/null
+++ b/src/rygel-aac-transcoder.h
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2009 Nokia Corporation
+ * Copyright (C) 2012 Intel Corporation
+ *
+ * Rygel is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Rygel 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __RYGEL_GST_0_10_MEDIA_ENGINE_AAC_TRANSCODER_H__
+#define __RYGEL_GST_0_10_MEDIA_ENGINE_AAC_TRANSCODER_H__
+
+#include <glib.h>
+#include <glib-object.h>
+#include <stdlib.h>
+#include <string.h>
+#include <rygel-server.h>
+#include <gst/gst.h>
+#include <libgupnp-dlna/gupnp-dlna-discoverer.h>
+#include <libgupnp-dlna/gupnp-dlna-profile.h>
+#include <gee.h>
+#include <rygel-core.h>
+#include "rygel-audio-transcoder.h"
+
+G_BEGIN_DECLS
+
+#define RYGEL_TYPE_AAC_TRANSCODER (rygel_aac_transcoder_get_type ())
+#define RYGEL_AAC_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_AAC_TRANSCODER, RygelAACTranscoder))
+#define RYGEL_AAC_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_AAC_TRANSCODER, RygelAACTranscoderClass))
+#define RYGEL_IS_AAC_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_AAC_TRANSCODER))
+#define RYGEL_IS_AAC_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_AAC_TRANSCODER))
+#define RYGEL_AAC_TRANSCODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_AAC_TRANSCODER, RygelAACTranscoderClass))
+
+typedef struct _RygelAACTranscoder RygelAACTranscoder;
+typedef struct _RygelAACTranscoderClass RygelAACTranscoderClass;
+typedef struct _RygelAACTranscoderPrivate RygelAACTranscoderPrivate;
+
+struct _RygelAACTranscoder {
+  RygelAudioTranscoder parent_instance;
+  RygelAACTranscoderPrivate * priv;
+};
+
+struct _RygelAACTranscoderClass {
+  RygelAudioTranscoderClass parent_class;
+};
+
+GType rygel_aac_transcoder_get_type (void) G_GNUC_CONST;
+
+RygelAACTranscoder* rygel_aac_transcoder_new (void);
+
+void rygel_gst_transcoder_set_preset (RygelGstTranscoder* self, const gchar* value);
+
+G_END_DECLS
+
+#endif /* __RYGEL_GST_0_10_MEDIA_ENGINE_AAC_TRANSCODER_H__ */
diff --git a/src/rygel-audio-transcoder.c b/src/rygel-audio-transcoder.c
index 8e27130..bef5f0d 100644
--- a/src/rygel-audio-transcoder.c
+++ b/src/rygel-audio-transcoder.c
@@ -21,356 +21,261 @@
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  */
 
-#include <glib.h>
-#include <glib-object.h>
-#include <rygel-server.h>
-#include <gst/pbutils/pbutils.h>
-#include <gst/gst.h>
-#include <stdlib.h>
-#include <string.h>
-#include <libgupnp-av/gupnp-av.h>
-
-
-#define RYGEL_TYPE_GST_TRANSCODER (rygel_gst_transcoder_get_type ())
-#define RYGEL_GST_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_GST_TRANSCODER, RygelGstTranscoder))
-#define RYGEL_GST_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_GST_TRANSCODER, RygelGstTranscoderClass))
-#define RYGEL_IS_GST_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_GST_TRANSCODER))
-#define RYGEL_IS_GST_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_GST_TRANSCODER))
-#define RYGEL_GST_TRANSCODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_GST_TRANSCODER, RygelGstTranscoderClass))
-
-typedef struct _RygelGstTranscoder RygelGstTranscoder;
-typedef struct _RygelGstTranscoderClass RygelGstTranscoderClass;
-typedef struct _RygelGstTranscoderPrivate RygelGstTranscoderPrivate;
-
-#define RYGEL_TYPE_AUDIO_TRANSCODER (rygel_audio_transcoder_get_type ())
-#define RYGEL_AUDIO_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_AUDIO_TRANSCODER, RygelAudioTranscoder))
-#define RYGEL_AUDIO_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_AUDIO_TRANSCODER, RygelAudioTranscoderClass))
-#define RYGEL_IS_AUDIO_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_AUDIO_TRANSCODER))
-#define RYGEL_IS_AUDIO_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_AUDIO_TRANSCODER))
-#define RYGEL_AUDIO_TRANSCODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_AUDIO_TRANSCODER, RygelAudioTranscoderClass))
-
-typedef struct _RygelAudioTranscoder RygelAudioTranscoder;
-typedef struct _RygelAudioTranscoderClass RygelAudioTranscoderClass;
-typedef struct _RygelAudioTranscoderPrivate RygelAudioTranscoderPrivate;
-#define _gst_caps_unref0(var) ((var == NULL) ? NULL : (var = (gst_caps_unref (var), NULL)))
-#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
-#define _gst_encoding_profile_unref0(var) ((var == NULL) ? NULL : (var = (gst_encoding_profile_unref (var), NULL)))
-
-struct _RygelGstTranscoder {
-	RygelTranscoder parent_instance;
-	RygelGstTranscoderPrivate * priv;
-};
-
-struct _RygelGstTranscoderClass {
-	RygelTranscoderClass parent_class;
-	GstEncodingProfile* (*get_encoding_profile) (RygelGstTranscoder* self);
-};
-
-struct _RygelAudioTranscoder {
-	RygelGstTranscoder parent_instance;
-	RygelAudioTranscoderPrivate * priv;
-	gint audio_bitrate;
-	GstCaps* container_format;
-	GstCaps* audio_codec_format;
-};
-
-struct _RygelAudioTranscoderClass {
-	RygelGstTranscoderClass parent_class;
-};
+#include "rygel-audio-transcoder.h"
 
+/**
+ * Base class for all transcoders that handle audio.
+ */
 
-static gpointer rygel_audio_transcoder_parent_class = NULL;
+G_DEFINE_TYPE (RygelAudioTranscoder, rygel_audio_transcoder, RYGEL_TYPE_GST_TRANSCODER)
 
-GType rygel_gst_transcoder_get_type (void) G_GNUC_CONST;
-GType rygel_audio_transcoder_get_type (void) G_GNUC_CONST;
-enum  {
-	RYGEL_AUDIO_TRANSCODER_DUMMY_PROPERTY
-};
-#define RYGEL_AUDIO_TRANSCODER_NO_CONTAINER NULL
-RygelAudioTranscoder* rygel_audio_transcoder_new (const gchar* content_type, const gchar* dlna_profile, gint audio_bitrate, const gchar* container_caps, const gchar* audio_codec_caps, const gchar* extension);
-RygelAudioTranscoder* rygel_audio_transcoder_construct (GType object_type, const gchar* content_type, const gchar* dlna_profile, gint audio_bitrate, const gchar* container_caps, const gchar* audio_codec_caps, const gchar* extension);
-RygelGstTranscoder* rygel_gst_transcoder_construct (GType object_type, const gchar* mime_type, const gchar* dlna_profile, const gchar* upnp_class, const gchar* extension);
-RygelAudioTranscoder* rygel_audio_transcoder_new_with_class (const gchar* content_type, const gchar* dlna_profile, const gchar* upnp_class, gint audio_bitrate, const gchar* container_caps, const gchar* audio_codec_caps, const gchar* extension);
-RygelAudioTranscoder* rygel_audio_transcoder_construct_with_class (GType object_type, const gchar* content_type, const gchar* dlna_profile, const gchar* upnp_class, gint audio_bitrate, const gchar* container_caps, const gchar* audio_codec_caps, const gchar* extension);
-static GUPnPDIDLLiteResource* rygel_audio_transcoder_real_add_resource (RygelTranscoder* base, GUPnPDIDLLiteItem* didl_item, RygelMediaItem* item, RygelTranscodeManager* manager, GError** error);
-static guint rygel_audio_transcoder_real_get_distance (RygelTranscoder* base, RygelMediaItem* item);
-static GstEncodingProfile* rygel_audio_transcoder_real_get_encoding_profile (RygelGstTranscoder* base);
-const gchar* rygel_gst_transcoder_get_preset (RygelGstTranscoder* self);
 static void rygel_audio_transcoder_finalize (GObject* obj);
 
-
-RygelAudioTranscoder* rygel_audio_transcoder_construct (GType object_type, const gchar* content_type, const gchar* dlna_profile, gint audio_bitrate, const gchar* container_caps, const gchar* audio_codec_caps, const gchar* extension) {
-	RygelAudioTranscoder * self = NULL;
-	const gchar* _tmp0_;
-	const gchar* _tmp1_;
-	const gchar* _tmp2_;
-	gint _tmp3_;
-	const gchar* _tmp4_;
-	const gchar* _tmp7_;
-	GstCaps* _tmp8_ = NULL;
-	g_return_val_if_fail (content_type != NULL, NULL);
-	g_return_val_if_fail (dlna_profile != NULL, NULL);
-	g_return_val_if_fail (audio_codec_caps != NULL, NULL);
-	g_return_val_if_fail (extension != NULL, NULL);
-	_tmp0_ = content_type;
-	_tmp1_ = dlna_profile;
-	_tmp2_ = extension;
-	self = (RygelAudioTranscoder*) rygel_gst_transcoder_construct (object_type, _tmp0_, _tmp1_, RYGEL_AUDIO_ITEM_UPNP_CLASS, _tmp2_);
-	_tmp3_ = audio_bitrate;
-	self->audio_bitrate = _tmp3_;
-	_tmp4_ = container_caps;
-	if (_tmp4_ != NULL) {
-		const gchar* _tmp5_;
-		GstCaps* _tmp6_ = NULL;
-		_tmp5_ = container_caps;
-		_tmp6_ = gst_caps_from_string (_tmp5_);
-		_gst_caps_unref0 (self->container_format);
-		self->container_format = _tmp6_;
-	}
-	_tmp7_ = audio_codec_caps;
-	_tmp8_ = gst_caps_from_string (_tmp7_);
-	_gst_caps_unref0 (self->audio_codec_format);
-	self->audio_codec_format = _tmp8_;
-	return self;
-}
-
-
-RygelAudioTranscoder* rygel_audio_transcoder_new (const gchar* content_type, const gchar* dlna_profile, gint audio_bitrate, const gchar* container_caps, const gchar* audio_codec_caps, const gchar* extension) {
-	return rygel_audio_transcoder_construct (RYGEL_TYPE_AUDIO_TRANSCODER, content_type, dlna_profile, audio_bitrate, container_caps, audio_codec_caps, extension);
+RygelAudioTranscoder*
+rygel_audio_transcoder_construct (GType object_type, const gchar* content_type, gint audio_bitrate, const gchar* container_caps, const gchar* audio_codec_caps, const gchar* extension) {
+  RygelAudioTranscoder * self = NULL;
+  const gchar* _tmp0_;
+  const gchar* _tmp1_;
+  const gchar* _tmp2_;
+  gint _tmp3_;
+  const gchar* _tmp4_;
+  const gchar* _tmp7_;
+  GstCaps* _tmp8_ = NULL;
+  g_return_val_if_fail (content_type != NULL, NULL);
+  g_return_val_if_fail (audio_codec_caps != NULL, NULL);
+  g_return_val_if_fail (extension != NULL, NULL);
+  _tmp0_ = content_type;
+  _tmp2_ = extension;
+  self = (RygelAudioTranscoder*) rygel_gst_transcoder_construct (object_type, _tmp0_, RYGEL_AUDIO_ITEM_UPNP_CLASS, _tmp2_);
+  _tmp3_ = audio_bitrate;
+  self->audio_bitrate = _tmp3_;
+  _tmp4_ = container_caps;
+  if (_tmp4_ != NULL) {
+    const gchar* _tmp5_;
+    GstCaps* _tmp6_ = NULL;
+    _tmp5_ = container_caps;
+    _tmp6_ = gst_caps_from_string (_tmp5_);
+    _gst_caps_unref0 (self->container_format);
+    self->container_format = _tmp6_;
+  }
+  _tmp7_ = audio_codec_caps;
+  _tmp8_ = gst_caps_from_string (_tmp7_);
+  _gst_caps_unref0 (self->audio_codec_format);
+  self->audio_codec_format = _tmp8_;
+  return self;
 }
 
 
-RygelAudioTranscoder* rygel_audio_transcoder_construct_with_class (GType object_type, const gchar* content_type, const gchar* dlna_profile, const gchar* upnp_class, gint audio_bitrate, const gchar* container_caps, const gchar* audio_codec_caps, const gchar* extension) {
-	RygelAudioTranscoder * self = NULL;
-	const gchar* _tmp0_;
-	const gchar* _tmp1_;
-	const gchar* _tmp2_;
-	const gchar* _tmp3_;
-	gint _tmp4_;
-	const gchar* _tmp5_;
-	const gchar* _tmp8_;
-	GstCaps* _tmp9_ = NULL;
-	g_return_val_if_fail (content_type != NULL, NULL);
-	g_return_val_if_fail (dlna_profile != NULL, NULL);
-	g_return_val_if_fail (upnp_class != NULL, NULL);
-	g_return_val_if_fail (audio_codec_caps != NULL, NULL);
-	g_return_val_if_fail (extension != NULL, NULL);
-	_tmp0_ = content_type;
-	_tmp1_ = dlna_profile;
-	_tmp2_ = upnp_class;
-	_tmp3_ = extension;
-	self = (RygelAudioTranscoder*) rygel_gst_transcoder_construct (object_type, _tmp0_, _tmp1_, _tmp2_, _tmp3_);
-	_tmp4_ = audio_bitrate;
-	self->audio_bitrate = _tmp4_;
-	_tmp5_ = container_caps;
-	if (_tmp5_ != NULL) {
-		const gchar* _tmp6_;
-		GstCaps* _tmp7_ = NULL;
-		_tmp6_ = container_caps;
-		_tmp7_ = gst_caps_from_string (_tmp6_);
-		_gst_caps_unref0 (self->container_format);
-		self->container_format = _tmp7_;
-	}
-	_tmp8_ = audio_codec_caps;
-	_tmp9_ = gst_caps_from_string (_tmp8_);
-	_gst_caps_unref0 (self->audio_codec_format);
-	self->audio_codec_format = _tmp9_;
-	return self;
+RygelAudioTranscoder* rygel_audio_transcoder_new (const gchar* content_type, gint audio_bitrate, const gchar* container_caps, const gchar* audio_codec_caps, const gchar* extension) {
+  return rygel_audio_transcoder_construct (RYGEL_TYPE_AUDIO_TRANSCODER, content_type, audio_bitrate, container_caps, audio_codec_caps, extension);
 }
 
 
-RygelAudioTranscoder* rygel_audio_transcoder_new_with_class (const gchar* content_type, const gchar* dlna_profile, const gchar* upnp_class, gint audio_bitrate, const gchar* container_caps, const gchar* audio_codec_caps, const gchar* extension) {
-	return rygel_audio_transcoder_construct_with_class (RYGEL_TYPE_AUDIO_TRANSCODER, content_type, dlna_profile, upnp_class, audio_bitrate, container_caps, audio_codec_caps, extension);
+RygelAudioTranscoder*
+rygel_audio_transcoder_construct_with_class (GType object_type, const gchar* content_type, const gchar* upnp_class, gint audio_bitrate, const gchar* container_caps, const gchar* audio_codec_caps, const gchar* extension) {
+  RygelAudioTranscoder * self = NULL;
+  const gchar* _tmp0_;
+  const gchar* _tmp1_;
+  const gchar* _tmp2_;
+  const gchar* _tmp3_;
+  gint _tmp4_;
+  const gchar* _tmp5_;
+  const gchar* _tmp8_;
+  GstCaps* _tmp9_ = NULL;
+  g_return_val_if_fail (content_type != NULL, NULL);
+  g_return_val_if_fail (upnp_class != NULL, NULL);
+  g_return_val_if_fail (audio_codec_caps != NULL, NULL);
+  g_return_val_if_fail (extension != NULL, NULL);
+  _tmp0_ = content_type;
+  _tmp2_ = upnp_class;
+  _tmp3_ = extension;
+  self = (RygelAudioTranscoder*) rygel_gst_transcoder_construct (object_type, _tmp0_, _tmp2_, _tmp3_);
+  _tmp4_ = audio_bitrate;
+  self->audio_bitrate = _tmp4_;
+  _tmp5_ = container_caps;
+  if (_tmp5_ != NULL) {
+    const gchar* _tmp6_;
+    GstCaps* _tmp7_ = NULL;
+    _tmp6_ = container_caps;
+    _tmp7_ = gst_caps_from_string (_tmp6_);
+    _gst_caps_unref0 (self->container_format);
+    self->container_format = _tmp7_;
+  }
+  _tmp8_ = audio_codec_caps;
+  _tmp9_ = gst_caps_from_string (_tmp8_);
+  _gst_caps_unref0 (self->audio_codec_format);
+  self->audio_codec_format = _tmp9_;
+  return self;
 }
 
-
-static GUPnPDIDLLiteResource* rygel_audio_transcoder_real_add_resource (RygelTranscoder* base, GUPnPDIDLLiteItem* didl_item, RygelMediaItem* item, RygelTranscodeManager* manager, GError** error) {
-	RygelAudioTranscoder * self;
-	GUPnPDIDLLiteResource* result = NULL;
-	GUPnPDIDLLiteItem* _tmp0_;
-	RygelMediaItem* _tmp1_;
-	RygelTranscodeManager* _tmp2_;
-	GUPnPDIDLLiteResource* _tmp3_ = NULL;
-	GUPnPDIDLLiteResource* resource;
-	gint _tmp4_;
-	GError * _inner_error_ = NULL;
-	self = (RygelAudioTranscoder*) base;
-	g_return_val_if_fail (didl_item != NULL, NULL);
-	g_return_val_if_fail (item != NULL, NULL);
-	g_return_val_if_fail (manager != NULL, NULL);
-	_tmp0_ = didl_item;
-	_tmp1_ = item;
-	_tmp2_ = manager;
-	_tmp3_ = RYGEL_TRANSCODER_CLASS (rygel_audio_transcoder_parent_class)->add_resource ((RygelTranscoder*) G_TYPE_CHECK_INSTANCE_CAST (self, RYGEL_TYPE_GST_TRANSCODER, RygelGstTranscoder), _tmp0_, _tmp1_, _tmp2_, &_inner_error_);
-	resource = _tmp3_;
-	if (_inner_error_ != NULL) {
-		g_propagate_error (error, _inner_error_);
-		return NULL;
-	}
-	if (resource == NULL) {
-		result = NULL;
-		_g_object_unref0 (resource);
-		return result;
-	}
-	_tmp4_ = self->audio_bitrate;
-	gupnp_didl_lite_resource_set_bitrate (resource, (_tmp4_ * 1000) / 8);
-	result = resource;
-	return result;
-}
-
-
-static gpointer _g_object_ref0 (gpointer self) {
-	return self ? g_object_ref (self) : NULL;
+RygelAudioTranscoder*
+rygel_audio_transcoder_new_with_class (const gchar* content_type, const gchar* upnp_class, gint audio_bitrate, const gchar* container_caps, const gchar* audio_codec_caps, const gchar* extension) {
+  return rygel_audio_transcoder_construct_with_class (RYGEL_TYPE_AUDIO_TRANSCODER, content_type, upnp_class, audio_bitrate, container_caps, audio_codec_caps, extension);
 }
 
-
-static guint rygel_audio_transcoder_real_get_distance (RygelTranscoder* base, RygelMediaItem* item) {
-	RygelAudioTranscoder * self;
-	guint result = 0U;
-	gboolean _tmp0_ = FALSE;
-	RygelMediaItem* _tmp1_;
-	gboolean _tmp3_;
-	RygelMediaItem* _tmp5_;
-	RygelAudioItem* _tmp6_;
-	RygelAudioItem* audio_item;
-	guint _tmp7_;
-	guint distance;
-	RygelAudioItem* _tmp8_;
-	gint _tmp9_;
-	gint _tmp10_;
-	self = (RygelAudioTranscoder*) base;
-	g_return_val_if_fail (item != NULL, 0U);
-	_tmp1_ = item;
-	if (!G_TYPE_CHECK_INSTANCE_TYPE (_tmp1_, RYGEL_TYPE_AUDIO_ITEM)) {
-		_tmp0_ = TRUE;
-	} else {
-		RygelMediaItem* _tmp2_;
-		_tmp2_ = item;
-		_tmp0_ = G_TYPE_CHECK_INSTANCE_TYPE (_tmp2_, RYGEL_TYPE_VIDEO_ITEM);
-	}
-	_tmp3_ = _tmp0_;
-	if (_tmp3_) {
-		guint _tmp4_;
-		_tmp4_ = G_MAXUINT;
-		result = _tmp4_;
-		return result;
-	}
-	_tmp5_ = item;
-	_tmp6_ = _g_object_ref0 (G_TYPE_CHECK_INSTANCE_TYPE (_tmp5_, RYGEL_TYPE_AUDIO_ITEM) ? ((RygelAudioItem*) _tmp5_) : NULL);
-	audio_item = _tmp6_;
-	_tmp7_ = 0;
-	distance = _tmp7_;
-	_tmp8_ = audio_item;
-	_tmp9_ = rygel_audio_item_get_bitrate (_tmp8_);
-	_tmp10_ = _tmp9_;
-	if (_tmp10_ > 0) {
-		guint _tmp11_;
-		RygelAudioItem* _tmp12_;
-		gint _tmp13_;
-		gint _tmp14_;
-		gint _tmp15_;
-		gint _tmp16_ = 0;
-		_tmp11_ = distance;
-		_tmp12_ = audio_item;
-		_tmp13_ = rygel_audio_item_get_bitrate (_tmp12_);
-		_tmp14_ = _tmp13_;
-		_tmp15_ = self->audio_bitrate;
-		_tmp16_ = abs (_tmp14_ - _tmp15_);
-		distance = _tmp11_ + _tmp16_;
-	}
-	result = distance;
-	_g_object_unref0 (audio_item);
-	return result;
-}
-
-
-static gpointer _gst_encoding_profile_ref0 (gpointer self) {
-	return self ? gst_encoding_profile_ref (self) : NULL;
+static GUPnPDIDLLiteResource*
+rygel_audio_transcoder_real_add_resource (RygelTranscoder* base, GUPnPDIDLLiteItem* didl_item, RygelMediaItem* item, RygelTranscodeManager* manager, GError** error) {
+  RygelAudioTranscoder * self;
+  GUPnPDIDLLiteResource* result = NULL;
+  GUPnPDIDLLiteItem* _tmp0_;
+  RygelMediaItem* _tmp1_;
+  RygelTranscodeManager* _tmp2_;
+  GUPnPDIDLLiteResource* _tmp3_ = NULL;
+  GUPnPDIDLLiteResource* resource;
+  gint _tmp4_;
+  GError * _inner_error_ = NULL;
+  self = (RygelAudioTranscoder*) base;
+  g_return_val_if_fail (didl_item != NULL, NULL);
+  g_return_val_if_fail (item != NULL, NULL);
+  g_return_val_if_fail (manager != NULL, NULL);
+  _tmp0_ = didl_item;
+  _tmp1_ = item;
+  _tmp2_ = manager;
+  _tmp3_ = RYGEL_TRANSCODER_CLASS (rygel_audio_transcoder_parent_class)->add_resource ((RygelTranscoder*) G_TYPE_CHECK_INSTANCE_CAST (self, RYGEL_TYPE_GST_TRANSCODER, RygelGstTranscoder), _tmp0_, _tmp1_, _tmp2_, &_inner_error_);
+  resource = _tmp3_;
+  if (_inner_error_ != NULL) {
+    g_propagate_error (error, _inner_error_);
+    return NULL;
+  }
+  if (resource == NULL) {
+    result = NULL;
+    _g_object_unref0 (resource);
+    return result;
+  }
+  _tmp4_ = self->audio_bitrate;
+  gupnp_didl_lite_resource_set_bitrate (resource, (_tmp4_ * 1000) / 8);
+  result = resource;
+  return result;
 }
 
-
-static GstEncodingProfile* rygel_audio_transcoder_real_get_encoding_profile (RygelGstTranscoder* base) {
-	RygelAudioTranscoder * self;
-	GstEncodingProfile* result = NULL;
-	GstCaps* _tmp0_;
-	const gchar* _tmp1_;
-	const gchar* _tmp2_;
-	GstEncodingAudioProfile* _tmp3_;
-	GstEncodingAudioProfile* enc_audio_profile;
-	GstEncodingAudioProfile* _tmp4_;
-	GstCaps* _tmp5_;
-	self = (RygelAudioTranscoder*) base;
-	_tmp0_ = self->audio_codec_format;
-	_tmp1_ = rygel_gst_transcoder_get_preset ((RygelGstTranscoder*) self);
-	_tmp2_ = _tmp1_;
-	_tmp3_ = gst_encoding_audio_profile_new (_tmp0_, _tmp2_, NULL, (guint) 1);
-	enc_audio_profile = _tmp3_;
-	_tmp4_ = enc_audio_profile;
-	gst_encoding_profile_set_name ((GstEncodingProfile*) _tmp4_, "audio");
-	_tmp5_ = self->container_format;
-	if (_tmp5_ != NULL) {
-		GstCaps* _tmp6_;
-		const gchar* _tmp7_;
-		const gchar* _tmp8_;
-		GstEncodingContainerProfile* _tmp9_;
-		GstEncodingContainerProfile* enc_container_profile;
-		GstEncodingContainerProfile* _tmp10_;
-		GstEncodingAudioProfile* _tmp11_;
-		GstEncodingProfile* _tmp12_;
-		_tmp6_ = self->container_format;
-		_tmp7_ = rygel_gst_transcoder_get_preset ((RygelGstTranscoder*) self);
-		_tmp8_ = _tmp7_;
-		_tmp9_ = gst_encoding_container_profile_new ("container", NULL, _tmp6_, _tmp8_);
-		enc_container_profile = _tmp9_;
-		_tmp10_ = enc_container_profile;
-		_tmp11_ = enc_audio_profile;
-		_tmp12_ = _gst_encoding_profile_ref0 ((GstEncodingProfile*) _tmp11_);
-		gst_encoding_container_profile_add_profile (_tmp10_, _tmp12_);
-		result = (GstEncodingProfile*) enc_container_profile;
-		_gst_encoding_profile_unref0 (enc_audio_profile);
-		return result;
-	}
-	result = (GstEncodingProfile*) enc_audio_profile;
-	return result;
+static guint
+rygel_audio_transcoder_real_get_distance (RygelTranscoder* base, RygelMediaItem* item) {
+  RygelAudioTranscoder * self;
+  guint result = 0U;
+  gboolean _tmp0_ = FALSE;
+  RygelMediaItem* _tmp1_;
+  gboolean _tmp3_;
+  RygelMediaItem* _tmp5_;
+  RygelAudioItem* _tmp6_;
+  RygelAudioItem* audio_item;
+  guint _tmp7_;
+  guint distance;
+  RygelAudioItem* _tmp8_;
+  gint _tmp9_;
+  gint _tmp10_;
+  self = (RygelAudioTranscoder*) base;
+  g_return_val_if_fail (item != NULL, 0U);
+  _tmp1_ = item;
+  if (!G_TYPE_CHECK_INSTANCE_TYPE (_tmp1_, RYGEL_TYPE_AUDIO_ITEM)) {
+    _tmp0_ = TRUE;
+  } else {
+    RygelMediaItem* _tmp2_;
+    _tmp2_ = item;
+    _tmp0_ = G_TYPE_CHECK_INSTANCE_TYPE (_tmp2_, RYGEL_TYPE_VIDEO_ITEM);
+  }
+  _tmp3_ = _tmp0_;
+  if (_tmp3_) {
+    guint _tmp4_;
+    _tmp4_ = G_MAXUINT;
+    result = _tmp4_;
+    return result;
+  }
+  _tmp5_ = item;
+  _tmp6_ = _g_object_ref0 (G_TYPE_CHECK_INSTANCE_TYPE (_tmp5_, RYGEL_TYPE_AUDIO_ITEM) ? ((RygelAudioItem*) _tmp5_) : NULL);
+  audio_item = _tmp6_;
+  _tmp7_ = 0;
+  distance = _tmp7_;
+  _tmp8_ = audio_item;
+  _tmp9_ = rygel_audio_item_get_bitrate (_tmp8_);
+  _tmp10_ = _tmp9_;
+  if (_tmp10_ > 0) {
+    guint _tmp11_;
+    RygelAudioItem* _tmp12_;
+    gint _tmp13_;
+    gint _tmp14_;
+    gint _tmp15_;
+    gint _tmp16_ = 0;
+    _tmp11_ = distance;
+    _tmp12_ = audio_item;
+    _tmp13_ = rygel_audio_item_get_bitrate (_tmp12_);
+    _tmp14_ = _tmp13_;
+    _tmp15_ = self->audio_bitrate;
+    _tmp16_ = abs (_tmp14_ - _tmp15_);
+    distance = _tmp11_ + _tmp16_;
+  }
+  result = distance;
+  _g_object_unref0 (audio_item);
+  return result;
 }
 
-
-static void rygel_audio_transcoder_class_init (RygelAudioTranscoderClass * klass) {
-	rygel_audio_transcoder_parent_class = g_type_class_peek_parent (klass);
-	RYGEL_TRANSCODER_CLASS (klass)->add_resource = rygel_audio_transcoder_real_add_resource;
-	RYGEL_TRANSCODER_CLASS (klass)->get_distance = rygel_audio_transcoder_real_get_distance;
-	RYGEL_GST_TRANSCODER_CLASS (klass)->get_encoding_profile = rygel_audio_transcoder_real_get_encoding_profile;
-	G_OBJECT_CLASS (klass)->finalize = rygel_audio_transcoder_finalize;
+static GstEncodingProfile*
+rygel_audio_transcoder_real_get_encoding_profile (RygelGstTranscoder* base) {
+  RygelAudioTranscoder * self;
+  GstEncodingProfile* result = NULL;
+  GstCaps* _tmp0_;
+  const gchar* _tmp1_;
+  const gchar* _tmp2_;
+  GstEncodingAudioProfile* _tmp3_;
+  GstEncodingAudioProfile* enc_audio_profile;
+  GstEncodingAudioProfile* _tmp4_;
+  GstCaps* _tmp5_;
+  self = (RygelAudioTranscoder*) base;
+  _tmp0_ = self->audio_codec_format;
+  _tmp1_ = rygel_gst_transcoder_get_preset ((RygelGstTranscoder*) self);
+  _tmp2_ = _tmp1_;
+  _tmp3_ = gst_encoding_audio_profile_new (_tmp0_, _tmp2_, NULL, (guint) 1);
+  enc_audio_profile = _tmp3_;
+  _tmp4_ = enc_audio_profile;
+  gst_encoding_profile_set_name ((GstEncodingProfile*) _tmp4_, "audio");
+  _tmp5_ = self->container_format;
+  if (_tmp5_ != NULL) {
+    GstCaps* _tmp6_;
+    const gchar* _tmp7_;
+    const gchar* _tmp8_;
+    GstEncodingContainerProfile* _tmp9_;
+    GstEncodingContainerProfile* enc_container_profile;
+    GstEncodingContainerProfile* _tmp10_;
+    GstEncodingAudioProfile* _tmp11_;
+    GstEncodingProfile* _tmp12_;
+    _tmp6_ = self->container_format;
+    _tmp7_ = rygel_gst_transcoder_get_preset ((RygelGstTranscoder*) self);
+    _tmp8_ = _tmp7_;
+    _tmp9_ = gst_encoding_container_profile_new ("container", NULL, _tmp6_, _tmp8_);
+    enc_container_profile = _tmp9_;
+    _tmp10_ = enc_container_profile;
+    _tmp11_ = enc_audio_profile;
+    _tmp12_ = _gst_encoding_profile_ref0 ((GstEncodingProfile*) _tmp11_);
+    gst_encoding_container_profile_add_profile (_tmp10_, _tmp12_);
+    result = (GstEncodingProfile*) enc_container_profile;
+    _gst_encoding_profile_unref0 (enc_audio_profile);
+    return result;
+  }
+  result = (GstEncodingProfile*) enc_audio_profile;
+  return result;
 }
 
-
-static void rygel_audio_transcoder_instance_init (RygelAudioTranscoder * self) {
-	self->container_format = NULL;
-	self->audio_codec_format = NULL;
+static void
+rygel_audio_transcoder_class_init (RygelAudioTranscoderClass * klass) {
+  rygel_audio_transcoder_parent_class = g_type_class_peek_parent (klass);
+  RYGEL_TRANSCODER_CLASS (klass)->add_resource = rygel_audio_transcoder_real_add_resource;
+  RYGEL_TRANSCODER_CLASS (klass)->get_distance = rygel_audio_transcoder_real_get_distance;
+  RYGEL_GST_TRANSCODER_CLASS (klass)->get_encoding_profile = rygel_audio_transcoder_real_get_encoding_profile;
+  G_OBJECT_CLASS (klass)->finalize = rygel_audio_transcoder_finalize;
 }
 
-
-static void rygel_audio_transcoder_finalize (GObject* obj) {
-	RygelAudioTranscoder * self;
-	self = G_TYPE_CHECK_INSTANCE_CAST (obj, RYGEL_TYPE_AUDIO_TRANSCODER, RygelAudioTranscoder);
-	_gst_caps_unref0 (self->container_format);
-	_gst_caps_unref0 (self->audio_codec_format);
-	G_OBJECT_CLASS (rygel_audio_transcoder_parent_class)->finalize (obj);
+static void
+rygel_audio_transcoder_init (RygelAudioTranscoder * self) {
+  self->container_format = NULL;
+  self->audio_codec_format = NULL;
 }
 
-
-/**
- * Base class for all transcoders that handle audio.
- */
-GType rygel_audio_transcoder_get_type (void) {
-	static volatile gsize rygel_audio_transcoder_type_id__volatile = 0;
-	if (g_once_init_enter (&rygel_audio_transcoder_type_id__volatile)) {
-		static const GTypeInfo g_define_type_info = { sizeof (RygelAudioTranscoderClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) rygel_audio_transcoder_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (RygelAudioTranscoder), 0, (GInstanceInitFunc) rygel_audio_transcoder_instance_init, NULL };
-		GType rygel_audio_transcoder_type_id;
-		rygel_audio_transcoder_type_id = g_type_register_static (RYGEL_TYPE_GST_TRANSCODER, "RygelAudioTranscoder", &g_define_type_info, 0);
-		g_once_init_leave (&rygel_audio_transcoder_type_id__volatile, rygel_audio_transcoder_type_id);
-	}
-	return rygel_audio_transcoder_type_id__volatile;
+static void
+rygel_audio_transcoder_finalize (GObject* obj) {
+  RygelAudioTranscoder * self;
+  self = G_TYPE_CHECK_INSTANCE_CAST (obj, RYGEL_TYPE_AUDIO_TRANSCODER, RygelAudioTranscoder);
+  _gst_caps_unref0 (self->container_format);
+  _gst_caps_unref0 (self->audio_codec_format);
+  G_OBJECT_CLASS (rygel_audio_transcoder_parent_class)->finalize (obj);
 }
 
 
diff --git a/src/rygel-audio-transcoder.h b/src/rygel-audio-transcoder.h
new file mode 100644
index 0000000..5fcc6c0
--- /dev/null
+++ b/src/rygel-audio-transcoder.h
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2009 Nokia Corporation
+ * Copyright (C) 2012 Intel Corporation
+ *
+ * Rygel is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Rygel 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __RYGEL_GST_0_10_MEDIA_ENGINE_AUDIO_TRANSCODER_H__
+#define __RYGEL_GST_0_10_MEDIA_ENGINE_AUDIO_TRANSCODER_H__
+
+#include <glib.h>
+#include <glib-object.h>
+#include <stdlib.h>
+#include <string.h>
+#include <rygel-server.h>
+#include <gst/gst.h>
+#include <libgupnp-dlna/gupnp-dlna-discoverer.h>
+#include <libgupnp-dlna/gupnp-dlna-profile.h>
+#include <gee.h>
+#include <rygel-core.h>
+#include "rygel-gst-transcoder.h"
+
+G_BEGIN_DECLS
+
+#define RYGEL_TYPE_AUDIO_TRANSCODER (rygel_audio_transcoder_get_type ())
+#define RYGEL_AUDIO_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_AUDIO_TRANSCODER, RygelAudioTranscoder))
+#define RYGEL_AUDIO_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_AUDIO_TRANSCODER, RygelAudioTranscoderClass))
+#define RYGEL_IS_AUDIO_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_AUDIO_TRANSCODER))
+#define RYGEL_IS_AUDIO_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_AUDIO_TRANSCODER))
+#define RYGEL_AUDIO_TRANSCODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_AUDIO_TRANSCODER, RygelAudioTranscoderClass))
+
+typedef struct _RygelAudioTranscoder RygelAudioTranscoder;
+typedef struct _RygelAudioTranscoderClass RygelAudioTranscoderClass;
+typedef struct _RygelAudioTranscoderPrivate RygelAudioTranscoderPrivate;
+
+struct _RygelAudioTranscoder {
+  RygelGstTranscoder parent_instance;
+  RygelAudioTranscoderPrivate * priv;
+
+  /* TODO: Put this in priv? */
+  gint audio_bitrate;
+  GstCaps* container_format;
+  GstCaps* audio_codec_format;
+};
+
+struct _RygelAudioTranscoderClass {
+  RygelGstTranscoderClass parent_class;
+};
+
+GType rygel_audio_transcoder_get_type (void) G_GNUC_CONST;
+
+RygelAudioTranscoder* rygel_audio_transcoder_new (const gchar* content_type, gint audio_bitrate, const gchar* container_caps, const gchar* audio_codec_caps, const gchar* extension);
+RygelAudioTranscoder* rygel_audio_transcoder_new_with_class (const gchar* content_type, const gchar* upnp_class, gint audio_bitrate, const gchar* container_caps, const gchar* audio_codec_caps, const gchar* extension);
+
+#define RYGEL_AUDIO_TRANSCODER_NO_CONTAINER NULL
+
+G_END_DECLS
+
+#endif /* __RYGEL_GST_0_10_MEDIA_ENGINE_AUDIO_TRANSCODER_H__ */
diff --git a/src/rygel-avc-transcoder.c b/src/rygel-avc-transcoder.c
index 958ae34..6bad8a9 100644
--- a/src/rygel-avc-transcoder.c
+++ b/src/rygel-avc-transcoder.c
@@ -20,122 +20,17 @@
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  */
 
-#include <glib.h>
-#include <glib-object.h>
-#include <rygel-server.h>
-#include <gst/pbutils/pbutils.h>
-#include <gst/gst.h>
-#include <stdlib.h>
-#include <string.h>
-#include <libgupnp-av/gupnp-av.h>
+#include "rygel-avc-transcoder.h"
 
+G_DEFINE_TYPE (RygelAVCTranscoder, rygel_avc_transcoder, RYGEL_TYPE_VIDEO_TRANSCODER)
 
-#define RYGEL_TYPE_GST_TRANSCODER (rygel_gst_transcoder_get_type ())
-#define RYGEL_GST_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_GST_TRANSCODER, RygelGstTranscoder))
-#define RYGEL_GST_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_GST_TRANSCODER, RygelGstTranscoderClass))
-#define RYGEL_IS_GST_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_GST_TRANSCODER))
-#define RYGEL_IS_GST_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_GST_TRANSCODER))
-#define RYGEL_GST_TRANSCODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_GST_TRANSCODER, RygelGstTranscoderClass))
-
-typedef struct _RygelGstTranscoder RygelGstTranscoder;
-typedef struct _RygelGstTranscoderClass RygelGstTranscoderClass;
-typedef struct _RygelGstTranscoderPrivate RygelGstTranscoderPrivate;
-
-#define RYGEL_TYPE_AUDIO_TRANSCODER (rygel_audio_transcoder_get_type ())
-#define RYGEL_AUDIO_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_AUDIO_TRANSCODER, RygelAudioTranscoder))
-#define RYGEL_AUDIO_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_AUDIO_TRANSCODER, RygelAudioTranscoderClass))
-#define RYGEL_IS_AUDIO_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_AUDIO_TRANSCODER))
-#define RYGEL_IS_AUDIO_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_AUDIO_TRANSCODER))
-#define RYGEL_AUDIO_TRANSCODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_AUDIO_TRANSCODER, RygelAudioTranscoderClass))
-
-typedef struct _RygelAudioTranscoder RygelAudioTranscoder;
-typedef struct _RygelAudioTranscoderClass RygelAudioTranscoderClass;
-typedef struct _RygelAudioTranscoderPrivate RygelAudioTranscoderPrivate;
-
-#define RYGEL_TYPE_VIDEO_TRANSCODER (rygel_video_transcoder_get_type ())
-#define RYGEL_VIDEO_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_VIDEO_TRANSCODER, RygelVideoTranscoder))
-#define RYGEL_VIDEO_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_VIDEO_TRANSCODER, RygelVideoTranscoderClass))
-#define RYGEL_IS_VIDEO_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_VIDEO_TRANSCODER))
-#define RYGEL_IS_VIDEO_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_VIDEO_TRANSCODER))
-#define RYGEL_VIDEO_TRANSCODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_VIDEO_TRANSCODER, RygelVideoTranscoderClass))
-
-typedef struct _RygelVideoTranscoder RygelVideoTranscoder;
-typedef struct _RygelVideoTranscoderClass RygelVideoTranscoderClass;
-typedef struct _RygelVideoTranscoderPrivate RygelVideoTranscoderPrivate;
-
-#define RYGEL_TYPE_AVC_TRANSCODER (rygel_avc_transcoder_get_type ())
-#define RYGEL_AVC_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_AVC_TRANSCODER, RygelAVCTranscoder))
-#define RYGEL_AVC_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_AVC_TRANSCODER, RygelAVCTranscoderClass))
-#define RYGEL_IS_AVC_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_AVC_TRANSCODER))
-#define RYGEL_IS_AVC_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_AVC_TRANSCODER))
-#define RYGEL_AVC_TRANSCODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_AVC_TRANSCODER, RygelAVCTranscoderClass))
-
-typedef struct _RygelAVCTranscoder RygelAVCTranscoder;
-typedef struct _RygelAVCTranscoderClass RygelAVCTranscoderClass;
-typedef struct _RygelAVCTranscoderPrivate RygelAVCTranscoderPrivate;
-#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
-
-struct _RygelGstTranscoder {
-	RygelTranscoder parent_instance;
-	RygelGstTranscoderPrivate * priv;
-};
-
-struct _RygelGstTranscoderClass {
-	RygelTranscoderClass parent_class;
-	GstEncodingProfile* (*get_encoding_profile) (RygelGstTranscoder* self);
-};
-
-struct _RygelAudioTranscoder {
-	RygelGstTranscoder parent_instance;
-	RygelAudioTranscoderPrivate * priv;
-	gint audio_bitrate;
-	GstCaps* container_format;
-	GstCaps* audio_codec_format;
-};
-
-struct _RygelAudioTranscoderClass {
-	RygelGstTranscoderClass parent_class;
-};
-
-struct _RygelVideoTranscoder {
-	RygelAudioTranscoder parent_instance;
-	RygelVideoTranscoderPrivate * priv;
-};
-
-struct _RygelVideoTranscoderClass {
-	RygelAudioTranscoderClass parent_class;
-};
-
-struct _RygelAVCTranscoder {
-	RygelVideoTranscoder parent_instance;
-	RygelAVCTranscoderPrivate * priv;
-};
-
-struct _RygelAVCTranscoderClass {
-	RygelVideoTranscoderClass parent_class;
-};
-
-
-static gpointer rygel_avc_transcoder_parent_class = NULL;
-
-GType rygel_gst_transcoder_get_type (void) G_GNUC_CONST;
-GType rygel_audio_transcoder_get_type (void) G_GNUC_CONST;
-GType rygel_video_transcoder_get_type (void) G_GNUC_CONST;
-GType rygel_avc_transcoder_get_type (void) G_GNUC_CONST;
-enum  {
-	RYGEL_AVC_TRANSCODER_DUMMY_PROPERTY
-};
 #define RYGEL_AVC_TRANSCODER_VIDEO_BITRATE 1200
 #define RYGEL_AVC_TRANSCODER_AUDIO_BITRATE 64
 #define RYGEL_AVC_TRANSCODER_CONTAINER "video/quicktime,variant=iso"
 #define RYGEL_AVC_TRANSCODER_AUDIO_CAPS "audio/mpeg,mpegversion=4"
 #define RYGEL_AVC_TRANSCODER_VIDEO_CAPS "video/x-h264,stream-format=avc"
 #define RYGEL_AVC_TRANSCODER_RESTRICTIONS "video/x-raw-yuv,framerate=(fraction)15/1,width=352,height=288"
-RygelAVCTranscoder* rygel_avc_transcoder_new (void);
-RygelAVCTranscoder* rygel_avc_transcoder_construct (GType object_type);
-RygelVideoTranscoder* rygel_video_transcoder_new (const gchar* content_type, const gchar* dlna_profile, gint audio_bitrate, gint video_bitrate, const gchar* container_caps, const gchar* audio_codec_caps, const gchar* video_codec_caps, const gchar* extension, const gchar* restrictions);
-RygelVideoTranscoder* rygel_video_transcoder_construct (GType object_type, const gchar* content_type, const gchar* dlna_profile, gint audio_bitrate, gint video_bitrate, const gchar* container_caps, const gchar* audio_codec_caps, const gchar* video_codec_caps, const gchar* extension, const gchar* restrictions);
-void rygel_gst_transcoder_set_preset (RygelGstTranscoder* self, const gchar* value);
+
 static GUPnPDIDLLiteResource* rygel_avc_transcoder_real_add_resource (RygelTranscoder* base, GUPnPDIDLLiteItem* didl_item, RygelMediaItem* item, RygelTranscodeManager* manager, GError** error);
 
 
@@ -192,24 +87,6 @@ static void rygel_avc_transcoder_class_init (RygelAVCTranscoderClass * klass) {
 }
 
 
-static void rygel_avc_transcoder_instance_init (RygelAVCTranscoder * self) {
+static void rygel_avc_transcoder_init (RygelAVCTranscoder * self) {
 }
 
-
-/**
- * Transcoder for H.264 in MP4 conforming to DLNA profile
- * AVC_MP4_BL_CIF15_AAC_520 (15 fps, CIF resolution)
- */
-GType rygel_avc_transcoder_get_type (void) {
-	static volatile gsize rygel_avc_transcoder_type_id__volatile = 0;
-	if (g_once_init_enter (&rygel_avc_transcoder_type_id__volatile)) {
-		static const GTypeInfo g_define_type_info = { sizeof (RygelAVCTranscoderClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) rygel_avc_transcoder_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (RygelAVCTranscoder), 0, (GInstanceInitFunc) rygel_avc_transcoder_instance_init, NULL };
-		GType rygel_avc_transcoder_type_id;
-		rygel_avc_transcoder_type_id = g_type_register_static (RYGEL_TYPE_VIDEO_TRANSCODER, "RygelAVCTranscoder", &g_define_type_info, 0);
-		g_once_init_leave (&rygel_avc_transcoder_type_id__volatile, rygel_avc_transcoder_type_id);
-	}
-	return rygel_avc_transcoder_type_id__volatile;
-}
-
-
-
diff --git a/src/rygel-avc-transcoder.h b/src/rygel-avc-transcoder.h
new file mode 100644
index 0000000..c5801ba
--- /dev/null
+++ b/src/rygel-avc-transcoder.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2009 Nokia Corporation
+ * Copyright (C) 2012 Intel Corporation
+ *
+ * Rygel is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Rygel 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __RYGEL_GST_0_10_MEDIA_ENGINE_AVC_TRANSCODER_H__
+#define __RYGEL_GST_0_10_MEDIA_ENGINE_AVC_TRANSCODER_H__
+
+#include "rygel-video-transcoder.h"
+
+G_BEGIN_DECLS
+
+#define RYGEL_TYPE_AVC_TRANSCODER (rygel_avc_transcoder_get_type ())
+#define RYGEL_AVC_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_AVC_TRANSCODER, RygelAVCTranscoder))
+#define RYGEL_AVC_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_AVC_TRANSCODER, RygelAVCTranscoderClass))
+#define RYGEL_IS_AVC_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_AVC_TRANSCODER))
+#define RYGEL_IS_AVC_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_AVC_TRANSCODER))
+#define RYGEL_AVC_TRANSCODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_AVC_TRANSCODER, RygelAVCTranscoderClass))
+
+typedef struct _RygelAVCTranscoder RygelAVCTranscoder;
+typedef struct _RygelAVCTranscoderClass RygelAVCTranscoderClass;
+typedef struct _RygelAVCTranscoderPrivate RygelAVCTranscoderPrivate;
+
+struct _RygelAVCTranscoder {
+  RygelVideoTranscoder parent_instance;
+  RygelAVCTranscoderPrivate * priv;
+};
+
+struct _RygelAVCTranscoderClass {
+  RygelVideoTranscoderClass parent_class;
+};
+
+GType rygel_avc_transcoder_get_type (void) G_GNUC_CONST;
+
+RygelAVCTranscoder* rygel_avc_transcoder_new (void);
+
+G_END_DECLS
+
+#endif /* __RYGEL_GST_0_10_MEDIA_ENGINE_AVC_TRANSCODER_H__ */
diff --git a/src/rygel-gst-data-source.c b/src/rygel-gst-data-source.c
index 8cf4e10..836874b 100644
--- a/src/rygel-gst-data-source.c
+++ b/src/rygel-gst-data-source.c
@@ -20,57 +20,20 @@
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  */
 
-#include <glib.h>
-#include <glib-object.h>
-#include <rygel-server.h>
-#include <gst/gst.h>
-#include <gst/base/gstbasesink.h>
-#include <gio/gio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <glib/gi18n-lib.h>
-
-
-#define RYGEL_TYPE_GST_DATA_SOURCE (rygel_gst_data_source_get_type ())
-#define RYGEL_GST_DATA_SOURCE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_GST_DATA_SOURCE, RygelGstDataSource))
-#define RYGEL_GST_DATA_SOURCE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_GST_DATA_SOURCE, RygelGstDataSourceClass))
-#define RYGEL_IS_GST_DATA_SOURCE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_GST_DATA_SOURCE))
-#define RYGEL_IS_GST_DATA_SOURCE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_GST_DATA_SOURCE))
-#define RYGEL_GST_DATA_SOURCE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_GST_DATA_SOURCE, RygelGstDataSourceClass))
-
-typedef struct _RygelGstDataSource RygelGstDataSource;
-typedef struct _RygelGstDataSourceClass RygelGstDataSourceClass;
-typedef struct _RygelGstDataSourcePrivate RygelGstDataSourcePrivate;
-
-#define RYGEL_TYPE_GST_SINK (rygel_gst_sink_get_type ())
-#define RYGEL_GST_SINK(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_GST_SINK, RygelGstSink))
-#define RYGEL_GST_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_GST_SINK, RygelGstSinkClass))
-#define RYGEL_IS_GST_SINK(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_GST_SINK))
-#define RYGEL_IS_GST_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_GST_SINK))
-#define RYGEL_GST_SINK_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_GST_SINK, RygelGstSinkClass))
-
-typedef struct _RygelGstSink RygelGstSink;
-typedef struct _RygelGstSinkClass RygelGstSinkClass;
-typedef struct _RygelGstSinkPrivate RygelGstSinkPrivate;
-#define _gst_object_unref0(var) ((var == NULL) ? NULL : (var = (gst_object_unref (var), NULL)))
-#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
-#define _g_free0(var) (var = (g_free (var), NULL))
-#define _gst_caps_unref0(var) ((var == NULL) ? NULL : (var = (gst_caps_unref (var), NULL)))
-#define _g_error_free0(var) ((var == NULL) ? NULL : (var = (g_error_free (var), NULL)))
+
+#include "rygel-gst-data-source.h"
+#include "rygel-gst-sink.h"
+
+static void rygel_gst_data_source_rygel_data_source_interface_init (RygelDataSourceIface * iface);
+
+G_DEFINE_TYPE_WITH_CODE (RygelGstDataSource, rygel_gst_data_source, G_TYPE_OBJECT,
+  G_IMPLEMENT_INTERFACE (RYGEL_TYPE_DATA_SOURCE, rygel_gst_data_source_rygel_data_source_interface_init))
 
 typedef enum  {
 	RYGEL_GST_DATA_SOURCE_ERROR_NOT_COMPATIBLE
 } RygelGstDataSourceError;
-#define RYGEL_GST_DATA_SOURCE_ERROR rygel_gst_data_source_error_quark ()
-struct _RygelGstDataSource {
-	GObject parent_instance;
-	RygelGstDataSourcePrivate * priv;
-	GstElement* src;
-};
 
-struct _RygelGstDataSourceClass {
-	GObjectClass parent_class;
-};
+#define RYGEL_GST_DATA_SOURCE_ERROR rygel_gst_data_source_error_quark ()
 
 struct _RygelGstDataSourcePrivate {
 	GstPipeline* pipeline;
@@ -79,28 +42,9 @@ struct _RygelGstDataSourcePrivate {
 	guint bus_watch_id;
 };
 
-struct _RygelGstSink {
-	GstBaseSink parent_instance;
-	RygelGstSinkPrivate * priv;
-	GCancellable* cancellable;
-};
-
-struct _RygelGstSinkClass {
-	GstBaseSinkClass parent_class;
-};
-
-typedef enum  {
-	RYGEL_GST_ERROR_MISSING_PLUGIN,
-	RYGEL_GST_ERROR_LINK
-} RygelGstError;
-#define RYGEL_GST_ERROR rygel_gst_error_quark ()
-
-static gpointer rygel_gst_data_source_parent_class = NULL;
 static RygelDataSourceIface* rygel_gst_data_source_rygel_data_source_parent_iface = NULL;
 
 GQuark rygel_gst_data_source_error_quark (void);
-GType rygel_gst_data_source_get_type (void) G_GNUC_CONST;
-GType rygel_gst_sink_get_type (void) G_GNUC_CONST;
 #define RYGEL_GST_DATA_SOURCE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), RYGEL_TYPE_GST_DATA_SOURCE, RygelGstDataSourcePrivate))
 enum  {
 	RYGEL_GST_DATA_SOURCE_DUMMY_PROPERTY
@@ -902,7 +846,7 @@ static void rygel_gst_data_source_rygel_data_source_interface_init (RygelDataSou
 }
 
 
-static void rygel_gst_data_source_instance_init (RygelGstDataSource * self) {
+static void rygel_gst_data_source_init (RygelGstDataSource * self) {
 	self->priv = RYGEL_GST_DATA_SOURCE_GET_PRIVATE (self);
 	self->priv->seek = NULL;
 }
@@ -934,19 +878,3 @@ static void rygel_gst_data_source_finalize (GObject* obj) {
 	G_OBJECT_CLASS (rygel_gst_data_source_parent_class)->finalize (obj);
 }
 
-
-GType rygel_gst_data_source_get_type (void) {
-	static volatile gsize rygel_gst_data_source_type_id__volatile = 0;
-	if (g_once_init_enter (&rygel_gst_data_source_type_id__volatile)) {
-		static const GTypeInfo g_define_type_info = { sizeof (RygelGstDataSourceClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) rygel_gst_data_source_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (RygelGstDataSource), 0, (GInstanceInitFunc) rygel_gst_data_source_instance_init, NULL };
-		static const GInterfaceInfo rygel_data_source_info = { (GInterfaceInitFunc) rygel_gst_data_source_rygel_data_source_interface_init, (GInterfaceFinalizeFunc) NULL, NULL};
-		GType rygel_gst_data_source_type_id;
-		rygel_gst_data_source_type_id = g_type_register_static (G_TYPE_OBJECT, "RygelGstDataSource", &g_define_type_info, 0);
-		g_type_add_interface_static (rygel_gst_data_source_type_id, RYGEL_TYPE_DATA_SOURCE, &rygel_data_source_info);
-		g_once_init_leave (&rygel_gst_data_source_type_id__volatile, rygel_gst_data_source_type_id);
-	}
-	return rygel_gst_data_source_type_id__volatile;
-}
-
-
-
diff --git a/src/rygel-gst-data-source.h b/src/rygel-gst-data-source.h
new file mode 100644
index 0000000..98e427a
--- /dev/null
+++ b/src/rygel-gst-data-source.h
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2009 Nokia Corporation
+ * Copyright (C) 2012 Intel Corporation
+ *
+ * Rygel is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Rygel 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __RYGEL_GST_0_10_MEDIA_ENGINE_GST_DATA_SOURCE_H__
+#define __RYGEL_GST_0_10_MEDIA_ENGINE_GST_DATA_SOURCE_H__
+
+#include <glib.h>
+#include <glib-object.h>
+#include <stdlib.h>
+#include <string.h>
+#include <rygel-server.h>
+#include <gst/gst.h>
+#include <libgupnp-dlna/gupnp-dlna-discoverer.h>
+#include <libgupnp-dlna/gupnp-dlna-profile.h>
+#include <gee.h>
+#include <rygel-core.h>
+
+G_BEGIN_DECLS
+
+#define RYGEL_TYPE_GST_DATA_SOURCE (rygel_gst_data_source_get_type ())
+#define RYGEL_GST_DATA_SOURCE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_GST_DATA_SOURCE, RygelGstDataSource))
+#define RYGEL_GST_DATA_SOURCE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_GST_DATA_SOURCE, RygelGstDataSourceClass))
+#define RYGEL_IS_GST_DATA_SOURCE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_GST_DATA_SOURCE))
+#define RYGEL_IS_GST_DATA_SOURCE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_GST_DATA_SOURCE))
+#define RYGEL_GST_DATA_SOURCE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_GST_DATA_SOURCE, RygelGstDataSourceClass))
+
+typedef struct _RygelGstDataSource RygelGstDataSource;
+typedef struct _RygelGstDataSourceClass RygelGstDataSourceClass;
+typedef struct _RygelGstDataSourcePrivate RygelGstDataSourcePrivate;
+
+struct _RygelGstDataSource {
+  GObject parent_instance;
+  RygelGstDataSourcePrivate * priv;
+  GstElement* src;
+};
+
+struct _RygelGstDataSourceClass {
+  GObjectClass parent_class;
+};
+
+GType rygel_gst_data_source_get_type (void) G_GNUC_CONST;
+
+RygelGstDataSource* rygel_gst_data_source_new (const gchar* uri, GError** error);
+
+
+typedef enum  {
+	RYGEL_GST_ERROR_MISSING_PLUGIN,
+	RYGEL_GST_ERROR_LINK
+} RygelGstError;
+
+#define RYGEL_GST_ERROR rygel_gst_error_quark ()
+
+
+G_END_DECLS
+
+#endif /* __RYGEL_GST_0_10_MEDIA_ENGINE_GST_DATA_SOURCE_H__ */
diff --git a/src/rygel-gst-media-engine.c b/src/rygel-gst-media-engine.c
index ee3a91b..caaa642 100644
--- a/src/rygel-gst-media-engine.c
+++ b/src/rygel-gst-media-engine.c
@@ -20,600 +20,200 @@
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  */
 
-#include <glib.h>
-#include <glib-object.h>
-#include <stdlib.h>
-#include <string.h>
-#include <rygel-server.h>
-#include <gst/gst.h>
-#include <libgupnp-dlna/gupnp-dlna-discoverer.h>
-#include <libgupnp-dlna/gupnp-dlna-profile.h>
-#include <gee.h>
-#include <rygel-core.h>
-
-
-#define RYGEL_TYPE_GST_MEDIA_ENGINE (rygel_gst_media_engine_get_type ())
-#define RYGEL_GST_MEDIA_ENGINE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_GST_MEDIA_ENGINE, RygelGstMediaEngine))
-#define RYGEL_GST_MEDIA_ENGINE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_GST_MEDIA_ENGINE, RygelGstMediaEngineClass))
-#define RYGEL_IS_GST_MEDIA_ENGINE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_GST_MEDIA_ENGINE))
-#define RYGEL_IS_GST_MEDIA_ENGINE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_GST_MEDIA_ENGINE))
-#define RYGEL_GST_MEDIA_ENGINE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_GST_MEDIA_ENGINE, RygelGstMediaEngineClass))
-
-typedef struct _RygelGstMediaEngine RygelGstMediaEngine;
-typedef struct _RygelGstMediaEngineClass RygelGstMediaEngineClass;
-typedef struct _RygelGstMediaEnginePrivate RygelGstMediaEnginePrivate;
-#define __g_list_free__rygel_dlna_profile_unref0_0(var) ((var == NULL) ? NULL : (var = (_g_list_free__rygel_dlna_profile_unref0_ (var), NULL)))
-#define __g_list_free__g_object_unref0_0(var) ((var == NULL) ? NULL : (var = (_g_list_free__g_object_unref0_ (var), NULL)))
-#define _rygel_dlna_profile_unref0(var) ((var == NULL) ? NULL : (var = (rygel_dlna_profile_unref (var), NULL)))
-#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
-#define _g_error_free0(var) ((var == NULL) ? NULL : (var = (g_error_free (var), NULL)))
-
-#define RYGEL_TYPE_GST_TRANSCODER (rygel_gst_transcoder_get_type ())
-#define RYGEL_GST_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_GST_TRANSCODER, RygelGstTranscoder))
-#define RYGEL_GST_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_GST_TRANSCODER, RygelGstTranscoderClass))
-#define RYGEL_IS_GST_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_GST_TRANSCODER))
-#define RYGEL_IS_GST_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_GST_TRANSCODER))
-#define RYGEL_GST_TRANSCODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_GST_TRANSCODER, RygelGstTranscoderClass))
-
-typedef struct _RygelGstTranscoder RygelGstTranscoder;
-typedef struct _RygelGstTranscoderClass RygelGstTranscoderClass;
-
-#define RYGEL_TYPE_AUDIO_TRANSCODER (rygel_audio_transcoder_get_type ())
-#define RYGEL_AUDIO_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_AUDIO_TRANSCODER, RygelAudioTranscoder))
-#define RYGEL_AUDIO_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_AUDIO_TRANSCODER, RygelAudioTranscoderClass))
-#define RYGEL_IS_AUDIO_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_AUDIO_TRANSCODER))
-#define RYGEL_IS_AUDIO_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_AUDIO_TRANSCODER))
-#define RYGEL_AUDIO_TRANSCODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_AUDIO_TRANSCODER, RygelAudioTranscoderClass))
-
-typedef struct _RygelAudioTranscoder RygelAudioTranscoder;
-typedef struct _RygelAudioTranscoderClass RygelAudioTranscoderClass;
-
-#define RYGEL_TYPE_L16_TRANSCODER (rygel_l16_transcoder_get_type ())
-#define RYGEL_L16_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_L16_TRANSCODER, RygelL16Transcoder))
-#define RYGEL_L16_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_L16_TRANSCODER, RygelL16TranscoderClass))
-#define RYGEL_IS_L16_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_L16_TRANSCODER))
-#define RYGEL_IS_L16_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_L16_TRANSCODER))
-#define RYGEL_L16_TRANSCODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_L16_TRANSCODER, RygelL16TranscoderClass))
-
-typedef struct _RygelL16Transcoder RygelL16Transcoder;
-typedef struct _RygelL16TranscoderClass RygelL16TranscoderClass;
-
-#define RYGEL_TYPE_MP3_TRANSCODER (rygel_mp3_transcoder_get_type ())
-#define RYGEL_MP3_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_MP3_TRANSCODER, RygelMP3Transcoder))
-#define RYGEL_MP3_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_MP3_TRANSCODER, RygelMP3TranscoderClass))
-#define RYGEL_IS_MP3_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_MP3_TRANSCODER))
-#define RYGEL_IS_MP3_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_MP3_TRANSCODER))
-#define RYGEL_MP3_TRANSCODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_MP3_TRANSCODER, RygelMP3TranscoderClass))
-
-typedef struct _RygelMP3Transcoder RygelMP3Transcoder;
-typedef struct _RygelMP3TranscoderClass RygelMP3TranscoderClass;
-
-#define RYGEL_TYPE_MP2_TS_PROFILE (rygel_mp2_ts_profile_get_type ())
-
-#define RYGEL_TYPE_VIDEO_TRANSCODER (rygel_video_transcoder_get_type ())
-#define RYGEL_VIDEO_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_VIDEO_TRANSCODER, RygelVideoTranscoder))
-#define RYGEL_VIDEO_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_VIDEO_TRANSCODER, RygelVideoTranscoderClass))
-#define RYGEL_IS_VIDEO_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_VIDEO_TRANSCODER))
-#define RYGEL_IS_VIDEO_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_VIDEO_TRANSCODER))
-#define RYGEL_VIDEO_TRANSCODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_VIDEO_TRANSCODER, RygelVideoTranscoderClass))
-
-typedef struct _RygelVideoTranscoder RygelVideoTranscoder;
-typedef struct _RygelVideoTranscoderClass RygelVideoTranscoderClass;
-
-#define RYGEL_TYPE_MP2_TS_TRANSCODER (rygel_mp2_ts_transcoder_get_type ())
-#define RYGEL_MP2_TS_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_MP2_TS_TRANSCODER, RygelMP2TSTranscoder))
-#define RYGEL_MP2_TS_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_MP2_TS_TRANSCODER, RygelMP2TSTranscoderClass))
-#define RYGEL_IS_MP2_TS_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_MP2_TS_TRANSCODER))
-#define RYGEL_IS_MP2_TS_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_MP2_TS_TRANSCODER))
-#define RYGEL_MP2_TS_TRANSCODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_MP2_TS_TRANSCODER, RygelMP2TSTranscoderClass))
-
-typedef struct _RygelMP2TSTranscoder RygelMP2TSTranscoder;
-typedef struct _RygelMP2TSTranscoderClass RygelMP2TSTranscoderClass;
-
-#define RYGEL_TYPE_WMV_TRANSCODER (rygel_wmv_transcoder_get_type ())
-#define RYGEL_WMV_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_WMV_TRANSCODER, RygelWMVTranscoder))
-#define RYGEL_WMV_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_WMV_TRANSCODER, RygelWMVTranscoderClass))
-#define RYGEL_IS_WMV_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_WMV_TRANSCODER))
-#define RYGEL_IS_WMV_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_WMV_TRANSCODER))
-#define RYGEL_WMV_TRANSCODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_WMV_TRANSCODER, RygelWMVTranscoderClass))
-
-typedef struct _RygelWMVTranscoder RygelWMVTranscoder;
-typedef struct _RygelWMVTranscoderClass RygelWMVTranscoderClass;
-
-#define RYGEL_TYPE_AAC_TRANSCODER (rygel_aac_transcoder_get_type ())
-#define RYGEL_AAC_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_AAC_TRANSCODER, RygelAACTranscoder))
-#define RYGEL_AAC_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_AAC_TRANSCODER, RygelAACTranscoderClass))
-#define RYGEL_IS_AAC_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_AAC_TRANSCODER))
-#define RYGEL_IS_AAC_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_AAC_TRANSCODER))
-#define RYGEL_AAC_TRANSCODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_AAC_TRANSCODER, RygelAACTranscoderClass))
-
-typedef struct _RygelAACTranscoder RygelAACTranscoder;
-typedef struct _RygelAACTranscoderClass RygelAACTranscoderClass;
-
-#define RYGEL_TYPE_AVC_TRANSCODER (rygel_avc_transcoder_get_type ())
-#define RYGEL_AVC_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_AVC_TRANSCODER, RygelAVCTranscoder))
-#define RYGEL_AVC_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_AVC_TRANSCODER, RygelAVCTranscoderClass))
-#define RYGEL_IS_AVC_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_AVC_TRANSCODER))
-#define RYGEL_IS_AVC_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_AVC_TRANSCODER))
-#define RYGEL_AVC_TRANSCODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_AVC_TRANSCODER, RygelAVCTranscoderClass))
-
-typedef struct _RygelAVCTranscoder RygelAVCTranscoder;
-typedef struct _RygelAVCTranscoderClass RygelAVCTranscoderClass;
-#define _g_free0(var) (var = (g_free (var), NULL))
-
-#define RYGEL_TYPE_GST_DATA_SOURCE (rygel_gst_data_source_get_type ())
-#define RYGEL_GST_DATA_SOURCE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_GST_DATA_SOURCE, RygelGstDataSource))
-#define RYGEL_GST_DATA_SOURCE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_GST_DATA_SOURCE, RygelGstDataSourceClass))
-#define RYGEL_IS_GST_DATA_SOURCE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_GST_DATA_SOURCE))
-#define RYGEL_IS_GST_DATA_SOURCE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_GST_DATA_SOURCE))
-#define RYGEL_GST_DATA_SOURCE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_GST_DATA_SOURCE, RygelGstDataSourceClass))
-
-typedef struct _RygelGstDataSource RygelGstDataSource;
-typedef struct _RygelGstDataSourceClass RygelGstDataSourceClass;
-
-struct _RygelGstMediaEngine {
-	RygelMediaEngine parent_instance;
-	RygelGstMediaEnginePrivate * priv;
-};
+#include "rygel-gst-media-engine.h"
+#include "rygel-aac-transcoder.h"
+#include "rygel-avc-transcoder.h"
+#include "rygel-l16-transcoder.h"
+#include "rygel-mp2ts-transcoder.h"
+#include "rygel-mp3-transcoder.h"
+#include "rygel-wmv-transcoder.h"
 
-struct _RygelGstMediaEngineClass {
-	RygelMediaEngineClass parent_class;
-};
+G_DEFINE_TYPE (RygelGstMediaEngine, rygel_gst_media_engine, RYGEL_TYPE_MEDIA_ENGINE)
 
 struct _RygelGstMediaEnginePrivate {
-	GList* dlna_profiles;
-	GList* transcoders;
+  GList *dlna_profiles;
+  GList *transcoders;
 };
 
-typedef enum  {
-	RYGEL_MP2_TS_PROFILE_SD = 0,
-	RYGEL_MP2_TS_PROFILE_HD
-} RygelMP2TSProfile;
-
-
-static gpointer rygel_gst_media_engine_parent_class = NULL;
-
-gboolean gst_preset_set_app_dir (const gchar* app_dir);
-GType rygel_gst_media_engine_get_type (void) G_GNUC_CONST;
-#define RYGEL_GST_MEDIA_ENGINE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), RYGEL_TYPE_GST_MEDIA_ENGINE, RygelGstMediaEnginePrivate))
-enum  {
-	RYGEL_GST_MEDIA_ENGINE_DUMMY_PROPERTY
-};
-static void _rygel_dlna_profile_unref0_ (gpointer var);
-static void _g_list_free__rygel_dlna_profile_unref0_ (GList* self);
-static void _g_object_unref0_ (gpointer var);
-static void _g_list_free__g_object_unref0_ (GList* self);
-RygelGstMediaEngine* rygel_gst_media_engine_new (void);
-RygelGstMediaEngine* rygel_gst_media_engine_construct (GType object_type);
-RygelL16Transcoder* rygel_l16_transcoder_new (void);
-RygelL16Transcoder* rygel_l16_transcoder_construct (GType object_type);
-GType rygel_gst_transcoder_get_type (void) G_GNUC_CONST;
-GType rygel_audio_transcoder_get_type (void) G_GNUC_CONST;
-GType rygel_l16_transcoder_get_type (void) G_GNUC_CONST;
-RygelMP3Transcoder* rygel_mp3_transcoder_new (void);
-RygelMP3Transcoder* rygel_mp3_transcoder_construct (GType object_type);
-GType rygel_mp3_transcoder_get_type (void) G_GNUC_CONST;
-GType rygel_mp2_ts_profile_get_type (void) G_GNUC_CONST;
-RygelMP2TSTranscoder* rygel_mp2_ts_transcoder_new (RygelMP2TSProfile profile);
-RygelMP2TSTranscoder* rygel_mp2_ts_transcoder_construct (GType object_type, RygelMP2TSProfile profile);
-GType rygel_video_transcoder_get_type (void) G_GNUC_CONST;
-GType rygel_mp2_ts_transcoder_get_type (void) G_GNUC_CONST;
-RygelWMVTranscoder* rygel_wmv_transcoder_new (void);
-RygelWMVTranscoder* rygel_wmv_transcoder_construct (GType object_type);
-GType rygel_wmv_transcoder_get_type (void) G_GNUC_CONST;
-RygelAACTranscoder* rygel_aac_transcoder_new (void);
-RygelAACTranscoder* rygel_aac_transcoder_construct (GType object_type);
-GType rygel_aac_transcoder_get_type (void) G_GNUC_CONST;
-RygelAVCTranscoder* rygel_avc_transcoder_new (void);
-RygelAVCTranscoder* rygel_avc_transcoder_construct (GType object_type);
-GType rygel_avc_transcoder_get_type (void) G_GNUC_CONST;
-static GList* rygel_gst_media_engine_real_get_dlna_profiles (RygelMediaEngine* base);
-static GList* rygel_gst_media_engine_real_get_transcoders (RygelMediaEngine* base);
-static RygelDataSource* rygel_gst_media_engine_real_create_data_source (RygelMediaEngine* base, const gchar* uri);
-RygelGstDataSource* rygel_gst_data_source_new (const gchar* uri, GError** error);
-RygelGstDataSource* rygel_gst_data_source_construct (GType object_type, const gchar* uri, GError** error);
-GType rygel_gst_data_source_get_type (void) G_GNUC_CONST;
-RygelDataSource* rygel_gst_media_engine_create_data_source_from_element (RygelGstMediaEngine* self, GstElement* element);
-RygelGstDataSource* rygel_gst_data_source_new_from_element (GstElement* element);
-RygelGstDataSource* rygel_gst_data_source_construct_from_element (GType object_type, GstElement* element);
-static void rygel_gst_media_engine_finalize (GObject* obj);
-RygelMediaEngine* module_get_instance (void);
-
-
-static void _rygel_dlna_profile_unref0_ (gpointer var) {
-	(var == NULL) ? NULL : (var = (rygel_dlna_profile_unref (var), NULL));
-}
-
-
-static void _g_list_free__rygel_dlna_profile_unref0_ (GList* self) {
-	g_list_foreach (self, (GFunc) _rygel_dlna_profile_unref0_, NULL);
-	g_list_free (self);
-}
-
+static void rygel_gst_media_engine_finalize (GObject *obj);
+
+static RygelGstMediaEngine*
+rygel_gst_media_engine_construct (GType object_type) {
+  RygelGstMediaEngine *self = NULL;
+  GUPnPDLNADiscoverer *discoverer;
+  GList *profile_collection;
+  gboolean transcoding;
+  GeeArrayList *transcoder_list = NULL;
+  RygelMetaConfig *config;
+  GError *error = NULL;
+
+  self = RYGEL_GST_MEDIA_ENGINE (rygel_media_engine_construct (object_type));
+
+  gst_init (NULL, NULL);
+  gst_preset_set_app_dir (PRESET_DIR);
+
+  discoverer = gupnp_dlna_discoverer_new ((GstClockTime) GST_SECOND, TRUE, FALSE);
+  profile_collection = gupnp_dlna_discoverer_list_profiles (discoverer);
+
+  GList *profile_it = NULL;
+  for (profile_it = profile_collection; profile_it != NULL; profile_it = profile_it->next) {
+    GUPnPDLNAProfile *profile = (GUPnPDLNAProfile*) profile_it->data;
+    const gchar *name = gupnp_dlna_profile_get_name (profile);
+    const gchar *mime = gupnp_dlna_profile_get_mime (profile);
+
+    RygelDLNAProfile *rygel_profile = rygel_dlna_profile_new (name, mime);
+    self->priv->dlna_profiles = g_list_prepend (self->priv->dlna_profiles, rygel_profile);
+  }
+
+  self->priv->dlna_profiles = g_list_reverse (self->priv->dlna_profiles);
+
+  config = rygel_meta_config_get_default ();
+  
+  transcoding = rygel_configuration_get_transcoding (config, &error);
+  if (error) {
+    g_clear_error (&error);
+  } else {
+    transcoder_list = rygel_configuration_get_string_list (config, "MediaEngine", "transcoders", &error);
+    if (error) {
+      g_clear_error (&error);
+      transcoder_list = NULL;
+    }
+  }
+
+  if (!transcoder_list) {
+    transcoder_list = gee_array_list_new (G_TYPE_STRING, (GBoxedCopyFunc) g_strdup, g_free, NULL, NULL, NULL);
+  }
+
+  gint transcoder_size = gee_abstract_collection_get_size (transcoder_list);
+  gint transcoder_index = -1;
+  while (TRUE) {
+    gchar *transcoder_name;
+
+    transcoder_index += 1;  
+    if (!(transcoder_index < transcoder_size)) {
+      break;
+    }
+
+    transcoder_name = (gchar*) gee_abstract_list_get ((GeeAbstractList*)transcoder_list, transcoder_index);
+    if (g_strcmp0 (transcoder_name, "lpcm")) {
+      RygelL16Transcoder *transcoder = rygel_l16_transcoder_new ();
+      self->priv->transcoders = g_list_prepend (self->priv->transcoders, (RygelTranscoder*) transcoder);
+    } else if (g_strcmp0 (transcoder_name, "mp3")) {
+      RygelMP3Transcoder *transcoder = rygel_mp3_transcoder_new ();
+      self->priv->transcoders = g_list_prepend (self->priv->transcoders, (RygelTranscoder*) transcoder);
+    } else if (g_strcmp0 (transcoder_name, "mp2ts")) {
+      RygelMP2TSTranscoder *transcoder = rygel_mp2_ts_transcoder_new (RYGEL_MP2_TS_PROFILE_SD);
+      self->priv->transcoders = g_list_prepend (self->priv->transcoders, (RygelTranscoder*) transcoder);
+      transcoder = rygel_mp2_ts_transcoder_new (RYGEL_MP2_TS_PROFILE_HD);
+      self->priv->transcoders = g_list_prepend (self->priv->transcoders, (RygelTranscoder*) transcoder);
+    } else if (g_strcmp0 (transcoder_name, "wmv")) {
+      RygelWMVTranscoder *transcoder = rygel_wmv_transcoder_new ();
+      self->priv->transcoders = g_list_prepend (self->priv->transcoders, (RygelTranscoder*) transcoder);
+    } else if (g_strcmp0 (transcoder_name, "aac")) {
+      RygelAACTranscoder *transcoder = rygel_aac_transcoder_new ();
+      self->priv->transcoders = g_list_prepend (self->priv->transcoders, (RygelTranscoder*) transcoder);
+    } else if (g_strcmp0 (transcoder_name, "avc")) {
+      RygelAVCTranscoder *transcoder = rygel_avc_transcoder_new ();
+      self->priv->transcoders = g_list_prepend (self->priv->transcoders, (RygelTranscoder*) transcoder);
+    } else {
+      g_debug ("Unsupported transcoder: \"%s\"", transcoder_name);
+    }
+
+    g_free (transcoder_name);
+  }
+
+  self->priv->transcoders = g_list_reverse (self->priv->transcoders);
+
+  g_object_unref (config);
+  g_object_unref (transcoder_list);
+  g_object_unref (discoverer);
+
+  return self;
+}
+
+RygelGstMediaEngine*
+rygel_gst_media_engine_new (void) {
+  return rygel_gst_media_engine_construct (RYGEL_TYPE_GST_MEDIA_ENGINE);
+}
+
+static GList*
+rygel_gst_media_engine_real_get_dlna_profiles (RygelMediaEngine *base) {
+  RygelGstMediaEngine *self = RYGEL_GST_MEDIA_ENGINE (base);
+  return self->priv->dlna_profiles;
+}
+
+static GList*
+rygel_gst_media_engine_real_get_transcoders (RygelMediaEngine *base) {
+  RygelGstMediaEngine *self = RYGEL_GST_MEDIA_ENGINE (base);
+  return self->priv->transcoders;
+}
+
+
+static RygelDataSource*
+rygel_gst_media_engine_real_create_data_source (RygelMediaEngine *base, const gchar *uri) {
+  RygelGstMediaEngine *self = RYGEL_GST_MEDIA_ENGINE (base);
+  RygelDataSource *result = NULL;
+  GError *error = NULL;
+
+  g_return_val_if_fail (uri != NULL, NULL);
+  
+  result = rygel_gst_data_source_new (uri, &error);
+  if (error) {
+    g_warning ("rygel_gst_data_source_new() failed: %s", error->message);
+    g_clear_error (error);
+  }
+
+  return result;
+}
+
+
+RygelDataSource*
+rygel_gst_media_engine_create_data_source_from_element (RygelGstMediaEngine *self, GstElement *element) {
+  RygelDataSource *result = NULL;
+  GError *error = NULL;
+
+  g_return_val_if_fail (element != NULL, NULL);
+  
+  result = rygel_gst_data_source_new_from_element (element, &error);
+  if (error) {
+    g_warning ("rygel_gst_data_source_new_from_element() failed: %s", error->message);
+    g_clear_error (error);
+  }
 
-static void _g_object_unref0_ (gpointer var) {
-	(var == NULL) ? NULL : (var = (g_object_unref (var), NULL));
+  return result;
 }
 
+static void
+rygel_gst_media_engine_class_init (RygelGstMediaEngineClass *klass) {
+  rygel_gst_media_engine_parent_class = g_type_class_peek_parent (klass);
 
-static void _g_list_free__g_object_unref0_ (GList* self) {
-	g_list_foreach (self, (GFunc) _g_object_unref0_, NULL);
-	g_list_free (self);
+  g_type_class_add_private (klass, sizeof (RygelGstMediaEnginePrivate));
+  RYGEL_MEDIA_ENGINE_CLASS (klass)->get_dlna_profiles = rygel_gst_media_engine_real_get_dlna_profiles;
+  RYGEL_MEDIA_ENGINE_CLASS (klass)->get_transcoders = rygel_gst_media_engine_real_get_transcoders;
+  RYGEL_MEDIA_ENGINE_CLASS (klass)->create_data_source = rygel_gst_media_engine_real_create_data_source;
+  G_OBJECT_CLASS (klass)->finalize = rygel_gst_media_engine_finalize;
 }
 
-
-static gpointer _rygel_dlna_profile_ref0 (gpointer self) {
-	return self ? rygel_dlna_profile_ref (self) : NULL;
-}
-
-
-static gpointer _g_object_ref0 (gpointer self) {
-	return self ? g_object_ref (self) : NULL;
+static void
+rygel_gst_media_engine_init (RygelGstMediaEngine *self) {
+  self->priv = RYGEL_GST_MEDIA_ENGINE_GET_PRIVATE (self);
+  self->priv->dlna_profiles = NULL;
+  self->priv->transcoders = NULL;
 }
 
+static void
+rygel_gst_media_engine_finalize (GObject *obj) {
+  RygelGstMediaEngine *self = G_TYPE_CHECK_INSTANCE_CAST (obj, RYGEL_TYPE_GST_MEDIA_ENGINE, RygelGstMediaEngine);
+  
+	g_list_free_full (self->priv->dlna_profiles, (GDestroyNotify) g_object_unref);
+	g_list_free_full (self->priv->transcoders, (GDestroyNotify) g_object_unref);
 
-RygelGstMediaEngine* rygel_gst_media_engine_construct (GType object_type) {
-	RygelGstMediaEngine * self = NULL;
-	gchar** args;
-	gint args_length1;
-	gint _args_size_;
-	GUPnPDLNADiscoverer* _tmp0_;
-	GUPnPDLNADiscoverer* discoverer;
-	GUPnPDLNADiscoverer* _tmp1_;
-	GList* _tmp2_ = NULL;
-	gboolean transcoding;
-	GeeArrayList* _tmp12_;
-	GeeArrayList* transcoder_list;
-	RygelMetaConfig* _tmp13_ = NULL;
-	RygelMetaConfig* config;
-	gboolean _tmp20_;
-	GError * _inner_error_ = NULL;
-	self = (RygelGstMediaEngine*) rygel_media_engine_construct (object_type);
-	args = NULL;
-	args_length1 = 0;
-	_args_size_ = args_length1;
-	gst_init (&args_length1, &args);
-	gst_preset_set_app_dir (PRESET_DIR);
-	_tmp0_ = gupnp_dlna_discoverer_new ((GstClockTime) GST_SECOND, TRUE, FALSE);
-	discoverer = _tmp0_;
-	_tmp1_ = discoverer;
-	_tmp2_ = gupnp_dlna_discoverer_list_profiles (_tmp1_);
-	{
-		GList* profile_collection = NULL;
-		GList* profile_it = NULL;
-		profile_collection = _tmp2_;
-		for (profile_it = profile_collection; profile_it != NULL; profile_it = profile_it->next) {
-			GUPnPDLNAProfile* profile = NULL;
-			profile = (GUPnPDLNAProfile*) profile_it->data;
-			{
-				GUPnPDLNAProfile* _tmp3_;
-				const gchar* _tmp4_;
-				const gchar* _tmp5_;
-				GUPnPDLNAProfile* _tmp6_;
-				const gchar* _tmp7_;
-				const gchar* _tmp8_;
-				RygelDLNAProfile* _tmp9_;
-				RygelDLNAProfile* p;
-				RygelDLNAProfile* _tmp10_;
-				RygelDLNAProfile* _tmp11_;
-				_tmp3_ = profile;
-				_tmp4_ = gupnp_dlna_profile_get_name (_tmp3_);
-				_tmp5_ = _tmp4_;
-				_tmp6_ = profile;
-				_tmp7_ = gupnp_dlna_profile_get_mime (_tmp6_);
-				_tmp8_ = _tmp7_;
-				_tmp9_ = rygel_dlna_profile_new (_tmp5_, _tmp8_);
-				p = _tmp9_;
-				_tmp10_ = p;
-				_tmp11_ = _rygel_dlna_profile_ref0 (_tmp10_);
-				self->priv->dlna_profiles = g_list_prepend (self->priv->dlna_profiles, _tmp11_);
-				_rygel_dlna_profile_unref0 (p);
-			}
-		}
-	}
-	self->priv->dlna_profiles = g_list_reverse (self->priv->dlna_profiles);
-	transcoding = TRUE;
-	_tmp12_ = gee_array_list_new (G_TYPE_STRING, (GBoxedCopyFunc) g_strdup, g_free, NULL, NULL, NULL);
-	transcoder_list = _tmp12_;
-	_tmp13_ = rygel_meta_config_get_default ();
-	config = _tmp13_;
-	{
-		RygelMetaConfig* _tmp14_;
-		gboolean _tmp15_ = FALSE;
-		gboolean _tmp16_;
-		RygelMetaConfig* _tmp17_;
-		GeeArrayList* _tmp18_ = NULL;
-		GeeArrayList* _tmp19_;
-		_tmp14_ = config;
-		_tmp15_ = rygel_configuration_get_transcoding ((RygelConfiguration*) _tmp14_, &_inner_error_);
-		_tmp16_ = _tmp15_;
-		if (_inner_error_ != NULL) {
-			goto __catch0_g_error;
-		}
-		transcoding = _tmp16_;
-		_tmp17_ = config;
-		_tmp18_ = rygel_configuration_get_string_list ((RygelConfiguration*) _tmp17_, "MediaEngine", "transcoders", &_inner_error_);
-		_tmp19_ = _tmp18_;
-		if (_inner_error_ != NULL) {
-			goto __catch0_g_error;
-		}
-		_g_object_unref0 (transcoder_list);
-		transcoder_list = _tmp19_;
-	}
-	goto __finally0;
-	__catch0_g_error:
-	{
-		GError* err = NULL;
-		err = _inner_error_;
-		_inner_error_ = NULL;
-		_g_error_free0 (err);
-	}
-	__finally0:
-	if (_inner_error_ != NULL) {
-		_g_object_unref0 (config);
-		_g_object_unref0 (transcoder_list);
-		_g_object_unref0 (discoverer);
-		g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
-		g_clear_error (&_inner_error_);
-		return NULL;
-	}
-	_tmp20_ = transcoding;
-	if (_tmp20_) {
-		{
-			GeeArrayList* _tmp21_;
-			GeeArrayList* _tmp22_;
-			GeeArrayList* _transcoder_list;
-			GeeArrayList* _tmp23_;
-			gint _tmp24_;
-			gint _tmp25_;
-			gint _transcoder_size;
-			gint _transcoder_index;
-			_tmp21_ = transcoder_list;
-			_tmp22_ = _g_object_ref0 (_tmp21_);
-			_transcoder_list = _tmp22_;
-			_tmp23_ = _transcoder_list;
-			_tmp24_ = gee_abstract_collection_get_size ((GeeCollection*) _tmp23_);
-			_tmp25_ = _tmp24_;
-			_transcoder_size = _tmp25_;
-			_transcoder_index = -1;
-			while (TRUE) {
-				gint _tmp26_;
-				gint _tmp27_;
-				gint _tmp28_;
-				GeeArrayList* _tmp29_;
-				gint _tmp30_;
-				gpointer _tmp31_ = NULL;
-				gchar* transcoder;
-				const gchar* _tmp32_;
-				const gchar* _tmp33_;
-				GQuark _tmp35_ = 0U;
-				static GQuark _tmp34_label0 = 0;
-				static GQuark _tmp34_label1 = 0;
-				static GQuark _tmp34_label2 = 0;
-				static GQuark _tmp34_label3 = 0;
-				static GQuark _tmp34_label4 = 0;
-				static GQuark _tmp34_label5 = 0;
-				_tmp26_ = _transcoder_index;
-				_transcoder_index = _tmp26_ + 1;
-				_tmp27_ = _transcoder_index;
-				_tmp28_ = _transcoder_size;
-				if (!(_tmp27_ < _tmp28_)) {
-					break;
-				}
-				_tmp29_ = _transcoder_list;
-				_tmp30_ = _transcoder_index;
-				_tmp31_ = gee_abstract_list_get ((GeeAbstractList*) _tmp29_, _tmp30_);
-				transcoder = (gchar*) _tmp31_;
-				_tmp32_ = transcoder;
-				_tmp33_ = _tmp32_;
-				_tmp35_ = (NULL == _tmp33_) ? 0 : g_quark_from_string (_tmp33_);
-				if (_tmp35_ == ((0 != _tmp34_label0) ? _tmp34_label0 : (_tmp34_label0 = g_quark_from_static_string ("lpcm")))) {
-					switch (0) {
-						default:
-						{
-							RygelL16Transcoder* _tmp36_;
-							_tmp36_ = rygel_l16_transcoder_new ();
-							self->priv->transcoders = g_list_prepend (self->priv->transcoders, (RygelTranscoder*) _tmp36_);
-							break;
-						}
-					}
-				} else if (_tmp35_ == ((0 != _tmp34_label1) ? _tmp34_label1 : (_tmp34_label1 = g_quark_from_static_string ("mp3")))) {
-					switch (0) {
-						default:
-						{
-							RygelMP3Transcoder* _tmp37_;
-							_tmp37_ = rygel_mp3_transcoder_new ();
-							self->priv->transcoders = g_list_prepend (self->priv->transcoders, (RygelTranscoder*) _tmp37_);
-							break;
-						}
-					}
-				} else if (_tmp35_ == ((0 != _tmp34_label2) ? _tmp34_label2 : (_tmp34_label2 = g_quark_from_static_string ("mp2ts")))) {
-					switch (0) {
-						default:
-						{
-							RygelMP2TSTranscoder* _tmp38_;
-							RygelMP2TSTranscoder* _tmp39_;
-							_tmp38_ = rygel_mp2_ts_transcoder_new (RYGEL_MP2_TS_PROFILE_SD);
-							self->priv->transcoders = g_list_prepend (self->priv->transcoders, (RygelTranscoder*) _tmp38_);
-							_tmp39_ = rygel_mp2_ts_transcoder_new (RYGEL_MP2_TS_PROFILE_HD);
-							self->priv->transcoders = g_list_prepend (self->priv->transcoders, (RygelTranscoder*) _tmp39_);
-							break;
-						}
-					}
-				} else if (_tmp35_ == ((0 != _tmp34_label3) ? _tmp34_label3 : (_tmp34_label3 = g_quark_from_static_string ("wmv")))) {
-					switch (0) {
-						default:
-						{
-							RygelWMVTranscoder* _tmp40_;
-							_tmp40_ = rygel_wmv_transcoder_new ();
-							self->priv->transcoders = g_list_prepend (self->priv->transcoders, (RygelTranscoder*) _tmp40_);
-							break;
-						}
-					}
-				} else if (_tmp35_ == ((0 != _tmp34_label4) ? _tmp34_label4 : (_tmp34_label4 = g_quark_from_static_string ("aac")))) {
-					switch (0) {
-						default:
-						{
-							RygelAACTranscoder* _tmp41_;
-							_tmp41_ = rygel_aac_transcoder_new ();
-							self->priv->transcoders = g_list_prepend (self->priv->transcoders, (RygelTranscoder*) _tmp41_);
-							break;
-						}
-					}
-				} else if (_tmp35_ == ((0 != _tmp34_label5) ? _tmp34_label5 : (_tmp34_label5 = g_quark_from_static_string ("avc")))) {
-					switch (0) {
-						default:
-						{
-							RygelAVCTranscoder* _tmp42_;
-							_tmp42_ = rygel_avc_transcoder_new ();
-							self->priv->transcoders = g_list_prepend (self->priv->transcoders, (RygelTranscoder*) _tmp42_);
-							break;
-						}
-					}
-				} else {
-					switch (0) {
-						default:
-						{
-							const gchar* _tmp43_;
-							_tmp43_ = transcoder;
-							g_debug ("rygel-gst-media-engine.vala:87: Unsupported transcoder \"%s\"", _tmp43_);
-							break;
-						}
-					}
-				}
-				_g_free0 (transcoder);
-			}
-			_g_object_unref0 (_transcoder_list);
-		}
-		self->priv->transcoders = g_list_reverse (self->priv->transcoders);
-	}
-	_g_object_unref0 (config);
-	_g_object_unref0 (transcoder_list);
-	_g_object_unref0 (discoverer);
-	return self;
+  G_OBJECT_CLASS (rygel_gst_media_engine_parent_class)->finalize (obj);
 }
 
-
-RygelGstMediaEngine* rygel_gst_media_engine_new (void) {
-	return rygel_gst_media_engine_construct (RYGEL_TYPE_GST_MEDIA_ENGINE);
-}
-
-
-static GList* rygel_gst_media_engine_real_get_dlna_profiles (RygelMediaEngine* base) {
-	RygelGstMediaEngine * self;
-	GList* result = NULL;
-	GList* _tmp0_;
-	self = (RygelGstMediaEngine*) base;
-	_tmp0_ = self->priv->dlna_profiles;
-	result = _tmp0_;
-	return result;
-}
-
-
-static GList* rygel_gst_media_engine_real_get_transcoders (RygelMediaEngine* base) {
-	RygelGstMediaEngine * self;
-	GList* result = NULL;
-	GList* _tmp0_;
-	self = (RygelGstMediaEngine*) base;
-	_tmp0_ = self->priv->transcoders;
-	result = _tmp0_;
-	return result;
-}
-
-
-static RygelDataSource* rygel_gst_media_engine_real_create_data_source (RygelMediaEngine* base, const gchar* uri) {
-	RygelGstMediaEngine * self;
-	RygelDataSource* result = NULL;
-	GError * _inner_error_ = NULL;
-	self = (RygelGstMediaEngine*) base;
-	g_return_val_if_fail (uri != NULL, NULL);
-	{
-		const gchar* _tmp0_;
-		RygelGstDataSource* _tmp1_;
-		RygelGstDataSource* _tmp2_;
-		_tmp0_ = uri;
-		_tmp1_ = rygel_gst_data_source_new (_tmp0_, &_inner_error_);
-		_tmp2_ = _tmp1_;
-		if (_inner_error_ != NULL) {
-			goto __catch1_g_error;
-		}
-		result = (RygelDataSource*) _tmp2_;
-		return result;
-	}
-	goto __finally1;
-	__catch1_g_error:
-	{
-		GError* _error_ = NULL;
-		_error_ = _inner_error_;
-		_inner_error_ = NULL;
-		result = NULL;
-		_g_error_free0 (_error_);
-		return result;
-	}
-	__finally1:
-	g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
-	g_clear_error (&_inner_error_);
-	return NULL;
-}
-
-
-RygelDataSource* rygel_gst_media_engine_create_data_source_from_element (RygelGstMediaEngine* self, GstElement* element) {
-	RygelDataSource* result = NULL;
-	GstElement* _tmp0_;
-	RygelGstDataSource* _tmp1_;
-	g_return_val_if_fail (self != NULL, NULL);
-	g_return_val_if_fail (element != NULL, NULL);
-	_tmp0_ = element;
-	_tmp1_ = rygel_gst_data_source_new_from_element (_tmp0_);
-	result = (RygelDataSource*) _tmp1_;
-	return result;
-}
-
-
-static void rygel_gst_media_engine_class_init (RygelGstMediaEngineClass * klass) {
-	rygel_gst_media_engine_parent_class = g_type_class_peek_parent (klass);
-	g_type_class_add_private (klass, sizeof (RygelGstMediaEnginePrivate));
-	RYGEL_MEDIA_ENGINE_CLASS (klass)->get_dlna_profiles = rygel_gst_media_engine_real_get_dlna_profiles;
-	RYGEL_MEDIA_ENGINE_CLASS (klass)->get_transcoders = rygel_gst_media_engine_real_get_transcoders;
-	RYGEL_MEDIA_ENGINE_CLASS (klass)->create_data_source = rygel_gst_media_engine_real_create_data_source;
-	G_OBJECT_CLASS (klass)->finalize = rygel_gst_media_engine_finalize;
-}
-
-
-static void rygel_gst_media_engine_instance_init (RygelGstMediaEngine * self) {
-	self->priv = RYGEL_GST_MEDIA_ENGINE_GET_PRIVATE (self);
-	self->priv->dlna_profiles = NULL;
-	self->priv->transcoders = NULL;
-}
-
-
-static void rygel_gst_media_engine_finalize (GObject* obj) {
-	RygelGstMediaEngine * self;
-	self = G_TYPE_CHECK_INSTANCE_CAST (obj, RYGEL_TYPE_GST_MEDIA_ENGINE, RygelGstMediaEngine);
-	__g_list_free__rygel_dlna_profile_unref0_0 (self->priv->dlna_profiles);
-	__g_list_free__g_object_unref0_0 (self->priv->transcoders);
-	G_OBJECT_CLASS (rygel_gst_media_engine_parent_class)->finalize (obj);
-}
-
-
-GType rygel_gst_media_engine_get_type (void) {
-	static volatile gsize rygel_gst_media_engine_type_id__volatile = 0;
-	if (g_once_init_enter (&rygel_gst_media_engine_type_id__volatile)) {
-		static const GTypeInfo g_define_type_info = { sizeof (RygelGstMediaEngineClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) rygel_gst_media_engine_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (RygelGstMediaEngine), 0, (GInstanceInitFunc) rygel_gst_media_engine_instance_init, NULL };
-		GType rygel_gst_media_engine_type_id;
-		rygel_gst_media_engine_type_id = g_type_register_static (RYGEL_TYPE_MEDIA_ENGINE, "RygelGstMediaEngine", &g_define_type_info, 0);
-		g_once_init_leave (&rygel_gst_media_engine_type_id__volatile, rygel_gst_media_engine_type_id);
-	}
-	return rygel_gst_media_engine_type_id__volatile;
-}
-
-
-RygelMediaEngine* module_get_instance (void) {
-	RygelMediaEngine* result = NULL;
-	RygelGstMediaEngine* _tmp0_;
-	_tmp0_ = rygel_gst_media_engine_new ();
-	result = (RygelMediaEngine*) _tmp0_;
-	return result;
+RygelMediaEngine*
+module_get_instance (void) {
+  return rygel_gst_media_engine_new ();
 }
 
 
diff --git a/src/rygel-gst-media-engine.h b/src/rygel-gst-media-engine.h
new file mode 100644
index 0000000..58a92f4
--- /dev/null
+++ b/src/rygel-gst-media-engine.h
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2012 Intel Corporation.
+ *
+ * This file is part of Rygel.
+ *
+ * Rygel is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Rygel 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __RYGEL_GST_0_10_MEDIA_ENGINE_MEDIA_ENGINE_H__
+#define __RYGEL_GST_0_10_MEDIA_ENGINE_MEDIA_ENGINE_H__
+
+#include <glib.h>
+#include <glib-object.h>
+#include <stdlib.h>
+#include <string.h>
+#include <rygel-server.h>
+#include <gst/gst.h>
+#include <libgupnp-dlna/gupnp-dlna-discoverer.h>
+#include <libgupnp-dlna/gupnp-dlna-profile.h>
+#include <gee.h>
+#include <rygel-core.h>
+
+G_BEGIN_DECLS
+
+#define RYGEL_TYPE_GST_MEDIA_ENGINE (rygel_gst_media_engine_get_type ())
+#define RYGEL_GST_MEDIA_ENGINE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_GST_MEDIA_ENGINE, RygelGstMediaEngine))
+#define RYGEL_GST_MEDIA_ENGINE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_GST_MEDIA_ENGINE, RygelGstMediaEngineClass))
+#define RYGEL_IS_GST_MEDIA_ENGINE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_GST_MEDIA_ENGINE))
+#define RYGEL_IS_GST_MEDIA_ENGINE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_GST_MEDIA_ENGINE))
+#define RYGEL_GST_MEDIA_ENGINE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_GST_MEDIA_ENGINE, RygelGstMediaEngineClass))
+
+typedef struct _RygelGstMediaEngine RygelGstMediaEngine;
+typedef struct _RygelGstMediaEngineClass RygelGstMediaEngineClass;
+typedef struct _RygelGstMediaEnginePrivate RygelGstMediaEnginePrivate;
+
+struct _RygelGstMediaEngine {
+  RygelMediaEngine parent_instance;
+  RygelGstMediaEnginePrivate * priv;
+};
+
+struct _RygelGstMediaEngineClass {
+  RygelMediaEngineClass parent_class;
+};
+
+GType rygel_gst_media_engine_get_type (void) G_GNUC_CONST;
+
+RygelGstMediaEngine* rygel_gst_media_engine_new (void);
+
+RygelDataSource* rygel_gst_media_engine_create_data_source_from_element (RygelGstMediaEngine* self, GstElement* element);
+
+RygelMediaEngine* module_get_instance (void);
+
+G_END_DECLS
+
+#endif /* __RYGEL_GST_0_10_MEDIA_ENGINE_MEDIA_ENGINE_H__ */
diff --git a/src/rygel-gst-sink.c b/src/rygel-gst-sink.c
index 23c3492..fbc8a95 100644
--- a/src/rygel-gst-sink.c
+++ b/src/rygel-gst-sink.c
@@ -23,41 +23,18 @@
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  */
 
-#include <glib.h>
-#include <glib-object.h>
-#include <gst/base/gstbasesink.h>
-#include <gio/gio.h>
-#include <rygel-server.h>
-#include <stdlib.h>
-#include <string.h>
-#include <gst/gst.h>
-
-
-#define RYGEL_TYPE_GST_SINK (rygel_gst_sink_get_type ())
-#define RYGEL_GST_SINK(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_GST_SINK, RygelGstSink))
-#define RYGEL_GST_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_GST_SINK, RygelGstSinkClass))
-#define RYGEL_IS_GST_SINK(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_GST_SINK))
-#define RYGEL_IS_GST_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_GST_SINK))
-#define RYGEL_GST_SINK_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_GST_SINK, RygelGstSinkClass))
-
-typedef struct _RygelGstSink RygelGstSink;
-typedef struct _RygelGstSinkClass RygelGstSinkClass;
-typedef struct _RygelGstSinkPrivate RygelGstSinkPrivate;
+
+#include "rygel-gst-sink.h"
+
+G_DEFINE_TYPE (RygelGstSink, rygel_gst_sink, GST_TYPE_BASE_SINK)
+
+
 #define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
 #define _gst_buffer_unref0(var) ((var == NULL) ? NULL : (var = (gst_buffer_unref (var), NULL)))
 typedef struct _Block1Data Block1Data;
 #define _gst_object_unref0(var) ((var == NULL) ? NULL : (var = (gst_object_unref (var), NULL)))
 #define _gst_caps_unref0(var) ((var == NULL) ? NULL : (var = (gst_caps_unref (var), NULL)))
 
-struct _RygelGstSink {
-	GstBaseSink parent_instance;
-	RygelGstSinkPrivate * priv;
-	GCancellable* cancellable;
-};
-
-struct _RygelGstSinkClass {
-	GstBaseSinkClass parent_class;
-};
 
 struct _RygelGstSinkPrivate {
 	gint priority;
@@ -78,13 +55,9 @@ struct _Block1Data {
 };
 
 
-static gpointer rygel_gst_sink_parent_class = NULL;
 
-GType rygel_gst_sink_get_type (void) G_GNUC_CONST;
 #define RYGEL_GST_SINK_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), RYGEL_TYPE_GST_SINK, RygelGstSinkPrivate))
-enum  {
-	RYGEL_GST_SINK_DUMMY_PROPERTY
-};
+
 #define RYGEL_GST_SINK_NAME "http-gst-sink"
 #define RYGEL_GST_SINK_PAD_NAME "sink"
 #define RYGEL_GST_SINK_MAX_BUFFERED_CHUNKS ((guint) 32)
@@ -405,7 +378,7 @@ static void rygel_gst_sink_class_init (RygelGstSinkClass * klass) {
 }
 
 
-static void rygel_gst_sink_instance_init (RygelGstSink * self) {
+static void rygel_gst_sink_init (RygelGstSink * self) {
 	GMutex _tmp0_ = {0};
 	GCond _tmp1_ = {0};
 	self->priv = RYGEL_GST_SINK_GET_PRIVATE (self);
@@ -426,19 +399,6 @@ static void rygel_gst_sink_finalize (GObject* obj) {
 	G_OBJECT_CLASS (rygel_gst_sink_parent_class)->finalize (obj);
 }
 
-
-GType rygel_gst_sink_get_type (void) {
-	static volatile gsize rygel_gst_sink_type_id__volatile = 0;
-	if (g_once_init_enter (&rygel_gst_sink_type_id__volatile)) {
-		static const GTypeInfo g_define_type_info = { sizeof (RygelGstSinkClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) rygel_gst_sink_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (RygelGstSink), 0, (GInstanceInitFunc) rygel_gst_sink_instance_init, NULL };
-		GType rygel_gst_sink_type_id;
-		rygel_gst_sink_type_id = g_type_register_static (GST_TYPE_BASE_SINK, "RygelGstSink", &g_define_type_info, 0);
-		g_once_init_leave (&rygel_gst_sink_type_id__volatile, rygel_gst_sink_type_id);
-	}
-	return rygel_gst_sink_type_id__volatile;
-}
-
-
 static void _vala_clear_GMutex (GMutex * mutex) {
 	GMutex zero_mutex = { 0 };
 	if (memcmp (mutex, &zero_mutex, sizeof (GMutex))) {
diff --git a/src/rygel-gst-sink.h b/src/rygel-gst-sink.h
new file mode 100644
index 0000000..8d40b41
--- /dev/null
+++ b/src/rygel-gst-sink.h
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2009 Nokia Corporation
+ * Copyright (C) 2012 Intel Corporation
+ *
+ * Rygel is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Rygel 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __RYGEL_GST_0_10_MEDIA_ENGINE_GST_SINK_H__
+#define __RYGEL_GST_0_10_MEDIA_ENGINE_GST_SINK_H__
+
+#include <glib.h>
+#include <glib-object.h>
+#include <stdlib.h>
+#include <string.h>
+#include <rygel-server.h>
+#include <gst/gst.h>
+#include <libgupnp-dlna/gupnp-dlna-discoverer.h>
+#include <libgupnp-dlna/gupnp-dlna-profile.h>
+#include <gee.h>
+#include <rygel-core.h>
+#include <gst/gst.h>
+#include <gst/base/gstbasesink.h>
+
+G_BEGIN_DECLS
+
+#define RYGEL_TYPE_GST_SINK (rygel_gst_sink_get_type ())
+#define RYGEL_GST_SINK(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_GST_SINK, RygelGstSink))
+#define RYGEL_GST_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_GST_SINK, RygelGstSinkClass))
+#define RYGEL_IS_GST_SINK(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_GST_SINK))
+#define RYGEL_IS_GST_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_GST_SINK))
+#define RYGEL_GST_SINK_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_GST_SINK, RygelGstSinkClass))
+
+typedef struct _RygelGstSink RygelGstSink;
+typedef struct _RygelGstSinkClass RygelGstSinkClass;
+typedef struct _RygelGstSinkPrivate RygelGstSinkPrivate;
+
+struct _RygelGstSink {
+  GstBaseSink parent_instance;
+  RygelGstSinkPrivate * priv;
+
+  /* TODO: Put this in priv? */
+  GCancellable* cancellable;
+};
+
+struct _RygelGstSinkClass {
+  GstBaseSinkClass parent_class;
+};
+
+GType rygel_gst_sink_get_type (void) G_GNUC_CONST;
+
+RygelGstSink* rygel_gst_sink_new (RygelDataSource* source, RygelHTTPSeek* offsets);
+
+G_END_DECLS
+
+#endif /* __RYGEL_GST_0_10_MEDIA_ENGINE_GST_SINK_H__ */
diff --git a/src/rygel-gst-transcoder.c b/src/rygel-gst-transcoder.c
index 5094432..a87c33a 100644
--- a/src/rygel-gst-transcoder.c
+++ b/src/rygel-gst-transcoder.c
@@ -1,12 +1,6 @@
 /*
- * Copyright (C) 2009-2012 Nokia Corporation.
- * Copyright (C) 2012 Intel Corporation.
- *
- * Author: Zeeshan Ali (Khattak) <zeeshanak gnome org>
- *                               <zeeshan ali nokia com>
- *         Jens Georg <jensg openismus com>
- *
- * This file is part of Rygel.
+ * Copyright (C) 2009-2012 Nokia Corporation
+ * Copyright (C) 2012 Intel Corporation
  *
  * Rygel is free software; you can redistribute it and/or modify
  * it under the terms of the GNU Lesser General Public License as published by
@@ -23,596 +17,284 @@
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  */
 
-#include <glib.h>
-#include <glib-object.h>
-#include <rygel-server.h>
-#include <gst/pbutils/pbutils.h>
-#include <stdlib.h>
-#include <string.h>
-#include <gst/gst.h>
-#include <gio/gio.h>
-
-
-#define RYGEL_TYPE_GST_TRANSCODER (rygel_gst_transcoder_get_type ())
-#define RYGEL_GST_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_GST_TRANSCODER, RygelGstTranscoder))
-#define RYGEL_GST_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_GST_TRANSCODER, RygelGstTranscoderClass))
-#define RYGEL_IS_GST_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_GST_TRANSCODER))
-#define RYGEL_IS_GST_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_GST_TRANSCODER))
-#define RYGEL_GST_TRANSCODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_GST_TRANSCODER, RygelGstTranscoderClass))
-
-typedef struct _RygelGstTranscoder RygelGstTranscoder;
-typedef struct _RygelGstTranscoderClass RygelGstTranscoderClass;
-typedef struct _RygelGstTranscoderPrivate RygelGstTranscoderPrivate;
-#define _g_free0(var) (var = (g_free (var), NULL))
-#define _gst_object_unref0(var) ((var == NULL) ? NULL : (var = (gst_object_unref (var), NULL)))
-
-#define RYGEL_TYPE_GST_DATA_SOURCE (rygel_gst_data_source_get_type ())
-#define RYGEL_GST_DATA_SOURCE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_GST_DATA_SOURCE, RygelGstDataSource))
-#define RYGEL_GST_DATA_SOURCE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_GST_DATA_SOURCE, RygelGstDataSourceClass))
-#define RYGEL_IS_GST_DATA_SOURCE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_GST_DATA_SOURCE))
-#define RYGEL_IS_GST_DATA_SOURCE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_GST_DATA_SOURCE))
-#define RYGEL_GST_DATA_SOURCE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_GST_DATA_SOURCE, RygelGstDataSourceClass))
-
-typedef struct _RygelGstDataSource RygelGstDataSource;
-typedef struct _RygelGstDataSourceClass RygelGstDataSourceClass;
-#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
-#define _gst_encoding_profile_unref0(var) ((var == NULL) ? NULL : (var = (gst_encoding_profile_unref (var), NULL)))
-typedef struct _RygelGstDataSourcePrivate RygelGstDataSourcePrivate;
-#define _gst_caps_unref0(var) ((var == NULL) ? NULL : (var = (gst_caps_unref (var), NULL)))
-#define _gst_message_unref0(var) ((var == NULL) ? NULL : (var = (gst_message_unref (var), NULL)))
-#define _g_error_free0(var) ((var == NULL) ? NULL : (var = (g_error_free (var), NULL)))
-#define _vala_assert(expr, msg) if G_LIKELY (expr) ; else g_assertion_message_expr (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, msg);
-
-struct _RygelGstTranscoder {
-	RygelTranscoder parent_instance;
-	RygelGstTranscoderPrivate * priv;
-};
-
-struct _RygelGstTranscoderClass {
-	RygelTranscoderClass parent_class;
-	GstEncodingProfile* (*get_encoding_profile) (RygelGstTranscoder* self);
-};
-
-struct _RygelGstTranscoderPrivate {
-	gchar* _preset;
-	GstElement* decoder;
-	GstElement* encoder;
-	gboolean link_failed;
-};
-
-struct _RygelGstDataSource {
-	GObject parent_instance;
-	RygelGstDataSourcePrivate * priv;
-	GstElement* src;
-};
-
-struct _RygelGstDataSourceClass {
-	GObjectClass parent_class;
-};
-
-
-static gpointer rygel_gst_transcoder_parent_class = NULL;
+#include "rygel-gst-transcoder.h"
+#include "rygel-gst-data-source.h"
 
-GType rygel_gst_transcoder_get_type (void) G_GNUC_CONST;
-#define RYGEL_GST_TRANSCODER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), RYGEL_TYPE_GST_TRANSCODER, RygelGstTranscoderPrivate))
-enum  {
-	RYGEL_GST_TRANSCODER_DUMMY_PROPERTY,
-	RYGEL_GST_TRANSCODER_PRESET
-};
+/* TODO: Rename these? */
 #define RYGEL_GST_TRANSCODER_DEFAULT_ENCODING_PRESET "Rygel DLNA preset"
 #define RYGEL_GST_TRANSCODER_DECODE_BIN "decodebin2"
 #define RYGEL_GST_TRANSCODER_ENCODE_BIN "encodebin"
-#define RYGEL_GST_TRANSCODER_DESCRIPTION "Encoder and decoder are not " "compatible"
-RygelGstTranscoder* rygel_gst_transcoder_construct (GType object_type, const gchar* mime_type, const gchar* dlna_profile, const gchar* upnp_class, const gchar* extension);
-static RygelDataSource* rygel_gst_transcoder_real_create_source (RygelTranscoder* base, RygelMediaItem* item, RygelDataSource* src, GError** error);
-GType rygel_gst_data_source_get_type (void) G_GNUC_CONST;
-GstElement* rygel_gst_utils_create_element (const gchar* factoryname, const gchar* name, GError** error);
-GstEncodingProfile* rygel_gst_transcoder_get_encoding_profile (RygelGstTranscoder* self);
-static inline void _dynamic_set_profile2 (GstElement* obj, GstEncodingProfile* value);
-void rygel_gst_utils_dump_encoding_profile (GstEncodingProfile* profile, gint indent);
-static inline GstEncodingProfile* _dynamic_get_profile3 (GstElement* obj);
-static void rygel_gst_transcoder_on_decoder_pad_added (RygelGstTranscoder* self, GstElement* decodebin, GstPad* new_pad);
-static void _rygel_gst_transcoder_on_decoder_pad_added_gst_element_pad_added (GstElement* _sender, GstPad* pad, gpointer self);
-static gboolean rygel_gst_transcoder_on_autoplug_continue (RygelGstTranscoder* self, GstElement* decodebin, GstPad* new_pad, GstCaps* caps);
-static gboolean _rygel_gst_transcoder_on_autoplug_continue_dynamic_autoplug_continue0_ (GstElement* _sender, GstPad* new_pad, GstCaps* caps, gpointer self);
-static void g_cclosure_user_marshal_BOOLEAN__OBJECT_GST_CAPS (GClosure * closure, GValue * return_value, guint n_param_values, const GValue * param_values, gpointer invocation_hint, gpointer marshal_data);
-void _dynamic_autoplug_continue1_connect (gpointer obj, const char * signal_name, GCallback handler, gpointer data);
-static void rygel_gst_transcoder_on_no_more_pads (RygelGstTranscoder* self, GstElement* decodebin);
-static void _rygel_gst_transcoder_on_no_more_pads_gst_element_no_more_pads (GstElement* _sender, gpointer self);
-RygelGstDataSource* rygel_gst_data_source_new_from_element (GstElement* element);
-RygelGstDataSource* rygel_gst_data_source_construct_from_element (GType object_type, GstElement* element);
-static GstEncodingProfile* rygel_gst_transcoder_real_get_encoding_profile (RygelGstTranscoder* self);
-const gchar* rygel_gst_transcoder_get_preset (RygelGstTranscoder* self);
-void rygel_gst_transcoder_set_preset (RygelGstTranscoder* self, const gchar* value);
-static void rygel_gst_transcoder_finalize (GObject* obj);
-static void _vala_rygel_gst_transcoder_get_property (GObject * object, guint property_id, GValue * value, GParamSpec * pspec);
-static void _vala_rygel_gst_transcoder_set_property (GObject * object, guint property_id, const GValue * value, GParamSpec * pspec);
-
-
-RygelGstTranscoder* rygel_gst_transcoder_construct (GType object_type, const gchar* mime_type, const gchar* dlna_profile, const gchar* upnp_class, const gchar* extension) {
-	RygelGstTranscoder * self = NULL;
-	const gchar* _tmp0_;
-	const gchar* _tmp1_;
-	const gchar* _tmp2_;
-	g_return_val_if_fail (mime_type != NULL, NULL);
-	g_return_val_if_fail (dlna_profile != NULL, NULL);
-	g_return_val_if_fail (upnp_class != NULL, NULL);
-	g_return_val_if_fail (extension != NULL, NULL);
-	self = (RygelGstTranscoder*) rygel_transcoder_construct (object_type);
-	_tmp0_ = mime_type;
-	rygel_transcoder_set_mime_type ((RygelTranscoder*) self, _tmp0_);
-	_tmp1_ = dlna_profile;
-	rygel_transcoder_set_dlna_profile ((RygelTranscoder*) self, _tmp1_);
-	self->priv->link_failed = TRUE;
-	_tmp2_ = extension;
-	rygel_transcoder_set_extension ((RygelTranscoder*) self, _tmp2_);
-	return self;
-}
-
-
-/**
-     * Creates a transcoding source.
-     *
-     * @param src the media item to create the transcoding source for
-     * @param src the original (non-transcoding) source
-     *
-     * @return      the new transcoding source
-     */
-static gpointer _g_object_ref0 (gpointer self) {
-	return self ? g_object_ref (self) : NULL;
-}
-
-
-static inline void _dynamic_set_profile2 (GstElement* obj, GstEncodingProfile* value) {
-	g_object_set (obj, "profile", value, NULL);
-}
-
-
-static inline GstEncodingProfile* _dynamic_get_profile3 (GstElement* obj) {
-	GstEncodingProfile* result;
-	g_object_get (obj, "profile", &result, NULL);
-	return result;
-}
+#define RYGEL_GST_TRANSCODER_DESCRIPTION "Encoder and decoder are not compatible"
 
+enum  {
+  RYGEL_GST_TRANSCODER_DUMMY_PROPERTY,
+  RYGEL_GST_TRANSCODER_PRESET
+};
 
-static void _rygel_gst_transcoder_on_decoder_pad_added_gst_element_pad_added (GstElement* _sender, GstPad* pad, gpointer self) {
-	rygel_gst_transcoder_on_decoder_pad_added (self, _sender, pad);
-}
+G_DEFINE_TYPE (RygelGstTranscoder, rygel_gst_transcoder, RYGEL_TYPE_TRANSCODER)
 
+struct _RygelGstTranscoderPrivate {
+  gchar* _preset;
+  GstElement* decoder;
+  GstElement* encoder;
+  gboolean link_failed;
+};
 
-static gboolean _rygel_gst_transcoder_on_autoplug_continue_dynamic_autoplug_continue0_ (GstElement* _sender, GstPad* new_pad, GstCaps* caps, gpointer self) {
-	gboolean result;
-	result = rygel_gst_transcoder_on_autoplug_continue (self, _sender, new_pad, caps);
-	return result;
+static void rygel_gst_transcoder_get_property (GObject * object, guint property_id, GValue * value, GParamSpec * pspec);
+static void rygel_gst_transcoder_set_property (GObject * object, guint property_id, const GValue * value, GParamSpec * pspec);
+static void rygel_gst_transcoder_finalize (GObject* obj); 
+
+static RygelGstTranscoder*
+rygel_gst_transcoder_construct (GType object_type, const gchar* mime_type, const gchar* dlna_profile, const gchar* extension) {
+  RygelGstTranscoder *self;
+
+  g_return_val_if_fail (mime_type != NULL, NULL);
+  g_return_val_if_fail (dlna_profile != NULL, NULL);
+  g_return_val_if_fail (extension != NULL, NULL);
+  
+  self = RYGEL_GST_TRANSCODER (rygel_transcoder_construct (object_type));
+  
+  rygel_transcoder_set_mime_type (RYGEL_TRANSCODER (self), mime_type);
+  rygel_transcoder_set_dlna_profile (RYGEL_TRANSCODER (self), dlna_profile);
+  self->priv->link_failed = TRUE;
+  rygel_transcoder_set_extension (RYGEL_TRANSCODER (self), extension);
+
+  return self;
 }
 
-
-static void g_cclosure_user_marshal_BOOLEAN__OBJECT_GST_CAPS (GClosure * closure, GValue * return_value, guint n_param_values, const GValue * param_values, gpointer invocation_hint, gpointer marshal_data) {
-	typedef gboolean (*GMarshalFunc_BOOLEAN__OBJECT_GST_CAPS) (gpointer data1, gpointer arg_1, gpointer arg_2, gpointer data2);
-	register GMarshalFunc_BOOLEAN__OBJECT_GST_CAPS callback;
-	register GCClosure * cc;
-	register gpointer data1;
-	register gpointer data2;
-	gboolean v_return;
-	cc = (GCClosure *) closure;
-	g_return_if_fail (return_value != NULL);
-	g_return_if_fail (n_param_values == 3);
-	if (G_CCLOSURE_SWAP_DATA (closure)) {
-		data1 = closure->data;
-		data2 = param_values->data[0].v_pointer;
-	} else {
-		data1 = param_values->data[0].v_pointer;
-		data2 = closure->data;
-	}
-	callback = (GMarshalFunc_BOOLEAN__OBJECT_GST_CAPS) (marshal_data ? marshal_data : cc->callback);
-	v_return = callback (data1, g_value_get_object (param_values + 1), gst_value_get_caps (param_values + 2), data2);
-	g_value_set_boolean (return_value, v_return);
+static void
+on_decoder_pad_added (GstElement* decodebin, GstPad* new_pad, gpointer user_data) {
+  RygelGstTranscoder* self = RYGEL_GST_TRANSCODER (user_data);
+ 
+  GstPad* sinkpad = gst_element_get_compatible_pad (self->priv->encoder, new_pad, NULL);
+
+  if (!sinkpad) {
+    GstCaps *caps =  gst_pad_get_caps_reffed (new_pad);
+    g_signal_emit_by_name (self->priv->encoder, "request-pad", caps, &sinkpad, NULL);
+    gst_caps_unref (caps);
+  }
+
+  if (!sinkpad) {
+    g_debug ("No compatible encodebin pad found for pad '%s'. Ignoring.", gst_object_get_name (new_pad));
+    return;
+  }
+  
+  if (gst_pad_link (new_pad, sinkpad) == GST_PAD_LINK_OK) {
+    self->priv->link_failed = FALSE;
+  } else {
+    g_warning ("Failed to link pad '%s' to '%s'", gst_object_get_name (new_pad), gst_object_get_name (sinkpad));
+  }
+  
+  gst_object_unref (sinkpad);
+
+  return;
 }
 
-
-void _dynamic_autoplug_continue1_connect (gpointer obj, const char * signal_name, GCallback handler, gpointer data) {
-	g_signal_connect_object (obj, signal_name, handler, data, 0);
+static gboolean
+on_decoder_autoplug_continue (GstElement* decodebin, GstPad* new_pad, GstCaps* caps, gpointer user_data) {
+  RygelGstTranscoder* self = RYGEL_GST_TRANSCODER (user_data);
+  
+  GstPad* sinkpad = NULL;
+  g_signal_emit_by_name (self->priv->encoder, "request-pad", caps, &sinkpad, NULL);
+  if (!sinkpad) {
+    return TRUE;
+  }
+  
+  gst_object_unref (sinkpad);
+  return FALSE;
 }
 
-
-static void _rygel_gst_transcoder_on_no_more_pads_gst_element_no_more_pads (GstElement* _sender, gpointer self) {
-	rygel_gst_transcoder_on_no_more_pads (self, _sender);
+static void
+on_decoder_no_more_pads (GstElement* decodebin, gpointer user_data) {
+  RygelGstTranscoder* self = RYGEL_GST_TRANSCODER (user_data);
+  
+  /* We haven't found any pads we could link */
+  if (self->priv->link_failed) {
+    /* Signal that error. */
+    GstBin *bin = gst_object_get_parent (GST_OBJECT (self->priv->encoder));
+    GError *error = g_error_new_literal (G_IO_ERROR, G_IO_ERROR_FAILED, "Could not link");
+    GstMessage* message = gst_message_new_error (GST_OBJECT (bin), error, RYGEL_GST_TRANSCODER_DESCRIPTION);
+
+    GstBus* bus = gst_element_get_bus (GST_ELEMENT (bin));
+    gst_bus_post (bus, message);
+    
+    gst_object_unref (bus);
+    g_clear_error (error);
+    gst_object_unref (bin);
+  }
 }
 
-
-static RygelDataSource* rygel_gst_transcoder_real_create_source (RygelTranscoder* base, RygelMediaItem* item, RygelDataSource* src, GError** error) {
-	RygelGstTranscoder * self;
-	RygelDataSource* result = NULL;
-	RygelDataSource* _tmp0_;
-	RygelDataSource* _tmp1_;
-	RygelGstDataSource* _tmp2_;
-	RygelGstDataSource* orig_source;
-	GstElement* _tmp3_ = NULL;
-	GstElement* _tmp4_;
-	GstElement* _tmp5_ = NULL;
-	GstElement* _tmp6_;
-	GstElement* _tmp7_;
-	GstEncodingProfile* _tmp8_ = NULL;
-	GstEncodingProfile* _tmp9_;
-	GObjectClass* _tmp10_ = NULL;
-	GType _tmp11_ = 0UL;
-	const gchar* _tmp12_ = NULL;
-	GstElement* _tmp13_;
-	GstEncodingProfile* _tmp14_;
-	GstEncodingProfile* _tmp15_;
-	GstBin* _tmp16_;
-	GstBin* bin;
-	GstBin* _tmp17_;
-	RygelGstDataSource* _tmp18_;
-	GstElement* _tmp19_;
-	GstElement* _tmp20_;
-	GstElement* _tmp21_;
-	RygelGstDataSource* _tmp22_;
-	GstElement* _tmp23_;
-	GstElement* _tmp24_;
-	GstElement* _tmp25_;
-	GstElement* _tmp26_;
-	GstElement* _tmp27_;
-	GstElement* _tmp28_;
-	GstPad* _tmp29_ = NULL;
-	GstPad* pad;
-	GstPad* _tmp30_;
-	GstGhostPad* _tmp31_;
-	GstGhostPad* ghost;
-	GstBin* _tmp32_;
-	GstGhostPad* _tmp33_;
-	GstBin* _tmp34_;
-	RygelGstDataSource* _tmp35_;
-	GError * _inner_error_ = NULL;
-	self = (RygelGstTranscoder*) base;
-	g_return_val_if_fail (item != NULL, NULL);
-	g_return_val_if_fail (src != NULL, NULL);
-	_tmp0_ = src;
-	_vala_assert (G_TYPE_CHECK_INSTANCE_TYPE (_tmp0_, RYGEL_TYPE_GST_DATA_SOURCE), "src is GstDataSource");
-	_tmp1_ = src;
-	_tmp2_ = _g_object_ref0 (G_TYPE_CHECK_INSTANCE_TYPE (_tmp1_, RYGEL_TYPE_GST_DATA_SOURCE) ? ((RygelGstDataSource*) _tmp1_) : NULL);
-	orig_source = _tmp2_;
-	_tmp3_ = rygel_gst_utils_create_element (RYGEL_GST_TRANSCODER_DECODE_BIN, RYGEL_GST_TRANSCODER_DECODE_BIN, &_inner_error_);
-	_tmp4_ = _tmp3_;
-	if (_inner_error_ != NULL) {
-		g_propagate_error (error, _inner_error_);
-		_g_object_unref0 (orig_source);
-		return NULL;
-	}
-	_gst_object_unref0 (self->priv->decoder);
-	self->priv->decoder = _tmp4_;
-	_tmp5_ = rygel_gst_utils_create_element (RYGEL_GST_TRANSCODER_ENCODE_BIN, RYGEL_GST_TRANSCODER_ENCODE_BIN, &_inner_error_);
-	_tmp6_ = _tmp5_;
-	if (_inner_error_ != NULL) {
-		g_propagate_error (error, _inner_error_);
-		_g_object_unref0 (orig_source);
-		return NULL;
-	}
-	_gst_object_unref0 (self->priv->encoder);
-	self->priv->encoder = _tmp6_;
-	_tmp7_ = self->priv->encoder;
-	_tmp8_ = rygel_gst_transcoder_get_encoding_profile (self);
-	_tmp9_ = _tmp8_;
-	_dynamic_set_profile2 (_tmp7_, _tmp9_);
-	_gst_encoding_profile_unref0 (_tmp9_);
-	_tmp10_ = G_OBJECT_GET_CLASS ((GObject*) self);
-	_tmp11_ = G_TYPE_FROM_CLASS ((GTypeClass*) _tmp10_);
-	_tmp12_ = g_type_name (_tmp11_);
-	g_debug ("rygel-gst-transcoder.vala:78: %s using the following encoding profile:", _tmp12_);
-	_tmp13_ = self->priv->encoder;
-	_tmp14_ = _dynamic_get_profile3 (_tmp13_);
-	_tmp15_ = _tmp14_;
-	rygel_gst_utils_dump_encoding_profile (_tmp15_, 2);
-	_tmp16_ = (GstBin*) gst_bin_new ("transcoder-source");
-	gst_object_ref_sink (_tmp16_);
-	bin = _tmp16_;
-	_tmp17_ = bin;
-	_tmp18_ = orig_source;
-	_tmp19_ = _tmp18_->src;
-	_tmp20_ = self->priv->decoder;
-	_tmp21_ = self->priv->encoder;
-	gst_bin_add_many (_tmp17_, _tmp19_, _tmp20_, _tmp21_, NULL);
-	_tmp22_ = orig_source;
-	_tmp23_ = _tmp22_->src;
-	_tmp24_ = self->priv->decoder;
-	gst_element_link (_tmp23_, _tmp24_);
-	_tmp25_ = self->priv->decoder;
-	g_signal_connect_object (_tmp25_, "pad-added", (GCallback) _rygel_gst_transcoder_on_decoder_pad_added_gst_element_pad_added, self, 0);
-	_tmp26_ = self->priv->decoder;
-	_dynamic_autoplug_continue1_connect (_tmp26_, "autoplug_continue", (GCallback) _rygel_gst_transcoder_on_autoplug_continue_dynamic_autoplug_continue0_, self);
-	_tmp27_ = self->priv->decoder;
-	g_signal_connect_object (_tmp27_, "no-more-pads", (GCallback) _rygel_gst_transcoder_on_no_more_pads_gst_element_no_more_pads, self, 0);
-	_tmp28_ = self->priv->encoder;
-	_tmp29_ = gst_element_get_static_pad (_tmp28_, "src");
-	pad = _tmp29_;
-	_tmp30_ = pad;
-	_tmp31_ = (GstGhostPad*) gst_ghost_pad_new (NULL, _tmp30_);
-	gst_object_ref_sink (_tmp31_);
-	ghost = _tmp31_;
-	_tmp32_ = bin;
-	_tmp33_ = ghost;
-	gst_element_add_pad ((GstElement*) _tmp32_, (GstPad*) _tmp33_);
-	_tmp34_ = bin;
-	_tmp35_ = rygel_gst_data_source_new_from_element ((GstElement*) _tmp34_);
-	result = (RygelDataSource*) _tmp35_;
-	_gst_object_unref0 (ghost);
-	_gst_object_unref0 (pad);
-	_gst_object_unref0 (bin);
-	_g_object_unref0 (orig_source);
-	return result;
+static RygelDataSource*
+rygel_gst_transcoder_create_source (RygelTranscoder* base, RygelMediaItem* item, RygelDataSource* src, GError** error) {
+  RygelGstTranscoder *self;
+  RygelGstDataSource *data_source;
+  GstEncodingProfile *encoding_profile;
+  GstBin *bin;
+  GError *inner_error = NULL;
+
+  g_return_val_if_fail (item != NULL, NULL);
+  g_return_val_if_fail (src != NULL, NULL);
+  
+  /* We can only link GStreamer data sources together. */
+  g_return_val_if_fail (RYGEL_IS_GST_DATA_SOURCE (src), NULL);
+  
+  self = RYGEL_GST_TRANSCODER (self);
+  data_source = RYGEL_GST_DATA_SOURCE (src);
+  
+  if (self->priv->decoder) {
+    g_object_unref (self->priv->decoder);
+  }
+
+  self->priv->decoder =
+    rygel_gst_utils_create_element (RYGEL_GST_TRANSCODER_DECODE_BIN,
+      RYGEL_GST_TRANSCODER_DECODE_BIN, 
+      &inner_error);
+  if (inner_error) {
+    g_propagate_error (error, inner_error);
+    return NULL;
+  }
+
+  if (self->priv->encoder) {
+    g_object_unref (self->priv->encoder);
+  }
+
+  self->priv->encoder =
+    rygel_gst_utils_create_element (RYGEL_GST_TRANSCODER_ENCODE_BIN,
+      RYGEL_GST_TRANSCODER_ENCODE_BIN,
+      &inner_error);
+  if (inner_error) {
+    g_propagate_error (error, inner_error);
+    return NULL;
+  }
+  
+  encoding_profile = rygel_gst_transcoder_get_encoding_profile (self);
+  g_object_set (self->priv->encoder, "profile", encoding_profile, NULL);
+  gst_object_unref (encoding_profile);
+  g_debug ("%s using the following encoding profile:", G_OBJECT_TYPE_NAME (self));
+  rygel_gst_utils_dump_encoding_profile (encoding_profile, 2);
+
+  bin = (GstBin*) gst_bin_new ("transcoder-source");
+  gst_object_ref_sink (bin);
+  
+  GstElement *element = rygel_gst_data_source_get_source (data_source);
+  gst_bin_add_many (bin, element, self->priv->decoder, self->priv->encoder, NULL);
+  
+  gst_element_link (element, self->priv->decoder);
+
+  g_signal_connect_object (self->priv->decoder, "pad-added", (GCallback) on_decoder_pad_added, self, 0);
+  g_signal_connect_object (self->priv->decoder, "autoplug_continue", (GCallback) on_decoder_autoplug_continue, self, 0);
+  g_signal_connect_object (self->priv->decoder, "no-more-pads", (GCallback) on_decoder_no_more_pads, self, 0);
+  
+  GstPad *pad = gst_element_get_static_pad (self->priv->encoder, "src");
+  GstGhostPad *ghost_pad = (GstGhostPad*) gst_ghost_pad_new (NULL, pad);
+  gst_object_ref_sink (ghost_pad);
+  gst_element_add_pad (GST_ELEMENT (bin), GST_PAD (ghost_pad));
+
+  RygelDataSource *result = rygel_gst_data_source_new_from_element (bin);
+  gst_object_unref (ghost_pad);
+  gst_object_unref (pad);
+  gst_object_unref (bin);
+
+  return result;
 }
 
-
 /**
-     * Gets the Gst.EncodingProfile for this transcoder.
-     *
-     * @return      the Gst.EncodingProfile for this transcoder.
-     */
-static GstEncodingProfile* rygel_gst_transcoder_real_get_encoding_profile (RygelGstTranscoder* self) {
-	g_critical ("Type `%s' does not implement abstract method `rygel_gst_transcoder_get_encoding_profile'", g_type_name (G_TYPE_FROM_INSTANCE (self)));
-	return NULL;
-}
-
-
-GstEncodingProfile* rygel_gst_transcoder_get_encoding_profile (RygelGstTranscoder* self) {
-	g_return_val_if_fail (self != NULL, NULL);
-	return RYGEL_GST_TRANSCODER_GET_CLASS (self)->get_encoding_profile (self);
-}
-
-
-static gboolean rygel_gst_transcoder_on_autoplug_continue (RygelGstTranscoder* self, GstElement* decodebin, GstPad* new_pad, GstCaps* caps) {
-	gboolean result = FALSE;
-	GstPad* sinkpad;
-	GstElement* _tmp0_;
-	GstCaps* _tmp1_;
-	GstPad* _tmp2_;
-	g_return_val_if_fail (self != NULL, FALSE);
-	g_return_val_if_fail (decodebin != NULL, FALSE);
-	g_return_val_if_fail (new_pad != NULL, FALSE);
-	g_return_val_if_fail (caps != NULL, FALSE);
-	sinkpad = NULL;
-	_tmp0_ = self->priv->encoder;
-	_tmp1_ = caps;
-	g_signal_emit_by_name (_tmp0_, "request-pad", _tmp1_, &sinkpad, NULL);
-	_tmp2_ = sinkpad;
-	if (_tmp2_ == NULL) {
-		result = TRUE;
-		_gst_object_unref0 (sinkpad);
-		return result;
-	}
-	result = FALSE;
-	_gst_object_unref0 (sinkpad);
-	return result;
-}
-
-
-static void rygel_gst_transcoder_on_decoder_pad_added (RygelGstTranscoder* self, GstElement* decodebin, GstPad* new_pad) {
-	GstPad* sinkpad = NULL;
-	GstElement* _tmp0_;
-	GstPad* _tmp1_;
-	GstPad* _tmp2_ = NULL;
-	GstPad* _tmp3_;
-	GstPad* _tmp8_;
-	GstPad* _tmp13_;
-	GstPad* _tmp14_;
-	GstPadLinkReturn _tmp15_ = 0;
-	gboolean pad_link_ok;
-	gboolean _tmp16_;
-	g_return_if_fail (self != NULL);
-	g_return_if_fail (decodebin != NULL);
-	g_return_if_fail (new_pad != NULL);
-	_tmp0_ = self->priv->encoder;
-	_tmp1_ = new_pad;
-	_tmp2_ = gst_element_get_compatible_pad (_tmp0_, _tmp1_, NULL);
-	_gst_object_unref0 (sinkpad);
-	sinkpad = _tmp2_;
-	_tmp3_ = sinkpad;
-	if (_tmp3_ == NULL) {
-		GstPad* _tmp4_;
-		GstCaps* _tmp5_ = NULL;
-		GstCaps* caps;
-		GstElement* _tmp6_;
-		GstCaps* _tmp7_;
-		_tmp4_ = new_pad;
-		_tmp5_ = gst_pad_get_caps_reffed (_tmp4_);
-		caps = _tmp5_;
-		_tmp6_ = self->priv->encoder;
-		_tmp7_ = caps;
-		g_signal_emit_by_name (_tmp6_, "request-pad", _tmp7_, &sinkpad, NULL);
-		_gst_caps_unref0 (caps);
-	}
-	_tmp8_ = sinkpad;
-	if (_tmp8_ == NULL) {
-		GstPad* _tmp9_;
-		gchar* _tmp10_;
-		gchar* _tmp11_;
-		gchar* _tmp12_;
-		_tmp9_ = new_pad;
-		_tmp10_ = gst_object_get_name ((GstObject*) _tmp9_);
-		_tmp11_ = _tmp10_;
-		_tmp12_ = _tmp11_;
-		g_debug ("rygel-gst-transcoder.vala:129: No compatible encodebin pad found for p" \
-"ad '%s', ignoring..", _tmp12_);
-		_g_free0 (_tmp12_);
-		_gst_object_unref0 (sinkpad);
-		return;
-	}
-	_tmp13_ = new_pad;
-	_tmp14_ = sinkpad;
-	_tmp15_ = gst_pad_link (_tmp13_, _tmp14_);
-	pad_link_ok = _tmp15_ == GST_PAD_LINK_OK;
-	_tmp16_ = pad_link_ok;
-	if (!_tmp16_) {
-		GstPad* _tmp17_;
-		gchar* _tmp18_;
-		gchar* _tmp19_;
-		gchar* _tmp20_;
-		GstPad* _tmp21_;
-		gchar* _tmp22_;
-		gchar* _tmp23_;
-		gchar* _tmp24_;
-		_tmp17_ = new_pad;
-		_tmp18_ = gst_object_get_name ((GstObject*) _tmp17_);
-		_tmp19_ = _tmp18_;
-		_tmp20_ = _tmp19_;
-		_tmp21_ = sinkpad;
-		_tmp22_ = gst_object_get_name ((GstObject*) _tmp21_);
-		_tmp23_ = _tmp22_;
-		_tmp24_ = _tmp23_;
-		g_warning ("rygel-gst-transcoder.vala:137: Failed to link pad '%s' to '%s'", _tmp20_, _tmp24_);
-		_g_free0 (_tmp24_);
-		_g_free0 (_tmp20_);
-	} else {
-		self->priv->link_failed = FALSE;
-	}
-	_gst_object_unref0 (sinkpad);
-	return;
-}
-
-
-static gpointer _gst_message_ref0 (gpointer self) {
-	return self ? gst_message_ref (self) : NULL;
+ * Gets the GstEncodingProfile for this transcoder.
+ *
+ * @return the GstEncodingProfile for this transcoder. You must call gst_object_unref() on this.
+ */
+static GstEncodingProfile*
+rygel_gst_transcoder_real_get_encoding_profile (RygelGstTranscoder* self) {
+  /* This must be implemented by derived types. */
+  g_critical ("Type `%s' does not implement abstract method `rygel_gst_transcoder_get_encoding_profile'", G_OBJECT_TYPE_NAME (self));
+  return NULL;
 }
 
-
-static void rygel_gst_transcoder_on_no_more_pads (RygelGstTranscoder* self, GstElement* decodebin) {
-	gboolean _tmp0_;
-	g_return_if_fail (self != NULL);
-	g_return_if_fail (decodebin != NULL);
-	_tmp0_ = self->priv->link_failed;
-	if (_tmp0_) {
-		GstElement* _tmp1_;
-		GstObject* _tmp2_ = NULL;
-		GstBin* bin;
-		GError* _tmp3_;
-		GError* _error_;
-		GstBin* _tmp4_;
-		GError* _tmp5_;
-		GstMessage* _tmp6_;
-		GstMessage* message;
-		GstBin* _tmp7_;
-		GstBus* _tmp8_ = NULL;
-		GstBus* bus;
-		GstBus* _tmp9_;
-		GstMessage* _tmp10_;
-		GstMessage* _tmp11_;
-		_tmp1_ = self->priv->encoder;
-		_tmp2_ = gst_object_get_parent ((GstObject*) _tmp1_);
-		bin = G_TYPE_CHECK_INSTANCE_TYPE (_tmp2_, GST_TYPE_BIN) ? ((GstBin*) _tmp2_) : NULL;
-		_tmp3_ = g_error_new_literal (G_IO_ERROR, G_IO_ERROR_FAILED, "Could not link");
-		_error_ = _tmp3_;
-		_tmp4_ = bin;
-		_tmp5_ = _error_;
-		_tmp6_ = gst_message_new_error ((GstObject*) _tmp4_, _tmp5_, RYGEL_GST_TRANSCODER_DESCRIPTION);
-		message = _tmp6_;
-		_tmp7_ = bin;
-		_tmp8_ = gst_element_get_bus ((GstElement*) _tmp7_);
-		bus = _tmp8_;
-		_tmp9_ = bus;
-		_tmp10_ = message;
-		_tmp11_ = _gst_message_ref0 (_tmp10_);
-		gst_bus_post (_tmp9_, _tmp11_);
-		_gst_object_unref0 (bus);
-		_gst_message_unref0 (message);
-		_g_error_free0 (_error_);
-		_gst_object_unref0 (bin);
-	}
+GstEncodingProfile*
+rygel_gst_transcoder_get_encoding_profile (RygelGstTranscoder* self) {
+  g_return_val_if_fail (self != NULL, NULL);
+  return RYGEL_GST_TRANSCODER_GET_CLASS (self)->get_encoding_profile (self);
 }
 
-
-const gchar* rygel_gst_transcoder_get_preset (RygelGstTranscoder* self) {
-	const gchar* result;
-	const gchar* _tmp0_;
-	g_return_val_if_fail (self != NULL, NULL);
-	_tmp0_ = self->priv->_preset;
-	result = _tmp0_;
-	return result;
+const gchar*
+rygel_gst_transcoder_get_preset (RygelGstTranscoder* self) {
+  return self->priv->_preset;
 }
 
-
-void rygel_gst_transcoder_set_preset (RygelGstTranscoder* self, const gchar* value) {
-	const gchar* _tmp0_;
-	gchar* _tmp1_;
-	g_return_if_fail (self != NULL);
-	_tmp0_ = value;
-	_tmp1_ = g_strdup (_tmp0_);
-	_g_free0 (self->priv->_preset);
-	self->priv->_preset = _tmp1_;
-	g_object_notify ((GObject *) self, "preset");
+void
+rygel_gst_transcoder_set_preset (RygelGstTranscoder* self, const gchar* value) {
+  g_return_if_fail (self != NULL);
+  
+  if (self->priv->_preset) {
+    g_free (self->priv->_preset);
+    self->priv->_preset = NULL;
+  }
+  
+  if (value) {
+    self->priv->_preset = g_strdup (value);
+  }
+
+  g_object_notify (G_OBJECT (self), "preset");
 }
 
-
-static void rygel_gst_transcoder_class_init (RygelGstTranscoderClass * klass) {
-	rygel_gst_transcoder_parent_class = g_type_class_peek_parent (klass);
-	g_type_class_add_private (klass, sizeof (RygelGstTranscoderPrivate));
-	RYGEL_TRANSCODER_CLASS (klass)->create_source = rygel_gst_transcoder_real_create_source;
-	RYGEL_GST_TRANSCODER_CLASS (klass)->get_encoding_profile = rygel_gst_transcoder_real_get_encoding_profile;
-	G_OBJECT_CLASS (klass)->get_property = _vala_rygel_gst_transcoder_get_property;
-	G_OBJECT_CLASS (klass)->set_property = _vala_rygel_gst_transcoder_set_property;
-	G_OBJECT_CLASS (klass)->finalize = rygel_gst_transcoder_finalize;
-	g_object_class_install_property (G_OBJECT_CLASS (klass), RYGEL_GST_TRANSCODER_PRESET, g_param_spec_string ("preset", "preset", "preset", NULL, G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_READABLE | G_PARAM_WRITABLE));
+static
+void rygel_gst_transcoder_class_init (RygelGstTranscoderClass * klass) {
+  rygel_gst_transcoder_parent_class = g_type_class_peek_parent (klass);
+  g_type_class_add_private (klass, sizeof (RygelGstTranscoderPrivate));
+  RYGEL_TRANSCODER_CLASS (klass)->create_source = rygel_gst_transcoder_create_source;
+  RYGEL_GST_TRANSCODER_CLASS (klass)->get_encoding_profile = rygel_gst_transcoder_real_get_encoding_profile;
+  G_OBJECT_CLASS (klass)->get_property = rygel_gst_transcoder_get_property;
+  G_OBJECT_CLASS (klass)->set_property = rygel_gst_transcoder_set_property;
+  G_OBJECT_CLASS (klass)->finalize = rygel_gst_transcoder_finalize;
+  g_object_class_install_property (G_OBJECT_CLASS (klass), RYGEL_GST_TRANSCODER_PRESET, g_param_spec_string ("preset", "preset", "preset", NULL, G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_READABLE | G_PARAM_WRITABLE));
 }
 
-
-static void rygel_gst_transcoder_instance_init (RygelGstTranscoder * self) {
-	gchar* _tmp0_;
-	self->priv = RYGEL_GST_TRANSCODER_GET_PRIVATE (self);
-	_tmp0_ = g_strdup (RYGEL_GST_TRANSCODER_DEFAULT_ENCODING_PRESET);
-	self->priv->_preset = _tmp0_;
+static
+void rygel_gst_transcoder_init (RygelGstTranscoder * self) {
+  self->priv = RYGEL_GST_TRANSCODER_GET_PRIVATE (self);
+  self->priv->_preset = g_strdup (RYGEL_GST_TRANSCODER_DEFAULT_ENCODING_PRESET);
 }
 
+static
+void rygel_gst_transcoder_finalize (GObject* obj) {
+  RygelGstTranscoder *self;
 
-static void rygel_gst_transcoder_finalize (GObject* obj) {
-	RygelGstTranscoder * self;
-	self = G_TYPE_CHECK_INSTANCE_CAST (obj, RYGEL_TYPE_GST_TRANSCODER, RygelGstTranscoder);
-	_g_free0 (self->priv->_preset);
-	_gst_object_unref0 (self->priv->decoder);
-	_gst_object_unref0 (self->priv->encoder);
-	G_OBJECT_CLASS (rygel_gst_transcoder_parent_class)->finalize (obj);
-}
-
+  self = RYGEL_GST_TRANSCODER (obj);
+  g_free (self->priv->_preset);
+  gst_object_unref (self->priv->decoder);
+  gst_object_unref (self->priv->encoder);
 
-/**
- * The base Transcoder class. Each implementation derives from it and must
- * implement get_distance and get_encoding_profile methods.
- */
-GType rygel_gst_transcoder_get_type (void) {
-	static volatile gsize rygel_gst_transcoder_type_id__volatile = 0;
-	if (g_once_init_enter (&rygel_gst_transcoder_type_id__volatile)) {
-		static const GTypeInfo g_define_type_info = { sizeof (RygelGstTranscoderClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) rygel_gst_transcoder_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (RygelGstTranscoder), 0, (GInstanceInitFunc) rygel_gst_transcoder_instance_init, NULL };
-		GType rygel_gst_transcoder_type_id;
-		rygel_gst_transcoder_type_id = g_type_register_static (RYGEL_TYPE_TRANSCODER, "RygelGstTranscoder", &g_define_type_info, G_TYPE_FLAG_ABSTRACT);
-		g_once_init_leave (&rygel_gst_transcoder_type_id__volatile, rygel_gst_transcoder_type_id);
-	}
-	return rygel_gst_transcoder_type_id__volatile;
+  G_OBJECT_CLASS (rygel_gst_transcoder_parent_class)->finalize (obj);
 }
 
-
-static void _vala_rygel_gst_transcoder_get_property (GObject * object, guint property_id, GValue * value, GParamSpec * pspec) {
-	RygelGstTranscoder * self;
-	self = G_TYPE_CHECK_INSTANCE_CAST (object, RYGEL_TYPE_GST_TRANSCODER, RygelGstTranscoder);
-	switch (property_id) {
-		case RYGEL_GST_TRANSCODER_PRESET:
-		g_value_set_string (value, rygel_gst_transcoder_get_preset (self));
-		break;
-		default:
-		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
-		break;
-	}
+static void
+rygel_gst_transcoder_get_property (GObject * object, guint property_id, GValue * value, GParamSpec * pspec) {
+  RygelGstTranscoder * self;
+  self = RYGEL_GST_TRANSCODER (object);
+
+  switch (property_id) {
+    case RYGEL_GST_TRANSCODER_PRESET:
+      g_value_set_string (value, rygel_gst_transcoder_get_preset (self));
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+      break;
+  }
 }
 
-
-static void _vala_rygel_gst_transcoder_set_property (GObject * object, guint property_id, const GValue * value, GParamSpec * pspec) {
-	RygelGstTranscoder * self;
-	self = G_TYPE_CHECK_INSTANCE_CAST (object, RYGEL_TYPE_GST_TRANSCODER, RygelGstTranscoder);
-	switch (property_id) {
-		case RYGEL_GST_TRANSCODER_PRESET:
-		rygel_gst_transcoder_set_preset (self, g_value_get_string (value));
-		break;
-		default:
-		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
-		break;
-	}
+static void
+rygel_gst_transcoder_set_property (GObject * object, guint property_id, const GValue * value, GParamSpec * pspec) {
+  RygelGstTranscoder * self;
+  self = RYGEL_GST_TRANSCODER (object);
+
+  switch (property_id) {
+    case RYGEL_GST_TRANSCODER_PRESET:
+      rygel_gst_transcoder_set_preset (self, g_value_get_string (value));
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+      break;
+  }
 }
 
 
diff --git a/src/rygel-gst-transcoder.h b/src/rygel-gst-transcoder.h
new file mode 100644
index 0000000..dc46150
--- /dev/null
+++ b/src/rygel-gst-transcoder.h
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2009 Nokia Corporation
+ * Copyright (C) 2012 Intel Corporation
+ *
+ * Rygel is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Rygel 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __RYGEL_GST_0_10_MEDIA_ENGINE_GST_TRANSCODER_H__
+#define __RYGEL_GST_0_10_MEDIA_ENGINE_GST_TRANSCODER_H__
+
+#include <glib.h>
+#include <glib-object.h>
+#include <stdlib.h>
+#include <string.h>
+#include <rygel-server.h>
+#include <gst/gst.h>
+#include <libgupnp-dlna/gupnp-dlna-discoverer.h>
+#include <libgupnp-dlna/gupnp-dlna-profile.h>
+#include <gee.h>
+#include <rygel-core.h>
+
+G_BEGIN_DECLS
+
+#define RYGEL_TYPE_GST_TRANSCODER (rygel_gst_transcoder_get_type ())
+#define RYGEL_GST_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_GST_TRANSCODER, RygelGstTranscoder))
+#define RYGEL_GST_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_GST_TRANSCODER, RygelGstTranscoderClass))
+#define RYGEL_IS_GST_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_GST_TRANSCODER))
+#define RYGEL_IS_GST_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_GST_TRANSCODER))
+#define RYGEL_GST_TRANSCODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_GST_TRANSCODER, RygelGstTranscoderClass))
+
+typedef struct _RygelGstTranscoder RygelGstTranscoder;
+typedef struct _RygelGstTranscoderClass RygelGstTranscoderClass;
+typedef struct _RygelGstTranscoderPrivate RygelGstTranscoderPrivate;
+
+struct _RygelGstTranscoder {
+  RygelTranscoder parent_instance;
+  RygelGstTranscoderPrivate * priv;
+};
+
+struct _RygelGstTranscoderClass {
+  RygelMediaEngineClass parent_class;
+
+  GstEncodingProfile* (*get_encoding_profile) (RygelGstTranscoder* self);
+};
+
+GType rygel_gst_transcoder_get_type (void) G_GNUC_CONST;
+
+RygelGstTranscoder* rygel_gst_transcoder_new (void);
+
+GstEncodingProfile* rygel_gst_transcoder_get_encoding_profile (RygelGstTranscoder *self);
+const gchar* rygel_gst_transcoder_get_preset (RygelGstTranscoder *self);
+void rygel_gst_transcoder_set_preset (RygelGstTranscoder *self, const gchar *value);
+
+G_END_DECLS
+
+#endif /* __RYGEL_GST_0_10_MEDIA_ENGINE_GST_TRANSCODER_H__ */
diff --git a/src/rygel-gst-utils.c b/src/rygel-gst-utils.c
index 65108c1..4597b22 100644
--- a/src/rygel-gst-utils.c
+++ b/src/rygel-gst-utils.c
@@ -29,76 +29,9 @@
 #include <glib/gi18n-lib.h>
 #include <gst/pbutils/pbutils.h>
 #include <gobject/gvaluecollector.h>
+#include "rygel-gst-data-source.h"
 
-
-#define RYGEL_TYPE_GST_UTILS (rygel_gst_utils_get_type ())
-#define RYGEL_GST_UTILS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_GST_UTILS, RygelGstUtils))
-#define RYGEL_GST_UTILS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_GST_UTILS, RygelGstUtilsClass))
-#define RYGEL_IS_GST_UTILS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_GST_UTILS))
-#define RYGEL_IS_GST_UTILS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_GST_UTILS))
-#define RYGEL_GST_UTILS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_GST_UTILS, RygelGstUtilsClass))
-
-typedef struct _RygelGstUtils RygelGstUtils;
-typedef struct _RygelGstUtilsClass RygelGstUtilsClass;
-typedef struct _RygelGstUtilsPrivate RygelGstUtilsPrivate;
-#define _gst_object_unref0(var) ((var == NULL) ? NULL : (var = (gst_object_unref (var), NULL)))
-#define _g_free0(var) (var = (g_free (var), NULL))
-#define _gst_encoding_profile_unref0(var) ((var == NULL) ? NULL : (var = (gst_encoding_profile_unref (var), NULL)))
-#define __g_list_free__gst_object_unref0_0(var) ((var == NULL) ? NULL : (var = (_g_list_free__gst_object_unref0_ (var), NULL)))
-#define _gst_structure_free0(var) ((var == NULL) ? NULL : (var = (gst_structure_free (var), NULL)))
-typedef struct _RygelParamSpecGstUtils RygelParamSpecGstUtils;
-
-typedef enum  {
-	RYGEL_GST_ERROR_MISSING_PLUGIN,
-	RYGEL_GST_ERROR_LINK
-} RygelGstError;
-#define RYGEL_GST_ERROR rygel_gst_error_quark ()
-struct _RygelGstUtils {
-	GTypeInstance parent_instance;
-	volatile int ref_count;
-	RygelGstUtilsPrivate * priv;
-};
-
-struct _RygelGstUtilsClass {
-	GTypeClass parent_class;
-	void (*finalize) (RygelGstUtils *self);
-};
-
-struct _RygelParamSpecGstUtils {
-	GParamSpec parent_instance;
-};
-
-
-static gpointer rygel_gst_utils_parent_class = NULL;
-
-GQuark rygel_gst_error_quark (void);
-gpointer rygel_gst_utils_ref (gpointer instance);
-void rygel_gst_utils_unref (gpointer instance);
-GParamSpec* rygel_param_spec_gst_utils (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags);
-void rygel_value_set_gst_utils (GValue* value, gpointer v_object);
-void rygel_value_take_gst_utils (GValue* value, gpointer v_object);
-gpointer rygel_value_get_gst_utils (const GValue* value);
-GType rygel_gst_utils_get_type (void) G_GNUC_CONST;
-enum  {
-	RYGEL_GST_UTILS_DUMMY_PROPERTY
-};
-GstElement* rygel_gst_utils_create_element (const gchar* factoryname, const gchar* name, GError** error);
-GstElement* rygel_gst_utils_create_source_for_uri (const gchar* uri);
-static inline void _dynamic_set_blocksize4 (GstElement* obj, glong value);
-static inline void _dynamic_set_tcp_timeout5 (GstElement* obj, gint64 value);
-void rygel_gst_utils_dump_encoding_profile (GstEncodingProfile* profile, gint indent);
-GstElement* rygel_gst_utils_get_rtp_depayloader (GstCaps* caps);
 static gboolean rygel_gst_utils_need_rtp_depayloader (GstCaps* caps);
-static void _gst_object_unref0_ (gpointer var);
-static void _g_list_free__gst_object_unref0_ (GList* self);
-RygelGstUtils* rygel_gst_utils_construct (GType object_type);
-static void rygel_gst_utils_finalize (RygelGstUtils* obj);
-
-
-GQuark rygel_gst_error_quark (void) {
-	return g_quark_from_static_string ("rygel_gst_error-quark");
-}
-
 
 GstElement* rygel_gst_utils_create_element (const gchar* factoryname, const gchar* name, GError** error) {
 	GstElement* result = NULL;
@@ -405,170 +338,4 @@ static gboolean rygel_gst_utils_need_rtp_depayloader (GstCaps* caps) {
 }
 
 
-RygelGstUtils* rygel_gst_utils_construct (GType object_type) {
-	RygelGstUtils* self = NULL;
-	self = (RygelGstUtils*) g_type_create_instance (object_type);
-	return self;
-}
-
-
-static void rygel_value_gst_utils_init (GValue* value) {
-	value->data[0].v_pointer = NULL;
-}
-
-
-static void rygel_value_gst_utils_free_value (GValue* value) {
-	if (value->data[0].v_pointer) {
-		rygel_gst_utils_unref (value->data[0].v_pointer);
-	}
-}
-
-
-static void rygel_value_gst_utils_copy_value (const GValue* src_value, GValue* dest_value) {
-	if (src_value->data[0].v_pointer) {
-		dest_value->data[0].v_pointer = rygel_gst_utils_ref (src_value->data[0].v_pointer);
-	} else {
-		dest_value->data[0].v_pointer = NULL;
-	}
-}
-
-
-static gpointer rygel_value_gst_utils_peek_pointer (const GValue* value) {
-	return value->data[0].v_pointer;
-}
-
-
-static gchar* rygel_value_gst_utils_collect_value (GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) {
-	if (collect_values[0].v_pointer) {
-		RygelGstUtils* object;
-		object = collect_values[0].v_pointer;
-		if (object->parent_instance.g_class == NULL) {
-			return g_strconcat ("invalid unclassed object pointer for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
-		} else if (!g_value_type_compatible (G_TYPE_FROM_INSTANCE (object), G_VALUE_TYPE (value))) {
-			return g_strconcat ("invalid object type `", g_type_name (G_TYPE_FROM_INSTANCE (object)), "' for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
-		}
-		value->data[0].v_pointer = rygel_gst_utils_ref (object);
-	} else {
-		value->data[0].v_pointer = NULL;
-	}
-	return NULL;
-}
-
-
-static gchar* rygel_value_gst_utils_lcopy_value (const GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) {
-	RygelGstUtils** object_p;
-	object_p = collect_values[0].v_pointer;
-	if (!object_p) {
-		return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
-	}
-	if (!value->data[0].v_pointer) {
-		*object_p = NULL;
-	} else if (collect_flags & G_VALUE_NOCOPY_CONTENTS) {
-		*object_p = value->data[0].v_pointer;
-	} else {
-		*object_p = rygel_gst_utils_ref (value->data[0].v_pointer);
-	}
-	return NULL;
-}
-
-
-GParamSpec* rygel_param_spec_gst_utils (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags) {
-	RygelParamSpecGstUtils* spec;
-	g_return_val_if_fail (g_type_is_a (object_type, RYGEL_TYPE_GST_UTILS), NULL);
-	spec = g_param_spec_internal (G_TYPE_PARAM_OBJECT, name, nick, blurb, flags);
-	G_PARAM_SPEC (spec)->value_type = object_type;
-	return G_PARAM_SPEC (spec);
-}
-
-
-gpointer rygel_value_get_gst_utils (const GValue* value) {
-	g_return_val_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, RYGEL_TYPE_GST_UTILS), NULL);
-	return value->data[0].v_pointer;
-}
-
-
-void rygel_value_set_gst_utils (GValue* value, gpointer v_object) {
-	RygelGstUtils* old;
-	g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, RYGEL_TYPE_GST_UTILS));
-	old = value->data[0].v_pointer;
-	if (v_object) {
-		g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, RYGEL_TYPE_GST_UTILS));
-		g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
-		value->data[0].v_pointer = v_object;
-		rygel_gst_utils_ref (value->data[0].v_pointer);
-	} else {
-		value->data[0].v_pointer = NULL;
-	}
-	if (old) {
-		rygel_gst_utils_unref (old);
-	}
-}
-
-
-void rygel_value_take_gst_utils (GValue* value, gpointer v_object) {
-	RygelGstUtils* old;
-	g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, RYGEL_TYPE_GST_UTILS));
-	old = value->data[0].v_pointer;
-	if (v_object) {
-		g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, RYGEL_TYPE_GST_UTILS));
-		g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
-		value->data[0].v_pointer = v_object;
-	} else {
-		value->data[0].v_pointer = NULL;
-	}
-	if (old) {
-		rygel_gst_utils_unref (old);
-	}
-}
-
-
-static void rygel_gst_utils_class_init (RygelGstUtilsClass * klass) {
-	rygel_gst_utils_parent_class = g_type_class_peek_parent (klass);
-	RYGEL_GST_UTILS_CLASS (klass)->finalize = rygel_gst_utils_finalize;
-}
-
-
-static void rygel_gst_utils_instance_init (RygelGstUtils * self) {
-	self->ref_count = 1;
-}
-
-
-static void rygel_gst_utils_finalize (RygelGstUtils* obj) {
-	RygelGstUtils * self;
-	self = G_TYPE_CHECK_INSTANCE_CAST (obj, RYGEL_TYPE_GST_UTILS, RygelGstUtils);
-}
-
-
-GType rygel_gst_utils_get_type (void) {
-	static volatile gsize rygel_gst_utils_type_id__volatile = 0;
-	if (g_once_init_enter (&rygel_gst_utils_type_id__volatile)) {
-		static const GTypeValueTable g_define_type_value_table = { rygel_value_gst_utils_init, rygel_value_gst_utils_free_value, rygel_value_gst_utils_copy_value, rygel_value_gst_utils_peek_pointer, "p", rygel_value_gst_utils_collect_value, "p", rygel_value_gst_utils_lcopy_value };
-		static const GTypeInfo g_define_type_info = { sizeof (RygelGstUtilsClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) rygel_gst_utils_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (RygelGstUtils), 0, (GInstanceInitFunc) rygel_gst_utils_instance_init, &g_define_type_value_table };
-		static const GTypeFundamentalInfo g_define_type_fundamental_info = { (G_TYPE_FLAG_CLASSED | G_TYPE_FLAG_INSTANTIATABLE | G_TYPE_FLAG_DERIVABLE | G_TYPE_FLAG_DEEP_DERIVABLE) };
-		GType rygel_gst_utils_type_id;
-		rygel_gst_utils_type_id = g_type_register_fundamental (g_type_fundamental_next (), "RygelGstUtils", &g_define_type_info, &g_define_type_fundamental_info, G_TYPE_FLAG_ABSTRACT);
-		g_once_init_leave (&rygel_gst_utils_type_id__volatile, rygel_gst_utils_type_id);
-	}
-	return rygel_gst_utils_type_id__volatile;
-}
-
-
-gpointer rygel_gst_utils_ref (gpointer instance) {
-	RygelGstUtils* self;
-	self = instance;
-	g_atomic_int_inc (&self->ref_count);
-	return instance;
-}
-
-
-void rygel_gst_utils_unref (gpointer instance) {
-	RygelGstUtils* self;
-	self = instance;
-	if (g_atomic_int_dec_and_test (&self->ref_count)) {
-		RYGEL_GST_UTILS_GET_CLASS (self)->finalize (self);
-		g_type_free_instance ((GTypeInstance *) self);
-	}
-}
-
-
 
diff --git a/src/rygel-gst-utils.h b/src/rygel-gst-utils.h
new file mode 100644
index 0000000..91382ea
--- /dev/null
+++ b/src/rygel-gst-utils.h
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2009 Nokia Corporation
+ * Copyright (C) 2012 Intel Corporation
+ *
+ * Rygel is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Rygel 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __RYGEL_GST_0_10_MEDIA_ENGINE_GST_UTILS_H__
+#define __RYGEL_GST_0_10_MEDIA_ENGINE_GST_UTILS_H__
+
+#include <glib.h>
+#include <glib-object.h>
+#include <stdlib.h>
+#include <string.h>
+#include <rygel-server.h>
+#include <gst/gst.h>
+#include <libgupnp-dlna/gupnp-dlna-discoverer.h>
+#include <libgupnp-dlna/gupnp-dlna-profile.h>
+#include <gee.h>
+#include <rygel-core.h>
+#include <gst/gst.h>
+#include <gst/base/gstbasesink.h>
+
+G_BEGIN_DECLS
+
+GstElement* rygel_gst_utils_create_element (const gchar* factoryname, const gchar* name, GError** error);
+GstElement* rygel_gst_utils_create_source_for_uri (const gchar* uri);
+void rygel_gst_utils_dump_encoding_profile (GstEncodingProfile* profile, gint indent);
+GstElement* rygel_gst_utils_get_rtp_depayloader (GstCaps* caps);
+static gboolean rygel_gst_utils_need_rtp_depayloader (GstCaps* caps);
+
+G_END_DECLS
+
+#endif /* __RYGEL_GST_0_10_MEDIA_ENGINE_GST_UTILS_H__ */
diff --git a/src/rygel-l16-transcoder.c b/src/rygel-l16-transcoder.c
index df9abff..3bd4c34 100644
--- a/src/rygel-l16-transcoder.c
+++ b/src/rygel-l16-transcoder.c
@@ -1,10 +1,6 @@
 /*
- * Copyright (C) 2009 Nokia Corporation.
- *
- * Author: Zeeshan Ali (Khattak) <zeeshanak gnome org>
- *                               <zeeshan ali nokia com>
- *
- * This file is part of Rygel.
+ * Copyright (C) 2009 Nokia Corporation
+ * Copyright (C) 2012 Intel Corporation
  *
  * Rygel is free software; you can redistribute it and/or modify
  * it under the terms of the GNU Lesser General Public License as published by
@@ -21,423 +17,331 @@
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  */
 
-#include <glib.h>
-#include <glib-object.h>
-#include <rygel-server.h>
-#include <gst/pbutils/pbutils.h>
-#include <gst/gst.h>
-#include <stdlib.h>
-#include <string.h>
-#include <libgupnp-av/gupnp-av.h>
-
-
-#define RYGEL_TYPE_GST_TRANSCODER (rygel_gst_transcoder_get_type ())
-#define RYGEL_GST_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_GST_TRANSCODER, RygelGstTranscoder))
-#define RYGEL_GST_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_GST_TRANSCODER, RygelGstTranscoderClass))
-#define RYGEL_IS_GST_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_GST_TRANSCODER))
-#define RYGEL_IS_GST_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_GST_TRANSCODER))
-#define RYGEL_GST_TRANSCODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_GST_TRANSCODER, RygelGstTranscoderClass))
-
-typedef struct _RygelGstTranscoder RygelGstTranscoder;
-typedef struct _RygelGstTranscoderClass RygelGstTranscoderClass;
-typedef struct _RygelGstTranscoderPrivate RygelGstTranscoderPrivate;
-
-#define RYGEL_TYPE_AUDIO_TRANSCODER (rygel_audio_transcoder_get_type ())
-#define RYGEL_AUDIO_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_AUDIO_TRANSCODER, RygelAudioTranscoder))
-#define RYGEL_AUDIO_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_AUDIO_TRANSCODER, RygelAudioTranscoderClass))
-#define RYGEL_IS_AUDIO_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_AUDIO_TRANSCODER))
-#define RYGEL_IS_AUDIO_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_AUDIO_TRANSCODER))
-#define RYGEL_AUDIO_TRANSCODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_AUDIO_TRANSCODER, RygelAudioTranscoderClass))
-
-typedef struct _RygelAudioTranscoder RygelAudioTranscoder;
-typedef struct _RygelAudioTranscoderClass RygelAudioTranscoderClass;
-typedef struct _RygelAudioTranscoderPrivate RygelAudioTranscoderPrivate;
-
-#define RYGEL_TYPE_L16_TRANSCODER (rygel_l16_transcoder_get_type ())
-#define RYGEL_L16_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_L16_TRANSCODER, RygelL16Transcoder))
-#define RYGEL_L16_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_L16_TRANSCODER, RygelL16TranscoderClass))
-#define RYGEL_IS_L16_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_L16_TRANSCODER))
-#define RYGEL_IS_L16_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_L16_TRANSCODER))
-#define RYGEL_L16_TRANSCODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_L16_TRANSCODER, RygelL16TranscoderClass))
-
-typedef struct _RygelL16Transcoder RygelL16Transcoder;
-typedef struct _RygelL16TranscoderClass RygelL16TranscoderClass;
-typedef struct _RygelL16TranscoderPrivate RygelL16TranscoderPrivate;
-#define _g_free0(var) (var = (g_free (var), NULL))
-#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
-
-struct _RygelGstTranscoder {
-	RygelTranscoder parent_instance;
-	RygelGstTranscoderPrivate * priv;
-};
-
-struct _RygelGstTranscoderClass {
-	RygelTranscoderClass parent_class;
-	GstEncodingProfile* (*get_encoding_profile) (RygelGstTranscoder* self);
-};
+#include "rygel-l16-transcoder.h"
 
-struct _RygelAudioTranscoder {
-	RygelGstTranscoder parent_instance;
-	RygelAudioTranscoderPrivate * priv;
-	gint audio_bitrate;
-	GstCaps* container_format;
-	GstCaps* audio_codec_format;
-};
+G_DEFINE_TYPE (RygelL16Transcoder, rygel_l16_transcoder, RYGEL_TYPE_AUDIO_TRANSCODER)
 
-struct _RygelAudioTranscoderClass {
-	RygelGstTranscoderClass parent_class;
-};
-
-struct _RygelL16Transcoder {
-	RygelAudioTranscoder parent_instance;
-	RygelL16TranscoderPrivate * priv;
-};
-
-struct _RygelL16TranscoderClass {
-	RygelAudioTranscoderClass parent_class;
-};
-
-
-static gpointer rygel_l16_transcoder_parent_class = NULL;
-
-GType rygel_gst_transcoder_get_type (void) G_GNUC_CONST;
-GType rygel_audio_transcoder_get_type (void) G_GNUC_CONST;
-GType rygel_l16_transcoder_get_type (void) G_GNUC_CONST;
-enum  {
-	RYGEL_L16_TRANSCODER_DUMMY_PROPERTY
-};
 #define RYGEL_L16_TRANSCODER_CHANNELS 2
 #define RYGEL_L16_TRANSCODER_FREQUENCY 44100
 #define RYGEL_L16_TRANSCODER_WIDTH 16
 #define RYGEL_L16_TRANSCODER_DEPTH 16
 #define RYGEL_L16_TRANSCODER_SIGNED TRUE
 #define RYGEL_L16_TRANSCODER_ENDIANNESS ((gint) G_BIG_ENDIAN)
+
 RygelL16Transcoder* rygel_l16_transcoder_new (void);
 RygelL16Transcoder* rygel_l16_transcoder_construct (GType object_type);
-#define RYGEL_AUDIO_TRANSCODER_NO_CONTAINER NULL
-RygelAudioTranscoder* rygel_audio_transcoder_new (const gchar* content_type, const gchar* dlna_profile, gint audio_bitrate, const gchar* container_caps, const gchar* audio_codec_caps, const gchar* extension);
-RygelAudioTranscoder* rygel_audio_transcoder_construct (GType object_type, const gchar* content_type, const gchar* dlna_profile, gint audio_bitrate, const gchar* container_caps, const gchar* audio_codec_caps, const gchar* extension);
+
 static GUPnPDIDLLiteResource* rygel_l16_transcoder_real_add_resource (RygelTranscoder* base, GUPnPDIDLLiteItem* didl_item, RygelMediaItem* item, RygelTranscodeManager* manager, GError** error);
 static guint rygel_l16_transcoder_real_get_distance (RygelTranscoder* base, RygelMediaItem* item);
 
 
 static gchar* bool_to_string (gboolean self) {
-	gchar* result = NULL;
-	if (self) {
-		gchar* _tmp0_;
-		_tmp0_ = g_strdup ("true");
-		result = _tmp0_;
-		return result;
-	} else {
-		gchar* _tmp1_;
-		_tmp1_ = g_strdup ("false");
-		result = _tmp1_;
-		return result;
-	}
+  gchar* result = NULL;
+  if (self) {
+    gchar* _tmp0_;
+    _tmp0_ = g_strdup ("true");
+    result = _tmp0_;
+    return result;
+  } else {
+    gchar* _tmp1_;
+    _tmp1_ = g_strdup ("false");
+    result = _tmp1_;
+    return result;
+  }
 }
 
 
-RygelL16Transcoder* rygel_l16_transcoder_construct (GType object_type) {
-	RygelL16Transcoder * self = NULL;
-	gchar* _tmp0_ = NULL;
-	gchar* _tmp1_;
-	gchar* _tmp2_;
-	gchar* _tmp3_;
-	gchar* _tmp4_;
-	gchar* _tmp5_;
-	gchar* _tmp6_ = NULL;
-	gchar* _tmp7_;
-	gchar* _tmp8_;
-	gchar* _tmp9_;
-	gchar* _tmp10_;
-	gchar* _tmp11_;
-	gchar* _tmp12_ = NULL;
-	gchar* _tmp13_;
-	gchar* _tmp14_;
-	gchar* _tmp15_;
-	gchar* mime_type;
-	gchar* _tmp16_ = NULL;
-	gchar* _tmp17_;
-	gchar* _tmp18_;
-	gchar* _tmp19_;
-	gchar* _tmp20_;
-	gchar* _tmp21_;
-	gchar* _tmp22_ = NULL;
-	gchar* _tmp23_;
-	gchar* _tmp24_;
-	gchar* _tmp25_;
-	gchar* _tmp26_;
-	gchar* _tmp27_;
-	gchar* _tmp28_ = NULL;
-	gchar* _tmp29_;
-	gchar* _tmp30_;
-	gchar* _tmp31_;
-	gchar* _tmp32_;
-	gchar* _tmp33_;
-	gchar* _tmp34_ = NULL;
-	gchar* _tmp35_;
-	gchar* _tmp36_;
-	gchar* _tmp37_;
-	gchar* _tmp38_;
-	gchar* _tmp39_;
-	gchar* _tmp40_ = NULL;
-	gchar* _tmp41_;
-	gchar* _tmp42_;
-	gchar* _tmp43_;
-	gchar* _tmp44_;
-	gchar* _tmp45_;
-	gchar* _tmp46_ = NULL;
-	gchar* _tmp47_;
-	gchar* _tmp48_;
-	gchar* _tmp49_;
-	gchar* caps_str;
-	_tmp0_ = g_strdup_printf ("%i", RYGEL_L16_TRANSCODER_WIDTH);
-	_tmp1_ = _tmp0_;
-	_tmp2_ = g_strconcat ("audio/L", _tmp1_, NULL);
-	_tmp3_ = _tmp2_;
-	_tmp4_ = g_strconcat (_tmp3_, ";rate=", NULL);
-	_tmp5_ = _tmp4_;
-	_tmp6_ = g_strdup_printf ("%i", RYGEL_L16_TRANSCODER_FREQUENCY);
-	_tmp7_ = _tmp6_;
-	_tmp8_ = g_strconcat (_tmp5_, _tmp7_, NULL);
-	_tmp9_ = _tmp8_;
-	_tmp10_ = g_strconcat (_tmp9_, ";channels=", NULL);
-	_tmp11_ = _tmp10_;
-	_tmp12_ = g_strdup_printf ("%i", RYGEL_L16_TRANSCODER_CHANNELS);
-	_tmp13_ = _tmp12_;
-	_tmp14_ = g_strconcat (_tmp11_, _tmp13_, NULL);
-	_tmp15_ = _tmp14_;
-	_g_free0 (_tmp13_);
-	_g_free0 (_tmp11_);
-	_g_free0 (_tmp9_);
-	_g_free0 (_tmp7_);
-	_g_free0 (_tmp5_);
-	_g_free0 (_tmp3_);
-	_g_free0 (_tmp1_);
-	mime_type = _tmp15_;
-	_tmp16_ = g_strdup_printf ("%i", RYGEL_L16_TRANSCODER_CHANNELS);
-	_tmp17_ = _tmp16_;
-	_tmp18_ = g_strconcat ("audio/x-raw-int" ",channels=", _tmp17_, NULL);
-	_tmp19_ = _tmp18_;
-	_tmp20_ = g_strconcat (_tmp19_, ",rate=", NULL);
-	_tmp21_ = _tmp20_;
-	_tmp22_ = g_strdup_printf ("%i", RYGEL_L16_TRANSCODER_FREQUENCY);
-	_tmp23_ = _tmp22_;
-	_tmp24_ = g_strconcat (_tmp21_, _tmp23_, NULL);
-	_tmp25_ = _tmp24_;
-	_tmp26_ = g_strconcat (_tmp25_, ",width=", NULL);
-	_tmp27_ = _tmp26_;
-	_tmp28_ = g_strdup_printf ("%i", RYGEL_L16_TRANSCODER_WIDTH);
-	_tmp29_ = _tmp28_;
-	_tmp30_ = g_strconcat (_tmp27_, _tmp29_, NULL);
-	_tmp31_ = _tmp30_;
-	_tmp32_ = g_strconcat (_tmp31_, ",depth=", NULL);
-	_tmp33_ = _tmp32_;
-	_tmp34_ = g_strdup_printf ("%i", RYGEL_L16_TRANSCODER_DEPTH);
-	_tmp35_ = _tmp34_;
-	_tmp36_ = g_strconcat (_tmp33_, _tmp35_, NULL);
-	_tmp37_ = _tmp36_;
-	_tmp38_ = g_strconcat (_tmp37_, ",signed=", NULL);
-	_tmp39_ = _tmp38_;
-	_tmp40_ = bool_to_string (RYGEL_L16_TRANSCODER_SIGNED);
-	_tmp41_ = _tmp40_;
-	_tmp42_ = g_strconcat (_tmp39_, _tmp41_, NULL);
-	_tmp43_ = _tmp42_;
-	_tmp44_ = g_strconcat (_tmp43_, ",endianness=", NULL);
-	_tmp45_ = _tmp44_;
-	_tmp46_ = g_strdup_printf ("%i", RYGEL_L16_TRANSCODER_ENDIANNESS);
-	_tmp47_ = _tmp46_;
-	_tmp48_ = g_strconcat (_tmp45_, _tmp47_, NULL);
-	_tmp49_ = _tmp48_;
-	_g_free0 (_tmp47_);
-	_g_free0 (_tmp45_);
-	_g_free0 (_tmp43_);
-	_g_free0 (_tmp41_);
-	_g_free0 (_tmp39_);
-	_g_free0 (_tmp37_);
-	_g_free0 (_tmp35_);
-	_g_free0 (_tmp33_);
-	_g_free0 (_tmp31_);
-	_g_free0 (_tmp29_);
-	_g_free0 (_tmp27_);
-	_g_free0 (_tmp25_);
-	_g_free0 (_tmp23_);
-	_g_free0 (_tmp21_);
-	_g_free0 (_tmp19_);
-	_g_free0 (_tmp17_);
-	caps_str = _tmp49_;
-	self = (RygelL16Transcoder*) rygel_audio_transcoder_construct (object_type, mime_type, "LPCM", 0, RYGEL_AUDIO_TRANSCODER_NO_CONTAINER, caps_str, "lpcm");
-	_g_free0 (caps_str);
-	_g_free0 (mime_type);
-	return self;
+RygelL16Transcoder*
+rygel_l16_transcoder_construct (GType object_type) {
+  RygelL16Transcoder * self = NULL;
+  gchar* _tmp0_ = NULL;
+  gchar* _tmp1_;
+  gchar* _tmp2_;
+  gchar* _tmp3_;
+  gchar* _tmp4_;
+  gchar* _tmp5_;
+  gchar* _tmp6_ = NULL;
+  gchar* _tmp7_;
+  gchar* _tmp8_;
+  gchar* _tmp9_;
+  gchar* _tmp10_;
+  gchar* _tmp11_;
+  gchar* _tmp12_ = NULL;
+  gchar* _tmp13_;
+  gchar* _tmp14_;
+  gchar* _tmp15_;
+  gchar* mime_type;
+  gchar* _tmp16_ = NULL;
+  gchar* _tmp17_;
+  gchar* _tmp18_;
+  gchar* _tmp19_;
+  gchar* _tmp20_;
+  gchar* _tmp21_;
+  gchar* _tmp22_ = NULL;
+  gchar* _tmp23_;
+  gchar* _tmp24_;
+  gchar* _tmp25_;
+  gchar* _tmp26_;
+  gchar* _tmp27_;
+  gchar* _tmp28_ = NULL;
+  gchar* _tmp29_;
+  gchar* _tmp30_;
+  gchar* _tmp31_;
+  gchar* _tmp32_;
+  gchar* _tmp33_;
+  gchar* _tmp34_ = NULL;
+  gchar* _tmp35_;
+  gchar* _tmp36_;
+  gchar* _tmp37_;
+  gchar* _tmp38_;
+  gchar* _tmp39_;
+  gchar* _tmp40_ = NULL;
+  gchar* _tmp41_;
+  gchar* _tmp42_;
+  gchar* _tmp43_;
+  gchar* _tmp44_;
+  gchar* _tmp45_;
+  gchar* _tmp46_ = NULL;
+  gchar* _tmp47_;
+  gchar* _tmp48_;
+  gchar* _tmp49_;
+  gchar* caps_str;
+  _tmp0_ = g_strdup_printf ("%i", RYGEL_L16_TRANSCODER_WIDTH);
+  _tmp1_ = _tmp0_;
+  _tmp2_ = g_strconcat ("audio/L", _tmp1_, NULL);
+  _tmp3_ = _tmp2_;
+  _tmp4_ = g_strconcat (_tmp3_, ";rate=", NULL);
+  _tmp5_ = _tmp4_;
+  _tmp6_ = g_strdup_printf ("%i", RYGEL_L16_TRANSCODER_FREQUENCY);
+  _tmp7_ = _tmp6_;
+  _tmp8_ = g_strconcat (_tmp5_, _tmp7_, NULL);
+  _tmp9_ = _tmp8_;
+  _tmp10_ = g_strconcat (_tmp9_, ";channels=", NULL);
+  _tmp11_ = _tmp10_;
+  _tmp12_ = g_strdup_printf ("%i", RYGEL_L16_TRANSCODER_CHANNELS);
+  _tmp13_ = _tmp12_;
+  _tmp14_ = g_strconcat (_tmp11_, _tmp13_, NULL);
+  _tmp15_ = _tmp14_;
+  _g_free0 (_tmp13_);
+  _g_free0 (_tmp11_);
+  _g_free0 (_tmp9_);
+  _g_free0 (_tmp7_);
+  _g_free0 (_tmp5_);
+  _g_free0 (_tmp3_);
+  _g_free0 (_tmp1_);
+  mime_type = _tmp15_;
+  _tmp16_ = g_strdup_printf ("%i", RYGEL_L16_TRANSCODER_CHANNELS);
+  _tmp17_ = _tmp16_;
+  _tmp18_ = g_strconcat ("audio/x-raw-int" ",channels=", _tmp17_, NULL);
+  _tmp19_ = _tmp18_;
+  _tmp20_ = g_strconcat (_tmp19_, ",rate=", NULL);
+  _tmp21_ = _tmp20_;
+  _tmp22_ = g_strdup_printf ("%i", RYGEL_L16_TRANSCODER_FREQUENCY);
+  _tmp23_ = _tmp22_;
+  _tmp24_ = g_strconcat (_tmp21_, _tmp23_, NULL);
+  _tmp25_ = _tmp24_;
+  _tmp26_ = g_strconcat (_tmp25_, ",width=", NULL);
+  _tmp27_ = _tmp26_;
+  _tmp28_ = g_strdup_printf ("%i", RYGEL_L16_TRANSCODER_WIDTH);
+  _tmp29_ = _tmp28_;
+  _tmp30_ = g_strconcat (_tmp27_, _tmp29_, NULL);
+  _tmp31_ = _tmp30_;
+  _tmp32_ = g_strconcat (_tmp31_, ",depth=", NULL);
+  _tmp33_ = _tmp32_;
+  _tmp34_ = g_strdup_printf ("%i", RYGEL_L16_TRANSCODER_DEPTH);
+  _tmp35_ = _tmp34_;
+  _tmp36_ = g_strconcat (_tmp33_, _tmp35_, NULL);
+  _tmp37_ = _tmp36_;
+  _tmp38_ = g_strconcat (_tmp37_, ",signed=", NULL);
+  _tmp39_ = _tmp38_;
+  _tmp40_ = bool_to_string (RYGEL_L16_TRANSCODER_SIGNED);
+  _tmp41_ = _tmp40_;
+  _tmp42_ = g_strconcat (_tmp39_, _tmp41_, NULL);
+  _tmp43_ = _tmp42_;
+  _tmp44_ = g_strconcat (_tmp43_, ",endianness=", NULL);
+  _tmp45_ = _tmp44_;
+  _tmp46_ = g_strdup_printf ("%i", RYGEL_L16_TRANSCODER_ENDIANNESS);
+  _tmp47_ = _tmp46_;
+  _tmp48_ = g_strconcat (_tmp45_, _tmp47_, NULL);
+  _tmp49_ = _tmp48_;
+  _g_free0 (_tmp47_);
+  _g_free0 (_tmp45_);
+  _g_free0 (_tmp43_);
+  _g_free0 (_tmp41_);
+  _g_free0 (_tmp39_);
+  _g_free0 (_tmp37_);
+  _g_free0 (_tmp35_);
+  _g_free0 (_tmp33_);
+  _g_free0 (_tmp31_);
+  _g_free0 (_tmp29_);
+  _g_free0 (_tmp27_);
+  _g_free0 (_tmp25_);
+  _g_free0 (_tmp23_);
+  _g_free0 (_tmp21_);
+  _g_free0 (_tmp19_);
+  _g_free0 (_tmp17_);
+  caps_str = _tmp49_;
+  self = (RygelL16Transcoder*) rygel_audio_transcoder_construct (object_type, mime_type, "LPCM", 0, RYGEL_AUDIO_TRANSCODER_NO_CONTAINER, caps_str, "lpcm");
+  _g_free0 (caps_str);
+  _g_free0 (mime_type);
+  return self;
 }
 
 
 RygelL16Transcoder* rygel_l16_transcoder_new (void) {
-	return rygel_l16_transcoder_construct (RYGEL_TYPE_L16_TRANSCODER);
+  return rygel_l16_transcoder_construct (RYGEL_TYPE_L16_TRANSCODER);
 }
 
 
-static GUPnPDIDLLiteResource* rygel_l16_transcoder_real_add_resource (RygelTranscoder* base, GUPnPDIDLLiteItem* didl_item, RygelMediaItem* item, RygelTranscodeManager* manager, GError** error) {
-	RygelL16Transcoder * self;
-	GUPnPDIDLLiteResource* result = NULL;
-	GUPnPDIDLLiteItem* _tmp0_;
-	RygelMediaItem* _tmp1_;
-	RygelTranscodeManager* _tmp2_;
-	GUPnPDIDLLiteResource* _tmp3_ = NULL;
-	GUPnPDIDLLiteResource* resource;
-	GError * _inner_error_ = NULL;
-	self = (RygelL16Transcoder*) base;
-	g_return_val_if_fail (didl_item != NULL, NULL);
-	g_return_val_if_fail (item != NULL, NULL);
-	g_return_val_if_fail (manager != NULL, NULL);
-	_tmp0_ = didl_item;
-	_tmp1_ = item;
-	_tmp2_ = manager;
-	_tmp3_ = RYGEL_TRANSCODER_CLASS (rygel_l16_transcoder_parent_class)->add_resource ((RygelTranscoder*) G_TYPE_CHECK_INSTANCE_CAST (self, RYGEL_TYPE_AUDIO_TRANSCODER, RygelAudioTranscoder), _tmp0_, _tmp1_, _tmp2_, &_inner_error_);
-	resource = _tmp3_;
-	if (_inner_error_ != NULL) {
-		g_propagate_error (error, _inner_error_);
-		return NULL;
-	}
-	if (resource == NULL) {
-		result = NULL;
-		_g_object_unref0 (resource);
-		return result;
-	}
-	gupnp_didl_lite_resource_set_sample_freq (resource, RYGEL_L16_TRANSCODER_FREQUENCY);
-	gupnp_didl_lite_resource_set_audio_channels (resource, RYGEL_L16_TRANSCODER_CHANNELS);
-	gupnp_didl_lite_resource_set_bits_per_sample (resource, RYGEL_L16_TRANSCODER_WIDTH);
-	gupnp_didl_lite_resource_set_bitrate (resource, ((RYGEL_L16_TRANSCODER_FREQUENCY * RYGEL_L16_TRANSCODER_CHANNELS) * RYGEL_L16_TRANSCODER_WIDTH) / 8);
-	result = resource;
-	return result;
+static GUPnPDIDLLiteResource*
+rygel_l16_transcoder_real_add_resource (RygelTranscoder* base, GUPnPDIDLLiteItem* didl_item, RygelMediaItem* item, RygelTranscodeManager* manager, GError** error) {
+  RygelL16Transcoder * self;
+  GUPnPDIDLLiteResource* result = NULL;
+  GUPnPDIDLLiteItem* _tmp0_;
+  RygelMediaItem* _tmp1_;
+  RygelTranscodeManager* _tmp2_;
+  GUPnPDIDLLiteResource* _tmp3_ = NULL;
+  GUPnPDIDLLiteResource* resource;
+  GError * _inner_error_ = NULL;
+  self = (RygelL16Transcoder*) base;
+  g_return_val_if_fail (didl_item != NULL, NULL);
+  g_return_val_if_fail (item != NULL, NULL);
+  g_return_val_if_fail (manager != NULL, NULL);
+  _tmp0_ = didl_item;
+  _tmp1_ = item;
+  _tmp2_ = manager;
+  _tmp3_ = RYGEL_TRANSCODER_CLASS (rygel_l16_transcoder_parent_class)->add_resource ((RygelTranscoder*) G_TYPE_CHECK_INSTANCE_CAST (self, RYGEL_TYPE_AUDIO_TRANSCODER, RygelAudioTranscoder), _tmp0_, _tmp1_, _tmp2_, &_inner_error_);
+  resource = _tmp3_;
+  if (_inner_error_ != NULL) {
+    g_propagate_error (error, _inner_error_);
+    return NULL;
+  }
+  if (resource == NULL) {
+    result = NULL;
+    _g_object_unref0 (resource);
+    return result;
+  }
+  gupnp_didl_lite_resource_set_sample_freq (resource, RYGEL_L16_TRANSCODER_FREQUENCY);
+  gupnp_didl_lite_resource_set_audio_channels (resource, RYGEL_L16_TRANSCODER_CHANNELS);
+  gupnp_didl_lite_resource_set_bits_per_sample (resource, RYGEL_L16_TRANSCODER_WIDTH);
+  gupnp_didl_lite_resource_set_bitrate (resource, ((RYGEL_L16_TRANSCODER_FREQUENCY * RYGEL_L16_TRANSCODER_CHANNELS) * RYGEL_L16_TRANSCODER_WIDTH) / 8);
+  result = resource;
+  return result;
 }
 
 
 static gpointer _g_object_ref0 (gpointer self) {
-	return self ? g_object_ref (self) : NULL;
+  return self ? g_object_ref (self) : NULL;
 }
 
 
-static guint rygel_l16_transcoder_real_get_distance (RygelTranscoder* base, RygelMediaItem* item) {
-	RygelL16Transcoder * self;
-	guint result = 0U;
-	gboolean _tmp0_ = FALSE;
-	RygelMediaItem* _tmp1_;
-	gboolean _tmp3_;
-	RygelMediaItem* _tmp5_;
-	RygelAudioItem* _tmp6_;
-	RygelAudioItem* audio_item;
-	guint _tmp7_;
-	guint distance;
-	RygelAudioItem* _tmp8_;
-	gint _tmp9_;
-	gint _tmp10_;
-	RygelAudioItem* _tmp16_;
-	gint _tmp17_;
-	gint _tmp18_;
-	RygelAudioItem* _tmp24_;
-	gint _tmp25_;
-	gint _tmp26_;
-	self = (RygelL16Transcoder*) base;
-	g_return_val_if_fail (item != NULL, 0U);
-	_tmp1_ = item;
-	if (!G_TYPE_CHECK_INSTANCE_TYPE (_tmp1_, RYGEL_TYPE_AUDIO_ITEM)) {
-		_tmp0_ = TRUE;
-	} else {
-		RygelMediaItem* _tmp2_;
-		_tmp2_ = item;
-		_tmp0_ = G_TYPE_CHECK_INSTANCE_TYPE (_tmp2_, RYGEL_TYPE_VIDEO_ITEM);
-	}
-	_tmp3_ = _tmp0_;
-	if (_tmp3_) {
-		guint _tmp4_;
-		_tmp4_ = G_MAXUINT;
-		result = _tmp4_;
-		return result;
-	}
-	_tmp5_ = item;
-	_tmp6_ = _g_object_ref0 (G_TYPE_CHECK_INSTANCE_TYPE (_tmp5_, RYGEL_TYPE_AUDIO_ITEM) ? ((RygelAudioItem*) _tmp5_) : NULL);
-	audio_item = _tmp6_;
-	_tmp7_ = 0;
-	distance = _tmp7_;
-	_tmp8_ = audio_item;
-	_tmp9_ = rygel_audio_item_get_sample_freq (_tmp8_);
-	_tmp10_ = _tmp9_;
-	if (_tmp10_ > 0) {
-		guint _tmp11_;
-		RygelAudioItem* _tmp12_;
-		gint _tmp13_;
-		gint _tmp14_;
-		gint _tmp15_ = 0;
-		_tmp11_ = distance;
-		_tmp12_ = audio_item;
-		_tmp13_ = rygel_audio_item_get_sample_freq (_tmp12_);
-		_tmp14_ = _tmp13_;
-		_tmp15_ = abs (_tmp14_ - RYGEL_L16_TRANSCODER_FREQUENCY);
-		distance = _tmp11_ + _tmp15_;
-	}
-	_tmp16_ = audio_item;
-	_tmp17_ = rygel_audio_item_get_channels (_tmp16_);
-	_tmp18_ = _tmp17_;
-	if (_tmp18_ > 0) {
-		guint _tmp19_;
-		RygelAudioItem* _tmp20_;
-		gint _tmp21_;
-		gint _tmp22_;
-		gint _tmp23_ = 0;
-		_tmp19_ = distance;
-		_tmp20_ = audio_item;
-		_tmp21_ = rygel_audio_item_get_channels (_tmp20_);
-		_tmp22_ = _tmp21_;
-		_tmp23_ = abs (_tmp22_ - RYGEL_L16_TRANSCODER_CHANNELS);
-		distance = _tmp19_ + _tmp23_;
-	}
-	_tmp24_ = audio_item;
-	_tmp25_ = rygel_audio_item_get_bits_per_sample (_tmp24_);
-	_tmp26_ = _tmp25_;
-	if (_tmp26_ > 0) {
-		guint _tmp27_;
-		RygelAudioItem* _tmp28_;
-		gint _tmp29_;
-		gint _tmp30_;
-		gint _tmp31_ = 0;
-		_tmp27_ = distance;
-		_tmp28_ = audio_item;
-		_tmp29_ = rygel_audio_item_get_bits_per_sample (_tmp28_);
-		_tmp30_ = _tmp29_;
-		_tmp31_ = abs (_tmp30_ - RYGEL_L16_TRANSCODER_WIDTH);
-		distance = _tmp27_ + _tmp31_;
-	}
-	result = distance;
-	_g_object_unref0 (audio_item);
-	return result;
+static guint
+rygel_l16_transcoder_real_get_distance (RygelTranscoder* base, RygelMediaItem* item) {
+  RygelL16Transcoder * self;
+  guint result = 0U;
+  gboolean _tmp0_ = FALSE;
+  RygelMediaItem* _tmp1_;
+  gboolean _tmp3_;
+  RygelMediaItem* _tmp5_;
+  RygelAudioItem* _tmp6_;
+  RygelAudioItem* audio_item;
+  guint _tmp7_;
+  guint distance;
+  RygelAudioItem* _tmp8_;
+  gint _tmp9_;
+  gint _tmp10_;
+  RygelAudioItem* _tmp16_;
+  gint _tmp17_;
+  gint _tmp18_;
+  RygelAudioItem* _tmp24_;
+  gint _tmp25_;
+  gint _tmp26_;
+  self = (RygelL16Transcoder*) base;
+  g_return_val_if_fail (item != NULL, 0U);
+  _tmp1_ = item;
+  if (!G_TYPE_CHECK_INSTANCE_TYPE (_tmp1_, RYGEL_TYPE_AUDIO_ITEM)) {
+    _tmp0_ = TRUE;
+  } else {
+    RygelMediaItem* _tmp2_;
+    _tmp2_ = item;
+    _tmp0_ = G_TYPE_CHECK_INSTANCE_TYPE (_tmp2_, RYGEL_TYPE_VIDEO_ITEM);
+  }
+  _tmp3_ = _tmp0_;
+  if (_tmp3_) {
+    guint _tmp4_;
+    _tmp4_ = G_MAXUINT;
+    result = _tmp4_;
+    return result;
+  }
+  _tmp5_ = item;
+  _tmp6_ = _g_object_ref0 (G_TYPE_CHECK_INSTANCE_TYPE (_tmp5_, RYGEL_TYPE_AUDIO_ITEM) ? ((RygelAudioItem*) _tmp5_) : NULL);
+  audio_item = _tmp6_;
+  _tmp7_ = 0;
+  distance = _tmp7_;
+  _tmp8_ = audio_item;
+  _tmp9_ = rygel_audio_item_get_sample_freq (_tmp8_);
+  _tmp10_ = _tmp9_;
+  if (_tmp10_ > 0) {
+    guint _tmp11_;
+    RygelAudioItem* _tmp12_;
+    gint _tmp13_;
+    gint _tmp14_;
+    gint _tmp15_ = 0;
+    _tmp11_ = distance;
+    _tmp12_ = audio_item;
+    _tmp13_ = rygel_audio_item_get_sample_freq (_tmp12_);
+    _tmp14_ = _tmp13_;
+    _tmp15_ = abs (_tmp14_ - RYGEL_L16_TRANSCODER_FREQUENCY);
+    distance = _tmp11_ + _tmp15_;
+  }
+  _tmp16_ = audio_item;
+  _tmp17_ = rygel_audio_item_get_channels (_tmp16_);
+  _tmp18_ = _tmp17_;
+  if (_tmp18_ > 0) {
+    guint _tmp19_;
+    RygelAudioItem* _tmp20_;
+    gint _tmp21_;
+    gint _tmp22_;
+    gint _tmp23_ = 0;
+    _tmp19_ = distance;
+    _tmp20_ = audio_item;
+    _tmp21_ = rygel_audio_item_get_channels (_tmp20_);
+    _tmp22_ = _tmp21_;
+    _tmp23_ = abs (_tmp22_ - RYGEL_L16_TRANSCODER_CHANNELS);
+    distance = _tmp19_ + _tmp23_;
+  }
+  _tmp24_ = audio_item;
+  _tmp25_ = rygel_audio_item_get_bits_per_sample (_tmp24_);
+  _tmp26_ = _tmp25_;
+  if (_tmp26_ > 0) {
+    guint _tmp27_;
+    RygelAudioItem* _tmp28_;
+    gint _tmp29_;
+    gint _tmp30_;
+    gint _tmp31_ = 0;
+    _tmp27_ = distance;
+    _tmp28_ = audio_item;
+    _tmp29_ = rygel_audio_item_get_bits_per_sample (_tmp28_);
+    _tmp30_ = _tmp29_;
+    _tmp31_ = abs (_tmp30_ - RYGEL_L16_TRANSCODER_WIDTH);
+    distance = _tmp27_ + _tmp31_;
+  }
+  result = distance;
+  _g_object_unref0 (audio_item);
+  return result;
 }
 
 
-static void rygel_l16_transcoder_class_init (RygelL16TranscoderClass * klass) {
-	rygel_l16_transcoder_parent_class = g_type_class_peek_parent (klass);
-	RYGEL_TRANSCODER_CLASS (klass)->add_resource = rygel_l16_transcoder_real_add_resource;
-	RYGEL_TRANSCODER_CLASS (klass)->get_distance = rygel_l16_transcoder_real_get_distance;
+static void
+rygel_l16_transcoder_class_init (RygelL16TranscoderClass * klass) {
+  rygel_l16_transcoder_parent_class = g_type_class_peek_parent (klass);
+  RYGEL_TRANSCODER_CLASS (klass)->add_resource = rygel_l16_transcoder_real_add_resource;
+  RYGEL_TRANSCODER_CLASS (klass)->get_distance = rygel_l16_transcoder_real_get_distance;
 }
 
 
-static void rygel_l16_transcoder_instance_init (RygelL16Transcoder * self) {
-}
-
-
-/**
- * Transcoder for linear PCM audio (LPCM).
- */
-GType rygel_l16_transcoder_get_type (void) {
-	static volatile gsize rygel_l16_transcoder_type_id__volatile = 0;
-	if (g_once_init_enter (&rygel_l16_transcoder_type_id__volatile)) {
-		static const GTypeInfo g_define_type_info = { sizeof (RygelL16TranscoderClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) rygel_l16_transcoder_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (RygelL16Transcoder), 0, (GInstanceInitFunc) rygel_l16_transcoder_instance_init, NULL };
-		GType rygel_l16_transcoder_type_id;
-		rygel_l16_transcoder_type_id = g_type_register_static (RYGEL_TYPE_AUDIO_TRANSCODER, "RygelL16Transcoder", &g_define_type_info, 0);
-		g_once_init_leave (&rygel_l16_transcoder_type_id__volatile, rygel_l16_transcoder_type_id);
-	}
-	return rygel_l16_transcoder_type_id__volatile;
+static void
+rygel_l16_transcoder_init (RygelL16Transcoder * self) {
 }
 
 
diff --git a/src/rygel-l16-transcoder.h b/src/rygel-l16-transcoder.h
new file mode 100644
index 0000000..82c060b
--- /dev/null
+++ b/src/rygel-l16-transcoder.h
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2009 Nokia Corporation
+ * Copyright (C) 2012 Intel Corporation
+ *
+ * Rygel is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Rygel 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __RYGEL_GST_0_10_MEDIA_ENGINE_L16_TRANSCODER_H__
+#define __RYGEL_GST_0_10_MEDIA_ENGINE_L16_TRANSCODER_H__
+
+#include <glib.h>
+#include <glib-object.h>
+#include <stdlib.h>
+#include <string.h>
+#include <rygel-server.h>
+#include <gst/gst.h>
+#include <libgupnp-dlna/gupnp-dlna-discoverer.h>
+#include <libgupnp-dlna/gupnp-dlna-profile.h>
+#include <gee.h>
+#include <rygel-core.h>
+#include "rygel-audio-transcoder.h"
+
+G_BEGIN_DECLS
+
+#define RYGEL_TYPE_L16_TRANSCODER (rygel_l16_transcoder_get_type ())
+#define RYGEL_L16_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_L16_TRANSCODER, RygelL16Transcoder))
+#define RYGEL_L16_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_L16_TRANSCODER, RygelL16TranscoderClass))
+#define RYGEL_IS_L16_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_L16_TRANSCODER))
+#define RYGEL_IS_L16_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_L16_TRANSCODER))
+#define RYGEL_L16_TRANSCODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_L16_TRANSCODER, RygelL16TranscoderClass))
+
+typedef struct _RygelL16Transcoder RygelL16Transcoder;
+typedef struct _RygelL16TranscoderClass RygelL16TranscoderClass;
+typedef struct _RygelL16TranscoderPrivate RygelL16TranscoderPrivate;
+
+struct _RygelL16Transcoder {
+  RygelAudioTranscoder parent_instance;
+  RygelL16TranscoderPrivate * priv;
+};
+
+struct _RygelL16TranscoderClass {
+  RygelAudioTranscoderClass parent_class;
+};
+
+GType rygel_l16_transcoder_get_type (void) G_GNUC_CONST;
+
+RygelL16Transcoder* rygel_l16_transcoder_new (void);
+
+G_END_DECLS
+
+#endif /* __RYGEL_GST_0_10_MEDIA_ENGINE_L16_TRANSCODER_H__ */
diff --git a/src/rygel-mp2ts-transcoder.c b/src/rygel-mp2ts-transcoder.c
index e65bb73..929e9e1 100644
--- a/src/rygel-mp2ts-transcoder.c
+++ b/src/rygel-mp2ts-transcoder.c
@@ -21,125 +21,20 @@
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  */
 
-#include <glib.h>
-#include <glib-object.h>
-#include <rygel-server.h>
-#include <gst/pbutils/pbutils.h>
-#include <gst/gst.h>
-#include <stdlib.h>
-#include <string.h>
-#include <libgupnp-av/gupnp-av.h>
+#include "rygel-mp2ts-transcoder.h"
 
+G_DEFINE_TYPE (RygelMP2TSTranscoder, rygel_mp2_ts_transcoder, RYGEL_TYPE_VIDEO_TRANSCODER)
 
 #define RYGEL_TYPE_MP2_TS_PROFILE (rygel_mp2_ts_profile_get_type ())
 
-#define RYGEL_TYPE_GST_TRANSCODER (rygel_gst_transcoder_get_type ())
-#define RYGEL_GST_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_GST_TRANSCODER, RygelGstTranscoder))
-#define RYGEL_GST_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_GST_TRANSCODER, RygelGstTranscoderClass))
-#define RYGEL_IS_GST_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_GST_TRANSCODER))
-#define RYGEL_IS_GST_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_GST_TRANSCODER))
-#define RYGEL_GST_TRANSCODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_GST_TRANSCODER, RygelGstTranscoderClass))
-
-typedef struct _RygelGstTranscoder RygelGstTranscoder;
-typedef struct _RygelGstTranscoderClass RygelGstTranscoderClass;
-typedef struct _RygelGstTranscoderPrivate RygelGstTranscoderPrivate;
-
-#define RYGEL_TYPE_AUDIO_TRANSCODER (rygel_audio_transcoder_get_type ())
-#define RYGEL_AUDIO_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_AUDIO_TRANSCODER, RygelAudioTranscoder))
-#define RYGEL_AUDIO_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_AUDIO_TRANSCODER, RygelAudioTranscoderClass))
-#define RYGEL_IS_AUDIO_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_AUDIO_TRANSCODER))
-#define RYGEL_IS_AUDIO_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_AUDIO_TRANSCODER))
-#define RYGEL_AUDIO_TRANSCODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_AUDIO_TRANSCODER, RygelAudioTranscoderClass))
-
-typedef struct _RygelAudioTranscoder RygelAudioTranscoder;
-typedef struct _RygelAudioTranscoderClass RygelAudioTranscoderClass;
-typedef struct _RygelAudioTranscoderPrivate RygelAudioTranscoderPrivate;
-
-#define RYGEL_TYPE_VIDEO_TRANSCODER (rygel_video_transcoder_get_type ())
-#define RYGEL_VIDEO_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_VIDEO_TRANSCODER, RygelVideoTranscoder))
-#define RYGEL_VIDEO_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_VIDEO_TRANSCODER, RygelVideoTranscoderClass))
-#define RYGEL_IS_VIDEO_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_VIDEO_TRANSCODER))
-#define RYGEL_IS_VIDEO_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_VIDEO_TRANSCODER))
-#define RYGEL_VIDEO_TRANSCODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_VIDEO_TRANSCODER, RygelVideoTranscoderClass))
-
-typedef struct _RygelVideoTranscoder RygelVideoTranscoder;
-typedef struct _RygelVideoTranscoderClass RygelVideoTranscoderClass;
-typedef struct _RygelVideoTranscoderPrivate RygelVideoTranscoderPrivate;
-
-#define RYGEL_TYPE_MP2_TS_TRANSCODER (rygel_mp2_ts_transcoder_get_type ())
-#define RYGEL_MP2_TS_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_MP2_TS_TRANSCODER, RygelMP2TSTranscoder))
-#define RYGEL_MP2_TS_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_MP2_TS_TRANSCODER, RygelMP2TSTranscoderClass))
-#define RYGEL_IS_MP2_TS_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_MP2_TS_TRANSCODER))
-#define RYGEL_IS_MP2_TS_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_MP2_TS_TRANSCODER))
-#define RYGEL_MP2_TS_TRANSCODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_MP2_TS_TRANSCODER, RygelMP2TSTranscoderClass))
-
-typedef struct _RygelMP2TSTranscoder RygelMP2TSTranscoder;
-typedef struct _RygelMP2TSTranscoderClass RygelMP2TSTranscoderClass;
-typedef struct _RygelMP2TSTranscoderPrivate RygelMP2TSTranscoderPrivate;
-#define _g_free0(var) (var = (g_free (var), NULL))
-#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
-
-typedef enum  {
-	RYGEL_MP2_TS_PROFILE_SD = 0,
-	RYGEL_MP2_TS_PROFILE_HD
-} RygelMP2TSProfile;
-
-struct _RygelGstTranscoder {
-	RygelTranscoder parent_instance;
-	RygelGstTranscoderPrivate * priv;
-};
-
-struct _RygelGstTranscoderClass {
-	RygelTranscoderClass parent_class;
-	GstEncodingProfile* (*get_encoding_profile) (RygelGstTranscoder* self);
-};
-
-struct _RygelAudioTranscoder {
-	RygelGstTranscoder parent_instance;
-	RygelAudioTranscoderPrivate * priv;
-	gint audio_bitrate;
-	GstCaps* container_format;
-	GstCaps* audio_codec_format;
-};
-
-struct _RygelAudioTranscoderClass {
-	RygelGstTranscoderClass parent_class;
-};
-
-struct _RygelVideoTranscoder {
-	RygelAudioTranscoder parent_instance;
-	RygelVideoTranscoderPrivate * priv;
-};
-
-struct _RygelVideoTranscoderClass {
-	RygelAudioTranscoderClass parent_class;
-};
-
-struct _RygelMP2TSTranscoder {
-	RygelVideoTranscoder parent_instance;
-	RygelMP2TSTranscoderPrivate * priv;
-};
-
-struct _RygelMP2TSTranscoderClass {
-	RygelVideoTranscoderClass parent_class;
-};
-
 struct _RygelMP2TSTranscoderPrivate {
 	RygelMP2TSProfile profile;
 };
 
-
-static gpointer rygel_mp2_ts_transcoder_parent_class = NULL;
-
 GType rygel_mp2_ts_profile_get_type (void) G_GNUC_CONST;
-GType rygel_gst_transcoder_get_type (void) G_GNUC_CONST;
-GType rygel_audio_transcoder_get_type (void) G_GNUC_CONST;
-GType rygel_video_transcoder_get_type (void) G_GNUC_CONST;
-GType rygel_mp2_ts_transcoder_get_type (void) G_GNUC_CONST;
+
 #define RYGEL_MP2_TS_TRANSCODER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), RYGEL_TYPE_MP2_TS_TRANSCODER, RygelMP2TSTranscoderPrivate))
-enum  {
-	RYGEL_MP2_TS_TRANSCODER_DUMMY_PROPERTY
-};
+
 #define RYGEL_MP2_TS_TRANSCODER_VIDEO_BITRATE 1500
 #define RYGEL_MP2_TS_TRANSCODER_AUDIO_BITRATE 192
 #define RYGEL_MP2_TS_TRANSCODER_CONTAINER "video/mpegts,systemstream=true,packetsize=188"
@@ -148,8 +43,7 @@ enum  {
 #define RYGEL_MP2_TS_TRANSCODER_RESTRICTION_TEMPLATE "video/x-raw-yuv,framerate=(fraction)%d/1,width=%d,height=%d"
 RygelMP2TSTranscoder* rygel_mp2_ts_transcoder_new (RygelMP2TSProfile profile);
 RygelMP2TSTranscoder* rygel_mp2_ts_transcoder_construct (GType object_type, RygelMP2TSProfile profile);
-RygelVideoTranscoder* rygel_video_transcoder_new (const gchar* content_type, const gchar* dlna_profile, gint audio_bitrate, gint video_bitrate, const gchar* container_caps, const gchar* audio_codec_caps, const gchar* video_codec_caps, const gchar* extension, const gchar* restrictions);
-RygelVideoTranscoder* rygel_video_transcoder_construct (GType object_type, const gchar* content_type, const gchar* dlna_profile, gint audio_bitrate, gint video_bitrate, const gchar* container_caps, const gchar* audio_codec_caps, const gchar* video_codec_caps, const gchar* extension, const gchar* restrictions);
+
 static GUPnPDIDLLiteResource* rygel_mp2_ts_transcoder_real_add_resource (RygelTranscoder* base, GUPnPDIDLLiteItem* didl_item, RygelMediaItem* item, RygelTranscodeManager* manager, GError** error);
 static guint rygel_mp2_ts_transcoder_real_get_distance (RygelTranscoder* base, RygelMediaItem* item);
 static void rygel_mp2_ts_transcoder_finalize (GObject* obj);
@@ -360,7 +254,7 @@ static void rygel_mp2_ts_transcoder_class_init (RygelMP2TSTranscoderClass * klas
 }
 
 
-static void rygel_mp2_ts_transcoder_instance_init (RygelMP2TSTranscoder * self) {
+static void rygel_mp2_ts_transcoder_init (RygelMP2TSTranscoder * self) {
 	self->priv = RYGEL_MP2_TS_TRANSCODER_GET_PRIVATE (self);
 }
 
@@ -372,19 +266,4 @@ static void rygel_mp2_ts_transcoder_finalize (GObject* obj) {
 }
 
 
-/**
- * Transcoder for mpeg transport stream containing mpeg 2 video and mp2 audio.
- */
-GType rygel_mp2_ts_transcoder_get_type (void) {
-	static volatile gsize rygel_mp2_ts_transcoder_type_id__volatile = 0;
-	if (g_once_init_enter (&rygel_mp2_ts_transcoder_type_id__volatile)) {
-		static const GTypeInfo g_define_type_info = { sizeof (RygelMP2TSTranscoderClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) rygel_mp2_ts_transcoder_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (RygelMP2TSTranscoder), 0, (GInstanceInitFunc) rygel_mp2_ts_transcoder_instance_init, NULL };
-		GType rygel_mp2_ts_transcoder_type_id;
-		rygel_mp2_ts_transcoder_type_id = g_type_register_static (RYGEL_TYPE_VIDEO_TRANSCODER, "RygelMP2TSTranscoder", &g_define_type_info, 0);
-		g_once_init_leave (&rygel_mp2_ts_transcoder_type_id__volatile, rygel_mp2_ts_transcoder_type_id);
-	}
-	return rygel_mp2_ts_transcoder_type_id__volatile;
-}
-
-
 
diff --git a/src/rygel-mp2ts-transcoder.h b/src/rygel-mp2ts-transcoder.h
new file mode 100644
index 0000000..18442f4
--- /dev/null
+++ b/src/rygel-mp2ts-transcoder.h
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2009 Nokia Corporation
+ * Copyright (C) 2012 Intel Corporation
+ *
+ * Rygel is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Rygel 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __RYGEL_GST_0_10_MEDIA_ENGINE_MP2TS_TRANSCODER_H__
+#define __RYGEL_GST_0_10_MEDIA_ENGINE_MP2TS_TRANSCODER_H__
+
+#include <glib.h>
+#include <glib-object.h>
+#include <stdlib.h>
+#include <string.h>
+#include <rygel-server.h>
+#include <gst/gst.h>
+#include <libgupnp-dlna/gupnp-dlna-discoverer.h>
+#include <libgupnp-dlna/gupnp-dlna-profile.h>
+#include <gee.h>
+#include <rygel-core.h>
+#include "rygel-video-transcoder.h"
+
+G_BEGIN_DECLS
+
+#define RYGEL_TYPE_MP2_TS_TRANSCODER (rygel_gst_mp2_ts_transcoder_get_type ())
+#define RYGEL_MP2_TS_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_MP2_TS_TRANSCODER, RygelMP2TSTranscoder))
+#define RYGEL_MP2_TS_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_MP2_TS_TRANSCODER, RygelMP2TSTranscoderClass))
+#define RYGEL_IS_MP2_TS_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_MP2_TS_TRANSCODER))
+#define RYGEL_IS_MP2_TS_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_MP_2TS_TRANSCODER))
+#define RYGEL_MP2_TS_TRANSCODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_MP2_TS_TRANSCODER, RygelMP2TSTranscoderClass))
+
+typedef struct _RygelMP2TSTranscoder RygelMP2TSTranscoder;
+typedef struct _RygelMP2TSTranscoderClass RygelMP2TSTranscoderClass;
+typedef struct _RygelMP2TSTranscoderPrivate RygelMP2TSTranscoderPrivate;
+
+struct _RygelMP2TSTranscoder {
+  RygelVideoTranscoder parent_instance;
+  RygelMP2TSTranscoderPrivate * priv;
+};
+
+struct _RygelMP2TSTranscoderClass {
+  RygelVideoTranscoderClass parent_class;
+};
+
+typedef enum  {
+	RYGEL_MP2_TS_PROFILE_SD = 0,
+	RYGEL_MP2_TS_PROFILE_HD
+} RygelMP2TSProfile;
+
+GType rygel_mp2_ts_transcoder_get_type (void) G_GNUC_CONST;
+
+RygelMP2TSTranscoder* rygel_mp2_ts_transcoder_new (RygelMP2TSProfile profile);
+
+G_END_DECLS
+
+#endif /* __RYGEL_GST_0_10_MEDIA_ENGINE_MP2TS_TRANSCODER_H__ */
diff --git a/src/rygel-mp3-transcoder.c b/src/rygel-mp3-transcoder.c
index 25c166f..ad3727b 100644
--- a/src/rygel-mp3-transcoder.c
+++ b/src/rygel-mp3-transcoder.c
@@ -21,96 +21,20 @@
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  */
 
-#include <glib.h>
-#include <glib-object.h>
-#include <rygel-server.h>
-#include <gst/pbutils/pbutils.h>
-#include <gst/gst.h>
-#include <stdlib.h>
-#include <string.h>
 
+#include "rygel-mp3-transcoder.h"
 
-#define RYGEL_TYPE_GST_TRANSCODER (rygel_gst_transcoder_get_type ())
-#define RYGEL_GST_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_GST_TRANSCODER, RygelGstTranscoder))
-#define RYGEL_GST_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_GST_TRANSCODER, RygelGstTranscoderClass))
-#define RYGEL_IS_GST_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_GST_TRANSCODER))
-#define RYGEL_IS_GST_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_GST_TRANSCODER))
-#define RYGEL_GST_TRANSCODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_GST_TRANSCODER, RygelGstTranscoderClass))
-
-typedef struct _RygelGstTranscoder RygelGstTranscoder;
-typedef struct _RygelGstTranscoderClass RygelGstTranscoderClass;
-typedef struct _RygelGstTranscoderPrivate RygelGstTranscoderPrivate;
-
-#define RYGEL_TYPE_AUDIO_TRANSCODER (rygel_audio_transcoder_get_type ())
-#define RYGEL_AUDIO_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_AUDIO_TRANSCODER, RygelAudioTranscoder))
-#define RYGEL_AUDIO_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_AUDIO_TRANSCODER, RygelAudioTranscoderClass))
-#define RYGEL_IS_AUDIO_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_AUDIO_TRANSCODER))
-#define RYGEL_IS_AUDIO_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_AUDIO_TRANSCODER))
-#define RYGEL_AUDIO_TRANSCODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_AUDIO_TRANSCODER, RygelAudioTranscoderClass))
-
-typedef struct _RygelAudioTranscoder RygelAudioTranscoder;
-typedef struct _RygelAudioTranscoderClass RygelAudioTranscoderClass;
-typedef struct _RygelAudioTranscoderPrivate RygelAudioTranscoderPrivate;
-
-#define RYGEL_TYPE_MP3_TRANSCODER (rygel_mp3_transcoder_get_type ())
-#define RYGEL_MP3_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_MP3_TRANSCODER, RygelMP3Transcoder))
-#define RYGEL_MP3_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_MP3_TRANSCODER, RygelMP3TranscoderClass))
-#define RYGEL_IS_MP3_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_MP3_TRANSCODER))
-#define RYGEL_IS_MP3_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_MP3_TRANSCODER))
-#define RYGEL_MP3_TRANSCODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_MP3_TRANSCODER, RygelMP3TranscoderClass))
-
-typedef struct _RygelMP3Transcoder RygelMP3Transcoder;
-typedef struct _RygelMP3TranscoderClass RygelMP3TranscoderClass;
-typedef struct _RygelMP3TranscoderPrivate RygelMP3TranscoderPrivate;
-
-struct _RygelGstTranscoder {
-	RygelTranscoder parent_instance;
-	RygelGstTranscoderPrivate * priv;
-};
-
-struct _RygelGstTranscoderClass {
-	RygelTranscoderClass parent_class;
-	GstEncodingProfile* (*get_encoding_profile) (RygelGstTranscoder* self);
-};
-
-struct _RygelAudioTranscoder {
-	RygelGstTranscoder parent_instance;
-	RygelAudioTranscoderPrivate * priv;
-	gint audio_bitrate;
-	GstCaps* container_format;
-	GstCaps* audio_codec_format;
-};
-
-struct _RygelAudioTranscoderClass {
-	RygelGstTranscoderClass parent_class;
-};
-
-struct _RygelMP3Transcoder {
-	RygelAudioTranscoder parent_instance;
-	RygelMP3TranscoderPrivate * priv;
-};
-
-struct _RygelMP3TranscoderClass {
-	RygelAudioTranscoderClass parent_class;
-};
 
+/**
+ * Transcoder for mpeg 1 layer 3 audio.
+ */
 
-static gpointer rygel_mp3_transcoder_parent_class = NULL;
+G_DEFINE_TYPE (RygelMP3Transcoder, rygel_mp3_transcoder, RYGEL_TYPE_AUDIO_TRANSCODER)
 
-GType rygel_gst_transcoder_get_type (void) G_GNUC_CONST;
-GType rygel_audio_transcoder_get_type (void) G_GNUC_CONST;
-GType rygel_mp3_transcoder_get_type (void) G_GNUC_CONST;
-enum  {
-	RYGEL_MP3_TRANSCODER_DUMMY_PROPERTY
-};
 #define RYGEL_MP3_TRANSCODER_BITRATE 128
 #define RYGEL_MP3_TRANSCODER_FORMAT "audio/mpeg,mpegversion=1,layer=3"
 RygelMP3Transcoder* rygel_mp3_transcoder_new (void);
 RygelMP3Transcoder* rygel_mp3_transcoder_construct (GType object_type);
-#define RYGEL_AUDIO_TRANSCODER_NO_CONTAINER NULL
-RygelAudioTranscoder* rygel_audio_transcoder_new (const gchar* content_type, const gchar* dlna_profile, gint audio_bitrate, const gchar* container_caps, const gchar* audio_codec_caps, const gchar* extension);
-RygelAudioTranscoder* rygel_audio_transcoder_construct (GType object_type, const gchar* content_type, const gchar* dlna_profile, gint audio_bitrate, const gchar* container_caps, const gchar* audio_codec_caps, const gchar* extension);
-
 
 RygelMP3Transcoder* rygel_mp3_transcoder_construct (GType object_type) {
 	RygelMP3Transcoder * self = NULL;
@@ -129,23 +53,7 @@ static void rygel_mp3_transcoder_class_init (RygelMP3TranscoderClass * klass) {
 }
 
 
-static void rygel_mp3_transcoder_instance_init (RygelMP3Transcoder * self) {
+static void rygel_mp3_transcoder_init (RygelMP3Transcoder * self) {
 }
 
 
-/**
- * Transcoder for mpeg 1 layer 3 audio.
- */
-GType rygel_mp3_transcoder_get_type (void) {
-	static volatile gsize rygel_mp3_transcoder_type_id__volatile = 0;
-	if (g_once_init_enter (&rygel_mp3_transcoder_type_id__volatile)) {
-		static const GTypeInfo g_define_type_info = { sizeof (RygelMP3TranscoderClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) rygel_mp3_transcoder_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (RygelMP3Transcoder), 0, (GInstanceInitFunc) rygel_mp3_transcoder_instance_init, NULL };
-		GType rygel_mp3_transcoder_type_id;
-		rygel_mp3_transcoder_type_id = g_type_register_static (RYGEL_TYPE_AUDIO_TRANSCODER, "RygelMP3Transcoder", &g_define_type_info, 0);
-		g_once_init_leave (&rygel_mp3_transcoder_type_id__volatile, rygel_mp3_transcoder_type_id);
-	}
-	return rygel_mp3_transcoder_type_id__volatile;
-}
-
-
-
diff --git a/src/rygel-mp3-transcoder.h b/src/rygel-mp3-transcoder.h
new file mode 100644
index 0000000..676b59c
--- /dev/null
+++ b/src/rygel-mp3-transcoder.h
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2009 Nokia Corporation
+ * Copyright (C) 2012 Intel Corporation
+ *
+ * Rygel is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Rygel 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __RYGEL_GST_0_10_MEDIA_ENGINE_MP3_TRANSCODER_H__
+#define __RYGEL_GST_0_10_MEDIA_ENGINE_MP3_TRANSCODER_H__
+
+#include <glib.h>
+#include <glib-object.h>
+#include <stdlib.h>
+#include <string.h>
+#include <rygel-server.h>
+#include <gst/gst.h>
+#include <libgupnp-dlna/gupnp-dlna-discoverer.h>
+#include <libgupnp-dlna/gupnp-dlna-profile.h>
+#include <gee.h>
+#include <rygel-core.h>
+#include "rygel-audio-transcoder.h"
+
+G_BEGIN_DECLS
+
+#define RYGEL_TYPE_MP3_TRANSCODER (rygel_mp3_transcoder_get_type ())
+#define RYGEL_MP3_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_MP3_TRANSCODER, RygelMP3Transcoder))
+#define RYGEL_MP3_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_MP3_TRANSCODER, RygelMP3TranscoderClass))
+#define RYGEL_IS_MP3_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_MP3_TRANSCODER))
+#define RYGEL_IS_MP3_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_MP3_TRANSCODER))
+#define RYGEL_MP3_TRANSCODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_MP3_TRANSCODER, RygelMP3TranscoderClass))
+
+typedef struct _RygelMP3Transcoder RygelMP3Transcoder;
+typedef struct _RygelMP3TranscoderClass RygelMP3TranscoderClass;
+typedef struct _RygelMP3TranscoderPrivate RygelMP3TranscoderPrivate;
+
+struct _RygelMP3Transcoder {
+  RygelAudioTranscoder parent_instance;
+  RygelMP3TranscoderPrivate * priv;
+};
+
+struct _RygelMP3TranscoderClass {
+  RygelAudioTranscoderClass parent_class;
+};
+
+GType rygel_mp3_transcoder_get_type (void) G_GNUC_CONST;
+
+RygelMP3Transcoder* rygel_mp3_transcoder_new (void);
+
+G_END_DECLS
+
+#endif /* __RYGEL_GST_0_10_MEDIA_ENGINE_MP3_TRANSCODER_H__ */
diff --git a/src/rygel-video-transcoder.c b/src/rygel-video-transcoder.c
index 1d2c981..aef39f2 100644
--- a/src/rygel-video-transcoder.c
+++ b/src/rygel-video-transcoder.c
@@ -20,346 +20,242 @@
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  */
 
-#include <glib.h>
-#include <glib-object.h>
-#include <rygel-server.h>
-#include <gst/pbutils/pbutils.h>
-#include <gst/gst.h>
-#include <stdlib.h>
-#include <string.h>
-#include <libgupnp-av/gupnp-av.h>
+#include "rygel-video-transcoder.h"
 
+/**
+ * Base class for all transcoders that handle video.
+ */
 
-#define RYGEL_TYPE_GST_TRANSCODER (rygel_gst_transcoder_get_type ())
-#define RYGEL_GST_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_GST_TRANSCODER, RygelGstTranscoder))
-#define RYGEL_GST_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_GST_TRANSCODER, RygelGstTranscoderClass))
-#define RYGEL_IS_GST_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_GST_TRANSCODER))
-#define RYGEL_IS_GST_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_GST_TRANSCODER))
-#define RYGEL_GST_TRANSCODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_GST_TRANSCODER, RygelGstTranscoderClass))
-
-typedef struct _RygelGstTranscoder RygelGstTranscoder;
-typedef struct _RygelGstTranscoderClass RygelGstTranscoderClass;
-typedef struct _RygelGstTranscoderPrivate RygelGstTranscoderPrivate;
-
-#define RYGEL_TYPE_AUDIO_TRANSCODER (rygel_audio_transcoder_get_type ())
-#define RYGEL_AUDIO_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_AUDIO_TRANSCODER, RygelAudioTranscoder))
-#define RYGEL_AUDIO_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_AUDIO_TRANSCODER, RygelAudioTranscoderClass))
-#define RYGEL_IS_AUDIO_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_AUDIO_TRANSCODER))
-#define RYGEL_IS_AUDIO_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_AUDIO_TRANSCODER))
-#define RYGEL_AUDIO_TRANSCODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_AUDIO_TRANSCODER, RygelAudioTranscoderClass))
-
-typedef struct _RygelAudioTranscoder RygelAudioTranscoder;
-typedef struct _RygelAudioTranscoderClass RygelAudioTranscoderClass;
-typedef struct _RygelAudioTranscoderPrivate RygelAudioTranscoderPrivate;
-
-#define RYGEL_TYPE_VIDEO_TRANSCODER (rygel_video_transcoder_get_type ())
-#define RYGEL_VIDEO_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_VIDEO_TRANSCODER, RygelVideoTranscoder))
-#define RYGEL_VIDEO_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_VIDEO_TRANSCODER, RygelVideoTranscoderClass))
-#define RYGEL_IS_VIDEO_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_VIDEO_TRANSCODER))
-#define RYGEL_IS_VIDEO_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_VIDEO_TRANSCODER))
-#define RYGEL_VIDEO_TRANSCODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_VIDEO_TRANSCODER, RygelVideoTranscoderClass))
-
-typedef struct _RygelVideoTranscoder RygelVideoTranscoder;
-typedef struct _RygelVideoTranscoderClass RygelVideoTranscoderClass;
-typedef struct _RygelVideoTranscoderPrivate RygelVideoTranscoderPrivate;
-#define _gst_caps_unref0(var) ((var == NULL) ? NULL : (var = (gst_caps_unref (var), NULL)))
-#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
-#define _gst_encoding_profile_unref0(var) ((var == NULL) ? NULL : (var = (gst_encoding_profile_unref (var), NULL)))
-
-struct _RygelGstTranscoder {
-	RygelTranscoder parent_instance;
-	RygelGstTranscoderPrivate * priv;
-};
-
-struct _RygelGstTranscoderClass {
-	RygelTranscoderClass parent_class;
-	GstEncodingProfile* (*get_encoding_profile) (RygelGstTranscoder* self);
-};
-
-struct _RygelAudioTranscoder {
-	RygelGstTranscoder parent_instance;
-	RygelAudioTranscoderPrivate * priv;
-	gint audio_bitrate;
-	GstCaps* container_format;
-	GstCaps* audio_codec_format;
-};
-
-struct _RygelAudioTranscoderClass {
-	RygelGstTranscoderClass parent_class;
-};
-
-struct _RygelVideoTranscoder {
-	RygelAudioTranscoder parent_instance;
-	RygelVideoTranscoderPrivate * priv;
-};
-
-struct _RygelVideoTranscoderClass {
-	RygelAudioTranscoderClass parent_class;
-};
+G_DEFINE_TYPE (RygelVideoTranscoder, rygel_video_transcoder, RYGEL_TYPE_GST_TRANSCODER)
 
 struct _RygelVideoTranscoderPrivate {
-	gint video_bitrate;
-	GstCaps* video_codec_format;
-	GstCaps* video_restrictions;
+  gint video_bitrate;
+  GstCaps* video_codec_format;
+  GstCaps* video_restrictions;
 };
 
-
-static gpointer rygel_video_transcoder_parent_class = NULL;
-
-GType rygel_gst_transcoder_get_type (void) G_GNUC_CONST;
-GType rygel_audio_transcoder_get_type (void) G_GNUC_CONST;
-GType rygel_video_transcoder_get_type (void) G_GNUC_CONST;
-#define RYGEL_VIDEO_TRANSCODER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), RYGEL_TYPE_VIDEO_TRANSCODER, RygelVideoTranscoderPrivate))
-enum  {
-	RYGEL_VIDEO_TRANSCODER_DUMMY_PROPERTY
-};
-RygelVideoTranscoder* rygel_video_transcoder_new (const gchar* content_type, const gchar* dlna_profile, gint audio_bitrate, gint video_bitrate, const gchar* container_caps, const gchar* audio_codec_caps, const gchar* video_codec_caps, const gchar* extension, const gchar* restrictions);
-RygelVideoTranscoder* rygel_video_transcoder_construct (GType object_type, const gchar* content_type, const gchar* dlna_profile, gint audio_bitrate, gint video_bitrate, const gchar* container_caps, const gchar* audio_codec_caps, const gchar* video_codec_caps, const gchar* extension, const gchar* restrictions);
-RygelAudioTranscoder* rygel_audio_transcoder_new_with_class (const gchar* content_type, const gchar* dlna_profile, const gchar* upnp_class, gint audio_bitrate, const gchar* container_caps, const gchar* audio_codec_caps, const gchar* extension);
-RygelAudioTranscoder* rygel_audio_transcoder_construct_with_class (GType object_type, const gchar* content_type, const gchar* dlna_profile, const gchar* upnp_class, gint audio_bitrate, const gchar* container_caps, const gchar* audio_codec_caps, const gchar* extension);
-static GUPnPDIDLLiteResource* rygel_video_transcoder_real_add_resource (RygelTranscoder* base, GUPnPDIDLLiteItem* didl_item, RygelMediaItem* item, RygelTranscodeManager* manager, GError** error);
-static guint rygel_video_transcoder_real_get_distance (RygelTranscoder* base, RygelMediaItem* item);
-static GstEncodingProfile* rygel_video_transcoder_real_get_encoding_profile (RygelGstTranscoder* base);
-GstEncodingProfile* rygel_gst_transcoder_get_encoding_profile (RygelGstTranscoder* self);
-const gchar* rygel_gst_transcoder_get_preset (RygelGstTranscoder* self);
 static void rygel_video_transcoder_finalize (GObject* obj);
 
 
-RygelVideoTranscoder* rygel_video_transcoder_construct (GType object_type, const gchar* content_type, const gchar* dlna_profile, gint audio_bitrate, gint video_bitrate, const gchar* container_caps, const gchar* audio_codec_caps, const gchar* video_codec_caps, const gchar* extension, const gchar* restrictions) {
-	RygelVideoTranscoder * self = NULL;
-	const gchar* _tmp0_;
-	const gchar* _tmp1_;
-	gint _tmp2_;
-	const gchar* _tmp3_;
-	const gchar* _tmp4_;
-	const gchar* _tmp5_;
-	gint _tmp6_;
-	const gchar* _tmp7_;
-	GstCaps* _tmp8_ = NULL;
-	const gchar* _tmp9_;
-	g_return_val_if_fail (content_type != NULL, NULL);
-	g_return_val_if_fail (dlna_profile != NULL, NULL);
-	g_return_val_if_fail (container_caps != NULL, NULL);
-	g_return_val_if_fail (audio_codec_caps != NULL, NULL);
-	g_return_val_if_fail (video_codec_caps != NULL, NULL);
-	g_return_val_if_fail (extension != NULL, NULL);
-	_tmp0_ = content_type;
-	_tmp1_ = dlna_profile;
-	_tmp2_ = audio_bitrate;
-	_tmp3_ = container_caps;
-	_tmp4_ = audio_codec_caps;
-	_tmp5_ = extension;
-	self = (RygelVideoTranscoder*) rygel_audio_transcoder_construct_with_class (object_type, _tmp0_, _tmp1_, RYGEL_VIDEO_ITEM_UPNP_CLASS, _tmp2_, _tmp3_, _tmp4_, _tmp5_);
-	_tmp6_ = video_bitrate;
-	self->priv->video_bitrate = _tmp6_;
-	_tmp7_ = video_codec_caps;
-	_tmp8_ = gst_caps_from_string (_tmp7_);
-	_gst_caps_unref0 (self->priv->video_codec_format);
-	self->priv->video_codec_format = _tmp8_;
-	_tmp9_ = restrictions;
-	if (_tmp9_ != NULL) {
-		const gchar* _tmp10_;
-		GstCaps* _tmp11_ = NULL;
-		_tmp10_ = restrictions;
-		_tmp11_ = gst_caps_from_string (_tmp10_);
-		_gst_caps_unref0 (self->priv->video_restrictions);
-		self->priv->video_restrictions = _tmp11_;
-	}
-	return self;
+RygelVideoTranscoder*
+rygel_video_transcoder_construct (GType object_type, const gchar* content_type, gint audio_bitrate, gint video_bitrate, const gchar* container_caps, const gchar* audio_codec_caps, const gchar* video_codec_caps, const gchar* extension, const gchar* restrictions) {
+  RygelVideoTranscoder * self = NULL;
+  const gchar* _tmp0_;
+  const gchar* _tmp1_;
+  gint _tmp2_;
+  const gchar* _tmp3_;
+  const gchar* _tmp4_;
+  const gchar* _tmp5_;
+  gint _tmp6_;
+  const gchar* _tmp7_;
+  GstCaps* _tmp8_ = NULL;
+  const gchar* _tmp9_;
+  g_return_val_if_fail (content_type != NULL, NULL);
+  g_return_val_if_fail (container_caps != NULL, NULL);
+  g_return_val_if_fail (audio_codec_caps != NULL, NULL);
+  g_return_val_if_fail (video_codec_caps != NULL, NULL);
+  g_return_val_if_fail (extension != NULL, NULL);
+  _tmp0_ = content_type;
+  _tmp2_ = audio_bitrate;
+  _tmp3_ = container_caps;
+  _tmp4_ = audio_codec_caps;
+  _tmp5_ = extension;
+  self = (RygelVideoTranscoder*) rygel_audio_transcoder_construct_with_class (object_type, _tmp0_, RYGEL_VIDEO_ITEM_UPNP_CLASS, _tmp2_, _tmp3_, _tmp4_, _tmp5_);
+  _tmp6_ = video_bitrate;
+  self->priv->video_bitrate = _tmp6_;
+  _tmp7_ = video_codec_caps;
+  _tmp8_ = gst_caps_from_string (_tmp7_);
+  _gst_caps_unref0 (self->priv->video_codec_format);
+  self->priv->video_codec_format = _tmp8_;
+  _tmp9_ = restrictions;
+  if (_tmp9_ != NULL) {
+    const gchar* _tmp10_;
+    GstCaps* _tmp11_ = NULL;
+    _tmp10_ = restrictions;
+    _tmp11_ = gst_caps_from_string (_tmp10_);
+    _gst_caps_unref0 (self->priv->video_restrictions);
+    self->priv->video_restrictions = _tmp11_;
+  }
+  return self;
 }
 
 
-RygelVideoTranscoder* rygel_video_transcoder_new (const gchar* content_type, const gchar* dlna_profile, gint audio_bitrate, gint video_bitrate, const gchar* container_caps, const gchar* audio_codec_caps, const gchar* video_codec_caps, const gchar* extension, const gchar* restrictions) {
-	return rygel_video_transcoder_construct (RYGEL_TYPE_VIDEO_TRANSCODER, content_type, dlna_profile, audio_bitrate, video_bitrate, container_caps, audio_codec_caps, video_codec_caps, extension, restrictions);
+RygelVideoTranscoder*
+rygel_video_transcoder_new (const gchar* content_type, gint audio_bitrate, gint video_bitrate, const gchar* container_caps, const gchar* audio_codec_caps, const gchar* video_codec_caps, const gchar* extension, const gchar* restrictions) {
+  return rygel_video_transcoder_construct (RYGEL_TYPE_VIDEO_TRANSCODER, content_type, audio_bitrate, video_bitrate, container_caps, audio_codec_caps, video_codec_caps, extension, restrictions);
 }
 
 
 static gpointer _g_object_ref0 (gpointer self) {
-	return self ? g_object_ref (self) : NULL;
+  return self ? g_object_ref (self) : NULL;
 }
 
 
 static GUPnPDIDLLiteResource* rygel_video_transcoder_real_add_resource (RygelTranscoder* base, GUPnPDIDLLiteItem* didl_item, RygelMediaItem* item, RygelTranscodeManager* manager, GError** error) {
-	RygelVideoTranscoder * self;
-	GUPnPDIDLLiteResource* result = NULL;
-	GUPnPDIDLLiteItem* _tmp0_;
-	RygelMediaItem* _tmp1_;
-	RygelTranscodeManager* _tmp2_;
-	GUPnPDIDLLiteResource* _tmp3_ = NULL;
-	GUPnPDIDLLiteResource* resource;
-	RygelMediaItem* _tmp4_;
-	RygelVideoItem* _tmp5_;
-	RygelVideoItem* video_item;
-	RygelVideoItem* _tmp6_;
-	gint _tmp7_;
-	gint _tmp8_;
-	RygelVideoItem* _tmp9_;
-	gint _tmp10_;
-	gint _tmp11_;
-	gint _tmp12_;
-	gint _tmp13_;
-	GError * _inner_error_ = NULL;
-	self = (RygelVideoTranscoder*) base;
-	g_return_val_if_fail (didl_item != NULL, NULL);
-	g_return_val_if_fail (item != NULL, NULL);
-	g_return_val_if_fail (manager != NULL, NULL);
-	_tmp0_ = didl_item;
-	_tmp1_ = item;
-	_tmp2_ = manager;
-	_tmp3_ = RYGEL_TRANSCODER_CLASS (rygel_video_transcoder_parent_class)->add_resource ((RygelTranscoder*) G_TYPE_CHECK_INSTANCE_CAST (self, RYGEL_TYPE_AUDIO_TRANSCODER, RygelAudioTranscoder), _tmp0_, _tmp1_, _tmp2_, &_inner_error_);
-	resource = _tmp3_;
-	if (_inner_error_ != NULL) {
-		g_propagate_error (error, _inner_error_);
-		return NULL;
-	}
-	if (resource == NULL) {
-		result = NULL;
-		_g_object_unref0 (resource);
-		return result;
-	}
-	_tmp4_ = item;
-	_tmp5_ = _g_object_ref0 (G_TYPE_CHECK_INSTANCE_TYPE (_tmp4_, RYGEL_TYPE_VIDEO_ITEM) ? ((RygelVideoItem*) _tmp4_) : NULL);
-	video_item = _tmp5_;
-	_tmp6_ = video_item;
-	_tmp7_ = rygel_visual_item_get_width ((RygelVisualItem*) _tmp6_);
-	_tmp8_ = _tmp7_;
-	gupnp_didl_lite_resource_set_width (resource, _tmp8_);
-	_tmp9_ = video_item;
-	_tmp10_ = rygel_visual_item_get_height ((RygelVisualItem*) _tmp9_);
-	_tmp11_ = _tmp10_;
-	gupnp_didl_lite_resource_set_height (resource, _tmp11_);
-	_tmp12_ = self->priv->video_bitrate;
-	_tmp13_ = ((RygelAudioTranscoder*) self)->audio_bitrate;
-	gupnp_didl_lite_resource_set_bitrate (resource, ((_tmp12_ + _tmp13_) * 1000) / 8);
-	result = resource;
-	_g_object_unref0 (video_item);
-	return result;
+  RygelVideoTranscoder * self;
+  GUPnPDIDLLiteResource* result = NULL;
+  GUPnPDIDLLiteItem* _tmp0_;
+  RygelMediaItem* _tmp1_;
+  RygelTranscodeManager* _tmp2_;
+  GUPnPDIDLLiteResource* _tmp3_ = NULL;
+  GUPnPDIDLLiteResource* resource;
+  RygelMediaItem* _tmp4_;
+  RygelVideoItem* _tmp5_;
+  RygelVideoItem* video_item;
+  RygelVideoItem* _tmp6_;
+  gint _tmp7_;
+  gint _tmp8_;
+  RygelVideoItem* _tmp9_;
+  gint _tmp10_;
+  gint _tmp11_;
+  gint _tmp12_;
+  gint _tmp13_;
+  GError * _inner_error_ = NULL;
+  self = (RygelVideoTranscoder*) base;
+  g_return_val_if_fail (didl_item != NULL, NULL);
+  g_return_val_if_fail (item != NULL, NULL);
+  g_return_val_if_fail (manager != NULL, NULL);
+  _tmp0_ = didl_item;
+  _tmp1_ = item;
+  _tmp2_ = manager;
+  _tmp3_ = RYGEL_TRANSCODER_CLASS (rygel_video_transcoder_parent_class)->add_resource ((RygelTranscoder*) G_TYPE_CHECK_INSTANCE_CAST (self, RYGEL_TYPE_AUDIO_TRANSCODER, RygelAudioTranscoder), _tmp0_, _tmp1_, _tmp2_, &_inner_error_);
+  resource = _tmp3_;
+  if (_inner_error_ != NULL) {
+    g_propagate_error (error, _inner_error_);
+    return NULL;
+  }
+  if (resource == NULL) {
+    result = NULL;
+    _g_object_unref0 (resource);
+    return result;
+  }
+  _tmp4_ = item;
+  _tmp5_ = _g_object_ref0 (G_TYPE_CHECK_INSTANCE_TYPE (_tmp4_, RYGEL_TYPE_VIDEO_ITEM) ? ((RygelVideoItem*) _tmp4_) : NULL);
+  video_item = _tmp5_;
+  _tmp6_ = video_item;
+  _tmp7_ = rygel_visual_item_get_width ((RygelVisualItem*) _tmp6_);
+  _tmp8_ = _tmp7_;
+  gupnp_didl_lite_resource_set_width (resource, _tmp8_);
+  _tmp9_ = video_item;
+  _tmp10_ = rygel_visual_item_get_height ((RygelVisualItem*) _tmp9_);
+  _tmp11_ = _tmp10_;
+  gupnp_didl_lite_resource_set_height (resource, _tmp11_);
+  _tmp12_ = self->priv->video_bitrate;
+  _tmp13_ = ((RygelAudioTranscoder*) self)->audio_bitrate;
+  gupnp_didl_lite_resource_set_bitrate (resource, ((_tmp12_ + _tmp13_) * 1000) / 8);
+  result = resource;
+  _g_object_unref0 (video_item);
+  return result;
 }
 
 
 static guint rygel_video_transcoder_real_get_distance (RygelTranscoder* base, RygelMediaItem* item) {
-	RygelVideoTranscoder * self;
-	guint result = 0U;
-	RygelMediaItem* _tmp0_;
-	RygelMediaItem* _tmp2_;
-	RygelVideoItem* _tmp3_;
-	RygelVideoItem* video_item;
-	guint _tmp4_;
-	guint distance;
-	RygelVideoItem* _tmp5_;
-	gint _tmp6_;
-	gint _tmp7_;
-	self = (RygelVideoTranscoder*) base;
-	g_return_val_if_fail (item != NULL, 0U);
-	_tmp0_ = item;
-	if (!G_TYPE_CHECK_INSTANCE_TYPE (_tmp0_, RYGEL_TYPE_VIDEO_ITEM)) {
-		guint _tmp1_;
-		_tmp1_ = G_MAXUINT;
-		result = _tmp1_;
-		return result;
-	}
-	_tmp2_ = item;
-	_tmp3_ = _g_object_ref0 (G_TYPE_CHECK_INSTANCE_TYPE (_tmp2_, RYGEL_TYPE_VIDEO_ITEM) ? ((RygelVideoItem*) _tmp2_) : NULL);
-	video_item = _tmp3_;
-	_tmp4_ = 0;
-	distance = _tmp4_;
-	_tmp5_ = video_item;
-	_tmp6_ = rygel_audio_item_get_bitrate ((RygelAudioItem*) _tmp5_);
-	_tmp7_ = _tmp6_;
-	if (_tmp7_ > 0) {
-		guint _tmp8_;
-		RygelVideoItem* _tmp9_;
-		gint _tmp10_;
-		gint _tmp11_;
-		gint _tmp12_;
-		gint _tmp13_ = 0;
-		_tmp8_ = distance;
-		_tmp9_ = video_item;
-		_tmp10_ = rygel_audio_item_get_bitrate ((RygelAudioItem*) _tmp9_);
-		_tmp11_ = _tmp10_;
-		_tmp12_ = self->priv->video_bitrate;
-		_tmp13_ = abs (_tmp11_ - _tmp12_);
-		distance = _tmp8_ + _tmp13_;
-	}
-	result = distance;
-	_g_object_unref0 (video_item);
-	return result;
+  RygelVideoTranscoder * self;
+  guint result = 0U;
+  RygelMediaItem* _tmp0_;
+  RygelMediaItem* _tmp2_;
+  RygelVideoItem* _tmp3_;
+  RygelVideoItem* video_item;
+  guint _tmp4_;
+  guint distance;
+  RygelVideoItem* _tmp5_;
+  gint _tmp6_;
+  gint _tmp7_;
+  self = (RygelVideoTranscoder*) base;
+  g_return_val_if_fail (item != NULL, 0U);
+  _tmp0_ = item;
+  if (!G_TYPE_CHECK_INSTANCE_TYPE (_tmp0_, RYGEL_TYPE_VIDEO_ITEM)) {
+    guint _tmp1_;
+    _tmp1_ = G_MAXUINT;
+    result = _tmp1_;
+    return result;
+  }
+  _tmp2_ = item;
+  _tmp3_ = _g_object_ref0 (G_TYPE_CHECK_INSTANCE_TYPE (_tmp2_, RYGEL_TYPE_VIDEO_ITEM) ? ((RygelVideoItem*) _tmp2_) : NULL);
+  video_item = _tmp3_;
+  _tmp4_ = 0;
+  distance = _tmp4_;
+  _tmp5_ = video_item;
+  _tmp6_ = rygel_audio_item_get_bitrate ((RygelAudioItem*) _tmp5_);
+  _tmp7_ = _tmp6_;
+  if (_tmp7_ > 0) {
+    guint _tmp8_;
+    RygelVideoItem* _tmp9_;
+    gint _tmp10_;
+    gint _tmp11_;
+    gint _tmp12_;
+    gint _tmp13_ = 0;
+    _tmp8_ = distance;
+    _tmp9_ = video_item;
+    _tmp10_ = rygel_audio_item_get_bitrate ((RygelAudioItem*) _tmp9_);
+    _tmp11_ = _tmp10_;
+    _tmp12_ = self->priv->video_bitrate;
+    _tmp13_ = abs (_tmp11_ - _tmp12_);
+    distance = _tmp8_ + _tmp13_;
+  }
+  result = distance;
+  _g_object_unref0 (video_item);
+  return result;
 }
 
 
 static gpointer _gst_encoding_profile_ref0 (gpointer self) {
-	return self ? gst_encoding_profile_ref (self) : NULL;
+  return self ? gst_encoding_profile_ref (self) : NULL;
 }
 
 
 static GstEncodingProfile* rygel_video_transcoder_real_get_encoding_profile (RygelGstTranscoder* base) {
-	RygelVideoTranscoder * self;
-	GstEncodingProfile* result = NULL;
-	GstEncodingProfile* _tmp0_ = NULL;
-	GstEncodingContainerProfile* enc_container_profile;
-	GstCaps* _tmp1_;
-	const gchar* _tmp2_;
-	const gchar* _tmp3_;
-	GstCaps* _tmp4_;
-	GstEncodingVideoProfile* _tmp5_;
-	GstEncodingVideoProfile* enc_video_profile;
-	GstEncodingProfile* _tmp6_;
-	self = (RygelVideoTranscoder*) base;
-	_tmp0_ = RYGEL_GST_TRANSCODER_CLASS (rygel_video_transcoder_parent_class)->get_encoding_profile ((RygelGstTranscoder*) G_TYPE_CHECK_INSTANCE_CAST (self, RYGEL_TYPE_AUDIO_TRANSCODER, RygelAudioTranscoder));
-	enc_container_profile = G_TYPE_CHECK_INSTANCE_TYPE (_tmp0_, GST_TYPE_ENCODING_CONTAINER_PROFILE) ? ((GstEncodingContainerProfile*) _tmp0_) : NULL;
-	_tmp1_ = self->priv->video_codec_format;
-	_tmp2_ = rygel_gst_transcoder_get_preset ((RygelGstTranscoder*) self);
-	_tmp3_ = _tmp2_;
-	_tmp4_ = self->priv->video_restrictions;
-	_tmp5_ = gst_encoding_video_profile_new (_tmp1_, _tmp3_, _tmp4_, (guint) 1);
-	enc_video_profile = _tmp5_;
-	gst_encoding_profile_set_name ((GstEncodingProfile*) enc_video_profile, "video");
-	_tmp6_ = _gst_encoding_profile_ref0 ((GstEncodingProfile*) enc_video_profile);
-	gst_encoding_container_profile_add_profile (enc_container_profile, _tmp6_);
-	result = (GstEncodingProfile*) enc_container_profile;
-	_gst_encoding_profile_unref0 (enc_video_profile);
-	return result;
+  RygelVideoTranscoder * self;
+  GstEncodingProfile* result = NULL;
+  GstEncodingProfile* _tmp0_ = NULL;
+  GstEncodingContainerProfile* enc_container_profile;
+  GstCaps* _tmp1_;
+  const gchar* _tmp2_;
+  const gchar* _tmp3_;
+  GstCaps* _tmp4_;
+  GstEncodingVideoProfile* _tmp5_;
+  GstEncodingVideoProfile* enc_video_profile;
+  GstEncodingProfile* _tmp6_;
+  self = (RygelVideoTranscoder*) base;
+  _tmp0_ = RYGEL_GST_TRANSCODER_CLASS (rygel_video_transcoder_parent_class)->get_encoding_profile ((RygelGstTranscoder*) G_TYPE_CHECK_INSTANCE_CAST (self, RYGEL_TYPE_AUDIO_TRANSCODER, RygelAudioTranscoder));
+  enc_container_profile = G_TYPE_CHECK_INSTANCE_TYPE (_tmp0_, GST_TYPE_ENCODING_CONTAINER_PROFILE) ? ((GstEncodingContainerProfile*) _tmp0_) : NULL;
+  _tmp1_ = self->priv->video_codec_format;
+  _tmp2_ = rygel_gst_transcoder_get_preset ((RygelGstTranscoder*) self);
+  _tmp3_ = _tmp2_;
+  _tmp4_ = self->priv->video_restrictions;
+  _tmp5_ = gst_encoding_video_profile_new (_tmp1_, _tmp3_, _tmp4_, (guint) 1);
+  enc_video_profile = _tmp5_;
+  gst_encoding_profile_set_name ((GstEncodingProfile*) enc_video_profile, "video");
+  _tmp6_ = _gst_encoding_profile_ref0 ((GstEncodingProfile*) enc_video_profile);
+  gst_encoding_container_profile_add_profile (enc_container_profile, _tmp6_);
+  result = (GstEncodingProfile*) enc_container_profile;
+  _gst_encoding_profile_unref0 (enc_video_profile);
+  return result;
 }
 
 
 static void rygel_video_transcoder_class_init (RygelVideoTranscoderClass * klass) {
-	rygel_video_transcoder_parent_class = g_type_class_peek_parent (klass);
-	g_type_class_add_private (klass, sizeof (RygelVideoTranscoderPrivate));
-	RYGEL_TRANSCODER_CLASS (klass)->add_resource = rygel_video_transcoder_real_add_resource;
-	RYGEL_TRANSCODER_CLASS (klass)->get_distance = rygel_video_transcoder_real_get_distance;
-	RYGEL_GST_TRANSCODER_CLASS (klass)->get_encoding_profile = rygel_video_transcoder_real_get_encoding_profile;
-	G_OBJECT_CLASS (klass)->finalize = rygel_video_transcoder_finalize;
+  rygel_video_transcoder_parent_class = g_type_class_peek_parent (klass);
+  g_type_class_add_private (klass, sizeof (RygelVideoTranscoderPrivate));
+  RYGEL_TRANSCODER_CLASS (klass)->add_resource = rygel_video_transcoder_real_add_resource;
+  RYGEL_TRANSCODER_CLASS (klass)->get_distance = rygel_video_transcoder_real_get_distance;
+  RYGEL_GST_TRANSCODER_CLASS (klass)->get_encoding_profile = rygel_video_transcoder_real_get_encoding_profile;
+  G_OBJECT_CLASS (klass)->finalize = rygel_video_transcoder_finalize;
 }
 
 
-static void rygel_video_transcoder_instance_init (RygelVideoTranscoder * self) {
-	self->priv = RYGEL_VIDEO_TRANSCODER_GET_PRIVATE (self);
-	self->priv->video_restrictions = NULL;
+static void rygel_video_transcoder_init (RygelVideoTranscoder * self) {
+  self->priv = RYGEL_VIDEO_TRANSCODER_GET_PRIVATE (self);
+  self->priv->video_restrictions = NULL;
 }
 
 
 static void rygel_video_transcoder_finalize (GObject* obj) {
-	RygelVideoTranscoder * self;
-	self = G_TYPE_CHECK_INSTANCE_CAST (obj, RYGEL_TYPE_VIDEO_TRANSCODER, RygelVideoTranscoder);
-	_gst_caps_unref0 (self->priv->video_codec_format);
-	_gst_caps_unref0 (self->priv->video_restrictions);
-	G_OBJECT_CLASS (rygel_video_transcoder_parent_class)->finalize (obj);
+  RygelVideoTranscoder * self;
+  self = G_TYPE_CHECK_INSTANCE_CAST (obj, RYGEL_TYPE_VIDEO_TRANSCODER, RygelVideoTranscoder);
+  _gst_caps_unref0 (self->priv->video_codec_format);
+  _gst_caps_unref0 (self->priv->video_restrictions);
+  G_OBJECT_CLASS (rygel_video_transcoder_parent_class)->finalize (obj);
 }
 
 
-/**
- * Base class for all transcoders that handle video.
- */
-GType rygel_video_transcoder_get_type (void) {
-	static volatile gsize rygel_video_transcoder_type_id__volatile = 0;
-	if (g_once_init_enter (&rygel_video_transcoder_type_id__volatile)) {
-		static const GTypeInfo g_define_type_info = { sizeof (RygelVideoTranscoderClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) rygel_video_transcoder_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (RygelVideoTranscoder), 0, (GInstanceInitFunc) rygel_video_transcoder_instance_init, NULL };
-		GType rygel_video_transcoder_type_id;
-		rygel_video_transcoder_type_id = g_type_register_static (RYGEL_TYPE_AUDIO_TRANSCODER, "RygelVideoTranscoder", &g_define_type_info, 0);
-		g_once_init_leave (&rygel_video_transcoder_type_id__volatile, rygel_video_transcoder_type_id);
-	}
-	return rygel_video_transcoder_type_id__volatile;
-}
-
-
-
diff --git a/src/rygel-video-transcoder.h b/src/rygel-video-transcoder.h
new file mode 100644
index 0000000..7359a0b
--- /dev/null
+++ b/src/rygel-video-transcoder.h
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2009 Nokia Corporation
+ * Copyright (C) 2012 Intel Corporation
+ *
+ * Rygel is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Rygel 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __RYGEL_GST_0_10_MEDIA_ENGINE_VIDEO_TRANSCODER_H__
+#define __RYGEL_GST_0_10_MEDIA_ENGINE_VIDEO_TRANSCODER_H__
+
+#include <glib.h>
+#include <glib-object.h>
+#include <stdlib.h>
+#include <string.h>
+#include <rygel-server.h>
+#include <gst/gst.h>
+#include <libgupnp-dlna/gupnp-dlna-discoverer.h>
+#include <libgupnp-dlna/gupnp-dlna-profile.h>
+#include <gee.h>
+#include <rygel-core.h>
+#include "rygel-audio-transcoder.h"
+
+G_BEGIN_DECLS
+
+#define RYGEL_TYPE_VIDEO_TRANSCODER (rygel_video_transcoder_get_type ())
+#define RYGEL_VIDEO_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_VIDEO_TRANSCODER, RygelVideoTranscoder))
+#define RYGEL_VIDEO_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_VIDEO_TRANSCODER, RygelVideoTranscoderClass))
+#define RYGEL_IS_VIDEO_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_VIDEO_TRANSCODER))
+#define RYGEL_IS_VIDEO_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_VIDEO_TRANSCODER))
+#define RYGEL_VIDEO_TRANSCODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_VIDEO_TRANSCODER, RygelVideoTranscoderClass))
+
+typedef struct _RygelVideoTranscoder RygelVideoTranscoder;
+typedef struct _RygelVideoTranscoderClass RygelVideoTranscoderClass;
+typedef struct _RygelVideoTranscoderPrivate RygelVideoTranscoderPrivate;
+
+
+struct _RygelVideoTranscoder {
+  RygelAudioTranscoder parent_instance;
+  RygelVideoTranscoderPrivate * priv;
+};
+
+struct _RygelVideoTranscoderClass {
+  RygelAudioTranscoderClass parent_class;
+};
+
+GType rygel_video_transcoder_get_type (void) G_GNUC_CONST;
+
+RygelVideoTranscoder* rygel_video_transcoder_new (const gchar* content_type, gint audio_bitrate, gint video_bitrate, const gchar* container_caps, const gchar* audio_codec_caps, const gchar* video_codec_caps, const gchar* extension, const gchar* restrictions);
+
+G_END_DECLS
+
+#endif /* __RYGEL_GST_0_10_MEDIA_ENGINE_VIDEO_TRANSCODER_H__ */
diff --git a/src/rygel-wmv-transcoder.c b/src/rygel-wmv-transcoder.c
index de0d1c5..1f80e81 100644
--- a/src/rygel-wmv-transcoder.c
+++ b/src/rygel-wmv-transcoder.c
@@ -20,116 +20,15 @@
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  */
 
-#include <glib.h>
-#include <glib-object.h>
-#include <rygel-server.h>
-#include <gst/pbutils/pbutils.h>
-#include <gst/gst.h>
-#include <stdlib.h>
-#include <string.h>
+#include "rygel-wmv-transcoder.h"
+#include "rygel-gst-utils.h"
 
+G_DEFINE_TYPE (RygelWMVTranscoder, rygel_wmv_transcoder, RYGEL_TYPE_VIDEO_TRANSCODER)
 
-#define RYGEL_TYPE_GST_TRANSCODER (rygel_gst_transcoder_get_type ())
-#define RYGEL_GST_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_GST_TRANSCODER, RygelGstTranscoder))
-#define RYGEL_GST_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_GST_TRANSCODER, RygelGstTranscoderClass))
-#define RYGEL_IS_GST_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_GST_TRANSCODER))
-#define RYGEL_IS_GST_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_GST_TRANSCODER))
-#define RYGEL_GST_TRANSCODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_GST_TRANSCODER, RygelGstTranscoderClass))
-
-typedef struct _RygelGstTranscoder RygelGstTranscoder;
-typedef struct _RygelGstTranscoderClass RygelGstTranscoderClass;
-typedef struct _RygelGstTranscoderPrivate RygelGstTranscoderPrivate;
-
-#define RYGEL_TYPE_AUDIO_TRANSCODER (rygel_audio_transcoder_get_type ())
-#define RYGEL_AUDIO_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_AUDIO_TRANSCODER, RygelAudioTranscoder))
-#define RYGEL_AUDIO_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_AUDIO_TRANSCODER, RygelAudioTranscoderClass))
-#define RYGEL_IS_AUDIO_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_AUDIO_TRANSCODER))
-#define RYGEL_IS_AUDIO_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_AUDIO_TRANSCODER))
-#define RYGEL_AUDIO_TRANSCODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_AUDIO_TRANSCODER, RygelAudioTranscoderClass))
-
-typedef struct _RygelAudioTranscoder RygelAudioTranscoder;
-typedef struct _RygelAudioTranscoderClass RygelAudioTranscoderClass;
-typedef struct _RygelAudioTranscoderPrivate RygelAudioTranscoderPrivate;
-
-#define RYGEL_TYPE_VIDEO_TRANSCODER (rygel_video_transcoder_get_type ())
-#define RYGEL_VIDEO_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_VIDEO_TRANSCODER, RygelVideoTranscoder))
-#define RYGEL_VIDEO_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_VIDEO_TRANSCODER, RygelVideoTranscoderClass))
-#define RYGEL_IS_VIDEO_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_VIDEO_TRANSCODER))
-#define RYGEL_IS_VIDEO_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_VIDEO_TRANSCODER))
-#define RYGEL_VIDEO_TRANSCODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_VIDEO_TRANSCODER, RygelVideoTranscoderClass))
-
-typedef struct _RygelVideoTranscoder RygelVideoTranscoder;
-typedef struct _RygelVideoTranscoderClass RygelVideoTranscoderClass;
-typedef struct _RygelVideoTranscoderPrivate RygelVideoTranscoderPrivate;
-
-#define RYGEL_TYPE_WMV_TRANSCODER (rygel_wmv_transcoder_get_type ())
-#define RYGEL_WMV_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_WMV_TRANSCODER, RygelWMVTranscoder))
-#define RYGEL_WMV_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_WMV_TRANSCODER, RygelWMVTranscoderClass))
-#define RYGEL_IS_WMV_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_WMV_TRANSCODER))
-#define RYGEL_IS_WMV_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_WMV_TRANSCODER))
-#define RYGEL_WMV_TRANSCODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_WMV_TRANSCODER, RygelWMVTranscoderClass))
-
-typedef struct _RygelWMVTranscoder RygelWMVTranscoder;
-typedef struct _RygelWMVTranscoderClass RygelWMVTranscoderClass;
-typedef struct _RygelWMVTranscoderPrivate RygelWMVTranscoderPrivate;
-
-struct _RygelGstTranscoder {
-	RygelTranscoder parent_instance;
-	RygelGstTranscoderPrivate * priv;
-};
-
-struct _RygelGstTranscoderClass {
-	RygelTranscoderClass parent_class;
-	GstEncodingProfile* (*get_encoding_profile) (RygelGstTranscoder* self);
-};
-
-struct _RygelAudioTranscoder {
-	RygelGstTranscoder parent_instance;
-	RygelAudioTranscoderPrivate * priv;
-	gint audio_bitrate;
-	GstCaps* container_format;
-	GstCaps* audio_codec_format;
-};
-
-struct _RygelAudioTranscoderClass {
-	RygelGstTranscoderClass parent_class;
-};
-
-struct _RygelVideoTranscoder {
-	RygelAudioTranscoder parent_instance;
-	RygelVideoTranscoderPrivate * priv;
-};
-
-struct _RygelVideoTranscoderClass {
-	RygelAudioTranscoderClass parent_class;
-};
-
-struct _RygelWMVTranscoder {
-	RygelVideoTranscoder parent_instance;
-	RygelWMVTranscoderPrivate * priv;
-};
-
-struct _RygelWMVTranscoderClass {
-	RygelVideoTranscoderClass parent_class;
-};
-
-
-static gpointer rygel_wmv_transcoder_parent_class = NULL;
-
-GType rygel_gst_transcoder_get_type (void) G_GNUC_CONST;
-GType rygel_audio_transcoder_get_type (void) G_GNUC_CONST;
-GType rygel_video_transcoder_get_type (void) G_GNUC_CONST;
-GType rygel_wmv_transcoder_get_type (void) G_GNUC_CONST;
-enum  {
-	RYGEL_WMV_TRANSCODER_DUMMY_PROPERTY
-};
 #define RYGEL_WMV_TRANSCODER_VIDEO_BITRATE 1200
 #define RYGEL_WMV_TRANSCODER_AUDIO_BITRATE 64
 RygelWMVTranscoder* rygel_wmv_transcoder_new (void);
 RygelWMVTranscoder* rygel_wmv_transcoder_construct (GType object_type);
-RygelVideoTranscoder* rygel_video_transcoder_new (const gchar* content_type, const gchar* dlna_profile, gint audio_bitrate, gint video_bitrate, const gchar* container_caps, const gchar* audio_codec_caps, const gchar* video_codec_caps, const gchar* extension, const gchar* restrictions);
-RygelVideoTranscoder* rygel_video_transcoder_construct (GType object_type, const gchar* content_type, const gchar* dlna_profile, gint audio_bitrate, gint video_bitrate, const gchar* container_caps, const gchar* audio_codec_caps, const gchar* video_codec_caps, const gchar* extension, const gchar* restrictions);
-
 
 RygelWMVTranscoder* rygel_wmv_transcoder_construct (GType object_type) {
 	RygelWMVTranscoder * self = NULL;
@@ -148,20 +47,7 @@ static void rygel_wmv_transcoder_class_init (RygelWMVTranscoderClass * klass) {
 }
 
 
-static void rygel_wmv_transcoder_instance_init (RygelWMVTranscoder * self) {
+static void rygel_wmv_transcoder_init (RygelWMVTranscoder * self) {
 }
 
 
-GType rygel_wmv_transcoder_get_type (void) {
-	static volatile gsize rygel_wmv_transcoder_type_id__volatile = 0;
-	if (g_once_init_enter (&rygel_wmv_transcoder_type_id__volatile)) {
-		static const GTypeInfo g_define_type_info = { sizeof (RygelWMVTranscoderClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) rygel_wmv_transcoder_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (RygelWMVTranscoder), 0, (GInstanceInitFunc) rygel_wmv_transcoder_instance_init, NULL };
-		GType rygel_wmv_transcoder_type_id;
-		rygel_wmv_transcoder_type_id = g_type_register_static (RYGEL_TYPE_VIDEO_TRANSCODER, "RygelWMVTranscoder", &g_define_type_info, 0);
-		g_once_init_leave (&rygel_wmv_transcoder_type_id__volatile, rygel_wmv_transcoder_type_id);
-	}
-	return rygel_wmv_transcoder_type_id__volatile;
-}
-
-
-
diff --git a/src/rygel-wmv-transcoder.h b/src/rygel-wmv-transcoder.h
new file mode 100644
index 0000000..663241d
--- /dev/null
+++ b/src/rygel-wmv-transcoder.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2009 Nokia Corporation
+ * Copyright (C) 2012 Intel Corporation
+ *
+ * Rygel is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Rygel 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __RYGEL_GST_0_10_MEDIA_ENGINE_WMV_TRANSCODER_H__
+#define __RYGEL_GST_0_10_MEDIA_ENGINE_WMV_TRANSCODER_H__
+
+#include "rygel-video-transcoder.h"
+
+G_BEGIN_DECLS
+
+#define RYGEL_TYPE_WMV_TRANSCODER (rygel_wmv_transcoder_get_type ())
+#define RYGEL_WMV_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_TYPE_WMV_TRANSCODER, RygelWMVTranscoder))
+#define RYGEL_WMV_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_TYPE_WMV_TRANSCODER, RygelWMVTranscoderClass))
+#define RYGEL_IS_WMV_TRANSCODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_TYPE_WMV_TRANSCODER))
+#define RYGEL_IS_WMV_TRANSCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_TYPE_WMV_TRANSCODER))
+#define RYGEL_WMV_TRANSCODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_TYPE_WMV_TRANSCODER, RygelWMVTranscoderClass))
+
+typedef struct _RygelWMVTranscoder RygelWMVTranscoder;
+typedef struct _RygelWMVTranscoderClass RygelWMVTranscoderClass;
+typedef struct _RygelWMVTranscoderPrivate RygelWMVTranscoderPrivate;
+
+struct _RygelWMVTranscoder {
+  RygelVideoTranscoder parent_instance;
+  RygelWMVTranscoderPrivate * priv;
+};
+
+struct _RygelWMVTranscoderClass {
+  RygelVideoTranscoderClass parent_class;
+};
+
+GType rygel_wmv_transcoder_get_type (void) G_GNUC_CONST;
+
+RygelWMVTranscoder* rygel_wmv_transcoder_new (void);
+
+G_END_DECLS
+
+#endif /* __RYGEL_GST_0_10_MEDIA_ENGINE_WMV_TRANSCODER_H__ */



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