int es_info_print(elementary_stream_info_t *es, int level, char *str, size_t str_len) { if (es == NULL || str == NULL || str_len < 2 || tslib_loglevel < TSLIB_LOG_LEVEL_INFO) return 0; int bytes = 0; bytes += SKIT_LOG_UINT_VERBOSE(str + bytes, level, es->stream_type, stream_desc(es->stream_type), str_len - bytes); bytes += SKIT_LOG_UINT_HEX(str + bytes, level, es->elementary_PID, str_len - bytes); bytes += SKIT_LOG_UINT(str + bytes, level, es->ES_info_length, str_len - bytes); bytes += print_descriptor_loop(es->descriptors, level + 1, str + bytes, str_len - bytes); return bytes; }
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; }