Skip to content

Commit e41c977

Browse files
committed
wip
1 parent 6c3722e commit e41c977

4 files changed

Lines changed: 102 additions & 3 deletions

File tree

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
ed8439238a7f2ff53293761abb48844fab51ff66f868d759face8b51523f45bc
1+
b6a7eb847c473a7329679fe8c50ac91485497d36e3b7f755b47853340766864a
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
libandroidjni https://github.com/CastagnaIT/libandroidjni/archive/59b68509c1d175db2610afeb2daedcdb5e1a77a4.tar.gz
1+
libandroidjni https://github.com/CastagnaIT/libandroidjni/archive/refs/heads/mediadrm_keys.tar.gz

src/decrypters/widevineandroid/WVCdmAdapter.cpp

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include "WVDecrypter.h"
1212
#include "decrypters/HelperWv.h"
1313
#include "decrypters/Helpers.h"
14+
#include "utils/StringUtils.h"
1415
#include "utils/FileUtils.h"
1516
#include "utils/log.h"
1617

@@ -36,6 +37,24 @@ void CMediaDrmOnEventListener::onEvent(const CJNIMediaDrm& mediaDrm,
3637
m_decrypterEventCallback->OnMediaDrmEvent(mediaDrm, sessionId, event, extra, data);
3738
}
3839

