Playback of both PlayReady and Widevine protected streams works fine in isolation with the MSE/EME on 2022 webOS TVs, as does playing back Widevine protected streams first and PlayReady protected streams second.
However, playing back a PlayReady protected stream first and then trying to play back a Widevine protected stream second results in the video element throwing a MEDIA_ERR_DECODE
(with the message being PIPELINE_ERROR_DECODE
).
This behavior persists until the application is restarted, and we have observed it on 2 TVs of the same model (43UQ80009LB, SDK 7.2.0, Firmware 03.21.25). Interestingly, this issue doesn’t seem to affect highend models. We were for example not able to reproduce this issue on a OLED55CS6LA model (SDK 7.3.1, Firmware 03.33.65). We also tried updating the OS on one of our 43UQ80009LB models to 7.3.1, but that didn’t resolve the issue even though the same OS version doesn’t show the issue on the OLED55CS6LA model.
The issue can be reproduced with this testing page:
<!DOCTYPE html>
<html lang="en">
<head>
<title>PlayReady > Widevine Playback Issues</title>
<meta charset="UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://cdnjs.cloudflare.com/ajax/libs/shaka-player/4.5.0/shaka-player.compiled.js"></script>
<style>
#player {
width: 95%;
margin: 20px auto;
}
</style>
</head>
<body>
<div id="player">
<video muted autoplay controls style="width: 100%"></video>
</div>
<script type="text/javascript">
const widevineSource = 'https://bitmovin-a.akamaihd.net/content/art-of-motion_drm/m3u8s/widevine-hls.m3u8';
const playReadySource = 'https://bitmovin-a.akamaihd.net/content/sintel-pr-wv/sintel.mpd';
const video = document.querySelector('video');
const playreadyDrmServers = {
'com.microsoft.playready': 'https://test.playready.microsoft.com/service/rightsmanager.asmx?PlayRight=1&ContentKey=EAtsIJQPd5pFiRUrV9Layw==',
};
const widevineDrmServers = {
'com.widevine.alpha': 'https://cwip-shaka-proxy.appspot.com/no_auth',
};
let player;
function wait(seconds) {
return new Promise(resolve => setTimeout(resolve, seconds * 1000));
}
async function destroyPlayer() {
console.log('Destroying player...');
player.destroy();
await wait(5);
}
async function createPlayerAndLoadSource(sourceUrl, drmServers) {
player = new shaka.Player(video);
player.configure({ drm: { servers: drmServers } });
player.load(sourceUrl);
}
function onTimeupdate() {
console.log('TimeUpdate', video.currentTime);
}
function onError() {
console.error('VideoElement threw error', video.error.message)
}
video.addEventListener('timeupdate', onTimeupdate);
video.addEventListener('error', onError);
(async function() {
// Load the Widevine source first
console.info('Loading Widevine source...');
await createPlayerAndLoadSource(widevineSource, widevineDrmServers);
// let it play for 20 seconds
await wait(20);
await destroyPlayer();
// Load the PlayReady source second and let it play for a while
console.info('Loading PlayReady source...');
await createPlayerAndLoadSource(playReadySource, playreadyDrmServers);
await wait(20);
await destroyPlayer();
// attempt to load the Widevine source again and observe the video error
console.info('Loading Widevine source again...');
await createPlayerAndLoadSource(widevineSource, widevineDrmServers);
await wait(20);
// From now on, trying to play back a Widevine source will always throw
// a PIPELINE_ERROR_DECODE, even after reloading the page, but PlayReady
// will continue to work.
location.reload();
})();
</script>
</body>
</html>
Is this a known platform limitation/bug?