Skip to content

Commit 6e623bc

Browse files
committed
parse default kid from init data if empty
1 parent 96e7ac1 commit 6e623bc

File tree

1 file changed

+16
-2
lines changed

1 file changed

+16
-2
lines changed

src/Session.cpp

+16-2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include "common/Chooser.h"
1818
#include "decrypters/DrmFactory.h"
1919
#include "decrypters/Helpers.h"
20+
#include "parser/PRProtectionParser.h"
2021
#include "utils/Base64Utils.h"
2122
#include "utils/CurlUtils.h"
2223
#include "utils/StringUtils.h"
@@ -418,7 +419,7 @@ bool CSession::InitializeDRM(bool addDefaultKID /* = false */)
418419
if (sessionPsshset.adaptation_set_->GetStreamType() == StreamType::NOTYPE)
419420
continue;
420421

421-
const std::vector<uint8_t> defaultKid = DRM::ConvertKidStrToBytes(sessionPsshset.defaultKID_);
422+
std::string defaultKidStr = sessionPsshset.defaultKID_;
422423
std::string_view licenseDataStr = CSrvBroker::GetKodiProps().GetLicenseData();
423424

424425
if (m_adaptiveTree->GetTreeType() == adaptive::TreeType::SMOOTH_STREAMING)
@@ -441,7 +442,7 @@ bool CSession::InitializeDRM(bool addDefaultKID /* = false */)
441442
licenseData.empty() ? "" : "(with custom data)");
442443

443444
std::vector<uint8_t> wvPsshData;
444-
if (DRM::MakeWidevinePsshData(defaultKid, licenseData, wvPsshData))
445+
if (DRM::MakeWidevinePsshData(DRM::ConvertKidStrToBytes(defaultKidStr), licenseData, wvPsshData))
445446
DRM::MakePssh(DRM::ID_WIDEVINE, wvPsshData, initData);
446447
}
447448
}
@@ -469,6 +470,17 @@ bool CSession::InitializeDRM(bool addDefaultKID /* = false */)
469470
initData = BASE64::Decode(licenseDataStr);
470471
}
471472

473+
// If no KID, but init data, extract the KID from init data
474+
if (!initData.empty() && defaultKidStr.empty())
475+
{
476+
CPsshParser parser;
477+
if (parser.Parse(initData) && !parser.GetKeyIds().empty())
478+
{
479+
LOG::Log(LOGDEBUG, "Default KID parsed from init data");
480+
defaultKidStr = STRING::ToHexadecimal(parser.GetKeyIds()[0]);
481+
}
482+
}
483+
472484
if (initData.empty() && sessionPsshset.m_licenseUrl.empty())
473485
{
474486
if (!sessionPsshset.pssh_.empty())
@@ -485,6 +497,8 @@ bool CSession::InitializeDRM(bool addDefaultKID /* = false */)
485497
}
486498
}
487499

500+
const std::vector<uint8_t> defaultKid = DRM::ConvertKidStrToBytes(defaultKidStr);
501+
488502
if (addDefaultKID && ses == 1 && session.m_cencSingleSampleDecrypter)
489503
{
490504
// If the CDM has been pre-initialized, on non-android systems

0 commit comments

Comments
 (0)