Skip to content

Commit 5982229

Browse files
Merge remote-tracking branch 'upstream/master' into ai_server
2 parents 67f9801 + d199ce9 commit 5982229

File tree

14 files changed

+137
-44
lines changed

14 files changed

+137
-44
lines changed

db/zm_create.sql.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -517,6 +517,7 @@ CREATE TABLE `Monitors` (
517517
`Decoding` enum('None','Ondemand','KeyFrames','KeyFrames+Ondemand', 'Always') NOT NULL default 'Always',
518518
`RTSP2WebEnabled` BOOLEAN NOT NULL default false,
519519
`RTSP2WebType` enum('HLS','MSE','WebRTC') NOT NULL default 'WebRTC',
520+
`DefaultPlayer` VARCHAR(64),
520521
`RTSP2WebStream` enum('Primary','Secondary') NOT NULL DEFAULT 'Primary',
521522
`Go2RTCEnabled` BOOLEAN NOT NULL default false,
522523
`JanusEnabled` BOOLEAN NOT NULL default false,

db/zm_update-1.37.71.sql

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
SELECT 'Checking for DefaultPlayer in Monitors';
2+
SET @s = (SELECT IF(
3+
(SELECT COUNT(*)
4+
FROM INFORMATION_SCHEMA.COLUMNS
5+
WHERE table_name = 'Monitors'
6+
AND table_schema = DATABASE()
7+
AND column_name = 'DefaultPlayer'
8+
) > 0,
9+
"SELECT 'Column DefaultPlayer already exists in Monitors'",
10+
"ALTER TABLE `Monitors` ADD COLUMN `DefaultPlayer` varchar(64) AFTER `RTSP2WebType`"
11+
));
12+
PREPARE stmt FROM @s;
13+
EXECUTE stmt;
14+
15+
UPDATE Monitors SET DefaultPlayer='rtsp2web_webrtc' WHERE RTSP2WebType='RTC' and DefaultPlayer IS NULL;
16+
UPDATE Monitors SET DefaultPlayer='rtsp2web_mse' WHERE RTSP2WebType='MSE' and DefaultPlayer IS NULL;
17+
UPDATE Monitors SET DefaultPlayer='rtsp2web_hls' WHERE RTSP2WebType='HLS' and DefaultPlayer IS NULL;
18+
UPDATE Monitors SET DefaultPlayer='' WHERE DefaultPlayer IS NULL;
19+

distros/redhat/zoneminder.spec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
%global zmtargetdistro %{?rhel:el%{rhel}}%{!?rhel:fc%{fedora}}
2121

2222
Name: zoneminder
23-
Version: 1.37.70
23+
Version: 1.37.71
2424
Release: 1%{?dist}
2525
Summary: A camera monitoring and analysis tool
2626
Group: System Environment/Daemons

src/zms.cpp

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -146,10 +146,21 @@ int main(int argc, const char *argv[], char **envp) {
146146
source = ZMS_MONITOR;
147147
}
148148
} else if ( !strcmp(name, "mode") ) {
149-
mode = !strcmp(value, "jpeg")?ZMS_JPEG:ZMS_MPEG;
150-
mode = !strcmp(value, "raw")?ZMS_RAW:mode;
151-
mode = !strcmp(value, "zip")?ZMS_ZIP:mode;
152-
mode = !strcmp(value, "single")?ZMS_SINGLE:mode;
149+
if (!strcmp(value, "jpeg")) {
150+
mode = ZMS_JPEG;
151+
} else if (!strcmp(value, "single")) {
152+
mode = ZMS_SINGLE;
153+
} else if (!strcmp(value, "raw")) {
154+
mode = ZMS_RAW;
155+
} else if (!strcmp(value, "zip")) {
156+
mode = ZMS_ZIP;
157+
} else if (!strcmp(value, "mpeg")) {
158+
mode = ZMS_MPEG;
159+
} else if (!strcmp(value, "paused")) {
160+
mode = ZMS_JPEG;
161+
} else {
162+
Error("Unsupported value for mode");
163+
}
153164
} else if ( !strcmp(name, "format") ) {
154165
strncpy(format, value, sizeof(format)-1);
155166
} else if ( !strcmp(name, "monitor") ) {

version.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.37.70
1+
1.37.71

web/includes/Monitor.php

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ public static function getRTSP2WebStreamOptions() {
232232
'Enabled' => array('type'=>'boolean','default'=>1),
233233
'Decoding' => 'Always',
234234
'RTSP2WebEnabled' => array('type'=>'integer','default'=>0),
235-
'RTSP2WebType' => 'HLS',
235+
'DefaultPlayer' => '',
236236
'RTSP2WebStream' => 'Primary',
237237
'Go2RTCEnabled' => array('type'=>'integer','default'=>0),
238238
'JanusEnabled' => array('type'=>'boolean','default'=>0),
@@ -1156,6 +1156,8 @@ class="monitorStream imageFeed"
11561156
</div>
11571157
<div class="zoompan">';
11581158

1159+
$player = isset($options['player']) ? $options['player'] : $this->DefaultPlayer();
1160+
11591161
if ($this->Type() == 'WebSite') {
11601162
$html .= getWebSiteUrl(
11611163
'liveStream'.$this->Id(), $this->Path(),
@@ -1173,6 +1175,20 @@ class="monitorStream imageFeed"
11731175
'format' => ZM_MPEG_LIVE_FORMAT
11741176
) );
11751177
$html .= getVideoStreamHTML( 'liveStream'.$this->Id(), $streamSrc, $options['width'], $options['height'], ZM_MPEG_LIVE_FORMAT, $this->Name() );
1178+
} else if ($player == 'zms') {
1179+
if ( $options['mode'] == 'stream' and canStream() ) {
1180+
$options['mode'] = 'jpeg';
1181+
$streamSrc = $this->getStreamSrc($options);
1182+
$html .= getImageStreamHTML('liveStream'.$this->Id(), $streamSrc, $options['width'], $options['height'], $this->Name());
1183+
} else if ( $options['mode'] == 'single' and canStream() ) {
1184+
$streamSrc = $this->getStreamSrc($options);
1185+
$html .= getImageStreamHTML('liveStream'.$this->Id(), $streamSrc, $options['width'], $options['height'], $this->Name());
1186+
} else if ( $options['mode'] == 'paused' and canStream() ) {
1187+
$streamSrc = $this->getStreamSrc($options);
1188+
$html .= getImageStreamHTML('liveStream'.$this->Id(), $streamSrc, $options['width'], $options['height'], $this->Name());
1189+
} else {
1190+
Debug("What mode or canStream? ".$options['mode']." ".canStream());
1191+
}
11761192
} else if ($this->JanusEnabled() or ($this->RTSP2WebEnabled() and ZM_RTSP2WEB_PATH) or ($this->Go2RTCEnabled() and ZM_GO2RTC_PATH)) {
11771193
$html .= '<video id="liveStream'.$this->Id().'" '.
11781194
((isset($options['width']) and $options['width'] and $options['width'] != '0')?'width="'.$options['width'].'"':'').

web/js/MonitorStream.js

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ function MonitorStream(monitorData) {
1313
this.width = monitorData.width;
1414
this.height = monitorData.height;
1515
this.RTSP2WebEnabled = monitorData.RTSP2WebEnabled;
16-
this.RTSP2WebType = monitorData.RTSP2WebType;
16+
this.RTSP2WebType = null;
1717
this.RTSP2WebStream = monitorData.RTSP2WebStream;
1818
this.Go2RTCEnabled = monitorData.Go2RTCEnabled;
1919
this.Go2RTCMSEBufferCleared = true;
@@ -83,7 +83,7 @@ function MonitorStream(monitorData) {
8383
}
8484
};
8585

86-
this.player = '';
86+
this.player = monitorData.DefaultPlayer;
8787
this.activePlayer = ''; // Variants: go2rtc, janus, rtsp2web_hls, rtsp2web_mse, rtsp2web_webrtc, zms. Relevant for this.player = ''/Auto
8888
this.setPlayer = function(p) {
8989
if (-1 != p.indexOf('go2rtc')) {
@@ -438,7 +438,7 @@ function MonitorStream(monitorData) {
438438
rtsp2webModUrl.password = '';
439439
//.urlParts.length > 1 ? urlParts[1] : urlParts[0]; // drop the username and password for viewing
440440
this.currentChannelStream = (streamChannel == 'default') ? ((this.RTSP2WebStream == 'Secondary') ? 1 : 0) : streamChannel;
441-
if (this.RTSP2WebType == 'HLS') {
441+
if (-1 !== this.player.indexOf('hls')) {
442442
const hlsUrl = rtsp2webModUrl;
443443
hlsUrl.pathname = "/stream/" + this.id + "/channel/" + this.currentChannelStream + "/hls/live/index.m3u8";
444444
/*
@@ -456,14 +456,14 @@ function MonitorStream(monitorData) {
456456
stream.src = hlsUrl.href;
457457
}
458458
this.activePlayer = 'rtsp2web_hls';
459-
} else if (this.RTSP2WebType == 'MSE') {
459+
} else if (-1 !== this.player.indexOf('mse')) {
460460
const mseUrl = rtsp2webModUrl;
461461
mseUrl.protocol = useSSL ? 'wss' : 'ws';
462462
mseUrl.pathname = "/stream/" + this.id + "/channel/" + this.currentChannelStream + "/mse";
463463
mseUrl.search = "uuid=" + this.id + "&channel=" + this.currentChannelStream + "";
464464
startMsePlay(this, stream, mseUrl.href);
465465
this.activePlayer = 'rtsp2web_mse';
466-
} else if (this.RTSP2WebType == 'WebRTC') {
466+
} else if (-1 !== this.player.indexOf('webrtc')) {
467467
const webrtcUrl = rtsp2webModUrl;
468468
webrtcUrl.pathname = "/stream/" + this.id + "/channel/" + this.currentChannelStream + "/webrtc";
469469
startRTSP2WebPlay(stream, webrtcUrl.href, this);
@@ -473,7 +473,7 @@ function MonitorStream(monitorData) {
473473
this.statusCmdTimer = setInterval(this.statusCmdQuery.bind(this), statusRefreshTimeout);
474474
this.started = true;
475475
this.streamListenerBind();
476-
this.updateStreamInfo('RTSP2Web ' + this.RTSP2WebType);
476+
this.updateStreamInfo(players ? players[this.player] : 'RTSP2Web ' + this.RTSP2WebType);
477477
return;
478478
} else {
479479
console.log("ZM_RTSP2WEB_PATH is empty. Go to Options->System and set ZM_RTSP2WEB_PATH accordingly.");
@@ -574,7 +574,7 @@ function MonitorStream(monitorData) {
574574
this.hls.destroy();
575575
this.hls = null;
576576
}
577-
if (this.RTSP2WebType == 'MSE') {
577+
if (-1 !== this.activePlayer.indexOf('mse')) {
578578
this.stopMse();
579579
}
580580
} else if (-1 !== this.activePlayer.indexOf('janus')) {
@@ -1259,7 +1259,7 @@ function MonitorStream(monitorData) {
12591259
if (this.Go2RTCEnabled && ((!this.player) || (-1 !== this.player.indexOf('go2rtc')))) {
12601260
} else if (this.RTSP2WebEnabled && ((!this.player) || (-1 !== this.player.indexOf('rtsp2web')))) {
12611261
// We correct the lag from real time. Relevant for long viewing and network problems.
1262-
if (this.RTSP2WebType == 'MSE') {
1262+
if (-1 !== this.activePlayer.indexOf('mse')) {
12631263
const videoEl = document.getElementById("liveStream" + this.id);
12641264
if (this.wsMSE && videoEl.buffered != undefined && videoEl.buffered.length > 0) {
12651265
const videoElCurrentTime = videoEl.currentTime; // Current time of playback
@@ -1295,7 +1295,7 @@ function MonitorStream(monitorData) {
12951295
console.warn(`UNSCHEDULED CLOSE SOCKET for camera ID=${this.id}`);
12961296
this.restart(this.currentChannelStream);
12971297
}
1298-
} else if (this.RTSP2WebType == 'WebRTC') {
1298+
} else if (-1 !== this.player.indexOf('webrtc')) {
12991299
if ((!this.webrtc || (this.webrtc && this.webrtc.connectionState != "connected")) && this.started) {
13001300
console.warn(`UNSCHEDULED CLOSE WebRTC for camera ID=${this.id}`);
13011301
this.restart(this.currentChannelStream);

web/skins/classic/views/js/monitor.js

Lines changed: 37 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -340,6 +340,7 @@ function initPage() {
340340

341341
const janusEnabled = form.elements['newMonitor[JanusEnabled]'];
342342
if (janusEnabled) {
343+
janusEnabled.onclick = update_players;
343344
if (janusEnabled.checked) {
344345
document.getElementById("FunctionJanusAudioEnabled").hidden = false;
345346
document.getElementById("FunctionJanusProfileOverride").hidden = false;
@@ -375,19 +376,16 @@ function initPage() {
375376
//Manage the RTSP2Web settings div
376377
const RTSP2WebEnabled = form.elements['newMonitor[RTSP2WebEnabled]'];
377378
const Go2RTCEnabled = form.elements['newMonitor[Go2RTCEnabled]'];
379+
if (Go2RTCEnabled) Go2RTCEnabled.onclick = update_players;
380+
if (RTSP2WebEnabled) RTSP2WebEnabled.onclick = update_players;
381+
378382
if (RTSP2WebEnabled || Go2RTCEnabled) {
379383
if (Go2RTCEnabled.checked || RTSP2WebEnabled.checked) {
380384
document.getElementById("RTSP2WebStream").hidden = false;
381385
} else {
382386
document.getElementById("RTSP2WebStream").hidden = true;
383387
}
384388

385-
if (RTSP2WebEnabled.checked) {
386-
document.getElementById("RTSP2WebType").hidden = false;
387-
} else {
388-
document.getElementById("RTSP2WebType").hidden = true;
389-
}
390-
391389
Go2RTCEnabled.addEventListener('change', function() {
392390
if (this.checked || RTSP2WebEnabled.checked) {
393391
document.getElementById("RTSP2WebStream").hidden = false;
@@ -402,14 +400,9 @@ function initPage() {
402400
} else {
403401
document.getElementById("RTSP2WebStream").hidden = true;
404402
}
405-
406-
if (this.checked) {
407-
document.getElementById("RTSP2WebType").hidden = false;
408-
} else {
409-
document.getElementById("RTSP2WebType").hidden = true;
410-
}
411403
});
412404
}
405+
update_players();
413406

414407
const monitorPath = document.getElementsByName("newMonitor[Path]")[0];
415408
if (monitorPath) {
@@ -698,6 +691,38 @@ function SecondPath_onChange(e) {
698691
}
699692
}
700693

694+
function update_players() {
695+
const dropdown = $j('[name="newMonitor[DefaultPlayer]"]');
696+
if (!dropdown.length) {
697+
console.log("No element found for DefaultPlayer");
698+
return;
699+
}
700+
const form = dropdown[0].form;
701+
const selected_value = dropdown.val() || '';
702+
const go2rtc_enabled = form.elements['newMonitor[Go2RTCEnabled]'] && form.elements['newMonitor[Go2RTCEnabled]'].checked;
703+
const rtsp2web_enabled = form.elements['newMonitor[RTSP2WebEnabled]'] && form.elements['newMonitor[RTSP2WebEnabled]'].checked;
704+
const janus_enabled = form.elements['newMonitor[JanusEnabled]'] && form.elements['newMonitor[JanusEnabled]'].checked;
705+
706+
dropdown.empty();
707+
$j.each(players, function(key, entry) {
708+
if (
709+
((-1 != key.indexOf('go2rtc')) && !go2rtc_enabled)
710+
||
711+
((-1 != key.indexOf('rtsp2web')) && !rtsp2web_enabled)
712+
||
713+
((-1 != key.indexOf('janus')) && !janus_enabled)
714+
) {
715+
console.log("not adding ", key, go2rtc_enabled, rtsp2web_enabled, janus_enabled);
716+
} else {
717+
dropdown.append($j('<option></option>').attr('value', key).text(entry));
718+
}
719+
});
720+
//dropdown.chosen("destroy");
721+
//dropdown.chosen();
722+
dropdown.val(selected_value);
723+
if (dropdown[0].selectedIndex==-1) dropdown[0].selectedIndex = 0;
724+
}
725+
701726
function populate_models(ManufacturerId) {
702727
const dropdown = $j('[name="newMonitor[ModelId]"]');
703728
if (!dropdown.length) {

web/skins/classic/views/js/monitor.js.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
const messageSavingDataWhenLeavingPage = '<?php echo translate('MessageSavingDataWhenLeavingPage') ?>';
44

55
<?php
6+
global $players;
7+
echo 'players = '.json_encode($players).PHP_EOL;
68
if (ZM_OPT_CONTROL and canView('Control')) {
79
?>
810
const controlOptions = new Object();

web/skins/classic/views/js/montage.js

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1095,11 +1095,14 @@ function checkEndMonitorsPlaced() {
10951095

10961096
if (!movableMonitorData[id].stop) {
10971097
//Monitor is still moving
1098-
const objWidth = document.getElementById('liveStream'+monitors[i].id).clientWidth;
1099-
if (objWidth == movableMonitorData[id].width && objWidth !=0 ) {
1100-
movableMonitorData[id].stop = true; //The size does not change, which means it’s already in its place!
1101-
} else {
1102-
movableMonitorData[id].width = objWidth;
1098+
const stream = document.getElementById('liveStream'+monitors[i].id);
1099+
if (stream) {
1100+
const objWidth = stream.clientWidth;
1101+
if (objWidth == movableMonitorData[id].width && objWidth !=0 ) {
1102+
movableMonitorData[id].stop = true; //The size does not change, which means it’s already in its place!
1103+
} else {
1104+
movableMonitorData[id].width = objWidth;
1105+
}
11031106
}
11041107
}
11051108
}

0 commit comments

Comments
 (0)