summaryrefslogtreecommitdiff
path: root/clutter-gst/clutter-gst-content.c
diff options
context:
space:
mode:
authorLionel Landwerlin <llandwerlin@gmail.com>2013-07-01 16:10:55 +0100
committerLionel Landwerlin <llandwerlin@gmail.com>2013-07-08 12:11:09 +0100
commit2b077e89c620c630e4fdaf2d9cb73ab141127ea9 (patch)
treef7b9fadc1448321003926a5a295b39dd64b0af18 /clutter-gst/clutter-gst-content.c
parenta661cbdca1c5a807ab48017cd4c93c149f878b0b (diff)
downloadclutter-gst-2b077e89c620c630e4fdaf2d9cb73ab141127ea9.tar.gz
switch ClutterGst to use ClutterContent
Diffstat (limited to 'clutter-gst/clutter-gst-content.c')
-rw-r--r--clutter-gst/clutter-gst-content.c138
1 files changed, 123 insertions, 15 deletions
diff --git a/clutter-gst/clutter-gst-content.c b/clutter-gst/clutter-gst-content.c
index 2a8fea7..b1e819f 100644
--- a/clutter-gst/clutter-gst-content.c
+++ b/clutter-gst/clutter-gst-content.c
@@ -33,11 +33,12 @@
#include "clutter-gst-private.h"
#include "clutter-gst-marshal.h"
-static void clutter_content_iface_init (ClutterContentIface *iface);
+static void content_iface_init (ClutterContentIface *iface);
-G_DEFINE_TYPE_WITH_CODE (ClutterGstContent, clutter_gst_content, G_TYPE_OBJECT,
- G_IMPLEMENT_INTERFACE (CLUTTER_TYPE_CONTENT,
- clutter_content_iface_init));
+G_DEFINE_TYPE_WITH_CODE (ClutterGstContent,
+ clutter_gst_content,
+ G_TYPE_OBJECT,
+ G_IMPLEMENT_INTERFACE (CLUTTER_TYPE_CONTENT, content_iface_init))
#define CLUTTER_GST_CONTENT_GET_PRIVATE(obj)\
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), \
@@ -48,6 +49,7 @@ G_DEFINE_TYPE_WITH_CODE (ClutterGstContent, clutter_gst_content, G_TYPE_OBJECT,
struct _ClutterGstContentPrivate
{
CoglGstVideoSink *sink;
+ ClutterGstPlayer *player;
ClutterGstFrame *current_frame;
};
@@ -56,6 +58,7 @@ enum
PROP_0,
PROP_VIDEO_SINK,
+ PROP_PLAYER,
PROP_LAST
};
@@ -115,15 +118,50 @@ _pixel_aspect_ratio_changed (CoglGstVideoSink *sink,
sink);
}
+static void content_set_sink (ClutterGstContent *self,
+ CoglGstVideoSink *sink,
+ gboolean set_from_player);
+
+static void
+content_set_player (ClutterGstContent *self,
+ ClutterGstPlayer *player)
+{
+ ClutterGstContentPrivate *priv = self->priv;
+
+ if (priv->player == player)
+ return;
+
+ if (priv->player)
+ g_clear_object (&priv->sink);
+
+ if (player)
+ {
+ priv->player = g_object_ref_sink (player);
+ content_set_sink (self, clutter_gst_player_get_video_sink (player), TRUE);
+ /* g_signal_connect (priv->player, "new-frame", */
+ /* G_CALLBACK (_new_frame_from_pipeline), self); */
+ /* g_signal_connect (priv->player, "notify::pixel-aspect-ratio", */
+ /* G_CALLBACK (_pixel_aspect_ratio_changed), self); */
+ }
+ else
+ content_set_sink (self, NULL, TRUE);
+
+ g_object_notify (G_OBJECT (self), "player");
+}
+
static void
content_set_sink (ClutterGstContent *self,
- CoglGstVideoSink *sink)
+ CoglGstVideoSink *sink,
+ gboolean set_from_player)
{
ClutterGstContentPrivate *priv = self->priv;
if (priv->sink == sink)
return;
+ if (!set_from_player)
+ content_set_player (self, NULL);
+
if (priv->sink)
{
g_signal_handlers_disconnect_by_func (priv->sink,
@@ -217,7 +255,7 @@ clutter_gst_content_paint_content (ClutterContent *content,
}
static void
-clutter_content_iface_init (ClutterContentIface *iface)
+content_iface_init (ClutterContentIface *iface)
{
iface->get_preferred_size = clutter_gst_content_get_preferred_size;
iface->paint_content = clutter_gst_content_paint_content;
@@ -234,7 +272,12 @@ clutter_gst_content_set_property (GObject *object,
switch (prop_id)
{
case PROP_VIDEO_SINK:
- content_set_sink (self, g_value_get_object (value));
+ content_set_sink (self, g_value_get_object (value), FALSE);
+ break;
+
+ case PROP_PLAYER:
+ content_set_player (self,
+ CLUTTER_GST_PLAYER (g_value_get_object (value)));
break;
default:
@@ -257,6 +300,10 @@ clutter_gst_content_get_property (GObject *object,
g_value_set_object (value, priv->sink);
break;
+ case PROP_PLAYER:
+ g_value_set_object (value, priv->player);
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -297,10 +344,17 @@ clutter_gst_content_class_init (ClutterGstContentClass *klass)
g_type_class_add_private (klass, sizeof (ClutterGstContentPrivate));
+ props[PROP_PLAYER] =
+ g_param_spec_object ("player",
+ "ClutterGst Player",
+ "ClutterGst Player",
+ G_TYPE_OBJECT,
+ G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE);
+
props[PROP_VIDEO_SINK] =
g_param_spec_object ("video-sink",
- "video-sink",
- "video-sink",
+ "Cogl Video Sink",
+ "Cogl Video Sink",
COGL_GST_TYPE_VIDEO_SINK,
G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE);
g_object_class_install_properties (gobject_class, PROP_LAST, props);
@@ -357,6 +411,8 @@ clutter_gst_content_new (void)
* clutter_gst_content_new_with_sink:
*
* Returns: (transfer full): a new #ClutterGstContent instance
+ *
+ * Since: 3.0
*/
ClutterContent *
clutter_gst_content_new_with_sink (CoglGstVideoSink *sink)
@@ -366,11 +422,44 @@ clutter_gst_content_new_with_sink (CoglGstVideoSink *sink)
NULL);
}
+/**
+ * clutter_gst_content_get_frame:
+ * @self: A #ClutterGstContent
+ *
+ * Returns: (transfer none): The #ClutterGstFrame currently attached to @self.
+ *
+ * Since: 3.0
+ */
+ClutterGstFrame *
+clutter_gst_content_get_frame (ClutterGstContent *self)
+{
+ g_return_val_if_fail (CLUTTER_GST_IS_CONTENT (self), NULL);
+
+ return self->priv->current_frame;
+}
+
+/**
+ * clutter_gst_content_get_sink:
+ * @self: A #ClutterGstContent
+ *
+ * Returns: (transfer none): The #CoglGstVideoSink currently attached to @self.
+ *
+ * Since: 3.0
+ */
+CoglGstVideoSink *
+clutter_gst_content_get_sink (ClutterGstContent *self)
+{
+ g_return_val_if_fail (CLUTTER_GST_IS_CONTENT (self), NULL);
+
+ return self->priv->sink;
+}
/**
* clutter_gst_content_set_sink:
* @self: A #ClutterGstContent
* @sink: A #CoglGstVideoSink or %NULL
+ *
+ * Since: 3.0
*/
void
clutter_gst_content_set_sink (ClutterGstContent *self,
@@ -379,19 +468,38 @@ clutter_gst_content_set_sink (ClutterGstContent *self,
g_return_if_fail (CLUTTER_GST_IS_CONTENT (self));
g_return_if_fail (sink == NULL || COGL_GST_IS_VIDEO_SINK (sink));
- content_set_sink (self, sink);
+ content_set_sink (self, sink, FALSE);
}
/**
- * clutter_gst_content_get_sink:
+ * clutter_gst_content_get_player:
* @self: A #ClutterGstContent
*
- * Returns: (transfer none):
+ * Returns: (transfer none): The #ClutterGstPlayer currently attached to @self.
+ *
+ * Since: 3.0
*/
-CoglGstVideoSink *
-clutter_gst_content_get_sink (ClutterGstContent *self)
+ClutterGstPlayer *
+clutter_gst_content_get_player (ClutterGstContent *self)
{
g_return_val_if_fail (CLUTTER_GST_IS_CONTENT (self), NULL);
- return self->priv->sink;
+ return self->priv->player;
+}
+
+/**
+ * clutter_gst_content_set_player:
+ * @self: A #ClutterGstContent
+ * @player: A #ClutterGstPlayer or %NULL
+ *
+ * Since: 3.0
+ */
+void
+clutter_gst_content_set_player (ClutterGstContent *self,
+ ClutterGstPlayer *player)
+{
+ g_return_if_fail (CLUTTER_GST_IS_CONTENT (self));
+ g_return_if_fail (player == NULL || CLUTTER_GST_IS_PLAYER (player));
+
+ content_set_player (self, player);
}