timeline-element: make max-duration cap in-point
authorHenry Wilkes <hwilkes@igalia.com>
Tue, 10 Mar 2020 15:27:20 +0000 (15:27 +0000)
committerHenry Wilkes <hwilkes@igalia.com>
Mon, 16 Mar 2020 14:19:52 +0000 (14:19 +0000)
Do not allow the in-point to exceed the max-duration of any timeline
element.

ges/ges-clip.c
ges/ges-internal.h
ges/ges-timeline-element.c
ges/ges-track-element.c
tests/check/ges/clip.c

index 52d7578b92d2f709b83e054106766d53c3649721..6d1044bf03d8f63cb6e78df9f586a520878a0437 100644 (file)
@@ -292,8 +292,39 @@ _set_start (GESTimelineElement * element, GstClockTime start)
   return TRUE;
 }
 
+/* Whether @clip can have its in-point set to @inpoint because none of
+ * its children have a max-duration below it */
+gboolean
+ges_clip_can_set_inpoint_of_child (GESClip * clip, GESTimelineElement * child,
+    GstClockTime inpoint)
+{
+  GList *tmp;
+
+  /* don't bother checking if we are setting the value */
+  if (clip->priv->setting_inpoint)
+    return TRUE;
+
+  /* non-core children do not effect our in-point */
+  if (!ELEMENT_FLAG_IS_SET (child, GES_TRACK_ELEMENT_IS_CORE))
+    return TRUE;
+
+  for (tmp = GES_CONTAINER_CHILDREN (clip); tmp; tmp = tmp->next) {
+    GESTimelineElement *child = tmp->data;
+
+    if (ELEMENT_FLAG_IS_SET (child, GES_TRACK_ELEMENT_IS_CORE)
+        && ges_track_element_has_internal_source (GES_TRACK_ELEMENT (child))) {
+      if (GST_CLOCK_TIME_IS_VALID (child->maxduration)
+          && child->maxduration < inpoint)
+        return FALSE;
+    }
+  }
+  return TRUE;
+}
+
+/* returns TRUE if we did not break early */
 static gboolean
-_set_inpoint (GESTimelineElement * element, GstClockTime inpoint)
+_set_childrens_inpoint (GESTimelineElement * element, GstClockTime inpoint,
+    gboolean break_on_failure)
 {
   GList *tmp;
   GESClipPrivate *priv = GES_CLIP (element)->priv;
@@ -303,14 +334,31 @@ _set_inpoint (GESTimelineElement * element, GstClockTime inpoint)
     GESTimelineElement *child = tmp->data;
 
     if (ELEMENT_FLAG_IS_SET (child, GES_TRACK_ELEMENT_IS_CORE)
-        && ges_track_element_has_internal_source (GES_TRACK_ELEMENT (child)))
-      _set_inpoint0 (child, inpoint);
+        && ges_track_element_has_internal_source (GES_TRACK_ELEMENT (child))) {
+      if (!_set_inpoint0 (child, inpoint)) {
+        GST_ERROR_OBJECT ("Could not set the in-point of child %"
+            GES_FORMAT " to %" GST_TIME_FORMAT, GES_ARGS (child),
+            GST_TIME_ARGS (inpoint));
+        if (break_on_failure)
+          return FALSE;
+      }
+    }
   }
   priv->setting_inpoint = FALSE;
 
   return TRUE;
 }
 
