From b1c1385142c338e9c79f9bf194ed8ec8448e675b Mon Sep 17 00:00:00 2001 From: steveseguin Date: Fri, 10 Jan 2025 18:09:56 -0500 Subject: [PATCH] 26.5 sync with alpha --- 360.html | 2 +- check.html | 28 +- codecs.html | 134 - colorspace.html | 408 -- comms.html | 5 +- control.html | 121 - devices.html | 66 +- draw.html | 125 - esports.html | 131 - examples/index.html | 4 + h265.html | 345 + icetest.html | 59 - iframe.html | 4 +- index.html | 211 +- ipcam.html | 925 +++ lib.js | 3738 ++++++++--- loudness.html | 247 - main.css | 295 +- main.js | 350 +- meet.html | 5 +- micsettings.html | 150 + mixer.html | 10 +- publish.html | 376 -- rawdoc.html => rawdoc.md | 12769 +++---------------------------------- recorder/index.html | 154 +- recorder/midi.html | 241 + regions.html | 94 - remotemidi.html | 2 +- speedtest.html | 5 +- teleprompter.html | 5 +- ttstest.html | 136 +- webrtc.js | 2 +- whip.html | 637 +- whiteboard.html | 1011 +++ 34 files changed, 8051 insertions(+), 14744 deletions(-) delete mode 100644 codecs.html delete mode 100644 colorspace.html delete mode 100644 control.html delete mode 100644 draw.html delete mode 100644 esports.html create mode 100644 h265.html delete mode 100644 icetest.html create mode 100644 ipcam.html delete mode 100644 loudness.html create mode 100644 micsettings.html delete mode 100644 publish.html rename rawdoc.html => rawdoc.md (62%) create mode 100644 recorder/midi.html delete mode 100644 regions.html create mode 100644 whiteboard.html diff --git a/360.html b/360.html index 14120d7..223165a 100644 --- a/360.html +++ b/360.html @@ -78,7 +78,7 @@ - + - - - \ No newline at end of file diff --git a/colorspace.html b/colorspace.html deleted file mode 100644 index b973545..0000000 --- a/colorspace.html +++ /dev/null @@ -1,408 +0,0 @@ - - - - Color Space Converter - - - -

Color Space Converter

