diff --git a/config/custom-environment-variables.yml b/config/custom-environment-variables.yml index 38d4e767..b0367939 100644 --- a/config/custom-environment-variables.yml +++ b/config/custom-environment-variables.yml @@ -75,6 +75,9 @@ videoSubscriberSpecSlave: screenshareSubscriberSpecSlave: __name: SCREENSHARE_SUBSCRIBER_SLAVE __format: json +screensharePlayStartEnabled: + __name: SCREENSHARE_PLAY_START_ENABLED + __format: json kurentoAllowedCandidateIps: __name: KURENTO_ALLOWED_CANDIDATE_IPS diff --git a/config/default.example.yml b/config/default.example.yml index 3d224d4b..4815c213 100644 --- a/config/default.example.yml +++ b/config/default.example.yml @@ -45,6 +45,7 @@ common-message-version: 2.x screenshareKeyframeInterval: 0 screenshareEnableFlashRTPBridge: false screenshareSubscriberSpecSlave: false +screensharePlayStartEnabled: false videoSubscriberSpecSlave: false recordScreenSharing: true diff --git a/lib/screenshare/screenshare.js b/lib/screenshare/screenshare.js index e77fb7ca..74b5843c 100644 --- a/lib/screenshare/screenshare.js +++ b/lib/screenshare/screenshare.js @@ -27,6 +27,9 @@ const SUBSCRIBER_SPEC_SLAVE = config.has('videoSubscriberSpecSlave') ? config.get('videoSubscriberSpecSlave') : false; const KURENTO_REMB_PARAMS = config.util.cloneDeep(config.get('kurentoRembParams')); +const SCREENSHARE_PLAY_START_ENABLED = config.has(`screensharePlayStartEnabled`) + ? config.get(`screensharePlayStartEnabled`) + : false; const LOG_PREFIX = "[screenshare]"; @@ -158,7 +161,6 @@ module.exports = class Screenshare extends BaseProvider { connectionId, type: C.SCREENSHARE_APP, id : 'iceCandidate', - cameraId: this._connectionId, candidate : candidate }), C.FROM_SCREENSHARE); } @@ -176,6 +178,7 @@ module.exports = class Screenshare extends BaseProvider { this.startRecording(); } this._status = C.MEDIA_STARTED; + this.sendPlayStart(C.SEND_ROLE, connectionId); } } }; @@ -186,9 +189,26 @@ module.exports = class Screenshare extends BaseProvider { // TODO properly implement a handler when we have a client-side reconnection procedure } + sendPlayStart (role, connectionId) { + if (SCREENSHARE_PLAY_START_ENABLED) { + this.bbbGW.publish(JSON.stringify({ + type: C.SCREENSHARE_APP, + id : 'playStart', + connectionId, + role, + }), C.FROM_SCREENSHARE); + } + } + _onViewerWebRTCMediaFlowing (connectionId) { Logger.info(LOG_PREFIX, `Viewer WebRTC session is FLOWING`, this._getFullViewerLogMetadata(connectionId)); + const viewerUser = this._viewerUsers[connectionId]; + + if (viewerUser && !viewerUser.started) { + this.sendPlayStart(C.RECV_ROLE, connectionId); + viewerUser.started = true; + } } _onViewerWebRTCMediaNotFlowing (connectionId) { @@ -614,7 +634,11 @@ module.exports = class Screenshare extends BaseProvider { this._voiceBridge, 'SFU', { externalUserId: userId, name: bbbUserName, autoLeave: true }); - this._viewerUsers[connectionId] = { userId, connectionId }; + this._viewerUsers[connectionId] = { + userId, + connectionId, + started: false, + }; // Get the REMB spec to be used. Screenshare uses the default mixed in with // the default spec bitrate. Fetching bitrate by the VP8 codec is just an @@ -657,11 +681,10 @@ module.exports = class Screenshare extends BaseProvider { this._getFullViewerLogMetadata(connectionId)); return resolve(sdpAnswer); - } - catch (err) { - Logger.error(LOG_PREFIX, `Viewer subscribe failed for ${userId} due to ${err.message}`, - { ...this._getFullViewerLogMetadata(id), error: this._handleError(LOG_PREFIX, err) }); - return reject(this._handleError(LOG_PREFIX, err)); + } catch (error) { + Logger.error(LOG_PREFIX, `Viewer subscribe failed for ${userId} due to ${error.message}`, + { ...this._getFullViewerLogMetadata(connectionId), error: this._handleError(LOG_PREFIX, error) }); + return reject(this._handleError(LOG_PREFIX, error)); } }); } diff --git a/lib/video/video.js b/lib/video/video.js index 0f5988fe..9f39a84f 100644 --- a/lib/video/video.js +++ b/lib/video/video.js @@ -302,6 +302,14 @@ module.exports = class Video extends BaseProvider { this.id ); + this.bbbGW.publish(JSON.stringify({ + connectionId: this.connectionId, + type: 'video', + role: this.role, + id : 'playStop', + cameraId: this.id, + }), C.FROM_VIDEO); + this.bbbGW.publish(userCamEvent, C.TO_AKKA_APPS_CHAN_2x); } diff --git a/package-lock.json b/package-lock.json index 6df0fc01..e78a8b62 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "bbb-webrtc-sfu", - "version": "2.4.21", + "version": "2.4.22", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 9fb2e153..f86645dd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "bbb-webrtc-sfu", - "version": "2.4.21", + "version": "2.4.22", "private": true, "scripts": { "start": "node server.js",