Chromium Code Reviews| 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..3dc0bb07536f83381f222250ed5abcf78de58bc3 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,24 @@ 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) { |
|
ddorwin
2014/03/05 22:11:29
I still think it's worth commenting that we only d
xhwang
2014/03/06 18:09:57
Done.
|
| + 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 +188,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::IsKeySystemSupported( |
| + 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 +244,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(); |
| } |