40+
CMediaDrmOnKeyStatusChangeListener::CMediaDrmOnKeyStatusChangeListener(
41+
CMediaDrmOnKeyStatusChangeCallback* decrypterOnKeyStatusChangeCallback,
42+
std::shared_ptr<CJNIClassLoader> classLoader)
43+
: CJNIMediaDrmOnKeyStatusChangeListener(*classLoader)
44+
{
45+
m_decrypterOnKeyStatusChangeCallback = decrypterOnKeyStatusChangeCallback;
46+
}
47+
48+
void CMediaDrmOnKeyStatusChangeListener::onKeyStatusChange(
49+
const CJNIMediaDrm& mediaDrm,
50+
const std::vector<char>& sessionId,
51+
const CJNIList<CJNIMediaDrmKeyStatus>& keyInformation,
52+
bool hasNewUsableKey)
53+
{
54+
m_decrypterOnKeyStatusChangeCallback->OnKeyStatusChange(mediaDrm, sessionId, keyInformation,
55+
hasNewUsableKey);
56+
}
57+
3958
CWVCdmAdapterA::CWVCdmAdapterA(std::string_view keySystem,
4059
const DRM::Config& config,
4160
std::shared_ptr<CJNIClassLoader> jniClassLoader,
@@ -80,14 +99,28 @@ CWVCdmAdapterA::CWVCdmAdapterA(std::string_view keySystem,
8099

81100
// Create media drm EventListener (unique_ptr explanation on class comment)
82101
m_mediaDrmEventListener = std::make_unique<CMediaDrmOnEventListener>(this, jniClassLoader);
83-
m_cdmAdapter->setOnEventListener(*m_mediaDrmEventListener.get());
84102
if (xbmc_jnienv()->ExceptionCheck())
85103
{
86104
LOG::LogF(LOGERROR, "Exception during installation of EventListener");
87105
xbmc_jnienv()->ExceptionClear();
88106
m_cdmAdapter->release();
89107
return;
90108
}
109+
m_cdmAdapter->setOnEventListener(*m_mediaDrmEventListener.get());
110+
111+
// Create media drm OnKeyStatusChangeListener (unique_ptr explanation on class comment)
112+
m_mediaDrmOnKeyChangeListener =
113+
std::make_unique<CMediaDrmOnKeyStatusChangeListener>(this, jniClassLoader);
114+
if (xbmc_jnienv()->ExceptionCheck())
115+
{
116+
LOG::LogF(LOGERROR, "Exception during installation of OnKeyStatusChangeListener");
117+
xbmc_jnienv()->ExceptionClear();
118+
m_cdmAdapter->release();
119+
return;
120+
}
121+
CJNIMediaDrmKeyStatus::PopulateStaticFields(); // should be done by CJNIContext but currently not implemented for add-ons case
122+
m_cdmAdapter->setOnKeyStatusChangeListener(*m_mediaDrmOnKeyChangeListener.get());
123+
91124

92125
std::vector<uint8_t> strDeviceId = m_cdmAdapter->getPropertyByteArray("deviceUniqueId");
93126
xbmc_jnienv()->ExceptionClear();
@@ -199,6 +232,29 @@ void CWVCdmAdapterA::OnMediaDrmEvent(const CJNIMediaDrm& mediaDrm,
199232
NotifyObservers(cdmMsg);
200233
}
201234

235+
void CWVCdmAdapterA::OnKeyStatusChange(const CJNIMediaDrm& mediaDrm,
236+
const std::vector<char>& sessionId,
237+
const CJNIList<CJNIMediaDrmKeyStatus>& keyInformation,
238+
bool hasNewUsableKey)
239+
{
240+
LOG::LogF(LOGDEBUG, "MediaDrm OnKeyStatusChange event: SID %s", sessionId.data());
241+
242+
if (keyInformation.size() == 0)
243+
{
244+
LOG::LogF(LOGWARNING, "MediaDrm OnKeyStatusChange: NO KEYS");
245+
return;
246+
}
247+
248+
for (int i = 0; i < keyInformation.size(); ++i)
249+
{
250+
const std::vector<uint8_t> kid = keyInformation.get(i).getKeyId();
251+
const int statusCode = keyInformation.get(i).getStatusCode();
252+
253+
LOG::LogF(LOGWARNING, "MediaDrm OnKeyStatusChange: KID %s, status code: %i",
254+
STRING::ToHexadecimal(kid).c_str(), statusCode);
255+
}
256+
}
257+
202258
void CWVCdmAdapterA::SaveServiceCertificate()
203259
{
204260
const std::vector<uint8_t> sc = m_cdmAdapter->getPropertyByteArray("serviceCertificate");

src/decrypters/widevineandroid/WVCdmAdapter.h

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include <androidjni/ClassLoader.h>
1515
#include <androidjni/MediaDrm.h>
1616
#include <androidjni/MediaDrmOnEventListener.h>
17+
#include <androidjni/MediaDrmOnKeyStatusChangeListener.h>
1718

1819
#ifdef INPUTSTREAM_TEST_BUILD
1920
#include "test/KodiStubs.h"
@@ -62,7 +63,42 @@ class CMediaDrmOnEventListener : public CJNIMediaDrmOnEventListener
6263
CMediaDrmOnEventCallback* m_decrypterEventCallback;
6364
};
6465

66+
class CMediaDrmOnKeyStatusChangeCallback
67+
{
68+
public:
69+
CMediaDrmOnKeyStatusChangeCallback() = default;
70+
virtual ~CMediaDrmOnKeyStatusChangeCallback() = default;
71+
72+
virtual void OnKeyStatusChange(const CJNIMediaDrm& mediaDrm,
73+
const std::vector<char>& sessionId,
74+
const CJNIList<CJNIMediaDrmKeyStatus>& keyInformation,
75+
bool hasNewUsableKey) = 0;
76+
};
77+
78+
/*!
79+
* \brief This class is derived from CJNIMediaDrmOnKeyStatusChangeListener to allow us
80+
* to initialize the base class at later time, since the constructors
81+
* of CJNIMediaDrmOnKeyStatusChangeListener need to access to the global
82+
* xbmc_jnienv method immediately.
83+
*/
84+
class CMediaDrmOnKeyStatusChangeListener : public CJNIMediaDrmOnKeyStatusChangeListener
85+
{
86+
public:
87+
CMediaDrmOnKeyStatusChangeListener(CMediaDrmOnKeyStatusChangeCallback* decrypterEventCallback,
88+
std::shared_ptr<CJNIClassLoader> classLoader);
89+
virtual ~CMediaDrmOnKeyStatusChangeListener() = default;
90+
91+
virtual void onKeyStatusChange(const CJNIMediaDrm& mediaDrm,
92+
const std::vector<char>& sessionId,
93+
const CJNIList<CJNIMediaDrmKeyStatus>& keyInformation,
94+
bool hasNewUsableKey) override;
95+
96+
private:
97+
CMediaDrmOnKeyStatusChangeCallback* m_decrypterOnKeyStatusChangeCallback;
98+
};
99+
65100
class ATTR_DLL_LOCAL CWVCdmAdapterA : public CMediaDrmOnEventCallback,
101+
public CMediaDrmOnKeyStatusChangeCallback,
66102
public IWVCdmAdapter<CJNIMediaDrm>
67103
{
68104
public:
@@ -96,13 +132,20 @@ class ATTR_DLL_LOCAL CWVCdmAdapterA : public CMediaDrmOnEventCallback,
96132
int extra,
97133
const std::vector<char>& data) override;
98134

135+
// CMediaDrmOnKeyStatusChangeCallback interface methods
136+
void OnKeyStatusChange(const CJNIMediaDrm& mediaDrm,
137+
const std::vector<char>& sessionId,
138+
const CJNIList<CJNIMediaDrmKeyStatus>& keyInformation,
139+
bool hasNewUsableKey) override;
140+
99141
DRM::Config m_config;
100142
std::shared_ptr<CJNIMediaDrm> m_cdmAdapter;
101143
std::list<IWVObserver*> m_observers;
102144
std::mutex m_observer_mutex;
103145

104146
std::string m_keySystem;
105147
std::unique_ptr<CMediaDrmOnEventListener> m_mediaDrmEventListener;
148+
std::unique_ptr<CMediaDrmOnKeyStatusChangeListener> m_mediaDrmOnKeyChangeListener;
106149
std::string m_strBasePath;
107150
CWVDecrypterA* m_host;
108151
};

0 commit comments

Comments
 (0)