summaryrefslogtreecommitdiffstats
path: root/debian/transcode/transcode-1.1.7/tools/tcmodinfo.c
diff options
context:
space:
mode:
Diffstat (limited to 'debian/transcode/transcode-1.1.7/tools/tcmodinfo.c')
-rw-r--r--debian/transcode/transcode-1.1.7/tools/tcmodinfo.c382
1 files changed, 382 insertions, 0 deletions
diff --git a/debian/transcode/transcode-1.1.7/tools/tcmodinfo.c b/debian/transcode/transcode-1.1.7/tools/tcmodinfo.c
new file mode 100644
index 00000000..60224cda
--- /dev/null
+++ b/debian/transcode/transcode-1.1.7/tools/tcmodinfo.c
@@ -0,0 +1,382 @@
+/*
+ * tcmodinfo.c
+ *
+ * Copyright (C) Tilmann Bitterberg - August 2002
+ * updated and partially rewritten by
+ * Copyright (C) Francesco Romani - January 2006
+ *
+ * This file is part of transcode, a video stream processing tool
+ *
+ * transcode 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 2, or (at your option)
+ * any later version.
+ *
+ * transcode 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 GNU Make; see the file COPYING. If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include "config.h"
+#include "tcstub.h"
+
+#define EXE "tcmodinfo"
+
+enum {
+ STATUS_OK = 0,
+ STATUS_BAD_PARAM,
+ STATUS_NO_MODULE,
+ STATUS_MODULE_ERROR,
+ STATUS_NO_SOCKET,
+ STATUS_SOCKET_ERROR,
+ STATUS_BAD_MODULES,
+ STATUS_MODULE_FAILED,
+};
+
+void version(void)
+{
+ printf("%s (%s v%s) (C) 2001-2010 Tilmann Bitterberg, "
+ "Transcode Team\n", EXE, PACKAGE, VERSION);
+}
+
+static void usage(void)
+{
+ version();
+ tc_log_info(EXE, "Usage: %s [options]", EXE);
+ fprintf(stderr, " -i name Module name information (like \'smooth\')\n");
+ fprintf(stderr, " -p Print the compiled-in module path\n");
+ fprintf(stderr, " -d verbosity Verbosity mode [1 == TC_INFO]\n");
+#ifdef ENABLE_EXPERIMENTAL
+ fprintf(stderr, " -m path Use PATH as module path\n");
+ fprintf(stderr, " -M element Request to module informations about <element>\n");
+ fprintf(stderr, " -C string Request to configure module using configuration <string>\n");
+ fprintf(stderr, " -t type Type of module (filter, encode, multiplex)\n");
+#endif
+ fprintf(stderr, " -s socket Connect to transcode socket\n");
+ fprintf(stderr, "\n");
+}
+
+static int do_connect_socket(const char *socketfile)
+{
+ int sock, retval;
+ struct sockaddr_un server;
+ char buf[OPTS_SIZE];
+ fd_set rfds;
+ struct timeval tv;
+ ssize_t n;
+
+ sock = socket(AF_UNIX, SOCK_STREAM, 0);
+ if (sock < 0) {
+ perror("opening stream socket");
+ return STATUS_NO_SOCKET;
+ }
+ server.sun_family = AF_UNIX;
+ strlcpy(server.sun_path, socketfile, sizeof(server.sun_path));
+
+ if (connect(sock, (struct sockaddr *) &server,
+ sizeof(struct sockaddr_un)) < 0) {
+ close(sock);
+ perror("connecting stream socket");
+ return STATUS_NO_SOCKET;
+ }
+
+ while (1) {
+ /* Watch stdin (fd 0) to see when it has input. */
+ FD_ZERO(&rfds);
+ FD_SET(0, &rfds); // stdin
+ FD_SET(sock, &rfds);
+ /* Wait up to five seconds. */
+ tv.tv_sec = 5;
+ tv.tv_usec = 0;
+
+ retval = select(sock+1, &rfds, NULL, NULL, NULL);
+ /* Don't rely on the value of tv now! */
+
+ memset(buf, 0, sizeof (buf)); // null-termination in advance, slowly
+
+ if (retval>0) {
+ if (FD_ISSET(0, &rfds)) {
+ fgets(buf, OPTS_SIZE, stdin);
+ }
+ if (FD_ISSET(sock, &rfds)) {
+ if ( (n = read(sock, buf, OPTS_SIZE)) < 0) {
+ perror("reading on stream socket");
+ break;
+ } else if (n == 0) { // EOF
+ fprintf (stderr, "Server closed connection\n");
+ break;
+ }
+ printf("%s", buf);
+ continue;
+ }
+ }
+
+ if (write(sock, buf, strlen(buf)) < 0)
+ perror("writing on stream socket");
+
+ memset(buf, 0, sizeof (buf));
+
+ if (read(sock, buf, OPTS_SIZE) < 0)
+ perror("reading on stream socket");
+
+ printf("%s", buf);
+
+ if (!isatty(0))
+ break;
+ }
+
+ close(sock);
+ return STATUS_OK;
+}
+
+int main(int argc, char *argv[])
+{
+ int ch;
+ const char *filename = NULL;
+ const char *modpath = MOD_PATH;
+#ifdef ENABLE_EXPERIMENTAL
+ const char *modtype = "filter";
+ const char *modarg = ""; /* nothing */
+ const char *modcfg = ""; /* nothing */
+#endif
+ const char *socketfile = NULL;
+ char options[OPTS_SIZE] = { '\0', };
+ int print_mod = 0;
+ int connect_socket = 0;
+ int ret = 0;
+ int status = STATUS_NO_MODULE;
+
+ /* needed by filter modules */
+ TCVHandle tcv_handle = tcv_init();
+#ifdef ENABLE_EXPERIMENTAL
+ TCFactory factory = NULL;
+ TCModule module = NULL;
+#endif
+
+ vframe_list_t ptr;
+
+ memset(&ptr, 0, sizeof(ptr));
+
+ ac_init(AC_ALL);
+ tc_set_config_dir(NULL);
+
+ if (argc == 1) {
+ usage();
+ return STATUS_BAD_PARAM;
+ }
+
+ libtc_init(&argc, &argv);
+
+ while (1) {
+#ifdef ENABLE_EXPERIMENTAL
+ ch = getopt(argc, argv, "C:d:i:?vhpm:M:s:t:");
+#else /* !ENABLE_EXPERIMENTAL */
+ ch = getopt(argc, argv, "d:i:?vhps:");
+#endif
+ if (ch == -1) {
+ break;
+ }
+
+ switch (ch) {
+ case 'd':
+ if (optarg[0] == '-') {
+ usage();
+ return STATUS_BAD_PARAM;
+ }
+ verbose = atoi(optarg);
+ break;
+ case 'i':
+ if (optarg[0] == '-') {
+ usage();
+ return STATUS_BAD_PARAM;
+ }
+ filename = optarg;
+ break;
+#ifdef ENABLE_EXPERIMENTAL
+ case 'C':
+ modcfg = optarg;
+ break;
+ case 'm':
+ modpath = optarg;
+ break;
+ case 'M':
+ modarg = optarg;
+ break;
+ case 't':
+ if (!optarg) {
+ usage();
+ return STATUS_BAD_PARAM;
+ }
+ if (!strcmp(optarg, "filter")
+ || !strcmp(optarg, "encode")
+ || !strcmp(optarg, "multiplex")) {
+ modtype = optarg;
+ } else {
+ modtype = NULL;
+ }
+ break;
+#endif
+ case 's':
+ if (optarg[0] == '-') {
+ usage();
+ return STATUS_BAD_PARAM;
+ }
+ connect_socket = 1;
+ socketfile = optarg;
+ break;
+ case 'p':
+ print_mod = 1;
+ break;
+ case 'v':
+ version();
+ return STATUS_OK;
+ case '?': /* fallthrough */
+ case 'h': /* fallthrough */
+ default:
+ usage();
+ return STATUS_OK;
+ }
+ }
+
+ if (print_mod) {
+ printf("%s\n", modpath);
+ return STATUS_OK;
+ }
+
+ if (connect_socket) {
+ do_connect_socket(socketfile);
+ return STATUS_OK;
+ }
+
+ if (!filename) {
+ usage();
+ return STATUS_BAD_PARAM;
+ }
+
+#ifdef ENABLE_EXPERIMENTAL
+ if (!modtype || !strcmp(modtype, "import")) {
+ tc_log_error(EXE, "Unknown module type (not in filter, encode, multiplex)");
+ return STATUS_BAD_PARAM;
+ }
+
+ if (strlen(modcfg) > 0 && strlen(modarg) > 0) {
+ tc_log_error(EXE, "Cannot configure and inspect module on the same time");
+ return STATUS_BAD_PARAM;
+ }
+
+ /*
+ * we can't distinguish from OMS and NMS modules at glance, so try
+ * first using new module system
+ */
+ factory = tc_new_module_factory(modpath, TC_MAX(verbose - 4, 0));
+ module = tc_new_module(factory, modtype, filename, TC_NONE);
+
+ if (module != NULL) {
+ const char *answer = NULL;
+
+ if (verbose >= TC_DEBUG) {
+ tc_log_info(EXE, "using new module system");
+ }
+ if (strlen(modcfg) > 0) {
+ int ret = tc_module_configure(module, modcfg, tc_get_vob());
+ if (ret == TC_OK) {
+ status = STATUS_OK;
+ } else {
+ status = STATUS_MODULE_FAILED;
+ tc_log_error(EXE, "configure returned error");
+ }
+ tc_module_stop(module);
+ } else {
+ if (verbose >= TC_INFO) {
+ /* overview and options */
+ tc_module_inspect(module, "help", &answer);
+ puts(answer);
+ /* module capabilities */
+ tc_module_show_info(module, verbose);
+ }
+ if (strlen(modarg) > 0) {
+ tc_log_info(EXE, "informations about '%s' for "
+ "module:", modarg);
+ tc_module_inspect(module, modarg, &answer);
+ puts(answer);
+ }
+ status = STATUS_OK;
+ }
+ tc_del_module(factory, module);
+ } else if (!strcmp(modtype, "filter"))
+#endif /* ENABLE_EXPERIMENTAL */
+ {
+ char namebuf[NAME_LEN];
+#ifdef ENABLE_EXPERIMENTAL
+ /* compatibility support only for filters */
+ if (verbose >= TC_DEBUG) {
+ tc_log_info(EXE, "using old module system");
+ }
+#endif
+ /* ok, fallback to old module system */
+ strlcpy(namebuf, filename, NAME_LEN);
+ filter[0].name = namebuf;
+
+ ret = load_plugin(modpath, 0, verbose);
+ if (ret != 0) {
+ tc_log_error(__FILE__, "unable to load filter `%s' (path=%s)",
+ filter[0].name, modpath);
+ status = STATUS_NO_MODULE;
+ } else {
+ strlcpy(options, "help", OPTS_SIZE);
+ ptr.tag = TC_FILTER_INIT;
+ if ((ret = filter[0].entry(&ptr, options)) != 0) {
+ status = STATUS_MODULE_ERROR;
+ } else {
+ memset(options, 0, OPTS_SIZE);
+ ptr.tag = TC_FILTER_GET_CONFIG;
+ ret = filter[0].entry(&ptr, options);
+
+ if (ret == 0) {
+ if (verbose >= TC_INFO) {
+ fputs("START\n", stdout);
+ fputs(options, stdout);
+ fputs("END\n", stdout);
+ }
+ status = STATUS_OK;
+ }
+ }
+ }
+ }
+
+#ifdef ENABLE_EXPERIMENTAL
+ ret = tc_del_module_factory(factory);
+#endif
+ tcv_free(tcv_handle);
+ return status;
+}
+
+/* just for correct linking purposes */
+#ifdef ENABLE_EXPERIMENTAL
+#include "libtc/tcframes.h"
+void dummy_tcframes(void);
+void dummy_tcframes(void) {
+ tc_del_video_frame(NULL);
+ tc_del_audio_frame(NULL);
+}
+
+
+#endif
+
+/*************************************************************************/
+
+/*
+ * Local variables:
+ * c-file-style: "stroustrup"
+ * c-file-offsets: ((case-label . *) (statement-case-intro . *))
+ * indent-tabs-mode: nil
+ * End:
+ *
+ * vim: expandtab shiftwidth=4:
+ */