| OLD | NEW |
| (Empty) |
| 1 /** | |
| 2 * Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
| 3 * Use of this source code is governed by a BSD-style license that can be | |
| 4 * found in the LICENSE file. | |
| 5 */ | |
| 6 | |
| 7 /** | |
| 8 * See http://dev.w3.org/2011/webrtc/editor/getusermedia.html for more | |
| 9 * information on getUserMedia. | |
| 10 */ | |
| 11 | |
| 12 /** | |
| 13 * Asks permission to use the webcam and mic from the browser. | |
| 14 */ | |
| 15 function doGetUserMedia() { | |
| 16 // Call into getUserMedia via the polyfill (adapter.js). | |
| 17 var constraints = getConstraints_(); | |
| 18 var constraintsString = JSON.stringify(constraints, null, ' '); | |
| 19 $('getusermedia-constraints').innerHTML = constraintsString; | |
| 20 if (!getUserMedia) { | |
| 21 log_('Browser does not support WebRTC.'); | |
| 22 return; | |
| 23 } | |
| 24 log_('Requesting getUserMedia with constraints: ' + constraintsString); | |
| 25 getUserMedia(constraints, getUserMediaOkCallback_, | |
| 26 getUserMediaFailedCallback_); | |
| 27 } | |
| 28 | |
| 29 // Internals | |
| 30 | |
| 31 /** | |
| 32 * Builds a Javascript constraints dictionary out of the selected options in the | |
| 33 * HTML controls on the page. | |
| 34 * @private | |
| 35 * @return {Object} A dictionary of constraints. | |
| 36 */ | |
| 37 function getConstraints_() { | |
| 38 var c = {}; | |
| 39 c.audio = $('audio').checked; | |
| 40 if (!$('video').checked) { | |
| 41 c.video = false; | |
| 42 } else { | |
| 43 c.video = { mandatory: {}, optional: [] }; | |
| 44 // Mandatory - min | |
| 45 if ($('mandatory-min-width').value != '') { | |
| 46 c.video.mandatory.minWidth = $('mandatory-min-width').value; | |
| 47 } | |
| 48 if ($('mandatory-min-height').value != '') { | |
| 49 c.video.mandatory.minHeight = $('mandatory-min-height').value; | |
| 50 } | |
| 51 if ($('mandatory-min-fps').value != '') { | |
| 52 c.video.mandatory.minFrameRate = $('mandatory-min-fps').value; | |
| 53 } | |
| 54 if ($('mandatory-min-ar').value != '') { | |
| 55 c.video.mandatory.minAspectRatio = $('mandatory-min-ar').value; | |
| 56 } | |
| 57 // Mandatory - max | |
| 58 if ($('mandatory-max-width').value != '') { | |
| 59 c.video.mandatory.maxWidth = $('mandatory-max-width').value; | |
| 60 } | |
| 61 if ($('mandatory-max-height').value != '') { | |
| 62 c.video.mandatory.maxHeight = $('mandatory-max-height').value; | |
| 63 } | |
| 64 if ($('mandatory-max-fps').value != '') { | |
| 65 c.video.mandatory.maxFrameRate = $('mandatory-max-fps').value; | |
| 66 } | |
| 67 if ($('mandatory-max-ar').value != '') { | |
| 68 c.video.mandatory.maxAspectRatio = $('mandatory-max-ar').value; | |
| 69 } | |
| 70 // Optional - min | |
| 71 if ($('optional-min-width').value != '') { | |
| 72 c.video.optional.push({ minWidth: $('optional-min-width').value }); | |
| 73 } | |
| 74 if ($('optional-min-height').value != '') { | |
| 75 c.video.optional.push({ minHeight: $('optional-min-height').value }); | |
| 76 } | |
| 77 if ($('optional-min-fps').value != '') { | |
| 78 c.video.optional.push({ minFrameRate: $('optional-min-fps').value }); | |
| 79 } | |
| 80 if ($('optional-min-ar').value != '') { | |
| 81 c.video.optional.push({ minAspectRatio: $('optional-min-ar').value }); | |
| 82 } | |
| 83 // Optional - max | |
| 84 if ($('optional-max-width').value != '') { | |
| 85 c.video.optional.push({ maxWidth: $('optional-max-width').value }); | |
| 86 } | |
| 87 if ($('optional-max-height').value != '') { | |
| 88 c.video.optional.push({ maxHeight: $('optional-max-height').value }); | |
| 89 } | |
| 90 if ($('optional-max-fps').value != '') { | |
| 91 c.video.optional.push({ maxFrameRate: $('optional-max-fps').value }); | |
| 92 } | |
| 93 if ($('optional-max-ar').value != '') { | |
| 94 c.video.optional.push({ maxAspectRatio: $('optional-max-ar').value }); | |
| 95 } | |
| 96 } | |
| 97 return c; | |
| 98 } | |
| 99 | |
| 100 /** | |
| 101 * @private | |
| 102 * @param {MediaStream} stream Media stream. | |
| 103 */ | |
| 104 function getUserMediaOkCallback_(stream) { | |
| 105 gLocalStream = stream; | |
| 106 var videoTag = $('local-view'); | |
| 107 attachMediaStream(videoTag, stream); | |
| 108 | |
| 109 // Due to crbug.com/110938 the size is 0 when onloadedmetadata fires. | |
| 110 // videoTag.onloadedmetadata = updateVideoTagSize_(videoTag); | |
| 111 // Use setTimeout as a workaround for now. | |
| 112 setTimeout(function() {updateVideoTagSize_(videoTag)}, 500); | |
| 113 gRequestWebcamAndMicrophoneResult = 'ok-got-stream'; | |
| 114 } | |
| 115 | |
| 116 /** | |
| 117 * @private | |
| 118 * @param {Object} videoTag The video tag to update. | |
| 119 */ | |
| 120 function updateVideoTagSize_(videoTag) { | |
| 121 // Don't update if sizes are 0 (happens for Chrome M23). | |
| 122 if (videoTag.videoWidth > 0 && videoTag.videoHeight > 0) { | |
| 123 log_('Set video tag width and height: ' + videoTag.videoWidth + 'x' + | |
| 124 videoTag.videoHeight); | |
| 125 videoTag.width = videoTag.videoWidth; | |
| 126 videoTag.height = videoTag.videoHeight; | |
| 127 } | |
| 128 } | |
| 129 | |
| 130 /** | |
| 131 * @private | |
| 132 * @param {NavigatorUserMediaError} error Error containing details. | |
| 133 */ | |
| 134 function getUserMediaFailedCallback_(error) { | |
| 135 log_('Failed with error: ' + error); | |
| 136 } | |
| 137 | |
| 138 $ = function(id) { | |
| 139 return document.getElementById(id); | |
| 140 }; | |
| 141 | |
| 142 /** | |
| 143 * Simple logging function. | |
| 144 * @private | |
| 145 * @param {string} message Message to print. | |
| 146 */ | |
| 147 function log_(message) { | |
| 148 console.log(message); | |
| 149 $('messages').innerHTML += message + '<br>'; | |
| 150 } | |
| OLD | NEW |