| <!DOCTYPE html> | |
| <html lang='en-US'> | |
| <head> | |
| <title>EME playback test application</title> | |
| </head> | |
| <body style='font-family:"Lucida Console", Monaco, monospace; font-size:14px' onload="start()"> | |
| <i>Clearkey works only with content encrypted using bear key.</i><br><br> | |
| <table> | |
| <tr title='URL param mediaFile=...'> | |
| <td><label for='mediaFile'>Encrypted video URL:</label></td> | |
| <td><input id='mediaFile' type='text' size='64'></td> | |
| </tr> | |
| <tr title='URL param licenseServerURL=...'> | |
| <td><label for='licenseServer'>License sever URL:</label></td> | |
| <td><input id='licenseServer' type='text' size='64'></td> | |
| </tr> | |
| <tr title='URL param keySystem=...'> | |
| <td><label for='keySystemList'>Key system:</label></td> | |
| <td><select id='keySystemList'></select></td> | |
| </tr> | |
| <tr title='URL param mediaType=...'> | |
| <td><label for='mediaTypeList'>Media type:</label></td> | |
| <td><select id='mediaTypeList'></select></td> | |
| </tr> | |
| <tr title='URL param useMSE=1|0'> | |
| <td><label for='useMSE'>Load media by:</label></td> | |
| <td> | |
| <select id='useMSE'> | |
| <option value='true' selected='selected'>MSE</option> | |
| <option value='false'>src</option> | |
| </select> | |
| </td> | |
| </tr> | |
| </table> | |
| <br> | |
| <button onclick='start();'>Play</button> | |
| <br><br> | |
| Decoded fps: <span id='decodedFPS'></span> | |
| <br> | |
| Dropped fps: <span id='droppedFPS'></span> | |
| <br> | |
| Total dropped frames: <span id='droppedFrames'></span> | |
| <br><br> | |
| <table> | |
| <tr> | |
| <td valign='top'><span id='video'></span></td> | |
| <td valign='top'> | |
| <label for='logs' onclick="toggleDisplay('logs');"><i>Click to toggle logs visibility (newest at top).</i><br></label> | |
| <div id='logs' style='overflow: auto; height: 480px; width: 480px; white-space: nowrap; display: none'></div> | |
| </td> | |
| </tr> | |
| </table> | |
| <div></div> | |
| </body> | |
| <script src='eme_player_js/app_loader.js' type='text/javascript'></script> | |
| <script type='text/javascript'> | |
| var testConfig; | |
| var emeApp; | |
| var player; | |
| var heartbeatCount = 0; | |
| function initApp() { | |
| testConfig = new TestConfig(); | |
| testConfig.loadQueryParams(); | |
| // Update document with test configuration values. | |
| emeApp = new EMEApp(testConfig); | |
| setInterval(function () { | |
| Utils.timeLog('heartbeat #' + ++heartbeatCount); | |
| }, 1000); | |
| } | |
| function onTimeUpdate(e) { | |
| var video = e.target; | |
| Utils.timeLog('timeupdate @ ' + video.currentTime); | |
| if (video.currentTime < 1) | |
| return; | |
| // Renewal message may be fired around the start of playback; check for it | |
| // after a delay to avoid timing issues. | |
| if (testConfig.keySystem == EXTERNAL_CLEARKEY_RENEWAL && | |
| !video.receivedRenewalMessage) { | |
| Utils.failTest('license-renewal message not received.'); | |
| } | |
| Utils.timeLog('waiting for video to end.'); | |
| video.removeEventListener('ended', Utils.failTest); | |
| Utils.installTitleEventHandler(video, 'ended'); | |
| video.removeEventListener('timeupdate', onTimeUpdate); | |
| } | |
| function onFirstPlayEnded(e) { | |
| Utils.timeLog('First play ended.'); | |
| var video = e.target; | |
| video.removeEventListener('ended', onFirstPlayEnded); | |
| video.removeEventListener('abort', Utils.failTest); | |
| // Reset src (to same video again). | |
| PlayerUtils.setVideoSource(player); | |
| // Play the video a second time. | |
| Utils.timeLog('Playing second time.'); | |
| play(video, false); | |
| } | |
| function onLogEvent(e) { | |
| Utils.timeLog('Event: ' + e.type); | |
| } | |
| function onVisibilityChange(e) { | |
| Utils.timeLog('Event: ' + e.type + ', hidden: ' + document.hidden); | |
| } | |
| function play(video, playTwice) { | |
| Utils.timeLog('Starting play, hidden: ' + document.hidden); | |
| video.addEventListener('canplay', onLogEvent); | |
| video.addEventListener('load', onLogEvent); | |
| video.addEventListener('playing', onLogEvent); | |
| video.addEventListener('play', onLogEvent); | |
| video.addEventListener('canplaythrough', onLogEvent); | |
| video.addEventListener('stalled', onLogEvent); | |
| video.addEventListener('waiting', onLogEvent); | |
| document.addEventListener('visibilitychange', onVisibilityChange); | |
| Utils.resetTitleChange(); | |
| if (playTwice) { | |
| // Wait for the first play to complete. | |
| video.addEventListener('ended', onFirstPlayEnded); | |
| video.play(); | |
| return; | |
| } | |
| // Ended should not fire before onTimeUpdate. | |
| video.addEventListener('ended', Utils.failTest); | |
| video.addEventListener('timeupdate', onTimeUpdate); | |
| video.play(); | |
| } | |
| function toggleDisplay(id) { | |
| var element = document.getElementById(id); | |
| if (!element) | |
| return; | |
| if (element.style['display'] != 'none') | |
| element.style['display'] = 'none'; | |
| else | |
| element.style['display'] = ''; | |
| } | |
| function start() { | |
| initApp(); | |
| emeApp.createPlayer() | |
| .then(function(p) { | |
| player = p; | |
| play(player.video, testConfig.playTwice); | |
| }).catch(function(error) { | |
| Utils.timeLog(error); | |
| Utils.failTest('Unable to play video.'); | |
| }); | |
| } | |
| </script> | |
| </html> |