From 2901043bc971fb3bde285148d5cd65a3e79ce00f Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 30 Jul 2015 14:16:04 -0400 Subject: [PATCH] re-organize streams to support source=event&mode=single from zms. --- src/zm_event.cpp | 32 +++++++------- src/zm_event.h | 3 +- src/zm_monitor.cpp | 16 +++---- src/zm_stream.cpp | 2 +- src/zm_stream.h | 13 ++++-- src/zms.cpp | 84 +++++++++++++++++++++---------------- src/zmstreamer.cpp | 20 +++++---- web/api/app/Config/core.php | 4 +- 8 files changed, 99 insertions(+), 75 deletions(-) diff --git a/src/zm_event.cpp b/src/zm_event.cpp index 3e723fa48..16f9a0c41 100644 --- a/src/zm_event.cpp +++ b/src/zm_event.cpp @@ -847,7 +847,7 @@ bool EventStream::loadEventData( int event_id ) mysql_free_result( result ); - if ( forceEventChange || mode == MODE_ALL_GAPLESS ) + if ( forceEventChange || mode == ALL_GAPLESS ) { if ( replay_rate > 0 ) curr_stream_time = event_data->frames[0].timestamp; @@ -885,7 +885,7 @@ void EventStream::processCommand( const CmdMsg *msg ) } // If we are in single event mode and at the last frame, replay the current event - if ( (mode == MODE_SINGLE) && (curr_frame_id == event_data->frame_count) ) + if ( (mode == SINGLE) && (curr_frame_id == event_data->frame_count) ) curr_frame_id = 1; replay_rate = ZM_RATE_BASE; @@ -1148,7 +1148,7 @@ void EventStream::checkEventLoaded() if ( reload_event ) { - if ( forceEventChange || mode != MODE_SINGLE ) + if ( forceEventChange || mode != SINGLE ) { //Info( "SQL:%s", sql ); if ( mysql_query( &dbconn, sql ) ) @@ -1218,7 +1218,7 @@ bool EventStream::sendFrame( int delta_us ) snprintf( filepath, sizeof(filepath), Event::capture_file_format, event_data->path, curr_frame_id ); #if HAVE_LIBAVCODEC - if ( type == STREAM_MPEG ) + if ( type == MPEG ) { Image image( filepath ); @@ -1244,7 +1244,7 @@ bool EventStream::sendFrame( int delta_us ) fprintf( stdout, "--ZoneMinderFrame\r\n" ); - if ( type != STREAM_JPEG ) + if ( type != JPEG ) send_raw = false; if ( send_raw ) @@ -1272,10 +1272,10 @@ bool EventStream::sendFrame( int delta_us ) switch( type ) { - case STREAM_JPEG : + case JPEG : send_image->EncodeJpeg( img_buffer, &img_buffer_size ); break; - case STREAM_ZIP : + case ZIP : #if HAVE_ZLIB_H unsigned long zip_buffer_size; send_image->Zip( img_buffer, &zip_buffer_size ); @@ -1283,9 +1283,9 @@ bool EventStream::sendFrame( int delta_us ) break; #else Error("zlib is required for zipped images. Falling back to raw image"); - type = STREAM_RAW; + type = RAW; #endif // HAVE_ZLIB_H - case STREAM_RAW : + case RAW : img_buffer = (uint8_t*)(send_image->Buffer()); img_buffer_size = send_image->Size(); break; @@ -1297,13 +1297,13 @@ bool EventStream::sendFrame( int delta_us ) switch( type ) { - case STREAM_JPEG : + case JPEG : fprintf( stdout, "Content-Type: image/jpeg\r\n" ); break; - case STREAM_RAW : + case RAW : fprintf( stdout, "Content-Type: image/x-rgb\r\n" ); break; - case STREAM_ZIP : + case ZIP : fprintf( stdout, "Content-Type: image/x-rgbz\r\n" ); break; default : @@ -1357,7 +1357,7 @@ void EventStream::runStream() updateFrameRate( (double)event_data->frame_count/event_data->duration ); - if ( type == STREAM_JPEG ) + if ( mode == STREAM ) fprintf( stdout, "Content-Type: multipart/x-mixed-replace;boundary=ZoneMinderFrame\r\n\r\n" ); if ( !event_data ) @@ -1462,7 +1462,7 @@ void EventStream::runStream() if ( !paused ) { curr_frame_id += replay_rate>0?1:-1; - if ( send_frame && type != STREAM_MPEG ) + if ( send_frame && type != MPEG ) { Debug( 3, "dUs: %d", delta_us ); usleep( delta_us ); @@ -1472,9 +1472,9 @@ void EventStream::runStream() { usleep( (unsigned long)((1000000 * ZM_RATE_BASE)/((base_fps?base_fps:1)*abs(replay_rate*2))) ); } - } + } // end while ! terminate #if HAVE_LIBAVCODEC - if ( type == STREAM_MPEG ) + if ( type == MPEG ) delete vid_stream; #endif // HAVE_LIBAVCODEC diff --git a/src/zm_event.h b/src/zm_event.h index f50a5bf06..43e68c329 100644 --- a/src/zm_event.h +++ b/src/zm_event.h @@ -190,7 +190,6 @@ public: class EventStream : public StreamBase { public: - typedef enum { MODE_SINGLE, MODE_ALL, MODE_ALL_GAPLESS } StreamMode; protected: struct FrameData { @@ -216,7 +215,7 @@ protected: protected: static const int STREAM_PAUSE_WAIT = 250000; // Microseconds - static const StreamMode DEFAULT_MODE = MODE_SINGLE; + static const StreamMode DEFAULT_MODE = SINGLE; protected: StreamMode mode; diff --git a/src/zm_monitor.cpp b/src/zm_monitor.cpp index 906ca68f6..97407fbaa 100644 --- a/src/zm_monitor.cpp +++ b/src/zm_monitor.cpp @@ -3788,7 +3788,7 @@ bool MonitorStream::sendFrame( const char *filepath, struct timeval *timestamp ) { bool send_raw = ((scale>=ZM_SCALE_BASE)&&(zoom==ZM_SCALE_BASE)); - if ( type != STREAM_JPEG ) + if ( type != JPEG ) send_raw = false; if ( !config.timestamp_on_capture && timestamp ) send_raw = false; @@ -3856,7 +3856,7 @@ bool MonitorStream::sendFrame( Image *image, struct timeval *timestamp ) monitor->TimestampImage( send_image, timestamp ); #if HAVE_LIBAVCODEC - if ( type == STREAM_MPEG ) + if ( type == MPEG ) { if ( !vid_stream ) { @@ -3886,16 +3886,16 @@ bool MonitorStream::sendFrame( Image *image, struct timeval *timestamp ) fprintf( stdout, "--ZoneMinderFrame\r\n" ); switch( type ) { - case STREAM_JPEG : + case JPEG : send_image->EncodeJpeg( img_buffer, &img_buffer_size ); fprintf( stdout, "Content-Type: image/jpeg\r\n" ); break; - case STREAM_RAW : + case RAW : fprintf( stdout, "Content-Type: image/x-rgb\r\n" ); img_buffer = (uint8_t*)send_image->Buffer(); img_buffer_size = send_image->Size(); break; - case STREAM_ZIP : + case ZIP : fprintf( stdout, "Content-Type: image/x-rgbz\r\n" ); unsigned long zip_buffer_size; send_image->Zip( img_buffer, &zip_buffer_size ); @@ -3924,14 +3924,14 @@ bool MonitorStream::sendFrame( Image *image, struct timeval *timestamp ) maxfps /= 1.5; Error( "Frame send time %d msec too slow, throttling maxfps to %.2f", frameSendTime, maxfps ); } - } + } // endif HAVE_LIBAV and type==MPEG last_frame_sent = TV_2_FLOAT( now ); return( true ); } void MonitorStream::runStream() { - if ( type == STREAM_SINGLE ) + if ( mode == SINGLE ) { // Not yet migrated over to stream class monitor->SingleImage( scale ); @@ -3944,7 +3944,7 @@ void MonitorStream::runStream() updateFrameRate( monitor->GetFPS() ); - if ( type == STREAM_JPEG ) + if ( type == JPEG ) fprintf( stdout, "Content-Type: multipart/x-mixed-replace;boundary=ZoneMinderFrame\r\n\r\n" ); int last_read_index = monitor->image_buffer_count; diff --git a/src/zm_stream.cpp b/src/zm_stream.cpp index 30a420bb1..4ee38aeb0 100644 --- a/src/zm_stream.cpp +++ b/src/zm_stream.cpp @@ -249,7 +249,7 @@ bool StreamBase::sendTextFrame( const char *frame_text ) image.Scale( scale ); } #if HAVE_LIBAVCODEC - if ( type == STREAM_MPEG ) + if ( type == MPEG ) { if ( !vid_stream ) { diff --git a/src/zm_stream.h b/src/zm_stream.h index ef442ab8e..5f8f0f9c1 100644 --- a/src/zm_stream.h +++ b/src/zm_stream.h @@ -33,12 +33,13 @@ class Monitor; class StreamBase { public: - typedef enum { STREAM_JPEG, STREAM_RAW, STREAM_ZIP, STREAM_SINGLE, STREAM_MPEG } StreamType; + typedef enum { JPEG, RAW, ZIP, MPEG } StreamType; + typedef enum { SINGLE, STREAM, ALL, ALL_GAPLESS } StreamMode; protected: static const int MAX_STREAM_DELAY = 5; // Seconds - static const StreamType DEFAULT_TYPE = STREAM_JPEG; + static const StreamType DEFAULT_TYPE = JPEG; enum { DEFAULT_RATE=ZM_RATE_BASE }; enum { DEFAULT_SCALE=ZM_SCALE_BASE }; enum { DEFAULT_ZOOM=ZM_SCALE_BASE }; @@ -63,7 +64,8 @@ protected: Monitor *monitor; StreamType type; - const char *format; + StreamMode mode; + const char *format; // used to pass to ffmpeg libs int replay_rate; int scale; int zoom; @@ -113,6 +115,7 @@ public: monitor = 0; type = DEFAULT_TYPE; + mode = STREAM; format = ""; replay_rate = DEFAULT_RATE; scale = DEFAULT_SCALE; @@ -145,6 +148,10 @@ public: void setStreamType( StreamType p_type ) { type = p_type; + } + void setStreamMode( StreamMode p_mode ) + { + mode = p_mode; } void setStreamFormat( const char *p_format ) { diff --git a/src/zms.cpp b/src/zms.cpp index 9a7fcc941..a29f871a4 100644 --- a/src/zms.cpp +++ b/src/zms.cpp @@ -57,8 +57,9 @@ int main( int argc, const char *argv[] ) srand( getpid() * time( 0 ) ); enum { ZMS_MONITOR, ZMS_EVENT } source = ZMS_MONITOR; - enum { ZMS_JPEG, ZMS_MPEG, ZMS_RAW, ZMS_ZIP, ZMS_SINGLE } mode = ZMS_JPEG; - char format[32] = ""; + StreamBase::StreamMode mode = StreamBase::STREAM; // 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; @@ -68,7 +69,7 @@ int main( int argc, const char *argv[] ) double maxfps = 10.0; unsigned int bitrate = 100000; unsigned int ttl = 0; - EventStream::StreamMode replay = EventStream::MODE_SINGLE; + EventStream::StreamMode replay = EventStream::SINGLE; char username[64] = ""; char password[64] = ""; char auth[64] = ""; @@ -124,13 +125,36 @@ int main( int argc, const char *argv[] ) } else if ( !strcmp( name, "mode" ) ) { - mode = !strcmp( value, "jpeg" )?ZMS_JPEG:ZMS_MPEG; - mode = !strcmp( value, "raw" )?ZMS_RAW:mode; - mode = !strcmp( value, "zip" )?ZMS_ZIP:mode; - mode = !strcmp( value, "single" )?ZMS_SINGLE: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" ) ) - strncpy( format, value, sizeof(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" ) ) @@ -151,8 +175,8 @@ int main( int argc, const char *argv[] ) ttl = atoi(value); else if ( !strcmp( name, "replay" ) ) { - replay = !strcmp( value, "gapless" )?EventStream::MODE_ALL_GAPLESS:EventStream::MODE_SINGLE; - replay = !strcmp( value, "all" )?EventStream::MODE_ALL: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); @@ -269,28 +293,15 @@ int main( int argc, const char *argv[] ) return( -1 ); } - if ( mode == ZMS_JPEG ) - { - stream.setStreamType( MonitorStream::STREAM_JPEG ); - } - else if ( mode == ZMS_RAW ) - { - stream.setStreamType( MonitorStream::STREAM_RAW ); - } - else if ( mode == ZMS_ZIP ) - { - stream.setStreamType( MonitorStream::STREAM_ZIP ); - } - else if ( mode == ZMS_SINGLE ) - { - stream.setStreamType( MonitorStream::STREAM_SINGLE ); - } - else + stream.setStreamMode( mode ); + stream.setStreamType( type ); + + if ( type == StreamBase::MPEG ) { #if HAVE_LIBAVCODEC stream.setStreamFormat( format ); stream.setStreamBitrate( bitrate ); - stream.setStreamType( MonitorStream::STREAM_MPEG ); + 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" ); @@ -317,16 +328,13 @@ int main( int argc, const char *argv[] ) { stream.setStreamStart( event_id, frame_id ); } - if ( mode == ZMS_JPEG ) - { - stream.setStreamType( EventStream::STREAM_JPEG ); - } - else + stream.setStreamMode( mode ); + stream.setStreamType( type ); + if ( type == StreamBase::MPEG ) { #if HAVE_LIBAVCODEC stream.setStreamFormat( format ); stream.setStreamBitrate( bitrate ); - stream.setStreamType( EventStream::STREAM_MPEG ); #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" ); @@ -334,7 +342,13 @@ int main( int argc, const char *argv[] ) zmDbClose(); return( -1 ); #endif // HAVE_LIBAVCODEC - } + } else { + Error( "Unknown format", query ); + fprintf( stderr, "Unknown format.\n" ); + logTerm(); + zmDbClose(); + return( -1 ); + } stream.runStream(); } diff --git a/src/zmstreamer.cpp b/src/zmstreamer.cpp index a16e50704..1166cb6a2 100644 --- a/src/zmstreamer.cpp +++ b/src/zmstreamer.cpp @@ -155,24 +155,28 @@ int main(int argc, char** argv) { // Set stream type StreamBase::StreamType streamtype; + StreamBase::StreamMode streammode = StreamBase::STREAM; + if (!strcasecmp("raw", mode)) - streamtype = MonitorStream::STREAM_RAW; + streamtype = StreamBase::RAW; else if (!strcasecmp("mpeg", mode)) - streamtype = MonitorStream::STREAM_MPEG; + streamtype = StreamBase::MPEG; else if (!strcasecmp("jpg", mode)) - streamtype = MonitorStream::STREAM_JPEG; + streamtype = StreamBase::JPEG; else if (!strcasecmp("single", mode)) - streamtype = MonitorStream::STREAM_SINGLE; + streammode = StreamBase::SINGLE; else if (!strcasecmp("zip", mode)) - streamtype = MonitorStream::STREAM_ZIP; + streamtype = StreamBase::ZIP; + else if (!strcasecmp("mpeg", mode)) + streamtype = StreamBase::MPEG; else - streamtype = MonitorStream::STREAM_MPEG; + streamtype = StreamBase::MPEG; if (debug) { // Show stream parameters printf("Stream parameters:\n"); switch (streamtype) { - case MonitorStream::STREAM_MPEG: + case StreamBase::MPEG: printf("Output mode (-e) = %s\n", "mpeg"); printf("Output format (-o) = %s\n", format); break; @@ -213,7 +217,7 @@ int main(int argc, char** argv) { stream.setStreamBuffer(buffer); // default = 0 (buffer) stream.setStreamStart(id); // default = 0 (monitor_id) stream.setStreamType(streamtype); - if (streamtype == MonitorStream::STREAM_MPEG) { + if (streamtype == StreamBase::MPEG) { #if HAVE_LIBAVCODEC if (debug) printf("HAVE_LIBAVCODEC is set\n"); stream.setStreamFormat(format); // default = "" (format) diff --git a/web/api/app/Config/core.php b/web/api/app/Config/core.php index 436cf8d60..5d8f10f51 100644 --- a/web/api/app/Config/core.php +++ b/web/api/app/Config/core.php @@ -222,12 +222,12 @@ /** * A random string used in security hashing methods. */ - Configure::write('Security.salt', 'Q0MjGG2xRQEhJVQR85WhFJKI7f2St8RYMlVR7GNQ'); + Configure::write('Security.salt', 'dhvuDdqOdgzivhu3Cr1pTAzt0z27NygqxSu7NiYw'); /** * A random numeric string (digits only) used to encrypt/decrypt strings. */ - Configure::write('Security.cipherSeed', '02670120062639232092038865362'); + Configure::write('Security.cipherSeed', '38170258349803886784814175156'); /** * Apply timestamps with the last modified time to static assets (js, css, images).