*/ if (!canEdit('Events')) { error_log("User ".$user['Username']. " doesn't have edit Events perms"); exit; } if (!isset($_REQUEST['eid'])) { error_log("EID not set for action delete-event"); exit; } $eid = validInt($_REQUEST['eid']); $url = "./index.php?view=request&request=event&id=".$eid."&action=delete"; header("Location: ".$url); exit; } else if (strcmp($action, "spawn264") == 0) { /* ACTION: Spawn 264 streaming process. * Parms: [br] */ if (!isset($_GET['monitor']) || !isset($_GET['width']) || !isset($_GET['height'])) { error_log("Not all parameters specified for spawn264"); exit; } $width = validInt($_GET['width']); $height = validInt($_GET['height']); $monitor = validInt($_REQUEST['monitor']); $br = getset('br', ZM_XML_H264_DEFAULT_BR); $streamUrl = stream264fn($monitor, $width, $height, $br); logXml("Using H264 Pipe Function: ".$streamUrl); $pid = shell_exec($streamUrl); logXml("Streaming Process for monitor ".$monitor." ended, cleaning up files"); eraseH264Files($monitor); exit; } else if (strcmp($action, "kill264") == 0) { /* ACTION: Kill existing H264 stream process and cleanup files. * Parms: . * NOTE: This will be called directly by path, so include files * may not be available */ require_once(dirname(__FILE__)."/../includes/functions.php"); if (!isset($_GET['monitor'])) { error_log("Not all parameters specified for kill264"); exit; } $monitor = $_GET['monitor']; kill264proc($monitor); logXml("Killed Segmenter process for monitor ".$monitor); exit; } else if (strcmp($action, "chk264") == 0) { /* ACTION: Simply stalls while checking for 264 file. * Parms: * NOTE: This will be called directly by path, so include files * may not be available */ if (!isset($_GET['monitor'])) { error_log("Monitor not specified for chk264"); exit; } $monitor = $_GET['monitor']; require_once(dirname(__FILE__)."/../includes/functions.php"); $path = getTempDir()."/".m3u8fname($monitor); /* Setup timeout */ $startTime = time(); $timeout = 10; while (!file_exists($path)) { if (time() > $startTime + $timeout) { error_log("Timed out waiting for stream to start, exiting..."); kill264proc($monitor); exit; } } logXml("File exists, stream created after ".(time()-$startTime)." sec"); exit; } else if (strcmp($action, "feed") == 0) { /* ACTION: View a feed. Parms: > [height|width|fps|scale|vcodec|br] */ if (!canView('Stream')) { error_log("User ".$user['Username']. " doesn't have view Stream perms"); exit; } /* Check that required variables are set */ if (!isset($_REQUEST['monitor'])) { error_log("Not all parameters set for action view-feed"); exit; } $width = validInt($_GET['width']); $height = validInt($_GET['height']); $monitor = validInt($_REQUEST['monitor']); $fps = getset('fps', ZM_WEB_VIDEO_MAXFPS); $scale = getset('scale', 100); $vcodec = getset('vcodec', ZM_XML_FEED_VCODEC); /* Only allow H264 as of v1.2 and greater */ if (!requireVer("1","2") && !strcmp($vcodec,"h264")) { logXml("Version 1.2 required for H264 Streaming"); } if (!strcmp($vcodec, "h264") && canStream264() && requireVer("1","2")) { $br = getset('br', ZM_XML_H264_DEFAULT_BR); /* H264 processing */ noCacheHeaders(); /* Kill any existing processes and files */ kill264proc($monitor); eraseH264Files($monitor); logXml("Streaming H264 on Monitor ".$monitor.", ".$width."x".$height." @".$br); /* Generate H264 Web-page */ h264vidHtml($width, $height, $monitor, $br); } else if (!strcmp($vcodec, "mjpeg")) { /* MJPEG streaming */ $streamSrc = getStreamSrc( array( "mode=jpeg", "monitor=".$monitor, "scale=".$scale, "maxfps=".$fps, "buffer=1000" ) ); noCacheHeaders(); xhtmlHeaders( __FILE__, "Stream" ); logXml("Streaming MJPEG on Monitor ".$monitor.", ".$width."x".$height." @".$fps."fps"); echo "\n"; echo "
\n"; outputImageStream("liveStream", $streamSrc, $width, $height, "stream"); echo "
"; } else { error_log("Unsupported codec ".$vcodec." selected for streaming"); } exit; } else if (strcmp($action, "vevent") == 0) { /* ACTION: View an event. Parms: [fps|vcodec] */ if (!canView('Events')) { error_log("User ".$user['Username']. " doesn't have view Events perms"); exit; } if (!isset($_GET['eid'])) { error_log("Not all parameters set for Action View-event"); exit; } /* Grab event from the database */ $eventsSql = "select E.Id, E.MonitorId, E.Name, E.StartTime, E.Length, E.Frames from Events as E where (E.Id = ".$_GET['eid'].")"; $event = dbFetchOne($eventsSql); /* Calculate FPS */ $fps = getset('fps',ceil($event['Frames'] / $event['Length'])); $vcodec = getset('vcodec', ZM_XML_EVENT_VCODEC); $relativeURL = getEventPath($event); $baseURL = ZM_PATH_WEB."/".getEventPathSafe($event); $shellCmd = "ffmpeg -y -r ".$fps." -i ".$baseURL."/%03d-capture.jpg -vcodec ".$vcodec." -r ".ZM_XML_EVENT_FPS." ".$baseURL."/capture.mov 2> /dev/null"; logXml("Encoding event with command: ".$shellCmd); $shellOutput = shell_exec($shellCmd); $url = "./".getEventPathSafe($event)."/capture.mov"; header("Location: ".$url); exit; } else if (strcmp($action, "vframe") == 0) { /* ACTION: View a frame given by an event and frame-id. Parms: [alarm | analyze] * If 'alarm' is set, the returned frame will be the -th alarm frame. If 'analyze' is set, * the returned frame will be the %03d-analyse frame instead of %03d-capture, if ZM_CREATE_ANALYSIS_IMAGES * is set. Otherwise it just returns the captured frame */ if (!isset($_GET['eid']) || !isset($_GET['frame'])) { error_log("Not all parameters set for action view-frame"); exit; } $eid = $_GET['eid']; $eventsSql = "select E.Id, E.MonitorId, E.Name, E.StartTime, E.Length, E.Frames from Events as E where (E.Id = ".$_GET['eid'].")"; $event = dbFetchOne($eventsSql); /* Figure out the frame number. If 'alarm' is not set, this is just equal to the parameter. * If 'alarm' is set, need to query DB and grab the -th item */ if (isset($_GET['alarm'])) { $frameSql = "select * from Frames as F where (F.EventId = ".$eid.") and (F.Type = 'Alarm') order by F.FrameId"; $i=0; $frame = 0; foreach (dbFetchAll($frameSql) as $dbframe) { if ($i == $_GET['frame']) { $frame = $dbframe['FrameId']; break; } $i++; } } else { $frame = $_GET['frame']; } if (isset($_GET['analyze']) && ZM_CREATE_ANALYSIS_IMAGES) { $suffix = "analyse"; } else { $suffix = "capture"; } /* Suffix based on 'analyze' */ $fname = sprintf("%03d-%s.jpg", $frame, $suffix); $url = "./".getEventPathSafe($event)."/".$fname; if (!file_exists($url)) { $url = "./skins/xml/views/notfound.png"; } header("Location: ".$url); exit; } else if (strcmp($action, "state") == 0) { /* ACTION: Change the state of the system. Parms: */ if (!canEdit('System')) { error_log("User ".$user['Username']. " doesn't have edit System perms"); exit; } if (!isset($_GET['state'])) { error_log("Server state not specified for action"); exit; } $url = "./index.php?view=none&action=state&runState=".$_GET['state']; header("Location: ".$url); exit; } else if (strcmp($action, "func") == 0) { /* ACTION: Change state of the monitor. Parms: */ if (!canEdit('Monitors')) { error_log("User ".$user['Username']. " doesn't have monitors Edit perms"); exit; } if (!isset($_GET['mid']) || !isset($_GET['func']) || !isset($_GET['en'])) { error_log("Not all parameters specified for action Monitor state"); exit; } $url = "./index.php?view=none&action=function&mid=".$_GET['mid']."&newFunction=".$_GET['func']."&newEnabled=".$_GET['en']; header("Location: ".$url); exit; } } ?>