[rygel-gst-0-10-media-engine] Initial conversin from vala to C



commit a758ebd2759192aa992bc1109ccc87c2bcc2b402
Author: Murray Cumming <murrayc murrayc com>
Date:   Tue Dec 18 10:06:32 2012 +0100

    Initial conversin from vala to C
    
    Using the generated .c files.

 .gitignore                      |    1 -
 Makefile.am                     |    2 -
 autogen.sh                      |    3 +-
 configure.ac                    |   13 +-
 m4/rygel.m4                     |   82 ----
 src/Makefile.am                 |   39 +-
 src/rygel-aac-transcoder.c      |  154 +++++++
 src/rygel-aac-transcoder.vala   |   35 --
 src/rygel-audio-transcoder.c    |  380 ++++++++++++++++
 src/rygel-audio-transcoder.vala |  118 -----
 src/rygel-avc-transcoder.c      |  218 +++++++++
 src/rygel-avc-transcoder.vala   |   67 ---
 src/rygel-gst-data-source.c     |  955 +++++++++++++++++++++++++++++++++++++++
 src/rygel-gst-data-source.vala  |  262 -----------
 src/rygel-gst-media-engine.c    |  623 +++++++++++++++++++++++++
 src/rygel-gst-media-engine.vala |  119 -----
 src/rygel-gst-sink.c            |  481 ++++++++++++++++++++
 src/rygel-gst-sink.vala         |  144 ------
 src/rygel-gst-transcoder.c      |  622 +++++++++++++++++++++++++
 src/rygel-gst-transcoder.vala   |  165 -------
 src/rygel-gst-utils.c           |  577 +++++++++++++++++++++++
 src/rygel-gst-utils.vala        |  117 -----
 src/rygel-l16-transcoder.c      |  447 ++++++++++++++++++
 src/rygel-l16-transcoder.vala   |  101 ----
 src/rygel-mp2ts-transcoder.c    |  393 ++++++++++++++++
 src/rygel-mp2ts-transcoder.vala |  112 -----
 src/rygel-mp3-transcoder.c      |  154 +++++++
 src/rygel-mp3-transcoder.vala   |   42 --
 src/rygel-video-transcoder.c    |  368 +++++++++++++++
 src/rygel-video-transcoder.vala |  107 -----
 src/rygel-wmv-transcoder.c      |  170 +++++++
 src/rygel-wmv-transcoder.vala   |   39 --
 32 files changed, 5560 insertions(+), 1550 deletions(-)
---
diff --git a/.gitignore b/.gitignore
index 7af2f7d..68a1c87 100644
--- a/.gitignore
+++ b/.gitignore
@@ -51,5 +51,4 @@ po/Makefile.in.in
 po/POTFILES
 src/rygel-media-engine-gst-0-10.h
 src/rygel-media-engine-gst-0-10.vapi
