Commit graph

1993 commits

Author SHA1 Message Date
Henry Wilkes
36223e25b9 layer: don't set timeline when moving clip
If a clip is moving we should not unset its timeline when it is removed
from the layer. Logic has been moved to ges_timeline_add_clip and
ges_timeline_remove_clip.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-editing-services/-/merge_requests/169>
2020-05-07 09:37:15 +01:00
Henry Wilkes
343e8581f2 timeline-tree: freeze auto-transitions whilst editing
Freeze the auto-tranistions so they do not destroy themselves during an
edit. Once complete the auto-transitions can move themselves back into
position, or remove themselves if their sources are no longer
overlapping.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-editing-services/-/merge_requests/169>
2020-05-07 09:37:15 +01:00
Henry Wilkes
30a821e136 clip: make auto-transitions less expensive when adding to track
Only check the overlaps with the actual track element that was just added
to the track. This reduces the tree traversal by one order.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-editing-services/-/merge_requests/169>
2020-05-07 09:37:15 +01:00
Henry Wilkes
cdac205db6 clip: remove children if failed to add to layer
If adding to a layer fails during ges_timeline_add_clip, any new children
that were created during this process should be removed from the clip to
put it back into its previous state.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-editing-services/-/merge_requests/169>
2020-05-07 09:37:15 +01:00
Henry Wilkes
fba267926f group: let timeline-tree handle layer priority
Since a group can only have its priority set whilst it is part of a
timeline, we can simply let the timeline-tree handle the move, which it
can already do, whilst checking that the move would be legal (not break
the timeline configuration). All the group has to do now if update its
priority value if the priority of any of its children changes. It
doesn't even need to keep track of the layer priority offsets.

Also, added a check to ensure added children belong to the same
timeline.

Also moved the sigids from the GObject data to a g_hash_table, which is
clearer.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-editing-services/-/merge_requests/169>
2020-05-07 09:37:15 +01:00
Henry Wilkes
aefc992ef1 timeline-element: stop using edit vmethods
These were all redirecting to essentially ges_timeline_element_edit
anyway.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-editing-services/-/merge_requests/169>
2020-05-07 09:37:15 +01:00
Henry Wilkes
bac0df294e timeline-element: simplify check for being edited
It should be sufficient to set the edit flag only on the toplevel, which
allows all of its children to know they are being edited and should not
move in response.

Also, removed some unnecessary setting/checking of this.

Also, supplied the ges_timeline_element_peak_toplevel, which unlike
ges_timeline_element_get_toplevel_parent, does not add a reference to
the toplevel. Some corresponding leaks in auto-transition have been
fixed by using this instead.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-editing-services/-/merge_requests/169>
2020-05-07 09:37:15 +01:00
Henry Wilkes
cda1cfa0df timeline: emit snapping-started with new valid time
Only emit snapping-ended if we have a valid snap time. Moreover, we
should emit a new snapping-started even if we are snapping at the same
location. This is because a new snap will always correspond to a new edit,
possibly involving different snapping elements, which a user would want
to know about.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-editing-services/-/merge_requests/169>
2020-05-07 09:37:15 +01:00
Henry Wilkes
39097f5574 timeline-tree: simplify and fix editing
Editing has been simplified by breaking down each edit into a
combination of three basic single-element edits: MOVE, TRIM_START, and
TRIM_END.

Each edit follows these steps:
+ Determine which elements are to be edited and under which basic mode
+ Determine which track elements will move as a result
+ Snap the edit position to one of the edges of the main edited element,
  (or the edge of one of its descendants, in the case of MOVE), avoiding
  moving elements.
  NOTE: in particular, we can *not* snap to the edge of a neighbouring
  element in a roll edit. This was previously possible, even though the
  neighbour was moving!
+ Determine the edit positions for clips (or track elements with no
  parent) using the snapped value. In addition, we replace any edits of
  a group with an edit of its descendant clips. If any value would be
  out of bounds (e.g. negative start) we do not edit.
  NOTE: this is now done *after* checking the snapping. This allows the
  edit to succeed if snapping would cause it to go from being invalid to
  valid!
+ Determine whether the collection of edits would result in a valid
  timeline-configuration which does not break the rules for sources
  overlapping.
+ If all this succeeds, we emit snapping-started on the timeline.
+ We then perform all the edits. At this point they should all succeed.

The simplification/unification should make it easier to make other
changes.

