From 15df06a0bc7a4c4331d01eb08f9161d0379508b2478733fa5d0790aafc8bfde4 Mon Sep 17 00:00:00 2001 From: AidarKC Date: Mon, 10 Aug 2026 15:02:35 +0400 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=BF=D1=82=D0=B8=D0=BC=D0=B8=D0=B7?= =?UTF-8?q?=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D1=82=D1=8C=20=D0=B2=D0=B8=D0=B4?= =?UTF-8?q?=D0=B5=D0=BE=D0=B7=D0=B0=D0=B3=D0=BB=D1=83=D1=88=D0=BA=D1=83=20?= =?UTF-8?q?=D0=B7=D0=B2=D0=BE=D0=BD=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- VERSION.properties | 2 +- shine-UI/js/services/call-service.js | 34 ++++++++++++++++++++++++++-- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/VERSION.properties b/VERSION.properties index 0c239cdf..6e74ebe8 100644 --- a/VERSION.properties +++ b/VERSION.properties @@ -1,2 +1,2 @@ -client.version=1.5.21 +client.version=1.5.22 server.version=1.4.9 diff --git a/shine-UI/js/services/call-service.js b/shine-UI/js/services/call-service.js index df2e154c..b25dedd0 100644 --- a/shine-UI/js/services/call-service.js +++ b/shine-UI/js/services/call-service.js @@ -1668,6 +1668,7 @@ async function ensurePeerConnection(call) { call.videoSender = sender; call.videoTransceiver = (pc.getTransceivers?.() || []).find((tr) => tr?.sender === sender) || null; bindVideoSenderStream(call, sender); + await applyVideoSenderEncodingProfile(sender, 'placeholder'); } else { ensureReservedVideoTransceiver(call); } @@ -2008,8 +2009,8 @@ function ensureBlackVideoTrack(call) { return existingTrack; } const canvas = document.createElement('canvas'); - canvas.width = 640; - canvas.height = 360; + canvas.width = 160; + canvas.height = 90; const ctx = canvas.getContext('2d'); if (!ctx || typeof canvas.captureStream !== 'function') { return null; @@ -2025,6 +2026,32 @@ function ensureBlackVideoTrack(call) { return track; } +async function applyVideoSenderEncodingProfile(sender, mode = 'camera') { + if (!sender || typeof sender.getParameters !== 'function' || typeof sender.setParameters !== 'function') { + return; + } + try { + const params = sender.getParameters() || {}; + const encodings = Array.isArray(params.encodings) && params.encodings.length > 0 + ? [...params.encodings] + : [{}]; + const nextEncoding = { ...encodings[0] }; + if (mode === 'placeholder') { + nextEncoding.maxBitrate = 12000; + nextEncoding.maxFramerate = 1; + nextEncoding.scaleResolutionDownBy = 1; + nextEncoding.active = true; + } else { + delete nextEncoding.maxBitrate; + delete nextEncoding.maxFramerate; + delete nextEncoding.scaleResolutionDownBy; + nextEncoding.active = true; + } + params.encodings = [nextEncoding]; + await sender.setParameters(params); + } catch {} +} + async function disableCameraTrack(call) { const videoTrack = call?.localVideoTrack || null; if (videoTrack) { @@ -2068,10 +2095,12 @@ async function applyCameraState(call) { await videoTransceiver.sender.replaceTrack(videoTrack); call.videoSender = videoTransceiver.sender; bindVideoSenderStream(call, videoTransceiver.sender); + await applyVideoSenderEncodingProfile(videoTransceiver.sender, 'camera'); } else { const sender = pc.addTrack(videoTrack, call.localStream); call.videoSender = sender; bindVideoSenderStream(call, sender); + await applyVideoSenderEncodingProfile(sender, 'camera'); } videoTrack.enabled = true; } else { @@ -2096,6 +2125,7 @@ async function applyCameraState(call) { try { await videoTransceiver.sender.replaceTrack(blackTrack || null); } catch {} call.videoSender = videoTransceiver.sender; bindVideoSenderStream(call, videoTransceiver.sender); + await applyVideoSenderEncodingProfile(videoTransceiver.sender, 'placeholder'); } await disableCameraTrack(call); }