Skip to content

Commit 0f301f8

Browse files
UI/robustness settings (#4863)
* Added audio and video robustness settings to the Reference UI. * Added missing labels, merged development to update to most recent versionon * Added httpTimeout and server certificate options to the UI * Handle rejected server certificate --------- Co-authored-by: Daniel Silhavy <[email protected]>
1 parent b04b483 commit 0f301f8

File tree

6 files changed

+147
-20
lines changed

6 files changed

+147
-20
lines changed

samples/dash-if-reference-player/app/main.js

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -184,22 +184,34 @@ app.controller('DashController', ['$scope', '$window', 'sources', 'contributors'
184184
drmKeySystem: 'com.microsoft.playready',
185185
licenseServerUrl: '',
186186
httpRequestHeaders: {},
187-
priority: 1
187+
serverCertificate: '',
188+
httpTimeout: 5000,
189+
priority: 1,
190+
audioRobustness: '',
191+
videoRobustness: '',
192+
isCustomRobustness: false
188193
}
189194

190195
$scope.drmWidevine = {
191196
isActive: false,
192197
drmKeySystem: 'com.widevine.alpha',
193198
licenseServerUrl: '',
194199
httpRequestHeaders: {},
195-
priority: 0
200+
serverCertificate: '',
201+
httpTimeout: 5000,
202+
priority: 0,
203+
audioRobustness: '',
204+
videoRobustness: '',
205+
isCustomRobustness: false
196206
}
197207

198208
$scope.drmClearkey = {
199209
isActive: false,
200210
drmKeySystem: 'org.w3.clearkey',
201211
licenseServerUrl: '',
202212
httpRequestHeaders: {},
213+
serverCertificate: '',
214+
httpTimeout: 5000,
203215
kid: '',
204216
key: '',
205217
clearkeys: {},
@@ -1330,6 +1342,14 @@ app.controller('DashController', ['$scope', '$window', 'sources', 'contributors'
13301342
if (!angular.equals(input.httpRequestHeaders, {})) {
13311343
protectionData[input.drmKeySystem]['httpRequestHeaders'] = input.httpRequestHeaders;
13321344
}
1345+
1346+
if(input.audioRobustness){
1347+
protectionData[input.drmKeySystem]['audioRobustness'] = input.audioRobustness;
1348+
}
1349+
1350+
if(input.videoRobustness){
1351+
protectionData[input.drmKeySystem]['videoRobustness'] = input.videoRobustness;
1352+
}
13331353
} else {
13341354
alert('Kid and Key must be specified!');
13351355
}
@@ -1370,12 +1390,21 @@ app.controller('DashController', ['$scope', '$window', 'sources', 'contributors'
13701390
if (!angular.equals(input.httpRequestHeaders, {})) {
13711391
protectionData[input.drmKeySystem]['httpRequestHeaders'] = input.httpRequestHeaders;
13721392
}
1393+
1394+
if(input.audioRobustness){
1395+
protectionData[input.drmKeySystem]['audioRobustness'] = input.audioRobustness;
1396+
}
1397+
1398+
if(input.videoRobustness){
1399+
protectionData[input.drmKeySystem]['videoRobustness'] = input.videoRobustness;
1400+
}
13731401
}
13741402
}
13751403
}
13761404

13771405
$scope.protectionData = protectionData;
13781406
$scope.player.setProtectionData(protectionData);
1407+
console.log(protectionData);
13791408
}
13801409

13811410
$scope.addPopupInput = function (keySystem) {
@@ -1843,7 +1872,8 @@ app.controller('DashController', ['$scope', '$window', 'sources', 'contributors'
18431872
key !== 'priority' &&
18441873
key !== 'kid' &&
18451874
key !== 'key' &&
1846-
key !== 'inputMode') {
1875+
key !== 'inputMode' &&
1876+
key !== 'isCustomRobustness') {
18471877
queryProtectionData[drmObject[drm].drmKeySystem][key] = drmObject[drm][key];
18481878
}
18491879
}
@@ -1876,7 +1906,8 @@ app.controller('DashController', ['$scope', '$window', 'sources', 'contributors'
18761906
key !== 'drmKeySystem' &&
18771907
key !== 'licenseServerUrl' &&
18781908
key !== 'httpRequestHeaders' &&
1879-
key !== 'priority') {
1909+
key !== 'priority' &&
1910+
key !== 'isCustomRobustness') {
18801911
queryProtectionData[drmObject[drm].drmKeySystem][key] = drmObject[drm][key];
18811912
}
18821913
}

samples/dash-if-reference-player/index.html

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,41 @@
357357
Add Request-Headers
358358
</button>
359359

360+
<label class="options-label">Server Certificate</label>
361+
<input type="text" class="form-control" placeholder="" ng-model="drmPlayready.serverCertificate">
362+
363+
<label class="options-label">HTTP Timeout</label>
364+
<input type="text" class="form-control" placeholder="" ng-model="drmPlayready.httpTimeout">
365+
366+
<label class="topcoat-checkbox" data-toggle="tooltip" data-placement="right"
367+
title="">
368+
<input type="checkbox" ng-model="drmPlayready.isCustomRobustness">
369+
Use Custom Robustness
370+
</label>
371+
372+
<label class="options-label">Audio Robustness</label>
373+
<select name="playreadyAudioRobustness" id="playreadyAudioRobustness" ng-show="!drmPlayready.isCustomRobustness" ng-model="drmPlayready.audioRobustness"
374+
ng-init="drmPlayready.audioRobustness=''">
375+
<option value=""> Default</option>
376+
<option value="3000">SL3000</option>
377+
<option value="2000">SL2000</option>
378+
<option value="150"> SL150</option>
379+
</select>
380+
<!-- If custom, show textbox -->
381+
<input type="text" class="form-control" placeholder="" ng-show="drmPlayready.isCustomRobustness" ng-model="drmPlayready.audioRobustness">
382+
383+
<label class="options-label">Video Robustness</label>
384+
<select name="playreadyVideoRobustness" id="playreadyVideoRobustness" ng-show="!drmPlayready.isCustomRobustness" ng-model="drmPlayready.videoRobustness"
385+
ng-init="drmPlayready.videoRobustness=''">
386+
<option value=""> Default</option>
387+
<option value="3000">SL3000</option>
388+
<option value="2000">SL2000</option>
389+
<option value="150"> SL150</option>
390+
</select>
391+
392+
<!-- If custom, show textbox -->
393+
<input type="text" class="form-control" placeholder="" ng-show="drmPlayready.isCustomRobustness" ng-model="drmPlayready.videoRobustness">
394+
360395
<!-- Header Dialogue Window Content -->
361396
<div id="playreadyRequestHeaderDialogue" class="requestHeaderDialogue">
362397
<div class="requestHeaderDialogueContent">
@@ -421,6 +456,46 @@
421456
Add Request-Headers
422457
</button>
423458

459+
<label class="options-label">Server Certificate</label>
460+
<input type="text" class="form-control" placeholder="" ng-model="drmWidevine.serverCertificate">
461+
462+
<label class="options-label">HTTP Timeout</label>
463+
<input type="text" class="form-control" placeholder="" ng-model="drmWidevine.httpTimeout">
464+
465+
<label class="topcoat-checkbox" data-toggle="tooltip" data-placement="right"
466+
title="">
467+
<input type="checkbox" ng-model="drmWidevine.isCustomRobustness">
468+
Use Custom Robustness
469+
</label>
470+
471+
<label class="options-label">Audio Robustness</label>
472+
<select name="widevineAudioRobustness" id="widevineAudioRobustness" ng-show="!drmWidevine.isCustomRobustness" ng-model="drmWidevine.audioRobustness"
473+
ng-init="drmWidevine.audioRobustness=''">
474+
<option value=""> Default</option>
475+
<option value="SW_SECURE_CRYPTO">SW Secure Crypto</option>
476+
<option value="SW_SECURE_DECODE">SW Secure Decode</option>
477+
<option value="HW_SECURE_CRYPTO">HW Secure Crypto</option>
478+
<option value="HW_SECURE_DECODE">HW Secure Decode</option>
479+
<option value="HW_SECURE_ALL" >HW Secure All </option>
480+
</select>
481+
482+
<!-- If custom, show textbox -->
483+
<input type="text" class="form-control" placeholder="" ng-show="drmWidevine.isCustomRobustness" ng-model="drmWidevine.audioRobustness">
484+
485+
<label class="options-label">Video Robustness</label>
486+
<select name="widevineVideoRobustness" id="widevineVideoRobustness" ng-show="!drmWidevine.isCustomRobustness" ng-model="drmWidevine.videoRobustness"
487+
ng-init="drmWidevine.videoRobustness=''">
488+
<option value=""> Default</option>
489+
<option value="SW_SECURE_CRYPTO">SW Secure Crypto</option>
490+
<option value="SW_SECURE_DECODE">SW Secure Decode</option>
491+
<option value="HW_SECURE_CRYPTO">HW Secure Crypto</option>
492+
<option value="HW_SECURE_DECODE">HW Secure Decode</option>
493+
<option value="HW_SECURE_ALL" >HW Secure All </option>
494+
</select>
495+
496+
<!-- If custom, show textbox -->
497+
<input type="text" class="form-control" placeholder="" ng-show="drmWidevine.isCustomRobustness" ng-model="drmWidevine.videoRobustness">
498+
424499
<!-- Header Dialogue Window Content -->
425500
<div id="widevineRequestHeaderDialogue" class="requestHeaderDialogue">
426501
<div class="requestHeaderDialogueContent">
@@ -494,6 +569,12 @@
494569
Add additional clearkeys
495570
</button>
496571

572+
<label class="options-label">Server Certificate</label>
573+
<input type="text" class="form-control" placeholder="" ng-model="drmClearkey.serverCertificate">
574+
575+
<label class="options-label">HTTP Timeout</label>
576+
<input type="text" class="form-control" placeholder="" ng-model="drmClearkey.httpTimeout">
577+
497578
<!-- KID=KEY Dialogue Window Content -->
498579
<div id="additionalClearkeysDialogue" class="requestHeaderDialogue">
499580
<div class="requestHeaderDialogueContent">

src/streaming/protection/controllers/ProtectionController.js

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -227,18 +227,22 @@ function ProtectionController(config) {
227227
}
228228

229229
function _onMediaKeysCreated(keySystem, keySystemAccess) {
230-
selectedKeySystem = keySystem;
231-
keySystemSelectionInProgress = false;
230+
try {
231+
selectedKeySystem = keySystem;
232+
keySystemSelectionInProgress = false;
232233

233-
eventBus.trigger(events.KEY_SYSTEM_SELECTED, { data: keySystemAccess });
234+
eventBus.trigger(events.KEY_SYSTEM_SELECTED, { data: keySystemAccess });
234235

235-
// Set server certificate from protData
236-
const protData = _getProtDataForKeySystem(selectedKeySystem);
237-
if (protData && protData.serverCertificate && protData.serverCertificate.length > 0) {
238-
protectionModel.setServerCertificate(BASE64.decodeArray(protData.serverCertificate).buffer);
239-
}
236+
// Set server certificate from protData
237+
const protData = _getProtDataForKeySystem(selectedKeySystem);
238+
if (protData && protData.serverCertificate && protData.serverCertificate.length > 0) {
239+
protectionModel.setServerCertificate(BASE64.decodeArray(protData.serverCertificate).buffer);
240+
}
240241

241-
_handlePendingMediaTypes();
242+
_handlePendingMediaTypes();
243+
} catch (e) {
244+
logger.error(e);
245+
}
242246
}
243247

244248
/**
@@ -421,18 +425,26 @@ function ProtectionController(config) {
421425
* @private
422426
*/
423427
function _enforceMediaKeySessionLimit() {
424-
if (!settings) { return; }
428+
if (!settings) {
429+
return;
430+
}
425431
const isKeepProtectionMediaKeysEnabled = settings.get().streaming.protection.keepProtectionMediaKeys;
426432
const maxSessions = settings.get().streaming.protection.keepProtectionMediaKeysMaximumOpenSessions;
427-
if (typeof maxSessions !== 'number' || maxSessions <= 0) { return; }
433+
if (typeof maxSessions !== 'number' || maxSessions <= 0) {
434+
return;
435+
}
428436
if (!isKeepProtectionMediaKeysEnabled) {
429437
logger.warn('DRM: keepProtectionMediaKeysMaximumOpenSessions is set to ' + maxSessions + ', but keepProtectionMediaKeys is not enabled. Therefore, keepProtectionMediaKeysMaximumOpenSessions will be ignored.');
430438
return;
431439
}
432440
// Ensure protectionModel is available before accessing sessions
433-
if (!protectionModel || typeof protectionModel.getSessionTokens !== 'function') { return; }
441+
if (!protectionModel || typeof protectionModel.getSessionTokens !== 'function') {
442+
return;
443+
}
434444
const sessionTokens = protectionModel.getSessionTokens() || [];
435-
if (sessionTokens.length < maxSessions) { return; }
445+
if (sessionTokens.length < maxSessions) {
446+
return;
447+
}
436448
// Limit reached. Close the oldest session to make room for a new one.
437449
const oldestSession = sessionTokens[0];
438450
if (oldestSession) {
@@ -579,11 +591,12 @@ function ProtectionController(config) {
579591
* certificate
580592
* @memberof module:ProtectionController
581593
* @instance
594+
* @return {Promise}
582595
* @fires ProtectionController#ServerCertificateUpdated
583596
*/
584597
function setServerCertificate(serverCertificate) {
585598
_checkConfig();
586-
protectionModel.setServerCertificate(serverCertificate);
599+
return protectionModel.setServerCertificate(serverCertificate);
587600
}
588601

589602
/**

src/streaming/protection/models/DefaultProtectionModel.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -283,16 +283,16 @@ function DefaultProtectionModel(config) {
283283
}
284284

285285
function setServerCertificate(serverCertificate) {
286-
return new Promise((resolve, reject) => {
286+
return new Promise((resolve) => {
287287
mediaKeys.setServerCertificate(serverCertificate)
288288
.then(function () {
289289
logger.info('DRM: License server certificate successfully updated.');
290290
eventBus.trigger(events.SERVER_CERTIFICATE_UPDATED);
291291
resolve();
292292
})
293293
.catch((error) => {
294-
reject(error);
295294
eventBus.trigger(events.SERVER_CERTIFICATE_UPDATED, { error: new DashJSError(ProtectionErrors.SERVER_CERTIFICATE_UPDATED_ERROR_CODE, ProtectionErrors.SERVER_CERTIFICATE_UPDATED_ERROR_MESSAGE + error.name) });
295+
resolve()
296296
});
297297
})
298298
}

src/streaming/protection/models/ProtectionModel_01b.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,7 @@ function ProtectionModel_01b(config) {
296296
}
297297

298298
function setServerCertificate(/*serverCertificate*/) { /* Not supported */
299+
return Promise.resolve();
299300
}
300301

301302
function loadKeySession(/*ksInfo*/) { /* Not supported */

src/streaming/protection/models/ProtectionModel_3Feb2014.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,7 @@ function ProtectionModel_3Feb2014(config) {
284284
}
285285

286286
function setServerCertificate(/*serverCertificate*/) { /* Not supported */
287+
return Promise.resolve();
287288
}
288289

289290
function loadKeySession(/*ksInfo*/) { /* Not supported */

0 commit comments

Comments
 (0)