[rygel-gst-0-10-media-engine] Initial conversin from vala to C
- From: Murray Cumming <murrayc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [rygel-gst-0-10-media-engine] Initial conversin from vala to C
- Date: Tue, 18 Dec 2012 09:06:58 +0000 (UTC)
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]