Add a GESAssetTrackFileSource class and make use of it all around

This commit is contained in:
Thibault Saunier 2012-12-21 14:28:16 -03:00
parent bc0f335734
commit 6dfae640a2
9 changed files with 294 additions and 13 deletions

View file

@ -102,6 +102,7 @@ platform as well as Windows. It is released under the GNU Library General Public
<chapter> <chapter>
<title>Assets</title> <title>Assets</title>
<xi:include href="xml/ges-asset-file-source.xml"/> <xi:include href="xml/ges-asset-file-source.xml"/>
<xi:include href="xml/ges-asset-track-file-source.xml"/>
<xi:include href="xml/ges-project.xml"/> <xi:include href="xml/ges-project.xml"/>
</chapter> </chapter>

View file

@ -987,6 +987,7 @@ ges_asset_filesource_is_image
ges_asset_filesource_get_info ges_asset_filesource_get_info
ges_asset_filesource_new ges_asset_filesource_new
ges_asset_filesource_set_timeout ges_asset_filesource_set_timeout
ges_asset_filesource_get_stream_assets
<SUBSECTION Standard> <SUBSECTION Standard>
GESAssetFileSourcePrivate GESAssetFileSourcePrivate
GES_ASSET_FILESOURCE GES_ASSET_FILESOURCE
@ -997,6 +998,23 @@ GES_IS_ASSET_FILESOURCE_CLASS
GES_ASSET_FILESOURCE_GET_CLASS GES_ASSET_FILESOURCE_GET_CLASS
</SECTION> </SECTION>
<SECTION>
<FILE>ges-asset-track-file-source</FILE>
<TITLE>GESAssetTrackFileSource</TITLE>
GESAssetTrackFileSource
ges_asset_track_filesource_get_type
ges_asset_track_filesource_get_track_type
ges_asset_track_filesource_get_filesource_asset
<SUBSECTION Standard>
GESAssetTrackFileSourcePrivate
GES_ASSET_TRACK_FILESOURCE
GES_TYPE_ASSET_TRACK_FILESOURCE
GES_ASSET_TRACK_FILESOURCE_CLASS
GES_IS_ASSET_TRACK_FILESOURCE
GES_IS_ASSET_TRACK_FILESOURCE_CLASS
GES_ASSET_TRACK_FILESOURCE_GET_CLASS
</SECTION>
<SECTION> <SECTION>
<FILE>ges-project</FILE> <FILE>ges-project</FILE>
<TITLE>GESProject</TITLE> <TITLE>GESProject</TITLE>

View file

