''); } $monitor = null; if ( ! empty($_REQUEST['mid']) ) { $monitor = new ZM\Monitor( $_REQUEST['mid'] ); if ( $monitor and ZM_OPT_X10 ) $x10Monitor = dbFetchOne('SELECT * FROM TriggersX10 WHERE MonitorId = ?', NULL, array($_REQUEST['mid'])); } if ( ! $monitor ) { $nextId = getTableAutoInc('Monitors'); if ( isset($_REQUEST['dupId']) ) { $monitor = new ZM\Monitor($_REQUEST['dupId']); $monitor->GroupIds(); // have to load before we change the Id if ( ZM_OPT_X10 ) $x10Monitor = dbFetchOne('SELECT * FROM TriggersX10 WHERE MonitorId = ?', NULL, array($_REQUEST['dupId'])); $clonedName = $monitor->Name(); $monitor->Name(translate('Monitor').'-'.$nextId); $monitor->Id(0); } else { $monitor = new ZM\Monitor(); $monitor->set( array( 'Id' => 0, 'Name' => translate('Monitor').'-'.$nextId, 'Function' => 'Mocord', 'Enabled' => true, 'LinkedMonitors' => '', 'Type' => 'Ffmpeg', 'Device' => '/dev/video0', 'Channel' => '0', 'Format' => 0x000000ff, 'Protocol' => '', 'Method' => '', 'Host' => '', 'Path' => '', 'Options' => '', 'Port' => '80', 'User' => '', 'Pass' => '', 'Colours' => 4, 'Palette' => 0, 'Width' => '', 'Height' => '', 'Orientation' => '0', 'Deinterlacing' => 0, 'RTSPDescribe' => 0, 'SaveJPEGs' => '0', 'VideoWriter' => '1', 'EncoderParameters' => "# Lines beginning with # are a comment \n# For changing quality, use the crf option\n# 1 is best, 51 is worst quality\n#crf=23\n", 'RecordAudio' => '0', 'LabelFormat' => '%N - %d/%m/%y %H:%M:%S', 'LabelX' => 0, 'LabelY' => 0, 'LabelSize' => 1, 'ImageBufferCount' => 20, 'WarmupCount' => 0, 'PreEventCount' => 0, 'PostEventCount' => 5, 'StreamReplayBuffer' => 0, 'AlarmFrameCount' => 1, 'Controllable' => 0, 'ControlId' => '', 'ControlType' => 0, 'ControlDevice' => '', 'ControlAddress' => '', 'AutoStopTimeout' => '', 'TrackMotion' => 0, 'TrackDelay' => '', 'ReturnLocation' => -1, 'ReturnDelay' => '', 'SectionLength' => 600, 'FrameSkip' => 0, 'MotionFrameSkip' => 0, 'EventPrefix' => 'Event-', 'AnalysisFPSLimit' => '', 'AnalysisUpdateDelay' => 0, 'MaxFPS' => null, 'AlarmMaxFPS' => null, 'FPSReportInterval' => 100, 'RefBlendPerc' => 6, 'AlarmRefBlendPerc' => 6, 'DefaultRate' => '100', 'DefaultScale' => '100', 'DefaultCodec' => 'auto', 'SignalCheckPoints' => '10', 'SignalCheckColour' => '#0000c0', 'WebColour' => 'red', 'Exif' => '0', 'Triggers' => '', 'V4LMultiBuffer' => '', 'V4LCapturesPerFrame' => 1, 'ServerId' => 'auto', 'StorageId' => '1', 'Refresh' => '', ) ); } # end if $_REQUEST['dupID'] } # end if $_REQUEST['mid'] if ( ZM_OPT_X10 && empty($x10Monitor) ) { $x10Monitor = array( 'Activation' => '', 'AlarmInput' => '', 'AlarmOutput' => '', ); } function fourcc( $a, $b, $c, $d ) { return( ord($a) | (ord($b) << 8) | (ord($c) << 16) | (ord($d) << 24) ); } if ( isset( $_REQUEST['newMonitor'] ) ) { # Update the monitor object with whatever has been set so far. $monitor->set( $_REQUEST['newMonitor'] ); if ( ZM_OPT_X10 ) $newX10Monitor = $_REQUEST['newX10Monitor']; } else { # FIXME: Triggers in the db is a comma separated string. Needs to be an array. #$monitor->Triggers()= explode( ',', isset($monitor->Triggers())?$monitor->Triggers:"" ); if ( ZM_OPT_X10 ) $newX10Monitor = $x10Monitor; } # What if it has less zeros? This is not robust code. if ( $monitor->AnalysisFPSLimit() == '0.00' ) $monitor->AnalysisFPSLimit( '' ); if ( $monitor->MaxFPS() == '0.00' ) $monitor->MaxFPS( '' ); if ( $monitor->AlarmMaxFPS() == '0.00' ) $monitor->AlarmMaxFPS( '' ); 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 ) { # Does isset handle NULL's? I don't think this code is correct. if ( isset($value) ) { $monitor->$name = $value; } } } if ( !empty($_REQUEST['probe']) ) { $probe = json_decode(base64_decode($_REQUEST['probe'])); foreach ( $probe as $name=>$value ) { if ( isset($value) ) { # Does isset handle NULL's? I don't think this code is correct. $monitor->$name = urldecode($value); } } 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 ); } } $sourceTypes = array( 'Local' => translate('Local'), 'Remote' => translate('Remote'), 'File' => translate('File'), 'Ffmpeg' => translate('Ffmpeg'), 'Libvlc' => translate('Libvlc'), 'cURL' => 'cURL (HTTP(S) only)', 'WebSite'=> 'Web Site', 'NVSocket' => translate('NVSocket') ); if ( !ZM_HAS_V4L ) unset($sourceTypes['Local']); $localMethods = array( 'v4l2' => 'Video For Linux version 2', 'v4l1' => 'Video For Linux version 1', ); if ( !ZM_HAS_V4L2 ) unset($localMethods['v4l2']); if ( !ZM_HAS_V4L1 ) unset($localMethods['v4l1']); $remoteProtocols = array( 'http' => 'HTTP', 'rtsp' => 'RTSP' ); $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' ); $httpMethods = array( 'simple' => 'Simple', 'regexp' => 'Regexp', 'jpegTags' => 'JPEG Tags' ); if ( !ZM_PCRE ) unset($httpMethods['regexp']); // Currently unsupported 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 ); $v4l1MaxChannels = 15; $v4l1DeviceChannels = array(); for ( $i = 0; $i <= $v4l1MaxChannels; $i++ ) $v4l1DeviceChannels[$i] = $i; $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 ) { $v4l2DeviceFormats = array( '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, ); $v4l2MaxChannels = 31; $v4l2DeviceChannels = array(); for ( $i = 0; $i <= $v4l2MaxChannels; $i++ ) $v4l2DeviceChannels[$i] = $i; $v4l2LocalPalettes = array( 'Auto' => 0, /* Automatic palette selection */ /* Pixel format FOURCC depth Description */ translate('Grey') => fourcc('G','R','E','Y'), /* 8 Greyscale */ '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 */ /* compressed formats */ '*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 */ /* two planes -- one Y, one Cr + Cb interleaved */ //'NV12' => fourcc('N','V','1','2'), /* 12 Y/CbCr 4:2:0 */ //'NV21' => fourcc('N','V','2','1'), /* 12 Y/CrCb 4:2:0 */ /* The following formats are not defined in the V4L2 specification */ '*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 */ /* see http://www.siliconimaging.com/RGB%20Bayer.htm */ //'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.. */ /* Vendor-specific formats */ //'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 */ ); } $Colours = array( '1' => translate('8BitGrey'), '3' => translate('24BitColour'), '4' => translate('32BitColour') ); $orientations = array( '0' => translate('Normal'), '90' => translate('RotateRight'), '180' => translate('Inverted'), '270' => translate('RotateLeft'), 'horz' => translate('FlippedHori'), 'vert' => translate('FlippedVert') ); $deinterlaceopts = array( '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 ); $deinterlaceopts_v4l2 = array( '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 ); $fastblendopts = array( 'No blending' => 0, '1.5625%' => 1, '3.125%' => 3, '6.25% (Indoor)' => 6, '12.5% (Outdoor)' => 12, '25%' => 25, '50%' => 50 ); $fastblendopts_alarm = array( '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 ); $label_size = array( 'Default' => 1, 'Large' => 2 ); $savejpegopts = array( 'Disabled' => 0, 'Frames only' => 1, 'Analysis images only (if available)' => 2, 'Frames + Analysis images (if available)' => 3, ); $codecs = array( 'auto' => translate('Auto'), 'MP4' => translate('MP4'), 'MJPEG' => translate('MJPEG'), ); xhtmlHeaders(__FILE__, translate('Monitor')." - ".validHtmlStr($monitor->Name()) ); getBodyTopHTML(); ?>
GroupIds() as $group_id ) { echo ''; } ?> Triggers() ) { foreach( explode( ',', $monitor->Triggers() ) as $newTrigger ) { ?> Type()!= 'Local') ) { ?> Type()!= 'Remote' ) { ?> Type()!= 'Local' && $monitor->Type()!= 'Remote' && $monitor->Type()!= 'Ffmpeg' && $monitor->Type()!= 'Libvlc') ) { ?> Type()!= 'Ffmpeg' && $monitor->Type()!= 'Libvlc' )) { ?> Type()!= 'Remote' && $monitor->Type()!= 'File' && $monitor->Type()!= 'Ffmpeg' && $monitor->Type()!= 'Libvlc' && $monitor->Type()!= 'cURL' && $monitor->Type() != 'WebSite') ) { ?> Type() != 'Remote' && $monitor->Protocol()!= 'rtsp') ) { ?> Type != 'WebSite' ) { ?> Type() != 'Local' && $monitor->Type() != 'File' && $monitor->Type() != 'NVSocket' ) { ?> Type() == 'Local' ) { ?> Method() == 'v4l1' ) { ?> Type() == 'NVSocket' ) { include('_monitor_source_nvsocket.php'); } else if ( $monitor->Type() == 'Remote' ) { ?> Protocol() || $monitor->Protocol() == 'http' ) { ?> Type() == 'File' ) { ?> Type() == 'cURL' ) { ?> Type() == 'WebSite' ) { ?> Type() == 'Ffmpeg' || $monitor->Type() == 'Libvlc' ) { ?> Type() != 'NVSocket' && $monitor->Type() != 'WebSite' ) { ?> Type() == 'Local' ) { ?> Type() != 'WebSite' ) { ?> Type() == 'Remote' ) { ?> Protocol()!= 'rtsp' ) { echo ' style="display:none;"'; } ?>> translate('None'), '0' => translate('Home'), '1' => translate('Preset')." 1", ); ?>
'None','auto'=>'Auto'); foreach ( ZM\Server::find(NULL, array('order'=>'lower(Name)')) as $Server ) { $servers[$Server->Id()] = $Server->Name(); } echo htmlSelect( 'newMonitor[ServerId]', $servers, $monitor->ServerId() ); ?>
'Default'); foreach ( ZM\Storage::find( NULL, array('order'=>'lower(Name)') ) as $Storage ) { $storage_areas[$Storage->Id()] = $Storage->Name(); } echo htmlSelect( 'newMonitor[StorageId]', $storage_areas, $monitor->StorageId() ); ?>
Type() ); ?>
Enabled() ) { ?> checked="checked"/>
 ()
 ()
'; ?> Triggers() ) && in_array( $optTrigger, $monitor->Triggers() ) ) { ?> checked="checked"/> 
Method(), "submitTab( '$tab' );" ); ?>
V4LMultiBuffer() == 1 ? 'checked="checked"' : '' ) ?>/> V4LMultiBuffer() == 0 ? 'checked="checked"' : '' ) ?>/> V4LMultiBuffer() ? 'checked="checked"' : '' ) ?>/>
Protocol(), "updateMethods( this );if(this.value=='rtsp'){\$('RTSPDescribe').setStyle('display','table-row');}else{\$('RTSPDescribe').hide();}" ); ?>
Method() ); ?>
Method() ); ?>
()
()
 ()Method() ); ?>
 (Type()), 'zmOptionHelp', 'optionhelp', '?' ) ?>)
Colours() ); ?>
()
()
Orientation() );?>
 () RTSPDescribe() ) { ?> checked="checked"/>
'Disabled', ); if (stripos(php_uname('m'), 'arm') === false ) $videowriteropts[1] = 'X264 Encode'; else $videowriteropts[1] = array('text'=>'X264 Encode - Not compatible on Arm','disabled'=>1); if ($monitor->Type() == 'Ffmpeg' ) $videowriteropts[2] = 'H264 Camera Passthrough'; else $videowriteropts[2] = array('text'=>'H264 Camera Passthrough - only for FFMPEG','disabled'=>1); echo htmlselect( 'newMonitor[VideoWriter]', $videowriteropts, $monitor->VideoWriter() ); ?>
Type() == 'Ffmpeg' ) { ?> RecordAudio() ) { ?> checked="checked"/> Audio recording only available with FFMPEG using H264 Passthrough
Controllable() ) { ?> checked="checked"/>
 
TrackMotion() ) { ?> checked="checked"/>
DefaultRate()); ?>
DefaultScale()); ?>
DefaultCodec()); ?>
    
    
 () Exif() ) { ?> checked="checked"/>