Skip to content

Commit

Permalink
Use jcast for byteArrays / provide cmakelists for obsolete ndk
Browse files Browse the repository at this point in the history
  • Loading branch information
peak3d committed May 8, 2018
1 parent e9ecb4c commit 43e02b8
Show file tree
Hide file tree
Showing 3 changed files with 91 additions and 69 deletions.
78 changes: 78 additions & 0 deletions wvdecrypter/CMakeLists.txt.ndk
@@ -0,0 +1,78 @@
cmake_minimum_required(VERSION 2.6)

if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
# require at least gcc 4.8
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.8)
message(FATAL_ERROR "GCC version must be at least 4.8!")
endif()
endif()

project(wvdecrypter)

if(CORE_SYSTEM_NAME STREQUAL android)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wl,--no-undefined -O0 -g")
include_directories (
${CMAKE_CURRENT_SOURCE_DIR}/../lib/libbento4/Core
# jni/jutils
# jni/src
)
else()
include_directories (
${CMAKE_CURRENT_SOURCE_DIR}/../lib/libbento4/Core/
${CMAKE_CURRENT_SOURCE_DIR}/cdm
)
endif()

set(BENTOUSESTCFS 1)

subdirs (
${CMAKE_CURRENT_SOURCE_DIR}/../lib/libbento4
)

if(CORE_SYSTEM_NAME STREQUAL android)
subdirs ( jni )
add_library ( ssd_wv SHARED
wvdecrypter_android.cpp
jsmn.c
../src/helpers.cpp
../src/md5.cpp
)
else()
if(WIN32)
set(CDMTYPE "win.cc")
add_definitions("-DWIDEVINECDMFILENAME=\"widevinecdm.dll\"")
elseif(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
set(CDMTYPE "mac.mm")
add_definitions("-DWIDEVINECDMFILENAME=\"libwidevinecdm.dylib\"")
else()
set(CDMTYPE "posix.cc")
add_definitions("-DWIDEVINECDMFILENAME=\"libwidevinecdm.so\"")
endif()

add_library ( ssd_wv SHARED
wvdecrypter.cpp
jsmn.c
../src/helpers.cpp
../src/md5.cpp
cdm/base/native_library.cc
cdm/base/native_library_${CDMTYPE}
cdm/media/cdm/cdm_adapter.cc
)
endif()

if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
target_link_libraries (ssd_wv
bento4
"-framework CoreFoundation"
)
elseif(CORE_SYSTEM_NAME STREQUAL android)
target_link_libraries (ssd_wv
mediandk
bento4
)
else()
target_link_libraries (ssd_wv
${CMAKE_DL_LIBS}
bento4
)
endif()
76 changes: 9 additions & 67 deletions wvdecrypter/jni/src/MediaDrm.cpp
Expand Up @@ -58,18 +58,9 @@ std::vector<char> CJNIMediaDrm::openSession() const

void CJNIMediaDrm::closeSession(const std::vector<char> & sessionId) const
{
jsize size;
JNIEnv *env = xbmc_jnienv();

size = sessionId.size();
jbyteArray SID = env->NewByteArray(size);
jbyte *bytedata = (jbyte*)sessionId.data();
env->SetByteArrayRegion(SID, 0, size, bytedata);

call_method<void>(m_object,
"closeSession", "([B)V", SID);

env->DeleteLocalRef(SID);
"closeSession", "([B)V", jcast<jhbyteArray, std::vector<char> >(sessionId));
}

std::string CJNIMediaDrm::getPropertyString(const std::string &propertyName) const
Expand All @@ -90,17 +81,9 @@ void CJNIMediaDrm::setPropertyString(const std::string &propertyName, const std:
void CJNIMediaDrm::setPropertyByteArray(const std::string &propertyName, const std::vector<char> &value) const
{
JNIEnv *env = xbmc_jnienv();

jsize size = value.size();
jbyteArray value_ = env->NewByteArray(size);
jbyte *bytedata = (jbyte*)value.data();
env->SetByteArrayRegion(value_, 0, size, bytedata);

call_method<void>(m_object,
"setPropertyByteArray", "(Ljava/lang/String;[B)V",
jcast<jhstring>(propertyName), value_);

env->DeleteLocalRef(value_);
jcast<jhstring>(propertyName), jcast<jhbyteArray, std::vector<char> >(value));
}

