2019-08-21 16:10:35 +02:00
|
|
|
$(document).ready( function() {
|
|
|
|
|
|
|
|
// check if browser supports streaming
|
|
|
|
if(window.navigator.mediaDevices && window.navigator.mediaDevices.getDisplayMedia){
|
add Hue EntertainmentAPI + Forwarder & other Fixes (#592)
* whitespaces + typo fixes
* JS / LGTM fixes
* SSDP Handler crash fix
* MessageForwarder handlePriorityChanges Slave fixes
* use aboutToQuit Signal
* complete rewriten Hue Entertainment API structure
combined Philips Hue and Entertainment API
with new MbedTLS based SSL UDP Provider
* add required cross-compile submodules
* logical rebuild fn: initLeds, setLights + new logs
-more detailed checks and error handling inside iniLeds and setLights
- logical script procedure before ProviderUdpSSL init
- first steps for multiple ProviderUdpSSL usage
- better fallback support to old RestAPI, if entertainment api is not supported
- just 4 u LordGrey: new log fn for cosmetic config outputs ;)
* add OSX CompileHowTo - undo from CrossCompileHowTo
* whitespace fixes
* lightID toString fix
* fix unsigned int E-API + debug output
* bugfixes, reworked black signal detection, wizard:
- change device config field light-ids from int to string -> real unsigned int fix
- add signal detection brightness minimum threshold value
0.0 for 0% brightness - 1.0 for 100% brightness to count for blacklight signal detection
reason: input may not 100% black, like mine - i have a deep dark gray input signal
-> my threshold value is set to 0.005 for 0.5% minimum brightness = 1 (from max 255) to count as black
- wizard optimations, with fallback without entertainment support (beta state)
- whitespace fixes
* cleanup + minor fixes
* change fixed Hue UPD SSL config to _devConfig paras
* Hotfix SSL Connection, new light models, wizard:
- Fix UPD SSL Connection failed Problems
- add new supported gamut C light models: LCG002, LCA001, LCA002, LCA003
- wizard: extend fallback support to classic mode + hints
* whitespace, typo fix
* uncheck useEntertainmentAPI, if noAPISupport detected + hint
* coredump fix -> add _blackLightsTimer nullptr init
* code cleanup / remove old debugs + whitespacefixes
* add gamut C LCP001, LCP002
* SSL UDP config made more flexible + remove qDebug
-> switch to hyerion.ng _log
-> replace logCommand with verbose
-> code cleanups etc...
* extended mbedtls debugging infos
* add adjustable ssl timeout settings
* error handling
* streamdebugger bugfixes
* UPDSSL psk / psk_identity bugfixes! + hue wizard fn typo fix +
- verbose option available without dependencies
- whitespace fixes
* Philips Hue Assistant now recognizes non-original bridges better...
+ Added note if no clientkey is set when using the entertainment API
+ User creation (+ clientkey) for non-original bridges can now also be used
+ Minor changes and bug fixes
* CMAKE mbedTLS detection
* minor bug fixes + code cleanups
* FindMbedTLS.cmake remove Path-Hints + wizard.js: ajax timeout handling
Test - content_grabber.js: run relevant code only, if V4L2_AVAIL is true:
conf_grabber don't displays other devices, if V4L2 is not available
* compile mbedtls via cmake as static lib
* remove libmbedtls-dev from compileHowto / scripts
* Fix Windows build
* Fix windows build (part 2)
* removed unnecessary osx x11 include directory path
* QTimer Shutdown bugfix
* cmake win32 fix + minor bugfixes
* cmake debug msg used mbedtls libs
* Bugfix: noSignalDetection wasn't switchedOn again
if no signal was previously detected
* Some code fixes based on alerts from lgtm.com
Co-authored-by: Paulchen Panther <16664240+Paulchen-Panther@users.noreply.github.com>
2020-05-22 19:40:50 +02:00
|
|
|
$("#btn_streamer").toggle();
|
2019-08-21 16:10:35 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
// variables
|
|
|
|
var streamActive = false;
|
|
|
|
var screenshotTimer = "";
|
|
|
|
var screenshotIntervalTimeMs = 100;
|
|
|
|
var streamImageHeight = 0;
|
|
|
|
var streamImageWidth = 0;
|
|
|
|
const videoElem = document.getElementById("streamvideo");
|
|
|
|
const canvasElem = document.getElementById("streamcanvas");
|
|
|
|
|
|
|
|
// Options for getDisplayMedia()
|
|
|
|
var displayMediaOptions = {
|
|
|
|
video: {
|
|
|
|
cursor: "never",
|
|
|
|
width: 170,
|
|
|
|
height: 100,
|
|
|
|
frameRate: 15
|
|
|
|
},
|
|
|
|
audio: false
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
async function startCapture() {
|
|
|
|
streamActive = true;
|
|
|
|
|
|
|
|
try {
|
|
|
|
var stream = await navigator.mediaDevices.getDisplayMedia(displayMediaOptions);
|
|
|
|
videoElem.srcObject = stream;
|
|
|
|
|
|
|
|
// get the active track of the stream
|
|
|
|
const track = stream.getVideoTracks()[0];
|
|
|
|
|
|
|
|
// listen for track ending, fires when user aborts through browser
|
|
|
|
track.onended = function(event) {
|
|
|
|
stopCapture();
|
|
|
|
};
|
|
|
|
|
|
|
|
// wait for video ready
|
|
|
|
videoElem.addEventListener('loadedmetadata', (e) => {
|
|
|
|
window.setTimeout(() => (
|
|
|
|
onCapabilitiesReady(track.getSettings())
|
|
|
|
), 500);
|
|
|
|
});
|
|
|
|
} catch(err) {
|
|
|
|
stopCapture();
|
|
|
|
console.error("Error: " + err);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function onCapabilitiesReady(settings) {
|
|
|
|
// extract real width/height
|
|
|
|
streamImageWidth = settings.width;
|
|
|
|
streamImageHeight = settings.height;
|
|
|
|
|
|
|
|
// start screenshotTimer
|
|
|
|
updateScrTimer(false);
|
|
|
|
|
|
|
|
// we are sending
|
|
|
|
$("#btn_streamer_icon").addClass("text-danger");
|
|
|
|
}
|
|
|
|
|
|
|
|
function stopCapture(evt) {
|
|
|
|
streamActive = false;
|
|
|
|
$("#btn_streamer_icon").removeClass("text-danger");
|
|
|
|
|
|
|
|
updateScrTimer(true);
|
|
|
|
// sometimes it's null on abort
|
|
|
|
if(videoElem.srcObject){
|
|
|
|
let tracks = videoElem.srcObject.getTracks();
|
|
|
|
|
|
|
|
tracks.forEach(track => track.stop());
|
|
|
|
videoElem.srcObject = null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function takePicture(){
|
|
|
|
var context = canvasElem.getContext('2d');
|
|
|
|
canvasElem.width = streamImageWidth;
|
|
|
|
canvasElem.height = streamImageHeight;
|
|
|
|
context.drawImage(videoElem, 0, 0, streamImageWidth, streamImageHeight);
|
|
|
|
|
|
|
|
var data = canvasElem.toDataURL('image/png').split(",")[1];
|
|
|
|
requestSetImage(data, 2, "Streaming");
|
|
|
|
}
|
|
|
|
|
|
|
|
// start or update screenshot timer
|
|
|
|
function updateScrTimer(stop){
|
|
|
|
clearInterval(screenshotTimer)
|
|
|
|
|
|
|
|
if(stop === false){
|
|
|
|
screenshotTimer = setInterval(() => (
|
|
|
|
takePicture()
|
|
|
|
), screenshotIntervalTimeMs);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
$("#btn_streamer").off().on("click",function(e){
|
|
|
|
if(!$("#btn_streamer_icon").hasClass("text-danger") && !streamActive){
|
|
|
|
startCapture();
|
|
|
|
} else {
|
|
|
|
stopCapture();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
});
|