Merge branch 'iconnor_video' into storageareas
This commit is contained in:
commit
6816a4c75b
|
@ -303,6 +303,9 @@ int main( int argc, const char *argv[] )
|
||||||
}
|
}
|
||||||
else if ( source == ZMS_EVENT )
|
else if ( source == ZMS_EVENT )
|
||||||
{
|
{
|
||||||
|
if ( ! event_id ) {
|
||||||
|
Fatal( "Can't view an event without specifying an event_id." );
|
||||||
|
}
|
||||||
EventStream stream;
|
EventStream stream;
|
||||||
stream.setStreamScale( scale );
|
stream.setStreamScale( scale );
|
||||||
stream.setStreamReplayRate( rate );
|
stream.setStreamReplayRate( rate );
|
||||||
|
|
|
@ -3,112 +3,148 @@ require_once( 'database.php' );
|
||||||
require_once( 'Storage.php' );
|
require_once( 'Storage.php' );
|
||||||
|
|
||||||
class Event {
|
class Event {
|
||||||
public function __construct( $IdOrRow ) {
|
public function __construct( $IdOrRow ) {
|
||||||
$row = NULL;
|
$row = NULL;
|
||||||
if ( $IdOrRow ) {
|
if ( $IdOrRow ) {
|
||||||
if ( is_integer( $IdOrRow ) or is_numeric( $IdOrRow ) ) {
|
if ( is_integer( $IdOrRow ) or is_numeric( $IdOrRow ) ) {
|
||||||
$row = dbFetchOne( 'SELECT *,unix_timestamp(StartTime) as Time FROM Events WHERE Id=?', NULL, array( $IdOrRow ) );
|
$row = dbFetchOne( 'SELECT *,unix_timestamp(StartTime) as Time FROM Events WHERE Id=?', NULL, array( $IdOrRow ) );
|
||||||
if ( ! $row ) {
|
if ( ! $row ) {
|
||||||
Error("Unable to load Event record for Id=" . $IdOrRow );
|
Error("Unable to load Event record for Id=" . $IdOrRow );
|
||||||
}
|
|
||||||
} elseif ( is_array( $IdOrRow ) ) {
|
|
||||||
$row = $IdOrRow;
|
|
||||||
} else {
|
|
||||||
Error("Unknown argument passed to Event Constructor ($IdOrRow)");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
} # end if isset($IdOrRow)
|
|
||||||
|
|
||||||
if ( $row ) {
|
|
||||||
foreach ($row as $k => $v) {
|
|
||||||
$this->{$k} = $v;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
Error("No row for Event " . $IdOrRow );
|
|
||||||
}
|
|
||||||
} // end function __construct
|
|
||||||
public function Storage() {
|
|
||||||
return new Storage( $this->{'StorageId'} );
|
|
||||||
}
|
|
||||||
public function __call( $fn, array $args){
|
|
||||||
if(isset($this->{$fn})){
|
|
||||||
return $this->{$fn};
|
|
||||||
#array_unshift($args, $this);
|
|
||||||
#call_user_func_array( $this->{$fn}, $args);
|
|
||||||
}
|
}
|
||||||
|
} elseif ( is_array( $IdOrRow ) ) {
|
||||||
|
$row = $IdOrRow;
|
||||||
|
} else {
|
||||||
|
Error("Unknown argument passed to Event Constructor ($IdOrRow)");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} # end if isset($IdOrRow)
|
||||||
|
|
||||||
|
if ( $row ) {
|
||||||
|
foreach ($row as $k => $v) {
|
||||||
|
$this->{$k} = $v;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Error("No row for Event " . $IdOrRow );
|
||||||
|
}
|
||||||
|
} // end function __construct
|
||||||
|
public function Storage() {
|
||||||
|
return new Storage( $this->{'StorageId'} );
|
||||||
|
}
|
||||||
|
public function __call( $fn, array $args){
|
||||||
|
if(isset($this->{$fn})){
|
||||||
|
return $this->{$fn};
|
||||||
|
#array_unshift($args, $this);
|
||||||
|
#call_user_func_array( $this->{$fn}, $args);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function Time() {
|
||||||
|
if ( ! isset( $this->{'Time'} ) ) {
|
||||||
|
$this->{'Time'} = strtotime($this->{'StartTime'});
|
||||||
|
}
|
||||||
|
return $this->{'Time'};
|
||||||
|
}
|
||||||
|
|
||||||
|
public function Path() {
|
||||||
|
$Storage = $this->Storage();
|
||||||
|
return $Storage->Path().'/'.$this->Relative_Path();
|
||||||
|
}
|
||||||
|
public function Relative_Path() {
|
||||||
|
$event_path = "";
|
||||||
|
|
||||||
|
if ( ZM_USE_DEEP_STORAGE )
|
||||||
|
{
|
||||||
|
$event_path =
|
||||||
|
$this->{'MonitorId'}
|
||||||
|
.'/'.strftime( "%y/%m/%d/%H/%M/%S",
|
||||||
|
$this->{'Time'}
|
||||||
|
)
|
||||||
|
;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$event_path =
|
||||||
|
$this->{'MonitorId'}
|
||||||
|
.'/'.$this->{'Id'}
|
||||||
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function Path() {
|
return( $event_path );
|
||||||
$Storage = $this->Storage();
|
|
||||||
return $Storage->Path().'/'.$this->Relative_Path();
|
|
||||||
}
|
|
||||||
public function Relative_Path() {
|
|
||||||
$event_path = "";
|
|
||||||
|
|
||||||
if ( ZM_USE_DEEP_STORAGE )
|
}
|
||||||
{
|
|
||||||
$event_path =
|
|
||||||
$this->{'MonitorId'}
|
|
||||||
.'/'.strftime( "%y/%m/%d/%H/%M/%S",
|
|
||||||
$this->{'Time'}
|
|
||||||
)
|
|
||||||
;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$event_path =
|
|
||||||
$this->{'MonitorId'}
|
|
||||||
.'/'.$this->{'Id'}
|
|
||||||
;
|
|
||||||
}
|
|
||||||
|
|
||||||
return( $event_path );
|
public function LinkPath() {
|
||||||
|
if ( ZM_USE_DEEP_STORAGE ) {
|
||||||
|
return $this->{'MonitorId'} .'/'.strftime( "%y/%m/%d/.", $this->{'Time'}).$this->{'Id'};
|
||||||
|
}
|
||||||
|
Error("Calling Link_Path when not using deep storage");
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
}
|
public function delete() {
|
||||||
|
dbQuery( 'DELETE FROM Events WHERE Id = ?', array($this->{'Id'}) );
|
||||||
|
if ( !ZM_OPT_FAST_DELETE ) {
|
||||||
|
dbQuery( 'DELETE FROM Stats WHERE EventId = ?', array($this->{'Id'}) );
|
||||||
|
dbQuery( 'DELETE FROM Frames WHERE EventId = ?', array($this->{'Id'}) );
|
||||||
|
if ( ZM_USE_DEEP_STORAGE ) {
|
||||||
|
|
||||||
public function LinkPath() {
|
# Assumption: All events haev a start time
|
||||||
if ( ZM_USE_DEEP_STORAGE ) {
|
$start_date = date_parse( $this->{'StartTime'} );
|
||||||
return $this->{'MonitorId'} .'/'.strftime( "%y/%m/%d/.", $this->{'Time'}).$this->{'Id'};
|
$start_date['year'] = $start_date['year'] % 100;
|
||||||
}
|
|
||||||
Error("Calling Link_Path when not using deep storage");
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
|
|
||||||
public function delete() {
|
$Storage = $this->Storage();
|
||||||
dbQuery( 'DELETE FROM Events WHERE Id = ?', array($this->{'Id'}) );
|
# So this is because ZM creates a link under teh day pointing to the time that the event happened.
|
||||||
if ( !ZM_OPT_FAST_DELETE ) {
|
$eventlink_path = $Storage->Path().'/'.$this->Link_Path();
|
||||||
dbQuery( 'DELETE FROM Stats WHERE EventId = ?', array($this->{'Id'}) );
|
|
||||||
dbQuery( 'DELETE FROM Frames WHERE EventId = ?', array($this->{'Id'}) );
|
|
||||||
if ( ZM_USE_DEEP_STORAGE ) {
|
|
||||||
|
|
||||||
# Assumption: All events haev a start time
|
if ( $id_files = glob( $eventlink_path ) ) {
|
||||||
$start_date = date_parse( $this->{'StartTime'} );
|
# I know we are using arrays here, but really there can only ever be 1 in the array
|
||||||
$start_date['year'] = $start_date['year'] % 100;
|
$eventPath = preg_replace( '/\.'.$event['Id'].'$/', readlink($id_files[0]), $id_files[0] );
|
||||||
|
deletePath( $eventPath );
|
||||||
|
deletePath( $id_files[0] );
|
||||||
|
$pathParts = explode( '/', $eventPath );
|
||||||
|
for ( $i = count($pathParts)-1; $i >= 2; $i-- ) {
|
||||||
|
$deletePath = join( '/', array_slice( $pathParts, 0, $i ) );
|
||||||
|
if ( !glob( $deletePath."/*" ) ) {
|
||||||
|
deletePath( $deletePath );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Warning( "Found no event files under $eventlink_path" );
|
||||||
|
} # end if found files
|
||||||
|
} else {
|
||||||
|
$eventPath = $this->Path();
|
||||||
|
deletePath( $eventPath );
|
||||||
|
} # USE_DEEP_STORAGE OR NOT
|
||||||
|
} # ! ZM_OPT_FAST_DELETE
|
||||||
|
} # end Event->delete
|
||||||
|
|
||||||
$Storage = $this->Storage();
|
public function getStreamSrc( $args, $querySep='&' ) {
|
||||||
# So this is because ZM creates a link under teh day pointing to the time that the event happened.
|
$streamSrc = ZM_BASE_URL.ZM_PATH_ZMS;
|
||||||
$eventlink_path = $Storage->Path().'/'.$this->Link_Path();
|
|
||||||
|
|
||||||
if ( $id_files = glob( $eventlink_path ) ) {
|
$args[] = "source=event&event=".$this->{'Id'};
|
||||||
# I know we are using arrays here, but really there can only ever be 1 in the array
|
|
||||||
$eventPath = preg_replace( '/\.'.$event['Id'].'$/', readlink($id_files[0]), $id_files[0] );
|
if ( ZM_OPT_USE_AUTH ) {
|
||||||
deletePath( $eventPath );
|
if ( ZM_AUTH_RELAY == "hashed" ) {
|
||||||
deletePath( $id_files[0] );
|
$args[] = "auth=".generateAuthHash( ZM_AUTH_HASH_IPS );
|
||||||
$pathParts = explode( '/', $eventPath );
|
} elseif ( ZM_AUTH_RELAY == "plain" ) {
|
||||||
for ( $i = count($pathParts)-1; $i >= 2; $i-- ) {
|
$args[] = "user=".$_SESSION['username'];
|
||||||
$deletePath = join( '/', array_slice( $pathParts, 0, $i ) );
|
$args[] = "pass=".$_SESSION['password'];
|
||||||
if ( !glob( $deletePath."/*" ) ) {
|
} elseif ( ZM_AUTH_RELAY == "none" ) {
|
||||||
deletePath( $deletePath );
|
$args[] = "user=".$_SESSION['username'];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
if ( !in_array( "mode=single", $args ) && !empty($GLOBALS['connkey']) ) {
|
||||||
Warning( "Found no event files under $eventlink_path" );
|
$args[] = "connkey=".$GLOBALS['connkey'];
|
||||||
} # end if found files
|
}
|
||||||
} else {
|
if ( ZM_RAND_STREAM ) {
|
||||||
$eventPath = $this->Path();
|
$args[] = "rand=".time();
|
||||||
deletePath( $eventPath );
|
}
|
||||||
} # USE_DEEP_STORAGE OR NOT
|
|
||||||
} # ! ZM_OPT_FAST_DELETE
|
if ( count($args) ) {
|
||||||
} # end Event->delete
|
$streamSrc .= "?".join( $querySep, $args );
|
||||||
|
}
|
||||||
|
|
||||||
|
return( $streamSrc );
|
||||||
|
} // end function etStreamSrc
|
||||||
} # end class
|
} # end class
|
||||||
?>
|
?>
|
||||||
|
|
|
@ -79,7 +79,7 @@ class Monitor {
|
||||||
}
|
}
|
||||||
|
|
||||||
return( $streamSrc );
|
return( $streamSrc );
|
||||||
} // end function etStreamSrc
|
} // end function getStreamSrc
|
||||||
public function Width() {
|
public function Width() {
|
||||||
if ( $this->Orientation() == '90' or $this->Orientation() == '270' ) {
|
if ( $this->Orientation() == '90' or $this->Orientation() == '270' ) {
|
||||||
return $this->{'Height'};
|
return $this->{'Height'};
|
||||||
|
|
|
@ -26,7 +26,7 @@ class Storage {
|
||||||
public function Path() {
|
public function Path() {
|
||||||
if ( isset( $this->{'Path'} ) and ( $this->{'Path'} != '' ) ) {
|
if ( isset( $this->{'Path'} ) and ( $this->{'Path'} != '' ) ) {
|
||||||
return $this->{'Path'};
|
return $this->{'Path'};
|
||||||
} else if ( ! $this->{'Id'} ) {
|
} else if ( ! isset($this->{'Id'}) ) {
|
||||||
return ZM_DIR_EVENTS;
|
return ZM_DIR_EVENTS;
|
||||||
}
|
}
|
||||||
return $this->{'Name'};
|
return $this->{'Name'};
|
||||||
|
|
|
@ -525,7 +525,9 @@ function getEventPath( $event )
|
||||||
}
|
}
|
||||||
|
|
||||||
function getEventDefaultVideoPath( $event ) {
|
function getEventDefaultVideoPath( $event ) {
|
||||||
return ZM_DIR_EVENTS . "/" . getEventPath($event) . "/" . $event['DefaultVideo'];
|
$Event = new Event( $event );
|
||||||
|
return $Event->getStreamSrc( array( "mode=mpeg" ) );
|
||||||
|
//$Event->Path().'/'.$event['DefaultVideo'];
|
||||||
}
|
}
|
||||||
|
|
||||||
function deletePath( $path )
|
function deletePath( $path )
|
||||||
|
@ -1144,10 +1146,19 @@ function getImageSrc( $event, $frame, $scale=SCALE_BASE, $captureOnly=false, $ov
|
||||||
|
|
||||||
//echo "S:$scale, CO:$captureOnly<br>";
|
//echo "S:$scale, CO:$captureOnly<br>";
|
||||||
$currEvent = dbFetchOne( 'SELECT M.SaveJPEGs FROM Events AS E INNER JOIN Monitors AS M ON E.MonitorId = M.Id WHERE E.Id = '.$event['Id'] );
|
$currEvent = dbFetchOne( 'SELECT M.SaveJPEGs FROM Events AS E INNER JOIN Monitors AS M ON E.MonitorId = M.Id WHERE E.Id = '.$event['Id'] );
|
||||||
if ( $currEvent['SaveJPEGs'] == "4" )
|
if ( $currEvent['SaveJPEGs'] == "4" ) {
|
||||||
|
# Snapshot only mode
|
||||||
$captImage = "snapshot.jpg";
|
$captImage = "snapshot.jpg";
|
||||||
else
|
} else {
|
||||||
$captImage = sprintf( "%0".ZM_EVENT_IMAGE_DIGITS."d-capture.jpg", $frame['FrameId'] );
|
$captImage = sprintf( "%0".ZM_EVENT_IMAGE_DIGITS."d-capture.jpg", $frame['FrameId'] );
|
||||||
|
if ( $currEvent['SaveJPEGs'] == "0" ) {
|
||||||
|
# No JPEG saving, must pull from video
|
||||||
|
if ( ! file_exists( $Storage->Path() .'/'.$eventPath.'/'.$captImage ) ) {
|
||||||
|
# Generate the frame JPG
|
||||||
|
# See issue #1379
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
$captPath = $eventPath.'/'.$captImage;
|
$captPath = $eventPath.'/'.$captImage;
|
||||||
$thumbCaptPath = ZM_DIR_IMAGES.'/'.$event['Id'].'-'.$captImage;
|
$thumbCaptPath = ZM_DIR_IMAGES.'/'.$event['Id'].'-'.$captImage;
|
||||||
//echo "CI:$captImage, CP:$captPath, TCP:$thumbCaptPath<br>";
|
//echo "CI:$captImage, CP:$captPath, TCP:$thumbCaptPath<br>";
|
||||||
|
@ -1244,6 +1255,7 @@ function viewImagePath( $path, $querySep='&' )
|
||||||
|
|
||||||
function createListThumbnail( $event, $overwrite=false )
|
function createListThumbnail( $event, $overwrite=false )
|
||||||
{
|
{
|
||||||
|
# Load the frame with the highest score to use as a thumbnail
|
||||||
if ( !($frame = dbFetchOne( "SELECT * FROM Frames WHERE EventId=? AND Score=? ORDER BY FrameId LIMIT 1", NULL, array( $event['Id'], $event['MaxScore'] ) )) )
|
if ( !($frame = dbFetchOne( "SELECT * FROM Frames WHERE EventId=? AND Score=? ORDER BY FrameId LIMIT 1", NULL, array( $event['Id'], $event['MaxScore'] ) )) )
|
||||||
return( false );
|
return( false );
|
||||||
|
|
||||||
|
|
|
@ -585,6 +585,7 @@ $SLANG = array(
|
||||||
'Protocol' => 'Protocol',
|
'Protocol' => 'Protocol',
|
||||||
'Rate' => 'Rate',
|
'Rate' => 'Rate',
|
||||||
'RecaptchaWarning' => 'Your reCaptcha secret key is invalid. Please correct it, or reCaptcha will not work', // added Sep 24 2015 - PP
|
'RecaptchaWarning' => 'Your reCaptcha secret key is invalid. Please correct it, or reCaptcha will not work', // added Sep 24 2015 - PP
|
||||||
|
'RecordAudio' => 'Whether to store the audio stream when saving an event.',
|
||||||
'Real' => 'Real',
|
'Real' => 'Real',
|
||||||
'Record' => 'Record',
|
'Record' => 'Record',
|
||||||
'RefImageBlendPct' => 'Reference Image Blend %ge',
|
'RefImageBlendPct' => 'Reference Image Blend %ge',
|
||||||
|
|
|
@ -55,7 +55,7 @@ $replayModes = array(
|
||||||
if ( isset( $_REQUEST['streamMode'] ) )
|
if ( isset( $_REQUEST['streamMode'] ) )
|
||||||
$streamMode = validHtmlStr($_REQUEST['streamMode']);
|
$streamMode = validHtmlStr($_REQUEST['streamMode']);
|
||||||
else
|
else
|
||||||
$streamMode = video;
|
$streamMode = 'video';
|
||||||
|
|
||||||
if ( isset( $_REQUEST['replayMode'] ) )
|
if ( isset( $_REQUEST['replayMode'] ) )
|
||||||
$replayMode = validHtmlStr($_REQUEST['replayMode']);
|
$replayMode = validHtmlStr($_REQUEST['replayMode']);
|
||||||
|
@ -70,6 +70,7 @@ else {
|
||||||
$Zoom = 1;
|
$Zoom = 1;
|
||||||
$Rotation = 0;
|
$Rotation = 0;
|
||||||
if ( $event['VideoWriter'] == "2" ) {
|
if ( $event['VideoWriter'] == "2" ) {
|
||||||
|
# Passthrough
|
||||||
$Rotation = $event['Orientation'];
|
$Rotation = $event['Orientation'];
|
||||||
if ( in_array($event['Orientation'],array("90","270")))
|
if ( in_array($event['Orientation'],array("90","270")))
|
||||||
$Zoom = $event['Height']/$event['Width'];
|
$Zoom = $event['Height']/$event['Width'];
|
||||||
|
|
|
@ -54,7 +54,7 @@ else
|
||||||
$scale = max( reScale( SCALE_BASE, $event['DefaultScale'], ZM_WEB_DEFAULT_SCALE ), SCALE_BASE );
|
$scale = max( reScale( SCALE_BASE, $event['DefaultScale'], ZM_WEB_DEFAULT_SCALE ), SCALE_BASE );
|
||||||
|
|
||||||
$Transpose = '';
|
$Transpose = '';
|
||||||
if ( $event['VideoWriter'] == "2" ) {
|
if ( $event['VideoWriter'] == "2" ) { // PASSTHROUGH
|
||||||
$Rotation = $event['Orientation'];
|
$Rotation = $event['Orientation'];
|
||||||
// rotate right
|
// rotate right
|
||||||
if ( in_array($event['Orientation'],array("90")))
|
if ( in_array($event['Orientation'],array("90")))
|
||||||
|
|
|
@ -568,12 +568,12 @@ if ( $tab != 'source' )
|
||||||
<input type="hidden" name="newMonitor[Deinterlacing]" value="<?php echo validHtmlStr($monitor->Deinterlacing) ?>"/>
|
<input type="hidden" name="newMonitor[Deinterlacing]" value="<?php echo validHtmlStr($monitor->Deinterlacing) ?>"/>
|
||||||
<?php
|
<?php
|
||||||
}
|
}
|
||||||
if ( $tab != 'storage' )
|
if ( $tab != 'storage' ) {
|
||||||
{
|
|
||||||
?>
|
?>
|
||||||
<input type="hidden" name="newMonitor[SaveJPEGs]" value="<?php echo validHtmlStr($monitor->SaveJPEGs) ?>"/>
|
<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[VideoWriter]" value="<?php echo validHtmlStr($monitor->VideoWriter) ?>"/>
|
||||||
<input type="hidden" name="newMonitor[EncoderParameters]" value="<?php echo validHtmlStr($monitor->EncoderParameters) ?>"/>
|
<input type="hidden" name="newMonitor[EncoderParameters]" value="<?php echo validHtmlStr($monitor->EncoderParameters) ?>"/>
|
||||||
|
<input type="hidden" name="newMonitor[RecordAudio]" value="<?php echo validHtmlStr($monitor->RecordAudio) ?>"/>
|
||||||
<?php
|
<?php
|
||||||
}
|
}
|
||||||
if ( $tab != 'source' || ($monitor->Type != 'Remote' && $monitor->Protocol != 'RTSP'))
|
if ( $tab != 'source' || ($monitor->Type != 'Remote' && $monitor->Protocol != 'RTSP'))
|
||||||
|
@ -877,6 +877,7 @@ switch ( $tab )
|
||||||
<tr><td><?php echo translate('SaveJPEGs') ?></td><td><select name="newMonitor[SaveJPEGs]"><?php foreach ( $savejpegopts as $name => $value ) { ?><option value="<?php echo $value ?>"<?php if ( $value == $monitor->SaveJPEGs ) { ?> selected="selected"<?php } ?>><?php echo $name ?></option><?php } ?></select></td></tr>
|
<tr><td><?php echo translate('SaveJPEGs') ?></td><td><select name="newMonitor[SaveJPEGs]"><?php foreach ( $savejpegopts as $name => $value ) { ?><option value="<?php echo $value ?>"<?php if ( $value == $monitor->SaveJPEGs ) { ?> selected="selected"<?php } ?>><?php echo $name ?></option><?php } ?></select></td></tr>
|
||||||
<tr><td><?php echo translate('VideoWriter') ?></td><td><select name="newMonitor[VideoWriter]"><?php foreach ( $videowriteropts as $name => $value ) { ?><option value="<?php echo $value ?>"<?php if ( $value == $monitor->VideoWriter ) { ?> selected="selected"<?php } ?>><?php echo $name ?></option><?php } ?></select></td></tr>
|
<tr><td><?php echo translate('VideoWriter') ?></td><td><select name="newMonitor[VideoWriter]"><?php foreach ( $videowriteropts as $name => $value ) { ?><option value="<?php echo $value ?>"<?php if ( $value == $monitor->VideoWriter ) { ?> selected="selected"<?php } ?>><?php echo $name ?></option><?php } ?></select></td></tr>
|
||||||
<tr><td><?php echo translate('OptionalEncoderParam') ?></td><td><textarea name="newMonitor[EncoderParameters]" rows="4" cols="36"><?php echo validHtmlStr($monitor->EncoderParameters) ?></textarea></td></tr>
|
<tr><td><?php echo translate('OptionalEncoderParam') ?></td><td><textarea name="newMonitor[EncoderParameters]" rows="4" cols="36"><?php echo validHtmlStr($monitor->EncoderParameters) ?></textarea></td></tr>
|
||||||
|
<tr><td><?php echo translate('RecordAudio') ?></td><td><input type="checkbox" name="newMonitor[RecordAudio]" value="1"<?php if ($monitor->RecordAudio) { ?> checked="checked"<?php } ?>/></td></tr>
|
||||||
<?php
|
<?php
|
||||||
break;
|
break;
|
||||||
case 'timestamp' :
|
case 'timestamp' :
|
||||||
|
|
Loading…
Reference in New Issue