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

Commit 5e21872a authored by Robert Shih's avatar Robert Shih Committed by Android (Google) Code Review
Browse files

Merge "libmediadrm: comprehensive exception messages" into sc-dev

parents b62cce4a 0beba056
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -162,7 +162,6 @@ struct IDrm : public virtual RefBase {
            DrmPlugin::SecurityLevel securityLevel) const = 0;

    virtual status_t setPlaybackId(

            Vector<uint8_t> const &sessionId,
            const char *playbackId) = 0;

+52 −1
Original line number Diff line number Diff line
@@ -23,8 +23,11 @@
#include <android/hardware/drm/1.4/types.h>
#include <media/stagefright/MediaErrors.h>
#include <utils/Errors.h>  // for status_t
#include <utils/Vector.h>
#include <utils/Log.h>
#include <utils/String8.h>
#include <utils/StrongPointer.h>
#include <utils/Vector.h>
#include <ctime>
#include <vector>


@@ -138,6 +141,54 @@ status_t GetLogMessages(const sp<U> &obj, Vector<::V1_4::LogMessage> &logs) {
    return toStatusT(err);
}

namespace {
static inline char logPriorityToChar(::V1_4::LogPriority priority) {
    char p = 'U';
    switch (priority) {
        case ::V1_4::LogPriority::VERBOSE:  p = 'V'; break;
        case ::V1_4::LogPriority::DEBUG:    p = 'D'; break;
        case ::V1_4::LogPriority::INFO:     p = 'I'; break;
        case ::V1_4::LogPriority::WARN:     p = 'W'; break;
        case ::V1_4::LogPriority::ERROR:    p = 'E'; break;
        case ::V1_4::LogPriority::FATAL:    p = 'F'; break;
        default: p = 'U'; break;
    }
    return p;
}
}

template<typename T>
std::string GetExceptionMessage(status_t err, const char *msg, const sp<T> &iface) {
    String8 msg8;
    if (msg) {
        msg8 += msg;
        msg8 += ": ";
    }
    auto errStr = StrCryptoError(err);
    msg8 += errStr.c_str();

    Vector<::V1_4::LogMessage> logs;
    if (iface->getLogMessages(logs) != NO_ERROR) {
        return msg8.c_str();
    }

    for (auto log: logs) {
        time_t seconds = log.timeMs / 1000;
        int ms = log.timeMs % 1000;
        char buf[64] = {0};
        std::string timeStr = "00-00 00:00:00";
        if (strftime(buf, sizeof buf, "%m-%d %H:%M:%S", std::localtime(&seconds))) {
            timeStr = buf;
        }

        char p = logPriorityToChar(log.priority);
        msg8 += String8::format("\n%s.%03d %c %s",
                timeStr.c_str(), ms, p, log.message.c_str());
    }

    return msg8.c_str();
}

} // namespace DrmUtils
} // namespace android
#endif // ANDROID_DRMUTILS_H
+50 −0
Original line number Diff line number Diff line
@@ -162,6 +162,56 @@ static inline bool isCryptoError(status_t err) {
            || (ERROR_DRM_VENDOR_MIN <= err && err <= ERROR_DRM_VENDOR_MAX);
}

static inline std::string StrCryptoError(status_t err) {
#define STATUS_CASE(STATUS) \
    case STATUS:            \
        return #STATUS

    switch (err) {
        STATUS_CASE(ERROR_DRM_UNKNOWN);
        STATUS_CASE(ERROR_DRM_NO_LICENSE);
        STATUS_CASE(ERROR_DRM_LICENSE_EXPIRED);
        STATUS_CASE(ERROR_DRM_SESSION_NOT_OPENED);
        STATUS_CASE(ERROR_DRM_DECRYPT_UNIT_NOT_INITIALIZED);
        STATUS_CASE(ERROR_DRM_DECRYPT);
        STATUS_CASE(ERROR_DRM_CANNOT_HANDLE);
        STATUS_CASE(ERROR_DRM_TAMPER_DETECTED);
        STATUS_CASE(ERROR_DRM_NOT_PROVISIONED);
        STATUS_CASE(ERROR_DRM_DEVICE_REVOKED);
        STATUS_CASE(ERROR_DRM_RESOURCE_BUSY);
        STATUS_CASE(ERROR_DRM_INSUFFICIENT_OUTPUT_PROTECTION);
        STATUS_CASE(ERROR_DRM_INSUFFICIENT_SECURITY);
        STATUS_CASE(ERROR_DRM_FRAME_TOO_LARGE);
        STATUS_CASE(ERROR_DRM_RESOURCE_CONTENTION);
        STATUS_CASE(ERROR_DRM_SESSION_LOST_STATE);
        STATUS_CASE(ERROR_DRM_INVALID_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_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 statusToString(err);
}

}  // namespace android

#endif  // MEDIA_ERRORS_H_