[mutter] screen-cast-stream-src: Only try to record frames when streaming



commit 920541fa26f667b5cb8d859585067461b2b09e59
Author: Jonas Ådahl <jadahl gmail com>
Date:   Mon Jun 26 12:55:48 2017 +0800

    screen-cast-stream-src: Only try to record frames when streaming
    
    Only when the PipeWire stream state is 'PW_STREAM_STATE STREAMING'
    should the signal be connected causing the src to maybe record a frame.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=784199

 src/backends/meta-screen-cast-monitor-stream-src.c |   75 +++++++++-----------
 src/backends/meta-screen-cast-stream-src.c         |   41 +++++++++++
 src/backends/meta-screen-cast-stream-src.h         |    2 +
 3 files changed, 78 insertions(+), 40 deletions(-)
---
diff --git a/src/backends/meta-screen-cast-monitor-stream-src.c 
b/src/backends/meta-screen-cast-monitor-stream-src.c
index dd9196e..e5a681b 100644
--- a/src/backends/meta-screen-cast-monitor-stream-src.c
+++ b/src/backends/meta-screen-cast-monitor-stream-src.c
@@ -94,22 +94,6 @@ meta_screen_cast_monitor_stream_src_get_specs (MetaScreenCastStreamSrc *src,
 }
 
 static void
-meta_screen_cast_monitor_stream_src_record_frame (MetaScreenCastStreamSrc *src,
-                                                  uint8_t                 *data)
-{
-  MetaScreenCastMonitorStreamSrc *monitor_src =
-    META_SCREEN_CAST_MONITOR_STREAM_SRC (src);
-  ClutterStage *stage;
-  MetaMonitor *monitor;
-  MetaLogicalMonitor *logical_monitor;
-
-  stage = get_stage (monitor_src);
-  monitor = get_monitor (monitor_src);
-  logical_monitor = meta_monitor_get_logical_monitor (monitor);
-  clutter_stage_capture_into (stage, FALSE, &logical_monitor->rect, data);
-}
-
-static void
 stage_painted (ClutterActor                   *actor,
                MetaScreenCastMonitorStreamSrc *monitor_src)
 {
@@ -118,24 +102,11 @@ stage_painted (ClutterActor                   *actor,
   meta_screen_cast_stream_src_maybe_record_frame (src);
 }
 
-MetaScreenCastMonitorStreamSrc *
-meta_screen_cast_monitor_stream_src_new (MetaScreenCastMonitorStream  *monitor_stream,
-                                         const char                   *stream_id,
-                                         GError                      **error)
-{
-  return g_initable_new (META_TYPE_SCREEN_CAST_MONITOR_STREAM_SRC,
-                         NULL,
-                         error,
-                         "stream-id", stream_id,
-                         "stream", monitor_stream,
-                         NULL);
-}
-
 static void
-meta_screen_cast_monitor_stream_src_constructed (GObject *object)
+meta_screen_cast_monitor_stream_src_enable (MetaScreenCastStreamSrc *src)
 {
   MetaScreenCastMonitorStreamSrc *monitor_src =
-    META_SCREEN_CAST_MONITOR_STREAM_SRC (object);
+    META_SCREEN_CAST_MONITOR_STREAM_SRC (src);
   ClutterStage *stage;
 
   stage = get_stage (monitor_src);
@@ -147,18 +118,44 @@ meta_screen_cast_monitor_stream_src_constructed (GObject *object)
 }
 
 static void
-meta_screen_cast_monitor_stream_src_finalize (GObject *object)
+meta_screen_cast_monitor_stream_src_disable (MetaScreenCastStreamSrc *src)
 {
   MetaScreenCastMonitorStreamSrc *monitor_src =
-    META_SCREEN_CAST_MONITOR_STREAM_SRC (object);
-  GObjectClass *parent_class =
-    G_OBJECT_CLASS (meta_screen_cast_monitor_stream_src_parent_class);
+    META_SCREEN_CAST_MONITOR_STREAM_SRC (src);
   ClutterStage *stage;
 
   stage = get_stage (monitor_src);
   g_signal_handler_disconnect (stage, monitor_src->stage_painted_handler_id);
+  monitor_src->stage_painted_handler_id = 0;
+}
+
+static void
+meta_screen_cast_monitor_stream_src_record_frame (MetaScreenCastStreamSrc *src,
+                                                  uint8_t                 *data)
+{
+  MetaScreenCastMonitorStreamSrc *monitor_src =
+    META_SCREEN_CAST_MONITOR_STREAM_SRC (src);
+  ClutterStage *stage;
+  MetaMonitor *monitor;
+  MetaLogicalMonitor *logical_monitor;
+
+  stage = get_stage (monitor_src);
+  monitor = get_monitor (monitor_src);
+  logical_monitor = meta_monitor_get_logical_monitor (monitor);
+  clutter_stage_capture_into (stage, FALSE, &logical_monitor->rect, data);
+}
 
-  parent_class->finalize (object);
+MetaScreenCastMonitorStreamSrc *
+meta_screen_cast_monitor_stream_src_new (MetaScreenCastMonitorStream  *monitor_stream,
+                                         const char                   *stream_id,
+                                         GError                      **error)
+{
+  return g_initable_new (META_TYPE_SCREEN_CAST_MONITOR_STREAM_SRC,
+                         NULL,
+                         error,
+                         "stream-id", stream_id,
+                         "stream", monitor_stream,
+                         NULL);
 }
 
 static void
@@ -169,13 +166,11 @@ meta_screen_cast_monitor_stream_src_init (MetaScreenCastMonitorStreamSrc *monito
 static void
 meta_screen_cast_monitor_stream_src_class_init (MetaScreenCastMonitorStreamSrcClass *klass)
 {
-  GObjectClass *object_class = G_OBJECT_CLASS (klass);
   MetaScreenCastStreamSrcClass *src_class =
     META_SCREEN_CAST_STREAM_SRC_CLASS (klass);
 
-  object_class->constructed = meta_screen_cast_monitor_stream_src_constructed;
-  object_class->finalize = meta_screen_cast_monitor_stream_src_finalize;
-
   src_class->get_specs = meta_screen_cast_monitor_stream_src_get_specs;
+  src_class->enable = meta_screen_cast_monitor_stream_src_enable;
+  src_class->disable = meta_screen_cast_monitor_stream_src_disable;
   src_class->record_frame = meta_screen_cast_monitor_stream_src_record_frame;
 }
diff --git a/src/backends/meta-screen-cast-stream-src.c b/src/backends/meta-screen-cast-stream-src.c
index 214fdbe..9204635 100644
--- a/src/backends/meta-screen-cast-stream-src.c
+++ b/src/backends/meta-screen-cast-stream-src.c
@@ -89,6 +89,8 @@ typedef struct _MetaScreenCastStreamSrcPrivate
   MetaPipeWireSource *pipewire_source;
   struct spa_hook pipewire_remote_listener;
 
+  gboolean is_enabled;
+
   struct pw_stream *pipewire_stream;
   struct spa_hook pipewire_stream_listener;
 
@@ -197,6 +199,37 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src)
   pw_stream_send_buffer (priv->pipewire_stream, buffer_id);
 }
 
