From 566ea942dc66ac50b59599b2993abd8c37d779cee755e32ad136a29cf95336cb Mon Sep 17 00:00:00 2001 From: AidarKC Date: Tue, 11 Aug 2026 12:49:35 +0400 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BE=D1=87=D0=B8=D0=BD=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20=D0=B2=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=20=D0=B2=D0=B8=D0=B4=D0=B5=D0=BE=20=D1=83=20=D0=BF=D1=80=D0=B8?= =?UTF-8?q?=D0=BD=D0=B8=D0=BC=D0=B0=D1=8E=D1=89=D0=B5=D0=B9=20=D1=81=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=BE=D0=BD=D1=8B?= 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 | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/VERSION.properties b/VERSION.properties index 5bdfa0ed..9e7bd58d 100644 --- a/VERSION.properties +++ b/VERSION.properties @@ -1,2 +1,2 @@ -client.version=1.5.28 +client.version=1.5.29 server.version=1.4.10 diff --git a/shine-UI/js/services/call-service.js b/shine-UI/js/services/call-service.js index 033e7cd3..a8eb7afd 100644 --- a/shine-UI/js/services/call-service.js +++ b/shine-UI/js/services/call-service.js @@ -1535,6 +1535,15 @@ function ensureReservedVideoTransceiver(call) { return created; } +function getNegotiatedVideoDirection(transceiver) { + return String(transceiver?.currentDirection || '').trim().toLowerCase(); +} + +function canLocalSideSendVideoWithCurrentNegotiation(transceiver) { + const negotiated = getNegotiatedVideoDirection(transceiver); + return negotiated === 'sendrecv' || negotiated === 'sendonly'; +} + function ensureRemoteTrackObservers(call, track) { if (!call || !track || typeof track !== 'object') return; if (!call.remoteTrackObserverIds) { @@ -2180,6 +2189,7 @@ async function applyCameraState(call) { const pc = call.pc; const hadSlotBefore = call.videoTransportMode === VIDEO_TRANSPORT_SLOT; const hadReservedBefore = call.videoTransportMode === VIDEO_TRANSPORT_RESERVED; + let requireVideoRenegotiation = false; let videoTransceiver = call.videoTransceiver || null; if (!videoTransceiver) { const transceivers = pc.getTransceivers?.() || []; @@ -2218,6 +2228,7 @@ async function applyCameraState(call) { videoTransceiver = ensureReservedVideoTransceiver(call); call.videoTransceiver = videoTransceiver; call.videoSender = videoTransceiver?.sender || call.videoSender || null; + requireVideoRenegotiation = true; } try { if (videoTransceiver && videoTransceiver.direction !== 'sendrecv') { @@ -2237,6 +2248,9 @@ async function applyCameraState(call) { } call.videoTransportMode = VIDEO_TRANSPORT_SLOT; videoTrack.enabled = true; + if (!canLocalSideSendVideoWithCurrentNegotiation(videoTransceiver)) { + requireVideoRenegotiation = true; + } } else { call.videoTransportMode = VIDEO_TRANSPORT_SLOT; const videoTrack = await ensureCameraTrack(call); @@ -2293,6 +2307,10 @@ async function applyCameraState(call) { await disableCameraTrack(call); } notifyCallState(); + if (requireVideoRenegotiation) { + await renegotiateCall(call, 'enable_video_reserved_sender'); + return true; + } if (!hadSlotBefore && !hadReservedBefore && call.videoTransportMode === VIDEO_TRANSPORT_SLOT && !refreshVideoSlotReady(call)) { await renegotiateCall(call, 'upgrade_to_video_slot'); }