mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 20:21:24 +00:00
ges-launch: Properly handle project loading
So we start the pipeline only when the project is done loading, and we save it when it is loaded, taking into account possible media URI updates.
This commit is contained in:
parent
46c65aaaaf
commit
fa742de968
1 changed files with 49 additions and 7 deletions
|
@ -35,6 +35,7 @@
|
||||||
static guint repeat = 0;
|
static guint repeat = 0;
|
||||||
static GESPipeline *pipeline = NULL;
|
static GESPipeline *pipeline = NULL;
|
||||||
static gboolean seenerrors = FALSE;
|
static gboolean seenerrors = FALSE;
|
||||||
|
static gchar *save_path = NULL;
|
||||||
static gchar **new_paths = NULL;
|
static gchar **new_paths = NULL;
|
||||||
static GMainLoop *mainloop;
|
static GMainLoop *mainloop;
|
||||||
static GHashTable *tried_uris;
|
static GHashTable *tried_uris;
|
||||||
|
@ -130,6 +131,41 @@ error_loading_asset_cb (GESProject * project, GError * error,
|
||||||
g_main_loop_quit (mainloop);
|
g_main_loop_quit (mainloop);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
project_loaded_cb (GESProject * project, GESTimeline * timeline)
|
||||||
|
{
|
||||||
|
GST_INFO ("Project loaded, playing it");
|
||||||
|
|
||||||
|
if (save_path) {
|
||||||
|
gchar *uri;
|
||||||
|
GError *error = NULL;
|
||||||
|
|
||||||
|
if (g_strcmp0 (save_path, "+r") == 0) {
|
||||||
|
uri = ges_project_get_uri (project);
|
||||||
|
} else if (!(uri = ensure_uri (save_path))) {
|
||||||
|
g_error ("couldn't create uri for '%s", save_path);
|
||||||
|
|
||||||
|
seenerrors = TRUE;
|
||||||
|
g_main_loop_quit (mainloop);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_print ("\nSaving project to %s\n", uri);
|
||||||
|
ges_project_save (project, timeline, uri, NULL, TRUE, &error);
|
||||||
|
g_free (uri);
|
||||||
|
|
||||||
|
g_assert_no_error (error);
|
||||||
|
if (error) {
|
||||||
|
seenerrors = TRUE;
|
||||||
|
g_main_loop_quit (mainloop);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gst_element_set_state (GST_ELEMENT (pipeline),
|
||||||
|
GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE) {
|
||||||
|
g_error ("Failed to start the pipeline\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
check_time (char *time)
|
check_time (char *time)
|
||||||
{
|
{
|
||||||
|
@ -172,6 +208,10 @@ create_timeline (int nbargs, gchar ** argv, const gchar * proj_uri)
|
||||||
g_signal_connect (project, "error-loading-asset",
|
g_signal_connect (project, "error-loading-asset",
|
||||||
G_CALLBACK (error_loading_asset_cb), NULL);
|
G_CALLBACK (error_loading_asset_cb), NULL);
|
||||||
|
|
||||||
|
if (proj_uri != NULL) {
|
||||||
|
g_signal_connect (project, "loaded", G_CALLBACK (project_loaded_cb), NULL);
|
||||||
|
}
|
||||||
|
|
||||||
timeline = GES_TIMELINE (ges_asset_extract (GES_ASSET (project), NULL));
|
timeline = GES_TIMELINE (ges_asset_extract (GES_ASSET (project), NULL));
|
||||||
|
|
||||||
if (proj_uri)
|
if (proj_uri)
|
||||||
|
@ -303,7 +343,7 @@ build_failure:
|
||||||
|
|
||||||
static GESPipeline *
|
static GESPipeline *
|
||||||
create_pipeline (GESTimeline ** ret_timeline, gchar * load_path,
|
create_pipeline (GESTimeline ** ret_timeline, gchar * load_path,
|
||||||
gchar * save_path, int argc, char **argv)
|
int argc, char **argv)
|
||||||
{
|
{
|
||||||
gchar *uri = NULL;
|
gchar *uri = NULL;
|
||||||
GESPipeline *pipeline = NULL;
|
GESPipeline *pipeline = NULL;
|
||||||
|
@ -328,7 +368,7 @@ create_pipeline (GESTimeline ** ret_timeline, gchar * load_path,
|
||||||
|
|
||||||
/* save project if path is given. we do this now in case GES crashes or
|
/* save project if path is given. we do this now in case GES crashes or
|
||||||
* hangs during playback. */
|
* hangs during playback. */
|
||||||
if (save_path) {
|
if (save_path && !load_path) {
|
||||||
gchar *uri;
|
gchar *uri;
|
||||||
if (!(uri = ensure_uri (save_path))) {
|
if (!(uri = ensure_uri (save_path))) {
|
||||||
g_error ("couldn't create uri for '%s", save_path);
|
g_error ("couldn't create uri for '%s", save_path);
|
||||||
|
@ -465,6 +505,8 @@ _print_position (void)
|
||||||
&duration);
|
&duration);
|
||||||
g_print ("<Position: %" GST_TIME_FORMAT " / %" GST_TIME_FORMAT "/>\r",
|
g_print ("<Position: %" GST_TIME_FORMAT " / %" GST_TIME_FORMAT "/>\r",
|
||||||
GST_TIME_ARGS (position), GST_TIME_ARGS (duration));
|
GST_TIME_ARGS (position), GST_TIME_ARGS (duration));
|
||||||
|
GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS (GST_BIN (pipeline),
|
||||||
|
GST_DEBUG_GRAPH_SHOW_ALL, "ges-launch-position");
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -598,6 +640,7 @@ _parse_encoding_profile (const gchar * format)
|
||||||
int
|
int
|
||||||
main (int argc, gchar ** argv)
|
main (int argc, gchar ** argv)
|
||||||
{
|
{
|
||||||
|
gint validate_res;
|
||||||
GError *err = NULL;
|
GError *err = NULL;
|
||||||
gchar *outputuri = NULL;
|
gchar *outputuri = NULL;
|
||||||
const gchar *format = NULL;
|
const gchar *format = NULL;
|
||||||
|
@ -607,7 +650,6 @@ main (int argc, gchar ** argv)
|
||||||
static gboolean list_patterns = FALSE;
|
static gboolean list_patterns = FALSE;
|
||||||
static gdouble thumbinterval = 0;
|
static gdouble thumbinterval = 0;
|
||||||
static gboolean verbose = FALSE;
|
static gboolean verbose = FALSE;
|
||||||
gchar *save_path = NULL;
|
|
||||||
gchar *load_path = NULL;
|
gchar *load_path = NULL;
|
||||||
GOptionEntry options[] = {
|
GOptionEntry options[] = {
|
||||||
{"thumbnail", 'm', 0.0, G_OPTION_ARG_DOUBLE, &thumbinterval,
|
{"thumbnail", 'm', 0.0, G_OPTION_ARG_DOUBLE, &thumbinterval,
|
||||||
|
@ -680,6 +722,7 @@ main (int argc, gchar ** argv)
|
||||||
/* Initialize the GStreamer Editing Services */
|
/* Initialize the GStreamer Editing Services */
|
||||||
if (!ges_init ()) {
|
if (!ges_init ()) {
|
||||||
g_printerr ("Error initializing GES\n");
|
g_printerr ("Error initializing GES\n");
|
||||||
|
|
||||||
exit (1);
|
exit (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -703,8 +746,7 @@ main (int argc, gchar ** argv)
|
||||||
g_option_context_free (ctx);
|
g_option_context_free (ctx);
|
||||||
|
|
||||||
/* Create the pipeline */
|
/* Create the pipeline */
|
||||||
pipeline =
|
pipeline = create_pipeline (&timeline, load_path, argc - 1, argv + 1);
|
||||||
create_pipeline (&timeline, load_path, save_path, argc - 1, argv + 1);
|
|
||||||
if (!pipeline)
|
if (!pipeline)
|
||||||
exit (1);
|
exit (1);
|
||||||
|
|
||||||
|
@ -763,9 +805,9 @@ main (int argc, gchar ** argv)
|
||||||
gst_bus_add_signal_watch (bus);
|
gst_bus_add_signal_watch (bus);
|
||||||
g_signal_connect (bus, "message", G_CALLBACK (bus_message_cb), mainloop);
|
g_signal_connect (bus, "message", G_CALLBACK (bus_message_cb), mainloop);
|
||||||
|
|
||||||
if (gst_element_set_state (GST_ELEMENT (pipeline),
|
if (load_path == NULL && gst_element_set_state (GST_ELEMENT (pipeline),
|
||||||
GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE) {
|
GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE) {
|
||||||
g_error ("Failed to start the encoding\n");
|
g_error ("Failed to start the pipeline\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
g_timeout_add (100, (GSourceFunc) _print_position, NULL);
|
g_timeout_add (100, (GSourceFunc) _print_position, NULL);
|
||||||
|
|
Loading…
Reference in a new issue