mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-04-26 06:54:49 +00:00
clip: Don't split clips at illegal position
Make sure that when we split a clip, the resulting timeline would not be in an illegal state. Fixes https://gitlab.freedesktop.org/gstreamer/gst-editing-services/issues/94
This commit is contained in:
parent
1cc5221d49
commit
f8091262b5
2 changed files with 50 additions and 2 deletions
|
@ -1428,6 +1428,30 @@ ges_clip_split (GESClip * clip, guint64 position)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
old_duration = position - start;
|
||||||
|
if (!timeline_tree_can_move_element (timeline_get_tree
|
||||||
|
(GES_TIMELINE_ELEMENT_TIMELINE (clip)), GES_TIMELINE_ELEMENT (clip),
|
||||||
|
GES_TIMELINE_ELEMENT_LAYER_PRIORITY (clip),
|
||||||
|
start, old_duration, NULL)) {
|
||||||
|
GST_WARNING_OBJECT (clip,
|
||||||
|
"Can not split %" GES_FORMAT " at %" GST_TIME_FORMAT
|
||||||
|
" as timeline would be in an illegal" " state.", GES_ARGS (clip),
|
||||||
|
GST_TIME_ARGS (position));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
new_duration = duration + start - position;
|
||||||
|
if (!timeline_tree_can_move_element (timeline_get_tree
|
||||||
|
(GES_TIMELINE_ELEMENT_TIMELINE (clip)), GES_TIMELINE_ELEMENT (clip),
|
||||||
|
GES_TIMELINE_ELEMENT_LAYER_PRIORITY (clip), position, new_duration,
|
||||||
|
NULL)) {
|
||||||
|
GST_WARNING_OBJECT (clip,
|
||||||
|
"Can not split %" GES_FORMAT " at %" GST_TIME_FORMAT
|
||||||
|
" as timeline would end up in an illegal" " state.", GES_ARGS (clip),
|
||||||
|
GST_TIME_ARGS (position));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (clip, "Spliting at %" GST_TIME_FORMAT,
|
GST_DEBUG_OBJECT (clip, "Spliting at %" GST_TIME_FORMAT,
|
||||||
GST_TIME_ARGS (position));
|
GST_TIME_ARGS (position));
|
||||||
|
|
||||||
|
@ -1440,8 +1464,6 @@ ges_clip_split (GESClip * clip, guint64 position)
|
||||||
media_duration_factor =
|
media_duration_factor =
|
||||||
ges_timeline_element_get_media_duration_factor (GES_TIMELINE_ELEMENT
|
ges_timeline_element_get_media_duration_factor (GES_TIMELINE_ELEMENT
|
||||||
(clip));
|
(clip));
|
||||||
new_duration = duration + start - position;
|
|
||||||
old_duration = position - start;
|
|
||||||
_set_start0 (GES_TIMELINE_ELEMENT (new_object), position);
|
_set_start0 (GES_TIMELINE_ELEMENT (new_object), position);
|
||||||
_set_inpoint0 (GES_TIMELINE_ELEMENT (new_object),
|
_set_inpoint0 (GES_TIMELINE_ELEMENT (new_object),
|
||||||
inpoint + old_duration * media_duration_factor);
|
inpoint + old_duration * media_duration_factor);
|
||||||
|
|
|
@ -561,6 +561,32 @@ class TestInvalidOverlaps(common.GESSimpleTimelineTest):
|
||||||
self.assertIsNone(clip3.split(12))
|
self.assertIsNone(clip3.split(12))
|
||||||
self.assertIsNone(clip3.split(15))
|
self.assertIsNone(clip3.split(15))
|
||||||
|
|
||||||
|
def test_split_with_transition(self):
|
||||||
|
self.track_types = [GES.TrackType.AUDIO]
|
||||||
|
super().setUp()
|
||||||
|
self.timeline.set_auto_transition(True)
|
||||||
|
|
||||||
|
clip0 = self.add_clip(start=0, in_point=0, duration=50)
|
||||||
|
clip1 = self.add_clip(start=20, in_point=0, duration=50)
|
||||||
|
self.assertTimelineTopology([
|
||||||
|
[
|
||||||
|
(GES.TestClip, 0, 50),
|
||||||
|
(GES.TransitionClip, 20, 30),
|
||||||
|
(GES.TestClip, 20, 50)
|
||||||
|
]
|
||||||
|
])
|
||||||
|
|
||||||
|
# Split should file as the first part of the split
|
||||||
|
# would be fully overlapping clip0
|
||||||
|
self.assertIsNone(clip1.split(40))
|
||||||
|
self.assertTimelineTopology([
|
||||||
|
[
|
||||||
|
(GES.TestClip, 0, 50),
|
||||||
|
(GES.TransitionClip, 20, 30),
|
||||||
|
(GES.TestClip, 20, 50)
|
||||||
|
]
|
||||||
|
])
|
||||||
|
|
||||||
def test_changing_duration(self):
|
def test_changing_duration(self):
|
||||||
clip1 = self.add_clip(start=9, in_point=0, duration=2)
|
clip1 = self.add_clip(start=9, in_point=0, duration=2)
|
||||||
clip2 = self.add_clip(start=10, in_point=0, duration=2)
|
clip2 = self.add_clip(start=10, in_point=0, duration=2)
|
||||||
|
|
Loading…
Reference in a new issue