[Cogl] [PATCH 9/9] gst-video-sink: Use integers for emitting the signals

Neil Roberts neil at linux.intel.com
Fri Mar 1 05:32:00 PST 2013


Usually when a GObject creates its signals it stores the integer ids
for them in a static array so that it can later emit them without
having to look them up from a string name.

This patch also changes it to add a class closure for the two signals
because that is the norm.

The names have been changed to ‘pipeline-ready’ and ‘new-frame’
because it is not usual to encode any namespacing in the signal names.
---
 cogl-gst/cogl-gst-video-sink.c     | 44 ++++++++++++++++++++++++++++++--------
 cogl-gst/cogl-gst-video-sink.h     |  5 +++++
 examples/cogl-basic-video-player.c |  7 ++----
 3 files changed, 42 insertions(+), 14 deletions(-)

diff --git a/cogl-gst/cogl-gst-video-sink.c b/cogl-gst/cogl-gst-video-sink.c
index 9c82ff7..fae22c5 100644
--- a/cogl-gst/cogl-gst-video-sink.c
+++ b/cogl-gst/cogl-gst-video-sink.c
@@ -78,6 +78,16 @@ enum
   PROP_UPDATE_PRIORITY
 };
 
+enum
+{
+  PIPELINE_READY_SIGNAL,
+  NEW_FRAME_SIGNAL,
+
+  LAST_SIGNAL
+};
+
+static guint video_sink_signals[LAST_SIGNAL] = { 0, };
+
 typedef enum
 {
   COGL_GST_NOFORMAT,
@@ -232,7 +242,7 @@ create_template_pipeline (CoglGstVideoSink *sink,
       cogl_object_unref (snippet);
     }
 
-  g_signal_emit_by_name (sink, "cogl-pipeline-ready", NULL);
+  g_signal_emit (sink, video_sink_signals[PIPELINE_READY_SIGNAL], 0, NULL);
 }
 
 static void
@@ -834,7 +844,9 @@ cogl_gst_source_dispatch (GSource *source,
       if (!priv->renderer->upload (gst_source->sink, buffer))
         goto fail_upload;
 
-      g_signal_emit_by_name (gst_source->sink, "cogl-gst-new-frame", NULL);
+      g_signal_emit (gst_source->sink,
+                     video_sink_signals[NEW_FRAME_SIGNAL], 0,
+                     NULL);
       gst_buffer_unref (buffer);
     }
   else
@@ -1076,13 +1088,27 @@ cogl_gst_video_sink_class_init (CoglGstVideoSinkClass *klass)
 
   g_object_class_install_property (go_class, PROP_UPDATE_PRIORITY, pspec);
 
-  g_signal_new ("cogl-pipeline-ready", COGL_GST_TYPE_VIDEO_SINK,
-                G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__VOID,
-                G_TYPE_NONE, 0, G_TYPE_NONE);
-
-  g_signal_new ("cogl-gst-new-frame", COGL_GST_TYPE_VIDEO_SINK,
-                G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__VOID,
-                G_TYPE_NONE, 0, G_TYPE_NONE);
+  video_sink_signals[PIPELINE_READY_SIGNAL] =
+    g_signal_new ("pipeline-ready",
+                  COGL_GST_TYPE_VIDEO_SINK,
+                  G_SIGNAL_RUN_LAST,
+                  G_STRUCT_OFFSET (CoglGstVideoSinkClass, pipeline_ready),
+                  NULL, /* accumulator */
+                  NULL, /* accu_data */
+                  g_cclosure_marshal_VOID__VOID,
+                  G_TYPE_NONE,
+                  0 /* n_params */);
+
+  video_sink_signals[NEW_FRAME_SIGNAL] =
+    g_signal_new ("new-frame",
+                  COGL_GST_TYPE_VIDEO_SINK,
+                  G_SIGNAL_RUN_LAST,
+                  G_STRUCT_OFFSET (CoglGstVideoSinkClass, new_frame),
+                  NULL, /* accumulator */
+                  NULL, /* accu_data */
+                  g_cclosure_marshal_VOID__VOID,
+                  G_TYPE_NONE,
+                  0 /* n_params */);
 }
 
 CoglGstVideoSink*
diff --git a/cogl-gst/cogl-gst-video-sink.h b/cogl-gst/cogl-gst-video-sink.h
index 53f6245..26e34b1 100644
--- a/cogl-gst/cogl-gst-video-sink.h
+++ b/cogl-gst/cogl-gst-video-sink.h
@@ -87,6 +87,11 @@ struct _CoglGstVideoSink
 struct _CoglGstVideoSinkClass
 {
   GstBaseSinkClass parent_class;
+
+  void (* new_frame) (CoglGstVideoSink *sink);
+  void (* pipeline_ready) (CoglGstVideoSink *sink);
+
+  void *_padding_dummy[8];
 };
 
 GType       cogl_gst_video_sink_get_type    (void) G_GNUC_CONST;
diff --git a/examples/cogl-basic-video-player.c b/examples/cogl-basic-video-player.c
index 51929a1..984b30b 100644
--- a/examples/cogl-basic-video-player.c
+++ b/examples/cogl-basic-video-player.c
@@ -149,10 +149,7 @@ _set_up_pipeline (gpointer instance,
      frame-rate of the video.
   */
 
-  g_signal_connect (data->sink,
-                    "cogl-gst-new-frame",
-                    G_CALLBACK (_new_frame_cb),
-                    data);
+  g_signal_connect (data->sink, "new-frame", G_CALLBACK (_new_frame_cb), data);
 }
 
 int
@@ -234,7 +231,7 @@ main (int argc,
     is prepared to retrieve and attach the first frame of the video.
   */
 
-  g_signal_connect (data.sink, "cogl-pipeline-ready",
+  g_signal_connect (data.sink, "pipeline-ready",
                     G_CALLBACK (_set_up_pipeline), &data);
 
   data.draw_ready = TRUE;
-- 
1.7.11.3.g3c3efa5



More information about the Cogl mailing list