diff options
-rw-r--r-- | README | 6 | ||||
-rw-r--r-- | build/autotools/Makefile.am.release | 2 | ||||
-rw-r--r-- | clutter-gst.doap | 7 | ||||
-rw-r--r-- | clutter-gst/clutter-gst-player.c | 517 | ||||
-rw-r--r-- | clutter-gst/clutter-gst-player.h | 58 | ||||
-rw-r--r-- | clutter-gst/clutter-gst-video-actor.c | 17 | ||||
-rw-r--r-- | clutter-gst/clutter-gst-video-sink.c | 2 | ||||
-rw-r--r-- | doc/reference/clutter-gst-docs.sgml | 2 | ||||
-rw-r--r-- | examples/video-player.c | 22 | ||||
-rw-r--r-- | tests/test-start-stop.c | 26 |
10 files changed, 578 insertions, 81 deletions
@@ -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); |