static GESTrackElement * ges_uri_clip_create_track_element (GESClip * clip, GESTrackType type) { GESUriClipPrivate *priv = GES_URI_CLIP (clip)->priv; GESTrackElement *res; if (priv->is_image) { if (type != GES_TRACK_TYPE_VIDEO) { GST_DEBUG ("Object is still image, not adding any audio source"); return NULL; } else { GST_DEBUG ("Creating a GESImageSource"); res = (GESTrackElement *) ges_image_source_new (priv->uri); } } else { GST_DEBUG ("Creating a GESUriSource"); /* FIXME : Implement properly ! */ res = (GESTrackElement *) ges_track_filesource_new (priv->uri); /* If mute and track is audio, deactivate the track element */ if (type == GES_TRACK_TYPE_AUDIO && priv->mute) ges_track_element_set_active (res, FALSE); } if (res) ges_track_element_set_track_type (res, type); return res; }
static void extractable_set_asset (GESExtractable * self, GESAsset * asset) { GESUriClip *uriclip = GES_URI_CLIP (self); GESUriClipAsset *filesource_asset = GES_URI_CLIP_ASSET (asset); GESClip *clip = GES_CLIP (self); if (GST_CLOCK_TIME_IS_VALID (GES_TIMELINE_ELEMENT_DURATION (clip)) == FALSE) _set_duration0 (GES_TIMELINE_ELEMENT (uriclip), ges_uri_clip_asset_get_duration (filesource_asset)); ges_timeline_element_set_max_duration (GES_TIMELINE_ELEMENT (uriclip), ges_uri_clip_asset_get_duration (filesource_asset)); ges_uri_clip_set_is_image (uriclip, ges_uri_clip_asset_is_image (filesource_asset)); if (ges_clip_get_supported_formats (clip) == GES_TRACK_TYPE_UNKNOWN) { ges_clip_set_supported_formats (clip, ges_clip_asset_get_supported_formats (GES_CLIP_ASSET (filesource_asset))); } GES_TIMELINE_ELEMENT (uriclip)->asset = asset; }
static void ges_uri_clip_finalize (GObject * object) { GESUriClipPrivate *priv = GES_URI_CLIP (object)->priv; if (priv->uri) g_free (priv->uri); G_OBJECT_CLASS (parent_class)->finalize (object); }
/** * ges_uri_clip_new: * @uri: the URI the source should control * * Creates a new #GESUriClip for the provided @uri. * * Returns: (transfer floating) (nullable): The newly created #GESUriClip, or * %NULL if there was an error. */ GESUriClip * ges_uri_clip_new (const gchar * uri) { GESAsset *asset = GES_ASSET (ges_uri_clip_asset_request_sync (uri, NULL)); GESUriClip *res = NULL; if (asset) { res = GES_URI_CLIP (ges_asset_extract (asset, NULL)); gst_object_unref (asset); } else GST_ERROR ("Could not create asset for uri: %s", uri); return res; }
static void asset_created_cb (GObject * source, GAsyncResult * res, gpointer udata) { GList *tracks, *tmp; GESAsset *asset; GESLayer *layer; GESUriClip *tlfs; GError *error = NULL; asset = ges_asset_request_finish (res, &error); ASSERT_OBJECT_REFCOUNT (asset, "1 for us + for the cache + 1 taken " "by g_simple_async_result_complete_in_idle", 3); fail_unless (error == NULL); fail_if (asset == NULL); fail_if (g_strcmp0 (ges_asset_get_id (asset), av_uri)); layer = GES_LAYER (g_async_result_get_user_data (res)); tlfs = GES_URI_CLIP (ges_layer_add_asset (layer, asset, 0, 0, GST_CLOCK_TIME_NONE, GES_TRACK_TYPE_UNKNOWN)); fail_unless (GES_IS_URI_CLIP (tlfs)); fail_if (g_strcmp0 (ges_uri_clip_get_uri (tlfs), av_uri)); assert_equals_uint64 (_DURATION (tlfs), GST_SECOND); fail_unless (ges_clip_get_supported_formats (GES_CLIP (tlfs)) & GES_TRACK_TYPE_VIDEO); fail_unless (ges_clip_get_supported_formats (GES_CLIP (tlfs)) & GES_TRACK_TYPE_AUDIO); tracks = ges_timeline_get_tracks (ges_layer_get_timeline (layer)); for (tmp = tracks; tmp; tmp = tmp->next) { GList *trackelements = ges_track_get_elements (GES_TRACK (tmp->data)); assert_equals_int (g_list_length (trackelements), 1); fail_unless (GES_IS_VIDEO_URI_SOURCE (trackelements->data) || GES_IS_AUDIO_URI_SOURCE (trackelements->data)); g_list_free_full (trackelements, gst_object_unref); } g_list_free_full (tracks, gst_object_unref); gst_object_unref (asset); g_main_loop_quit (mainloop); }
static void ges_uri_clip_get_property (GObject * object, guint property_id, GValue * value, GParamSpec * pspec) { GESUriClipPrivate *priv = GES_URI_CLIP (object)->priv; switch (property_id) { case PROP_URI: g_value_set_string (value, priv->uri); break; case PROP_MUTE: g_value_set_boolean (value, priv->mute); break; case PROP_IS_IMAGE: g_value_set_boolean (value, priv->is_image); break; case PROP_SUPPORTED_FORMATS: g_value_set_flags (value, ges_clip_get_supported_formats (GES_CLIP (object))); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } }
static void ges_uri_clip_set_property (GObject * object, guint property_id, const GValue * value, GParamSpec * pspec) { GESUriClip *uriclip = GES_URI_CLIP (object); switch (property_id) { case PROP_URI: ges_uri_clip_set_uri (uriclip, g_value_dup_string (value)); break; case PROP_MUTE: ges_uri_clip_set_mute (uriclip, g_value_get_boolean (value)); break; case PROP_IS_IMAGE: ges_uri_clip_set_is_image (uriclip, g_value_get_boolean (value)); break; case PROP_SUPPORTED_FORMATS: ges_clip_set_supported_formats (GES_CLIP (uriclip), g_value_get_flags (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } }
static gboolean extractable_set_asset (GESExtractable * self, GESAsset * asset) { gboolean res = TRUE; GESUriClip *uriclip = GES_URI_CLIP (self); GESUriClipAsset *uri_clip_asset; GESClip *clip = GES_CLIP (self); GESLayer *layer = ges_clip_get_layer (clip); GList *tmp; GESTimelineElement *audio_source = NULL, *video_source = NULL; g_return_val_if_fail (GES_IS_URI_CLIP_ASSET (asset), FALSE); uri_clip_asset = GES_URI_CLIP_ASSET (asset); if (GST_CLOCK_TIME_IS_VALID (GES_TIMELINE_ELEMENT_DURATION (clip)) == FALSE) _set_duration0 (GES_TIMELINE_ELEMENT (uriclip), ges_uri_clip_asset_get_duration (uri_clip_asset)); ges_timeline_element_set_max_duration (GES_TIMELINE_ELEMENT (uriclip), ges_uri_clip_asset_get_duration (uri_clip_asset)); ges_uri_clip_set_is_image (uriclip, ges_uri_clip_asset_is_image (uri_clip_asset)); if (ges_clip_get_supported_formats (clip) == GES_TRACK_TYPE_UNKNOWN) { ges_clip_set_supported_formats (clip, ges_clip_asset_get_supported_formats (GES_CLIP_ASSET (uri_clip_asset))); } GES_TIMELINE_ELEMENT (uriclip)->asset = asset; if (layer) { GList *children = ges_container_get_children (GES_CONTAINER (self), TRUE); for (tmp = children; tmp; tmp = tmp->next) { if (GES_IS_SOURCE (tmp->data)) { GESTrack *track = ges_track_element_get_track (tmp->data); if (track->type == GES_TRACK_TYPE_AUDIO) audio_source = gst_object_ref (tmp->data); else if (track->type == GES_TRACK_TYPE_VIDEO) video_source = gst_object_ref (tmp->data); ges_track_remove_element (track, tmp->data); ges_container_remove (GES_CONTAINER (self), tmp->data); } } g_list_free_full (children, g_object_unref); gst_object_ref (clip); ges_layer_remove_clip (layer, clip); res = ges_layer_add_clip (layer, clip); for (tmp = GES_CONTAINER_CHILDREN (self); tmp; tmp = tmp->next) { if (GES_IS_SOURCE (tmp->data)) { GESTrack *track = ges_track_element_get_track (tmp->data); if (track->type == GES_TRACK_TYPE_AUDIO && audio_source) ges_track_element_copy_properties (audio_source, tmp->data); else if (track->type == GES_TRACK_TYPE_VIDEO && video_source) ges_track_element_copy_properties (video_source, tmp->data); } } g_clear_object (&audio_source); g_clear_object (&video_source); gst_object_unref (clip); gst_object_unref (layer); } if (res) { g_free (uriclip->priv->uri); uriclip->priv->uri = g_strdup (ges_asset_get_id (asset)); } return res; }
static gchar * extractable_get_id (GESExtractable * self) { return g_strdup (GES_URI_CLIP (self)->priv->uri); }