+static gboolean
+_set_inpoint (GESTimelineElement * element, GstClockTime inpoint)
+{
+  if (!_set_childrens_inpoint (element, inpoint, TRUE)) {
+    _set_childrens_inpoint (element, element->inpoint, FALSE);
+    return FALSE;
+  }
+  return TRUE;
+}
+
 static gboolean
 _set_duration (GESTimelineElement * element, GstClockTime duration)
 {
@@ -355,7 +403,11 @@ _set_max_duration (GESTimelineElement * element, GstClockTime maxduration)
 
     if (ELEMENT_FLAG_IS_SET (child, GES_TRACK_ELEMENT_IS_CORE)
         && ges_track_element_has_internal_source (GES_TRACK_ELEMENT (child))) {
-      ges_timeline_element_set_max_duration (child, maxduration);
+      if (!ges_timeline_element_set_max_duration (child, maxduration)) {
+        GST_ERROR_OBJECT ("Could not set the max-duration of child %"
+            GES_FORMAT " to %" GST_TIME_FORMAT, GES_ARGS (child),
+            GST_TIME_ARGS (maxduration));
+      }
       if (GST_CLOCK_TIME_IS_VALID (child->maxduration)) {
         new_min = GST_CLOCK_TIME_IS_VALID (new_min) ?
             MIN (new_min, child->maxduration) : child->maxduration;
@@ -504,13 +556,22 @@ _add_child (GESContainer * container, GESTimelineElement * element)
      * other core clip. In particular, they are *not* added to the list of
      * added effects, so we don not increase nb_effects. */
 
-    /* Always add at the same priority, on top of existing effects */
-    _set_priority0 (element, min_prio + priv->nb_effects);
-
     /* Set the core element to have the same in-point, which we don't
      * apply to effects */
-    if (ges_track_element_has_internal_source (GES_TRACK_ELEMENT (element)))
-      _set_inpoint0 (element, _INPOINT (container));
+    if (ges_track_element_has_internal_source (GES_TRACK_ELEMENT (element))) {
+      /* adding can fail if the max-duration of the element is smaller
+       * than the current in-point of the clip */
+      if (!_set_inpoint0 (element, _INPOINT (container))) {
+        GST_ERROR_OBJECT (element, "Could not set the in-point of the "
+            "element %" GES_FORMAT " to %" GST_TIME_FORMAT ". Not adding "
+            "as a child", GES_ARGS (element),
+            GST_TIME_ARGS (_INPOINT (container)));
+        return FALSE;
+      }
+    }
+
+    /* Always add at the same priority, on top of existing effects */
+    _set_priority0 (element, min_prio + priv->nb_effects);
   } else if (GES_CLIP_CLASS_CAN_ADD_EFFECTS (klass)
       && GES_IS_BASE_EFFECT (element)) {
     GList *tmp;
index 11973959f5e3d599a8e5a1892c057510f4050215..ade2393c157cc56a8ddba3d29ce422e835c2d06c 100644 (file)
@@ -394,6 +394,7 @@ G_GNUC_INTERNAL gboolean          ges_clip_is_moving_from_layer   (GESClip *clip
 G_GNUC_INTERNAL void              ges_clip_set_moving_from_layer  (GESClip *clip, gboolean is_moving);
 G_GNUC_INTERNAL GESTrackElement*  ges_clip_create_track_element   (GESClip *clip, GESTrackType type);
 G_GNUC_INTERNAL GList*            ges_clip_create_track_elements  (GESClip *clip, GESTrackType type);
+G_GNUC_INTERNAL gboolean          ges_clip_can_set_inpoint_of_child (GESClip * clip, GESTimelineElement * child, GstClockTime inpoint);
 
 /****************************************************
  *              GESLayer                            *
index 3cabaef92647ae185acddcc081ab52559bcfe634..ad85b8a241069ea1189fe8575efd8510f2aad4fc 100644 (file)
@@ -453,6 +453,11 @@ ges_timeline_element_class_init (GESTimelineElementClass * klass)
    * difference in nanoseconds using the time coordinates of the internal
    * content).
    *
+   * This will act as a cap on the #GESTimelineElement:in-point of the
+   * element (which is in the same time coordinates), and will sometimes
+   * be used to limit the #GESTimelineElement:duration of the element in
+   * the timeline.
+   *
    * For example, for a #GESVideoUriSource that references some media
    * file, this would be the length of the media file.
    *
@@ -1098,9 +1103,9 @@ ges_timeline_element_set_start (GESTimelineElement * self, GstClockTime start)
  * @self: A #GESTimelineElement
  * @inpoint: The in-point, in internal time coordinates
  *
- * Sets #GESTimelineElement:in-point for the element. This may fail if
- * the element does not have enough internal content to last for the
- * current #GESTimelineElement:duration after @inpoint.
+ * Sets #GESTimelineElement:in-point for the element. If the new in-point
+ * is above the current #GESTimelineElement:max-duration of the element,
+ * this method will fail.
  *
  * Returns: %TRUE if @inpoint could be set for @self.
  */
@@ -1119,6 +1124,14 @@ ges_timeline_element_set_inpoint (GESTimelineElement * self,
   if (G_UNLIKELY (inpoint == self->inpoint))
     return TRUE;
 
+  if (GST_CLOCK_TIME_IS_VALID (self->maxduration)
+      && inpoint > self->maxduration) {
+    GST_WARNING_OBJECT (self, "Can not set an in-point of %" GST_TIME_FORMAT
+        " because it exceeds the element's max-duration: %" GST_TIME_FORMAT,
+        GST_TIME_ARGS (inpoint), GST_TIME_ARGS (self->maxduration));
+    return FALSE;
+  }
+
   klass = GES_TIMELINE_ELEMENT_GET_CLASS (self);
 
   if (klass->set_inpoint) {
@@ -1147,7 +1160,9 @@ ges_timeline_element_set_inpoint (GESTimelineElement * self,
  * @self: A #GESTimelineElement
  * @maxduration: The maximum duration, in internal time coordinates
  *
- * Sets #GESTimelineElement:max-duration for the element.
+ * Sets #GESTimelineElement:max-duration for the element. If the new
+ * maximum duration is below the current #GESTimelineElement:in-point of
+ * the element, this method will fail.
  *
  * Returns: %TRUE if @maxduration could be set for @self.
  */
@@ -1166,6 +1181,14 @@ ges_timeline_element_set_max_duration (GESTimelineElement * self,
   if (G_UNLIKELY (maxduration == self->maxduration))
     return TRUE;
 
+  if (GST_CLOCK_TIME_IS_VALID (maxduration) && self->inpoint > maxduration) {
+    GST_WARNING_OBJECT (self, "Can not set a max-duration of %"
+        GST_TIME_FORMAT " because it lies below the element's in-point: %"
+        GST_TIME_FORMAT, GST_TIME_ARGS (maxduration),
+        GST_TIME_ARGS (self->inpoint));
+    return FALSE;
+  }
+
   klass = GES_TIMELINE_ELEMENT_GET_CLASS (self);
 
   if (klass->set_max_duration) {
index 0c87997108e68861366da4baf857df9ddb012a1c..d3f3381f4064c578b68d0bb9a29ff41250cebd7b 100644 (file)
@@ -600,6 +600,16 @@ _set_inpoint (GESTimelineElement * element, GstClockTime inpoint)
     return FALSE;
   }
 
+  if (GES_IS_CLIP (element->parent)
+      && !ges_clip_can_set_inpoint_of_child (GES_CLIP (element->parent),
+          element, inpoint)) {
+    GST_WARNING_OBJECT (element, "Can not set an in-point of %"
+        GST_TIME_FORMAT " because the parent clip %" GES_FORMAT
+        " would not be able to follow",
+        GST_TIME_ARGS (inpoint), GES_ARGS (element->parent));
+    return FALSE;
+  }
+
   g_object_set (object->priv->nleobject, "inpoint", inpoint, NULL);
   _update_control_bindings (element, inpoint, GST_CLOCK_TIME_NONE);
 
index 16ded049b808c4dbd5aa0f9760193d4b548cd0ab..f64be618e6a5d8d30fa883a850159855d7f0a884 100644 (file)
@@ -1121,7 +1121,7 @@ GST_START_TEST (test_children_max_duration)
         TRUE);
     fail_unless (ges_timeline_element_set_start (effect, 104));
     fail_unless (ges_timeline_element_set_duration (effect, 53));
-    fail_unless (ges_timeline_element_set_max_duration (effect, 1));
+    fail_unless (ges_timeline_element_set_max_duration (effect, 400));
 
     /* adding the effect will change its start and duration, but not its
      * max-duration (or in-point) */
@@ -1130,7 +1130,7 @@ GST_START_TEST (test_children_max_duration)
     CHECK_OBJECT_PROPS_MAX (clip, 5, 30, 20, max_duration);
     CHECK_OBJECT_PROPS_MAX (child0, 5, 30, 20, max_duration);
     CHECK_OBJECT_PROPS_MAX (child1, 5, 30, 20, max_duration);
-    CHECK_OBJECT_PROPS_MAX (effect, 5, 0, 20, 1);
+    CHECK_OBJECT_PROPS_MAX (effect, 5, 0, 20, 400);
 
     /* when setting max_duration of core children, clip will take the
      * minimum value */
@@ -1139,36 +1139,137 @@ GST_START_TEST (test_children_max_duration)
     CHECK_OBJECT_PROPS_MAX (clip, 5, 30, 20, new_max - 1);
     CHECK_OBJECT_PROPS_MAX (child0, 5, 30, 20, new_max - 1);
     CHECK_OBJECT_PROPS_MAX (child1, 5, 30, 20, max_duration);
-    CHECK_OBJECT_PROPS_MAX (effect, 5, 0, 20, 1);
+    CHECK_OBJECT_PROPS_MAX (effect, 5, 0, 20, 400);
 
     fail_unless (ges_timeline_element_set_max_duration (child1, new_max - 2));
 
     CHECK_OBJECT_PROPS_MAX (clip, 5, 30, 20, new_max - 2);
     CHECK_OBJECT_PROPS_MAX (child0, 5, 30, 20, new_max - 1);
     CHECK_OBJECT_PROPS_MAX (child1, 5, 30, 20, new_max - 2);
-    CHECK_OBJECT_PROPS_MAX (effect, 5, 0, 20, 1);
+    CHECK_OBJECT_PROPS_MAX (effect, 5, 0, 20, 400);
 
     fail_unless (ges_timeline_element_set_max_duration (child0, new_max + 1));
 
     CHECK_OBJECT_PROPS_MAX (clip, 5, 30, 20, new_max - 2);
     CHECK_OBJECT_PROPS_MAX (child0, 5, 30, 20, new_max + 1);
     CHECK_OBJECT_PROPS_MAX (child1, 5, 30, 20, new_max - 2);
-    CHECK_OBJECT_PROPS_MAX (effect, 5, 0, 20, 1);
+    CHECK_OBJECT_PROPS_MAX (effect, 5, 0, 20, 400);
+
+    /* can not set in-point above max_duration, nor max_duration below
+     * in-point */
+
+    fail_if (ges_timeline_element_set_max_duration (child0, 29));
+
+    CHECK_OBJECT_PROPS_MAX (clip, 5, 30, 20, new_max - 2);
+    CHECK_OBJECT_PROPS_MAX (child0, 5, 30, 20, new_max + 1);
+    CHECK_OBJECT_PROPS_MAX (child1, 5, 30, 20, new_max - 2);
+    CHECK_OBJECT_PROPS_MAX (effect, 5, 0, 20, 400);
+
+    fail_if (ges_timeline_element_set_max_duration (child1, 29));
+
+    CHECK_OBJECT_PROPS_MAX (clip, 5, 30, 20, new_max - 2);
+    CHECK_OBJECT_PROPS_MAX (child0, 5, 30, 20, new_max + 1);
+    CHECK_OBJECT_PROPS_MAX (child1, 5, 30, 20, new_max - 2);
+    CHECK_OBJECT_PROPS_MAX (effect, 5, 0, 20, 400);
+
+    fail_if (ges_timeline_element_set_max_duration (clip, 29));
+
+    CHECK_OBJECT_PROPS_MAX (clip, 5, 30, 20, new_max - 2);
+    CHECK_OBJECT_PROPS_MAX (child0, 5, 30, 20, new_max + 1);
+    CHECK_OBJECT_PROPS_MAX (child1, 5, 30, 20, new_max - 2);
+    CHECK_OBJECT_PROPS_MAX (effect, 5, 0, 20, 400);
+
+    /* can't set the inpoint to (new_max), even though it is lower than
+     * our own max-duration (new_max + 1) because it is too high for our
+     * sibling child1 */
+    fail_if (ges_timeline_element_set_inpoint (child0, new_max));
+
+    CHECK_OBJECT_PROPS_MAX (clip, 5, 30, 20, new_max - 2);
+    CHECK_OBJECT_PROPS_MAX (child0, 5, 30, 20, new_max + 1);
+    CHECK_OBJECT_PROPS_MAX (child1, 5, 30, 20, new_max - 2);
+    CHECK_OBJECT_PROPS_MAX (effect, 5, 0, 20, 400);
+
+    fail_if (ges_timeline_element_set_inpoint (child1, new_max));
+
+    CHECK_OBJECT_PROPS_MAX (clip, 5, 30, 20, new_max - 2);
+    CHECK_OBJECT_PROPS_MAX (child0, 5, 30, 20, new_max + 1);
+    CHECK_OBJECT_PROPS_MAX (child1, 5, 30, 20, new_max - 2);
+    CHECK_OBJECT_PROPS_MAX (effect, 5, 0, 20, 400);
+
+    fail_if (ges_timeline_element_set_inpoint (clip, new_max));
+
+    CHECK_OBJECT_PROPS_MAX (clip, 5, 30, 20, new_max - 2);
+    CHECK_OBJECT_PROPS_MAX (child0, 5, 30, 20, new_max + 1);
+    CHECK_OBJECT_PROPS_MAX (child1, 5, 30, 20, new_max - 2);
+    CHECK_OBJECT_PROPS_MAX (effect, 5, 0, 20, 400);
+
+    /* setting below new_max is ok */
+    fail_unless (ges_timeline_element_set_inpoint (child0, 15));
+
+    CHECK_OBJECT_PROPS_MAX (clip, 5, 15, 20, new_max - 2);
+    CHECK_OBJECT_PROPS_MAX (child0, 5, 15, 20, new_max + 1);
+    CHECK_OBJECT_PROPS_MAX (child1, 5, 15, 20, new_max - 2);
+    CHECK_OBJECT_PROPS_MAX (effect, 5, 0, 20, 400);
+
+    fail_unless (ges_timeline_element_set_inpoint (child1, 25));
+
+    CHECK_OBJECT_PROPS_MAX (clip, 5, 25, 20, new_max - 2);
+    CHECK_OBJECT_PROPS_MAX (child0, 5, 25, 20, new_max + 1);
+    CHECK_OBJECT_PROPS_MAX (child1, 5, 25, 20, new_max - 2);
+    CHECK_OBJECT_PROPS_MAX (effect, 5, 0, 20, 400);
+
+    fail_unless (ges_timeline_element_set_inpoint (clip, 30));
+
+    CHECK_OBJECT_PROPS_MAX (clip, 5, 30, 20, new_max - 2);
+    CHECK_OBJECT_PROPS_MAX (child0, 5, 30, 20, new_max + 1);
+    CHECK_OBJECT_PROPS_MAX (child1, 5, 30, 20, new_max - 2);
+    CHECK_OBJECT_PROPS_MAX (effect, 5, 0, 20, 400);
 
     /* non-core has no effect */
-    fail_unless (ges_timeline_element_set_max_duration (effect, new_max - 4));
+    fail_unless (ges_timeline_element_set_max_duration (effect, new_max + 500));
+
+    CHECK_OBJECT_PROPS_MAX (clip, 5, 30, 20, new_max - 2);
+    CHECK_OBJECT_PROPS_MAX (child0, 5, 30, 20, new_max + 1);
+    CHECK_OBJECT_PROPS_MAX (child1, 5, 30, 20, new_max - 2);
+    CHECK_OBJECT_PROPS_MAX (effect, 5, 0, 20, new_max + 500);
+
+    /* can set the in-point of non-core to be higher than the max_duration
+     * of the clip */
+    fail_unless (ges_timeline_element_set_inpoint (effect, new_max + 2));
+
+    CHECK_OBJECT_PROPS_MAX (clip, 5, 30, 20, new_max - 2);
+    CHECK_OBJECT_PROPS_MAX (child0, 5, 30, 20, new_max + 1);
+    CHECK_OBJECT_PROPS_MAX (child1, 5, 30, 20, new_max - 2);
+    CHECK_OBJECT_PROPS_MAX (effect, 5, new_max + 2, 20, new_max + 500);
+
+    /* but not higher than our own */
+    fail_if (ges_timeline_element_set_inpoint (effect, new_max + 501));
+
+    CHECK_OBJECT_PROPS_MAX (clip, 5, 30, 20, new_max - 2);
+    CHECK_OBJECT_PROPS_MAX (child0, 5, 30, 20, new_max + 1);
+    CHECK_OBJECT_PROPS_MAX (child1, 5, 30, 20, new_max - 2);
+    CHECK_OBJECT_PROPS_MAX (effect, 5, new_max + 2, 20, new_max + 500);
+
+    fail_if (ges_timeline_element_set_max_duration (effect, new_max + 1));
+
+    CHECK_OBJECT_PROPS_MAX (clip, 5, 30, 20, new_max - 2);
+    CHECK_OBJECT_PROPS_MAX (child0, 5, 30, 20, new_max + 1);
+    CHECK_OBJECT_PROPS_MAX (child1, 5, 30, 20, new_max - 2);
+    CHECK_OBJECT_PROPS_MAX (effect, 5, new_max + 2, 20, new_max + 500);
+
+    fail_unless (ges_timeline_element_set_inpoint (effect, 0));
 
     CHECK_OBJECT_PROPS_MAX (clip, 5, 30, 20, new_max - 2);
     CHECK_OBJECT_PROPS_MAX (child0, 5, 30, 20, new_max + 1);
     CHECK_OBJECT_PROPS_MAX (child1, 5, 30, 20, new_max - 2);
-    CHECK_OBJECT_PROPS_MAX (effect, 5, 0, 20, new_max - 4);
+    CHECK_OBJECT_PROPS_MAX (effect, 5, 0, 20, new_max + 500);
 
-    fail_unless (ges_timeline_element_set_max_duration (effect, 1));
+    fail_unless (ges_timeline_element_set_max_duration (effect, 400));
 
     CHECK_OBJECT_PROPS_MAX (clip, 5, 30, 20, new_max - 2);
     CHECK_OBJECT_PROPS_MAX (child0, 5, 30, 20, new_max + 1);
     CHECK_OBJECT_PROPS_MAX (child1, 5, 30, 20, new_max - 2);
-    CHECK_OBJECT_PROPS_MAX (effect, 5, 0, 20, 1);
+    CHECK_OBJECT_PROPS_MAX (effect, 5, 0, 20, 400);
 
     /* setting on the clip will set all the core children to the same
      * value */
@@ -1177,7 +1278,7 @@ GST_START_TEST (test_children_max_duration)
     CHECK_OBJECT_PROPS_MAX (clip, 5, 30, 20, 180);
     CHECK_OBJECT_PROPS_MAX (child0, 5, 30, 20, 180);
     CHECK_OBJECT_PROPS_MAX (child1, 5, 30, 20, 180);
-    CHECK_OBJECT_PROPS_MAX (effect, 5, 0, 20, 1);
+    CHECK_OBJECT_PROPS_MAX (effect, 5, 0, 20, 400);
 
     /* register child0 as having no internal source, which means its
      * in-point will be set to 0 and max-duration set to
@@ -1188,7 +1289,7 @@ GST_START_TEST (test_children_max_duration)
     CHECK_OBJECT_PROPS_MAX (clip, 5, 30, 20, 180);
     CHECK_OBJECT_PROPS_MAX (child0, 5, 0, 20, GST_CLOCK_TIME_NONE);
     CHECK_OBJECT_PROPS_MAX (child1, 5, 30, 20, 180);
-    CHECK_OBJECT_PROPS_MAX (effect, 5, 0, 20, 1);
+    CHECK_OBJECT_PROPS_MAX (effect, 5, 0, 20, 400);
 
     /* should not be able to set the max-duration to a valid time */
     fail_if (ges_timeline_element_set_max_duration (child0, 40));
@@ -1196,7 +1297,7 @@ GST_START_TEST (test_children_max_duration)
     CHECK_OBJECT_PROPS_MAX (clip, 5, 30, 20, 180);
     CHECK_OBJECT_PROPS_MAX (child0, 5, 0, 20, GST_CLOCK_TIME_NONE);
     CHECK_OBJECT_PROPS_MAX (child1, 5, 30, 20, 180);
-    CHECK_OBJECT_PROPS_MAX (effect, 5, 0, 20, 1);
+    CHECK_OBJECT_PROPS_MAX (effect, 5, 0, 20, 400);
 
     /* same with child1 */
     /* clock time of the clip should now be GST_CLOCK_TIME_NONE */
@@ -1206,7 +1307,7 @@ GST_START_TEST (test_children_max_duration)
     CHECK_OBJECT_PROPS_MAX (clip, 5, 30, 20, GST_CLOCK_TIME_NONE);
     CHECK_OBJECT_PROPS_MAX (child0, 5, 0, 20, GST_CLOCK_TIME_NONE);
     CHECK_OBJECT_PROPS_MAX (child1, 5, 0, 20, GST_CLOCK_TIME_NONE);
-    CHECK_OBJECT_PROPS_MAX (effect, 5, 0, 20, 1);
+    CHECK_OBJECT_PROPS_MAX (effect, 5, 0, 20, 400);
 
     /* should not be able to set the max of the clip to anything else
      * when it has no core children with an internal source */
@@ -1215,7 +1316,7 @@ GST_START_TEST (test_children_max_duration)
     CHECK_OBJECT_PROPS_MAX (clip, 5, 30, 20, GST_CLOCK_TIME_NONE);
     CHECK_OBJECT_PROPS_MAX (child0, 5, 0, 20, GST_CLOCK_TIME_NONE);
     CHECK_OBJECT_PROPS_MAX (child1, 5, 0, 20, GST_CLOCK_TIME_NONE);
-    CHECK_OBJECT_PROPS_MAX (effect, 5, 0, 20, 1);
+    CHECK_OBJECT_PROPS_MAX (effect, 5, 0, 20, 400);
 
     /* setting back to having an internal source will not immediately
      * change the max-duration (unlike in-point) */
@@ -1225,7 +1326,7 @@ GST_START_TEST (test_children_max_duration)
     CHECK_OBJECT_PROPS_MAX (clip, 5, 30, 20, GST_CLOCK_TIME_NONE);
     CHECK_OBJECT_PROPS_MAX (child0, 5, 30, 20, GST_CLOCK_TIME_NONE);
     CHECK_OBJECT_PROPS_MAX (child1, 5, 0, 20, GST_CLOCK_TIME_NONE);
-    CHECK_OBJECT_PROPS_MAX (effect, 5, 0, 20, 1);
+    CHECK_OBJECT_PROPS_MAX (effect, 5, 0, 20, 400);
 
     /* can now set the max-duration, which will effect the clip */
     fail_unless (ges_timeline_element_set_max_duration (child0, 140));
@@ -1233,7 +1334,7 @@ GST_START_TEST (test_children_max_duration)
     CHECK_OBJECT_PROPS_MAX (clip, 5, 30, 20, 140);
     CHECK_OBJECT_PROPS_MAX (child0, 5, 30, 20, 140);
     CHECK_OBJECT_PROPS_MAX (child1, 5, 0, 20, GST_CLOCK_TIME_NONE);
-    CHECK_OBJECT_PROPS_MAX (effect, 5, 0, 20, 1);
+    CHECK_OBJECT_PROPS_MAX (effect, 5, 0, 20, 400);
 
     ges_track_element_set_has_internal_source (GES_TRACK_ELEMENT (child1),
         TRUE);
@@ -1241,14 +1342,14 @@ GST_START_TEST (test_children_max_duration)
     CHECK_OBJECT_PROPS_MAX (clip, 5, 30, 20, 140);
     CHECK_OBJECT_PROPS_MAX (child0, 5, 30, 20, 140);
     CHECK_OBJECT_PROPS_MAX (child1, 5, 30, 20, GST_CLOCK_TIME_NONE);
-    CHECK_OBJECT_PROPS_MAX (effect, 5, 0, 20, 1);
+    CHECK_OBJECT_PROPS_MAX (effect, 5, 0, 20, 400);
 
     fail_unless (ges_timeline_element_set_max_duration (child1, 130));
 
     CHECK_OBJECT_PROPS_MAX (clip, 5, 30, 20, 130);
     CHECK_OBJECT_PROPS_MAX (child0, 5, 30, 20, 140);
     CHECK_OBJECT_PROPS_MAX (child1, 5, 30, 20, 130);
-    CHECK_OBJECT_PROPS_MAX (effect, 5, 0, 20, 1);
+    CHECK_OBJECT_PROPS_MAX (effect, 5, 0, 20, 400);
 
     /* removing a child may change the max_duration of the clip */
     gst_object_ref (child0);
@@ -1261,7 +1362,7 @@ GST_START_TEST (test_children_max_duration)
     CHECK_OBJECT_PROPS_MAX (clip, 5, 30, 20, 130);
     CHECK_OBJECT_PROPS_MAX (child0, 5, 30, 20, 140);
     CHECK_OBJECT_PROPS_MAX (child1, 5, 30, 20, 130);
-    CHECK_OBJECT_PROPS_MAX (effect, 5, 0, 20, 1);
+    CHECK_OBJECT_PROPS_MAX (effect, 5, 0, 20, 400);
 
     /* new minimum max-duration for the clip when we remove child1 */
     fail_unless (ges_container_remove (GES_CONTAINER (clip), child1));
@@ -1269,7 +1370,7 @@ GST_START_TEST (test_children_max_duration)
     CHECK_OBJECT_PROPS_MAX (clip, 5, 30, 20, 140);
     CHECK_OBJECT_PROPS_MAX (child0, 5, 30, 20, 140);
     CHECK_OBJECT_PROPS_MAX (child1, 5, 30, 20, 130);
-    CHECK_OBJECT_PROPS_MAX (effect, 5, 0, 20, 1);
+    CHECK_OBJECT_PROPS_MAX (effect, 5, 0, 20, 400);
 
     /* with no core-children, the max-duration of the clip is set to
      * GST_CLOCK_TIME_NONE */
@@ -1278,7 +1379,7 @@ GST_START_TEST (test_children_max_duration)
     CHECK_OBJECT_PROPS_MAX (clip, 5, 30, 20, GST_CLOCK_TIME_NONE);
     CHECK_OBJECT_PROPS_MAX (child0, 5, 30, 20, 140);
     CHECK_OBJECT_PROPS_MAX (child1, 5, 30, 20, 130);
-    CHECK_OBJECT_PROPS_MAX (effect, 5, 0, 20, 1);
+    CHECK_OBJECT_PROPS_MAX (effect, 5, 0, 20, 400);
 
     fail_unless (ges_layer_remove_clip (layer, GES_CLIP (clip)));