Advertisement
Guest User

Untitled

a guest
Apr 28th, 2015
215
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.19 KB | None | 0 0
  1. 'use strict';
  2.  
  3. var isChannelReady;
  4. var isInitiator = false;
  5. var isStarted = false;
  6. var localStream;
  7. var pc;
  8. var remoteStream;
  9. var turnReady;
  10.  
  11. var lCan = document.getElementById("localCanvas");
  12. lCan.width = 900;
  13. var lc = lCan.getContext("2d");
  14.  
  15. var pc_config = {'iceServers': [{'url': 'stun:stun.l.google.com:19302'}]};
  16.  
  17. var pc_constraints = {'optional': [{'DtlsSrtpKeyAgreement': true}]};
  18.  
  19. // Set up audio and video regardless of what devices are present.
  20. var sdpConstraints = {'mandatory': {
  21. 'OfferToReceiveAudio':true,
  22. 'OfferToReceiveVideo':true }};
  23.  
  24. /////////////////////////////////////////////
  25.  
  26. var room = location.pathname.substring(1);
  27. if (room === '') {
  28. // room = prompt('Enter room name:');
  29. room = 'foo';
  30. } else {
  31. //
  32. }
  33.  
  34. var socket = io.connect();
  35.  
  36. if (room !== '') {
  37. console.log('Create or join room', room);
  38. socket.emit('create or join', room);
  39. }
  40.  
  41. socket.on('created', function (room){
  42. console.log('Created room ' + room);
  43. isInitiator = true;
  44. });
  45.  
  46. socket.on('full', function (room){
  47. console.log('Room ' + room + ' is full');
  48. });
  49.  
  50. socket.on('join', function (room){
  51. console.log('Another peer made a request to join room ' + room);
  52. console.log('This peer is the initiator of room ' + room + '!');
  53. isChannelReady = true;
  54. });
  55.  
  56. socket.on('joined', function (room){
  57. console.log('This peer has joined room ' + room);
  58. isChannelReady = true;
  59. });
  60.  
  61. socket.on('log', function (array){
  62. console.log.apply(console, array);
  63. });
  64.  
  65. ////////////////////////////////////////////////
  66.  
  67. function sendMessage(message){
  68. console.log('Client sending message: ', message);
  69. // if (typeof message === 'object') {
  70. // message = JSON.stringify(message);
  71. // }
  72. socket.emit('message', message);
  73. }
  74.  
  75. socket.on('message', function (message){
  76. console.log('Client received message:', message);
  77. if (message === 'got user media') {
  78. maybeStart();
  79. } else if (message.type === 'offer') {
  80. if (!isInitiator && !isStarted) {
  81. maybeStart();
  82. }
  83. pc.setRemoteDescription(new RTCSessionDescription(message));
  84. doAnswer();
  85. } else if (message.type === 'answer' && isStarted) {
  86. pc.setRemoteDescription(new RTCSessionDescription(message));
  87. } else if (message.type === 'candidate' && isStarted) {
  88. var candidate = new RTCIceCandidate({
  89. sdpMLineIndex: message.label,
  90. candidate: message.candidate
  91. });
  92. pc.addIceCandidate(candidate);
  93. } else if (message === 'bye' && isStarted) {
  94. handleRemoteHangup();
  95. }
  96. });
  97.  
  98. ////////////////////////////////////////////////////
  99.  
  100. var localVideo = document.querySelector('#localVideo');
  101. var remoteVideo = document.querySelector('#remoteVideo');
  102.  
  103. function handleUserMedia(stream) {
  104. console.log('Adding local stream.');
  105. draw(localVideo, lc, lCan.width, lCan.height)
  106. localVideo.src = window.URL.createObjectURL(stream);
  107. localStream = stream;
  108. sendMessage('got user media');
  109. if (isInitiator) {
  110. maybeStart();
  111. }
  112. }
  113.  
  114. function handleUserMediaError(error){
  115. console.log('getUserMedia error: ', error);
  116. }
  117.  
  118. var constraints = {video: true};
  119. getUserMedia(constraints, handleUserMedia, handleUserMediaError);
  120.  
  121. console.log('Getting user media with constraints', constraints);
  122.  
  123. if (location.hostname != "localhost") {
  124. requestTurn('https://computeengineondemand.appspot.com/turn?username=41784574&key=4080218913');
  125. }
  126.  
  127. function maybeStart() {
  128. if (!isStarted && typeof localStream != 'undefined' && isChannelReady) {
  129. createPeerConnection();
  130. pc.addStream(localStream);
  131. isStarted = true;
  132. console.log('isInitiator', isInitiator);
  133. if (isInitiator) {
  134. doCall();
  135. }
  136. }
  137. }
  138.  
  139. window.onbeforeunload = function(e){
  140. sendMessage('bye');
  141. }
  142.  
  143. /////////////////////////////////////////////////////////
  144.  
  145. function createPeerConnection() {
  146. try {
  147. pc = new RTCPeerConnection(null);
  148. pc.onicecandidate = handleIceCandidate;
  149. pc.onaddstream = handleRemoteStreamAdded;
  150. pc.onremovestream = handleRemoteStreamRemoved;
  151. console.log('Created RTCPeerConnnection');
  152. } catch (e) {
  153. console.log('Failed to create PeerConnection, exception: ' + e.message);
  154. alert('Cannot create RTCPeerConnection object.');
  155. return;
  156. }
  157. }
  158.  
  159. function handleIceCandidate(event) {
  160. console.log('handleIceCandidate event: ', event);
  161. if (event.candidate) {
  162. sendMessage({
  163. type: 'candidate',
  164. label: event.candidate.sdpMLineIndex,
  165. id: event.candidate.sdpMid,
  166. candidate: event.candidate.candidate});
  167. } else {
  168. console.log('End of candidates.');
  169. }
  170. }
  171.  
  172. function handleRemoteStreamAdded(event) {
  173. console.log('Remote stream added.');
  174. remoteVideo.src = window.URL.createObjectURL(event.stream);
  175. remoteStream = event.stream;
  176. }
  177.  
  178. function handleCreateOfferError(event){
  179. console.log('createOffer() error: ', e);
  180. }
  181.  
  182. function doCall() {
  183. console.log('Sending offer to peer');
  184. pc.createOffer(setLocalAndSendMessage, handleCreateOfferError);
  185. }
  186.  
  187. function doAnswer() {
  188. console.log('Sending answer to peer.');
  189. pc.createAnswer(setLocalAndSendMessage, null, sdpConstraints);
  190. }
  191.  
  192. function setLocalAndSendMessage(sessionDescription) {
  193. // Set Opus as the preferred codec in SDP if Opus is present.
  194. sessionDescription.sdp = preferOpus(sessionDescription.sdp);
  195. pc.setLocalDescription(sessionDescription);
  196. console.log('setLocalAndSendMessage sending message' , sessionDescription);
  197. sendMessage(sessionDescription);
  198. }
  199.  
  200. function requestTurn(turn_url) {
  201. var turnExists = false;
  202. for (var i in pc_config.iceServers) {
  203. if (pc_config.iceServers[i].url.substr(0, 5) === 'turn:') {
  204. turnExists = true;
  205. turnReady = true;
  206. break;
  207. }
  208. }
  209. if (!turnExists) {
  210. console.log('Getting TURN server from ', turn_url);
  211. // No TURN server. Get one from computeengineondemand.appspot.com:
  212. var xhr = new XMLHttpRequest();
  213. xhr.onreadystatechange = function(){
  214. if (xhr.readyState === 4 && xhr.status === 200) {
  215. var turnServer = JSON.parse(xhr.responseText);
  216. console.log('Got TURN server: ', turnServer);
  217. pc_config.iceServers.push({
  218. 'url': 'turn:' + turnServer.username + '@' + turnServer.turn,
  219. 'credential': turnServer.password
  220. });
  221. turnReady = true;
  222. }
  223. };
  224. xhr.open('GET', turn_url, true);
  225. xhr.send();
  226. }
  227. }
  228.  
  229. function handleRemoteStreamAdded(event) {
  230. console.log('Remote stream added.');
  231. draw(remoteVideo, lc, lCan.width, lCan.height);
  232. remoteVideo.src = window.URL.createObjectURL(event.stream);
  233. remoteStream = event.stream;
  234. }
  235.  
  236. function handleRemoteStreamRemoved(event) {
  237. console.log('Remote stream removed. Event: ', event);
  238. }
  239.  
  240. function hangup() {
  241. console.log('Hanging up.');
  242. stop();
  243. sendMessage('bye');
  244. }
  245.  
  246. function handleRemoteHangup() {
  247. // console.log('Session terminated.');
  248. // stop();
  249. // isInitiator = false;
  250. }
  251.  
  252. function stop() {
  253. isStarted = false;
  254. // isAudioMuted = false;
  255. // isVideoMuted = false;
  256. pc.close();
  257. pc = null;
  258. }
  259.  
  260. ///////////////////////////////////////////
  261.  
  262. // Set Opus as the default audio codec if it's present.
  263. function preferOpus(sdp) {
  264. var sdpLines = sdp.split('\r\n');
  265. var mLineIndex = null;
  266. // Search for m line.
  267. for (var i = 0; i < sdpLines.length; i++) {
  268. if (sdpLines[i].search('m=audio') !== -1) {
  269. mLineIndex = i;
  270. break;
  271. }
  272. }
  273. if (mLineIndex === null) {
  274. return sdp;
  275. }
  276.  
  277. // If Opus is available, set it as the default in m line.
  278. for (i = 0; i < sdpLines.length; i++) {
  279. if (sdpLines[i].search('opus/48000') !== -1) {
  280. var opusPayload = extractSdp(sdpLines[i], /:(\d+) opus\/48000/i);
  281. if (opusPayload) {
  282. sdpLines[mLineIndex] = setDefaultCodec(sdpLines[mLineIndex], opusPayload);
  283. }
  284. break;
  285. }
  286. }
  287.  
  288. // Remove CN in m line and sdp.
  289. sdpLines = removeCN(sdpLines, mLineIndex);
  290.  
  291. sdp = sdpLines.join('\r\n');
  292. return sdp;
  293. }
  294.  
  295. function extractSdp(sdpLine, pattern) {
  296. var result = sdpLine.match(pattern);
  297. return result && result.length === 2 ? result[1] : null;
  298. }
  299.  
  300. // Set the selected codec to the first in m line.
  301. function setDefaultCodec(mLine, payload) {
  302. var elements = mLine.split(' ');
  303. var newLine = [];
  304. var index = 0;
  305. for (var i = 0; i < elements.length; i++) {
  306. if (index === 3) { // Format of media starts from the fourth.
  307. newLine[index++] = payload; // Put target payload to the first.
  308. }
  309. if (elements[i] !== payload) {
  310. newLine[index++] = elements[i];
  311. }
  312. }
  313. return newLine.join(' ');
  314. }
  315.  
  316. // Strip CN from sdp before CN constraints is ready.
  317. function removeCN(sdpLines, mLineIndex) {
  318. var mLineElements = sdpLines[mLineIndex].split(' ');
  319. // Scan from end for the convenience of removing an item.
  320. for (var i = sdpLines.length-1; i >= 0; i--) {
  321. var payload = extractSdp(sdpLines[i], /a=rtpmap:(\d+) CN\/\d+/i);
  322. if (payload) {
  323. var cnPos = mLineElements.indexOf(payload);
  324. if (cnPos !== -1) {
  325. // Remove CN payload from m line.
  326. mLineElements.splice(cnPos, 1);
  327. }
  328. // Remove CN line in sdp
  329. sdpLines.splice(i, 1);
  330. }
  331. }
  332.  
  333. sdpLines[mLineIndex] = mLineElements.join(' ');
  334. return sdpLines;
  335. }
  336.  
  337. function draw(v,c,cw,ch) {
  338. if(v == localVideo) {
  339. try{
  340. c.drawImage(v,0,0,cw/3,ch);
  341. }catch(error){
  342. console.log("Errorinn er: " + error);
  343. }
  344. } else if(v == remoteVideo) {
  345. try{
  346. c.drawImage(v,(cw/3)*2,0,300,ch);
  347. }catch(error){
  348. console.log("Errorinn er: " + error);
  349. }
  350. }
  351.  
  352. var imageData = c.getImageData(0, 0, 300, ch);
  353. var inpos = 0;
  354. var fg = 0;
  355. var r = 0;
  356. var g = 0;
  357. var b = 0;
  358. var rgb = [];
  359. var rrgb = [];
  360. for (var i = 0; i < 300; i++) {
  361. rgb[i] = [];
  362. }
  363.  
  364. for (var i = 0; i < 620; i++) {
  365. rrgb[i] = [];
  366. }
  367.  
  368. for (var y = 0; y < ch; y++) {
  369. for (var x = 0; x < 300; x++) {
  370. // calculate RGB values based on sine
  371. var obj = {};
  372. obj.r = imageData.data[inpos++];
  373. obj.g = imageData.data[inpos++];
  374. obj.b = imageData.data[inpos++];
  375. inpos++;
  376.  
  377. rgb[x][y] = obj;
  378. }
  379. }
  380.  
  381. for (var y = 0; y < ch; y++) {
  382. for (var x = 0; x < 620; x++) {
  383. // calculate RGB values based on sine
  384. var robj = {};
  385. robj.r = imageData.data[inpos++];
  386. robj.g = imageData.data[inpos++];
  387. robj.b = imageData.data[inpos++];
  388. inpos++;
  389.  
  390. rrgb[x][y] = robj;
  391. }
  392. }
  393.  
  394. for (var h = 0; h < 15; h++) {
  395. if(rgb[290][h*10].r / (rgb[290][h*10].b+rgb[290][h*10].g) > 3){
  396. console.log("I see red!");
  397. }
  398. }
  399.  
  400. for (var h = 0; h < 15; h++) {
  401. if(rrgb[610][h*10].r / (rrgb[610][h*10].b+rrgb[610][h*10].g) > 3){
  402. console.log(" REMOTE I see red!");
  403. }
  404. }
  405.  
  406. // Grab the pixel data from the backing canvas
  407. var idata = c.getImageData(0,0,cw,ch);
  408. var data = idata.data;
  409. var w = idata.width;
  410. var limit = data.length
  411. // Draw the pixels onto the visible canvas
  412. c.putImageData(idata,0,0);
  413. // Start over!
  414. setTimeout(draw,20,v,c,cw,ch);
  415. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement