Implements the promised based getStats. Enables them for Safari and FF.
Adds stats and audio levels for Safari. Enables the new getStats API for Firefox, that will get rid of the following warning:
'non-maplike pc.getStats access is deprecated, and will be removed in the near future! See http://w3c.github.io/webrtc-pc/#getstats-example for usage.'
* fix(SS): Set min and max frame rate to 5
* fix(SS): Set min and max frame rate for the new GUM flow.
* feat(ss_framerate): Add config option for min/max frame rate.
* doc(RTCUtils): Fix params format.
* fix(SS_framerate): Don't pass undefined constraints.
* fix(SS_constraints): Handle chromeMediaSourceId === undefined.
ref(gum): try to reduce complexity of obtainAudioAndVideoPermissions (#707)
* ref(gum): try to reduce complexity of obtainAudioAndVideoPermissions
Even though I walk through the valley of the shadow of death
I will fear no evil... Reduce indenting and repeated calls to
getting desktop streams by creating a promise chain.
* squash: use arrow func
* squash: move constructor support to helper
* squash: put ff into mediastream constructor check
* squash: ff support media stream constructor
MDN states its been supported since 44. ESR is currently
52.
* squash: rename dsoptions, constant defaults
* squash: move comment about missing tracks error handling
* squash: wrap getUserMediaWithConstraints in promise
* squash: split up av funcs
* squash: hey, some tests...are better than no tests?
This commit will append "-" + tpc.id to every local 'MSID', 'cname',
'label' and 'mslabel', before feeding the local SDP to the Jingle layer.
It will make stream IDs unique across TraceablePeerConnection instances
and prevent from conflicts in some corner cases.
For example this will fix a problem where if the client drops
the conference without leaving the XMPP MUC gracefully and will join
the conference again without recreating the local tracks it would lead
to the MSID conflict, because the stream is still advertised by
"the ghost" participant.
* wip: initial version of the new AnalyticsAdapter.
* ref: Restructures the ICE duration and state change events.
* ref: Restructures the JitsiLocalTrack events.
* ref: Restructures the TTFM events.
* ref: Updates the user feedback event.
* ref: Restructures the _CONNECTION_TIMES_ and TTFM events.
* ref: Restructures the BRIDGE_DOWN and NO_DATA_FROM_SOURCE events.
* ref: Restructures the FOCUS_LEFT event.
* ref: Restructures the DATA_CHANNEL_OPEN event.
* ref: Removes the ICE_FAILED event (it is a duplicate of a state change event).
* ref: Restructures the device list events.
Uses one event per device, since the new format does not allow non-atomic attributes.
* fix: Does not obey "unmute" commands from the focus.
* ref: Restructures the "remotely muted" event.
* ref: Restructures the CONFERENCE_ERROR events.
* ref: Removes the CONNECTION_INTERRUPTED event
We can use ICE_STATE_CHANGED instead.
* ref: Renames isreconnect to isReconnect.
* ref: Removes the CONNECTION_RESTORED event. Use ICE state changes instead.
* ref: Restructures the p2p events.
* ref: Restructures the jingle events.
* ref: Restructures the RTP statistics event.
* ref: Restructures the CONNECTION_FAILED and DISCONNECTED events.
* ref: Restructures the getUserMedia analytics events.
* ref: Cleans up AnalyticsEvents and restructures some of the events.
* fix: Adds error logs to the analytics adapter.
* ref: Refactor Statistics.sendEventToAll
Renames to sendEventAndLog, supports the object-based API, uses the
function where appropriate.
* fix: Addresses PR feedback.
* fix: Addresses Lyubomir's feedback.
* ref: Remove unused functions, adds documentation.
* feat: Adds a Statistics.sendAnalytics shortcut.
* ref: Uses the conference name as the default containerId.
* fix: Adrdesses Lenny's feedback.
* fix: Addresses more feedback.
* fix: Uses 'operational' as the default event type.
* doc: Updates the documentation.
* fix: Fixes adding of permanent properties.
* ref: Uses consistent naming for events' attributes.
Uses "_" as a separator instead of camel case or ".".
* feat: Adds the conference name as a permanent property automatically.
* ref: Don't expose Setting.machineId.
* fix: Adds a "p2p" attribute to jingle events.
* ref: Uses "action" instead of "name".
* ref: Uses underscore in events' attribute names.
* ref: Logs a message to the logger/console
instead of callstats in sendAnalyticsAndLog().
fix(ie11): do not call JSON.stringify with temasys ice candidate
Calling JSON.stringify on a temasys object causes a stack overflow.
The result is that the JingleSessionPC's work queue never gets
cleared so future work, like video muting, will not get called.
Instead of passing in the candidate directly, manually do
what chrome's implementation of candidate.toJSON does.
Reports ssrc to callstats when screen sharing is started. (#657)
Adds rtc.LOCAL_TRACK_SSRC_UPDATED event to be emitted when ssrc is updated for a local track.
Fixes adding rtc listeners for CREATE_ANSWER_FAILED, CREATE_OFFER_FAILED, SET_LOCAL_DESCRIPTION_FAILED, SET_REMOTE_DESCRIPTION_FAILED.
* ref: Simplifies the logic for handling an incoming jingle session-initiate.
* fix: Don't redundantly log cross region
information under a field name called "label".
* cleanup: Simplifies code. Adds the userAgent as a permanent property
for statistics (so that the client doesn't have to).
* ref: Names the parameter which specifies the name of the event "eventName".
* ref: Extracts event names to AnalyticsEvents.
* ref: Exports and imports constants individually.
* fix: Fixes CONNECTION_TIMES event names.
* ref: Arranges constants alphabetically.
* ref: Adds line breaks.
This is a two part fix:
- In the new gum flow, this.getUserMedia supports promises
and rejections were not getting caught. So change
_newGetUserMediaWithConstraints to be promise based instead
of callback.
- The error name returned from blocked device permissions is
NotAllowedError, as adapter shims PermissionDeniedError
to be NotAllowedError.
fix(audio-output): update sinkIds on load and device list change (#642)
When a mac's default audio output is changed, audio elements
are not being updated with the new default. A default audio
output change in the OS fires a DEVICE_LIST_CHANGED event,
so use that to always update the sinkId.
Also, use wrapAttachMediaStream for newGumFlow to be ensure
the proper sinkId is set on audio elements being coupled
a remote track.
fix(ie11): do not type check for RTCSessionDescription
Error handling was added to ensure some munging helpers
were receiving RTCSessionDescriptions. Temasys is doing
something else and is passing its own object into
the mungers. So, let temasys do that.
fix(adapter): inject h264 into safari's remote description
Safari will fail to set its remote description if no
supported video codecs are found. This can happen with
config.p2p.disableH264 set to true, as browsers will strip
H264 from their offers. To get around this problem in a way
that can be removed once this is fixed on Safari's side,
add a function to inject H265 before setting the remote
description.
* revert: Reverts be665cbff7.
* ref: Renames "peerjid".
* ref: Refactors the initialization of a peer connection.
* feat: Re-implements the A/B test for the "suspend video" feature.
* squash: Deep copy.
* ref: Renames forceSuspendVideo to abtestSuspendVideo.
Modify error handling for missing video m-lines and local description (#632)
* ref(sdp): lower logs about missing local video to warning
* ref(sdp): earlier error handling for missing description and mlines
* ref(sdp): rename maybeMungeLocalSdp to be more specific
fix(peerconnection): create a new description to modify sdp (#631)
Firefox has deprecated modifying a description's sdp through
re-assignment. Safari (without temasys) does not allow it.
As such, wherever the sdp has to be modified instead create
a new description with the modified sdp.
feat(1080p): support on chrome >= 61 using adapter (#617)
- Add a new browser check so adapter shim usage can be gated.
- Get track resolution for stats from the track itself to account
for browser resolution fallback logic. Do this only if
we can be sure adapter has shimmed it in.
- Create a new getUserMediaFlow, with RTC being the orchestration
for various RTCUtils calls.
- Remove connection quality stat "resolution" which was being
emitted but not used but listeners.
To install the chrome webstore extension, the user must already have installed "Download Chrome Extension". On missing extension we open a popup window which allows the user to add the extension and then install it.
The default was still 360p if the option was missing from config.js. In
addition, move the logic outside of a browser check, so all browsers get
glorious HD by default.
ESLint 4.8.0 discovers a lot of error related to formatting. While I
tried to fix as many of them as possible, a portion of them actually go
against our coding style. In such a case, I've disabled the indent rule
which effectively leaves it as it was before ESLint 4.8.0.
detectChrome() detects the browser but then may throw an exception while
parsing its version. The exception could be reproduced by toggling the
device toolbar and instructing Chrome to identify as iPhone 6 Plus.
adapter.screenshare.js uses the variable requestUserMedia without
defining it. And that's a problem because it's packed in strict mode so
it will cause an error to be thrown at runtime which will fail
lib-jitsi-meet and, consequently, the whole app. As the variable
requestUserMedia appears to be global in certain browser, prevent the
use of the undefined variable without really changing the outcome of its
use.
feat(tpc): enforce preferh264 when setting the local description
For p2p, we have to take preferh264 into account when setting the local description, since
that prefer is what will be received by the far side. if we only do it on the remote description,
like before this change, we'll never actually end up preferring h264.
ref(JitsiLocalTrack): get rid of 'setMutedInProgress'
The 'setMutedInProgress' flag is unreliable and it can lead to weird
situations when mute operation is in progress, but the removal from
JingleSessionPC is waiting on the queue. In such case LocalSdpMunger
will fake SDP even if the track is in the PeerConnection which may
confuse some parts of the SDP transformation chain.
For example RtxModifier will not attempt to inject Rtx group description
if it sees that the SSRC are already there. But it can happen that even
though the SSRCs are there they do not contain valid track ID, because
the track has changed.
The LocalSdpMunger is supposed to fake the SDP only when the video
MediaStream is not in the PeerConnection. So this commit implements just
that: a way to tell if JitsiLocalTrack's stream is currently in
the PeerConnection (added through TraceablePeerConnection).