-src/*.c
 
diff --git a/Makefile.am b/Makefile.am
index 5c4366f..7b751b2 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -27,5 +27,3 @@ dist-hook:
 				echo A git clone is required to generate a ChangeLog >&2; \
 		fi
 
-vala-clean:
-	rm -f `find . -name "*.stamp"`
diff --git a/autogen.sh b/autogen.sh
index 4bdf01c..ad826f1 100755
--- a/autogen.sh
+++ b/autogen.sh
@@ -32,5 +32,4 @@ REQUIRED_AUTOMAKE_VERSION=1.11 \
 REQUIRED_AUTOCONF_VERSION=2.64 \
 REQUIRED_LIBTOOL_VERSION=2.2.6 \
 REQUIRED_INTLTOOL_VERSION=0.40.0 \
-bash gnome-autogen.sh --enable-vala --enable-maintainer-mode --enable-debug \
-                 --enable-strict-valac "$@"
+bash gnome-autogen.sh --enable-maintainer-mode --enable-debug "$@"
diff --git a/configure.ac b/configure.ac
index db8a560..b903479 100644
--- a/configure.ac
+++ b/configure.ac
@@ -6,7 +6,7 @@ AC_INIT([rygel-gst-0-10-media-engine],
 	[http://live.gnome.org/Rygel])
 AC_CONFIG_AUX_DIR([build-aux])
 
-AC_CONFIG_SRCDIR([src/rygel-gst-utils.vala])
+AC_CONFIG_SRCDIR([src/rygel-gst-utils.c])
 AC_CONFIG_HEADERS([config.h])
 AC_CONFIG_MACRO_DIR([m4])
 
@@ -34,22 +34,14 @@ GSTPBU_REQUIRED=0.10.35
 REQUIRED_MODULES='rygel-server-2.0 >= $LIBRYGEL_SERVER_REQUIRED gupnp-dlna-1.0 >= $GUPNP_DLNA_REQUIRED gstreamer-0.10 >= $GSTREAMER_REQUIRED gstreamer-base-0.10 >= $GSTREAMER_REQUIRED gstreamer-pbutils-0.10 >= $GSTPBU_REQUIRED'
 PKG_CHECK_MODULES([DEPS], [$REQUIRED_MODULES])
 
-VALA_REQUIRED=0.16.1
-REQUIRED_MODULES='rygel-server-2.0 gupnp-dlna-1.0 gstreamer-0.10 gstreamer-base-0.10 gstreamer-pbutils-0.10'
-RYGEL_CHECK_VALA([$VALA_REQUIRED],
-                 [$VALA_REQUIRED_MODULES])
-
 dnl Debugging
 AC_ARG_ENABLE(debug,
 	AS_HELP_STRING([--enable-debug],[enable debugging]),,
         enable_debug=no)
 if test "x$enable_debug" = "xyes"; then
         CFLAGS="$CFLAGS -O0 -g"
-        RYGEL_DEBUG_VALAFLAGS="-g"
 fi
 
-AC_SUBST(RYGEL_DEBUG_VALAFLAGS)
-
 dnl Strict compiler
 AC_ARG_ENABLE(strict-cc,
 	AS_HELP_STRING([--enable-strict-cc],[enable strict C compiler]),,
@@ -60,8 +52,6 @@ else
         CFLAGS="$CFLAGS -w"
 fi
 
-VALAFLAGS="--target-glib=2.32 $VALAFLAGS"
-
 
 dnl Gettext
 GETTEXT_PACKAGE=rygel-gst-0-10-media-engine
@@ -93,5 +83,4 @@ echo "
         Source code location:   ${srcdir}
         Compiler:               ${CC}
         CFLAGS:                 ${CFLAGS}
-        VALAFLAGS:              ${VALAFLAGS}
 "
diff --git a/src/Makefile.am b/src/Makefile.am
index 821c829..fe2383c 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -3,34 +3,27 @@ include $(top_srcdir)/data/common.am
 engine_LTLIBRARIES = librygel-media-engine-gst-0-10.la
 enginedir = $(libdir)/rygel-2.0/engines
 
+librygel_media_engine_gst_0_10_la_SOURCES = \
+	rygel-aac-transcoder.c \
+	rygel-audio-transcoder.c \
+	rygel-avc-transcoder.c \
+	rygel-gst-data-source.c \
+	rygel-gst-media-engine.c \
+	rygel-gst-sink.c \
+	rygel-gst-transcoder.c \
+	rygel-gst-utils.c \
+	rygel-l16-transcoder.c \
+	rygel-mp2ts-transcoder.c \
+	rygel-mp3-transcoder.c \
+	rygel-video-transcoder.c \
+	rygel-wmv-transcoder.c
 
-AM_CFLAGS = -DG_LOG_DOMAIN='"MediaEngine-GStreamer-0.10"' \
+librygel_media_engine_gst_0_10_la_CFLAGS = \
+	-DG_LOG_DOMAIN='"MediaEngine-GStreamer-0.10"' \
 	-DPRESET_DIR='"$(presetdir)"' \
 	-include config.h \
 	$(DEPS_CFLAGS)
 
-librygel_media_engine_gst_0_10_la_SOURCES = \
-	rygel-aac-transcoder.vala \
-	rygel-audio-transcoder.vala \
-	rygel-avc-transcoder.vala \
-	rygel-gst-data-source.vala \
-	rygel-gst-media-engine.vala \
-	rygel-gst-sink.vala \
-	rygel-gst-transcoder.vala \
-	rygel-gst-utils.vala \
-	rygel-l16-transcoder.vala \
-	rygel-mp2ts-transcoder.vala \
-	rygel-mp3-transcoder.vala \
-	rygel-video-transcoder.vala \
-	rygel-wmv-transcoder.vala
-
-librygel_media_engine_gst_0_10_la_VALAFLAGS = \
-	--pkg rygel-server-2.0 \
-	--pkg gupnp-dlna-1.0 \
-	--pkg gstreamer-0.10 \
-	--pkg gstreamer-base-0.10 \
-	--pkg gstreamer-pbutils-0.10
-
 librygel_media_engine_gst_0_10_la_LIBADD = \
 	$(DEPS_LIBS)
 
diff --git a/src/rygel-aac-transcoder.c b/src/rygel-aac-transcoder.c
new file mode 100644
index 0000000..8b673d2
--- /dev/null
+++ b/src/rygel-aac-transcoder.c
@@ -0,0 +1,154 @@
+/* rygel-aac-transcoder.c generated by valac 0.18.1, the Vala compiler
+ * generated from rygel-aac-transcoder.vala, do not modify */
+
+/*
+ * Copyright (C) 2011 Nokia Corporation.
+ *
+ * Author: Luis de Bethencourt <luis debethencourt collabora com>
+ *
+ * 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.
+ */
+
+#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>
+
+
+#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);
+
+
+RygelAACTranscoder* rygel_aac_transcoder_construct (GType object_type) {
+	RygelAACTranscoder * self = NULL;
+	self = (RygelAACTranscoder*) rygel_audio_transcoder_construct (object_type, "audio/vnd.dlna.adts", "AAC_ADTS_320", RYGEL_AAC_TRANSCODER_BITRATE, NULL, RYGEL_AAC_TRANSCODER_CODEC, "adts");
+	rygel_gst_transcoder_set_preset ((RygelGstTranscoder*) self, "Rygel AAC_ADTS_320 preset");
+	return self;
+}
+
+
+RygelAACTranscoder* rygel_aac_transcoder_new (void) {
+	return rygel_aac_transcoder_construct (RYGEL_TYPE_AAC_TRANSCODER);
+}
+
+
+static void rygel_aac_transcoder_class_init (RygelAACTranscoderClass * klass) {
+	rygel_aac_transcoder_parent_class = g_type_class_peek_parent (klass);
+}
+
+
+static void rygel_aac_transcoder_instance_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-audio-transcoder.c b/src/rygel-audio-transcoder.c
new file mode 100644
index 0000000..5818d35
--- /dev/null
+++ b/src/rygel-audio-transcoder.c
@@ -0,0 +1,380 @@
+/* rygel-audio-transcoder.c generated by valac 0.18.1, the Vala compiler
+ * generated from rygel-audio-transcoder.vala, do not modify */
+
+/*
+ * Copyright (C) 2011 Nokia Corporation.
+ * Copyright (C) 2012 Intel Corporation.
+ *
+ * Author: Jens Georg <jensg openismus com>
+ *
+ * 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.
+ */
+
+#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;
+};
+
+
+static gpointer rygel_audio_transcoder_parent_class = NULL;
+
+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_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_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);
+}
+
+
+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;
+}
+
+
+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 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_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_instance_init (RygelAudioTranscoder * self) {
+	self->container_format = NULL;
+	self->audio_codec_format = NULL;
+}
+
+
+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);
+}
+
+
+/**
+ * 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;
+}
+
+
+
diff --git a/src/rygel-avc-transcoder.c b/src/rygel-avc-transcoder.c
new file mode 100644
index 0000000..e42f153
--- /dev/null
+++ b/src/rygel-avc-transcoder.c
@@ -0,0 +1,218 @@
+/* rygel-avc-transcoder.c generated by valac 0.18.1, the Vala compiler
+ * generated from rygel-avc-transcoder.vala, do not modify */
+
+/*
+ * Copyright (C) 2011 Nokia Corporation.
+ *
+ * Author: Luis de Bethencourt <luis debethencourt collabora com>
+ *
+ * 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.
+ */
+
+#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_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);
+
+
+RygelAVCTranscoder* rygel_avc_transcoder_construct (GType object_type) {
+	RygelAVCTranscoder * self = NULL;
+	self = (RygelAVCTranscoder*) rygel_video_transcoder_construct (object_type, "video/mp4", "AVC_MP4_BL_CIF15_AAC_520", RYGEL_AVC_TRANSCODER_AUDIO_BITRATE, RYGEL_AVC_TRANSCODER_VIDEO_BITRATE, RYGEL_AVC_TRANSCODER_CONTAINER, RYGEL_AVC_TRANSCODER_AUDIO_CAPS, RYGEL_AVC_TRANSCODER_VIDEO_CAPS, "mp4", RYGEL_AVC_TRANSCODER_RESTRICTIONS);
+	rygel_gst_transcoder_set_preset ((RygelGstTranscoder*) self, "Rygel AVC_MP4_BL_CIF15_AAC_520 preset");
+	return self;
+}
+
+
+RygelAVCTranscoder* rygel_avc_transcoder_new (void) {
+	return rygel_avc_transcoder_construct (RYGEL_TYPE_AVC_TRANSCODER);
+}
+
+
+static GUPnPDIDLLiteResource* rygel_avc_transcoder_real_add_resource (RygelTranscoder* base, GUPnPDIDLLiteItem* didl_item, RygelMediaItem* item, RygelTranscodeManager* manager, GError** error) {
+	RygelAVCTranscoder * self;
+	GUPnPDIDLLiteResource* result = NULL;
+	GUPnPDIDLLiteItem* _tmp0_;
+	RygelMediaItem* _tmp1_;
+	RygelTranscodeManager* _tmp2_;
+	GUPnPDIDLLiteResource* _tmp3_ = NULL;
+	GUPnPDIDLLiteResource* resource;
+	GError * _inner_error_ = NULL;
+	self = (RygelAVCTranscoder*) 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_avc_transcoder_parent_class)->add_resource ((RygelTranscoder*) G_TYPE_CHECK_INSTANCE_CAST (self, RYGEL_TYPE_VIDEO_TRANSCODER, RygelVideoTranscoder), _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_width (resource, 352);
+	gupnp_didl_lite_resource_set_height (resource, 288);
+	result = resource;
+	return result;
+}
+
+
+static void rygel_avc_transcoder_class_init (RygelAVCTranscoderClass * klass) {
+	rygel_avc_transcoder_parent_class = g_type_class_peek_parent (klass);
+	RYGEL_TRANSCODER_CLASS (klass)->add_resource = rygel_avc_transcoder_real_add_resource;
+}
+
+
+static void rygel_avc_transcoder_instance_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-gst-data-source.c b/src/rygel-gst-data-source.c
new file mode 100644
index 0000000..4eec978
--- /dev/null
+++ b/src/rygel-gst-data-source.c
@@ -0,0 +1,955 @@
+/* rygel-gst-data-source.c generated by valac 0.18.1, the Vala compiler
+ * generated from rygel-gst-data-source.vala, do not modify */
+
+/*
+ * Copyright (C) 2012 Intel Corporation.
+ *
+ * Author: Jens Georg <jensg openismus com>
+ *
+ * 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.
+ */
+
+#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)))
+
+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;
+};
+
+struct _RygelGstDataSourcePrivate {
+	GstPipeline* pipeline;
+	RygelHTTPSeek* seek;
+	RygelGstSink* sink;
+	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
+};
+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);
+GstElement* rygel_gst_utils_create_source_for_uri (const gchar* uri);
+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_data_source_real_start (RygelDataSource* base, RygelHTTPSeek* offsets, GError** error);
+static void rygel_gst_data_source_prepare_pipeline (RygelGstDataSource* self, const gchar* name, GstElement* src, GError** error);
+static void rygel_gst_data_source_real_freeze (RygelDataSource* base);
+void rygel_gst_sink_freeze (RygelGstSink* self);
+static void rygel_gst_data_source_real_thaw (RygelDataSource* base);
+void rygel_gst_sink_thaw (RygelGstSink* self);
+static void rygel_gst_data_source_real_stop (RygelDataSource* base);
+static gboolean __lambda4_ (RygelGstDataSource* self);
+static gboolean ___lambda4__gsource_func (gpointer self);
+RygelGstSink* rygel_gst_sink_new (RygelDataSource* source, RygelHTTPSeek* offsets);
+RygelGstSink* rygel_gst_sink_construct (GType object_type, RygelDataSource* source, RygelHTTPSeek* offsets);
+static void rygel_gst_data_source_src_pad_added (RygelGstDataSource* self, GstElement* src, GstPad* src_pad);
+static void _rygel_gst_data_source_src_pad_added_gst_element_pad_added (GstElement* _sender, GstPad* pad, gpointer self);
+GQuark rygel_gst_error_quark (void);
+static gboolean rygel_gst_data_source_bus_handler (RygelGstDataSource* self, GstBus* bus, GstMessage* message);
+static gboolean _rygel_gst_data_source_bus_handler_gst_bus_func (GstBus* bus, GstMessage* message, gpointer self);
+#define RYGEL_GST_SINK_NAME "http-gst-sink"
+GstElement* rygel_gst_utils_get_rtp_depayloader (GstCaps* caps);
+static inline void _dynamic_set_streamable0 (GstElement* obj, gboolean value);
+static inline void _dynamic_set_fragment_duration1 (GstElement* obj, gint value);
+static gboolean rygel_gst_data_source_perform_seek (RygelGstDataSource* self);
+static gboolean ___lambda3_ (RygelGstDataSource* self);
+static gboolean ____lambda3__gsource_func (gpointer self);
+static void rygel_gst_data_source_finalize (GObject* obj);
+
+
+GQuark rygel_gst_data_source_error_quark (void) {
+	return g_quark_from_static_string ("rygel_gst_data_source_error-quark");
+}
+
+
+RygelGstDataSource* rygel_gst_data_source_construct (GType object_type, const gchar* uri, GError** error) {
+	RygelGstDataSource * self = NULL;
+	const gchar* _tmp0_;
+	GstElement* _tmp1_ = NULL;
+	GstElement* _tmp2_;
+	GError * _inner_error_ = NULL;
+	g_return_val_if_fail (uri != NULL, NULL);
+	self = (RygelGstDataSource*) g_object_new (object_type, NULL);
+	_tmp0_ = uri;
+	_tmp1_ = rygel_gst_utils_create_source_for_uri (_tmp0_);
+	_gst_object_unref0 (self->src);
+	self->src = _tmp1_;
+	_tmp2_ = self->src;
+	if (_tmp2_ == NULL) {
+		const gchar* _tmp3_ = NULL;
+		gchar* _tmp4_;
+		gchar* msg;
+		const gchar* _tmp5_;
+		const gchar* _tmp6_;
+		GError* _tmp7_;
+		_tmp3_ = _ ("Could not create GstElement for URI %s");
+		_tmp4_ = g_strdup (_tmp3_);
+		msg = _tmp4_;
+		_tmp5_ = msg;
+		_tmp6_ = uri;
+		_tmp7_ = g_error_new (RYGEL_GST_DATA_SOURCE_ERROR, RYGEL_GST_DATA_SOURCE_ERROR_NOT_COMPATIBLE, _tmp5_, _tmp6_);
+		_inner_error_ = _tmp7_;
+		g_propagate_error (error, _inner_error_);
+		_g_free0 (msg);
+		_g_object_unref0 (self);
+		return NULL;
+	}
+	return self;
+}
+
+
+RygelGstDataSource* rygel_gst_data_source_new (const gchar* uri, GError** error) {
+	return rygel_gst_data_source_construct (RYGEL_TYPE_GST_DATA_SOURCE, uri, error);
+}
+
+
+static gpointer _gst_object_ref0 (gpointer self) {
+	return self ? gst_object_ref (self) : NULL;
+}
+
+
+RygelGstDataSource* rygel_gst_data_source_construct_from_element (GType object_type, GstElement* element) {
+	RygelGstDataSource * self = NULL;
+	GstElement* _tmp0_;
+	GstElement* _tmp1_;
+	g_return_val_if_fail (element != NULL, NULL);
+	self = (RygelGstDataSource*) g_object_new (object_type, NULL);
+	_tmp0_ = element;
+	_tmp1_ = _gst_object_ref0 (_tmp0_);
+	_gst_object_unref0 (self->src);
+	self->src = _tmp1_;
+	return self;
+}
+
+
+RygelGstDataSource* rygel_gst_data_source_new_from_element (GstElement* element) {
+	return rygel_gst_data_source_construct_from_element (RYGEL_TYPE_GST_DATA_SOURCE, element);
+}
+
+
+static gpointer _g_object_ref0 (gpointer self) {
+	return self ? g_object_ref (self) : NULL;
+}
+
+
+static void rygel_gst_data_source_real_start (RygelDataSource* base, RygelHTTPSeek* offsets, GError** error) {
+	RygelGstDataSource * self;
+	RygelHTTPSeek* _tmp0_;
+	RygelHTTPSeek* _tmp1_;
+	GstElement* _tmp2_;
+	RygelHTTPSeek* _tmp3_;
+	GError * _inner_error_ = NULL;
+	self = (RygelGstDataSource*) base;
+	_tmp0_ = offsets;
+	_tmp1_ = _g_object_ref0 (_tmp0_);
+	_g_object_unref0 (self->priv->seek);
+	self->priv->seek = _tmp1_;
+	_tmp2_ = self->src;
+	rygel_gst_data_source_prepare_pipeline (self, "RygelGstDataSource", _tmp2_, &_inner_error_);
+	if (_inner_error_ != NULL) {
+		g_propagate_error (error, _inner_error_);
+		return;
+	}
+	_tmp3_ = self->priv->seek;
+	if (_tmp3_ != NULL) {
+		GstPipeline* _tmp4_;
+		_tmp4_ = self->priv->pipeline;
+		gst_element_set_state ((GstElement*) _tmp4_, GST_STATE_PAUSED);
+	} else {
+		GstPipeline* _tmp5_;
+		_tmp5_ = self->priv->pipeline;
+		gst_element_set_state ((GstElement*) _tmp5_, GST_STATE_PLAYING);
+	}
+}
+
+
+static void rygel_gst_data_source_real_freeze (RygelDataSource* base) {
+	RygelGstDataSource * self;
+	RygelGstSink* _tmp0_;
+	self = (RygelGstDataSource*) base;
+	_tmp0_ = self->priv->sink;
+	rygel_gst_sink_freeze (_tmp0_);
+}
+
+
+static void rygel_gst_data_source_real_thaw (RygelDataSource* base) {
+	RygelGstDataSource * self;
+	RygelGstSink* _tmp0_;
+	self = (RygelGstDataSource*) base;
+	_tmp0_ = self->priv->sink;
+	rygel_gst_sink_thaw (_tmp0_);
+}
+
+
+static gboolean __lambda4_ (RygelGstDataSource* self) {
+	gboolean result = FALSE;
+	g_signal_emit_by_name ((RygelDataSource*) self, "done");
+	result = FALSE;
+	return result;
+}
+
+
+static gboolean ___lambda4__gsource_func (gpointer self) {
+	gboolean result;
+	result = __lambda4_ (self);
+	return result;
+}
+
+
+static void rygel_gst_data_source_real_stop (RygelDataSource* base) {
+	RygelGstDataSource * self;
+	RygelGstSink* _tmp0_;
+	GCancellable* _tmp1_;
+	GstPipeline* _tmp2_;
+	guint _tmp3_;
+	self = (RygelGstDataSource*) base;
+	_tmp0_ = self->priv->sink;
+	_tmp1_ = _tmp0_->cancellable;
+	g_cancellable_cancel (_tmp1_);
+	_tmp2_ = self->priv->pipeline;
+	gst_element_set_state ((GstElement*) _tmp2_, GST_STATE_NULL);
+	_tmp3_ = self->priv->bus_watch_id;
+	g_source_remove (_tmp3_);
+	g_idle_add_full (G_PRIORITY_DEFAULT_IDLE, ___lambda4__gsource_func, g_object_ref (self), g_object_unref);
+}
+
+
+static void _rygel_gst_data_source_src_pad_added_gst_element_pad_added (GstElement* _sender, GstPad* pad, gpointer self) {
+	rygel_gst_data_source_src_pad_added (self, _sender, pad);
+}
+
+
+static gboolean _rygel_gst_data_source_bus_handler_gst_bus_func (GstBus* bus, GstMessage* message, gpointer self) {
+	gboolean result;
+	result = rygel_gst_data_source_bus_handler (self, bus, message);
+	return result;
+}
+
+
+static void rygel_gst_data_source_prepare_pipeline (RygelGstDataSource* self, const gchar* name, GstElement* src, GError** error) {
+	RygelHTTPSeek* _tmp0_;
+	RygelGstSink* _tmp1_;
+	const gchar* _tmp2_;
+	GstPipeline* _tmp3_;
+	GstPipeline* _tmp4_;
+	GstPipeline* _tmp7_;
+	GstElement* _tmp8_;
+	RygelGstSink* _tmp9_;
+	GstElement* _tmp10_;
+	guint16 _tmp11_;
+	GstPipeline* _tmp27_;
+	GstBus* _tmp28_ = NULL;
+	GstBus* bus;
+	GstBus* _tmp29_;
+	guint _tmp30_ = 0U;
+	GError * _inner_error_ = NULL;
+	g_return_if_fail (self != NULL);
+	g_return_if_fail (name != NULL);
+	g_return_if_fail (src != NULL);
+	_tmp0_ = self->priv->seek;
+	_tmp1_ = rygel_gst_sink_new ((RygelDataSource*) self, _tmp0_);
+	gst_object_ref_sink (_tmp1_);
+	_gst_object_unref0 (self->priv->sink);
+	self->priv->sink = _tmp1_;
+	_tmp2_ = name;
+	_tmp3_ = (GstPipeline*) gst_pipeline_new (_tmp2_);
+	gst_object_ref_sink (_tmp3_);
+	_gst_object_unref0 (self->priv->pipeline);
+	self->priv->pipeline = _tmp3_;
+	_tmp4_ = self->priv->pipeline;
+	if (_tmp4_ == NULL) {
+		const gchar* _tmp5_ = NULL;
+		GError* _tmp6_;
+		_tmp5_ = _ ("Failed to create pipeline");
+		_tmp6_ = g_error_new_literal (RYGEL_DATA_SOURCE_ERROR, RYGEL_DATA_SOURCE_ERROR_GENERAL, _tmp5_);
+		_inner_error_ = _tmp6_;
+		g_propagate_error (error, _inner_error_);
+		return;
+	}
+	_tmp7_ = self->priv->pipeline;
+	_tmp8_ = src;
+	_tmp9_ = self->priv->sink;
+	gst_bin_add_many ((GstBin*) _tmp7_, _tmp8_, (GstElement*) _tmp9_, NULL);
+	_tmp10_ = src;
+	_tmp11_ = _tmp10_->numsrcpads;
+	if (((gint) _tmp11_) == 0) {
+		GstElement* _tmp12_;
+		_tmp12_ = src;
+		g_signal_connect_object (_tmp12_, "pad-added", (GCallback) _rygel_gst_data_source_src_pad_added_gst_element_pad_added, self, 0);
+	} else {
+		GstElement* _tmp13_;
+		RygelGstSink* _tmp14_;
+		gboolean _tmp15_ = FALSE;
+		_tmp13_ = src;
+		_tmp14_ = self->priv->sink;
+		_tmp15_ = gst_element_link (_tmp13_, (GstElement*) _tmp14_);
+		if (!_tmp15_) {
+			const gchar* _tmp16_ = NULL;
+			GstElement* _tmp17_;
+			gchar* _tmp18_;
+			gchar* _tmp19_;
+			gchar* _tmp20_;
+			RygelGstSink* _tmp21_;
+			gchar* _tmp22_;
+			gchar* _tmp23_;
+			gchar* _tmp24_;
+			GError* _tmp25_;
+			GError* _tmp26_;
+			_tmp16_ = _ ("Failed to link %s to %s");
+			_tmp17_ = src;
+			_tmp18_ = gst_object_get_name ((GstObject*) _tmp17_);
+			_tmp19_ = _tmp18_;
+			_tmp20_ = _tmp19_;
+			_tmp21_ = self->priv->sink;
+			_tmp22_ = gst_object_get_name ((GstObject*) _tmp21_);
+			_tmp23_ = _tmp22_;
+			_tmp24_ = _tmp23_;
+			_tmp25_ = g_error_new (RYGEL_GST_ERROR, RYGEL_GST_ERROR_LINK, _tmp16_, _tmp20_, _tmp24_);
+			_tmp26_ = _tmp25_;
+			_g_free0 (_tmp24_);
+			_g_free0 (_tmp20_);
+			_inner_error_ = _tmp26_;
+			g_propagate_error (error, _inner_error_);
+			return;
+		}
+	}
+	_tmp27_ = self->priv->pipeline;
+	_tmp28_ = gst_pipeline_get_bus (_tmp27_);
+	bus = _tmp28_;
+	_tmp29_ = bus;
+	_tmp30_ = gst_bus_add_watch_full (_tmp29_, G_PRIORITY_DEFAULT, _rygel_gst_data_source_bus_handler_gst_bus_func, g_object_ref (self), g_object_unref);
+	self->priv->bus_watch_id = _tmp30_;
+	_gst_object_unref0 (bus);
+}
+
+
+static void rygel_gst_data_source_src_pad_added (RygelGstDataSource* self, GstElement* src, GstPad* src_pad) {
+	GstPad* _tmp0_;
+	GstCaps* _tmp1_ = NULL;
+	GstCaps* caps;
+	GstPipeline* _tmp2_;
+	GstElement* _tmp3_ = NULL;
+	GstElement* sink;
+	GstPad* sink_pad = NULL;
+	GstCaps* _tmp4_;
+	GstElement* _tmp5_ = NULL;
+	GstElement* depay;
+	GstElement* _tmp6_;
+	GstPad* _tmp29_;
+	GstPad* _tmp30_;
+	GstPadLinkReturn _tmp31_ = 0;
+	GstElement* _tmp41_;
+	g_return_if_fail (self != NULL);
+	g_return_if_fail (src != NULL);
+	g_return_if_fail (src_pad != NULL);
+	_tmp0_ = src_pad;
+	_tmp1_ = gst_pad_get_caps_reffed (_tmp0_);
+	caps = _tmp1_;
+	_tmp2_ = self->priv->pipeline;
+	_tmp3_ = gst_bin_get_by_name ((GstBin*) _tmp2_, RYGEL_GST_SINK_NAME);
+	sink = _tmp3_;
+	_tmp4_ = caps;
+	_tmp5_ = rygel_gst_utils_get_rtp_depayloader (_tmp4_);
+	depay = _tmp5_;
+	_tmp6_ = depay;
+	if (_tmp6_ != NULL) {
+		GstPipeline* _tmp7_;
+		GstElement* _tmp8_;
+		GstElement* _tmp9_;
+		GstElement* _tmp10_;
+		gboolean _tmp11_ = FALSE;
+		GstElement* _tmp21_;
+		GstPad* _tmp22_;
+		GstCaps* _tmp23_;
+		GstPad* _tmp24_ = NULL;
+		_tmp7_ = self->priv->pipeline;
+		_tmp8_ = depay;
+		gst_bin_add ((GstBin*) _tmp7_, _tmp8_);
+		_tmp9_ = depay;
+		_tmp10_ = sink;
+		_tmp11_ = gst_element_link (_tmp9_, _tmp10_);
+		if (!_tmp11_) {
+			const gchar* _tmp12_ = NULL;
+			GstElement* _tmp13_;
+			gchar* _tmp14_;
+			gchar* _tmp15_;
+			gchar* _tmp16_;
+			GstElement* _tmp17_;
+			gchar* _tmp18_;
+			gchar* _tmp19_;
+			gchar* _tmp20_;
+			_tmp12_ = _ ("Failed to link %s to %s");
+			_tmp13_ = depay;
+			_tmp14_ = gst_object_get_name ((GstObject*) _tmp13_);
+			_tmp15_ = _tmp14_;
+			_tmp16_ = _tmp15_;
+			_tmp17_ = sink;
+			_tmp18_ = gst_object_get_name ((GstObject*) _tmp17_);
+			_tmp19_ = _tmp18_;
+			_tmp20_ = _tmp19_;
+			g_critical (_tmp12_, _tmp16_, _tmp20_);
+			_g_free0 (_tmp20_);
+			_g_free0 (_tmp16_);
+			g_signal_emit_by_name ((RygelDataSource*) self, "done");
+			_gst_object_unref0 (depay);
+			_gst_object_unref0 (sink_pad);
+			_gst_object_unref0 (sink);
+			_gst_caps_unref0 (caps);
+			return;
+		}
+		_tmp21_ = depay;
+		_tmp22_ = src_pad;
+		_tmp23_ = caps;
+		_tmp24_ = gst_element_get_compatible_pad (_tmp21_, _tmp22_, _tmp23_);
+		_gst_object_unref0 (sink_pad);
+		sink_pad = _tmp24_;
+	} else {
+		GstElement* _tmp25_;
+		GstPad* _tmp26_;
+		GstCaps* _tmp27_;
+		GstPad* _tmp28_ = NULL;
+		_tmp25_ = sink;
+		_tmp26_ = src_pad;
+		_tmp27_ = caps;
+		_tmp28_ = gst_element_get_compatible_pad (_tmp25_, _tmp26_, _tmp27_);
+		_gst_object_unref0 (sink_pad);
+		sink_pad = _tmp28_;
+	}
+	_tmp29_ = src_pad;
+	_tmp30_ = sink_pad;
+	_tmp31_ = gst_pad_link (_tmp29_, _tmp30_);
+	if (_tmp31_ != GST_PAD_LINK_OK) {
+		const gchar* _tmp32_ = NULL;
+		GstPad* _tmp33_;
+		gchar* _tmp34_;
+		gchar* _tmp35_;
+		gchar* _tmp36_;
+		GstPad* _tmp37_;
+		gchar* _tmp38_;
+		gchar* _tmp39_;
+		gchar* _tmp40_;
+		_tmp32_ = _ ("Failed to link pad %s to %s");
+		_tmp33_ = src_pad;
+		_tmp34_ = gst_object_get_name ((GstObject*) _tmp33_);
+		_tmp35_ = _tmp34_;
+		_tmp36_ = _tmp35_;
+		_tmp37_ = sink_pad;
+		_tmp38_ = gst_object_get_name ((GstObject*) _tmp37_);
+		_tmp39_ = _tmp38_;
+		_tmp40_ = _tmp39_;
+		g_critical (_tmp32_, _tmp36_, _tmp40_);
+		_g_free0 (_tmp40_);
+		_g_free0 (_tmp36_);
+		g_signal_emit_by_name ((RygelDataSource*) self, "done");
+		_gst_object_unref0 (depay);
+		_gst_object_unref0 (sink_pad);
+		_gst_object_unref0 (sink);
+		_gst_caps_unref0 (caps);
+		return;
+	}
+	_tmp41_ = depay;
+	if (_tmp41_ != NULL) {
+		GstElement* _tmp42_;
+		_tmp42_ = depay;
+		gst_element_sync_state_with_parent (_tmp42_);
+	}
+	_gst_object_unref0 (depay);
+	_gst_object_unref0 (sink_pad);
+	_gst_object_unref0 (sink);
+	_gst_caps_unref0 (caps);
+}
+
+
+static inline void _dynamic_set_streamable0 (GstElement* obj, gboolean value) {
+	g_object_set (obj, "streamable", value, NULL);
+}
+
+
+static inline void _dynamic_set_fragment_duration1 (GstElement* obj, gint value) {
+	g_object_set (obj, "fragment-duration", value, NULL);
+}
+
+
+static gboolean ___lambda3_ (RygelGstDataSource* self) {
+	gboolean result = FALSE;
+	g_signal_emit_by_name ((RygelDataSource*) self, "done");
+	result = FALSE;
+	return result;
+}
+
+
+static gboolean ____lambda3__gsource_func (gpointer self) {
+	gboolean result;
+	result = ___lambda3_ (self);
+	return result;
+}
+
+
+static gboolean rygel_gst_data_source_bus_handler (RygelGstDataSource* self, GstBus* bus, GstMessage* message) {
+	gboolean result = FALSE;
+	gboolean ret;
+	GstMessage* _tmp0_;
+	GstMessageType _tmp1_;
+	gboolean _tmp53_;
+	g_return_val_if_fail (self != NULL, FALSE);
+	g_return_val_if_fail (bus != NULL, FALSE);
+	g_return_val_if_fail (message != NULL, FALSE);
+	ret = TRUE;
+	_tmp0_ = message;
+	_tmp1_ = _tmp0_->type;
+	if (_tmp1_ == GST_MESSAGE_EOS) {
+		ret = FALSE;
+	} else {
+		GstMessage* _tmp2_;
+		GstMessageType _tmp3_;
+		_tmp2_ = message;
+		_tmp3_ = _tmp2_->type;
+		if (_tmp3_ == GST_MESSAGE_STATE_CHANGED) {
+			GstMessage* _tmp4_;
+			GstObject* _tmp5_;
+			GstPipeline* _tmp6_;
+			GstState old_state = 0;
+			GstState new_state = 0;
+			GstMessage* _tmp7_;
+			GstState _tmp8_ = 0;
+			GstState _tmp9_ = 0;
+			gboolean _tmp10_ = FALSE;
+			GstState _tmp11_;
+			gboolean _tmp13_;
+			RygelHTTPSeek* _tmp24_;
+			_tmp4_ = message;
+			_tmp5_ = _tmp4_->src;
+			_tmp6_ = self->priv->pipeline;
+			if (_tmp5_ != G_TYPE_CHECK_INSTANCE_CAST (_tmp6_, GST_TYPE_OBJECT, GstObject)) {
+				result = TRUE;
+				return result;
+			}
+			_tmp7_ = message;
+			gst_message_parse_state_changed (_tmp7_, &_tmp8_, &_tmp9_, NULL);
+			old_state = _tmp8_;
+			new_state = _tmp9_;
+			_tmp11_ = old_state;
+			if (_tmp11_ == GST_STATE_NULL) {
+				GstState _tmp12_;
+				_tmp12_ = new_state;
+				_tmp10_ = _tmp12_ == GST_STATE_READY;
+			} else {
+				_tmp10_ = FALSE;
+			}
+			_tmp13_ = _tmp10_;
+			if (_tmp13_) {
+				GstPipeline* _tmp14_;
+				GstElement* _tmp15_ = NULL;
+				GstElement* element;
+				GstElement* _tmp16_;
+				_tmp14_ = self->priv->pipeline;
+				_tmp15_ = gst_bin_get_by_name ((GstBin*) _tmp14_, "muxer");
+				element = _tmp15_;
+				_tmp16_ = element;
+				if (_tmp16_ != NULL) {
+					GstElement* _tmp17_;
+					GstElementFactory* _tmp18_ = NULL;
+					const gchar* _tmp19_ = NULL;
+					gchar* _tmp20_;
+					gchar* name;
+					const gchar* _tmp21_;
+					_tmp17_ = element;
+					_tmp18_ = gst_element_get_factory (_tmp17_);
+					_tmp19_ = gst_plugin_feature_get_name ((GstPluginFeature*) _tmp18_);
+					_tmp20_ = g_strdup (_tmp19_);
+					name = _tmp20_;
+					_tmp21_ = name;
+					if (g_strcmp0 (_tmp21_, "mp4mux") == 0) {
+						GstElement* _tmp22_;
+						GstElement* _tmp23_;
+						_tmp22_ = element;
+						_dynamic_set_streamable0 (_tmp22_, TRUE);
+						_tmp23_ = element;
+						_dynamic_set_fragment_duration1 (_tmp23_, 1000);
+					}
+					_g_free0 (name);
+				}
+				_gst_object_unref0 (element);
+			}
+			_tmp24_ = self->priv->seek;
+			if (_tmp24_ != NULL) {
+				gboolean _tmp25_ = FALSE;
+				GstState _tmp26_;
+				gboolean _tmp28_;
+				_tmp26_ = old_state;
+				if (_tmp26_ == GST_STATE_READY) {
+					GstState _tmp27_;
+					_tmp27_ = new_state;
+					_tmp25_ = _tmp27_ == GST_STATE_PAUSED;
+				} else {
+					_tmp25_ = FALSE;
+				}
+				_tmp28_ = _tmp25_;
+				if (_tmp28_) {
+					gboolean _tmp29_ = FALSE;
+					_tmp29_ = rygel_gst_data_source_perform_seek (self);
+					if (_tmp29_) {
+						GstPipeline* _tmp30_;
+						_tmp30_ = self->priv->pipeline;
+						gst_element_set_state ((GstElement*) _tmp30_, GST_STATE_PLAYING);
+					}
+				}
+			}
+		} else {
+			GError* err = NULL;
+			gchar* err_msg = NULL;
+			GstMessage* _tmp31_;
+			GstMessageType _tmp32_;
+			_tmp31_ = message;
+			_tmp32_ = _tmp31_->type;
+			if (_tmp32_ == GST_MESSAGE_ERROR) {
+				GstMessage* _tmp33_;
+				GError* _tmp34_ = NULL;
+				gchar* _tmp35_ = NULL;
+				const gchar* _tmp36_ = NULL;
+				GstPipeline* _tmp37_;
+				gchar* _tmp38_;
+				gchar* _tmp39_;
+				gchar* _tmp40_;
+				const gchar* _tmp41_;
+				_tmp33_ = message;
+				gst_message_parse_error (_tmp33_, &_tmp34_, &_tmp35_);
+				_g_error_free0 (err);
+				err = _tmp34_;
+				_g_free0 (err_msg);
+				err_msg = _tmp35_;
+				_tmp36_ = _ ("Error from pipeline %s: %s");
+				_tmp37_ = self->priv->pipeline;
+				_tmp38_ = gst_object_get_name ((GstObject*) _tmp37_);
+				_tmp39_ = _tmp38_;
+				_tmp40_ = _tmp39_;
+				_tmp41_ = err_msg;
+				g_critical (_tmp36_, _tmp40_, _tmp41_);
+				_g_free0 (_tmp40_);
+				ret = FALSE;
+			} else {
+				GstMessage* _tmp42_;
+				GstMessageType _tmp43_;
+				_tmp42_ = message;
+				_tmp43_ = _tmp42_->type;
+				if (_tmp43_ == GST_MESSAGE_WARNING) {
+					GstMessage* _tmp44_;
+					GError* _tmp45_ = NULL;
+					gchar* _tmp46_ = NULL;
+					const gchar* _tmp47_ = NULL;
+					GstPipeline* _tmp48_;
+					gchar* _tmp49_;
+					gchar* _tmp50_;
+					gchar* _tmp51_;
+					const gchar* _tmp52_;
+					_tmp44_ = message;
+					gst_message_parse_warning (_tmp44_, &_tmp45_, &_tmp46_);
+					_g_error_free0 (err);
+					err = _tmp45_;
+					_g_free0 (err_msg);
+					err_msg = _tmp46_;
+					_tmp47_ = _ ("Warning from pipeline %s: %s");
+					_tmp48_ = self->priv->pipeline;
+					_tmp49_ = gst_object_get_name ((GstObject*) _tmp48_);
+					_tmp50_ = _tmp49_;
+					_tmp51_ = _tmp50_;
+					_tmp52_ = err_msg;
+					g_warning (_tmp47_, _tmp51_, _tmp52_);
+					_g_free0 (_tmp51_);
+				}
+			}
+			_g_free0 (err_msg);
+			_g_error_free0 (err);
+		}
+	}
+	_tmp53_ = ret;
+	if (!_tmp53_) {
+		g_idle_add_full (G_PRIORITY_DEFAULT, ____lambda3__gsource_func, g_object_ref (self), g_object_unref);
+	}
+	result = ret;
+	return result;
+}
+
+
+static gboolean rygel_gst_data_source_perform_seek (RygelGstDataSource* self) {
+	gboolean result = FALSE;
+	gboolean _tmp0_ = FALSE;
+	RygelHTTPSeek* _tmp1_;
+	gboolean _tmp8_;
+	GstSeekType stop_type;
+	GstFormat format = 0;
+	GstSeekFlags flags;
+	gint64 start = 0LL;
+	gint64 stop = 0LL;
+	RygelHTTPSeek* _tmp9_;
+	RygelHTTPSeekType _tmp10_;
+	RygelHTTPSeekType _tmp11_;
+	RygelHTTPSeek* _tmp26_;
+	gint64 _tmp27_;
+	gint64 _tmp28_;
+	GstPipeline* _tmp29_;
+	GstFormat _tmp30_;
+	GstSeekFlags _tmp31_;
+	gint64 _tmp32_;
+	GstSeekType _tmp33_;
+	gint64 _tmp34_;
+	gboolean _tmp35_ = FALSE;
+	g_return_val_if_fail (self != NULL, FALSE);
+	_tmp1_ = self->priv->seek;
+	if (_tmp1_ != NULL) {
+		RygelHTTPSeek* _tmp2_;
+		gint64 _tmp3_;
+		gint64 _tmp4_;
+		RygelHTTPSeek* _tmp5_;
+		gint64 _tmp6_;
+		gint64 _tmp7_;
+		_tmp2_ = self->priv->seek;
+		_tmp3_ = rygel_http_seek_get_length (_tmp2_);
+		_tmp4_ = _tmp3_;
+		_tmp5_ = self->priv->seek;
+		_tmp6_ = rygel_http_seek_get_total_length (_tmp5_);
+		_tmp7_ = _tmp6_;
+		_tmp0_ = _tmp4_ >= _tmp7_;
+	} else {
+		_tmp0_ = FALSE;
+	}
+	_tmp8_ = _tmp0_;
+	if (_tmp8_) {
+		result = TRUE;
+		return result;
+	}
+	stop_type = GST_SEEK_TYPE_NONE;
+	flags = GST_SEEK_FLAG_FLUSH;
+	_tmp9_ = self->priv->seek;
+	_tmp10_ = rygel_http_seek_get_seek_type (_tmp9_);
+	_tmp11_ = _tmp10_;
+	if (_tmp11_ == RYGEL_HTTP_SEEK_TYPE_TIME) {
+		GstSeekFlags _tmp12_;
+		RygelHTTPSeek* _tmp13_;
+		gint64 _tmp14_;
+		gint64 _tmp15_;
+		RygelHTTPSeek* _tmp16_;
+		gint64 _tmp17_;
+		gint64 _tmp18_;
+		format = GST_FORMAT_TIME;
+		_tmp12_ = flags;
+		flags = _tmp12_ | GST_SEEK_FLAG_KEY_UNIT;
+		_tmp13_ = self->priv->seek;
+		_tmp14_ = rygel_http_seek_get_start (_tmp13_);
+		_tmp15_ = _tmp14_;
+		start = _tmp15_ * GST_USECOND;
+		_tmp16_ = self->priv->seek;
+		_tmp17_ = rygel_http_seek_get_stop (_tmp16_);
+		_tmp18_ = _tmp17_;
+		stop = _tmp18_ * GST_USECOND;
+	} else {
+		GstSeekFlags _tmp19_;
+		RygelHTTPSeek* _tmp20_;
+		gint64 _tmp21_;
+		gint64 _tmp22_;
+		RygelHTTPSeek* _tmp23_;
+		gint64 _tmp24_;
+		gint64 _tmp25_;
+		format = GST_FORMAT_BYTES;
+		_tmp19_ = flags;
+		flags = _tmp19_ | GST_SEEK_FLAG_ACCURATE;
+		_tmp20_ = self->priv->seek;
+		_tmp21_ = rygel_http_seek_get_start (_tmp20_);
+		_tmp22_ = _tmp21_;
+		start = _tmp22_;
+		_tmp23_ = self->priv->seek;
+		_tmp24_ = rygel_http_seek_get_stop (_tmp23_);
+		_tmp25_ = _tmp24_;
+		stop = _tmp25_;
+	}
+	_tmp26_ = self->priv->seek;
+	_tmp27_ = rygel_http_seek_get_stop (_tmp26_);
+	_tmp28_ = _tmp27_;
+	if (_tmp28_ > ((gint64) 0)) {
+		stop_type = GST_SEEK_TYPE_SET;
+	}
+	_tmp29_ = self->priv->pipeline;
+	_tmp30_ = format;
+	_tmp31_ = flags;
+	_tmp32_ = start;
+	_tmp33_ = stop_type;
+	_tmp34_ = stop;
+	_tmp35_ = gst_element_seek ((GstElement*) _tmp29_, 1.0, _tmp30_, _tmp31_, GST_SEEK_TYPE_SET, _tmp32_, _tmp33_, _tmp34_ + 1);
+	if (!_tmp35_) {
+		const gchar* _tmp36_ = NULL;
+		RygelHTTPSeek* _tmp37_;
+		gint64 _tmp38_;
+		gint64 _tmp39_;
+		RygelHTTPSeek* _tmp40_;
+		gint64 _tmp41_;
+		gint64 _tmp42_;
+		const gchar* _tmp43_ = NULL;
+		GError* _tmp44_;
+		GError* _tmp45_;
+		_tmp36_ = _ ("Failed to seek to offsets %lld:%lld");
+		_tmp37_ = self->priv->seek;
+		_tmp38_ = rygel_http_seek_get_start (_tmp37_);
+		_tmp39_ = _tmp38_;
+		_tmp40_ = self->priv->seek;
+		_tmp41_ = rygel_http_seek_get_stop (_tmp40_);
+		_tmp42_ = _tmp41_;
+		g_warning (_tmp36_, _tmp39_, _tmp42_);
+		_tmp43_ = _ ("Failed to seek");
+		_tmp44_ = g_error_new_literal (RYGEL_DATA_SOURCE_ERROR, RYGEL_DATA_SOURCE_ERROR_SEEK_FAILED, _tmp43_);
+		_tmp45_ = _tmp44_;
+		g_signal_emit_by_name ((RygelDataSource*) self, "error", _tmp45_);
+		_g_error_free0 (_tmp45_);
+		result = FALSE;
+		return result;
+	}
+	result = TRUE;
+	return result;
+}
+
+
+static void rygel_gst_data_source_class_init (RygelGstDataSourceClass * klass) {
+	rygel_gst_data_source_parent_class = g_type_class_peek_parent (klass);
+	g_type_class_add_private (klass, sizeof (RygelGstDataSourcePrivate));
+	G_OBJECT_CLASS (klass)->finalize = rygel_gst_data_source_finalize;
+}
+
+
+static void rygel_gst_data_source_rygel_data_source_interface_init (RygelDataSourceIface * iface) {
+	rygel_gst_data_source_rygel_data_source_parent_iface = g_type_interface_peek_parent (iface);
+	iface->start = (void (*)(RygelDataSource*, RygelHTTPSeek*, GError**)) rygel_gst_data_source_real_start;
+	iface->freeze = (void (*)(RygelDataSource*)) rygel_gst_data_source_real_freeze;
+	iface->thaw = (void (*)(RygelDataSource*)) rygel_gst_data_source_real_thaw;
+	iface->stop = (void (*)(RygelDataSource*)) rygel_gst_data_source_real_stop;
+}
+
+
+static void rygel_gst_data_source_instance_init (RygelGstDataSource * self) {
+	self->priv = RYGEL_GST_DATA_SOURCE_GET_PRIVATE (self);
+	self->priv->seek = NULL;
+}
+
+
+static void rygel_gst_data_source_finalize (GObject* obj) {
+	RygelGstDataSource * self;
+	RygelGstSink* _tmp0_;
+	GstPipeline* _tmp3_;
+	self = G_TYPE_CHECK_INSTANCE_CAST (obj, RYGEL_TYPE_GST_DATA_SOURCE, RygelGstDataSource);
+	_tmp0_ = self->priv->sink;
+	if (_tmp0_ != NULL) {
+		RygelGstSink* _tmp1_;
+		GCancellable* _tmp2_;
+		_tmp1_ = self->priv->sink;
+		_tmp2_ = _tmp1_->cancellable;
+		g_cancellable_cancel (_tmp2_);
+	}
+	_tmp3_ = self->priv->pipeline;
+	if (_tmp3_ != NULL) {
+		GstPipeline* _tmp4_;
+		_tmp4_ = self->priv->pipeline;
+		gst_element_set_state ((GstElement*) _tmp4_, GST_STATE_NULL);
+	}
+	_gst_object_unref0 (self->src);
+	_gst_object_unref0 (self->priv->pipeline);
+	_g_object_unref0 (self->priv->seek);
+	_gst_object_unref0 (self->priv->sink);
+	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-media-engine.c b/src/rygel-gst-media-engine.c
new file mode 100644
index 0000000..8574591
--- /dev/null
+++ b/src/rygel-gst-media-engine.c
@@ -0,0 +1,623 @@
+/* rygel-gst-media-engine.c generated by valac 0.18.1, the Vala compiler
+ * generated from rygel-gst-media-engine.vala, do not modify */
+
+/*
+ * Copyright (C) 2012 Intel Corporation.
+ *
+ * Author: Jens Georg <jensg openismus com>
+ *
+ * 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.
+ */
+
+#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;
+};
+
+struct _RygelGstMediaEngineClass {
+	RygelMediaEngineClass parent_class;
+};
+
+struct _RygelGstMediaEnginePrivate {
+	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 _g_object_unref0_ (gpointer var) {
+	(var == NULL) ? NULL : (var = (g_object_unref (var), NULL));
+}
+
+
+static void _g_list_free__g_object_unref0_ (GList* self) {
+	g_list_foreach (self, (GFunc) _g_object_unref0_, NULL);
+	g_list_free (self);
+}
+
+
+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;
+}
+
+
+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;
+}
+
+
+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;
+}
+
+
+
diff --git a/src/rygel-gst-sink.c b/src/rygel-gst-sink.c
new file mode 100644
index 0000000..402afd6
--- /dev/null
+++ b/src/rygel-gst-sink.c
@@ -0,0 +1,481 @@
+/* rygel-gst-sink.c generated by valac 0.18.1, the Vala compiler
+ * generated from rygel-gst-sink.vala, do not modify */
+
+/*
+ * Copyright (C) 2011 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.
+ *
+ * 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.
+ */
+
+#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;
+#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;
+	gint64 chunks_buffered;
+	gint64 bytes_sent;
+	gint64 max_bytes;
+	GMutex buffer_mutex;
+	GCond buffer_condition;
+	RygelDataSource* source;
+	RygelHTTPSeek* offsets;
+	gboolean frozen;
+};
+
+struct _Block1Data {
+	int _ref_count_;
+	RygelGstSink * self;
+	GstBuffer* buffer;
+};
+
+
+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)
+#define RYGEL_GST_SINK_MIN_BUFFERED_CHUNKS ((guint) 4)
+RygelGstSink* rygel_gst_sink_new (RygelDataSource* source, RygelHTTPSeek* offsets);
+RygelGstSink* rygel_gst_sink_construct (GType object_type, RygelDataSource* source, RygelHTTPSeek* offsets);
+static void rygel_gst_sink_on_cancelled (RygelGstSink* self);
+static void _rygel_gst_sink_on_cancelled_g_cancellable_cancelled (GCancellable* _sender, gpointer self);
+void rygel_gst_sink_freeze (RygelGstSink* self);
+void rygel_gst_sink_thaw (RygelGstSink* self);
+static GstFlowReturn rygel_gst_sink_real_render (GstBaseSink* base, GstBuffer* buffer);
+static Block1Data* block1_data_ref (Block1Data* _data1_);
+static void block1_data_unref (void * _userdata_);
+static gboolean __lambda2_ (Block1Data* _data1_);
+gboolean rygel_gst_sink_push_data (RygelGstSink* self, GstBuffer* buffer);
+static gboolean ___lambda2__gsource_func (gpointer self);
+static void rygel_gst_sink_finalize (GObject* obj);
+static void _vala_clear_GMutex (GMutex * mutex);
+static void _vala_clear_GRecMutex (GRecMutex * mutex);
+static void _vala_clear_GRWLock (GRWLock * mutex);
+static void _vala_clear_GCond (GCond * mutex);
+
+
+static gpointer _g_object_ref0 (gpointer self) {
+	return self ? g_object_ref (self) : NULL;
+}
+
+
+static void _rygel_gst_sink_on_cancelled_g_cancellable_cancelled (GCancellable* _sender, gpointer self) {
+	rygel_gst_sink_on_cancelled (self);
+}
+
+
+RygelGstSink* rygel_gst_sink_construct (GType object_type, RygelDataSource* source, RygelHTTPSeek* offsets) {
+	RygelGstSink * self = NULL;
+	gint64 _tmp0_;
+	RygelDataSource* _tmp1_;
+	RygelHTTPSeek* _tmp2_;
+	RygelHTTPSeek* _tmp3_;
+	GCancellable* _tmp4_;
+	RygelHTTPSeek* _tmp5_;
+	GCancellable* _tmp12_;
+	g_return_val_if_fail (source != NULL, NULL);
+	self = (RygelGstSink*) g_object_new (object_type, NULL);
+	self->priv->chunks_buffered = (gint64) 0;
+	self->priv->bytes_sent = (gint64) 0;
+	_tmp0_ = G_MAXINT64;
+	self->priv->max_bytes = _tmp0_;
+	_tmp1_ = source;
+	self->priv->source = _tmp1_;
+	_tmp2_ = offsets;
+	_tmp3_ = _g_object_ref0 (_tmp2_);
+	_g_object_unref0 (self->priv->offsets);
+	self->priv->offsets = _tmp3_;
+	_tmp4_ = g_cancellable_new ();
+	_g_object_unref0 (self->cancellable);
+	self->cancellable = _tmp4_;
+	gst_base_sink_set_sync ((GstBaseSink*) self, FALSE);
+	gst_object_set_name ((GstObject*) self, RYGEL_GST_SINK_NAME);
+	self->priv->frozen = FALSE;
+	_tmp5_ = self->priv->offsets;
+	if (_tmp5_ != NULL) {
+		RygelHTTPSeek* _tmp6_;
+		RygelHTTPSeekType _tmp7_;
+		RygelHTTPSeekType _tmp8_;
+		_tmp6_ = self->priv->offsets;
+		_tmp7_ = rygel_http_seek_get_seek_type (_tmp6_);
+		_tmp8_ = _tmp7_;
+		if (_tmp8_ == RYGEL_HTTP_SEEK_TYPE_BYTE) {
+			RygelHTTPSeek* _tmp9_;
+			gint64 _tmp10_;
+			gint64 _tmp11_;
+			_tmp9_ = self->priv->offsets;
+			_tmp10_ = rygel_http_seek_get_length (_tmp9_);
+			_tmp11_ = _tmp10_;
+			self->priv->max_bytes = _tmp11_;
+		}
+	}
+	_tmp12_ = self->cancellable;
+	g_signal_connect_object (_tmp12_, "cancelled", (GCallback) _rygel_gst_sink_on_cancelled_g_cancellable_cancelled, self, 0);
+	return self;
+}
+
+
+RygelGstSink* rygel_gst_sink_new (RygelDataSource* source, RygelHTTPSeek* offsets) {
+	return rygel_gst_sink_construct (RYGEL_TYPE_GST_SINK, source, offsets);
+}
+
+
+void rygel_gst_sink_freeze (RygelGstSink* self) {
+	gboolean _tmp0_;
+	g_return_if_fail (self != NULL);
+	_tmp0_ = self->priv->frozen;
+	if (_tmp0_) {
+		return;
+	}
+	g_mutex_lock (&self->priv->buffer_mutex);
+	self->priv->frozen = TRUE;
+	g_mutex_unlock (&self->priv->buffer_mutex);
+}
+
+
+void rygel_gst_sink_thaw (RygelGstSink* self) {
+	gboolean _tmp0_;
+	g_return_if_fail (self != NULL);
+	_tmp0_ = self->priv->frozen;
+	if (!_tmp0_) {
+		return;
+	}
+	g_mutex_lock (&self->priv->buffer_mutex);
+	self->priv->frozen = FALSE;
+	g_cond_broadcast (&self->priv->buffer_condition);
+	g_mutex_unlock (&self->priv->buffer_mutex);
+}
+
+
+static gpointer _gst_buffer_ref0 (gpointer self) {
+	return self ? gst_buffer_ref (self) : NULL;
+}
+
+
+static Block1Data* block1_data_ref (Block1Data* _data1_) {
+	g_atomic_int_inc (&_data1_->_ref_count_);
+	return _data1_;
+}
+
+
+static void block1_data_unref (void * _userdata_) {
+	Block1Data* _data1_;
+	_data1_ = (Block1Data*) _userdata_;
+	if (g_atomic_int_dec_and_test (&_data1_->_ref_count_)) {
+		RygelGstSink * self;
+		self = _data1_->self;
+		_gst_buffer_unref0 (_data1_->buffer);
+		_gst_object_unref0 (self);
+		g_slice_free (Block1Data, _data1_);
+	}
+}
+
+
+static gboolean __lambda2_ (Block1Data* _data1_) {
+	RygelGstSink * self;
+	gboolean result = FALSE;
+	GstBuffer* _tmp0_;
+	gboolean _tmp1_ = FALSE;
+	self = _data1_->self;
+	_tmp0_ = _data1_->buffer;
+	_tmp1_ = rygel_gst_sink_push_data (self, _tmp0_);
+	result = _tmp1_;
+	return result;
+}
+
+
+static gboolean ___lambda2__gsource_func (gpointer self) {
+	gboolean result;
+	result = __lambda2_ (self);
+	return result;
+}
+
+
+static GstFlowReturn rygel_gst_sink_real_render (GstBaseSink* base, GstBuffer* buffer) {
+	RygelGstSink * self;
+	GstFlowReturn result = 0;
+	Block1Data* _data1_;
+	GstBuffer* _tmp0_;
+	GstBuffer* _tmp1_;
+	GCancellable* _tmp8_;
+	gboolean _tmp9_ = FALSE;
+	gint _tmp10_;
+	self = (RygelGstSink*) base;
+	g_return_val_if_fail (buffer != NULL, 0);
+	_data1_ = g_slice_new0 (Block1Data);
+	_data1_->_ref_count_ = 1;
+	_data1_->self = gst_object_ref (self);
+	_tmp0_ = buffer;
+	_tmp1_ = _gst_buffer_ref0 (_tmp0_);
+	_gst_buffer_unref0 (_data1_->buffer);
+	_data1_->buffer = _tmp1_;
+	g_mutex_lock (&self->priv->buffer_mutex);
+	while (TRUE) {
+		gboolean _tmp2_ = FALSE;
+		GCancellable* _tmp3_;
+		gboolean _tmp4_ = FALSE;
+		gboolean _tmp6_;
+		GMutex _tmp7_;
+		_tmp3_ = self->cancellable;
+		_tmp4_ = g_cancellable_is_cancelled (_tmp3_);
+		if (!_tmp4_) {
+			gboolean _tmp5_;
+			_tmp5_ = self->priv->frozen;
+			_tmp2_ = _tmp5_;
+		} else {
+			_tmp2_ = FALSE;
+		}
+		_tmp6_ = _tmp2_;
+		if (!_tmp6_) {
+			break;
+		}
+		_tmp7_ = self->priv->buffer_mutex;
+		g_cond_wait (&self->priv->buffer_condition, &_tmp7_);
+	}
+	g_mutex_unlock (&self->priv->buffer_mutex);
+	_tmp8_ = self->cancellable;
+	_tmp9_ = g_cancellable_is_cancelled (_tmp8_);
+	if (_tmp9_) {
+		result = GST_FLOW_OK;
+		block1_data_unref (_data1_);
+		_data1_ = NULL;
+		return result;
+	}
+	_tmp10_ = self->priv->priority;
+	g_idle_add_full (_tmp10_, ___lambda2__gsource_func, block1_data_ref (_data1_), block1_data_unref);
+	result = GST_FLOW_OK;
+	block1_data_unref (_data1_);
+	_data1_ = NULL;
+	return result;
+}
+
+
+gboolean rygel_gst_sink_push_data (RygelGstSink* self, GstBuffer* buffer) {
+	gboolean result = FALSE;
+	gint64 _tmp0_;
+	gint64 _tmp1_;
+	gint64 left;
+	gboolean _tmp2_ = FALSE;
+	GCancellable* _tmp3_;
+	gboolean _tmp4_ = FALSE;
+	gboolean _tmp6_;
+	GstBuffer* _tmp7_;
+	guint _tmp8_;
+	gint64 _tmp9_;
+	gint64 _tmp10_ = 0LL;
+	gint64 to_send;
+	RygelDataSource* _tmp11_;
+	GstBuffer* _tmp12_;
+	guint8* _tmp13_;
+	gint _tmp13__length1;
+	gint64 _tmp14_;
+	gint64 _tmp15_;
+	gint64 _tmp16_;
+	gint64 _tmp17_;
+	g_return_val_if_fail (self != NULL, FALSE);
+	g_return_val_if_fail (buffer != NULL, FALSE);
+	_tmp0_ = self->priv->max_bytes;
+	_tmp1_ = self->priv->bytes_sent;
+	left = _tmp0_ - _tmp1_;
+	_tmp3_ = self->cancellable;
+	_tmp4_ = g_cancellable_is_cancelled (_tmp3_);
+	if (_tmp4_) {
+		_tmp2_ = TRUE;
+	} else {
+		gint64 _tmp5_;
+		_tmp5_ = left;
+		_tmp2_ = _tmp5_ <= ((gint64) 0);
+	}
+	_tmp6_ = _tmp2_;
+	if (_tmp6_) {
+		result = FALSE;
+		return result;
+	}
+	_tmp7_ = buffer;
+	_tmp8_ = _tmp7_->size;
+	_tmp9_ = left;
+	_tmp10_ = MIN ((gint64) _tmp8_, _tmp9_);
+	to_send = _tmp10_;
+	_tmp11_ = self->priv->source;
+	_tmp12_ = buffer;
+	_tmp13_ = _tmp12_->data;
+	_tmp13__length1 = (gint) _tmp12_->size;
+	_tmp14_ = to_send;
+	g_signal_emit_by_name (_tmp11_, "data-available", _tmp13_ + 0, _tmp14_ - 0);
+	_tmp15_ = self->priv->chunks_buffered;
+	self->priv->chunks_buffered = _tmp15_ + 1;
+	_tmp16_ = self->priv->bytes_sent;
+	_tmp17_ = to_send;
+	self->priv->bytes_sent = _tmp16_ + _tmp17_;
+	result = FALSE;
+	return result;
+}
+
+
+static void rygel_gst_sink_on_cancelled (RygelGstSink* self) {
+	g_return_if_fail (self != NULL);
+	g_mutex_lock (&self->priv->buffer_mutex);
+	g_cond_broadcast (&self->priv->buffer_condition);
+	g_mutex_unlock (&self->priv->buffer_mutex);
+}
+
+
+static gpointer _gst_caps_ref0 (gpointer self) {
+	return self ? gst_caps_ref (self) : NULL;
+}
+
+
+static void rygel_gst_sink_class_init (RygelGstSinkClass * klass) {
+	GstCaps* _tmp0_;
+	GstCaps* caps;
+	GstCaps* _tmp1_;
+	GstCaps* _tmp2_;
+	GstPadTemplate* _tmp3_;
+	GstPadTemplate* template;
+	GstPadTemplate* _tmp4_;
+	rygel_gst_sink_parent_class = g_type_class_peek_parent (klass);
+	g_type_class_add_private (klass, sizeof (RygelGstSinkPrivate));
+	GST_BASE_SINK_CLASS (klass)->render = rygel_gst_sink_real_render;
+	G_OBJECT_CLASS (klass)->finalize = rygel_gst_sink_finalize;
+	_tmp0_ = gst_caps_new_any ();
+	caps = _tmp0_;
+	_tmp1_ = caps;
+	_tmp2_ = _gst_caps_ref0 (_tmp1_);
+	_tmp3_ = gst_pad_template_new (RYGEL_GST_SINK_PAD_NAME, GST_PAD_SINK, GST_PAD_ALWAYS, _tmp2_);
+	gst_object_ref_sink (_tmp3_);
+	template = _tmp3_;
+	_tmp4_ = template;
+	gst_element_class_add_pad_template (GST_ELEMENT_CLASS (klass), _tmp4_);
+	_gst_object_unref0 (template);
+	_gst_caps_unref0 (caps);
+}
+
+
+static void rygel_gst_sink_instance_init (RygelGstSink * self) {
+	GMutex _tmp0_ = {0};
+	GCond _tmp1_ = {0};
+	self->priv = RYGEL_GST_SINK_GET_PRIVATE (self);
+	g_mutex_init (&_tmp0_);
+	self->priv->buffer_mutex = _tmp0_;
+	g_cond_init (&_tmp1_);
+	self->priv->buffer_condition = _tmp1_;
+}
+
+
+static void rygel_gst_sink_finalize (GObject* obj) {
+	RygelGstSink * self;
+	self = G_TYPE_CHECK_INSTANCE_CAST (obj, RYGEL_TYPE_GST_SINK, RygelGstSink);
+	_g_object_unref0 (self->cancellable);
+	_vala_clear_GMutex (&self->priv->buffer_mutex);
+	_vala_clear_GCond (&self->priv->buffer_condition);
+	_g_object_unref0 (self->priv->offsets);
+	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))) {
+		g_mutex_clear (mutex);
+		memset (mutex, 0, sizeof (GMutex));
+	}
+}
+
+
+static void _vala_clear_GRecMutex (GRecMutex * mutex) {
+	GRecMutex zero_mutex = { 0 };
+	if (memcmp (mutex, &zero_mutex, sizeof (GRecMutex))) {
+		g_rec_mutex_clear (mutex);
+		memset (mutex, 0, sizeof (GRecMutex));
+	}
+}
+
+
+static void _vala_clear_GRWLock (GRWLock * mutex) {
+	GRWLock zero_mutex = { 0 };
+	if (memcmp (mutex, &zero_mutex, sizeof (GRWLock))) {
+		g_rw_lock_clear (mutex);
+		memset (mutex, 0, sizeof (GRWLock));
+	}
+}
+
+
+static void _vala_clear_GCond (GCond * mutex) {
+	GCond zero_mutex = { 0 };
+	if (memcmp (mutex, &zero_mutex, sizeof (GCond))) {
+		g_cond_clear (mutex);
+		memset (mutex, 0, sizeof (GCond));
+	}
+}
+
+
+
diff --git a/src/rygel-gst-transcoder.c b/src/rygel-gst-transcoder.c
new file mode 100644
index 0000000..d36da49
--- /dev/null
+++ b/src/rygel-gst-transcoder.c
@@ -0,0 +1,622 @@
+/* rygel-gst-transcoder.c generated by valac 0.18.1, the Vala compiler
+ * generated from rygel-gst-transcoder.vala, do not modify */
+
+/*
+ * 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.
+ *
+ * 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.
+ */
+
+#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;
+
+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
+};
+#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;
+}
+
+
+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);
+}
+
+
+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 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);
+}
+
+
+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 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 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;
+}
+
+
+/**
+     * 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;
+}
+
+
+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);
+	}
+}
+
+
+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;
+}
+
+
+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");
+}
+
+
+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_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_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);
+}
+
+
+/**
+ * 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;
+}
+
+
+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 _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;
+	}
+}
+
+
+
diff --git a/src/rygel-gst-utils.c b/src/rygel-gst-utils.c
new file mode 100644
index 0000000..5938c39
--- /dev/null
+++ b/src/rygel-gst-utils.c
@@ -0,0 +1,577 @@
+/* rygel-gst-utils.c generated by valac 0.18.1, the Vala compiler
+ * generated from rygel-gst-utils.vala, do not modify */
+
+/*
+ * Copyright (C) 2009 Nokia Corporation.
+ *
+ * Author: Zeeshan Ali (Khattak) <zeeshanak gnome org>
+ *                               <zeeshan ali nokia com>
+ *
+ * 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.
+ */
+
+#include <glib.h>
+#include <glib-object.h>
+#include <stdlib.h>
+#include <string.h>
+#include <gst/gst.h>
+#include <glib/gi18n-lib.h>
+#include <gst/pbutils/pbutils.h>
+#include <gobject/gvaluecollector.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;
+	const gchar* _tmp0_;
+	const gchar* _tmp1_;
+	GstElement* _tmp2_ = NULL;
+	GstElement* element;
+	GstElement* _tmp3_;
+	GError * _inner_error_ = NULL;
+	g_return_val_if_fail (factoryname != NULL, NULL);
+	_tmp0_ = factoryname;
+	_tmp1_ = name;
+	_tmp2_ = gst_element_factory_make (_tmp0_, _tmp1_);
+	if (_tmp2_ != NULL) {
+		gst_object_ref_sink (_tmp2_);
+	}
+	element = _tmp2_;
+	_tmp3_ = element;
+	if (_tmp3_ == NULL) {
+		const gchar* _tmp4_ = NULL;
+		const gchar* _tmp5_;
+		GError* _tmp6_;
+		_tmp4_ = _ ("Required element %s missing");
+		_tmp5_ = factoryname;
+		_tmp6_ = g_error_new (RYGEL_GST_ERROR, RYGEL_GST_ERROR_MISSING_PLUGIN, _tmp4_, _tmp5_);
+		_inner_error_ = _tmp6_;
+		g_propagate_error (error, _inner_error_);
+		_gst_object_unref0 (element);
+		return NULL;
+	}
+	result = element;
+	return result;
+}
+
+
+static inline void _dynamic_set_blocksize4 (GstElement* obj, glong value) {
+	g_object_set (obj, "blocksize", value, NULL);
+}
+
+
+static inline void _dynamic_set_tcp_timeout5 (GstElement* obj, gint64 value) {
+	g_object_set (obj, "tcp-timeout", value, NULL);
+}
+
+
+GstElement* rygel_gst_utils_create_source_for_uri (const gchar* uri) {
+	GstElement* result = NULL;
+	const gchar* _tmp0_;
+	GstElement* _tmp1_ = NULL;
+	GstElement* src;
+	GstElement* _tmp2_;
+	g_return_val_if_fail (uri != NULL, NULL);
+	_tmp0_ = uri;
+	_tmp1_ = gst_element_make_from_uri (GST_URI_SRC, _tmp0_, NULL);
+	if (_tmp1_ != NULL) {
+		gst_object_ref_sink (_tmp1_);
+	}
+	src = _tmp1_;
+	_tmp2_ = src;
+	if (_tmp2_ != NULL) {
+		GstElement* _tmp3_;
+		gboolean _tmp4_ = FALSE;
+		GstElement* _tmp6_;
+		GObjectClass* _tmp7_ = NULL;
+		GParamSpec* _tmp8_ = NULL;
+		GstElement* _tmp10_;
+		GObjectClass* _tmp11_ = NULL;
+		GParamSpec* _tmp12_ = NULL;
+		_tmp3_ = src;
+		_tmp4_ = GST_OBJECT_IS_FLOATING ((GstObject*) _tmp3_);
+		if (_tmp4_) {
+			GstElement* _tmp5_;
+			_tmp5_ = src;
+			gst_object_ref_sink ((GstObject*) _tmp5_);
+		}
+		_tmp6_ = src;
+		_tmp7_ = G_OBJECT_GET_CLASS ((GObject*) _tmp6_);
+		_tmp8_ = g_object_class_find_property (_tmp7_, "blocksize");
+		if (_tmp8_ != NULL) {
+			GstElement* _tmp9_;
+			_tmp9_ = src;
+			_dynamic_set_blocksize4 (_tmp9_, (glong) 65536);
+		}
+		_tmp10_ = src;
+		_tmp11_ = G_OBJECT_GET_CLASS ((GObject*) _tmp10_);
+		_tmp12_ = g_object_class_find_property (_tmp11_, "tcp-timeout");
+		if (_tmp12_ != NULL) {
+			GstElement* _tmp13_;
+			_tmp13_ = src;
+			_dynamic_set_tcp_timeout5 (_tmp13_, (gint64) 60000000);
+		}
+	}
+	result = src;
+	return result;
+}
+
+
+static gpointer _gst_encoding_profile_ref0 (gpointer self) {
+	return self ? gst_encoding_profile_ref (self) : NULL;
+}
+
+
+void rygel_gst_utils_dump_encoding_profile (GstEncodingProfile* profile, gint indent) {
+	gint _tmp0_;
+	gchar* _tmp1_ = NULL;
+	gchar* indent_s;
+	const gchar* _tmp2_;
+	gchar* _tmp3_;
+	gchar* _tmp4_;
+	GstEncodingProfile* _tmp5_;
+	const gchar* _tmp6_ = NULL;
+	const gchar* _tmp7_;
+	gchar* _tmp8_;
+	gchar* _tmp9_;
+	GstEncodingProfile* _tmp10_;
+	GstCaps* _tmp11_ = NULL;
+	gchar* _tmp12_ = NULL;
+	gchar* _tmp13_;
+	GstEncodingProfile* _tmp14_;
+	GstCaps* _tmp15_ = NULL;
+	GstEncodingProfile* _tmp23_;
+	g_return_if_fail (profile != NULL);
+	_tmp0_ = indent;
+	_tmp1_ = g_strnfill ((gsize) _tmp0_, ' ');
+	indent_s = _tmp1_;
+	_tmp2_ = indent_s;
+	_tmp3_ = g_strconcat (_tmp2_, "%s:", NULL);
+	_tmp4_ = _tmp3_;
+	_tmp5_ = profile;
+	_tmp6_ = gst_encoding_profile_get_name (_tmp5_);
+	g_debug (_tmp4_, _tmp6_);
+	_g_free0 (_tmp4_);
+	_tmp7_ = indent_s;
+	_tmp8_ = g_strconcat (_tmp7_, "  Format: %s", NULL);
+	_tmp9_ = _tmp8_;
+	_tmp10_ = profile;
+	_tmp11_ = gst_encoding_profile_get_format (_tmp10_);
+	_tmp12_ = gst_caps_to_string (_tmp11_);
+	_tmp13_ = _tmp12_;
+	g_debug (_tmp9_, _tmp13_);
+	_g_free0 (_tmp13_);
+	_g_free0 (_tmp9_);
+	_tmp14_ = profile;
+	_tmp15_ = gst_encoding_profile_get_restriction (_tmp14_);
+	if (_tmp15_ != NULL) {
+		const gchar* _tmp16_;
+		gchar* _tmp17_;
+		gchar* _tmp18_;
+		GstEncodingProfile* _tmp19_;
+		GstCaps* _tmp20_ = NULL;
+		gchar* _tmp21_ = NULL;
+		gchar* _tmp22_;
+		_tmp16_ = indent_s;
+		_tmp17_ = g_strconcat (_tmp16_, "  Restriction: %s", NULL);
+		_tmp18_ = _tmp17_;
+		_tmp19_ = profile;
+		_tmp20_ = gst_encoding_profile_get_restriction (_tmp19_);
+		_tmp21_ = gst_caps_to_string (_tmp20_);
+		_tmp22_ = _tmp21_;
+		g_debug (_tmp18_, _tmp22_);
+		_g_free0 (_tmp22_);
+		_g_free0 (_tmp18_);
+	}
+	_tmp23_ = profile;
+	if (G_TYPE_CHECK_INSTANCE_TYPE (_tmp23_, GST_TYPE_ENCODING_CONTAINER_PROFILE)) {
+		GstEncodingProfile* _tmp24_;
+		GstEncodingContainerProfile* _tmp25_;
+		GstEncodingContainerProfile* container;
+		GstEncodingContainerProfile* _tmp26_;
+		GList* _tmp27_ = NULL;
+		_tmp24_ = profile;
+		_tmp25_ = _gst_encoding_profile_ref0 (G_TYPE_CHECK_INSTANCE_TYPE (_tmp24_, GST_TYPE_ENCODING_CONTAINER_PROFILE) ? ((GstEncodingContainerProfile*) _tmp24_) : NULL);
+		container = _tmp25_;
+		_tmp26_ = container;
+		_tmp27_ = gst_encoding_container_profile_get_profiles (_tmp26_);
+		{
+			GList* subprofile_collection = NULL;
+			GList* subprofile_it = NULL;
+			subprofile_collection = _tmp27_;
+			for (subprofile_it = subprofile_collection; subprofile_it != NULL; subprofile_it = subprofile_it->next) {
+				GstEncodingProfile* _tmp28_;
+				GstEncodingProfile* subprofile = NULL;
+				_tmp28_ = _gst_encoding_profile_ref0 ((GstEncodingProfile*) subprofile_it->data);
+				subprofile = _tmp28_;
+				{
+					GstEncodingProfile* _tmp29_;
+					gint _tmp30_;
+					_tmp29_ = subprofile;
+					_tmp30_ = indent;
+					rygel_gst_utils_dump_encoding_profile (_tmp29_, _tmp30_ + 4);
+					_gst_encoding_profile_unref0 (subprofile);
+				}
+			}
+		}
+		_gst_encoding_profile_unref0 (container);
+	}
+	_g_free0 (indent_s);
+}
+
+
+static void _gst_object_unref0_ (gpointer var) {
+	(var == NULL) ? NULL : (var = (gst_object_unref (var), NULL));
+}
+
+
+static void _g_list_free__gst_object_unref0_ (GList* self) {
+	g_list_foreach (self, (GFunc) _gst_object_unref0_, NULL);
+	g_list_free (self);
+}
+
+
+GstElement* rygel_gst_utils_get_rtp_depayloader (GstCaps* caps) {
+	GstElement* result = NULL;
+	GstCaps* _tmp0_;
+	gboolean _tmp1_ = FALSE;
+	GList* _tmp2_ = NULL;
+	GList* features;
+	GList* _tmp3_;
+	GstCaps* _tmp4_;
+	GList* _tmp5_ = NULL;
+	GList* _tmp6_;
+	gconstpointer _tmp7_;
+	const gchar* _tmp8_ = NULL;
+	g_return_val_if_fail (caps != NULL, NULL);
+	_tmp0_ = caps;
+	_tmp1_ = rygel_gst_utils_need_rtp_depayloader (_tmp0_);
+	if (!_tmp1_) {
+		result = NULL;
+		return result;
+	}
+	_tmp2_ = gst_element_factory_list_get_elements ((GstElementFactoryListType) GST_ELEMENT_FACTORY_TYPE_DEPAYLOADER, GST_RANK_NONE);
+	features = _tmp2_;
+	_tmp3_ = features;
+	_tmp4_ = caps;
+	_tmp5_ = gst_element_factory_list_filter (_tmp3_, _tmp4_, GST_PAD_SINK, FALSE);
+	__g_list_free__gst_object_unref0_0 (features);
+	features = _tmp5_;
+	_tmp6_ = features;
+	_tmp7_ = _tmp6_->data;
+	_tmp8_ = gst_plugin_feature_get_name ((GstPluginFeature*) ((GstElementFactory*) _tmp7_));
+	if (g_strcmp0 (_tmp8_, "rtpdepay") == 0) {
+		GList* _tmp9_;
+		GList* _tmp10_;
+		_tmp9_ = features;
+		_tmp10_ = _tmp9_->next;
+		if (_tmp10_ != NULL) {
+			GList* _tmp11_;
+			GList* _tmp12_;
+			gconstpointer _tmp13_;
+			GstElement* _tmp14_ = NULL;
+			_tmp11_ = features;
+			_tmp12_ = _tmp11_->next;
+			_tmp13_ = _tmp12_->data;
+			_tmp14_ = gst_element_factory_create ((GstElementFactory*) _tmp13_, NULL);
+			if (_tmp14_ != NULL) {
+				gst_object_ref_sink (_tmp14_);
+			}
+			result = _tmp14_;
+			__g_list_free__gst_object_unref0_0 (features);
+			return result;
+		}
+		result = NULL;
+		__g_list_free__gst_object_unref0_0 (features);
+		return result;
+	} else {
+		GList* _tmp15_;
+		gconstpointer _tmp16_;
+		GstElement* _tmp17_ = NULL;
+		_tmp15_ = features;
+		_tmp16_ = _tmp15_->data;
+		_tmp17_ = gst_element_factory_create ((GstElementFactory*) _tmp16_, NULL);
+		if (_tmp17_ != NULL) {
+			gst_object_ref_sink (_tmp17_);
+		}
+		result = _tmp17_;
+		__g_list_free__gst_object_unref0_0 (features);
+		return result;
+	}
+	__g_list_free__gst_object_unref0_0 (features);
+}
+
+
+static gpointer _gst_structure_copy0 (gpointer self) {
+	return self ? gst_structure_copy (self) : NULL;
+}
+
+
+static gboolean rygel_gst_utils_need_rtp_depayloader (GstCaps* caps) {
+	gboolean result = FALSE;
+	GstCaps* _tmp0_;
+	const GstStructure* _tmp1_ = NULL;
+	GstStructure* _tmp2_;
+	GstStructure* structure;
+	const gchar* _tmp3_ = NULL;
+	g_return_val_if_fail (caps != NULL, FALSE);
+	_tmp0_ = caps;
+	_tmp1_ = gst_caps_get_structure (_tmp0_, (guint) 0);
+	_tmp2_ = _gst_structure_copy0 (_tmp1_);
+	structure = _tmp2_;
+	_tmp3_ = gst_structure_get_name (structure);
+	result = g_strcmp0 (_tmp3_, "application/x-rtp") == 0;
+	_gst_structure_free0 (structure);
+	return result;
+}
+
+
+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-l16-transcoder.c b/src/rygel-l16-transcoder.c
new file mode 100644
index 0000000..690891f
--- /dev/null
+++ b/src/rygel-l16-transcoder.c
@@ -0,0 +1,447 @@
+/* rygel-l16-transcoder.c generated by valac 0.18.1, the Vala compiler
+ * generated from rygel-l16-transcoder.vala, do not modify */
+
+/*
+ * Copyright (C) 2009 Nokia Corporation.
+ *
+ * Author: Zeeshan Ali (Khattak) <zeeshanak gnome org>
+ *                               <zeeshan ali nokia com>
+ *
+ * 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.
+ */
+
+#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);
+};
+
+struct _RygelAudioTranscoder {
+	RygelGstTranscoder parent_instance;
+	RygelAudioTranscoderPrivate * priv;
+	gint audio_bitrate;
+	GstCaps* container_format;
+	GstCaps* audio_codec_format;
+};
+
+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;
+	}
+}
+
+
+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);
+}
+
+
+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;
+}
+
+
+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_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;
+}
+
+
+
diff --git a/src/rygel-mp2ts-transcoder.c b/src/rygel-mp2ts-transcoder.c
new file mode 100644
index 0000000..336755a
--- /dev/null
+++ b/src/rygel-mp2ts-transcoder.c
@@ -0,0 +1,393 @@
+/* rygel-mp2ts-transcoder.c generated by valac 0.18.1, the Vala compiler
+ * generated from rygel-mp2ts-transcoder.vala, do not modify */
+
+/*
+ * Copyright (C) 2009 Nokia Corporation.
+ *
+ * Author: Zeeshan Ali (Khattak) <zeeshanak gnome org>
+ *                               <zeeshan ali nokia com>
+ *
+ * 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.
+ */
+
+#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_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"
+#define RYGEL_MP2_TS_TRANSCODER_AUDIO_FORMAT "audio/mpeg,mpegversion=1,layer=2"
+#define RYGEL_MP2_TS_TRANSCODER_BASE_VIDEO_FORMAT "video/mpeg,mpegversion=2,systemstream=false"
+#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);
+
+static const gint RYGEL_MP2_TS_TRANSCODER_WIDTH[2] = {720, 1280};
+static const gint RYGEL_MP2_TS_TRANSCODER_HEIGHT[2] = {576, 720};
+static const gint RYGEL_MP2_TS_TRANSCODER_FRAME_RATE[2] = {25, 30};
+static const gchar* RYGEL_MP2_TS_TRANSCODER_PROFILES[2] = {"MPEG_TS_SD_EU_ISO", "MPEG_TS_HD_NA_ISO"};
+
+GType rygel_mp2_ts_profile_get_type (void) {
+	static volatile gsize rygel_mp2_ts_profile_type_id__volatile = 0;
+	if (g_once_init_enter (&rygel_mp2_ts_profile_type_id__volatile)) {
+		static const GEnumValue values[] = {{RYGEL_MP2_TS_PROFILE_SD, "RYGEL_MP2_TS_PROFILE_SD", "sd"}, {RYGEL_MP2_TS_PROFILE_HD, "RYGEL_MP2_TS_PROFILE_HD", "hd"}, {0, NULL, NULL}};
+		GType rygel_mp2_ts_profile_type_id;
+		rygel_mp2_ts_profile_type_id = g_enum_register_static ("RygelMP2TSProfile", values);
+		g_once_init_leave (&rygel_mp2_ts_profile_type_id__volatile, rygel_mp2_ts_profile_type_id);
+	}
+	return rygel_mp2_ts_profile_type_id__volatile;
+}
+
+
+RygelMP2TSTranscoder* rygel_mp2_ts_transcoder_construct (GType object_type, RygelMP2TSProfile profile) {
+	RygelMP2TSTranscoder * self = NULL;
+	RygelMP2TSProfile _tmp0_;
+	const gchar* _tmp1_;
+	RygelMP2TSProfile _tmp2_;
+	gint _tmp3_;
+	RygelMP2TSProfile _tmp4_;
+	gint _tmp5_;
+	RygelMP2TSProfile _tmp6_;
+	gint _tmp7_;
+	gchar* _tmp8_ = NULL;
+	gchar* _tmp9_;
+	RygelMP2TSProfile _tmp10_;
+	_tmp0_ = profile;
+	_tmp1_ = RYGEL_MP2_TS_TRANSCODER_PROFILES[_tmp0_];
+	_tmp2_ = profile;
+	_tmp3_ = RYGEL_MP2_TS_TRANSCODER_FRAME_RATE[_tmp2_];
+	_tmp4_ = profile;
+	_tmp5_ = RYGEL_MP2_TS_TRANSCODER_WIDTH[_tmp4_];
+	_tmp6_ = profile;
+	_tmp7_ = RYGEL_MP2_TS_TRANSCODER_HEIGHT[_tmp6_];
+	_tmp8_ = g_strdup_printf (RYGEL_MP2_TS_TRANSCODER_RESTRICTION_TEMPLATE, _tmp3_, _tmp5_, _tmp7_);
+	_tmp9_ = _tmp8_;
+	self = (RygelMP2TSTranscoder*) rygel_video_transcoder_construct (object_type, "video/mpeg", _tmp1_, RYGEL_MP2_TS_TRANSCODER_AUDIO_BITRATE, RYGEL_MP2_TS_TRANSCODER_VIDEO_BITRATE, RYGEL_MP2_TS_TRANSCODER_CONTAINER, RYGEL_MP2_TS_TRANSCODER_AUDIO_FORMAT, RYGEL_MP2_TS_TRANSCODER_BASE_VIDEO_FORMAT, "mpg", _tmp9_);
+	_g_free0 (_tmp9_);
+	_tmp10_ = profile;
+	self->priv->profile = _tmp10_;
+	return self;
+}
+
+
+RygelMP2TSTranscoder* rygel_mp2_ts_transcoder_new (RygelMP2TSProfile profile) {
+	return rygel_mp2_ts_transcoder_construct (RYGEL_TYPE_MP2_TS_TRANSCODER, profile);
+}
+
+
+static GUPnPDIDLLiteResource* rygel_mp2_ts_transcoder_real_add_resource (RygelTranscoder* base, GUPnPDIDLLiteItem* didl_item, RygelMediaItem* item, RygelTranscodeManager* manager, GError** error) {
+	RygelMP2TSTranscoder * self;
+	GUPnPDIDLLiteResource* result = NULL;
+	GUPnPDIDLLiteItem* _tmp0_;
+	RygelMediaItem* _tmp1_;
+	RygelTranscodeManager* _tmp2_;
+	GUPnPDIDLLiteResource* _tmp3_ = NULL;
+	GUPnPDIDLLiteResource* resource;
+	RygelMP2TSProfile _tmp4_;
+	gint _tmp5_;
+	RygelMP2TSProfile _tmp6_;
+	gint _tmp7_;
+	GError * _inner_error_ = NULL;
+	self = (RygelMP2TSTranscoder*) 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_mp2_ts_transcoder_parent_class)->add_resource ((RygelTranscoder*) G_TYPE_CHECK_INSTANCE_CAST (self, RYGEL_TYPE_VIDEO_TRANSCODER, RygelVideoTranscoder), _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->priv->profile;
+	_tmp5_ = RYGEL_MP2_TS_TRANSCODER_WIDTH[_tmp4_];
+	gupnp_didl_lite_resource_set_width (resource, _tmp5_);
+	_tmp6_ = self->priv->profile;
+	_tmp7_ = RYGEL_MP2_TS_TRANSCODER_HEIGHT[_tmp6_];
+	gupnp_didl_lite_resource_set_height (resource, _tmp7_);
+	gupnp_didl_lite_resource_set_bitrate (resource, ((RYGEL_MP2_TS_TRANSCODER_VIDEO_BITRATE + RYGEL_MP2_TS_TRANSCODER_AUDIO_BITRATE) * 1000) / 8);
+	result = resource;
+	return result;
+}
+
+
+static gpointer _g_object_ref0 (gpointer self) {
+	return self ? g_object_ref (self) : NULL;
+}
+
+
+static guint rygel_mp2_ts_transcoder_real_get_distance (RygelTranscoder* base, RygelMediaItem* item) {
+	RygelMP2TSTranscoder * self;
+	guint result = 0U;
+	RygelMediaItem* _tmp0_;
+	RygelMediaItem* _tmp2_;
+	RygelVideoItem* _tmp3_;
+	RygelVideoItem* video_item;
+	RygelMediaItem* _tmp4_;
+	guint _tmp5_ = 0U;
+	guint distance;
+	RygelVideoItem* _tmp6_;
+	gint _tmp7_;
+	gint _tmp8_;
+	RygelVideoItem* _tmp14_;
+	gint _tmp15_;
+	gint _tmp16_;
+	RygelVideoItem* _tmp24_;
+	gint _tmp25_;
+	gint _tmp26_;
+	self = (RygelMP2TSTranscoder*) 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_ = item;
+	_tmp5_ = RYGEL_TRANSCODER_CLASS (rygel_mp2_ts_transcoder_parent_class)->get_distance ((RygelTranscoder*) G_TYPE_CHECK_INSTANCE_CAST (self, RYGEL_TYPE_VIDEO_TRANSCODER, RygelVideoTranscoder), _tmp4_);
+	distance = _tmp5_;
+	_tmp6_ = video_item;
+	_tmp7_ = rygel_audio_item_get_bitrate ((RygelAudioItem*) _tmp6_);
+	_tmp8_ = _tmp7_;
+	if (_tmp8_ > 0) {
+		guint _tmp9_;
+		RygelVideoItem* _tmp10_;
+		gint _tmp11_;
+		gint _tmp12_;
+		gint _tmp13_ = 0;
+		_tmp9_ = distance;
+		_tmp10_ = video_item;
+		_tmp11_ = rygel_audio_item_get_bitrate ((RygelAudioItem*) _tmp10_);
+		_tmp12_ = _tmp11_;
+		_tmp13_ = abs (_tmp12_ - RYGEL_MP2_TS_TRANSCODER_VIDEO_BITRATE);
+		distance = _tmp9_ + _tmp13_;
+	}
+	_tmp14_ = video_item;
+	_tmp15_ = rygel_visual_item_get_width ((RygelVisualItem*) _tmp14_);
+	_tmp16_ = _tmp15_;
+	if (_tmp16_ > 0) {
+		guint _tmp17_;
+		RygelVideoItem* _tmp18_;
+		gint _tmp19_;
+		gint _tmp20_;
+		RygelMP2TSProfile _tmp21_;
+		gint _tmp22_;
+		gint _tmp23_ = 0;
+		_tmp17_ = distance;
+		_tmp18_ = video_item;
+		_tmp19_ = rygel_visual_item_get_width ((RygelVisualItem*) _tmp18_);
+		_tmp20_ = _tmp19_;
+		_tmp21_ = self->priv->profile;
+		_tmp22_ = RYGEL_MP2_TS_TRANSCODER_WIDTH[_tmp21_];
+		_tmp23_ = abs (_tmp20_ - _tmp22_);
+		distance = _tmp17_ + _tmp23_;
+	}
+	_tmp24_ = video_item;
+	_tmp25_ = rygel_visual_item_get_height ((RygelVisualItem*) _tmp24_);
+	_tmp26_ = _tmp25_;
+	if (_tmp26_ > 0) {
+		guint _tmp27_;
+		RygelVideoItem* _tmp28_;
+		gint _tmp29_;
+		gint _tmp30_;
+		RygelMP2TSProfile _tmp31_;
+		gint _tmp32_;
+		gint _tmp33_ = 0;
+		_tmp27_ = distance;
+		_tmp28_ = video_item;
+		_tmp29_ = rygel_visual_item_get_height ((RygelVisualItem*) _tmp28_);
+		_tmp30_ = _tmp29_;
+		_tmp31_ = self->priv->profile;
+		_tmp32_ = RYGEL_MP2_TS_TRANSCODER_HEIGHT[_tmp31_];
+		_tmp33_ = abs (_tmp30_ - _tmp32_);
+		distance = _tmp27_ + _tmp33_;
+	}
+	result = distance;
+	_g_object_unref0 (video_item);
+	return result;
+}
+
+
+static void rygel_mp2_ts_transcoder_class_init (RygelMP2TSTranscoderClass * klass) {
+	rygel_mp2_ts_transcoder_parent_class = g_type_class_peek_parent (klass);
+	g_type_class_add_private (klass, sizeof (RygelMP2TSTranscoderPrivate));
+	RYGEL_TRANSCODER_CLASS (klass)->add_resource = rygel_mp2_ts_transcoder_real_add_resource;
+	RYGEL_TRANSCODER_CLASS (klass)->get_distance = rygel_mp2_ts_transcoder_real_get_distance;
+	G_OBJECT_CLASS (klass)->finalize = rygel_mp2_ts_transcoder_finalize;
+}
+
+
+static void rygel_mp2_ts_transcoder_instance_init (RygelMP2TSTranscoder * self) {
+	self->priv = RYGEL_MP2_TS_TRANSCODER_GET_PRIVATE (self);
+}
+
+
+static void rygel_mp2_ts_transcoder_finalize (GObject* obj) {
+	RygelMP2TSTranscoder * self;
+	self = G_TYPE_CHECK_INSTANCE_CAST (obj, RYGEL_TYPE_MP2_TS_TRANSCODER, RygelMP2TSTranscoder);
+	G_OBJECT_CLASS (rygel_mp2_ts_transcoder_parent_class)->finalize (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-mp3-transcoder.c b/src/rygel-mp3-transcoder.c
new file mode 100644
index 0000000..165d7e4
--- /dev/null
+++ b/src/rygel-mp3-transcoder.c
@@ -0,0 +1,154 @@
+/* rygel-mp3-transcoder.c generated by valac 0.18.1, the Vala compiler
+ * generated from rygel-mp3-transcoder.vala, do not modify */
+
+/*
+ * Copyright (C) 2009 Nokia Corporation.
+ *
+ * Author: Zeeshan Ali (Khattak) <zeeshanak gnome org>
+ *                               <zeeshan ali nokia com>
+ *
+ * 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.
+ */
+
+#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>
+
+
+#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;
+};
+
+
+static gpointer rygel_mp3_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_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;
+	self = (RygelMP3Transcoder*) rygel_audio_transcoder_construct (object_type, "audio/mpeg", "MP3", RYGEL_MP3_TRANSCODER_BITRATE, RYGEL_AUDIO_TRANSCODER_NO_CONTAINER, RYGEL_MP3_TRANSCODER_FORMAT, "mp3");
+	return self;
+}
+
+
+RygelMP3Transcoder* rygel_mp3_transcoder_new (void) {
+	return rygel_mp3_transcoder_construct (RYGEL_TYPE_MP3_TRANSCODER);
+}
+
+
+static void rygel_mp3_transcoder_class_init (RygelMP3TranscoderClass * klass) {
+	rygel_mp3_transcoder_parent_class = g_type_class_peek_parent (klass);
+}
+
+
+static void rygel_mp3_transcoder_instance_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-video-transcoder.c b/src/rygel-video-transcoder.c
new file mode 100644
index 0000000..ec5cc3d
--- /dev/null
+++ b/src/rygel-video-transcoder.c
@@ -0,0 +1,368 @@
+/* rygel-video-transcoder.c generated by valac 0.18.1, the Vala compiler
+ * generated from rygel-video-transcoder.vala, do not modify */
+
+/*
+ * Copyright (C) 2011 Nokia Corporation.
+ *
+ * Author: Jens Georg <jensg openismus com>
+ *
+ * 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.
+ */
+
+#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_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;
+};
+
+struct _RygelVideoTranscoderPrivate {
+	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_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);
+}
+
+
+static gpointer _g_object_ref0 (gpointer self) {
+	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;
+}
+
+
+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;
+}
+
+
+static gpointer _gst_encoding_profile_ref0 (gpointer self) {
+	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;
+}
+
+
+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;
+}
+
+
+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_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);
+}
+
+
+/**
+ * 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-wmv-transcoder.c b/src/rygel-wmv-transcoder.c
new file mode 100644
index 0000000..8b27510
--- /dev/null
+++ b/src/rygel-wmv-transcoder.c
@@ -0,0 +1,170 @@
+/* rygel-wmv-transcoder.c generated by valac 0.18.1, the Vala compiler
+ * generated from rygel-wmv-transcoder.vala, do not modify */
+
+/*
+ * Copyright (C) 2009 Jens Georg <mail jensge org>.
+ *
+ * Author: Jens Georg <mail jensge org>
+ *
+ * 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.
+ */
+
+#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>
+
+
+#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;
+	self = (RygelWMVTranscoder*) rygel_video_transcoder_construct (object_type, "video/x-ms-wmv", "WMVHIGH_FULL", RYGEL_WMV_TRANSCODER_AUDIO_BITRATE, RYGEL_WMV_TRANSCODER_VIDEO_BITRATE, "video/x-ms-asf,parsed=true", "audio/x-wma,channels=2,wmaversion=1", "video/x-wmv,wmvversion=1", "wmv", NULL);
+	return self;
+}
+
+
+RygelWMVTranscoder* rygel_wmv_transcoder_new (void) {
+	return rygel_wmv_transcoder_construct (RYGEL_TYPE_WMV_TRANSCODER);
+}
+
+
+static void rygel_wmv_transcoder_class_init (RygelWMVTranscoderClass * klass) {
+	rygel_wmv_transcoder_parent_class = g_type_class_peek_parent (klass);
+}
+
+
+static void rygel_wmv_transcoder_instance_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;
+}
+
+
+



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