Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve EME Controller: Add PlayReady support #1918

Closed
wants to merge 25 commits into from
Closed
Changes from 1 commit
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
4fb5fdb
add support for pssh in manifest
ssreed Sep 13, 2018
b1e50f8
move util function into it's own file
ssreed Sep 13, 2018
3b423f5
add docs, clean up names
ssreed Sep 13, 2018
5d2a4ac
add unit tests
ssreed Sep 13, 2018
fef1409
add support for multi-drm manifests
ssreed Sep 15, 2018
6713568
add docs
ssreed Sep 15, 2018
294d8af
add playready support
ssreed Sep 15, 2018
8236809
clean up
ssreed Sep 15, 2018
d77f6d0
move playready header logic to separate function
ssreed Sep 17, 2018
d04049e
update playready challenge logic
ssreed Sep 17, 2018
685e6df
fix: use for loop instead of forEach
ssreed Sep 17, 2018
7c670cc
move playready header logic to separate file
ssreed Sep 19, 2018
0401518
fix typo
ssreed Sep 19, 2018
00025d1
don't initialize emeController if eme isn't enabled
ssreed Sep 20, 2018
09d9660
simplify playready headers
ssreed Oct 26, 2018
a9d9e8f
clarify and update function name to more accurately reflect returned …
ssreed Nov 9, 2018
1c9021f
Merge branch 'master' of https://github.com/video-dev/hls.js into add…
ssreed Nov 9, 2018
56a357f
optimize and improve readability of capturing initData
ssreed Nov 10, 2018
ca9bcc3
fix unit test
ssreed Nov 10, 2018
49e22ca
remove unnecessary code
ssreed Nov 10, 2018
897257d
add documentation, add initDataTypes enum
ssreed Nov 13, 2018
177b1e7
fix functional test
ssreed Nov 13, 2018
61494eb
add key rotation support
Jan 23, 2019
32215cc
Merge branch 'master' into add-playready
ssreed Jan 28, 2019
e840bfb
fix unit test
ssreed Jan 28, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 25 additions & 13 deletions src/controller/eme-controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -415,7 +415,7 @@ class EMEController extends EventHandler {
* @param {ArrayBuffer} keyMessage
* @returns {ArrayBuffer} Challenge data posted to license server
*/
_generateLicenseRequestChallenge (keysListItem, keyMessage, xhr) {
_generateLicenseRequestChallenge (keysListItem, keyMessage) {
let challenge;

if (keysListItem.mediaKeySystemDomain === KeySystems.PLAYREADY) {
Expand All @@ -428,17 +428,6 @@ class EMEController extends EventHandler {
} else {
throw Error('Cannot find <Challenge> in key message');
}

const headerNames = keyMessageXml.getElementsByTagName('name');
const headerValues = keyMessageXml.getElementsByTagName('value');

if (headerNames.length !== headerValues.length) {
throw Error('Mismatched header <name>/<value> pair in key message');
}

for (let i = 0; i < headerNames.length; i++) {
xhr.setRequestHeader(headerNames[i].childNodes[0].nodeValue, headerValues[i].childNodes[0].nodeValue);
}
} else if (keysListItem.mediaKeySystemDomain === KeySystems.WIDEVINE) {
// For Widevine CDMs, the challenge is the keyMessage.
challenge = keyMessage;
Expand All @@ -449,6 +438,24 @@ class EMEController extends EventHandler {
return challenge;
}

/**
* @param {ArrayBuffer} keyMessage
* @param {XMLHttpRequest} xhr
*/
_setPlayreadyHeaders (keyMessage, xhr) {
ssreed marked this conversation as resolved.
Show resolved Hide resolved
const keyMessageXml = new DOMParser().parseFromString(String.fromCharCode.apply(null, new Uint16Array(keyMessage)), 'application/xml');
ssreed marked this conversation as resolved.
Show resolved Hide resolved
const headerNames = keyMessageXml.getElementsByTagName('name');
const headerValues = keyMessageXml.getElementsByTagName('value');

if (headerNames.length !== headerValues.length) {
throw Error('Mismatched header <name>/<value> pair in key message');
}

for (let i = 0; i < headerNames.length; i++) {
xhr.setRequestHeader(headerNames[i].childNodes[0].nodeValue, headerValues[i].childNodes[0].nodeValue);
}
}

_requestLicense (keyMessage, callback) {
logger.log('Requesting content license for key-system');

Expand All @@ -465,10 +472,15 @@ class EMEController extends EventHandler {

const url = this.getLicenseServerUrl(keysListItem.mediaKeySystemDomain);
const xhr = this._createLicenseXhr(url, keyMessage, callback);
const challenge = this._generateLicenseRequestChallenge(keysListItem, keyMessage);

if (keysListItem.mediaKeySystemDomain === KeySystems.PLAYREADY) {
this._setPlayreadyHeaders(keyMessage, xhr);
}

logger.log(`Sending license request to URL: ${url}`);

xhr.send(this._generateLicenseRequestChallenge(keysListItem, keyMessage, xhr));
xhr.send(challenge);
}

onMediaAttached (data) {
Expand Down