| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 // The PlayerUtils provides utility functions to binding common media events | 5 // The PlayerUtils provides utility functions to binding common media events |
| 6 // to specific player functions. It also provides functions to load media source | 6 // to specific player functions. It also provides functions to load media source |
| 7 // base on test configurations. | 7 // base on test configurations. |
| 8 var PlayerUtils = new function() { | 8 var PlayerUtils = new function() { |
| 9 } | 9 } |
| 10 | 10 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 31 } | 31 } |
| 32 | 32 |
| 33 player.video.addEventListener('error', function(error) { | 33 player.video.addEventListener('error', function(error) { |
| 34 // This most likely happens on pipeline failures (e.g. when the CDM | 34 // This most likely happens on pipeline failures (e.g. when the CDM |
| 35 // crashes). | 35 // crashes). |
| 36 Utils.timeLog('onHTMLElementError', error); | 36 Utils.timeLog('onHTMLElementError', error); |
| 37 Utils.failTest(error); | 37 Utils.failTest(error); |
| 38 }); | 38 }); |
| 39 }; | 39 }; |
| 40 | 40 |
| 41 // Register the necessary event handlers needed when playing encrypted content | 41 // Register the necessary event handlers needed when playing encrypted content. |
| 42 // using the unprefixed API. Returns a promise that resolves to the player. | 42 // Returns a promise that resolves to the player. |
| 43 PlayerUtils.registerEMEEventListeners = function(player) { | 43 PlayerUtils.registerEMEEventListeners = function(player) { |
| 44 player.video.addEventListener('encrypted', function(message) { | 44 player.video.addEventListener('encrypted', function(message) { |
| 45 | 45 |
| 46 function addMediaKeySessionListeners(mediaKeySession) { | 46 function addMediaKeySessionListeners(mediaKeySession) { |
| 47 mediaKeySession.addEventListener('message', function(message) { | 47 mediaKeySession.addEventListener('message', function(message) { |
| 48 player.video.receivedKeyMessage = true; | 48 player.video.receivedKeyMessage = true; |
| 49 if (Utils.isRenewalMessage(message)) { | 49 if (Utils.isRenewalMessage(message)) { |
| 50 Utils.timeLog('MediaKeySession onMessage - renewal', message); | 50 Utils.timeLog('MediaKeySession onMessage - renewal', message); |
| 51 player.video.receivedRenewalMessage = true; | 51 player.video.receivedRenewalMessage = true; |
| 52 } else { | 52 } else { |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 112 return navigator.requestMediaKeySystemAccess( | 112 return navigator.requestMediaKeySystemAccess( |
| 113 player.testConfig.keySystem, [config]) | 113 player.testConfig.keySystem, [config]) |
| 114 .then(function(access) { return access.createMediaKeys(); }) | 114 .then(function(access) { return access.createMediaKeys(); }) |
| 115 .then(function(mediaKeys) { | 115 .then(function(mediaKeys) { |
| 116 return player.video.setMediaKeys(mediaKeys); | 116 return player.video.setMediaKeys(mediaKeys); |
| 117 }) | 117 }) |
| 118 .then(function(result) { return player; }) | 118 .then(function(result) { return player; }) |
| 119 .catch(function(error) { Utils.failTest(error, NOTSUPPORTEDERROR); }); | 119 .catch(function(error) { Utils.failTest(error, NOTSUPPORTEDERROR); }); |
| 120 }; | 120 }; |
| 121 | 121 |
| 122 // Register the necessary event handlers needed when playing encrypted content | |
| 123 // using the prefixed API. Even though the prefixed API is all synchronous, | |
| 124 // returns a promise that resolves to the player. | |
| 125 PlayerUtils.registerPrefixedEMEEventListeners = function(player) { | |
| 126 player.video.addEventListener('webkitneedkey', function(message) { | |
| 127 var initData = message.initData; | |
| 128 if (player.testConfig.sessionToLoad) { | |
| 129 Utils.timeLog('Loading session: ' + player.testConfig.sessionToLoad); | |
| 130 initData = | |
| 131 Utils.convertToUint8Array(PREFIXED_EME_API_LOAD_SESSION_HEADER + | |
| 132 player.testConfig.sessionToLoad); | |
| 133 } | |
| 134 Utils.timeLog(player.testConfig.keySystem + | |
| 135 ' Generate key request, initData: ' + | |
| 136 Utils.getHexString(initData)); | |
| 137 try { | |
| 138 message.target.webkitGenerateKeyRequest(player.testConfig.keySystem, | |
| 139 initData); | |
| 140 } catch (e) { | |
| 141 Utils.failTest(e); | |
| 142 } | |
| 143 }); | |
| 144 | |
| 145 player.video.addEventListener('webkitkeyadded', function(message) { | |
| 146 Utils.timeLog('onWebkitKeyAdded', message); | |
| 147 message.target.receivedKeyAdded = true; | |
| 148 }); | |
| 149 | |
| 150 player.video.addEventListener('webkitkeyerror', function(error) { | |
| 151 Utils.timeLog('onWebkitKeyError', | |
| 152 'KeySystem: ' + error.keySystem + ', sessionId: ' + | |
| 153 error.sessionId + ', errorCode: ' + error.errorCode.code + | |
| 154 ', systemCode: ' + error.systemCode); | |
| 155 Utils.failTest(error, PREFIXED_EME_ERROR_EVENT); | |
| 156 }); | |
| 157 | |
| 158 player.video.addEventListener('webkitkeymessage', function(message) { | |
| 159 Utils.timeLog('onWebkitKeyMessage', message); | |
| 160 message.target.receivedKeyMessage = true; | |
| 161 if (Utils.isRenewalMessagePrefixed(message.message)) { | |
| 162 Utils.timeLog('onWebkitKeyMessage - renewal', message); | |
| 163 message.target.receivedRenewalMessage = true; | |
| 164 } | |
| 165 }); | |
| 166 | |
| 167 // The prefixed API is all synchronous, so wrap the calls in a promise. | |
| 168 return new Promise(function(resolve, reject) { | |
| 169 PlayerUtils.registerDefaultEventListeners(player); | |
| 170 player.video.receivedKeyMessage = false; | |
| 171 resolve(player); | |
| 172 }); | |
| 173 }; | |
| 174 | |
| 175 PlayerUtils.setVideoSource = function(player) { | 122 PlayerUtils.setVideoSource = function(player) { |
| 176 if (player.testConfig.useMSE) { | 123 if (player.testConfig.useMSE) { |
| 177 Utils.timeLog('Loading media using MSE.'); | 124 Utils.timeLog('Loading media using MSE.'); |
| 178 var mediaSource = | 125 var mediaSource = |
| 179 MediaSourceUtils.loadMediaSourceFromTestConfig(player.testConfig); | 126 MediaSourceUtils.loadMediaSourceFromTestConfig(player.testConfig); |
| 180 player.video.src = window.URL.createObjectURL(mediaSource); | 127 player.video.src = window.URL.createObjectURL(mediaSource); |
| 181 } else { | 128 } else { |
| 182 Utils.timeLog('Loading media using src.'); | 129 Utils.timeLog('Loading media using src.'); |
| 183 player.video.src = player.testConfig.mediaFile; | 130 player.video.src = player.testConfig.mediaFile; |
| 184 } | 131 } |
| 185 Utils.timeLog('video.src has been set to ' + player.video.src); | 132 Utils.timeLog('video.src has been set to ' + player.video.src); |
| 186 }; | 133 }; |
| 187 | 134 |
| 188 // Initialize the player to play encrypted content. Returns a promise that | 135 // Initialize the player to play encrypted content. Returns a promise that |
| 189 // resolves to the player. | 136 // resolves to the player. |
| 190 PlayerUtils.initEMEPlayer = function(player) { | 137 PlayerUtils.initEMEPlayer = function(player) { |
| 191 return player.registerEventListeners().then(function(result) { | 138 return player.registerEventListeners().then(function(result) { |
| 192 PlayerUtils.setVideoSource(player); | 139 PlayerUtils.setVideoSource(player); |
| 193 Utils.timeLog('initEMEPlayer() done'); | 140 Utils.timeLog('initEMEPlayer() done'); |
| 194 return player; | 141 return player; |
| 195 }); | 142 }); |
| 196 }; | 143 }; |
| 197 | 144 |
| 198 // Return the appropriate player based on test configuration. | 145 // Return the appropriate player based on test configuration. |
| 199 PlayerUtils.createPlayer = function(video, testConfig) { | 146 PlayerUtils.createPlayer = function(video, testConfig) { |
| 200 // Update keySystem if using prefixed Clear Key since it is not available as a | |
| 201 // separate key system to choose from; however it can be set in URL query. | |
| 202 var usePrefixedEME = testConfig.usePrefixedEME; | |
| 203 if (testConfig.keySystem == CLEARKEY && usePrefixedEME) | |
| 204 testConfig.keySystem = PREFIXED_CLEARKEY; | |
| 205 | |
| 206 function getPlayerType(keySystem) { | 147 function getPlayerType(keySystem) { |
| 207 switch (keySystem) { | 148 switch (keySystem) { |
| 208 case WIDEVINE_KEYSYSTEM: | 149 case WIDEVINE_KEYSYSTEM: |
| 209 if (usePrefixedEME) | |
| 210 return PrefixedWidevinePlayer; | |
| 211 return WidevinePlayer; | 150 return WidevinePlayer; |
| 212 case PREFIXED_CLEARKEY: | |
| 213 return PrefixedClearKeyPlayer; | |
| 214 case EXTERNAL_CLEARKEY: | 151 case EXTERNAL_CLEARKEY: |
| 215 case CLEARKEY: | 152 case CLEARKEY: |
| 216 if (usePrefixedEME) | |
| 217 return PrefixedClearKeyPlayer; | |
| 218 return ClearKeyPlayer; | 153 return ClearKeyPlayer; |
| 219 case FILE_IO_TEST_KEYSYSTEM: | 154 case FILE_IO_TEST_KEYSYSTEM: |
| 220 return FileIOTestPlayer; | 155 return FileIOTestPlayer; |
| 221 default: | 156 default: |
| 222 Utils.timeLog(keySystem + ' is not a known key system'); | 157 Utils.timeLog(keySystem + ' is not a known key system'); |
| 223 if (usePrefixedEME) | |
| 224 return PrefixedClearKeyPlayer; | |
| 225 return ClearKeyPlayer; | 158 return ClearKeyPlayer; |
| 226 } | 159 } |
| 227 } | 160 } |
| 228 var Player = getPlayerType(testConfig.keySystem); | 161 var Player = getPlayerType(testConfig.keySystem); |
| 229 return new Player(video, testConfig); | 162 return new Player(video, testConfig); |
| 230 }; | 163 }; |
| OLD | NEW |