fix(JitsiConference): case for stopping JVB transfer
If for any reason invite for the JVB JingleSession is delayed and
arrives after the P2P connection has been established then
the media transfer needs to be disabled after the offer is accepted.
If the app depends on tracking current tracks state using
"track added/removed" events, the tracks will be leaking if
JitsiConference.leave() method is used. That's because peerconnections
are closed and removed from RTC module and then from onMemberLeft those
events will not be fired, because tracks will be gone with
the peerconnections.
Also removes error message log, because it no longer makes sense if
the tracks can be removed early by "stop P2P" logic without actually
removing them from the TPC. Then when the TPC is closed it will try to
emit the events again. But this time it will not match any tracks in
the JitsiParticipant, because it has been removed already.
fix(JingleSessionPC): execute 'invite' on the queue
Invite must be executed on the queue to avoid strange things happening
on the beginning of the call. For example when the local tracks are
added just after the invite was called.
Move the JingleSessionPC to ACTIVE state, as soon as the first
_renegotiate is executed in PENDING state.
Avoid a crash if for whatever reason there is no JVB JingleSessionPC at
the time when P2P is being stopped.
Add FIXME about possible situation where Jicofo invite will arrive after
the P2P has been established already.
Dominant speaker detection which is just based on current audio level of local or remote p2p track. The threshold value is the same used for talk while muted detection.
Firefox uses "constraint" as the key in the error:
```
[modules/RTC/RTCUtils.js] <value/<>: Failed to get access to local media. Error
MediaStreamError { name: "OverconstrainedError", message: "Constraints could be
not satisfied.", constraint: "width", stack: "" } Object { audio: false, video:
Object } lib-jitsi-meet.min.js:6:10419
```
* move all local deployment properties into window.jitsiAnalyticsPermanentProperties property
no longer need to set jitsiRegionInfo from external_connect, now set from Jitsi meet local.html, can be customized by deployment
* change to using shorter lines by extracting longer property name into a shorter local variable name
* changed to using more generic variable name jitsiDeploymentInfo after discussion with the team
added comment describing source of this variable
* doc(JitsiConference): deprecate 'isInLastN'
The 'isInLastN' method should not be used for the UI purposes, but
ParticipantConnectionStatus value should be used instead.
* fix(ParticipantConn..Status): speed up INACTIVE transition
Before this change when user's video stops playing, after user is
removed from last N we were waiting 2 seconds, before going to INACTIVE
state. This commit reduces the time to 500ms for such case.
* fix(ParticipantConn...): reduce logging
Reduce logging verbosity.
* fix(ParticipantConn...): handle LastN == 0
When LastN is set to 0 we should not rely on video playback and last N
set for figuring out participant connection status.
* fix(JitsiConference): undefined participants
Fixes a crash when this.participants field is accessed from _init.
Do the same which was done for the selected endpoint. That is if
an endpoint is pinned, before data channels are available then the value
should be cached and sent as soon as they are opened.
feat: Allow override of the infrastructure level channel LastN value.
For debugging purposes, it's sometimes useful to override the
infrastructure level channel LastN value via the URL (i.e. by launching
https://meet.example.org/room#config.channelLastN=X). This commit
achieves this by calling the JitsiConference.setLastN method during the
Jitsi conference initialization phase.
* feat: multiple, simultaneous RTP stats
Makes it possible to have remote RTP stats running for more than one
peerconnection at a time.
* feat(stats): report RTT all the time
Will report JVB RTT (and end to end) while in P2P mode and vice versa.
* fix(JitsiConferenceEvents): remove CONNECTION_STATS
CONNECTION_STATS event is no longer emitted.
* fix(AvgRTPStatsReported): users with no video
Do not include FPS == 0 in average remote FPS calculation. Report NaN
for local FPS when video muted or no video device. NaN will be reported
for avg remote FPS if no video is received.
* fix(AvgRTPStatsReported): reset total packet loss
* feat(AvgRTPStatsReported): report 'screen' FPS
Will report average FPS for screen videos separately from camera videos,
but only if available (camera video reports NaN FPS when not available).
* fix(AvgRTPStatsReported): end2endRTT
Needs to report JSON with value.
* feat(AVG RTP stats): separate audio and video bitrate
Will report average audio and video bitrates separately.
* doc(JitsiConference): try to improve comment
* fix(AvgRTPStatsReporter): remove confusing reset
There's no a clear reason for doing reset there.
* ref(AvgRTPStatsReporter): rename var
* feat(JSPC): ICE establishment time
Will report total ICE establishment time under
'ice.initiator.establishmentDuration' and
'ice.responder.establishmentDuration' ('p2p.' prefix added for P2P).
It's the amount of time between the time when either checking or
gathering started (whichever starts first) and when ICE entered
'connected' for the first time.
* fix(JSPC): simplify and rename event
* ref: store SSRCs as a number
Converts all the places where SSRCs where stored as string to use
numbers.
* doc(RTPStatsCollector): getNonNegativeStat
Fixes invalid description about returning NaN.
* ref(JitsiConf...EventManager): simplify for..of
* ref(JitsiRemoteTrack): throw TypeError
Will throw a TypeError when 'ssrc' is not a number.
* fix(RTPStatsCollector): invalid reference
* doc(RTPStatsCollector): getNonNegativeStat private
* ref(RTPStatsCollector): simplify for..of
* fix(SSRCs): check for negative value
Will not accept negative SSRCs, since those are supposed to be unsigned.
Average end to end RTT calculated as a sum of local RTT towards the JVB
and an average of towards JVB RTTs reported by other participants.
Will be reported under 'stat.avg.end2endrtt' analytics event name.
AvgRTPStatsReporter will calculate arithmetic means of 'n' samples
and submit the values to the analytics module. The 'n' value is
configurable through 'avgRtpStatsN' conference config option. When set
to non-positive value the AvgRTPStatsReporter will be disabled.
The following values are reported:
- average upload bitrate => 'stat.avg.bitrate.upload'
- average download bitrate => 'stat.avg.bitrate.download'
- average upload bandwidth => 'stat.avg.bandwidth.upload'
- average download bandwidth => 'stat.avg.bandwidth.download'
- average total packet loss => 'stat.avg.packetloss.total'
- average upload packet loss => 'stat.avg.packetloss.upload'
- average download packet loss => 'stat.avg.packetloss.download'
- average FPS for remote videos => 'stat.avg.framerate.remote'
- average FPS for local video => 'stat.avg.framerate.local'
- average connection quality as defined by
the ConnectionQuality module => 'stat.avg.cq'
If the conference runs in P2P mode 'p2p.' prefix will be added to
the event's name. Any pending calculations are wiped out on every switch
between P2P and JVB modes and samples have to be collected from
the start.
Will emit analytics events for ICE gathering and ICE checks duration,
separately for initiator/responder and p2p/jvb connections. Initiator
and responder have to be separated, because the flow and the values have
significant differences.
XMPPEvents.CONNECTION_ESTABLISHED is emitted outside of 'is stable'
condition, because for the JVB connection the signalling state is often
not in 'stable' ('have-remote-offer') state when ICE goes to
'connected'.
fix(tracks): Do not use track.addEventListener if unavailable
It is not guaranteed addEventListener will be available. Its
absense but usage causes a script error in Internet Explorer.
Instead, do a truthy check for it and then use it and fall
back to attachEvent if it is available.
ref(sdp): Do not add recvonly SSRC for muted video tracks.
Currently, when a participant joins hidden/video muted, we add a
recvonly SSRC so that the client sends RTCP reports with that SSRC. This
SSRC doesn't have neither simulcast nor RTX enabled. When the user
decides to enable his video camera, we "enhance" this SSRC with params
for RTX and simulcast. However, Chrome does not take into account these
new params because of
https://bugs.chromium.org/p/webrtc/issues/detail?id=7555. By not adding
a recvonly SSRC, we activate the default behavior in Chrome which is to
send RTCP reports with SSRC 1. So, when the user decides to enable his
video camera, instead of updating/enhancing the existing SSRC, we
initalize the primary SSRC with the correct params.