Merged in optimised db frames.

git-svn-id: http://svn.zoneminder.com/svn/zm/trunk@917 e3e1d417-86f3-4887-817a-d78f3d33393f
This commit is contained in:
stan committed 2004-03-04 15:13:10 +00:00
1 parent 3d245e1ab0
commit f257aee488
15 files changed
+114 -46

No files matched your search

Vendored
+1 -1
View File
@@ -1500,7 +1500,7 @@ fi
# Define the identity of the package.
PACKAGE=zm
VERSION=1.18.1-ms
VERSION=1.19.0
cat >>confdefs.h <<_ACEOF
+1 -1
View File
@@ -1,5 +1,5 @@
AC_INIT(src/zm.h)
AM_INIT_AUTOMAKE(zm,1.18.1-ms)
AM_INIT_AUTOMAKE(zm,1.19.0)
AM_CONFIG_HEADER(config.h)
AC_ARG_WITH(mysql,
+2 -1
View File
@@ -14,4 +14,5 @@ EXTRA_DIST = \
zmalter-0.9.16.sql \
zmalter-1.17.1.sql \
zmalter-1.17.2.sql \
zmalter-1.18.0.sql
zmalter-1.18.0.sql \
zmalter-1.18.1.sql
+2 -1
View File
@@ -104,7 +104,8 @@ EXTRA_DIST = \
zmalter-0.9.16.sql \
zmalter-1.17.1.sql \
zmalter-1.17.2.sql \
zmalter-1.18.0.sql
zmalter-1.18.0.sql \
zmalter-1.18.1.sql
subdir = db
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+17
View File
@@ -0,0 +1,17 @@
--
-- This updates a 1.18.1 database to 1.18.2
--
-- Make changes to Zones table
--
alter table Frames add column Type enum('Normal','Bulk','Alarm') NOT NULL default 'Normal' after FrameId;
update Frames set Type = 'Alarm' where AlarmFrame = 1;
alter table Frames drop column AlarmFrame;
--
-- These are optional, but we might as well
--
optimize table Frames;
optimize table Events;
optimize table Filters;
optimize table Zones;
optimize table Monitors;
optimize table Stats;
+1 -1
View File
@@ -86,7 +86,7 @@ CREATE TABLE Frames (
Id int(10) unsigned NOT NULL auto_increment,
EventId int(10) unsigned NOT NULL default '0',
FrameId int(10) unsigned NOT NULL default '0',
AlarmFrame tinyint(4) NOT NULL default '0',
Type enum('Normal','Bulk','Alarm') NOT NULL default 'Normal',
TimeStamp timestamp(14) NOT NULL,
Delta decimal(8,2) NOT NULL default '0.00',
Score smallint(5) unsigned NOT NULL default '0',
+8 -13
View File
@@ -663,29 +663,24 @@ sub substituteTags
# Do we need the image information too?
my $need_images = $text =~ /%(?:EPI1|EPIM|EI1|EIM)%/;
my @frames = ();
my $first_alarm_frame;
my $max_alarm_frame;
my $max_alarm_score = 0;
if ( $need_images )
{
my $sql = "select * from Frames where EventId = ? order by FrameId";
my $sql = "select * from Frames where EventId = ? and Type = 'Alarm' order by FrameId";
my $sth = $dbh->prepare_cached( $sql ) or die( "Can't prepare '$sql': ".$dbh->errstr() );
my $res = $sth->execute( $event->{Id} ) or die( "Can't execute: ".$sth->errstr() );
while( my $frame = $sth->fetchrow_hashref() )
{
push( @frames, $frame );
if ( $frame->{AlarmFrame} )
if ( !$first_alarm_frame )
{
if ( !$first_alarm_frame )
{
$first_alarm_frame = $frame;
}
if ( $frame->{Score} > $max_alarm_score )
{
$max_alarm_frame = $frame;
$max_alarm_score = $frame->{Score};
}
$first_alarm_frame = $frame;
}
if ( $frame->{Score} > $max_alarm_score )
{
$max_alarm_frame = $frame;
$max_alarm_score = $frame->{Score};
}
}
$sth->finish();
+16 -8
View File
@@ -34,6 +34,7 @@
bool Event::initialised = false;
bool Event::timestamp_on_capture;
bool Event::bulk_frame_interval;
Event::Event( Monitor *p_monitor, struct timeval p_start_time ) : monitor( p_monitor ), start_time( p_start_time )
{
@@ -267,7 +268,7 @@ void Event::AddFrames( int n_frames, Image **images, struct timeval **timestamps
}
}
void Event::AddFrame( Image *image, struct timeval timestamp, unsigned int score, Image *alarm_image )
void Event::AddFrame( Image *image, struct timeval timestamp, int score, Image *alarm_image )
{
frames++;
@@ -280,16 +281,23 @@ void Event::AddFrame( Image *image, struct timeval timestamp, unsigned int score
struct DeltaTimeval delta_time;
DELTA_TIMEVAL( delta_time, timestamp, start_time, DT_PREC_2 );
Debug( 1, ( "Adding frame %d to DB", frames ));
static char sql[BUFSIZ];
sprintf( sql, "insert into Frames ( EventId, FrameId, AlarmFrame, Delta, Score ) values ( %d, %d, %d, %s%ld.%02ld, %d )", id, frames, score>0, delta_time.positive?"":"-", delta_time.sec, delta_time.fsec, score );
if ( mysql_query( &dbconn, sql ) )
bool db_frame = score>=0 || !((frames-1)%bulk_frame_interval);
if ( db_frame )
{
Error(( "Can't insert frame: %s", mysql_error( &dbconn ) ));
exit( mysql_errno( &dbconn ) );
const char *frame_type = score>0?"Normal":(score<0?"Bulk":"Alarm");
Debug( 1, ( "Adding frame %d to DB", frames ));
static char sql[BUFSIZ];
sprintf( sql, "insert into Frames ( EventId, FrameId, AlarmFrame, Delta, Score ) values ( %d, %d, '%s', %s%ld.%02ld, %d )", id, frames, frame_type, delta_time.positive?"":"-", delta_time.sec, delta_time.fsec, score );
if ( mysql_query( &dbconn, sql ) )
{
Error(( "Can't insert frame: %s", mysql_error( &dbconn ) ));
exit( mysql_errno( &dbconn ) );
}
}
if ( score )
if ( score > 0 )
{
end_time = timestamp;
+3 -1
View File
@@ -44,6 +44,7 @@ class Event
protected:
static bool initialised;
static bool timestamp_on_capture;
static bool bulk_frame_interval;
protected:
static int sd;
@@ -65,6 +66,7 @@ protected:
initialised = true;
timestamp_on_capture = (bool)config.Item( ZM_TIMESTAMP_ON_CAPTURE );
bulk_frame_interval = (bool)config.Item( ZM_BULK_FRAME_INTERVAL );
}
public:
@@ -87,7 +89,7 @@ public:
bool WriteFrameImage( Image *image, struct timeval timestamp, const char *event_file, bool alarm_frame=false );
void AddFrames( int n_frames, Image **images, struct timeval **timestamps );
void AddFrame( Image *image, struct timeval timestamp, unsigned int score=0, Image *alarm_frame=NULL );
void AddFrame( Image *image, struct timeval timestamp, int score=0, Image *alarm_frame=NULL );
static void StreamEvent( int event_id, int rate=100, int scale=100 );
#if HAVE_LIBAVCODEC
+9 -1
View File
@@ -34,6 +34,7 @@ bool Monitor::opt_adaptive_skip;
bool Monitor::create_analysis_images;
bool Monitor::blend_alarmed_images;
bool Monitor::timestamp_on_capture;
bool Monitor::bulk_frame_interval;
Monitor::Monitor(
int p_id,
@@ -779,7 +780,14 @@ bool Monitor::Analyse()
{
if ( !(image_count%(frame_skip+1)) )
{
event->AddFrame( snap_image, *timestamp );
if ( bulk_frame_interval > 1 )
{
event->AddFrame( snap_image, *timestamp, -1 );
}
else
{
event->AddFrame( snap_image, *timestamp );
}
}
}
}
+2
View File
@@ -70,6 +70,7 @@ protected:
static bool create_analysis_images;
static bool blend_alarmed_images;
static bool timestamp_on_capture;
static bool bulk_frame_interval;
protected:
// These are read from the DB and thereafter remain unchanged
@@ -152,6 +153,7 @@ protected:
create_analysis_images = (bool)config.Item( ZM_CREATE_ANALYSIS_IMAGES );
blend_alarmed_images = (bool)config.Item( ZM_BLEND_ALARMED_IMAGES );
timestamp_on_capture = (bool)config.Item( ZM_TIMESTAMP_ON_CAPTURE );
bulk_frame_interval = (bool)config.Item( ZM_BULK_FRAME_INTERVAL );
}
public:
+25 -6
View File
@@ -314,12 +314,31 @@ AutoStart=true>
}
else
{
$sql = "select * from Frames where EventID = '$eid' order by Id";
if ( $paged && !empty($page) )
$sql .= " limit ".(($page-1)*$frames_per_page).", ".$frames_per_page;
{
$lo_frame_id = (($page-1)*$frames_per_page)+1;
$hi_frame_id = min( $page*$frames_per_page, $event['Frames'] );
}
else
{
$lo_frame = 1;
$hi_frame = $event['Frames'];
}
$sql = "select * from Frames where EventID = '$eid'";
if ( $paged && !empty($page) )
$sql .= " and FrameId between $lo_frame_id and $hi_frame_id";
$sql .= "order by FrameId";
$result = mysql_query( $sql );
if ( !$result )
die( mysql_error() );
$alarm_frames = array();
while( $row = mysql_fetch_assoc( $result ) )
{
if ( $row['Type'] == 'Alarm' )
{
$alarm_frames[$row['FrameId']] = $row;
}
}
?>
<tr><td colspan="6"><table border="0" cellpadding="0" cellspacing="2" align="center">
<tr>
@@ -330,9 +349,8 @@ else
$thumb_width = $event['Width']/4;
$thumb_height = $event['Height']/4;
$event_path = ZM_DIR_EVENTS.'/'.$event['MonitorName'].'/'.$event['Id'];
while( $row = mysql_fetch_assoc( $result ) )
for ( $frame_id = $lo_frame; $frame_id <= $hi_frame_id; $frame_id++ )
{
$frame_id = $row['FrameId'];
$image_path = sprintf( "%s/%03d-capture.jpg", $event_path, $frame_id );
$capt_image = $image_path;
@@ -364,9 +382,10 @@ else
exec( $command );
}
}
$img_class = $row['AlarmFrame']?"alarm":"normal";
$alarm_frame = $alarm_frames[$frame_id];
$img_class = $alarm_frame?"alarm":"normal";
?>
<td align="center" width="88"><a href="javascript: newWindow( '<?= $PHP_SELF ?>?view=frame&eid=<?= $eid ?>&fid=<?= $frame_id ?>', 'zmImage', <?= $event['Width']+$jws['image']['w'] ?>, <?= $event['Height']+$jws['image']['h'] ?> );"><img src="<?= $thumb_image ?>" width="<?= $thumb_width ?>" height="<? echo $thumb_height ?>" class="<?= $img_class ?>" alt="<?= $frame_id ?>/<?= $row['Score'] ?>"></a></td>
<td align="center" width="88"><a href="javascript: newWindow( '<?= $PHP_SELF ?>?view=frame&eid=<?= $eid ?>&fid=<?= $frame_id ?>', 'zmImage', <?= $event['Width']+$jws['image']['w'] ?>, <?= $event['Height']+$jws['image']['h'] ?> );"><img src="<?= $thumb_image ?>" width="<?= $thumb_width ?>" height="<? echo $thumb_height ?>" class="<?= $img_class ?>" alt="<?= $frame_id ?>/<?= $alarm_frame['Score'] ?>"></a></td>
<?php
flush();
if ( !(++$count % 4) )
+5 -8
View File
@@ -44,11 +44,7 @@ else
$fid = $frame['FrameId'];
}
$result = mysql_query( "select count(*) as FrameCount from Frames where EventID = '$eid'" );
if ( !$result )
die( mysql_error() );
$row = mysql_fetch_assoc( $result );
$max_fid = $row['FrameCount'];
$max_fid = $event['Frames'];
$first_fid = 1;
$prev_fid = $fid-1;
@@ -56,13 +52,14 @@ $next_fid = $fid+1;
$last_fid = $max_fid;
$event_path = ZM_DIR_EVENTS.'/'.$event['MonitorName'].'/'.$event['Id'];
$image_path = sprintf( "%s/%03d-capture.jpg", $event_path, $frame['FrameId'] );
$image_path = sprintf( "%s/%03d-capture.jpg", $event_path, $fid );
$anal_image = preg_replace( "/capture/", "analyse", $image_path );
if ( file_exists( $anal_image ) )
{
$image_path = $anal_image;
}
$img_class = $frame['AlarmFrame']?"alarm":"normal";
$alarm_frame = $frame['Type']=='Alarm';
$img_class = $alarm_frame?"alarm":"normal";
?>
<html>
@@ -89,7 +86,7 @@ function deleteEvent()
<body>
<table border="0">
<tr><td colspan="2" class="smallhead"><?= $zmSlangFrame ?> <?= $eid."-".$fid." (".$frame['Score'].")" ?>
<?php if ( ZM_RECORD_EVENT_STATS && $frame['AlarmFrame'] ) { ?>
<?php if ( ZM_RECORD_EVENT_STATS && $alarm_frame ) { ?>
(<a href="javascript: newWindow( '<?= $PHP_SELF ?>?view=stats&eid=<?= $eid ?>&fid=<?= $fid ?>', 'zmStats', <?= $jws['stats']['w'] ?>, <?= $jws['stats']['h'] ?> );"><?= $zmSlangStats ?></a>)
<?php } ?>
</td>
+14 -4
View File
@@ -23,13 +23,21 @@ if ( !canView( 'Events' ) )
$view = "error";
return;
}
$result = mysql_query( "select F.*,unix_timestamp(F.TimeStamp) as UnixTimeStamp,E.*,M.Name as MonitorName,M.Width,M.Height from Frames as F left join Events as E on F.EventId = E.Id left join Monitors as M on E.MonitorId = M.Id where F.EventId = '$eid' order by F.FrameId" );
$sql = "select E.*,M.Name as MonitorName,M.Width,M.Height from Events as E inner join Monitors as M on E.MonitorId = M.Id where E.Id = '$eid'";
$result = mysql_query( $sql );
if ( !$result )
die( mysql_error() );
$event = mysql_fetch_assoc( $result );
$sql = "select * from Frames where EventID = '$eid' order by FrameId";
$result = mysql_query( $sql );
if ( !$result )
die( mysql_error() );
while ( $row = mysql_fetch_assoc( $result ) )
{
$frames[] = $row;
}
?>
<html>
<head>
@@ -65,14 +73,16 @@ if ( count($frames) )
{
foreach ( $frames as $frame )
{
$alarm_frame = $frame['Type']=='Alarm';
$bgcolor = $alarm_frame?'#FA8072':($frame['Type']=='Bulk'?'#CCCCCC':'#FFFFFF');
?>
<tr bgcolor="<?= $frame['AlarmFrame']?'#FA8072':'#FFFFFF' ?>">
<tr bgcolor="<?= $bgcolor ?>">
<td class="text" align="center"><?= $frame['FrameId'] ?></td>
<td class="text" align="center"><?= $frame['AlarmFrame']?"yes":"no" ?></td>
<td class="text" align="center"><?= $alarm_frame?$zmSlangYes:$zmSlangNo ?></td>
<td class="text" align="center"><?= date( "H:i:s", $frame['UnixTimeStamp'] ) ?></td>
<td class="text" align="center"><?= number_format( $frame['Delta'], 2 ) ?></td>
<?php
if ( ZM_RECORD_EVENT_STATS && $frame['AlarmFrame'] )
if ( ZM_RECORD_EVENT_STATS && $alarm_frame )
{
?>
<td class="text" align="center"><a href="javascript: newWindow( '<?= $PHP_SELF ?>?view=stats&eid=<?= $eid ?>&fid=<?= $frame['FrameId'] ?>', 'zmStats', <?= $jws['stats']['w'] ?>, <?= $jws['stats']['h'] ?> );"><?= $frame['Score'] ?></a></td>
+8
View File
@@ -810,6 +810,14 @@ my @options =
type => $types{integer},
category => 'video',
},
{
name => "ZM_BULK_FRAME_INTERVAL",
default => "100",
description => "How often a bulk frame should be written to the database",
help => "Traditionally ZoneMinder writes an entry into the Frames database table for each frame that is captured and saved. This works well in motion detection scenarios but when in a DVR situation ('Record' or 'Mocord' mode) this results in a huge number of frame writes and a lot of database and disk bandwidth for very little additional information. Setting this to a non-zero value will enabled ZoneMinder to group these non-alarm frames into one 'bulk' frame entry which saves a lot of bandwidth and space. The only disadvantage of this is that timing information for individual frames is lost but in constant frame rate situations this is usually not significant. This setting is ignored in Modect mode and individual frames are still written if an alarm occurs in Mocord mode also.",
type => $types{integer},
category => 'video',
},
{
name => "ZM_RECORD_EVENT_STATS",
default => "yes",