summaryrefslogtreecommitdiff
path: root/src/options-launch.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/options-launch.c')
-rw-r--r--src/options-launch.c214
1 files changed, 214 insertions, 0 deletions
diff --git a/src/options-launch.c b/src/options-launch.c
new file mode 100644
index 0000000..fad40fe
--- /dev/null
+++ b/src/options-launch.c
@@ -0,0 +1,214 @@
+/*
+ * sydra
+ *
+ * sydra is a toolbox which allows you to set up multiple bidirectional
+ * Video/Audio streams from external locations.
+ * sydra has been written to be used for the Elevate Festival in Graz
+ * Austria in order to involve external locations to present themselves
+ * at the festival.
+ *
+ *
+ * Copyright (C) 2014 Christian Pointner <equinox@spreadspace.org>
+ *
+ * This file is part of sydra.
+ *
+ * sydra is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * any later version.
+ *
+ * sydra 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with sydra. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders hereby
+ * grant permission for non-GPL-compatible GStreamer plugins to be used
+ * and distributed together with GStreamer and sydra.
+ * This permission goes above and beyond the permissions granted by the
+ * GPL license sydra is covered by.
+ */
+
+#include "datatypes.h"
+#include "config-launch.h"
+
+#include "options-launch.h"
+#include "log.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <glib.h>
+#include <gst/gst.h>
+
+static void options_defaults(options_t* opt)
+{
+ if(!opt)
+ return;
+
+ opt->progname_ = g_strdup("sydra-rtp");
+ opt->daemonize_ = TRUE;
+ opt->username_ = NULL;
+ opt->groupname_ = NULL;
+ opt->chroot_dir_ = NULL;
+ opt->pid_file_ = NULL;
+ opt->log_targets_ = NULL;
+ opt->debug_ = FALSE;
+
+ opt->appname_ = NULL;
+ opt->pipeline_ = NULL;
+}
+
+static int options_parse_post(options_t* opt);
+
+int options_parse(options_t* opt, int argc, char* argv[])
+{
+ if(!opt)
+ return -1;
+
+ options_defaults(opt);
+
+ g_free(opt->progname_);
+ opt->progname_ = g_strdup(argv[0]);
+ if(!opt->progname_)
+ return -127;
+
+ gboolean show_version = FALSE;
+ GOptionEntry main_entries[] = {
+ { "version", 'v', 0, G_OPTION_ARG_NONE, &show_version,
+ "print version info and exit", NULL },
+ { "nodaemonize", 'D', G_OPTION_FLAG_REVERSE, G_OPTION_ARG_NONE, &opt->daemonize_,
+ "don't run in background", NULL },
+ { "username", 'u', 0, G_OPTION_ARG_STRING, &opt->username_,
+ "change to this user", "USERNAME" },
+ { "group", 'g', 0, G_OPTION_ARG_STRING, &opt->groupname_,
+ "change to this group", "GROUP" },
+ { "chroot", 'C', 0, G_OPTION_ARG_STRING, &opt->chroot_dir_,
+ "chroot to this directory", "PATH" },
+ { "write-pid", 'P', 0, G_OPTION_ARG_STRING, &opt->pid_file_,
+ "write pid to this file", "PATH" },
+ { "log", 'L', 0, G_OPTION_ARG_STRING_ARRAY, &opt->log_targets_,
+ "add a log target, can be invoked several times", "<TARGET>:<LEVEL>[,<PARAM1>[,<PARAM2>..]]" },
+ { "debug", 'U', 0, G_OPTION_ARG_NONE, &opt->debug_,
+ "don't daemonize and log to stdout with maximum log level", NULL },
+ { "appname", 'n', 0, G_OPTION_ARG_STRING, &opt->appname_,
+ "set the application name (will be used by xvimagesink for window title)", "NAME" },
+ { "pipeline", 'p', 0, G_OPTION_ARG_STRING, &opt->pipeline_,
+ "the gst-launch style pipeline description", "PIPELINE DESCRIPTION" },
+ { NULL }
+ };
+ GOptionContext *ctx = g_option_context_new("- spreadspace streaming hydra ");
+ GOptionGroup* main_group = g_option_group_new ("main", "Application Options",
+ "Show Application Options", opt, NULL);
+ if(main_group)
+ g_option_group_add_entries(main_group, main_entries);
+
+ GOptionGroup* gst_group = gst_init_get_option_group();
+ if(!main_group || !gst_group) {
+ printf("ERROR: Failed to initialize: memory error\n");
+ return -127;
+ }
+ g_option_context_set_main_group(ctx, main_group);
+ g_option_context_add_group(ctx, gst_group);
+
+ GError *err = NULL;
+ if(!g_option_context_parse(ctx, &argc, &argv, &err)) {
+ printf("ERROR: Failed to initialize: %s\n", err->message);
+ g_error_free(err);
+ return 1;
+ }
+
+ if(show_version)
+ return -1;
+
+ return options_parse_post(opt);
+}
+
+static int options_parse_post(options_t* opt)
+{
+ if(!opt->pipeline_) {
+ printf("ERROR: the pipeline description can not be omitted!\n");
+ return -2;
+ }
+
+ if(opt->debug_) {
+ opt->daemonize_ = 0;
+ g_strfreev(opt->log_targets_);
+ opt->log_targets_ = g_new(gchar*, 2);
+ if(!opt->log_targets_) return -127;
+ opt->log_targets_[0] = g_strdup("stdout:5");
+ if(!(opt->log_targets_[0])) return -127;
+ opt->log_targets_[1] = NULL;
+ }
+
+ if(!opt->log_targets_ || !g_strv_length(opt->log_targets_)) {
+ opt->log_targets_ = g_new(gchar*, 2);
+ if(!opt->log_targets_) return -127;
+ opt->log_targets_[0] = g_strdup("syslog:3,sydra-launch,daemon");
+ if(!(opt->log_targets_[0])) return -127;
+ opt->log_targets_[1] = NULL;
+ }
+
+ return 0;
+}
+
+void options_clear(options_t* opt)
+{
+ if(!opt)
+ return;
+
+ g_free(opt->progname_);
+ g_free(opt->username_);
+ g_free(opt->groupname_);
+ g_free(opt->chroot_dir_);
+ g_free(opt->pid_file_);
+ g_strfreev(opt->log_targets_);
+ g_free(opt->appname_);
+ g_free(opt->pipeline_);
+}
+
+void options_print_version()
+{
+ printf("%s\n", VERSION_STRING_0);
+#if defined(__clang__)
+ printf("%s, using CLANG %s\n", VERSION_STRING_1, __clang_version__);
+#elif defined(__GNUC__)
+ printf("%s, using GCC %d.%d.%d\n", VERSION_STRING_1, __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__);
+#else
+ printf("%s\n", VERSION_STRING_1);
+#endif
+ const gchar *nano_str;
+ guint major, minor, micro, nano;
+ gst_version(&major, &minor, &micro, &nano);
+ if (nano == 1)
+ nano_str = " (CVS)";
+ else if (nano == 2)
+ nano_str = " (Prerelease)";
+ else
+ nano_str = "";
+ printf(" linked against GStreamer %d.%d.%d%s\n", major, minor, micro, nano_str);
+}
+
+void options_print(options_t* opt)
+{
+ if(!opt)
+ return;
+
+ printf(" progname: '%s'\n", opt->progname_);
+ printf(" daemonize: %s\n", opt->daemonize_ ? "true" : "false");
+ printf(" username: '%s'\n", opt->username_);
+ printf(" groupname: '%s'\n", opt->groupname_);
+ printf(" chroot_dir: '%s'\n", opt->chroot_dir_);
+ printf(" pid_file: '%s'\n", opt->pid_file_);
+ printf(" log_targets: \n");
+ gchar* lt = opt->log_targets_ ? g_strjoinv ("'\n '", opt->log_targets_) : NULL;
+ if(lt) {
+ printf(" '%s'\n", lt);
+ g_free(lt);
+ }
+ printf(" debug: %s\n", opt->debug_ ? "true" : "false");
+ printf(" appname: >>%s<<\n", opt->appname_);
+ printf(" pipeline: >>%s<<\n", opt->pipeline_);
+}