CJNIMediaDrmKeyRequest CJNIMediaDrm::getKeyRequest(const std::vector<char> &scope,
Expand All @@ -109,57 +92,32 @@ CJNIMediaDrmKeyRequest CJNIMediaDrm::getKeyRequest(const std::vector<char> &scop
{
JNIEnv *env = xbmc_jnienv();

jsize size = scope.size();
jbyteArray scope_ = env->NewByteArray(size);
jbyte *bytedata = (jbyte*)scope.data();
env->SetByteArrayRegion(scope_, 0, size, bytedata);

size = init.size();
jbyteArray init_ = env->NewByteArray(size);
bytedata = (jbyte*)init.data();
env->SetByteArrayRegion(init_, 0, size, bytedata);

CJNIHashMap hashMap;
for (const auto &item : optionalParameters)
hashMap.put(jcast<jhstring>(item.first), jcast<jhstring>(item.second));

CJNIMediaDrmKeyRequest result =
call_method<jhobject>(m_object,
"getKeyRequest", "([B[BLjava/lang/String;ILjava/util/HashMap;)Landroid/media/MediaDrm$KeyRequest;",
scope_, init_, jcast<jhstring>(mimeType), keyType, hashMap.get_raw());

env->DeleteLocalRef(scope_);
env->DeleteLocalRef(init_);
jcast<jhbyteArray, std::vector<char> >(scope), jcast<jhbyteArray, std::vector<char> >(init),
jcast<jhstring>(mimeType), keyType, hashMap.get_raw());

return result;
}

std::vector<char> CJNIMediaDrm::provideKeyResponse(const std::vector<char> &scope, const std::vector<char> &response) const
{
JNIEnv *env = xbmc_jnienv();

jsize size = scope.size();
jbyteArray scope_ = env->NewByteArray(size);
jbyte *bytedata = (jbyte*)scope.data();
env->SetByteArrayRegion(scope_, 0, size, bytedata);

size = response.size();
jbyteArray response_ = env->NewByteArray(size);
bytedata = (jbyte*)response.data();
env->SetByteArrayRegion(response_, 0, size, bytedata);

jhbyteArray array = call_method<jhbyteArray>(m_object,
"provideKeyResponse", "([B[B)[B", scope_, response_);
"provideKeyResponse", "([B[B)[B", jcast<jhbyteArray, std::vector<char> >(scope),
jcast<jhbyteArray, std::vector<char> >(response));

size = env->GetArrayLength(array.get());
jsize size = env->GetArrayLength(array.get());

std::vector<char> result;
result.resize(size);
env->GetByteArrayRegion(array.get(), 0, size, (jbyte*)result.data());

env->DeleteLocalRef(scope_);
env->DeleteLocalRef(response_);

return result;
}

Expand All @@ -172,31 +130,15 @@ CJNIMediaDrmProvisionRequest CJNIMediaDrm::getProvisionRequest() const
void CJNIMediaDrm::provideProvisionResponse(const std::vector<char> &response) const
{
JNIEnv *env = xbmc_jnienv();

jsize size = response.size();
jbyteArray response_ = env->NewByteArray(size);
jbyte *bytedata = (jbyte*)response.data();
env->SetByteArrayRegion(response_, 0, size, bytedata);

call_method<void>(m_object,
"provideProvisionResponse", "([B)V", response_);

env->DeleteLocalRef(response_);
"provideProvisionResponse", "([B)V", jcast<jhbyteArray, std::vector<char> >(response));
}

void CJNIMediaDrm::removeKeys(const std::vector<char> &sessionId) const
{
JNIEnv *env = xbmc_jnienv();

jsize size = sessionId.size();
jbyteArray SID = env->NewByteArray(size);
jbyte *bytedata = (jbyte*)sessionId.data();
env->SetByteArrayRegion(SID, 0, size, bytedata);

call_method<void>(m_object,
"removeKeys", "([B)V", SID);

env->DeleteLocalRef(SID);
"removeKeys", "([B)V", jcast<jhbyteArray, std::vector<char> >(sessionId));
}

void CJNIMediaDrm::setOnEventListener(const CJNIMediaDrmOnEventListener &listener) const
Expand Down
6 changes: 4 additions & 2 deletions wvdecrypter/wvdecrypter_android.cpp
Expand Up @@ -127,8 +127,10 @@ WV_DRM::WV_DRM(WV_KEYSYSTEM ks, const char* licenseURL, const AP4_DataBuffer &se

if (key_system_ == WIDEVINE)
{
AMediaDrm_setPropertyString(media_drm_, "privacyMode", "enable");
AMediaDrm_setPropertyString(media_drm_, "sessionSharing", "enable");
if (serverCert.GetDataSize())
AMediaDrm_setPropertyByteArray(media_drm_, "serviceCertificate", serverCert.GetData(), serverCert.GetDataSize());
//AMediaDrm_setPropertyString(media_drm_, "privacyMode", "enable");
//AMediaDrm_setPropertyString(media_drm_, "sessionSharing", "enable");
}

Log(SSD_HOST::LL_DEBUG, "Successful instanciated media_drm: %p, deviceid: %s, security-level: %s", media_drm_, strDeviceId.c_str(), strSecurityLevel.c_str());
Expand Down

0 comments on commit 43e02b8

Please sign in to comment.