+static gboolean
+meta_screen_cast_stream_src_is_enabled (MetaScreenCastStreamSrc *src)
+{
+  MetaScreenCastStreamSrcPrivate *priv =
+    meta_screen_cast_stream_src_get_instance_private (src);
+
+  return priv->is_enabled;
+}
+
+static void
+meta_screen_cast_stream_src_enable (MetaScreenCastStreamSrc *src)
+{
+  MetaScreenCastStreamSrcPrivate *priv =
+    meta_screen_cast_stream_src_get_instance_private (src);
+
+  META_SCREEN_CAST_STREAM_SRC_GET_CLASS (src)->enable (src);
+
+  priv->is_enabled = TRUE;
+}
+
+static void
+meta_screen_cast_stream_src_disable (MetaScreenCastStreamSrc *src)
+{
+  MetaScreenCastStreamSrcPrivate *priv =
+    meta_screen_cast_stream_src_get_instance_private (src);
+
+  META_SCREEN_CAST_STREAM_SRC_GET_CLASS (src)->disable (src);
+
+  priv->is_enabled = FALSE;
+}
+
 static void
 meta_screen_cast_stream_src_notify_closed (MetaScreenCastStreamSrc *src)
 {
@@ -222,7 +255,12 @@ on_stream_state_changed (void                 *data,
     case PW_STREAM_STATE_CONFIGURE:
     case PW_STREAM_STATE_READY:
     case PW_STREAM_STATE_PAUSED:
+      if (meta_screen_cast_stream_src_is_enabled (src))
+        meta_screen_cast_stream_src_disable (src);
+      break;
     case PW_STREAM_STATE_STREAMING:
+      if (!meta_screen_cast_stream_src_is_enabled (src))
+        meta_screen_cast_stream_src_enable (src);
       break;
     }
 }
@@ -540,6 +578,9 @@ meta_screen_cast_stream_src_finalize (GObject *object)
   MetaScreenCastStreamSrcPrivate *priv =
     meta_screen_cast_stream_src_get_instance_private (src);
 
+  if (meta_screen_cast_stream_src_is_enabled (src))
+    meta_screen_cast_stream_src_disable (src);
+
   g_clear_pointer (&priv->pipewire_stream, (GDestroyNotify) pw_stream_destroy);
   pw_remote_destroy (priv->pipewire_remote);
   pw_core_destroy (priv->pipewire_core);
diff --git a/src/backends/meta-screen-cast-stream-src.h b/src/backends/meta-screen-cast-stream-src.h
index 7e7ecb5..ebd5f72 100644
--- a/src/backends/meta-screen-cast-stream-src.h
+++ b/src/backends/meta-screen-cast-stream-src.h
@@ -44,6 +44,8 @@ struct _MetaScreenCastStreamSrcClass
                       int                     *width,
                       int                     *height,
                       float                   *frame_rate);
+  void (* enable) (MetaScreenCastStreamSrc *src);
+  void (* disable) (MetaScreenCastStreamSrc *src);
   void (* record_frame) (MetaScreenCastStreamSrc *src,
                          uint8_t                 *data);
 };


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]