Fixes https://gitlab.freedesktop.org/gstreamer/gst-editing-services/-/issues/97
Fixes https://gitlab.freedesktop.org/gstreamer/gst-editing-services/-/issues/98

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-editing-services/-/merge_requests/169>
2020-05-07 09:37:15 +01:00
Henry Wilkes
a6b13ce619 group: fix priority setting
Stop moving the group if a child clip is being edited by timeline-tree,
a child group is updating its own priority, or a layer that a clip is in
has changed priority. A group should only move if a descendant moves
layers outside of a timeline-tree edit, or the priority of the group is
set by the user.

Fixes https://gitlab.freedesktop.org/gstreamer/gst-editing-services/-/issues/89

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-editing-services/-/merge_requests/169>
2020-05-07 09:37:15 +01:00
Henry Wilkes
6617d76710 container: keep start and duration up to date
Simplified keeping the start and the duration of a container/group up to
date with the earliest start of the children and the last end of the
children. The previous logic was spread between ges-group and
ges-container, now all the position handling is in ges-container.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-editing-services/-/merge_requests/169>
2020-05-07 09:37:15 +01:00
Henry Wilkes
5e144d9ade uri-clip: use duration-limit in set_max_duration
Use the duration-limit rather than max-duration - in-point, since the
former will be able to take other factors, such as effects, into
account.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-editing-services/-/merge_requests/169>
2020-05-07 09:37:15 +01:00
Henry Wilkes
4b62749336 clip: add the duration-limit property
The duration-limit is the maximum duration that can be set for the clip
given its current children and their properties. If a change in the
children properties causes this to drop below the current duration, it
is automatically capped by this limit.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-editing-services/-/merge_requests/169>
2020-05-07 09:37:15 +01:00
Thibault Saunier
154816365f ges: Output otio formatter loading issues in debug logs
Instead of spamming the terminal with a python traceback

Fixes https://gitlab.freedesktop.org/gstreamer/gst-editing-services/-/issues/107

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-editing-services/-/merge_requests/173>
2020-05-06 16:11:58 +00:00
Henry Wilkes
00a9825ffb container: return TRUE if adding doesn't cause any errors
If `add_child` and `set_parent` succeed we want to return TRUE, even if
the added element is no longer a child by the end of the method. This is
because some users may call ges_container_remove during `child-added`.
This shouldn't be considered an error.
2020-05-01 14:26:32 +01:00
Henry Wilkes
4daa0ecba4 timeline: fix adding track when layers contains clips
Made sure that adding a new track only uses select-tracks-for-object for
core children to determine whether a track elements should be added to the
new track or not, and *not* any other track. In particular, there should
be *no* change in the existing tracks of the timeline when adding another
track. Moreover, a new track should not invoke the creation of track
elements for other tracks.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-editing-services/-/merge_requests/160>
2020-04-29 12:32:52 +00:00
Henry Wilkes
dc9dbddbae nleobject: stop using media-duration-factor
The property had been deprecated and is unused.

This property is not needed. Any internal time effect that an nleoperation
wraps is itself responsible for converting seek/segment timestamps.
Previously, the ghostpads were performing a rate conversion after the
rate element had already done so, essentially doubling their effect on
seeks and segment times. This was always unnecessary, but went unnoticed
by the tempochange test because it was using an identity element rather
than an actual rate-changing element.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-editing-services/-/merge_requests/160>
2020-04-29 12:32:52 +00:00
Thibault Saunier
a71b4984f6 track: Do not commit ourselves automatically when changing state from wrong thread
The user is responsible to commit the timeline from the right thread
in that case and in the case of gesdemux, the loaded timeline is filling
gaps automatically when the project is set loaded.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-editing-services/-/merge_requests/166>
2020-04-27 17:58:40 -04:00
Thibault Saunier
5bb5f60043 ges: Fix interlaced stream playback
Negotiation was failling as `videoflip` was not allowing not
progressive interlacing.

Also avoid adding a deinterlace element when it is useless.
2020-04-17 13:24:45 -04:00
Thibault Saunier
5720ae4f25 framepositioner: Fix some source repositionning rounding issues
Avoid loosing (too much) precision when rescaling back and forth by
storing values in gdoubles.

Handle the fact that position values can be negative

