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

HEVC + Widevine causing issues in recent desktop Chrome browser versions #175

Open
BucherTomas opened this issue Sep 29, 2022 · 2 comments

Comments

@BucherTomas
Copy link

Chrome has recently introduced support for HEVC codec via MSE in Windows and Mac desktop builds as long as underlying OS / GPU can decode it. Can be seen since Chrome 104 when querying chrome://gpu (some reports claim 107 as the stable version where it will be enabled for everybody) . If it states "Decode hevc main" in its "Video Acceleration Information" section, standard HEVC should be usable on that system. But only in its clear form or allegedly with clearkey encryption, Widevine DRM is not supported yet as can be seen in the CDMs tab of chrome://media-internals. And here is the issue...

This test stream is CENC-encrypted with Widevine and PlayReady having both HEVC and vp9 codecs for its UHD video track.

https://videojs-http-streaming.netlify.app/?debug=true&autoplay=false&muted=false&fluid=false&minified=false&sync-workers=false&liveui=true&llhls=false&url=https%3A%2F%2F1798253129.ssl.cdn.cra.cz%2FUHD%2Ffull%2Fuhddrm.ism%2F.mpd%3Ffilter%3D!(FourCC%3D%3D%2522AVC1%2522)&type=application%2Fdash%2Bxml&keysystems=%7B%0A%20%20%22com.widevine.alpha%22%3A%20%7B%0A%20%20%20%20%22url%22%3A%20%22https%3A%2F%2Fdrm-widevine-licensing.axtest.net%2FAcquireLicense%3Faxdrmmessage%3DeyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjb21fa2V5X2lkIjoiNjVGM0JCNjItQUUwMS00MThGLUFCNkUtRTlBNTgwOUU3MEIxIiwibWVzc2FnZSI6eyJjb250ZW50X2tleV91c2FnZV9wb2xpY2llcyI6W3sibmFtZSI6InVoZHNlYyIsInBsYXlyZWFkeSI6eyJtaW5fZGV2aWNlX3NlY3VyaXR5X2xldmVsIjoyMDAwLCJkaWdpdGFsX3ZpZGVvX291dHB1dF9wcm90ZWN0aW9ucyI6W3siY29uZmlnX2RhdGEiOiJBQUFBQVE9PSIsImlkIjoiQUJCMkM2RjEtRTY2My00NjI1LUE5NDUtOTcyRDE3QjIzMUU3In1dLCJhbmFsb2dfdmlkZW9fb3V0cHV0X3Byb3RlY3Rpb25zIjpbeyJjb25maWdfZGF0YSI6IkFBQUFBUT09IiwiaWQiOiI3NjBBRTc1NS02ODJBLTQxRTAtQjFCMy1EQ0RGODM2QTczMDYifV0sImFuYWxvZ192aWRlb19vcGwiOjIwMSwiY29tcHJlc3NlZF9kaWdpdGFsX3ZpZGVvX29wbCI6NTAwLCJ1bmNvbXByZXNzZWRfZGlnaXRhbF92aWRlb19vcGwiOjMwMH0sIndpZGV2aW5lIjp7ImRldmljZV9zZWN1cml0eV9sZXZlbCI6IlNXX1NFQ1VSRV9ERUNPREUifX0seyJwbGF5cmVhZHkiOnsibWluX2RldmljZV9zZWN1cml0eV9sZXZlbCI6MjAwMH0sIm5hbWUiOiJhdWRpbyIsIndpZGV2aW5lIjp7ImRldmljZV9zZWN1cml0eV9sZXZlbCI6IlNXX1NFQ1VSRV9DUllQVE8ifX1dLCJ2ZXJzaW9uIjoyLCJ0eXBlIjoiZW50aXRsZW1lbnRfbWVzc2FnZSIsImNvbnRlbnRfa2V5c19zb3VyY2UiOnsiaW5saW5lIjpbeyJ1c2FnZV9wb2xpY3kiOiJ1aGRzZWMiLCJpZCI6IjY4YjA2NTI4LTdlNDQtNDY1OS04ZTU4LWE3MjBmNTNiOTQ4NSIsIml2IjoiUTZHU2JkNS9UT2FJaWVhYm1XQkY1Zz09In0seyJ1c2FnZV9wb2xpY3kiOiJhdWRpbyIsImlkIjoiZmYxNGZjOWMtYjhjNy02MDY3LWNkNGMtYWNmMjk0MzY1ODVhIiwiaXYiOiJta1EwNmxDRXRuOWJFS2Erc0lKTFBnPT0ifV19LCJsaWNlbnNlIjp7ImR1cmF0aW9uIjo2MDQ4MDAsIndpZGV2aW5lIjp7ImluY2x1ZGVfYWxsX2VudGl0bGVkX2tleXMiOnRydWV9fX0sInZlcnNpb24iOjF9.O26-g9klPaN1pPl0GPnxGMiLLiPgL2Q789zsSYYpAAk%22%0A%20%20%7D%0A%7D&buffer-water=false&exact-manifest-timings=false&pixel-diff-selector=false&network-info=false&dts-offset=false&override-native=true&preload=auto&mirror-source=true

Previously HEVC in mpeg-dash was filtered out on desktop Chrome and everything was working fine with vp9. It still is in Firefox and Opera because those do not support HEVC yet the way Chrome does, Edge can support HEVC but it requires a system plugin. HEVC is now considered usable by the player on Chrome even with Widevine DRM and it breaks playback on videojs/http streaming/contrib-eme based players.

I am posting this in a contrib-eme thread because as I see it, the navigator.requestMediaKeySystemAccess() method checks only for videoCapabilities of vp9 codec but not HEVC codec. Since this promise is fulfilled, playback starts and it can be then seen in browser's network log and player's debug log that the player later adapts to segments of HEVC encoded content even though it first started with vp9 encoded segments because they have slightly lower bitrate. This obviously stalls the playback as HEVC segments cannot be decrypted.

This switching between codecs is not exactly part of the problem (even though the dash manifest does not include <SupplementalProperty schemeIdUri="urn:mpeg:dash:adaptation-set-switching:2016" value="***" /> to enable codec switching between adaptation sets). The browser did after all respond to codec query that it can support HEVC. The problem is that only navigator.requestMediaKeySystemAccess() called for all included codecs in a stream (which is not happening at the beginning) would reveal that DRM is unusable for one of them and the player then should filter it out, hence why I am sharing the findings here.

What is your opinion, please?

@gkatsev
Copy link
Member

gkatsev commented Oct 7, 2022

Yeah, this library should either hardcode a case for this (a quickfix) but otherwise, I think it'll need brushing off #98 and completing it. Currently, there's a lot of assumptions and there isn't really capability detection done which is what #98 provides.

@BucherTomas
Copy link
Author

@gkatsev Thank you. Is there a reasonable expectation that it could be done soon-ish?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants