SHA256
Вернуть стабильный flow видеозвонка
This commit is contained in:
+1
-1
@@ -1,2 +1,2 @@
|
|||||||
client.version=1.5.25
|
client.version=1.5.26
|
||||||
server.version=1.4.10
|
server.version=1.4.10
|
||||||
|
|||||||
@@ -1333,6 +1333,12 @@ async function finalizeCall(call, {
|
|||||||
&& Boolean(call.remoteSessionId)
|
&& Boolean(call.remoteSessionId)
|
||||||
&& String(localReasonCode || '') !== 'completed'
|
&& String(localReasonCode || '') !== 'completed'
|
||||||
&& String(debugReason || '') !== 'remote_hangup';
|
&& String(debugReason || '') !== 'remote_hangup';
|
||||||
|
const shouldBroadcastPreAcceptHangup =
|
||||||
|
!suppressRemoteSignal
|
||||||
|
&& notifyRemoteHangup
|
||||||
|
&& !call.remoteSessionId
|
||||||
|
&& call.direction === 'out'
|
||||||
|
&& !call.connectedAtMs;
|
||||||
|
|
||||||
if ((notifyRemoteHangup || shouldNotifyRemoteFailure) && call.remoteSessionId) {
|
if ((notifyRemoteHangup || shouldNotifyRemoteFailure) && call.remoteSessionId) {
|
||||||
try {
|
try {
|
||||||
@@ -1342,6 +1348,11 @@ async function finalizeCall(call, {
|
|||||||
await sendSignal(call, TYPES.HANGUP, dataValue);
|
await sendSignal(call, TYPES.HANGUP, dataValue);
|
||||||
} catch {}
|
} catch {}
|
||||||
}
|
}
|
||||||
|
if (shouldBroadcastPreAcceptHangup) {
|
||||||
|
try {
|
||||||
|
await broadcastSignal(call, TYPES.HANGUP, 'caller_cancelled_before_accept');
|
||||||
|
} catch {}
|
||||||
|
}
|
||||||
|
|
||||||
await closeMedia(call);
|
await closeMedia(call);
|
||||||
if (String(localReasonCode || '') === 'completed') {
|
if (String(localReasonCode || '') === 'completed') {
|
||||||
@@ -1722,7 +1733,20 @@ async function ensurePeerConnection(call) {
|
|||||||
if (call.videoTransportMode === VIDEO_TRANSPORT_SLOT) {
|
if (call.videoTransportMode === VIDEO_TRANSPORT_SLOT) {
|
||||||
const blackTrack = ensureBlackVideoTrack(call);
|
const blackTrack = ensureBlackVideoTrack(call);
|
||||||
if (blackTrack) {
|
if (blackTrack) {
|
||||||
await ensureVideoSenderSlot(call, { sourceTrack: blackTrack, profile: 'placeholder' });
|
const existingVideoTracks = stream.getVideoTracks?.() || [];
|
||||||
|
existingVideoTracks.forEach((track) => {
|
||||||
|
if (track.id !== blackTrack.id) {
|
||||||
|
try { stream.removeTrack(track); } catch {}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (!existingVideoTracks.some((track) => track.id === blackTrack.id)) {
|
||||||
|
stream.addTrack(blackTrack);
|
||||||
|
}
|
||||||
|
const sender = pc.addTrack(blackTrack, stream);
|
||||||
|
call.videoSender = sender;
|
||||||
|
call.videoTransceiver = (pc.getTransceivers?.() || []).find((tr) => tr?.sender === sender) || null;
|
||||||
|
bindVideoSenderStream(call, sender);
|
||||||
|
await applyVideoSenderEncodingProfile(sender, 'placeholder');
|
||||||
} else {
|
} else {
|
||||||
ensureReservedVideoTransceiver(call);
|
ensureReservedVideoTransceiver(call);
|
||||||
}
|
}
|
||||||
@@ -2154,30 +2178,79 @@ async function applyCameraState(call) {
|
|||||||
call.videoSender = videoTransceiver?.sender || call.videoSender || null;
|
call.videoSender = videoTransceiver?.sender || call.videoSender || null;
|
||||||
}
|
}
|
||||||
if (call.cameraEnabled) {
|
if (call.cameraEnabled) {
|
||||||
if (call.videoTransportMode !== VIDEO_TRANSPORT_SLOT) {
|
if (hadSlotBefore) {
|
||||||
call.videoTransportMode = VIDEO_TRANSPORT_SLOT;
|
const videoTrack = await ensureCameraTrack(call);
|
||||||
}
|
if (!videoTransceiver) {
|
||||||
const videoTrack = await ensureCameraTrack(call);
|
videoTransceiver = pc.addTransceiver('video', { direction: 'sendrecv' });
|
||||||
await ensureVideoSenderSlot(call, { sourceTrack: videoTrack, profile: 'camera' });
|
call.videoTransceiver = videoTransceiver;
|
||||||
videoTransceiver = call.videoTransceiver || videoTransceiver;
|
call.videoSender = videoTransceiver?.sender || null;
|
||||||
try {
|
|
||||||
if (videoTransceiver && videoTransceiver.direction !== 'sendrecv') {
|
|
||||||
videoTransceiver.direction = 'sendrecv';
|
|
||||||
}
|
}
|
||||||
} catch {}
|
try {
|
||||||
videoTrack.enabled = true;
|
if (videoTransceiver && videoTransceiver.direction !== 'sendrecv') {
|
||||||
|
videoTransceiver.direction = 'sendrecv';
|
||||||
|
}
|
||||||
|
} catch {}
|
||||||
|
if (videoTransceiver?.sender) {
|
||||||
|
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 {
|
||||||
|
call.videoTransportMode = VIDEO_TRANSPORT_SLOT;
|
||||||
|
const videoTrack = await ensureCameraTrack(call);
|
||||||
|
await ensureVideoSenderSlot(call, { sourceTrack: videoTrack, profile: 'camera' });
|
||||||
|
videoTransceiver = call.videoTransceiver || videoTransceiver;
|
||||||
|
try {
|
||||||
|
if (videoTransceiver && videoTransceiver.direction !== 'sendrecv') {
|
||||||
|
videoTransceiver.direction = 'sendrecv';
|
||||||
|
}
|
||||||
|
} catch {}
|
||||||
|
videoTrack.enabled = true;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
const blackTrack = ensureBlackVideoTrack(call);
|
const blackTrack = ensureBlackVideoTrack(call);
|
||||||
if (call.localStream && blackTrack) {
|
if (hadSlotBefore) {
|
||||||
syncLocalStreamVideoTrack(call, blackTrack, { stopRemoved: false });
|
if (call.localStream && blackTrack) {
|
||||||
}
|
const existingVideoTracks = call.localStream.getVideoTracks?.() || [];
|
||||||
try {
|
existingVideoTracks.forEach((track) => {
|
||||||
if (videoTransceiver && videoTransceiver.direction !== 'sendrecv') {
|
if (track.id !== blackTrack.id) {
|
||||||
videoTransceiver.direction = 'sendrecv';
|
try { call.localStream.removeTrack(track); } catch {}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (!existingVideoTracks.some((track) => track.id === blackTrack.id)) {
|
||||||
|
call.localStream.addTrack(blackTrack);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
if (videoTransceiver && videoTransceiver.direction !== 'sendrecv') {
|
||||||
|
videoTransceiver.direction = 'sendrecv';
|
||||||
|
}
|
||||||
|
} catch {}
|
||||||
|
if (videoTransceiver?.sender) {
|
||||||
|
try { await videoTransceiver.sender.replaceTrack(blackTrack || null); } catch {}
|
||||||
|
call.videoSender = videoTransceiver.sender;
|
||||||
|
bindVideoSenderStream(call, videoTransceiver.sender);
|
||||||
|
await applyVideoSenderEncodingProfile(videoTransceiver.sender, 'placeholder');
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (call.localStream && blackTrack) {
|
||||||
|
syncLocalStreamVideoTrack(call, blackTrack, { stopRemoved: false });
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
if (videoTransceiver && videoTransceiver.direction !== 'sendrecv') {
|
||||||
|
videoTransceiver.direction = 'sendrecv';
|
||||||
|
}
|
||||||
|
} catch {}
|
||||||
|
if (call.videoTransportMode === VIDEO_TRANSPORT_SLOT && blackTrack) {
|
||||||
|
await ensureVideoSenderSlot(call, { sourceTrack: blackTrack, profile: 'placeholder' });
|
||||||
}
|
}
|
||||||
} catch {}
|
|
||||||
if (call.videoTransportMode === VIDEO_TRANSPORT_SLOT && blackTrack) {
|
|
||||||
await ensureVideoSenderSlot(call, { sourceTrack: blackTrack, profile: 'placeholder' });
|
|
||||||
}
|
}
|
||||||
await disableCameraTrack(call);
|
await disableCameraTrack(call);
|
||||||
}
|
}
|
||||||
@@ -2707,7 +2780,9 @@ export async function handleIncomingCallSignal(evt) {
|
|||||||
if (hasVideoSectionInSdp(incomingOffer?.sdp || '')) {
|
if (hasVideoSectionInSdp(incomingOffer?.sdp || '')) {
|
||||||
call.videoTransportMode = VIDEO_TRANSPORT_SLOT;
|
call.videoTransportMode = VIDEO_TRANSPORT_SLOT;
|
||||||
ensureReservedVideoTransceiver(call);
|
ensureReservedVideoTransceiver(call);
|
||||||
await ensureVideoSenderSlot(call, { sourceTrack: ensureBlackVideoTrack(call), profile: 'placeholder' });
|
if (!call.videoSender) {
|
||||||
|
await ensureVideoSenderSlot(call, { sourceTrack: ensureBlackVideoTrack(call), profile: 'placeholder' });
|
||||||
|
}
|
||||||
if (call.autoEnableCameraOnConnect && call.cameraEnabled) {
|
if (call.autoEnableCameraOnConnect && call.cameraEnabled) {
|
||||||
try {
|
try {
|
||||||
await applyCameraState(call);
|
await applyCameraState(call);
|
||||||
|
|||||||
Reference in New Issue
Block a user