Also fix debug category static variable
as it clashes with the instance variable name in a few methods.
2020-04-16 21:52:52 -04:00
Thibault Saunier
f548bb9232 timeline: Fix wrong usage of scale_int
We are multiplying the framerate by GST_SECOND and thus have no
guarantee that it won't overflow.
2020-04-16 12:56:10 -04:00
Thibault Saunier
c940333d18 ges: Place imagefreeze at right place
Negotiation fails when having the imagefreeze after videorate and
frame positioning won't happen after seeks if we do not put it
before the postioner
2020-04-13 11:56:46 +00:00
Thibault Saunier
d1444581f6 asset: Avoid dereferencing NULL pointer
CID 1461286
2020-04-10 11:12:12 -04:00
Thibault Saunier
6db3dc1661 framepositionner: Fix wrong old size check condition
CID: 1461277
2020-04-10 11:12:12 -04:00
Thibault Saunier
69d5202788 validate: Avoid dereferencing NULL pointer
CID: 1461266
2020-04-10 11:12:12 -04:00
Thibault Saunier
fadde5cfb9 timeline: Ensure setting framerate in timeline_get_framerate
CID: 1461250, 1461288
2020-04-10 11:12:12 -04:00
Thibault Saunier
9b430c22a5 structured-interface: Properly check that setting keyframe works
Fixes CID: 1455490
2020-04-10 11:12:12 -04:00
Thibault Saunier
86c2681da6 ges: Cast to signed int to compare agasint 0
The check made sense but we were not casting to be able to check
signess of subtraction result.

CID: 1444923
2020-04-10 11:12:12 -04:00
Thibault Saunier
d81548a28a timeline: Do not compare unsigned with 0
Layer priorities are always positive the check was making no
sense in any case.

Fixes CID: 1444922, 1461284
2020-04-10 11:12:12 -04:00
Thibault Saunier
8f4688811f ges: Always check return value of ges_container_add
Making coverity happy

CIDs: 1461460, 1461461, 1461462, 1461463, 1461464, 1461465, 1461466, 1461468,
2020-04-10 11:12:12 -04:00
Thibault Saunier
5fd0943c77 ges: Fix sending EOS on testclip when using timeoverlay
Basically when using timeoverlay we where waiting for input-selector
to receive EOS on its active on the output-selector streaming thread
but... EOS was being sent from that same thread waiting for input-selector
to unblock to send EOS on its other pad.

In our specific use case we want EOS to be sent only on the active pad.

Fixes: https://gitlab.freedesktop.org/gstreamer/gst-editing-services/-/issues/103
2020-04-09 10:10:09 -04:00
Thibault Saunier
4a9e2c8984 ges: Update documentation
And start generating TrackElement children property with a stupid
simple script
2020-04-09 10:10:09 -04:00
Thibault Saunier
c8383d69ca ges: Add the foreground color child property 2020-04-09 09:44:26 -04:00
Thibault Saunier
4c985b4155 ges: Fix reloading UriClipAsset synchronously
And add tests for that
2020-04-08 14:35:28 +01:00
Thibault Saunier
e41a6b6fac ges: Rework the way we ensure core elements are not wrongly moved between clips
Instead of focusing on the instances of the clips and their children,
we relax the check to allow moving track element clip between clips
that share a common asset. This makes it as correct conceptually but
more flexible, and the code becomes simpler.
2020-04-08 14:35:28 +01:00
Henry Wilkes
ef1c0f0faa group: tidied timeline membership in copy-paste
Previously, the GESContainer ->paste method and GESGroup ->paste methods
were unnecessarily setting the timeline of groups, even though this is
handled by the GESGroup ->child_added method. This could result in the
group being added multiple times.
2020-04-08 14:35:28 +01:00
Henry Wilkes
eec9c90a8c timeline-tree: fix overlap check
Previously, the code was not able to detect that an element overlaps on
its end, nor could it detect that an element overlaps two elements that
already overlap.
2020-04-08 14:35:28 +01:00
Henry Wilkes
f698408176 clip: tidy grouping
Make the grouping of clips cleaner by checking that the clips share the
same asset.
2020-04-08 14:35:28 +01:00
Henry Wilkes
e57c345f72 clip: secure adding clip to layer
Add more checks when adding a clip to a layer, or moving a clip to a new
layer. Also, mark the "layer" property as explicit-notify.
2020-04-08 14:35:28 +01:00
Henry Wilkes
46e6a074bb uri-clip: match children by track
When the asset of a uri clip is reset, its core children are removed and
replaced by the new core children. When replacing, the `set_asset`
method attempts to copy children properties from the previous children
to the new children. However, the children were matched by track-type
only. This would not function as intended when a URI contains multiple
audio or video streams. Instead, we now match children by the tracks
themselves. This should work better, provided the user's
select-tracks-for-object is well behaved.

