cas: explicitly define possible key id values
Remove cas header from media jni headers, and define flags
for PES header extraction.
bug: 73898003
test: CTS MediaCasTest, MediaDrmClearkeyTest
Change-Id: I2a512e2dbeb8be53a64bfa0b89254032c7341fa2
diff --git a/media/jni/android_media_MediaDescrambler.cpp b/media/jni/android_media_MediaDescrambler.cpp
index add47463..aa79ce0 100644
--- a/media/jni/android_media_MediaDescrambler.cpp
+++ b/media/jni/android_media_MediaDescrambler.cpp
@@ -25,18 +25,64 @@
#include <android/hardware/cas/native/1.0/BpHwDescrambler.h>
#include <android/hardware/cas/native/1.0/BnHwDescrambler.h>
+#include <android/hardware/cas/native/1.0/IDescrambler.h>
#include <binder/MemoryDealer.h>
#include <hidl/HidlSupport.h>
#include <hidlmemory/FrameworkUtils.h>
#include <media/stagefright/foundation/ADebug.h>
+#include <media/cas/DescramblerAPI.h>
#include <nativehelper/ScopedLocalRef.h>
namespace android {
+class IMemory;
+class MemoryDealer;
+namespace hardware {
+class HidlMemory;
+};
using hardware::fromHeap;
+using hardware::HidlMemory;
+using hardware::hidl_string;
+using hardware::hidl_vec;
+using namespace hardware::cas::V1_0;
+using namespace hardware::cas::native::V1_0;
+
+struct JDescrambler : public RefBase {
+ JDescrambler(JNIEnv *env, jobject descramberBinderObj);
+
+ status_t descramble(
+ uint32_t key,
+ ssize_t totalLength,
+ const hidl_vec<SubSample>& subSamples,
+ const void *srcPtr,
+ jint srcOffset,
+ void *dstPtr,
+ jint dstOffset,
+ Status *status,
+ uint32_t *bytesWritten,
+ hidl_string *detailedError);
+
+
+protected:
+ virtual ~JDescrambler();
+
+private:
+ sp<IDescrambler> mDescrambler;
+ sp<IMemory> mMem;
+ sp<MemoryDealer> mDealer;
+ sp<HidlMemory> mHidlMemory;
+ SharedBuffer mDescramblerSrcBuffer;
+
+ Mutex mSharedMemLock;
+
+ bool ensureBufferCapacity(size_t neededSize);
+
+ DISALLOW_EVIL_CONSTRUCTORS(JDescrambler);
+};
struct fields_t {
jfieldID context;
+ jbyte flagPesHeader;
};
static fields_t gFields;
@@ -111,8 +157,7 @@
mDealer.clear();
}
-// static
-sp<IDescrambler> JDescrambler::GetDescrambler(JNIEnv *env, jobject obj) {
+sp<IDescrambler> GetDescrambler(JNIEnv *env, jobject obj) {
if (obj != NULL) {
sp<hardware::IBinder> hwBinder =
JHwRemoteBinder::GetNativeContext(env, obj)->getBinder();
@@ -155,7 +200,7 @@
}
status_t JDescrambler::descramble(
- jbyte key,
+ uint32_t key,
ssize_t totalLength,
const hidl_vec<SubSample>& subSamples,
const void *srcPtr,
@@ -228,6 +273,12 @@
gFields.context = env->GetFieldID(clazz.get(), "mNativeContext", "J");
CHECK(gFields.context != NULL);
+
+ jfieldID fieldPesHeader = env->GetStaticFieldID(
+ clazz.get(), "SCRAMBLE_FLAG_PES_HEADER", "B");
+ CHECK(fieldPesHeader != NULL);
+
+ gFields.flagPesHeader = env->GetStaticByteField(clazz.get(), fieldPesHeader);
}
static void android_media_MediaDescrambler_native_setup(
@@ -323,7 +374,7 @@
}
static jint android_media_MediaDescrambler_native_descramble(
- JNIEnv *env, jobject thiz, jbyte key, jint numSubSamples,
+ JNIEnv *env, jobject thiz, jbyte key, jbyte flags, jint numSubSamples,
jintArray numBytesOfClearDataObj, jintArray numBytesOfEncryptedDataObj,
jobject srcBuf, jint srcOffset, jint srcLimit,
jobject dstBuf, jint dstOffset, jint dstLimit) {
@@ -364,12 +415,18 @@
return -1;
}
+ uint32_t scramblingControl = (uint32_t)key;
+
+ if (flags & gFields.flagPesHeader) {
+ scramblingControl |= DescramblerPlugin::kScrambling_Flag_PesHeader;
+ }
+
Status status;
uint32_t bytesWritten;
hidl_string detailedError;
err = descrambler->descramble(
- key, totalLength, subSamples,
+ scramblingControl, totalLength, subSamples,
srcPtr, srcOffset, dstPtr, dstOffset,
&status, &bytesWritten, &detailedError);
@@ -401,7 +458,7 @@
(void *)android_media_MediaDescrambler_native_init },
{ "native_setup", "(Landroid/os/IHwBinder;)V",
(void *)android_media_MediaDescrambler_native_setup },
- { "native_descramble", "(BI[I[ILjava/nio/ByteBuffer;IILjava/nio/ByteBuffer;II)I",
+ { "native_descramble", "(BBI[I[ILjava/nio/ByteBuffer;IILjava/nio/ByteBuffer;II)I",
(void *)android_media_MediaDescrambler_native_descramble },
};