@@ -222,26 +222,30 @@ describeWebGPU('backend webgpu', () => {
222222 const textureManager = backend . getTextureManager ( ) ;
223223 textureManager . dispose ( ) ;
224224
225- for ( let tmpUseImport of [ false , true ] ) {
226- {
227- tf . env ( ) . set ( 'WEBGPU_USE_IMPORT' , tmpUseImport ) ;
225+ {
226+ const video = document . createElement ( 'video' ) ;
227+ const source = document . createElement ( 'source' ) ;
228+ source . src =
229+ // tslint:disable-next-line:max-line-length
230+ 'data:video/mp4;base64,AAAAIGZ0eXBpc29tAAACAGlzb21pc28yYXZjMW1wNDEAAAAIZnJlZQAAAu1tZGF0AAACrQYF//+p3EXpvebZSLeWLNgg2SPu73gyNjQgLSBjb3JlIDE1NSByMjkwMSA3ZDBmZjIyIC0gSC4yNjQvTVBFRy00IEFWQyBjb2RlYyAtIENvcHlsZWZ0IDIwMDMtMjAxOCAtIGh0dHA6Ly93d3cudmlkZW9sYW4ub3JnL3gyNjQuaHRtbCAtIG9wdGlvbnM6IGNhYmFjPTEgcmVmPTMgZGVibG9jaz0xOjA6MCBhbmFseXNlPTB4MzoweDExMyBtZT1oZXggc3VibWU9NyBwc3k9MSBwc3lfcmQ9MS4wMDowLjAwIG1peGVkX3JlZj0xIG1lX3JhbmdlPTE2IGNocm9tYV9tZT0xIHRyZWxsaXM9MSA4eDhkY3Q9MSBjcW09MCBkZWFkem9uZT0yMSwxMSBmYXN0X3Bza2lwPTEgY2hyb21hX3FwX29mZnNldD0tMiB0aHJlYWRzPTMgbG9va2FoZWFkX3RocmVhZHM9MSBzbGljZWRfdGhyZWFkcz0wIG5yPTAgZGVjaW1hdGU9MSBpbnRlcmxhY2VkPTAgYmx1cmF5X2NvbXBhdD0wIGNvbnN0cmFpbmVkX2ludHJhPTAgYmZyYW1lcz0zIGJfcHlyYW1pZD0yIGJfYWRhcHQ9MSBiX2JpYXM9MCBkaXJlY3Q9MSB3ZWlnaHRiPTEgb3Blbl9nb3A9MCB3ZWlnaHRwPTIga2V5aW50PTI1MCBrZXlpbnRfbWluPTEgc2NlbmVjdXQ9NDAgaW50cmFfcmVmcmVzaD0wIHJjX2xvb2thaGVhZD00MCByYz1jcmYgbWJ0cmVlPTEgY3JmPTI4LjAgcWNvbXA9MC42MCBxcG1pbj0wIHFwbWF4PTY5IHFwc3RlcD00IGlwX3JhdGlvPTEuNDAgYXE9MToxLjAwAIAAAAAwZYiEAD//8m+P5OXfBeLGOfKE3xkODvFZuBflHv/+VwJIta6cbpIo4ABLoKBaYTkTAAAC7m1vb3YAAABsbXZoZAAAAAAAAAAAAAAAAAAAA+gAAAPoAAEAAAEAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAIYdHJhawAAAFx0a2hkAAAAAwAAAAAAAAAAAAAAAQAAAAAAAAPoAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAQAAAAACgAAAAWgAAAAAAJGVkdHMAAAAcZWxzdAAAAAAAAAABAAAD6AAAAAAAAQAAAAABkG1kaWEAAAAgbWRoZAAAAAAAAAAAAAAAAAAAQAAAAEAAVcQAAAAAAC1oZGxyAAAAAAAAAAB2aWRlAAAAAAAAAAAAAAAAVmlkZW9IYW5kbGVyAAAAATttaW5mAAAAFHZtaGQAAAABAAAAAAAAAAAAAAAkZGluZgAAABxkcmVmAAAAAAAAAAEAAAAMdXJsIAAAAAEAAAD7c3RibAAAAJdzdHNkAAAAAAAAAAEAAACHYXZjMQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAACgAFoASAAAAEgAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABj//wAAADFhdmNDAWQACv/hABhnZAAKrNlCjfkhAAADAAEAAAMAAg8SJZYBAAZo6+JLIsAAAAAYc3R0cwAAAAAAAAABAAAAAQAAQAAAAAAcc3RzYwAAAAAAAAABAAAAAQAAAAEAAAABAAAAFHN0c3oAAAAAAAAC5QAAAAEAAAAUc3RjbwAAAAAAAAABAAAAMAAAAGJ1ZHRhAAAAWm1ldGEAAAAAAAAAIWhkbHIAAAAAAAAAAG1kaXJhcHBsAAAAAAAAAAAAAAAALWlsc3QAAAAlqXRvbwAAAB1kYXRhAAAAAQAAAABMYXZmNTguMTIuMTAw' ;
231+ source . type = 'video/mp4' ;
232+ video . appendChild ( source ) ;
233+ document . body . appendChild ( video ) ;
234+
235+ video . autoplay = true ;
236+ video . loop = true ;
237+ video . muted = true ;
238+ video . preload = 'auto' ;
239+ await video . play ( ) ;
240+
241+ // ensure video element to be loaded
242+ if ( 'requestVideoFrameCallback' in video ) {
243+ // tslint:disable-next-line:no-any
244+ await new Promise ( go => ( video as any ) . requestVideoFrameCallback ( go ) ) ;
245+ }
228246
229- const video = document . createElement ( 'video' ) ;
230- video . autoplay = true ;
231- const source = document . createElement ( 'source' ) ;
232- source . src =
233- // tslint:disable-next-line:max-line-length
234- 'data:video/mp4;base64,AAAAIGZ0eXBpc29tAAACAGlzb21pc28yYXZjMW1wNDEAAAAIZnJlZQAAAu1tZGF0AAACrQYF//+p3EXpvebZSLeWLNgg2SPu73gyNjQgLSBjb3JlIDE1NSByMjkwMSA3ZDBmZjIyIC0gSC4yNjQvTVBFRy00IEFWQyBjb2RlYyAtIENvcHlsZWZ0IDIwMDMtMjAxOCAtIGh0dHA6Ly93d3cudmlkZW9sYW4ub3JnL3gyNjQuaHRtbCAtIG9wdGlvbnM6IGNhYmFjPTEgcmVmPTMgZGVibG9jaz0xOjA6MCBhbmFseXNlPTB4MzoweDExMyBtZT1oZXggc3VibWU9NyBwc3k9MSBwc3lfcmQ9MS4wMDowLjAwIG1peGVkX3JlZj0xIG1lX3JhbmdlPTE2IGNocm9tYV9tZT0xIHRyZWxsaXM9MSA4eDhkY3Q9MSBjcW09MCBkZWFkem9uZT0yMSwxMSBmYXN0X3Bza2lwPTEgY2hyb21hX3FwX29mZnNldD0tMiB0aHJlYWRzPTMgbG9va2FoZWFkX3RocmVhZHM9MSBzbGljZWRfdGhyZWFkcz0wIG5yPTAgZGVjaW1hdGU9MSBpbnRlcmxhY2VkPTAgYmx1cmF5X2NvbXBhdD0wIGNvbnN0cmFpbmVkX2ludHJhPTAgYmZyYW1lcz0zIGJfcHlyYW1pZD0yIGJfYWRhcHQ9MSBiX2JpYXM9MCBkaXJlY3Q9MSB3ZWlnaHRiPTEgb3Blbl9nb3A9MCB3ZWlnaHRwPTIga2V5aW50PTI1MCBrZXlpbnRfbWluPTEgc2NlbmVjdXQ9NDAgaW50cmFfcmVmcmVzaD0wIHJjX2xvb2thaGVhZD00MCByYz1jcmYgbWJ0cmVlPTEgY3JmPTI4LjAgcWNvbXA9MC42MCBxcG1pbj0wIHFwbWF4PTY5IHFwc3RlcD00IGlwX3JhdGlvPTEuNDAgYXE9MToxLjAwAIAAAAAwZYiEAD//8m+P5OXfBeLGOfKE3xkODvFZuBflHv/+VwJIta6cbpIo4ABLoKBaYTkTAAAC7m1vb3YAAABsbXZoZAAAAAAAAAAAAAAAAAAAA+gAAAPoAAEAAAEAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAIYdHJhawAAAFx0a2hkAAAAAwAAAAAAAAAAAAAAAQAAAAAAAAPoAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAQAAAAACgAAAAWgAAAAAAJGVkdHMAAAAcZWxzdAAAAAAAAAABAAAD6AAAAAAAAQAAAAABkG1kaWEAAAAgbWRoZAAAAAAAAAAAAAAAAAAAQAAAAEAAVcQAAAAAAC1oZGxyAAAAAAAAAAB2aWRlAAAAAAAAAAAAAAAAVmlkZW9IYW5kbGVyAAAAATttaW5mAAAAFHZtaGQAAAABAAAAAAAAAAAAAAAkZGluZgAAABxkcmVmAAAAAAAAAAEAAAAMdXJsIAAAAAEAAAD7c3RibAAAAJdzdHNkAAAAAAAAAAEAAACHYXZjMQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAACgAFoASAAAAEgAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABj//wAAADFhdmNDAWQACv/hABhnZAAKrNlCjfkhAAADAAEAAAMAAg8SJZYBAAZo6+JLIsAAAAAYc3R0cwAAAAAAAAABAAAAAQAAQAAAAAAcc3RzYwAAAAAAAAABAAAAAQAAAAEAAAABAAAAFHN0c3oAAAAAAAAC5QAAAAEAAAAUc3RjbwAAAAAAAAABAAAAMAAAAGJ1ZHRhAAAAWm1ldGEAAAAAAAAAIWhkbHIAAAAAAAAAAG1kaXJhcHBsAAAAAAAAAAAAAAAALWlsc3QAAAAlqXRvbwAAAB1kYXRhAAAAAQAAAABMYXZmNTguMTIuMTAw' ;
235- source . type = 'video/mp4' ;
236- video . appendChild ( source ) ;
237- document . body . appendChild ( video ) ;
238-
239- // On mobile safari the ready state is ready immediately.
240- if ( video . readyState < 2 ) {
241- await new Promise ( resolve => {
242- video . addEventListener ( 'loadeddata' , ( ) => resolve ( video ) ) ;
243- } ) ;
244- }
247+ for ( const tmpUseImport of [ false , true ] ) {
248+ tf . env ( ) . set ( 'WEBGPU_USE_IMPORT' , tmpUseImport ) ;
245249 const res = await tf . browser . fromPixelsAsync ( video ) ;
246250 expect ( res . shape ) . toEqual ( [ 90 , 160 , 3 ] ) ;
247251 const data = await res . data ( ) ;
@@ -250,51 +254,51 @@ describeWebGPU('backend webgpu', () => {
250254 const usedTexturesAfterFromPixel = textureManager . getNumUsedTextures ( ) ;
251255 expect ( freeTexturesAfterFromPixel ) . toEqual ( 1 ) ;
252256 expect ( usedTexturesAfterFromPixel ) . toEqual ( 0 ) ;
253- document . body . removeChild ( video ) ;
254257 }
255258
256- {
257- const img = new Image ( 10 , 10 ) ;
258- img . src = 'data:image/gif;base64' +
259- ',R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==' ;
260-
261- await new Promise ( resolve => {
262- img . onload = ( ) => resolve ( img ) ;
263- } ) ;
264-
265- const resImage = await tf . browser . fromPixelsAsync ( img ) ;
266- expect ( resImage . shape ) . toEqual ( [ 10 , 10 , 3 ] ) ;
267-
268- const dataImage = await resImage . data ( ) ;
269- expect ( dataImage [ 0 ] ) . toEqual ( 0 ) ;
270- expect ( dataImage . length ) . toEqual ( 10 * 10 * 3 ) ;
271- const freeTexturesAfterFromPixel = textureManager . getNumFreeTextures ( ) ;
272- const usedTexturesAfterFromPixel = textureManager . getNumUsedTextures ( ) ;
273- expect ( freeTexturesAfterFromPixel ) . toEqual ( 2 ) ;
274- expect ( usedTexturesAfterFromPixel ) . toEqual ( 0 ) ;
275- }
259+ document . body . removeChild ( video ) ;
260+ tf . env ( ) . set ( 'WEBGPU_USE_IMPORT' , useImport ) ;
261+ }
276262
277- {
278- const img = new Image ( 10 , 10 ) ;
279- img . src =
280- 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAIAAAACUFjqAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAABfSURBVChTY/gPBu8NLd/KqLxT1oZw4QAqDZSDoPeWDj9WrYUIAgG6NBAhm4FFGoIgxuCUBiKgMfikv1bW4pQGav334wdUGshBk/6SVQAUh0p/mzIDTQ6oFSGNHfz/DwAwi8mNzTi6rwAAAABJRU5ErkJggg==' ;
281- await new Promise ( resolve => {
282- img . onload = ( ) => resolve ( img ) ;
283- } ) ;
284- const resImage = await tf . browser . fromPixelsAsync ( img ) ;
285- expect ( resImage . shape ) . toEqual ( [ 10 , 10 , 3 ] ) ;
286-
287- const dataImage = await resImage . data ( ) ;
288- expect ( dataImage [ 0 ] ) . toEqual ( 255 ) ;
289- expect ( dataImage . length ) . toEqual ( 10 * 10 * 3 ) ;
290- const freeTexturesAfterFromPixel = textureManager . getNumFreeTextures ( ) ;
291- const usedTexturesAfterFromPixel = textureManager . getNumUsedTextures ( ) ;
292- expect ( freeTexturesAfterFromPixel ) . toEqual ( 2 ) ;
293- expect ( usedTexturesAfterFromPixel ) . toEqual ( 0 ) ;
294- }
263+ {
264+ const img = new Image ( 10 , 10 ) ;
265+ img . src = 'data:image/gif;base64' +
266+ ',R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==' ;
267+
268+ await new Promise ( resolve => {
269+ img . onload = ( ) => resolve ( img ) ;
270+ } ) ;
271+
272+ const resImage = await tf . browser . fromPixelsAsync ( img ) ;
273+ expect ( resImage . shape ) . toEqual ( [ 10 , 10 , 3 ] ) ;
274+
275+ const dataImage = await resImage . data ( ) ;
276+ expect ( dataImage [ 0 ] ) . toEqual ( 0 ) ;
277+ expect ( dataImage . length ) . toEqual ( 10 * 10 * 3 ) ;
278+ const freeTexturesAfterFromPixel = textureManager . getNumFreeTextures ( ) ;
279+ const usedTexturesAfterFromPixel = textureManager . getNumUsedTextures ( ) ;
280+ expect ( freeTexturesAfterFromPixel ) . toEqual ( 2 ) ;
281+ expect ( usedTexturesAfterFromPixel ) . toEqual ( 0 ) ;
295282 }
296283
297- tf . env ( ) . set ( 'WEBGPU_USE_IMPORT' , useImport ) ;
284+ {
285+ const img = new Image ( 10 , 10 ) ;
286+ img . src =
287+ 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAIAAAACUFjqAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAABfSURBVChTY/gPBu8NLd/KqLxT1oZw4QAqDZSDoPeWDj9WrYUIAgG6NBAhm4FFGoIgxuCUBiKgMfikv1bW4pQGav334wdUGshBk/6SVQAUh0p/mzIDTQ6oFSGNHfz/DwAwi8mNzTi6rwAAAABJRU5ErkJggg==' ;
288+ await new Promise ( resolve => {
289+ img . onload = ( ) => resolve ( img ) ;
290+ } ) ;
291+ const resImage = await tf . browser . fromPixelsAsync ( img ) ;
292+ expect ( resImage . shape ) . toEqual ( [ 10 , 10 , 3 ] ) ;
293+
294+ const dataImage = await resImage . data ( ) ;
295+ expect ( dataImage [ 0 ] ) . toEqual ( 255 ) ;
296+ expect ( dataImage . length ) . toEqual ( 10 * 10 * 3 ) ;
297+ const freeTexturesAfterFromPixel = textureManager . getNumFreeTextures ( ) ;
298+ const usedTexturesAfterFromPixel = textureManager . getNumUsedTextures ( ) ;
299+ expect ( freeTexturesAfterFromPixel ) . toEqual ( 2 ) ;
300+ expect ( usedTexturesAfterFromPixel ) . toEqual ( 0 ) ;
301+ }
298302 } ) ;
299303} ) ;
300304
0 commit comments