| Index: media/base/android/media_drm_bridge.cc
|
| diff --git a/media/base/android/media_drm_bridge.cc b/media/base/android/media_drm_bridge.cc
|
| index 1d9854d0c2c254303927a7e5c60e5fe481e8f98a..7e47c5d0f5f517ce4a0c0fc6a265d32f5429cbbf 100644
|
| --- a/media/base/android/media_drm_bridge.cc
|
| +++ b/media/base/android/media_drm_bridge.cc
|
| @@ -15,6 +15,8 @@
|
| #include "jni/MediaDrmBridge_jni.h"
|
| #include "media/base/android/media_player_manager.h"
|
|
|
| +#include "widevine_cdm_version.h" // In SHARED_INTERMEDIATE_DIR.
|
| +
|
| using base::android::AttachCurrentThread;
|
| using base::android::ConvertUTF8ToJavaString;
|
| using base::android::ConvertJavaStringToUTF8;
|
| @@ -50,13 +52,26 @@ static uint64 ReadUint64(const uint8_t* data) {
|
| // uint32 DataSize
|
| // uint8[DataSize] Data
|
| // }
|
| -static const int kBoxHeaderSize = 8; // Box's header contains Size and Type.
|
| -static const int kBoxLargeSizeSize = 8;
|
| -static const int kPsshVersionFlagSize = 4;
|
| -static const int kPsshSystemIdSize = 16;
|
| -static const int kPsshDataSizeSize = 4;
|
| -static const uint32 kTencType = 0x74656e63;
|
| -static const uint32 kPsshType = 0x70737368;
|
| +const int kBoxHeaderSize = 8; // Box's header contains Size and Type.
|
| +const int kBoxLargeSizeSize = 8;
|
| +const int kPsshVersionFlagSize = 4;
|
| +const int kPsshSystemIdSize = 16;
|
| +const int kPsshDataSizeSize = 4;
|
| +const uint32 kTencType = 0x74656e63;
|
| +const uint32 kPsshType = 0x70737368;
|
| +const uint8 kWidevineUuid[16] = {
|
| + 0xED, 0xEF, 0x8B, 0xA9, 0x79, 0xD6, 0x4A, 0xCE,
|
| + 0xA3, 0xC8, 0x27, 0xDC, 0xD5, 0x1D, 0x21, 0xED };
|
| +
|
| +static std::vector<uint8> GetUUID(const std::string& key_system) {
|
| + // For security reasons, we only do exact string comparisons here - we don't
|
| + // try to parse the |key_system| in any way.
|
| + if (key_system == kWidevineKeySystem) {
|
| + return std::vector<uint8>(kWidevineUuid,
|
| + kWidevineUuid + arraysize(kWidevineUuid));
|
| + }
|
| + return std::vector<uint8>();
|
| +}
|
|
|
| // Tries to find a PSSH box whose "SystemId" is |uuid| in |data|, parses the
|
| // "Data" of the box and put it in |pssh_data|. Returns true if such a box is
|
| @@ -175,22 +190,25 @@ bool MediaDrmBridge::IsSecureDecoderRequired(SecurityLevel security_level) {
|
| return SECURITY_LEVEL_1 == security_level;
|
| }
|
|
|
| -bool MediaDrmBridge::IsSecurityLevelSupported(
|
| - const std::vector<uint8>& scheme_uuid,
|
| - SecurityLevel security_level) {
|
| +bool MediaDrmBridge::IsSecurityLevelSupported(const std::string& key_system,
|
| + SecurityLevel security_level) {
|
| // Pass 0 as |cdm_id| and NULL as |manager| as they are not used in
|
| // creation time of MediaDrmBridge.
|
| scoped_ptr<MediaDrmBridge> media_drm_bridge =
|
| - MediaDrmBridge::Create(0, scheme_uuid, GURL(), NULL);
|
| + MediaDrmBridge::Create(0, key_system, GURL(), NULL);
|
| if (!media_drm_bridge)
|
| return false;
|
|
|
| return media_drm_bridge->SetSecurityLevel(security_level);
|
| }
|
|
|
| -bool MediaDrmBridge::IsCryptoSchemeSupported(
|
| - const std::vector<uint8>& scheme_uuid,
|
| +bool MediaDrmBridge::IsKeySystemSupportedWithType(
|
| + const std::string& key_system,
|
| const std::string& container_mime_type) {
|
| + std::vector<uint8> scheme_uuid = GetUUID(key_system);
|
| + if (scheme_uuid.empty())
|
| + return false;
|
| +
|
| JNIEnv* env = AttachCurrentThread();
|
| ScopedJavaLocalRef<jbyteArray> j_scheme_uuid =
|
| base::android::ToJavaByteArray(env, &scheme_uuid[0], scheme_uuid.size());
|
| @@ -228,20 +246,22 @@ MediaDrmBridge::~MediaDrmBridge() {
|
| }
|
|
|
| // static
|
| -scoped_ptr<MediaDrmBridge> MediaDrmBridge::Create(
|
| - int cdm_id,
|
| - const std::vector<uint8>& scheme_uuid,
|
| - const GURL& frame_url,
|
| - MediaPlayerManager* manager) {
|
| +scoped_ptr<MediaDrmBridge> MediaDrmBridge::Create(int cdm_id,
|
| + const std::string& key_system,
|
| + const GURL& frame_url,
|
| + MediaPlayerManager* manager) {
|
| scoped_ptr<MediaDrmBridge> media_drm_bridge;
|
| + if (!IsAvailable())
|
| + return media_drm_bridge.Pass();
|
|
|
| - if (IsAvailable() && !scheme_uuid.empty()) {
|
| - // TODO(qinmin): check whether the uuid is valid.
|
| - media_drm_bridge.reset(
|
| - new MediaDrmBridge(cdm_id, scheme_uuid, frame_url, manager));
|
| - if (media_drm_bridge->j_media_drm_.is_null())
|
| - media_drm_bridge.reset();
|
| - }
|
| + std::vector<uint8> scheme_uuid = GetUUID(key_system);
|
| + if (scheme_uuid.empty())
|
| + return media_drm_bridge.Pass();
|
| +
|
| + media_drm_bridge.reset(
|
| + new MediaDrmBridge(cdm_id, scheme_uuid, frame_url, manager));
|
| + if (media_drm_bridge->j_media_drm_.is_null())
|
| + media_drm_bridge.reset();
|
|
|
| return media_drm_bridge.Pass();
|
| }
|
|
|