OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 function getConstraintsForDevice(deviceLabel) { | 5 function getConstraintsForDevice(deviceLabel) { |
6 return new Promise(function(resolve, reject) { | 6 return new Promise(function(resolve, reject) { |
7 navigator.mediaDevices.enumerateDevices() | 7 navigator.mediaDevices.enumerateDevices() |
8 .then(function(devices) { | 8 .then(function(devices) { |
9 for (var i = 0; i < devices.length; ++i) { | 9 for (var i = 0; i < devices.length; ++i) { |
10 if (deviceLabel == devices[i].label) { | 10 if (deviceLabel == devices[i].label) { |
(...skipping 14 matching lines...) Expand all Loading... |
25 .then(function(constraints) { | 25 .then(function(constraints) { |
26 if (!constraints) | 26 if (!constraints) |
27 return reject("No fake device found"); | 27 return reject("No fake device found"); |
28 return navigator.mediaDevices.getUserMedia(constraints); | 28 return navigator.mediaDevices.getUserMedia(constraints); |
29 }).then(function(stream) { | 29 }).then(function(stream) { |
30 return resolve(stream); | 30 return resolve(stream); |
31 }); | 31 }); |
32 }); | 32 }); |
33 } | 33 } |
34 | 34 |
35 function testVideoToImageBitmap(videoElementName, success, error) | 35 // Data is RGBA array data and could be used with different formats: |
36 { | 36 // e.g. Uint8Array, Uint8ClampedArray, Float32Array... |
37 var bitmaps = {}; | 37 // Value at point (row, column) is calculated as |
38 var video = $(videoElementName); | 38 // (top_left_value + (row + column) * step) % wrap_around. wrap_around is 255 |
39 var canvas = document.createElement('canvas'); | 39 // (for Uint8) or 1.0 for float. See FakeVideoCaptureDevice for details. |
40 canvas.width = 96; | 40 function verifyPixels( |
41 canvas.height = 96; | 41 data, width, height, flip_y, step, wrap_around, tolerance, test_name) { |
42 document.body.appendChild(canvas); | |
43 var p1 = createImageBitmap(video).then(function(imageBitmap) { | |
44 return runImageBitmapTest(imageBitmap, canvas, false); }); | |
45 var p2 = createImageBitmap(video, | |
46 {imageOrientation: "none", premultiplyAlpha: "premultiply"}).then( | |
47 function(imageBitmap) { | |
48 return runImageBitmapTest(imageBitmap, canvas, false); }); | |
49 var p3 = createImageBitmap(video, | |
50 {imageOrientation: "none", premultiplyAlpha: "default"}).then( | |
51 function(imageBitmap) { | |
52 return runImageBitmapTest(imageBitmap, canvas, false); }); | |
53 var p4 = createImageBitmap(video, | |
54 {imageOrientation: "none", premultiplyAlpha: "none"}).then( | |
55 function(imageBitmap) { | |
56 return runImageBitmapTest(imageBitmap, canvas, false); }); | |
57 var p5 = createImageBitmap(video, | |
58 {imageOrientation: "flipY", premultiplyAlpha: "premultiply"}).then( | |
59 function(imageBitmap) { | |
60 return runImageBitmapTest(imageBitmap, canvas, true); }); | |
61 var p6 = createImageBitmap(video, | |
62 {imageOrientation: "flipY", premultiplyAlpha: "default"}).then( | |
63 function(imageBitmap) { | |
64 return runImageBitmapTest(imageBitmap, canvas, true); }); | |
65 var p7 = createImageBitmap(video, | |
66 {imageOrientation: "flipY", premultiplyAlpha: "none"}).then( | |
67 function(imageBitmap) { | |
68 return runImageBitmapTest(imageBitmap, canvas, true); }); | |
69 return Promise.all([p1, p2, p3, p4, p5, p6, p7]).then(success(), reason => { | |
70 return error({name: reason}); | |
71 }); | |
72 } | |
73 | |
74 function runImageBitmapTest(bitmap, canvas, flipped) { | |
75 var context = canvas.getContext('2d'); | |
76 context.drawImage(bitmap,0,0); | |
77 var imageData = context.getImageData(0, 0, canvas.width, canvas.height); | |
78 // Fake capture device 96x96 depth image is gradient. See also | |
79 // Draw16BitGradient in fake_video_capture_device.cc. | |
80 var color_step = 255.0 / (canvas.width + canvas.height); | |
81 var rowsColumnsToCheck = [[1, 1], | 42 var rowsColumnsToCheck = [[1, 1], |
82 [0, canvas.width - 1], | 43 [0, width - 1], |
83 [canvas.height - 1, 0], | 44 [height - 1, 0], |
84 [canvas.height - 1, canvas.width - 1], | 45 [height - 1, width - 1], |
85 [canvas.height - 3, canvas.width - 4]]; | 46 [height - 3, width - 3]]; |
86 | 47 |
87 // Same value is expected for all color components. | 48 // Same value is expected for all color components. |
88 if (imageData.data[0] != imageData.data[1] || | 49 if (data[0] != data[1] || data[0] != data[2]) { |
89 imageData.data[0] != imageData.data[2]) | 50 return Promise.reject(test_name + ": values " + data[0] + ", " + data[1] + |
90 return Promise.reject("Values " + imageData.data[0] + ", " + | 51 ", " + data[2] + " differ at top left."); |
91 imageData.data[1] + ", " + imageData.data[2] + " differ at top left"); | 52 } |
92 | 53 |
93 // Calculate all reference points based on top left and compare. | 54 // Calculate all reference points based on top left and compare. |
94 for (var j = 0; j < rowsColumnsToCheck.length; ++j) { | 55 for (var j = 0; j < rowsColumnsToCheck.length; ++j) { |
95 var row = rowsColumnsToCheck[j][0]; | 56 var row = rowsColumnsToCheck[j][0]; |
96 var column = rowsColumnsToCheck[j][1]; | 57 var column = rowsColumnsToCheck[j][1]; |
97 var i = (canvas.width * row + column) * 4; | 58 var i = (width * row + column) * 4; |
98 if (imageData.data[i] != imageData.data[i + 1] || | 59 if (data[i] != data[i + 1] || data[i] != data[i + 2]) { |
99 imageData.data[i] != imageData.data[i + 2]) | 60 return Promise.reject(test_name + ": values " + data[i] + ", " + |
100 return Promise.reject("Values " + imageData.data[i] + ", " + | 61 data[i + 1] + ", " + data[i + 2] + |
101 imageData.data[i + 1] + ", " + imageData.data[i + 2] + | 62 " differ at index " + i); |
102 " differ at index " + i); | 63 } |
103 var calculated = (imageData.data[0] + | 64 var calculated = (data[0] + |
104 color_step * ((flipped ? -row : row) + column)) % 255; | 65 step * ((flip_y ? -row : row) + column)) % wrap_around; |
105 if (Math.abs(calculated - imageData.data[i]) > 2) | 66 if (Math.abs(calculated - data[i]) > tolerance) { |
106 return Promise.reject("Reference value " + imageData.data[i] + | 67 return Promise.reject(test_name + ": reference value " + data[i] + |
107 " differs from calculated: " + calculated + " at index " + i + | 68 " differs from calculated: " + calculated + |
108 ". TopLeft value:" + imageData.data[0]); | 69 " at index (row, column) " + i + " (" + row + ", " + column + |
| 70 "). TopLeft value:" + data[0] + ", step:" + step + ", flip_y:" + |
| 71 flip_y); |
| 72 } |
109 } | 73 } |
110 return true; | 74 return true; |
111 } | 75 } |
OLD | NEW |