mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 20:21:24 +00:00
track: Update gaps only when commiting
We were still updating them at useless moments, do it only when absolutely needed.
This commit is contained in:
parent
4020ca54ff
commit
dd7085d2ed
3 changed files with 13 additions and 25 deletions
|
@ -237,23 +237,12 @@ resort_and_fill_gaps (GESTrack * track)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* callbacks */
|
/* callbacks */
|
||||||
static void
|
|
||||||
timeline_duration_changed_cb (GESTimeline * timeline,
|
|
||||||
GParamSpec * arg, GESTrack * track)
|
|
||||||
{
|
|
||||||
GESTrackPrivate *priv = track->priv;
|
|
||||||
|
|
||||||
/* Remove the last gap on the timeline if not needed anymore */
|
|
||||||
if (priv->updating == TRUE) {
|
|
||||||
resort_and_fill_gaps (track);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
sort_track_elements_cb (GESTrackElement * child,
|
sort_track_elements_cb (GESTrackElement * child,
|
||||||
GParamSpec * arg G_GNUC_UNUSED, GESTrack * track)
|
GParamSpec * arg G_GNUC_UNUSED, GESTrack * track)
|
||||||
{
|
{
|
||||||
resort_and_fill_gaps (track);
|
g_sequence_sort (track->priv->trackelements_by_start,
|
||||||
|
(GCompareDataFunc) element_start_compare, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -643,14 +632,6 @@ ges_track_set_timeline (GESTrack * track, GESTimeline * timeline)
|
||||||
{
|
{
|
||||||
GST_DEBUG ("track:%p, timeline:%p", track, timeline);
|
GST_DEBUG ("track:%p, timeline:%p", track, timeline);
|
||||||
|
|
||||||
if (track->priv->timeline)
|
|
||||||
g_signal_handlers_disconnect_by_func (track->priv->timeline,
|
|
||||||
timeline_duration_changed_cb, track);
|
|
||||||
|
|
||||||
if (timeline)
|
|
||||||
g_signal_connect (timeline, "notify::duration",
|
|
||||||
G_CALLBACK (timeline_duration_changed_cb), track);
|
|
||||||
|
|
||||||
track->priv->timeline = timeline;
|
track->priv->timeline = timeline;
|
||||||
resort_and_fill_gaps (track);
|
resort_and_fill_gaps (track);
|
||||||
}
|
}
|
||||||
|
@ -742,8 +723,6 @@ ges_track_add_element (GESTrack * track, GESTrackElement * object)
|
||||||
g_signal_connect (GES_TRACK_ELEMENT (object), "notify::priority",
|
g_signal_connect (GES_TRACK_ELEMENT (object), "notify::priority",
|
||||||
G_CALLBACK (sort_track_elements_cb), track);
|
G_CALLBACK (sort_track_elements_cb), track);
|
||||||
|
|
||||||
resort_and_fill_gaps (track);
|
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -863,6 +842,7 @@ ges_track_commit (GESTrack * track)
|
||||||
|
|
||||||
g_return_val_if_fail (GES_IS_TRACK (track), FALSE);
|
g_return_val_if_fail (GES_IS_TRACK (track), FALSE);
|
||||||
|
|
||||||
|
resort_and_fill_gaps (track);
|
||||||
g_signal_emit_by_name (track->priv->composition, "commit", TRUE, &ret);
|
g_signal_emit_by_name (track->priv->composition, "commit", TRUE, &ret);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
@ -305,6 +305,7 @@ GST_START_TEST (test_gap_filling_basic)
|
||||||
assert_equals_uint64 (_DURATION (clip1), 5);
|
assert_equals_uint64 (_DURATION (clip1), 5);
|
||||||
|
|
||||||
ges_layer_add_clip (layer, GES_CLIP (clip1));
|
ges_layer_add_clip (layer, GES_CLIP (clip1));
|
||||||
|
ges_timeline_commit (timeline);
|
||||||
assert_equals_int (g_list_length (GES_CONTAINER_CHILDREN (clip1)), 1);
|
assert_equals_int (g_list_length (GES_CONTAINER_CHILDREN (clip1)), 1);
|
||||||
trackelement1 = GES_CONTAINER_CHILDREN (clip1)->data;
|
trackelement1 = GES_CONTAINER_CHILDREN (clip1)->data;
|
||||||
fail_unless (trackelement1 != NULL);
|
fail_unless (trackelement1 != NULL);
|
||||||
|
@ -329,13 +330,13 @@ GST_START_TEST (test_gap_filling_basic)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fail_unless (gap != NULL);
|
fail_unless (gap != NULL);
|
||||||
fail_unless (ges_timeline_commit (timeline));
|
|
||||||
gap_object_check (gap, 5, 10, 1);
|
gap_object_check (gap, 5, 10, 1);
|
||||||
|
|
||||||
clip2 = GES_CLIP (ges_test_clip_new ());
|
clip2 = GES_CLIP (ges_test_clip_new ());
|
||||||
fail_unless (clip2 != NULL);
|
fail_unless (clip2 != NULL);
|
||||||
g_object_set (clip2, "start", (guint64) 35, "duration", (guint64) 5, NULL);
|
g_object_set (clip2, "start", (guint64) 35, "duration", (guint64) 5, NULL);
|
||||||
ges_layer_add_clip (layer, GES_CLIP (clip2));
|
ges_layer_add_clip (layer, GES_CLIP (clip2));
|
||||||
|
fail_unless (ges_timeline_commit (timeline));
|
||||||
assert_equals_int (g_list_length (GES_CONTAINER_CHILDREN (clip2)), 1);
|
assert_equals_int (g_list_length (GES_CONTAINER_CHILDREN (clip2)), 1);
|
||||||
trackelement2 = GES_CONTAINER_CHILDREN (clip2)->data;
|
trackelement2 = GES_CONTAINER_CHILDREN (clip2)->data;
|
||||||
fail_unless (trackelement2 != NULL);
|
fail_unless (trackelement2 != NULL);
|
||||||
|
@ -374,6 +375,7 @@ GST_START_TEST (test_gap_filling_empty_track)
|
||||||
/* Set some properties */
|
/* Set some properties */
|
||||||
asset = ges_asset_request (GES_TYPE_TEST_CLIP, NULL, NULL);
|
asset = ges_asset_request (GES_TYPE_TEST_CLIP, NULL, NULL);
|
||||||
clip = ges_layer_add_asset (layer, asset, 0, 0, 10, GES_TRACK_TYPE_VIDEO);
|
clip = ges_layer_add_asset (layer, asset, 0, 0, 10, GES_TRACK_TYPE_VIDEO);
|
||||||
|
ges_timeline_commit (timeline);
|
||||||
assert_equals_int (g_list_length (GES_CONTAINER_CHILDREN (clip)), 1);
|
assert_equals_int (g_list_length (GES_CONTAINER_CHILDREN (clip)), 1);
|
||||||
|
|
||||||
/* We should not have created any TrackElement in the audio track */
|
/* We should not have created any TrackElement in the audio track */
|
||||||
|
@ -386,8 +388,8 @@ GST_START_TEST (test_gap_filling_empty_track)
|
||||||
|
|
||||||
gap = GST_BIN_CHILDREN (composition)->data;
|
gap = GST_BIN_CHILDREN (composition)->data;
|
||||||
fail_unless (gap != NULL);
|
fail_unless (gap != NULL);
|
||||||
fail_unless (ges_timeline_commit (timeline));
|
|
||||||
gap_object_check (gap, 0, 10, 1);
|
gap_object_check (gap, 0, 10, 1);
|
||||||
|
fail_unless (ges_timeline_commit (timeline));
|
||||||
|
|
||||||
gst_object_unref (timeline);
|
gst_object_unref (timeline);
|
||||||
}
|
}
|
||||||
|
|
|
@ -396,6 +396,7 @@ GST_START_TEST (test_single_layer_automatic_transition)
|
||||||
assert_equals_uint64 (_DURATION (src), 1000);
|
assert_equals_uint64 (_DURATION (src), 1000);
|
||||||
assert_equals_uint64 (_START (src1), 500);
|
assert_equals_uint64 (_START (src1), 500);
|
||||||
assert_equals_uint64 (_DURATION (src1), 1500 - 500);
|
assert_equals_uint64 (_DURATION (src1), 1500 - 500);
|
||||||
|
ges_timeline_commit (timeline);
|
||||||
|
|
||||||
GST_DEBUG ("Checking that a transition has been added");
|
GST_DEBUG ("Checking that a transition has been added");
|
||||||
objects = ges_layer_get_clips (layer);
|
objects = ges_layer_get_clips (layer);
|
||||||
|
@ -574,6 +575,7 @@ GST_START_TEST (test_single_layer_automatic_transition)
|
||||||
GST_DEBUG
|
GST_DEBUG
|
||||||
("Changig first source duration to 800 2 transitions should be created");
|
("Changig first source duration to 800 2 transitions should be created");
|
||||||
ges_timeline_element_set_duration (src, 800);
|
ges_timeline_element_set_duration (src, 800);
|
||||||
|
ges_timeline_commit (timeline);
|
||||||
/* 600__________________src_____________1400
|
/* 600__________________src_____________1400
|
||||||
* 500___________src1________1250
|
* 500___________src1________1250
|
||||||
* 1250___________src2________2250
|
* 1250___________src2________2250
|
||||||
|
@ -649,6 +651,7 @@ GST_START_TEST (test_single_layer_automatic_transition)
|
||||||
GST_DEBUG
|
GST_DEBUG
|
||||||
("Set third clip start to 1100, 1 new transition should be created");
|
("Set third clip start to 1100, 1 new transition should be created");
|
||||||
ges_timeline_element_set_start (src2, 1100);
|
ges_timeline_element_set_start (src2, 1100);
|
||||||
|
ges_timeline_commit (timeline);
|
||||||
/* 600____src___1100
|
/* 600____src___1100
|
||||||
* 500___________src1________1250
|
* 500___________src1________1250
|
||||||
* 1100___________src2________2100
|
* 1100___________src2________2100
|
||||||
|
@ -688,6 +691,7 @@ GST_START_TEST (test_single_layer_automatic_transition)
|
||||||
GST_DEBUG ("Set third clip start to 1000, Transition should be updated");
|
GST_DEBUG ("Set third clip start to 1000, Transition should be updated");
|
||||||
ges_clip_edit (GES_CLIP (src2), NULL, -1,
|
ges_clip_edit (GES_CLIP (src2), NULL, -1,
|
||||||
GES_EDIT_MODE_NORMAL, GES_EDGE_START, 1000);
|
GES_EDIT_MODE_NORMAL, GES_EDGE_START, 1000);
|
||||||
|
ges_timeline_commit (timeline);
|
||||||
/* 600____src___1100
|
/* 600____src___1100
|
||||||
* !_tr__^
|
* !_tr__^
|
||||||
* 500___________src1________1250
|
* 500___________src1________1250
|
||||||
|
@ -788,6 +792,7 @@ GST_START_TEST (test_multi_layer_automatic_transition)
|
||||||
GST_DEBUG ("Adding clip from 500 -- 1000 to first layer");
|
GST_DEBUG ("Adding clip from 500 -- 1000 to first layer");
|
||||||
src1 = GES_TIMELINE_ELEMENT (ges_layer_add_asset (layer, asset, 500,
|
src1 = GES_TIMELINE_ELEMENT (ges_layer_add_asset (layer, asset, 500,
|
||||||
0, 1000, GES_TRACK_TYPE_UNKNOWN));
|
0, 1000, GES_TRACK_TYPE_UNKNOWN));
|
||||||
|
ges_timeline_commit (timeline);
|
||||||
fail_unless (GES_IS_CLIP (src1));
|
fail_unless (GES_IS_CLIP (src1));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1384,6 +1389,7 @@ GST_START_TEST (test_layer_activate_automatic_transition)
|
||||||
|
|
||||||
GST_DEBUG ("Moving src2 to 1200, check everything updates properly");
|
GST_DEBUG ("Moving src2 to 1200, check everything updates properly");
|
||||||
ges_timeline_element_set_start (src2, 1200);
|
ges_timeline_element_set_start (src2, 1200);
|
||||||
|
ges_timeline_commit (timeline);
|
||||||
/*
|
/*
|
||||||
* 0___________src_________1000
|
* 0___________src_________1000
|
||||||
* 500______tr______1000
|
* 500______tr______1000
|
||||||
|
|
Loading…
Reference in a new issue