Пример #1
0
static int modrequest_load(TCFactory factory,
                           ModRequest *modr, const char *str)
{
    size_t pieces = 0;

    if (factory == NULL || modr == NULL || str == NULL) {
        tc_log_warn(EXE, "wrong parameters for modrequest_load");
        return TC_ERROR;
    }

    modr->rawdata = tc_strsplit(str, ':', &pieces);
    if (modr->rawdata == NULL || pieces != 2) {
        tc_log_warn(EXE, "malformed module string: %s", str);
        return TC_ERROR;
    }
    modr->type = modr->rawdata[0];
    modr->name = modr->rawdata[1];

    modr->module = tc_new_module(factory, modr->type, modr->name, TC_NONE);
    if (modr->module == NULL) {
        tc_log_warn(EXE, "failed creation of module: %s", str);
        return TC_ERROR;
    }
    return TC_OK;
}
Пример #2
0
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_config_set_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;
}
Пример #3
0
int main(int argc, char *argv[])
{
    int ch;
    const char *filename = NULL;
    const char *modpath = tc_module_default_path();
    const char *regpath = tc_module_registry_default_path();
    const char *modtype = "filter";
    const char *modarg = ""; /* nothing */
    const char *modcfg = ""; /* nothing */
    const char *socketfile = NULL;
    const char *fmtname = NULL;
    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();
    TCRegistry registry = NULL;
    TCFactory factory = NULL;
    TCModule module = NULL;

    ac_init(AC_ALL);
    tc_ext_init();

    if (argc == 1) {
        usage();
        return STATUS_BAD_PARAM;
    }

    libtc_init(&argc, &argv);

    while (1) {
        ch = getopt(argc, argv, "C:F:d:i:?vhpm:M:r:s:t:");
        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;
          case 'C':
            modcfg = optarg;
            break;
          case 'F':
            fmtname = optarg;
            break;
          case 'm':
            modpath = optarg;
            break;
          case 'M':
            modarg = optarg;
            break;
          case 'r':
            regpath = 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;
          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 && !fmtname) {
        usage();
        return STATUS_BAD_PARAM;
    }

    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)); /* FIXME */
    registry = tc_new_module_registry(factory, regpath, TC_MAX(verbose - 4, 0)); /* FIXME */

    if (fmtname) {
        TCCodecID codec = tc_codec_from_string(fmtname);
        TCFormatID format = tc_format_from_string(fmtname);
        if (codec == TC_CODEC_ERROR && format == TC_FORMAT_ERROR) {
            tc_log_error(EXE, "unrecognized format `%s'", fmtname);
        } else {
            const char *modnames = tc_get_module_name_for_format(registry,
                                                                 modtype,
                                                                 fmtname);
            if (modnames) {
                puts(modnames);
            }
        }
    } else {
        module = tc_new_module(factory, modtype, filename, TC_NONE);

        if (module != NULL) {
            status = query_new_module(module, modcfg, modarg);
            tc_del_module(factory, module);
        } else if (!strcmp(modtype, "filter")) {
            status = query_old_module(filename, modpath);
        }
    }

    ret = tc_del_module_registry(registry);
    ret = tc_del_module_factory(factory);
    tcv_free(tcv_handle);
    return status;
}