Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 'use strict';
- var isChannelReady;
- var isInitiator = false;
- var isStarted = false;
- var localStream;
- var pc;
- var remoteStream;
- var turnReady;
- var lCan = document.getElementById("localCanvas");
- lCan.width = 900;
- var lc = lCan.getContext("2d");
- var pc_config = {'iceServers': [{'url': 'stun:stun.l.google.com:19302'}]};
- var pc_constraints = {'optional': [{'DtlsSrtpKeyAgreement': true}]};
- // Set up audio and video regardless of what devices are present.
- var sdpConstraints = {'mandatory': {
- 'OfferToReceiveAudio':true,
- 'OfferToReceiveVideo':true }};
- /////////////////////////////////////////////
- var room = location.pathname.substring(1);
- if (room === '') {
- // room = prompt('Enter room name:');
- room = 'foo';
- } else {
- //
- }
- var socket = io.connect();
- if (room !== '') {
- console.log('Create or join room', room);
- socket.emit('create or join', room);
- }
- socket.on('created', function (room){
- console.log('Created room ' + room);
- isInitiator = true;
- });
- socket.on('full', function (room){
- console.log('Room ' + room + ' is full');
- });
- socket.on('join', function (room){
- console.log('Another peer made a request to join room ' + room);
- console.log('This peer is the initiator of room ' + room + '!');
- isChannelReady = true;
- });
- socket.on('joined', function (room){
- console.log('This peer has joined room ' + room);
- isChannelReady = true;
- });
- socket.on('log', function (array){
- console.log.apply(console, array);
- });
- ////////////////////////////////////////////////
- function sendMessage(message){
- console.log('Client sending message: ', message);
- // if (typeof message === 'object') {
- // message = JSON.stringify(message);
- // }
- socket.emit('message', message);
- }
- socket.on('message', function (message){
- console.log('Client received message:', message);
- if (message === 'got user media') {
- maybeStart();
- } else if (message.type === 'offer') {
- if (!isInitiator && !isStarted) {
- maybeStart();
- }
- pc.setRemoteDescription(new RTCSessionDescription(message));
- doAnswer();
- } else if (message.type === 'answer' && isStarted) {
- pc.setRemoteDescription(new RTCSessionDescription(message));
- } else if (message.type === 'candidate' && isStarted) {
- var candidate = new RTCIceCandidate({
- sdpMLineIndex: message.label,
- candidate: message.candidate
- });
- pc.addIceCandidate(candidate);
- } else if (message === 'bye' && isStarted) {
- handleRemoteHangup();
- }
- });
- ////////////////////////////////////////////////////
- var localVideo = document.querySelector('#localVideo');
- var remoteVideo = document.querySelector('#remoteVideo');
- function handleUserMedia(stream) {
- console.log('Adding local stream.');
- draw(localVideo, lc, lCan.width, lCan.height)
- localVideo.src = window.URL.createObjectURL(stream);
- localStream = stream;
- sendMessage('got user media');
- if (isInitiator) {
- maybeStart();
- }
- }
- function handleUserMediaError(error){
- console.log('getUserMedia error: ', error);
- }
- var constraints = {video: true};
- getUserMedia(constraints, handleUserMedia, handleUserMediaError);
- console.log('Getting user media with constraints', constraints);
- if (location.hostname != "localhost") {
- requestTurn('https://computeengineondemand.appspot.com/turn?username=41784574&key=4080218913');
- }
- function maybeStart() {
- if (!isStarted && typeof localStream != 'undefined' && isChannelReady) {
- createPeerConnection();
- pc.addStream(localStream);
- isStarted = true;
- console.log('isInitiator', isInitiator);
- if (isInitiator) {
- doCall();
- }
- }
- }
- window.onbeforeunload = function(e){
- sendMessage('bye');
- }
- /////////////////////////////////////////////////////////
- function createPeerConnection() {
- try {
- pc = new RTCPeerConnection(null);
- pc.onicecandidate = handleIceCandidate;
- pc.onaddstream = handleRemoteStreamAdded;
- pc.onremovestream = handleRemoteStreamRemoved;
- console.log('Created RTCPeerConnnection');
- } catch (e) {
- console.log('Failed to create PeerConnection, exception: ' + e.message);
- alert('Cannot create RTCPeerConnection object.');
- return;
- }
- }
- function handleIceCandidate(event) {
- console.log('handleIceCandidate event: ', event);
- if (event.candidate) {
- sendMessage({
- type: 'candidate',
- label: event.candidate.sdpMLineIndex,
- id: event.candidate.sdpMid,
- candidate: event.candidate.candidate});
- } else {
- console.log('End of candidates.');
- }
- }
- function handleRemoteStreamAdded(event) {
- console.log('Remote stream added.');
- remoteVideo.src = window.URL.createObjectURL(event.stream);
- remoteStream = event.stream;
- }
- function handleCreateOfferError(event){
- console.log('createOffer() error: ', e);
- }
- function doCall() {
- console.log('Sending offer to peer');
- pc.createOffer(setLocalAndSendMessage, handleCreateOfferError);
- }
- function doAnswer() {
- console.log('Sending answer to peer.');
- pc.createAnswer(setLocalAndSendMessage, null, sdpConstraints);
- }
- function setLocalAndSendMessage(sessionDescription) {
- // Set Opus as the preferred codec in SDP if Opus is present.
- sessionDescription.sdp = preferOpus(sessionDescription.sdp);
- pc.setLocalDescription(sessionDescription);
- console.log('setLocalAndSendMessage sending message' , sessionDescription);
- sendMessage(sessionDescription);
- }
- function requestTurn(turn_url) {
- var turnExists = false;
- for (var i in pc_config.iceServers) {
- if (pc_config.iceServers[i].url.substr(0, 5) === 'turn:') {
- turnExists = true;
- turnReady = true;
- break;
- }
- }
- if (!turnExists) {
- console.log('Getting TURN server from ', turn_url);
- // No TURN server. Get one from computeengineondemand.appspot.com:
- var xhr = new XMLHttpRequest();
- xhr.onreadystatechange = function(){
- if (xhr.readyState === 4 && xhr.status === 200) {
- var turnServer = JSON.parse(xhr.responseText);
- console.log('Got TURN server: ', turnServer);
- pc_config.iceServers.push({
- 'url': 'turn:' + turnServer.username + '@' + turnServer.turn,
- 'credential': turnServer.password
- });
- turnReady = true;
- }
- };
- xhr.open('GET', turn_url, true);
- xhr.send();
- }
- }
- function handleRemoteStreamAdded(event) {
- console.log('Remote stream added.');
- draw(remoteVideo, lc, lCan.width, lCan.height);
- remoteVideo.src = window.URL.createObjectURL(event.stream);
- remoteStream = event.stream;
- }
- function handleRemoteStreamRemoved(event) {
- console.log('Remote stream removed. Event: ', event);
- }
- function hangup() {
- console.log('Hanging up.');
- stop();
- sendMessage('bye');
- }
- function handleRemoteHangup() {
- // console.log('Session terminated.');
- // stop();
- // isInitiator = false;
- }
- function stop() {
- isStarted = false;
- // isAudioMuted = false;
- // isVideoMuted = false;
- pc.close();
- pc = null;
- }
- ///////////////////////////////////////////
- // Set Opus as the default audio codec if it's present.
- function preferOpus(sdp) {
- var sdpLines = sdp.split('\r\n');
- var mLineIndex = null;
- // Search for m line.
- for (var i = 0; i < sdpLines.length; i++) {
- if (sdpLines[i].search('m=audio') !== -1) {
- mLineIndex = i;
- break;
- }
- }
- if (mLineIndex === null) {
- return sdp;
- }
- // If Opus is available, set it as the default in m line.
- for (i = 0; i < sdpLines.length; i++) {
- if (sdpLines[i].search('opus/48000') !== -1) {
- var opusPayload = extractSdp(sdpLines[i], /:(\d+) opus\/48000/i);
- if (opusPayload) {
- sdpLines[mLineIndex] = setDefaultCodec(sdpLines[mLineIndex], opusPayload);
- }
- break;
- }
- }
- // Remove CN in m line and sdp.
- sdpLines = removeCN(sdpLines, mLineIndex);
- sdp = sdpLines.join('\r\n');
- return sdp;
- }
- function extractSdp(sdpLine, pattern) {
- var result = sdpLine.match(pattern);
- return result && result.length === 2 ? result[1] : null;
- }
- // Set the selected codec to the first in m line.
- function setDefaultCodec(mLine, payload) {
- var elements = mLine.split(' ');
- var newLine = [];
- var index = 0;
- for (var i = 0; i < elements.length; i++) {
- if (index === 3) { // Format of media starts from the fourth.
- newLine[index++] = payload; // Put target payload to the first.
- }
- if (elements[i] !== payload) {
- newLine[index++] = elements[i];
- }
- }
- return newLine.join(' ');
- }
- // Strip CN from sdp before CN constraints is ready.
- function removeCN(sdpLines, mLineIndex) {
- var mLineElements = sdpLines[mLineIndex].split(' ');
- // Scan from end for the convenience of removing an item.
- for (var i = sdpLines.length-1; i >= 0; i--) {
- var payload = extractSdp(sdpLines[i], /a=rtpmap:(\d+) CN\/\d+/i);
- if (payload) {
- var cnPos = mLineElements.indexOf(payload);
- if (cnPos !== -1) {
- // Remove CN payload from m line.
- mLineElements.splice(cnPos, 1);
- }
- // Remove CN line in sdp
- sdpLines.splice(i, 1);
- }
- }
- sdpLines[mLineIndex] = mLineElements.join(' ');
- return sdpLines;
- }
- function draw(v,c,cw,ch) {
- if(v == localVideo) {
- try{
- c.drawImage(v,0,0,cw/3,ch);
- }catch(error){
- console.log("Errorinn er: " + error);
- }
- } else if(v == remoteVideo) {
- try{
- c.drawImage(v,(cw/3)*2,0,300,ch);
- }catch(error){
- console.log("Errorinn er: " + error);
- }
- }
- var imageData = c.getImageData(0, 0, 300, ch);
- var inpos = 0;
- var fg = 0;
- var r = 0;
- var g = 0;
- var b = 0;
- var rgb = [];
- var rrgb = [];
- for (var i = 0; i < 300; i++) {
- rgb[i] = [];
- }
- for (var i = 0; i < 620; i++) {
- rrgb[i] = [];
- }
- for (var y = 0; y < ch; y++) {
- for (var x = 0; x < 300; x++) {
- // calculate RGB values based on sine
- var obj = {};
- obj.r = imageData.data[inpos++];
- obj.g = imageData.data[inpos++];
- obj.b = imageData.data[inpos++];
- inpos++;
- rgb[x][y] = obj;
- }
- }
- for (var y = 0; y < ch; y++) {
- for (var x = 0; x < 620; x++) {
- // calculate RGB values based on sine
- var robj = {};
- robj.r = imageData.data[inpos++];
- robj.g = imageData.data[inpos++];
- robj.b = imageData.data[inpos++];
- inpos++;
- rrgb[x][y] = robj;
- }
- }
- for (var h = 0; h < 15; h++) {
- if(rgb[290][h*10].r / (rgb[290][h*10].b+rgb[290][h*10].g) > 3){
- console.log("I see red!");
- }
- }
- for (var h = 0; h < 15; h++) {
- if(rrgb[610][h*10].r / (rrgb[610][h*10].b+rrgb[610][h*10].g) > 3){
- console.log(" REMOTE I see red!");
- }
- }
- // Grab the pixel data from the backing canvas
- var idata = c.getImageData(0,0,cw,ch);
- var data = idata.data;
- var w = idata.width;
- var limit = data.length
- // Draw the pixels onto the visible canvas
- c.putImageData(idata,0,0);
- // Start over!
- setTimeout(draw,20,v,c,cw,ch);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement