gstreamer/docs/design/effects.txt

293 lines
10 KiB
Text
Raw Normal View History

Effects
-------
Summary
-------
1. Basic ideas
2. Problems
3. Propositions to solve those problems
A. The registry
B. Effects configurability
C. Keyframes
4. Use-cases
2010-12-07 12:47:47 +00:00
5. API draft
2011-01-18 19:03:42 +00:00
The goal of this proposal is to design a simple way to handle effects through an
API which would allow developers to handle any use-cases.
1. Basic ideas
----------------
2011-01-18 19:03:42 +00:00
* GESTrackEffects are subclasses of GESTrackOperation
2011-01-12 10:47:30 +00:00
* You can add effects on any clip or layer
2011-01-18 19:03:42 +00:00
* You can add effects over several clips and control them as a unique effect.
2011-01-18 19:03:42 +00:00
* Effects are configurable and those properties can change during time
2011-01-18 19:03:42 +00:00
* We must be able to handle third-party effect providers, like the
gnome-video-effects standard.
2011-01-18 19:03:42 +00:00
* We must be able to implement complex effects. This means effects that are more
than adding GstElement-s to the timeline. It can also mean effects
2011-01-18 19:03:42 +00:00
that apply both video and audio changes.
2. Problems
----------
2011-01-18 19:03:42 +00:00
* We must be able to provide a list of effects available on the system at
runtime.
2011-01-18 19:03:42 +00:00
* We must be able to configure effects through an API in GES and
not directly configuring the corresponding GstElement properties.
2011-01-18 19:03:42 +00:00
==> EDWARD : The wording makes it a bit confusing. Here one could
read that we'll be offering an API to get/change properties
which is completely different from the standard GObject API.
* We should also expose the GstElement-s contained in an effect so
it is possible for people to control their properties as they wish.
2011-01-18 19:03:42 +00:00
* We must be able to implement and handle complexe effects directly in GES
2011-01-18 19:03:42 +00:00
* We must be able to configure effects through time -> Keyframes without
duplicating code from GStreamer
3. Propositions to solve those problems
---------------------------------------
2011-01-12 10:47:30 +00:00
A. The registry => Still to design
2011-01-12 10:47:30 +00:00
We could implement a GESRegistry which would actually
retrieve elements (effects) from the GSTRegistry and any other mean
such as gnome-video-effects to let us get all the effects that are present
on the system....
This way the developers could have the list of all the effects
that are installed on the system pretty easily.
B. Effects configurability
The idea to be able to configure effects through a simple API in GES would
2011-01-12 10:47:30 +00:00
be to add an API in GESTrackObject to access the gst-object properties that
user would like to configure.
2011-01-18 19:03:42 +00:00
We would also have a method to set those properties easily.
2011-01-18 19:03:42 +00:00
We should also find a way to handle that in the case of systems such as gnome-effects
C. Keyframes
2011-01-18 19:03:42 +00:00
We may want to handle this use-case directly in GES and for any kind of
time related configuration? FIXME
=> Special specifications for that?
4. Use-cases
-----------
2010-12-07 12:47:47 +00:00
UC-1. The user wants to add an effect to an entire clip => GESTimelineObject new API
2011-01-18 19:03:42 +00:00
UC-2. The developer wants to allow users to configure effects => New
2011-01-12 10:47:30 +00:00
GESTrackOperation API
2011-01-12 10:47:30 +00:00
UC-3. The user wants to add an effect on a special portion of a clip, we should
allow him to configure that thanks to a system of keyframes. FIXME
2011-01-18 19:03:42 +00:00
==> EDWARD : Just change the in-point/duration/start of that
effect within the TrackObject. See the mapping document and
feature within GESTimelineObject.
2011-01-12 10:47:30 +00:00
UC-4. We want to implement an effect which isn't only composed by a bin, but is more
complexe than that (ex: "effect '24'") => we have the GESTrackOperation
2011-01-12 10:47:30 +00:00
which is the base class (abstract) for this kind of implementation. This class should
implement vmethods to get/set configurable properties.
2011-01-12 10:47:30 +00:00
UC-5. A developer wants to implement effect which handle music and video at the same
time, Would the solution be to implement a GESTimelineEffect to handle this
special usecase? FIXME
2010-12-07 12:47:47 +00:00
2011-01-12 10:47:30 +00:00
UC-6. The developers wants to configure each elements of an effect the way he wants
2010-12-07 12:47:47 +00:00
with a full control over it.
2011-01-12 10:47:30 +00:00
UC-7. Developers want to expose all effects present on the system to the end-user
2010-12-07 12:47:47 +00:00
2011-01-12 10:47:30 +00:00
5. API draft
2010-12-07 12:47:47 +00:00
------------
2011-01-12 10:47:30 +00:00
A. GESTrackObject new API
2010-12-09 15:01:02 +00:00
2011-01-12 10:47:30 +00:00
signals:
-------
* property-changed: emited when a property of the GESTrackObject gst element
is changed
2010-12-09 15:01:02 +00:00
2011-01-18 19:03:42 +00:00
==> EDWARD : So this would be exactly the same signal as
GObject's 'notify' ? Or at least it's very similar to
GstObject's deep-notify feature. Might want to look into
that (not for using it, but for how it's implemented).
Same comment about the set/get properties. Maybe the
GstChildProxy interface would be worth a look also.
2010-12-07 12:47:47 +00:00
/**
2011-01-12 10:47:30 +00:00
* ges_track_object_list_gst_properties:
2010-12-07 12:47:47 +00:00
*
2011-01-12 10:47:30 +00:00
* @object: The origin #GESTrackObject
*
* Get all the usefull configurable properties of the GstElement contained in @object.
*
* Returns: an array of GParamSpec of the configurable properties of the
* GstElement-s contained in @object
2010-12-07 12:47:47 +00:00
*/
2011-01-12 10:47:30 +00:00
GParamSpec **
ges_track_object_list_gst_properties (GESTrackObject *object);
2010-12-07 12:47:47 +00:00
2011-01-12 10:47:30 +00:00
-> Usecases: Let user know all the property he can configure.
2010-12-07 12:47:47 +00:00
/**
2011-01-12 10:47:30 +00:00
* ges_track_object_set_gst_property:
2010-12-07 12:47:47 +00:00
*
2011-01-12 10:47:30 +00:00
* @object: The origin #GESTrackObject
* @property_name: The name of the property
* @value: the value
2010-12-07 12:47:47 +00:00
*
2011-01-12 10:47:30 +00:00
* Sets a property of a GstElement contained in @object.
2010-12-07 12:47:47 +00:00
*
*/
2011-01-12 10:47:30 +00:00
void ges_track_object_set_gst_property (GESTrackObject *object,
const gchar *property_name,
GValue * value);
2010-12-07 12:47:47 +00:00
-> Usecases:
2011-01-12 10:47:30 +00:00
+ Let user configure effects easily (UC-3)
2010-12-09 15:01:02 +00:00
2010-12-07 12:47:47 +00:00
/**
2011-01-12 10:47:30 +00:00
* ges_track_object_get_gst_property:
2010-12-07 12:47:47 +00:00
*
2011-01-12 10:47:30 +00:00
* @object: The origin #GESTrackObject
* @property_name: The name of the property
* @value: return location for the property value
2010-12-07 12:47:47 +00:00
*
2011-01-12 10:47:30 +00:00
* Gets a property of a GstElement contained in @object.
2010-12-07 12:47:47 +00:00
*/
2011-01-12 10:47:30 +00:00
void ges_track_object_get_gst_property (GESTrackObject *object,
const gchar *property_name,
GValue * value);
2010-12-07 12:47:47 +00:00
B. GESTimelineObject new API
2010-12-07 12:47:47 +00:00
2011-01-12 10:47:30 +00:00
signals:
-------
2010-12-09 15:01:02 +00:00
* effect-added: emited when an effect is added
* effect-removed: emited when an effect is removed
* effect-moved: emited when an effect is moved
2011-01-18 19:03:42 +00:00
==> EDWARD : What do you mean by 'moved' ?
2010-12-07 12:47:47 +00:00
/**
* ges_timeline_object_add_effect:
2010-12-07 12:47:47 +00:00
*
* @object: The origin #GESTimelineObject
2011-01-12 10:47:30 +00:00
* @effect_material: The #GESMaterial from which to create the effect
* @position: The top position you want to give to the effect,
* -1 if you want it to be added at the end of effects.
2010-12-07 12:47:47 +00:00
*
* Adds a new effect corresponding to @material to the #GESTimelineObject
2010-12-07 12:47:47 +00:00
*
2011-01-12 10:47:30 +00:00
* Returns: The newly created #GESTrackEffect, or %NULL if there was an error.
2010-12-07 12:47:47 +00:00
*/
GESTrackEffect *ges_timeline_object_add_effect (GESTimelineObject *object,
2011-01-12 10:47:30 +00:00
GESMaterial *effect_material,
gint position);
2010-12-07 12:47:47 +00:00
/**
* ges_timeline_object_get_effects:
2010-12-07 12:47:47 +00:00
*
* @object: The origin #GESTimelineObject
2010-12-07 12:47:47 +00:00
*
2011-01-12 10:47:30 +00:00
* Returns: a #GList of the #GESTrackEffect that are applied on
* @object order by ascendant priorities.
2010-12-07 12:47:47 +00:00
* The refcount of the objects will be increased. The user will have to
2011-01-12 10:47:30 +00:00
* unref each #GESTrackOperation and free the #GList.
2010-12-07 12:47:47 +00:00
*/
2011-01-12 10:47:30 +00:00
GList *
ges_timeline_object_get_effects (GESTimelineObject *object);
2010-12-09 15:01:02 +00:00
-> Usecases:
+ First step to allow the configuration of effects (UC-3)
/**
* ges_timeline_object_set_top_effect_position:
2010-12-09 15:01:02 +00:00
*
* @object: The origin #GESTimelineObject
2011-01-12 10:47:30 +00:00
* @effect: The #GESTrackEffect to move
2010-12-09 15:01:02 +00:00
* @newposition: the new position at which to move the @effect
*
2011-01-12 10:47:30 +00:00
* Returns: %TRUE if @effect was successfuly moved, %FALSE otherwize.
2010-12-09 15:01:02 +00:00
*/
gboolean
ges_timeline_object_set_top_effect_position (GESTimelineObject *object,
2011-01-12 10:47:30 +00:00
GESTrackEffect *effect, guint newposition);
2010-12-07 12:47:47 +00:00
2011-01-12 10:47:30 +00:00
C - The GESTrackEffect API:
2010-12-07 12:47:47 +00:00
/**
2011-01-12 10:47:30 +00:00
* ges_track_effect_new_from_material:
*
* @material: The #GESMaterial from which to create this GESTrackEffect
2010-12-07 12:47:47 +00:00
*
2011-01-12 10:47:30 +00:00
* Creates a new #GESTrackEffect from a #GESMaterial
2010-12-07 12:47:47 +00:00
*
2011-01-12 10:47:30 +00:00
* Returns: a newly created #GESTrackEffect, or %NULL if something went wrong.
2010-12-07 12:47:47 +00:00
*/
2011-01-12 10:47:30 +00:00
GESTrackEffect *ges_track_effect_new_from_material(GESTrackEffect *effect, GESMaterial *material);
2010-12-07 12:47:47 +00:00
/**
2011-01-12 10:47:30 +00:00
* ges_track_effect_new_from_bin_desc:
*
* @bin_dec: The gst-launch like bin description of the effect
2010-12-07 12:47:47 +00:00
*
2011-01-12 10:47:30 +00:00
* Creates a new #GESTrackEffect from the description of the bin. This is a
* convenience method for testing puposes.
2010-12-07 12:47:47 +00:00
*
2011-01-12 10:47:30 +00:00
* Returns: a newly created #GESTrackEffect, or %NULL if something went wrong.
2010-12-07 12:47:47 +00:00
*/
2011-01-12 10:47:30 +00:00
GESTrackEffect *ges_track_effect_new_from_bin_desc(GESTrackEffect *effect,
const gchar *bin_desc);
D - The GESTimelineEffect API:
The GESTimelineEffect basically doesn't have anything else but what GESTimelineObject has.
-> Usecases: The user wants to control multiple effects in sync. The user wants to add
an effect to the whole timeline. The user wants to had an effect to a
segment of the timeline without caring about what clip it is applied on.
=================
TODO GESRegistry API:
This should be a singleton since we don't want an app to instanciate more
2011-01-18 19:03:42 +00:00
than one registry. It must be able to get effects from various sources.
2011-01-12 10:47:30 +00:00
We should also make sure any custom effect is detected.
2010-12-07 12:47:47 +00:00
/**
2011-01-12 10:47:30 +00:00
* ges_registry_get_default:
2010-12-07 12:47:47 +00:00
*
2011-01-12 10:47:30 +00:00
* Returns a newly created #GESEffectRegistry or the existing one increasing
* its refcount
2010-12-07 12:47:47 +00:00
*/
2011-01-12 10:47:30 +00:00
GESEffectRegistry *
ges_registry_get_default (void);
2010-12-07 12:47:47 +00:00
-> Usecases:
2011-01-12 10:47:30 +00:00
+ Have a registry of all effects that are on the système (UC-8)
2010-12-07 12:47:47 +00:00
/**
2011-01-12 10:47:30 +00:00
* ges_effect_registry_get_effect_list:
2010-12-07 12:47:47 +00:00
*
2011-01-12 10:47:30 +00:00
* @self: The origin #GESEffectRegistry
2010-12-07 12:47:47 +00:00
*
2011-01-12 10:47:30 +00:00
* Returns a #GList of #GESEffectDescriptors. The
2010-12-07 12:47:47 +00:00
*/
2011-01-12 10:47:30 +00:00
GList *
ges_registry_get_effect_list (GESEffectRegistry *self);
2010-12-07 12:47:47 +00:00
-> Usecases:
2011-01-12 10:47:30 +00:00
+ Get all effects descriptors that are on the système (UC-8)