| /* |
| * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. |
| * |
| * Use of this source code is governed by a BSD-style license |
| * that can be found in the LICENSE file in the root of the source |
| * tree. |
| */ |
| |
| 'use strict'; |
| |
| const dimensions = document.querySelector('#dimensions'); |
| const video = document.querySelector('video'); |
| let stream; |
| |
| const vgaButton = document.querySelector('#vga'); |
| const qvgaButton = document.querySelector('#qvga'); |
| const hdButton = document.querySelector('#hd'); |
| const fullHdButton = document.querySelector('#full-hd'); |
| const cinemaFourKButton = document.querySelector('#cinemaFourK'); |
| const televisionFourKButton = document.querySelector('#televisionFourK'); |
| const eightKButton = document.querySelector('#eightK'); |
| |
| const videoblock = document.querySelector('#videoblock'); |
| const messagebox = document.querySelector('#errormessage'); |
| |
| const widthInput = document.querySelector('div#width input'); |
| const widthOutput = document.querySelector('div#width span'); |
| const aspectLock = document.querySelector('#aspectlock'); |
| const sizeLock = document.querySelector('#sizelock'); |
| |
| let currentWidth = 0; |
| let currentHeight = 0; |
| |
| vgaButton.onclick = () => { |
| getMedia(vgaConstraints); |
| }; |
| |
| qvgaButton.onclick = () => { |
| getMedia(qvgaConstraints); |
| }; |
| |
| hdButton.onclick = () => { |
| getMedia(hdConstraints); |
| }; |
| |
| fullHdButton.onclick = () => { |
| getMedia(fullHdConstraints); |
| }; |
| |
| televisionFourKButton.onclick = () => { |
| getMedia(televisionFourKConstraints); |
| }; |
| |
| cinemaFourKButton.onclick = () => { |
| getMedia(cinemaFourKConstraints); |
| }; |
| |
| eightKButton.onclick = () => { |
| getMedia(eightKConstraints); |
| }; |
| |
| const qvgaConstraints = { |
| video: {width: {exact: 320}, height: {exact: 240}} |
| }; |
| |
| const vgaConstraints = { |
| video: {width: {exact: 640}, height: {exact: 480}} |
| }; |
| |
| const hdConstraints = { |
| video: {width: {exact: 1280}, height: {exact: 720}} |
| }; |
| |
| const fullHdConstraints = { |
| video: {width: {exact: 1920}, height: {exact: 1080}} |
| }; |
| |
| const televisionFourKConstraints = { |
| video: {width: {exact: 3840}, height: {exact: 2160}} |
| }; |
| |
| const cinemaFourKConstraints = { |
| video: {width: {exact: 4096}, height: {exact: 2160}} |
| }; |
| |
| const eightKConstraints = { |
| video: {width: {exact: 7680}, height: {exact: 4320}} |
| }; |
| |
| function gotStream(mediaStream) { |
| stream = window.stream = mediaStream; // stream available to console |
| video.srcObject = mediaStream; |
| messagebox.style.display = 'none'; |
| videoblock.style.display = 'block'; |
| const track = mediaStream.getVideoTracks()[0]; |
| const constraints = track.getConstraints(); |
| console.log('Result constraints: ' + JSON.stringify(constraints)); |
| if (constraints && constraints.width && constraints.width.exact) { |
| widthInput.value = constraints.width.exact; |
| widthOutput.textContent = constraints.width.exact; |
| } else if (constraints && constraints.width && constraints.width.min) { |
| widthInput.value = constraints.width.min; |
| widthOutput.textContent = constraints.width.min; |
| } |
| } |
| |
| function errorMessage(who, what) { |
| const message = who + ': ' + what; |
| messagebox.innerText = message; |
| messagebox.style.display = 'block'; |
| console.log(message); |
| } |
| |
| function clearErrorMessage() { |
| messagebox.style.display = 'none'; |
| } |
| |
| function displayVideoDimensions(whereSeen) { |
| if (video.videoWidth) { |
| dimensions.innerText = 'Actual video dimensions: ' + video.videoWidth + |
| 'x' + video.videoHeight + 'px.'; |
| if (currentWidth !== video.videoWidth || |
| currentHeight !== video.videoHeight) { |
| console.log(whereSeen + ': ' + dimensions.innerText); |
| currentWidth = video.videoWidth; |
| currentHeight = video.videoHeight; |
| } |
| } else { |
| dimensions.innerText = 'Video not ready'; |
| } |
| } |
| |
| video.onloadedmetadata = () => { |
| displayVideoDimensions('loadedmetadata'); |
| }; |
| |
| video.onresize = () => { |
| displayVideoDimensions('resize'); |
| }; |
| |
| function constraintChange(e) { |
| widthOutput.textContent = e.target.value; |
| const track = window.stream.getVideoTracks()[0]; |
| let constraints; |
| if (aspectLock.checked) { |
| constraints = { |
| width: {exact: e.target.value}, |
| aspectRatio: { |
| exact: video.videoWidth / video.videoHeight |
| } |
| }; |
| } else { |
| constraints = {width: {exact: e.target.value}}; |
| } |
| clearErrorMessage(); |
| console.log('applying ' + JSON.stringify(constraints)); |
| track.applyConstraints(constraints) |
| .then(() => { |
| console.log('applyConstraint success'); |
| displayVideoDimensions('applyConstraints'); |
| }) |
| .catch(err => { |
| errorMessage('applyConstraints', err.name); |
| }); |
| } |
| |
| widthInput.onchange = constraintChange; |
| |
| sizeLock.onchange = () => { |
| if (sizeLock.checked) { |
| console.log('Setting fixed size'); |
| video.style.width = '100%'; |
| } else { |
| console.log('Setting auto size'); |
| video.style.width = 'auto'; |
| } |
| }; |
| |
| function getMedia(constraints) { |
| if (stream) { |
| stream.getTracks().forEach(track => { |
| track.stop(); |
| }); |
| } |
| |
| clearErrorMessage(); |
| videoblock.style.display = 'none'; |
| navigator.mediaDevices.getUserMedia(constraints) |
| .then(gotStream) |
| .catch(e => { |
| errorMessage('getUserMedia', e.message, e.name); |
| }); |
| } |