re-organize streams to support source=event&mode=single from zms.

This commit is contained in:
Isaac Connor 2015-07-30 14:16:04 -04:00
parent a64bbd0b56
commit 2901043bc9
8 changed files with 99 additions and 75 deletions

View File

@ -847,7 +847,7 @@ bool EventStream::loadEventData( int event_id )
mysql_free_result( result ); mysql_free_result( result );
if ( forceEventChange || mode == MODE_ALL_GAPLESS ) if ( forceEventChange || mode == ALL_GAPLESS )
{ {
if ( replay_rate > 0 ) if ( replay_rate > 0 )
curr_stream_time = event_data->frames[0].timestamp; 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 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; curr_frame_id = 1;
replay_rate = ZM_RATE_BASE; replay_rate = ZM_RATE_BASE;
@ -1148,7 +1148,7 @@ void EventStream::checkEventLoaded()
if ( reload_event ) if ( reload_event )
{ {
if ( forceEventChange || mode != MODE_SINGLE ) if ( forceEventChange || mode != SINGLE )
{ {
//Info( "SQL:%s", sql ); //Info( "SQL:%s", sql );
if ( mysql_query( &dbconn, 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 ); snprintf( filepath, sizeof(filepath), Event::capture_file_format, event_data->path, curr_frame_id );
#if HAVE_LIBAVCODEC #if HAVE_LIBAVCODEC
if ( type == STREAM_MPEG ) if ( type == MPEG )
{ {
Image image( filepath ); Image image( filepath );
@ -1244,7 +1244,7 @@ bool EventStream::sendFrame( int delta_us )
fprintf( stdout, "--ZoneMinderFrame\r\n" ); fprintf( stdout, "--ZoneMinderFrame\r\n" );
if ( type != STREAM_JPEG ) if ( type != JPEG )
send_raw = false; send_raw = false;
if ( send_raw ) if ( send_raw )
@ -1272,10 +1272,10 @@ bool EventStream::sendFrame( int delta_us )
switch( type ) switch( type )
{ {
case STREAM_JPEG : case JPEG :
send_image->EncodeJpeg( img_buffer, &img_buffer_size ); send_image->EncodeJpeg( img_buffer, &img_buffer_size );
break; break;
case STREAM_ZIP : case ZIP :
#if HAVE_ZLIB_H #if HAVE_ZLIB_H
unsigned long zip_buffer_size; unsigned long zip_buffer_size;
send_image->Zip( img_buffer, &zip_buffer_size ); send_image->Zip( img_buffer, &zip_buffer_size );
@ -1283,9 +1283,9 @@ bool EventStream::sendFrame( int delta_us )
break; break;
#else #else
Error("zlib is required for zipped images. Falling back to raw image"); Error("zlib is required for zipped images. Falling back to raw image");
type = STREAM_RAW; type = RAW;
#endif // HAVE_ZLIB_H #endif // HAVE_ZLIB_H
case STREAM_RAW : case RAW :
img_buffer = (uint8_t*)(send_image->Buffer()); img_buffer = (uint8_t*)(send_image->Buffer());
img_buffer_size = send_image->Size(); img_buffer_size = send_image->Size();
break; break;
@ -1297,13 +1297,13 @@ bool EventStream::sendFrame( int delta_us )
switch( type ) switch( type )
{ {
case STREAM_JPEG : case JPEG :
fprintf( stdout, "Content-Type: image/jpeg\r\n" ); fprintf( stdout, "Content-Type: image/jpeg\r\n" );
break; break;
case STREAM_RAW : case RAW :
fprintf( stdout, "Content-Type: image/x-rgb\r\n" ); fprintf( stdout, "Content-Type: image/x-rgb\r\n" );
break; break;
case STREAM_ZIP : case ZIP :
fprintf( stdout, "Content-Type: image/x-rgbz\r\n" ); fprintf( stdout, "Content-Type: image/x-rgbz\r\n" );
break; break;
default : default :
@ -1357,7 +1357,7 @@ void EventStream::runStream()
updateFrameRate( (double)event_data->frame_count/event_data->duration ); 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" ); fprintf( stdout, "Content-Type: multipart/x-mixed-replace;boundary=ZoneMinderFrame\r\n\r\n" );
if ( !event_data ) if ( !event_data )
@ -1462,7 +1462,7 @@ void EventStream::runStream()
if ( !paused ) if ( !paused )
{ {
curr_frame_id += replay_rate>0?1:-1; 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 ); Debug( 3, "dUs: %d", delta_us );
usleep( 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))) ); usleep( (unsigned long)((1000000 * ZM_RATE_BASE)/((base_fps?base_fps:1)*abs(replay_rate*2))) );
} }
} } // end while ! terminate
#if HAVE_LIBAVCODEC #if HAVE_LIBAVCODEC
if ( type == STREAM_MPEG ) if ( type == MPEG )
delete vid_stream; delete vid_stream;
#endif // HAVE_LIBAVCODEC #endif // HAVE_LIBAVCODEC

View File

@ -190,7 +190,6 @@ public:
class EventStream : public StreamBase class EventStream : public StreamBase
{ {
public: public:
typedef enum { MODE_SINGLE, MODE_ALL, MODE_ALL_GAPLESS } StreamMode;
protected: protected:
struct FrameData { struct FrameData {
@ -216,7 +215,7 @@ protected:
protected: protected:
static const int STREAM_PAUSE_WAIT = 250000; // Microseconds static const int STREAM_PAUSE_WAIT = 250000; // Microseconds
static const StreamMode DEFAULT_MODE = MODE_SINGLE; static const StreamMode DEFAULT_MODE = SINGLE;
protected: protected:
StreamMode mode; StreamMode mode;

View File

@ -3788,7 +3788,7 @@ bool MonitorStream::sendFrame( const char *filepath, struct timeval *timestamp )
{ {
bool send_raw = ((scale>=ZM_SCALE_BASE)&&(zoom==ZM_SCALE_BASE)); bool send_raw = ((scale>=ZM_SCALE_BASE)&&(zoom==ZM_SCALE_BASE));
if ( type != STREAM_JPEG ) if ( type != JPEG )
send_raw = false; send_raw = false;
if ( !config.timestamp_on_capture && timestamp ) if ( !config.timestamp_on_capture && timestamp )
send_raw = false; send_raw = false;
@ -3856,7 +3856,7 @@ bool MonitorStream::sendFrame( Image *image, struct timeval *timestamp )
monitor->TimestampImage( send_image, timestamp ); monitor->TimestampImage( send_image, timestamp );
#if HAVE_LIBAVCODEC #if HAVE_LIBAVCODEC
if ( type == STREAM_MPEG ) if ( type == MPEG )
{ {
if ( !vid_stream ) if ( !vid_stream )
{ {
@ -3886,16 +3886,16 @@ bool MonitorStream::sendFrame( Image *image, struct timeval *timestamp )
fprintf( stdout, "--ZoneMinderFrame\r\n" ); fprintf( stdout, "--ZoneMinderFrame\r\n" );
switch( type ) switch( type )
{ {
case STREAM_JPEG : case JPEG :
send_image->EncodeJpeg( img_buffer, &img_buffer_size ); send_image->EncodeJpeg( img_buffer, &img_buffer_size );
fprintf( stdout, "Content-Type: image/jpeg\r\n" ); fprintf( stdout, "Content-Type: image/jpeg\r\n" );
break; break;
case STREAM_RAW : case RAW :
fprintf( stdout, "Content-Type: image/x-rgb\r\n" ); fprintf( stdout, "Content-Type: image/x-rgb\r\n" );
img_buffer = (uint8_t*)send_image->Buffer(); img_buffer = (uint8_t*)send_image->Buffer();
img_buffer_size = send_image->Size(); img_buffer_size = send_image->Size();
break; break;
case STREAM_ZIP : case ZIP :
fprintf( stdout, "Content-Type: image/x-rgbz\r\n" ); fprintf( stdout, "Content-Type: image/x-rgbz\r\n" );
unsigned long zip_buffer_size; unsigned long zip_buffer_size;
send_image->Zip( img_buffer, &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; maxfps /= 1.5;
Error( "Frame send time %d msec too slow, throttling maxfps to %.2f", frameSendTime, maxfps ); 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 ); last_frame_sent = TV_2_FLOAT( now );
return( true ); return( true );
} }
void MonitorStream::runStream() void MonitorStream::runStream()
{ {
if ( type == STREAM_SINGLE ) if ( mode == SINGLE )
{ {
// Not yet migrated over to stream class // Not yet migrated over to stream class
monitor->SingleImage( scale ); monitor->SingleImage( scale );
@ -3944,7 +3944,7 @@ void MonitorStream::runStream()
updateFrameRate( monitor->GetFPS() ); updateFrameRate( monitor->GetFPS() );
if ( type == STREAM_JPEG ) if ( type == JPEG )
fprintf( stdout, "Content-Type: multipart/x-mixed-replace;boundary=ZoneMinderFrame\r\n\r\n" ); fprintf( stdout, "Content-Type: multipart/x-mixed-replace;boundary=ZoneMinderFrame\r\n\r\n" );
int last_read_index = monitor->image_buffer_count; int last_read_index = monitor->image_buffer_count;

View File

@ -249,7 +249,7 @@ bool StreamBase::sendTextFrame( const char *frame_text )
image.Scale( scale ); image.Scale( scale );
} }
#if HAVE_LIBAVCODEC #if HAVE_LIBAVCODEC
if ( type == STREAM_MPEG ) if ( type == MPEG )
{ {
if ( !vid_stream ) if ( !vid_stream )
{ {

View File

@ -33,12 +33,13 @@ class Monitor;
class StreamBase class StreamBase
{ {
public: 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: protected:
static const int MAX_STREAM_DELAY = 5; // Seconds 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_RATE=ZM_RATE_BASE };
enum { DEFAULT_SCALE=ZM_SCALE_BASE }; enum { DEFAULT_SCALE=ZM_SCALE_BASE };
enum { DEFAULT_ZOOM=ZM_SCALE_BASE }; enum { DEFAULT_ZOOM=ZM_SCALE_BASE };
@ -63,7 +64,8 @@ protected:
Monitor *monitor; Monitor *monitor;
StreamType type; StreamType type;
const char *format; StreamMode mode;
const char *format; // used to pass to ffmpeg libs
int replay_rate; int replay_rate;
int scale; int scale;
int zoom; int zoom;
@ -113,6 +115,7 @@ public:
monitor = 0; monitor = 0;
type = DEFAULT_TYPE; type = DEFAULT_TYPE;
mode = STREAM;
format = ""; format = "";
replay_rate = DEFAULT_RATE; replay_rate = DEFAULT_RATE;
scale = DEFAULT_SCALE; scale = DEFAULT_SCALE;
@ -145,6 +148,10 @@ public:
void setStreamType( StreamType p_type ) void setStreamType( StreamType p_type )
{ {
type = p_type; type = p_type;
}
void setStreamMode( StreamMode p_mode )
{
mode = p_mode;
} }
void setStreamFormat( const char *p_format ) void setStreamFormat( const char *p_format )
{ {

View File

@ -57,8 +57,9 @@ int main( int argc, const char *argv[] )
srand( getpid() * time( 0 ) ); srand( getpid() * time( 0 ) );
enum { ZMS_MONITOR, ZMS_EVENT } source = ZMS_MONITOR; enum { ZMS_MONITOR, ZMS_EVENT } source = ZMS_MONITOR;
enum { ZMS_JPEG, ZMS_MPEG, ZMS_RAW, ZMS_ZIP, ZMS_SINGLE } mode = ZMS_JPEG; StreamBase::StreamMode mode = StreamBase::STREAM; // When streaming a live view or event, default to STREAM. If a frame is specified then default to SINGLE>
char format[32] = ""; StreamBase::StreamType type = StreamBase::JPEG;
char format[32] = ""; //used to specify format to ffmpeg libs
int monitor_id = 0; int monitor_id = 0;
time_t event_time = 0; time_t event_time = 0;
int event_id = 0; int event_id = 0;
@ -68,7 +69,7 @@ int main( int argc, const char *argv[] )
double maxfps = 10.0; double maxfps = 10.0;
unsigned int bitrate = 100000; unsigned int bitrate = 100000;
unsigned int ttl = 0; unsigned int ttl = 0;
EventStream::StreamMode replay = EventStream::MODE_SINGLE; EventStream::StreamMode replay = EventStream::SINGLE;
char username[64] = ""; char username[64] = "";
char password[64] = ""; char password[64] = "";
char auth[64] = ""; char auth[64] = "";
@ -124,13 +125,36 @@ int main( int argc, const char *argv[] )
} }
else if ( !strcmp( name, "mode" ) ) else if ( !strcmp( name, "mode" ) )
{ {
mode = !strcmp( value, "jpeg" )?ZMS_JPEG:ZMS_MPEG; if ( !strcmp( value, "single" ) ) {
mode = !strcmp( value, "raw" )?ZMS_RAW:mode; mode = StreamBase::SINGLE;
mode = !strcmp( value, "zip" )?ZMS_ZIP:mode; } else if ( !strcmp( value, "stream" ) ) {
mode = !strcmp( value, "single" )?ZMS_SINGLE:mode; 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" ) ) 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" ) ) else if ( !strcmp( name, "monitor" ) )
monitor_id = atoi( value ); monitor_id = atoi( value );
else if ( !strcmp( name, "time" ) ) else if ( !strcmp( name, "time" ) )
@ -151,8 +175,8 @@ int main( int argc, const char *argv[] )
ttl = atoi(value); ttl = atoi(value);
else if ( !strcmp( name, "replay" ) ) else if ( !strcmp( name, "replay" ) )
{ {
replay = !strcmp( value, "gapless" )?EventStream::MODE_ALL_GAPLESS:EventStream::MODE_SINGLE; replay = !strcmp( value, "gapless" )?StreamBase::ALL_GAPLESS:StreamBase::SINGLE;
replay = !strcmp( value, "all" )?EventStream::MODE_ALL:replay; replay = !strcmp( value, "all" )?StreamBase::ALL:replay;
} }
else if ( !strcmp( name, "connkey" ) ) else if ( !strcmp( name, "connkey" ) )
connkey = atoi(value); connkey = atoi(value);
@ -269,28 +293,15 @@ int main( int argc, const char *argv[] )
return( -1 ); return( -1 );
} }
if ( mode == ZMS_JPEG ) stream.setStreamMode( mode );
{ stream.setStreamType( type );
stream.setStreamType( MonitorStream::STREAM_JPEG );
} if ( type == StreamBase::MPEG )
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
{ {
#if HAVE_LIBAVCODEC #if HAVE_LIBAVCODEC
stream.setStreamFormat( format ); stream.setStreamFormat( format );
stream.setStreamBitrate( bitrate ); stream.setStreamBitrate( bitrate );
stream.setStreamType( MonitorStream::STREAM_MPEG ); stream.setStreamType( type );
#else // HAVE_LIBAVCODEC #else // HAVE_LIBAVCODEC
Error( "MPEG streaming of '%s' attempted while disabled", query ); 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" ); 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 ); stream.setStreamStart( event_id, frame_id );
} }
if ( mode == ZMS_JPEG ) stream.setStreamMode( mode );
{ stream.setStreamType( type );
stream.setStreamType( EventStream::STREAM_JPEG ); if ( type == StreamBase::MPEG )
}
else
{ {
#if HAVE_LIBAVCODEC #if HAVE_LIBAVCODEC
stream.setStreamFormat( format ); stream.setStreamFormat( format );
stream.setStreamBitrate( bitrate ); stream.setStreamBitrate( bitrate );
stream.setStreamType( EventStream::STREAM_MPEG );
#else // HAVE_LIBAVCODEC #else // HAVE_LIBAVCODEC
Error( "MPEG streaming of '%s' attempted while disabled", query ); 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" ); 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(); zmDbClose();
return( -1 ); return( -1 );
#endif // HAVE_LIBAVCODEC #endif // HAVE_LIBAVCODEC
} } else {
Error( "Unknown format", query );
fprintf( stderr, "Unknown format.\n" );
logTerm();
zmDbClose();
return( -1 );
}
stream.runStream(); stream.runStream();
} }

View File

@ -155,24 +155,28 @@ int main(int argc, char** argv) {
// Set stream type // Set stream type
StreamBase::StreamType streamtype; StreamBase::StreamType streamtype;
StreamBase::StreamMode streammode = StreamBase::STREAM;
if (!strcasecmp("raw", mode)) if (!strcasecmp("raw", mode))
streamtype = MonitorStream::STREAM_RAW; streamtype = StreamBase::RAW;
else if (!strcasecmp("mpeg", mode)) else if (!strcasecmp("mpeg", mode))
streamtype = MonitorStream::STREAM_MPEG; streamtype = StreamBase::MPEG;
else if (!strcasecmp("jpg", mode)) else if (!strcasecmp("jpg", mode))
streamtype = MonitorStream::STREAM_JPEG; streamtype = StreamBase::JPEG;
else if (!strcasecmp("single", mode)) else if (!strcasecmp("single", mode))
streamtype = MonitorStream::STREAM_SINGLE; streammode = StreamBase::SINGLE;
else if (!strcasecmp("zip", mode)) else if (!strcasecmp("zip", mode))
streamtype = MonitorStream::STREAM_ZIP; streamtype = StreamBase::ZIP;
else if (!strcasecmp("mpeg", mode))
streamtype = StreamBase::MPEG;
else else
streamtype = MonitorStream::STREAM_MPEG; streamtype = StreamBase::MPEG;
if (debug) { if (debug) {
// Show stream parameters // Show stream parameters
printf("Stream parameters:\n"); printf("Stream parameters:\n");
switch (streamtype) { switch (streamtype) {
case MonitorStream::STREAM_MPEG: case StreamBase::MPEG:
printf("Output mode (-e) = %s\n", "mpeg"); printf("Output mode (-e) = %s\n", "mpeg");
printf("Output format (-o) = %s\n", format); printf("Output format (-o) = %s\n", format);
break; break;
@ -213,7 +217,7 @@ int main(int argc, char** argv) {
stream.setStreamBuffer(buffer); // default = 0 (buffer) stream.setStreamBuffer(buffer); // default = 0 (buffer)
stream.setStreamStart(id); // default = 0 (monitor_id) stream.setStreamStart(id); // default = 0 (monitor_id)
stream.setStreamType(streamtype); stream.setStreamType(streamtype);
if (streamtype == MonitorStream::STREAM_MPEG) { if (streamtype == StreamBase::MPEG) {
#if HAVE_LIBAVCODEC #if HAVE_LIBAVCODEC
if (debug) printf("HAVE_LIBAVCODEC is set\n"); if (debug) printf("HAVE_LIBAVCODEC is set\n");
stream.setStreamFormat(format); // default = "" (format) stream.setStreamFormat(format); // default = "" (format)

View File

@ -222,12 +222,12 @@
/** /**
* A random string used in security hashing methods. * 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. * 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). * Apply timestamps with the last modified time to static assets (js, css, images).