summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README6
-rw-r--r--build/autotools/Makefile.am.release2
-rw-r--r--clutter-gst.doap7
-rw-r--r--clutter-gst/clutter-gst-player.c517
-rw-r--r--clutter-gst/clutter-gst-player.h58
-rw-r--r--clutter-gst/clutter-gst-video-actor.c17
-rw-r--r--clutter-gst/clutter-gst-video-sink.c2
-rw-r--r--doc/reference/clutter-gst-docs.sgml2
-rw-r--r--examples/video-player.c22
-rw-r--r--tests/test-start-stop.c26
10 files changed, 578 insertions, 81 deletions
diff --git a/README b/README
index fa90160..7525b7f 100644
--- a/README
+++ b/README
@@ -3,7 +3,7 @@ Clutter-GStreamer README
Clutter-Gst is an integration library for using GStreamer with Clutter.
It provides a GStreamer sink to upload frames to GL and an actor that
-implements the ClutterMedia interface using playbin2.
+implements the ClutterGstPlayer interface using playbin.
Clutter is an open source software library for creating fast, visually
rich and animated graphical user interfaces. It uses OpenGL for drawing
@@ -20,8 +20,8 @@ installing new plug-ins.
Clutter-GStreamer requires:
GLib >= 2.18.0
- Clutter >= 1.4.0
- GStreamer >= 0.10.20
+ Clutter >= 1.6.0
+ GStreamer >= 0.11.0
Copyright (C) 2006, 2007, 2008 OpenedHand
Copyright (C) 2009, 2010, 2011 Intel Corporation
diff --git a/build/autotools/Makefile.am.release b/build/autotools/Makefile.am.release
index f7077e6..fb39101 100644
--- a/build/autotools/Makefile.am.release
+++ b/build/autotools/Makefile.am.release
@@ -81,7 +81,7 @@ release-message: $(sha256_file)
@echo ""
@echo "Clutter-Gst is an integration library for using GStreamer with Clutter."
@echo "It provides a GStreamer sink to upload frames to GL and an actor that"
- @echo "implements the ClutterMedia interface using playbin2."
+ @echo "implements the ClutterGstPlayer interface using playbin."
@echo ""
@echo "Clutter-gst depends on:"
@echo ""
diff --git a/clutter-gst.doap b/clutter-gst.doap
index 8c7a317..9e6e7c5 100644
--- a/clutter-gst.doap
+++ b/clutter-gst.doap
@@ -11,11 +11,8 @@
<shortdesc xml:lang="en">A GStreamer integration library for Clutter</shortdesc>
- <description xml:lang="en">Clutter-Gst is a gstreamer based clutter actor
- implementing the ClutterMedia interface. It provides video playback on a
- clutter texture.
- The library can also be used for its cluttersink Gstreamer element to build
- more complex pipelines.</description>
+ <description xml:lang="en">Clutter-Gst is an integration library for using
+ GStreamer with Clutter.</description>
<homepage rdf:resource="http://clutter-project.org" />
<license rdf:resource="http://usefulinc.com/doap/licenses/lgpl" />
diff --git a/clutter-gst/clutter-gst-player.c b/clutter-gst/clutter-gst-player.c
index 25a10e6..a9c508b 100644
--- a/clutter-gst/clutter-gst-player.c
+++ b/clutter-gst/clutter-gst-player.c
@@ -7,8 +7,13 @@
*
* Authored By Damien Lespiau <damien.lespiau@intel.com>
* Lionel Landwerlin <lionel.g.landwerlin@linux.intel.com>
+ * Matthew Allum <mallum@openedhand.com>
+ * Emmanuele Bassi <ebassi@linux.intel.com>
+ * Andre Moreira Magalhaes <andre.magalhaes@collabora.co.uk>
*
- * Copyright (C) 2011 Intel Corporation
+ * Copyright (C) 2006 OpenedHand
+ * Copyright (C) 2009-2011 Intel Corporation
+ * Copyright (C) 2012 Collabora Ltd. <http://www.collabora.co.uk/>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -34,11 +39,6 @@
* sources. Contrary to most interfaces, you don't need to implement
* #ClutterGstPlayer. It already provides an implementation/logic
* leaving you only tweak a few properties to get the desired behavior.
- *
- * #ClutterGstPlayer extends and implements #ClutterMedia to create
- * enhanced player.
- *
- * #ClutterMedia is available since Clutter 0.2
*/
#ifdef HAVE_CONFIG_H
@@ -66,9 +66,7 @@
typedef ClutterGstPlayerIface ClutterGstPlayerInterface;
-G_DEFINE_INTERFACE_WITH_CODE (ClutterGstPlayer, clutter_gst_player, G_TYPE_OBJECT,
- g_type_interface_add_prerequisite (g_define_type_id,
- CLUTTER_TYPE_MEDIA))
+G_DEFINE_INTERFACE (ClutterGstPlayer, clutter_gst_player, G_TYPE_OBJECT)
#define PLAYER_GET_PRIVATE(player) \
(g_object_get_qdata (G_OBJECT (player), \
@@ -88,7 +86,9 @@ G_DEFINE_INTERFACE_WITH_CODE (ClutterGstPlayer, clutter_gst_player, G_TYPE_OBJEC
enum
{
- DOWNLOAD_BUFFERING,
+ EOS_SIGNAL,
+ ERROR_SIGNAL, /* can't be called 'ERROR' otherwise it clashes with wingdi.h */
+ DOWNLOAD_BUFFERING_SIGNAL,
LAST_SIGNAL
};
@@ -97,7 +97,7 @@ enum
{
PROP_0,
- /* ClutterMedia properties */
+ /* ClutterGstPlayer properties */
PROP_URI,
PROP_PLAYING,
PROP_PROGRESS,
@@ -107,8 +107,6 @@ enum
PROP_CAN_SEEK,
PROP_BUFFER_FILL,
PROP_DURATION,
-
- /* ClutterGstPlayer properties */
PROP_IDLE,
PROP_USER_AGENT,
PROP_SEEK_FLAGS,
@@ -850,7 +848,7 @@ player_buffering_timeout (gpointer data)
start_d = (gdouble) start / GST_FORMAT_PERCENT_MAX;
stop_d = (gdouble) stop / GST_FORMAT_PERCENT_MAX;
- g_signal_emit (player, signals[DOWNLOAD_BUFFERING], 0, start_d, stop_d);
+ g_signal_emit (player, signals[DOWNLOAD_BUFFERING_SIGNAL], 0, start_d, stop_d);
/* handle the "virtual stream buffer" and the associated pipeline state.
* We pause the pipeline until 2s of content is buffered. With the current
@@ -915,7 +913,7 @@ bus_message_error_cb (GstBus *bus,
gst_element_set_state (priv->pipeline, GST_STATE_NULL);
gst_message_parse_error (message, &error, NULL);
- g_signal_emit_by_name (player, "error", error);
+ g_signal_emit (player, signals[ERROR_SIGNAL], 0, error);
g_error_free (error);
priv->is_idle = TRUE;
@@ -944,7 +942,7 @@ bus_message_eos_cb (GstBus *bus,
gst_element_set_state (priv->pipeline, GST_STATE_READY);
- g_signal_emit_by_name (player, "eos");
+ g_signal_emit (player, signals[EOS_SIGNAL], 0);
g_object_notify (G_OBJECT (player), "progress");
gst_element_get_state (priv->pipeline, &state, &pending, 0);
@@ -1565,7 +1563,7 @@ clutter_gst_player_class_init (GObjectClass *object_class)
object_class->set_property = clutter_gst_player_set_property;
object_class->get_property = clutter_gst_player_get_property;
- /* Override ClutterMedia's properties */
+ /* Override ClutterGstPlayer's properties */
g_object_class_override_property (object_class,
PROP_URI, "uri");
g_object_class_override_property (object_class,
@@ -1586,7 +1584,6 @@ clutter_gst_player_class_init (GObjectClass *object_class)
g_object_class_override_property (object_class,
PROP_BUFFER_FILL, "buffer-fill");
- /* Override ClutterGstPlayer's properties */
g_object_class_override_property (object_class,
PROP_IDLE, "idle");
g_object_class_override_property (object_class,
@@ -2146,6 +2143,127 @@ clutter_gst_player_default_init (ClutterGstPlayerIface *iface)
GParamSpec *pspec;
/**
+ * ClutterGstPlayer:uri:
+ *
+ * The location of a media file, expressed as a valid URI.
+ */
+ pspec = g_param_spec_string ("uri",
+ "URI",
+ "URI of a media file",
+ NULL,
+ CLUTTER_GST_PARAM_READWRITE |
+ G_PARAM_DEPRECATED);
+ g_object_interface_install_property (iface, pspec);
+
+ /**
+ * ClutterGstPlayer:playing:
+ *
+ * Whether the #ClutterGstPlayer actor is playing.
+ */
+ pspec = g_param_spec_boolean ("playing",
+ "Playing",
+ "Whether the player is playing",
+ FALSE,
+ CLUTTER_GST_PARAM_READWRITE |
+ G_PARAM_DEPRECATED);
+ g_object_interface_install_property (iface, pspec);
+
+ /**
+ * ClutterGstPlayer:progress:
+ *
+ * The current progress of the playback, as a normalized
+ * value between 0.0 and 1.0.
+ */
+ pspec = g_param_spec_double ("progress",
+ "Progress",
+ "Current progress of the playback",
+ 0.0, 1.0, 0.0,
+ CLUTTER_GST_PARAM_READWRITE |
+ G_PARAM_DEPRECATED);
+ g_object_interface_install_property (iface, pspec);
+
+ /**
+ * ClutterGstPlayer:subtitle-uri:
+ *
+ * The location of a subtitle file, expressed as a valid URI.
+ */
+ pspec = g_param_spec_string ("subtitle-uri",
+ "Subtitle URI",
+ "URI of a subtitle file",
+ NULL,
+ CLUTTER_GST_PARAM_READWRITE |
+ G_PARAM_DEPRECATED);
+ g_object_interface_install_property (iface, pspec);
+
+ /**
+ * ClutterGstPlayer:subtitle-font-name:
+ *
+ * The font used to display subtitles. The font description has to
+ * follow the same grammar as the one recognized by
+ * pango_font_description_from_string().
+ */
+ pspec = g_param_spec_string ("subtitle-font-name",
+ "Subtitle Font Name",
+ "The font used to display subtitles",
+ NULL,
+ CLUTTER_GST_PARAM_READWRITE |
+ G_PARAM_DEPRECATED);
+ g_object_interface_install_property (iface, pspec);
+
+ /**
+ * ClutterGstPlayer:audio-volume:
+ *
+ * The volume of the audio, as a normalized value between
+ * 0.0 and 1.0.
+ */
+ pspec = g_param_spec_double ("audio-volume",
+ "Audio Volume",
+ "The volume of the audio",
+ 0.0, 1.0, 0.5,
+ CLUTTER_GST_PARAM_READWRITE |
+ G_PARAM_DEPRECATED);
+ g_object_interface_install_property (iface, pspec);
+
+ /**
+ * ClutterGstPlayer:can-seek:
+ *
+ * Whether the current stream is seekable.
+ */
+ pspec = g_param_spec_boolean ("can-seek",
+ "Can Seek",
+ "Whether the current stream is seekable",
+ FALSE,
+ CLUTTER_GST_PARAM_READABLE |
+ G_PARAM_DEPRECATED);
+ g_object_interface_install_property (iface, pspec);
+
+ /**
+ * ClutterGstPlayer:buffer-fill:
+ *
+ * The fill level of the buffer for the current stream,
+ * as a value between 0.0 and 1.0.
+ */
+ pspec = g_param_spec_double ("buffer-fill",
+ "Buffer Fill",
+ "The fill level of the buffer",
+ 0.0, 1.0, 0.0,
+ CLUTTER_GST_PARAM_READABLE |
+ G_PARAM_DEPRECATED);
+ g_object_interface_install_property (iface, pspec);
+
+ /**
+ * ClutterGstPlayer:duration:
+ *
+ * The duration of the current stream, in seconds
+ */
+ pspec = g_param_spec_double ("duration",
+ "Duration",
+ "The duration of the stream, in seconds",
+ 0, G_MAXDOUBLE, 0,
+ CLUTTER_GST_PARAM_READABLE);
+ g_object_interface_install_property (iface, pspec);
+
+ /**
* ClutterGstPlayer:idle:
*
* Whether the #ClutterGstPlayer is in idle mode.
@@ -2247,6 +2365,37 @@ clutter_gst_player_default_init (ClutterGstPlayerIface *iface)
/* Signals */
/**
+ * ClutterGstPlayer::eos:
+ * @media: the #ClutterGstPlayer instance that received the signal
+ *
+ * The ::eos signal is emitted each time the media stream ends.
+ */
+ signals[EOS_SIGNAL] =
+ g_signal_new ("eos",
+ CLUTTER_GST_TYPE_PLAYER,
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (ClutterGstPlayerIface, eos),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
+ /**
+ * ClutterGstPlayer::error:
+ * @media: the #ClutterGstPlayer instance that received the signal
+ * @error: the #GError
+ *
+ * The ::error signal is emitted each time an error occurred.
+ */
+ signals[ERROR_SIGNAL] =
+ g_signal_new ("error",
+ CLUTTER_GST_TYPE_PLAYER,
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (ClutterGstPlayerIface, error),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__BOXED,
+ G_TYPE_NONE, 1,
+ G_TYPE_ERROR);
+
+ /**
* ClutterGstPlayer::download-buffering:
* @player: the #ClutterGstPlayer instance that received the signal
* @start: start position of the buffering
@@ -2257,7 +2406,7 @@ clutter_gst_player_default_init (ClutterGstPlayerIface *iface)
*
* Since: 1.4
*/
- signals[DOWNLOAD_BUFFERING] =
+ signals[DOWNLOAD_BUFFERING_SIGNAL] =
g_signal_new ("download-buffering",
CLUTTER_GST_TYPE_PLAYER,
G_SIGNAL_RUN_LAST,
@@ -2303,6 +2452,122 @@ clutter_gst_player_get_pipeline (ClutterGstPlayer *player)
}
/**
+ * clutter_gst_player_set_uri:
+ * @player: a #ClutterGstPlayer
+ * @uri: the URI of the media stream
+ *
+ * Sets the URI of @player to @uri.
+ */
+void
+clutter_gst_player_set_uri (ClutterGstPlayer *player,
+ const gchar *uri)
+{
+ g_return_if_fail (CLUTTER_GST_IS_PLAYER (player));
+
+ g_object_set (G_OBJECT (player), "uri", uri, NULL);
+}
+
+/**
+ * clutter_gst_player_get_uri:
+ * @player: a #ClutterGstPlayer
+ *
+ * Retrieves the URI from @player.
+ *
+ * Return value: the URI of the media stream. Use g_free()
+ * to free the returned string
+ */
+gchar *
+clutter_gst_player_get_uri (ClutterGstPlayer *player)
+{
+ gchar *retval = NULL;
+
+ g_return_val_if_fail (CLUTTER_GST_IS_PLAYER (player), NULL);
+
+ g_object_get (G_OBJECT (player), "uri", &retval, NULL);
+
+ return retval;
+}
+
+/**
+ * clutter_gst_player_set_filename:
+ * @player: a #ClutterGstPlayer
+ * @filename: A filename
+ *
+ * Sets the source of @player using a file path.
+ */
+void
+clutter_gst_player_set_filename (ClutterGstPlayer *player,
+ const gchar *filename)
+{
+ gchar *uri;
+ GError *uri_error = NULL;
+
+ if (!g_path_is_absolute (filename))
+ {
+ gchar *abs_path;
+
+ abs_path = g_build_filename (g_get_current_dir (), filename, NULL);
+ uri = g_filename_to_uri (abs_path, NULL, &uri_error);
+ g_free (abs_path);
+ }
+ else
+ uri = g_filename_to_uri (filename, NULL, &uri_error);
+
+ if (uri_error)
+ {
+ g_signal_emit (player, signals[ERROR_SIGNAL], 0, uri_error);
+ g_error_free (uri_error);
+ return;
+ }
+
+ clutter_gst_player_set_uri (player, uri);
+
+ g_free (uri);
+}
+
+/**
+ * clutter_gst_player_set_playing:
+ * @player: a #ClutterGstPlayer
+ * @playing: %TRUE to start playing
+ *
+ * Starts or stops playing of @player.
+ *
+ * The implementation might be asynchronous, so the way to know whether
+ * the actual playing state of the @player is to use the #GObject::notify
+ * signal on the #ClutterGstPlayer:playing property and then retrieve the
+ * current state with clutter_gst_player_is_playing(). ClutterGstVideoActor
+ * in clutter-gst is an example of such an asynchronous implementation.
+ */
+void
+clutter_gst_player_set_playing (ClutterGstPlayer *player,
+ gboolean playing)
+{
+ g_return_if_fail (CLUTTER_GST_IS_PLAYER (player));
+
+ g_object_set (G_OBJECT (player), "playing", playing, NULL);
+}
+
+/**
+ * clutter_gst_player_is_playing:
+ * @player: A #ClutterGstPlayer object
+ *
+ * Retrieves the playing status of @player.
+ *
+ * Return value: %TRUE if playing, %FALSE if stopped.
+ */
+gboolean
+clutter_gst_player_is_playing (ClutterGstPlayer *player)
+{
+ gboolean is_playing = FALSE;
+
+ g_return_val_if_fail (CLUTTER_GST_IS_PLAYER (player), FALSE);
+
+ g_object_get (G_OBJECT (player), "playing", &is_playing, NULL);
+
+ return is_playing;
+}
+
+/**
* clutter_gst_player_get_user_agent:
* @player: a #ClutterGstPlayer
*
@@ -2439,6 +2704,62 @@ clutter_gst_player_set_buffering_mode (ClutterGstPlayer *player,
}
/**
+ * clutter_gst_player_get_buffer_fill:
+ * @player: a #ClutterGstPlayer
+ *
+ * Retrieves the amount of the stream that is buffered.
+ *
+ * Return value: the fill level, between 0.0 and 1.0
+ */
+gdouble
+clutter_gst_player_get_buffer_fill (ClutterGstPlayer *player)
+{
+ gdouble retval = 0.0;
+
+ g_return_val_if_fail (CLUTTER_GST_IS_PLAYER (player), 0);
+
+ g_object_get (G_OBJECT (player), "buffer-fill", &retval, NULL);
+
+ return retval;
+}
+
+/**
+ * clutter_gst_player_set_audio_volume:
+ * @player: a #ClutterGstPlayer
+ * @volume: the volume as a double between 0.0 and 1.0
+ *
+ * Sets the playback volume of @player to @volume.
+ */
+void
+clutter_gst_player_set_audio_volume (ClutterGstPlayer *player,
+ gdouble volume)
+{
+ g_return_if_fail (CLUTTER_GST_IS_PLAYER (player));
+
+ g_object_set (G_OBJECT (player), "audio-volume", volume, NULL);
+}
+
+/**
+ * clutter_gst_player_get_audio_volume:
+ * @player: a #ClutterGstPlayer
+ *
+ * Retrieves the playback volume of @player.
+ *
+ * Return value: The playback volume between 0.0 and 1.0
+ */
+gdouble
+clutter_gst_player_get_audio_volume (ClutterGstPlayer *player)
+{
+ gdouble retval = 0.0;
+
+ g_return_val_if_fail (CLUTTER_GST_IS_PLAYER (player), 0.0);
+
+ g_object_get (G_OBJECT (player), "audio-volume", &retval, NULL);
+
+ return retval;
+}
+
+/**
* clutter_gst_player_get_audio_streams:
* @player: a #ClutterGstPlayer
*
@@ -2510,6 +2831,87 @@ clutter_gst_player_set_audio_stream (ClutterGstPlayer *player,
}
/**
+ * clutter_gst_player_set_subtitle_uri:
+ * @player: a #ClutterGstPlayer
+ * @uri: the URI of a subtitle file
+ *
+ * Sets the location of a subtitle file to display while playing @player.
+ */
+void
+clutter_gst_player_set_subtitle_uri (ClutterGstPlayer *player,
+ const char *uri)
+{
+ g_return_if_fail (CLUTTER_GST_IS_PLAYER (player));
+
+ g_object_set (G_OBJECT (player), "subtitle-uri", uri, NULL);
+}
+
+/**
+ * clutter_gst_player_get_subtitle_uri:
+ * @player: a #ClutterGstPlayer
+ *
+ * Retrieves the URI of the subtitle file in use.
+ *
+ * Return value: the URI of the subtitle file. Use g_free()
+ * to free the returned string
+ */
+gchar *
+clutter_gst_player_get_subtitle_uri (ClutterGstPlayer *player)
+{
+ gchar *retval = NULL;
+
+ g_return_val_if_fail (CLUTTER_GST_IS_PLAYER (player), NULL);
+
+ g_object_get (G_OBJECT (player), "subtitle-uri", &retval, NULL);
+
+ return retval;
+}
+
+/**
+ * clutter_gst_player_set_subtitle_font_name:
+ * @player: a #ClutterGstPlayer
+ * @font_name: a font name, or %NULL to set the default font name
+ *
+ * Sets the font used by the subtitle renderer. The @font_name string must be
+ * either %NULL, which means that the default font name of the underlying
+ * implementation will be used; or must follow the grammar recognized by
+ * pango_font_description_from_string() like:
+ *
+ * |[
+ * clutter_gst_player_set_subtitle_font_name (player, "Sans 24pt");
+ * ]|
+ */
+void
+clutter_gst_player_set_subtitle_font_name (ClutterGstPlayer *player,
+ const char *font_name)
+{
+ g_return_if_fail (CLUTTER_GST_IS_PLAYER (player));
+
+ g_object_set (G_OBJECT (player), "subtitle-font-name", font_name, NULL);
+}
+
+/**
+ * clutter_gst_player_get_subtitle_font_name:
+ * @player: a #ClutterGstPlayer
+ *
+ * Retrieves the font name currently used.
+ *
+ * Return value: a string containing the font name. Use g_free()
+ * to free the returned string
+ */
+gchar *
+clutter_gst_player_get_subtitle_font_name (ClutterGstPlayer *player)
+{
+ gchar *retval = NULL;
+
+ g_return_val_if_fail (CLUTTER_GST_IS_PLAYER (player), NULL);
+
+ g_object_get (G_OBJECT (player), "subtitle-font-name", &retval, NULL);
+
+ return retval;
+}
+
+/**
* clutter_gst_player_get_subtitle_tracks:
* @player: a #ClutterGstPlayer
*
@@ -2605,6 +3007,26 @@ clutter_gst_player_get_idle (ClutterGstPlayer *player)
}
/**
+ * clutter_gst_player_get_can_seek:
+ * @player: a #ClutterGstPlayer
+ *
+ * Retrieves whether @player is seekable or not.
+ *
+ * Return value: %TRUE if @player can seek, %FALSE otherwise.
+ */
+gboolean
+clutter_gst_player_get_can_seek (ClutterGstPlayer *player)
+{
+ gboolean retval = FALSE;
+
+ g_return_val_if_fail (CLUTTER_GST_IS_PLAYER (player), FALSE);
+
+ g_object_get (G_OBJECT (player), "can-seek", &retval, NULL);
+
+ return retval;
+}
+
+/**
* clutter_gst_player_get_in_seek:
* @player: a #ClutterGstPlayer
*
@@ -2625,3 +3047,60 @@ clutter_gst_player_get_in_seek (ClutterGstPlayer *player)
return iface->get_in_seek (player);
}
+
+/**
+ * clutter_gst_player_set_progress:
+ * @player: a #ClutterGstPlayer
+ * @progress: the progress of the playback, between 0.0 and 1.0
+ *
+ * Sets the playback progress of @player. The @progress is
+ * a normalized value between 0.0 (begin) and 1.0 (end).
+ */
+void
+clutter_gst_player_set_progress (ClutterGstPlayer *player,
+ gdouble progress)
+{
+ g_return_if_fail (CLUTTER_GST_IS_PLAYER (player));
+
+ g_object_set (G_OBJECT (player), "progress", progress, NULL);
+}
+
+/**
+ * clutter_gst_player_get_progress:
+ * @player: a #ClutterGstPlayer
+ *
+ * Retrieves the playback progress of @player.
+ *
+ * Return value: the playback progress, between 0.0 and 1.0
+ */
+gdouble
+clutter_gst_player_get_progress (ClutterGstPlayer *player)
+{
+ gdouble retval = 0.0;
+
+ g_return_val_if_fail (CLUTTER_GST_IS_PLAYER (player), 0);
+
+ g_object_get (G_OBJECT (player), "progress", &retval, NULL);
+
+ return retval;
+}
+
+/**
+ * clutter_gst_player_get_duration:
+ * @player: a #ClutterGstPlayer
+ *
+ * Retrieves the duration of the media stream that @player represents.
+ *
+ * Return value: the duration of the media stream, in seconds
+ */
+gdouble
+clutter_gst_player_get_duration (ClutterGstPlayer *player)
+{
+ gdouble retval = 0;
+
+ g_return_val_if_fail (CLUTTER_GST_IS_PLAYER (player), 0);
+
+ g_object_get (G_OBJECT (player), "duration", &retval, NULL);
+
+ return retval;
+}
diff --git a/clutter-gst/clutter-gst-player.h b/clutter-gst/clutter-gst-player.h
index 02d45cb..1ab9ff1 100644
--- a/clutter-gst/clutter-gst-player.h
+++ b/clutter-gst/clutter-gst-player.h
@@ -7,8 +7,14 @@
*
* Authored By Damien Lespiau <damien.lespiau@intel.com>
* Lionel Landwerlin <lionel.g.landwerlin@linux.intel.com>
+ * Matthew Allum <mallum@openedhand.com>
+ * Emmanuele Bassi <ebassi@linux.intel.com>
+ * Andre Moreira Magalhaes <andre.magalhaes@collabora.co.uk>
*
+ * Copyright (C) 2006 OpenedHand
+ * Copyright (C) 2009-2011 Intel Corporation
* Copyright (C) 2011 Intel Corporation
+ * Copyright (C) 2012 Collabora Ltd. <http://www.collabora.co.uk/>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -135,8 +141,10 @@ struct _ClutterGstPlayerIface
void (* download_buffering) (ClutterGstPlayer *player,
gdouble start,
gdouble stop);
- void (* _clutter_reserved2) (void);
- void (* _clutter_reserved3) (void);
+ void (* eos) (ClutterGstPlayer *player);
+ void (* error) (ClutterGstPlayer *player,
+ const GError *error);
+
void (* _clutter_reserved4) (void);
void (* _clutter_reserved5) (void);
void (* _clutter_reserved6) (void);
@@ -151,27 +159,50 @@ GType clutter_gst_player_get_type (void) G_GNUC_CONST;
void clutter_gst_player_class_init (GObjectClass *object_class);
gboolean clutter_gst_player_init (ClutterGstPlayer *player);
-void clutter_gst_player_deinit (ClutterGstPlayer *player);
+void clutter_gst_player_deinit (ClutterGstPlayer *player);
+
+GstElement * clutter_gst_player_get_pipeline (ClutterGstPlayer *player);
+
+void clutter_gst_player_set_uri (ClutterGstPlayer *player,
+ const gchar *uri);
+gchar * clutter_gst_player_get_uri (ClutterGstPlayer *player);
+void clutter_gst_player_set_filename (ClutterGstPlayer *player,
+ const gchar *filename);
-GstElement * clutter_gst_player_get_pipeline (ClutterGstPlayer *player);
+void clutter_gst_player_set_playing (ClutterGstPlayer *player,
+ gboolean playing);
+gboolean clutter_gst_player_is_playing (ClutterGstPlayer *player);
-gchar * clutter_gst_player_get_user_agent (ClutterGstPlayer *player);
-void clutter_gst_player_set_user_agent (ClutterGstPlayer *player,
+
+gchar * clutter_gst_player_get_user_agent (ClutterGstPlayer *player);
+void clutter_gst_player_set_user_agent (ClutterGstPlayer *player,
const gchar *user_agent);
-ClutterGstSeekFlags clutter_gst_player_get_seek_flags (ClutterGstPlayer *player);
-void clutter_gst_player_set_seek_flags (ClutterGstPlayer *player,
+ClutterGstSeekFlags clutter_gst_player_get_seek_flags (ClutterGstPlayer *player);
+void clutter_gst_player_set_seek_flags (ClutterGstPlayer *player,
ClutterGstSeekFlags flags);
-ClutterGstBufferingMode clutter_gst_player_get_buffering_mode (ClutterGstPlayer *player);
-void clutter_gst_player_set_buffering_mode (ClutterGstPlayer *player,
+ClutterGstBufferingMode clutter_gst_player_get_buffering_mode (ClutterGstPlayer *player);
+void clutter_gst_player_set_buffering_mode (ClutterGstPlayer *player,
ClutterGstBufferingMode mode);
+gdouble clutter_gst_player_get_buffer_fill (ClutterGstPlayer *player);
+void clutter_gst_player_set_audio_volume (ClutterGstPlayer *player,
+ gdouble volume);
+gdouble clutter_gst_player_get_audio_volume (ClutterGstPlayer *player);
GList * clutter_gst_player_get_audio_streams (ClutterGstPlayer *player);
gint clutter_gst_player_get_audio_stream (ClutterGstPlayer *player);
void clutter_gst_player_set_audio_stream (ClutterGstPlayer *player,
gint index_);
+void clutter_gst_player_set_subtitle_uri (ClutterGstPlayer *player,
+ const gchar *uri);
+gchar * clutter_gst_player_get_subtitle_uri (ClutterGstPlayer *player);
+void clutter_gst_player_set_subtitle_font_name
+ (ClutterGstPlayer *player,
+ const char *font_name);
+gchar * clutter_gst_player_get_subtitle_font_name
+ (ClutterGstPlayer *player);
GList * clutter_gst_player_get_subtitle_tracks (ClutterGstPlayer *player);
gint clutter_gst_player_get_subtitle_track (ClutterGstPlayer *player);
void clutter_gst_player_set_subtitle_track (ClutterGstPlayer *player,
@@ -179,8 +210,15 @@ void clutter_gst_player_set_subtitle_track (ClutterGstPlay
gboolean clutter_gst_player_get_idle (ClutterGstPlayer *player);
+gboolean clutter_gst_player_get_can_seek (ClutterGstPlayer *player);
gboolean clutter_gst_player_get_in_seek (ClutterGstPlayer *player);
+
+void clutter_gst_player_set_progress (ClutterGstPlayer *player,
+ gdouble progress);
+gdouble clutter_gst_player_get_progress (ClutterGstPlayer *player);
+gdouble clutter_gst_player_get_duration (ClutterGstPlayer *player);
+
G_END_DECLS
#endif /* __CLUTTER_GST_PLAYER_H__ */
diff --git a/clutter-gst/clutter-gst-video-actor.c b/clutter-gst/clutter-gst-video-actor.c
index baf7609..242ef4a 100644
--- a/clutter-gst/clutter-gst-video-actor.c
+++ b/clutter-gst/clutter-gst-video-actor.c
@@ -56,36 +56,19 @@
#include "clutter-gst-player.h"
#include "clutter-gst-private.h"
-/*
- * FIXME:
- * - Remove implementation of ClutterMedia which requires updating ClutterGstPlayer.
- */
-
struct _ClutterGstVideoActorPrivate
{
};
-static void clutter_gst_video_actor_media_init (ClutterMediaIface *iface);
static void clutter_gst_video_actor_player_init (ClutterGstPlayerIface *iface);
G_DEFINE_TYPE_WITH_CODE (ClutterGstVideoActor,
clutter_gst_video_actor,
CLUTTER_GST_TYPE_ACTOR,
- G_IMPLEMENT_INTERFACE (CLUTTER_TYPE_MEDIA,
- clutter_gst_video_actor_media_init)
G_IMPLEMENT_INTERFACE (CLUTTER_GST_TYPE_PLAYER,
clutter_gst_video_actor_player_init));
/*
- * ClutterMedia implementation
- */
-
-static void
-clutter_gst_video_actor_media_init (ClutterMediaIface *iface)
-{
-}
-
-/*
* ClutterGstPlayer implementation
*/
diff --git a/clutter-gst/clutter-gst-video-sink.c b/clutter-gst/clutter-gst-video-sink.c
index 2264841..7894209 100644
--- a/clutter-gst/clutter-gst-video-sink.c
+++ b/clutter-gst/clutter-gst-video-sink.c
@@ -1583,7 +1583,7 @@ clutter_gst_video_sink_class_init (ClutterGstVideoSinkClass * klass)
*
* This is the actor the video is decoded into. It can be any
* #ClutterGstActor, however Cluter-Gst has a handy subclass,
- * #ClutterGstVideoActor, that implements the #ClutterMedia
+ * #ClutterGstVideoActor, that implements the #ClutterGstPlayer
* interface.
*/
pspec = g_param_spec_object ("actor",
diff --git a/doc/reference/clutter-gst-docs.sgml b/doc/reference/clutter-gst-docs.sgml
index 80fe1f7..b350bda 100644
--- a/doc/reference/clutter-gst-docs.sgml
+++ b/doc/reference/clutter-gst-docs.sgml
@@ -48,7 +48,7 @@
<chapter>
<title>Clutter Gst Overview</title>
- <para>Clutter-GStreamer provides a ClutterMedia interface implementation
+ <para>Clutter-GStreamer provides a player interface implementation
using GStreamer for basic video and audio playback.</para>
</chapter>
diff --git a/examples/video-player.c b/examples/video-player.c
index af29d2c..11645f8 100644
--- a/examples/video-player.c
+++ b/examples/video-player.c
@@ -163,7 +163,7 @@ toggle_pause_state (VideoApp *app)
if (app->paused)
{
- clutter_media_set_playing (CLUTTER_MEDIA(app->vactor),
+ clutter_gst_player_set_playing (CLUTTER_GST_PLAYER(app->vactor),
TRUE);
app->paused = FALSE;
clutter_actor_hide (app->control_play);
@@ -171,7 +171,7 @@ toggle_pause_state (VideoApp *app)
}
else
{
- clutter_media_set_playing (CLUTTER_MEDIA(app->vactor),
+ clutter_gst_player_set_playing (CLUTTER_GST_PLAYER(app->vactor),
FALSE);
app->paused = TRUE;
clutter_actor_hide (app->control_pause);
@@ -232,7 +232,7 @@ input_cb (ClutterStage *stage,
progress = (gdouble) dist / SEEK_W;
- clutter_media_set_progress (CLUTTER_MEDIA (app->vactor),
+ clutter_gst_player_set_progress (CLUTTER_GST_PLAYER (app->vactor),
progress);
}
}
@@ -370,8 +370,8 @@ tick (GObject *object,
GParamSpec *pspec,
VideoApp *app)
{
- ClutterMedia *vactor = CLUTTER_MEDIA (object);
- gdouble progress = clutter_media_get_progress (vactor);
+ ClutterGstPlayer *vactor = CLUTTER_GST_PLAYER (object);
+ gdouble progress = clutter_gst_player_get_progress (vactor);
clutter_actor_set_size (app->control_seekbar,
progress * SEEK_W,
@@ -379,13 +379,13 @@ tick (GObject *object,
}
static void
-on_video_actor_eos (ClutterMedia *media,
- VideoApp *app)
+on_video_actor_eos (ClutterGstPlayer *player,
+ VideoApp *app)
{
if (opt_loop)
{
- clutter_media_set_progress (media, 0.0);
- clutter_media_set_playing (media, TRUE);
+ clutter_gst_player_set_progress (player, 0.0);
+ clutter_gst_player_set_playing (player, TRUE);
}
}
@@ -509,7 +509,7 @@ main (int argc, char *argv[])
G_CALLBACK (size_change), app);
/* Load up out video actor */
- clutter_media_set_filename (CLUTTER_MEDIA (app->vactor), argv[1]);
+ clutter_gst_player_set_filename (CLUTTER_GST_PLAYER (app->vactor), argv[1]);
/* Set up things so that a visualisation is played if there's no video */
pipe = clutter_gst_player_get_pipeline (CLUTTER_GST_PLAYER (app->vactor));
@@ -605,7 +605,7 @@ main (int argc, char *argv[])
"notify::progress", G_CALLBACK (tick),
app);
- clutter_media_set_playing (CLUTTER_MEDIA (app->vactor), TRUE);
+ clutter_gst_player_set_playing (CLUTTER_GST_PLAYER (app->vactor), TRUE);
clutter_actor_show (stage);
diff --git a/tests/test-start-stop.c b/tests/test-start-stop.c
index d969c39..5908e4e 100644
--- a/tests/test-start-stop.c
+++ b/tests/test-start-stop.c
@@ -66,7 +66,7 @@ size_change (ClutterActor *actor,
}
void
-on_error (ClutterMedia *media)
+on_error (ClutterGstPlayer *player)
{
g_print ("error\n");
clutter_main_quit ();
@@ -76,17 +76,17 @@ gboolean
test (gpointer data)
{
static int count = 1;
- static ClutterMedia *media = NULL;
+ static ClutterGstPlayer *player = NULL;
static char *uri[2] = {NULL, NULL};
const char *playing_uri = NULL;
/* Check until we get video playing */
- if (!clutter_media_get_playing (CLUTTER_MEDIA (data)))
+ if (!clutter_gst_player_is_playing (CLUTTER_GST_PLAYER (data)))
return TRUE;
- if (CLUTTER_MEDIA (data) != media)
+ if (CLUTTER_GST_PLAYER (data) != player)
{
- media = CLUTTER_MEDIA (data);
+ player = CLUTTER_GST_PLAYER (data);
count = 1;
g_free(uri[0]);
uri[0] = NULL;
@@ -94,25 +94,25 @@ test (gpointer data)
uri[1] = NULL;
}
- clutter_media_set_filename (media, video_files[count & 1]);
+ clutter_gst_player_set_filename (player, video_files[count & 1]);
g_print ("playing %s\n", video_files[count & 1]);
if (uri[count & 1] == NULL)
{
- uri[count & 1] = g_strdup (clutter_media_get_uri (media));
+ uri[count & 1] = g_strdup (clutter_gst_player_get_uri (player));
g_assert (uri[count & 1] != NULL);
}
/* See if it's still playing */
- g_assert (clutter_media_get_playing (media));
+ g_assert (clutter_gst_player_is_playing (player));
/* See if it's already change to play correct file */
- playing_uri = clutter_media_get_uri (media);
+ playing_uri = clutter_gst_player_get_uri (player);
g_assert_cmpstr (playing_uri, ==, uri[count & 1]);
if (count ++ > 10)
{
- clutter_media_set_playing (media, FALSE);
+ clutter_gst_player_set_playing (player, FALSE);
clutter_main_quit ();
return FALSE;
}
@@ -156,9 +156,9 @@ main (int argc, char *argv[])
G_CALLBACK(on_error),
stage);
g_timeout_add (5000, test, video);
- clutter_media_set_filename (CLUTTER_MEDIA(video), video_files[0]);
- clutter_media_set_audio_volume (CLUTTER_MEDIA(video), 0.5);
- clutter_media_set_playing (CLUTTER_MEDIA(video), TRUE);
+ clutter_gst_player_set_filename (CLUTTER_GST_PLAYER (video), video_files[0]);
+ clutter_gst_player_set_audio_volume (CLUTTER_GST_PLAYER (video), 0.5);
+ clutter_gst_player_set_playing (CLUTTER_GST_PLAYER (video), TRUE);
clutter_actor_add_child (stage, video);
clutter_actor_show (stage);