diff --git a/docs.html b/docs.html new file mode 100644 index 0000000..7bb66fe --- /dev/null +++ b/docs.html @@ -0,0 +1,513 @@ + + + + + + VDO.Ninja | The Swiss Army knife of low-latency live streaming + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + \ No newline at end of file diff --git a/index.html b/index.html index 34f86d0..dab028c 100644 --- a/index.html +++ b/index.html @@ -58,7 +58,7 @@ - + @@ -82,7 +82,7 @@ --> - + @@ -92,7 +92,7 @@ - + @@ -2744,7 +2749,7 @@ // session.decrypted = session.decodeInvite("U2FsdGVkX1+d58DFIHoO3EQZSuX86ch4PqW2ouztnJ0="); // get a code from invite.cam - - + + diff --git a/lib.js b/lib.js index 160a583..1c540d1 100644 --- a/lib.js +++ b/lib.js @@ -3929,6 +3929,7 @@ function createRichVideoElement(UUID){ // this function is used to check and gen if (session.rpcs[UUID].rotate !== false){ session.rpcs[UUID].videoElement.rotated = session.rpcs[UUID].rotate; + session.rpcs[UUID].videoElement.dataset.rotated = session.rpcs[UUID].rotate; } session.rpcs[UUID].videoElement.addEventListener("playing", (e)=>{ @@ -4468,6 +4469,12 @@ function updateMixerRun(e=false){ // this is the main auto-mixing code. It's a } } + var delayedRequestList = {}; + + function delayedRequestRate(bandwidth, UUID, optimizeAudio=false, lock=null){ + delayedRequestList[UUID] = [bandwidth,UUID,optimizeAudio,lock]; + } + if (soloVideo && (soloVideo in session.rpcs)){ // remote guest being full screened; infocus == UUID mediaPool = []; // remove myself from fullscreen @@ -4494,15 +4501,15 @@ function updateMixerRun(e=false){ // this is the main auto-mixing code. It's a if (document.pictureInPictureElement && document.pictureInPictureElement.id && (document.pictureInPictureElement.id == session.rpcs[j].videoElement.id)){ var bitratePIP = parseInt(session.zoomedBitrate/4); //warnUser("GOOD"); - session.requestRateLimit(bitratePIP, j); + delayedRequestRate(bitratePIP, j); } else { - session.requestRateLimit(0, j); // disable the video of non-fullscreen videos + delayedRequestRate(0, j); // disable the video of non-fullscreen videos } if (session.rpcs[j].videoElement.srcObject && session.rpcs[j].videoElement.srcObject.getAudioTracks().length){ // mediaPool_invisible.push(session.rpcs[j].videoElement); } } else if (session.rpcs[j].videoElement){ - session.requestRateLimit(0, j, true); // disable the video of non-fullscreen videos + delayedRequestRate(0, j, true); // disable the video of non-fullscreen videos } } catch(e){errorlog(e);} } else { // remote guest is in-focus video @@ -4512,7 +4519,7 @@ function updateMixerRun(e=false){ // this is the main auto-mixing code. It's a if (session.rpcs[j].videoElement && (session.rpcs[j].videoElement.srcObject.getAudioTracks().length)){ //mediaPool_invisible.push(session.rpcs[j].videoElement); } - session.requestRateLimit(0, j); + delayedRequestRate(0, j); mediaPool.push(session.rpcs[j].iframeEle); continue; } else if (session.rpcs[j].videoElement){ @@ -4525,7 +4532,7 @@ function updateMixerRun(e=false){ // this is the main auto-mixing code. It's a /////////// //if (session.activeSpeaker && (!session.rpcs[j].defaultSpeaker)){ // not the active speaker //mediaPool_invisible.push(session.rpcs[j].videoElement); - // session.requestRateLimit(0, j); // keep audio good, but disable video + // delayedRequestRate(0, j); // keep audio good, but disable video //} else { var totalRoomBitrate = session.totalRoomBitrate; @@ -4540,7 +4547,7 @@ function updateMixerRun(e=false){ // this is the main auto-mixing code. It's a mediaPool.push(session.rpcs[j].videoElement); // active speaker session.rpcs[j].videoElement.style.visibility = "visible"; //if ((session.rpcs[j].targetBandwidth!==-1) && (session.rpcs[j].targetBandwidth