tests/screen-cast: Test virtual stream resizing
This test resizes the stream by updating the PipeWire stream properties. This triggers a format negotiation, that results in the buffers being reallocated with the new size. The test makes sure we eventually receive this new size. Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2270>
This commit is contained in:
parent
c49037469a
commit
88cfd31f18
@ -369,10 +369,39 @@ stream_wait_for_streaming (Stream *stream)
|
|||||||
static G_GNUC_UNUSED void
|
static G_GNUC_UNUSED void
|
||||||
stream_wait_for_render (Stream *stream)
|
stream_wait_for_render (Stream *stream)
|
||||||
{
|
{
|
||||||
while (stream->buffer_count == 0)
|
int initial_buffer_count = stream->buffer_count;
|
||||||
|
|
||||||
|
while (stream->buffer_count == initial_buffer_count)
|
||||||
g_main_context_iteration (NULL, TRUE);
|
g_main_context_iteration (NULL, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
stream_resize (Stream *stream,
|
||||||
|
int width,
|
||||||
|
int height)
|
||||||
|
{
|
||||||
|
uint8_t params_buffer[1024];
|
||||||
|
struct spa_pod_builder pod_builder;
|
||||||
|
const struct spa_pod *params[1];
|
||||||
|
struct spa_rectangle rect;
|
||||||
|
|
||||||
|
stream->target_width = width;
|
||||||
|
stream->target_height = height;
|
||||||
|
|
||||||
|
rect = SPA_RECTANGLE (width, height);
|
||||||
|
|
||||||
|
pod_builder = SPA_POD_BUILDER_INIT (params_buffer, sizeof (params_buffer));
|
||||||
|
|
||||||
|
params[0] = spa_pod_builder_add_object (
|
||||||
|
&pod_builder,
|
||||||
|
SPA_TYPE_OBJECT_Format, SPA_PARAM_EnumFormat,
|
||||||
|
SPA_FORMAT_VIDEO_size, SPA_POD_Rectangle (&rect),
|
||||||
|
0);
|
||||||
|
|
||||||
|
pw_stream_update_params (stream->pipewire_stream,
|
||||||
|
params, G_N_ELEMENTS (params));
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
on_pipewire_stream_added (MetaDBusScreenCastStream *proxy,
|
on_pipewire_stream_added (MetaDBusScreenCastStream *proxy,
|
||||||
unsigned int node_id,
|
unsigned int node_id,
|
||||||
@ -558,13 +587,31 @@ main (int argc,
|
|||||||
|
|
||||||
screen_cast = screen_cast_new ();
|
screen_cast = screen_cast_new ();
|
||||||
session = screen_cast_create_session (screen_cast);
|
session = screen_cast_create_session (screen_cast);
|
||||||
stream = session_record_virtual (session, 50, 50);
|
stream = session_record_virtual (session, 50, 40);
|
||||||
|
|
||||||
session_start (session);
|
session_start (session);
|
||||||
|
|
||||||
|
/* Check that we receive the initial frame */
|
||||||
|
|
||||||
stream_wait_for_node (stream);
|
stream_wait_for_node (stream);
|
||||||
stream_wait_for_streaming (stream);
|
stream_wait_for_streaming (stream);
|
||||||
stream_wait_for_render (stream);
|
stream_wait_for_render (stream);
|
||||||
|
g_assert_cmpint (stream->spa_format.size.width, ==, 50);
|
||||||
|
g_assert_cmpint (stream->spa_format.size.height, ==, 40);
|
||||||
|
|
||||||
|
/* Check that resizing works */
|
||||||
|
stream_resize (stream, 70, 60);
|
||||||
|
while (TRUE)
|
||||||
|
{
|
||||||
|
stream_wait_for_render (stream);
|
||||||
|
|
||||||
|
if (stream->spa_format.size.width == 70 &&
|
||||||
|
stream->spa_format.size.height == 60)
|
||||||
|
break;
|
||||||
|
|
||||||
|
g_assert_cmpint (stream->spa_format.size.width, ==, 50);
|
||||||
|
g_assert_cmpint (stream->spa_format.size.height, ==, 40);
|
||||||
|
}
|
||||||
|
|
||||||
session_stop (session);
|
session_stop (session);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user