diff --git a/src/zms.cpp b/src/zms.cpp index 35f6fe640..783cace93 100644 --- a/src/zms.cpp +++ b/src/zms.cpp @@ -28,339 +28,339 @@ bool ValidateAccess( User *user, int mon_id ) { - bool allowed = true; + bool allowed = true; - if ( mon_id > 0 ) - { - if ( user->getStream() < User::PERM_VIEW ) - allowed = false; - if ( !user->canAccess( mon_id ) ) - allowed = false; - } - else - { - if ( user->getEvents() < User::PERM_VIEW ) - allowed = false; - } - if ( !allowed ) - { - Error( "Error, insufficient privileges for requested action" ); - exit( -1 ); - } - return( allowed ); + if ( mon_id > 0 ) + { + if ( user->getStream() < User::PERM_VIEW ) + allowed = false; + if ( !user->canAccess( mon_id ) ) + allowed = false; + } + else + { + if ( user->getEvents() < User::PERM_VIEW ) + allowed = false; + } + if ( !allowed ) + { + Error( "Error, insufficient privileges for requested action" ); + exit( -1 ); + } + return( allowed ); } int main( int argc, const char *argv[] ) { - self = argv[0]; + self = argv[0]; - srand( getpid() * time( 0 ) ); + srand( getpid() * time( 0 ) ); - enum { ZMS_MONITOR, ZMS_EVENT } source = ZMS_MONITOR; - StreamBase::StreamMode mode; // When streaming a live view or event, default to STREAM. If a frame is specified then default to SINGLE> - StreamBase::StreamType type = StreamBase::JPEG; - char format[32] = ""; //used to specify format to ffmpeg libs - int monitor_id = 0; - time_t event_time = 0; - int event_id = 0; - int frame_id = 1; - unsigned int scale = 100; - unsigned int rate = 100; - double maxfps = 10.0; - unsigned int bitrate = 100000; - unsigned int ttl = 0; - EventStream::StreamMode replay = EventStream::SINGLE; - char username[64] = ""; - char password[64] = ""; - char auth[64] = ""; - unsigned int connkey = 0; - unsigned int playback_buffer = 0; + enum { ZMS_MONITOR, ZMS_EVENT } source = ZMS_MONITOR; + StreamBase::StreamMode mode; // When streaming a live view or event, default to STREAM. If a frame is specified then default to SINGLE> + StreamBase::StreamType type = StreamBase::JPEG; + char format[32] = ""; //used to specify format to ffmpeg libs + int monitor_id = 0; + time_t event_time = 0; + int event_id = 0; + int frame_id = 1; + unsigned int scale = 100; + unsigned int rate = 100; + double maxfps = 10.0; + unsigned int bitrate = 100000; + unsigned int ttl = 0; + EventStream::StreamMode replay = EventStream::SINGLE; + char username[64] = ""; + char password[64] = ""; + char auth[64] = ""; + unsigned int connkey = 0; + unsigned int playback_buffer = 0; - bool nph = false; - const char *basename = strrchr( argv[0], '/' ); - if (basename) //if we found a / lets skip past it - basename++; - else //argv[0] will not always contain the full path, but rather just the script name - basename = argv[0]; - const char *nph_prefix = "nph-"; - if ( basename && !strncmp( basename, nph_prefix, strlen(nph_prefix) ) ) - { - nph = true; - } - - zmLoadConfig(); + bool nph = false; + const char *basename = strrchr( argv[0], '/' ); + if (basename) //if we found a / lets skip past it + basename++; + else //argv[0] will not always contain the full path, but rather just the script name + basename = argv[0]; + const char *nph_prefix = "nph-"; + if ( basename && !strncmp( basename, nph_prefix, strlen(nph_prefix) ) ) + { + nph = true; + } - logInit( "zms" ); - - ssedetect(); + zmLoadConfig(); - zmSetDefaultTermHandler(); - zmSetDefaultDieHandler(); + logInit( "zms" ); - const char *query = getenv( "QUERY_STRING" ); - if ( query ) - { - Debug( 1, "Query: %s", query ); - - char temp_query[1024]; - strncpy( temp_query, query, sizeof(temp_query) ); - char *q_ptr = temp_query; - char *parms[16]; // Shouldn't be more than this - int parm_no = 0; - while( (parm_no < 16) && (parms[parm_no] = strtok( q_ptr, "&" )) ) - { - parm_no++; - q_ptr = NULL; - } - - for ( int p = 0; p < parm_no; p++ ) - { - char *name = strtok( parms[p], "=" ); - char *value = strtok( NULL, "=" ); - if ( !value ) - value = (char *)""; - if ( !strcmp( name, "source" ) ) - { - source = !strcmp( value, "event" )?ZMS_EVENT:ZMS_MONITOR; - } - else if ( !strcmp( name, "mode" ) ) - { - if ( !strcmp( value, "single" ) ) { - mode = StreamBase::SINGLE; - } else if ( !strcmp( value, "stream" ) ) { - mode = StreamBase::STREAM; - } else if ( !strcmp( value, "jpeg" ) ) { - type = StreamBase::JPEG; - // code for STREAM/SINGLE comes later. - } else if ( !strcmp( value, "raw" ) ) { - type = StreamBase::RAW; - - } else if ( !strcmp( value, "zip" ) ) { - type = StreamBase::ZIP; - } else { - Warning( "Unsupported mode: (%s) defaulting to ", value ); - } - } - else if ( !strcmp( name, "format" ) ) - if ( !strcmp( value, "jpeg" ) ) { - type = StreamBase::JPEG; - } else if ( !strcmp( value, "raw" ) ) { - type = StreamBase::RAW; - } else if ( !strcmp( value, "zip" ) ) { - type = StreamBase::ZIP; - } else if ( !strcmp( value, "mpeg" ) ) { - type = StreamBase::MPEG; - strncpy( format, value, sizeof(format) ); - } else { - Warning( "Unsupported format: (%s) defaulting to ", value ); - strncpy( format, value, sizeof(format) ); - } - else if ( !strcmp( name, "monitor" ) ) - monitor_id = atoi( value ); - else if ( !strcmp( name, "time" ) ) - event_time = atoi( value ); - else if ( !strcmp( name, "event" ) ) - event_id = strtoull( value, (char **)NULL, 10 ); - else if ( !strcmp( name, "frame" ) ) - frame_id = strtoull( value, (char **)NULL, 10 ); - else if ( !strcmp( name, "scale" ) ) - scale = atoi( value ); - else if ( !strcmp( name, "rate" ) ) - rate = atoi( value ); - else if ( !strcmp( name, "maxfps" ) ) - maxfps = atof( value ); - else if ( !strcmp( name, "bitrate" ) ) - bitrate = atoi( value ); - else if ( !strcmp( name, "ttl" ) ) - ttl = atoi(value); - else if ( !strcmp( name, "replay" ) ) - { - replay = !strcmp( value, "gapless" )?StreamBase::ALL_GAPLESS:StreamBase::SINGLE; - replay = !strcmp( value, "all" )?StreamBase::ALL:replay; - } - else if ( !strcmp( name, "connkey" ) ) - connkey = atoi(value); - else if ( !strcmp( name, "buffer" ) ) - playback_buffer = atoi(value); - else if ( config.opt_use_auth ) - { - if ( strcmp( config.auth_relay, "none" ) == 0 ) - { - if ( !strcmp( name, "user" ) ) - { - strncpy( username, value, sizeof(username) ); - } - } - else - { - //if ( strcmp( config.auth_relay, "hashed" ) == 0 ) - { - if ( !strcmp( name, "auth" ) ) - { - strncpy( auth, value, sizeof(auth) ); - } - } - //else if ( strcmp( config.auth_relay, "plain" ) == 0 ) - { - if ( !strcmp( name, "user" ) ) - { - strncpy( username, value, sizeof(username) ); - } - if ( !strcmp( name, "pass" ) ) - { - strncpy( password, value, sizeof(password) ); - } - } - } - } - } - } + ssedetect(); - if ( config.opt_use_auth ) - { - User *user = 0; + zmSetDefaultTermHandler(); + zmSetDefaultDieHandler(); - if ( strcmp( config.auth_relay, "none" ) == 0 ) - { - if ( *username ) - { - user = zmLoadUser( username ); - } - } - else - { - //if ( strcmp( config.auth_relay, "hashed" ) == 0 ) - { - if ( *auth ) - { - user = zmLoadAuthUser( auth, config.auth_hash_ips ); - } - } - //else if ( strcmp( config.auth_relay, "plain" ) == 0 ) - { - if ( *username && *password ) - { - user = zmLoadUser( username, password ); - } - } - } - if ( !user ) - { - Error( "Unable to authenticate user" ); - logTerm(); - zmDbClose(); - return( -1 ); - } - ValidateAccess( user, monitor_id ); - } + const char *query = getenv( "QUERY_STRING" ); + if ( query ) + { + Debug( 1, "Query: %s", query ); - if ( ! mode ) { - if ( source == ZMS_MONITOR ) { - mode = StreamBase::STREAM; - } else { - // when getting from an event, if a frame_id is specified, then default to single, otherwise stream - if ( frame_id ) { - mode = StreamBase::SINGLE; - } else { - mode = StreamBase::STREAM; - } - } - } - - setbuf( stdout, 0 ); - if ( nph ) - { - fprintf( stdout, "HTTP/1.0 200 OK\r\n" ); - } - fprintf( stdout, "Server: ZoneMinder Video Server/%s\r\n", ZM_VERSION ); - - time_t now = time( 0 ); - char date_string[64]; - strftime( date_string, sizeof(date_string)-1, "%a, %d %b %Y %H:%M:%S GMT", gmtime( &now ) ); - - fprintf( stdout, "Expires: Mon, 26 Jul 1997 05:00:00 GMT\r\n" ); - fprintf( stdout, "Last-Modified: %s\r\n", date_string ); - fprintf( stdout, "Cache-Control: no-store, no-cache, must-revalidate\r\n" ); - fprintf( stdout, "Cache-Control: post-check=0, pre-check=0\r\n" ); - fprintf( stdout, "Pragma: no-cache\r\n"); - // Removed as causing more problems than it fixed. - //if ( !nph ) - //{ - //fprintf( stdout, "Content-Length: 0\r\n"); - //} - - if ( source == ZMS_MONITOR ) - { - MonitorStream stream; - stream.setStreamScale( scale ); - stream.setStreamReplayRate( rate ); - stream.setStreamMaxFPS( maxfps ); - stream.setStreamTTL( ttl ); - stream.setStreamQueue( connkey ); - stream.setStreamBuffer( playback_buffer ); - if ( ! stream.setStreamStart( monitor_id ) ) { - Error( "Unable to connect to zmc process for monitor %d", monitor_id ); - fprintf( stderr, "Unable to connect to zmc process. Please ensure that it is running." ); - logTerm(); - zmDbClose(); - return( -1 ); - } - - stream.setStreamMode( mode ); - stream.setStreamType( type ); - - if ( type == StreamBase::MPEG ) - { -#if HAVE_LIBAVCODEC - stream.setStreamFormat( format ); - stream.setStreamBitrate( bitrate ); - stream.setStreamType( type ); -#else // HAVE_LIBAVCODEC - Error( "MPEG streaming of '%s' attempted while disabled", query ); - fprintf( stderr, "MPEG streaming is disabled.\nYou should configure with the --with-ffmpeg option and rebuild to use this functionality.\n" ); - logTerm(); - zmDbClose(); - return( -1 ); -#endif // HAVE_LIBAVCODEC - } - stream.runStream(); - } - else if ( source == ZMS_EVENT ) + char temp_query[1024]; + strncpy( temp_query, query, sizeof(temp_query) ); + char *q_ptr = temp_query; + char *parms[16]; // Shouldn't be more than this + int parm_no = 0; + while( (parm_no < 16) && (parms[parm_no] = strtok( q_ptr, "&" )) ) { - EventStream stream; - stream.setStreamScale( scale ); - stream.setStreamReplayRate( rate ); - stream.setStreamMaxFPS( maxfps ); - stream.setStreamMode( replay ); - stream.setStreamQueue( connkey ); - if ( monitor_id && event_time ) - { - stream.setStreamStart( monitor_id, event_time ); - } - else - { - stream.setStreamStart( event_id, frame_id ); - } - stream.setStreamMode( mode ); - stream.setStreamType( type ); - if ( type == StreamBase::MPEG ) - { -#if HAVE_LIBAVCODEC - stream.setStreamFormat( format ); - stream.setStreamBitrate( bitrate ); -#else // HAVE_LIBAVCODEC - Error( "MPEG streaming of '%s' attempted while disabled", query ); - fprintf( stderr, "MPEG streaming is disabled.\nYou should ensure the ffmpeg libraries are installed and detected and rebuild to use this functionality.\n" ); - logTerm(); - zmDbClose(); - return( -1 ); -#endif // HAVE_LIBAVCODEC - } - stream.runStream(); + parm_no++; + q_ptr = NULL; } - logTerm(); - zmDbClose(); + for ( int p = 0; p < parm_no; p++ ) + { + char *name = strtok( parms[p], "=" ); + char *value = strtok( NULL, "=" ); + if ( !value ) + value = (char *)""; + if ( !strcmp( name, "source" ) ) + { + source = !strcmp( value, "event" )?ZMS_EVENT:ZMS_MONITOR; + } + else if ( !strcmp( name, "mode" ) ) + { + if ( !strcmp( value, "single" ) ) { + mode = StreamBase::SINGLE; + } else if ( !strcmp( value, "stream" ) ) { + mode = StreamBase::STREAM; + } else if ( !strcmp( value, "jpeg" ) ) { + type = StreamBase::JPEG; + // code for STREAM/SINGLE comes later. + } else if ( !strcmp( value, "raw" ) ) { + type = StreamBase::RAW; - return( 0 ); + } else if ( !strcmp( value, "zip" ) ) { + type = StreamBase::ZIP; + } else { + Warning( "Unsupported mode: (%s) defaulting to ", value ); + } + } + else if ( !strcmp( name, "format" ) ) + if ( !strcmp( value, "jpeg" ) ) { + type = StreamBase::JPEG; + } else if ( !strcmp( value, "raw" ) ) { + type = StreamBase::RAW; + } else if ( !strcmp( value, "zip" ) ) { + type = StreamBase::ZIP; + } else if ( !strcmp( value, "mpeg" ) ) { + type = StreamBase::MPEG; + strncpy( format, value, sizeof(format) ); + } else { + Warning( "Unsupported format: (%s) defaulting to ", value ); + strncpy( format, value, sizeof(format) ); + } + else if ( !strcmp( name, "monitor" ) ) + monitor_id = atoi( value ); + else if ( !strcmp( name, "time" ) ) + event_time = atoi( value ); + else if ( !strcmp( name, "event" ) ) + event_id = strtoull( value, (char **)NULL, 10 ); + else if ( !strcmp( name, "frame" ) ) + frame_id = strtoull( value, (char **)NULL, 10 ); + else if ( !strcmp( name, "scale" ) ) + scale = atoi( value ); + else if ( !strcmp( name, "rate" ) ) + rate = atoi( value ); + else if ( !strcmp( name, "maxfps" ) ) + maxfps = atof( value ); + else if ( !strcmp( name, "bitrate" ) ) + bitrate = atoi( value ); + else if ( !strcmp( name, "ttl" ) ) + ttl = atoi(value); + else if ( !strcmp( name, "replay" ) ) + { + replay = !strcmp( value, "gapless" )?StreamBase::ALL_GAPLESS:StreamBase::SINGLE; + replay = !strcmp( value, "all" )?StreamBase::ALL:replay; + } + else if ( !strcmp( name, "connkey" ) ) + connkey = atoi(value); + else if ( !strcmp( name, "buffer" ) ) + playback_buffer = atoi(value); + else if ( config.opt_use_auth ) + { + if ( strcmp( config.auth_relay, "none" ) == 0 ) + { + if ( !strcmp( name, "user" ) ) + { + strncpy( username, value, sizeof(username) ); + } + } + else + { + //if ( strcmp( config.auth_relay, "hashed" ) == 0 ) + { + if ( !strcmp( name, "auth" ) ) + { + strncpy( auth, value, sizeof(auth) ); + } + } + //else if ( strcmp( config.auth_relay, "plain" ) == 0 ) + { + if ( !strcmp( name, "user" ) ) + { + strncpy( username, value, sizeof(username) ); + } + if ( !strcmp( name, "pass" ) ) + { + strncpy( password, value, sizeof(password) ); + } + } + } + } + } + } + + if ( config.opt_use_auth ) + { + User *user = 0; + + if ( strcmp( config.auth_relay, "none" ) == 0 ) + { + if ( *username ) + { + user = zmLoadUser( username ); + } + } + else + { + //if ( strcmp( config.auth_relay, "hashed" ) == 0 ) + { + if ( *auth ) + { + user = zmLoadAuthUser( auth, config.auth_hash_ips ); + } + } + //else if ( strcmp( config.auth_relay, "plain" ) == 0 ) + { + if ( *username && *password ) + { + user = zmLoadUser( username, password ); + } + } + } + if ( !user ) + { + Error( "Unable to authenticate user" ); + logTerm(); + zmDbClose(); + return( -1 ); + } + ValidateAccess( user, monitor_id ); + } + + if ( ! mode ) { + if ( source == ZMS_MONITOR ) { + mode = StreamBase::STREAM; + } else { + // when getting from an event, if a frame_id is specified, then default to single, otherwise stream + if ( frame_id ) { + mode = StreamBase::SINGLE; + } else { + mode = StreamBase::STREAM; + } + } + } + + setbuf( stdout, 0 ); + if ( nph ) + { + fprintf( stdout, "HTTP/1.0 200 OK\r\n" ); + } + fprintf( stdout, "Server: ZoneMinder Video Server/%s\r\n", ZM_VERSION ); + + time_t now = time( 0 ); + char date_string[64]; + strftime( date_string, sizeof(date_string)-1, "%a, %d %b %Y %H:%M:%S GMT", gmtime( &now ) ); + + fprintf( stdout, "Expires: Mon, 26 Jul 1997 05:00:00 GMT\r\n" ); + fprintf( stdout, "Last-Modified: %s\r\n", date_string ); + fprintf( stdout, "Cache-Control: no-store, no-cache, must-revalidate\r\n" ); + fprintf( stdout, "Cache-Control: post-check=0, pre-check=0\r\n" ); + fprintf( stdout, "Pragma: no-cache\r\n"); + // Removed as causing more problems than it fixed. + //if ( !nph ) + //{ + //fprintf( stdout, "Content-Length: 0\r\n"); + //} + + if ( source == ZMS_MONITOR ) + { + MonitorStream stream; + stream.setStreamScale( scale ); + stream.setStreamReplayRate( rate ); + stream.setStreamMaxFPS( maxfps ); + stream.setStreamTTL( ttl ); + stream.setStreamQueue( connkey ); + stream.setStreamBuffer( playback_buffer ); + if ( ! stream.setStreamStart( monitor_id ) ) { + Error( "Unable to connect to zmc process for monitor %d", monitor_id ); + fprintf( stderr, "Unable to connect to zmc process. Please ensure that it is running." ); + logTerm(); + zmDbClose(); + return( -1 ); + } + + stream.setStreamMode( mode ); + stream.setStreamType( type ); + + if ( type == StreamBase::MPEG ) + { +#if HAVE_LIBAVCODEC + stream.setStreamFormat( format ); + stream.setStreamBitrate( bitrate ); + stream.setStreamType( type ); +#else // HAVE_LIBAVCODEC + Error( "MPEG streaming of '%s' attempted while disabled", query ); + fprintf( stderr, "MPEG streaming is disabled.\nYou should configure with the --with-ffmpeg option and rebuild to use this functionality.\n" ); + logTerm(); + zmDbClose(); + return( -1 ); +#endif // HAVE_LIBAVCODEC + } + stream.runStream(); + } + else if ( source == ZMS_EVENT ) + { + EventStream stream; + stream.setStreamScale( scale ); + stream.setStreamReplayRate( rate ); + stream.setStreamMaxFPS( maxfps ); + stream.setStreamMode( replay ); + stream.setStreamQueue( connkey ); + if ( monitor_id && event_time ) + { + stream.setStreamStart( monitor_id, event_time ); + } + else + { + stream.setStreamStart( event_id, frame_id ); + } + stream.setStreamMode( mode ); + stream.setStreamType( type ); + if ( type == StreamBase::MPEG ) + { +#if HAVE_LIBAVCODEC + stream.setStreamFormat( format ); + stream.setStreamBitrate( bitrate ); +#else // HAVE_LIBAVCODEC + Error( "MPEG streaming of '%s' attempted while disabled", query ); + fprintf( stderr, "MPEG streaming is disabled.\nYou should ensure the ffmpeg libraries are installed and detected and rebuild to use this functionality.\n" ); + logTerm(); + zmDbClose(); + return( -1 ); +#endif // HAVE_LIBAVCODEC + } + stream.runStream(); + } + + logTerm(); + zmDbClose(); + + return( 0 ); } diff --git a/src/zmstreamer.cpp b/src/zmstreamer.cpp index 1166cb6a2..0f64b7f6d 100644 --- a/src/zmstreamer.cpp +++ b/src/zmstreamer.cpp @@ -21,34 +21,34 @@ /* -=head1 NAME + =head1 NAME -zmstreamer - eyeZM video streamer + zmstreamer - eyeZM video streamer -=head1 SYNOPSIS + =head1 SYNOPSIS - zmstreamer -e - zmstreamer -o - zmstreamer -u - zmstreamer -f - zmstreamer -s - zmstreamer -b - zmstreamer -m - zmstreamer -d - zmstreamer -i - zmstreamer -? - zmstreamer -h - zmstreamer -v + zmstreamer -e + zmstreamer -o + zmstreamer -u + zmstreamer -f + zmstreamer -s + zmstreamer -b + zmstreamer -m + zmstreamer -d + zmstreamer -i + zmstreamer -? + zmstreamer -h + zmstreamer -v -=head1 DESCRIPTION + =head1 DESCRIPTION -*DEPRECIATED* The xml skin and all files associated with the xml skin are now -depreciated. Please use the ZoneMinder API instead. + *DEPRECIATED* The xml skin and all files associated with the xml skin are now + depreciated. Please use the ZoneMinder API instead. -This binary works in conjunction with the XML skin to stream video to iPhones -running the eyeZm app. + This binary works in conjunction with the XML skin to stream video to iPhones + running the eyeZm app. -=head1 OPTIONS + =head1 OPTIONS -e - Specify output mode: mpeg/jpg/zip/single/raw. -o - Specify output format. @@ -61,9 +61,9 @@ running the eyeZm app. -i, -?, -h - Display usage information -v - Print the installed version of ZoneMinder -=cut + =cut -*/ + */ #include #include @@ -92,165 +92,165 @@ running the eyeZm app. #define ZMS_DEFAULT_BUFFER 1000 int main(int argc, char** argv) { - self = argv[0]; - // Set initial values to the default values - int debug = ZMS_DEFAULT_DEBUG; - int id = ZMS_DEFAULT_ID; - int bitrate = ZMS_DEFAULT_BITRATE; - int scale = ZMS_DEFAULT_SCALE; - char mode[32]; - sprintf(mode, "%s", ZMS_DEFAULT_MODE); - char format[32]; - sprintf(format, "%s", ZMS_DEFAULT_FORMAT); - double maxfps = ZMS_DEFAULT_FPS; - int buffer = ZMS_DEFAULT_BUFFER; + self = argv[0]; + // Set initial values to the default values + int debug = ZMS_DEFAULT_DEBUG; + int id = ZMS_DEFAULT_ID; + int bitrate = ZMS_DEFAULT_BITRATE; + int scale = ZMS_DEFAULT_SCALE; + char mode[32]; + sprintf(mode, "%s", ZMS_DEFAULT_MODE); + char format[32]; + sprintf(format, "%s", ZMS_DEFAULT_FORMAT); + double maxfps = ZMS_DEFAULT_FPS; + int buffer = ZMS_DEFAULT_BUFFER; - // Parse command-line options - int arg; - while ((arg = getopt(argc, argv, OPTIONS)) != -1) { - switch (arg) { - case 'e': - sprintf(mode, "%s", optarg); - break; - case 'o': - sprintf(format, "%s", optarg); - break; - case 'u': - buffer = atoi(optarg); - break; - case 'f': - maxfps = atof(optarg); - break; - case 's': - scale = atoi(optarg); - break; - case 'b': - bitrate = atoi(optarg); - break; - case 'm': - id = atoi(optarg); - break; - case 'd': - debug = atoi(optarg); - break; - case 'h': - case 'i': - case '?': - printf("-e : Specify output mode: mpeg/jpg/zip/single/raw. Default = %s\n", ZMS_DEFAULT_MODE); - printf("-o : Specify output format. Default = %s\n", ZMS_DEFAULT_FORMAT); - printf("-u : Specify buffer size in ms. Default = %d\n", ZMS_DEFAULT_BUFFER); - printf("-f : Specify maximum framerate. Default = %lf\n", ZMS_DEFAULT_FPS); - printf("-s : Specify scale. Default = %d\n", ZMS_DEFAULT_SCALE); - printf("-b : Specify bitrate. Default = %d\n", ZMS_DEFAULT_BITRATE); - printf("-m : Specify monitor id. Default = %d\n", ZMS_DEFAULT_ID); - printf("-d : 0 = off, 1 = no streaming, 2 = with streaming. Default = 0\n"); - printf("-i or -? or -h: This information\n"); - printf("-v : This installed version of ZoneMinder\n"); - return EXIT_SUCCESS; - case 'v': - std::cout << ZM_VERSION << "\n"; - exit(0); - } + // Parse command-line options + int arg; + while ((arg = getopt(argc, argv, OPTIONS)) != -1) { + switch (arg) { + case 'e': + sprintf(mode, "%s", optarg); + break; + case 'o': + sprintf(format, "%s", optarg); + break; + case 'u': + buffer = atoi(optarg); + break; + case 'f': + maxfps = atof(optarg); + break; + case 's': + scale = atoi(optarg); + break; + case 'b': + bitrate = atoi(optarg); + break; + case 'm': + id = atoi(optarg); + break; + case 'd': + debug = atoi(optarg); + break; + case 'h': + case 'i': + case '?': + printf("-e : Specify output mode: mpeg/jpg/zip/single/raw. Default = %s\n", ZMS_DEFAULT_MODE); + printf("-o : Specify output format. Default = %s\n", ZMS_DEFAULT_FORMAT); + printf("-u : Specify buffer size in ms. Default = %d\n", ZMS_DEFAULT_BUFFER); + printf("-f : Specify maximum framerate. Default = %lf\n", ZMS_DEFAULT_FPS); + printf("-s : Specify scale. Default = %d\n", ZMS_DEFAULT_SCALE); + printf("-b : Specify bitrate. Default = %d\n", ZMS_DEFAULT_BITRATE); + printf("-m : Specify monitor id. Default = %d\n", ZMS_DEFAULT_ID); + printf("-d : 0 = off, 1 = no streaming, 2 = with streaming. Default = 0\n"); + printf("-i or -? or -h: This information\n"); + printf("-v : This installed version of ZoneMinder\n"); + return EXIT_SUCCESS; + case 'v': + std::cout << ZM_VERSION << "\n"; + exit(0); } + } - // Set stream type - StreamBase::StreamType streamtype; - StreamBase::StreamMode streammode = StreamBase::STREAM; + // Set stream type + StreamBase::StreamType streamtype; + StreamBase::StreamMode streammode = StreamBase::STREAM; - if (!strcasecmp("raw", mode)) - streamtype = StreamBase::RAW; - else if (!strcasecmp("mpeg", mode)) - streamtype = StreamBase::MPEG; - else if (!strcasecmp("jpg", mode)) - streamtype = StreamBase::JPEG; - else if (!strcasecmp("single", mode)) - streammode = StreamBase::SINGLE; - else if (!strcasecmp("zip", mode)) - streamtype = StreamBase::ZIP; - else if (!strcasecmp("mpeg", mode)) - streamtype = StreamBase::MPEG; - else - streamtype = StreamBase::MPEG; + if (!strcasecmp("raw", mode)) + streamtype = StreamBase::RAW; + else if (!strcasecmp("mpeg", mode)) + streamtype = StreamBase::MPEG; + else if (!strcasecmp("jpg", mode)) + streamtype = StreamBase::JPEG; + else if (!strcasecmp("single", mode)) + streammode = StreamBase::SINGLE; + else if (!strcasecmp("zip", mode)) + streamtype = StreamBase::ZIP; + else if (!strcasecmp("mpeg", mode)) + streamtype = StreamBase::MPEG; + else + streamtype = StreamBase::MPEG; - if (debug) { - // Show stream parameters - printf("Stream parameters:\n"); - switch (streamtype) { - case StreamBase::MPEG: - printf("Output mode (-e) = %s\n", "mpeg"); - printf("Output format (-o) = %s\n", format); - break; - default: - printf("Output mode (-e) = %s\n", mode); - } - printf("Buffer size (-u) = %d ms\n", buffer); - printf("Maximum FPS (-f) = %lf FPS\n", maxfps); - printf("Scale (-s) = %d%%\n", scale); - printf("Bitrate (-b) = %d bps\n", bitrate); - printf("Monitor Id (-m) = %d\n", id); + if (debug) { + // Show stream parameters + printf("Stream parameters:\n"); + switch (streamtype) { + case StreamBase::MPEG: + printf("Output mode (-e) = %s\n", "mpeg"); + printf("Output format (-o) = %s\n", format); + break; + default: + printf("Output mode (-e) = %s\n", mode); } + printf("Buffer size (-u) = %d ms\n", buffer); + printf("Maximum FPS (-f) = %lf FPS\n", maxfps); + printf("Scale (-s) = %d%%\n", scale); + printf("Bitrate (-b) = %d bps\n", bitrate); + printf("Monitor Id (-m) = %d\n", id); + } - if (debug) { - // Set ZM debugger to print to stdout - printf("Setting up ZoneMinder debugger to print to stdout..."); - setenv("ZM_DBG_PRINT", "1", 1); - printf("Done.\n"); - } - - // Loading ZM configurations - printf("Loading ZoneMinder configurations..."); - zmLoadConfig(); + if (debug) { + // Set ZM debugger to print to stdout + printf("Setting up ZoneMinder debugger to print to stdout..."); + setenv("ZM_DBG_PRINT", "1", 1); printf("Done.\n"); + } - logInit("zmstreamer"); - - ssedetect(); + // Loading ZM configurations + printf("Loading ZoneMinder configurations..."); + zmLoadConfig(); + printf("Done.\n"); - // Setting stream parameters - MonitorStream stream; - stream.setStreamScale(scale); // default = 100 (scale) - stream.setStreamReplayRate(100); // default = 100 (rate) - stream.setStreamMaxFPS(maxfps); // default = 10 (maxfps) - if (debug) stream.setStreamTTL(1); - else stream.setStreamTTL(0); // default = 0 (ttl) - stream.setStreamQueue(0); // default = 0 (connkey) - stream.setStreamBuffer(buffer); // default = 0 (buffer) - stream.setStreamStart(id); // default = 0 (monitor_id) - stream.setStreamType(streamtype); - if (streamtype == StreamBase::MPEG) { + logInit("zmstreamer"); + + ssedetect(); + + // Setting stream parameters + MonitorStream stream; + stream.setStreamScale(scale); // default = 100 (scale) + stream.setStreamReplayRate(100); // default = 100 (rate) + stream.setStreamMaxFPS(maxfps); // default = 10 (maxfps) + if (debug) stream.setStreamTTL(1); + else stream.setStreamTTL(0); // default = 0 (ttl) + stream.setStreamQueue(0); // default = 0 (connkey) + stream.setStreamBuffer(buffer); // default = 0 (buffer) + stream.setStreamStart(id); // default = 0 (monitor_id) + stream.setStreamType(streamtype); + if (streamtype == StreamBase::MPEG) { #if HAVE_LIBAVCODEC - if (debug) printf("HAVE_LIBAVCODEC is set\n"); - stream.setStreamFormat(format); // default = "" (format) - stream.setStreamBitrate(bitrate); // default = 100000 (bitrate) + if (debug) printf("HAVE_LIBAVCODEC is set\n"); + stream.setStreamFormat(format); // default = "" (format) + stream.setStreamBitrate(bitrate); // default = 100000 (bitrate) #else - fprintf(stderr, "MPEG streaming is disabled.\nYou should configure with the --with-ffmpeg option and rebuild to use this functionality.\n"); - logTerm(); - zmDbClose(); - return EXIT_FAILURE; -#endif - } - - if (debug != 1) { - if (debug) printf("Running stream..."); - - // Output headers - fprintf(stdout, "Server: ZoneMinder Video Server/%s\r\n", ZM_VERSION); - time_t now = time(0); - char date_string[64]; - strftime(date_string, sizeof (date_string) - 1, "%a, %d %b %Y %H:%M:%S GMT", gmtime(&now)); - fprintf(stdout, "Expires: Mon, 26 Jul 1997 05:00:00 GMT\r\n"); - fprintf(stdout, "Last-Modified: %s\r\n", date_string); - fprintf(stdout, "Cache-Control: no-store, no-cache, must-revalidate\r\n"); - fprintf(stdout, "Cache-Control: post-check=0, pre-check=0\r\n"); - fprintf(stdout, "Pragma: no-cache\r\n"); - - // Run stream - stream.runStream(); - } - if (debug) printf("Done.\n"); - + fprintf(stderr, "MPEG streaming is disabled.\nYou should configure with the --with-ffmpeg option and rebuild to use this functionality.\n"); logTerm(); zmDbClose(); + return EXIT_FAILURE; +#endif + } - return (EXIT_SUCCESS); + if (debug != 1) { + if (debug) printf("Running stream..."); + + // Output headers + fprintf(stdout, "Server: ZoneMinder Video Server/%s\r\n", ZM_VERSION); + time_t now = time(0); + char date_string[64]; + strftime(date_string, sizeof (date_string) - 1, "%a, %d %b %Y %H:%M:%S GMT", gmtime(&now)); + fprintf(stdout, "Expires: Mon, 26 Jul 1997 05:00:00 GMT\r\n"); + fprintf(stdout, "Last-Modified: %s\r\n", date_string); + fprintf(stdout, "Cache-Control: no-store, no-cache, must-revalidate\r\n"); + fprintf(stdout, "Cache-Control: post-check=0, pre-check=0\r\n"); + fprintf(stdout, "Pragma: no-cache\r\n"); + + // Run stream + stream.runStream(); + } + if (debug) printf("Done.\n"); + + logTerm(); + zmDbClose(); + + return (EXIT_SUCCESS); }