mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-24 09:10:36 +00:00
clip: Allow setting max-duration clips without TrackElements
Otherwise this breaks quite a few assumption in user code, several pitivi tests broke because of that.
This commit is contained in:
parent
fc0333922f
commit
314db9f1bd
5 changed files with 44 additions and 17 deletions
|
@ -395,6 +395,16 @@ _set_max_duration (GESTimelineElement * element, GstClockTime maxduration)
|
||||||
if (priv->updating_max_duration)
|
if (priv->updating_max_duration)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
|
if (!GES_CONTAINER_CHILDREN (element)) {
|
||||||
|
/* If any child added later on has a lower max duration, this max duration
|
||||||
|
* will be used instead anyway */
|
||||||
|
GST_INFO_OBJECT (element,
|
||||||
|
"Setting max duration %" GST_TIME_FORMAT " as %" GES_FORMAT
|
||||||
|
" doesn't have any child yet",
|
||||||
|
GST_TIME_ARGS (maxduration), GES_ARGS (element));
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
/* else, we set every core child to have the same max duration */
|
/* else, we set every core child to have the same max duration */
|
||||||
|
|
||||||
priv->prevent_max_duration_update = TRUE;
|
priv->prevent_max_duration_update = TRUE;
|
||||||
|
|
|
@ -362,6 +362,10 @@ extractable_set_asset (GESExtractable * self, GESAsset * asset)
|
||||||
uriclip->priv->uri = g_strdup (ges_asset_get_id (asset));
|
uriclip->priv->uri = g_strdup (ges_asset_get_id (asset));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!GES_CONTAINER_CHILDREN (uriclip))
|
||||||
|
ges_timeline_element_set_max_duration (GES_TIMELINE_ELEMENT (uriclip),
|
||||||
|
ges_uri_clip_asset_get_max_duration (uri_clip_asset));
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Binary file not shown.
|
@ -1047,11 +1047,19 @@ GST_START_TEST (test_children_max_duration)
|
||||||
GESTimeline *timeline;
|
GESTimeline *timeline;
|
||||||
GESLayer *layer;
|
GESLayer *layer;
|
||||||
gchar *uri;
|
gchar *uri;
|
||||||
GESTimelineElement *clips[] = { NULL, NULL };
|
|
||||||
GESTimelineElement *child0, *child1, *effect;
|
GESTimelineElement *child0, *child1, *effect;
|
||||||
guint i;
|
guint i;
|
||||||
GstClockTime max_duration, new_max;
|
GstClockTime max_duration, new_max;
|
||||||
GList *children;
|
GList *children;
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
GESTimelineElement *clip;
|
||||||
|
GstClockTime max_duration;
|
||||||
|
} clips[] = {
|
||||||
|
{
|
||||||
|
NULL, GST_SECOND}, {
|
||||||
|
NULL, GST_CLOCK_TIME_NONE}
|
||||||
|
};
|
||||||
|
|
||||||
ges_init ();
|
ges_init ();
|
||||||
|
|
||||||
|
@ -1061,23 +1069,24 @@ GST_START_TEST (test_children_max_duration)
|
||||||
layer = ges_timeline_append_layer (timeline);
|
layer = ges_timeline_append_layer (timeline);
|
||||||
|
|
||||||
uri = ges_test_get_audio_video_uri ();
|
uri = ges_test_get_audio_video_uri ();
|
||||||
clips[0] = GES_TIMELINE_ELEMENT (ges_uri_clip_new (uri));
|
clips[0].clip = GES_TIMELINE_ELEMENT (ges_uri_clip_new (uri));
|
||||||
fail_unless (clips[0]);
|
fail_unless (clips[0].clip);
|
||||||
g_free (uri);
|
g_free (uri);
|
||||||
|
|
||||||
clips[1] = GES_TIMELINE_ELEMENT (ges_test_clip_new ());
|
clips[1].clip = GES_TIMELINE_ELEMENT (ges_test_clip_new ());
|
||||||
|
|
||||||
for (i = 0; i < G_N_ELEMENTS (clips); i++) {
|
for (i = 0; i < G_N_ELEMENTS (clips); i++) {
|
||||||
GESTimelineElement *clip = clips[i];
|
GESTimelineElement *clip = clips[i].clip;
|
||||||
fail_unless (_MAX_DURATION (clip) == GST_CLOCK_TIME_NONE);
|
|
||||||
|
|
||||||
|
max_duration = clips[i].max_duration;
|
||||||
|
fail_unless_equals_uint64 (_MAX_DURATION (clip), max_duration);
|
||||||
fail_unless (ges_timeline_element_set_start (clip, 5));
|
fail_unless (ges_timeline_element_set_start (clip, 5));
|
||||||
fail_unless (ges_timeline_element_set_duration (clip, 20));
|
fail_unless (ges_timeline_element_set_duration (clip, 20));
|
||||||
fail_unless (ges_timeline_element_set_inpoint (clip, 30));
|
fail_unless (ges_timeline_element_set_inpoint (clip, 30));
|
||||||
/* can not set the max duration when we have no children */
|
/* can not the max duration the clip has no child */
|
||||||
fail_if (ges_timeline_element_set_max_duration (clip, 150));
|
fail_unless (ges_timeline_element_set_max_duration (clip, 150));
|
||||||
|
|
||||||
CHECK_OBJECT_PROPS_MAX (clip, 5, 30, 20, GST_CLOCK_TIME_NONE);
|
CHECK_OBJECT_PROPS_MAX (clip, 5, 30, 20, 150);
|
||||||
|
|
||||||
fail_unless (ges_layer_add_clip (layer, GES_CLIP (clip)));
|
fail_unless (ges_layer_add_clip (layer, GES_CLIP (clip)));
|
||||||
|
|
||||||
|
@ -1094,17 +1103,11 @@ GST_START_TEST (test_children_max_duration)
|
||||||
fail_unless (ges_track_element_has_internal_source (GES_TRACK_ELEMENT
|
fail_unless (ges_track_element_has_internal_source (GES_TRACK_ELEMENT
|
||||||
(child1)));
|
(child1)));
|
||||||
|
|
||||||
if (GES_IS_URI_CLIP (clip)) {
|
if (GES_IS_URI_CLIP (clip))
|
||||||
/* uri clip children should be created with a max-duration set */
|
|
||||||
/* each created child has the same max-duration */
|
|
||||||
max_duration = _MAX_DURATION (child0);
|
|
||||||
fail_unless (max_duration != GST_CLOCK_TIME_NONE);
|
|
||||||
new_max = max_duration;
|
new_max = max_duration;
|
||||||
} else {
|
else
|
||||||
max_duration = GST_CLOCK_TIME_NONE;
|
|
||||||
/* need a valid clock time that is not too large */
|
/* need a valid clock time that is not too large */
|
||||||
new_max = 500;
|
new_max = 500;
|
||||||
}
|
|
||||||
|
|
||||||
/* added children do not change the clip's max-duration, but will
|
/* added children do not change the clip's max-duration, but will
|
||||||
* instead set it to the minimum value of its children */
|
* instead set it to the minimum value of its children */
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
|
|
||||||
from . import overrides_hack
|
from . import overrides_hack
|
||||||
|
|
||||||
|
import os
|
||||||
import tempfile
|
import tempfile
|
||||||
|
|
||||||
import gi
|
import gi
|
||||||
|
@ -143,6 +144,15 @@ class TestTitleClip(unittest.TestCase):
|
||||||
children2[1].props.priority)
|
children2[1].props.priority)
|
||||||
|
|
||||||
|
|
||||||
|
class TestUriClip(common.GESSimpleTimelineTest):
|
||||||
|
def test_max_duration_on_extract(self):
|
||||||
|
uri = Gst.filename_to_uri(os.path.join(__file__, "../../ges/audio_video.ogg"))
|
||||||
|
asset = GES.UriClipAsset.request_sync(uri)
|
||||||
|
clip = asset.extract()
|
||||||
|
|
||||||
|
self.assertEqual(clip.props.max_duration, Gst.SECOND)
|
||||||
|
|
||||||
|
|
||||||
class TestTrackElements(common.GESSimpleTimelineTest):
|
class TestTrackElements(common.GESSimpleTimelineTest):
|
||||||
|
|
||||||
def test_add_to_layer_with_effect_remove_add(self):
|
def test_add_to_layer_with_effect_remove_add(self):
|
||||||
|
|
Loading…
Reference in a new issue