uri-asset: Use the same code path for sync discovery as the async one
[platform/upstream/gst-editing-services.git] / ges / ges-internal.h
1 /* GStreamer Editing Services
2  * Copyright (C) 2009 Edward Hervey <edward.hervey@collabora.co.uk>
3  *               2009 Nokia Corporation
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Library General Public License for more details.
14  *
15  * You should have received a copy of the GNU Library General Public
16  * License along with this library; if not, write to the
17  * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
18  * Boston, MA 02110-1301, USA.
19  */
20
21 #ifndef __GES_INTERNAL_H__
22 #define __GES_INTERNAL_H__
23 #include <gst/gst.h>
24 #include <gst/pbutils/encoding-profile.h>
25 #include <gio/gio.h>
26
27 #include "ges-timeline.h"
28 #include "ges-track-element.h"
29 #include "ges-timeline-element.h"
30
31 #include "ges-asset.h"
32 #include "ges-base-xml-formatter.h"
33
34 G_BEGIN_DECLS
35
36 GST_DEBUG_CATEGORY_EXTERN (_ges_debug);
37 #ifndef GST_CAT_DEFAULT
38 #define GST_CAT_DEFAULT _ges_debug
39 #endif
40
41 /*  The first 2 NLE priorities are used for:
42  *    0- The Mixing element
43  *    1- The Gaps
44  */
45 #define MIN_NLE_PRIO 2
46 #define LAYER_HEIGHT 1000
47
48 #define _START(obj) GES_TIMELINE_ELEMENT_START (obj)
49 #define _INPOINT(obj) GES_TIMELINE_ELEMENT_INPOINT (obj)
50 #define _DURATION(obj) GES_TIMELINE_ELEMENT_DURATION (obj)
51 #define _MAXDURATION(obj) GES_TIMELINE_ELEMENT_MAX_DURATION (obj)
52 #define _PRIORITY(obj) GES_TIMELINE_ELEMENT_PRIORITY (obj)
53 #define _END(obj) (_START (obj) + _DURATION (obj))
54 #define _set_start0 ges_timeline_element_set_start
55 #define _set_inpoint0 ges_timeline_element_set_inpoint
56 #define _set_duration0 ges_timeline_element_set_duration
57 #define _set_priority0 ges_timeline_element_set_priority
58
59 #define GES_TIMELINE_ELEMENT_FORMAT \
60     "s:%p" \
61     " start: %" GST_TIME_FORMAT \
62     " inpoint: %" GST_TIME_FORMAT \
63     " duration: %" GST_TIME_FORMAT
64
65 #define GES_TIMELINE_ELEMENT_ARGS(element) \
66     GES_TIMELINE_ELEMENT_NAME(element), element, \
67     GST_TIME_ARGS(GES_TIMELINE_ELEMENT_START(element)), \
68     GST_TIME_ARGS(GES_TIMELINE_ELEMENT_INPOINT(element)), \
69     GST_TIME_ARGS(GES_TIMELINE_ELEMENT_DURATION(element))
70
71 G_GNUC_INTERNAL gboolean
72 timeline_ripple_object         (GESTimeline *timeline, GESTrackElement *obj,
73                                     GList * layers, GESEdge edge,
74                                     guint64 position);
75
76 G_GNUC_INTERNAL gboolean
77 timeline_slide_object          (GESTimeline *timeline, GESTrackElement *obj,
78                                     GList * layers, GESEdge edge, guint64 position);
79
80 G_GNUC_INTERNAL gboolean
81 timeline_roll_object           (GESTimeline *timeline, GESTrackElement *obj,
82                                     GList * layers, GESEdge edge, guint64 position);
83
84 G_GNUC_INTERNAL gboolean
85 timeline_trim_object           (GESTimeline *timeline, GESTrackElement * object,
86                                     GList * layers, GESEdge edge, guint64 position);
87 G_GNUC_INTERNAL gboolean
88 ges_timeline_trim_object_simple (GESTimeline * timeline, GESTimelineElement * obj,
89                                  GList * layers, GESEdge edge, guint64 position, gboolean snapping);
90
91 G_GNUC_INTERNAL gboolean
92 ges_timeline_move_object_simple (GESTimeline * timeline, GESTimelineElement * object,
93                                  GList * layers, GESEdge edge, guint64 position);
94
95 G_GNUC_INTERNAL gboolean
96 timeline_move_object           (GESTimeline *timeline, GESTrackElement * object,
97                                     GList * layers, GESEdge edge, guint64 position);
98
99 G_GNUC_INTERNAL gboolean
100 timeline_context_to_layer      (GESTimeline *timeline, gint offset);
101
102 G_GNUC_INTERNAL void
103 timeline_add_group             (GESTimeline *timeline,
104                                 GESGroup *group);
105 G_GNUC_INTERNAL void
106 timeline_remove_group          (GESTimeline *timeline,
107                                 GESGroup *group);
108 G_GNUC_INTERNAL void
109 timeline_emit_group_added      (GESTimeline *timeline,
110                                 GESGroup *group);
111 G_GNUC_INTERNAL void
112 timeline_emit_group_removed    (GESTimeline * timeline,
113                                 GESGroup * group, GPtrArray * array);
114
115 G_GNUC_INTERNAL
116 gboolean
117 timeline_add_element           (GESTimeline *timeline,
118                                 GESTimelineElement *element);
119 G_GNUC_INTERNAL
120 gboolean
121 timeline_remove_element       (GESTimeline *timeline,
122                                GESTimelineElement *element);
123
124 G_GNUC_INTERNAL
125 void
126 timeline_fill_gaps            (GESTimeline *timeline);
127
128 G_GNUC_INTERNAL void
129 timeline_create_transitions (GESTimeline * timeline, GESTrackElement * track_element);
130
131 G_GNUC_INTERNAL
132 void
133 track_resort_and_fill_gaps    (GESTrack *track);
134
135 G_GNUC_INTERNAL
136 void
137 track_disable_last_gap        (GESTrack *track, gboolean disabled);
138
139 G_GNUC_INTERNAL void
140 ges_asset_cache_init (void);
141
142 G_GNUC_INTERNAL void
143 ges_asset_cache_deinit (void);
144
145 G_GNUC_INTERNAL void
146 ges_asset_set_id (GESAsset *asset, const gchar *id);
147
148 G_GNUC_INTERNAL void
149 ges_asset_cache_put (GESAsset * asset, GTask *task);
150
151 G_GNUC_INTERNAL gboolean
152 ges_asset_cache_set_loaded(GType extractable_type, const gchar * id, GError *error);
153
154 GES_API GESAsset*
155 ges_asset_cache_lookup(GType extractable_type, const gchar * id);
156
157 GES_API gboolean
158 ges_asset_try_proxy (GESAsset *asset, const gchar *new_id);
159
160 G_GNUC_INTERNAL gboolean
161 ges_asset_request_id_update (GESAsset *asset, gchar **proposed_id,
162     GError *error);
163 G_GNUC_INTERNAL gchar *
164 ges_effect_assect_id_get_type_and_bindesc (const char    *id,
165                                            GESTrackType  *track_type,
166                                            GError       **error);
167
168 G_GNUC_INTERNAL void _ges_uri_asset_cleanup (void);
169
170 G_GNUC_INTERNAL gboolean _ges_uri_asset_ensure_setup (gpointer uriasset_class);
171
172 /* GESExtractable internall methods
173  *
174  * FIXME Check if that should be public later
175  */
176 G_GNUC_INTERNAL GType
177 ges_extractable_type_get_asset_type              (GType type);
178
179 G_GNUC_INTERNAL gchar *
180 ges_extractable_type_check_id                    (GType type, const gchar *id, GError **error);
181
182 G_GNUC_INTERNAL GParameter *
183 ges_extractable_type_get_parameters_from_id      (GType type, const gchar *id,
184                                                   guint *n_params);
185 G_GNUC_INTERNAL GType
186 ges_extractable_get_real_extractable_type_for_id (GType type, const gchar * id);
187
188 G_GNUC_INTERNAL gboolean
189 ges_extractable_register_metas                   (GType extractable_type, GESAsset *asset);
190
191 /************************************************
192  *                                              *
193  *        GESFormatter internal methods         *
194  *                                              *
195  ************************************************/
196 G_GNUC_INTERNAL void
197 ges_formatter_set_project                        (GESFormatter *formatter,
198                                                   GESProject *project);
199 G_GNUC_INTERNAL GESProject *
200 ges_formatter_get_project                        (GESFormatter *formatter);
201 G_GNUC_INTERNAL  GESAsset *
202 _find_formatter_asset_for_id                     (const gchar *id);
203
204
205
206 /************************************************
207  *                                              *
208  *        GESProject internal methods           *
209  *                                              *
210  ************************************************/
211
212 /* FIXME This should probably become public, but we need to make sure it
213  * is the right API before doing so */
214 G_GNUC_INTERNAL  gboolean ges_project_set_loaded                  (GESProject * project,
215                                                                    GESFormatter *formatter);
216 G_GNUC_INTERNAL  gchar * ges_project_try_updating_id              (GESProject *self,
217                                                                    GESAsset *asset,
218                                                                    GError *error);
219 G_GNUC_INTERNAL  void ges_project_add_loading_asset               (GESProject *project,
220                                                                    GType extractable_type,
221                                                                    const gchar *id);
222 G_GNUC_INTERNAL  gchar* ges_uri_asset_try_update_id               (GError *error, GESAsset *wrong_asset);
223 /************************************************
224  *                                              *
225  *   GESBaseXmlFormatter internal methods       *
226  *                                              *
227  ************************************************/
228
229 /* FIXME GESBaseXmlFormatter is all internal for now, the API is not stable
230  * fo now, so do not expose it */
231 G_GNUC_INTERNAL void ges_base_xml_formatter_add_clip (GESBaseXmlFormatter * self,
232                                                                  const gchar *id,
233                                                                  const char *asset_id,
234                                                                  GType type,
235                                                                  GstClockTime start,
236                                                                  GstClockTime inpoint,
237                                                                  GstClockTime duration,
238                                                                  guint layer_prio,
239                                                                  GESTrackType track_types,
240                                                                  GstStructure *properties,
241                                                                  GstStructure * children_properties,
242                                                                  const gchar *metadatas,
243                                                                  GError **error);
244 G_GNUC_INTERNAL void ges_base_xml_formatter_add_asset        (GESBaseXmlFormatter * self,
245                                                                  const gchar * id,
246                                                                  GType extractable_type,
247                                                                  GstStructure *properties,
248                                                                  const gchar *metadatas,
249                                                                  const gchar *proxy_id,
250                                                                  GError **error);
251 G_GNUC_INTERNAL void ges_base_xml_formatter_add_layer           (GESBaseXmlFormatter *self,
252                                                                  GType extractable_type,
253                                                                  guint priority,
254                                                                  GstStructure *properties,
255                                                                  const gchar *metadatas,
256                                                                  GError **error);
257 G_GNUC_INTERNAL void ges_base_xml_formatter_add_track           (GESBaseXmlFormatter *self,
258                                                                  GESTrackType track_type,
259                                                                  GstCaps *caps,
260                                                                  const gchar *id,
261                                                                  GstStructure *properties,
262                                                                  const gchar *metadatas,
263                                                                  GError **error);
264 G_GNUC_INTERNAL void ges_base_xml_formatter_add_encoding_profile(GESBaseXmlFormatter * self,
265                                                                  const gchar *type,
266                                                                  const gchar *parent,
267                                                                  const gchar * name,
268                                                                  const gchar * description,
269                                                                  GstCaps * format,
270                                                                  const gchar * preset,
271                                                                  GstStructure * preset_properties,
272                                                                  const gchar * preset_name,
273                                                                  guint id,
274                                                                  guint presence,
275                                                                  GstCaps * restriction,
276                                                                  guint pass,
277                                                                  gboolean variableframerate,
278                                                                  GstStructure * properties,
279                                                                  gboolean enabled,
280                                                                  GError ** error);
281 G_GNUC_INTERNAL void ges_base_xml_formatter_add_track_element   (GESBaseXmlFormatter *self,
282                                                                  GType effect_type,
283                                                                  const gchar *asset_id,
284                                                                  const gchar * track_id,
285                                                                  const gchar *timeline_obj_id,
286                                                                  GstStructure *children_properties,
287                                                                  GstStructure *properties,
288                                                                  const gchar *metadatas,
289                                                                  GError **error);
290
291 G_GNUC_INTERNAL void ges_base_xml_formatter_add_source          (GESBaseXmlFormatter *self,
292                                                                  const gchar * track_id,
293                                                                  GstStructure *children_properties);
294
295 G_GNUC_INTERNAL void ges_base_xml_formatter_add_group           (GESBaseXmlFormatter *self,
296                                                                  const gchar *name,
297                                                                  const gchar *properties,
298                                                                  const gchar *metadatas);
299
300 G_GNUC_INTERNAL void ges_base_xml_formatter_last_group_add_child(GESBaseXmlFormatter *self,
301                                                                  const gchar * id,
302                                                                  const gchar * name);
303
304 G_GNUC_INTERNAL void ges_base_xml_formatter_add_control_binding (GESBaseXmlFormatter * self,
305                                                                   const gchar * binding_type,
306                                                                   const gchar * source_type,
307                                                                   const gchar * property_name,
308                                                                   gint mode,
309                                                                   const gchar *track_id,
310                                                                   GSList * timed_values);
311
312 G_GNUC_INTERNAL gboolean set_property_foreach                   (GQuark field_id,
313                                                                  const GValue * value,
314                                                                  GObject * object);
315
316 G_GNUC_INTERNAL GstElement * get_element_for_encoding_profile   (GstEncodingProfile *prof,
317                                                                  GstElementFactoryListType type);
318
319 /* Function to initialise GES */
320 G_GNUC_INTERNAL void _init_standard_transition_assets        (void);
321 G_GNUC_INTERNAL void _init_formatter_assets                  (void);
322
323 /* Utilities */
324 G_GNUC_INTERNAL gint element_start_compare                (GESTimelineElement * a,
325                                                            GESTimelineElement * b);
326 G_GNUC_INTERNAL gint element_end_compare                  (GESTimelineElement * a,
327                                                            GESTimelineElement * b);
328 G_GNUC_INTERNAL GstElementFactory *
329 ges_get_compositor_factory                                (void);
330
331 G_GNUC_INTERNAL void
332 ges_base_xml_formatter_set_timeline_properties(GESBaseXmlFormatter * self,
333                                                GESTimeline *timeline,
334                                                const gchar *properties,
335                                                const gchar *metadatas);
336
337 /****************************************************
338  *              GESContainer                        *
339  ****************************************************/
340 G_GNUC_INTERNAL void _ges_container_sort_children         (GESContainer *container);
341 G_GNUC_INTERNAL void _ges_container_sort_children_by_end  (GESContainer *container);
342 G_GNUC_INTERNAL void _ges_container_set_height            (GESContainer * container,
343                                                            guint32 height);
344 G_GNUC_INTERNAL gint  _ges_container_get_priority_offset  (GESContainer * container,
345                                                            GESTimelineElement *elem);
346 G_GNUC_INTERNAL void _ges_container_set_priority_offset   (GESContainer * container,
347                                                            GESTimelineElement *elem,
348                                                            gint32 priority_offset);
349
350
351 /****************************************************
352  *                  GESClip                         *
353  ****************************************************/
354 G_GNUC_INTERNAL void              ges_clip_set_layer              (GESClip *clip, GESLayer  *layer);
355 G_GNUC_INTERNAL gboolean          ges_clip_is_moving_from_layer   (GESClip *clip);
356 G_GNUC_INTERNAL guint32           ges_clip_get_layer_priority     (GESClip *clip);
357 G_GNUC_INTERNAL void              ges_clip_set_moving_from_layer  (GESClip *clip, gboolean is_moving);
358 G_GNUC_INTERNAL GESTrackElement*  ges_clip_create_track_element   (GESClip *clip, GESTrackType type);
359 G_GNUC_INTERNAL GList*            ges_clip_create_track_elements  (GESClip *clip, GESTrackType type);
360
361 /****************************************************
362  *              GESLayer                            *
363  ****************************************************/
364 G_GNUC_INTERNAL gboolean ges_layer_resync_priorities (GESLayer * layer);
365 G_GNUC_INTERNAL void layer_set_priority               (GESLayer * layer, guint priority, gboolean emit);
366
367 /****************************************************
368  *              GESTrackElement                     *
369  ****************************************************/
370 #define         NLE_OBJECT_TRACK_ELEMENT_QUARK                  (g_quark_from_string ("nle_object_track_element_quark"))
371 G_GNUC_INTERNAL gboolean  ges_track_element_set_track           (GESTrackElement * object, GESTrack * track);
372 G_GNUC_INTERNAL guint32   _ges_track_element_get_layer_priority (GESTrackElement * element);
373 G_GNUC_INTERNAL void ges_track_element_copy_properties          (GESTimelineElement * element,
374                                                                  GESTimelineElement * elementcopy);
375
376 G_GNUC_INTERNAL void ges_track_element_copy_bindings (GESTrackElement *element,
377                                                        GESTrackElement *new_element,
378                                                        guint64 position);
379
380 G_GNUC_INTERNAL GstElement *ges_source_create_topbin (const gchar * bin_name, GstElement * sub_element, ...);
381 G_GNUC_INTERNAL void ges_track_set_caps                (GESTrack *track,
382                                                         const GstCaps *caps);
383 G_GNUC_INTERNAL GstElement * ges_track_get_composition (GESTrack *track);
384
385
386 /*********************************************
387  *  GESTrackElement subclasses contructores  *
388  ********************************************/
389 G_GNUC_INTERNAL GESAudioTestSource * ges_audio_test_source_new (void);
390 G_GNUC_INTERNAL GESAudioUriSource  * ges_audio_uri_source_new  (gchar *uri);
391 G_GNUC_INTERNAL GESVideoUriSource  * ges_video_uri_source_new  (gchar *uri);
392 G_GNUC_INTERNAL GESImageSource     * ges_image_source_new      (gchar *uri);
393 G_GNUC_INTERNAL GESTitleSource     * ges_title_source_new      (void);
394 G_GNUC_INTERNAL GESVideoTestSource * ges_video_test_source_new (void);
395
396 /****************************************************
397  *              GESTimelineElement                  *
398  ****************************************************/
399 G_GNUC_INTERNAL gdouble ges_timeline_element_get_media_duration_factor(GESTimelineElement *self);
400 G_GNUC_INTERNAL GESTimelineElement * ges_timeline_element_get_copied_from (GESTimelineElement *self);
401
402 /******************************
403  *  GESMultiFile internal API *
404  ******************************/
405 typedef struct GESMultiFileURI
406 {
407   gchar *location;
408   gint start;
409   gint end;
410 } GESMultiFileURI;
411
412 G_GNUC_INTERNAL GESMultiFileURI * ges_multi_file_uri_new (const gchar * uri);
413
414 /************************
415  * Our property masks   *
416  ************************/
417 #define GES_PARAM_NO_SERIALIZATION (1 << (G_PARAM_USER_SHIFT + 1))
418
419 /********************
420  *  Gnonlin helpers *
421  ********************/
422
423 G_GNUC_INTERNAL gboolean ges_nle_composition_add_object (GstElement *comp, GstElement *object);
424 G_GNUC_INTERNAL gboolean ges_nle_composition_remove_object (GstElement *comp, GstElement *object);
425 G_GNUC_INTERNAL gboolean ges_nle_object_commit (GstElement * nlesource, gboolean recurse);
426
427 G_END_DECLS
428
429 #endif /* __GES_INTERNAL_H__ */