diff --git a/docs/libs/ges-docs.sgml b/docs/libs/ges-docs.sgml index ef94a44000..1b9254b9fa 100644 --- a/docs/libs/ges-docs.sgml +++ b/docs/libs/ges-docs.sgml @@ -102,6 +102,7 @@ platform as well as Windows. It is released under the GNU Library General Public Assets + diff --git a/docs/libs/ges-sections.txt b/docs/libs/ges-sections.txt index 6d9ae096f5..b20453c608 100644 --- a/docs/libs/ges-sections.txt +++ b/docs/libs/ges-sections.txt @@ -991,6 +991,23 @@ GES_IS_ASSET_TIMELINE_OBJECT_CLASS GES_ASSET_TIMELINE_OBJECT_GET_CLASS +
+ges-asset-track-object +GESAssetTrackObject +GESAssetObject +ges_asset_track_object_get_type +ges_asset_track_object_get_track_type +ges_asset_track_object_set_track_type + +GESAssetTrackObjectPrivate +GES_ASSET_TRACK_OBJECT +GES_TYPE_ASSET_TRACK_OBJECT +GES_ASSET_TRACK_OBJECT_CLASS +GES_IS_ASSET_TRACK_OBJECT +GES_IS_ASSET_TRACK_OBJECT_CLASS +GES_ASSET_TRACK_OBJECT_GET_CLASS +
+
ges-asset-file-source GESAssetFileSource diff --git a/ges/Makefile.am b/ges/Makefile.am index 0aca6025d9..162a635d93 100644 --- a/ges/Makefile.am +++ b/ges/Makefile.am @@ -50,6 +50,7 @@ libges_@GST_API_VERSION@_la_SOURCES = \ ges-asset.c \ ges-asset-file-source.c \ ges-asset-timeline-object.c \ + ges-asset-track-object.c \ ges-extractable.c \ ges-project.c \ ges-base-xml-formatter.c \ @@ -101,6 +102,7 @@ libges_@GST_API_VERSION@include_HEADERS = \ ges-asset.h \ ges-asset-file-source.h \ ges-asset-timeline-object.h \ + ges-asset-track-object.h \ ges-extractable.h \ ges-project.h \ ges-base-xml-formatter.h \ diff --git a/ges/ges-asset-file-source.c b/ges/ges-asset-file-source.c index fe8610200c..baf62f7d26 100644 --- a/ges/ges-asset-file-source.c +++ b/ges/ges-asset-file-source.c @@ -30,6 +30,7 @@ #include #include "ges.h" #include "ges-internal.h" +#include "ges-asset-track-object.h" static GHashTable *parent_newparent_table = NULL; static void @@ -246,7 +247,8 @@ _create_track_file_source_asset (GESAssetFileSource * asset, priv_tckasset->uri = ges_asset_get_id (GES_ASSET (asset)); priv_tckasset->sinfo = g_object_ref (sinfo); priv_tckasset->parent_asset = asset; - priv_tckasset->type = type; + ges_asset_track_object_set_track_type (GES_ASSET_TRACK_OBJECT + (tck_filesource_asset), type); priv->asset_trackfilesources = g_list_append (priv->asset_trackfilesources, gst_object_ref (tck_filesource_asset)); @@ -470,7 +472,7 @@ ges_asset_filesource_get_stream_assets (GESAssetFileSource * self) */ G_DEFINE_TYPE (GESAssetTrackFileSource, ges_asset_track_filesource, - GES_TYPE_ASSET); + GES_TYPE_ASSET_TRACK_OBJECT); static GESExtractable * _extract (GESAsset * asset, GError ** error) @@ -536,24 +538,6 @@ ges_asset_track_filesource_get_stream_uri (GESAssetTrackFileSource * asset) return asset->priv->uri; } -/** - * ges_asset_track_filesource_get_track_type: - * @self: A #GESAssetFileSource - * - * Get the GESAssetTrackType the #GESTrackObject extracted from @self - * should get into - * - * Returns: a #GESTrackType - */ -const GESTrackType -ges_asset_track_filesource_get_track_type (GESAssetTrackFileSource * asset) -{ - g_return_val_if_fail (GES_IS_ASSET_TRACK_FILESOURCE (asset), - GES_TRACK_TYPE_UNKNOWN); - - return asset->priv->type; -} - /** * ges_asset_track_filesource_get_filesource_asset: * @self: A #GESAssetFileSource diff --git a/ges/ges-asset-file-source.h b/ges/ges-asset-file-source.h index 756106bcea..f7a3e5f5ab 100644 --- a/ges/ges-asset-file-source.h +++ b/ges/ges-asset-file-source.h @@ -26,6 +26,7 @@ #include #include #include +#include G_BEGIN_DECLS #define GES_TYPE_ASSET_FILESOURCE ges_asset_filesource_get_type() @@ -94,7 +95,7 @@ GType ges_asset_track_filesource_get_type (void); struct _GESAssetTrackFileSource { - GESAsset parent; + GESAssetTrackObject parent; /* */ GESAssetTrackFileSourcePrivate *priv; @@ -105,13 +106,12 @@ struct _GESAssetTrackFileSource struct _GESAssetTrackFileSourceClass { - GESAssetClass parent_class; + GESAssetTrackObjectClass parent_class; gpointer _ges_reserved[GES_PADDING]; }; GstDiscovererStreamInfo * ges_asset_track_filesource_get_stream_info (GESAssetTrackFileSource *asset); const gchar * ges_asset_track_filesource_get_stream_uri (GESAssetTrackFileSource *asset); -const GESTrackType ges_asset_track_filesource_get_track_type (GESAssetTrackFileSource *asset); const GESAssetFileSource *ges_asset_track_filesource_get_filesource_asset (GESAssetTrackFileSource *asset); G_END_DECLS diff --git a/ges/ges-asset-track-object.c b/ges/ges-asset-track-object.c new file mode 100644 index 0000000000..09aa834fc7 --- /dev/null +++ b/ges/ges-asset-track-object.c @@ -0,0 +1,146 @@ +/** + * Gstreamer + * + * Copyright (C) <2012> Thibault Saunier + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/** + * SECTION: ges-asset-track-object + * @short_description: A GESAsset subclass specialized in GESTrackObject extraction + */ + +#include "ges-asset-track-object.h" + +enum +{ + PROP_0, + PROP_TRACK_TYPE, + PROP_LAST +}; + +static GParamSpec *properties[PROP_LAST]; + +G_DEFINE_TYPE (GESAssetTrackObject, ges_asset_track_object, GES_TYPE_ASSET); + +struct _GESAssetTrackObjectPrivate +{ + GESTrackType type; +}; + +static void +_get_property (GObject * object, guint property_id, + GValue * value, GParamSpec * pspec) +{ + GESAssetTrackObject *asset = GES_ASSET_TRACK_OBJECT (object); + + switch (property_id) { + case PROP_TRACK_TYPE: + g_value_set_flags (value, asset->priv->type); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + } +} + +static void +_set_property (GObject * object, guint property_id, + const GValue * value, GParamSpec * pspec) +{ + GESAssetTrackObject *asset = GES_ASSET_TRACK_OBJECT (object); + + switch (property_id) { + case PROP_TRACK_TYPE: + asset->priv->type = g_value_get_flags (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + } +} + +static void +ges_asset_track_object_class_init (GESAssetTrackObjectClass * klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + g_type_class_add_private (klass, sizeof (GESAssetTrackObjectPrivate)); + + object_class->get_property = _get_property; + object_class->set_property = _set_property; + + /** + * GESTimelineObject:supported-formats: + * + * The formats supported by the object. + * + * Since: 0.10.XX + */ + properties[PROP_TRACK_TYPE] = g_param_spec_flags ("track-type", + "Track type", "The GESTrackType in which the object is", + GES_TYPE_TRACK_TYPE, GES_TRACK_TYPE_UNKNOWN, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT); + + g_object_class_install_property (object_class, PROP_TRACK_TYPE, + properties[PROP_TRACK_TYPE]); +} + +static void +ges_asset_track_object_init (GESAssetTrackObject * self) +{ + GESAssetTrackObjectPrivate *priv; + + priv = self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, + GES_TYPE_ASSET_TRACK_OBJECT, GESAssetTrackObjectPrivate); + + priv->type = GES_TRACK_TYPE_UNKNOWN; + +} + +/** + * ges_asset_track_object_set_track_type: + * @self: A #GESAssetObject + * @type: A #GESTrackType + * + * Set the #GESAssetTrackType the #GESTrackObject extracted from @self + * should get into + */ +void +ges_asset_track_object_set_track_type (GESAssetTrackObject * asset, + GESTrackType type) +{ + g_return_if_fail (GES_IS_ASSET_TRACK_OBJECT (asset)); + + asset->priv->type = type; +} + +/** + * ges_asset_track_object_get_track_type: + * @self: A #GESAssetObject + * + * Get the GESAssetTrackType the #GESTrackObject extracted from @self + * should get into + * + * Returns: a #GESTrackType + */ +const GESTrackType +ges_asset_track_object_get_track_type (GESAssetTrackObject * asset) +{ + g_return_val_if_fail (GES_IS_ASSET_TRACK_OBJECT (asset), + GES_TRACK_TYPE_UNKNOWN); + + return asset->priv->type; +} diff --git a/ges/ges-asset-track-object.h b/ges/ges-asset-track-object.h new file mode 100644 index 0000000000..c287592a27 --- /dev/null +++ b/ges/ges-asset-track-object.h @@ -0,0 +1,64 @@ +/* GStreamer Editing Services + * + * Copyright (C) 2012 Thibault Saunier + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ +#ifndef _GES_ASSET_TRACK_OBJECT_ +#define _GES_ASSET_TRACK_OBJECT_ + +#include +#include +#include +#include + +G_BEGIN_DECLS + +#define GES_TYPE_ASSET_TRACK_OBJECT ges_asset_track_object_get_type() +#define GES_ASSET_TRACK_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GES_TYPE_ASSET_TRACK_OBJECT, GESAssetTrackObject)) +#define GES_ASSET_TRACK_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GES_TYPE_ASSET_TRACK_OBJECT, GESAssetTrackObjectClass)) +#define GES_IS_ASSET_TRACK_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GES_TYPE_ASSET_TRACK_OBJECT)) +#define GES_IS_ASSET_TRACK_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GES_TYPE_ASSET_TRACK_OBJECT)) +#define GES_ASSET_TRACK_OBJECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GES_TYPE_ASSET_TRACK_OBJECT, GESAssetTrackObjectClass)) + +typedef struct _GESAssetTrackObjectPrivate GESAssetTrackObjectPrivate; + +GType ges_asset_track_object_get_type (void); + +struct _GESAssetTrackObject +{ + GESAsset parent; + + /* */ + GESAssetTrackObjectPrivate *priv; + + /* Padding for API extension */ + gpointer __ges_reserved[GES_PADDING]; +}; + +struct _GESAssetTrackObjectClass +{ + GESAssetClass parent_class; + + gpointer _ges_reserved[GES_PADDING]; +}; + +const GESTrackType ges_asset_track_object_get_track_type (GESAssetTrackObject *asset); +void ges_asset_track_object_set_track_type (GESAssetTrackObject * asset, GESTrackType type); + +G_END_DECLS +#endif /* _GES_ASSET_TRACK_OBJECT */ + diff --git a/ges/ges-timeline-file-source.c b/ges/ges-timeline-file-source.c index 156e51e2ad..ca8272ae4b 100644 --- a/ges/ges-timeline-file-source.c +++ b/ges/ges-timeline-file-source.c @@ -31,6 +31,7 @@ #include "ges-timeline-source.h" #include "ges-track-filesource.h" #include "ges-asset-file-source.h" +#include "ges-asset-track-object.h" #include "ges-extractable.h" #include "ges-track-image-source.h" #include "ges-track-audio-test-source.h" @@ -420,9 +421,9 @@ ges_timeline_filesource_create_track_objects (GESTimelineObject * obj, ges_asset_filesource_get_stream_assets (GES_ASSET_FILESOURCE (obj->asset)); for (tmp = stream_assets; tmp; tmp = tmp->next) { - GESAssetTrackFileSource *asset = GES_ASSET_TRACK_FILESOURCE (tmp->data); + GESAssetTrackObject *asset = GES_ASSET_TRACK_OBJECT (tmp->data); - if (ges_asset_track_filesource_get_track_type (asset) == type) + if (ges_asset_track_object_get_track_type (asset) == type) res = g_list_prepend (res, ges_asset_extract (GES_ASSET (asset), NULL)); } diff --git a/ges/ges-timeline.c b/ges/ges-timeline.c index 3881114dfe..ba524c6d75 100644 --- a/ges/ges-timeline.c +++ b/ges/ges-timeline.c @@ -1530,7 +1530,10 @@ add_object_to_tracks (GESTimeline * timeline, GESTimelineObject * object, track_object, &tracks); if (!tracks || tracks->len == 0) { - GST_DEBUG_OBJECT (timeline, "Got no Track to add %p into", object); + GST_DEBUG_OBJECT (timeline, "Got no Track to add %p (type %s)", + track_object, + ges_track_type_name (ges_track_object_get_track_type + (track_object))); goto next_track_object; } diff --git a/ges/ges-track-filesource.c b/ges/ges-track-filesource.c index d821728306..1cd76eabfe 100644 --- a/ges/ges-track-filesource.c +++ b/ges/ges-track-filesource.c @@ -21,7 +21,7 @@ /** * SECTION:ges-track-filesource * @short_description: outputs a single media stream from a given file - * + * * Outputs a single media stream from a given file. The stream chosen depends on * the type of the track which contains the object. */ @@ -38,11 +38,25 @@ ges_extractable_check_id (GType type, const gchar * id, GError ** error) return g_strdup (id); } +static void +extractable_set_asset (GESExtractable * self, GESAsset * asset) +{ + /* FIXME That should go into #GESTrackObject, but + * some work is needed to make sure it works properly */ + + if (ges_track_object_get_track_type (GES_TRACK_OBJECT (self)) == + GES_TRACK_TYPE_UNKNOWN) { + ges_track_object_set_track_type (GES_TRACK_OBJECT (self), + ges_asset_track_object_get_track_type (GES_ASSET_TRACK_OBJECT (asset))); + } +} + static void ges_extractable_interface_init (GESExtractableInterface * iface) { iface->asset_type = GES_TYPE_ASSET_TRACK_FILESOURCE; iface->check_id = ges_extractable_check_id; + iface->set_asset = extractable_set_asset; } G_DEFINE_TYPE_WITH_CODE (GESTrackFileSource, ges_track_filesource, diff --git a/ges/ges-types.h b/ges/ges-types.h index e27b203b92..a9ffe81915 100644 --- a/ges/ges-types.h +++ b/ges/ges-types.h @@ -146,6 +146,9 @@ typedef struct _GESAssetTimelineObjectClass GESAssetTimelineObjectClass; typedef struct _GESAssetFileSource GESAssetFileSource; typedef struct _GESAssetFileSourceClass GESAssetFileSourceClass; +typedef struct _GESAssetTrackObject GESAssetTrackObject; +typedef struct _GESAssetTrackObjectClass GESAssetTrackObjectClass; + typedef struct _GESAssetTrackFileSource GESAssetTrackFileSource; typedef struct _GESAssetTrackFileSourceClass GESAssetTrackFileSourceClass; diff --git a/ges/ges.h b/ges/ges.h index d6861f1bcd..7e20712d8e 100644 --- a/ges/ges.h +++ b/ges/ges.h @@ -47,6 +47,7 @@ #include #include #include +#include #include #include #include