Merge branch 'master' of github.com:ZoneMinder/ZoneMinder

This commit is contained in:
Isaac Connor 2019-09-25 10:36:52 -04:00
commit 61a7c008eb
43 changed files with 927 additions and 1081 deletions

View File

@ -39,8 +39,8 @@ env:
- SMPFLAGS=-j4 OS=ubuntu DIST=xenial - SMPFLAGS=-j4 OS=ubuntu DIST=xenial
- SMPFLAGS=-j4 OS=ubuntu DIST=bionic - SMPFLAGS=-j4 OS=ubuntu DIST=bionic
- SMPFLAGS=-j4 OS=ubuntu DIST=disco - SMPFLAGS=-j4 OS=ubuntu DIST=disco
- SMPFLAGS=-j4 OS=debian DIST=buster DOCKER_REPO=zmicon/packpack - SMPFLAGS=-j4 OS=debian DIST=buster DOCKER_REPO=iconzm/packpack
- SMPFLAGS=-j4 OS=debian DIST=stretch - SMPFLAGS=-j4 OS=debian DIST=stretch DOCKER_REPO=iconzm/packpack
- SMPFLAGS=-j4 OS=ubuntu DIST=trusty ARCH=i386 - SMPFLAGS=-j4 OS=ubuntu DIST=trusty ARCH=i386
- SMPFLAGS=-j4 OS=ubuntu DIST=xenial ARCH=i386 - SMPFLAGS=-j4 OS=ubuntu DIST=xenial ARCH=i386
- SMPFLAGS=-j4 OS=ubuntu DIST=bionic ARCH=i386 - SMPFLAGS=-j4 OS=ubuntu DIST=bionic ARCH=i386

View File

@ -1,8 +1,8 @@
Source: zoneminder Source: zoneminder
Section: net Section: net
Priority: optional Priority: optional
Maintainer: Dmitry Smirnov <onlyjob@debian.org> Maintainer: Isaac Connor <isaac@zoneminder.com>
Uploaders: Vagrant Cascadian <vagrant@debian.org> Uploaders: Isaac Connor <isaac@zoneminder.com>
Build-Depends: debhelper (>= 9), dh-systemd, python-sphinx | python3-sphinx, apache2-dev, dh-linktree, dh-systemd, dh-apache2 Build-Depends: debhelper (>= 9), dh-systemd, python-sphinx | python3-sphinx, apache2-dev, dh-linktree, dh-systemd, dh-apache2
,cmake ,cmake
,libx264-dev, libmp4v2-dev ,libx264-dev, libmp4v2-dev

View File

@ -1,4 +1,4 @@
#!/usr/bin/perl -wT #!@PERL_EXECUTABLE@ -wT
# #
# ========================================================================== # ==========================================================================
# #

View File

@ -1,4 +1,4 @@
#!/usr/bin/perl -w #!@PERL_EXECUTABLE@ -wT
# #
# ========================================================================== # ==========================================================================
# #

View File

@ -1,4 +1,4 @@
#!/usr/bin/perl -wT #!@PERL_EXECUTABLE@ -wT
# #
# ========================================================================== # ==========================================================================
# #
@ -41,8 +41,6 @@ $ENV{PATH} = '/bin:/usr/bin:/usr/local/bin';
$ENV{SHELL} = '/bin/sh' if exists $ENV{SHELL}; $ENV{SHELL} = '/bin/sh' if exists $ENV{SHELL};
delete @ENV{qw(IFS CDPATH ENV BASH_ENV)}; delete @ENV{qw(IFS CDPATH ENV BASH_ENV)};
logInit();
my $arg_string = join(' ', @ARGV); my $arg_string = join(' ', @ARGV);
my $id; my $id;
@ -69,6 +67,7 @@ if ( !$id ) {
} }
( $id ) = $id =~ /^(\w+)$/; ( $id ) = $id =~ /^(\w+)$/;
logInit($id?(id=>'zmcontrol_'.$id):());
my $sock_file = $Config{ZM_PATH_SOCKS}.'/zmcontrol-'.$id.'.sock'; my $sock_file = $Config{ZM_PATH_SOCKS}.'/zmcontrol-'.$id.'.sock';
Debug("zmcontrol: arg string: $arg_string sock file $sock_file"); Debug("zmcontrol: arg string: $arg_string sock file $sock_file");

View File

@ -1,4 +1,4 @@
#!/usr/bin/perl -wT #!@PERL_EXECUTABLE@ -wT
# #
# ========================================================================== # ==========================================================================
# #

View File

@ -1,4 +1,4 @@
#!/usr/bin/perl -wT #!@PERL_EXECUTABLE@ -wT
# #
# ========================================================================== # ==========================================================================
# #

View File

@ -1,4 +1,4 @@
#!/usr/bin/perl -w #!@PERL_EXECUTABLE@ -wT
use strict; use strict;
# #
# ========================================================================== # ==========================================================================

View File

@ -1,4 +1,4 @@
#!/usr/bin/perl -wT #!@PERL_EXECUTABLE@ -wT
# #
# ========================================================================== # ==========================================================================
# #

View File

@ -1,4 +1,4 @@
#!/usr/bin/perl -wT #!@PERL_EXECUTABLE@ -wT
use strict; use strict;
use bytes; use bytes;

View File

@ -1,4 +1,4 @@
#!/usr/bin/perl -wT #!@PERL_EXECUTABLE@ -wT
use strict; use strict;
use bytes; use bytes;

View File

@ -1,4 +1,4 @@
#!/usr/bin/pkexec /usr/bin/perl #!/usr/bin/pkexec @PERL_EXECUTABLE@
# #
# ========================================================================== # ==========================================================================
# #

View File

@ -1,4 +1,4 @@
#!/usr/bin/perl -w #!@PERL_EXECUTABLE@ -wT
# #
# ========================================================================== # ==========================================================================
# #

View File

