summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorThibault Saunier <tsaunier@igalia.com>2020-02-20 17:13:46 -0300
committerThibault Saunier <tsaunier@igalia.com>2020-02-25 17:44:51 -0300
commit4e4473ef8fdfb5ba32a3f0208338ec9ea294784f (patch)
tree18e836fe6fb032e5f12f64b2a5d1c3147cda59ee /tools
parent056ac5eeb05ff1657e44cca3493ed9eb49f9a10d (diff)
ges: Plug leaks in new ges-launch and related
Diffstat (limited to 'tools')
-rw-r--r--tools/ges-launcher.c65
-rw-r--r--tools/ges-launcher.h6
-rw-r--r--tools/ges-validate.c6
-rw-r--r--tools/utils.c6
-rw-r--r--tools/utils.h2
5 files changed, 56 insertions, 29 deletions
diff --git a/tools/ges-launcher.c b/tools/ges-launcher.c
index 5c0675fb..f42fb45f 100644
--- a/tools/ges-launcher.c
+++ b/tools/ges-launcher.c
@@ -726,15 +726,15 @@ ges_launcher_get_playback_option_group (GESLauncherParsedOptions * opts)
}
gboolean
-ges_launcher_parse_options (GESLauncherParsedOptions * opts, gchar ** arguments,
- gint * argc, GOptionContext * ctx, GError ** error)
+ges_launcher_parse_options (GESLauncherParsedOptions * opts,
+ gchar ** arguments[], gint * argc, GOptionContext * ctx, GError ** error)
{
gboolean res;
- gchar **argv;
GOptionGroup *main_group;
gint nargs = 0, tmpargc;
gchar **commands = NULL, *help, *tmp;
GError *err = NULL;
+ gboolean owns_ctx = ctx == NULL;
GOptionEntry options[] = {
{"disable-mixing", 0, 0, G_OPTION_ARG_NONE, &opts->disable_mixing,
"Do not use mixing elements to mix layers together.", NULL}
@@ -786,12 +786,11 @@ ges_launcher_parse_options (GESLauncherParsedOptions * opts, gchar ** arguments,
if (!ctx)
ctx = g_option_context_new ("- plays or renders a timeline.");
- argv = arguments;
- tmpargc = g_strv_length (argv);
+ tmpargc = argc ? *argc : g_strv_length (*arguments);
if (tmpargc > 2) {
nargs = tmpargc - 2;
- commands = &argv[2];
+ commands = &(*arguments)[2];
}
tmp = ges_command_line_formatter_get_help (nargs, commands);
@@ -818,13 +817,17 @@ ges_launcher_parse_options (GESLauncherParsedOptions * opts, gchar ** arguments,
g_option_context_add_group (ctx, ges_launcher_get_info_option_group (opts));
g_option_context_set_ignore_unknown_options (ctx, TRUE);
- res = g_option_context_parse (ctx, &tmpargc, &argv, &err);
+ res = g_option_context_parse_strv (ctx, arguments, &err);
if (argc)
*argc = tmpargc;
if (err)
g_propagate_error (error, err);
+ if (owns_ctx) {
+ g_option_context_free (ctx);
+ }
+
return res;
}
@@ -832,7 +835,7 @@ static gboolean
_local_command_line (GApplication * application, gchar ** arguments[],
gint * exit_status)
{
- gchar **argv;
+ gboolean res = TRUE;
gint argc;
GError *error = NULL;
GESLauncher *self = GES_LAUNCHER (application);
@@ -840,22 +843,22 @@ _local_command_line (GApplication * application, gchar ** arguments[],
GOptionContext *ctx = g_option_context_new ("- plays or renders a timeline.");
*exit_status = 0;
- argv = *arguments;
- argc = g_strv_length (argv);
+ argc = g_strv_length (*arguments);
- gst_init (&argc, &argv);
- if (!ges_launcher_parse_options (opts, *arguments, &argc, ctx, &error)) {
+ gst_init (&argc, arguments);
+ if (!ges_launcher_parse_options (opts, arguments, &argc, ctx, &error)) {
gst_init (NULL, NULL);
printerr ("Error initializing: %s\n", error->message);
g_option_context_free (ctx);
g_error_free (error);
*exit_status = 1;
- return TRUE;
+ goto done;
}
if (opts->inspect_action_type) {
- ges_validate_print_action_types ((const gchar **) argv + 1, argc - 1);
- return TRUE;
+ ges_validate_print_action_types ((const gchar **) &((*arguments)[1]),
+ argc - 1);
+ goto done;
}
if (!opts->load_path && !opts->scenario && !opts->list_transitions
@@ -863,20 +866,21 @@ _local_command_line (GApplication * application, gchar ** arguments[],
g_printf ("%s", g_option_context_get_help (ctx, TRUE, NULL));
g_option_context_free (ctx);
*exit_status = 1;
- return TRUE;
+ goto done;
}
g_option_context_free (ctx);
- opts->sanitized_timeline = sanitize_timeline_description (argc, argv);
+ opts->sanitized_timeline = sanitize_timeline_description (*arguments);
if (!g_application_register (application, NULL, &error)) {
*exit_status = 1;
g_clear_error (&error);
- return FALSE;
+ res = FALSE;
}
- return TRUE;
+done:
+ return res;
}
static void
@@ -954,11 +958,34 @@ _shutdown (GApplication * application)
}
static void
+_finalize (GObject * object)
+{
+ GESLauncher *self = GES_LAUNCHER (object);
+ GESLauncherParsedOptions *opts = &self->priv->parsed_options;
+
+ g_free (opts->load_path);
+ g_free (opts->save_path);
+ g_free (opts->save_only_path);
+ g_free (opts->outputuri);
+ g_free (opts->format);
+ g_free (opts->encoding_profile);
+ g_free (opts->videosink);
+ g_free (opts->audiosink);
+ g_free (opts->video_track_caps);
+ g_free (opts->audio_track_caps);
+ g_free (opts->scenario);
+
+ G_OBJECT_CLASS (ges_launcher_parent_class)->finalize (object);
+}
+
+static void
ges_launcher_class_init (GESLauncherClass * klass)
{
G_APPLICATION_CLASS (klass)->local_command_line = _local_command_line;
G_APPLICATION_CLASS (klass)->startup = _startup;
G_APPLICATION_CLASS (klass)->shutdown = _shutdown;
+
+ G_OBJECT_CLASS (klass)->finalize = _finalize;
}
static void
diff --git a/tools/ges-launcher.h b/tools/ges-launcher.h
index d1704b9e..7a5a2057 100644
--- a/tools/ges-launcher.h
+++ b/tools/ges-launcher.h
@@ -64,8 +64,8 @@ typedef struct
gboolean list_transitions;
gboolean inspect_action_type;
gchar *sanitized_timeline;
- const gchar *video_track_caps;
- const gchar *audio_track_caps;
+ gchar *video_track_caps;
+ gchar *audio_track_caps;
gboolean embed_nesteds;
} GESLauncherParsedOptions;
@@ -91,7 +91,7 @@ GType ges_launcher_get_type (void);
GESLauncher* ges_launcher_new (void);
gint ges_launcher_get_exit_status (GESLauncher *self);
-gboolean ges_launcher_parse_options(GESLauncherParsedOptions* opts, gchar** arguments, gint *argc, GOptionContext* ctx, GError** error);
+gboolean ges_launcher_parse_options(GESLauncherParsedOptions* opts, gchar*** arguments, gint *argc, GOptionContext* ctx, GError** error);
G_END_DECLS
diff --git a/tools/ges-validate.c b/tools/ges-validate.c
index b89d4bbb..ec5fa1ac 100644
--- a/tools/ges-validate.c
+++ b/tools/ges-validate.c
@@ -140,11 +140,11 @@ ges_validate_activate (GstPipeline * pipeline, GESLauncherParsedOptions * opts)
ges_options_full[0] = g_strdup ("something");
for (i = 0; ges_options[i]; i++)
- ges_options_full[i + 1] = ges_options[i];
+ ges_options_full[i + 1] = g_strdup (ges_options[i]);
- ges_launcher_parse_options (opts, ges_options_full, NULL, NULL, NULL);
- g_free (ges_options);
+ ges_launcher_parse_options (opts, &ges_options_full, NULL, NULL, NULL);
g_strfreev (ges_options_full);
+ g_strfreev (ges_options);
}
}
}
diff --git a/tools/utils.c b/tools/utils.c
index ce8c852f..614effa9 100644
--- a/tools/utils.c
+++ b/tools/utils.c
@@ -64,15 +64,15 @@ _sanitize_argument (gchar * arg)
}
gchar *
-sanitize_timeline_description (int argc, char **argv)
+sanitize_timeline_description (gchar ** args)
{
gint i;
gchar *string = g_strdup (" ");
- for (i = 1; i < argc; i++) {
+ for (i = 1; args[i]; i++) {
gchar *new_string;
- gchar *sanitized = _sanitize_argument (argv[i]);
+ gchar *sanitized = _sanitize_argument (args[i]);
new_string = g_strconcat (string, " ", sanitized, NULL);
diff --git a/tools/utils.h b/tools/utils.h
index 4df2641f..9bdd21f7 100644
--- a/tools/utils.h
+++ b/tools/utils.h
@@ -20,7 +20,7 @@
#include <gst/pbutils/pbutils.h>
#include <gst/pbutils/encoding-profile.h>
-gchar * sanitize_timeline_description (int argc, char **argv);
+gchar * sanitize_timeline_description (gchar **args);
gboolean get_flags_from_string (GType type, const gchar * str_flags, guint *val);
gchar * ensure_uri (const gchar * location);
GstEncodingProfile * parse_encoding_profile (const gchar * format);