G_GNUC_INTERNAL void _init_standard_transition_assets (void);
G_GNUC_INTERNAL void _init_formatter_assets (void);
+/* Utilities */
+G_GNUC_INTERNAL gint track_object_start_compare (GESTrackObject * a,
+ GESTrackObject * b);
+G_GNUC_INTERNAL gint timeline_object_start_compare (GESTimelineObject * a,
+ GESTimelineObject * b);
+
#endif /* __GES_INTERNAL_H__ */
self->max_gnl_priority = LAYER_HEIGHT;
}
-/* Private methods and utils */
-static gint
-objects_start_compare (GESTimelineObject * a, GESTimelineObject * b)
-{
- if (a->start == b->start) {
- if (a->priority < b->priority)
- return -1;
- if (a->priority > b->priority)
- return 1;
- return 0;
- }
- if (a->start < b->start)
- return -1;
- if (a->start > b->start)
- return 1;
- return 0;
-}
-
static GList *
track_get_by_layer (GESTimelineLayer * layer, GESTrack * track)
{
GList *
ges_timeline_layer_get_objects (GESTimelineLayer * layer)
{
- GList *ret = NULL;
- GList *tmp;
GESTimelineLayerClass *klass;
g_return_val_if_fail (GES_IS_TIMELINE_LAYER (layer), NULL);
return klass->get_objects (layer);
}
- for (tmp = layer->priv->objects_start; tmp; tmp = tmp->next) {
- ret = g_list_prepend (ret, tmp->data);
- g_object_ref (tmp->data);
- }
-
- ret = g_list_reverse (ret);
- return ret;
+ return g_list_sort (g_list_copy_deep (layer->priv->objects_start,
+ (GCopyFunc) gst_object_ref, NULL),
+ (GCompareFunc) timeline_object_start_compare);
}
/**
/* Take a reference to the object and store it stored by start/priority */
priv->objects_start = g_list_insert_sorted (priv->objects_start, object,
- (GCompareFunc) objects_start_compare);
+ (GCompareFunc) timeline_object_start_compare);
/* Inform the object it's now in this layer */
ges_timeline_object_set_layer (object, layer);
}
}
-static gint
-objects_start_compare (GESTrackObject * a, GESTrackObject * b)
-{
- if (a->start == b->start) {
- if (a->priority < b->priority)
- return -1;
- if (a->priority > b->priority)
- return 1;
- return 0;
- }
- if (a->start < b->start)
- return -1;
- if (a->start > b->start)
- return 1;
- return 0;
-}
-
static inline void
sort_track_objects (GESTimeline * timeline, GESTrackObject * obj)
{
TrackObjIters *iters = g_hash_table_lookup (timeline->priv->obj_iters, obj);
g_sequence_sort_changed (iters->iter_obj,
- (GCompareDataFunc) objects_start_compare, NULL);
+ (GCompareDataFunc) track_object_start_compare, NULL);
}
static gint
(GCompareDataFunc) compare_uint64, NULL);
iters->iter_obj =
g_sequence_insert_sorted (priv->tracksources, g_object_ref (tckobj),
- (GCompareDataFunc) objects_start_compare, NULL);
+ (GCompareDataFunc) track_object_start_compare, NULL);
g_hash_table_insert (priv->by_start, tckobj, pstart);
g_hash_table_insert (priv->by_object, pstart, tckobj);
G_GNUC_UNUSED, GESTrack * obj);
/* Private methods/functions/callbacks */
-
-/* Utilities */
-static gint
-objects_start_compare (GESTrackObject * a, GESTrackObject * b,
- gpointer user_data)
-{
-
- if (a->start == b->start) {
- if (a->priority < b->priority)
- return -1;
- if (a->priority > b->priority)
- return 1;
- return 0;
- }
- if (a->start < b->start)
- return -1;
- if (a->start > b->start)
- return 1;
- return 0;
-}
-
static void
add_trackobj_to_list_foreach (GESTrackObject * trackobj, GList ** list)
{
resort_and_fill_gaps (GESTrack * track)
{
g_sequence_sort (track->priv->tckobjs_by_start,
- (GCompareDataFunc) objects_start_compare, NULL);
+ (GCompareDataFunc) track_object_start_compare, NULL);
if (track->priv->updating == TRUE) {
update_gaps (track);
g_object_ref_sink (object);
g_hash_table_insert (track->priv->tckobjs_iter, object,
g_sequence_insert_sorted (track->priv->tckobjs_by_start, object,
- (GCompareDataFunc) objects_start_compare, NULL));
+ (GCompareDataFunc) track_object_start_compare, NULL));
g_signal_emit (track, ges_track_signals[TRACK_OBJECT_ADDED], 0,
GES_TRACK_OBJECT (object));
return timeline;
}
+
+/* Internal utilities */
+gint
+track_object_start_compare (GESTrackObject * a, GESTrackObject * b)
+{
+ if (a->start == b->start) {
+ if (a->priority < b->priority)
+ return -1;
+ if (a->priority > b->priority)
+ return 1;
+ if (a->duration < b->duration)
+ return -1;
+ if (a->duration > b->duration)
+ return 1;
+ return 0;
+ }
+ if (a->start < b->start)
+ return -1;
+ if (a->start > b->start)
+ return 1;
+ return 0;
+}
+
+gint
+timeline_object_start_compare (GESTimelineObject * a, GESTimelineObject * b)
+{
+ if (a->start == b->start) {
+ if (a->priority < b->priority)
+ return -1;
+ if (a->priority > b->priority)
+ return 1;
+ if (a->duration < b->duration)
+ return -1;
+ if (a->duration > b->duration)
+ return 1;
+ return 0;
+ }
+ if (a->start < b->start)
+ return -1;
+ if (a->start > b->start)
+ return 1;
+ return 0;
+}