void RTSPManager::createRTSPServer(unsigned int id , unsigned int port , volatile char * watcher) { std::unique_lock<std::mutex> lock(_lock); TaskScheduler* taskSchedular = BasicTaskScheduler::createNew(); BasicUsageEnvironment* usageEnvironment = BasicUsageEnvironment::createNew(*taskSchedular); RTSPServer* rtspServer = RTSPServer::createNew(*usageEnvironment, port, NULL); if(rtspServer == NULL) { logger::log(usageEnvironment->getResultMsg() , logger::logType::FAILURE); *watcher = -1; this->_done = true; this->_condition.notify_all(); return; } H264LiveServerMediaSession *liveSubSession = H264LiveServerMediaSession::createNew(*usageEnvironment, true , id); std::string streamName = "camera_" + std::to_string(id); ServerMediaSession* sms = ServerMediaSession::createNew(*usageEnvironment, streamName.c_str(), streamName.c_str(), "Live H264 Stream"); sms->addSubsession(liveSubSession); rtspServer->addServerMediaSession(sms); char* url = rtspServer->rtspURL(sms); logger::log(INFO_RTSP_URL(url) , logger::logType::PRIORITY); delete[] url; this->_done = true; this->_condition.notify_all(); lock.unlock(); taskSchedular->doEventLoop(watcher); return; }
int main(int argc, char ** argv) { // Initialise settings from configuration files. dvswitch_read_config(handle_config); // Parse arguments. int opt; while ((opt = getopt_long(argc, argv, "c:v", options, NULL)) != -1) { switch (opt) { case 'c': fw_port_name = optarg; break; case 'h': listen_host = optarg; break; case 'p': listen_port = optarg; break; case 'v': verbose = true; break; case 'H': // --help usage(argv[0]); return 0; default: usage(argv[0]); return 2; } } if (optind != argc) fw_port_name = argv[optind++]; if (optind != argc) { fprintf(stderr, "%s: excess argument \"%s\"\n", argv[0], argv[optind]); usage(argv[0]); return 2; } // Catch SIGINT. struct sigaction sigint_action; sigint_action.sa_handler = handle_sigint; sigemptyset(&sigint_action.sa_mask); sigint_action.sa_flags = SA_RESTART; if (sigaction(SIGINT, &sigint_action, NULL)) { perror("ERROR: sigaction"); return 1; } // Set up liveMedia framework BasicTaskScheduler * sched = BasicTaskScheduler::createNew(); BasicUsageEnvironment * env = BasicUsageEnvironment::createNew(*sched); RTSPServer * server = RTSPServer::createNew(*env, 8554, NULL); if (server == NULL) { *env << "Failed to create RTSP server: " << env->getResultMsg() << "\n"; return 1; } OutPacketBuffer::maxSize = DIF_MAX_FRAME_SIZE; // Set up session std::string stream_name("firewire"); stream_name.append(fw_port_name); std::string stream_desc("DV stream from Firewire port "); stream_desc.append(fw_port_name); ServerMediaSession * sms = ServerMediaSession::createNew(*env, stream_name.c_str(), stream_desc.c_str(), stream_desc.c_str()); sms->addSubsession(new firewire_subsession(*env, fw_port_name)); server->addServerMediaSession(sms); // Loop until SIGINT received if (verbose) printf("INFO: Serving at rtsp://*:8554/%s\n", stream_name.c_str()); sched->doEventLoop(&received_sigint); env->reclaim(); return 0; }