diff options
author | Thibault Saunier <tsaunier@igalia.com> | 2021-02-24 23:37:28 -0300 |
---|---|---|
committer | GStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org> | 2021-05-05 10:02:44 +0000 |
commit | 906654de879d1006bea94f6430727a1506e6daef (patch) | |
tree | 80f0fab6ab4542dee04eeabbcd42a359e8810710 | |
parent | ec5b267249af8bbe33de1af51863b0285a9831f3 (diff) |
ges: Move GESVideo/AudioSource::create_source to GESSource
Deprecating the old variants which were not introspectable
and cleaning a bit the API.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-editing-services/-/merge_requests/231>
-rw-r--r-- | ges/ges-audio-source.c | 9 | ||||
-rw-r--r-- | ges/ges-audio-source.h | 13 | ||||
-rw-r--r-- | ges/ges-audio-test-source.c | 11 | ||||
-rw-r--r-- | ges/ges-audio-uri-source.c | 5 | ||||
-rw-r--r-- | ges/ges-image-source.c | 23 | ||||
-rw-r--r-- | ges/ges-multi-file-source.c | 6 | ||||
-rw-r--r-- | ges/ges-source.h | 17 | ||||
-rw-r--r-- | ges/ges-title-source.c | 18 | ||||
-rw-r--r-- | ges/ges-track-element.h | 10 | ||||
-rw-r--r-- | ges/ges-video-source.c | 14 | ||||
-rw-r--r-- | ges/ges-video-source.h | 9 | ||||
-rw-r--r-- | ges/ges-video-test-source.c | 14 | ||||
-rw-r--r-- | ges/ges-video-uri-source.c | 4 |
13 files changed, 94 insertions, 59 deletions
diff --git a/ges/ges-audio-source.c b/ges/ges-audio-source.c index 5600d77b..1f1ce750 100644 --- a/ges/ges-audio-source.c +++ b/ges/ges-audio-source.c @@ -126,14 +126,13 @@ ges_audio_source_create_element (GESTrackElement * trksrc) GstElement *topbin; GstElement *sub_element; GPtrArray *elements; - GESAudioSourceClass *source_class = GES_AUDIO_SOURCE_GET_CLASS (trksrc); + GESSourceClass *source_class = GES_SOURCE_GET_CLASS (trksrc); const gchar *props[] = { "volume", "mute", NULL }; GESAudioSource *self = GES_AUDIO_SOURCE (trksrc); - if (!source_class->create_source) - return NULL; + g_assert (source_class->create_source); - sub_element = source_class->create_source (trksrc); + sub_element = source_class->create_source (GES_SOURCE (trksrc)); GST_DEBUG_OBJECT (trksrc, "Creating a bin sub_element ! volume"); vbin = @@ -177,13 +176,11 @@ ges_audio_source_class_init (GESAudioSourceClass * klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GESTrackElementClass *track_class = GES_TRACK_ELEMENT_CLASS (klass); - GESAudioSourceClass *audio_source_class = GES_AUDIO_SOURCE_CLASS (klass); gobject_class->dispose = ges_audio_source_dispose; track_class->nleobject_factorytype = "nlesource"; track_class->create_element = ges_audio_source_create_element; track_class->ABI.abi.default_track_type = GES_TRACK_TYPE_AUDIO; - audio_source_class->create_source = NULL; } static void diff --git a/ges/ges-audio-source.h b/ges/ges-audio-source.h index 4f648da6..b8a23aca 100644 --- a/ges/ges-audio-source.h +++ b/ges/ges-audio-source.h @@ -49,16 +49,21 @@ struct _GESAudioSource { /** * GESAudioSourceClass: - * @create_source: method to return the GstElement to put in the source topbin. - * Other elements will be queued, like a volume. - * In the case of a AudioUriSource, for example, the subclass will return a decodebin, - * and we will append a volume. */ struct _GESAudioSourceClass { /*< private >*/ GESSourceClass parent_class; /*< public >*/ + /** + * GESAudioSource::create_element: + * @object: The #GESTrackElement + * + * Returns: (transfer floating): the #GstElement that the underlying nleobject + * controls. + * + * Deprecated: 1.20: Use #GESSourceClass::create_element instead. + */ GstElement* (*create_source) (GESTrackElement * object); /*< private >*/ diff --git a/ges/ges-audio-test-source.c b/ges/ges-audio-test-source.c index 9234dc03..69d2f365 100644 --- a/ges/ges-audio-test-source.c +++ b/ges/ges-audio-test-source.c @@ -57,13 +57,13 @@ static void ges_audio_test_source_get_property (GObject * object, guint static void ges_audio_test_source_set_property (GObject * object, guint property_id, const GValue * value, GParamSpec * pspec); -static GstElement *ges_audio_test_source_create_source (GESTrackElement * self); +static GstElement *ges_audio_test_source_create_source (GESSource * source); static void ges_audio_test_source_class_init (GESAudioTestSourceClass * klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); - GESAudioSourceClass *source_class = GES_AUDIO_SOURCE_CLASS (klass); + GESSourceClass *source_class = GES_SOURCE_CLASS (klass); object_class->get_property = ges_audio_test_source_get_property; object_class->set_property = ges_audio_test_source_set_property; @@ -100,18 +100,19 @@ ges_audio_test_source_set_property (GObject * object, } static GstElement * -ges_audio_test_source_create_source (GESTrackElement * trksrc) +ges_audio_test_source_create_source (GESSource * source) { GESAudioTestSource *self; GstElement *ret; const gchar *props[] = { "volume", "freq", NULL }; - self = (GESAudioTestSource *) trksrc; + self = (GESAudioTestSource *) source; ret = gst_element_factory_make ("audiotestsrc", NULL); g_object_set (ret, "volume", (gdouble) self->priv->volume, "freq", (gdouble) self->priv->freq, NULL); - ges_track_element_add_children_props (trksrc, ret, NULL, NULL, props); + ges_track_element_add_children_props (GES_TRACK_ELEMENT (self), ret, NULL, + NULL, props); return ret; } diff --git a/ges/ges-audio-uri-source.c b/ges/ges-audio-uri-source.c index ce3af096..2d56160d 100644 --- a/ges/ges-audio-uri-source.c +++ b/ges/ges-audio-uri-source.c @@ -48,7 +48,7 @@ enum /* GESSource VMethod */ static GstElement * -ges_audio_uri_source_create_source (GESTrackElement * element) +ges_audio_uri_source_create_source (GESSource * element) { return ges_uri_source_create_source (GES_AUDIO_URI_SOURCE (element)->priv); } @@ -137,7 +137,6 @@ ges_audio_uri_source_class_init (GESAudioUriSourceClass * klass) GObjectClass *object_class = G_OBJECT_CLASS (klass); GESTimelineElementClass *element_class = GES_TIMELINE_ELEMENT_CLASS (klass); GESSourceClass *src_class = GES_SOURCE_CLASS (klass); - GESAudioSourceClass *audio_src_class = GES_AUDIO_SOURCE_CLASS (klass); object_class->get_property = ges_audio_uri_source_get_property; object_class->set_property = ges_audio_uri_source_set_property; @@ -155,7 +154,7 @@ ges_audio_uri_source_class_init (GESAudioUriSourceClass * klass) element_class->get_natural_framerate = _get_natural_framerate; src_class->select_pad = ges_uri_source_select_pad; - audio_src_class->create_source = ges_audio_uri_source_create_source; + src_class->create_source = ges_audio_uri_source_create_source; } static void diff --git a/ges/ges-image-source.c b/ges/ges-image-source.c index 8b7ee455..04f003cc 100644 --- a/ges/ges-image-source.c +++ b/ges/ges-image-source.c @@ -118,20 +118,20 @@ pad_added_cb (GstElement * source, GstPad * pad, GstElement * scale) } static GstElement * -ges_image_source_create_source (GESTrackElement * track_element) +ges_image_source_create_source (GESSource * source) { - GstElement *bin, *source, *scale, *freeze, *iconv; - GstPad *src, *target; + GstElement *bin, *src, *scale, *freeze, *iconv; + GstPad *srcpad, *target; bin = GST_ELEMENT (gst_bin_new ("still-image-bin")); - source = gst_element_factory_make ("uridecodebin", NULL); + src = gst_element_factory_make ("uridecodebin", NULL); scale = gst_element_factory_make ("videoscale", NULL); freeze = gst_element_factory_make ("imagefreeze", NULL); iconv = gst_element_factory_make ("videoconvert", NULL); g_object_set (scale, "add-borders", TRUE, NULL); - gst_bin_add_many (GST_BIN (bin), source, scale, freeze, iconv, NULL); + gst_bin_add_many (GST_BIN (bin), src, scale, freeze, iconv, NULL); gst_element_link_pads_full (scale, "src", iconv, "sink", GST_PAD_LINK_CHECK_NOTHING); @@ -142,13 +142,13 @@ ges_image_source_create_source (GESTrackElement * track_element) target = gst_element_get_static_pad (freeze, "src"); - src = gst_ghost_pad_new ("src", target); - gst_element_add_pad (bin, src); + srcpad = gst_ghost_pad_new ("src", target); + gst_element_add_pad (bin, srcpad); gst_object_unref (target); - g_object_set (source, "uri", ((GESImageSource *) track_element)->uri, NULL); + g_object_set (src, "uri", ((GESImageSource *) source)->uri, NULL); - g_signal_connect (G_OBJECT (source), "pad-added", + g_signal_connect (G_OBJECT (src), "pad-added", G_CALLBACK (pad_added_cb), scale); return bin; @@ -158,7 +158,8 @@ static void ges_image_source_class_init (GESImageSourceClass * klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); - GESVideoSourceClass *source_class = GES_VIDEO_SOURCE_CLASS (klass); + GESSourceClass *source_class = GES_SOURCE_CLASS (klass); + GESVideoSourceClass *vsource_class = GES_VIDEO_SOURCE_CLASS (klass); object_class->get_property = ges_image_source_get_property; object_class->set_property = ges_image_source_set_property; @@ -174,7 +175,7 @@ ges_image_source_class_init (GESImageSourceClass * klass) NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); source_class->create_source = ges_image_source_create_source; - source_class->ABI.abi.get_natural_size = + vsource_class->ABI.abi.get_natural_size = ges_video_uri_source_get_natural_size; GES_TRACK_ELEMENT_CLASS_DEFAULT_HAS_INTERNAL_SOURCE (klass) = FALSE; diff --git a/ges/ges-multi-file-source.c b/ges/ges-multi-file-source.c index 42ad2d82..25f600f4 100644 --- a/ges/ges-multi-file-source.c +++ b/ges/ges-multi-file-source.c @@ -173,7 +173,7 @@ ges_multi_file_uri_new (const gchar * uri) } static GstElement * -ges_multi_file_source_create_source (GESTrackElement * track_element) +ges_multi_file_source_create_source (GESSource * source) { GESMultiFileSource *self; GstElement *bin, *src, *decodebin; @@ -184,7 +184,7 @@ ges_multi_file_source_create_source (GESTrackElement * track_element) GESUriSourceAsset *asset; GESMultiFileURI *uri_data; - self = (GESMultiFileSource *) track_element; + self = (GESMultiFileSource *) source; asset = GES_URI_SOURCE_ASSET (ges_extractable_get_asset (GES_EXTRACTABLE (self))); @@ -230,7 +230,7 @@ static void ges_multi_file_source_class_init (GESMultiFileSourceClass * klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); - GESVideoSourceClass *source_class = GES_VIDEO_SOURCE_CLASS (klass); + GESSourceClass *source_class = GES_SOURCE_CLASS (klass); object_class->get_property = ges_multi_file_source_get_property; object_class->set_property = ges_multi_file_source_set_property; diff --git a/ges/ges-source.h b/ges/ges-source.h index 022297ee..a807667c 100644 --- a/ges/ges-source.h +++ b/ges/ges-source.h @@ -48,7 +48,6 @@ struct _GESSource { /** * GESSourceClass: - * @create_source: method to return the GstElement to put in the source topbin. */ struct _GESSourceClass { @@ -68,8 +67,22 @@ struct _GESSourceClass { */ gboolean (*select_pad)(GESSource *source, GstPad *pad); + /** + * GESSourceClass::create_source: + * @source: The #GESAudioSource + * + * Creates the GstElement to put in the source topbin. Other elements will be + * queued, like a volume. In the case of a AudioUriSource, for example, the + * subclass will return a decodebin, and we will append a volume. + * + * Returns: (transfer floating): The source element to use. + * + * Since: 1.20 + */ + GstElement* (*create_source) (GESSource * source); + /* Padding for API extension */ - gpointer _ges_reserved[GES_PADDING - 1]; + gpointer _ges_reserved[GES_PADDING - 2]; }; G_END_DECLS diff --git a/ges/ges-title-source.c b/ges/ges-title-source.c index c1a02a7b..d20ed2fc 100644 --- a/ges/ges-title-source.c +++ b/ges/ges-title-source.c @@ -68,7 +68,7 @@ static void ges_title_source_get_property (GObject * object, guint static void ges_title_source_set_property (GObject * object, guint property_id, const GValue * value, GParamSpec * pspec); -static GstElement *ges_title_source_create_source (GESTrackElement * self); +static GstElement *ges_title_source_create_source (GESSource * self); static gboolean _lookup_child (GESTimelineElement * object, @@ -98,7 +98,8 @@ static void ges_title_source_class_init (GESTitleSourceClass * klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); - GESVideoSourceClass *source_class = GES_VIDEO_SOURCE_CLASS (klass); + GESSourceClass *source_class = GES_SOURCE_CLASS (klass); + GESVideoSourceClass *vsource_class = GES_VIDEO_SOURCE_CLASS (klass); GESTimelineElementClass *timeline_element_class = GES_TIMELINE_ELEMENT_CLASS (klass); @@ -107,7 +108,7 @@ ges_title_source_class_init (GESTitleSourceClass * klass) object_class->dispose = ges_title_source_dispose; timeline_element_class->lookup_child = _lookup_child; - source_class->ABI.abi.disable_scale_in_compositor = TRUE; + vsource_class->ABI.abi.disable_scale_in_compositor = TRUE; source_class->create_source = ges_title_source_create_source; GES_TRACK_ELEMENT_CLASS_DEFAULT_HAS_INTERNAL_SOURCE (klass) = FALSE; @@ -176,12 +177,12 @@ ges_title_source_set_property (GObject * object, } static GstElement * -ges_title_source_create_source (GESTrackElement * object) +ges_title_source_create_source (GESSource * source) { GstElement *topbin, *background, *text; GstPad *src, *pad; - GESTitleSource *self = GES_TITLE_SOURCE (object); + GESTitleSource *self = GES_TITLE_SOURCE (source); GESTitleSourcePrivate *priv = self->priv; const gchar *bg_props[] = { "pattern", "foreground-color", NULL }; const gchar *text_props[] = { "text", "font-desc", "valignment", "halignment", @@ -228,9 +229,10 @@ ges_title_source_create_source (GESTrackElement * object) priv->text_el = text; priv->background_el = background; - ges_track_element_add_children_props (object, text, NULL, NULL, text_props); - ges_track_element_add_children_props (object, background, NULL, NULL, - bg_props); + ges_track_element_add_children_props (GES_TRACK_ELEMENT (source), text, NULL, + NULL, text_props); + ges_track_element_add_children_props (GES_TRACK_ELEMENT (source), background, + NULL, NULL, bg_props); return topbin; } diff --git a/ges/ges-track-element.h b/ges/ges-track-element.h index ac97d002..6d984c91 100644 --- a/ges/ges-track-element.h +++ b/ges/ges-track-element.h @@ -70,8 +70,6 @@ struct _GESTrackElement { * track element. The default implementation will use the factory given by * @nleobject_factorytype to created the nleobject and will give it * the #GstElement returned by @create_element. - * @create_element: Method to create the #GstElement that the underlying - * nleobject controls. * @active_changed: Method to be called when the #GESTrackElement:active * property changes. * @list_children_properties: Deprecated: Listing children properties is @@ -92,6 +90,14 @@ struct _GESTrackElementClass { /* virtual methods for subclasses */ const gchar *nleobject_factorytype; GstElement* (*create_gnl_object) (GESTrackElement * object); + + /** + * GESTrackElementClass::create_element: + * @object: The #GESTrackElement + * + * Returns: (transfer floating): the #GstElement that the underlying nleobject + * controls. + */ GstElement* (*create_element) (GESTrackElement * object); void (*active_changed) (GESTrackElement *object, gboolean active); diff --git a/ges/ges-video-source.c b/ges/ges-video-source.c index 6f17b43c..ce839410 100644 --- a/ges/ges-video-source.c +++ b/ges/ges-video-source.c @@ -174,7 +174,8 @@ ges_video_source_create_element (GESTrackElement * trksrc) { GstElement *topbin; GstElement *sub_element; - GESVideoSourceClass *source_class = GES_VIDEO_SOURCE_GET_CLASS (trksrc); + GESVideoSourceClass *vsource_class = GES_VIDEO_SOURCE_GET_CLASS (trksrc); + GESSourceClass *source_class = GES_SOURCE_GET_CLASS (trksrc); GESVideoSource *self; gboolean needs_converters = TRUE; GPtrArray *elements; @@ -182,15 +183,15 @@ ges_video_source_create_element (GESTrackElement * trksrc) if (!source_class->create_source) return NULL; - sub_element = source_class->create_source (trksrc); + sub_element = source_class->create_source (GES_SOURCE (trksrc)); self = (GESVideoSource *) trksrc; - if (source_class->ABI.abi.needs_converters) - needs_converters = source_class->ABI.abi.needs_converters (self); + if (vsource_class->ABI.abi.needs_converters) + needs_converters = vsource_class->ABI.abi.needs_converters (self); elements = g_ptr_array_new (); - g_assert (source_class->ABI.abi.create_filters); - if (!source_class->ABI.abi.create_filters (self, elements, needs_converters)) { + g_assert (vsource_class->ABI.abi.create_filters); + if (!vsource_class->ABI.abi.create_filters (self, elements, needs_converters)) { g_ptr_array_free (elements, TRUE); return NULL; @@ -248,7 +249,6 @@ ges_video_source_class_init (GESVideoSourceClass * klass) track_element_class->create_element = ges_video_source_create_element; track_element_class->ABI.abi.default_track_type = GES_TRACK_TYPE_VIDEO; - video_source_class->create_source = NULL; video_source_class->ABI.abi.create_filters = ges_video_source_create_filters; } diff --git a/ges/ges-video-source.h b/ges/ges-video-source.h index 75067a17..d2a895df 100644 --- a/ges/ges-video-source.h +++ b/ges/ges-video-source.h @@ -59,6 +59,15 @@ struct _GESVideoSourceClass { GESSourceClass parent_class; /*< public >*/ + /** + * GESVideoSource::create_element: + * @object: The #GESTrackElement + * + * Returns: (transfer floating): the #GstElement that the underlying nleobject + * controls. + * + * Deprecated: 1.20: Use #GESSourceClass::create_element instead. + */ GstElement* (*create_source) (GESTrackElement * object); /*< private >*/ diff --git a/ges/ges-video-test-source.c b/ges/ges-video-test-source.c index 9df3746c..7d0ae580 100644 --- a/ges/ges-video-test-source.c +++ b/ges/ges-video-test-source.c @@ -65,7 +65,7 @@ G_DEFINE_TYPE_WITH_CODE (GESVideoTestSource, ges_video_test_source, G_IMPLEMENT_INTERFACE (GES_TYPE_EXTRACTABLE, ges_extractable_interface_init)); -static GstElement *ges_video_test_source_create_source (GESTrackElement * self); +static GstElement *ges_video_test_source_create_source (GESSource * source); static gboolean get_natural_size (GESVideoSource * source, gint * width, gint * height) @@ -161,10 +161,11 @@ static void ges_video_test_source_class_init (GESVideoTestSourceClass * klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); - GESVideoSourceClass *source_class = GES_VIDEO_SOURCE_CLASS (klass); + GESVideoSourceClass *vsource_class = GES_VIDEO_SOURCE_CLASS (klass); + GESSourceClass *source_class = GES_SOURCE_CLASS (klass); source_class->create_source = ges_video_test_source_create_source; - source_class->ABI.abi.get_natural_size = get_natural_size; + vsource_class->ABI.abi.get_natural_size = get_natural_size; object_class->dispose = dispose; @@ -218,7 +219,7 @@ ges_video_test_source_create_overlay (GESVideoTestSource * self) } static GstElement * -ges_video_test_source_create_source (GESTrackElement * element) +ges_video_test_source_create_source (GESSource * source) { GstCaps *caps; gint pattern; @@ -227,9 +228,10 @@ ges_video_test_source_create_source (GESTrackElement * element) const gchar *props[] = { "pattern", "background-color", "foreground-color", NULL }; GPtrArray *elements; - GESVideoTestSource *self = GES_VIDEO_TEST_SOURCE (element); + GESVideoTestSource *self = GES_VIDEO_TEST_SOURCE (source); + GESTrackElement *element = GES_TRACK_ELEMENT (source); - g_assert (!GES_TIMELINE_ELEMENT_PARENT (element)); + g_assert (!GES_TIMELINE_ELEMENT_PARENT (source)); testsrc = gst_element_factory_make ("videotestsrc", NULL); self->priv->capsfilter = gst_element_factory_make ("capsfilter", NULL); pattern = self->priv->pattern; diff --git a/ges/ges-video-uri-source.c b/ges/ges-video-uri-source.c index 4e8de057..3eef67bb 100644 --- a/ges/ges-video-uri-source.c +++ b/ges/ges-video-uri-source.c @@ -51,7 +51,7 @@ enum /* GESSource VMethod */ static GstElement * -ges_video_uri_source_create_source (GESTrackElement * element) +ges_video_uri_source_create_source (GESSource * element) { return ges_uri_source_create_source (GES_VIDEO_URI_SOURCE (element)->priv); } @@ -315,7 +315,7 @@ ges_video_uri_source_class_init (GESVideoUriSourceClass * klass) src_class->select_pad = ges_uri_source_select_pad; - video_src_class->create_source = ges_video_uri_source_create_source; + src_class->create_source = ges_video_uri_source_create_source; video_src_class->ABI.abi.needs_converters = ges_video_uri_source_needs_converters; video_src_class->ABI.abi.get_natural_size = |