From 84580ebf0821c9925bea27b4f3787a1af7fe33de Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Wed, 6 Dec 2023 16:45:18 -0300 Subject: [PATCH] ges: framepositioner: Make zorder controllable and expose it And add a test for it Part-of: --- .../ges/ges-video-source.c | 2 +- .../ges/gstframepositioner.c | 8 ++- .../tests/check/ges/test-utils.h | 2 + .../tests/check/meson.build | 1 + .../check/scenarios/check-zorder.validatetest | 61 +++++++++++++++++++ 5 files changed, 71 insertions(+), 3 deletions(-) create mode 100644 subprojects/gst-editing-services/tests/check/scenarios/check-zorder.validatetest diff --git a/subprojects/gst-editing-services/ges/ges-video-source.c b/subprojects/gst-editing-services/ges/ges-video-source.c index aeb92df688..502f034b5b 100644 --- a/subprojects/gst-editing-services/ges/ges-video-source.c +++ b/subprojects/gst-editing-services/ges/ges-video-source.c @@ -116,7 +116,7 @@ ges_video_source_create_filters (GESVideoSource * self, GPtrArray * elements, GstElement *positioner, *videoflip, *capsfilter, *videorate; const gchar *positioner_props[] = { "alpha", "posx", "fposx", "posy", "fposy", "width", "fwidth", - "height", "fheight", "operator", NULL + "height", "fheight", "operator", "zorder", NULL }; const gchar *videoflip_props[] = { "video-direction", NULL }; gchar *ename = NULL; diff --git a/subprojects/gst-editing-services/ges/gstframepositioner.c b/subprojects/gst-editing-services/ges/gstframepositioner.c index 38b55520f5..aa4f558ab5 100644 --- a/subprojects/gst-editing-services/ges/gstframepositioner.c +++ b/subprojects/gst-editing-services/ges/gstframepositioner.c @@ -595,8 +595,12 @@ gst_frame_positioner_class_init (GstFramePositionerClass * klass) * The desired z order for the stream. */ properties[PROP_ZORDER] = - g_param_spec_uint ("zorder", "zorder", "z order of the stream", 0, - G_MAXUINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + g_param_spec_uint ("zorder", "zorder", + "z order of the stream.\n\n" + "**WARNING**: Setting it manually overrides the " + "#GESLayer:priority and should be used very carefully", 0, + G_MAXUINT, 0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE); /** * gesframepositioner:width: diff --git a/subprojects/gst-editing-services/tests/check/ges/test-utils.h b/subprojects/gst-editing-services/tests/check/ges/test-utils.h index e6adf4cac0..dadd770bcf 100644 --- a/subprojects/gst-editing-services/tests/check/ges/test-utils.h +++ b/subprojects/gst-editing-services/tests/check/ges/test-utils.h @@ -287,6 +287,8 @@ G_STMT_START { \ continue; \ if (g_strcmp0 (prop->name, "parent") == 0) \ continue; \ + if (g_strcmp0 (prop->name, "zorder") == 0) \ + continue; \ g_value_init (&val1, prop->value_type); \ g_value_init (&val2, prop->value_type); \ ges_timeline_element_get_child_property_by_pspec ( \ diff --git a/subprojects/gst-editing-services/tests/check/meson.build b/subprojects/gst-editing-services/tests/check/meson.build index f3e273d9e5..a093a9f95e 100644 --- a/subprojects/gst-editing-services/tests/check/meson.build +++ b/subprojects/gst-editing-services/tests/check/meson.build @@ -102,6 +102,7 @@ if gstvalidate_dep.found() and not get_option('tools').disabled() 'check_keyframes_in_compositor_two_sources': true, 'check-clip-positioning': true, 'set-layer-on-command-line': true, + 'check-zorder': true, } foreach scenario, is_validatetest: scenarios diff --git a/subprojects/gst-editing-services/tests/check/scenarios/check-zorder.validatetest b/subprojects/gst-editing-services/tests/check/scenarios/check-zorder.validatetest new file mode 100644 index 0000000000..a12eda3ef9 --- /dev/null +++ b/subprojects/gst-editing-services/tests/check/scenarios/check-zorder.validatetest @@ -0,0 +1,61 @@ +meta, + tool = "ges-launch-$(gst_api_version)", + handles-states=true, + args = { + --track-types, video, + --videosink, "fakevideosink name=videosink sync=true", + --video-caps, "video/x-raw,format=I420,width=320,height=240,framerate=10/1", + } + +remove-feature, name=queue + +# Add two overlapping clips on different layers +add-clip, name=c0, asset-id="pattern=red", layer-priority=0, type=GESTestClip, start=0, duration=2.0 +add-clip, name=c1, asset-id="pattern=blue", layer-priority=1, type=GESTestClip, start=0, duration=2.0 + +# Set initial properties for both clips +set-child-properties, element-name=c0, width=200, height=150, posx=0, posy=0, pattern=red +set-child-properties, element-name=c1, width=200, height=150, posx=120, posy=90, pattern=blue + +play +crank-clock +wait, on-clock=true + +# Now manually set zorder to reverse the stacking +# Make c0 appear on top by giving it a lower zorder value +set-child-properties, element-name=c0, zorder=1 +set-child-properties, element-name=c1, zorder=2 + +# Verify the zorder values were set +check-child-properties, element-name=c0, zorder=1 +check-child-properties, element-name=c1, zorder=2 + +# Test controllable aspect - set up keyframes for zorder +set-control-source, element-name=c0, property-name=zorder, binding-type=direct-absolute +set-control-source, element-name=c1, property-name=zorder, binding-type=direct-absolute + +# At 1 second, swap the zorder values +add-keyframe, element-name=c0, timestamp=0.0, property-name=zorder, value=1 +add-keyframe, element-name=c0, timestamp=1.0, property-name=zorder, value=2 +add-keyframe, element-name=c1, timestamp=0.0, property-name=zorder, value=2 +add-keyframe, element-name=c1, timestamp=1.0, property-name=zorder, value=1 + +crank-clock, repeat=8 +wait, on-clock=true + +# Should now be at 0.8 seconds +check-position, expected-position=0.8 +check-properties, + gessmartmixer0-compositor.sink_0::zorder=2, + gessmartmixer0-compositor.sink_1::zorder=1 + +# Crank 3 more times to reach 1.1 seconds (past the 1.0s keyframe) +crank-clock, repeat=3 +wait, on-clock=true + +# Should now be at 1.1 seconds, verify the zorder values swapped after 1 second animation +check-properties, + gessmartmixer0-compositor.sink_0::zorder=2, + gessmartmixer0-compositor.sink_1::zorder=1 + +stop