Skip to content

Commit 403f860

Browse files
author
Kangyi Zhang
authored
[tfjs-data] Update webcam tests for tfjs-core@1.2.9 (#1979)
INTERNAL * prepare data for 1.2.9 * update test * no restart in firefox browserstack * save * fix nit * fix test
1 parent 85372ce commit 403f860

File tree

5 files changed

+60
-38
lines changed

5 files changed

+60
-38
lines changed

tfjs-data/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
"miniprogram": "dist/miniprogram",
1313
"license": "Apache-2.0",
1414
"devDependencies": {
15-
"@tensorflow/tfjs-core": "1.2.8",
15+
"@tensorflow/tfjs-core": "1.2.9",
1616
"@tensorflow/tfjs-layers": "1.2.8",
1717
"@types/jasmine": "~2.5.53",
1818
"@types/seedrandom": "^2.4.27",
@@ -53,7 +53,7 @@
5353
"lint": "tslint -p . -t verbose"
5454
},
5555
"peerDependencies": {
56-
"@tensorflow/tfjs-core": "1.2.8",
56+
"@tensorflow/tfjs-core": "1.2.9",
5757
"seedrandom": "~2.4.3"
5858
},
5959
"dependencies": {

tfjs-data/src/iterators/webcam_iterator_test.ts

Lines changed: 29 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
*/
1818

1919
import {memory, tensor3d, test_util} from '@tensorflow/tfjs-core';
20-
import {describeBrowserEnvs, setupFakeVideoStream} from '../util/test_utils';
20+
import {describeBrowserEnvs, replaceHTMLVideoElementSource, setupFakeVideoStream} from '../util/test_utils';
2121
import {WebcamIterator} from './webcam_iterator';
2222

2323
describeBrowserEnvs('WebcamIterator', () => {
@@ -27,38 +27,44 @@ describeBrowserEnvs('WebcamIterator', () => {
2727

2828
it('create webcamIterator with html element', async () => {
2929
const videoElement = document.createElement('video');
30-
videoElement.width = 100;
31-
videoElement.height = 200;
30+
videoElement.width = 160;
31+
videoElement.height = 90;
3232

3333
const webcamIterator = await WebcamIterator.create(videoElement);
34+
35+
await replaceHTMLVideoElementSource(videoElement);
36+
3437
const result = await webcamIterator.next();
3538
expect(result.done).toBeFalsy();
36-
expect(result.value.shape).toEqual([200, 100, 3]);
39+
expect(result.value.shape).toEqual([90, 160, 3]);
3740
});
3841

3942
it('create webcamIterator with html element and capture', async () => {
4043
const videoElement = document.createElement('video');
41-
videoElement.width = 100;
42-
videoElement.height = 200;
44+
videoElement.width = 160;
45+
videoElement.height = 90;
4346

4447
const webcamIterator = await WebcamIterator.create(videoElement);
48+
49+
await replaceHTMLVideoElementSource(videoElement);
50+
4551
const result = await webcamIterator.capture();
46-
expect(result.shape).toEqual([200, 100, 3]);
52+
expect(result.shape).toEqual([90, 160, 3]);
4753
});
4854

4955
it('create webcamIterator with no html element', async () => {
5056
const webcamIterator = await WebcamIterator.create(
51-
null, {resizeWidth: 100, resizeHeight: 200});
57+
null, {resizeWidth: 300, resizeHeight: 150});
5258
const result = await webcamIterator.next();
5359
expect(result.done).toBeFalsy();
54-
expect(result.value.shape).toEqual([200, 100, 3]);
60+
expect(result.value.shape).toEqual([150, 300, 3]);
5561
});
5662

5763
it('create webcamIterator with no html element and capture', async () => {
5864
const webcamIterator = await WebcamIterator.create(
59-
null, {resizeWidth: 100, resizeHeight: 200});
65+
null, {resizeWidth: 300, resizeHeight: 150});
6066
const result = await webcamIterator.capture();
61-
expect(result.shape).toEqual([200, 100, 3]);
67+
expect(result.shape).toEqual([150, 300, 3]);
6268
});
6369

6470
it('create webcamIterator with no html element and no size', async done => {
@@ -164,13 +170,14 @@ describeBrowserEnvs('WebcamIterator', () => {
164170

165171
it('webcamIterator could stop', async () => {
166172
const videoElement = document.createElement('video');
167-
videoElement.width = 100;
168-
videoElement.height = 100;
173+
videoElement.width = 160;
174+
videoElement.height = 90;
169175

170176
const webcamIterator = await WebcamIterator.create(videoElement);
177+
await replaceHTMLVideoElementSource(videoElement);
171178
const result1 = await webcamIterator.next();
172179
expect(result1.done).toBeFalsy();
173-
expect(result1.value.shape).toEqual([100, 100, 3]);
180+
expect(result1.value.shape).toEqual([90, 160, 3]);
174181

175182
await webcamIterator.stop();
176183
const result2 = await webcamIterator.next();
@@ -180,31 +187,29 @@ describeBrowserEnvs('WebcamIterator', () => {
180187

181188
it('webcamIterator could restart', async () => {
182189
const videoElement = document.createElement('video');
183-
videoElement.width = 100;
184-
videoElement.height = 100;
190+
videoElement.width = 160;
191+
videoElement.height = 90;
185192

186193
const webcamIterator = await WebcamIterator.create(videoElement);
194+
await replaceHTMLVideoElementSource(videoElement);
187195
const result1 = await webcamIterator.next();
188196
expect(result1.done).toBeFalsy();
189-
expect(result1.value.shape).toEqual([100, 100, 3]);
197+
expect(result1.value.shape).toEqual([90, 160, 3]);
190198

191199
webcamIterator.stop();
192200
const result2 = await webcamIterator.next();
193201
expect(result2.done).toBeTruthy();
194202
expect(result2.value).toBeNull();
195203

196-
// Reset fake media stream after stopped the stream.
197-
setupFakeVideoStream();
198-
199-
await webcamIterator.start();
200204
// Skip validation when it's in Firefox and Mac OS, because BrowserStack for
201-
// Firefox on travis does not support restarting experimental function
202-
// HTMLCanvasElement.captureStream().
205+
// Firefox does not trigger the readyState event when restarting.
203206
if (navigator.userAgent.search('Firefox') < 0 &&
204207
navigator.userAgent.search('OS X') < 0) {
208+
await webcamIterator.start();
209+
await replaceHTMLVideoElementSource(videoElement);
205210
const result3 = await webcamIterator.next();
206211
expect(result3.done).toBeFalsy();
207-
expect(result3.value.shape).toEqual([100, 100, 3]);
212+
expect(result3.value.shape).toEqual([90, 160, 3]);
208213
}
209214
});
210215

tfjs-data/src/readers_test.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
*/
1717

1818
import * as tfd from './readers';
19-
import {describeAllEnvs, describeBrowserEnvs, describeNodeEnvs, setupFakeVideoStream} from './util/test_utils';
19+
import {describeAllEnvs, describeBrowserEnvs, describeNodeEnvs, replaceHTMLVideoElementSource, setupFakeVideoStream} from './util/test_utils';
2020

2121
describeAllEnvs('readers', () => {
2222
it('generate dataset from function', async () => {
@@ -138,22 +138,23 @@ describeBrowserEnvs('readers in browser', () => {
138138
it('generate data from webcam with HTML element', async () => {
139139
setupFakeVideoStream();
140140
const videoElement = document.createElement('video');
141-
videoElement.width = 300;
142-
videoElement.height = 500;
141+
videoElement.width = 160;
142+
videoElement.height = 90;
143143

144144
const webcamIterator = await tfd.webcam(videoElement);
145+
await replaceHTMLVideoElementSource(videoElement);
145146
const result = await webcamIterator.next();
146147
expect(result.done).toBeFalsy();
147-
expect(result.value.shape).toEqual([500, 300, 3]);
148+
expect(result.value.shape).toEqual([90, 160, 3]);
148149
});
149150

150151
it('generate data from webcam with no HTML element', async () => {
151152
setupFakeVideoStream();
152153
const webcamIterator =
153-
await tfd.webcam(null, {resizeWidth: 100, resizeHeight: 200});
154+
await tfd.webcam(null, {resizeWidth: 300, resizeHeight: 150});
154155
const result = await webcamIterator.next();
155156
expect(result.done).toBeFalsy();
156-
expect(result.value.shape).toEqual([200, 100, 3]);
157+
expect(result.value.shape).toEqual([150, 300, 3]);
157158
});
158159

159160
it('generate data from webcam with HTML element and resize', async () => {

tfjs-data/src/util/test_utils.ts

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ import {ALL_ENVS, BROWSER_ENVS, describeWithFlags, NODE_ENVS, registerTestEnv} f
2020

2121
// Provide fake video stream
2222
export function setupFakeVideoStream() {
23-
const width = 500;
24-
const height = 500;
23+
const width = 100;
24+
const height = 200;
2525
const canvasElement = document.createElement('canvas');
2626
const ctx = canvasElement.getContext('2d');
2727
ctx.fillStyle = 'rgb(1,2,3)';
@@ -33,6 +33,22 @@ export function setupFakeVideoStream() {
3333
};
3434
}
3535

36+
export async function replaceHTMLVideoElementSource(videoElement:HTMLVideoElement) {
37+
const source = document.createElement('source');
38+
// tslint:disable:max-line-length
39+
source.src = 'data:video/mp4;base64,AAAAIGZ0eXBpc29tAAACAGlzb21pc28yYXZjMW1wNDEAAAAIZnJlZQAAAu1tZGF0AAACrQYF//+p3EXpvebZSLeWLNgg2SPu73gyNjQgLSBjb3JlIDE1NSByMjkwMSA3ZDBmZjIyIC0gSC4yNjQvTVBFRy00IEFWQyBjb2RlYyAtIENvcHlsZWZ0IDIwMDMtMjAxOCAtIGh0dHA6Ly93d3cudmlkZW9sYW4ub3JnL3gyNjQuaHRtbCAtIG9wdGlvbnM6IGNhYmFjPTEgcmVmPTMgZGVibG9jaz0xOjA6MCBhbmFseXNlPTB4MzoweDExMyBtZT1oZXggc3VibWU9NyBwc3k9MSBwc3lfcmQ9MS4wMDowLjAwIG1peGVkX3JlZj0xIG1lX3JhbmdlPTE2IGNocm9tYV9tZT0xIHRyZWxsaXM9MSA4eDhkY3Q9MSBjcW09MCBkZWFkem9uZT0yMSwxMSBmYXN0X3Bza2lwPTEgY2hyb21hX3FwX29mZnNldD0tMiB0aHJlYWRzPTMgbG9va2FoZWFkX3RocmVhZHM9MSBzbGljZWRfdGhyZWFkcz0wIG5yPTAgZGVjaW1hdGU9MSBpbnRlcmxhY2VkPTAgYmx1cmF5X2NvbXBhdD0wIGNvbnN0cmFpbmVkX2ludHJhPTAgYmZyYW1lcz0zIGJfcHlyYW1pZD0yIGJfYWRhcHQ9MSBiX2JpYXM9MCBkaXJlY3Q9MSB3ZWlnaHRiPTEgb3Blbl9nb3A9MCB3ZWlnaHRwPTIga2V5aW50PTI1MCBrZXlpbnRfbWluPTEgc2NlbmVjdXQ9NDAgaW50cmFfcmVmcmVzaD0wIHJjX2xvb2thaGVhZD00MCByYz1jcmYgbWJ0cmVlPTEgY3JmPTI4LjAgcWNvbXA9MC42MCBxcG1pbj0wIHFwbWF4PTY5IHFwc3RlcD00IGlwX3JhdGlvPTEuNDAgYXE9MToxLjAwAIAAAAAwZYiEAD//8m+P5OXfBeLGOfKE3xkODvFZuBflHv/+VwJIta6cbpIo4ABLoKBaYTkTAAAC7m1vb3YAAABsbXZoZAAAAAAAAAAAAAAAAAAAA+gAAAPoAAEAAAEAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAIYdHJhawAAAFx0a2hkAAAAAwAAAAAAAAAAAAAAAQAAAAAAAAPoAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAQAAAAACgAAAAWgAAAAAAJGVkdHMAAAAcZWxzdAAAAAAAAAABAAAD6AAAAAAAAQAAAAABkG1kaWEAAAAgbWRoZAAAAAAAAAAAAAAAAAAAQAAAAEAAVcQAAAAAAC1oZGxyAAAAAAAAAAB2aWRlAAAAAAAAAAAAAAAAVmlkZW9IYW5kbGVyAAAAATttaW5mAAAAFHZtaGQAAAABAAAAAAAAAAAAAAAkZGluZgAAABxkcmVmAAAAAAAAAAEAAAAMdXJsIAAAAAEAAAD7c3RibAAAAJdzdHNkAAAAAAAAAAEAAACHYXZjMQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAACgAFoASAAAAEgAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABj//wAAADFhdmNDAWQACv/hABhnZAAKrNlCjfkhAAADAAEAAAMAAg8SJZYBAAZo6+JLIsAAAAAYc3R0cwAAAAAAAAABAAAAAQAAQAAAAAAcc3RzYwAAAAAAAAABAAAAAQAAAAEAAAABAAAAFHN0c3oAAAAAAAAC5QAAAAEAAAAUc3RjbwAAAAAAAAABAAAAMAAAAGJ1ZHRhAAAAWm1ldGEAAAAAAAAAIWhkbHIAAAAAAAAAAG1kaXJhcHBsAAAAAAAAAAAAAAAALWlsc3QAAAAlqXRvbwAAAB1kYXRhAAAAAQAAAABMYXZmNTguMTIuMTAw';
40+
source.type = 'video/mp4';
41+
videoElement.srcObject=null;
42+
videoElement.appendChild(source);
43+
videoElement.play();
44+
45+
if (videoElement.readyState < 2) {
46+
await new Promise(resolve => {
47+
videoElement.addEventListener('loadeddata', () => resolve());
48+
});
49+
}
50+
}
51+
3652
// Register backends.
3753
registerTestEnv({name: 'cpu', backendName: 'cpu'});
3854
registerTestEnv({

tfjs-data/yarn.lock

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22
# yarn lockfile v1
33

44

5-
"@tensorflow/tfjs-core@1.2.8":
6-
version "1.2.8"
7-
resolved "https://registry.yarnpkg.com/@tensorflow/tfjs-core/-/tfjs-core-1.2.8.tgz#d6873b88522f8cf25d34c10afd095866578d7d92"
8-
integrity sha512-lWV4vAnXAAmahXpCWBwdGGW9HO6iNw9pUeVYih7pDXeJahMk3OJs6SgjRNhwn+ldsGwRoorR0/RHg0yNLmqWxQ==
5+
"@tensorflow/tfjs-core@1.2.9":
6+
version "1.2.9"
7+
resolved "https://registry.yarnpkg.com/@tensorflow/tfjs-core/-/tfjs-core-1.2.9.tgz#125830270a0bdd0e856914778a300c4ad6f51e21"
8+
integrity sha512-s0hHZSx6rGTlkkB8u8gs5n7sIPv1GXDNHmISRy+kqGzmlpkfI2kr6WXqOWQy6wFgjzopRD8cJQjBZ9USPZnYTQ==
99
dependencies:
1010
"@types/offscreencanvas" "~2019.3.0"
1111
"@types/seedrandom" "2.4.27"

0 commit comments

Comments
 (0)