Починить включение видео у принимающей стороны

This commit is contained in:
AidarKC
2026-08-11 12:49:35 +04:00
parent e047c2d54e
commit 566ea942dc
2 changed files with 19 additions and 1 deletions
+1 -1
View File
@@ -1,2 +1,2 @@
client.version=1.5.28
client.version=1.5.29
server.version=1.4.10
+18
View File
@@ -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');
}