screen-cast: Let the reason for recording determine what to record

E.g. we'll have pointer movement that, if no painting is already
scheduled, should only send new cursor metadata without any new pixel
buffer. When this happens, tell next step to not record the pixels if
this was the case, instead of having it rediscover this itself.

Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/1323
https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1351
This commit is contained in:
Jonas Ådahl 2020-07-03 16:52:43 +02:00
parent 92db8902d9
commit cf88d64882
4 changed files with 34 additions and 29 deletions

View File

@ -191,7 +191,7 @@ sync_cursor_state (MetaScreenCastMonitorStreamSrc *monitor_src)
if (clutter_stage_is_redraw_queued (stage)) if (clutter_stage_is_redraw_queued (stage))
return; return;
flags = META_SCREEN_CAST_RECORD_FLAG_NONE; flags = META_SCREEN_CAST_RECORD_FLAG_CURSOR_ONLY;
meta_screen_cast_stream_src_maybe_record_frame (src, flags); meta_screen_cast_stream_src_maybe_record_frame (src, flags);
} }
@ -376,9 +376,6 @@ meta_screen_cast_monitor_stream_src_record_to_buffer (MetaScreenCastStreamSrc *s
MetaLogicalMonitor *logical_monitor; MetaLogicalMonitor *logical_monitor;
stage = get_stage (monitor_src); stage = get_stage (monitor_src);
if (!clutter_stage_is_redraw_queued (stage))
return FALSE;
monitor = get_monitor (monitor_src); monitor = get_monitor (monitor_src);
logical_monitor = meta_monitor_get_logical_monitor (monitor); logical_monitor = meta_monitor_get_logical_monitor (monitor);
clutter_stage_capture_into (stage, FALSE, &logical_monitor->rect, data); clutter_stage_capture_into (stage, FALSE, &logical_monitor->rect, data);

View File

@ -472,6 +472,8 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src,
return; return;
} }
if (!(flags & META_SCREEN_CAST_RECORD_FLAG_CURSOR_ONLY))
{
if (do_record_frame (src, spa_buffer, data)) if (do_record_frame (src, spa_buffer, data))
{ {
struct spa_meta_region *spa_meta_video_crop; struct spa_meta_region *spa_meta_video_crop;
@ -505,6 +507,11 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src,
{ {
spa_buffer->datas[0].chunk->size = 0; spa_buffer->datas[0].chunk->size = 0;
} }
}
else
{
spa_buffer->datas[0].chunk->size = 0;
}
maybe_record_cursor (src, spa_buffer); maybe_record_cursor (src, spa_buffer);

View File

@ -40,6 +40,7 @@ typedef struct _MetaScreenCastStream MetaScreenCastStream;
typedef enum _MetaScreenCastRecordFlag typedef enum _MetaScreenCastRecordFlag
{ {
META_SCREEN_CAST_RECORD_FLAG_NONE = 0, META_SCREEN_CAST_RECORD_FLAG_NONE = 0,
META_SCREEN_CAST_RECORD_FLAG_CURSOR_ONLY = 1 << 0,
} MetaScreenCastRecordFlag; } MetaScreenCastRecordFlag;
#define META_TYPE_SCREEN_CAST_STREAM_SRC (meta_screen_cast_stream_src_get_type ()) #define META_TYPE_SCREEN_CAST_STREAM_SRC (meta_screen_cast_stream_src_get_type ())

View File

@ -329,7 +329,7 @@ screen_cast_window_damaged (MetaWindowActor *actor,
MetaScreenCastStreamSrc *src = META_SCREEN_CAST_STREAM_SRC (window_src); MetaScreenCastStreamSrc *src = META_SCREEN_CAST_STREAM_SRC (window_src);
MetaScreenCastRecordFlag flags; MetaScreenCastRecordFlag flags;
flags = META_SCREEN_CAST_RECORD_FLAG_NONE; flags = META_SCREEN_CAST_RECORD_FLAG_CURSOR_ONLY;
meta_screen_cast_stream_src_maybe_record_frame (src, flags); meta_screen_cast_stream_src_maybe_record_frame (src, flags);
} }
@ -375,7 +375,7 @@ sync_cursor_state (MetaScreenCastWindowStreamSrc *window_src)
if (meta_screen_cast_window_has_damage (window_src->screen_cast_window)) if (meta_screen_cast_window_has_damage (window_src->screen_cast_window))
return; return;
flags = META_SCREEN_CAST_RECORD_FLAG_NONE; flags = META_SCREEN_CAST_RECORD_FLAG_CURSOR_ONLY;
meta_screen_cast_stream_src_maybe_record_frame (src, flags); meta_screen_cast_stream_src_maybe_record_frame (src, flags);
} }