@ -1,4 +1,4 @@
#!/usr/bin/perl -wT #!@PERL_EXECUTABLE@ -wT
# #
# ========================================================================== # ==========================================================================
# #
@ -77,12 +77,12 @@ my $mid = 0;
GetOptions( 'monitor=s'=>\$mid ) GetOptions( 'monitor=s'=>\$mid )
or pod2usage(-exitstatus => -1); or pod2usage(-exitstatus => -1);
logInit();
logSetSignal();
my ( $detaint_mid ) = $mid =~ /^(\d+)$/; my ( $detaint_mid ) = $mid =~ /^(\d+)$/;
$mid = $detaint_mid; $mid = $detaint_mid;
logInit($mid?(id=>'zmtrack_m'.$mid):());
logSetSignal();
print( "Tracker daemon $mid (experimental) starting at " print( "Tracker daemon $mid (experimental) starting at "
.strftime( '%y/%m/%d %H:%M:%S', localtime() ) .strftime( '%y/%m/%d %H:%M:%S', localtime() )
."\n" ."\n"
@ -90,146 +90,122 @@ print( "Tracker daemon $mid (experimental) starting at "
my $dbh = zmDbConnect(); my $dbh = zmDbConnect();
my $sql = "SELECT C.*,M.* FROM Monitors as M my $sql = 'SELECT C.*,M.* FROM Monitors as M
LEFT JOIN Controls as C on M.ControlId = C.Id LEFT JOIN Controls as C on M.ControlId = C.Id
WHERE M.Id = ?" WHERE M.Id = ?'
; ;
my $sth = $dbh->prepare_cached( $sql ) my $sth = $dbh->prepare_cached( $sql )
or Fatal( "Can't prepare '$sql': ".$dbh->errstr() ); or Fatal("Can't prepare '$sql': ".$dbh->errstr());
my $res = $sth->execute( $mid ) my $res = $sth->execute( $mid )
or Fatal( "Can't execute '$sql': ".$sth->errstr() ); or Fatal("Can't execute '$sql': ".$sth->errstr());
my $monitor = $sth->fetchrow_hashref(); my $monitor = $sth->fetchrow_hashref();
if ( !$monitor ) if ( !$monitor ) {
{ Fatal("Can't find monitor '$mid'");
print( "Can't find monitor '$mid'\n" );
exit( -1 );
} }
if ( !$monitor->{Controllable} ) if ( !$monitor->{Controllable} ) {
{ Fatal("Monitor '$mid' is not controllable");
print( "Monitor '$mid' is not controllable\n" );
exit( -1 );
} }
if ( !$monitor->{TrackMotion} ) if ( !$monitor->{TrackMotion} ) {
{ Fatal("Monitor '$mid' is not configured to track motion");
print( "Monitor '$mid' is not configured to track motion\n" );
exit( -1 );
} }
if ( !$monitor->{CanMoveMap} ) if ( !$monitor->{CanMoveMap} ) {
{ if ( $monitor->{CanMoveRel} ) {
print( "Monitor '$mid' cannot move in map mode" ); Warning("Monitor '$mid' cannot move in map mode, falling back to pseudo map mode");
if ( $monitor->{CanMoveRel} ) } else {
{ Fatal("Monitor '$mid' cannot move in map mode");
print( ", falling back to pseudo map mode\n" ); }
}
else
{
print( "\n" );
exit( -1 );
}
} }
Debug( "Found monitor for id '$monitor'\n" ); Debug("Found monitor for id '$monitor'");
exit( -1 ) if ( !zmMemVerify( $monitor ) ); exit(-1) if !zmMemVerify($monitor);
sub Suspend sub Suspend {
{ my $monitor = shift;
my $monitor = shift; zmMonitorSuspend($monitor);
zmMonitorSuspend( $monitor );
} }
sub Resume sub Resume {
{ my $monitor = shift;
my $monitor = shift; sleep($monitor->{TrackDelay});
sleep( $monitor->{TrackDelay} ); zmMonitorResume($monitor);
zmMonitorResume( $monitor );
} }
sub Track sub Track {
{ my $monitor = shift;
my $monitor = shift; my ( $x, $y ) = @_;
my ( $x, $y ) = @_; my ( $detaint_x ) = $x =~ /^(\d+)$/; $x = $detaint_x;
my ( $detaint_x ) = $x =~ /^(\d+)$/; $x = $detaint_x; my ( $detaint_y ) = $y =~ /^(\d+)$/; $y = $detaint_y;
my ( $detaint_y ) = $y =~ /^(\d+)$/; $y = $detaint_y;
my $ctrlCommand = $Config{ZM_PATH_BIN} my $ctrlCommand = $Config{ZM_PATH_BIN}
."/zmcontrol.pl -i " .'/zmcontrol.pl -i '
.$monitor->{Id} .$monitor->{Id}
;
$ctrlCommand .= ' --command='
.( $monitor->{CanMoveMap} ? 'moveMap'
: 'movePseudoMap'
)
." --xcoord=$x --ycoord=$y"
;
executeShellCommand($ctrlCommand);
}
sub Return {
my $monitor = shift;
my $ctrlCommand = $Config{ZM_PATH_BIN}
.'/zmcontrol.pl -i '
.$monitor->{Id}
;
if ( $monitor->{ReturnLocation} > 0 ) {
$ctrlCommand .= ' --command=presetGoto --preset='
.$monitor->{ReturnLocation}
; ;
$ctrlCommand .= " --command=" } else {
.( $monitor->{CanMoveMap} ? "moveMap" $ctrlCommand .= ' --command=presetHome';
: "movePseudoMap" }
) executeShellCommand($ctrlCommand);
." --xcoord=$x --ycoord=$y"
;
executeShellCommand( $ctrlCommand );
}
sub Return
{
my $monitor = shift;
my $ctrlCommand = $Config{ZM_PATH_BIN}
."/zmcontrol.pl -i "
.$monitor->{Id}
;
if ( $monitor->{ReturnLocation} > 0 )
{
$ctrlCommand .= " --command=presetGoto --preset="
.$monitor->{ReturnLocation}
;
}
else
{
$ctrlCommand .= " --command=presetHome";
}
executeShellCommand( $ctrlCommand );
} }
my $last_alarm = 0; my $last_alarm = 0;
if ( ($monitor->{ReturnLocation} >= 0) ) if ( ($monitor->{ReturnLocation} >= 0) ) {
{ Suspend($monitor);
Suspend( $monitor ); Return($monitor);
Return( $monitor ); Resume($monitor);
Resume( $monitor );
} }
my $alarmed = undef; my $alarmed = undef;
while( 1 ) while( 1 ) {
{ if ( zmIsAlarmed($monitor) ) {
if ( zmIsAlarmed( $monitor ) ) my ( $alarm_x, $alarm_y ) = zmGetAlarmLocation($monitor);
{ if ( $alarm_x >= 0 && $alarm_y >= 0 ) {
my ( $alarm_x, $alarm_y ) = zmGetAlarmLocation( $monitor ); Debug("Got alarm at $alarm_x, $alarm_y");
if ( $alarm_x >= 0 && $alarm_y >= 0 ) Suspend($monitor);
{ Track($monitor, $alarm_x, $alarm_y);
Debug( "Got alarm at $alarm_x, $alarm_y\n" ); Resume($monitor);
Suspend( $monitor ); $last_alarm = time();
Track( $monitor, $alarm_x, $alarm_y ); $alarmed = !undef;
Resume( $monitor );
$last_alarm = time();
$alarmed = !undef;
}
} }
else } else {
{ if ( logDebugging() && $alarmed ) {
if ( logDebugging() && $alarmed ) Info('Left alarm state');
{ $alarmed = undef;
print( "Left alarm state\n" );
$alarmed = undef;
}
if ( ($monitor->{ReturnLocation} >= 0)
&& ($last_alarm > 0)
&& ((time()-$last_alarm) > $monitor->{ReturnDelay})
)
{
Debug( "Returning to location ".$monitor->{ReturnLocation}."\n" );
Suspend( $monitor );
Return( $monitor );
Resume( $monitor );
$last_alarm = 0;
}
} }
usleep( SLEEP_TIME ); if ( ($monitor->{ReturnLocation} >= 0)
&& ($last_alarm > 0)
&& ((time()-$last_alarm) > $monitor->{ReturnDelay})
) {
Debug("Returning to location ".$monitor->{ReturnLocation});
Suspend($monitor);
Return($monitor);
Resume($monitor);
$last_alarm = 0;
}
}
usleep(SLEEP_TIME);
} }
1;
__END__

View File

@ -1,4 +1,4 @@
#!/usr/bin/perl -wT #!@PERL_EXECUTABLE@ -wT
# #
# ========================================================================== # ==========================================================================
# #

View File

@ -1,4 +1,4 @@
#!/usr/bin/perl -w #!@PERL_EXECUTABLE@ -wT
# #
# ========================================================================== # ==========================================================================
# #

View File

@ -1,4 +1,4 @@
#!/usr/bin/perl -wT #!@PERL_EXECUTABLE@ -wT
# #
# ========================================================================== # ==========================================================================
# #

View File

@ -1,4 +1,4 @@
#!/usr/bin/perl -wT #!@PERL_EXECUTABLE@ -wT
# #
# ========================================================================== # ==========================================================================
# #

View File

@ -1,4 +1,4 @@
#!/usr/bin/perl -wT #!@PERL_EXECUTABLE@ -wT
# #
# ========================================================================== # ==========================================================================
# #

View File

@ -58,7 +58,7 @@ RemoteCameraRtsp::RemoteCameraRtsp(
else if ( p_method == "rtpRtspHttp" ) else if ( p_method == "rtpRtspHttp" )
method = RtspThread::RTP_RTSP_HTTP; method = RtspThread::RTP_RTSP_HTTP;
else else
Fatal( "Unrecognised method '%s' when creating RTSP camera %d", p_method.c_str(), monitor_id ); Fatal("Unrecognised method '%s' when creating RTSP camera %d", p_method.c_str(), monitor_id);
if ( capture ) { if ( capture ) {
Initialise(); Initialise();
@ -88,23 +88,23 @@ RemoteCameraRtsp::RemoteCameraRtsp(
subpixelorder = ZM_SUBPIX_ORDER_NONE; subpixelorder = ZM_SUBPIX_ORDER_NONE;
imagePixFormat = AV_PIX_FMT_GRAY8; imagePixFormat = AV_PIX_FMT_GRAY8;
} else { } else {
Panic("Unexpected colours: %d",colours); Panic("Unexpected colours: %d", colours);
} }
} // end RemoteCameraRtsp::RemoteCameraRtsp(...) } // end RemoteCameraRtsp::RemoteCameraRtsp(...)
RemoteCameraRtsp::~RemoteCameraRtsp() { RemoteCameraRtsp::~RemoteCameraRtsp() {
av_frame_free( &mFrame ); av_frame_free(&mFrame);
av_frame_free( &mRawFrame ); av_frame_free(&mRawFrame);
#if HAVE_LIBSWSCALE #if HAVE_LIBSWSCALE
if ( mConvertContext ) { if ( mConvertContext ) {
sws_freeContext( mConvertContext ); sws_freeContext(mConvertContext);
mConvertContext = NULL; mConvertContext = NULL;
} }
#endif #endif
if ( mCodecContext ) { if ( mCodecContext ) {
avcodec_close( mCodecContext ); avcodec_close(mCodecContext);
mCodecContext = NULL; // Freed by avformat_free_context in the destructor of RtspThread class mCodecContext = NULL; // Freed by avformat_free_context in the destructor of RtspThread class
} }
@ -120,14 +120,9 @@ void RemoteCameraRtsp::Initialise() {
// This allocates a buffer able to hold a raw fframe, which is a little artbitrary. Might be nice to get some // This allocates a buffer able to hold a raw fframe, which is a little artbitrary. Might be nice to get some
// decent data on how large a buffer is really needed. I think in ffmpeg there are now some functions to do that. // decent data on how large a buffer is really needed. I think in ffmpeg there are now some functions to do that.
buffer.size( max_size ); buffer.size(max_size);
if ( logDebugging() ) FFMPEGInit();
av_log_set_level( AV_LOG_DEBUG );
else
av_log_set_level( AV_LOG_QUIET );
av_register_all();
Connect(); Connect();
} }
@ -137,11 +132,11 @@ void RemoteCameraRtsp::Terminate() {
} }
int RemoteCameraRtsp::Connect() { int RemoteCameraRtsp::Connect() {
rtspThread = new RtspThread( monitor_id, method, protocol, host, port, path, auth, rtsp_describe ); rtspThread = new RtspThread(monitor_id, method, protocol, host, port, path, auth, rtsp_describe);
rtspThread->start(); rtspThread->start();
return( 0 ); return 0;
} }
int RemoteCameraRtsp::Disconnect() { int RemoteCameraRtsp::Disconnect() {
@ -151,18 +146,18 @@ int RemoteCameraRtsp::Disconnect() {
delete rtspThread; delete rtspThread;
rtspThread = 0; rtspThread = 0;
} }
return( 0 ); return 0;
} }
int RemoteCameraRtsp::PrimeCapture() { int RemoteCameraRtsp::PrimeCapture() {
Debug( 2, "Waiting for sources" ); Debug(2, "Waiting for sources");
for ( int i = 0; i < 100 && !rtspThread->hasSources(); i++ ) { for ( int i = 0; i < 100 && !rtspThread->hasSources(); i++ ) {
usleep( 100000 ); usleep(100000);
} }
if ( !rtspThread->hasSources() ) if ( !rtspThread->hasSources() )
Fatal( "No RTSP sources" ); Fatal("No RTSP sources");
Debug( 2, "Got sources" ); Debug(2, "Got sources");
mFormatContext = rtspThread->getFormatContext(); mFormatContext = rtspThread->getFormatContext();
@ -182,7 +177,7 @@ int RemoteCameraRtsp::PrimeCapture() {
mVideoStreamId = i; mVideoStreamId = i;
continue; continue;
} else { } else {
Debug(2, "Have another video stream." ); Debug(2, "Have another video stream.");
} }
} else } else
#if (LIBAVCODEC_VERSION_CHECK(52, 64, 0, 64, 0) || LIBAVUTIL_VERSION_CHECK(50, 14, 0, 14, 0)) #if (LIBAVCODEC_VERSION_CHECK(52, 64, 0, 64, 0) || LIBAVUTIL_VERSION_CHECK(50, 14, 0, 14, 0))
@ -194,7 +189,7 @@ int RemoteCameraRtsp::PrimeCapture() {
if ( mAudioStreamId == -1 ) { if ( mAudioStreamId == -1 ) {
mAudioStreamId = i; mAudioStreamId = i;
} else { } else {
Debug(2, "Have another audio stream." ); Debug(2, "Have another audio stream.");
} }
} else { } else {
Debug(1, "Have unknown codec type in stream %d : %d", i, mFormatContext->streams[i]->codec->codec_type); Debug(1, "Have unknown codec type in stream %d : %d", i, mFormatContext->streams[i]->codec->codec_type);
@ -202,25 +197,25 @@ int RemoteCameraRtsp::PrimeCapture() {
} // end foreach stream } // end foreach stream
if ( mVideoStreamId == -1 ) if ( mVideoStreamId == -1 )
Fatal( "Unable to locate video stream" ); Fatal("Unable to locate video stream");
if ( mAudioStreamId == -1 ) if ( mAudioStreamId == -1 )
Debug( 3, "Unable to locate audio stream" ); Debug(3, "Unable to locate audio stream");
// Get a pointer to the codec context for the video stream // Get a pointer to the codec context for the video stream
mCodecContext = mFormatContext->streams[mVideoStreamId]->codec; mCodecContext = mFormatContext->streams[mVideoStreamId]->codec;
// Find the decoder for the video stream // Find the decoder for the video stream
mCodec = avcodec_find_decoder( mCodecContext->codec_id ); mCodec = avcodec_find_decoder(mCodecContext->codec_id);
if ( mCodec == NULL ) if ( mCodec == NULL )
Panic( "Unable to locate codec %d decoder", mCodecContext->codec_id ); Panic("Unable to locate codec %d decoder", mCodecContext->codec_id);
// Open codec // Open codec
#if !LIBAVFORMAT_VERSION_CHECK(53, 8, 0, 8, 0) #if !LIBAVFORMAT_VERSION_CHECK(53, 8, 0, 8, 0)
if ( avcodec_open( mCodecContext, mCodec ) < 0 ) if ( avcodec_open(mCodecContext, mCodec) < 0 )
#else #else
if ( avcodec_open2( mCodecContext, mCodec, 0 ) < 0 ) if ( avcodec_open2(mCodecContext, mCodec, 0) < 0 )
#endif #endif
Panic( "Can't open codec" ); Panic("Can't open codec");
// Allocate space for the native video frame // Allocate space for the native video frame
#if LIBAVCODEC_VERSION_CHECK(55, 28, 1, 45, 101) #if LIBAVCODEC_VERSION_CHECK(55, 28, 1, 45, 101)
@ -236,17 +231,17 @@ int RemoteCameraRtsp::PrimeCapture() {
mFrame = avcodec_alloc_frame(); mFrame = avcodec_alloc_frame();
#endif #endif
if(mRawFrame == NULL || mFrame == NULL) if ( mRawFrame == NULL || mFrame == NULL )
Fatal( "Unable to allocate frame(s)"); Fatal("Unable to allocate frame(s)");
#if LIBAVUTIL_VERSION_CHECK(54, 6, 0, 6, 0) #if LIBAVUTIL_VERSION_CHECK(54, 6, 0, 6, 0)
int pSize = av_image_get_buffer_size( imagePixFormat, width, height, 1 ); int pSize = av_image_get_buffer_size(imagePixFormat, width, height, 1);
#else #else
int pSize = avpicture_get_size( imagePixFormat, width, height ); int pSize = avpicture_get_size(imagePixFormat, width, height);
#endif #endif
if ( (unsigned int)pSize != imagesize ) { if ( (unsigned int)pSize != imagesize ) {
Fatal("Image size mismatch. Required: %d Available: %d",pSize,imagesize); Fatal("Image size mismatch. Required: %d Available: %d", pSize, imagesize);
} }
/* /*
#if HAVE_LIBSWSCALE #if HAVE_LIBSWSCALE
@ -263,17 +258,17 @@ int RemoteCameraRtsp::PrimeCapture() {
#endif // HAVE_LIBSWSCALE #endif // HAVE_LIBSWSCALE
*/ */
return( 0 ); return 0;
} }
int RemoteCameraRtsp::PreCapture() { int RemoteCameraRtsp::PreCapture() {
if ( !rtspThread->isRunning() ) if ( !rtspThread->isRunning() )
return( -1 ); return -1;
if ( !rtspThread->hasSources() ) { if ( !rtspThread->hasSources() ) {
Error( "Cannot precapture, no RTP sources" ); Error("Cannot precapture, no RTP sources");
return( -1 ); return -1;
} }
return( 0 ); return 0;
} }
int RemoteCameraRtsp::Capture( Image &image ) { int RemoteCameraRtsp::Capture( Image &image ) {
@ -293,10 +288,10 @@ int RemoteCameraRtsp::Capture( Image &image ) {
if ( !rtspThread->isRunning() ) if ( !rtspThread->isRunning() )
return -1; return -1;
if ( rtspThread->getFrame( buffer ) ) { if ( rtspThread->getFrame(buffer) ) {
Debug( 3, "Read frame %d bytes", buffer.size() ); Debug(3, "Read frame %d bytes", buffer.size());
Debug( 4, "Address %p", buffer.head() ); Debug(4, "Address %p", buffer.head());
Hexdump( 4, buffer.head(), 16 ); Hexdump(4, buffer.head(), 16);
if ( !buffer.size() ) if ( !buffer.size() )
return -1; return -1;
@ -322,25 +317,25 @@ int RemoteCameraRtsp::Capture( Image &image ) {
Debug(3, "Not an h264 packet"); Debug(3, "Not an h264 packet");
} }
av_init_packet( &packet ); av_init_packet(&packet);
while ( !frameComplete && buffer.size() > 0 ) { while ( !frameComplete && (buffer.size() > 0) ) {
packet.data = buffer.head(); packet.data = buffer.head();
packet.size = buffer.size(); packet.size = buffer.size();
// So I think this is the magic decode step. Result is a raw image? // So I think this is the magic decode step. Result is a raw image?
#if LIBAVCODEC_VERSION_CHECK(52, 23, 0, 23, 0) #if LIBAVCODEC_VERSION_CHECK(52, 23, 0, 23, 0)
int len = avcodec_decode_video2( mCodecContext, mRawFrame, &frameComplete, &packet ); int len = avcodec_decode_video2(mCodecContext, mRawFrame, &frameComplete, &packet);
#else #else
int len = avcodec_decode_video( mCodecContext, mRawFrame, &frameComplete, packet.data, packet.size ); int len = avcodec_decode_video(mCodecContext, mRawFrame, &frameComplete, packet.data, packet.size);
#endif #endif
if ( len < 0 ) { if ( len < 0 ) {
Error( "Error while decoding frame %d", frameCount ); Error("Error while decoding frame %d", frameCount);
Hexdump( Logger::ERROR, buffer.head(), buffer.size()>256?256:buffer.size() ); Hexdump(Logger::ERROR, buffer.head(), buffer.size()>256?256:buffer.size());
buffer.clear(); buffer.clear();
continue; continue;
} }
Debug( 2, "Frame: %d - %d/%d", frameCount, len, buffer.size() ); Debug(2, "Frame: %d - %d/%d", frameCount, len, buffer.size());
//if ( buffer.size() < 400 ) //if ( buffer.size() < 400 )
//Hexdump( 0, buffer.head(), buffer.size() ); //Hexdump( 0, buffer.head(), buffer.size() );
@ -349,29 +344,32 @@ int RemoteCameraRtsp::Capture( Image &image ) {
// At this point, we either have a frame or ran out of buffer. What happens if we run out of buffer? // At this point, we either have a frame or ran out of buffer. What happens if we run out of buffer?
if ( frameComplete ) { if ( frameComplete ) {
Debug( 3, "Got frame %d", frameCount ); Debug(3, "Got frame %d", frameCount);
avpicture_fill( (AVPicture *)mFrame, directbuffer, imagePixFormat, width, height ); avpicture_fill((AVPicture *)mFrame, directbuffer, imagePixFormat, width, height);
#if HAVE_LIBSWSCALE #if HAVE_LIBSWSCALE
if(mConvertContext == NULL) { if ( mConvertContext == NULL ) {
mConvertContext = sws_getContext( mCodecContext->width, mCodecContext->height, mCodecContext->pix_fmt, width, height, imagePixFormat, SWS_BICUBIC, NULL, NULL, NULL ); mConvertContext = sws_getContext(
mCodecContext->width, mCodecContext->height, mCodecContext->pix_fmt,
width, height, imagePixFormat, SWS_BICUBIC, NULL, NULL, NULL);
if(mConvertContext == NULL) if ( mConvertContext == NULL )
Fatal( "Unable to create conversion context"); Fatal("Unable to create conversion context");
} }
if ( sws_scale( mConvertContext, mRawFrame->data, mRawFrame->linesize, 0, mCodecContext->height, mFrame->data, mFrame->linesize ) < 0 ) if ( sws_scale(mConvertContext, mRawFrame->data, mRawFrame->linesize, 0, mCodecContext->height, mFrame->data, mFrame->linesize) < 0 )
Fatal( "Unable to convert raw format %u to target format %u at frame %d", mCodecContext->pix_fmt, imagePixFormat, frameCount ); Fatal("Unable to convert raw format %u to target format %u at frame %d",
mCodecContext->pix_fmt, imagePixFormat, frameCount );
#else // HAVE_LIBSWSCALE #else // HAVE_LIBSWSCALE
Fatal( "You must compile ffmpeg with the --enable-swscale option to use RTSP cameras" ); Fatal("You must compile ffmpeg with the --enable-swscale option to use RTSP cameras");
#endif // HAVE_LIBSWSCALE #endif // HAVE_LIBSWSCALE
frameCount++; frameCount++;
} /* frame complete */ } /* frame complete */
zm_av_packet_unref( &packet ); zm_av_packet_unref(&packet);
} /* getFrame() */ } /* getFrame() */
if ( frameComplete ) if ( frameComplete )
@ -385,180 +383,7 @@ int RemoteCameraRtsp::Capture( Image &image ) {
//Function to handle capture and store //Function to handle capture and store
int RemoteCameraRtsp::CaptureAndRecord(Image &image, timeval recording, char* event_file ) {
AVPacket packet;
uint8_t* directbuffer;
int frameComplete = false;
while ( true ) {
// WHY Are we clearing it? Might be something good in it.
buffer.clear();
if ( !rtspThread->isRunning() )
return (-1);
//Video recording
if ( recording.tv_sec ) {
// The directory we are recording to is no longer tied to the current event.
// Need to re-init the videostore with the correct directory and start recording again
// Not sure why we are only doing this on keyframe, al
if ( videoStore && (strcmp(oldDirectory, event_file)!=0) ) {
//don't open new videostore until we're on a key frame..would this require an offset adjustment for the event as a result?...if we store our key frame location with the event will that be enough?
Info("Re-starting video storage module");
if ( videoStore ) {
delete videoStore;
videoStore = NULL;
}
} // end if changed to new event
if ( ! videoStore ) {
//Instantiate the video storage module
videoStore = new VideoStore((const char *)event_file, "mp4",
mFormatContext->streams[mVideoStreamId],
mAudioStreamId==-1?NULL:mFormatContext->streams[mAudioStreamId],
this->getMonitor() );
strcpy(oldDirectory, event_file);
} // end if ! videoStore
} else {
if ( videoStore ) {
Info("Deleting videoStore instance");
delete videoStore;
videoStore = NULL;
}
} // end if recording or not
if ( rtspThread->getFrame( buffer ) ) {
Debug( 3, "Read frame %d bytes", buffer.size() );
Debug( 4, "Address %p", buffer.head() );
Hexdump( 4, buffer.head(), 16 );
if ( !buffer.size() )
return( -1 );
if ( mCodecContext->codec_id == AV_CODEC_ID_H264 ) {
// SPS and PPS frames should be saved and appended to IDR frames
int nalType = (buffer.head()[3] & 0x1f);
// SPS
if(nalType == 7) {
lastSps = buffer;
continue;
} else if(nalType == 8) {
// PPS
lastPps = buffer;
continue;
} else if(nalType == 5) {
// IDR
buffer += lastSps;
buffer += lastPps;
}
} // end if H264, what about other codecs?
av_init_packet( &packet );
// Keep decoding until a complete frame is had.
while ( !frameComplete && buffer.size() > 0 ) {
packet.data = buffer.head();
packet.size = buffer.size();
// Why are we checking for it being the video stream? Because it might be audio or something else.
// Um... we just initialized packet... we can't be testing for what it is yet....
if ( packet.stream_index == mVideoStreamId ) {
// So this does the decode
#if LIBAVCODEC_VERSION_CHECK(52, 23, 0, 23, 0)
int len = avcodec_decode_video2( mCodecContext, mRawFrame, &frameComplete, &packet );
#else
int len = avcodec_decode_video( mCodecContext, mRawFrame, &frameComplete, packet.data, packet.size );
#endif
if ( len < 0 ) {
Error( "Error while decoding frame %d", frameCount );
Hexdump( Logger::ERROR, buffer.head(), buffer.size()>256?256:buffer.size() );
buffer.clear();
continue;
}
Debug( 2, "Frame: %d - %d/%d", frameCount, len, buffer.size() );
//if ( buffer.size() < 400 )
//Hexdump( 0, buffer.head(), buffer.size() );
buffer -= len;
if ( frameComplete ) {
Debug( 3, "Got frame %d", frameCount );
/* Request a writeable buffer of the target image */
directbuffer = image.WriteBuffer(width, height, colours, subpixelorder);
if(directbuffer == NULL) {
Error("Failed requesting writeable buffer for the captured image.");
return (-1);
}
#if LIBAVUTIL_VERSION_CHECK(54, 6, 0, 6, 0)
av_image_fill_arrays(mFrame->data, mFrame->linesize,
directbuffer, imagePixFormat, width, height, 1);
#else
avpicture_fill( (AVPicture *)mFrame, directbuffer,
imagePixFormat, width, height);
#endif
} // endif frameComplete
if ( videoStore ) {
//Write the packet to our video store
int ret = videoStore->writeVideoFramePacket(&packet);//, &lastKeyframePkt);
if ( ret < 0 ) {//Less than zero and we skipped a frame
// Should not
zm_av_packet_unref( &packet );
return 0;
}
} // end if videoStore, so we are recording
#if HAVE_LIBSWSCALE
// Why are we re-scaling after writing out the packet?
if ( mConvertContext == NULL ) {
mConvertContext = sws_getContext( mCodecContext->width, mCodecContext->height, mCodecContext->pix_fmt, width, height, imagePixFormat, SWS_BICUBIC, NULL, NULL, NULL );
if ( mConvertContext == NULL )
Fatal( "Unable to create conversion context");
}
if ( sws_scale( mConvertContext, mRawFrame->data, mRawFrame->linesize, 0, mCodecContext->height, mFrame->data, mFrame->linesize ) < 0 )
Fatal( "Unable to convert raw format %u to target format %u at frame %d", mCodecContext->pix_fmt, imagePixFormat, frameCount );
#else // HAVE_LIBSWSCALE
Fatal( "You must compile ffmpeg with the --enable-swscale option to use RTSP cameras" );
#endif // HAVE_LIBSWSCALE
frameCount++;
} else if ( packet.stream_index == mAudioStreamId ) {
Debug( 4, "Got audio packet" );
if ( videoStore && record_audio ) {
Debug( 4, "Storing Audio packet" );
//Write the packet to our video store
int ret = videoStore->writeAudioFramePacket( &packet ); //FIXME no relevance of last key frame
if ( ret < 0 ) { //Less than zero and we skipped a frame
zm_av_packet_unref( &packet );
return 0;
}
}
} // end if video or audio packet
zm_av_packet_unref( &packet );
} // end while ! framecomplete and buffer.size()
if(frameComplete)
return (1);
} /* getFrame() */
} // end while true
// can never get here.
return (0) ;
} // int RemoteCameraRtsp::CaptureAndRecord( Image &image, bool recording, char* event_file )
int RemoteCameraRtsp::PostCapture() { int RemoteCameraRtsp::PostCapture() {
return( 0 ); return 0;
} }
#endif // HAVE_LIBAVFORMAT #endif // HAVE_LIBAVFORMAT

View File

@ -85,7 +85,7 @@ public:
int PreCapture(); int PreCapture();
int Capture( Image &image ); int Capture( Image &image );
int PostCapture(); int PostCapture();
int CaptureAndRecord( Image &image, timeval recording, char* event_directory ); int CaptureAndRecord( Image &image, timeval recording, char* event_directory ) {return 0;};
int Close() { return 0; }; int Close() { return 0; };
}; };

View File

@ -330,23 +330,23 @@ bool RtpSource::handlePacket( const unsigned char *packet, size_t packetLen ) {
} else } else
prevM = false; prevM = false;
updateJitter( rtpHeader ); updateJitter(rtpHeader);
return true; return true;
} }
bool RtpSource::getFrame( Buffer &buffer ) { bool RtpSource::getFrame( Buffer &buffer ) {
Debug( 3, "Getting frame" );
if ( !mFrameReady.getValueImmediate() ) { if ( !mFrameReady.getValueImmediate() ) {
Debug(3, "Getting frame but not ready");
// Allow for a couple of spurious returns // Allow for a couple of spurious returns
for ( int count = 0; !mFrameReady.getUpdatedValue( 1 ); count++ ) for ( int count = 0; !mFrameReady.getUpdatedValue(1); count++ )
if ( count > 1 ) if ( count > 1 )
return( false ); return false;
} }
buffer = mFrame; buffer = mFrame;
mFrameReady.setValueImmediate( false ); mFrameReady.setValueImmediate(false);
mFrameProcessed.updateValueSignal( true ); mFrameProcessed.updateValueSignal(true);
Debug( 4, "Copied %d bytes", buffer.size() ); Debug(4, "Copied %d bytes", buffer.size());
return true; return true;
} }

View File

@ -14,7 +14,7 @@ done
# We only want to deploy packages during cron events # We only want to deploy packages during cron events
# See https://docs.travis-ci.com/user/cron-jobs/ # See https://docs.travis-ci.com/user/cron-jobs/
if [ "${TRAVIS_EVENT_TYPE}" == "cron" ]; then if [ "${TRAVIS_EVENT_TYPE}" == "cron" ] || [ "${OS}" == "debian" ] || [ "${OS}" == "ubuntu" ]; then
if [ "${OS}" == "debian" ] || [ "${OS}" == "ubuntu" ]; then if [ "${OS}" == "debian" ] || [ "${OS}" == "ubuntu" ]; then
targetfolder="debian/master/mini-dinstall/incoming" targetfolder="debian/master/mini-dinstall/incoming"

View File

@ -19,7 +19,7 @@ checksanity () {
exit 1 exit 1
fi fi
done done
# Verify OS & DIST environment variables have been set before calling this script # Verify OS & DIST environment variables have been set before calling this script
if [ -z "${OS}" ] || [ -z "${DIST}" ]; then if [ -z "${OS}" ] || [ -z "${DIST}" ]; then
echo "ERROR: both OS and DIST environment variables must be set" echo "ERROR: both OS and DIST environment variables must be set"
@ -120,7 +120,7 @@ commonprep () {
movecrud () { movecrud () {
if [ -e "web/api/app/Plugin/Crud/LICENSE.txt" ]; then if [ -e "web/api/app/Plugin/Crud/LICENSE.txt" ]; then
echo "Crud plugin already installed..." echo "Crud plugin already installed..."
else else
echo "Unpacking Crud plugin..." echo "Unpacking Crud plugin..."
tar -xzf build/crud-${CRUDVER}.tar.gz tar -xzf build/crud-${CRUDVER}.tar.gz
rmdir web/api/app/Plugin/Crud rmdir web/api/app/Plugin/Crud
@ -128,7 +128,7 @@ movecrud () {
fi fi
if [ -e "web/api/app/Plugin/CakePHP-Enum-Behavior/readme.md" ]; then if [ -e "web/api/app/Plugin/CakePHP-Enum-Behavior/readme.md" ]; then
echo "CakePHP-Enum-Behavior plugin already installed..." echo "CakePHP-Enum-Behavior plugin already installed..."
else else
echo "Unpacking CakePHP-Enum-Behavior plugin..." echo "Unpacking CakePHP-Enum-Behavior plugin..."
tar -xzf build/cakephp-enum-behavior-${CEBVER}.tar.gz tar -xzf build/cakephp-enum-behavior-${CEBVER}.tar.gz
rmdir web/api/app/Plugin/CakePHP-Enum-Behavior rmdir web/api/app/Plugin/CakePHP-Enum-Behavior
@ -182,7 +182,7 @@ setrpmpkgname () {
export RELEASE="1.${numcommits}.${thedate}git${shorthash}" export RELEASE="1.${numcommits}.${thedate}git${shorthash}"
checkvars checkvars
echo echo
echo "Packpack VERSION has been set to: ${VERSION}" echo "Packpack VERSION has been set to: ${VERSION}"
echo "Packpack RELEASE has been set to: ${RELEASE}" echo "Packpack RELEASE has been set to: ${RELEASE}"
@ -201,7 +201,7 @@ setdebpkgname () {
export RELEASE="${DIST}" export RELEASE="${DIST}"
checkvars checkvars
echo echo
echo "Packpack VERSION has been set to: ${VERSION}" echo "Packpack VERSION has been set to: ${VERSION}"
echo "Packpack RELEASE has been set to: ${RELEASE}" echo "Packpack RELEASE has been set to: ${RELEASE}"
@ -224,7 +224,7 @@ setdebchangelog () {
DATE=`date -R` DATE=`date -R`
cat <<EOF > debian/changelog cat <<EOF > debian/changelog
zoneminder ($VERSION-${DIST}) ${DIST}; urgency=low zoneminder ($VERSION-${DIST}) ${DIST}; urgency=low
* *
-- Isaac Connor <isaac@zoneminder.com> $DATE -- Isaac Connor <isaac@zoneminder.com> $DATE
EOF EOF
} }
@ -294,83 +294,67 @@ checksanity
# We don't want to build packages for all supported distros after every commit # We don't want to build packages for all supported distros after every commit
# Only build all packages when executed via cron # Only build all packages when executed via cron
# See https://docs.travis-ci.com/user/cron-jobs/ # See https://docs.travis-ci.com/user/cron-jobs/
if [ "${TRAVIS_EVENT_TYPE}" == "cron" ] || [ "${TRAVIS}" != "true" ] || [ "${DIST}" == "buster" ] ; then
# Steps common to Redhat distros
if [ "${OS}" == "el" ] || [ "${OS}" == "fedora" ]; then
if [ "${TRAVIS_EVENT_TYPE}" == "cron" ] || [ "${TRAVIS}" != "true" ]; then
commonprep commonprep
echo "Begin Redhat build..."
# Steps common to Redhat distros setrpmpkgname
if [ "${OS}" == "el" ] || [ "${OS}" == "fedora" ]; then
echo "Begin Redhat build..."
setrpmpkgname ln -sfT distros/redhat rpm
ln -sfT distros/redhat rpm # The rpm specfile requires the Crud submodule folder to be empty
rm -rf web/api/app/Plugin/Crud
mkdir web/api/app/Plugin/Crud
# The rpm specfile requires the Crud submodule folder to be empty reporpm="rpmfusion-free-release"
rm -rf web/api/app/Plugin/Crud dlurl="https://download1.rpmfusion.org/free/${OS}/${reporpm}-${DIST}.noarch.rpm"
mkdir web/api/app/Plugin/Crud
reporpm="rpmfusion-free-release" # Give our downloaded repo rpm a common name so redhat_package.mk can find it
dlurl="https://download1.rpmfusion.org/free/${OS}/${reporpm}-${DIST}.noarch.rpm" if [ -n "$dlurl" ] && [ $? -eq 0 ]; then
echo "Retrieving ${reporpm} repo rpm..."
# Give our downloaded repo rpm a common name so redhat_package.mk can find it curl $dlurl > build/external-repo.noarch.rpm
if [ -n "$dlurl" ] && [ $? -eq 0 ]; then else
echo "Retrieving ${reporpm} repo rpm..." echo "ERROR: Failed to retrieve ${reporpm} repo rpm..."
curl $dlurl > build/external-repo.noarch.rpm echo "Download url was: $dlurl"
else exit 1
echo "ERROR: Failed to retrieve ${reporpm} repo rpm..."
echo "Download url was: $dlurl"
exit 1
fi
setrpmchangelog
echo "Starting packpack..."
execpackpack
# Steps common to Debian based distros
elif [ "${OS}" == "debian" ] || [ "${OS}" == "ubuntu" ] || [ "${OS}" == "raspbian" ]; then
echo "Begin ${OS} ${DIST} build..."
setdebpkgname
movecrud
if [ "${DIST}" == "trusty" ] || [ "${DIST}" == "precise" ]; then
ln -sfT distros/ubuntu1204 debian
elif [ "${DIST}" == "wheezy" ]; then
ln -sfT distros/debian debian
else
ln -sfT distros/ubuntu1604 debian
fi
setdebchangelog
echo "Starting packpack..."
execpackpack
if [ "${TRAVIS}" == "true" ]; then
install_deb
fi
fi fi
# We were not triggered via cron so just build and test trusty setrpmchangelog
elif [ "${OS}" == "ubuntu" ] && [ "${DIST}" == "trusty" ] && [ "${ARCH}" == "x86_64" ]; then
echo "Begin Ubuntu Trusty build..."
commonprep
setdebpkgname
movecrud
ln -sfT distros/ubuntu1204 debian
setdebchangelog
echo "Starting packpack..." echo "Starting packpack..."
execpackpack execpackpack
fi;
# Steps common to Debian based distros
elif [ "${OS}" == "debian" ] || [ "${OS}" == "ubuntu" ] || [ "${OS}" == "raspbian" ]; then
commonprep
echo "Begin ${OS} ${DIST} build..."
setdebpkgname
movecrud
if [ "${DIST}" == "trusty" ] || [ "${DIST}" == "precise" ]; then
ln -sfT distros/ubuntu1204 debian
elif [ "${DIST}" == "wheezy" ]; then
ln -sfT distros/debian debian
else
ln -sfT distros/ubuntu1604 debian
fi
setdebchangelog
echo "Starting packpack..."
execpackpack
# We were not triggered via cron so just build and test trusty
if [ "${OS}" == "ubuntu" ] && [ "${DIST}" == "trusty" ] && [ "${ARCH}" == "x86_64" ]; then
# If we are running inside Travis then attempt to install the deb we just built # If we are running inside Travis then attempt to install the deb we just built
if [ "${TRAVIS}" == "true" ]; then if [ "${TRAVIS}" == "true" ]; then
install_deb install_deb
fi fi
fi
fi fi
exit 0 exit 0

View File

@ -10,193 +10,193 @@ if ($_REQUEST['entity'] == 'navBar') {
} }
$statusData = array( $statusData = array(
'system' => array( 'system' => array(
'permission' => 'System', 'permission' => 'System',
'table' => 'Monitors', 'table' => 'Monitors',
'limit' => 1, 'limit' => 1,
'elements' => array( 'elements' => array(
'MonitorCount' => array( 'sql' => 'count(*)' ), 'MonitorCount' => array( 'sql' => 'count(*)' ),
'ActiveMonitorCount' => array( 'sql' => "count(if(Function != 'None',1,NULL))" ), 'ActiveMonitorCount' => array( 'sql' => "count(if(Function != 'None',1,NULL))" ),
'State' => array( 'func' => 'daemonCheck()?'.translate('Running').':'.translate('Stopped') ), 'State' => array( 'func' => 'daemonCheck()?'.translate('Running').':'.translate('Stopped') ),
'Load' => array( 'func' => 'getLoad()' ), 'Load' => array( 'func' => 'getLoad()' ),
'Disk' => array( 'func' => 'getDiskPercent()' ), 'Disk' => array( 'func' => 'getDiskPercent()' ),
), ),
), ),
'monitor' => array( 'monitor' => array(
'permission' => 'Monitors', 'permission' => 'Monitors',
'table' => 'Monitors', 'table' => 'Monitors',
'limit' => 1, 'limit' => 1,
'selector' => 'Monitors.Id', 'selector' => 'Monitors.Id',
'elements' => array( 'elements' => array(
'Id' => array( 'sql' => 'Monitors.Id' ), 'Id' => array( 'sql' => 'Monitors.Id' ),
'Name' => array( 'sql' => 'Monitors.Name' ), 'Name' => array( 'sql' => 'Monitors.Name' ),
'Type' => true, 'Type' => true,
'Function' => true, 'Function' => true,
'Enabled' => true, 'Enabled' => true,
'LinkedMonitors' => true, 'LinkedMonitors' => true,
'Triggers' => true, 'Triggers' => true,
'Device' => true, 'Device' => true,
'Channel' => true, 'Channel' => true,
'Format' => true, 'Format' => true,
'Host' => true, 'Host' => true,
'Port' => true, 'Port' => true,
'Path' => true, 'Path' => true,
'Width' => array( 'sql' => 'Monitors.Width' ), 'Width' => array( 'sql' => 'Monitors.Width' ),
'Height' => array( 'sql' => 'Monitors.Height' ), 'Height' => array( 'sql' => 'Monitors.Height' ),
'Palette' => true, 'Palette' => true,
'Orientation' => true, 'Orientation' => true,
'Brightness' => true, 'Brightness' => true,
'Contrast' => true, 'Contrast' => true,
'Hue' => true, 'Hue' => true,
'Colour' => true, 'Colour' => true,
'EventPrefix' => true, 'EventPrefix' => true,
'LabelFormat' => true, 'LabelFormat' => true,
'LabelX' => true, 'LabelX' => true,
'LabelY' => true, 'LabelY' => true,
'LabelSize' => true, 'LabelSize' => true,
'ImageBufferCount' => true, 'ImageBufferCount' => true,
'WarmupCount' => true, 'WarmupCount' => true,
'PreEventCount' => true, 'PreEventCount' => true,
'PostEventCount' => true, 'PostEventCount' => true,
'AlarmFrameCount' => true, 'AlarmFrameCount' => true,
'SectionLength' => true, 'SectionLength' => true,
'FrameSkip' => true, 'FrameSkip' => true,
'MotionFrameSkip' => true, 'MotionFrameSkip' => true,
'MaxFPS' => true, 'MaxFPS' => true,
'AlarmMaxFPS' => true, 'AlarmMaxFPS' => true,
'FPSReportInterval' => true, 'FPSReportInterval' => true,
'RefBlendPerc' => true, 'RefBlendPerc' => true,
'Controllable' => true, 'Controllable' => true,
'ControlId' => true, 'ControlId' => true,
'ControlDevice' => true, 'ControlDevice' => true,
'ControlAddress' => true, 'ControlAddress' => true,
'AutoStopTimeout' => true, 'AutoStopTimeout' => true,
'TrackMotion' => true, 'TrackMotion' => true,
'TrackDelay' => true, 'TrackDelay' => true,
'ReturnLocation' => true, 'ReturnLocation' => true,
'ReturnDelay' => true, 'ReturnDelay' => true,
'DefaultView' => true, 'DefaultView' => true,
'DefaultRate' => true, 'DefaultRate' => true,
'DefaultScale' => true, 'DefaultScale' => true,
'WebColour' => true, 'WebColour' => true,
'Sequence' => true, 'Sequence' => true,
'MinEventId' => array( 'sql' => '(SELECT min(Events.Id) FROM Events WHERE Events.MonitorId = Monitors.Id' ), 'MinEventId' => array( 'sql' => '(SELECT min(Events.Id) FROM Events WHERE Events.MonitorId = Monitors.Id' ),
'MaxEventId' => array( 'sql' => '(SELECT max(Events.Id) FROM Events WHERE Events.MonitorId = Monitors.Id' ), 'MaxEventId' => array( 'sql' => '(SELECT max(Events.Id) FROM Events WHERE Events.MonitorId = Monitors.Id' ),
'TotalEvents' => array( 'sql' => '(SELECT count(Events.Id) FROM Events WHERE Events.MonitorId = Monitors.Id' ), 'TotalEvents' => array( 'sql' => '(SELECT count(Events.Id) FROM Events WHERE Events.MonitorId = Monitors.Id' ),
'Status' => array( 'zmu' => '-m '.escapeshellarg($_REQUEST['id'][0]).' -s' ), 'Status' => array( 'zmu' => '-m '.escapeshellarg($_REQUEST['id'][0]).' -s' ),
'FrameRate' => array( 'zmu' => '-m '.escapeshellarg($_REQUEST['id'][0]).' -f' ), 'FrameRate' => array( 'zmu' => '-m '.escapeshellarg($_REQUEST['id'][0]).' -f' ),
), ),
), ),
'events' => array( 'events' => array(
'permission' => 'Events', 'permission' => 'Events',
'table' => 'Events', 'table' => 'Events',
'selector' => 'Events.MonitorId', 'selector' => 'Events.MonitorId',
'elements' => array( 'elements' => array(
'Id' => true, 'Id' => true,
'Name' => true, 'Name' => true,
'Cause' => true, 'Cause' => true,
'Notes' => true, 'Notes' => true,
'StartTime' => true, 'StartTime' => true,
'StartTimeShort' => array( 'sql' => "date_format( StartTime, '".MYSQL_FMT_DATETIME_SHORT."' )" ), 'StartTimeShort' => array( 'sql' => "date_format( StartTime, '".MYSQL_FMT_DATETIME_SHORT."' )" ),
'EndTime' => true, 'EndTime' => true,
'Width' => true, 'Width' => true,
'Height' => true, 'Height' => true,
'Length' => true, 'Length' => true,
'Frames' => true, 'Frames' => true,
'AlarmFrames' => true, 'AlarmFrames' => true,
'TotScore' => true, 'TotScore' => true,
'AvgScore' => true, 'AvgScore' => true,
'MaxScore' => true, 'MaxScore' => true,
), ),
), ),
'event' => array( 'event' => array(
'permission' => 'Events', 'permission' => 'Events',
'table' => 'Events', 'table' => 'Events',
'limit' => 1, 'limit' => 1,
'selector' => 'Events.Id', 'selector' => 'Events.Id',
'elements' => array( 'elements' => array(
'Id' => array( 'sql' => 'Events.Id' ), 'Id' => array( 'sql' => 'Events.Id' ),
'MonitorId' => true, 'MonitorId' => true,
'MonitorName' => array('sql' => '(SELECT Monitors.Name FROM Monitors WHERE Monitors.Id = Events.MonitorId)'), 'MonitorName' => array('sql' => '(SELECT Monitors.Name FROM Monitors WHERE Monitors.Id = Events.MonitorId)'),
'Name' => true, 'Name' => true,
'Cause' => true, 'Cause' => true,
'StartTime' => true, 'StartTime' => true,
'StartTimeShort' => array( 'sql' => "date_format( StartTime, '".MYSQL_FMT_DATETIME_SHORT."' )" ), 'StartTimeShort' => array( 'sql' => "date_format( StartTime, '".MYSQL_FMT_DATETIME_SHORT."' )" ),
'EndTime' => true, 'EndTime' => true,
'Width' => true, 'Width' => true,
'Height' => true, 'Height' => true,
'Length' => true, 'Length' => true,
'Frames' => true, 'Frames' => true,
'DefaultVideo' => true, 'DefaultVideo' => true,
'AlarmFrames' => true, 'AlarmFrames' => true,
'TotScore' => true, 'TotScore' => true,
'AvgScore' => true, 'AvgScore' => true,
'MaxScore' => true, 'MaxScore' => true,
'Archived' => true, 'Archived' => true,
'Videoed' => true, 'Videoed' => true,
'Uploaded' => true, 'Uploaded' => true,
'Emailed' => true, 'Emailed' => true,
'Messaged' => true, 'Messaged' => true,
'Executed' => true, 'Executed' => true,
'Notes' => true, 'Notes' => true,
'MinFrameId' => array( 'sql' => '(SELECT min(Frames.FrameId) FROM Frames WHERE EventId=Events.Id)' ), 'MinFrameId' => array( 'sql' => '(SELECT min(Frames.FrameId) FROM Frames WHERE EventId=Events.Id)' ),
'MaxFrameId' => array( 'sql' => '(SELECT max(Frames.FrameId) FROM Frames WHERE Events.Id = Frames.EventId)' ), 'MaxFrameId' => array( 'sql' => '(SELECT max(Frames.FrameId) FROM Frames WHERE Events.Id = Frames.EventId)' ),
'MinFrameDelta' => array( 'sql' => '(SELECT min(Frames.Delta) FROM Frames WHERE Events.Id = Frames.EventId)' ), 'MinFrameDelta' => array( 'sql' => '(SELECT min(Frames.Delta) FROM Frames WHERE Events.Id = Frames.EventId)' ),
'MaxFrameDelta' => array( 'sql' => '(SELECT max(Frames.Delta) FROM Frames WHERE Events.Id = Frames.EventId)' ), 'MaxFrameDelta' => array( 'sql' => '(SELECT max(Frames.Delta) FROM Frames WHERE Events.Id = Frames.EventId)' ),
), ),
), ),
'frames' => array( 'frames' => array(
'permission' => 'Events', 'permission' => 'Events',
'table' => 'Frames', 'table' => 'Frames',
'selector' => 'EventId', 'selector' => 'EventId',
'elements' => array( 'elements' => array(
'EventId' => true, 'EventId' => true,
'FrameId' => true, 'FrameId' => true,
'Type' => true, 'Type' => true,
'Delta' => true, 'Delta' => true,
), ),
), ),
'frame' => array( 'frame' => array(
'permission' => 'Events', 'permission' => 'Events',
'table' => 'Frames', 'table' => 'Frames',
'limit' => 1, 'limit' => 1,
'selector' => array( array( 'table' => 'Events', 'join' => 'Events.Id = Frames.EventId', 'selector'=>'Events.Id' ), 'Frames.FrameId' ), 'selector' => array( array( 'table' => 'Events', 'join' => 'Events.Id = Frames.EventId', 'selector'=>'Events.Id' ), 'Frames.FrameId' ),
'elements' => array( 'elements' => array(
//'Id' => array( 'sql' => 'Frames.FrameId' ), //'Id' => array( 'sql' => 'Frames.FrameId' ),
'FrameId' => true, 'FrameId' => true,
'EventId' => true, 'EventId' => true,
'Type' => true, 'Type' => true,
'TimeStamp' => true, 'TimeStamp' => true,
'TimeStampShort' => array( 'sql' => "date_format( StartTime, '".MYSQL_FMT_DATETIME_SHORT."' )" ), 'TimeStampShort' => array( 'sql' => "date_format( StartTime, '".MYSQL_FMT_DATETIME_SHORT."' )" ),
'Delta' => true, 'Delta' => true,
'Score' => true, 'Score' => true,
//'Image' => array( 'postFunc' => 'getFrameImage' ), //'Image' => array( 'postFunc' => 'getFrameImage' ),
), ),
), ),
'frameimage' => array( 'frameimage' => array(
'permission' => 'Events', 'permission' => 'Events',
'func' => 'getFrameImage()' 'func' => 'getFrameImage()'
), ),
'nearframe' => array( 'nearframe' => array(
'permission' => 'Events', 'permission' => 'Events',
'func' => 'getNearFrame()' 'func' => 'getNearFrame()'
), ),
'nearevents' => array( 'nearevents' => array(
'permission' => 'Events', 'permission' => 'Events',
'func' => 'getNearEvents()' 'func' => 'getNearEvents()'
) )
); );
function collectData() { function collectData() {
global $statusData; global $statusData;
$entitySpec = &$statusData[strtolower(validJsStr($_REQUEST['entity']))]; $entitySpec = &$statusData[strtolower(validJsStr($_REQUEST['entity']))];
#print_r( $entitySpec ); #print_r( $entitySpec );
if ( !canView( $entitySpec['permission'] ) ) if ( !canView($entitySpec['permission']) )
ajaxError('Unrecognised action or insufficient permissions'); ajaxError('Unrecognised action or insufficient permissions');
if ( !empty($entitySpec['func']) ) { if ( !empty($entitySpec['func']) ) {
$data = eval( 'return( '.$entitySpec['func']." );" ); $data = eval('return('.$entitySpec['func'].');');
} else { } else {
$data = array(); $data = array();
$postFuncs = array(); $postFuncs = array();
@ -249,12 +249,12 @@ function collectData() {
$groupSql[] = $elementData['group']; $groupSql[] = $elementData['group'];
} }
} }
} } # end foreach element
if ( count($fieldSql) ) { if ( count($fieldSql) ) {
$sql = 'select '.join( ', ', $fieldSql ).' from '.$entitySpec['table']; $sql = 'SELECT '.join(', ', $fieldSql).' FROM '.$entitySpec['table'];
if ( $joinSql ) if ( $joinSql )
$sql .= ' '.join( ' ', array_unique( $joinSql ) ); $sql .= ' '.join(' ', array_unique($joinSql));
if ( $id && !empty($entitySpec['selector']) ) { if ( $id && !empty($entitySpec['selector']) ) {
$index = 0; $index = 0;
$where = array(); $where = array();
@ -270,10 +270,10 @@ function collectData() {
} }
$index++; $index++;
} }
$sql .= ' WHERE '.join( ' AND ', $where ); $sql .= ' WHERE '.join(' AND ', $where);
} }
if ( $groupSql ) if ( $groupSql )
$sql .= ' GROUP BY '.join( ',', array_unique( $groupSql ) ); $sql .= ' GROUP BY '.join(',', array_unique($groupSql));
if ( !empty($_REQUEST['sort']) ) { if ( !empty($_REQUEST['sort']) ) {
$sql .= ' ORDER BY '; $sql .= ' ORDER BY ';
$sort_fields = explode(',',$_REQUEST['sort']); $sort_fields = explode(',',$_REQUEST['sort']);
@ -335,31 +335,29 @@ if ( !isset($_REQUEST['layout']) ) {
switch( $_REQUEST['layout'] ) { switch( $_REQUEST['layout'] ) {
case 'xml NOT CURRENTLY SUPPORTED' : case 'xml NOT CURRENTLY SUPPORTED' :
{ header('Content-type: application/xml');
header("Content-type: application/xml" ); echo('<?xml version="1.0" encoding="iso-8859-1"?>'."\n");
echo( '<?xml version="1.0" encoding="iso-8859-1"?>'."\n" );
echo '<'.strtolower($_REQUEST['entity']).">\n"; echo '<'.strtolower($_REQUEST['entity']).">\n";
foreach ( $data as $key=>$value ) { foreach ( $data as $key=>$value ) {
$key = strtolower( $key ); $key = strtolower($key);
echo "<$key>".htmlentities($value)."</$key>\n"; echo "<$key>".htmlentities($value)."</$key>\n";
} }
echo '</'.strtolower($_REQUEST['entity']).">\n"; echo '</'.strtolower($_REQUEST['entity']).">\n";
break; break;
}
case 'json' : case 'json' :
{ {
$response = array( strtolower(validJsStr($_REQUEST['entity'])) => $data ); $response = array( strtolower(validJsStr($_REQUEST['entity'])) => $data );
if ( isset($_REQUEST['loopback']) ) if ( isset($_REQUEST['loopback']) )
$response['loopback'] = validJsStr($_REQUEST['loopback']); $response['loopback'] = validJsStr($_REQUEST['loopback']);
ajaxResponse( $response ); ajaxResponse($response);
break; break;
} }
case 'text' : case 'text' :
{
header('Content-type: text/plain' ); header('Content-type: text/plain' );
echo join( ' ', array_values( $data ) ); echo join( ' ', array_values( $data ) );
break; break;
} default:
ZM\Error('Unsupported layout: '. $_REQUEST['layout']);
} }
function getFrameImage() { function getFrameImage() {

View File

@ -6,6 +6,15 @@ require_once('Object.php');
class Frame extends ZM_Object { class Frame extends ZM_Object {
protected static $table = 'Frames'; protected static $table = 'Frames';
protected $defaults = array(
'Id' => null,
'EventId' => 0,
'FrameId' => 0,
'Type' => 'Normal',
'TimeStamp' => 0,
'Delta' => 0.00,
'Score' => 0,
);
public static function find( $parameters = array(), $options = array() ) { public static function find( $parameters = array(), $options = array() ) {
return ZM_Object::_find(get_class(), $parameters, $options); return ZM_Object::_find(get_class(), $parameters, $options);

View File

@ -119,9 +119,8 @@ private $status_fields = array(
if ( !array_key_exists('Control', $this) ) { if ( !array_key_exists('Control', $this) ) {
if ( $this->ControlId() ) if ( $this->ControlId() )
$this->{'Control'} = Control::find_one(array('Id'=>$this->{'ControlId'})); $this->{'Control'} = Control::find_one(array('Id'=>$this->{'ControlId'}));
else
Error("No ControlId".print_r($this,true)); if ( !(array_key_exists('Control', $this) and $this->{'Control'}) )
if ( !(array_key_exists('Control', $this) and $this->{'Control'} ) )
$this->{'Control'} = new Control(); $this->{'Control'} = new Control();
} }
return $this->{'Control'}; return $this->{'Control'};
@ -147,11 +146,14 @@ private $status_fields = array(
} }
return $this->defaults[$fn]; return $this->defaults[$fn];
} else if ( array_key_exists($fn, $this->status_fields) ) { } else if ( array_key_exists($fn, $this->status_fields) ) {
$sql = 'SELECT Status,CaptureFPS,AnalysisFPS,CaptureBandwidth $sql = 'SELECT `Status`,`CaptureFPS`,`AnalysisFPS`,`CaptureBandwidth`
FROM Monitor_Status WHERE MonitorId=?'; FROM `Monitor_Status` WHERE `MonitorId`=?';
$row = dbFetchOne($sql, NULL, array($this->{'Id'})); $row = dbFetchOne($sql, NULL, array($this->{'Id'}));
if ( !$row ) { if ( !$row ) {
Error('Unable to load Monitor record for Id='.$this->{'Id'}); Error('Unable to load Monitor record for Id='.$this->{'Id'});
foreach ( $this->status_fields as $k => $v ) {
$this->{$k} = $v;
}
} else { } else {
foreach ($row as $k => $v) { foreach ($row as $k => $v) {
$this->{$k} = $v; $this->{$k} = $v;
@ -241,7 +243,7 @@ private $status_fields = array(
function zmcControl( $mode=false ) { function zmcControl( $mode=false ) {
if ( ! $this->{'Id'} ) { if ( ! $this->{'Id'} ) {
Warning("Attempt to control a monitor with no Id"); Warning('Attempt to control a monitor with no Id');
return; return;
} }
if ( (!defined('ZM_SERVER_ID')) or ( array_key_exists('ServerId', $this) and (ZM_SERVER_ID==$this->{'ServerId'}) ) ) { if ( (!defined('ZM_SERVER_ID')) or ( array_key_exists('ServerId', $this) and (ZM_SERVER_ID==$this->{'ServerId'}) ) ) {
@ -287,13 +289,13 @@ private $status_fields = array(
Error("Except $e thrown trying to restart zmc"); Error("Except $e thrown trying to restart zmc");
} }
} else { } else {
Error("Server not assigned to Monitor in a multi-server setup. Please assign a server to the Monitor."); Error('Server not assigned to Monitor in a multi-server setup. Please assign a server to the Monitor.');
} }
} // end function zmcControl } // end function zmcControl
function zmaControl($mode=false) { function zmaControl($mode=false) {
if ( ! $this->{'Id'} ) { if ( ! $this->{'Id'} ) {
Warning("Attempt to control a monitor with no Id"); Warning('Attempt to control a monitor with no Id');
return; return;
} }
@ -360,7 +362,7 @@ private $status_fields = array(
if ( !array_key_exists('GroupIds', $this) ) { if ( !array_key_exists('GroupIds', $this) ) {
if ( array_key_exists('Id', $this) and $this->{'Id'} ) { if ( array_key_exists('Id', $this) and $this->{'Id'} ) {
$this->{'GroupIds'} = dbFetchAll('SELECT GroupId FROM Groups_Monitors WHERE MonitorId=?', 'GroupId', array($this->{'Id'}) ); $this->{'GroupIds'} = dbFetchAll('SELECT `GroupId` FROM `Groups_Monitors` WHERE `MonitorId`=?', 'GroupId', array($this->{'Id'}) );
if ( ! $this->{'GroupIds'} ) if ( ! $this->{'GroupIds'} )
$this->{'GroupIds'} = array(); $this->{'GroupIds'} = array();
} else { } else {
@ -432,7 +434,7 @@ private $status_fields = array(
} else { } else {
$source = $this->{'Path'}; $source = $this->{'Path'};
} }
} elseif ( ZM_WEB_FILTER_SOURCE == "NoCredentials" ) { } elseif ( ZM_WEB_FILTER_SOURCE == 'NoCredentials' ) {
# Filter out sensitive and common items # Filter out sensitive and common items
unset($url_parts['user']); unset($url_parts['user']);
unset($url_parts['pass']); unset($url_parts['pass']);

View File

@ -39,7 +39,7 @@ class Server extends ZM_Object {
} else if ( $this->Id() ) { } else if ( $this->Id() ) {
return $this->{'Name'}; return $this->{'Name'};
} }
$result = explode(':',$_SERVER['HTTP_HOST']); $result = explode(':', $_SERVER['HTTP_HOST']);
return $result[0]; return $result[0];
} }
@ -88,11 +88,6 @@ class Server extends ZM_Object {
} }
public function Url( $port = null ) { public function Url( $port = null ) {
if ( !$this->Id() ) {
# Trying to guess and make up values tends to break proxies. So just return nothing
# so that the resulting url will be something like "?view="
return '';
}
$url = $this->Protocol().'://'; $url = $this->Protocol().'://';
$url .= $this->Hostname(); $url .= $this->Hostname();
if ( $port ) { if ( $port ) {

View File

@ -85,6 +85,11 @@ if ( $action == 'monitor' ) {
$monitor->zmaControl('stop'); $monitor->zmaControl('stop');
$monitor->zmcControl('stop'); $monitor->zmcControl('stop');
} }
# These are used in updating zones
$oldW = $monitor->Width();
$oldH = $monitor->Height();
if ( $monitor->save($changes) ) { if ( $monitor->save($changes) ) {
// Groups will be added below // Groups will be added below
@ -92,7 +97,7 @@ if ( $action == 'monitor' ) {
// creating symlinks when symlink already exists reports errors, but is perfectly ok // creating symlinks when symlink already exists reports errors, but is perfectly ok
error_reporting(0); error_reporting(0);
$OldStorage = $monitor->StorageId(); $OldStorage = $monitor->Storage();
$saferOldName = basename($monitor->Name()); $saferOldName = basename($monitor->Name());
if ( file_exists($OldStorage->Path().'/'.$saferOldName) ) if ( file_exists($OldStorage->Path().'/'.$saferOldName) )
unlink($OldStorage->Path().'/'.$saferOldName); unlink($OldStorage->Path().'/'.$saferOldName);
@ -115,36 +120,75 @@ if ( $action == 'monitor' ) {
if ( isset($changes['Width']) || isset($changes['Height']) ) { if ( isset($changes['Width']) || isset($changes['Height']) ) {
$newW = $_REQUEST['newMonitor']['Width']; $newW = $_REQUEST['newMonitor']['Width'];
$newH = $_REQUEST['newMonitor']['Height']; $newH = $_REQUEST['newMonitor']['Height'];
$newA = $newW * $newH;
$oldW = $monitor['Width'];
$oldH = $monitor['Height'];
$oldA = $oldW * $oldH;
$zones = dbFetchAll('SELECT * FROM Zones WHERE MonitorId=?', NULL, array($mid)); $zones = dbFetchAll('SELECT * FROM Zones WHERE MonitorId=?', NULL, array($mid));
foreach ( $zones as $zone ) {
$newZone = $zone;
$points = coordsToPoints($zone['Coords']);
for ( $i = 0; $i < count($points); $i++ ) {
$points[$i]['x'] = intval(($points[$i]['x']*($newW-1))/($oldW-1));
$points[$i]['y'] = intval(($points[$i]['y']*($newH-1))/($oldH-1));
}
$newZone['Coords'] = pointsToCoords($points);
$newZone['Area'] = intval(round(($zone['Area']*$newA)/$oldA));
$newZone['MinAlarmPixels'] = intval(round(($newZone['MinAlarmPixels']*$newA)/$oldA));
$newZone['MaxAlarmPixels'] = intval(round(($newZone['MaxAlarmPixels']*$newA)/$oldA));
$newZone['MinFilterPixels'] = intval(round(($newZone['MinFilterPixels']*$newA)/$oldA));
$newZone['MaxFilterPixels'] = intval(round(($newZone['MaxFilterPixels']*$newA)/$oldA));
$newZone['MinBlobPixels'] = intval(round(($newZone['MinBlobPixels']*$newA)/$oldA));
$newZone['MaxBlobPixels'] = intval(round(($newZone['MaxBlobPixels']*$newA)/$oldA));
$changes = getFormChanges($zone, $newZone, $types); if ( ($newW == $oldH) and ($newH == $oldW) ) {
foreach ( $zones as $zone ) {
$newZone = $zone;
# Rotation, no change to area etc just swap the coords
$newZone = $zone;
$points = coordsToPoints($zone['Coords']);
for ( $i = 0; $i < count($points); $i++ ) {
$x = $points[$i]['x'];
$points[$i]['x'] = $points[$i]['y'];
$points[$i]['y'] = $x;
if ( count($changes) ) { if ( $points[$i]['x'] > ($newW-1) ) {
dbQuery('UPDATE Zones SET '.implode(', ', $changes).' WHERE MonitorId=? AND Id=?', ZM\Warning("Correcting x {$points[$i]['x']} > $newW of zone {$newZone['Name']} as it extends outside the new dimensions");
array($mid, $zone['Id'])); $points[$i]['x'] = ($newW-1);
} }
} // end foreach zone if ( $points[$i]['y'] > ($newH-1) ) {
} // end if width and height ZM\Warning("Correcting y {$points[$i]['y']} $newH of zone {$newZone['Name']} as it extends outside the new dimensions");
$points[$i]['y'] = ($newH-1);
}
}
$newZone['Coords'] = pointsToCoords($points);
$changes = getFormChanges($zone, $newZone, $types);
if ( count($changes) ) {
dbQuery('UPDATE Zones SET '.implode(', ', $changes).' WHERE MonitorId=? AND Id=?',
array($mid, $zone['Id']));
}
} # end foreach zone
} else {
$newA = $newW * $newH;
$oldA = $oldW * $oldH;
foreach ( $zones as $zone ) {
$newZone = $zone;
$points = coordsToPoints($zone['Coords']);
for ( $i = 0; $i < count($points); $i++ ) {
$points[$i]['x'] = intval(($points[$i]['x']*($newW-1))/($oldW-1));
$points[$i]['y'] = intval(($points[$i]['y']*($newH-1))/($oldH-1));
if ( $points[$i]['x'] > ($newW-1) ) {
ZM\Warning("Correcting x of zone {$newZone['Name']} as it extends outside the new dimensions");
$points[$i]['x'] = ($newW-1);
}
if ( $points[$i]['y'] > ($newH-1) ) {
ZM\Warning("Correcting y of zone {$newZone['Name']} as it extends outside the new dimensions");
$points[$i]['y'] = ($newH-1);
}
}
$newZone['Coords'] = pointsToCoords($points);
$newZone['Area'] = intval(round(($zone['Area']*$newA)/$oldA));
$newZone['MinAlarmPixels'] = intval(round(($newZone['MinAlarmPixels']*$newA)/$oldA));
$newZone['MaxAlarmPixels'] = intval(round(($newZone['MaxAlarmPixels']*$newA)/$oldA));
$newZone['MinFilterPixels'] = intval(round(($newZone['MinFilterPixels']*$newA)/$oldA));
$newZone['MaxFilterPixels'] = intval(round(($newZone['MaxFilterPixels']*$newA)/$oldA));
$newZone['MinBlobPixels'] = intval(round(($newZone['MinBlobPixels']*$newA)/$oldA));
$newZone['MaxBlobPixels'] = intval(round(($newZone['MaxBlobPixels']*$newA)/$oldA));
$changes = getFormChanges($zone, $newZone, $types);
if ( count($changes) ) {
dbQuery('UPDATE Zones SET '.implode(', ', $changes).' WHERE MonitorId=? AND Id=?',
array($mid, $zone['Id']));
}
} // end foreach zone
} // end if rotation or just size change
} // end if changes in width or height
} // end if successful save } // end if successful save
$restart = true; $restart = true;
} else { // new monitor } else { // new monitor
@ -170,6 +214,13 @@ if ( $action == 'monitor' ) {
} }
} }
if ( isset($changes['GroupIds']) ) {
dbQuery('DELETE FROM Groups_Monitors WHERE MonitorId=?', array($mid));
foreach ( $changes['GroupIds'] as $group_id ) {
dbQuery('INSERT INTO Groups_Monitors (GroupId, MonitorId) VALUES (?,?)', array($group_id, $mid));
}
} // end if there has been a change of groups
$restart = true; $restart = true;
} else { } else {
ZM\Logger::Debug('No action due to no changes to Monitor'); ZM\Logger::Debug('No action due to no changes to Monitor');
@ -180,13 +231,6 @@ if ( $action == 'monitor' ) {
return; return;
} }
if ( isset($changes['GroupIds']) ) {
dbQuery('DELETE FROM Groups_Monitors WHERE MonitorId=?', array($mid));
foreach ( $changes['GroupIds'] as $group_id ) {
dbQuery('INSERT INTO Groups_Monitors (GroupId, MonitorId) VALUES (?,?)', array($group_id, $mid));
}
} // end if there has been a change of groups
if ( ZM_OPT_X10 ) { if ( ZM_OPT_X10 ) {
$x10Changes = getFormChanges($x10Monitor, $_REQUEST['newX10Monitor']); $x10Changes = getFormChanges($x10Monitor, $_REQUEST['newX10Monitor']);
@ -205,7 +249,6 @@ if ( $action == 'monitor' ) {
} # end if ZM_OPT_X10 } # end if ZM_OPT_X10
if ( $restart ) { if ( $restart ) {
if ( $monitor->Function() != 'None' and $monitor->Type() != 'WebSite' ) { if ( $monitor->Function() != 'None' and $monitor->Type() != 'WebSite' ) {
$monitor->zmcControl('start'); $monitor->zmcControl('start');
if ( ($monitor->Function() == 'Modect' or $monitor->Function() == 'Mocord') and $monitor->Enabled() ) if ( ($monitor->Function() == 'Modect' or $monitor->Function() == 'Mocord') and $monitor->Enabled() )

View File

@ -79,7 +79,7 @@ function CSPHeaders($view, $nonce) {
} }
default: { default: {
// Use Report-Only mode on all other pages. // Use Report-Only mode on all other pages.
header("Content-Security-Policy-Report-Only: script-src 'unsafe-inline' 'self' 'nonce-$nonce' $additionalScriptSrc"); header("Content-Security-Policy-Report-Only: script-src 'unsafe-inline' 'self' 'nonce-$nonce' $additionalScriptSrc report-uri https://zmrepo.zoneminder.com");
break; break;
} }
} }
@ -1400,8 +1400,8 @@ function getPagination( $pages, $page, $maxShortcuts, $query, $querySep='&amp;'
foreach ( $newPages as $newPage ) { foreach ( $newPages as $newPage ) {
$pageText .= '<a href="?view='.$view.$querySep.'page='.$newPage.$query.'">'.$newPage.'</a>&nbsp;'; $pageText .= '<a href="?view='.$view.$querySep.'page='.$newPage.$query.'">'.$newPage.'</a>&nbsp;';
} }
} # end if page > 1
}
$pageText .= '-&nbsp;'.$page.'&nbsp;-'; $pageText .= '-&nbsp;'.$page.'&nbsp;-';
if ( $page < $pages ) { if ( $page < $pages ) {
$newPages = array(); $newPages = array();
@ -1426,10 +1426,10 @@ function getPagination( $pages, $page, $maxShortcuts, $query, $querySep='&amp;'
if ( false && $page < ($pages-1) ) { if ( false && $page < ($pages-1) ) {
$pageText .= '<a href="?view='.$view.$querySep.'page='.$pages.$query.'">&gt;&gt;</a>'; $pageText .= '<a href="?view='.$view.$querySep.'page='.$pages.$query.'">&gt;&gt;</a>';
} }
} } # end if $page < $pages
} }
} }
return( $pageText ); return $pageText;
} }
function sortHeader( $field, $querySep='&amp;' ) { function sortHeader( $field, $querySep='&amp;' ) {

View File

@ -177,6 +177,7 @@ $SLANG = array(
'BadPostEventCount' => 'Post event image count must be an integer of zero or more', 'BadPostEventCount' => 'Post event image count must be an integer of zero or more',
'BadPreEventCount' => 'Pre event image count must be at least zero, and less than image buffer size', 'BadPreEventCount' => 'Pre event image count must be at least zero, and less than image buffer size',
'BadRefBlendPerc' => 'Reference blend percentage must be a positive integer', 'BadRefBlendPerc' => 'Reference blend percentage must be a positive integer',
'BadNoSaveJPEGsOrVideoWriter' => 'SaveJPEGs and VideoWriter are both set to disabled. Nothing will be recorded!',
'BadSectionLength' => 'Section length must be an integer of 30 or more', 'BadSectionLength' => 'Section length must be an integer of 30 or more',
'BadSignalCheckColour' => 'Signal check colour must be a valid RGB colour string', 'BadSignalCheckColour' => 'Signal check colour must be a valid RGB colour string',
'BadStreamReplayBuffer' => 'Stream replay buffer must be an integer of zero or more', 'BadStreamReplayBuffer' => 'Stream replay buffer must be an integer of zero or more',

View File

@ -50,7 +50,7 @@
// do this by default, uncomment this if required. // do this by default, uncomment this if required.
// //
// Example // Example
header( "Content-Type: text/html; charset=iso-8859-8-i" ); header( "Content-Type: text/html; charset=UTF-8" );
// You may need to change your locale here if your default one is incorrect for the // You may need to change your locale here if your default one is incorrect for the
// language described in this file, or if you have multiple languages supported. // language described in this file, or if you have multiple languages supported.
@ -71,59 +71,59 @@ setlocale( LC_ALL, 'he_IL' ); //All locale settings 4.3.0 and after
// Simple String Replacements // Simple String Replacements
$SLANG = array( $SLANG = array(
'24BitColour' => 'öáò 24 áéè', '24BitColour' => 'צבע 24 ביט',
'32BitColour' => 'öáò 32 áéè', // Added - 2011-06-15 '32BitColour' => 'צבע 32 ביט', // Added - 2011-06-15
'8BitGrey' => 'âååðé àôåø 8 áéè', '8BitGrey' => 'גווני אפור 8 ביט',
'Action' => 'ôòåìä', 'Action' => 'פעולה',
'Actual' => 'î÷åøé', 'Actual' => 'מקורי',
'AddNewControl' => 'äåñó ÷åðèøåì çãù', 'AddNewControl' => 'הוסף קונטרול חדש',
'AddNewMonitor' => 'äåñó îåðéèåø çãù', 'AddNewMonitor' => 'הוסף מוניטור חדש',
'AddNewServer' => 'Add New Server', // Added - 2018-08-30 'AddNewServer' => 'Add New Server', // Added - 2018-08-30
'AddNewStorage' => 'Add New Storage', // Added - 2018-08-30 'AddNewStorage' => 'Add New Storage', // Added - 2018-08-30
'AddNewUser' => 'äåñó îùúîù çãù', 'AddNewUser' => 'הוסף משתמש חדש',
'AddNewZone' => 'äåñó àéæåø çãù', 'AddNewZone' => 'הוסף איזור חדש',
'Alarm' => 'àæò÷ä', 'Alarm' => 'אזעקה',
'AlarmBrFrames' => 'àæò÷ú<br/>ôøééîéí', 'AlarmBrFrames' => 'אזעקת<br/>פריימים',
'AlarmFrame' => 'àæò÷ú ôøééîéí', 'AlarmFrame' => 'אזעקת פריימים',
'AlarmFrameCount' => 'ñôéøú àæò÷åú ôøééîéí', 'AlarmFrameCount' => 'ספירת אזעקות פריימים',
'AlarmLimits' => 'äâáìåú àæò÷ä', 'AlarmLimits' => 'הגבלות אזעקה',
'AlarmMaximumFPS' => 'Alarm Maximum FPS', 'AlarmMaximumFPS' => 'Alarm Maximum FPS',
'AlarmPx' => 'àæò÷ú Px', 'AlarmPx' => 'אזעקת Px',
'AlarmRGBUnset' => 'äéðê çééá ìàúçì àæò÷ú öáò', 'AlarmRGBUnset' => 'הינך חייב לאתחל אזעקת צבע',
'AlarmRefImageBlendPct'=> 'Alarm Reference Image Blend %ge', // Added - 2015-04-18 'AlarmRefImageBlendPct'=> 'Alarm Reference Image Blend %ge', // Added - 2015-04-18
'Alert' => 'äúøàä', 'Alert' => 'התראה',
'All' => 'äëì', 'All' => 'הכל',
'AnalysisFPS' => 'Analysis FPS', // Added - 2015-07-22 'AnalysisFPS' => 'Analysis FPS', // Added - 2015-07-22
'AnalysisUpdateDelay' => 'Analysis Update Delay', // Added - 2015-07-23 'AnalysisUpdateDelay' => 'Analysis Update Delay', // Added - 2015-07-23
'Apply' => 'äçì', 'Apply' => 'החל',
'ApplyingStateChange' => 'äçì ùéðåé îöá', 'ApplyingStateChange' => 'החל שינוי מצב',
'ArchArchived' => 'àøëéá áìáã', 'ArchArchived' => 'ארכיב בלבד',
'ArchUnarchived' => 'ìà ìàøëéá áìáã', 'ArchUnarchived' => 'לא לארכיב בלבד',
'Archive' => 'àøëéá', 'Archive' => 'ארכיב',
'Archived' => 'àåøëá', 'Archived' => 'אורכב',
'Area' => 'àæåø', 'Area' => 'אזור',
'AreaUnits' => 'àæåø (px/%)', 'AreaUnits' => 'אזור (px/%)',
'AttrAlarmFrames' => 'Alarm Frames', 'AttrAlarmFrames' => 'Alarm Frames',
'AttrArchiveStatus' => 'Archive Status', 'AttrArchiveStatus' => 'Archive Status',
'AttrAvgScore' => 'ðé÷åã îîåöò', 'AttrAvgScore' => 'ניקוד ממוצע',
'AttrCause' => 'ñéáä', 'AttrCause' => 'סיבה',
'AttrDiskBlocks' => 'Disk Blocks', 'AttrDiskBlocks' => 'Disk Blocks',
'AttrDiskPercent' => 'Disk Percent', 'AttrDiskPercent' => 'Disk Percent',
'AttrDiskSpace' => 'Disk Space', // Added - 2018-08-30 'AttrDiskSpace' => 'Disk Space', // Added - 2018-08-30
'AttrDuration' => 'îùê æîï', 'AttrDuration' => 'משך זמן',
'AttrEndDate' => 'End Date', // Added - 2018-08-30 'AttrEndDate' => 'End Date', // Added - 2018-08-30
'AttrEndDateTime' => 'End Date/Time', // Added - 2018-08-30 'AttrEndDateTime' => 'End Date/Time', // Added - 2018-08-30
'AttrEndTime' => 'End Time', // Added - 2018-08-30 'AttrEndTime' => 'End Time', // Added - 2018-08-30
'AttrEndWeekday' => 'End Weekday', // Added - 2018-08-30 'AttrEndWeekday' => 'End Weekday', // Added - 2018-08-30
'AttrFilterServer' => 'Server Filter is Running On', // Added - 2018-08-30 'AttrFilterServer' => 'Server Filter is Running On', // Added - 2018-08-30
'AttrFrames' => 'ôøééîéí', 'AttrFrames' => 'פריימים',
'AttrId' => 'Id', 'AttrId' => 'Id',
'AttrMaxScore' => 'ðé÷åã î÷ñéîìé', 'AttrMaxScore' => 'ניקוד מקסימלי',
'AttrMonitorId' => 'Monitor Id', 'AttrMonitorId' => 'Monitor Id',
'AttrMonitorName' => 'ùí îåðéèåø', 'AttrMonitorName' => 'שם מוניטור',
'AttrMonitorServer' => 'Server Monitor is Running On', // Added - 2018-08-30 'AttrMonitorServer' => 'Server Monitor is Running On', // Added - 2018-08-30
'AttrName' => 'ùí', 'AttrName' => 'שם',
'AttrNotes' => 'äòøåú', 'AttrNotes' => 'הערות',
'AttrStartDate' => 'Start Date', // Added - 2018-08-30 'AttrStartDate' => 'Start Date', // Added - 2018-08-30
'AttrStartDateTime' => 'Start Date/Time', // Added - 2018-08-30 'AttrStartDateTime' => 'Start Date/Time', // Added - 2018-08-30
'AttrStartTime' => 'Start Time', // Added - 2018-08-30 'AttrStartTime' => 'Start Time', // Added - 2018-08-30
@ -132,13 +132,13 @@ $SLANG = array(
'AttrStorageArea' => 'Storage Area', // Added - 2018-08-30 'AttrStorageArea' => 'Storage Area', // Added - 2018-08-30
'AttrStorageServer' => 'Server Hosting Storage', // Added - 2018-08-30 'AttrStorageServer' => 'Server Hosting Storage', // Added - 2018-08-30
'AttrSystemLoad' => 'System Load', 'AttrSystemLoad' => 'System Load',
'AttrTotalScore' => 'ñê ñëåí', 'AttrTotalScore' => 'סך סכום',
'Auto' => 'àåèå', 'Auto' => 'אוטו',
'AutoStopTimeout' => 'ôñ÷ æîï òöéøä àåèå', 'AutoStopTimeout' => 'פסק זמן עצירה אוטו',
'Available' => 'Available', // Added - 2009-03-31 'Available' => 'Available', // Added - 2009-03-31
'AvgBrScore' => 'ðé÷åã<br/>îîåöò', 'AvgBrScore' => 'ניקוד<br/>ממוצע',
'Background' => 'ø÷ò', 'Background' => 'רקע',
'BackgroundFilter' => 'äøõ îñðï áø÷ò', 'BackgroundFilter' => 'הרץ מסנן ברקע',
'BadAlarmFrameCount' => 'Alarm frame count must be an integer of one or more', 'BadAlarmFrameCount' => 'Alarm frame count must be an integer of one or more',
'BadAlarmMaxFPS' => 'Alarm Maximum FPS must be a positive integer or floating point value', 'BadAlarmMaxFPS' => 'Alarm Maximum FPS must be a positive integer or floating point value',
'BadAnalysisFPS' => 'Analysis FPS must be a positive integer or floating point value', // Added - 2015-07-22 'BadAnalysisFPS' => 'Analysis FPS must be a positive integer or floating point value', // Added - 2015-07-22
@ -165,30 +165,30 @@ $SLANG = array(
'BadRefBlendPerc' => 'Reference blend percentage must be a positive integer', 'BadRefBlendPerc' => 'Reference blend percentage must be a positive integer',
'BadSectionLength' => 'Section length must be an integer of 30 or more', 'BadSectionLength' => 'Section length must be an integer of 30 or more',
'BadSignalCheckColour' => 'Signal check colour must be a valid RGB colour string', 'BadSignalCheckColour' => 'Signal check colour must be a valid RGB colour string',
'BadSourceType' => 'Source Type \"Web Site\" requires the Function to be set to \"Monitor\"', // Added - 2018-08-30 'BadSourceType' => 'Source Type "Web Site" requires the Function to be set to "Monitor"', // Added - 2018-08-30
'BadStreamReplayBuffer'=> 'Stream replay buffer must be an integer of zero or more', 'BadStreamReplayBuffer'=> 'Stream replay buffer must be an integer of zero or more',
'BadWarmupCount' => 'Warmup frames must be an integer of zero or more', 'BadWarmupCount' => 'Warmup frames must be an integer of zero or more',
'BadWebColour' => 'Web colour must be a valid web colour string', 'BadWebColour' => 'Web colour must be a valid web colour string',
'BadWebSitePath' => 'Please enter a complete website url, including the http:// or https:// prefix.', // Added - 2018-08-30 'BadWebSitePath' => 'Please enter a complete website url, including the http:// or https:// prefix.', // Added - 2018-08-30
'BadWidth' => 'Width must be set to a valid value', 'BadWidth' => 'Width must be set to a valid value',
'Bandwidth' => 'øåçá ôñ', 'Bandwidth' => 'רוחב פס',
'BandwidthHead' => 'Bandwidth', // This is the end of the bandwidth status on the top of the console, different in many language due to phrasing 'BandwidthHead' => 'Bandwidth', // This is the end of the bandwidth status on the top of the console, different in many language due to phrasing
'BlobPx' => 'Blob Px', 'BlobPx' => 'Blob Px',
'BlobSizes' => 'Blob Sizes', 'BlobSizes' => 'Blob Sizes',
'Blobs' => 'Blobs', 'Blobs' => 'Blobs',
'Brightness' => 'áäéøåú', 'Brightness' => 'בהירות',
'Buffer' => 'Buffer', // Added - 2015-04-18 'Buffer' => 'Buffer', // Added - 2015-04-18
'Buffers' => 'Buffers', 'Buffers' => 'Buffers',
'CSSDescription' => 'Change the default css for this computer', // Added - 2015-04-18 'CSSDescription' => 'Change the default css for this computer', // Added - 2015-04-18
'CanAutoFocus' => 'àôùø äúî÷ãåú àåèåîèé', 'CanAutoFocus' => 'אפשר התמקדות אוטומטי',
'CanAutoGain' => 'Can Auto Gain', 'CanAutoGain' => 'Can Auto Gain',
'CanAutoIris' => 'Can Auto Iris', 'CanAutoIris' => 'Can Auto Iris',
'CanAutoWhite' => 'Can Auto White Bal.', 'CanAutoWhite' => 'Can Auto White Bal.',
'CanAutoZoom' => 'àôùø æåí àåèåîèé', 'CanAutoZoom' => 'אפשר זום אוטומטי',
'CanFocus' => 'àôùø äúî÷ãåú', 'CanFocus' => 'אפשר התמקדות',
'CanFocusAbs' => 'àôùø äúî÷ãåú àáñåìåèé', 'CanFocusAbs' => 'אפשר התמקדות אבסולוטי',
'CanFocusCon' => 'àôùø äúî÷ãåú îúîùê', 'CanFocusCon' => 'אפשר התמקדות מתמשך',
'CanFocusRel' => 'àôùø äúî÷ãåú éçñé', 'CanFocusRel' => 'אפשר התמקדות יחסי',
'CanGain' => 'Can Gain ', 'CanGain' => 'Can Gain ',
'CanGainAbs' => 'Can Gain Absolute', 'CanGainAbs' => 'Can Gain Absolute',
'CanGainCon' => 'Can Gain Continuous', 'CanGainCon' => 'Can Gain Continuous',
@ -197,142 +197,141 @@ $SLANG = array(
'CanIrisAbs' => 'Can Iris Absolute', 'CanIrisAbs' => 'Can Iris Absolute',
'CanIrisCon' => 'Can Iris Continuous', 'CanIrisCon' => 'Can Iris Continuous',
'CanIrisRel' => 'Can Iris Relative', 'CanIrisRel' => 'Can Iris Relative',
'CanMove' => 'àôùø úðåòä', 'CanMove' => 'אפשר תנועה',
'CanMoveAbs' => 'àôùø úðåòä àáñåìåèéú', 'CanMoveAbs' => 'אפשר תנועה אבסולוטית',
'CanMoveCon' => 'àôùø úæåæä îúîùëú', 'CanMoveCon' => 'אפשר תזוזה מתמשכת',
'CanMoveDiag' => 'Can Move Diagonally', 'CanMoveDiag' => 'Can Move Diagonally',
'CanMoveMap' => 'Can Move Mapped', 'CanMoveMap' => 'Can Move Mapped',
'CanMoveRel' => 'àôùø úæåæä éçñéú', 'CanMoveRel' => 'אפשר תזוזה יחסית',
'CanPan' => 'Can Pan' , 'CanPan' => 'Can Pan' ,
'CanReset' => 'àôùø àúçåì', 'CanReset' => 'אפשר אתחול',
'CanReboot' => 'Can Reboot',
'CanSetPresets' => 'Can Set Presets', 'CanSetPresets' => 'Can Set Presets',
'CanSleep' => 'àôùø îöá ùéðä', 'CanSleep' => 'אפשר מצב שינה',
'CanTilt' => 'àôùø æòæåò', 'CanTilt' => 'אפשר זעזוע',
'CanWake' => 'àôùø éöéàä îîöá ùéðä', 'CanWake' => 'אפשר יציאה ממצב שינה',
'CanWhite' => 'Can White Balance', 'CanWhite' => 'Can White Balance',
'CanWhiteAbs' => 'Can White Bal. Absolute', 'CanWhiteAbs' => 'Can White Bal. Absolute',
'CanWhiteBal' => 'Can White Bal.', 'CanWhiteBal' => 'Can White Bal.',
'CanWhiteCon' => 'Can White Bal. Continuous', 'CanWhiteCon' => 'Can White Bal. Continuous',
'CanWhiteRel' => 'Can White Bal. Relative', 'CanWhiteRel' => 'Can White Bal. Relative',
'CanZoom' => 'àôùø æåí', 'CanZoom' => 'אפשר זום',
'CanZoomAbs' => 'àôùø æåí àáñåìåèé', 'CanZoomAbs' => 'אפשר זום אבסולוטי',
'CanZoomCon' => 'àôùø æåí îúîùê', 'CanZoomCon' => 'אפשר זום מתמשך',
'CanZoomRel' => 'àôùø æåí éçñé', 'CanZoomRel' => 'אפשר זום יחסי',
'Cancel' => 'áèì', 'Cancel' => 'בטל',
'CancelForcedAlarm' => 'Cancel Forced Alarm', 'CancelForcedAlarm' => 'Cancel Forced Alarm',
'CaptureHeight' => 'Capture Height', 'CaptureHeight' => 'Capture Height',
'CaptureMethod' => 'Capture Method', // Added - 2009-02-08 'CaptureMethod' => 'Capture Method', // Added - 2009-02-08
'CapturePalette' => 'Capture Palette', 'CapturePalette' => 'Capture Palette',
'CaptureResolution' => 'Capture Resolution', // Added - 2015-04-18 'CaptureResolution' => 'Capture Resolution', // Added - 2015-04-18
'CaptureWidth' => 'Capture Width', 'CaptureWidth' => 'Capture Width',
'Cause' => 'ñéáä', 'Cause' => 'סיבה',
'CheckMethod' => 'Alarm Check Method', 'CheckMethod' => 'Alarm Check Method',
'ChooseDetectedCamera' => 'Choose Detected Camera', // Added - 2009-03-31 'ChooseDetectedCamera' => 'Choose Detected Camera', // Added - 2009-03-31
'ChooseFilter' => 'áçø îñðï', 'ChooseFilter' => 'בחר מסנן',
'ChooseLogFormat' => 'Choose a log format', // Added - 2011-06-17 'ChooseLogFormat' => 'Choose a log format', // Added - 2011-06-17
'ChooseLogSelection' => 'Choose a log selection', // Added - 2011-06-17 'ChooseLogSelection' => 'Choose a log selection', // Added - 2011-06-17
'ChoosePreset' => 'Choose Preset', 'ChoosePreset' => 'Choose Preset',
'Clear' => 'Clear', // Added - 2011-06-16 'Clear' => 'Clear', // Added - 2011-06-16
'CloneMonitor' => 'Clone', // Added - 2018-08-30 'CloneMonitor' => 'Clone', // Added - 2018-08-30
'Close' => 'ñâåø', 'Close' => 'סגור',
'Colour' => 'öáò', 'Colour' => 'צבע',
'Command' => 'ô÷åãä', 'Command' => 'פקודה',
'Component' => 'Component', // Added - 2011-06-16 'Component' => 'Component', // Added - 2011-06-16
'ConcurrentFilter' => 'Run filter concurrently', // Added - 2018-08-30 'ConcurrentFilter' => 'Run filter concurrently', // Added - 2018-08-30
'Config' => 'úöåøä', 'Config' => 'תצורה',
'ConfiguredFor' => 'úöåøä òáåø', 'ConfiguredFor' => 'תצורה עבור',
'ConfirmDeleteEvents' => 'Are you sure you wish to delete the selected events?', 'ConfirmDeleteEvents' => 'Are you sure you wish to delete the selected events?',
'ConfirmPassword' => 'àùø ñéñîà', 'ConfirmPassword' => 'אשר סיסמא',
'ConjAnd' => 'å', 'ConjAnd' => 'ו',
'ConjOr' => 'àå', 'ConjOr' => 'או',
'Console' => '÷åðñåì', 'Console' => 'קונסול',
'ContactAdmin' => 'öåø ÷ùø òí îðäì äîòøëú áùáéì ôøèéí ðåñôéí.', 'ContactAdmin' => 'צור קשר עם מנהל המערכת בשביל פרטים נוספים.',
'Continue' => 'äîùê', 'Continue' => 'המשך',
'Contrast' => 'ðéâåãéåú', 'Contrast' => 'ניגודיות',
'Control' => '÷åðèøåì', 'Control' => 'קונטרול',
'ControlAddress' => 'ëúåáú ä÷åðèøåì', 'ControlAddress' => 'כתובת הקונטרול',
'ControlCap' => 'éëåìú ä÷åðèøåì', 'ControlCap' => 'יכולת הקונטרול',
'ControlCaps' => 'éëåìåú ä÷åðèøåì', 'ControlCaps' => 'יכולות הקונטרול',
'ControlDevice' => 'äú÷ï ä÷åðèøåì', 'ControlDevice' => 'התקן הקונטרול',
'ControlType' => 'ñåâ ä÷åðèøåì', 'ControlType' => 'סוג הקונטרול',
'Controllable' => 'Controllable', 'Controllable' => 'Controllable',
'Current' => 'Current', // Added - 2015-04-18 'Current' => 'Current', // Added - 2015-04-18
'Cycle' => 'îçæåøé', 'Cycle' => 'מחזורי',
'CycleWatch' => 'öôééä îçæåøéú', 'CycleWatch' => 'צפייה מחזורית',
'DateTime' => 'Date/Time', // Added - 2011-06-16 'DateTime' => 'Date/Time', // Added - 2011-06-16
'Day' => 'éåí', 'Day' => 'יום',
'Debug' => 'Debug', 'Debug' => 'Debug',
'DefaultRate' => 'Default Rate', 'DefaultRate' => 'Default Rate',
'DefaultScale' => 'Default Scale', 'DefaultScale' => 'Default Scale',
'DefaultView' => 'Default View', 'DefaultView' => 'Default View',
'Deinterlacing' => 'Deinterlacing', // Added - 2015-04-18 'Deinterlacing' => 'Deinterlacing', // Added - 2015-04-18
'Delay' => 'Delay', // Added - 2015-04-18 'Delay' => 'Delay', // Added - 2015-04-18
'Delete' => 'îç÷', 'Delete' => 'מחק',
'DeleteAndNext' => 'îç÷ &amp; äáà', 'DeleteAndNext' => 'מחק & הבא',
'DeleteAndPrev' => 'îç÷ &amp; ä÷åãí', 'DeleteAndPrev' => 'מחק & הקודם',
'DeleteSavedFilter' => 'îç÷ îñðï ùîåø', 'DeleteSavedFilter' => 'מחק מסנן שמור',
'Description' => 'úéàåø', 'Description' => 'תיאור',
'DetectedCameras' => 'Detected Cameras', // Added - 2009-03-31 'DetectedCameras' => 'Detected Cameras', // Added - 2009-03-31
'DetectedProfiles' => 'Detected Profiles', // Added - 2015-04-18 'DetectedProfiles' => 'Detected Profiles', // Added - 2015-04-18
'Device' => 'Device', // Added - 2009-02-08 'Device' => 'Device', // Added - 2009-02-08
'DeviceChannel' => 'òøåõ ääú÷ï', 'DeviceChannel' => 'ערוץ ההתקן',
'DeviceFormat' => 'úáðéú ääú÷ï', 'DeviceFormat' => 'תבנית ההתקן',
'DeviceNumber' => 'îñôø ääú÷ï', 'DeviceNumber' => 'מספר ההתקן',
'DevicePath' => 'ðúéá ääú÷ï', 'DevicePath' => 'נתיב ההתקן',
'Devices' => 'äú÷ðéí', 'Devices' => 'התקנים',
'Dimensions' => 'îéîãéí', 'Dimensions' => 'מימדים',
'DisableAlarms' => 'ðèøì àæò÷åú', 'DisableAlarms' => 'נטרל אזעקות',
'Disk' => 'ãéñ÷', 'Disk' => 'דיסק',
'Display' => 'Display', // Added - 2011-01-30 'Display' => 'Display', // Added - 2011-01-30
'Displaying' => 'Displaying', // Added - 2011-06-16 'Displaying' => 'Displaying', // Added - 2011-06-16
'DoNativeMotionDetection'=> 'Do Native Motion Detection', 'DoNativeMotionDetection'=> 'Do Native Motion Detection',
'Donate' => 'úøåí áá÷ùä', 'Donate' => 'תרום בבקשה',
'DonateAlready' => 'ìà, úøîúé ëáø', 'DonateAlready' => 'לא, תרמתי כבר',
'DonateEnticement' => 'You\'ve been running ZoneMinder for a while now and hopefully are finding it a useful addition to your home or workplace security. Although ZoneMinder is, and will remain, free and open source, it costs money to develop and support. If you would like to help support future development and new features then please consider donating. Donating is, of course, optional but very much appreciated and you can donate as much or as little as you like.<br><br>If you would like to donate please select the option below or go to https://zoneminder.com/donate/ in your browser.<br><br>Thank you for using ZoneMinder and don\'t forget to visit the forums on ZoneMinder.com for support or suggestions about how to make your ZoneMinder experience even better.', 'DonateEnticement' => 'You\'ve been running ZoneMinder for a while now and hopefully are finding it a useful addition to your home or workplace security. Although ZoneMinder is, and will remain, free and open source, it costs money to develop and support. If you would like to help support future development and new features then please consider donating. Donating is, of course, optional but very much appreciated and you can donate as much or as little as you like.<br><br>If you would like to donate please select the option below or go to http://www.zoneminder.com/donate.html in your browser.<br><br>Thank you for using ZoneMinder and don\'t forget to visit the forums on ZoneMinder.com for support or suggestions about how to make your ZoneMinder experience even better.',
'DonateRemindDay' => 'òãééï ìà, äæëø ìà áòåã éåí àçã', 'DonateRemindDay' => 'עדיין לא, הזכר לא בעוד יום אחד',
'DonateRemindHour' => 'òãééï ìà, äæëø ìé áòåã ùòä àçú', 'DonateRemindHour' => 'עדיין לא, הזכר לי בעוד שעה אחת',
'DonateRemindMonth' => 'òãééï ìà, äæëø ìé áòåã çåãù àçã', 'DonateRemindMonth' => 'עדיין לא, הזכר לי בעוד חודש אחד',
'DonateRemindNever' => 'ìà, àðé ìà øåöä ìúøåí, àì úúæëø àåúé', 'DonateRemindNever' => 'לא, אני לא רוצה לתרום, אל תתזכר אותי',
'DonateRemindWeek' => 'òãééï ìà, äæëø ìé áòåã ùáåò àçã', 'DonateRemindWeek' => 'עדיין לא, הזכר לי בעוד שבוע אחד',
'DonateYes' => 'ëï, àðé îòåðééï ìúøåí òëùéå', 'DonateYes' => 'כן, אני מעוניין לתרום עכשיו',
'Download' => 'äåøã', 'Download' => 'הורד',
'DownloadVideo' => 'Download Video', // Added - 2018-08-30 'DownloadVideo' => 'Download Video', // Added - 2018-08-30
'DuplicateMonitorName' => 'Duplicate Monitor Name', // Added - 2009-03-31 'DuplicateMonitorName' => 'Duplicate Monitor Name', // Added - 2009-03-31
'Duration' => 'îùê æîï', 'Duration' => 'משך זמן',
'Edit' => 'òøåê', 'Edit' => 'ערוך',
'EditLayout' => 'Edit Layout', // Added - 2018-08-30 'EditLayout' => 'Edit Layout', // Added - 2018-08-30
'Email' => 'ãåà"ì', 'Email' => 'דוא"ל',
'EnableAlarms' => 'àôùø àæò÷åú', 'EnableAlarms' => 'אפשר אזעקות',
'Enabled' => 'àôùø', 'Enabled' => 'אפשר',
'EnterNewFilterName' => 'äæï îñðï çãù', 'EnterNewFilterName' => 'הזן מסנן חדש',
'Error' => 'ùâéàä', 'Error' => 'שגיאה',
'ErrorBrackets' => 'Error, please check you have an equal number of opening and closing brackets', 'ErrorBrackets' => 'Error, please check you have an equal number of opening and closing brackets',
'ErrorValidValue' => 'Error, please check that all terms have a valid value', 'ErrorValidValue' => 'Error, please check that all terms have a valid value',
'Etc' => 'åëå\'', 'Etc' => 'וכו\'',
'Event' => 'àéøåò', 'Event' => 'אירוע',
'EventFilter' => 'îñðï àéøåò', 'EventFilter' => 'מסנן אירוע',
'EventId' => 'æéäåé àéøåò', 'EventId' => 'זיהוי אירוע',
'EventName' => 'ùí àéøåò', 'EventName' => 'שם אירוע',
'EventPrefix' => 'Event Prefix', 'EventPrefix' => 'Event Prefix',
'Events' => 'àéøåòéí', 'Events' => 'אירועים',
'Exclude' => 'ììà', 'Exclude' => 'ללא',
'Execute' => 'áöò', 'Execute' => 'בצע',
'Exif' => 'Embed EXIF data into image', // Added - 2018-08-30 'Exif' => 'Embed EXIF data into image', // Added - 2018-08-30
'Export' => 'éöà', 'Export' => 'יצא',
'ExportDetails' => 'éöà ôøèé àéøåò', 'ExportDetails' => 'יצא פרטי אירוע',
'ExportFailed' => 'éöåà ðëùì', 'ExportFailed' => 'יצוא נכשל',
'ExportFormat' => 'éöà úáðéú ÷åáõ', 'ExportFormat' => 'יצא תבנית קובץ',
'ExportFormatTar' => 'Tar', 'ExportFormatTar' => 'Tar',
'ExportFormatZip' => 'Zip', 'ExportFormatZip' => 'Zip',
'ExportFrames' => 'Export Frame Details', 'ExportFrames' => 'Export Frame Details',
'ExportImageFiles' => 'éöà ÷áöé úîåðä', 'ExportImageFiles' => 'יצא קבצי תמונה',
'ExportLog' => 'Export Log', // Added - 2011-06-17 'ExportLog' => 'Export Log', // Added - 2011-06-17
'ExportMiscFiles' => 'éöà ÷áöéí àçøéí (àí éùðí)', 'ExportMiscFiles' => 'יצא קבצים אחרים (אם ישנם)',
'ExportOptions' => 'éöà àôùøåéåú', 'ExportOptions' => 'יצא אפשרויות',
'ExportSucceeded' => 'Export Succeeded', // Added - 2009-02-08 'ExportSucceeded' => 'Export Succeeded', // Added - 2009-02-08
'ExportVideoFiles' => 'Export Video Files (if present)', 'ExportVideoFiles' => 'Export Video Files (if present)',
'Exporting' => 'îééöà', 'Exporting' => 'מייצא',
'FPS' => 'fps', 'FPS' => 'fps',
'FPSReportInterval' => 'FPS Report Interval', 'FPSReportInterval' => 'FPS Report Interval',
'FTP' => 'FTP', 'FTP' => 'FTP',
@ -340,22 +339,22 @@ $SLANG = array(
'FastForward' => 'Fast Forward', 'FastForward' => 'Fast Forward',
'Feed' => 'Feed', 'Feed' => 'Feed',
'Ffmpeg' => 'Ffmpeg', // Added - 2009-02-08 'Ffmpeg' => 'Ffmpeg', // Added - 2009-02-08
'File' => '÷åáõ', 'File' => 'קובץ',
'Filter' => 'Filter', // Added - 2015-04-18 'Filter' => 'Filter', // Added - 2015-04-18
'FilterArchiveEvents' => 'àøëá úåàîéí', 'FilterArchiveEvents' => 'ארכב תואמים',
'FilterDeleteEvents' => 'îç÷ úåàîéí', 'FilterDeleteEvents' => 'מחק תואמים',
'FilterEmailEvents' => 'ùìç ãåàø ùì ëì äúåàîéí', 'FilterEmailEvents' => 'שלח דואר של כל התואמים',
'FilterExecuteEvents' => 'Execute command on all matches', 'FilterExecuteEvents' => 'Execute command on all matches',
'FilterLog' => 'Filter log', // Added - 2015-04-18 'FilterLog' => 'Filter log', // Added - 2015-04-18
'FilterMessageEvents' => 'Message details of all matches', 'FilterMessageEvents' => 'Message details of all matches',
'FilterMoveEvents' => 'Move all matches', // Added - 2018-08-30 'FilterMoveEvents' => 'Move all matches', // Added - 2018-08-30
'FilterPx' => 'Filter Px', 'FilterPx' => 'Filter Px',
'FilterUnset' => 'òìéê ìöééï øåçá åâåáä îñðï', 'FilterUnset' => 'עליך לציין רוחב וגובה מסנן',
'FilterUpdateDiskSpace'=> 'Update used disk space', // Added - 2018-08-30 'FilterUpdateDiskSpace'=> 'Update used disk space', // Added - 2018-08-30
'FilterUploadEvents' => 'òìä àú ëì äúåàîéí', 'FilterUploadEvents' => 'עלה את כל התואמים',
'FilterVideoEvents' => 'öåø åéãàå ìëì äúåàîéí', 'FilterVideoEvents' => 'צור וידאו לכל התואמים',
'Filters' => 'îñððéí', 'Filters' => 'מסננים',
'First' => 'äøàùåï', 'First' => 'הראשון',
'FlippedHori' => 'Flipped Horizontally', 'FlippedHori' => 'Flipped Horizontally',
'FlippedVert' => 'Flipped Vertically', 'FlippedVert' => 'Flipped Vertically',
'FnMocord' => 'Mocord', // Added 2013.08.16. 'FnMocord' => 'Mocord', // Added 2013.08.16.
@ -364,25 +363,25 @@ $SLANG = array(
'FnNodect' => 'Nodect', // Added 2013.08.16. 'FnNodect' => 'Nodect', // Added 2013.08.16.
'FnNone' => 'None', // Added 2013.08.16. 'FnNone' => 'None', // Added 2013.08.16.
'FnRecord' => 'Record', // Added 2013.08.16. 'FnRecord' => 'Record', // Added 2013.08.16.
'Focus' => 'äúî÷ã', 'Focus' => 'התמקד',
'ForceAlarm' => 'äëøç àæò÷ä', 'ForceAlarm' => 'הכרח אזעקה',
'Format' => 'úáðéú', 'Format' => 'תבנית',
'Frame' => 'ôøééí', 'Frame' => 'פריים',
'FrameId' => 'Frame Id', 'FrameId' => 'Frame Id',
'FrameRate' => 'Frame Rate', 'FrameRate' => 'Frame Rate',
'FrameSkip' => 'ãìâ ôøééí', 'FrameSkip' => 'דלג פריים',
'Frames' => 'ôøééîéí', 'Frames' => 'פריימים',
'Func' => 'ôåð÷', 'Func' => 'פונק',
'Function' => 'ôåð÷öéä', 'Function' => 'פונקציה',
'Gain' => 'Gain', 'Gain' => 'Gain',
'General' => 'ëììé', 'General' => 'כללי',
'GenerateDownload' => 'Generate Download', // Added - 2018-08-30 'GenerateDownload' => 'Generate Download', // Added - 2018-08-30
'GenerateVideo' => 'öåø åéãàå', 'GenerateVideo' => 'צור וידאו',
'GeneratingVideo' => 'îééöø åéãàå', 'GeneratingVideo' => 'מייצר וידאו',
'GoToZoneMinder' => 'á÷ø ZoneMinder.com', 'GoToZoneMinder' => 'בקר ZoneMinder.com',
'Grey' => 'àôåø', 'Grey' => 'אפור',
'Group' => '÷áåöä', 'Group' => 'קבוצה',
'Groups' => '÷áåöåú', 'Groups' => 'קבוצות',
'HasFocusSpeed' => 'Has Focus Speed', 'HasFocusSpeed' => 'Has Focus Speed',
'HasGainSpeed' => 'Has Gain Speed', 'HasGainSpeed' => 'Has Gain Speed',
'HasHomePreset' => 'Has Home Preset', 'HasHomePreset' => 'Has Home Preset',
@ -394,53 +393,53 @@ $SLANG = array(
'HasTurboTilt' => 'Has Turbo Tilt', 'HasTurboTilt' => 'Has Turbo Tilt',
'HasWhiteSpeed' => 'Has White Bal. Speed', 'HasWhiteSpeed' => 'Has White Bal. Speed',
'HasZoomSpeed' => 'Has Zoom Speed', 'HasZoomSpeed' => 'Has Zoom Speed',
'High' => 'âáåä', 'High' => 'גבוה',
'HighBW' => 'âáåä&nbsp;ø/ô', 'HighBW' => 'גבוה ר/פ',
'Home' => 'áéú', 'Home' => 'בית',
'Hostname' => 'Hostname', // Added - 2018-08-30 'Hostname' => 'Hostname', // Added - 2018-08-30
'Hour' => 'ùòä', 'Hour' => 'שעה',
'Hue' => 'Hue', 'Hue' => 'Hue',
'Id' => 'æéäåé', 'Id' => 'זיהוי',
'Idle' => 'äîúðä', 'Idle' => 'המתנה',
'Ignore' => 'äúòìí', 'Ignore' => 'התעלם',
'Image' => 'úîåðä', 'Image' => 'תמונה',
'ImageBufferSize' => 'Image Buffer Size (frames)', 'ImageBufferSize' => 'Image Buffer Size (frames)',
'Images' => 'úîåðåú', 'Images' => 'תמונות',
'In' => 'áúåê', 'In' => 'בתוך',
'Include' => 'ëìåì', 'Include' => 'כלול',
'Inverted' => 'äôåê', 'Inverted' => 'הפוך',
'Iris' => 'Iris', 'Iris' => 'Iris',
'KeyString' => 'îçøåæú úåéí', 'KeyString' => 'מחרוזת תוים',
'Label' => 'úååéú', 'Label' => 'תווית',
'Language' => 'ùôä', 'Language' => 'שפה',
'Last' => 'àçøåï', 'Last' => 'אחרון',
'Layout' => 'Layout', // Added - 2009-02-08 'Layout' => 'Layout', // Added - 2009-02-08
'Level' => 'Level', // Added - 2011-06-16 'Level' => 'Level', // Added - 2011-06-16
'Libvlc' => 'Libvlc', 'Libvlc' => 'Libvlc',
'LimitResultsPost' => 'úåöàåú áìáã;', // This is used at the end of the phrase 'Limit to first N results only' 'LimitResultsPost' => 'תוצאות בלבד;', // This is used at the end of the phrase 'Limit to first N results only'
'LimitResultsPre' => 'äâáì ìøàùåï', // This is used at the beginning of the phrase 'Limit to first N results only' 'LimitResultsPre' => 'הגבל לראשון', // This is used at the beginning of the phrase 'Limit to first N results only'
'Line' => 'Line', // Added - 2011-06-16 'Line' => 'Line', // Added - 2011-06-16
'LinkedMonitors' => 'îåðéèåøéí î÷åùøéí', 'LinkedMonitors' => 'מוניטורים מקושרים',
'List' => 'øùéîä', 'List' => 'רשימה',
'ListMatches' => 'List Matches', // Added - 2018-08-30 'ListMatches' => 'List Matches', // Added - 2018-08-30
'Load' => 'èòï', 'Load' => 'טען',
'Local' => 'î÷åîé', 'Local' => 'מקומי',
'Log' => 'Log', // Added - 2011-06-16 'Log' => 'Log', // Added - 2011-06-16
'LoggedInAs' => 'äúçáø ë', 'LoggedInAs' => 'התחבר כ',
'Logging' => 'Logging', // Added - 2011-06-16 'Logging' => 'Logging', // Added - 2011-06-16
'LoggingIn' => 'îúçáø', 'LoggingIn' => 'מתחבר',
'Login' => 'äúçáø', 'Login' => 'התחבר',
'Logout' => 'äúðú÷', 'Logout' => 'התנתק',
'Logs' => 'Logs', // Added - 2011-06-17 'Logs' => 'Logs', // Added - 2011-06-17
'Low' => 'ðîåê', 'Low' => 'נמוך',
'LowBW' => 'ðîåê&nbsp;ø/ô', 'LowBW' => 'נמוך ר/פ',
'Main' => 'îøëæé', 'Main' => 'מרכזי',
'Man' => 'îãøéê', 'Man' => 'מדריך',
'Manual' => 'îãøéê', 'Manual' => 'מדריך',
'Mark' => 'ñîï', 'Mark' => 'סמן',
'Max' => 'î÷ñ', 'Max' => 'מקס',
'MaxBandwidth' => 'øåçá ôñ î÷ñ', 'MaxBandwidth' => 'רוחב פס מקס',
'MaxBrScore' => 'ðé÷åã<br/>î÷ñéîìé', 'MaxBrScore' => 'ניקוד<br/>מקסימלי',
'MaxFocusRange' => 'Max Focus Range', 'MaxFocusRange' => 'Max Focus Range',
'MaxFocusSpeed' => 'Max Focus Speed', 'MaxFocusSpeed' => 'Max Focus Speed',
'MaxFocusStep' => 'Max Focus Step', 'MaxFocusStep' => 'Max Focus Step',
@ -463,8 +462,8 @@ $SLANG = array(
'MaxZoomSpeed' => 'Max Zoom Speed', 'MaxZoomSpeed' => 'Max Zoom Speed',
'MaxZoomStep' => 'Max Zoom Step', 'MaxZoomStep' => 'Max Zoom Step',
'MaximumFPS' => 'Maximum FPS', 'MaximumFPS' => 'Maximum FPS',
'Medium' => 'áéðåðé', 'Medium' => 'בינוני',
'MediumBW' => 'Medium&nbsp;B/W', 'MediumBW' => 'Medium B/W',
'Message' => 'Message', // Added - 2011-06-16 'Message' => 'Message', // Added - 2011-06-16
'MinAlarmAreaLtMax' => 'Minimum alarm area should be less than maximum', 'MinAlarmAreaLtMax' => 'Minimum alarm area should be less than maximum',
'MinAlarmAreaUnset' => 'You must specify the minimum alarm pixel count', 'MinAlarmAreaUnset' => 'You must specify the minimum alarm pixel count',
@ -501,19 +500,19 @@ $SLANG = array(
'MinZoomStep' => 'Min Zoom Step', 'MinZoomStep' => 'Min Zoom Step',
'Misc' => 'Misc', 'Misc' => 'Misc',
'Mode' => 'Mode', // Added - 2015-04-18 'Mode' => 'Mode', // Added - 2015-04-18
'Monitor' => 'îåðéèåø', 'Monitor' => 'מוניטור',
'MonitorIds' => 'Monitor&nbsp;Ids', 'MonitorIds' => 'Monitor Ids',
'MonitorPreset' => 'Monitor Preset', 'MonitorPreset' => 'Monitor Preset',
'MonitorPresetIntro' => 'Select an appropriate preset from the list below.<br><br>Please note that this may overwrite any values you already have configured for this monitor.<br><br>', 'MonitorPresetIntro' => 'Select an appropriate preset from the list below.<br><br>Please note that this may overwrite any values you already have configured for this monitor.<br><br>',
'MonitorProbe' => 'Monitor Probe', // Added - 2009-03-31 'MonitorProbe' => 'Monitor Probe', // Added - 2009-03-31
'MonitorProbeIntro' => 'The list below shows detected analog and network cameras and whether they are already being used or available for selection.<br/><br/>Select the desired entry from the list below.<br/><br/>Please note that not all cameras may be detected and that choosing a camera here may overwrite any values you already have configured for the current monitor.<br/><br/>', // Added - 2009-03-31 'MonitorProbeIntro' => 'The list below shows detected analog and network cameras and whether they are already being used or available for selection.<br/><br/>Select the desired entry from the list below.<br/><br/>Please note that not all cameras may be detected and that choosing a camera here may overwrite any values you already have configured for the current monitor.<br/><br/>', // Added - 2009-03-31
'Monitors' => 'îåðéèåøéí', 'Monitors' => 'מוניטורים',
'Montage' => 'Montage', 'Montage' => 'Montage',
'MontageReview' => 'Montage Review', // Added - 2018-08-30 'MontageReview' => 'Montage Review', // Added - 2018-08-30
'Month' => 'çåãù', 'Month' => 'חודש',
'More' => 'More', // Added - 2011-06-16 'More' => 'More', // Added - 2011-06-16
'MotionFrameSkip' => 'Motion Frame Skip', 'MotionFrameSkip' => 'Motion Frame Skip',
'Move' => 'äææ', 'Move' => 'הזז',
'Mtg2widgrd' => '2-wide grid', // Added 2013.08.15. 'Mtg2widgrd' => '2-wide grid', // Added 2013.08.15.
'Mtg3widgrd' => '3-wide grid', // Added 2013.08.15. 'Mtg3widgrd' => '3-wide grid', // Added 2013.08.15.
'Mtg3widgrx' => '3-wide grid, scaled, enlarge on alarm', // Added 2013.08.15. 'Mtg3widgrx' => '3-wide grid, scaled, enlarge on alarm', // Added 2013.08.15.
@ -524,52 +523,52 @@ $SLANG = array(
'MustConfirmPassword' => 'You must confirm the password', 'MustConfirmPassword' => 'You must confirm the password',
'MustSupplyPassword' => 'You must supply a password', 'MustSupplyPassword' => 'You must supply a password',
'MustSupplyUsername' => 'You must supply a username', 'MustSupplyUsername' => 'You must supply a username',
'Name' => 'ùí', 'Name' => 'שם',
'Near' => 'ìéã', 'Near' => 'ליד',
'Network' => 'øùú', 'Network' => 'רשת',
'New' => 'çãù', 'New' => 'חדש',
'NewGroup' => '÷áåöä çãùä', 'NewGroup' => 'קבוצה חדשה',
'NewLabel' => 'úååéú çãùä', 'NewLabel' => 'תווית חדשה',
'NewPassword' => 'ñéñîà çãùä', 'NewPassword' => 'סיסמא חדשה',
'NewState' => 'îöá çãù', 'NewState' => 'מצב חדש',
'NewUser' => 'îùúîù çãù', 'NewUser' => 'משתמש חדש',
'Next' => 'äáà', 'Next' => 'הבא',
'No' => 'ìà', 'No' => 'לא',
'NoDetectedCameras' => 'No Detected Cameras', // Added - 2009-03-31 'NoDetectedCameras' => 'No Detected Cameras', // Added - 2009-03-31
'NoDetectedProfiles' => 'No Detected Profiles', // Added - 2018-08-30 'NoDetectedProfiles' => 'No Detected Profiles', // Added - 2018-08-30
'NoFramesRecorded' => 'There are no frames recorded for this event', 'NoFramesRecorded' => 'There are no frames recorded for this event',
'NoGroup' => 'ììà ÷áåöä', 'NoGroup' => 'ללא קבוצה',
'NoSavedFilters' => 'NoSavedFilters', 'NoSavedFilters' => 'NoSavedFilters',
'NoStatisticsRecorded' => 'There are no statistics recorded for this event/frame', 'NoStatisticsRecorded' => 'There are no statistics recorded for this event/frame',
'None' => 'øé÷', 'None' => 'ריק',
'NoneAvailable' => 'áìúé æîéï', 'NoneAvailable' => 'בלתי זמין',
'Normal' => 'ðåøîìé', 'Normal' => 'נורמלי',
'Notes' => 'Notes', 'Notes' => 'Notes',
'NumPresets' => 'Num Presets', 'NumPresets' => 'Num Presets',
'Off' => 'ëáåé', 'Off' => 'כבוי',
'On' => 'ãìå÷', 'On' => 'דלוק',
'OnvifCredentialsIntro'=> 'Please supply user name and password for the selected camera.<br/>If no user has been created for the camera then the user given here will be created with the given password.<br/><br/>', // Added - 2015-04-18 'OnvifCredentialsIntro'=> 'Please supply user name and password for the selected camera.<br/>If no user has been created for the camera then the user given here will be created with the given password.<br/><br/>', // Added - 2015-04-18
'OnvifProbe' => 'ONVIF', // Added - 2015-04-18 'OnvifProbe' => 'ONVIF', // Added - 2015-04-18
'OnvifProbeIntro' => 'The list below shows detected ONVIF cameras and whether they are already being used or available for selection.<br/><br/>Select the desired entry from the list below.<br/><br/>Please note that not all cameras may be detected and that choosing a camera here may overwrite any values you already have configured for the current monitor.<br/><br/>', // Added - 2015-04-18 'OnvifProbeIntro' => 'The list below shows detected ONVIF cameras and whether they are already being used or available for selection.<br/><br/>Select the desired entry from the list below.<br/><br/>Please note that not all cameras may be detected and that choosing a camera here may overwrite any values you already have configured for the current monitor.<br/><br/>', // Added - 2015-04-18
'OpEq' => 'ùååä ì', 'OpEq' => 'שווה ל',
'OpGt' => 'âãåì î', 'OpGt' => 'גדול מ',
'OpGtEq' => 'greater than or equal to', 'OpGtEq' => 'greater than or equal to',
'OpIn' => 'in set', 'OpIn' => 'in set',
'OpIs' => 'is', // Added - 2018-08-30 'OpIs' => 'is', // Added - 2018-08-30
'OpIsNot' => 'is not', // Added - 2018-08-30 'OpIsNot' => 'is not', // Added - 2018-08-30
'OpLt' => 'ôçåú î', 'OpLt' => 'פחות מ',
'OpLtEq' => 'less than or equal to', 'OpLtEq' => 'less than or equal to',
'OpMatches' => 'matches', 'OpMatches' => 'matches',
'OpNe' => 'àéðå ùååä', 'OpNe' => 'אינו שווה',
'OpNotIn' => 'not in set', 'OpNotIn' => 'not in set',
'OpNotMatches' => 'àéðå úåàí', 'OpNotMatches' => 'אינו תואם',
'Open' => 'ôúç', 'Open' => 'פתח',
'OptionHelp' => 'OptionHelp', 'OptionHelp' => 'OptionHelp',
'OptionRestartWarning' => 'These changes may not come into effect fully\nwhile the system is running. When you have\nfinished making your changes please ensure that\nyou restart ZoneMinder.', 'OptionRestartWarning' => 'These changes may not come into effect fully\nwhile the system is running. When you have\nfinished making your changes please ensure that\nyou restart ZoneMinder.',
'OptionalEncoderParam' => 'Optional Encoder Parameters', // Added - 2018-08-30 'OptionalEncoderParam' => 'Optional Encoder Parameters', // Added - 2018-08-30
'Options' => 'àôùøåéåú', 'Options' => 'אפשרויות',
'OrEnterNewName' => 'or enter new name', 'OrEnterNewName' => 'or enter new name',
'Order' => 'îéåï', 'Order' => 'מיון',
'Orientation' => 'Orientation', 'Orientation' => 'Orientation',
'Out' => 'Out', 'Out' => 'Out',
'OverwriteExisting' => 'Overwrite Existing', 'OverwriteExisting' => 'Overwrite Existing',
@ -578,27 +577,27 @@ $SLANG = array(
'PanLeft' => 'Pan Left', 'PanLeft' => 'Pan Left',
'PanRight' => 'Pan Right', 'PanRight' => 'Pan Right',
'PanTilt' => 'Pan/Tilt', 'PanTilt' => 'Pan/Tilt',
'Parameter' => 'ôøîèø', 'Parameter' => 'פרמטר',
'Password' => 'ñéñîà', 'Password' => 'סיסמא',
'PasswordsDifferent' => 'The new and confirm passwords are different', 'PasswordsDifferent' => 'The new and confirm passwords are different',
'Paths' => 'ðúéáéí', 'Paths' => 'נתיבים',
'Pause' => 'Pause', 'Pause' => 'Pause',
'Phone' => 'èìôåï', 'Phone' => 'טלפון',
'PhoneBW' => 'ø/ô&nbsp;èìôåï', 'PhoneBW' => 'ר/פ טלפון',
'Pid' => 'PID', // Added - 2011-06-16 'Pid' => 'PID', // Added - 2011-06-16
'PixelDiff' => 'Pixel Diff', 'PixelDiff' => 'Pixel Diff',
'Pixels' => 'ôé÷ñìéí', 'Pixels' => 'פיקסלים',
'Play' => 'Play', 'Play' => 'Play',
'PlayAll' => 'ðâï äëì', 'PlayAll' => 'נגן הכל',
'PleaseWait' => 'äîúï áá÷ùä', 'PleaseWait' => 'המתן בבקשה',
'Plugins' => 'Plugins', 'Plugins' => 'Plugins',
'Point' => 'ð÷åãä', 'Point' => 'נקודה',
'PostEventImageBuffer' => 'Post Event Image Count', 'PostEventImageBuffer' => 'Post Event Image Count',
'PreEventImageBuffer' => 'Pre Event Image Count', 'PreEventImageBuffer' => 'Pre Event Image Count',
'PreserveAspect' => 'Preserve Aspect Ratio', 'PreserveAspect' => 'Preserve Aspect Ratio',
'Preset' => 'Preset', 'Preset' => 'Preset',
'Presets' => 'Presets', 'Presets' => 'Presets',
'Prev' => 'ä÷åãí', 'Prev' => 'הקודם',
'Probe' => 'Probe', // Added - 2009-03-31 'Probe' => 'Probe', // Added - 2009-03-31
'ProfileProbe' => 'Stream Probe', // Added - 2015-04-18 'ProfileProbe' => 'Stream Probe', // Added - 2015-04-18
'ProfileProbeIntro' => 'The list below shows the existing stream profiles of the selected camera .<br/><br/>Select the desired entry from the list below.<br/><br/>Please note that ZoneMinder cannot configure additional profiles and that choosing a camera here may overwrite any values you already have configured for the current monitor.<br/><br/>', // Added - 2015-04-18 'ProfileProbeIntro' => 'The list below shows the existing stream profiles of the selected camera .<br/><br/>Select the desired entry from the list below.<br/><br/>Please note that ZoneMinder cannot configure additional profiles and that choosing a camera here may overwrite any values you already have configured for the current monitor.<br/><br/>', // Added - 2015-04-18
@ -606,188 +605,188 @@ $SLANG = array(
'Protocol' => 'Protocol', 'Protocol' => 'Protocol',
'RTSPDescribe' => 'Use RTSP Response Media URL', // Added - 2018-08-30 'RTSPDescribe' => 'Use RTSP Response Media URL', // Added - 2018-08-30
'RTSPTransport' => 'RTSP Transport Protocol', // Added - 2018-08-30 'RTSPTransport' => 'RTSP Transport Protocol', // Added - 2018-08-30
'Rate' => 'ãéøåâ', 'Rate' => 'דירוג',
'Real' => 'àîéúé', 'Real' => 'אמיתי',
'RecaptchaWarning' => 'Your reCaptcha secret key is invalid. Please correct it, or reCaptcha will not work', // Added - 2018-08-30 'RecaptchaWarning' => 'Your reCaptcha secret key is invalid. Please correct it, or reCaptcha will not work', // Added - 2018-08-30
'Record' => 'ä÷ìèä', 'Record' => 'הקלטה',
'RecordAudio' => 'Whether to store the audio stream when saving an event.', // Added - 2018-08-30 'RecordAudio' => 'Whether to store the audio stream when saving an event.', // Added - 2018-08-30
'RefImageBlendPct' => 'Reference Image Blend %ge', 'RefImageBlendPct' => 'Reference Image Blend %ge',
'Refresh' => 'øòðåï', 'Refresh' => 'רענון',
'Remote' => 'îøåç÷', 'Remote' => 'מרוחק',
'RemoteHostName' => 'ùí îàøç îøåç÷', 'RemoteHostName' => 'שם מארח מרוחק',
'RemoteHostPath' => 'ðúéá îàøç îøåç÷', 'RemoteHostPath' => 'נתיב מארח מרוחק',
'RemoteHostPort' => 'ôåøè îàøç îøåç÷', 'RemoteHostPort' => 'פורט מארח מרוחק',
'RemoteHostSubPath' => 'Remote Host SubPath', // Added - 2009-02-08 'RemoteHostSubPath' => 'Remote Host SubPath', // Added - 2009-02-08
'RemoteImageColours' => 'Remote Image Colours', 'RemoteImageColours' => 'Remote Image Colours',
'RemoteMethod' => 'Remote Method', // Added - 2009-02-08 'RemoteMethod' => 'Remote Method', // Added - 2009-02-08
'RemoteProtocol' => 'Remote Protocol', // Added - 2009-02-08 'RemoteProtocol' => 'Remote Protocol', // Added - 2009-02-08
'Rename' => 'ùðä ùí', 'Rename' => 'שנה שם',
'Replay' => 'Replay', 'Replay' => 'Replay',
'ReplayAll' => 'All Events', 'ReplayAll' => 'All Events',
'ReplayGapless' => 'Gapless Events', 'ReplayGapless' => 'Gapless Events',
'ReplaySingle' => 'Single Event', 'ReplaySingle' => 'Single Event',
'ReportEventAudit' => 'Audit Events Report', // Added - 2018-08-30 'ReportEventAudit' => 'Audit Events Report', // Added - 2018-08-30
'Reset' => 'àôñ', 'Reset' => 'אפס',
'ResetEventCounts' => 'Reset Event Counts', 'ResetEventCounts' => 'Reset Event Counts',
'Restart' => 'àúçì', 'Restart' => 'אתחל',
'Restarting' => 'îàúçì', 'Restarting' => 'מאתחל',
'RestrictedCameraIds' => 'Restricted Camera Ids', 'RestrictedCameraIds' => 'Restricted Camera Ids',
'RestrictedMonitors' => 'Restricted Monitors', 'RestrictedMonitors' => 'Restricted Monitors',
'ReturnDelay' => 'çæøä îäùäéä', 'ReturnDelay' => 'חזרה מהשהיה',
'ReturnLocation' => 'îé÷åí çæøä', 'ReturnLocation' => 'מיקום חזרה',
'Rewind' => 'Rewind', 'Rewind' => 'Rewind',
'RotateLeft' => 'ñåáá ùîàìä', 'RotateLeft' => 'סובב שמאלה',
'RotateRight' => 'ñåáá éîéðä', 'RotateRight' => 'סובב ימינה',
'RunLocalUpdate' => 'Please run zmupdate.pl to update', // Added - 2011-05-25 'RunLocalUpdate' => 'Please run zmupdate.pl to update', // Added - 2011-05-25
'RunMode' => 'öåøú øéöä', 'RunMode' => 'צורת ריצה',
'RunState' => 'îöá øéöä', 'RunState' => 'מצב ריצה',
'Running' => 'îøéõ', 'Running' => 'מריץ',
'Save' => 'ùîåø', 'Save' => 'שמור',
'SaveAs' => 'ùîåø áùí', 'SaveAs' => 'שמור בשם',
'SaveFilter' => 'ùîåø îñðï', 'SaveFilter' => 'שמור מסנן',
'SaveJPEGs' => 'Save JPEGs', // Added - 2018-08-30 'SaveJPEGs' => 'Save JPEGs', // Added - 2018-08-30
'Scale' => 'ñ÷àìä', 'Scale' => 'סקאלה',
'Score' => 'ðé÷åã', 'Score' => 'ניקוד',
'Secs' => 'ùðéåú', 'Secs' => 'שניות',
'Sectionlength' => 'àåøê ÷èò', 'Sectionlength' => 'אורך קטע',
'Select' => 'áçø', 'Select' => 'בחר',
'SelectFormat' => 'Select Format', // Added - 2011-06-17 'SelectFormat' => 'Select Format', // Added - 2011-06-17
'SelectLog' => 'Select Log', // Added - 2011-06-17 'SelectLog' => 'Select Log', // Added - 2011-06-17
'SelectMonitors' => 'áçø îåðéèåøéí', 'SelectMonitors' => 'בחר מוניטורים',
'SelfIntersecting' => 'Polygon edges must not intersect', 'SelfIntersecting' => 'Polygon edges must not intersect',
'Set' => '÷áò', 'Set' => 'קבע',
'SetNewBandwidth' => 'Set New Bandwidth', 'SetNewBandwidth' => 'Set New Bandwidth',
'SetPreset' => 'Set Preset', 'SetPreset' => 'Set Preset',
'Settings' => 'äâãøåú', 'Settings' => 'הגדרות',
'ShowFilterWindow' => 'Show Filter Window', 'ShowFilterWindow' => 'Show Filter Window',
'ShowTimeline' => 'Show Timeline', 'ShowTimeline' => 'Show Timeline',
'SignalCheckColour' => 'Signal Check Colour', 'SignalCheckColour' => 'Signal Check Colour',
'SignalCheckPoints' => 'Signal Check Points', // Added - 2018-08-30 'SignalCheckPoints' => 'Signal Check Points', // Added - 2018-08-30
'Size' => 'âåãì', 'Size' => 'גודל',
'SkinDescription' => 'Change the default skin for this computer', // Added - 2011-01-30 'SkinDescription' => 'Change the default skin for this computer', // Added - 2011-01-30
'Sleep' => 'ùéðä', 'Sleep' => 'שינה',
'SortAsc' => 'Asc', 'SortAsc' => 'Asc',
'SortBy' => 'Sort by', 'SortBy' => 'Sort by',
'SortDesc' => 'Desc', 'SortDesc' => 'Desc',
'Source' => 'î÷åø', 'Source' => 'מקור',
'SourceColours' => 'Source Colours', // Added - 2009-02-08 'SourceColours' => 'Source Colours', // Added - 2009-02-08
'SourcePath' => 'Source Path', // Added - 2009-02-08 'SourcePath' => 'Source Path', // Added - 2009-02-08
'SourceType' => 'ñåâ î÷åø', 'SourceType' => 'סוג מקור',
'Speed' => 'îäéøåú', 'Speed' => 'מהירות',
'SpeedHigh' => 'îäéøåú âáåää', 'SpeedHigh' => 'מהירות גבוהה',
'SpeedLow' => 'îäéøåú ðîåëä', 'SpeedLow' => 'מהירות נמוכה',
'SpeedMedium' => 'îöìîä áéðåðéú', 'SpeedMedium' => 'מצלמה בינונית',
'SpeedTurbo' => 'îäéøåú èåøáå', 'SpeedTurbo' => 'מהירות טורבו',
'Start' => 'äúçì', 'Start' => 'התחל',
'State' => 'îöá', 'State' => 'מצב',
'Stats' => 'îöáéí', 'Stats' => 'מצבים',
'Status' => 'ñèèåñ', 'Status' => 'סטטוס',
'StatusConnected' => 'Capturing', // Added - 2018-08-30 'StatusConnected' => 'Capturing', // Added - 2018-08-30
'StatusNotRunning' => 'Not Running', // Added - 2018-08-30 'StatusNotRunning' => 'Not Running', // Added - 2018-08-30
'StatusRunning' => 'Not Capturing', // Added - 2018-08-30 'StatusRunning' => 'Not Capturing', // Added - 2018-08-30
'StatusUnknown' => 'Unknown', // Added - 2018-08-30 'StatusUnknown' => 'Unknown', // Added - 2018-08-30
'Step' => 'öòã', 'Step' => 'צעד',
'StepBack' => 'Step Back', 'StepBack' => 'Step Back',
'StepForward' => 'Step Forward', 'StepForward' => 'Step Forward',
'StepLarge' => 'öòã âãåì', 'StepLarge' => 'צעד גדול',
'StepMedium' => 'öòã áéðåðé', 'StepMedium' => 'צעד בינוני',
'StepNone' => 'àì úöòã', 'StepNone' => 'אל תצעד',
'StepSmall' => 'öòã ÷èï', 'StepSmall' => 'צעד קטן',
'Stills' => 'ñèéìñ', 'Stills' => 'סטילס',
'Stop' => 'òöåø', 'Stop' => 'עצור',
'Stopped' => 'ðòöø', 'Stopped' => 'נעצר',
'StorageArea' => 'Storage Area', // Added - 2018-08-30 'StorageArea' => 'Storage Area', // Added - 2018-08-30
'StorageScheme' => 'Scheme', // Added - 2018-08-30 'StorageScheme' => 'Scheme', // Added - 2018-08-30
'Stream' => 'ñèøéí', 'Stream' => 'סטרים',
'StreamReplayBuffer' => 'Stream Replay Image Buffer', 'StreamReplayBuffer' => 'Stream Replay Image Buffer',
'Submit' => 'Submit', 'Submit' => 'Submit',
'System' => 'îòøëú', 'System' => 'מערכת',
'SystemLog' => 'System Log', // Added - 2011-06-16 'SystemLog' => 'System Log', // Added - 2011-06-16
'TargetColorspace' => 'Target colorspace', // Added - 2015-04-18 'TargetColorspace' => 'Target colorspace', // Added - 2015-04-18
'Tele' => 'èì', 'Tele' => 'טל',
'Thumbnail' => 'Thumbnail', 'Thumbnail' => 'Thumbnail',
'Tilt' => 'Tilt', 'Tilt' => 'Tilt',
'Time' => 'æîï', 'Time' => 'זמן',
'TimeDelta' => 'ùéðåé áæîï', 'TimeDelta' => 'שינוי בזמן',
'TimeStamp' => 'çåúîú æîï', 'TimeStamp' => 'חותמת זמן',
'Timeline' => '÷å æîï', 'Timeline' => 'קו זמן',
'TimelineTip1' => 'Pass your mouse over the graph to view a snapshot image and event details.', // Added 2013.08.15. 'TimelineTip1' => 'Pass your mouse over the graph to view a snapshot image and event details.', // Added 2013.08.15.
'TimelineTip2' => 'Click on the coloured sections of the graph, or the image, to view the event.', // Added 2013.08.15. 'TimelineTip2' => 'Click on the coloured sections of the graph, or the image, to view the event.', // Added 2013.08.15.
'TimelineTip3' => 'Click on the background to zoom in to a smaller time period based around your click.', // Added 2013.08.15. 'TimelineTip3' => 'Click on the background to zoom in to a smaller time period based around your click.', // Added 2013.08.15.
'TimelineTip4' => 'Use the controls below to zoom out or navigate back and forward through the time range.', // Added 2013.08.15. 'TimelineTip4' => 'Use the controls below to zoom out or navigate back and forward through the time range.', // Added 2013.08.15.
'Timestamp' => 'çåúîú æîï', 'Timestamp' => 'חותמת זמן',
'TimestampLabelFormat' => 'Timestamp Label Format', 'TimestampLabelFormat' => 'Timestamp Label Format',
'TimestampLabelSize' => 'Font Size', // Added - 2018-08-30 'TimestampLabelSize' => 'Font Size', // Added - 2018-08-30
'TimestampLabelX' => 'Timestamp Label X', 'TimestampLabelX' => 'Timestamp Label X',
'TimestampLabelY' => 'Timestamp Label Y', 'TimestampLabelY' => 'Timestamp Label Y',
'Today' => 'äéåí', 'Today' => 'היום',
'Tools' => 'ëìéí', 'Tools' => 'כלים',
'Total' => 'Total', // Added - 2011-06-16 'Total' => 'Total', // Added - 2011-06-16
'TotalBrScore' => 'ñê<br/>ðé÷åã', 'TotalBrScore' => 'סך<br/>ניקוד',
'TrackDelay' => 'Track Delay', 'TrackDelay' => 'Track Delay',
'TrackMotion' => 'Track Motion', 'TrackMotion' => 'Track Motion',
'Triggers' => 'èøéâøéí', 'Triggers' => 'טריגרים',
'TurboPanSpeed' => 'Turbo Pan Speed', 'TurboPanSpeed' => 'Turbo Pan Speed',
'TurboTiltSpeed' => 'Turbo Tilt Speed', 'TurboTiltSpeed' => 'Turbo Tilt Speed',
'Type' => 'ñåâ', 'Type' => 'סוג',
'Unarchive' => 'áìúé àøëéá', 'Unarchive' => 'בלתי ארכיב',
'Undefined' => 'Undefined', // Added - 2009-02-08 'Undefined' => 'Undefined', // Added - 2009-02-08
'Units' => 'éçéãåú', 'Units' => 'יחידות',
'Unknown' => 'áìúé éãåò', 'Unknown' => 'בלתי ידוע',
'Update' => 'òãëåï', 'Update' => 'עדכון',
'UpdateAvailable' => 'òãëåï ìæåï-îéðãø àôùøé.', 'UpdateAvailable' => 'עדכון לזון-מינדר אפשרי.',
'UpdateNotNecessary' => 'òãëåï àéðå äëøçé.', 'UpdateNotNecessary' => 'עדכון אינו הכרחי.',
'Updated' => 'Updated', // Added - 2011-06-16 'Updated' => 'Updated', // Added - 2011-06-16
'Upload' => 'Upload', // Added - 2011-08-23 'Upload' => 'Upload', // Added - 2011-08-23
'UseFilter' => 'ùéîåù áîñðï', 'UseFilter' => 'שימוש במסנן',
'UseFilterExprsPost' => '&nbsp;filter&nbsp;expressions', // This is used at the end of the phrase 'use N filter expressions' 'UseFilterExprsPost' => ' filter expressions', // This is used at the end of the phrase 'use N filter expressions'
'UseFilterExprsPre' => 'ùéîåù&nbsp;', // This is used at the beginning of the phrase 'use N filter expressions' 'UseFilterExprsPre' => 'שימוש ', // This is used at the beginning of the phrase 'use N filter expressions'
'UsedPlugins' => 'Used Plugins', 'UsedPlugins' => 'Used Plugins',
'User' => 'îùúîù', 'User' => 'משתמש',
'Username' => 'ùí îùúîù', 'Username' => 'שם משתמש',
'Users' => 'îùúîùéí', 'Users' => 'משתמשים',
'V4L' => 'V4L', // Added - 2015-04-18 'V4L' => 'V4L', // Added - 2015-04-18
'V4LCapturesPerFrame' => 'Captures Per Frame', // Added - 2015-04-18 'V4LCapturesPerFrame' => 'Captures Per Frame', // Added - 2015-04-18
'V4LMultiBuffer' => 'Multi Buffering', // Added - 2015-04-18 'V4LMultiBuffer' => 'Multi Buffering', // Added - 2015-04-18
'Value' => 'òøê', 'Value' => 'ערך',
'Version' => 'âéøñä', 'Version' => 'גירסה',
'VersionIgnore' => 'äúòìí îâéøñä æå', 'VersionIgnore' => 'התעלם מגירסה זו',
'VersionRemindDay' => 'äæëø ìé áòåã éåí àçã', 'VersionRemindDay' => 'הזכר לי בעוד יום אחד',
'VersionRemindHour' => 'äæëø ìé áòåã ùòä àçú', 'VersionRemindHour' => 'הזכר לי בעוד שעה אחת',
'VersionRemindNever' => 'Don\'t remind about new versions', 'VersionRemindNever' => 'Don\'t remind about new versions',
'VersionRemindWeek' => 'Remind again in 1 week', 'VersionRemindWeek' => 'Remind again in 1 week',
'Video' => 'åéãàå', 'Video' => 'וידאו',
'VideoFormat' => 'úáðéú åéãàå', 'VideoFormat' => 'תבנית וידאו',
'VideoGenFailed' => 'Video Generation Failed!', 'VideoGenFailed' => 'Video Generation Failed!',
'VideoGenFiles' => 'Existing Video Files', 'VideoGenFiles' => 'Existing Video Files',
'VideoGenNoFiles' => 'No Video Files Found', 'VideoGenNoFiles' => 'No Video Files Found',
'VideoGenParms' => 'Video Generation Parameters', 'VideoGenParms' => 'Video Generation Parameters',
'VideoGenSucceeded' => 'Video Generation Succeeded!', 'VideoGenSucceeded' => 'Video Generation Succeeded!',
'VideoSize' => 'âåãì åéãàå', 'VideoSize' => 'גודל וידאו',
'VideoWriter' => 'Video Writer', // Added - 2018-08-30 'VideoWriter' => 'Video Writer', // Added - 2018-08-30
'View' => 'äöâ', 'View' => 'הצג',
'ViewAll' => 'äöâ äëì', 'ViewAll' => 'הצג הכל',
'ViewEvent' => 'äöâ àéøåò', 'ViewEvent' => 'הצג אירוע',
'ViewPaged' => 'View Paged', 'ViewPaged' => 'View Paged',
'Wake' => 'äòø', 'Wake' => 'הער',
'WarmupFrames' => 'Warmup Frames', 'WarmupFrames' => 'Warmup Frames',
'Watch' => 'öôä', 'Watch' => 'צפה',
'Web' => 'àéðèøðè', 'Web' => 'אינטרנט',
'WebColour' => 'öáò àéðèøðè', 'WebColour' => 'צבע אינטרנט',
'WebSiteUrl' => 'Website URL', // Added - 2018-08-30 'WebSiteUrl' => 'Website URL', // Added - 2018-08-30
'Week' => 'ùáåò', 'Week' => 'שבוע',
'White' => 'ìáï', 'White' => 'לבן',
'WhiteBalance' => 'White Balance', 'WhiteBalance' => 'White Balance',
'Wide' => 'øçá', 'Wide' => 'רחב',
'X' => 'X', 'X' => 'X',
'X10' => 'X10', 'X10' => 'X10',
'X10ActivationString' => 'X10 Activation String', 'X10ActivationString' => 'X10 Activation String',
'X10InputAlarmString' => 'X10 Input Alarm String', 'X10InputAlarmString' => 'X10 Input Alarm String',
'X10OutputAlarmString' => 'X10 Output Alarm String', 'X10OutputAlarmString' => 'X10 Output Alarm String',
'Y' => 'Y', 'Y' => 'Y',
'Yes' => 'ëï', 'Yes' => 'כן',
'YouNoPerms' => 'àéï ìê äøùàä ìäéëðñ ìî÷åø æä.', 'YouNoPerms' => 'אין לך הרשאה להיכנס למקור זה.',
'Zone' => 'àæåø', 'Zone' => 'אזור',
'ZoneAlarmColour' => 'Alarm Colour (Red/Green/Blue)', 'ZoneAlarmColour' => 'Alarm Colour (Red/Green/Blue)',
'ZoneArea' => 'Zone Area', 'ZoneArea' => 'Zone Area',
'ZoneExtendAlarmFrames' => 'Extend Alarm Frame Count', 'ZoneExtendAlarmFrames' => 'Extend Alarm Frame Count',
@ -799,10 +798,10 @@ $SLANG = array(
'ZoneMinMaxPixelThres' => 'Min/Max Pixel Threshold (0-255)', 'ZoneMinMaxPixelThres' => 'Min/Max Pixel Threshold (0-255)',
'ZoneMinderLog' => 'ZoneMinder Log', // Added - 2011-06-17 'ZoneMinderLog' => 'ZoneMinder Log', // Added - 2011-06-17
'ZoneOverloadFrames' => 'Overload Frame Ignore Count', 'ZoneOverloadFrames' => 'Overload Frame Ignore Count',
'Zones' => 'àæåøéí', 'Zones' => 'אזורים',
'Zoom' => 'æåí', 'Zoom' => 'זום',
'ZoomIn' => 'æåí ôðéîä', 'ZoomIn' => 'זום פנימה',
'ZoomOut' => 'æåí äçåöä', 'ZoomOut' => 'זום החוצה',
); );
// Complex replacements with formatting and/or placements, must be passed through sprintf // Complex replacements with formatting and/or placements, must be passed through sprintf

View File

@ -24,7 +24,7 @@ foreach ( $servers as $S ) {
$ServersById[$S->Id()] = $S; $ServersById[$S->Id()] = $S;
} }
session_start(); session_start();
foreach ( array('Group','Function','ServerId','StorageId','Status','MonitorId','MonitorName','Source') as $var ) { foreach ( array('GroupId','Function','ServerId','StorageId','Status','MonitorId','MonitorName','Source') as $var ) {
if ( isset($_REQUEST[$var]) ) { if ( isset($_REQUEST[$var]) ) {
if ( $_REQUEST[$var] != '' ) { if ( $_REQUEST[$var] != '' ) {
$_SESSION[$var] = $_REQUEST[$var]; $_SESSION[$var] = $_REQUEST[$var];
@ -60,7 +60,7 @@ $groupSql = '';
if ( count($GroupsById) ) { if ( count($GroupsById) ) {
$html .= '<span id="groupControl"><label>'. translate('Group') .'</label>'; $html .= '<span id="groupControl"><label>'. translate('Group') .'</label>';
# This will end up with the group_id of the deepest selection # This will end up with the group_id of the deepest selection
$group_id = isset($_SESSION['Group']) ? $_SESSION['Group'] : null; $group_id = isset($_SESSION['GroupId']) ? $_SESSION['GroupId'] : null;
$html .= ZM\Group::get_group_dropdown(); $html .= ZM\Group::get_group_dropdown();
$groupSql = ZM\Group::get_group_sql($group_id); $groupSql = ZM\Group::get_group_sql($group_id);
$html .= '</span> $html .= '</span>

View File

@ -31,7 +31,6 @@ $Monitor = $Event->Monitor();
$countSql = 'SELECT COUNT(*) AS FrameCount FROM Frames AS F WHERE 1 '; $countSql = 'SELECT COUNT(*) AS FrameCount FROM Frames AS F WHERE 1 ';
$frameSql = 'SELECT *, unix_timestamp( TimeStamp ) AS UnixTimeStamp FROM Frames AS F WHERE 1 '; $frameSql = 'SELECT *, unix_timestamp( TimeStamp ) AS UnixTimeStamp FROM Frames AS F WHERE 1 ';
// override the sort_field handling in parseSort for frames // override the sort_field handling in parseSort for frames
if ( empty($_REQUEST['sort_field']) ) if ( empty($_REQUEST['sort_field']) )
$_REQUEST['sort_field'] = 'FramesTimeStamp'; $_REQUEST['sort_field'] = 'FramesTimeStamp';
@ -100,7 +99,8 @@ if ( !empty($page) ) {
} }
$maxShortcuts = 5; $maxShortcuts = 5;
$pagination = getPagination($pages, $page, $maxShortcuts, $sortQuery.'&eid='.$eid.$limitQuery.$filterQuery); $totalQuery = $sortQuery.'&eid='.$eid.$limitQuery.$filterQuery;
$pagination = getPagination($pages, $page, $maxShortcuts, $totalQuery);
$frames = dbFetchAll($frameSql); $frames = dbFetchAll($frameSql);
@ -125,11 +125,11 @@ if ( $pagination ) {
if ( $pages > 1 ) { if ( $pages > 1 ) {
if ( !empty($page) ) { if ( !empty($page) ) {
?> ?>
<a href="?view=<?php echo $view ?>&amp;page=0<?php echo $filterQuery ?><?php echo $sortQuery.$limitQuery ?>"><?php echo translate('ViewAll') ?></a> <a href="?view=<?php echo $view ?>&amp;page=0<?php echo $totalQuery ?>"><?php echo translate('ViewAll') ?></a>
<?php <?php
} else { } else {
?> ?>
<a href="?view=<?php echo $view ?>&amp;page=1<?php echo $filterQuery ?><?php echo $sortQuery.$limitQuery ?>"><?php echo translate('ViewPaged') ?></a> <a href="?view=<?php echo $view ?>&amp;page=1<?php echo $totalQuery ?>"><?php echo translate('ViewPaged') ?></a>
<?php <?php
} }
} }

View File

@ -10,39 +10,31 @@ var controlOptions = new Object();
$controlTypes = array( ''=>translate('None') ); $controlTypes = array( ''=>translate('None') );
# Temporary workaround to show all ptz control types regardless of monitor source type # Temporary workaround to show all ptz control types regardless of monitor source type
# $sql = "select * from Controls where Type = '".$newMonitor['Type']."'"; # $sql = "select * from Controls where Type = '".$newMonitor['Type']."'";
$sql = "select * from Controls"; $sql = 'SELECT `Id`,`Name`,`HasHomePreset`,`NumPresets` FROM `Controls` ORDER BY lower(`Name`)';
foreach( dbFetchAll( $sql ) as $row ) { foreach( dbFetchAll($sql) as $row ) {
$controlTypes[$row['Id']] = $row['Name']; $controlTypes[$row['Id']] = $row['Name'];
?> echo '
controlOptions[<?php echo $row['Id'] ?>] = new Array(); controlOptions['.$row['Id'].'] = new Array();
<?php controlOptions['.$row['Id'].'][0] = '.
if ( $row['HasHomePreset'] ) { ( $row['HasHomePreset'] ? '\''.translate('Home').'\'' : 'null' ).'
?> ';
controlOptions[<?php echo $row['Id'] ?>][0] = '<?php echo translate('Home') ?>';
<?php
} else {
?>
controlOptions[<?php echo $row['Id'] ?>][0] = null;
<?php
}
for ( $i = 1; $i <= $row['NumPresets']; $i++ ) { for ( $i = 1; $i <= $row['NumPresets']; $i++ ) {
?> echo 'controlOptions['. $row['Id'].']['.$i.'] = \''.translate('Preset').' '.$i .'\';
controlOptions[<?php echo $row['Id'] ?>][<?php echo $i ?>] = '<?php echo translate('Preset').' '.$i ?>'; ';
<?php
} }
} } # end foreach row
} } # end if ZM_OPT_CONTROL
?> ?>
var monitorNames = new Object(); var monitorNames = new Object();
<?php <?php
$query = empty($_REQUEST['mid']) ? dbQuery('SELECT Name FROM Monitors') : dbQuery('SELECT Name FROM Monitors WHERE Id != ?', array($_REQUEST['mid']) ); $query = empty($_REQUEST['mid']) ? dbQuery('SELECT Name FROM Monitors') : dbQuery('SELECT Name FROM Monitors WHERE Id != ?', array($_REQUEST['mid']) );
if ( $query ) { if ( $query ) {
while ( $name = dbFetchNext($query, 'Name') ) { while ( $name = dbFetchNext($query, 'Name') ) {
?> echo '
monitorNames['<?php echo validJsStr($name) ?>'] = true; monitorNames[\''.validJsStr($name).'\'] = true;
<?php ';
} // end foreach } // end foreach
} # end if query } # end if query
?> ?>
@ -140,6 +132,23 @@ function validateForm( form ) {
alert(errors.join("\n")); alert(errors.join("\n"));
return false; return false;
} }
var warnings = new Array();
if ( (form.elements['newMonitor[Function]'].value != 'Monitor') && (form.elements['newMonitor[Function]'].value != 'None') ) {
if ( (form.elements['newMonitor[SaveJPEGs]'].value == '0') && (form.elements['newMonitor[VideoWriter]'].value == '0') ) {
warnings[warnings.length] = "<?php echo translate('BadNoSaveJPEGsOrVideoWriter'); ?>";
}
console.log(form.elements['newMonitor[SaveJPEGs]'].value);
console.log(form.elements['newMonitor[VideoWriter]'].value);
}
console.log(warnings);
if ( warnings.length ) {
if ( !confirm(warnings.join("\n")) ) {
return false;
}
}
return true; return true;
} }

View File

@ -25,7 +25,7 @@ function Monitor(monitorData) {
} }
}; };
this.eventHandler = function( event ) { this.eventHandler = function(event) {
console.log(event); console.log(event);
}; };
@ -210,7 +210,7 @@ function Monitor(monitorData) {
* @param {*} element - the event data passed by onchange callback * @param {*} element - the event data passed by onchange callback
*/ */
function selectLayout(element) { function selectLayout(element) {
console.dir(element); console.log(element);
layout = $j(element).val(); layout = $j(element).val();
if ( layout_id = parseInt(layout) ) { if ( layout_id = parseInt(layout) ) {
@ -254,7 +254,7 @@ function selectLayout(element) {
if ( layouts[layout_id].Name != 'Freeform' ) { // 'montage_freeform.css' ) { if ( layouts[layout_id].Name != 'Freeform' ) { // 'montage_freeform.css' ) {
Cookie.write( 'zmMontageScale', '', {duration: 10*365} ); Cookie.write( 'zmMontageScale', '', {duration: 10*365} );
$('scale').set('value', ''); $('scale').set('value', '');
$('width').set('value', ''); $('width').set('value', 'auto');
for ( var i = 0, length = monitors.length; i < length; i++ ) { for ( var i = 0, length = monitors.length; i < length; i++ ) {
var monitor = monitors[i]; var monitor = monitors[i];
var streamImg = $('liveStream'+monitor.id); var streamImg = $('liveStream'+monitor.id);
@ -318,7 +318,7 @@ function changeSize() {
Cookie.write('zmMontageScale', '', {duration: 10*365}); Cookie.write('zmMontageScale', '', {duration: 10*365});
Cookie.write('zmMontageWidth', width, {duration: 10*365}); Cookie.write('zmMontageWidth', width, {duration: 10*365});
Cookie.write('zmMontageHeight', height, {duration: 10*365}); Cookie.write('zmMontageHeight', height, {duration: 10*365});
selectLayout('#zmMontageLayout'); //selectLayout('#zmMontageLayout');
} // end function changeSize() } // end function changeSize()
/** /**

View File

@ -1,5 +1,5 @@
<?php <?php
xhtmlHeaders(__FILE__, translate('Login') ); xhtmlHeaders(__FILE__, translate('Login'));
?> ?>
<body> <body>
<?php echo getNavBarHTML(); ?> <?php echo getNavBarHTML(); ?>
@ -30,10 +30,10 @@ xhtmlHeaders(__FILE__, translate('Login') );
&& defined('ZM_OPT_GOOG_RECAPTCHA_SECRETKEY') && defined('ZM_OPT_GOOG_RECAPTCHA_SECRETKEY')
&& ZM_OPT_USE_GOOG_RECAPTCHA && ZM_OPT_GOOG_RECAPTCHA_SITEKEY && ZM_OPT_GOOG_RECAPTCHA_SECRETKEY) && ZM_OPT_USE_GOOG_RECAPTCHA && ZM_OPT_GOOG_RECAPTCHA_SITEKEY && ZM_OPT_GOOG_RECAPTCHA_SECRETKEY)
{ {
echo "<div class='g-recaptcha' data-sitekey='".ZM_OPT_GOOG_RECAPTCHA_SITEKEY."'></div>"; echo '<div class="g-recaptcha" data-sitekey="'.ZM_OPT_GOOG_RECAPTCHA_SITEKEY.'"></div>';
} ?> } ?>
<input class="btn btn-lg btn-primary btn-block" type="submit" value="<?php echo translate('Login') ?>"/> <button class="btn btn-lg btn-primary btn-block" type="submit"><?php echo translate('Login') ?></button>
</div> </div>
</form> </form>

View File

@ -647,7 +647,6 @@ switch ( $tab ) {
foreach ( getEnumValues('Monitors', 'Function') as $f ) { foreach ( getEnumValues('Monitors', 'Function') as $f ) {
$function_options[$f] = translate("Fn$f"); $function_options[$f] = translate("Fn$f");
} }
ZM\Error("Type: " . $monitor->Type());
echo htmlSelect('newMonitor[Function]', $function_options, $monitor->Function()); echo htmlSelect('newMonitor[Function]', $function_options, $monitor->Function());
?> ?>
</td> </td>

View File

@ -51,7 +51,7 @@ $heights = array(
$scale = '100'; # actual $scale = '100'; # actual
if ( isset( $_REQUEST['scale'] ) ) { if ( isset($_REQUEST['scale']) ) {
$scale = validInt($_REQUEST['scale']); $scale = validInt($_REQUEST['scale']);
} else if ( isset($_COOKIE['zmMontageScale']) ) { } else if ( isset($_COOKIE['zmMontageScale']) ) {
$scale = $_COOKIE['zmMontageScale']; $scale = $_COOKIE['zmMontageScale'];
@ -63,7 +63,14 @@ if ( ! $scale )
$layouts = ZM\MontageLayout::find(NULL, array('order'=>"lower('Name')")); $layouts = ZM\MontageLayout::find(NULL, array('order'=>"lower('Name')"));
$layoutsById = array(); $layoutsById = array();
foreach ( $layouts as $l ) { foreach ( $layouts as $l ) {
$layoutsById[$l->Id()] = $l; if ( $l->Name() == 'Freeform' ) {
$layoutsById[$l->Id()] = $l;
break;
}
}
foreach ( $layouts as $l ) {
if ( $l->Name() != "Freeform" )
$layoutsById[$l->Id()] = $l;
} }
session_start(); session_start();
@ -164,19 +171,19 @@ if ( $showZones ) {
<input type="hidden" name="action" value="Save"/> <input type="hidden" name="action" value="Save"/>
<span id="widthControl"> <span id="widthControl">
<label><?php echo translate('Width') ?>:</label> <label><?php echo translate('Width') ?></label>
<?php echo htmlSelect('width', $widths, $options['width'], 'changeSize(this);'); ?> <?php echo htmlSelect('width', $widths, $options['width'], 'changeSize(this);'); ?>
</span> </span>
<span id="heightControl"> <span id="heightControl">
<label><?php echo translate('Height') ?>:</label> <label><?php echo translate('Height') ?></label>
<?php echo htmlSelect('height', $heights, $options['height'], 'changeSize(this);'); ?> <?php echo htmlSelect('height', $heights, $options['height'], 'changeSize(this);'); ?>
</span> </span>
<span id="scaleControl"> <span id="scaleControl">
<label><?php echo translate('Scale') ?>:</label> <label><?php echo translate('Scale') ?></label>
<?php echo htmlSelect('scale', $scales, $scale, 'changeScale(this);'); ?> <?php echo htmlSelect('scale', $scales, $scale, 'changeScale(this);'); ?>
</span> </span>
<span id="layoutControl"> <span id="layoutControl">
<label for="layout"><?php echo translate('Layout') ?>:</label> <label for="layout"><?php echo translate('Layout') ?></label>
<?php echo htmlSelect('zmMontageLayout', $layoutsById, $layout_id, array('onchange'=>'selectLayout(this);')); ?> <?php echo htmlSelect('zmMontageLayout', $layoutsById, $layout_id, array('onchange'=>'selectLayout(this);')); ?>
</span> </span>
<input type="hidden" name="Positions"/> <input type="hidden" name="Positions"/>

View File

@ -18,6 +18,7 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
// //
global $cspNonce;
$skinJsPhpFile = getSkinFile('js/skin.js.php'); $skinJsPhpFile = getSkinFile('js/skin.js.php');
$skinJsFile = getSkinFile('js/skin.js'); $skinJsFile = getSkinFile('js/skin.js');
?> ?>

View File

@ -1,6 +1,6 @@
<?php <?php
// //
// ZoneMinder web logging in view file, $Date$, $Revision$ // ZoneMinder web logging in view file
// Copyright (C) 2001-2008 Philip Coombes // Copyright (C) 2001-2008 Philip Coombes
// //
// This program is free software; you can redistribute it and/or // This program is free software; you can redistribute it and/or
@ -18,7 +18,7 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
// //
xhtmlHeaders(__FILE__, translate('LoggingIn') ); xhtmlHeaders(__FILE__, translate('LoggingIn'));
?> ?>
<body> <body>
<div id="page"> <div id="page">

View File

@ -18,8 +18,6 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
// //
require_once('includes/Monitor.php');
if ( !canView('Stream') ) { if ( !canView('Stream') ) {
$view = 'error'; $view = 'error';
return; return;
@ -37,6 +35,7 @@ if ( ! visibleMonitor($mid) ) {
return; return;
} }
require_once('includes/Monitor.php');
$monitor = new ZM\Monitor($mid); $monitor = new ZM\Monitor($mid);
#Whether to show the controls button #Whether to show the controls button

View File

@ -1,4 +1,4 @@
#!/usr/bin/perl -w #!@PERL_EXECUTABLE@ -w
# #
# ========================================================================== # ==========================================================================
# #