2008-07-14 21:54:50 +08:00
|
|
|
<?php
|
|
|
|
//
|
|
|
|
// ZoneMinder web monitor view file, $Date$, $Revision$
|
2014-05-18 04:05:57 +08:00
|
|
|
// Copyright (C) 2001-2008 Philip Coombes
|
2008-07-14 21:54:50 +08:00
|
|
|
//
|
|
|
|
// This program is free software; you can redistribute it and/or
|
|
|
|
// modify it under the terms of the GNU General Public License
|
|
|
|
// as published by the Free Software Foundation; either version 2
|
|
|
|
// of the License, or (at your option) any later version.
|
|
|
|
//
|
|
|
|
// This program is distributed in the hope that it will be useful,
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
// GNU General Public License for more details.
|
|
|
|
//
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
|
|
// along with this program; if not, write to the Free Software
|
2016-12-26 23:23:16 +08:00
|
|
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
2008-07-14 21:54:50 +08:00
|
|
|
//
|
|
|
|
|
2018-04-04 01:38:38 +08:00
|
|
|
require_once('includes/Server.php');
|
|
|
|
require_once('includes/Storage.php');
|
2015-09-17 02:51:05 +08:00
|
|
|
|
2019-03-21 03:03:20 +08:00
|
|
|
if ( !canView('Monitors') ) {
|
2017-05-31 01:14:27 +08:00
|
|
|
$view = 'error';
|
2017-05-19 03:16:59 +08:00
|
|
|
return;
|
2008-07-14 21:54:50 +08:00
|
|
|
}
|
|
|
|
|
2017-05-31 01:14:27 +08:00
|
|
|
$Server = null;
|
2019-03-21 03:03:20 +08:00
|
|
|
if ( defined('ZM_SERVER_ID') ) {
|
|
|
|
$Server = dbFetchOne('SELECT * FROM Servers WHERE Id=?', NULL, array(ZM_SERVER_ID));
|
2017-05-31 01:14:27 +08:00
|
|
|
}
|
2019-03-21 03:03:20 +08:00
|
|
|
if ( !$Server ) {
|
|
|
|
$Server = array('Id' => '');
|
2017-05-19 03:16:59 +08:00
|
|
|
}
|
2015-07-09 23:41:46 +08:00
|
|
|
|
2017-10-04 04:28:56 +08:00
|
|
|
$monitor = null;
|
2019-09-20 02:56:16 +08:00
|
|
|
if ( !empty($_REQUEST['mid']) ) {
|
|
|
|
$monitor = new ZM\Monitor($_REQUEST['mid']);
|
2017-10-04 04:28:56 +08:00
|
|
|
if ( $monitor and ZM_OPT_X10 )
|
2019-03-21 03:03:20 +08:00
|
|
|
$x10Monitor = dbFetchOne('SELECT * FROM TriggersX10 WHERE MonitorId = ?', NULL, array($_REQUEST['mid']));
|
2019-05-13 19:58:18 +08:00
|
|
|
}
|
2019-09-20 02:56:16 +08:00
|
|
|
if ( !$monitor ) {
|
2015-07-09 23:41:46 +08:00
|
|
|
|
2019-03-21 03:03:20 +08:00
|
|
|
$nextId = getTableAutoInc('Monitors');
|
|
|
|
if ( isset($_REQUEST['dupId']) ) {
|
|
|
|
$monitor = new ZM\Monitor($_REQUEST['dupId']);
|
2018-04-25 21:33:02 +08:00
|
|
|
$monitor->GroupIds(); // have to load before we change the Id
|
2017-05-31 01:14:27 +08:00
|
|
|
if ( ZM_OPT_X10 )
|
2019-03-21 03:03:20 +08:00
|
|
|
$x10Monitor = dbFetchOne('SELECT * FROM TriggersX10 WHERE MonitorId = ?', NULL, array($_REQUEST['dupId']));
|
2017-05-31 01:14:27 +08:00
|
|
|
$clonedName = $monitor->Name();
|
2019-03-21 03:03:20 +08:00
|
|
|
$monitor->Id(0);
|
2017-05-19 03:16:59 +08:00
|
|
|
} else {
|
2019-02-22 22:19:07 +08:00
|
|
|
$monitor = new ZM\Monitor();
|
2019-09-20 02:56:16 +08:00
|
|
|
} # end if $_REQUEST['dupID']
|
|
|
|
$monitor->Name(translate('Monitor').'-'.$nextId);
|
2017-05-19 03:16:59 +08:00
|
|
|
} # end if $_REQUEST['mid']
|
|
|
|
|
|
|
|
if ( ZM_OPT_X10 && empty($x10Monitor) ) {
|
|
|
|
$x10Monitor = array(
|
2019-05-13 19:58:18 +08:00
|
|
|
'Activation' => '',
|
|
|
|
'AlarmInput' => '',
|
|
|
|
'AlarmOutput' => '',
|
2017-05-19 03:16:59 +08:00
|
|
|
);
|
2008-07-16 16:40:21 +08:00
|
|
|
}
|
|
|
|
|
2019-04-26 22:44:00 +08:00
|
|
|
function fourcc($a, $b, $c, $d) {
|
|
|
|
return ord($a) | (ord($b) << 8) | (ord($c) << 16) | (ord($d) << 24);
|
2009-03-31 21:00:49 +08:00
|
|
|
}
|
|
|
|
|
2019-04-26 22:44:00 +08:00
|
|
|
if ( isset($_REQUEST['newMonitor']) ) {
|
2017-07-21 23:04:32 +08:00
|
|
|
# Update the monitor object with whatever has been set so far.
|
2019-04-26 22:44:00 +08:00
|
|
|
$monitor->set($_REQUEST['newMonitor']);
|
2017-06-15 03:35:35 +08:00
|
|
|
|
2017-05-19 03:16:59 +08:00
|
|
|
if ( ZM_OPT_X10 )
|
|
|
|
$newX10Monitor = $_REQUEST['newX10Monitor'];
|
|
|
|
} else {
|
|
|
|
if ( ZM_OPT_X10 )
|
|
|
|
$newX10Monitor = $x10Monitor;
|
2008-07-14 21:54:50 +08:00
|
|
|
}
|
2008-07-16 16:40:21 +08:00
|
|
|
|
2017-05-19 03:16:59 +08:00
|
|
|
# What if it has less zeros? This is not robust code.
|
2017-10-25 08:34:32 +08:00
|
|
|
if ( $monitor->AnalysisFPSLimit() == '0.00' )
|
2019-04-26 22:44:00 +08:00
|
|
|
$monitor->AnalysisFPSLimit('');
|
2017-06-15 03:35:35 +08:00
|
|
|
if ( $monitor->MaxFPS() == '0.00' )
|
2019-04-26 22:44:00 +08:00
|
|
|
$monitor->MaxFPS('');
|
2017-06-15 03:35:35 +08:00
|
|
|
if ( $monitor->AlarmMaxFPS() == '0.00' )
|
2019-04-26 22:44:00 +08:00
|
|
|
$monitor->AlarmMaxFPS('');
|
2017-05-19 03:16:59 +08:00
|
|
|
|
|
|
|
if ( !empty($_REQUEST['preset']) ) {
|
|
|
|
$preset = dbFetchOne( 'SELECT Type, Device, Channel, Format, Protocol, Method, Host, Port, Path, Width, Height, Palette, MaxFPS, Controllable, ControlId, ControlDevice, ControlAddress, DefaultRate, DefaultScale FROM MonitorPresets WHERE Id = ?', NULL, array($_REQUEST['preset']) );
|
|
|
|
foreach ( $preset as $name=>$value ) {
|
2019-05-13 19:58:18 +08:00
|
|
|
# Does isset handle NULL's? I don't think this code is correct.
|
2019-09-20 02:56:16 +08:00
|
|
|
# Icon: It does, but this means we can't set a null value.
|
2017-05-19 03:16:59 +08:00
|
|
|
if ( isset($value) ) {
|
2019-09-20 02:56:16 +08:00
|
|
|
$monitor->$name($value);
|
2008-07-14 21:54:50 +08:00
|
|
|
}
|
2017-05-19 03:16:59 +08:00
|
|
|
}
|
2019-04-26 22:44:00 +08:00
|
|
|
} # end if preset
|
|
|
|
|
2017-05-19 03:16:59 +08:00
|
|
|
if ( !empty($_REQUEST['probe']) ) {
|
2018-10-24 21:49:56 +08:00
|
|
|
$probe = json_decode(base64_decode($_REQUEST['probe']));
|
2017-05-19 03:16:59 +08:00
|
|
|
foreach ( $probe as $name=>$value ) {
|
|
|
|
if ( isset($value) ) {
|
2019-05-13 19:58:18 +08:00
|
|
|
# Does isset handle NULL's? I don't think this code is correct.
|
2018-09-20 23:30:23 +08:00
|
|
|
$monitor->$name = urldecode($value);
|
2009-03-31 21:00:49 +08:00
|
|
|
}
|
2017-05-19 03:16:59 +08:00
|
|
|
}
|
2017-07-21 23:04:32 +08:00
|
|
|
if ( ZM_HAS_V4L && $monitor->Type() == 'Local' ) {
|
|
|
|
$monitor->Palette( fourCC( substr($monitor->Palette,0,1), substr($monitor->Palette,1,1), substr($monitor->Palette,2,1), substr($monitor->Palette,3,1) ) );
|
|
|
|
if ( $monitor->Format() == 'PAL' )
|
|
|
|
$monitor->Format( 0x000000ff );
|
|
|
|
elseif ( $monitor->Format() == 'NTSC' )
|
|
|
|
$monitor->Format( 0x0000b000 );
|
|
|
|
}
|
2019-04-26 22:44:00 +08:00
|
|
|
} # end if apply probe settings
|
2008-07-14 21:54:50 +08:00
|
|
|
|
2008-07-16 16:40:21 +08:00
|
|
|
$sourceTypes = array(
|
2015-05-10 21:10:30 +08:00
|
|
|
'Local' => translate('Local'),
|
|
|
|
'Remote' => translate('Remote'),
|
|
|
|
'File' => translate('File'),
|
|
|
|
'Ffmpeg' => translate('Ffmpeg'),
|
|
|
|
'Libvlc' => translate('Libvlc'),
|
2017-10-04 04:28:56 +08:00
|
|
|
'cURL' => 'cURL (HTTP(S) only)',
|
2018-04-27 05:18:36 +08:00
|
|
|
'WebSite'=> 'Web Site',
|
|
|
|
'NVSocket' => translate('NVSocket')
|
2017-05-31 01:14:27 +08:00
|
|
|
);
|
|
|
|
if ( !ZM_HAS_V4L )
|
|
|
|
unset($sourceTypes['Local']);
|
|
|
|
|
|
|
|
$localMethods = array(
|
|
|
|
'v4l2' => 'Video For Linux version 2',
|
|
|
|
'v4l1' => 'Video For Linux version 1',
|
2017-05-19 03:16:59 +08:00
|
|
|
);
|
2008-07-16 16:40:21 +08:00
|
|
|
|
2011-02-16 05:59:06 +08:00
|
|
|
if ( !ZM_HAS_V4L2 )
|
2017-05-19 03:16:59 +08:00
|
|
|
unset($localMethods['v4l2']);
|
2011-02-16 05:59:06 +08:00
|
|
|
if ( !ZM_HAS_V4L1 )
|
2017-05-19 03:16:59 +08:00
|
|
|
unset($localMethods['v4l1']);
|
|
|
|
|
2017-05-31 07:53:02 +08:00
|
|
|
$remoteProtocols = array(
|
|
|
|
'http' => 'HTTP',
|
|
|
|
'rtsp' => 'RTSP'
|
|
|
|
);
|
2017-05-19 03:16:59 +08:00
|
|
|
|
2017-05-31 07:53:02 +08:00
|
|
|
$rtspMethods = array(
|
|
|
|
'rtpUni' => 'RTP/Unicast',
|
|
|
|
'rtpMulti' => 'RTP/Multicast',
|
|
|
|
'rtpRtsp' => 'RTP/RTSP',
|
|
|
|
'rtpRtspHttp' => 'RTP/RTSP/HTTP'
|
|
|
|
);
|
|
|
|
|
|
|
|
$rtspFFMpegMethods = array(
|
|
|
|
'rtpRtsp' => 'TCP',
|
|
|
|
'rtpUni' => 'UDP',
|
|
|
|
'rtpMulti' => 'UDP Multicast',
|
|
|
|
'rtpRtspHttp' => 'HTTP Tunnel'
|
2017-06-15 03:35:35 +08:00
|
|
|
);
|
2017-05-31 07:53:02 +08:00
|
|
|
|
|
|
|
$httpMethods = array(
|
|
|
|
'simple' => 'Simple',
|
|
|
|
'regexp' => 'Regexp',
|
|
|
|
'jpegTags' => 'JPEG Tags'
|
|
|
|
);
|
2017-05-19 03:16:59 +08:00
|
|
|
|
2008-12-06 02:45:01 +08:00
|
|
|
if ( !ZM_PCRE )
|
2017-05-19 03:16:59 +08:00
|
|
|
unset($httpMethods['regexp']);
|
|
|
|
// Currently unsupported
|
2017-05-31 07:53:02 +08:00
|
|
|
unset($httpMethods['jpegTags']);
|
|
|
|
|
|
|
|
if ( ZM_HAS_V4L1 ) {
|
|
|
|
$v4l1DeviceFormats = array(
|
|
|
|
'PAL' => 0,
|
|
|
|
'NTSC' => 1,
|
|
|
|
'SECAM' => 2,
|
|
|
|
'AUTO' => 3,
|
|
|
|
'FMT4' => 4,
|
|
|
|
'FMT5' => 5,
|
|
|
|
'FMT6' => 6,
|
|
|
|
'FMT7' => 7
|
|
|
|
);
|
2008-07-16 16:40:21 +08:00
|
|
|
|
2017-05-31 07:53:02 +08:00
|
|
|
$v4l1MaxChannels = 15;
|
|
|
|
$v4l1DeviceChannels = array();
|
|
|
|
for ( $i = 0; $i <= $v4l1MaxChannels; $i++ )
|
2017-06-15 03:35:35 +08:00
|
|
|
$v4l1DeviceChannels[$i] = $i;
|
2017-05-31 07:53:02 +08:00
|
|
|
|
|
|
|
$v4l1LocalPalettes = array(
|
|
|
|
translate('Grey') => 1,
|
|
|
|
'BGR32' => 5,
|
|
|
|
'BGR24' => 4,
|
|
|
|
'*YUYV' => 8,
|
|
|
|
'*RGB565' => 3,
|
|
|
|
'*RGB555' => 6,
|
|
|
|
'*YUV422' => 7,
|
|
|
|
'*YUV422P' => 13,
|
|
|
|
'*YUV420P' => 15
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( ZM_HAS_V4L2 ) {
|
2017-05-19 03:16:59 +08:00
|
|
|
$v4l2DeviceFormats = array(
|
2017-05-31 01:14:27 +08:00
|
|
|
'PAL' => 0x000000ff,
|
|
|
|
'NTSC' => 0x0000b000,
|
|
|
|
'PAL B' => 0x00000001,
|
|
|
|
'PAL B1' => 0x00000002,
|
|
|
|
'PAL G' => 0x00000004,
|
|
|
|
'PAL H' => 0x00000008,
|
|
|
|
'PAL I' => 0x00000010,
|
|
|
|
'PAL D' => 0x00000020,
|
|
|
|
'PAL D1' => 0x00000040,
|
|
|
|
'PAL K' => 0x00000080,
|
|
|
|
'PAL M' => 0x00000100,
|
|
|
|
'PAL N' => 0x00000200,
|
|
|
|
'PAL Nc' => 0x00000400,
|
|
|
|
'PAL 60' => 0x00000800,
|
|
|
|
'NTSC M' => 0x00001000,
|
|
|
|
'NTSC M JP' => 0x00002000,
|
|
|
|
'NTSC 443' => 0x00004000,
|
|
|
|
'NTSC M KR' => 0x00008000,
|
|
|
|
'SECAM B' => 0x00010000,
|
|
|
|
'SECAM D' => 0x00020000,
|
|
|
|
'SECAM G' => 0x00040000,
|
|
|
|
'SECAM H' => 0x00080000,
|
|
|
|
'SECAM K' => 0x00100000,
|
|
|
|
'SECAM K1' => 0x00200000,
|
|
|
|
'SECAM L' => 0x00400000,
|
|
|
|
'SECAM LC' => 0x00800000,
|
|
|
|
'ATSC 8 VSB' => 0x01000000,
|
|
|
|
'ATSC 16 VSB' => 0x02000000,
|
2017-05-19 03:16:59 +08:00
|
|
|
);
|
|
|
|
|
|
|
|
$v4l2MaxChannels = 31;
|
|
|
|
$v4l2DeviceChannels = array();
|
|
|
|
for ( $i = 0; $i <= $v4l2MaxChannels; $i++ )
|
2017-06-01 09:30:19 +08:00
|
|
|
$v4l2DeviceChannels[$i] = $i;
|
2017-05-19 03:16:59 +08:00
|
|
|
|
|
|
|
$v4l2LocalPalettes = array(
|
2017-05-31 01:14:27 +08:00
|
|
|
'Auto' => 0, /* Automatic palette selection */
|
2017-05-19 03:16:59 +08:00
|
|
|
|
|
|
|
/* Pixel format FOURCC depth Description */
|
|
|
|
translate('Grey') => fourcc('G','R','E','Y'), /* 8 Greyscale */
|
2017-05-31 01:14:27 +08:00
|
|
|
'BGR32' => fourcc('B','G','R','4'), /* 32 BGR-8-8-8-8 */
|
|
|
|
'RGB32' => fourcc('R','G','B','4'), /* 32 RGB-8-8-8-8 */
|
|
|
|
'BGR24' => fourcc('B','G','R','3'), /* 24 BGR-8-8-8 */
|
|
|
|
'RGB24' => fourcc('R','G','B','3'), /* 24 RGB-8-8-8 */
|
|
|
|
'*YUYV' => fourcc('Y','U','Y','V'), /* 16 YUV 4:2:2 */
|
2017-05-19 03:16:59 +08:00
|
|
|
|
|
|
|
/* compressed formats */
|
2017-05-31 01:14:27 +08:00
|
|
|
'*JPEG' => fourcc('J','P','E','G'), /* JFIF JPEG */
|
|
|
|
'*MJPEG' => fourcc('M','J','P','G'), /* Motion-JPEG */
|
|
|
|
//'DV' => fourcc('d','v','s','d'), /* 1394 */
|
|
|
|
//'MPEG' => fourcc('M','P','E','G'), /* MPEG-1/2/4 */
|
|
|
|
|
|
|
|
//'RGB332' => fourcc('R','G','B','1'), /* 8 RGB-3-3-2 */
|
|
|
|
'*RGB444' => fourcc('R','4','4','4'), /* 16 xxxxrrrr ggggbbbb */
|
|
|
|
'*RGB555' => fourcc('R','G','B','O'), /* 16 RGB-5-5-5 */
|
|
|
|
'*RGB565' => fourcc('R','G','B','P'), /* 16 RGB-5-6-5 */
|
|
|
|
//'RGB555X' => fourcc('R','G','B','Q'), /* 16 RGB-5-5-5 BE */
|
|
|
|
//'RGB565X' => fourcc('R','G','B','R'), /* 16 RGB-5-6-5 BE */
|
|
|
|
//'Y16' => fourcc('Y','1','6',''), /* 16 Greyscale */
|
|
|
|
//'PAL8' => fourcc('P','A','L','8'), /* 8 8-bit palette */
|
|
|
|
//'YVU410' => fourcc('Y','V','U','9'), /* 9 YVU 4:1:0 */
|
|
|
|
//'YVU420' => fourcc('Y','V','1','2'), /* 12 YVU 4:2:0 */
|
|
|
|
|
|
|
|
'*UYVY' => fourcc('U','Y','V','Y'), /* 16 YUV 4:2:2 */
|
|
|
|
'*YUV422P' => fourcc('4','2','2','P'), /* 16 YVU422 planar */
|
|
|
|
'*YUV411P' => fourcc('4','1','1','P'), /* 16 YVU411 planar */
|
|
|
|
//'Y41P' => fourcc('Y','4','1','P'), /* 12 YUV 4:1:1 */
|
|
|
|
'*YUV444' => fourcc('Y','4','4','4'), /* 16 xxxxyyyy uuuuvvvv */
|
|
|
|
//'YUV555' => fourcc('Y','U','V','O'), /* 16 YUV-5-5-5 */
|
|
|
|
//'YUV565' => fourcc('Y','U','V','P'), /* 16 YUV-5-6-5 */
|
|
|
|
//'YUV32' => fourcc('Y','U','V','4'), /* 32 YUV-8-8-8-8 */
|
2017-05-19 03:16:59 +08:00
|
|
|
|
|
|
|
/* two planes -- one Y, one Cr + Cb interleaved */
|
2017-05-31 01:14:27 +08:00
|
|
|
//'NV12' => fourcc('N','V','1','2'), /* 12 Y/CbCr 4:2:0 */
|
|
|
|
//'NV21' => fourcc('N','V','2','1'), /* 12 Y/CrCb 4:2:0 */
|
2017-05-19 03:16:59 +08:00
|
|
|
|
|
|
|
/* The following formats are not defined in the V4L2 specification */
|
2017-05-31 01:14:27 +08:00
|
|
|
'*YUV410' => fourcc('Y','U','V','9'), /* 9 YUV 4:1:0 */
|
|
|
|
'*YUV420' => fourcc('Y','U','1','2'), /* 12 YUV 4:2:0 */
|
|
|
|
//'YYUV' => fourcc('Y','Y','U','V'), /* 16 YUV 4:2:2 */
|
|
|
|
//'HI240' => fourcc('H','I','2','4'), /* 8 8-bit color */
|
|
|
|
//'HM12' => fourcc('H','M','1','2'), /* 8 YUV 4:2:0 16x16 macroblocks */
|
2017-05-19 03:16:59 +08:00
|
|
|
|
|
|
|
/* see http://www.siliconimaging.com/RGB%20Bayer.htm */
|
2017-05-31 01:14:27 +08:00
|
|
|
//'SBGGR8' => fourcc('B','A','8','1'), /* 8 BGBG.. GRGR.. */
|
|
|
|
//'SGBRG8' => fourcc('G','B','R','G'), /* 8 GBGB.. RGRG.. */
|
|
|
|
//'SBGGR16' => fourcc('B','Y','R','2'), /* 16 BGBG.. GRGR.. */
|
2017-05-19 03:16:59 +08:00
|
|
|
|
|
|
|
/* Vendor-specific formats */
|
2017-05-31 01:14:27 +08:00
|
|
|
//'WNVA' => fourcc('W','N','V','A'), /* Winnov hw compress */
|
|
|
|
//'SN9C10X' => fourcc('S','9','1','0'), /* SN9C10x compression */
|
|
|
|
//'PWC1' => fourcc('P','W','C','1'), /* pwc older webcam */
|
|
|
|
//'PWC2' => fourcc('P','W','C','2'), /* pwc newer webcam */
|
|
|
|
//'ET61X251' => fourcc('E','6','2','5'), /* ET61X251 compression */
|
|
|
|
//'SPCA501' => fourcc('S','5','0','1'), /* YUYV per line */
|
|
|
|
//'SPCA505' => fourcc('S','5','0','5'), /* YYUV per line */
|
|
|
|
//'SPCA508' => fourcc('S','5','0','8'), /* YUVY per line */
|
|
|
|
//'SPCA561' => fourcc('S','5','6','1'), /* compressed GBRG bayer */
|
|
|
|
//'PAC207' => fourcc('P','2','0','7'), /* compressed BGGR bayer */
|
|
|
|
//'PJPG' => fourcc('P','J','P','G'), /* Pixart 73xx JPEG */
|
|
|
|
//'YVYU' => fourcc('Y','V','Y','U'), /* 16 YVU 4:2:2 */
|
2017-05-19 03:16:59 +08:00
|
|
|
);
|
2009-01-27 19:07:24 +08:00
|
|
|
}
|
|
|
|
|
2011-05-05 17:52:00 +08:00
|
|
|
$Colours = array(
|
2017-11-10 03:53:04 +08:00
|
|
|
'1' => translate('8BitGrey'),
|
|
|
|
'3' => translate('24BitColour'),
|
|
|
|
'4' => translate('32BitColour')
|
2017-05-19 03:16:59 +08:00
|
|
|
);
|
2008-07-16 16:40:21 +08:00
|
|
|
|
|
|
|
$orientations = array(
|
2017-10-04 04:28:56 +08:00
|
|
|
'0' => translate('Normal'),
|
|
|
|
'90' => translate('RotateRight'),
|
|
|
|
'180' => translate('Inverted'),
|
|
|
|
'270' => translate('RotateLeft'),
|
2019-05-16 07:35:19 +08:00
|
|
|
'hori' => translate('FlippedHori'),
|
2017-10-04 04:28:56 +08:00
|
|
|
'vert' => translate('FlippedVert')
|
2017-05-19 03:16:59 +08:00
|
|
|
);
|
2008-07-14 21:54:50 +08:00
|
|
|
|
2012-01-25 22:59:56 +08:00
|
|
|
$deinterlaceopts = array(
|
2017-05-31 01:14:27 +08:00
|
|
|
'Disabled' => 0x00000000,
|
|
|
|
'Four field motion adaptive - Soft' => 0x00001E04, /* 30 change */
|
|
|
|
'Four field motion adaptive - Medium' => 0x00001404, /* 20 change */
|
|
|
|
'Four field motion adaptive - Hard' => 0x00000A04, /* 10 change */
|
|
|
|
'Discard' => 0x00000001,
|
|
|
|
'Linear' => 0x00000002,
|
|
|
|
'Blend' => 0x00000003,
|
|
|
|
'Blend (25%)' => 0x00000205
|
2017-05-19 03:16:59 +08:00
|
|
|
);
|
2012-01-30 14:00:22 +08:00
|
|
|
|
|
|
|
$deinterlaceopts_v4l2 = array(
|
2017-05-31 01:14:27 +08:00
|
|
|
'Disabled' => 0x00000000,
|
|
|
|
'Four field motion adaptive - Soft' => 0x00001E04, /* 30 change */
|
|
|
|
'Four field motion adaptive - Medium' => 0x00001404, /* 20 change */
|
|
|
|
'Four field motion adaptive - Hard' => 0x00000A04, /* 10 change */
|
|
|
|
'Discard' => 0x00000001,
|
|
|
|
'Linear' => 0x00000002,
|
|
|
|
'Blend' => 0x00000003,
|
|
|
|
'Blend (25%)' => 0x00000205,
|
|
|
|
'V4L2: Capture top field only' => 0x02000000,
|
|
|
|
'V4L2: Capture bottom field only' => 0x03000000,
|
|
|
|
'V4L2: Alternate fields (Bob)' => 0x07000000,
|
|
|
|
'V4L2: Progressive' => 0x01000000,
|
|
|
|
'V4L2: Interlaced' => 0x04000000
|
2017-05-19 03:16:59 +08:00
|
|
|
);
|
2013-11-03 16:26:04 +08:00
|
|
|
|
|
|
|
$fastblendopts = array(
|
2017-05-31 01:14:27 +08:00
|
|
|
'No blending' => 0,
|
|
|
|
'1.5625%' => 1,
|
|
|
|
'3.125%' => 3,
|
|
|
|
'6.25% (Indoor)' => 6,
|
|
|
|
'12.5% (Outdoor)' => 12,
|
|
|
|
'25%' => 25,
|
|
|
|
'50%' => 50
|
2017-05-19 03:16:59 +08:00
|
|
|
);
|
2012-01-25 22:59:56 +08:00
|
|
|
|
2013-11-04 18:10:53 +08:00
|
|
|
$fastblendopts_alarm = array(
|
2017-05-31 01:14:27 +08:00
|
|
|
'No blending (Alarm lasts forever)' => 0,
|
|
|
|
'1.5625%' => 1,
|
|
|
|
'3.125%' => 3,
|
|
|
|
'6.25%' => 6,
|
|
|
|
'12.5%' => 12,
|
|
|
|
'25%' => 25,
|
|
|
|
'50% (Alarm lasts a moment)' => 50
|
2017-05-19 03:16:59 +08:00
|
|
|
);
|
2012-01-25 22:59:56 +08:00
|
|
|
|
2015-08-10 19:00:18 +08:00
|
|
|
$label_size = array(
|
2017-05-31 01:14:27 +08:00
|
|
|
'Default' => 1,
|
|
|
|
'Large' => 2
|
2017-05-19 03:16:59 +08:00
|
|
|
);
|
2015-08-10 19:00:18 +08:00
|
|
|
|
Feature h264 videostorage (#1882)
* Moved writing of configure options from Controller to Model. Fixes #191.
* Initial commit for saving events as videos :)
* Add zm_video.cpp to autotools
* Add zm_video.h to autotools
* Search for MP4V2 header file 3 times: mp4v2/mp4v2.h, mp4v2.h, mp4.h
* Fix serve memory leak
* Few minor code improvements
* Added the ability to override preset, tune, profile and few other improvements
* Correctly write SPS & PPS from x264 encoder headers
* Remove unnessecary SPS & PPS writing code
* Imported missing files from master to feature-h264-videostorage
* Audio support including fixes for dts/pts, split on keyframe and update to mkv extension to prevent ffmpeg problems writing rtsp audio to mp4 containter (header problem)
* Updates to make gcc happy
* Add html5 video control to timeline and event to support mkv playback
* Add zm_videostore.cpp to CMakeLists.txt
* Remove Modern Branch for now
* Fix minor bug
* Option handled added in master, removing duplicate declaration
* Add CaptureandRecord from zm_camera.h
* Putting placeholder in for CaptureAndRecord function
* Removed duplicate code and brackets
* add digest auth file for cmake
Conflicts:
src/CMakeLists.txt
* Add web dir back into Makefile.am
Revert "Removed web from SUBDIRS in Makefile.am"
This reverts commit d9bbcdf3a94cba4d8955fcd03bd965ed2772f34d.
* Add CaptureAndRecord to vlc, still need to make it record
* Resolve SegFault on videostore
* Swap to mp4 container
* mp4 changes
* spaces to tabs, hide video stuff if video writer is turned off
* Make timeline open event.mp4 instead of mkv
* Missed mkv in timeline.js
* Fix some issues from the merge conflict
* Resolve post merge build issues with braces
* Fix whitespace
* Update Jpeg and Video options for passthrough options
* Whitespace fix zm_camera.h
* Fix array mkssing comma
* Add support for Jpeg save options for h264 branch snapshot. Might remove altogether if snapshots not needed
* Update VideoStoreData memory size comment
* Change from config.use_mkv_storage to per monitor option VideoWriter from video branch
* Fix bracket issues post merge
* Clean up comments and add av_free_packet
* Convert from event_directory to event file as per Video branch
* Testing videojs for video playback
* Fixed a missing bracket post merge and also SQL_values now used for EventID and Monitors
* bring recent improvements in ffmpeg capture function into captureandrecord
* Remove pict from writeAudioFramePacket as not used
* Add translate options for h264 Storage options in Monitor and update en_gb file
* Cherry-Pick from iconnor - make it compile on ubuntu 15.04. Which is libav 56.1.0
Conflicts:
src/zm_ffmpeg.cpp
src/zm_remote_camera_rtsp.cpp
Conflicts:
distros/ubuntu1204/changelog
* Clean up videostore code and remove lots of unused code
* proof of concept for dynamic/automatic video rotation using video-js plugin zoomrotate
Conflicts:
web/skins/classic/views/event.php
* removed redundant field in sql query
Conflicts:
web/skins/classic/views/event.php
* local storage of video js plugin
* Beautify!
Make the code somewhat readable.
* added missing videojs.zoomrotate.js file
added missing videojs.zoomrotate.js file
* Typo
added missing "
* Added missing brackets
* fix to display thumbnails when only storing snapshot.jpg
* added control for video playback rate
Conflicts:
web/skins/classic/views/event.php
* dynamically create jpegs from video file for viewing in browser
* fix timeline view for SaveJPEGs monitors (without enabled VideoWriter)
* only expose monitor info which are being used in client
* fix segmentation fault in zma with ubuntu 14.04 and ffmpeg 2.5.8 (gcc 4.8)
when libx264 is not installed
* better way of detecting showing image or video in timeline and event view
instead of Monitor.VideoWriter, Event.DefaultVideo is used, so even if
VideoWriter/SaveJPEG option is changed, a valid image or video will always be
displayed for historical events in both timeline and event view
this also fixes loading videos in timeline view
* Fixes problem of crashing zmc when bad packet arrives causing av_interleaved_write_frame() to return non-zero (-22). Prefilters common packet issues. Add metadata title to generated video file
* Remove syslog.h
* fixed SaveJPEGs are not working
which is caused in errors introduced when merging with master
* Update README.md
* Fix build warnings specific to h264 branch, unused FrameImg, unused ret and int64_t snprintf issues
* Fix PRId64 issue in travis, builds locally fine, but I can see a gcc version issue here
* Fix PRId64 issue in travis, another try
* Try "STDC_FORMAT_MACROS" to see if that helps Travis on gcc 4.6.3
* Revert space removal around PRId64
* video branch ffmpeg 2.9 fixes
ffmpeg 2.9 patched removed SSE2 CPU
* Add FFMPEGInit back
* use webvvt to overlay timestamp (honoring Monitor.LabelFormat) to videos in timeline and event
also fixed bug which prevented seeking in timeline video preview
* ffmpeg 3.0 API build failure fixes
* Update README.md
* merge all the commits from the messed up iconnor_video branch
* fix whitespace
* revert
* whitespace fixes
* spelling fix
* put back some text
* add these back
* fix spelling mistake
* Steal some packet dumping routines from ffmpeg. Convert them to use our logging routines
* add a test and error message if the codec is not h264
* these have been removed in master
* add a view to check auth and just send the video
* add some comments, and dump filename and AVFormatContext on failure to write header
* add the toggle for RecordAudio so that the checkbox works to turn off Audio
* Must init videoStore in constuctor
* more debug and comments, return checking
* Fix dropped part of sql query.
* fix extra else and some whitespace
* Fix missing } from merge that was preventing building.
* fix tabs
* get rid of use of separator, just use \n
* Restore lost fixes for deprecation
* Why are these failing
* Respect record_audio flag when setting up video file so dont try and initiliase mp4 with unsupported audio
* Forgot that I was trying to solve case of stream is true and record_audio
is false.
* Pass swscale_ctx back in to getCachedContext or it will create new
context every frame and leak memory like a mofo.
* Add libx264-dev and libmp4v2-dev to build requires to save hassle of
ensuring they are installed before build.
* Merge my Rotation/Orientation work and fixes for bad h264 streams
* need arpa/inet for reverse lookups
* pull in the new byte range code for viewing videos
* Move our recording flag deeper into closeevent
* add braces and only call closeEvent if there is an event
* deprecate the z_frame_rate stuff which is deprecated in ffmpeg
* remark out some debugging
* fix for video on stream 1
* fix audio_stream to audio_st
* Ignore bad decodes
* fix problems with content-length causing viewing to not work in chrome/android
* change logic of sending file contents to handle an off by one and be more readable
* Some fixes pointed out by Maxim Romanov. Also simply the loading of events to not join the Monitors table
* fix to sql for timeline
* added RecordAudio to sql in README
* Use sub queries instead of joins to fix errors when using new mysql defaults.
* fix sql queries
* Dockerfile to build feature-h264-videostorage
* Must cast codec
* add php-acpu as a dependency
* require php5-acpu
* fix typo
* remove extra /
* Add a line for out-of-tree builds to do api/lib/Cake/bootstrap.php
* delete merge conflict files
* delete merge conflict files
2017-05-16 10:02:48 +08:00
|
|
|
$savejpegopts = array(
|
2017-05-31 01:14:27 +08:00
|
|
|
'Disabled' => 0,
|
|
|
|
'Frames only' => 1,
|
|
|
|
'Analysis images only (if available)' => 2,
|
|
|
|
'Frames + Analysis images (if available)' => 3,
|
2017-05-19 03:16:59 +08:00
|
|
|
);
|
Feature h264 videostorage (#1882)
* Moved writing of configure options from Controller to Model. Fixes #191.
* Initial commit for saving events as videos :)
* Add zm_video.cpp to autotools
* Add zm_video.h to autotools
* Search for MP4V2 header file 3 times: mp4v2/mp4v2.h, mp4v2.h, mp4.h
* Fix serve memory leak
* Few minor code improvements
* Added the ability to override preset, tune, profile and few other improvements
* Correctly write SPS & PPS from x264 encoder headers
* Remove unnessecary SPS & PPS writing code
* Imported missing files from master to feature-h264-videostorage
* Audio support including fixes for dts/pts, split on keyframe and update to mkv extension to prevent ffmpeg problems writing rtsp audio to mp4 containter (header problem)
* Updates to make gcc happy
* Add html5 video control to timeline and event to support mkv playback
* Add zm_videostore.cpp to CMakeLists.txt
* Remove Modern Branch for now
* Fix minor bug
* Option handled added in master, removing duplicate declaration
* Add CaptureandRecord from zm_camera.h
* Putting placeholder in for CaptureAndRecord function
* Removed duplicate code and brackets
* add digest auth file for cmake
Conflicts:
src/CMakeLists.txt
* Add web dir back into Makefile.am
Revert "Removed web from SUBDIRS in Makefile.am"
This reverts commit d9bbcdf3a94cba4d8955fcd03bd965ed2772f34d.
* Add CaptureAndRecord to vlc, still need to make it record
* Resolve SegFault on videostore
* Swap to mp4 container
* mp4 changes
* spaces to tabs, hide video stuff if video writer is turned off
* Make timeline open event.mp4 instead of mkv
* Missed mkv in timeline.js
* Fix some issues from the merge conflict
* Resolve post merge build issues with braces
* Fix whitespace
* Update Jpeg and Video options for passthrough options
* Whitespace fix zm_camera.h
* Fix array mkssing comma
* Add support for Jpeg save options for h264 branch snapshot. Might remove altogether if snapshots not needed
* Update VideoStoreData memory size comment
* Change from config.use_mkv_storage to per monitor option VideoWriter from video branch
* Fix bracket issues post merge
* Clean up comments and add av_free_packet
* Convert from event_directory to event file as per Video branch
* Testing videojs for video playback
* Fixed a missing bracket post merge and also SQL_values now used for EventID and Monitors
* bring recent improvements in ffmpeg capture function into captureandrecord
* Remove pict from writeAudioFramePacket as not used
* Add translate options for h264 Storage options in Monitor and update en_gb file
* Cherry-Pick from iconnor - make it compile on ubuntu 15.04. Which is libav 56.1.0
Conflicts:
src/zm_ffmpeg.cpp
src/zm_remote_camera_rtsp.cpp
Conflicts:
distros/ubuntu1204/changelog
* Clean up videostore code and remove lots of unused code
* proof of concept for dynamic/automatic video rotation using video-js plugin zoomrotate
Conflicts:
web/skins/classic/views/event.php
* removed redundant field in sql query
Conflicts:
web/skins/classic/views/event.php
* local storage of video js plugin
* Beautify!
Make the code somewhat readable.
* added missing videojs.zoomrotate.js file
added missing videojs.zoomrotate.js file
* Typo
added missing "
* Added missing brackets
* fix to display thumbnails when only storing snapshot.jpg
* added control for video playback rate
Conflicts:
web/skins/classic/views/event.php
* dynamically create jpegs from video file for viewing in browser
* fix timeline view for SaveJPEGs monitors (without enabled VideoWriter)
* only expose monitor info which are being used in client
* fix segmentation fault in zma with ubuntu 14.04 and ffmpeg 2.5.8 (gcc 4.8)
when libx264 is not installed
* better way of detecting showing image or video in timeline and event view
instead of Monitor.VideoWriter, Event.DefaultVideo is used, so even if
VideoWriter/SaveJPEG option is changed, a valid image or video will always be
displayed for historical events in both timeline and event view
this also fixes loading videos in timeline view
* Fixes problem of crashing zmc when bad packet arrives causing av_interleaved_write_frame() to return non-zero (-22). Prefilters common packet issues. Add metadata title to generated video file
* Remove syslog.h
* fixed SaveJPEGs are not working
which is caused in errors introduced when merging with master
* Update README.md
* Fix build warnings specific to h264 branch, unused FrameImg, unused ret and int64_t snprintf issues
* Fix PRId64 issue in travis, builds locally fine, but I can see a gcc version issue here
* Fix PRId64 issue in travis, another try
* Try "STDC_FORMAT_MACROS" to see if that helps Travis on gcc 4.6.3
* Revert space removal around PRId64
* video branch ffmpeg 2.9 fixes
ffmpeg 2.9 patched removed SSE2 CPU
* Add FFMPEGInit back
* use webvvt to overlay timestamp (honoring Monitor.LabelFormat) to videos in timeline and event
also fixed bug which prevented seeking in timeline video preview
* ffmpeg 3.0 API build failure fixes
* Update README.md
* merge all the commits from the messed up iconnor_video branch
* fix whitespace
* revert
* whitespace fixes
* spelling fix
* put back some text
* add these back
* fix spelling mistake
* Steal some packet dumping routines from ffmpeg. Convert them to use our logging routines
* add a test and error message if the codec is not h264
* these have been removed in master
* add a view to check auth and just send the video
* add some comments, and dump filename and AVFormatContext on failure to write header
* add the toggle for RecordAudio so that the checkbox works to turn off Audio
* Must init videoStore in constuctor
* more debug and comments, return checking
* Fix dropped part of sql query.
* fix extra else and some whitespace
* Fix missing } from merge that was preventing building.
* fix tabs
* get rid of use of separator, just use \n
* Restore lost fixes for deprecation
* Why are these failing
* Respect record_audio flag when setting up video file so dont try and initiliase mp4 with unsupported audio
* Forgot that I was trying to solve case of stream is true and record_audio
is false.
* Pass swscale_ctx back in to getCachedContext or it will create new
context every frame and leak memory like a mofo.
* Add libx264-dev and libmp4v2-dev to build requires to save hassle of
ensuring they are installed before build.
* Merge my Rotation/Orientation work and fixes for bad h264 streams
* need arpa/inet for reverse lookups
* pull in the new byte range code for viewing videos
* Move our recording flag deeper into closeevent
* add braces and only call closeEvent if there is an event
* deprecate the z_frame_rate stuff which is deprecated in ffmpeg
* remark out some debugging
* fix for video on stream 1
* fix audio_stream to audio_st
* Ignore bad decodes
* fix problems with content-length causing viewing to not work in chrome/android
* change logic of sending file contents to handle an off by one and be more readable
* Some fixes pointed out by Maxim Romanov. Also simply the loading of events to not join the Monitors table
* fix to sql for timeline
* added RecordAudio to sql in README
* Use sub queries instead of joins to fix errors when using new mysql defaults.
* fix sql queries
* Dockerfile to build feature-h264-videostorage
* Must cast codec
* add php-acpu as a dependency
* require php5-acpu
* fix typo
* remove extra /
* Add a line for out-of-tree builds to do api/lib/Cake/bootstrap.php
* delete merge conflict files
* delete merge conflict files
2017-05-16 10:02:48 +08:00
|
|
|
|
2018-09-11 00:22:55 +08:00
|
|
|
$codecs = array(
|
|
|
|
'auto' => translate('Auto'),
|
2019-03-20 00:16:31 +08:00
|
|
|
'MP4' => translate('MP4'),
|
2018-09-11 00:22:55 +08:00
|
|
|
'MJPEG' => translate('MJPEG'),
|
|
|
|
);
|
Feature h264 videostorage (#1882)
* Moved writing of configure options from Controller to Model. Fixes #191.
* Initial commit for saving events as videos :)
* Add zm_video.cpp to autotools
* Add zm_video.h to autotools
* Search for MP4V2 header file 3 times: mp4v2/mp4v2.h, mp4v2.h, mp4.h
* Fix serve memory leak
* Few minor code improvements
* Added the ability to override preset, tune, profile and few other improvements
* Correctly write SPS & PPS from x264 encoder headers
* Remove unnessecary SPS & PPS writing code
* Imported missing files from master to feature-h264-videostorage
* Audio support including fixes for dts/pts, split on keyframe and update to mkv extension to prevent ffmpeg problems writing rtsp audio to mp4 containter (header problem)
* Updates to make gcc happy
* Add html5 video control to timeline and event to support mkv playback
* Add zm_videostore.cpp to CMakeLists.txt
* Remove Modern Branch for now
* Fix minor bug
* Option handled added in master, removing duplicate declaration
* Add CaptureandRecord from zm_camera.h
* Putting placeholder in for CaptureAndRecord function
* Removed duplicate code and brackets
* add digest auth file for cmake
Conflicts:
src/CMakeLists.txt
* Add web dir back into Makefile.am
Revert "Removed web from SUBDIRS in Makefile.am"
This reverts commit d9bbcdf3a94cba4d8955fcd03bd965ed2772f34d.
* Add CaptureAndRecord to vlc, still need to make it record
* Resolve SegFault on videostore
* Swap to mp4 container
* mp4 changes
* spaces to tabs, hide video stuff if video writer is turned off
* Make timeline open event.mp4 instead of mkv
* Missed mkv in timeline.js
* Fix some issues from the merge conflict
* Resolve post merge build issues with braces
* Fix whitespace
* Update Jpeg and Video options for passthrough options
* Whitespace fix zm_camera.h
* Fix array mkssing comma
* Add support for Jpeg save options for h264 branch snapshot. Might remove altogether if snapshots not needed
* Update VideoStoreData memory size comment
* Change from config.use_mkv_storage to per monitor option VideoWriter from video branch
* Fix bracket issues post merge
* Clean up comments and add av_free_packet
* Convert from event_directory to event file as per Video branch
* Testing videojs for video playback
* Fixed a missing bracket post merge and also SQL_values now used for EventID and Monitors
* bring recent improvements in ffmpeg capture function into captureandrecord
* Remove pict from writeAudioFramePacket as not used
* Add translate options for h264 Storage options in Monitor and update en_gb file
* Cherry-Pick from iconnor - make it compile on ubuntu 15.04. Which is libav 56.1.0
Conflicts:
src/zm_ffmpeg.cpp
src/zm_remote_camera_rtsp.cpp
Conflicts:
distros/ubuntu1204/changelog
* Clean up videostore code and remove lots of unused code
* proof of concept for dynamic/automatic video rotation using video-js plugin zoomrotate
Conflicts:
web/skins/classic/views/event.php
* removed redundant field in sql query
Conflicts:
web/skins/classic/views/event.php
* local storage of video js plugin
* Beautify!
Make the code somewhat readable.
* added missing videojs.zoomrotate.js file
added missing videojs.zoomrotate.js file
* Typo
added missing "
* Added missing brackets
* fix to display thumbnails when only storing snapshot.jpg
* added control for video playback rate
Conflicts:
web/skins/classic/views/event.php
* dynamically create jpegs from video file for viewing in browser
* fix timeline view for SaveJPEGs monitors (without enabled VideoWriter)
* only expose monitor info which are being used in client
* fix segmentation fault in zma with ubuntu 14.04 and ffmpeg 2.5.8 (gcc 4.8)
when libx264 is not installed
* better way of detecting showing image or video in timeline and event view
instead of Monitor.VideoWriter, Event.DefaultVideo is used, so even if
VideoWriter/SaveJPEG option is changed, a valid image or video will always be
displayed for historical events in both timeline and event view
this also fixes loading videos in timeline view
* Fixes problem of crashing zmc when bad packet arrives causing av_interleaved_write_frame() to return non-zero (-22). Prefilters common packet issues. Add metadata title to generated video file
* Remove syslog.h
* fixed SaveJPEGs are not working
which is caused in errors introduced when merging with master
* Update README.md
* Fix build warnings specific to h264 branch, unused FrameImg, unused ret and int64_t snprintf issues
* Fix PRId64 issue in travis, builds locally fine, but I can see a gcc version issue here
* Fix PRId64 issue in travis, another try
* Try "STDC_FORMAT_MACROS" to see if that helps Travis on gcc 4.6.3
* Revert space removal around PRId64
* video branch ffmpeg 2.9 fixes
ffmpeg 2.9 patched removed SSE2 CPU
* Add FFMPEGInit back
* use webvvt to overlay timestamp (honoring Monitor.LabelFormat) to videos in timeline and event
also fixed bug which prevented seeking in timeline video preview
* ffmpeg 3.0 API build failure fixes
* Update README.md
* merge all the commits from the messed up iconnor_video branch
* fix whitespace
* revert
* whitespace fixes
* spelling fix
* put back some text
* add these back
* fix spelling mistake
* Steal some packet dumping routines from ffmpeg. Convert them to use our logging routines
* add a test and error message if the codec is not h264
* these have been removed in master
* add a view to check auth and just send the video
* add some comments, and dump filename and AVFormatContext on failure to write header
* add the toggle for RecordAudio so that the checkbox works to turn off Audio
* Must init videoStore in constuctor
* more debug and comments, return checking
* Fix dropped part of sql query.
* fix extra else and some whitespace
* Fix missing } from merge that was preventing building.
* fix tabs
* get rid of use of separator, just use \n
* Restore lost fixes for deprecation
* Why are these failing
* Respect record_audio flag when setting up video file so dont try and initiliase mp4 with unsupported audio
* Forgot that I was trying to solve case of stream is true and record_audio
is false.
* Pass swscale_ctx back in to getCachedContext or it will create new
context every frame and leak memory like a mofo.
* Add libx264-dev and libmp4v2-dev to build requires to save hassle of
ensuring they are installed before build.
* Merge my Rotation/Orientation work and fixes for bad h264 streams
* need arpa/inet for reverse lookups
* pull in the new byte range code for viewing videos
* Move our recording flag deeper into closeevent
* add braces and only call closeEvent if there is an event
* deprecate the z_frame_rate stuff which is deprecated in ffmpeg
* remark out some debugging
* fix for video on stream 1
* fix audio_stream to audio_st
* Ignore bad decodes
* fix problems with content-length causing viewing to not work in chrome/android
* change logic of sending file contents to handle an off by one and be more readable
* Some fixes pointed out by Maxim Romanov. Also simply the loading of events to not join the Monitors table
* fix to sql for timeline
* added RecordAudio to sql in README
* Use sub queries instead of joins to fix errors when using new mysql defaults.
* fix sql queries
* Dockerfile to build feature-h264-videostorage
* Must cast codec
* add php-acpu as a dependency
* require php5-acpu
* fix typo
* remove extra /
* Add a line for out-of-tree builds to do api/lib/Cake/bootstrap.php
* delete merge conflict files
* delete merge conflict files
2017-05-16 10:02:48 +08:00
|
|
|
|
2019-04-26 22:44:00 +08:00
|
|
|
xhtmlHeaders(__FILE__, translate('Monitor').' - '.validHtmlStr($monitor->Name()));
|
2018-11-08 01:33:54 +08:00
|
|
|
getBodyTopHTML();
|
2008-07-14 21:54:50 +08:00
|
|
|
?>
|
|
|
|
<div id="page">
|
|
|
|
<div id="header">
|
2017-05-31 07:53:02 +08:00
|
|
|
<?php
|
2019-04-26 22:44:00 +08:00
|
|
|
if ( canEdit('Monitors') ) {
|
|
|
|
if ( isset($_REQUEST['dupId']) ) {
|
2017-05-31 07:53:02 +08:00
|
|
|
?>
|
2017-05-19 03:16:59 +08:00
|
|
|
<div class="alert alert-info">
|
2019-02-10 08:54:06 +08:00
|
|
|
Configuration cloned from Monitor: <?php echo validHtmlStr($clonedName) ?>
|
2017-05-19 03:16:59 +08:00
|
|
|
</div>
|
2017-05-31 07:53:02 +08:00
|
|
|
<?php
|
|
|
|
}
|
|
|
|
?>
|
|
|
|
<div id="headerButtons">
|
2019-04-26 22:44:00 +08:00
|
|
|
<?php echo makePopupLink('?view=monitorprobe&mid='.$monitor->Id(), 'zmMonitorProbe'.$monitor->Id(), 'monitorprobe', translate('Probe')); ?>
|
2017-05-31 07:53:02 +08:00
|
|
|
<?php
|
2019-04-26 22:44:00 +08:00
|
|
|
if ( ZM_HAS_ONVIF ) {
|
|
|
|
echo makePopupLink('?view=onvifprobe&mid='.$monitor->Id(), 'zmOnvifProbe'.$monitor->Id(), 'onvifprobe', translate('OnvifProbe'));
|
2017-05-31 07:53:02 +08:00
|
|
|
}
|
|
|
|
?>
|
2019-01-15 22:01:58 +08:00
|
|
|
<?php echo makePopupLink('?view=monitorpreset&mid=' . $monitor->Id(), 'zmMonitorPreset' . $monitor->Id(), 'monitorpreset', translate('Presets')); ?>
|
2017-05-19 03:16:59 +08:00
|
|
|
</div>
|
2017-05-31 07:53:02 +08:00
|
|
|
<?php
|
|
|
|
} // end if canEdit('Monitors')
|
|
|
|
?>
|
2017-09-12 01:27:17 +08:00
|
|
|
<h2><?php echo translate('Monitor') ?> - <?php echo validHtmlStr($monitor->Name()) ?><?php if ( $monitor->Id() ) { ?> (<?php echo $monitor->Id()?>)<?php } ?></h2>
|
2017-05-31 07:53:02 +08:00
|
|
|
</div>
|
|
|
|
<div id="content">
|
|
|
|
<ul class="tabList">
|
|
|
|
<?php
|
2018-04-27 05:18:36 +08:00
|
|
|
$tabs = array();
|
|
|
|
$tabs['general'] = translate('General');
|
|
|
|
$tabs['source'] = translate('Source');
|
|
|
|
if ( $monitor->Type() != 'WebSite' ) {
|
|
|
|
$tabs['storage'] = translate('Storage');
|
|
|
|
$tabs['timestamp'] = translate('Timestamp');
|
|
|
|
$tabs['buffers'] = translate('Buffers');
|
2019-04-26 22:44:00 +08:00
|
|
|
if ( ZM_OPT_CONTROL && canView('Control') )
|
2018-04-27 05:18:36 +08:00
|
|
|
$tabs['control'] = translate('Control');
|
|
|
|
if ( ZM_OPT_X10 )
|
|
|
|
$tabs['x10'] = translate('X10');
|
|
|
|
$tabs['misc'] = translate('Misc');
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( isset($_REQUEST['tab']) )
|
|
|
|
$tab = validHtmlStr($_REQUEST['tab']);
|
|
|
|
else
|
|
|
|
$tab = 'general';
|
|
|
|
|
2017-05-19 03:16:59 +08:00
|
|
|
foreach ( $tabs as $name=>$value ) {
|
|
|
|
if ( $tab == $name ) {
|
2017-05-31 07:53:02 +08:00
|
|
|
?>
|
|
|
|
<li class="active"><?php echo $value ?></li>
|
|
|
|
<?php
|
2017-05-19 03:16:59 +08:00
|
|
|
} else {
|
2017-05-31 07:53:02 +08:00
|
|
|
?>
|
2019-01-19 22:42:12 +08:00
|
|
|
<li><a href="#" data-tab-name="<?php echo $name ?>"><?php echo $value ?></a></li>
|
2017-05-31 07:53:02 +08:00
|
|
|
<?php
|
2016-04-15 01:53:10 +08:00
|
|
|
}
|
2008-07-14 21:54:50 +08:00
|
|
|
}
|
2017-06-15 03:35:35 +08:00
|
|
|
?>
|
2017-05-31 07:53:02 +08:00
|
|
|
</ul>
|
|
|
|
<div class="clear"></div>
|
2019-03-26 04:25:09 +08:00
|
|
|
<form name="contentForm" id="contentForm" method="post" action="?">
|
2017-05-31 07:53:02 +08:00
|
|
|
<input type="hidden" name="view" value="<?php echo $view ?>"/>
|
|
|
|
<input type="hidden" name="tab" value="<?php echo $tab ?>"/>
|
|
|
|
<input type="hidden" name="action" value="monitor"/>
|
2017-06-15 03:35:35 +08:00
|
|
|
<input type="hidden" name="mid" value="<?php echo $monitor->Id()?>"/>
|
2019-02-10 09:01:45 +08:00
|
|
|
<input type="hidden" name="origMethod" value="<?php echo ( null !== $monitor->Method())?validHtmlStr($monitor->Method()):'' ?>"/>
|
2017-05-19 03:16:59 +08:00
|
|
|
<?php
|
|
|
|
if ( $tab != 'general' ) {
|
|
|
|
?>
|
2017-06-15 03:35:35 +08:00
|
|
|
<input type="hidden" name="newMonitor[Name]" value="<?php echo validHtmlStr($monitor->Name()) ?>"/>
|
2017-05-31 07:53:02 +08:00
|
|
|
<input type="hidden" name="newMonitor[ServerId]" value="<?php echo validHtmlStr($monitor->ServerId() ) ?>"/>
|
|
|
|
<input type="hidden" name="newMonitor[StorageId]" value="<?= validHtmlStr($monitor->StorageId() ) ?>"/>
|
2019-09-20 02:56:16 +08:00
|
|
|
<input type="hidden" name="newMonitor[LinkedMonitors]" value="<?php echo (null !== $monitor->LinkedMonitors())?validHtmlStr($monitor->LinkedMonitors()):'' ?>"/>
|
2018-04-25 21:33:02 +08:00
|
|
|
<?php
|
|
|
|
foreach ( $monitor->GroupIds() as $group_id ) {
|
|
|
|
echo '<input type="hidden" name="newMonitor[GroupIds][]" value="'.$group_id.'"/>';
|
|
|
|
}
|
|
|
|
?>
|
2017-06-15 03:35:35 +08:00
|
|
|
<input type="hidden" name="newMonitor[Type]" value="<?php echo validHtmlStr($monitor->Type()) ?>"/>
|
|
|
|
<input type="hidden" name="newMonitor[Function]" value="<?php echo validHtmlStr($monitor->Function()) ?>"/>
|
|
|
|
<input type="hidden" name="newMonitor[Enabled]" value="<?php echo validHtmlStr($monitor->Enabled()) ?>"/>
|
|
|
|
<input type="hidden" name="newMonitor[RefBlendPerc]" value="<?php echo validHtmlStr($monitor->RefBlendPerc()) ?>"/>
|
|
|
|
<input type="hidden" name="newMonitor[AlarmRefBlendPerc]" value="<?php echo validHtmlStr($monitor->AlarmRefBlendPerc()) ?>"/>
|
2017-10-25 08:34:32 +08:00
|
|
|
<input type="hidden" name="newMonitor[AnalysisFPSLimit]" value="<?php echo validHtmlStr($monitor->AnalysisFPSLimit()) ?>"/>
|
2017-06-15 03:35:35 +08:00
|
|
|
<input type="hidden" name="newMonitor[MaxFPS]" value="<?php echo validHtmlStr($monitor->MaxFPS()) ?>"/>
|
|
|
|
<input type="hidden" name="newMonitor[AlarmMaxFPS]" value="<?php echo validHtmlStr($monitor->AlarmMaxFPS()) ?>"/>
|
|
|
|
<?php
|
2019-09-20 02:56:16 +08:00
|
|
|
if ( '' !== $monitor->Triggers() ) {
|
|
|
|
foreach ( explode(',', $monitor->Triggers()) as $newTrigger ) {
|
2017-05-31 07:53:02 +08:00
|
|
|
?>
|
|
|
|
<input type="hidden" name="newMonitor[Triggers][]" value="<?php echo validHtmlStr($newTrigger) ?>"/>
|
|
|
|
<?php
|
2008-07-14 21:54:50 +08:00
|
|
|
}
|
2017-05-31 07:53:02 +08:00
|
|
|
}
|
2008-07-14 21:54:50 +08:00
|
|
|
}
|
2019-05-24 23:49:59 +08:00
|
|
|
if ( ZM_HAS_V4L && ($tab != 'source' || $monitor->Type() != 'Local') ) {
|
2017-05-31 07:53:02 +08:00
|
|
|
?>
|
2017-06-15 03:35:35 +08:00
|
|
|
<input type="hidden" name="newMonitor[Device]" value="<?php echo validHtmlStr($monitor->Device()) ?>"/>
|
|
|
|
<input type="hidden" name="newMonitor[Channel]" value="<?php echo validHtmlStr($monitor->Channel()) ?>"/>
|
|
|
|
<input type="hidden" name="newMonitor[Format]" value="<?php echo validHtmlStr($monitor->Format()) ?>"/>
|
|
|
|
<input type="hidden" name="newMonitor[Palette]" value="<?php echo validHtmlStr($monitor->Palette()) ?>"/>
|
|
|
|
<input type="hidden" name="newMonitor[V4LMultiBuffer]" value="<?php echo validHtmlStr($monitor->V4LMultiBuffer()) ?>"/>
|
|
|
|
<input type="hidden" name="newMonitor[V4LCapturesPerFrame]" value="<?php echo validHtmlStr($monitor->V4LCapturesPerFrame()) ?>"/>
|
2017-05-31 07:53:02 +08:00
|
|
|
<?php
|
2008-07-14 21:54:50 +08:00
|
|
|
}
|
2017-06-15 03:35:35 +08:00
|
|
|
if ( $tab != 'source' || $monitor->Type()!= 'Remote' ) {
|
2017-05-31 07:53:02 +08:00
|
|
|
?>
|
|
|
|
<input type="hidden" name="newMonitor[Protocol]" value="<?php echo validHtmlStr($monitor->Protocol()) ?>"/>
|
2017-06-15 03:35:35 +08:00
|
|
|
<input type="hidden" name="newMonitor[Host]" value="<?php echo validHtmlStr($monitor->Host()) ?>"/>
|
|
|
|
<input type="hidden" name="newMonitor[Port]" value="<?php echo validHtmlStr($monitor->Port()) ?>"/>
|
2017-05-31 07:53:02 +08:00
|
|
|
<?php
|
2008-07-14 21:54:50 +08:00
|
|
|
}
|
2017-06-15 03:35:35 +08:00
|
|
|
if ( $tab != 'source' || ($monitor->Type()!= 'Local' && $monitor->Type()!= 'Remote' && $monitor->Type()!= 'Ffmpeg' && $monitor->Type()!= 'Libvlc') ) {
|
2017-05-31 07:53:02 +08:00
|
|
|
?>
|
2017-07-13 22:23:30 +08:00
|
|
|
<input type="hidden" name="newMonitor[Method]" value="<?php echo validHtmlStr(null !== $monitor->Method() ? $monitor->Method() : 'rtpRtsp' ) ?>"/>
|
2017-05-31 07:53:02 +08:00
|
|
|
<?php
|
2008-10-28 22:25:12 +08:00
|
|
|
}
|
2017-06-15 03:35:35 +08:00
|
|
|
if ( $tab != 'source' || ($monitor->Type()!= 'Ffmpeg' && $monitor->Type()!= 'Libvlc' )) {
|
2017-05-31 07:53:02 +08:00
|
|
|
?>
|
2017-06-15 03:35:35 +08:00
|
|
|
<input type="hidden" name="newMonitor[Options]" value="<?php echo validHtmlStr($monitor->Options()) ?>"/>
|
2017-05-31 07:53:02 +08:00
|
|
|
<?php
|
2014-05-05 19:29:12 +08:00
|
|
|
}
|
2018-04-27 05:18:36 +08:00
|
|
|
if ( $tab != 'source' || ($monitor->Type()!= 'Remote' && $monitor->Type()!= 'File' && $monitor->Type()!= 'Ffmpeg' && $monitor->Type()!= 'Libvlc' && $monitor->Type()!= 'cURL' && $monitor->Type() != 'WebSite') ) {
|
2017-05-31 07:53:02 +08:00
|
|
|
?>
|
2017-06-15 03:35:35 +08:00
|
|
|
<input type="hidden" name="newMonitor[Path]" value="<?php echo validHtmlStr($monitor->Path()) ?>"/>
|
|
|
|
<input type="hidden" name="newMonitor[User]" value="<?php echo validHtmlStr($monitor->User()) ?>"/>
|
|
|
|
<input type="hidden" name="newMonitor[Pass]" value="<?php echo validHtmlStr($monitor->Pass()) ?>"/>
|
2017-05-31 07:53:02 +08:00
|
|
|
<?php
|
2008-07-14 21:54:50 +08:00
|
|
|
}
|
2017-05-31 01:14:27 +08:00
|
|
|
if ( $tab != 'source' ) {
|
2017-05-31 07:53:02 +08:00
|
|
|
?>
|
2017-06-15 03:35:35 +08:00
|
|
|
<input type="hidden" name="newMonitor[Colours]" value="<?php echo validHtmlStr($monitor->Colours()) ?>"/>
|
|
|
|
<input type="hidden" name="newMonitor[Width]" value="<?php echo validHtmlStr($monitor->Width()) ?>"/>
|
|
|
|
<input type="hidden" name="newMonitor[Height]" value="<?php echo validHtmlStr($monitor->Height()) ?>"/>
|
|
|
|
<input type="hidden" name="newMonitor[Orientation]" value="<?php echo validHtmlStr($monitor->Orientation()) ?>"/>
|
|
|
|
<input type="hidden" name="newMonitor[Deinterlacing]" value="<?php echo validHtmlStr($monitor->Deinterlacing()) ?>"/>
|
2017-05-31 07:53:02 +08:00
|
|
|
<?php
|
2008-07-14 21:54:50 +08:00
|
|
|
}
|
2017-05-19 03:16:59 +08:00
|
|
|
if ( $tab != 'storage' ) {
|
2017-05-31 07:53:02 +08:00
|
|
|
?>
|
2017-06-15 03:35:35 +08:00
|
|
|
<input type="hidden" name="newMonitor[SaveJPEGs]" value="<?php echo validHtmlStr($monitor->SaveJPEGs()) ?>"/>
|
|
|
|
<input type="hidden" name="newMonitor[VideoWriter]" value="<?php echo validHtmlStr($monitor->VideoWriter()) ?>"/>
|
|
|
|
<input type="hidden" name="newMonitor[EncoderParameters]" value="<?php echo validHtmlStr($monitor->EncoderParameters()) ?>"/>
|
|
|
|
<input type="hidden" name="newMonitor[RecordAudio]" value="<?php echo validHtmlStr($monitor->RecordAudio()) ?>"/>
|
2017-05-31 07:53:02 +08:00
|
|
|
<?php
|
Feature h264 videostorage (#1882)
* Moved writing of configure options from Controller to Model. Fixes #191.
* Initial commit for saving events as videos :)
* Add zm_video.cpp to autotools
* Add zm_video.h to autotools
* Search for MP4V2 header file 3 times: mp4v2/mp4v2.h, mp4v2.h, mp4.h
* Fix serve memory leak
* Few minor code improvements
* Added the ability to override preset, tune, profile and few other improvements
* Correctly write SPS & PPS from x264 encoder headers
* Remove unnessecary SPS & PPS writing code
* Imported missing files from master to feature-h264-videostorage
* Audio support including fixes for dts/pts, split on keyframe and update to mkv extension to prevent ffmpeg problems writing rtsp audio to mp4 containter (header problem)
* Updates to make gcc happy
* Add html5 video control to timeline and event to support mkv playback
* Add zm_videostore.cpp to CMakeLists.txt
* Remove Modern Branch for now
* Fix minor bug
* Option handled added in master, removing duplicate declaration
* Add CaptureandRecord from zm_camera.h
* Putting placeholder in for CaptureAndRecord function
* Removed duplicate code and brackets
* add digest auth file for cmake
Conflicts:
src/CMakeLists.txt
* Add web dir back into Makefile.am
Revert "Removed web from SUBDIRS in Makefile.am"
This reverts commit d9bbcdf3a94cba4d8955fcd03bd965ed2772f34d.
* Add CaptureAndRecord to vlc, still need to make it record
* Resolve SegFault on videostore
* Swap to mp4 container
* mp4 changes
* spaces to tabs, hide video stuff if video writer is turned off
* Make timeline open event.mp4 instead of mkv
* Missed mkv in timeline.js
* Fix some issues from the merge conflict
* Resolve post merge build issues with braces
* Fix whitespace
* Update Jpeg and Video options for passthrough options
* Whitespace fix zm_camera.h
* Fix array mkssing comma
* Add support for Jpeg save options for h264 branch snapshot. Might remove altogether if snapshots not needed
* Update VideoStoreData memory size comment
* Change from config.use_mkv_storage to per monitor option VideoWriter from video branch
* Fix bracket issues post merge
* Clean up comments and add av_free_packet
* Convert from event_directory to event file as per Video branch
* Testing videojs for video playback
* Fixed a missing bracket post merge and also SQL_values now used for EventID and Monitors
* bring recent improvements in ffmpeg capture function into captureandrecord
* Remove pict from writeAudioFramePacket as not used
* Add translate options for h264 Storage options in Monitor and update en_gb file
* Cherry-Pick from iconnor - make it compile on ubuntu 15.04. Which is libav 56.1.0
Conflicts:
src/zm_ffmpeg.cpp
src/zm_remote_camera_rtsp.cpp
Conflicts:
distros/ubuntu1204/changelog
* Clean up videostore code and remove lots of unused code
* proof of concept for dynamic/automatic video rotation using video-js plugin zoomrotate
Conflicts:
web/skins/classic/views/event.php
* removed redundant field in sql query
Conflicts:
web/skins/classic/views/event.php
* local storage of video js plugin
* Beautify!
Make the code somewhat readable.
* added missing videojs.zoomrotate.js file
added missing videojs.zoomrotate.js file
* Typo
added missing "
* Added missing brackets
* fix to display thumbnails when only storing snapshot.jpg
* added control for video playback rate
Conflicts:
web/skins/classic/views/event.php
* dynamically create jpegs from video file for viewing in browser
* fix timeline view for SaveJPEGs monitors (without enabled VideoWriter)
* only expose monitor info which are being used in client
* fix segmentation fault in zma with ubuntu 14.04 and ffmpeg 2.5.8 (gcc 4.8)
when libx264 is not installed
* better way of detecting showing image or video in timeline and event view
instead of Monitor.VideoWriter, Event.DefaultVideo is used, so even if
VideoWriter/SaveJPEG option is changed, a valid image or video will always be
displayed for historical events in both timeline and event view
this also fixes loading videos in timeline view
* Fixes problem of crashing zmc when bad packet arrives causing av_interleaved_write_frame() to return non-zero (-22). Prefilters common packet issues. Add metadata title to generated video file
* Remove syslog.h
* fixed SaveJPEGs are not working
which is caused in errors introduced when merging with master
* Update README.md
* Fix build warnings specific to h264 branch, unused FrameImg, unused ret and int64_t snprintf issues
* Fix PRId64 issue in travis, builds locally fine, but I can see a gcc version issue here
* Fix PRId64 issue in travis, another try
* Try "STDC_FORMAT_MACROS" to see if that helps Travis on gcc 4.6.3
* Revert space removal around PRId64
* video branch ffmpeg 2.9 fixes
ffmpeg 2.9 patched removed SSE2 CPU
* Add FFMPEGInit back
* use webvvt to overlay timestamp (honoring Monitor.LabelFormat) to videos in timeline and event
also fixed bug which prevented seeking in timeline video preview
* ffmpeg 3.0 API build failure fixes
* Update README.md
* merge all the commits from the messed up iconnor_video branch
* fix whitespace
* revert
* whitespace fixes
* spelling fix
* put back some text
* add these back
* fix spelling mistake
* Steal some packet dumping routines from ffmpeg. Convert them to use our logging routines
* add a test and error message if the codec is not h264
* these have been removed in master
* add a view to check auth and just send the video
* add some comments, and dump filename and AVFormatContext on failure to write header
* add the toggle for RecordAudio so that the checkbox works to turn off Audio
* Must init videoStore in constuctor
* more debug and comments, return checking
* Fix dropped part of sql query.
* fix extra else and some whitespace
* Fix missing } from merge that was preventing building.
* fix tabs
* get rid of use of separator, just use \n
* Restore lost fixes for deprecation
* Why are these failing
* Respect record_audio flag when setting up video file so dont try and initiliase mp4 with unsupported audio
* Forgot that I was trying to solve case of stream is true and record_audio
is false.
* Pass swscale_ctx back in to getCachedContext or it will create new
context every frame and leak memory like a mofo.
* Add libx264-dev and libmp4v2-dev to build requires to save hassle of
ensuring they are installed before build.
* Merge my Rotation/Orientation work and fixes for bad h264 streams
* need arpa/inet for reverse lookups
* pull in the new byte range code for viewing videos
* Move our recording flag deeper into closeevent
* add braces and only call closeEvent if there is an event
* deprecate the z_frame_rate stuff which is deprecated in ffmpeg
* remark out some debugging
* fix for video on stream 1
* fix audio_stream to audio_st
* Ignore bad decodes
* fix problems with content-length causing viewing to not work in chrome/android
* change logic of sending file contents to handle an off by one and be more readable
* Some fixes pointed out by Maxim Romanov. Also simply the loading of events to not join the Monitors table
* fix to sql for timeline
* added RecordAudio to sql in README
* Use sub queries instead of joins to fix errors when using new mysql defaults.
* fix sql queries
* Dockerfile to build feature-h264-videostorage
* Must cast codec
* add php-acpu as a dependency
* require php5-acpu
* fix typo
* remove extra /
* Add a line for out-of-tree builds to do api/lib/Cake/bootstrap.php
* delete merge conflict files
* delete merge conflict files
2017-05-16 10:02:48 +08:00
|
|
|
}
|
2017-10-04 04:28:56 +08:00
|
|
|
if ( $tab != 'source' || ($monitor->Type() != 'Remote' && $monitor->Protocol()!= 'rtsp') ) {
|
2017-05-31 07:53:02 +08:00
|
|
|
?>
|
2017-06-15 03:35:35 +08:00
|
|
|
<input type="hidden" name="newMonitor[RTSPDescribe]" value="<?php echo validHtmlStr($monitor->RTSPDescribe()) ?>"/>
|
2017-05-31 07:53:02 +08:00
|
|
|
<?php
|
2015-08-21 23:32:50 +08:00
|
|
|
}
|
2017-05-31 01:14:27 +08:00
|
|
|
if ( $tab != 'timestamp' ) {
|
2017-05-31 07:53:02 +08:00
|
|
|
?>
|
2017-06-15 03:35:35 +08:00
|
|
|
<input type="hidden" name="newMonitor[LabelFormat]" value="<?php echo validHtmlStr($monitor->LabelFormat()) ?>"/>
|
|
|
|
<input type="hidden" name="newMonitor[LabelX]" value="<?php echo validHtmlStr($monitor->LabelX()) ?>"/>
|
|
|
|
<input type="hidden" name="newMonitor[LabelY]" value="<?php echo validHtmlStr($monitor->LabelY()) ?>"/>
|
|
|
|
<input type="hidden" name="newMonitor[LabelSize]" value="<?php echo validHtmlStr($monitor->LabelSize()) ?>"/>
|
2017-05-31 07:53:02 +08:00
|
|
|
<?php
|
2008-07-14 21:54:50 +08:00
|
|
|
}
|
2017-05-31 01:14:27 +08:00
|
|
|
if ( $tab != 'buffers' ) {
|
2017-05-31 07:53:02 +08:00
|
|
|
?>
|
2017-06-15 03:35:35 +08:00
|
|
|
<input type="hidden" name="newMonitor[ImageBufferCount]" value="<?php echo validHtmlStr($monitor->ImageBufferCount()) ?>"/>
|
|
|
|
<input type="hidden" name="newMonitor[WarmupCount]" value="<?php echo validHtmlStr($monitor->WarmupCount()) ?>"/>
|
|
|
|
<input type="hidden" name="newMonitor[PreEventCount]" value="<?php echo validHtmlStr($monitor->PreEventCount()) ?>"/>
|
|
|
|
<input type="hidden" name="newMonitor[PostEventCount]" value="<?php echo validHtmlStr($monitor->PostEventCount()) ?>"/>
|
|
|
|
<input type="hidden" name="newMonitor[StreamReplayBuffer]" value="<?php echo validHtmlStr($monitor->StreamReplayBuffer()) ?>"/>
|
|
|
|
<input type="hidden" name="newMonitor[AlarmFrameCount]" value="<?php echo validHtmlStr($monitor->AlarmFrameCount()) ?>"/>
|
2017-05-31 07:53:02 +08:00
|
|
|
<?php
|
2008-07-14 21:54:50 +08:00
|
|
|
}
|
2017-05-31 01:14:27 +08:00
|
|
|
if ( ZM_OPT_CONTROL && $tab != 'control' ) {
|
2017-05-31 07:53:02 +08:00
|
|
|
?>
|
2017-06-15 03:35:35 +08:00
|
|
|
<input type="hidden" name="newMonitor[Controllable]" value="<?php echo validHtmlStr($monitor->Controllable()) ?>"/>
|
|
|
|
<input type="hidden" name="newMonitor[ControlId]" value="<?php echo validHtmlStr($monitor->ControlId()) ?>"/>
|
|
|
|
<input type="hidden" name="newMonitor[ControlDevice]" value="<?php echo validHtmlStr($monitor->ControlDevice()) ?>"/>
|
|
|
|
<input type="hidden" name="newMonitor[ControlAddress]" value="<?php echo validHtmlStr($monitor->ControlAddress()) ?>"/>
|
|
|
|
<input type="hidden" name="newMonitor[AutoStopTimeout]" value="<?php echo validHtmlStr($monitor->AutoStopTimeout()) ?>"/>
|
|
|
|
<input type="hidden" name="newMonitor[TrackMotion]" value="<?php echo validHtmlStr($monitor->TrackMotion()) ?>"/>
|
|
|
|
<input type="hidden" name="newMonitor[TrackDelay]" value="<?php echo validHtmlStr($monitor->TrackDelay()) ?>"/>
|
|
|
|
<input type="hidden" name="newMonitor[ReturnLocation]" value="<?php echo validHtmlStr($monitor->ReturnLocation()) ?>"/>
|
|
|
|
<input type="hidden" name="newMonitor[ReturnDelay]" value="<?php echo validHtmlStr($monitor->ReturnDelay()) ?>"/>
|
2017-05-31 07:53:02 +08:00
|
|
|
<?php
|
2008-07-14 21:54:50 +08:00
|
|
|
}
|
2017-05-31 01:14:27 +08:00
|
|
|
if ( ZM_OPT_X10 && $tab != 'x10' ) {
|
2017-05-31 07:53:02 +08:00
|
|
|
?>
|
|
|
|
<input type="hidden" name="newX10Monitor[Activation]" value="<?php echo validHtmlStr($newX10Monitor['Activation']) ?>"/>
|
|
|
|
<input type="hidden" name="newX10Monitor[AlarmInput]" value="<?php echo validHtmlStr($newX10Monitor['AlarmInput']) ?>"/>
|
|
|
|
<input type="hidden" name="newX10Monitor[AlarmOutput]" value="<?php echo validHtmlStr($newX10Monitor['AlarmOutput']) ?>"/>
|
|
|
|
<?php
|
2008-07-14 21:54:50 +08:00
|
|
|
}
|
2017-05-31 01:14:27 +08:00
|
|
|
if ( $tab != 'misc' ) {
|
2017-05-31 07:53:02 +08:00
|
|
|
?>
|
2017-06-15 03:35:35 +08:00
|
|
|
<input type="hidden" name="newMonitor[EventPrefix]" value="<?php echo validHtmlStr($monitor->EventPrefix()) ?>"/>
|
|
|
|
<input type="hidden" name="newMonitor[SectionLength]" value="<?php echo validHtmlStr($monitor->SectionLength()) ?>"/>
|
2019-06-24 23:29:00 +08:00
|
|
|
<input type="hidden" name="newMonitor[MinSectionLength]" value="<?php echo validHtmlStr($monitor->MinSectionLength()) ?>"/>
|
2017-06-15 03:35:35 +08:00
|
|
|
<input type="hidden" name="newMonitor[FrameSkip]" value="<?php echo validHtmlStr($monitor->FrameSkip()) ?>"/>
|
|
|
|
<input type="hidden" name="newMonitor[MotionFrameSkip]" value="<?php echo validHtmlStr($monitor->MotionFrameSkip()) ?>"/>
|
|
|
|
<input type="hidden" name="newMonitor[AnalysisUpdateDelay]" value="<?php echo validHtmlStr($monitor->AnalysisUpdateDelay()) ?>"/>
|
|
|
|
<input type="hidden" name="newMonitor[FPSReportInterval]" value="<?php echo validHtmlStr($monitor->FPSReportInterval()) ?>"/>
|
|
|
|
<input type="hidden" name="newMonitor[DefaultRate]" value="<?php echo validHtmlStr($monitor->DefaultRate()) ?>"/>
|
|
|
|
<input type="hidden" name="newMonitor[DefaultScale]" value="<?php echo validHtmlStr($monitor->DefaultScale()) ?>"/>
|
2018-09-11 00:22:55 +08:00
|
|
|
<input type="hidden" name="newMonitor[DefaultCodec]" value="<?php echo validHtmlStr($monitor->DefaultCodec()) ?>"/>
|
2017-06-15 03:35:35 +08:00
|
|
|
<input type="hidden" name="newMonitor[WebColour]" value="<?php echo validHtmlStr($monitor->WebColour()) ?>"/>
|
|
|
|
<input type="hidden" name="newMonitor[Exif]" value="<?php echo validHtmlStr($monitor->Exif()) ?>"/>
|
2017-05-31 07:53:02 +08:00
|
|
|
<?php
|
2008-07-14 21:54:50 +08:00
|
|
|
}
|
2018-04-19 22:01:04 +08:00
|
|
|
if ( $tab != 'misc' ) {
|
2017-05-31 07:53:02 +08:00
|
|
|
?>
|
2018-04-19 22:01:04 +08:00
|
|
|
<input type="hidden" name="newMonitor[SignalCheckPoints]" value="<?php echo validHtmlStr($monitor->SignalCheckPoints()) ?>"/>
|
2017-06-15 03:35:35 +08:00
|
|
|
<input type="hidden" name="newMonitor[SignalCheckColour]" value="<?php echo validHtmlStr($monitor->SignalCheckColour()) ?>"/>
|
2017-05-31 07:53:02 +08:00
|
|
|
<?php
|
2008-07-14 21:54:50 +08:00
|
|
|
}
|
|
|
|
?>
|
2017-10-27 09:56:10 +08:00
|
|
|
<table id="contentTable" class="major">
|
2017-05-31 07:53:02 +08:00
|
|
|
<tbody>
|
|
|
|
<?php
|
2017-05-31 01:14:27 +08:00
|
|
|
switch ( $tab ) {
|
2017-05-19 03:16:59 +08:00
|
|
|
case 'general' :
|
2008-07-14 21:54:50 +08:00
|
|
|
{
|
2017-05-31 07:53:02 +08:00
|
|
|
?>
|
2019-09-20 02:56:16 +08:00
|
|
|
<tr class="Name">
|
|
|
|
<td><?php echo translate('Name') ?></td>
|
|
|
|
<td><input type="text" name="newMonitor[Name]" value="<?php echo validHtmlStr($monitor->Name()) ?>"/></td>
|
|
|
|
</tr>
|
|
|
|
<tr>
|
|
|
|
<td><?php echo translate('Server') ?></td><td>
|
2019-05-13 19:58:18 +08:00
|
|
|
<?php
|
2018-01-26 00:41:54 +08:00
|
|
|
$servers = array(''=>'None','auto'=>'Auto');
|
2019-02-22 22:19:07 +08:00
|
|
|
foreach ( ZM\Server::find(NULL, array('order'=>'lower(Name)')) as $Server ) {
|
|
|
|
$servers[$Server->Id()] = $Server->Name();
|
2017-06-15 03:35:35 +08:00
|
|
|
}
|
|
|
|
echo htmlSelect( 'newMonitor[ServerId]', $servers, $monitor->ServerId() );
|
2017-05-31 07:53:02 +08:00
|
|
|
?>
|
2019-09-20 02:56:16 +08:00
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
<tr>
|
|
|
|
<td><?php echo translate('StorageArea') ?></td>
|
|
|
|
<td>
|
2017-05-31 07:53:02 +08:00
|
|
|
<?php
|
2017-07-21 23:04:32 +08:00
|
|
|
$storage_areas = array(0=>'Default');
|
2019-09-20 02:56:16 +08:00
|
|
|
foreach ( ZM\Storage::find(NULL, array('order'=>'lower(Name)')) as $Storage ) {
|
2019-02-22 22:19:07 +08:00
|
|
|
$storage_areas[$Storage->Id()] = $Storage->Name();
|
2017-07-21 23:04:32 +08:00
|
|
|
}
|
2019-09-20 02:56:16 +08:00
|
|
|
echo htmlSelect('newMonitor[StorageId]', $storage_areas, $monitor->StorageId());
|
2017-06-15 03:35:35 +08:00
|
|
|
?>
|
2019-09-20 02:56:16 +08:00
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
<tr>
|
|
|
|
<td><?php echo translate('SourceType') ?></td>
|
|
|
|
<td><?php echo htmlSelect('newMonitor[Type]', $sourceTypes, $monitor->Type()); ?></td>
|
|
|
|
</tr>
|
|
|
|
<tr>
|
|
|
|
<td><?php echo translate('Function') ?></td>
|
|
|
|
<td>
|
2017-06-15 03:35:35 +08:00
|
|
|
<?php
|
2019-09-20 02:56:16 +08:00
|
|
|
$function_options = array();
|
|
|
|
foreach ( getEnumValues('Monitors', 'Function') as $f ) {
|
|
|
|
$function_options[$f] = translate("Fn$f");
|
2017-06-15 03:35:35 +08:00
|
|
|
}
|
2019-09-20 02:56:16 +08:00
|
|
|
ZM\Error("Type: " . $monitor->Type());
|
|
|
|
echo htmlSelect('newMonitor[Function]', $function_options, $monitor->Function());
|
2017-06-15 03:35:35 +08:00
|
|
|
?>
|
2019-09-20 02:56:16 +08:00
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
<tr>
|
|
|
|
<td><?php echo translate('Enabled') ?></td>
|
|
|
|
<td><input type="checkbox" name="newMonitor[Enabled]" value="1"<?php if ( $monitor->Enabled() ) { ?> checked="checked"<?php } ?>/></td>
|
|
|
|
</tr>
|
2018-04-27 05:18:36 +08:00
|
|
|
<?php
|
2019-09-20 02:56:16 +08:00
|
|
|
if ( $monitor->Type() != 'WebSite' ) {
|
2018-04-27 05:18:36 +08:00
|
|
|
?>
|
2017-05-19 03:16:59 +08:00
|
|
|
<tr>
|
2019-06-04 22:05:08 +08:00
|
|
|
<td><?php echo translate('LinkedMonitors') ?> (<?php echo makePopupLink('?view=optionhelp&option=OPTIONS_LINKED_MONITORS', 'zmOptionHelp', 'optionhelp', '?' ) ?>)</td>
|
2017-07-21 23:04:32 +08:00
|
|
|
<td>
|
2017-06-15 03:35:35 +08:00
|
|
|
<?php
|
2019-09-20 02:56:16 +08:00
|
|
|
|
|
|
|
$monitors = dbFetchAll('SELECT Id, Name FROM Monitors ORDER BY Sequence ASC');
|
|
|
|
foreach ( $monitors as $linked_monitor ) {
|
|
|
|
$monitor_options[$linked_monitor['Id']] = $linked_monitor['Name'];
|
|
|
|
}
|
|
|
|
|
|
|
|
echo htmlSelect(
|
|
|
|
'newMonitor[LinkedMonitors]',
|
|
|
|
$monitor_options,
|
|
|
|
( $monitor->LinkedMonitors() ? explode(',', $monitor->LinkedMonitors()) : array() ),
|
|
|
|
array('class'=>'chosen','multiple'=>'multiple')
|
|
|
|
);
|
|
|
|
if ( 0 ) {
|
2017-07-21 23:04:32 +08:00
|
|
|
foreach ( $monitors as $linked_monitor ) {
|
2017-09-12 04:57:08 +08:00
|
|
|
if ( (!$monitor->Id() || ($monitor->Id()!= $linked_monitor['Id'])) && visibleMonitor( $linked_monitor['Id'] ) ) {
|
2017-06-15 03:35:35 +08:00
|
|
|
?>
|
2019-02-10 08:54:06 +08:00
|
|
|
<option value="<?php echo validHtmlStr($linked_monitor['Id']); ?>"<?php if ( array_key_exists( $linked_monitor['Id'], $monitorIds ) ) { ?> selected="selected"<?php } ?>><?php echo validHtmlStr($linked_monitor['Name']) ?></option>
|
2017-06-15 03:35:35 +08:00
|
|
|
<?php
|
2017-07-21 23:04:32 +08:00
|
|
|
}
|
|
|
|
}
|
2019-09-20 02:56:16 +08:00
|
|
|
}
|
2017-06-15 03:35:35 +08:00
|
|
|
?>
|
2017-07-21 23:04:32 +08:00
|
|
|
</td>
|
2017-05-19 03:16:59 +08:00
|
|
|
</tr>
|
2018-02-28 03:20:03 +08:00
|
|
|
<tr><td><?php echo translate('Groups'); ?></td><td><select name="newMonitor[GroupIds][]" multiple="multiple" class="chosen"><?php
|
2019-02-22 22:19:07 +08:00
|
|
|
echo htmlOptions(ZM\Group::get_dropdown_options( ), $monitor->GroupIds() );
|
2018-02-27 08:09:36 +08:00
|
|
|
?></td></tr>
|
2017-10-25 08:34:32 +08:00
|
|
|
<tr><td><?php echo translate('AnalysisFPS') ?></td><td><input type="text" name="newMonitor[AnalysisFPSLimit]" value="<?php echo validHtmlStr($monitor->AnalysisFPSLimit()) ?>" size="6"/></td></tr>
|
2017-06-15 03:35:35 +08:00
|
|
|
<?php
|
2017-10-04 04:28:56 +08:00
|
|
|
if ( $monitor->Type() != 'Local' && $monitor->Type() != 'File' && $monitor->Type() != 'NVSocket' ) {
|
2017-06-15 03:35:35 +08:00
|
|
|
?>
|
2017-05-19 03:16:59 +08:00
|
|
|
<tr>
|
|
|
|
<td><?php echo translate('MaximumFPS') ?> (<?php echo makePopupLink('?view=optionhelp&option=OPTIONS_MAXFPS', 'zmOptionHelp', 'optionhelp', '?' ) ?>)</td>
|
2019-05-25 00:40:02 +08:00
|
|
|
<td>
|
|
|
|
<input type="text" name="newMonitor[MaxFPS]" value="<?php echo validHtmlStr($monitor->MaxFPS()) ?>" size="5"/>
|
|
|
|
<span id="newMonitor[MaxFPS]" style="color:red;<?php echo $monitor->MaxFPS() ? '' : 'display:none;' ?>">CAUTION: See the help text</span>
|
|
|
|
</td>
|
2008-07-14 21:54:50 +08:00
|
|
|
</tr>
|
2017-05-19 03:16:59 +08:00
|
|
|
<tr>
|
|
|
|
<td><?php echo translate('AlarmMaximumFPS') ?> (<?php echo makePopupLink('?view=optionhelp&option=OPTIONS_MAXFPS', 'zmOptionHelp', 'optionhelp', '?' ) ?>)</td>
|
2019-05-25 00:40:02 +08:00
|
|
|
<td>
|
|
|
|
<input type="text" name="newMonitor[AlarmMaxFPS]" value="<?php echo validHtmlStr($monitor->AlarmMaxFPS()) ?>" size="5"/>
|
|
|
|
<span id="newMonitor[AlarmMaxFPS]" style="color:red;<?php echo $monitor->AlarmMaxFPS() ? '' : 'display:none;' ?>">CAUTION: See the help text</span>
|
|
|
|
</td>
|
2017-05-19 03:16:59 +08:00
|
|
|
</tr>
|
2017-06-15 03:35:35 +08:00
|
|
|
<?php
|
|
|
|
} else {
|
|
|
|
?>
|
|
|
|
<tr><td><?php echo translate('MaximumFPS') ?></td><td><input type="text" name="newMonitor[MaxFPS]" value="<?php echo validHtmlStr($monitor->MaxFPS()) ?>" size="5"/></td></tr>
|
|
|
|
<tr><td><?php echo translate('AlarmMaximumFPS') ?></td><td><input type="text" name="newMonitor[AlarmMaxFPS]" value="<?php echo validHtmlStr($monitor->AlarmMaxFPS()) ?>" size="5"/></td></tr>
|
|
|
|
<?php
|
|
|
|
}
|
|
|
|
if ( ZM_FAST_IMAGE_BLENDS ) {
|
|
|
|
?>
|
2017-05-19 03:16:59 +08:00
|
|
|
<tr>
|
|
|
|
<td><?php echo translate('RefImageBlendPct') ?></td>
|
|
|
|
<td><select name="newMonitor[RefBlendPerc]"><?php foreach ( $fastblendopts as $name => $value ) { ?><option value="<?php echo $value ?>"<?php if ( $value == $monitor->RefBlendPerc() ) { ?> selected="selected"<?php } ?>><?php echo $name ?></option><?php } ?></select></td>
|
|
|
|
</tr>
|
2019-05-13 19:58:18 +08:00
|
|
|
<tr>
|
2017-05-19 03:16:59 +08:00
|
|
|
<td><?php echo translate('AlarmRefImageBlendPct') ?></td>
|
|
|
|
<td>
|
|
|
|
<select name="newMonitor[AlarmRefBlendPerc]">
|
|
|
|
<?php foreach ( $fastblendopts_alarm as $name => $value ) { ?>
|
|
|
|
<option value="<?php echo $value ?>"<?php if ( $value == $monitor->AlarmRefBlendPerc() ) { ?> selected="selected"<?php } ?>><?php echo $name ?></option>
|
|
|
|
<?php } ?>
|
|
|
|
</select></td></tr>
|
|
|
|
<?php
|
|
|
|
} else {
|
2017-05-31 01:47:30 +08:00
|
|
|
?>
|
2017-06-15 03:35:35 +08:00
|
|
|
<tr><td><?php echo translate('RefImageBlendPct') ?></td><td><input type="text" name="newMonitor[RefBlendPerc]" value="<?php echo validHtmlStr($monitor->RefBlendPerc()) ?>" size="4"/></td></tr>
|
|
|
|
<tr><td><?php echo translate('AlarmRefImageBlendPct') ?></td><td><input type="text" name="newMonitor[AlarmRefBlendPerc]" value="<?php echo validHtmlStr($monitor->AlarmRefBlendPerc()) ?>" size="4"/></td></tr>
|
2017-05-31 01:47:30 +08:00
|
|
|
<?php
|
2017-05-19 03:16:59 +08:00
|
|
|
}
|
2017-05-31 01:47:30 +08:00
|
|
|
?>
|
|
|
|
<tr><td><?php echo translate('Triggers') ?></td><td>
|
|
|
|
<?php
|
2019-09-20 02:56:16 +08:00
|
|
|
$optTriggers = getSetValues('Monitors', 'Triggers');
|
2017-06-01 10:01:35 +08:00
|
|
|
$breakCount = (int)(ceil(count($optTriggers)));
|
2019-09-20 02:56:16 +08:00
|
|
|
$breakCount = min(3, $breakCount);
|
2017-06-01 10:01:35 +08:00
|
|
|
$optCount = 0;
|
|
|
|
foreach( $optTriggers as $optTrigger ) {
|
|
|
|
if ( !ZM_OPT_X10 && $optTrigger == 'X10' )
|
|
|
|
continue;
|
|
|
|
if ( $optCount && ($optCount%$breakCount == 0) )
|
|
|
|
echo '</br>';
|
2017-05-31 01:47:30 +08:00
|
|
|
?>
|
2017-06-15 03:35:35 +08:00
|
|
|
<input type="checkbox" name="newMonitor[Triggers][]" value="<?php echo $optTrigger ?>"<?php if ( ( null !== $monitor->Triggers() ) && in_array( $optTrigger, $monitor->Triggers() ) ) { ?> checked="checked"<?php } ?>/> <?php echo $optTrigger ?>
|
2017-05-31 01:47:30 +08:00
|
|
|
<?php
|
2017-05-19 03:16:59 +08:00
|
|
|
$optCount ++;
|
2017-05-31 01:14:27 +08:00
|
|
|
}
|
|
|
|
if ( !$optCount ) {
|
2017-05-19 03:16:59 +08:00
|
|
|
?>
|
|
|
|
<em><?php echo translate('NoneAvailable') ?></em>
|
|
|
|
<?php
|
2017-05-31 01:14:27 +08:00
|
|
|
}
|
2017-05-19 03:16:59 +08:00
|
|
|
?>
|
|
|
|
</td></tr>
|
|
|
|
<?php
|
2018-04-27 05:18:36 +08:00
|
|
|
}
|
2008-07-14 21:54:50 +08:00
|
|
|
break;
|
2017-05-31 01:14:27 +08:00
|
|
|
}
|
|
|
|
case 'source' :
|
|
|
|
{
|
2017-06-15 03:35:35 +08:00
|
|
|
if ( ZM_HAS_V4L && $monitor->Type() == 'Local' ) {
|
|
|
|
?>
|
|
|
|
<tr><td><?php echo translate('DevicePath') ?></td><td><input type="text" name="newMonitor[Device]" value="<?php echo validHtmlStr($monitor->Device()) ?>" size="24"/></td></tr>
|
2017-05-19 03:16:59 +08:00
|
|
|
<tr><td><?php echo translate('CaptureMethod') ?></td><td><?php echo htmlSelect( "newMonitor[Method]", $localMethods, $monitor->Method(), "submitTab( '$tab' );" ); ?></td></tr>
|
2017-06-15 03:35:35 +08:00
|
|
|
<?php
|
|
|
|
if ( ZM_HAS_V4L1 && $monitor->Method() == 'v4l1' ) {
|
|
|
|
?>
|
2017-11-10 03:53:04 +08:00
|
|
|
<tr>
|
|
|
|
<td><?php echo translate('DeviceChannel') ?></td>
|
|
|
|
<td><select name="newMonitor[Channel]"><?php foreach ( $v4l1DeviceChannels as $name => $value ) { ?><option value="<?php echo $value ?>"<?php if ( $value == $monitor->Channel()) { ?> selected="selected"<?php } ?>><?php echo $name ?></option><?php } ?></select></td>
|
|
|
|
</tr>
|
2017-07-21 23:04:32 +08:00
|
|
|
<tr><td><?php echo translate('DeviceFormat') ?></td><td><select name="newMonitor[Format]"><?php foreach ( $v4l1DeviceFormats as $name => $value ) { ?><option value="<?php echo $value ?>"<?php if ( $value == $monitor->Format()) { ?> selected="selected"<?php } ?>><?php echo $name ?></option><?php } ?></select></td></tr>
|
|
|
|
<tr><td><?php echo translate('CapturePalette') ?></td><td><select name="newMonitor[Palette]"><?php foreach ( $v4l1LocalPalettes as $name => $value ) { ?><option value="<?php echo $value ?>"<?php if ( $value == $monitor->Palette()) { ?> selected="selected"<?php } ?>><?php echo $name ?></option><?php } ?></select></td></tr>
|
2017-06-15 03:35:35 +08:00
|
|
|
<?php
|
|
|
|
} else {
|
|
|
|
?>
|
2017-07-21 23:04:32 +08:00
|
|
|
<tr><td><?php echo translate('DeviceChannel') ?></td><td><select name="newMonitor[Channel]"><?php foreach ( $v4l2DeviceChannels as $name => $value ) { ?><option value="<?php echo $value ?>"<?php if ( $value == $monitor->Channel()) { ?> selected="selected"<?php } ?>><?php echo $name ?></option><?php } ?></select></td></tr>
|
|
|
|
<tr><td><?php echo translate('DeviceFormat') ?></td><td><select name="newMonitor[Format]"><?php foreach ( $v4l2DeviceFormats as $name => $value ) { ?><option value="<?php echo $value ?>"<?php if ( $value == $monitor->Format()) { ?> selected="selected"<?php } ?>><?php echo $name ?></option><?php } ?></select></td></tr>
|
|
|
|
<tr><td><?php echo translate('CapturePalette') ?></td><td><select name="newMonitor[Palette]"><?php foreach ( $v4l2LocalPalettes as $name => $value ) { ?><option value="<?php echo $value ?>"<?php if ( $value == $monitor->Palette()) { ?> selected="selected"<?php } ?>><?php echo $name ?></option><?php } ?></select></td></tr>
|
2017-06-15 03:35:35 +08:00
|
|
|
<?php
|
2017-07-21 23:04:32 +08:00
|
|
|
}
|
2017-06-15 03:35:35 +08:00
|
|
|
?>
|
2017-05-19 03:16:59 +08:00
|
|
|
<tr><td><?php echo translate('V4LMultiBuffer') ?></td><td>
|
2019-06-07 00:53:25 +08:00
|
|
|
<input type="radio" name="newMonitor[V4LMultiBuffer]" id="newMonitor[V4LMultiBuffer]1" value="1" <?php echo ( $monitor->V4LMultiBuffer() == '1' ? 'checked="checked"' : '' ) ?>/>
|
2017-07-21 23:04:32 +08:00
|
|
|
<label for="newMonitor[V4LMultiBuffer]1">Yes</label>
|
2019-06-07 00:53:25 +08:00
|
|
|
<input type="radio" name="newMonitor[V4LMultiBuffer]" id="newMonitor[V4LMultiBuffer]0" value="0" <?php echo ( $monitor->V4LMultiBuffer() == '0' ? 'checked="checked"' : '' ) ?>/>
|
2017-07-21 23:04:32 +08:00
|
|
|
<label for="newMonitor[V4LMultiBuffer]0">No</label>
|
2017-09-12 04:57:51 +08:00
|
|
|
<input type="radio" name="newMonitor[V4LMultiBuffer]" id="newMonitor[V4LMultiBuffer]" value="" <?php echo ( $monitor->V4LMultiBuffer() ? 'checked="checked"' : '' ) ?>/>
|
2017-07-21 23:04:32 +08:00
|
|
|
<label for="newMonitor[V4LMultiBuffer]">Use Config Value</label>
|
2017-05-19 03:16:59 +08:00
|
|
|
</td></tr>
|
2019-02-10 08:54:06 +08:00
|
|
|
<tr><td><?php echo translate('V4LCapturesPerFrame') ?></td><td><input type="number" name="newMonitor[V4LCapturesPerFrame]" value="<?php echo validHtmlStr($monitor->V4LCapturesPerFrame()); ?>"/></td></tr>
|
2017-06-15 03:35:35 +08:00
|
|
|
<?php
|
2019-05-13 19:58:18 +08:00
|
|
|
|
2017-10-04 04:28:56 +08:00
|
|
|
} else if ( $monitor->Type() == 'NVSocket' ) {
|
2017-11-14 06:25:19 +08:00
|
|
|
include('_monitor_source_nvsocket.php');
|
2017-10-04 04:28:56 +08:00
|
|
|
} else if ( $monitor->Type() == 'Remote' ) {
|
2017-06-15 03:35:35 +08:00
|
|
|
?>
|
2017-05-19 03:16:59 +08:00
|
|
|
<tr><td><?php echo translate('RemoteProtocol') ?></td><td><?php echo htmlSelect( "newMonitor[Protocol]", $remoteProtocols, $monitor->Protocol(), "updateMethods( this );if(this.value=='rtsp'){\$('RTSPDescribe').setStyle('display','table-row');}else{\$('RTSPDescribe').hide();}" ); ?></td></tr>
|
2017-06-15 03:35:35 +08:00
|
|
|
<?php
|
2017-09-12 04:57:08 +08:00
|
|
|
if ( !$monitor->Protocol() || $monitor->Protocol() == 'http' ) {
|
2017-06-15 03:35:35 +08:00
|
|
|
?>
|
2017-07-21 23:04:32 +08:00
|
|
|
<tr><td><?php echo translate('RemoteMethod') ?></td><td><?php echo htmlSelect( "newMonitor[Method]", $httpMethods, $monitor->Method() ); ?></td></tr>
|
2017-06-15 03:35:35 +08:00
|
|
|
<?php
|
2012-01-30 14:00:22 +08:00
|
|
|
} else {
|
2017-05-31 01:47:30 +08:00
|
|
|
?>
|
2017-06-15 03:35:35 +08:00
|
|
|
<tr><td><?php echo translate('RemoteMethod') ?></td><td><?php echo htmlSelect( "newMonitor[Method]", $rtspMethods, $monitor->Method() ); ?></td></tr>
|
2017-05-31 01:47:30 +08:00
|
|
|
<?php
|
2012-01-30 14:00:22 +08:00
|
|
|
}
|
2017-05-31 01:47:30 +08:00
|
|
|
?>
|
2017-06-15 03:35:35 +08:00
|
|
|
<tr><td><?php echo translate('RemoteHostName') ?></td><td><input type="text" name="newMonitor[Host]" value="<?php echo validHtmlStr($monitor->Host()) ?>" size="36"/></td></tr>
|
2017-10-04 04:28:56 +08:00
|
|
|
<tr><td><?php echo translate('RemoteHostPort') ?></td><td><input type="number" name="newMonitor[Port]" value="<?php echo validHtmlStr($monitor->Port()) ?>" size="6"/></td></tr>
|
2017-06-15 03:35:35 +08:00
|
|
|
<tr><td><?php echo translate('RemoteHostPath') ?></td><td><input type="text" name="newMonitor[Path]" value="<?php echo validHtmlStr($monitor->Path()) ?>" size="36"/></td></tr>
|
2017-05-31 01:47:30 +08:00
|
|
|
<?php
|
2017-06-15 03:35:35 +08:00
|
|
|
} else if ( $monitor->Type() == 'File' ) {
|
2017-05-31 01:47:30 +08:00
|
|
|
?>
|
2017-06-15 03:35:35 +08:00
|
|
|
<tr><td><?php echo translate('SourcePath') ?></td><td><input type="text" name="newMonitor[Path]" value="<?php echo validHtmlStr($monitor->Path()) ?>" size="36"/></td></tr>
|
2017-05-31 01:47:30 +08:00
|
|
|
<?php
|
2017-06-15 03:35:35 +08:00
|
|
|
} elseif ( $monitor->Type() == 'cURL' ) {
|
2017-05-31 01:47:30 +08:00
|
|
|
?>
|
2017-06-15 03:35:35 +08:00
|
|
|
<tr><td><?php echo 'URL' ?></td><td><input type="text" name="newMonitor[Path]" value="<?php echo validHtmlStr($monitor->Path()) ?>" size="36"/></td></tr>
|
|
|
|
<tr><td><?php echo 'Username' ?></td><td><input type="text" name="newMonitor[User]" value="<?php echo validHtmlStr($monitor->User()) ?>" size="12"/></td></tr>
|
|
|
|
<tr><td><?php echo 'Password' ?></td><td><input type="text" name="newMonitor[Pass]" value="<?php echo validHtmlStr($monitor->Pass()) ?>" size="12"/></td></tr>
|
2018-04-27 05:18:36 +08:00
|
|
|
<?php
|
|
|
|
} elseif ( $monitor->Type() == 'WebSite' ) {
|
|
|
|
?>
|
|
|
|
<tr><td><?php echo translate('WebSiteUrl') ?></td><td><input type="text" name="newMonitor[Path]" value="<?php echo validHtmlStr($monitor->Path()) ?>" size="36"/></td></tr>
|
|
|
|
<tr><td><?php echo translate('Width') ?> (<?php echo translate('Pixels') ?>)</td><td><input type="text" name="newMonitor[Width]" value="<?php echo validHtmlStr($monitor->Width()) ?>" size="4";"/></td></tr>
|
|
|
|
<tr><td><?php echo translate('Height') ?> (<?php echo translate('Pixels') ?>)</td><td><input type="text" name="newMonitor[Height]" value="<?php echo validHtmlStr($monitor->Height()) ?>" size="4";"/></td></tr>
|
2019-02-10 08:54:06 +08:00
|
|
|
<tr><td><?php echo 'Web Site Refresh (Optional)' ?></td><td><input type="number" name="newMonitor[Refresh]" value="<?php echo validHtmlStr($monitor->Refresh()); ?>"/></td></tr>
|
2017-05-31 01:47:30 +08:00
|
|
|
<?php
|
2017-06-15 03:35:35 +08:00
|
|
|
} elseif ( $monitor->Type() == 'Ffmpeg' || $monitor->Type() == 'Libvlc' ) {
|
2017-05-31 01:47:30 +08:00
|
|
|
?>
|
2019-01-10 01:37:42 +08:00
|
|
|
<tr class="SourcePath"><td><?php echo translate('SourcePath') ?></td><td><input type="text" name="newMonitor[Path]" value="<?php echo validHtmlStr($monitor->Path()) ?>" /></td></tr>
|
2017-06-15 03:35:35 +08:00
|
|
|
<tr><td><?php echo translate('RemoteMethod') ?> (<?php echo makePopupLink('?view=optionhelp&option=OPTIONS_RTSPTrans', 'zmOptionHelp', 'optionhelp', '?' ) ?>)</td><td><?php echo htmlSelect( "newMonitor[Method]", $rtspFFMpegMethods, $monitor->Method() ); ?></td></tr>
|
2019-01-10 01:37:42 +08:00
|
|
|
<tr class="SourceOptions">
|
|
|
|
<td><?php echo translate('Options') ?> (<?php echo makePopupLink( '?view=optionhelp&option=OPTIONS_'.strtoupper($monitor->Type()), 'zmOptionHelp', 'optionhelp', '?' ) ?>)</td>
|
|
|
|
<td><input type="text" name="newMonitor[Options]" value="<?php echo validHtmlStr($monitor->Options()) ?>"/></td>
|
|
|
|
</tr>
|
2019-06-26 03:34:45 +08:00
|
|
|
<?php
|
|
|
|
}
|
|
|
|
if ( $monitor->Type() == 'Ffmpeg' ) {
|
|
|
|
?>
|
|
|
|
<tr class="DecoderHWAccelName">
|
|
|
|
<td><?php echo translate('DecoderHWAccelName') ?>
|
|
|
|
(<?php echo makePopupLink('?view=optionhelp&option=DECODERHWACCELNAME', 'zmOptionHelp', 'optionhelp', '?') ?>)
|
|
|
|
</td>
|
|
|
|
<td><input type="text" name="newMonitor[DecoderHWAccelName]" value="<?php echo validHtmlStr($monitor->DecoderHWAccelName()) ?>"/></td>
|
|
|
|
</tr>
|
|
|
|
<tr class="DecoderHWAccelDevice">
|
|
|
|
<td><?php echo translate('DecoderHWAccelDevice') ?>
|
|
|
|
(<?php echo makePopupLink('?view=optionhelp&option=DECODERHWACCELDEVIC', 'zmOptionHelp', 'optionhelp', '?') ?>)
|
|
|
|
</td>
|
|
|
|
<td><input type="text" name="newMonitor[DecoderHWAccelDevice]" value="<?php echo validHtmlStr($monitor->DecoderHWAccelDevice()) ?>"/></td>
|
|
|
|
</tr>
|
2017-05-31 01:47:30 +08:00
|
|
|
<?php
|
2017-06-01 10:01:35 +08:00
|
|
|
}
|
2018-04-27 05:18:36 +08:00
|
|
|
if ( $monitor->Type() != 'NVSocket' && $monitor->Type() != 'WebSite' ) {
|
2017-05-31 01:47:30 +08:00
|
|
|
?>
|
2017-11-27 00:12:00 +08:00
|
|
|
<tr><td><?php echo translate('TargetColorspace') ?></td><td><?php echo htmlSelect('newMonitor[Colours]', $Colours, $monitor->Colours() ); ?>
|
|
|
|
</td></tr>
|
2019-09-19 22:48:25 +08:00
|
|
|
<tr>
|
2019-09-19 22:50:20 +08:00
|
|
|
<td><?php echo translate('CaptureResolution') ?> (<?php echo translate('Pixels') ?>)</td>
|
2019-09-19 22:48:25 +08:00
|
|
|
<td>
|
|
|
|
<input type="number" name="newMonitor[Width]" value="<?php echo validHtmlStr($monitor->Width()) ?>"/>
|
|
|
|
<input type="number" name="newMonitor[Height]" value="<?php echo validHtmlStr($monitor->Height()) ?>"/>
|
|
|
|
<?php echo htmlselect('dimensions_select', array(
|
|
|
|
''=>translate('Custom'),
|
|
|
|
'176x120'=>'176x120 QCIF',
|
|
|
|
'320x240'=>'320x240',
|
|
|
|
'352x240'=>'352x240 CIF',
|
|
|
|
'640x480'=>'640x480',
|
|
|
|
'704x240'=>'704x240 2CIF',
|
|
|
|
'704x480'=>'704x480 4CIF',
|
|
|
|
'720x480'=>'720x480 D1',
|
|
|
|
'1280x720'=>'1280x720 720p',
|
|
|
|
'1280x960'=>'1280x960 960p',
|
|
|
|
'1280x1024'=>'1280x1024 1MP',
|
|
|
|
'1600x1200'=>'1600x1200 2MP',
|
|
|
|
'1920x1080'=>'1920x1080 1080p',
|
|
|
|
'2048x1536'=>'2048x1536 3MP',
|
|
|
|
'2592x1944'=>'2592x1944 5MP',
|
|
|
|
), $monitor->Width().'x'.$monitor->Height()
|
|
|
|
);
|
|
|
|
?>
|
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
<tr>
|
|
|
|
<td><?php echo translate('PreserveAspect') ?></td>
|
|
|
|
<td><input type="checkbox" name="preserveAspectRatio" value="1"/></td>
|
|
|
|
</tr>
|
|
|
|
<tr>
|
|
|
|
<td><?php echo translate('Orientation') ?></td>
|
2019-09-19 22:50:20 +08:00
|
|
|
<td><?php echo htmlselect('newMonitor[Orientation]', $orientations, $monitor->Orientation());?></td>
|
2019-09-19 22:48:25 +08:00
|
|
|
</tr>
|
2017-05-31 01:47:30 +08:00
|
|
|
<?php
|
2019-09-19 22:48:25 +08:00
|
|
|
}
|
2017-10-04 04:28:56 +08:00
|
|
|
if ( $monitor->Type() == 'Local' ) {
|
2017-05-31 01:47:30 +08:00
|
|
|
?>
|
2019-02-10 08:54:06 +08:00
|
|
|
<tr><td><?php echo translate('Deinterlacing') ?></td><td><select name="newMonitor[Deinterlacing]"><?php foreach ( $deinterlaceopts_v4l2 as $name => $value ) { ?><option value="<?php echo validHtmlStr($value); ?>"<?php if ( $value == $monitor->Deinterlacing()) { ?> selected="selected"<?php } ?>><?php echo validHtmlStr($name); ?></option><?php } ?></select></td></tr>
|
2017-06-15 03:35:35 +08:00
|
|
|
<?php
|
2018-04-27 05:18:36 +08:00
|
|
|
} else if ( $monitor->Type() != 'WebSite' ) {
|
2017-05-31 01:47:30 +08:00
|
|
|
?>
|
2019-02-10 08:54:06 +08:00
|
|
|
<tr><td><?php echo translate('Deinterlacing') ?></td><td><select name="newMonitor[Deinterlacing]"><?php foreach ( $deinterlaceopts as $name => $value ) { ?><option value="<?php echo validHtmlStr($value); ?>"<?php if ( $value == $monitor->Deinterlacing()) { ?> selected="selected"<?php } ?>><?php echo validHtmlStr($name); ?></option><?php } ?></select></td></tr>
|
2017-05-31 01:47:30 +08:00
|
|
|
<?php
|
2017-06-15 03:35:35 +08:00
|
|
|
}
|
|
|
|
?>
|
|
|
|
<?php
|
|
|
|
if ( $monitor->Type() == 'Remote' ) {
|
|
|
|
?>
|
2017-09-12 01:27:17 +08:00
|
|
|
<tr id="RTSPDescribe"<?php if ( $monitor->Protocol()!= 'rtsp' ) { echo ' style="display:none;"'; } ?>><td><?php echo translate('RTSPDescribe') ?> (<?php echo makePopupLink( '?view=optionhelp&option=OPTIONS_RTSPDESCRIBE', 'zmOptionHelp', 'optionhelp', '?' ) ?>) </td><td><input type="checkbox" name="newMonitor[RTSPDescribe]" value="1"<?php if ( $monitor->RTSPDescribe() ) { ?> checked="checked"<?php } ?>/></td></tr>
|
2017-05-31 01:47:30 +08:00
|
|
|
<?php
|
2017-06-01 10:01:35 +08:00
|
|
|
}
|
|
|
|
break;
|
2008-07-14 21:54:50 +08:00
|
|
|
}
|
2017-06-01 10:01:35 +08:00
|
|
|
case 'storage' :
|
2017-05-31 01:47:30 +08:00
|
|
|
?>
|
2019-02-10 08:54:06 +08:00
|
|
|
<tr><td><?php echo translate('SaveJPEGs') ?></td><td><select name="newMonitor[SaveJPEGs]"><?php foreach ( $savejpegopts as $name => $value ) { ?><option value="<?php echo validHtmlStr($value); ?>"<?php if ( $value == $monitor->SaveJPEGs() ) { ?> selected="selected"<?php } ?>><?php echo validHtmlStr($name); ?></option><?php } ?></select></td></tr>
|
2018-06-15 01:36:32 +08:00
|
|
|
<tr><td><?php echo translate('VideoWriter') ?></td><td>
|
2019-05-13 19:58:18 +08:00
|
|
|
<?php
|
2018-06-15 01:36:32 +08:00
|
|
|
$videowriteropts = array(
|
|
|
|
0 => 'Disabled',
|
|
|
|
);
|
2018-10-01 21:17:22 +08:00
|
|
|
|
2019-08-28 20:51:42 +08:00
|
|
|
$videowriteropts[1] = 'X264 Encode';
|
2018-10-01 21:17:22 +08:00
|
|
|
|
|
|
|
if ($monitor->Type() == 'Ffmpeg' )
|
|
|
|
$videowriteropts[2] = 'H264 Camera Passthrough';
|
2018-08-03 22:02:42 +08:00
|
|
|
else
|
|
|
|
$videowriteropts[2] = array('text'=>'H264 Camera Passthrough - only for FFMPEG','disabled'=>1);
|
2018-10-01 21:17:22 +08:00
|
|
|
|
|
|
|
echo htmlselect( 'newMonitor[VideoWriter]', $videowriteropts, $monitor->VideoWriter() );
|
2018-06-15 01:36:32 +08:00
|
|
|
?>
|
|
|
|
</td></tr>
|
2017-06-15 03:35:35 +08:00
|
|
|
<tr><td><?php echo translate('OptionalEncoderParam') ?></td><td><textarea name="newMonitor[EncoderParameters]" rows="4" cols="36"><?php echo validHtmlStr($monitor->EncoderParameters()) ?></textarea></td></tr>
|
2018-10-31 23:34:30 +08:00
|
|
|
<tr><td><?php echo translate('RecordAudio') ?></td><td>
|
|
|
|
<?php if ( $monitor->Type() == 'Ffmpeg' ) { ?>
|
|
|
|
<input type="checkbox" name="newMonitor[RecordAudio]" value="1"<?php if ( $monitor->RecordAudio() ) { ?> checked="checked"<?php } ?>/>
|
|
|
|
<?php } else { ?>
|
2018-10-31 23:35:06 +08:00
|
|
|
Audio recording only available with FFMPEG using H264 Passthrough
|
2018-10-31 23:34:30 +08:00
|
|
|
<input type="hidden" name="newMonitor[RecordAudio]" value="<?php echo $monitor->RecordAudio() ? 1 : 0 ?>"/>
|
|
|
|
<?php } ?>
|
|
|
|
</td></tr>
|
|
|
|
|
2017-05-31 01:47:30 +08:00
|
|
|
<?php
|
2017-05-19 03:16:59 +08:00
|
|
|
break;
|
|
|
|
case 'timestamp' :
|
2008-07-14 21:54:50 +08:00
|
|
|
{
|
2017-05-31 01:47:30 +08:00
|
|
|
?>
|
2017-06-15 03:35:35 +08:00
|
|
|
<tr><td><?php echo translate('TimestampLabelFormat') ?></td><td><input type="text" name="newMonitor[LabelFormat]" value="<?php echo validHtmlStr($monitor->LabelFormat()) ?>" size="32"/></td></tr>
|
|
|
|
<tr><td><?php echo translate('TimestampLabelX') ?></td><td><input type="text" name="newMonitor[LabelX]" value="<?php echo validHtmlStr($monitor->LabelX()) ?>" size="4"/></td></tr>
|
|
|
|
<tr><td><?php echo translate('TimestampLabelY') ?></td><td><input type="text" name="newMonitor[LabelY]" value="<?php echo validHtmlStr($monitor->LabelY()) ?>" size="4"/></td></tr>
|
2019-02-10 08:54:06 +08:00
|
|
|
<tr><td><?php echo translate('TimestampLabelSize') ?></td><td><select name="newMonitor[LabelSize]"><?php foreach ( $label_size as $name => $value ) { ?><option value="<?php echo validHtmlStr($value); ?>"<?php if ( $value == $monitor->LabelSize() ) { ?> selected="selected"<?php } ?>><?php echo validHtmlStr($name); ?></option><?php } ?></select></td></tr>
|
2017-05-31 01:47:30 +08:00
|
|
|
<?php
|
2017-06-01 10:01:35 +08:00
|
|
|
break;
|
2008-07-14 21:54:50 +08:00
|
|
|
}
|
2017-05-19 03:16:59 +08:00
|
|
|
case 'buffers' :
|
2008-07-14 21:54:50 +08:00
|
|
|
{
|
2017-05-31 01:47:30 +08:00
|
|
|
?>
|
2017-06-15 03:35:35 +08:00
|
|
|
<tr><td><?php echo translate('ImageBufferSize') ?></td><td><input type="text" name="newMonitor[ImageBufferCount]" value="<?php echo validHtmlStr($monitor->ImageBufferCount()) ?>" size="6"/></td></tr>
|
|
|
|
<tr><td><?php echo translate('WarmupFrames') ?></td><td><input type="text" name="newMonitor[WarmupCount]" value="<?php echo validHtmlStr($monitor->WarmupCount()) ?>" size="4"/></td></tr>
|
|
|
|
<tr><td><?php echo translate('PreEventImageBuffer') ?></td><td><input type="text" name="newMonitor[PreEventCount]" value="<?php echo validHtmlStr($monitor->PreEventCount()) ?>" size="4"/></td></tr>
|
|
|
|
<tr><td><?php echo translate('PostEventImageBuffer') ?></td><td><input type="text" name="newMonitor[PostEventCount]" value="<?php echo validHtmlStr($monitor->PostEventCount()) ?>" size="4"/></td></tr>
|
|
|
|
<tr><td><?php echo translate('StreamReplayBuffer') ?></td><td><input type="text" name="newMonitor[StreamReplayBuffer]" value="<?php echo validHtmlStr($monitor->StreamReplayBuffer()) ?>" size="6"/></td></tr>
|
|
|
|
<tr><td><?php echo translate('AlarmFrameCount') ?></td><td><input type="text" name="newMonitor[AlarmFrameCount]" value="<?php echo validHtmlStr($monitor->AlarmFrameCount()) ?>" size="4"/></td></tr>
|
2017-05-31 01:47:30 +08:00
|
|
|
<?php
|
2017-06-01 10:01:35 +08:00
|
|
|
break;
|
2008-07-14 21:54:50 +08:00
|
|
|
}
|
2017-05-19 03:16:59 +08:00
|
|
|
case 'control' :
|
2008-07-14 21:54:50 +08:00
|
|
|
{
|
2017-05-31 01:47:30 +08:00
|
|
|
?>
|
2019-09-20 02:56:16 +08:00
|
|
|
<tr>
|
|
|
|
<td><?php echo translate('Controllable') ?></td>
|
|
|
|
<td><input type="checkbox" name="newMonitor[Controllable]" value="1"<?php if ( $monitor->Controllable() ) { ?> checked="checked"<?php } ?>/></td></tr>
|
|
|
|
<tr>
|
|
|
|
<td><?php echo translate('ControlType') ?></td>
|
|
|
|
<td><?php echo htmlSelect('newMonitor[ControlId]', $controlTypes, $monitor->ControlId());
|
|
|
|
if ( canEdit('Control') ) {
|
|
|
|
echo ' '.makePopupLink('?view=controlcaps', 'zmControlCaps', 'controlcaps', translate('Edit'));
|
|
|
|
}
|
|
|
|
?></td>
|
|
|
|
</tr>
|
|
|
|
<tr>
|
|
|
|
<td><?php echo translate('ControlDevice') ?></td>
|
|
|
|
<td><input type="text" name="newMonitor[ControlDevice]" value="<?php echo validHtmlStr($monitor->ControlDevice()) ?>"/></td>
|
|
|
|
</tr>
|
|
|
|
<tr>
|
|
|
|
<td><?php echo translate('ControlAddress') ?></td>
|
|
|
|
<td><input type="text" name="newMonitor[ControlAddress]" value="<?php echo validHtmlStr($monitor->ControlAddress()) ?>"/></td>
|
|
|
|
</tr>
|
|
|
|
<tr>
|
|
|
|
<td><?php echo translate('AutoStopTimeout') ?></td>
|
|
|
|
<td><input type="number" name="newMonitor[AutoStopTimeout]" value="<?php echo validHtmlStr($monitor->AutoStopTimeout()) ?>"/></td>
|
|
|
|
</tr>
|
|
|
|
<tr>
|
|
|
|
<td><?php echo translate('TrackMotion') ?></td>
|
|
|
|
<td><input type="checkbox" name="newMonitor[TrackMotion]" value="1"<?php if ( $monitor->TrackMotion() ) { ?> checked="checked"<?php } ?>/></td>
|
|
|
|
</tr>
|
2017-05-31 01:47:30 +08:00
|
|
|
<?php
|
2017-06-01 10:01:35 +08:00
|
|
|
$return_options = array(
|
|
|
|
'-1' => translate('None'),
|
|
|
|
'0' => translate('Home'),
|
2019-09-20 02:56:16 +08:00
|
|
|
'1' => translate('Preset').' 1',
|
2017-06-01 10:01:35 +08:00
|
|
|
);
|
2017-05-31 01:47:30 +08:00
|
|
|
?>
|
2019-09-20 02:56:16 +08:00
|
|
|
<tr>
|
|
|
|
<td><?php echo translate('TrackDelay') ?></td>
|
|
|
|
<td><input type="number" name="newMonitor[TrackDelay]" value="<?php echo validHtmlStr($monitor->TrackDelay()) ?>"/></td>
|
|
|
|
</tr>
|
|
|
|
<tr>
|
|
|
|
<td><?php echo translate('ReturnLocation') ?></td>
|
|
|
|
<td><?php echo htmlSelect('newMonitor[ReturnLocation]', $return_options, $monitor->ReturnLocation()); ?></td>
|
|
|
|
</tr>
|
|
|
|
<tr>
|
|
|
|
<td><?php echo translate('ReturnDelay') ?></td>
|
|
|
|
<td><input type="number" name="newMonitor[ReturnDelay]" value="<?php echo validHtmlStr($monitor->ReturnDelay()) ?>"/></td>
|
|
|
|
</tr>
|
2017-05-31 01:47:30 +08:00
|
|
|
<?php
|
2017-06-01 10:01:35 +08:00
|
|
|
break;
|
2008-07-14 21:54:50 +08:00
|
|
|
}
|
2017-05-19 03:16:59 +08:00
|
|
|
case 'x10' :
|
2008-07-14 21:54:50 +08:00
|
|
|
{
|
2017-05-31 01:47:30 +08:00
|
|
|
?>
|
|
|
|
<tr><td><?php echo translate('X10ActivationString') ?></td><td><input type="text" name="newX10Monitor[Activation]" value="<?php echo validHtmlStr($newX10Monitor['Activation']) ?>" size="20"/></td></tr>
|
|
|
|
<tr><td><?php echo translate('X10InputAlarmString') ?></td><td><input type="text" name="newX10Monitor[AlarmInput]" value="<?php echo validHtmlStr($newX10Monitor['AlarmInput']) ?>" size="20"/></td></tr>
|
|
|
|
<tr><td><?php echo translate('X10OutputAlarmString') ?></td><td><input type="text" name="newX10Monitor[AlarmOutput]" value="<?php echo validHtmlStr($newX10Monitor['AlarmOutput']) ?>" size="20"/></td></tr>
|
|
|
|
<?php
|
2017-06-01 10:01:35 +08:00
|
|
|
break;
|
2008-07-14 21:54:50 +08:00
|
|
|
}
|
2017-05-19 03:16:59 +08:00
|
|
|
case 'misc' :
|
2008-07-14 21:54:50 +08:00
|
|
|
{
|
2017-06-15 03:35:35 +08:00
|
|
|
?>
|
2019-03-26 04:25:09 +08:00
|
|
|
<tr>
|
|
|
|
<td><?php echo translate('EventPrefix') ?></td>
|
|
|
|
<td><input type="text" name="newMonitor[EventPrefix]" value="<?php echo validHtmlStr($monitor->EventPrefix()) ?>"/></td>
|
|
|
|
</tr>
|
|
|
|
<tr>
|
|
|
|
<td><?php echo translate('Sectionlength') ?></td>
|
|
|
|
<td>
|
|
|
|
<input type="number" name="newMonitor[SectionLength]" value="<?php echo validHtmlStr($monitor->SectionLength()) ?>"/>
|
|
|
|
<?php echo translate('seconds')?>
|
|
|
|
</td>
|
|
|
|
</tr>
|
2019-06-24 23:29:00 +08:00
|
|
|
<tr>
|
|
|
|
<td><?php echo translate('MinSectionlength') ?></td>
|
|
|
|
<td>
|
|
|
|
<input type="number" name="newMonitor[MinSectionLength]" value="<?php echo validHtmlStr($monitor->MinSectionLength()) ?>"/>
|
|
|
|
<?php echo translate('seconds')?>
|
|
|
|
</td>
|
|
|
|
</tr>
|
2019-03-26 04:25:09 +08:00
|
|
|
<tr>
|
|
|
|
<td><?php echo translate('FrameSkip') ?></td>
|
|
|
|
<td>
|
|
|
|
<input type="number" name="newMonitor[FrameSkip]" value="<?php echo validHtmlStr($monitor->FrameSkip()) ?>"/>
|
|
|
|
<?php echo translate('frames')?>
|
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
<tr>
|
|
|
|
<td><?php echo translate('MotionFrameSkip') ?></td>
|
|
|
|
<td>
|
|
|
|
<input type="number" name="newMonitor[MotionFrameSkip]" value="<?php echo validHtmlStr($monitor->MotionFrameSkip()) ?>"/>
|
|
|
|
<?php echo translate('frames')?>
|
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
<tr>
|
|
|
|
<td><?php echo translate('AnalysisUpdateDelay') ?></td>
|
|
|
|
<td>
|
|
|
|
<input type="number" name="newMonitor[AnalysisUpdateDelay]" value="<?php echo validHtmlStr($monitor->AnalysisUpdateDelay()) ?>"/>
|
|
|
|
<?php echo translate('seconds')?>
|
|
|
|
</td></tr>
|
|
|
|
<tr>
|
|
|
|
<td><?php echo translate('FPSReportInterval') ?></td>
|
|
|
|
<td>
|
|
|
|
<input type="number" name="newMonitor[FPSReportInterval]" value="<?php echo validHtmlStr($monitor->FPSReportInterval()) ?>"/>
|
|
|
|
<?php echo translate('frames')?>
|
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
<tr>
|
|
|
|
<td><?php echo translate('DefaultRate') ?></td>
|
|
|
|
<td><?php echo htmlSelect('newMonitor[DefaultRate]', $rates, $monitor->DefaultRate()); ?></td>
|
|
|
|
</tr>
|
|
|
|
<tr>
|
|
|
|
<td><?php echo translate('DefaultScale') ?></td>
|
|
|
|
<td><?php echo htmlSelect('newMonitor[DefaultScale]', $scales, $monitor->DefaultScale()); ?></td>
|
|
|
|
</tr>
|
|
|
|
<tr>
|
|
|
|
<td><?php echo translate('DefaultCodec') ?></td>
|
|
|
|
<td><?php echo htmlSelect('newMonitor[DefaultCodec]', $codecs, $monitor->DefaultCodec()); ?></td>
|
|
|
|
</tr>
|
2018-04-19 21:45:28 +08:00
|
|
|
<tr>
|
|
|
|
<td><?php echo translate('SignalCheckPoints') ?></td>
|
|
|
|
<td>
|
|
|
|
<input type="number" name="newMonitor[SignalCheckPoints]" value="<?php echo validInt($monitor->SignalCheckPoints()) ?>"/>
|
|
|
|
</td>
|
|
|
|
</tr>
|
2017-07-21 23:04:32 +08:00
|
|
|
<tr>
|
|
|
|
<td><?php echo translate('SignalCheckColour') ?></td>
|
|
|
|
<td>
|
2019-03-26 04:25:09 +08:00
|
|
|
<input type="text" name="newMonitor[SignalCheckColour]" value="<?php echo validHtmlStr($monitor->SignalCheckColour()) ?>"/>
|
2019-02-10 08:41:54 +08:00
|
|
|
<span id="SignalCheckSwatch" class="swatch" style="background-color: <?php echo validHtmlStr($monitor->SignalCheckColour()); ?>;"> </span>
|
2017-07-21 23:04:32 +08:00
|
|
|
</td>
|
|
|
|
</tr>
|
2017-06-15 03:35:35 +08:00
|
|
|
<tr>
|
2017-07-21 23:04:32 +08:00
|
|
|
<td><?php echo translate('WebColour') ?></td>
|
|
|
|
<td>
|
2019-03-26 04:25:09 +08:00
|
|
|
<input type="text" name="newMonitor[WebColour]" value="<?php echo validHtmlStr($monitor->WebColour()) ?>" onchange="$('WebSwatch').setStyle( 'backgroundColor', this.value )"/>
|
2017-07-21 23:04:32 +08:00
|
|
|
<span id="WebSwatch" class="swatch" style="background-color: <?php echo validHtmlStr($monitor->WebColour()) ?>;"> </span>
|
|
|
|
</td>
|
|
|
|
</tr>
|
2017-06-15 03:35:35 +08:00
|
|
|
<tr>
|
2019-05-24 23:49:59 +08:00
|
|
|
<td><?php echo translate('Exif') ?> (<?php echo makePopupLink( '?view=optionhelp&option=OPTIONS_EXIF', 'zmOptionHelp', 'optionhelp', '?' ) ?>)</td>
|
2017-09-12 04:57:08 +08:00
|
|
|
<td><input type="checkbox" name="newMonitor[Exif]" value="1"<?php if ( $monitor->Exif() ) { ?> checked="checked"<?php } ?>/></td>
|
2017-07-21 23:04:32 +08:00
|
|
|
</tr>
|
2017-06-15 03:35:35 +08:00
|
|
|
<?php
|
2008-07-14 21:54:50 +08:00
|
|
|
break;
|
|
|
|
}
|
2017-06-01 00:55:27 +08:00
|
|
|
} // end switch tab
|
2008-07-14 21:54:50 +08:00
|
|
|
?>
|
|
|
|
</tbody>
|
|
|
|
</table>
|
|
|
|
<div id="contentButtons">
|
2018-02-28 07:10:20 +08:00
|
|
|
<button type="submit" value="Save"<?php echo canEdit('Monitors') ? '' : ' disabled="disabled"' ?>><?php echo translate('Save') ?></button>
|
2019-02-08 22:55:32 +08:00
|
|
|
<button type="button" data-on-click="closeWindow"><?php echo translate('Cancel') ?></button>
|
2008-07-14 21:54:50 +08:00
|
|
|
</div>
|
|
|
|
</form>
|
|
|
|
</div>
|
2016-04-15 01:53:10 +08:00
|
|
|
</div>
|
2017-05-31 01:14:27 +08:00
|
|
|
</body>
|
2008-07-14 21:54:50 +08:00
|
|
|
</html>
|