Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 620f4a64 authored by Robert Shih's avatar Robert Shih
Browse files

libmedia_jni: map drm MediaError to Java error

Bug: 162255728
Test: MediaDrmClearkeyTest
Change-Id: I8e6eb8b8f53dfb76a0de90e16d66e3a9bf912a03
parent 8c7cbddb
Loading
Loading
Loading
Loading
+46 −1
Original line number Diff line number Diff line
@@ -343,11 +343,56 @@ void JNIDrmListener::notify(DrmPlugin::EventType eventType, int extra,
    }
}

jint MediaErrorToJavaError(status_t err) {
#define STATUS_CASE(status) \
    case status: \
        return J##status

    switch (err) {
        STATUS_CASE(ERROR_DRM_UNKNOWN);
        STATUS_CASE(ERROR_DRM_NO_LICENSE);
        STATUS_CASE(ERROR_DRM_LICENSE_EXPIRED);
        STATUS_CASE(ERROR_DRM_RESOURCE_BUSY);
        STATUS_CASE(ERROR_DRM_INSUFFICIENT_OUTPUT_PROTECTION);
        STATUS_CASE(ERROR_DRM_SESSION_NOT_OPENED);
        STATUS_CASE(ERROR_DRM_CANNOT_HANDLE);
        STATUS_CASE(ERROR_DRM_INSUFFICIENT_SECURITY);
        STATUS_CASE(ERROR_DRM_FRAME_TOO_LARGE);
        STATUS_CASE(ERROR_DRM_SESSION_LOST_STATE);
        STATUS_CASE(ERROR_DRM_CERTIFICATE_MALFORMED);
        STATUS_CASE(ERROR_DRM_CERTIFICATE_MISSING);
        STATUS_CASE(ERROR_DRM_CRYPTO_LIBRARY);
        STATUS_CASE(ERROR_DRM_GENERIC_OEM);
        STATUS_CASE(ERROR_DRM_GENERIC_PLUGIN);
        STATUS_CASE(ERROR_DRM_INIT_DATA);
        STATUS_CASE(ERROR_DRM_KEY_NOT_LOADED);
        STATUS_CASE(ERROR_DRM_LICENSE_PARSE);
        STATUS_CASE(ERROR_DRM_LICENSE_POLICY);
        STATUS_CASE(ERROR_DRM_LICENSE_RELEASE);
        STATUS_CASE(ERROR_DRM_LICENSE_REQUEST_REJECTED);
        STATUS_CASE(ERROR_DRM_LICENSE_RESTORE);
        STATUS_CASE(ERROR_DRM_LICENSE_STATE);
        STATUS_CASE(ERROR_DRM_MEDIA_FRAMEWORK);
        STATUS_CASE(ERROR_DRM_PROVISIONING_CERTIFICATE);
        STATUS_CASE(ERROR_DRM_PROVISIONING_CONFIG);
        STATUS_CASE(ERROR_DRM_PROVISIONING_PARSE);
        STATUS_CASE(ERROR_DRM_PROVISIONING_RETRY);
        STATUS_CASE(ERROR_DRM_RESOURCE_CONTENTION);
        STATUS_CASE(ERROR_DRM_SECURE_STOP_RELEASE);
        STATUS_CASE(ERROR_DRM_STORAGE_READ);
        STATUS_CASE(ERROR_DRM_STORAGE_WRITE);
        STATUS_CASE(ERROR_DRM_ZERO_SUBSAMPLES);
#undef STATUS_CASE
    }
    return static_cast<jint>(err);
}

static void throwStateException(JNIEnv *env, const char *msg, status_t err) {
    ALOGE("Illegal state exception: %s (%d)", msg, err);

    jint jerr = MediaErrorToJavaError(err);
    jobject exception = env->NewObject(gFields.stateException.classId,
            gFields.stateException.init, static_cast<int>(err),
            gFields.stateException.init, static_cast<int>(jerr),
            env->NewStringUTF(msg));
    env->Throw(static_cast<jthrowable>(exception));
}
+40 −0
Original line number Diff line number Diff line
@@ -28,6 +28,44 @@

namespace {

enum {
    // TODO(b/180483929): use reverse jni e.g. android_media_MediaDrm_native_init
    // KEEP IN SYNC with MediaDrm$ErrorCodes in MediaDrm.java!
    JERROR_DRM_UNKNOWN = 0,
    JERROR_DRM_NO_LICENSE = 1,
    JERROR_DRM_LICENSE_EXPIRED = 2,
    JERROR_DRM_RESOURCE_BUSY = 3,
    JERROR_DRM_INSUFFICIENT_OUTPUT_PROTECTION = 4,
    JERROR_DRM_SESSION_NOT_OPENED = 5,
    JERROR_DRM_CANNOT_HANDLE = 6,
    JERROR_DRM_INSUFFICIENT_SECURITY = 7,
    JERROR_DRM_FRAME_TOO_LARGE = 8,
    JERROR_DRM_SESSION_LOST_STATE = 9,
    JERROR_DRM_CERTIFICATE_MALFORMED = 10,
    JERROR_DRM_CERTIFICATE_MISSING = 11,
    JERROR_DRM_CRYPTO_LIBRARY = 12,
    JERROR_DRM_GENERIC_OEM = 13,
    JERROR_DRM_GENERIC_PLUGIN = 14,
    JERROR_DRM_INIT_DATA = 15,
    JERROR_DRM_KEY_NOT_LOADED = 16,
    JERROR_DRM_LICENSE_PARSE = 17,
    JERROR_DRM_LICENSE_POLICY = 18,
    JERROR_DRM_LICENSE_RELEASE = 19,
    JERROR_DRM_LICENSE_REQUEST_REJECTED = 20,
    JERROR_DRM_LICENSE_RESTORE = 21,
    JERROR_DRM_LICENSE_STATE = 22,
    JERROR_DRM_MEDIA_FRAMEWORK = 23,
    JERROR_DRM_PROVISIONING_CERTIFICATE = 24,
    JERROR_DRM_PROVISIONING_CONFIG = 25,
    JERROR_DRM_PROVISIONING_PARSE = 26,
    JERROR_DRM_PROVISIONING_RETRY = 27,
    JERROR_DRM_RESOURCE_CONTENTION = 28,
    JERROR_DRM_SECURE_STOP_RELEASE = 29,
    JERROR_DRM_STORAGE_READ = 30,
    JERROR_DRM_STORAGE_WRITE = 31,
    JERROR_DRM_ZERO_SUBSAMPLES = 32,
};

struct ListenerArgs {
    jbyteArray jSessionId;
    jbyteArray jData;
@@ -98,6 +136,8 @@ private:
    DISALLOW_EVIL_CONSTRUCTORS(JDrm);
};

jint MediaErrorToJavaError(status_t err);

}  // namespace android

#endif  // _ANDROID_MEDIA_DRM_H_