gstreamer/tests/check/ges/uriclip.c
Thibault Saunier 855270566c uri-asset: Implement a ges_uri_clip_asset_request_sync method
This way we let the possibility to the user to actually do it, but we avoid him to do it
without knowing it is absolutely not recommanded to.

API:
	+ ges_uri_clip_asset_request_sync
2013-03-19 20:06:30 -03:00

277 lines
8.5 KiB
C

/* GStreamer Editing Services
* Copyright (C) 2009 Edward Hervey <bilboed@bilboed.com>
*
* 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., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#include "test-utils.h"
#include <ges/ges.h>
#include <gst/check/gstcheck.h>
/* This test uri will eventually have to be fixed */
#define TEST_URI "http://nowhere/blahblahblah"
static gchar *av_uri;
GMainLoop *mainloop;
static void
asset_created_cb (GObject * source, GAsyncResult * res, gpointer udata)
{
GList *tracks, *tmp;
GESAsset *asset;
GESTimelineLayer *layer;
GESUriClip *tlfs;
GError *error = NULL;
asset = ges_asset_request_finish (res, &error);
fail_unless (error == NULL);
fail_if (asset == NULL);
fail_if (g_strcmp0 (ges_asset_get_id (asset), av_uri));
layer = GES_TIMELINE_LAYER (g_async_result_get_user_data (res));
tlfs = GES_URI_CLIP (ges_timeline_layer_add_asset (layer,
asset, 0, 0, GST_CLOCK_TIME_NONE, 1, 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_timeline_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_TRACK_FILESOURCE (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);
}
GST_START_TEST (test_filesource_basic)
{
GESTimeline *timeline;
GESTimelineLayer *layer;
fail_unless (ges_init ());
mainloop = g_main_loop_new (NULL, FALSE);
timeline = ges_timeline_new_audio_video ();
fail_unless (timeline != NULL);
layer = ges_timeline_layer_new ();
fail_unless (layer != NULL);
fail_unless (ges_timeline_add_layer (timeline, layer));
ges_asset_request_async (GES_TYPE_URI_CLIP,
av_uri, NULL, asset_created_cb, layer);
g_main_loop_run (mainloop);
g_main_loop_unref (mainloop);
gst_object_unref (timeline);
}
GST_END_TEST;
#define gnl_object_check(gnlobj, start, duration, mstart, mduration, priority, active) { \
guint64 pstart, pdur, pmstart, pmdur, pprio, pact; \
g_object_get (gnlobj, "start", &pstart, "duration", &pdur, \
"media-start", &pmstart, "media-duration", &pmdur, \
"priority", &pprio, "active", &pact, \
NULL); \
assert_equals_uint64 (pstart, start); \
assert_equals_uint64 (pdur, duration); \
assert_equals_uint64 (pmstart, mstart); \
assert_equals_uint64 (pmdur, mduration); \
assert_equals_int (pprio, priority); \
assert_equals_int (pact, active); \
}
static void
create_asset (GESUriClipAsset ** asset)
{
*asset = ges_uri_clip_asset_request_sync (av_uri, NULL);
g_main_loop_quit (mainloop);
}
GST_START_TEST (test_filesource_properties)
{
GESClip *clip;
GESTrack *track;
GESTimeline *timeline;
GESUriClipAsset *asset;
GESTimelineLayer *layer;
GESTrackElement *trackelement;
ges_init ();
track = ges_track_new (GES_TRACK_TYPE_AUDIO, GST_CAPS_ANY);
fail_unless (track != NULL);
layer = ges_timeline_layer_new ();
fail_unless (layer != NULL);
timeline = ges_timeline_new ();
fail_unless (GES_IS_TIMELINE (timeline));
fail_unless (ges_timeline_add_layer (timeline, layer));
fail_unless (ges_timeline_add_track (timeline, track));
ASSERT_OBJECT_REFCOUNT (timeline, "timeline", 1);
mainloop = g_main_loop_new (NULL, FALSE);
g_timeout_add (1, (GSourceFunc) create_asset, &asset);
g_main_loop_run (mainloop);
/* Right away request the asset synchronously */
fail_unless (GES_IS_ASSET (asset));
clip = ges_timeline_layer_add_asset (layer, GES_ASSET (asset),
42, 12, 51, 1, GES_TRACK_TYPE_AUDIO);
assert_is_type (clip, GES_TYPE_URI_CLIP);
assert_equals_uint64 (_START (clip), 42);
assert_equals_uint64 (_DURATION (clip), 51);
assert_equals_uint64 (_INPOINT (clip), 12);
assert_equals_int (g_list_length (GES_CONTAINER_CHILDREN (clip)), 1);
trackelement = GES_CONTAINER_CHILDREN (clip)->data;
fail_unless (trackelement != NULL);
/* Check that trackelement has the same properties */
assert_equals_uint64 (_START (trackelement), 42);
assert_equals_uint64 (_DURATION (trackelement), 51);
assert_equals_uint64 (_INPOINT (trackelement), 12);
/* And let's also check that it propagated correctly to GNonLin */
gnl_object_check (ges_track_element_get_gnlobject (trackelement), 42, 51, 12,
51, 0, TRUE);
/* Change more properties, see if they propagate */
g_object_set (clip, "start", (guint64) 420, "duration", (guint64) 510,
"in-point", (guint64) 120, NULL);
assert_equals_uint64 (_START (clip), 420);
assert_equals_uint64 (_DURATION (clip), 510);
assert_equals_uint64 (_INPOINT (clip), 120);
assert_equals_uint64 (_START (trackelement), 420);
assert_equals_uint64 (_DURATION (trackelement), 510);
assert_equals_uint64 (_INPOINT (trackelement), 120);
/* And let's also check that it propagated correctly to GNonLin */
gnl_object_check (ges_track_element_get_gnlobject (trackelement), 420, 510,
120, 510, 0, TRUE);
/* Test mute support */
g_object_set (clip, "mute", TRUE, NULL);
gnl_object_check (ges_track_element_get_gnlobject (trackelement), 420, 510,
120, 510, 0, FALSE);
g_object_set (clip, "mute", FALSE, NULL);
gnl_object_check (ges_track_element_get_gnlobject (trackelement), 420, 510,
120, 510, 0, TRUE);
ges_container_remove (GES_CONTAINER (clip),
GES_TIMELINE_ELEMENT (trackelement));
g_object_unref (timeline);
}
GST_END_TEST;
GST_START_TEST (test_filesource_images)
{
GESTrackElement *track_element;
GESClip *clip;
GESUriClip *uriclip;
GESTrack *a, *v;
ges_init ();
uriclip = ges_uri_clip_new ((gchar *) TEST_URI);
g_object_set (G_OBJECT (uriclip), "supported-formats",
(GESTrackType) GES_TRACK_TYPE_AUDIO | GES_TRACK_TYPE_VIDEO, NULL);
clip = GES_CLIP (uriclip);
a = ges_track_audio_raw_new ();
v = ges_track_video_raw_new ();
/* set the is_image property to true then create a video track element. */
g_object_set (G_OBJECT (uriclip), "is-image", TRUE, NULL);
/* the returned track element should be an image source */
track_element = ges_clip_create_track_element (clip, v->type);
ges_container_add (GES_CONTAINER (clip),
GES_TIMELINE_ELEMENT (track_element));
fail_unless (GES_IS_IMAGE_SOURCE (track_element));
/* The track holds a reference to the clip
* and the timelinobject holds a reference to the clip */
ASSERT_OBJECT_REFCOUNT (track_element, "Video Track Element", 2);
ges_track_remove_element (v, track_element);
ges_container_remove (GES_CONTAINER (clip),
GES_TIMELINE_ELEMENT (track_element));
/* the clip should not create any TrackElement in the audio track */
track_element = ges_clip_create_track_element (clip, a->type);
fail_unless (track_element == NULL);
g_object_unref (a);
g_object_unref (v);
g_object_unref (clip);
}
GST_END_TEST;
static Suite *
ges_suite (void)
{
Suite *s = suite_create ("ges-filesource");
TCase *tc_chain = tcase_create ("filesource");
suite_add_tcase (s, tc_chain);
tcase_add_test (tc_chain, test_filesource_basic);
tcase_add_test (tc_chain, test_filesource_images);
tcase_add_test (tc_chain, test_filesource_properties);
return s;
}
int
main (int argc, char **argv)
{
int nf;
Suite *s = ges_suite ();
SRunner *sr = srunner_create (s);
gst_check_init (&argc, &argv);
av_uri = ges_test_get_audio_video_uri ();
srunner_run_all (sr, CK_NORMAL);
nf = srunner_ntests_failed (sr);
srunner_free (sr);
g_free (av_uri);
return nf;
}