-
Notifications
You must be signed in to change notification settings - Fork 2.7k
Parse keyid from multi-key widevine PSSH #7415
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
Parse keyid from multi-key widevine PSSH #7415
Conversation
src/loader/level-key.ts
Outdated
| if (!this.keyId && keyBytes) { | ||
| const results = parseMultiPssh(keyBytes.buffer); | ||
| if (results[0] && 'version' in results[0]) { | ||
| const psshData = results[0]; | ||
| if (psshData?.kids?.[0]) { | ||
| this.keyId = psshData.kids[0]; | ||
| } | ||
| } | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
- Remove unnecessary conditionals (no need to check
keyBytesandresults[0]orpsshData?multiple times) keyIdstill needs to be set ifkidswere not parsed
| if (!this.keyId && keyBytes) { | |
| const results = parseMultiPssh(keyBytes.buffer); | |
| if (results[0] && 'version' in results[0]) { | |
| const psshData = results[0]; | |
| if (psshData?.kids?.[0]) { | |
| this.keyId = psshData.kids[0]; | |
| } | |
| } | |
| } | |
| if (!this.keyId) { | |
| const results = parseMultiPssh(keyBytes.buffer); | |
| const psshData = results[0]; | |
| if (psshData && 'version' in psshData && psshData.kids?.[0]) { | |
| this.keyId = psshData.kids[0]; | |
| } else { | |
| const offset = keyBytes.length - 22; | |
| this.keyId = keyBytes.subarray(offset, offset + 16); | |
| } | |
| } |
- I considered making a similar change (use
parseMultiPssh) in Fix Widevine KEYID parsing #7380, but I couldn't find examples of version 1 pssh withkidscontaining a key. In every example, the KEYID was in the playlist, so that clients don't need a protobuf parser. Most content available to me has version 0 wv pssh.
Do you have content where this fix is necessary?
Fixing the key id parsing from the pssh would require at least some protobuf parsing. That isn't something we should do when standard practice is to include the KEYID attribute. We can still take this fix, if you need it.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Because I still use v1.5.x, I added this modification. Parsing the value from KEYID tag in playlist first for v1.6.7, the problem will not occur. But the logic of parsing keyId from URI is still inaccurate. If the version of PSSH is 0, KEYID does not exist. The keyid obtained by offsetting 6 bytes is incorrect.
Because the license request requires a dynamic token, I cannot create a test stream with PSSH version 1 now. But I have a simple example for playlist. The version of PSSH is 1 and the length of DataSize and Data is 5.
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:292092204
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-MAP:URI="ibOQs5Rcy/init_video_1100.m4s"
#EXT-X-PROGRAM-DATE-TIME:2025-07-15T04:20:26.012Z
#EXT-X-KEY:METHOD=SAMPLE-AES,URI="skd://AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1",KEYFORMAT="com.apple.streamingkeydelivery",KEYFORMATVERSIONS="1"
#EXT-X-KEY:METHOD=SAMPLE-AES-CTR,URI="data:text/plain;base64,AAAASHBzc2gBAAAA7e+LqXnWSs6jyCfc1R0h7QAAAAGqqqqqqqqqqqqqqqqqqqqhAAAAFAgBEhCqqqqqqqqqqqqqqqqqqqqh",KEYID=0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1,KEYFORMAT="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed",KEYFORMATVERSIONS="1"
#EXT-X-KEY:METHOD=SAMPLE-AES-CTR,KEYFORMAT="com.microsoft.playready",KEYFORMATVERSIONS="1",URI="data:text/plain;charset=UTF-16;base64,WAIAAAEAAQBOAjwAVwBSAE0ASABFAEEARABFAFIAIAB4AG0AbABuAHMAPQAiAGgAdAB0AHAAOgAvAC8AcwBjAGgAZQBtAGEAcwAuAG0AaQBjAHIAbwBzAG8AZgB0AC4AYwBvAG0ALwBEAFIATQAvADIAMAAwADcALwAwADMALwBQAGwAYQB5AFIAZQBhAGQAeQBIAGUAYQBkAGUAcgAiACAAdgBlAHIAcwBpAG8AbgA9ACIANAAuADAALgAwAC4AMAAiAD4APABEAEEAVABBAD4APABQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsARQBZAEwARQBOAD4AMQA2ADwALwBLAEUAWQBMAEUATgA+ADwAQQBMAEcASQBEAD4AQQBFAFMAQwBUAFIAPAAvAEEATABHAEkARAA+ADwALwBQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsASQBEAD4AcQBxAHEAcQBxAHEAcQBxAHEAcQBxAHEAcQBxAHEAcQBxAHEAcQBxAG8AUQA9AD0APAAvAEsASQBEAD4APABMAEEAXwBVAFIATAA+AGgAdAB0AHAAOgAvAC8AcABsAGEAeQByAGUAYQBkAHkALgBkAGkAcgBlAGMAdAB0AGEAcABzAC4AbgBlAHQALwBwAHIALwBzAHYAYwAvAHIAaQBnAGgAdABzAG0AYQBuAGEAZwBlAHIALgBhAHMAbQB4ADwALwBMAEEAXwBVAFIATAA+ADwALwBEAEEAVABBAD4APAAvAFcAUgBNAEgARQBBAEQARQBSAD4A"
#EXTINF:6.000000,
ibOQs5Rcy/media_video_1100-292092204.m4s
#EXTINF:6.000000,
ibOQs5Rcy/media_video_1100-292092205.m4s
#EXTINF:6.000000,
ibOQs5Rcy/media_video_1100-292092206.m4s
#EXTINF:6.000000,
ibOQs5Rcy/media_video_1100-292092207.m4s
#EXTINF:6.000000,
ibOQs5Rcy/media_video_1100-292092208.m4s
#EXTINF:6.000000,
ibOQs5Rcy/media_video_1100-292092209.m4s
#EXTINF:6.000000,
ibOQs5Rcy/media_video_1100-292092210.m4s
#EXTINF:6.000000,
ibOQs5Rcy/media_video_1100-292092211.m4s
#EXTINF:6.000000,
ibOQs5Rcy/media_video_1100-292092212.m4s
#EXTINF:6.000000,
ibOQs5Rcy/media_video_1100-292092213.m4s
#EXTINF:6.000000,
ibOQs5Rcy/media_video_1100-292092214.m4s
#EXTINF:6.000000,
ibOQs5Rcy/media_video_1100-292092215.m4s
#EXTINF:2.000000,
ibOQs5Rcy/media_video_1100-292092216.m4s
#EXT-X-ENDLIST
(cherry picked from commit 3fd4bf3)
This PR will...
Parse keyId for widevine. PSSH box defines as follows:
The length of the DataSize and Data fields is not always 6. For widevine, it is defined in WidevineCencHeader.proto
Why is this Pull Request needed?
Parse KeyId for widevine correctly
Checklist