Cisco Meeting App using URL.createObjectURL, removed in Chrome 71
Reported by
barrycou...@gmail.com,
Dec 14
|
||||||||||||||||||||
Issue description
Chrome Version : 71.all
OS Version: all Macintosh OS X including OS X 10.13.all, 10,14.all
URLs (if applicable) :
Other browsers tested:
Add OK or FAIL after other browsers where you have tested this issue:
Safari: not applicable
Firefox: pass
Opera: pass
IE/Edge: not applicable
What steps will reproduce the problem?
1. login to Cisco CMA
2. connect to any conference, either virtual or physical rooms all respond the same.
3. You are stuck with a message stating CMA needs access to the microphone and camera. But even when making Chrome settings to allow mic and camera access, CMA still is trapped in not being able to access the camera and microphone.
The problem happens when allowing the v71 update to install. Please don't try to push back with spoon fed deflections.
Google Chrome v71 CAUSES this problem. Even if in the middle of a conference, having the mic and camera active and connecting into the conference, they get cut off as soon as I click on the RELAUNCH button for the v7.1 update.
Its likely Cisco Meeting App, (CMA) is not the only conferencing or camera and microphone sharing app that is afflicted when being run in Chrome.
What is the expected result?
The conference using Chrome should have access to the camera and microphone, same as it has correctly worked for any and all previous versions of Chrome prior to this fucked untested rushed out v71 update. No doubt it was approved in QA by some inexperienced millenial know-it-all who doesn't know the basics of regression testing. My assessment is based on first hand experience of what I saw go on when I worked at Google.
What happens instead of that?
Chrome leaves every attendee of the conference unable to use CMA if they are stuck with the v71 update already.
Please provide any additional information below. Attach a screenshot if
possible.
UserAgentString: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36
My longer description on the public channel is as follows:
Version 71 has a big BUG that makes my company's entire Cisco telepresence system UNUSABLE becuase it disables the microphone and camera!
Before v71, Chrome was the only fully functional browser for Cisco telepresence Cisco Meeting App (CMA). IT no doubt disables the mic and camera for many other programs too.
Please ASAP rollback to v70 until you get this BUG fixed.
Do not push back on me with claimed bullshit. I used to be a Deployment Manager at Google Enterprise, and know the crap Google loves to push off on customers instead of ADMITTING and FIXING a REAL BUG, ASAP.
Roll back and push out v70, get ride of v71 until you fix this BUG. We have a ticking time bomb of several thousand end-users who will be cut off from being able to connect into company meetings the moment they close Chrome or restart their computers. I have over 100 already, and more every day. Plus every end-user of every other company that uses Cisco Meeting App and Cisco Telepresence Conferencing system, so you have hundreds of thousands of end-users who will be affected by this once they allow the Chrome 7.1 update.
Goshdam you Google. This is beyond doing Evil.
Barry Burr
Desktop Support Lead
Coupang
Mountain View, California
(650) 471-5234
,
Dec 17
,
Dec 17
What is the actual bug here?
,
Dec 17
barrycoupang@gmail.com: Can you provide more concrete repro steps for this bug? For example, can you provide a URL to test?
,
Dec 17
you might want to try a few things such as testing https://webrtc.github.io/samples/src/content/getusermedia/gum/ or https://webrtc.github.io/samples/src/content/getusermedia/resolution/ and inspecting the error returned there. A dump/screenshot of chrome://media-internals from both M70 and M71 might also be helpful in determining what the issue is.
,
Dec 17
It looks like this might be a duplicate of bug 914398 , although the report doesn't say much.
,
Dec 17
Obligatory reminder: "Please keep discussions respectful and constructive. See our code of conduct." https://chromium.googlesource.com/chromium/src/+/master/CODE_OF_CONDUCT.md
,
Dec 17
There seems to be a problem with experiment rollouts. To verify that this is the issue, can you go to chrome://flags, locate the "unified plan by default" flag, and set it to "false"? If this solves the problem, the core issue is with experiment rollout (this is an experiment that should only have been seen in M72 beta, not M71 stable).
,
Dec 17
,
Dec 17
What version of CMS does this affect? Here's some information on the latest version: https://www.cisco.com/c/dam/en/us/td/docs/conferencing/ciscoMeetingApps/Release_Notes/Release_Notes_CMA_2_5_webRTC.pdf Some more information here: https://www.cisco.com/c/en/us/support/conferencing/cisco-meeting-app/products-release-notes-list.html
,
Dec 17
Reading bug 914398 , yes that reads like the same problem. But it is NOT, CLEARLY NOT, only with the Flash plugin because on the Mac, there is NO FLASH PLUGIN! This is a showstopper. IF you think the bug was introduced at some previous sub version of v71, then rollback to that level and I'll be glad to test for you ASAP. I would be glad to come over to any of your Mountain View area offices to show you directly, or set up a screenshare with you so you can see that the mic and camera work on v70, then get disabled as soon as I allow the v71 update to install. Please contact me directly at (323) 487-2002 Barry Burr Desktop Support Lead Coupang 605 Fairchild Drive Mountain View, CA 94043
,
Dec 17
Thank you for providing more feedback. Adding the requester to the cc list. For more details visit https://www.chromium.org/issue-tracking/autotriage - Your friendly Sheriffbot
,
Dec 17
Note also that the Onlinemictest described in #914398 works. This should help distinguish where the bug is occurring.
,
Dec 17
Can you check the CMA app version?
,
Dec 17
Use Unified Plan SDP Semantics by default is the only "unified plan" flag avaialable in v71. I set that to "disabled". It was listed as "default". The two tests you asked me to try off of github both work. All our Cisco Telepresence units are updated with the latest firmware. The bug still occurs. Users cannot get the microphone or camera to be active with Chrome, from both a Mac or a PC.
,
Dec 17
The CMA version is the latest web app version, as pushed into the browser when a user opens a session. It is not a static application that's loaded onto a Mac or PC.
,
Dec 17
Btw, thank you to your team for taking this bug on. Its nasty, and will propagate to anyone using Chrome who does conferencing or multimedia. Please note my suggestion for a screen share, or I can stop by your offices. I live and work right next to the Quad, a short walk to your main campus in Mountain View, and a ten minute bike ride to the Sunnyvale offices.
,
Dec 18
Has this issue been escalated to Cisco? This seems like a problem with Cisco CMA, given that the existing demo pages work. Updating title to reflect the current understanding.
,
Dec 18
Cursory check of audio/video metrics indicates no impact with the launch of M71.
,
Dec 18
Barry, your feedback is appreciated. Please give our code of conduct at https://webrtc.org/code-of-conduct/ a quick read before filing your next bug. Thanks.
,
Dec 18
What existing demo pages? There is a BUG in Chrome. Chrome 71 BREAKS Cisco CMA, and other programs that other people have complained or filed bugs about. This is not a problem with Cisco CMA. CMA runs fine on v70. Updating to V71 disables the microphone and camera. This happens whether the update is applied while a CMA session is open, of if Chrome is closed, updated, then reopened. CMA runs fine in every other browser that it runs in. There is not a problem with CMA. This is a BUG in Chrome, that you most likely caused with this: https://chromium.googlesource.com/chromium/src/+/ac00a5f3b9ba87fe2b59ff66d9907c3fb56deb96 Except that there are no permissions blocked. Every permission setting and option in Chrome and in CMA is allowed. If you believe that there isn't, then show me what and where. Otherwise, figure out where your logic error is that is misinterpreting whatever conditions its seeing so that the program response as if some permission is blocked, when, in fact, all permissions are allowed. How much more clear do I have to be? Fix your bug!
,
Dec 18
(note that I do not work for Google; also not every Google person works in MTV) demo pages: you said the two demo pages at https://webrtc.github.io/samples/ worked for you. You might also run https://test.webrtc.org/ which gathers quite a bit more information about your system. A dump from chrome://webrtc-internals might also help to show what exactly Cisco CMA is attempting to do that breaks. You might also want to test other WebRTC applications such as https://appr.tc/, https://appear.in, Google Meet, https://talky.io, https://meet.jit.si -- if the problem does not show up there it might be far less widespread than you think. If the culprit is the commit you are pointing to (and so far you have not shown any actual data) then this would merely show that CMA relied on unspecified behaviour which nobody has not bothered to test in the unstable and beta versions of Chrome 71. Testing in those versions is best common practice in the WebRTC world.
,
Dec 18
barrycoupang@gmail.com: The issue introduced by https://chromium.googlesource.com/chromium/src/+/ac00a5f3b9ba87fe2b59ff66d9907c3fb56deb96 is strictly limited to flash media capture requests on systems where there is no camera. That issue is being tracked on bug 914398 and will be fixed shortly. So far, we are still waiting for concrete details about the bug you are seeing.
,
Dec 19
That issue happened to appear same time as the CMA incompatibility. Coincidence? One common thread could also be that says it CMA doesn't see a camera or microphone available. Pic 1, logged into CMA. Camera light is off. Pic 2, Open CMA settings, camera light comes on green, but settings states that no camera or microphone is found. Pic 3, started a conference session, but have not entered password to open the connection yet. Camera light still green. Pic 4, same as above, but with mute buttons clicked for both camera and microphone. Note blue button color and message "microphone muted". Pic 5, microphone unmuted. Note message "microphone active. Camera light remains green. Pic 6, entered password to begin session. Camera light stays green. Pic 7, click on black camera indicator in the search bar, entries state Camera and Microphone allowed, page is accessing the camera and microphone. Pic 8, click on Leave the call. Note that now, settings show the camera and microphone. Camera lights stays green. Pic 9, came and microphone show they can be muted. Pic 10, reloading page shuts off green camera light. Pic 11, opening settings turns camera light back on, note that no camera or microphone is listed. Pic 12, closing and opening settings shows microphone and camera available again.
,
Dec 19
Thank you for providing more feedback. Adding the requester to the cc list. For more details visit https://www.chromium.org/issue-tracking/autotriage - Your friendly Sheriffbot
,
Dec 19
Per #22, please advise on whether you experience camera problems when using the demo at https://webrtc.github.io/samples/src/content/getusermedia/gum/. From our metrics, we can see that this is not a widespread problem, so your help is critical in understanding where the issue lies.
,
Dec 19
Barry - please start communicating with respect. Your behavior has now been pointed out to you several times, both by Chromium contributors as well as external project supporters/users. Yet your replies are still disrespectful. Please fix. There's an indication that there's an issue with the application. Notice for example the red dot in the tab - it indicates active media capture and device access. That's not what's going on in issue 914398 . If it does turn out that the issue is with CMA, then you could save some time and contact Cisco if you haven't already done so. You'll notice that the status of this bug is still Unconfirmed. Please follow what's recommended to you in comment #22. It's also possible that the application itself logs warnings.
,
Dec 19
Pasting this into the JS console will show the same results as the API that CMA should be using (in the context of the CMA session; the results will vary on other sites):
navigator.mediaDevices.enumerateDevices().then(devices => devices.forEach(d => console.log(d.kind, d.label)))
will show the available devices which should include those shown in your screenshots. Pasting
var v = document.createElement("video"); v.autoplay = true; document.body.appendChild(v);
navigator.mediaDevices.getUserMedia({audio: true, video: true}).then(stream => v.srcObject = stream).catch(e => console.error(e))
will create a video element from your local webcam and show it. If that works and shows your self-image this is not a problem with getUserMedia
,
Dec 19
,
Dec 20
@comment 26, that link works when used through Chrome v71. @comment 27, stop your granola sensitivities, whining that I dropped an f-bomb in my original problem description. That was 26 entries ago, and there's no way to edit that now. Cisco hasn't changed their product, and the current versions of CMA work fine on Chrome v70, Opera, and Firefox. Chrome is the cuplrit. If I start a CMA session on Chrome v70, then click on Chrome settings> help> update, and let Chrome restart at v71, the camera and microphone get cut off and the page stating "we need to user your camera and microphone" is displayed. The green camera light and the red dot may still appear, for ~20 seconds, the turn off and CMA returns to the page the user is at. @comment 28, if I were your level developer, I might have the resources and understand to do what you ask. Pls keep an overall view of the logic in play here, about allowing and denying access to devices requesting the camera and microphone. We need to get the fix for 914398 deployed before we can take other actions on this. Please check and advise me and all the other Cisco CMA victims when that fix will be deployed, and I'll update and test ASAP for you. Thank you, Barry
,
Dec 20
Thank you for providing more feedback. Adding the requester to the cc list. For more details visit https://www.chromium.org/issue-tracking/autotriage - Your friendly Sheriffbot
,
Dec 20
... and we're done here, for repeated violations of the CoC.
,
Dec 20
@Juberti, All your entries have been dismissive or deflecting. When I worked at Google, my attitude, motivation, and work ethic was very successful in tough situations, appreciated and well rewarded. But your misconduct on this bug is an example why many Googlers from further in the past lament that the Google that truly was based on Googliness doesn't exist anymore. IF you think there's anything offensive in my last entry then the internet is not a place for you to be working. You are going to get people who are expressive and passionate about their work. Apparently, you aren't or you would be embracing this bug as a powerful challenge that you can improve yourself with instead of giving the the impression that you're looking for excuses not to do the work it can sometimes take to find and fix a legitimate bug. Repeated violations? If you don't like an expletive in my original description, then allow editing so I can remove it, remove it yourself, or stop fabricating an issue out of something that it isn't. Someone edited the title, so you do have access to make edits that customers aren't able to. @Eveeryone else, please remove this Juberti person from this bug, so we can get on with the business of getting it fixed. I've done every narrowly focused test you asked, spent hours making descriptive screen pics, but you all refuse to do the basics that I offered in my original description. Now follow my suggestion, and we will make progress. Get a live screen share, that you are free to record for reference and documentation, and you will see what's happening here well enough to pin down where and how to fix it.
,
Dec 20
Multiple people asked you to stop being disrespectful. You continued being disrespectful. The End.
,
Dec 20
,
Dec 20
FWIW, this seems to have been an issue with CMA that Cisco has already fixed according to https://www.cisco.com/c/dam/en/us/td/docs/conferencing/ciscoMeetingServer/Release_Notes/Version-2-2/Cisco-Meeting-Server-Release-Notes-2-2-14.pdf See Section 4.1 "Resolved Issues" CSCvn58291 Chrome Version 71 not working with Cisco Meeting Server 2.2.x therefore users are unable to join calls.
,
Dec 20
,
Dec 20
,
Dec 21
I'm reopening this ... hopefully the 2.2.14 release did fix the problem as noted in #c36, but since I don't think we fully understand the problem and haven't gotten a confirmation of the fix from the reporter, we should probably leave this open.
,
Dec 21
To recap: we're still looking for more information that'll help us figure out what's going on. 1. Is it possible for you confirm that 2.2.14 still has the problem (or, hopefully that it doesn't)? 2. On both versions M70 and M71, can you open a new window (or tab) and load the "chrome://media-internals" URL and then capture what the four tabs in the page are reporting? I think you might get the most information if you are trying to view your CMA session at the same time, if that's possible (I don't actually know the instructions for this specifically, hopefully one of the other folks cc'ed can help out if I'm missing specifics). 3. It was suggested that you also open "chrome://webrtc-internals", but I'm not sure how to use that page. Can someone else provide specifics on that? 4. Can you try some of the suggestions in #c22 to say if the other sites work or not? 5. Can you try downloading and installing the M72 Beta and M73 Canary releases, from the links on http://www.chromium.org/getting-involved/dev-channel, and see if the problem still reoccurs? 6. Do you know if there is some way a Chromium developer can try to reproduce what you're seeing on one of our machines? I.e., some way we can set up and connect to a session? 7. As per the suggestion in #c28, can you try to open a Chrome DevTools console (press cmd-option-J), and then, in the window that opens with what looks like a command prompt (">"), and paste in the two commands listed?: navigator.mediaDevices.enumerateDevices().then(devices => devices.forEach(d => console.log(d.kind, d.label))) and var v = document.createElement("video"); v.autoplay = true; document.body.appendChild(v); navigator.mediaDevices.getUserMedia({audio: true, video: true}).then(stream => v.srcObject = stream).catch(e => console.error(e)) and then grab a screen capture of the output? Hopefully the answers to these questions will help us make progress. @juberti / @guidou / @tommi / @philippe.hancke - please restate any other requests or suggestions if I missed any.
,
Dec 21
Also, I should note that per communication w/ @barrycoupang, Opera doesn't seem to have the issue, but I'm not sure which version of Opera they're testing. @barrycoupang, can you dig up which version it is?
,
Dec 21
Current Opera version is Version:57.0.3098.106
,
Dec 21
Output from chrome://media-internals in the attached files.
,
Dec 21
,
Dec 21
Output from chrome://webrtc-internals/ in the attached file.
,
Dec 21
Cisco 2.2.14 still has the bug. Cisco's release notes for 2.2.124 references the attached document. Please see that Cisco did not make a fix. They only give the same workaround, to not allow the upgrade from Chrome v70 to V71+, or to use Cisco Meeting Server 2.4.2 if if can be used. But CMS 2.4.x is still not ready for release to end-users. Coupang's testing shows that its buggy, with video hangs, screen share rejections, and lack of chat capability.
,
Dec 21
Clarification: The above Media and Web internal were from Chrome v71, right after Chrome refusing to allow CMA to access the video and audio.
,
Dec 21
Output from https://test.webrtc.org/ WebRTC Troubleshooter
,
Dec 21
WebRTC samples: I tried about a dozen of them including all the categories. All work with both audio and video.
,
Dec 21
https://appr.tc/, Google Meet, https://talky.io, and https://meet.jit.si all work. https://appear.in required the user to make an account, so I didn't test that.
,
Dec 21
You are welcome and freely invited to connect to a session, agreeing to confidentiality and deletion of all company proprietary or confidential information you may be exposed or be given access to.
,
Dec 21
@barrycoupang - thanks for the updates. You wrote in #c46: > Cisco's release notes for 2.2.124 references the attached document. > Please see that Cisco did not make a fix. They only give the same > workaround, to not allow the upgrade from Chrome v70 to V71+, or to > use Cisco Meeting Server 2.4.2 if if can be used. but the attached doc says "Known fixed releases: 2.2.14"? Does that mean something different than what I'd expect it to mean?
,
Dec 22
Downloading from "Get Involved" page. Testing on Chrome Stable download. Was downloaded the same v71.0.3578.98 as the Chrome automatic updater downloads. Same errors.
,
Dec 22
Downloading from "Get Involved" page. Testing on Chrome Beta download. Was downloaded v72.0.3626.28. Same errors as with v71. It gets worse. My test server on Cisco Meeting Server 2.4x connects with Chrome v71. With v72beta, t gives a "joining meeting failed" when I try to connect to the test conference.
,
Dec 22
Another note about v72beta: The mute buttons don't show as enabled for microphone and camera, but the camera light comes on during the time that cma is trying to connect to the conference. Then shuts when the error message appears.
,
Dec 22
Downloading from "Get Involved" page. Testing on Chrome Dev download. Was downloaded v73.0.3642 Same errors as with v71. Sticks at the "we need to use your microphone and camera" page. This also works with my Cisco Meeting 2.4x test server, so whatever in beta was stopping this, changed so that it now works again.
,
Dec 22
Downloading from "Get Involved" page. Testing on Chrome Canary download. Was downloaded v73.0.3467.0 Same errors as with v71. Sticks at the "we need to use your microphone and camera" page. Cisco Meeting 2.4x test server gets the same errors as V72 beta. Note: All tests on the same machine. Cleared all cache and history before each install.
,
Dec 22
Reverted back to v69. Cisco CMA 2.2 in production and test v2.4.2 work fine, except for the known issues in 2.4.2 that do not occur only in Chrome, which make 2.4.2 not stable to deploy into production.
,
Dec 22
I hope all this helps!!!!!!!! Thanks you all for indulging me on this nasty Scrooge of a bug. After Christmas, I'll see what I can figure out in the Chrome dev tools, but that's probably too far away from my skillset for me to be helpful with. I think that will finish covering all the stuff you're asking about. Have a Merry Christmas and Happy Holidays. Will be off til day after Christmas so please take a few days to digest my postings.
,
Dec 22
@barrycoupang - did you see my comment/question in #c52? Also, can you confirm that you tested 2.2.14 and it didn't fix anything?
,
Dec 22
@dpranke, Yes, that's correct. Cisco's statement is misleading. They have not fixed the bug. The .pdf I posted states they are giving a workaround, saying not to use Chrome v71+, or to try Cisco CMS server v2.4.2+
,
Dec 22
Is there a repository for previous builds? Links off of the release channels aren't bringing these up. Similar bug 914398 lists the unwanted behavior starting between: Last good build: 71.0.3570.0 First bad build: 71.0.3571.0 It may be a waste of my time but to satisfy the odd chance that it is to root of the problem, I would like to test each of those versions side by side. thx.
,
Dec 26
There isn't a repository of previous official builds, unfortunately.
,
Dec 26
Please link me to where ajha@chromium.org got these builds from to do the tests described in C13 of bug 914398 . Testing this fork would be helpful to determine if the CMA bug began at the same point as 914398 did. Thank you.
,
Dec 26
Sorry, I should've said there isn't a *public* repository. It's possible we can figure out a way to get you these two specific builds, though. But probably not this week, since a bunch of people are still out on holiday.
,
Dec 26
ok, thx. We'll come back to this on Monday. For now, the Canary builds on v73 keep failing, and also don't connect with CMS 2.4.2 either. Latest one I just tested is v73.0.3652.0.
,
Dec 26
Here are the development console commands asked for in c40, above. The video frame opened after the second command. hth.
,
Dec 27
Still testing in v72 Beta,
gave your devcon commands a try in other pages, and then in CMA.
The video frame command works in a few other pages.
Before logging in to CMA, the video frame works.
After logging in, the video frame doesn't appear, but the command doesn't cause an error message.
After trying to connect to a meeting, an error message comes up.
After trying to enter the command to open a video frame after the "we need access to..." page appears, no video frame opens. The program eventually times out and returns to the unconnected and logged in page.
Maybe one of you who knows what to look for can decipher the error in this output. Here's the full content of what's in the last attached screen shot:
$(document).ready(function(){logToConsole("scripts/webkit_peer_connection.js");script_loaded();var a=-1!==navigator.userAgent.indexOf("OPR/")||-1!==navigator.userAgent.indexOf("Edition Next"),c=!!window.acanoExtension,c="string"===typeof appOptions.chromeExtensionUrl||c;26<checkChromeVersion()&&(!a&&c)&&(createDesktopSharableItem(),session_parameters.sharing_supported=!0);newestMediaChange=!1});
function configureLocalAudioContext(){if(null==localAudioContext){window.AudioContext=window.AudioContext||window.webkitAudioContext;try{localAudioContext=new AudioContext}catch(a){logToConsole("unable to create audio context for webrtc microphone")}}}
var havePeerConnectionConfig=!1,peerConnectionConfig={},webkitPeerConnectionConfig={},webkitPeerConnectionConfigSet=!1,webkitDtlsEnabled=!0,webkitMediaTimeoutSeconds=10,webkitGetUseMediaAudioOnly=!1,webkitRenderToAssociatedSink=!1,haveUserMediaResponse=!1,lastUserMediaRequest=null,localStream=null,localStreamFake=!1,localAudioContext=null,localDesktopStream=null,gettingDesktopMedia=!1,cameraShouldBeMuted=session_parameters.camera_muted,microphoneShouldBeMuted=session_parameters.mic_muted,peerConnectionStateArray=
[],debugIndexNext=1,last_audio_source_id=null,last_video_source_id=null;function createDesktopSharableItem(){var a=new ShareableItem(translate(lan.share_item_desktop),"Desktop",function(){return null!=localDesktopStream},getDesktopMedia,stopDesktopMedia);add_object(shareable_items_list,a)}function stopTracksOnStream(a){try{a.stop()}catch(c){a.getTracks().forEach(function(c){c.stop()})}}
function PeerConnectionState(a){this._guid=a;this._debugIndex=debugIndexNext++;this._remoteStream=this._remoteSdp=this._dataChannel=this._rtcPeerConnection=this._localDesktopStream=this._localStream=null;this._doMainVideo=this._doMainAudio=!1;this._numZeroIpFailures=0;this._iceCompleteOnRemoteAdded=!1;this._waitingForMediaTimer=null;this._reset=function(){this._destroy();this._mediaId=Date.now();this._dtmfSender=null;this._createPeerConnectionPending=!0;this._localSdp=null;this._localSdpState="not_sent";
this._localSdpSendFailures=0;this._localCandidates=[];this._localCandidatesToSend=[];this._localCandidatesToSendState="ready_to_send";this._localCandidatesSendFailures=0;this._iceComplete=!1};this._refreshCreatePeerConnection=function(){if(null==this._rtcPeerConnection&&webkitPeerConnectionConfigSet&&haveUserMediaResponse&&this._createPeerConnectionPending){this._createPeerConnectionPending=!1;var c=this;this._rtcPeerConnection=new webkitRTCPeerConnection(webkitPeerConnectionConfig,{optional:[{googIPv6:!0},
{DtlsSrtpKeyAgreement:webkitDtlsEnabled}]});this._rtcPeerConnection.onicecandidate=function(a){c._onIceCandidate(a)};"undefined"===typeof this._rtcPeerConnection.oniceconnectionstatechange&&(this._iceCompleteOnRemoteAdded=!0);this._rtcPeerConnection.oniceconnectionstatechange=function(a){c._onIceConnectionStateChange(a)};this._rtcPeerConnection.onaddstream=function(a){c._onRemoteStreamAdded(a)};this._rtcPeerConnection.onremovestream=function(a){c._onRemoteStreamRemoved(a)};null!=localDesktopStream&&
(this._rtcPeerConnection.addStream(localDesktopStream),this._localDesktopStream=localDesktopStream);null!=localStream&&(this._rtcPeerConnection.addStream(localStream),this._localStream=localStream);this._configureDtmfSender();this._createOffer()}};this._destroy=function(){null!=this._dataChannel&&(this._dataChannel.close(),this._dataChannel=null);this._localDesktopStream=null;clearTimeout(this._waitingForMediaTimer);this._waitingForMediaTimer=null;null!=this._remoteSdp&&(delete this._remoteSdp,this._remoteSdp=
null);if(null!=this._remoteStream){var c=$("#main_video");c.attr("displayGuid")==this._guid+this._mediaId&&(c[0].src="",c.attr("displayGuid",""));delete this._remoteStream;this._remoteStream=null}null!=this._rtcPeerConnection&&(this._rtcPeerConnection.onicecandidate=function(){},this._rtcPeerConnection.onaddstream=function(){},this._rtcPeerConnection.onremovestream=function(){},this._rtcPeerConnection.close(),this._rtcPeerConnection=null)};this._createOffer=function(){var c=this;try{var a={mandatory:{OfferToReceiveAudio:!0,
OfferToReceiveVideo:!0}};this._rtcPeerConnection.createOffer(function(a){c._setLocalAndSendMessage(a)},function(){},a);return}catch(d){logToConsole("createOffer1 failure - falling back..."),logToConsole(d)}try{a={has_audio:!0,has_video:!0};this._rtcPeerConnection.createOffer(function(a){c._setLocalAndSendMessage(a)},null,a);return}catch(e){logToConsole(e)}logToConsole("failed to create peer connection offer")};this._retryOnZeroIp=function(){clearTimeout(this._waitingForMediaTimer);this._waitingForMediaTimer=
null;this._numZeroIpFailures++;if(5<=this._numZeroIpFailures)return!1;notificationPanelTimedWarning(translate(lan.notifications_chrome_zero_ip,this._numZeroIpFailures),5);this._reset();var a=this;setTimeout(function(){a._refreshCreatePeerConnection()},0);return!0};this._onIceCandidate=function(a){a.candidate?(logToConsole("onIceCandidate: "+JSON.stringify(a.candidate)),newestMediaChange&&!this._localCandidates.length&&this._createOffer(),this._localCandidates.push(a.candidate),this._localCandidatesToSend.push(a.candidate),
this._refreshSendLocalSdp(),this._refreshSendCandidates()):(logToConsole("onIceCandidate: complete"),this._createOffer())};this._onIceConnectionStateChange=function(){if(null!=this._rtcPeerConnection){logToConsole("ICE changed state to: "+this._rtcPeerConnection.iceConnectionState);var a;switch(this._rtcPeerConnection.iceConnectionState){case "connected":case "completed":a=!0;break;default:a=!1}if(a){if(!this._iceComplete){this._iceComplete=!0;var b=webkitMediaTimeoutSeconds,d=this;this._waitingForMediaTimer=
setTimeout(function(){var a=$("#main_video")[0],c=session_parameters.waiting_for_media_screen;d._doMainVideo&&c?(logToConsole(b+" seconds since ICE completed - still waiting for media..."),notificationPanelTimedWarning(translate(lan.notifications_chrome_video_timeout),5),d._reset(),setTimeout(function(){d._refreshCreatePeerConnection()},0)):logToConsole(b+" seconds since ICE completed - video resolution: "+a.videoWidth+" x "+a.videoHeight)},1E3*b)}mg_iceComplete(this._guid)}}};this._getLocalStreamVideoTracks=
function(){if(null==this._localStream)return[];var a;try{a=this._localStream.getVideoTracks()}catch(b){a=this._localStream.videoTracks}return a};this._onRemoteStreamAdded=function(a){this._iceCompleteOnRemoteAdded&&mg_iceComplete(this._guid);logToConsole("Got Remote Stream (peer connection: "+this._guid+")");var b=getRemoteStreamVideoTracks(a.stream),d=getRemoteStreamAudioTracks(a.stream);logToConsole(" remote video tracks:"+b.length+" audio tracks:"+d.length);for(var e=0;e<d.length;e++)logToConsole(" audio track "+
e+" enabled:"+d[e].enabled);for(e=0;e<b.length;e++)logToConsole(" video track "+e+" enabled:"+b[e].enabled);d.length&&(this._remoteStream=a.stream,this._remoteStream.onended=function(){logToConsole("Remote Stream Ended")});this._displayInRemoteVideoPaneIfPossible()};this._onRemoteStreamRemoved=function(){logToConsole("Remote stream removed")};this._setLocalAndSendMessage=function(a){this._localSdp=a;this._localSdp.sdp=this._modifyLocalSdp(a.sdp);this._refreshMediaContribution(this._doMainAudio,this._doMainVideo);
this._refreshSendLocalSdp()};this._refreshSendLocalSdp=function(){if(this._rtcPeerConnection){logToConsole("refreshSendLocalSdp: candidates:"+JSON.stringify(this._localCandidates)+" _localSdpState:"+this._localSdpState);var a="not_sent"==this._localSdpState;if(this._localCandidates.length&&a){logToConsole("checking local sdp:");logToConsole(this._localSdp.sdp);a=this._localSdp.sdp;logToConsole("Sending local sdp");logToConsole(a);this._localSdpState="sending";var b=this;mg_postWithData("localSessionDescription.sf?guid="+
this._guid+"&mediaId="+this._mediaId,function(){logToConsole("local session description sent successfully to server");b._localSdpState="sent"},function(){logToConsole("local session description send failed to server - failures: "+b._localSdpSendFailures);!(10<b._localSdpSendFailures)&&"sending"==b._localSdpState&&(b._localSdpSendFailures++,b._localSdpState="not_sent",b._refreshSendLocalSdp())},a)}}else logToConsole("refreshSendLocalSdp - peer connection null")};this._refreshSendCandidates=function(){if(0!=
this._localCandidatesToSend.length&&"ready_to_send"==this._localCandidatesToSendState){this._localCandidatesToSendState="sending";var a=this._localCandidatesToSend[0],b=this;mg_candidate(this._guid,this._mediaId,{t:"candidate",m:a.sdpMLineIndex,s:a.sdpMid,c:a.candidate,g:this._guid},function(){b._localCandidatesSendFailures=0;b._localCandidatesToSend.shift();b._localCandidatesToSendState="ready_to_send";b._refreshSendCandidates()},function(){if(9<b._localCandidatesSendFailures++){var a=b._localCandidatesToSend.shift();
a&&logToConsole("expunging candidate - unable to trickle: "+JSON.stringify(a))}b._localCandidatesToSendState="ready_to_send";b._refreshSendCandidates()})}};this._modifyRemoteSdp=function(a){return a};this._modifyLocalSdp=function(a){var b=a.split("\r\n"),d=!1,e=!1;a=[];for(var f=[],h=[],j=null,l=null,m=[],n=[],g=0;g<b.length;g++)if(-1!==b[g].search("m=video"))j=g;else if(null!=j){if(-1!==b[g].search("m=")){l=g;break}if(-1!==b[g].search("a=ssrc-group:"))n=b[g].match(/\S+/g),n.shift(),m.push(g-j);else if(-1!==
b[g].search("a=ssrc:")){null==l&&(l=g);var k=b[g].split(" ")[0],p=k.split(":")[1];1<=n.indexOf(p)?m.push(g-j):(0>a.indexOf(k)&&(a.push(k),f[a.length-1]=[]),-1!==b[g].search(" label:")&&(p=this._getLocalStreamVideoTracks(),null!=this._localDesktopStream&&!e?(b[g]=k+" label:slides",e=!0):0<p.length&&!d?(b[g]=k+" label:main",d=!0):k&&logToConsole("ssrc found - unknown stream "+k)),f[a.length-1].push(b[g]))}}null==l&&(l=b.length-1);null!=j&&(h=b.splice(j,l-j));for(g=0;g<m.length;g++)h.splice(m[g]-g,1);
b=b.splice(0,j);b=b.concat(h);for(g=0;g<a.length;g++)b=b.concat(f[g]);b.push("");return b.join("\r\n")};this._refreshMediaContribution=function(a,b){this._doMainAudio=a;this._doMainVideo=b;null==this._localSdp||null==this._rtcPeerConnection||(this._rtcPeerConnection.setLocalDescription(this._localSdp,function(){logToConsole("setLocalDescription success")},function(a){logToConsole("setLocalDescription failure "+JSON.stringify(a))}),null!=this._remoteSdp&&this._rtcPeerConnection.setRemoteDescription(this._remoteSdp,
function(){logToConsole("success remote description (1)")},function(a){logToConsole("failure remote description (1) "+JSON.stringify(a))}))};this._displayInRemoteVideoPaneIfPossible=function(){if(null!=this._rtcPeerConnection&&null!=this._remoteStream){var a=$("#main_video"),b=URL.createObjectURL(this._remoteStream);a.attr("displayGuid",this._guid+this._mediaId);a.attr("src",b);a.css("opacity",1);var d=this;a.onerror=function(){console.error("Remote Stream Error");stopTracksOnStream(d._remoteStream)};
$(a).show();d=this;configureVideoEventHandlers({onMouseDown:function(a,c,b){d._onMouseDown(a,c,b)},onMouseUp:function(a,c,b){d._onMouseUp(a,c,b)},onMouseMove:function(a,c,b){d._onMouseMove(a,c,b)},onMouseWheel:function(a,c,b){d._onMouseWheel(a,c,b)}})}};this._onMouseDown=function(a,b,d){a="m"+b+","+d+","+buttonNumberToString(a)+"d";this._dataChannelSend(a)};this._onMouseUp=function(a,b,d){a="m"+b+","+d+","+buttonNumberToString(a);this._dataChannelSend(a)};this._onMouseMove=function(a,b,d){b="m"+b+
","+d+",";0!=a&&(b+=buttonNumberToString(a)+"d");this._dataChannelSend(b)};this._onMouseWheel=function(a,b,d){b="w"+b+","+d+",";this._dataChannelSend(a?b+"d":b+"u")};this._setRemoteDescription=function(a){if(null!=this._rtcPeerConnection&&"sent"==this._localSdpState)if(this._remoteSdp){logToConsole("already set remote SDP - updating peer connection with remote candidates");a=getCandidatesFromSdp(a.sdp);for(var b=0;b<a.length;b++)this._rtcPeerConnection.addIceCandidate(a[b])}else a.sdp=this._modifyRemoteSdp(a.sdp),
this._rtcPeerConnection.setRemoteDescription(a,function(){logToConsole("success remote description (2)")},function(a){logToConsole("failure remote description (2) "+JSON.stringify(a))}),this._remoteSdp=a};this._configureDtmfSender=function(){if(null==this._dtmfSender&&null!=this._rtcPeerConnection){var a;try{a=this._rtcPeerConnection.getLocalStreams()[0].getAudioTracks()}catch(b){return}if(0!=a.length){var d=this;try{this._dtmfSender=this._rtcPeerConnection.createDTMFSender(a[0]),this._dtmfSender.ontonechange=
function(a){d._dtmfTonePlayout(a)}}catch(e){logToConsole("failure creating dtmf sender")}logToConsole("created DTMF sender!")}}};this._canSendDTMF=function(){return null==this._dtmfSender?!1:this._dtmfSender.canInsertDTMF};this._sendDTMF=function(a){if(!this._canSendDTMF())return!1;this._dtmfSender.insertDTMF(a);return!0};this._dtmfTonePlayout=function(a){logToConsole("dtmf tone:"+a.tone+" played out")};this._configureDataChannel=function(){var a=this;this._rtcPeerConnection.ondatachannel=function(b){a._dataChannelOnCreate(b)};
try{this._dataChannel=this._rtcPeerConnection.createDataChannel("SfChannel",{reliable:!1})}catch(b){logToConsole("failure to create data channel");return}this._dataChannel.onmessage=function(b){a._dataChannelOnMessage(b)};this._dataChannel.onopen=function(){a._dataChannelOnOpen()};this._dataChannel.onclose=function(){a._dataChannelOnClose()}};this._dataChannelOnCreate=function(){logToConsole("dataChannelOnCreate "+this._guid)};this._dataChannelOnMessage=function(){logToConsole("dataChannelOnMessage "+
this._guid)};this._dataChannelSend=function(a){if(this._dataChannelIsOpen())try{this._dataChannel.send(a)}catch(b){}};this._dataChannelOnOpen=function(){};this._dataChannelOnClose=function(){logToConsole("data channel closed");this._dataChannel=null};this._dataChannelIsOpen=function(){return null==this._dataChannel||"open"!=this._dataChannel.readyState?!1:!0};this._reset()}function getRemoteStreamAudioTracks(a){if(null==a)return[];var c;try{c=a.getAudioTracks()}catch(b){c=a.audioTracks}return c}
function getRemoteStreamVideoTracks(a){if(null==a)return[];var c;try{c=a.getVideoTracks()}catch(b){c=a.videoTracks}return c}
function getCandidatesFromSdp(a){var c=[];a=a.split("\r\n");for(var b=-1,d=0;d<a.length;d++)if(-1!==a[d].search("m=audio"))b=0;else if(-1!==a[d].search("m=video"))b=1;else if(-1!==a[d].search("m=application"))b=2;else if(0<=b&&-1!==a[d].search("a=candidate")){var e=a[d]+"\r\n";logToConsole("remote candidate "+e);e=new RTCIceCandidate({sdpMLineIndex:b,candidate:e});c.push(e)}return c}function buttonNumberToString(a){switch(a){case 1:return"l";case 2:return"m";case 3:return"r";default:return""}}
function refreshCreatePeerConnection(){for(var a=0;a<peerConnectionStateArray.length;a++)peerConnectionStateArray[a]._refreshCreatePeerConnection()}function extractSdp(a,c){var b=a.match(c);return b&&2==b.length?b[1]:null}function setDefaultCodec(a,c){for(var b=a.split(" "),d=[],e=0,f=0;f<b.length;f++)3===e&&(d[e++]=c),b[f]!==c&&(d[e++]=b[f]);return d.join(" ")}
function contributeMediaSdp(a,c,b){a=a.split("\r\n");for(var d=0;d<a.length;d++)if(-1!==a[d].search("m=audio"))var e=d;else if(-1!==a[d].search("m=video"))var f=d;if(null!==e)for(d=e+1;d<a.length&&-1===a[d].search("m=");d++){if(-1!==a[d].search("a=sendrecv")||-1!==a[d].search("a=sendonly")||-1!==a[d].search("a=recvonly")||-1!==a[d].search("a=inactive"))a[d]=c?"a=sendrecv":"a=recvonly";if(-1!==a[d].search("opus/48000")){var h=extractSdp(a[d],/:(\d+) opus\/48000/i);h&&(a[e]=setDefaultCodec(a[e],h))}}if(null!==
f)for(d=f+1;d<a.length&&-1===a[d].search("m=");d++)if(-1!==a[d].search("a=sendrecv")||-1!==a[d].search("a=sendonly")||-1!==a[d].search("a=recvonly")||-1!==a[d].search("a=inactive")){a[d]=b?"a=sendrecv":"a=recvonly";break}return a=a.join("\r\n")}function mediaStop(a){reconfigureMedia(a,!1,!1,!1,!1)}
function mediaMaybePerformReinvite(a,c,b,d){var e=!1,f=!0;switch(c){case "endpointConnectionStateChanged":e=!0;break;case "activeCallContributingMedia":f=!1;e=!0;break;case "noLayoutsAvailable":e=!0}if(e)for(c=0;c<peerConnectionStateArray.length;c++)if(e=peerConnectionStateArray[c],e._guid==a&&null!=e._localSdp){f&&mediaStop(a);reconfigureMedia(a,!0,b,d);break}}
function reconfigureMedia(a,c,b,d){for(var e=0;e<peerConnectionStateArray.length;e++)if(peerConnectionStateArray[e]._guid==a){c?peerConnectionStateArray[e]._refreshMediaContribution(b,d):(a=peerConnectionStateArray[e],peerConnectionStateArray.splice(e,1),a._destroy());return}null!=a&&c&&(a=new PeerConnectionState(a),peerConnectionStateArray.push(a),a._doMainAudio=b,a._doMainVideo=d,a._refreshCreatePeerConnection())}
function configurePeerConnection(a){var c=havePeerConnectionConfig&&!peerConnectionConfig.turn.enabled&&"undefined"!=typeof a.turn;havePeerConnectionConfig=!0;var b={};"undefined"!=typeof a.turn?(b.enabled=!0,b.port=a.turn.port,b.tcpPort=a.turn.tcpPort,b.address=a.turn.address,b.user=a.turn.user,b.password=a.turn.password):b.enabled=!1;peerConnectionConfig.turn=b;webkitPeerConnectionConfig.iceServers=[];peerConnectionConfig.turn.enabled&&(a={},a.url="turn:"+peerConnectionConfig.turn.user+"@"+peerConnectionConfig.turn.address+
":"+peerConnectionConfig.turn.port,a.username=peerConnectionConfig.turn.user,a.credential=peerConnectionConfig.turn.password,webkitPeerConnectionConfig.iceServers.push(a),a={},a.url="turn:"+peerConnectionConfig.turn.user+"@"+peerConnectionConfig.turn.address+":"+peerConnectionConfig.turn.tcpPort,a.url+="?transport=tcp",a.username=peerConnectionConfig.turn.user,a.credential=peerConnectionConfig.turn.password,webkitPeerConnectionConfig.iceServers.push(a));webkitPeerConnectionConfigSet=!0;c?resetActiveCallPeerConnection():
refreshCreatePeerConnection()}
function handleHtml5VideoMessage(a){var c=!1;if("peerConnectionConfigure"==a.name)logToConsole("Configure Peer Connection"),configurePeerConnection(a),c=!0;else if("remoteSdp"==a.name){logToConsole("Remote Sdp Received");logToConsole(a.sdp);for(c=0;c<peerConnectionStateArray.length;c++)if(peerConnectionStateArray[c]._guid==a.guid){a.type="answer";var b=new RTCSessionDescription(a);peerConnectionStateArray[c]._setRemoteDescription(b)}c=!0}c||alert("unhandled html5 video message")}
function onUserMediaSuccess(a){logToConsole("User has granted access to local media; stream="+a);localStream=a;localStreamFake=!1;session_parameters.cached_local_input_device_details=getLocalInputDeviceDetails();refreshCameraMuteState();refreshMicrophoneMuteState();if(0<getLocalVideoStreams().length){a=URL.createObjectURL(localStream);var c=$("#mini_video");c.attr("src",a);c.css("opacity",1);c.show()}configureLocalAudioContext();haveUserMediaResponse=!0;resetActiveCallPeerConnection();configureVideoPreview();
"function"===typeof refreshDeviceSettingsPanel&&refreshDeviceSettingsPanel();"function"===typeof buildUI&&buildUI()}function mediaHadGetUserMediaResponse(){return haveUserMediaResponse}function mediaGetUserRequestPeriodPassed(){var a=0;null!=lastUserMediaRequest&&(a=Date.now()-lastUserMediaRequest);return 750<a}
function resetActiveCallPeerConnection(){for(var a=0;a<peerConnectionStateArray.length;a++)if(peerConnectionStateArray[a]._guid==active_call_guid){peerConnectionStateArray[a]._reset();peerConnectionStateArray[a]._refreshCreatePeerConnection();break}}function onDesktopMediaEnd(){localDesktopStream=null;resetActiveCallPeerConnection()}
function onDesktopMediaSuccess(a){ensureFlyoverPanelClosed();logToConsole("User has granted access to local desktop; stream="+a);localDesktopStream=a;localDesktopStream.onended=onDesktopMediaEnd;localDesktopStream.oninactive=onDesktopMediaEnd;0<getLocalDesktopVideoStreams().length&&resetActiveCallPeerConnection();gettingDesktopMedia=!1}function videoPreviewImage(){return!1}
function configureVideoPreview(){if(0!=getLocalVideoStreams().length&&null!=ui.managementView&&null!=settingsVideoPreview){var a=URL.createObjectURL(localStream),c=$(settingsVideoPreview.previewElm);c.attr("src",a);c.css("opacity",1);c.show();settingsVideoPreview.update()}}function calculateVolume(a){if(0==a.length)return 0;for(var c=0,b=0;b<a.length;b++)c+=a[b];return c/a.length}
function onUserMediaError(){if(webkitGetUseMediaAudioOnly){var a=translate(lan.notifications_media_failed);showNotificationPanel(a,"error");try{localStream=new webkitMediaStream,localStreamFake=!0}catch(c){}haveUserMediaResponse=!0;refreshCreatePeerConnection()}else logToConsole("error occured accessing local media - attempting to access local media audio only..."),webkitGetUseMediaAudioOnly=!0,getUserMedia()}
function getUserMedia(){null==lastUserMediaRequest&&setTimeout(refreshCameraPermissionRequestedScreen,750);lastUserMediaRequest=Date.now();getUserMediaInternal(last_audio_source_id,last_video_source_id)}
function getUserMediaInternal(a,c){null!=localStream&&stopTracksOnStream(localStream);var b,d;b={mandatory:{},optional:[]};webkitGetUseMediaAudioOnly||(d={mandatory:{},optional:[{minHeight:720},{minWidth:1280},{minFrameRate:30}]});b&&(null!=a&&b.optional.push({sourceId:a}),webkitRenderToAssociatedSink&&b.optional.push({chromeRenderToAssociatedSink:!0}));d&&null!=c&&d.optional.push({sourceId:c});try{navigator.webkitGetUserMedia({audio:b,video:d},onUserMediaSuccess,onUserMediaError);newestMediaChange=
!0;return}catch(e){}try{navigator.webkitGetUserMedia({audio:!0,video:!webkitGetUseMediaAudioOnly},onUserMediaSuccess,onUserMediaError);newestMediaChange=!0;return}catch(f){}try{navigator.webkitGetUserMedia("video,audio",onUserMediaSuccess,onUserMediaError)}catch(h){logToConsole("webkitGetUserMedia failed with exception: "+h.message)}}
function onDesktopMediaError(a){ensureFlyoverPanelClosed();gettingDesktopMedia=!1;var c="Failed to get access to local desktop. Error: "+JSON.stringify(a);logToConsole(c);c=34<checkChromeVersion()&&a&&"PermissionDeniedError"==a.name;"InvalidStateError"===a.name&&(c=!0);c?showNotificationPanel(translate(lan.notifications_share_user_closed),"info"):buildChromeExtensionDownloadInstructionsDialog()}
function getDesktopMedia(){"https:"!=window.location.protocol?onDesktopMediaError({code:"non-https"}):gettingDesktopMedia?showNotificationPanel(translate(lan.notifications_share_confirmation),"error"):(gettingDesktopMedia=!0,window.acanoExtension?window.acanoChromeExtension.getSharedScreenId(function(a){var c={};c.video={mandatory:{chromeMediaSource:"desktop",chromeMediaSourceId:a,maxWidth:screen.width,maxHeight:screen.height}};navigator.webkitGetUserMedia(c,onDesktopMediaSuccess,onDesktopMediaError)}):
onDesktopMediaError({code:"unsupported"}))}function stopDesktopMedia(){null!=localDesktopStream&&stopTracksOnStream(localDesktopStream)}function refreshLocalInputDeviceUsage(a){if(!localStreamFake){var c=null!=localStream;c&&!a?(stopTracksOnStream(localStream),localStream=null,haveUserMediaResponse=!1,session_parameters.cached_local_input_device_details=null):!c&&a&&getUserMedia()}}
function getLocalInputDevices(a){var c={microphones:[],cameras:[]};if(!MediaStreamTrack||!MediaStreamTrack.getSources){var b=getLocalVideoStreams(),d=getLocalAudioStreams();if(0<d.length){var d=d[0],e={};e.label=d.label;e.id=d.id;e.active=last_audio_source_id==d.id;c.microphones.push(e)}0<b.length&&(b=b[0],d={},d.label=b.label,d.id=b.id,d.active=last_video_source_id==b.id,c.cameras.push(d));a(c)}else MediaStreamTrack.getSources(function(b){getLocalInputDevicesOnSuccessFn(b,a)})}
function setWebcamAndMicById(a,c){null!=a&&(last_audio_source_id=a);null!=c&&(last_video_source_id=c);getUserMedia()}
function getLocalInputDevicesOnSuccessFn(a,c){var b={microphones:[],cameras:[]};getLocalVideoStreams();getLocalAudioStreams();for(var d=0;d<a.length;d++){var e=a[d];if("audio"===e.kind){var f={};f.label=e.label;f.id=e.id;f.active=last_audio_source_id==f.id;b.microphones.push(f)}else"video"===e.kind&&(f={},f.label=e.label,f.id=e.id,f.frontFacing="string"===typeof e.facing&&"user"===e.facing,f.rearFacing="string"===typeof e.facing&&"environment"===e.facing,f.active=last_video_source_id==f.id,b.cameras.push(f))}c(b)}
function getLocalInputDeviceDetails(){if(!localStream)return null;var a={},c=getLocalVideoStreams(),b=getLocalAudioStreams();c.length?(a.camera=!0,a.cameraName=c[0].label):a.camera=!1;b.length?(a.microphone=!0,a.microphoneName=b[0].label):a.microphone=!1;return a}function getLocalDesktopVideoStreams(){return!localDesktopStream?[]:localDesktopStream.getVideoTracks()}
function getLocalVideoStreams(){if(!localStream)return[];var a;try{a=localStream.getVideoTracks()}catch(c){a=localStream.videoTracks}return a}function refreshCameraMuteState(){for(var a=getLocalVideoStreams(),c=0;c<a.length;c++)a[c].enabled=!cameraShouldBeMuted}function getLocalAudioStreams(){if(!localStream)return[];var a;try{a=localStream.getAudioTracks()}catch(c){a=localStream.audioTracks}return a}
function refreshMicrophoneMuteState(){for(var a=getLocalAudioStreams(),c=0;c<a.length;c++)a[c].enabled=!microphoneShouldBeMuted}function onMicActivity(){}function mediaMuteCamera(a){cameraShouldBeMuted=a;refreshCameraMuteState()}function mediaMuteMicrophone(a){microphoneShouldBeMuted=a;refreshMicrophoneMuteState()}$(window).resize(sizeVideoOnWindowResize);
function sizeVideoOnWindowResize(){var a=$("#main_video").outerHeight()-$("#main_video").height(),c=0;$("#header").is(":visible")&&(c=$("#header").outerHeight(!0));a=$("html").outerHeight()-c-a;$("#main_video").css("max-height",a+"px");if(null!=ui.conferenceView){var a=$(ui.conferenceView.sidePanel.htmlElement).outerWidth(),c=$("#content").height(),b=$("#content").width();ui.conferenceView.sidePanel.open&&(b-=Math.ceil(a+1));$("#main_video").width(b);$("#main_video").height(c);null!=active_call_guid&&
mg_sendSizeHint(b,c)}};
,
Dec 27
thanks, that is very helpful (and we know that getUserMedia works in general). It looks like part of the failures are related to the removal of URL.createObjectURL: https://bugs.chromium.org/p/chromium/issues/detail?id=800767&desc=2 -- this has been announced back in January and seems to have landed in 71.0.3549.0 according to omahaproxy: https://storage.googleapis.com/chromium-find-releases-static/d38.html#d38023cc2b6816e5c2d5d4f1d290306de3d01a70 oddly it does not show up in the release notes... blum@ can you check why not? If Cisco has not prepared for that... I wonder if injecting Jan-Ivars reverse URL.createObjectURL polyfill (which uses srcObject) via an extension would fix this... barrycoupang: in the first screenshot there is another red error showing "uncaught in promise". Can you reproduce and click the arrow icon on the left to expand this? It might also be good to load the page with the console already open.
,
Dec 27
,
Dec 27
ah... URL.createObjectURL was not removed but simply throws the error. To replicate simply paste this on https://webrtc.github.io/samples/src/content/getusermedia/gum/ after getting the camera: URL.createObjectURL(stream) barrycoupang: not sure how comfortable you feel with sideloading an extension but you might try this: 1) unzip the attached extension, read the content.js file to make sure it does not do anything evil (its fairly short) 2) go to chrome://extensions, enable developer mode 3) click "load unpacked extension" at the top of that page 4) select the folder where you unzipped the extension 5) go to the CMA page. If it works now... The extension injects a content script which overrides URL.createObjectURL with a custom version that magically makes things work -- at least on the webrtc.github.io example.
,
Dec 27
You can try bisect-builds https://www.chromium.org/developers/bisect-builds-py to try to find in which version it broke. If the reason is createObjectURL, then this is indeed an application bug.
,
Dec 27
@c69, here you go:
function initVideo(){element_video=document.createElement("video");document.getElementById("video_wrapper").appendChild(element_video);element_video.id="main_video";element_video.autoplay="autoplay";element_video.addEventListener("loadedmetadata",metadataListener);element_video.onmouseover=videoOnMouseOver;element_video.onmouseout=videoOnMouseOut;element_video.oncontextmenu=function(){return!1};registerMouseWheelEventListener();ui.conferenceViewSelfView.configureWithVideo(!0);var a=new Html5SoundPlayer("sounds/message_tx.ogg",
0);a.setVolume(0.2);var b=new Html5SoundPlayer("sounds/message_rx.ogg",0);b.setVolume(0.2);var c=new Html5SoundPlayer("sounds/join_call.ogg",0),d=new Html5SoundPlayer("sounds/leave_call.ogg",0);session_parameters.sounds.ringing=new Html5SoundPlayer("sounds/ring.ogg",6500);session_parameters.sounds.ringback=new Html5SoundPlayer("sounds/ringback.ogg",5E3);session_parameters.sounds.login=new Html5SoundPlayer("sounds/login.ogg",0);session_parameters.sounds.messageTx=a;session_parameters.sounds.messageRx=
b;session_parameters.sounds.joinCall=c;session_parameters.sounds.leaveCall=d;a={};for(b=0;b<dtmfKeys.length;b++)c=dtmfKeys[b],a[c]=new Html5SoundPlayer("sounds/dtmf/"+c+".ogg",0),a[c].prefetch();session_parameters.sounds.dtmf=a;session_parameters.sounds.login.start()}
function Html5SoundPlayer(a,b){this.audio=document.createElement("audio");this.audio.src=a;this.audio.autoplay="";this.audio.controls="";this.loopRepeatMs=b;this.loopTimer=null;this.enabled=!1;this.enable=function(a){this.enabled!=a&&((this.enabled=a)?this.start():this.stop())};this.setVolume=function(a){this.audio.volume=a};this.prefetch=function(){this.audio.load()};this.start=function(){this.playing=!0;this.audio.load();this.audio.play();if(0<this.loopRepeatMs){var a=this;this.loopTimer=setTimeout(function(){a.restart()},
this.loopRepeatMs)}};this.stop=function(){this.playing=!1;this.audio.pause();clearTimeout(this.loopTimer)};this.restart=function(){this.stop();this.start()}}var videoMetaDataValid=!1,videoMetaData={},videoHandlers={},videoWheelEnabled=!1,initialVideoVolume=0.85;function videoWrapperEnsureVisible(a){a?$("#video_wrapper").show():$("#video_wrapper").hide()}
function metadataListener(){videoMetaDataValid=!0;videoMetaData.width=this.videoWidth;videoMetaData.height=this.videoHeight;this.volume=initialVideoVolume;this.muted=!1;sizeVideoOnWindowResize();setTimeout(buildUI,300)}function setPlaybackAudioLevel(a){videoMetaDataValid?element_video.volume=a:initialVideoVolume=a}function isFullScreenVideo(){return document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement}
function requestFullScreenVideo(){var a=document.getElementById("width");a.mozRequestFullScreen?a.mozRequestFullScreen():a.webkitRequestFullScreen&&a.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT);setTimeout(sizeVideoOnWindowResize,1E3)}function cancelFullScreenVideo(){document.cancelFullScreen?document.cancelFullScreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitCancelFullScreen&&document.webkitCancelFullScreen()}
function registerMouseWheelEventListener(){var a=/Firefox/i.test(navigator.userAgent)?"DOMMouseScroll":"mousewheel";element_video.attachEvent?element_video.attachEvent("on"+a,videoOnMouseWheel):element_video.addEventListener&&element_video.addEventListener(a,videoOnMouseWheel,!1)}
function videoOnMouseWheel(a){if(videoWheelEnabled){a=a||window.event;var b=a.detail?-120*a.detail:a.wheelDelta,c=getMousePositionInVideoFromEvent(a);if(null!=c){if(0!=b&&null!=videoHandlers.onMouseWheel)videoHandlers.onMouseWheel(0>b,c.x,c.y);if(a.preventDefault)a.preventDefault();else return!1}}}function videoOnMouseDown(a){a=a||window.event;var b=a.which||a.button;a=getMousePositionInVideoFromEvent(a);if(null!=a&&null!=videoHandlers.onMouseDown)videoHandlers.onMouseDown(b,a.x,a.y)}
function videoOnMouseUp(a){a=a||window.event;var b=a.which||a.button;a=getMousePositionInVideoFromEvent(a);if(null!=a&&null!=videoHandlers.onMouseUp)videoHandlers.onMouseUp(b,a.x,a.y)}function videoOnMouseOut(){element_video.onmousemove=null;element_video.onmousedown=null;element_video.onmouseup=null;videoWheelEnabled=!1}function videoOnMouseOver(){element_video.onmousemove=videoOnMouseMove;element_video.onmousedown=videoOnMouseDown;element_video.onmouseup=videoOnMouseUp;videoWheelEnabled=!0}
function getMousePositionInVideoFromEvent(a){if(!videoMetaDataValid)return null;var b=$("#main_video"),c=b.offset(),d=c.left,c=c.top,h=b.width(),b=b.height(),e=videoMetaData.width,f=videoMetaData.height;if(0>=e||0>=f)return null;var g=b*e/f,d=a.clientX-(d+(h-g)/2);a=a.clientY-c;return 0>d||0>a?null:{x:Math.floor(d*e/(g*e)*e),y:Math.floor(a*f/(b*f)*f)}}
function videoOnMouseMove(a){a=a||window.event;var b=a.which||a.button;a=getMousePositionInVideoFromEvent(a);if(null!=a&&null!=videoHandlers.onMouseMove)videoHandlers.onMouseMove(b,a.x,a.y)}function configureVideoEventHandlers(a){videoHandlers.onMouseDown=a.onMouseDown;videoHandlers.onMouseUp=a.onMouseUp;videoHandlers.onMouseMove=a.onMouseMove;videoHandlers.onMouseWheel=a.onMouseWheel}
$(document).ready(function(){logToConsole("scripts/main_video.js");initVideo();configureVideoEventHandlers({onMouseDown:null,onMouseUp:null,onMouseMove:null,onMouseWheel:null});webkitRTCPeerConnectionAvailable?$.getScript("scripts/webkit_peer_connection.js"):mozRTCPeerConnectionAvailable&&$.getScript("scripts/moz_peer_connection.js")});
,
Dec 27
down arrow on left expands to: Html5SoundPlayer.start @ VM163:4 initVideo @ VM163:3 (anonymous) @ VM163:13 i @ jquery.js:2 add @ jquery.js:2 n.fn.ready @ jquery.js:2 (anonymous) @ VM163:13 (anonymous) @ jquery.js:2 globalEval @ jquery.js:2 text script @ jquery.js:4 Wb @ jquery.js:4 y @ jquery.js:4 c @ jquery.js:4 XMLHttpRequest.send (async) send @ jquery.js:4 ajax @ jquery.js:4 n.(anonymous function) @ jquery.js:4 getScript @ jquery.js:4 (anonymous) @ VM162:1 i @ jquery.js:2 add @ jquery.js:2 n.fn.ready @ jquery.js:2 (anonymous) @ VM162:1 (anonymous) @ jquery.js:2 globalEval @ jquery.js:2 text script @ jquery.js:4 Wb @ jquery.js:4 y @ jquery.js:4 c @ jquery.js:4 XMLHttpRequest.send (async) send @ jquery.js:4 ajax @ jquery.js:4 n.(anonymous function) @ jquery.js:4 getScript @ jquery.js:4 load_script @ script_booter.js?h=1…9f01467bf3568b107:2 script_loaded @ script_booter.js?h=1…9f01467bf3568b107:3 (anonymous) @ VM161:1 i @ jquery.js:2 add @ jquery.js:2 n.fn.ready @ jquery.js:2 (anonymous) @ VM161:1 (anonymous) @ jquery.js:2 globalEval @ jquery.js:2 text script @ jquery.js:4 Wb @ jquery.js:4 y @ jquery.js:4 c @ jquery.js:4 XMLHttpRequest.send (async) send @ jquery.js:4 ajax @ jquery.js:4 n.(anonymous function) @ jquery.js:4 getScript @ jquery.js:4 load_script @ script_booter.js?h=1…9f01467bf3568b107:2 script_loaded @ script_booter.js?h=1…9f01467bf3568b107:3 (anonymous) @ VM160:1 i @ jquery.js:2 add @ jquery.js:2 n.fn.ready @ jquery.js:2 (anonymous) @ VM160:1 (anonymous) @ jquery.js:2 globalEval @ jquery.js:2 text script @ jquery.js:4 Wb @ jquery.js:4 y @ jquery.js:4 c @ jquery.js:4 XMLHttpRequest.send (async) send @ jquery.js:4 ajax @ jquery.js:4 n.(anonymous function) @ jquery.js:4 getScript @ jquery.js:4 load_script @ script_booter.js?h=1…9f01467bf3568b107:2 script_loaded @ script_booter.js?h=1…9f01467bf3568b107:3 (anonymous) @ VM159:1 i @ jquery.js:2 add @ jquery.js:2 n.fn.ready @ jquery.js:2 (anonymous) @ VM159:1 (anonymous) @ jquery.js:2 globalEval @ jquery.js:2 text script @ jquery.js:4 Wb @ jquery.js:4 y @ jquery.js:4 c @ jquery.js:4 XMLHttpRequest.send (async) send @ jquery.js:4 ajax @ jquery.js:4 n.(anonymous function) @ jquery.js:4 getScript @ jquery.js:4 load_script @ script_booter.js?h=1…9f01467bf3568b107:2 script_loaded @ script_booter.js?h=1…9f01467bf3568b107:3 (anonymous) @ VM158:1 i @ jquery.js:2 add @ jquery.js:2 n.fn.ready @ jquery.js:2 (anonymous) @ VM158:1 (anonymous) @ jquery.js:2 globalEval @ jquery.js:2 text script @ jquery.js:4 Wb @ jquery.js:4 y @ jquery.js:4 c @ jquery.js:4 XMLHttpRequest.send (async) send @ jquery.js:4 ajax @ jquery.js:4 n.(anonymous function) @ jquery.js:4 getScript @ jquery.js:4 load_script @ script_booter.js?h=1…9f01467bf3568b107:2 script_loaded @ script_booter.js?h=1…9f01467bf3568b107:3 (anonymous) @ VM157:1 i @ jquery.js:2 add @ jquery.js:2 n.fn.ready @ jquery.js:2 (anonymous) @ VM157:1 (anonymous) @ jquery.js:2 globalEval @ jquery.js:2 text script @ jquery.js:4 Wb @ jquery.js:4 y @ jquery.js:4 c @ jquery.js:4 XMLHttpRequest.send (async) send @ jquery.js:4 ajax @ jquery.js:4 n.(anonymous function) @ jquery.js:4 getScript @ jquery.js:4 load_script @ script_booter.js?h=1…9f01467bf3568b107:2 script_loaded @ script_booter.js?h=1…9f01467bf3568b107:3 (anonymous) @ VM156:1 i @ jquery.js:2 add @ jquery.js:2 n.fn.ready @ jquery.js:2 (anonymous) @ VM156:1 (anonymous) @ jquery.js:2 globalEval @ jquery.js:2 text script @ jquery.js:4 Wb @ jquery.js:4 y @ jquery.js:4 c @ jquery.js:4 XMLHttpRequest.send (async) send @ jquery.js:4 ajax @ jquery.js:4 n.(anonymous function) @ jquery.js:4 getScript @ jquery.js:4 load_script @ script_booter.js?h=1…9f01467bf3568b107:2 script_loaded @ script_booter.js?h=1…9f01467bf3568b107:3 (anonymous) @ VM155:1 i @ jquery.js:2 add @ jquery.js:2 n.fn.ready @ jquery.js:2 (anonymous) @ VM155:1 (anonymous) @ jquery.js:2 globalEval @ jquery.js:2 text script @ jquery.js:4 Wb @ jquery.js:4 y @ jquery.js:4 c @ jquery.js:4 XMLHttpRequest.send (async) send @ jquery.js:4 ajax @ jquery.js:4 n.(anonymous function) @ jquery.js:4 getScript @ jquery.js:4 load_script @ script_booter.js?h=1…9f01467bf3568b107:2 script_loaded @ script_booter.js?h=1…9f01467bf3568b107:3 (anonymous) @ VM154:1 i @ jquery.js:2 add @ jquery.js:2 n.fn.ready @ jquery.js:2 (anonymous) @ VM154:1 (anonymous) @ jquery.js:2 globalEval @ jquery.js:2 text script @ jquery.js:4 Wb @ jquery.js:4 y @ jquery.js:4 c @ jquery.js:4 XMLHttpRequest.send (async) send @ jquery.js:4 ajax @ jquery.js:4 n.(anonymous function) @ jquery.js:4 getScript @ jquery.js:4 load_script @ script_booter.js?h=1…9f01467bf3568b107:2 script_loaded @ script_booter.js?h=1…9f01467bf3568b107:3 (anonymous) @ VM153:1 i @ jquery.js:2 add @ jquery.js:2 n.fn.ready @ jquery.js:2 (anonymous) @ VM153:1 (anonymous) @ jquery.js:2 globalEval @ jquery.js:2 text script @ jquery.js:4 Wb @ jquery.js:4 y @ jquery.js:4 c @ jquery.js:4 XMLHttpRequest.send (async) send @ jquery.js:4 ajax @ jquery.js:4 n.(anonymous function) @ jquery.js:4 getScript @ jquery.js:4 load_script @ script_booter.js?h=1…9f01467bf3568b107:2 script_loaded @ script_booter.js?h=1…9f01467bf3568b107:3 (anonymous) @ VM152:1 i @ jquery.js:2 add @ jquery.js:2 n.fn.ready @ jquery.js:2 (anonymous) @ VM152:1 (anonymous) @ jquery.js:2 globalEval @ jquery.js:2 text script @ jquery.js:4 Wb @ jquery.js:4 y @ jquery.js:4 c @ jquery.js:4 XMLHttpRequest.send (async) send @ jquery.js:4 ajax @ jquery.js:4 n.(anonymous function) @ jquery.js:4 getScript @ jquery.js:4 load_script @ script_booter.js?h=1…9f01467bf3568b107:2 script_loaded @ script_booter.js?h=1…9f01467bf3568b107:3 (anonymous) @ VM151:1 i @ jquery.js:2 add @ jquery.js:2 n.fn.ready @ jquery.js:2 (anonymous) @ VM151:1 (anonymous) @ jquery.js:2 globalEval @ jquery.js:2 text script @ jquery.js:4 Wb @ jquery.js:4 y @ jquery.js:4 c @ jquery.js:4 XMLHttpRequest.send (async) send @ jquery.js:4 ajax @ jquery.js:4 n.(anonymous function) @ jquery.js:4 getScript @ jquery.js:4 load_script @ script_booter.js?h=1…9f01467bf3568b107:2 script_loaded @ script_booter.js?h=1…9f01467bf3568b107:3 (anonymous) @ VM150:1 i @ jquery.js:2 add @ jquery.js:2 n.fn.ready @ jquery.js:2 (anonymous) @ VM150:1 (anonymous) @ jquery.js:2 globalEval @ jquery.js:2 text script @ jquery.js:4 Wb @ jquery.js:4 y @ jquery.js:4 c @ jquery.js:4 XMLHttpRequest.send (async) send @ jquery.js:4 ajax @ jquery.js:4 n.(anonymous function) @ jquery.js:4 getScript @ jquery.js:4 load_script @ script_booter.js?h=1…9f01467bf3568b107:2 script_loaded @ script_booter.js?h=1…9f01467bf3568b107:3 (anonymous) @ VM149:1 i @ jquery.js:2 add @ jquery.js:2 n.fn.ready @ jquery.js:2 (anonymous) @ VM149:1 (anonymous) @ jquery.js:2 globalEval @ jquery.js:2 text script @ jquery.js:4 Wb @ jquery.js:4 y @ jquery.js:4 c @ jquery.js:4 XMLHttpRequest.send (async) send @ jquery.js:4 ajax @ jquery.js:4 n.(anonymous function) @ jquery.js:4 getScript @ jquery.js:4 load_script @ script_booter.js?h=1…9f01467bf3568b107:2 script_loaded @ script_booter.js?h=1…9f01467bf3568b107:3 (anonymous) @ VM148:1 i @ jquery.js:2 add @ jquery.js:2 n.fn.ready @ jquery.js:2 (anonymous) @ VM148:1 (anonymous) @ jquery.js:2 globalEval @ jquery.js:2 text script @ jquery.js:4 Wb @ jquery.js:4 y @ jquery.js:4 c @ jquery.js:4 XMLHttpRequest.send (async) send @ jquery.js:4 ajax @ jquery.js:4 n.(anonymous function) @ jquery.js:4 getScript @ jquery.js:4 load_script @ script_booter.js?h=1…9f01467bf3568b107:2 script_loaded @ script_booter.js?h=1…9f01467bf3568b107:3 (anonymous) @ VM147:1 i @ jquery.js:2 add @ jquery.js:2 n.fn.ready @ jquery.js:2 (anonymous) @ VM147:1 (anonymous) @ jquery.js:2 globalEval @ jquery.js:2 text script @ jquery.js:4 Wb @ jquery.js:4 y @ jquery.js:4 c @ jquery.js:4 XMLHttpRequest.send (async) send @ jquery.js:4 ajax @ jquery.js:4 n.(anonymous function) @ jquery.js:4 getScript @ jquery.js:4 load_script @ script_booter.js?h=1…9f01467bf3568b107:2 script_loaded @ script_booter.js?h=1…9f01467bf3568b107:3 (anonymous) @ VM146:1 i @ jquery.js:2 add @ jquery.js:2 n.fn.ready @ jquery.js:2 (anonymous) @ VM146:1 (anonymous) @ jquery.js:2 globalEval @ jquery.js:2 text script @ jquery.js:4 Wb @ jquery.js:4 y @ jquery.js:4 c @ jquery.js:4 XMLHttpRequest.send (async) send @ jquery.js:4 ajax @ jquery.js:4 n.(anonymous function) @ jquery.js:4 getScript @ jquery.js:4 load_script @ script_booter.js?h=1…9f01467bf3568b107:2 script_loaded @ script_booter.js?h=1…9f01467bf3568b107:3 (anonymous) @ VM145:1 i @ jquery.js:2 add @ jquery.js:2 n.fn.ready @ jquery.js:2 (anonymous) @ VM145:1 (anonymous) @ jquery.js:2 globalEval @ jquery.js:2 text script @ jquery.js:4 Wb @ jquery.js:4 y @ jquery.js:4 c @ jquery.js:4 XMLHttpRequest.send (async) send @ jquery.js:4 ajax @ jquery.js:4 n.(anonymous function) @ jquery.js:4 getScript @ jquery.js:4 load_script @ script_booter.js?h=1…9f01467bf3568b107:2 script_loaded @ script_booter.js?h=1…9f01467bf3568b107:3 (anonymous) @ VM144:1 i @ jquery.js:2 add @ jquery.js:2 n.fn.ready @ jquery.js:2 (anonymous) @ VM144:1 (anonymous) @ jquery.js:2 globalEval @ jquery.js:2 text script @ jquery.js:4 Wb @ jquery.js:4 y @ jquery.js:4 c @ jquery.js:4 XMLHttpRequest.send (async) send @ jquery.js:4 ajax @ jquery.js:4 n.(anonymous function) @ jquery.js:4 getScript @ jquery.js:4 load_script @ script_booter.js?h=1…9f01467bf3568b107:2 script_loaded @ script_booter.js?h=1…9f01467bf3568b107:3 (anonymous) @ VM143:1 i @ jquery.js:2 add @ jquery.js:2 n.fn.ready @ jquery.js:2 (anonymous) @ VM143:1 (anonymous) @ jquery.js:2 globalEval @ jquery.js:2 text script @ jquery.js:4 Wb @ jquery.js:4 y @ jquery.js:4 c @ jquery.js:4 XMLHttpRequest.send (async) send @ jquery.js:4 ajax @ jquery.js:4 n.(anonymous function) @ jquery.js:4 getScript @ jquery.js:4 load_script @ script_booter.js?h=1…9f01467bf3568b107:2 script_loaded @ script_booter.js?h=1…9f01467bf3568b107:3 (anonymous) @ VM142:1 i @ jquery.js:2 add @ jquery.js:2 n.fn.ready @ jquery.js:2 (anonymous) @ VM142:1 (anonymous) @ jquery.js:2 globalEval @ jquery.js:2 text script @ jquery.js:4 Wb @ jquery.js:4 y @ jquery.js:4 c @ jquery.js:4 XMLHttpRequest.send (async) send @ jquery.js:4 ajax @ jquery.js:4 n.(anonymous function) @ jquery.js:4 getScript @ jquery.js:4 load_script @ script_booter.js?h=1…9f01467bf3568b107:2 script_loaded @ script_booter.js?h=1…9f01467bf3568b107:3 (anonymous) @ VM141:1 i @ jquery.js:2 add @ jquery.js:2 n.fn.ready @ jquery.js:2 (anonymous) @ VM141:1 (anonymous) @ jquery.js:2 globalEval @ jquery.js:2 text script @ jquery.js:4 Wb @ jquery.js:4 y @ jquery.js:4 c @ jquery.js:4 XMLHttpRequest.send (async) send @ jquery.js:4 ajax @ jquery.js:4 n.(anonymous function) @ jquery.js:4 getScript @ jquery.js:4 load_script @ script_booter.js?h=1…9f01467bf3568b107:2 script_loaded @ script_booter.js?h=1…9f01467bf3568b107:3 (anonymous) @ VM140:3 i @ jquery.js:2 add @ jquery.js:2 n.fn.ready @ jquery.js:2 (anonymous) @ VM140:1 (anonymous) @ jquery.js:2 globalEval @ jquery.js:2 text script @ jquery.js:4 Wb @ jquery.js:4 y @ jquery.js:4 c @ jquery.js:4 XMLHttpRequest.send (async) send @ jquery.js:4 ajax @ jquery.js:4 n.(anonymous function) @ jquery.js:4 getScript @ jquery.js:4 load_script @ script_booter.js?h=1…9f01467bf3568b107:2 script_loaded @ script_booter.js?h=1…9f01467bf3568b107:3 (anonymous) @ VM139:1 i @ jquery.js:2 add @ jquery.js:2 n.fn.ready @ jquery.js:2 (anonymous) @ VM139:1 (anonymous) @ jquery.js:2 globalEval @ jquery.js:2 text script @ jquery.js:4 Wb @ jquery.js:4 y @ jquery.js:4 c @ jquery.js:4 XMLHttpRequest.send (async) send @ jquery.js:4 ajax @ jquery.js:4 n.(anonymous function) @ jquery.js:4 getScript @ jquery.js:4 load_script @ script_booter.js?h=1…9f01467bf3568b107:2 script_loaded @ script_booter.js?h=1…9f01467bf3568b107:3 (anonymous) @ VM138:3 i @ jquery.js:2 add @ jquery.js:2 n.fn.ready @ jquery.js:2 (anonymous) @ VM138:1 (anonymous) @ jquery.js:2 globalEval @ jquery.js:2 text script @ jquery.js:4 Wb @ jquery.js:4 y @ jquery.js:4 c @ jquery.js:4 XMLHttpRequest.send (async) send @ jquery.js:4 ajax @ jquery.js:4 n.(anonymous function) @ jquery.js:4 getScript @ jquery.js:4 load_script @ script_booter.js?h=1…9f01467bf3568b107:2 (anonymous) @ script_booter.js?h=1…9f01467bf3568b107:1 i @ jquery.js:2 fireWith @ jquery.js:2 ready @ jquery.js:2 K @ jquery.js:2
,
Dec 27
#74: that sounds like an autoplay issue -- see https://bugs.chromium.org/p/chromium/issues/detail?id=835767 and https://webrtchacks.com/autoplay-restrictions-and-webrtc/ for a nicely written narrative of that drama. Might break some functionality like ringing sounds but I think this is the main failure.
,
Dec 27
@c72, That's the Droid we're looking for! With that installed, CMA video and audio now work same as in Chrome V70 and earlier. What are the next steps toward getting this into a Stable release that Chrome will auto-update to? Or, can you put that into a conventional Chrome extension on the Chrome Web Store that a non-techy end-user can install the same as any other extension?
,
Dec 27
#77: There is nothing to do on the Chrome side. The application is using an API that was deprecated in Chrome 65 and which doesn't exist in any other browser or the spec. This this is an application bug, as everyone suspected since the beginning, and must be fixed by the application author. I suggest you file a bug with Cisco. Closing this bug since this is working as intended.
,
Dec 27
,
Dec 28
Are you saying that no program that uses URL.createObjectURL will be able to access video and audio in Chrome 71+ ?
I studied the links listed in c74.
Since I'm new to a lot of this, why didn't this start with Chrome 66, when similar problems started with the other web meeting products?
Kinda sounds like one of the corollaries to Murphy's law, that says if it ain't broke, don't fix it.
Regardless, thanks for all the help, your gang did a great job helping me pin down where and what the problem is.
Do any of you have direct contact info or links to report a legitimate bug to Cisco? I'm stuck at a dead end with their general support site wanting a login for me to report or reopen a bug. Their bug # CSCvn58291 they declared closed by stating "do not upgrade to Chrome 71" clearly needs re-opening.
,
Dec 28
There are two problems in CMA: 1) using URL.createObjectURL(mediaStream) 2) autoplay woes The gist of the first problem is that videoElement.src = URL.createObjectURL(mediaStream) no longer works as of M71. The alternative (available since March 2016) is videoElement.srcObject = mediaStream This was a planned deprecation and the grace period for updating applications has been a little over two years. The autoplay issue is more complicated. Despite breaking functionality in a bunch of conferencing apps back in April the only reason this was pulled back from Chrome 66 was a huge outcry about the same change breaking a lot of web-based games. Which gives you an estimate what is required to get Chrome to pull back at something... You have three options: 1) take the extension, publish it in the web store and roll it out via mechanisms similar to https://developer.chrome.com/apps/external_extensions -- if possible or ask every user to install it worst-case 2) modify your CMA installation (if it is hosted on premise) to include a javascript file consisting of lines 2-55 of content.js *before* the CMA javascript files. 3) yell at Cisco You might want to combine the third with one of the other two.
,
Dec 28
Harald and I will send a note on this to the Cisco collaboration CTO.
,
Dec 28
@c82, thank you, please copy me on that note, and include my contact info. Then I can do #3 (politely, within their coc), and have the AV ops work on doing #2. Also glad to know that we have your blessings to release an extension as you describe in option 1. |
||||||||||||||||||||
►
Sign in to add a comment |
||||||||||||||||||||
Comment 1 by phanindra.mandapaka@chromium.org
, Dec 15