diff options
-rw-r--r-- | PKGBUILD | 2 | ||||
-rw-r--r-- | web/kvm/index.html | 15 | ||||
-rw-r--r-- | web/kvm/navbar-system.pug | 12 | ||||
-rw-r--r-- | web/share/js/kvm/stream.js | 18 | ||||
-rw-r--r-- | web/share/js/kvm/stream_janus.js | 10 | ||||
-rw-r--r-- | web/share/js/tools.js | 3 |
6 files changed, 55 insertions, 5 deletions
@@ -91,7 +91,7 @@ depends=( certbot platform-io-access raspberrypi-utils - "ustreamer>=6.1" + "ustreamer>=6.4" # Systemd UDEV bug "systemd>=248.3-2" diff --git a/web/kvm/index.html b/web/kvm/index.html index 08062ffe..61d5e3dc 100644 --- a/web/kvm/index.html +++ b/web/kvm/index.html @@ -227,6 +227,21 @@ </div> </td> </tr> + <tr class="feature-disabled" id="stream-orient"> + <td>Orientation:</td> + <td> + <div class="radio-box"> + <input checked type="radio" id="stream-orient-radio-0" name="stream-orient-radio" value="0"> + <label for="stream-orient-radio-0">Default</label> + <input type="radio" id="stream-orient-radio-90" name="stream-orient-radio" value="90"> + <label for="stream-orient-radio-90">90°</label> + <input type="radio" id="stream-orient-radio-180" name="stream-orient-radio" value="180"> + <label for="stream-orient-radio-180">180°</label> + <input type="radio" id="stream-orient-radio-270" name="stream-orient-radio" value="270"> + <label for="stream-orient-radio-270">270°</label> + </div> + </td> + </tr> <tr class="feature-disabled" id="stream-audio"> <td>Audio volume:</td> <td class="value-slider"> diff --git a/web/kvm/navbar-system.pug b/web/kvm/navbar-system.pug index c30ea884..85cf6b24 100644 --- a/web/kvm/navbar-system.pug +++ b/web/kvm/navbar-system.pug @@ -50,6 +50,18 @@ li(id="system-dropdown" class="right") label(for="stream-mode-radio-mjpeg") MJPEG / HTTP input(type="radio" id="stream-mode-radio-janus" name="stream-mode-radio" value="janus") label(for="stream-mode-radio-janus") H.264 / WebRTC + tr(id="stream-orient" class="feature-disabled") + td Orientation: + td + div(class="radio-box") + input(checked type="radio" id="stream-orient-radio-0" name="stream-orient-radio" value="0") + label(for="stream-orient-radio-0") Default + input(type="radio" id="stream-orient-radio-90" name="stream-orient-radio" value="90") + label(for="stream-orient-radio-90") 90° + input(type="radio" id="stream-orient-radio-180" name="stream-orient-radio" value="180") + label(for="stream-orient-radio-180") 180° + input(type="radio" id="stream-orient-radio-270" name="stream-orient-radio" value="270") + label(for="stream-orient-radio-270") 270° tr(id="stream-audio", class="feature-disabled") td Audio volume: td(class="value-slider") #[input(type="range" id="stream-audio-volume-slider" class="slider")] diff --git a/web/share/js/kvm/stream.js b/web/share/js/kvm/stream.js index 9ae4565c..a5a13294 100644 --- a/web/share/js/kvm/stream.js +++ b/web/share/js/kvm/stream.js @@ -70,6 +70,19 @@ export function Streamer() { tools.radio.setOnClick("stream-mode-radio", __clickModeRadio, false); + // Not getInt() because of radio is a string container. + // Also don't reset Janus at class init. + tools.radio.clickValue("stream-orient-radio", tools.storage.get("stream.orient", 0)); + tools.radio.setOnClick("stream-orient-radio", function() { + if (__streamer.getMode() === "janus") { // Right now it's working only for H.264 + let orient = parseInt(tools.radio.getValue("stream-orient-radio")); + tools.storage.setInt("stream.orient", orient); + if (__streamer.getOrientation() != orient) { + __resetStream(); + } + } + }, false); + tools.slider.setParams($("stream-audio-volume-slider"), 0, 100, 1, 0, function(value) { $("stream-video").muted = !value; $("stream-video").volume = value / 100; @@ -248,9 +261,12 @@ export function Streamer() { } __streamer.stopStream(); if (mode === "janus") { - __streamer = new JanusStreamer(__setActive, __setInactive, __setInfo, !$("stream-video").muted); + __streamer = new JanusStreamer(__setActive, __setInactive, __setInfo, + tools.storage.getInt("stream.orient", 0), !$("stream-video").muted); + tools.feature.setEnabled($("stream-orient"), true); } else { // mjpeg __streamer = new MjpegStreamer(__setActive, __setInactive, __setInfo); + tools.feature.setEnabled($("stream-orient"), false); tools.feature.setEnabled($("stream-audio"), false); // Enabling in stream_janus.js } if (wm.isWindowVisible($("stream-window"))) { diff --git a/web/share/js/kvm/stream_janus.js b/web/share/js/kvm/stream_janus.js index eff7b18b..8cc7744f 100644 --- a/web/share/js/kvm/stream_janus.js +++ b/web/share/js/kvm/stream_janus.js @@ -29,7 +29,7 @@ import {tools, $} from "../tools.js"; var _Janus = null; -export function JanusStreamer(__setActive, __setInactive, __setInfo, __allow_audio) { +export function JanusStreamer(__setActive, __setInactive, __setInfo, __orient, __allow_audio) { var self = this; var __stop = false; @@ -45,6 +45,7 @@ export function JanusStreamer(__setActive, __setInactive, __setInfo, __allow_aud var __state = null; var __frames = 0; + self.getOrientation = () => __orient; self.isAudioAllowed = () => __allow_audio; self.getName = () => (__allow_audio ? "H.264 + Audio" : "H.264"); @@ -329,9 +330,12 @@ export function JanusStreamer(__setActive, __setInactive, __setInfo, __allow_aud var __sendWatch = function() { if (__handle) { - __logInfo(`Sending WATCH(audio=${__allow_audio}) + FEATURES ...`); + __logInfo(`Sending WATCH(orient=${__orient}, audio=${__allow_audio}) + FEATURES ...`); __handle.send({"message": {"request": "features"}}); - __handle.send({"message": {"request": "watch", "params": {"audio": __allow_audio}}}); + __handle.send({"message": {"request": "watch", "params": { + "orientation": __orient, + "audio": __allow_audio, + }}}); } }; diff --git a/web/share/js/tools.js b/web/share/js/tools.js index ef21b69f..12291e48 100644 --- a/web/share/js/tools.js +++ b/web/share/js/tools.js @@ -392,6 +392,9 @@ export var tools = new function() { }, "set": (key, value) => window.localStorage.setItem(key, value), + "getInt": (key, default_value) => parseInt(self.storage.get(key, default_value)), + "setInt": (key, value) => self.storage.set(key, value), + "getBool": (key, default_value) => !!parseInt(self.storage.get(key, (default_value ? "1" : "0"))), "setBool": (key, value) => self.storage.set(key, (value ? "1" : "0")), |