- - - -
- - -
-
- -
- original - -
- - -
- converted - -
- - - \ No newline at end of file diff --git a/comms.html b/comms.html index 660ef30..ef598a2 100644 --- a/comms.html +++ b/comms.html @@ -1797,7 +1797,10 @@ roomname = sanitizeRoomName(roomname); var iframeContainer = document.getElementById("iframeContainer"); - iframe.allow = "autoplay;camera;microphone;fullscreen;picture-in-picture;display-capture;"; + iframe.allow = "autoplay;camera;microphone;fullscreen;picture-in-picture;display-capture;screen-wake-lock;accelerometer;midi;geolocation;gyroscope;"; + iframe.setAttribute("allowtransparency", "true"); + iframe.setAttribute("crossorigin", "anonymous"); + iframe.setAttribute("credentialless", "true"); iframe.id = "vdoninja"; if (!roomname){ diff --git a/control.html b/control.html deleted file mode 100644 index 976f36e..0000000 --- a/control.html +++ /dev/null @@ -1,121 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/devices.html b/devices.html index b8829a0..ac090f1 100644 --- a/devices.html +++ b/devices.html @@ -206,22 +206,56 @@ document.execCommand("copy"); }; - navigator.mediaDevices - .enumerateDevices() - .then((devices) => { - devices.forEach((device) => { - console.log( - `${device.kind}: ${device.label} id = ${device.deviceId}` - ); - list.push(device); - }); - prettyPrint(devices.filter(isAudioInput), "audioInputs"); - prettyPrint(devices.filter(isAudioOutput), "audioOutputs"); - prettyPrint(devices.filter(isVideoInput), "videoInputs"); - }) - .catch((err) => { - console.log(`${err.name}: ${err.message}`); - }); + async function requestPermissions() { + try { + // Request temporary audio/video access to get device labels + await navigator.mediaDevices.getUserMedia({ audio: true, video: true }) + .then(stream => { + // Stop all tracks immediately after getting permission + stream.getTracks().forEach(track => track.stop()); + }) + .catch(err => { + console.warn("Partial permission denied:", err.name); + // Still try to enumerate even with partial permission + }); + } catch (e) { + console.warn("Permission request failed:", e); + } + } + async function enumerateDevices() { + try { + const devices = await navigator.mediaDevices.enumerateDevices(); + + // If we don't have labels, request permissions and try again + if (devices.some(device => !device.label)) { + await requestPermissions(); + const devicesWithLabels = await navigator.mediaDevices.enumerateDevices(); + devices.forEach((device) => { + console.log( + `${device.kind}: ${device.label} id = ${device.deviceId}` + ); + list.push(device); + }); + prettyPrint(devicesWithLabels.filter(isAudioInput), "audioInputs"); + prettyPrint(devicesWithLabels.filter(isAudioOutput), "audioOutputs"); + prettyPrint(devicesWithLabels.filter(isVideoInput), "videoInputs"); + } else { + // We already have labels, proceed normally + devices.forEach((device) => { + console.log( + `${device.kind}: ${device.label} id = ${device.deviceId}` + ); + list.push(device); + }); + prettyPrint(devices.filter(isAudioInput), "audioInputs"); + prettyPrint(devices.filter(isAudioOutput), "audioOutputs"); + prettyPrint(devices.filter(isVideoInput), "videoInputs"); + } + } catch (err) { + console.error(`${err.name}: ${err.message}`); + } + } + enumerateDevices(); diff --git a/draw.html b/draw.html deleted file mode 100644 index a7d709d..0000000 --- a/draw.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - Screen Drawing - - - - - - - - - \ No newline at end of file diff --git a/esports.html b/esports.html deleted file mode 100644 index 5185b7b..0000000 --- a/esports.html +++ /dev/null @@ -1,131 +0,0 @@ - - - IFRAME Example - - - - - - - - -
- -
- - \ No newline at end of file diff --git a/examples/index.html b/examples/index.html index 5e3530d..e2703bc 100644 --- a/examples/index.html +++ b/examples/index.html @@ -6,6 +6,10 @@ width: fit-content; margin: 0 auto; } + + body { + position:relative!important; + } h1 { margin-top: 3em; diff --git a/h265.html b/h265.html new file mode 100644 index 0000000..2e83b06 --- /dev/null +++ b/h265.html @@ -0,0 +1,345 @@ + + + + + + WebRTC Codec Support Checker - H.265/HEVC Browser Compatibility Tool + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

H.265 (also known as HEVC or H265) is a modern and efficient video codec capable of high-efficiency video compression. Due to licensing requirements, its availability in browsers is limited, but there are ways to enable and use it.

+
+ +
+

Checking codec support...

+
+ +
+

Supported Codecs

+
+
+ + +
+

Important Compatibility Notice

+ +

While H.265/HEVC offers excellent compression efficiency, there are some important considerations:

+ +
    +
  • Not all WebRTC viewers support H.265, even if their browser technically can decode it
  • +
  • Different H.265 implementations may not be compatible with each other
  • +
  • Using H.265 in SFU (Selective Forwarding Unit) broadcasting applications is not recommended due to these compatibility issues
  • +
+ +

VDO.Ninja handles this gracefully by automatically falling back to other codecs if H.265 negotiation fails. You can specify a codec preference order using the codec parameter in your viewer link:

+ + Example: &codec=h265,av1,h264,vp8 + +

This tells VDO.Ninja to try codecs in order: first H.265, then AV1, then H.264, and finally VP8, ensuring the best available codec is used for each connection.

+
+
+ + + + \ No newline at end of file diff --git a/icetest.html b/icetest.html deleted file mode 100644 index 4bcfe06..0000000 --- a/icetest.html +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/iframe.html b/iframe.html index 6b9b335..c127a71 100644 --- a/iframe.html +++ b/iframe.html @@ -25,10 +25,12 @@ } var container = document.getElementById("container"); var iframe = newElement("iframe", { - allow: "document-domain;encrypted-media;sync-xhr;usb;web-share;cross-origin-isolated;accelerometer;midi;geolocation;autoplay;camera;microphone;fullscreen;picture-in-picture;display-capture;gyroscope;", + allow: "document-domain;encrypted-media;sync-xhr;usb;web-share;cross-origin-isolated;accelerometer;midi;geolocation;autoplay;camera;microphone;fullscreen;picture-in-picture;display-capture;accelerometer;midi;geolocation;autoplay;gyroscope;screen-wake-lock;", src: addUrlParams(iframesrc, ["cleanoutput", "transparent", "hidemenu"]) }); iframe.setAttribute("allowtransparency", "true"); + iframe.setAttribute("crossorigin", "anonymous"); + iframe.setAttribute("credentialless", "true"); var iframeExample = newElement("div", { id: exampleId, classList: "iframe-example" }); var exampleHeader = newElement("div", { classList: "example-header", innerHTML: iframesrc }); var exampleBody = newElement("div", { classList: "example-body" }); diff --git a/index.html b/index.html index 0fab40d..a104aff 100644 --- a/index.html +++ b/index.html @@ -30,6 +30,8 @@ + + VDO.Ninja @@ -37,9 +39,10 @@ + - + @@ -47,6 +50,7 @@ + @@ -76,10 +80,9 @@ - - + -
+

Create Reusable Invite

@@ -860,13 +877,14 @@ -