Also, fix a memory problem in `set_mute` for when a child is not in a
track.
2020-04-08 14:35:28 +01:00
Henry Wilkes
ba31a8d6a0 timeline-element: only copy read-write properties
Only copy the properties that can be both read and written, and are not
construct only. Similarly for child properties when a track-element is
deep copied.
2020-04-08 14:35:28 +01:00
Henry Wilkes
fe854bba69 timeline: return sunk element on pasting
Technically, an element can still be floating on the return from
`->paste` (e.g. a clip not in a layer). Since the return of the `_paste`
methods are (return full) a non-floating object is probably expected in
all cases.
2020-04-08 14:35:28 +01:00
Henry Wilkes
067304a05f auto-transition: select track directly
By-pass the select-tracks-for-object signal for auto-transitions since
their track element must land in the same track as the elements it is
the auto-transition for.
2020-04-08 14:35:28 +01:00
Henry Wilkes
269c2d1dc0 timeline: re-handle clip children track selection
The way a clip's track elements are added to tracks was re-handled. This
doesn't affect the normal usage of a simple audio-video timeline, where
the tracks are added before any clips, but usage for multi-track
timelines has improved. The main changes are:

+ We can now handle a track being selected for more than one track,
  including a full copy of their children properties and bindings.
  (Previously broken.)
+ When a clip is split, we copy the new elements directly into the same
  track, avoiding select-tracks-for-object.
+ When a clip is grouped or ungrouped, we avoid moving the elements to
  or from tracks.
+ Added API to allow users to copy the core elements of a clip directly
  into a track, complementing select-tracks-for-object.
+ Enforced the rule that a clip can only contain one core child in a
  track, and all the non-core children must be added to tracks that
  already contains a core child. This extends the previous condition
  that two sources from the same clip should not be added to the same
  track.
+ Made ges_track_add_element check that the newly added track element
  does not break the configuration rules of the timeline.
+ When adding a track to a timeline, we only use
  select-tracks-for-object to check whether track elements should be
  added to the new track, not existing ones.
+ When removing a track from a timeline, we empty it of all the track
  elements that are controlled by a clip. Thus, we ensure that a clip
  only contains elements that are in the tracks of the same timeline, or
  no track. Similarly, when removing a clip from a timeline.
+ We can now avoid unsupported timeline configurations when a layer is
  added to a timeline, and already contains clips.
+ We can now avoid unsupported timeline configurations when a track is
  added to a timeline, and the timeline already contains clips.

Fixes https://gitlab.freedesktop.org/gstreamer/gst-editing-services/-/issues/84
2020-04-08 14:35:28 +01:00
Henry Wilkes
f7a1bdb289 timeline: stop connecting to track-element-added
This was used to connect to the track element's notify::start signal in
order to update the duration of the timeline (it is not clear why the
notify::duration signal was not also connected to for the same reason).
However, this is already covered by the timeline_tree_move method, which
is always called to update the start of a track element, even if it is not
part of a clip (and similarly for timeline_tree_trim, which is called
when the duration is set).
2020-04-07 11:17:54 +01:00
Henry Wilkes
a93e873402 clip: allow arbitrary max-duration when no core children
Before the max-duration could be set arbitrarily when the clip was empty,
to indicate what the max-duration would be once the core children were
created. Now, we can also do this whilst the clip only contains non-core
children.
2020-04-07 11:17:54 +01:00
Henry Wilkes
278a5fd796 track-element: change owner to creator
Rename the private "owners" to "creators" to avoid confusing this with
the owner of the track element's memory.

Also made the ungroup method for GESClip symmetric by making all the
children of the resulting clips share their creators, which allows them
to be added to any of the other ungrouped clips. Once the clips are
grouped back together, the tracks loose these extra creators.
2020-04-07 11:17:44 +01:00
Henry Wilkes
6e55a6556f container: change ownership when adding
Make sure we sink the child on adding, and keep it alive until the end
in case the method fails.

Also, since the child mappings hold a ref to the child, they should give
them up in their free method. This way, the ref will be given up on
disposing, even if ges_container_remove fails.

Also, reverse setting of the start of the container if adding fails.
2020-04-07 09:34:12 +01:00
Nirbheek Chauhan
917eba54f7 ges: Fix build with GCC 10
gcc-10 defaults to -fno-common, which exposes a symbol conflict, so
use `static` correctly. Also we don't use `parent_extractable_iface`
in `ges-uri-clip.c`.
See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85678
2020-04-06 23:06:29 +05:30
Thibault Saunier
f307d3d51b ges: Fix trimming clip inside deeply nested groups
This broke in 6b7c658b6a
2020-03-31 15:19:52 -03:00