forked from mirrors/gecko-dev
		
	Bug 1857629 - add video hardware decoding test on Windows and MacOS. r=media-playback-reviewers,padenot
Differential Revision: https://phabricator.services.mozilla.com/D191799
This commit is contained in:
		
							parent
							
								
									0088c604ff
								
							
						
					
					
						commit
						8b932d9213
					
				
					 2 changed files with 123 additions and 0 deletions
				
			
		|  | @ -837,6 +837,10 @@ skip-if = ["os == 'android'"] # bug 1108558, android(bug 1232305) | |||
| skip-if = ["os != 'android'"] | ||||
| tags = "hls" | ||||
| 
 | ||||
| ["test_hw_video_decoding.html"] | ||||
| skip-if = ["!mda_gpu"] | ||||
| scheme = "https" | ||||
| 
 | ||||
| ["test_imagecapture.html"] | ||||
| scheme = "https" | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										119
									
								
								dom/media/test/test_hw_video_decoding.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										119
									
								
								dom/media/test/test_hw_video_decoding.html
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,119 @@ | |||
| <!DOCTYPE HTML> | ||||
| <html> | ||||
| <head> | ||||
| <title>Test video hardware decoding</title> | ||||
| <script src="/tests/SimpleTest/SimpleTest.js"></script> | ||||
| <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/> | ||||
| <script type="application/javascript"> | ||||
| 
 | ||||
| /** | ||||
|  * This test is used to check hardware video decoding on different platforms. | ||||
|  */ | ||||
| const PLATFORMS = { | ||||
|   // TODO : add Linux and Android, media-gpu doesn't run on them yet | ||||
|   WINNT: { | ||||
|     process: "GPU", | ||||
|     tests: [ | ||||
|       { | ||||
|         file: "gizmo.mp4", | ||||
|         decoder: "wmf H264 codec hardware video decoder", | ||||
|       }, | ||||
|       // TODO : enable VP9 for Windows. The current machine on CI doesn't | ||||
|       // support VP9 HW. See bug 1861755. | ||||
|       // { | ||||
|       //   file: "gizmo.webm", | ||||
|       //   decoder: "wmf VP9 codec hardware video decoder", | ||||
|       // }, | ||||
|       // TODO : add AV1, see bug 1861501. | ||||
|     ], | ||||
|   }, | ||||
|   Darwin: { | ||||
|     process: "RDD", | ||||
|     tests: [ | ||||
|       { | ||||
|         file: "gizmo.mp4", | ||||
|         decoder: "apple hardware VT decoder", | ||||
|       }, | ||||
|       // TODO : enable VP9 for MacOS. The current machine on CI doesn't support | ||||
|       // VP9 HW. See bug 1861741. | ||||
|       // { | ||||
|       //   file: "gizmo.webm", | ||||
|       //   decoder: "apple hardware VT decoder", | ||||
|       // }, | ||||
|     ], | ||||
|   }, | ||||
| }; | ||||
| 
 | ||||
| add_task(async function testHardwareVideoDecoding() { | ||||
|   const platformName = SpecialPowers.Services.appinfo.OS; | ||||
|   const platformTest = PLATFORMS[platformName]; | ||||
|   for (const test of platformTest.tests) { | ||||
|     info( | ||||
|       `Testing ${test.file} on ${platformName} : expect ${test.decoder} in ${platformTest.process}` | ||||
|     ); | ||||
|     await createAndPlayVideo(test.file); | ||||
|     await assertRunningProcessAndDecoderName({ | ||||
|       expectedProcess: platformTest.process, | ||||
|       expectedDecoder: test.decoder, | ||||
|     }); | ||||
|     await waitVideoPlayToEnd(); | ||||
|   } | ||||
| }); | ||||
| 
 | ||||
| // Following are helper functions | ||||
| async function createAndPlayVideo(fileUrl) { | ||||
|   const video = document.createElement("video"); | ||||
|   document.body.appendChild(video); | ||||
|   video.src = fileUrl; | ||||
|   ok( | ||||
|     await video.play().then( | ||||
|       () => true, | ||||
|       () => false | ||||
|     ), | ||||
|     "video started playing" | ||||
|   ); | ||||
|   // Waiting for timeupdate to ensure the video decoder has been created | ||||
|   // correctly. | ||||
|   await new Promise(r => (video.ontimeupdate = r)); | ||||
| } | ||||
| 
 | ||||
| async function assertRunningProcessAndDecoderName( | ||||
|   { expectedProcess, expectedDecoder } = {} | ||||
| ) { | ||||
|   const video = document.querySelector("video"); | ||||
|   ok(!video.paused, "checking a playing video that should be hw decoding"); | ||||
| 
 | ||||
|   const debugInfo = await SpecialPowers.wrap(video).mozRequestDebugInfo(); | ||||
|   const videoDecoderName = debugInfo.decoder.reader.videoDecoderName; | ||||
| 
 | ||||
|   const isExpectedDecoder = | ||||
|     videoDecoderName.indexOf(`${expectedDecoder}`) == 0; | ||||
|   ok( | ||||
|     isExpectedDecoder, | ||||
|     `Playback running by decoder '${videoDecoderName}', expected '${expectedDecoder}'` | ||||
|   ); | ||||
| 
 | ||||
|   const isExpectedProcess = | ||||
|     videoDecoderName.indexOf(`(${expectedProcess} remote)`) > 0; | ||||
|   ok( | ||||
|     isExpectedProcess, | ||||
|     `Playback running in process '${videoDecoderName}', expected '${expectedProcess}'` | ||||
|   ); | ||||
| } | ||||
| 
 | ||||
| async function waitVideoPlayToEnd() { | ||||
|   const video = document.querySelector("video"); | ||||
|   if (video.ended) { | ||||
|     ok(true, "video reached to end!"); | ||||
|   } else { | ||||
|     await new Promise(r => (video.onended = r)); | ||||
|   } | ||||
|   // Remove current video so that we can check next video later. | ||||
|   document.body.removeChild(video); | ||||
| } | ||||
| 
 | ||||
| </script> | ||||
| </head> | ||||
| <body> | ||||
| </body> | ||||
| </html> | ||||
		Loading…
	
		Reference in a new issue
	
	 alwu
						alwu