@ -20,9 +20,9 @@
*/ */
/** /**
* SECTION: ges-asset-file-source * SECTION: ges-asset-file-source
* @short_description: A #GESAsset subclass speciliazed in #GESTimelineFileSource extraction * @short_description: A #GESAsset subclass specialized in #GESTimelineFileSource extraction
* *
* The #GESAssetFileSource is a special #GESAssetFileSource that lets you handle * The #GESAssetFileSource is a special #GESAsset that lets you handle
* the media file to use inside the GStreamer Editing Services. It has APIs that * the media file to use inside the GStreamer Editing Services. It has APIs that
* let you get information about the medias. Also, the tags found in the media file are * let you get information about the medias. Also, the tags found in the media file are
* set as Metadatas of the Asser. * set as Metadatas of the Asser.
@ -62,6 +62,17 @@ struct _GESAssetFileSourcePrivate
GstDiscovererInfo *info; GstDiscovererInfo *info;
GstClockTime duration; GstClockTime duration;
gboolean is_image; gboolean is_image;
GList *asset_trackfilesources;
};
struct _GESAssetTrackFileSourcePrivate
{
GstDiscovererStreamInfo *sinfo;
GESAssetFileSource *parent_asset;
const gchar *uri;
GESTrackType type;
}; };
@ -232,6 +243,36 @@ ges_asset_filesource_init (GESAssetFileSource * self)
priv->is_image = FALSE; priv->is_image = FALSE;
} }
static void
_create_track_file_source_asset (GESAssetFileSource * asset,
GstDiscovererStreamInfo * sinfo, GESTrackType type)
{
GESAsset *tck_filesource_asset;
GESAssetTrackFileSourcePrivate *priv_tckasset;
GESAssetFileSourcePrivate *priv = asset->priv;
gchar *stream_id =
g_strdup (gst_discoverer_stream_info_get_stream_id (sinfo));
if (stream_id == NULL) {
GST_WARNING ("No stream ID found, using the pointer instead");
stream_id = g_strdup_printf ("%i", GPOINTER_TO_INT (sinfo));
}
tck_filesource_asset = ges_asset_request (GES_TYPE_TRACK_FILESOURCE,
stream_id, NULL);
g_free (stream_id);
priv_tckasset = GES_ASSET_TRACK_FILESOURCE (tck_filesource_asset)->priv;
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;
priv->asset_trackfilesources = g_list_append (priv->asset_trackfilesources,
gst_object_ref (tck_filesource_asset));
}
static void static void
ges_asset_filesource_set_info (GESAssetFileSource * self, ges_asset_filesource_set_info (GESAssetFileSource * self,
GstDiscovererInfo * info) GstDiscovererInfo * info)
@ -244,6 +285,7 @@ ges_asset_filesource_set_info (GESAssetFileSource * self,
/* Extract infos from the GstDiscovererInfo */ /* Extract infos from the GstDiscovererInfo */
stream_list = gst_discoverer_info_get_stream_list (info); stream_list = gst_discoverer_info_get_stream_list (info);
for (tmp = stream_list; tmp; tmp = tmp->next) { for (tmp = stream_list; tmp; tmp = tmp->next) {
GESTrackType type = GES_TRACK_TYPE_UNKNOWN;
GstDiscovererStreamInfo *sinf = (GstDiscovererStreamInfo *) tmp->data; GstDiscovererStreamInfo *sinf = (GstDiscovererStreamInfo *) tmp->data;
if (GST_IS_DISCOVERER_AUDIO_INFO (sinf)) { if (GST_IS_DISCOVERER_AUDIO_INFO (sinf)) {
@ -252,17 +294,21 @@ ges_asset_filesource_set_info (GESAssetFileSource * self,
else else
supportedformats |= GES_TRACK_TYPE_AUDIO; supportedformats |= GES_TRACK_TYPE_AUDIO;
type = GES_TRACK_TYPE_AUDIO;
} else if (GST_IS_DISCOVERER_VIDEO_INFO (sinf)) { } else if (GST_IS_DISCOVERER_VIDEO_INFO (sinf)) {
if (supportedformats == GES_TRACK_TYPE_UNKNOWN) if (supportedformats == GES_TRACK_TYPE_UNKNOWN)
supportedformats = GES_TRACK_TYPE_VIDEO; supportedformats = GES_TRACK_TYPE_VIDEO;
else else
supportedformats |= GES_TRACK_TYPE_VIDEO; supportedformats |= GES_TRACK_TYPE_VIDEO;
if (gst_discoverer_video_info_is_image ((GstDiscovererVideoInfo *) if (gst_discoverer_video_info_is_image ((GstDiscovererVideoInfo *)
sinf)) { sinf))
priv->is_image = TRUE; priv->is_image = TRUE;
} type = GES_TRACK_TYPE_VIDEO;
} else }
supportedformats = GES_TRACK_TYPE_UNKNOWN;
GST_DEBUG_OBJECT (self, "Creating AsserTrackFileSource for stream: %s",
gst_discoverer_stream_info_get_stream_id (sinf));
_create_track_file_source_asset (self, sinf, type);
} }
ges_meta_container_set_uint (GES_META_CONTAINER (self), ges_meta_container_set_uint (GES_META_CONTAINER (self),
GES_META_TIMELINE_OBJECT_SUPPORTED_FORMATS, supportedformats); GES_META_TIMELINE_OBJECT_SUPPORTED_FORMATS, supportedformats);
@ -437,3 +483,133 @@ ges_asset_filesource_set_timeout (GESAssetFileSourceClass * class,
g_object_set (class->discoverer, "timeout", timeout, NULL); g_object_set (class->discoverer, "timeout", timeout, NULL);
} }
/**
* ges_asset_filesource_get_stream_assets:
* @self: A #GESAssetFileSource
*
* Get the GESAssetTrackFileSource @self containes
*
* Returns: (transfer-none) (element-type GESAssetTrackFileSource): a
* #GList of #GESAssetTrackFileSource
*/
const GList *
ges_asset_filesource_get_stream_assets (GESAssetFileSource * self)
{
g_return_val_if_fail (GES_IS_ASSET_FILESOURCE (self), FALSE);
return self->priv->asset_trackfilesources;
}
/*****************************************************************
* GESAssetTrackFileSource implementation *
*****************************************************************/
/**
* SECTION: ges-asset-track-file-source
* @short_description: A #GESAsset subclass specialized in #GESTrackFileSource extraction
*
* NOTE: You should never request such a #GESAsset as they will be created automatically
* by #GESAssetFileSource-s.
*/
G_DEFINE_TYPE (GESAssetTrackFileSource, ges_asset_track_filesource,
GES_TYPE_ASSET);
static GESExtractable *
_extract (GESAsset * asset, GError ** error)
{
GESTrackObject *tckobj;
GESAssetTrackFileSourcePrivate *priv =
GES_ASSET_TRACK_FILESOURCE (asset)->priv;
if (GST_IS_DISCOVERER_STREAM_INFO (priv->sinfo) == FALSE) {
GST_WARNING_OBJECT (asset, "Can not extract as no strean info set");
return NULL;
}
if (priv->uri == NULL) {
GST_WARNING_OBJECT (asset, "Can not extract as no uri set");
return NULL;
}
tckobj = GES_TRACK_OBJECT (ges_track_filesource_new (g_strdup (priv->uri)));
ges_track_object_set_track_type (tckobj, priv->type);
return GES_EXTRACTABLE (tckobj);
}
static void
ges_asset_track_filesource_class_init (GESAssetTrackFileSourceClass * klass)
{
g_type_class_add_private (klass, sizeof (GESAssetTrackFileSourcePrivate));
GES_ASSET_CLASS (klass)->extract = _extract;
}
static void
ges_asset_track_filesource_init (GESAssetTrackFileSource * self)
{
GESAssetTrackFileSourcePrivate *priv;
priv = self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
GES_TYPE_ASSET_TRACK_FILESOURCE, GESAssetTrackFileSourcePrivate);
priv->sinfo = NULL;
priv->parent_asset = NULL;
priv->uri = NULL;
priv->type = GES_TRACK_TYPE_UNKNOWN;
}
GstDiscovererStreamInfo *
ges_asset_track_filesource_get_stream_info (GESAssetTrackFileSource * asset)
{
g_return_val_if_fail (GES_IS_ASSET_TRACK_FILESOURCE (asset), NULL);
return asset->priv->sinfo;
}
const gchar *
ges_asset_track_filesource_get_stream_uri (GESAssetTrackFileSource * asset)
{
g_return_val_if_fail (GES_IS_ASSET_TRACK_FILESOURCE (asset), NULL);
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
*
* Get the #GESAssetFileSource @self is contained in
*
* Returns: a #GESAssetFileSource
*/
const GESAssetFileSource *
ges_asset_track_filesource_get_filesource_asset (GESAssetTrackFileSource *
asset)
{
g_return_val_if_fail (GES_IS_ASSET_TRACK_FILESOURCE (asset), NULL);
return asset->priv->parent_asset;
}

View file

@ -74,6 +74,45 @@ void ges_asset_filesource_new (const gchar *uri,
gpointer user_data); gpointer user_data);
void ges_asset_filesource_set_timeout (GESAssetFileSourceClass *class, void ges_asset_filesource_set_timeout (GESAssetFileSourceClass *class,
GstClockTime timeout); GstClockTime timeout);
const GList * ges_asset_filesource_get_stream_assets (GESAssetFileSource *self);
#define GES_TYPE_ASSET_TRACK_FILESOURCE ges_asset_track_filesource_get_type()
#define GES_ASSET_TRACK_FILESOURCE(obj) \
(G_TYPE_CHECK_INSTANCE_CAST ((obj), GES_TYPE_ASSET_TRACK_FILESOURCE, GESAssetTrackFileSource))
#define GES_ASSET_TRACK_FILESOURCE_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST ((klass), GES_TYPE_ASSET_TRACK_FILESOURCE, GESAssetTrackFileSourceClass))
#define GES_IS_ASSET_TRACK_FILESOURCE(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE ((obj), GES_TYPE_ASSET_TRACK_FILESOURCE))
#define GES_IS_ASSET_TRACK_FILESOURCE_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE ((klass), GES_TYPE_ASSET_TRACK_FILESOURCE))
#define GES_ASSET_TRACK_FILESOURCE_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS ((obj), GES_TYPE_ASSET_TRACK_FILESOURCE, GESAssetTrackFileSourceClass))
typedef struct _GESAssetTrackFileSourcePrivate GESAssetTrackFileSourcePrivate;
GType ges_asset_track_filesource_get_type (void);
struct _GESAssetTrackFileSource
{
GESAsset parent;
/* <private> */
GESAssetTrackFileSourcePrivate *priv;
/* Padding for API extension */
gpointer __ges_reserved[GES_PADDING];
};
struct _GESAssetTrackFileSourceClass
{
GESAssetClass 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 G_END_DECLS
#endif /* _GES_ASSET_FILESOURCE */ #endif /* _GES_ASSET_FILESOURCE */

View file

@ -62,11 +62,13 @@ enum
}; };
static GList *ges_timeline_filesource_create_track_objects (GESTimelineObject *
obj, GESTrackType type);
static GESTrackObject static GESTrackObject
* ges_timeline_filesource_create_track_object (GESTimelineObject * obj, * ges_timeline_filesource_create_track_object (GESTimelineObject * obj,
GESTrackType type); GESTrackType type);
void void ges_timeline_filesource_set_uri (GESTimelineFileSource * self,
ges_timeline_filesource_set_uri (GESTimelineFileSource * self, gchar * uri); gchar * uri);
static void static void
filesource_set_max_duration (GESTimelineObject * object, guint64 maxduration); filesource_set_max_duration (GESTimelineObject * object, guint64 maxduration);
@ -182,6 +184,8 @@ ges_timeline_filesource_class_init (GESTimelineFileSourceClass * klass)
GES_TYPE_TRACK_TYPE, GES_TRACK_TYPE_UNKNOWN, GES_TYPE_TRACK_TYPE, GES_TRACK_TYPE_UNKNOWN,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
timobj_class->create_track_objects =
ges_timeline_filesource_create_track_objects;
timobj_class->create_track_object = timobj_class->create_track_object =
ges_timeline_filesource_create_track_object; ges_timeline_filesource_create_track_object;
timobj_class->set_max_duration = filesource_set_max_duration; timobj_class->set_max_duration = filesource_set_max_duration;
@ -399,6 +403,28 @@ ges_timeline_filesource_get_uri (GESTimelineFileSource * self)
return self->priv->uri; return self->priv->uri;
} }
static GList *
ges_timeline_filesource_create_track_objects (GESTimelineObject * obj,
GESTrackType type)
{
GList *res = NULL;
const GList *tmp, *stream_assets;
g_return_val_if_fail (obj->asset, NULL);
stream_assets =
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);
if (ges_asset_track_filesource_get_track_type (asset) == type)
res = g_list_prepend (res, ges_asset_extract (GES_ASSET (asset), NULL));
}
return res;
}
static GESTrackObject * static GESTrackObject *
ges_timeline_filesource_create_track_object (GESTimelineObject * obj, ges_timeline_filesource_create_track_object (GESTimelineObject * obj,
GESTrackType type) GESTrackType type)

