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 },
 };