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 |