From 7d34e33ac4efd95502bd41b3fa70461835bc2446 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Fri, 22 Apr 2016 16:06:50 -0300 Subject: [PATCH] title: Do not concider inpoints It does not make sense for titles Handle element with no inpoint handling in the timeline Fixes https://phabricator.freedesktop.org/T7319 --- ges/ges-timeline-element.c | 2 +- ges/ges-timeline.c | 20 +++++++++++++++----- ges/ges-title-clip.c | 7 +++++-- ges/ges-title-source.c | 5 ++++- tests/check/ges/titles.c | 12 ++++++------ 5 files changed, 31 insertions(+), 15 deletions(-) diff --git a/ges/ges-timeline-element.c b/ges/ges-timeline-element.c index 7abc2970dd..b640e77a7e 100644 --- a/ges/ges-timeline-element.c +++ b/ges/ges-timeline-element.c @@ -726,7 +726,7 @@ ges_timeline_element_set_inpoint (GESTimelineElement * self, return; } - GST_WARNING_OBJECT (self, "No set_inpoint virtual method implementation" + GST_DEBUG_OBJECT (self, "No set_inpoint virtual method implementation" " on class %s. Can not set inpoint %" GST_TIME_FORMAT, G_OBJECT_CLASS_NAME (klass), GST_TIME_ARGS (inpoint)); } diff --git a/ges/ges-timeline.c b/ges/ges-timeline.c index ad48951123..ad740a7b69 100644 --- a/ges/ges-timeline.c +++ b/ges/ges-timeline.c @@ -1581,6 +1581,7 @@ ges_timeline_trim_object_simple (GESTimeline * timeline, { GESTimelineElement *toplevel; GESChildrenControlMode old_mode; + gboolean use_inpoint; toplevel = ges_timeline_element_get_toplevel_parent (element); if (position < _START (toplevel) && _START (toplevel) < _START (element)) { @@ -1616,17 +1617,26 @@ ges_timeline_trim_object_simple (GESTimeline * timeline, /* Calculate new values */ position = MIN (position, start + duration); - if (inpoint + position < start) { - GST_INFO_OBJECT (timeline, "Track element %s inpoint would be negative," - " not trimming", GES_TIMELINE_ELEMENT_NAME (track_element)); + use_inpoint = + GES_TIMELINE_ELEMENT_GET_CLASS (track_element)->set_inpoint ? TRUE : + FALSE; + + if (use_inpoint && inpoint + position < start) { + GST_ERROR_OBJECT (timeline, "Track element %s inpoint %" GST_TIME_FORMAT + " would be negative," + " not trimming", GES_TIMELINE_ELEMENT_NAME (track_element), + GST_TIME_ARGS (inpoint)); gst_object_unref (toplevel); return FALSE; } inpoint = inpoint + position - start; real_dur = _END (element) - position; - duration = CLAMP (real_dur, 0, max_duration > inpoint ? - max_duration - inpoint : G_MAXUINT64); + if (use_inpoint) + duration = CLAMP (real_dur, 0, max_duration > inpoint ? + max_duration - inpoint : G_MAXUINT64); + else + duration = real_dur; /* If we already are at max duration or duration == 0 do no useless work */ diff --git a/ges/ges-title-clip.c b/ges/ges-title-clip.c index 0458fecc35..df753118ef 100644 --- a/ges/ges-title-clip.c +++ b/ges/ges-title-clip.c @@ -144,7 +144,9 @@ static void ges_title_clip_class_init (GESTitleClipClass * klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); - GESClipClass *timobj_class = GES_CLIP_CLASS (klass); + GESTimelineElementClass *timeline_element_class = + GES_TIMELINE_ELEMENT_CLASS (klass); + GESClipClass *clip_class = GES_CLIP_CLASS (klass); GESContainerClass *container_class = GES_CONTAINER_CLASS (klass); g_type_class_add_private (klass, sizeof (GESTitleClipPrivate)); @@ -211,7 +213,8 @@ ges_title_clip_class_init (GESTitleClipClass * klass) G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS | GES_PARAM_NO_SERIALIZATION)); - timobj_class->create_track_element = ges_title_clip_create_track_element; + clip_class->create_track_element = ges_title_clip_create_track_element; + timeline_element_class->set_inpoint = NULL; container_class->child_added = _child_added; container_class->child_removed = _child_removed; diff --git a/ges/ges-title-source.c b/ges/ges-title-source.c index 56ba166621..85ae67e7e6 100644 --- a/ges/ges-title-source.c +++ b/ges/ges-title-source.c @@ -157,14 +157,17 @@ ges_title_source_class_init (GESTitleSourceClass * klass) GObjectClass *object_class = G_OBJECT_CLASS (klass); GESVideoSourceClass *source_class = GES_VIDEO_SOURCE_CLASS (klass); GESTrackElementClass *track_element_class = GES_TRACK_ELEMENT_CLASS (klass); + GESTimelineElementClass *timeline_element_class = + GES_TIMELINE_ELEMENT_CLASS (klass); g_type_class_add_private (klass, sizeof (GESTitleSourcePrivate)); object_class->get_property = ges_title_source_get_property; object_class->set_property = ges_title_source_set_property; object_class->dispose = ges_title_source_dispose; - track_element_class->lookup_child = _lookup_child; + timeline_element_class->set_inpoint = NULL; + track_element_class->lookup_child = _lookup_child; source_class->create_source = ges_title_source_create_source; } diff --git a/tests/check/ges/titles.c b/tests/check/ges/titles.c index 3654a6386f..cf8aceb19c 100644 --- a/tests/check/ges/titles.c +++ b/tests/check/ges/titles.c @@ -63,7 +63,7 @@ GST_START_TEST (test_title_source_properties) "in-point", (guint64) 12, NULL); assert_equals_uint64 (_START (clip), 42); assert_equals_uint64 (_DURATION (clip), 51); - assert_equals_uint64 (_INPOINT (clip), 12); + assert_equals_uint64 (_INPOINT (clip), 0); ges_layer_add_clip (layer, GES_CLIP (clip)); ges_timeline_commit (timeline); @@ -77,10 +77,10 @@ GST_START_TEST (test_title_source_properties) /* Check that trackelement has the same properties */ assert_equals_uint64 (_START (trackelement), 42); assert_equals_uint64 (_DURATION (trackelement), 51); - assert_equals_uint64 (_INPOINT (trackelement), 12); + assert_equals_uint64 (_INPOINT (trackelement), 0); /* And let's also check that it propagated correctly to GNonLin */ - nle_object_check (ges_track_element_get_nleobject (trackelement), 42, 51, 12, + nle_object_check (ges_track_element_get_nleobject (trackelement), 42, 51, 0, 51, MIN_NLE_PRIO, TRUE); /* Change more properties, see if they propagate */ @@ -89,14 +89,14 @@ GST_START_TEST (test_title_source_properties) ges_timeline_commit (timeline); assert_equals_uint64 (_START (clip), 420); assert_equals_uint64 (_DURATION (clip), 510); - assert_equals_uint64 (_INPOINT (clip), 120); + assert_equals_uint64 (_INPOINT (clip), 0); assert_equals_uint64 (_START (trackelement), 420); assert_equals_uint64 (_DURATION (trackelement), 510); - assert_equals_uint64 (_INPOINT (trackelement), 120); + assert_equals_uint64 (_INPOINT (trackelement), 0); /* And let's also check that it propagated correctly to GNonLin */ nle_object_check (ges_track_element_get_nleobject (trackelement), 420, 510, - 120, 510, MIN_NLE_PRIO + 0, TRUE); + 0, 510, MIN_NLE_PRIO + 0, TRUE); ges_container_remove (GES_CONTAINER (clip), GES_TIMELINE_ELEMENT (trackelement));