X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=main.cpp;h=278c51d67d946cb540a66fa802b20d8678f96f68;hb=7c55e615d7b03fc92b93701ddc3a5d2e6b7087d0;hp=4853518a4b25fd5917e1384a263b38b31a8824f9;hpb=733fa6455f39af91b105b82968f88a0165a66f08;p=cubemap diff --git a/main.cpp b/main.cpp index 4853518..278c51d 100644 --- a/main.cpp +++ b/main.cpp @@ -130,6 +130,72 @@ MarkPool *get_mark_pool(map, MarkPool *> *mark_pools, int from, i mark_pools->insert(make_pair(mark_range, mark_pool)); return mark_pool; } + +MarkPool *parse_mark_pool(map, MarkPool *> *mark_pools, const string &mark_str) +{ + size_t split = mark_str.find_first_of('-'); + if (split == string::npos) { + fprintf(stderr, "WARNING: Invalid mark specification '%s' (expected 'X-Y'), ignoring.\n", + mark_str.c_str()); + return NULL; + } + + string from_str(mark_str.begin(), mark_str.begin() + split); + string to_str(mark_str.begin() + split + 1, mark_str.end()); + int from = atoi(from_str.c_str()); + int to = atoi(to_str.c_str()); + + if (from <= 0 || from >= 65536 || to <= 0 || to >= 65536) { + fprintf(stderr, "WARNING: Mark pool range %d-%d is outside legal range [1,65536>, ignoring.\n", + from, to); + return NULL; + } + + return get_mark_pool(mark_pools, from, to); +} + +// Find all streams in the configuration file, and create inputs for them. +vector create_inputs(const vector &config, + map *deserialized_inputs) +{ + vector inputs; + for (unsigned i = 0; i < config.size(); ++i) { + if (config[i].keyword != "stream") { + continue; + } + assert(config[i].arguments.size() == 1); + string stream_id = config[i].arguments[0]; + + map::const_iterator src_it = + config[i].parameters.find("src"); + if (src_it == config[i].parameters.end()) { + fprintf(stderr, "WARNING: stream '%s' has no src= attribute, clients will not get any data.\n", + stream_id.c_str()); + continue; + } + + string src = src_it->second; + Input *input = NULL; + map::iterator deserialized_input_it = + deserialized_inputs->find(stream_id); + if (deserialized_input_it != deserialized_inputs->end()) { + input = deserialized_input_it->second; + if (input->get_url() != src) { + fprintf(stderr, "INFO: Stream '%s' has changed URL from '%s' to '%s', restarting input.\n", + stream_id.c_str(), input->get_url().c_str(), src.c_str()); + delete input; + input = NULL; + } + deserialized_inputs->erase(deserialized_input_it); + } + if (input == NULL) { + input = new Input(stream_id, src); + } + input->run(); + inputs.push_back(input); + } + return inputs; +} int main(int argc, char **argv) { @@ -199,26 +265,7 @@ int main(int argc, char **argv) // Set up marks, if so desired. if (config[i].parameters.count("mark")) { - string mark_str = config[i].parameters["mark"]; - size_t split = mark_str.find_first_of('-'); - if (split == string::npos) { - fprintf(stderr, "WARNING: Invalid mark specification '%s' (expected 'X-Y'), ignoring.\n", - mark_str.c_str()); - continue; - } - - string from_str(mark_str.begin(), mark_str.begin() + split); - string to_str(mark_str.begin() + split + 1, mark_str.end()); - int from = atoi(from_str.c_str()); - int to = atoi(to_str.c_str()); - - if (from <= 0 || from >= 65536 || to <= 0 || to >= 65536) { - fprintf(stderr, "WARNING: Mark pool range %d-%d is outside legal range [1,65536>, ignoring.\n", - from, to); - continue; - } - - MarkPool *mark_pool = get_mark_pool(&mark_pools, from, to); + MarkPool *mark_pool = parse_mark_pool(&mark_pools, config[i].parameters["mark"]); servers->set_mark_pool(stream_id, mark_pool); } } @@ -254,49 +301,16 @@ int main(int argc, char **argv) if (stats_interval != -1 && stats_file.empty()) { fprintf(stderr, "WARNING: 'stats_interval' given, but no 'stats_file'. No statistics will be written.\n"); } - StatsThread *stats_thread = NULL; - if (!stats_file.empty()) { - stats_thread = new StatsThread(stats_file, stats_interval); - } servers->run(); - pthread_t acceptor_thread; - pthread_create(&acceptor_thread, NULL, acceptor_thread_run, reinterpret_cast(server_sock)); - - // Find all streams in the configuration file, and create inputs for them. - vector inputs; - for (unsigned i = 0; i < config.size(); ++i) { - if (config[i].keyword != "stream") { - continue; - } - assert(config[i].arguments.size() == 1); - string stream_id = config[i].arguments[0]; - - if (config[i].parameters.count("src") == 0) { - fprintf(stderr, "WARNING: stream '%s' has no src= attribute, clients will not get any data.\n", - stream_id.c_str()); - continue; - } + AcceptorThread acceptor_thread(server_sock); + acceptor_thread.run(); - string src = config[i].parameters["src"]; - Input *input = NULL; - if (deserialized_inputs.count(stream_id) != 0) { - input = deserialized_inputs[stream_id]; - if (input->get_url() != src) { - fprintf(stderr, "INFO: Stream '%s' has changed URL from '%s' to '%s', restarting input.\n", - stream_id.c_str(), input->get_url().c_str(), src.c_str()); - delete input; - input = NULL; - } - deserialized_inputs.erase(stream_id); - } - if (input == NULL) { - input = new Input(stream_id, src); - } - input->run(); - inputs.push_back(input); - } + vector inputs = create_inputs(config, &deserialized_inputs); + + // All deserialized inputs should now have been taken care of, one way or the other. + assert(deserialized_inputs.empty()); if (is_reexec) { // Put back the existing clients. It doesn't matter which server we @@ -307,11 +321,10 @@ int main(int argc, char **argv) } } - // All deserialized inputs should now have been taken care of, one way or the other. - assert(deserialized_inputs.empty()); - // Start writing statistics. - if (stats_thread != NULL) { + StatsThread *stats_thread = NULL; + if (!stats_file.empty()) { + stats_thread = new StatsThread(stats_file, stats_interval); stats_thread->run(); } @@ -338,11 +351,7 @@ int main(int argc, char **argv) if (stats_thread != NULL) { stats_thread->stop(); } - pthread_kill(acceptor_thread, SIGHUP); - if (pthread_join(acceptor_thread, NULL) == -1) { - perror("pthread_join"); - exit(1); - } + acceptor_thread.stop(); CubemapStateProto state; state.set_serialize_start_sec(serialize_start.tv_sec);