View file

@ -483,7 +483,8 @@ ges_timeline_object_create_track_object (GESTimelineObject * object,
class = GES_TIMELINE_OBJECT_GET_CLASS (object); class = GES_TIMELINE_OBJECT_GET_CLASS (object);
if (G_UNLIKELY (class->create_track_object == NULL)) { if (G_UNLIKELY (class->create_track_object == NULL)) {
GST_ERROR ("No 'create_track_object' implementation available"); GST_ERROR ("No 'create_track_object' implementation available fo type %s",
G_OBJECT_TYPE_NAME (object));
return NULL; return NULL;
} }
@ -497,9 +498,7 @@ ges_timeline_object_create_track_object (GESTimelineObject * object,
* @object: The origin #GESTimelineObject * @object: The origin #GESTimelineObject
* @type: The #GESTrackType to create each #GESTrackObject for. * @type: The #GESTrackType to create each #GESTrackObject for.
* *
* Creates all #GESTrackObjects supported by this object provided track. * Creates all #GESTrackObjects supported by this object for the track type.
* The track is responsible for calling #ges_timeline_release_track_object
* on these objects when it is finished with them.
* *
* Returns: (element-type GESTrackObject) (transfer-full): A #GList of * Returns: (element-type GESTrackObject) (transfer-full): A #GList of
* newly created #GESTrackObject-s * newly created #GESTrackObject-s

View file

@ -165,6 +165,7 @@ struct _GESTimelineObject
guint64 fullduration; /* Full usable duration of the object (-1: no duration) */ guint64 fullduration; /* Full usable duration of the object (-1: no duration) */
/*< protected >*/
GESAsset *asset; GESAsset *asset;
/*< private >*/ /*< private >*/

View file

@ -29,8 +29,26 @@
#include "ges-internal.h" #include "ges-internal.h"
#include "ges-track-object.h" #include "ges-track-object.h"
#include "ges-track-filesource.h" #include "ges-track-filesource.h"
#include "ges-asset-file-source.h"
#include "ges-extractable.h"
G_DEFINE_TYPE (GESTrackFileSource, ges_track_filesource, GES_TYPE_TRACK_SOURCE); static gchar *
ges_extractable_check_id (GType type, const gchar * id, GError ** error)
{
return g_strdup (id);
}
static void
ges_extractable_interface_init (GESExtractableInterface * iface)
{
iface->asset_type = GES_TYPE_ASSET_TRACK_FILESOURCE;
iface->check_id = ges_extractable_check_id;
}
G_DEFINE_TYPE_WITH_CODE (GESTrackFileSource, ges_track_filesource,
GES_TYPE_TRACK_SOURCE,
G_IMPLEMENT_INTERFACE (GES_TYPE_EXTRACTABLE,
ges_extractable_interface_init));
struct _GESTrackFileSourcePrivate struct _GESTrackFileSourcePrivate
{ {

View file

@ -143,6 +143,9 @@ typedef struct _GESAssetClass GESAssetClass;
typedef struct _GESAssetFileSource GESAssetFileSource; typedef struct _GESAssetFileSource GESAssetFileSource;
typedef struct _GESAssetFileSourceClass GESAssetFileSourceClass; typedef struct _GESAssetFileSourceClass GESAssetFileSourceClass;
typedef struct _GESAssetTrackFileSource GESAssetTrackFileSource;
typedef struct _GESAssetTrackFileSourceClass GESAssetTrackFileSourceClass;
typedef struct _GESProject GESProject; typedef struct _GESProject GESProject;
typedef struct _GESProjectClass GESProjectClass; typedef struct _GESProjectClass GESProjectClass;