Merge branch 'master' of github.com:ZoneMinder/zoneminder
This commit is contained in:
commit
2a4d06f93b
|
@ -10,6 +10,7 @@ FFmpeg_Input::FFmpeg_Input() {
|
|||
FFMPEGInit();
|
||||
streams = NULL;
|
||||
frame = NULL;
|
||||
last_seek_request = -1;
|
||||
}
|
||||
|
||||
FFmpeg_Input::~FFmpeg_Input() {
|
||||
|
@ -102,7 +103,6 @@ int FFmpeg_Input::Open(const char *filepath) {
|
|||
} // end int FFmpeg_Input::Open( const char * filepath )
|
||||
|
||||
AVFrame *FFmpeg_Input::get_frame(int stream_id) {
|
||||
Debug(1, "Getting frame from stream %d", stream_id);
|
||||
|
||||
int frameComplete = false;
|
||||
AVPacket packet;
|
||||
|
@ -138,12 +138,14 @@ AVFrame *FFmpeg_Input::get_frame(int stream_id) {
|
|||
frame = zm_av_frame_alloc();
|
||||
}
|
||||
ret = zm_send_packet_receive_frame(context, frame, packet);
|
||||
if ( ret <= 0 ) {
|
||||
if ( ret < 0 ) {
|
||||
Error("Unable to decode frame at frame %d: %s, continuing",
|
||||
streams[packet.stream_index].frame_count, av_make_error_string(ret).c_str());
|
||||
zm_av_packet_unref(&packet);
|
||||
av_frame_free(&frame);
|
||||
continue;
|
||||
} else {
|
||||
zm_dump_frame(frame, "resulting frame");
|
||||
}
|
||||
|
||||
frameComplete = 1;
|
||||
|
@ -175,9 +177,20 @@ AVFrame *FFmpeg_Input::get_frame(int stream_id, double at) {
|
|||
}
|
||||
// Have to grab a frame to update our current frame to know where we are
|
||||
get_frame(stream_id);
|
||||
} // end if ! frame
|
||||
} // end if ! frame
|
||||
|
||||
if ( frame->pts > seek_target ) {
|
||||
if ( !frame ) {
|
||||
Warning("Unable to get frame.");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (
|
||||
(last_seek_request >= 0)
|
||||
&&
|
||||
(last_seek_request > seek_target )
|
||||
&&
|
||||
(frame->pts > seek_target)
|
||||
) {
|
||||
zm_dump_frame(frame, "frame->pts > seek_target, seek backwards");
|
||||
// our frame must be beyond our seek target. so go backwards to before it
|
||||
if ( ( ret = av_seek_frame(input_format_context, stream_id, seek_target,
|
||||
|
@ -191,6 +204,8 @@ AVFrame *FFmpeg_Input::get_frame(int stream_id, double at) {
|
|||
zm_dump_frame(frame, "frame->pts > seek_target, got");
|
||||
} // end if frame->pts > seek_target
|
||||
|
||||
last_seek_request = seek_target;
|
||||
|
||||
// Seeking seems to typically seek to a keyframe, so then we have to decode until we get the frame we want.
|
||||
if ( frame->pts <= seek_target ) {
|
||||
zm_dump_frame(frame, "pts <= seek_target");
|
||||
|
|
|
@ -42,6 +42,7 @@ class FFmpeg_Input {
|
|||
int audio_stream_id;
|
||||
AVFormatContext *input_format_context;
|
||||
AVFrame *frame;
|
||||
int64_t last_seek_request;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -467,8 +467,8 @@ private $status_fields = array(
|
|||
return $source;
|
||||
} // end function Source
|
||||
|
||||
public function UrlToIndex() {
|
||||
return $this->Server()->UrlToIndex();
|
||||
public function UrlToIndex($port=null) {
|
||||
return $this->Server()->UrlToIndex($port);
|
||||
//ZM_MIN_STREAMING_PORT ? (ZM_MIN_STREAMING_PORT+$this->Id()) : null);
|
||||
}
|
||||
|
||||
|
|
|
@ -33,9 +33,9 @@ $configFile = ZM_CONFIG;
|
|||
$localConfigFile = basename($configFile);
|
||||
if ( file_exists( $localConfigFile ) && filesize( $localConfigFile ) > 0 ) {
|
||||
if ( php_sapi_name() == 'cli' && empty($_SERVER['REMOTE_ADDR']) )
|
||||
print( "Warning, overriding installed $localConfigFile file with local copy\n" );
|
||||
print("Warning, overriding installed $localConfigFile file with local copy\n");
|
||||
else
|
||||
error_log( "Warning, overriding installed $localConfigFile file with local copy" );
|
||||
error_log("Warning, overriding installed $localConfigFile file with local copy");
|
||||
$configFile = $localConfigFile;
|
||||
}
|
||||
|
||||
|
@ -49,19 +49,19 @@ if ( is_dir($configSubFolder) ) {
|
|||
if ( is_readable($configSubFolder) ) {
|
||||
foreach ( glob("$configSubFolder/*.conf") as $filename ) {
|
||||
//error_log("processing $filename");
|
||||
$configvals = array_replace($configvals, process_configfile($filename) );
|
||||
$configvals = array_replace($configvals, process_configfile($filename));
|
||||
}
|
||||
} else {
|
||||
error_log( "WARNING: ZoneMinder configuration subfolder found but is not readable. Check folder permissions on $configSubFolder." );
|
||||
error_log("WARNING: ZoneMinder configuration subfolder found but is not readable. Check folder permissions on $configSubFolder.");
|
||||
}
|
||||
} else {
|
||||
error_log( "WARNING: ZoneMinder configuration subfolder found but is not a directory. Check $configSubFolder." );
|
||||
error_log("WARNING: ZoneMinder configuration subfolder found but is not a directory. Check $configSubFolder.");
|
||||
}
|
||||
|
||||
# Now that our array our finalized, define each key => value
|
||||
# pair in the array as a constant
|
||||
foreach( $configvals as $key => $value) {
|
||||
define( $key, $value );
|
||||
foreach ( $configvals as $key => $value ) {
|
||||
define($key, $value);
|
||||
}
|
||||
|
||||
//
|
||||
|
@ -135,8 +135,8 @@ define( 'SCALE_BASE', 100 ); // The additional scalin
|
|||
define( 'STRF_FMT_DATETIME_DB', '%Y-%m-%d %H:%M:%S' ); // Strftime format for database queries, don't change
|
||||
define( 'MYSQL_FMT_DATETIME_SHORT', '%y/%m/%d %H:%i:%S' ); // MySQL date_format shorter format for dates with time
|
||||
|
||||
require_once( 'database.php' );
|
||||
require_once( 'logger.php' );
|
||||
require_once('database.php');
|
||||
require_once('logger.php');
|
||||
loadConfig();
|
||||
ZM\Logger::fetch()->initialise();
|
||||
|
||||
|
@ -165,28 +165,30 @@ function loadConfig( $defineConsts=true ) {
|
|||
$result = $dbConn->query('SELECT Name,Value FROM Config');
|
||||
if ( !$result )
|
||||
echo mysql_error();
|
||||
while( $row = dbFetchNext( $result ) ) {
|
||||
while( $row = dbFetchNext($result) ) {
|
||||
if ( $defineConsts )
|
||||
define( $row['Name'], $row['Value'] );
|
||||
define($row['Name'], $row['Value']);
|
||||
$config[$row['Name']] = $row;
|
||||
}
|
||||
} # end function loadConfig
|
||||
|
||||
// For Human-readability, use ZM_SERVER_HOST or ZM_SERVER_NAME in zm.conf, and convert it here to a ZM_SERVER_ID
|
||||
if ( ! defined('ZM_SERVER_ID') ) {
|
||||
require_once('Server.php');
|
||||
if ( defined('ZM_SERVER_NAME') and ZM_SERVER_NAME ) {
|
||||
$server_id = dbFetchOne('SELECT Id FROM Servers WHERE Name=?', 'Id', array(ZM_SERVER_NAME));
|
||||
if ( ! $server_id ) {
|
||||
# Use Server lookup so that it caches
|
||||
$Server = ZM\Server::find_one(array('Name'=>ZM_SERVER_NAME));
|
||||
if ( !$Server ) {
|
||||
Error('Invalid Multi-Server configration detected. ZM_SERVER_NAME set to ' . ZM_SERVER_NAME . ' in zm.conf, but no corresponding entry found in Servers table.');
|
||||
} else {
|
||||
define( 'ZM_SERVER_ID', $server_id );
|
||||
define('ZM_SERVER_ID', $Server->Id());
|
||||
}
|
||||
} else if ( defined('ZM_SERVER_HOST') and ZM_SERVER_HOST ) {
|
||||
$server_id = dbFetchOne('SELECT Id FROM Servers WHERE Name=?', 'Id', array(ZM_SERVER_HOST));
|
||||
if ( ! $server_id ) {
|
||||
$Server = ZM\Server::find_one(array('Name'=>ZM_SERVER_HOST));
|
||||
if ( ! $Server ) {
|
||||
Error('Invalid Multi-Server configration detected. ZM_SERVER_HOST set to ' . ZM_SERVER_HOST . ' in zm.conf, but no corresponding entry found in Servers table.');
|
||||
} else {
|
||||
define( 'ZM_SERVER_ID', $server_id );
|
||||
define('ZM_SERVER_ID', $Server->Id());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -197,21 +199,22 @@ function process_configfile($configFile) {
|
|||
if ( is_readable( $configFile ) ) {
|
||||
$configvals = array();
|
||||
|
||||
$cfg = fopen( $configFile, 'r') or Error("Could not open config file: $configFile.");
|
||||
$cfg = fopen($configFile, 'r') or Error("Could not open config file: $configFile.");
|
||||
while ( !feof($cfg) ) {
|
||||
$str = fgets( $cfg, 256 );
|
||||
if ( preg_match( '/^\s*$/', $str ))
|
||||
$str = fgets($cfg, 256);
|
||||
if ( preg_match('/^\s*(#.*)?$/', $str) ) {
|
||||
continue;
|
||||
elseif ( preg_match( '/^\s*#/', $str ))
|
||||
continue;
|
||||
elseif ( preg_match( '/^\s*([^=\s]+)\s*=\s*[\'"]*(.*?)[\'"]*\s*$/', $str, $matches ))
|
||||
} else if ( preg_match( '/^\s*([^=\s]+)\s*=\s*[\'"]*(.*?)[\'"]*\s*$/', $str, $matches )) {
|
||||
$configvals[$matches[1]] = $matches[2];
|
||||
} else {
|
||||
Error("Malformed line in config $configFile\n$str");
|
||||
}
|
||||
}
|
||||
fclose( $cfg );
|
||||
return( $configvals );
|
||||
fclose($cfg);
|
||||
return $configvals;
|
||||
} else {
|
||||
error_log( "WARNING: ZoneMinder configuration file found but is not readable. Check file permissions on $configFile." );
|
||||
return( false );
|
||||
error_log("WARNING: ZoneMinder configuration file found but is not readable. Check file permissions on $configFile.");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -206,6 +206,10 @@ function dbFetch($sql, $col=false) {
|
|||
}
|
||||
|
||||
function dbFetchNext($result, $col=false) {
|
||||
if ( !$result ) {
|
||||
ZM\Error("dbFetchNext called on null result.");
|
||||
return false;
|
||||
}
|
||||
if ( $dbRow = $result->fetch(PDO::FETCH_ASSOC) )
|
||||
return $col ? $dbRow[$col] : $dbRow;
|
||||
return false;
|
||||
|
|
|
@ -389,8 +389,8 @@ if ( (!ZM_OPT_USE_AUTH) or $user ) {
|
|||
<li class="Load"><i class="material-icons md-18">trending_up</i> <?php echo translate('Load') ?>: <?php echo getLoad() ?></li>
|
||||
<i class="material-icons md-18">storage</i>
|
||||
<?php
|
||||
$connections = dbFetchOne( "SHOW status WHERE variable_name='threads_connected'", 'Value' );
|
||||
$max_connections = dbFetchOne( "SHOW variables WHERE variable_name='max_connections'", 'Value' );
|
||||
$connections = dbFetchOne('SHOW status WHERE variable_name=\'threads_connected\'', 'Value');
|
||||
$max_connections = dbFetchOne('SHOW variables WHERE variable_name=\'max_connections\'', 'Value');
|
||||
$percent_used = $max_connections ? 100 * $connections / $max_connections : 100;
|
||||
echo '<li'. ( $percent_used > 90 ? ' class="warning"' : '' ).'>'.translate('DB').':'.$connections.'/'.$max_connections.'</li>';
|
||||
?>
|
||||
|
@ -398,8 +398,12 @@ if ( (!ZM_OPT_USE_AUTH) or $user ) {
|
|||
<?php
|
||||
$storage_areas = ZM\Storage::find();
|
||||
$storage_paths = null;
|
||||
$storage_areas_with_no_server_id = array();
|
||||
foreach ( $storage_areas as $area ) {
|
||||
$storage_paths[$area->Path()] = $area;
|
||||
if ( ! $area->ServerId() ) {
|
||||
$storage_areas_with_no_server_id[] = $area;
|
||||
}
|
||||
}
|
||||
$func = function($S){
|
||||
$class = '';
|
||||
|
@ -415,9 +419,9 @@ if ( (!ZM_OPT_USE_AUTH) or $user ) {
|
|||
'; };
|
||||
#$func = function($S){ return '<span title="">'.$S->Name() . ': ' . $S->disk_usage_percent().'%' . '</span>'; };
|
||||
if ( count($storage_areas) > 4 )
|
||||
$storage_areas = ZM\Storage::find( array('ServerId'=>null) );
|
||||
$storage_areas = $storage_areas_with_no_server_id;
|
||||
if ( count($storage_areas) <= 4 )
|
||||
echo implode( ', ', array_map ( $func, $storage_areas ) );
|
||||
echo implode(', ', array_map($func, $storage_areas));
|
||||
echo ' ' . ZM_PATH_MAP .': '. getDiskPercent(ZM_PATH_MAP).'%';
|
||||
?></li>
|
||||
</ul>
|
||||
|
|
|
@ -146,10 +146,12 @@ if ( openFilterWindow ) {
|
|||
|
||||
function thumbnail_onmouseover(event) {
|
||||
var img = event.target;
|
||||
img.src = '';
|
||||
img.src = img.getAttribute('stream_src');
|
||||
}
|
||||
function thumbnail_onmouseout(event) {
|
||||
var img = event.target;
|
||||
img.src = '';
|
||||
img.src = img.getAttribute('still_src');
|
||||
}
|
||||
|
||||
|
|
|
@ -35,7 +35,7 @@ monitorData[monitorData.length] = {
|
|||
'connKey': <?php echo $monitor->connKey() ?>,
|
||||
'width': <?php echo $monitor->ViewWidth() ?>,
|
||||
'height':<?php echo $monitor->ViewHeight() ?>,
|
||||
'url': '<?php echo $monitor->UrlToIndex() ?>',
|
||||
'url': '<?php echo $monitor->UrlToIndex( $monitor->Id() + ZM_MIN_STREAMING_PORT) ?>',
|
||||
'onclick': function(){createPopup( '?view=watch&mid=<?php echo $monitor->Id() ?>', 'zmWatch<?php echo $monitor->Id() ?>', 'watch', <?php echo reScale( $monitor->ViewWidth(), $monitor->PopupScale() ); ?>, <?php echo reScale( $monitor->ViewHeight(), $monitor->PopupScale() ); ?> );},
|
||||
'type': '<?php echo $monitor->Type() ?>',
|
||||
'refresh': '<?php echo $monitor->Refresh() ?>'
|
||||
|
|
|
@ -69,6 +69,7 @@ if ( !isset($newZone) ) {
|
|||
'Id' => 0,
|
||||
'Name' => translate('New'),
|
||||
'Type' => 'Active',
|
||||
'Units' => 'Pixels',
|
||||
'MonitorId' => $monitor->Id(),
|
||||
'NumCoords' => 4,
|
||||
'Coords' => sprintf('%d,%d %d,%d, %d,%d %d,%d', $minX, $minY, $maxX, $minY, $maxX, $maxY, $minX, $maxY),
|
||||
|
|
Loading…
Reference in New Issue