ges: Place imagefreeze at right place
authorThibault Saunier <tsaunier@igalia.com>
Sat, 11 Apr 2020 15:40:06 +0000 (11:40 -0400)
committerGStreamer Merge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Mon, 13 Apr 2020 11:56:46 +0000 (11:56 +0000)
Negotiation fails when having the imagefreeze after videorate and
frame positioning won't happen after seeks if we do not put it
before the postioner

ges/ges-image-source.c
ges/ges-video-uri-source.c

index 49661b60214c3eb89e06e40415e3467d60e42f56..8b7ee455dce466e719667f188d152006cc7a60df 100644 (file)
@@ -97,7 +97,7 @@ ges_image_source_dispose (GObject * object)
 }
 
 static void
-pad_added_cb (GstElement * timeline, GstPad * pad, GstElement * scale)
+pad_added_cb (GstElement * source, GstPad * pad, GstElement * scale)
 {
   GstPad *sinkpad;
   GstPadLinkReturn ret;
index f20fe4fd719491f6493e7d2dbcb5c080756e949e..dea68f982584fc82ec84054c18becb44927268b2 100644 (file)
@@ -216,6 +216,13 @@ G_DEFINE_TYPE_WITH_CODE (GESVideoUriSource, ges_video_uri_source,
     G_IMPLEMENT_INTERFACE (GES_TYPE_EXTRACTABLE,
         ges_extractable_interface_init));
 
+static gboolean
+_find_positioner (GstElement * a, GstElement * b)
+{
+  return !g_strcmp0 (GST_OBJECT_NAME (gst_element_get_factory (a)),
+      "framepositioner");
+}
+
 
 /* GObject VMethods */
 static gboolean
@@ -229,8 +236,16 @@ ges_video_uri_source_create_filters (GESVideoSource * source,
       ->ABI.abi.create_filters (source, elements, needs_converters))
     return FALSE;
 
-  if (ges_uri_source_asset_is_image (GES_URI_SOURCE_ASSET (asset)))
-    g_ptr_array_add (elements, gst_element_factory_make ("imagefreeze", NULL));
+  if (ges_uri_source_asset_is_image (GES_URI_SOURCE_ASSET (asset))) {
+    guint i;
+
+    g_ptr_array_find_with_equal_func (elements, NULL,
+        (GEqualFunc) _find_positioner, &i);
+    /* Adding the imagefreeze right before the positionner so positioning can happen
+     * properly */
+    g_ptr_array_insert (elements, i,
+        gst_element_factory_make ("imagefreeze", NULL));
+  }
 
   return TRUE;
 }