From 6e623bc4cce73917d5a04e552e1363b7075a6a8f Mon Sep 17 00:00:00 2001 From: matthuisman Date: Sun, 10 Nov 2024 21:14:07 +1300 Subject: [PATCH] parse default kid from init data if empty --- src/Session.cpp | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/Session.cpp b/src/Session.cpp index 0abe477da..2b313bf67 100644 --- a/src/Session.cpp +++ b/src/Session.cpp @@ -17,6 +17,7 @@ #include "common/Chooser.h" #include "decrypters/DrmFactory.h" #include "decrypters/Helpers.h" +#include "parser/PRProtectionParser.h" #include "utils/Base64Utils.h" #include "utils/CurlUtils.h" #include "utils/StringUtils.h" @@ -418,7 +419,7 @@ bool CSession::InitializeDRM(bool addDefaultKID /* = false */) if (sessionPsshset.adaptation_set_->GetStreamType() == StreamType::NOTYPE) continue; - const std::vector defaultKid = DRM::ConvertKidStrToBytes(sessionPsshset.defaultKID_); + std::string defaultKidStr = sessionPsshset.defaultKID_; std::string_view licenseDataStr = CSrvBroker::GetKodiProps().GetLicenseData(); if (m_adaptiveTree->GetTreeType() == adaptive::TreeType::SMOOTH_STREAMING) @@ -441,7 +442,7 @@ bool CSession::InitializeDRM(bool addDefaultKID /* = false */) licenseData.empty() ? "" : "(with custom data)"); std::vector wvPsshData; - if (DRM::MakeWidevinePsshData(defaultKid, licenseData, wvPsshData)) + if (DRM::MakeWidevinePsshData(DRM::ConvertKidStrToBytes(defaultKidStr), licenseData, wvPsshData)) DRM::MakePssh(DRM::ID_WIDEVINE, wvPsshData, initData); } } @@ -469,6 +470,17 @@ bool CSession::InitializeDRM(bool addDefaultKID /* = false */) initData = BASE64::Decode(licenseDataStr); } + // If no KID, but init data, extract the KID from init data + if (!initData.empty() && defaultKidStr.empty()) + { + CPsshParser parser; + if (parser.Parse(initData) && !parser.GetKeyIds().empty()) + { + LOG::Log(LOGDEBUG, "Default KID parsed from init data"); + defaultKidStr = STRING::ToHexadecimal(parser.GetKeyIds()[0]); + } + } + if (initData.empty() && sessionPsshset.m_licenseUrl.empty()) { if (!sessionPsshset.pssh_.empty()) @@ -485,6 +497,8 @@ bool CSession::InitializeDRM(bool addDefaultKID /* = false */) } } + const std::vector defaultKid = DRM::ConvertKidStrToBytes(defaultKidStr); + if (addDefaultKID && ses == 1 && session.m_cencSingleSampleDecrypter) { // If the CDM has been pre-initialized, on non-android systems