diff options
author | gunsch <gunsch@chromium.org> | 2015-04-29 20:58:45 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-04-30 03:59:13 +0000 |
commit | 2288c539cc227ec262be28c4b684ff38527f7768 (patch) | |
tree | 12cf88619fe8fbc979a2f0aa1f0722ff2741a500 /chromecast | |
parent | d92456f94d7d2563f3b1bd46e6b77d9c9eadd633 (diff) | |
download | chromium_src-2288c539cc227ec262be28c4b684ff38527f7768.zip chromium_src-2288c539cc227ec262be28c4b684ff38527f7768.tar.gz chromium_src-2288c539cc227ec262be28c4b684ff38527f7768.tar.bz2 |
Adds MediaClientAndroid to support embedder/MediaDrmBridge interaction.
This CL does a few things:
* Adds a MediaDrmBridgeDelegate interface to support per DRM-scheme logic for Android in MediaDrmBridge.
* Adds a MediaClientAndroid interface for embedders to provide MediaDrmBridgeDelegate implementations and key-system-UUID mappings
* Removes the Java-based key-system-UUID mapping path
* Embedders no longer call directly into MediaDrmBridge
R=qinmin@chromium.org,xhwang@chromium.org,boliu@chromium.org,jochen@chromium.org
BUG=462443
Review URL: https://codereview.chromium.org/962793005
Cr-Commit-Position: refs/heads/master@{#327650}
Diffstat (limited to 'chromecast')
-rw-r--r-- | chromecast/browser/DEPS | 1 | ||||
-rw-r--r-- | chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastBrowserHelper.java | 8 | ||||
-rw-r--r-- | chromecast/browser/cast_browser_main_parts.cc | 11 | ||||
-rw-r--r-- | chromecast/browser/cast_content_browser_client.cc | 3 | ||||
-rw-r--r-- | chromecast/browser/media/cast_media_client_android.cc | 44 | ||||
-rw-r--r-- | chromecast/browser/media/cast_media_client_android.h | 41 | ||||
-rw-r--r-- | chromecast/chromecast.gyp | 8 | ||||
-rw-r--r-- | chromecast/media/base/key_systems_common.h | 12 | ||||
-rw-r--r-- | chromecast/media/base/key_systems_common_simple.cc | 8 | ||||
-rw-r--r-- | chromecast/media/cdm/playready_drm_delegate_android.cc | 85 | ||||
-rw-r--r-- | chromecast/media/cdm/playready_drm_delegate_android.h | 34 | ||||
-rw-r--r-- | chromecast/media/media.gyp | 8 |
12 files changed, 249 insertions, 14 deletions
diff --git a/chromecast/browser/DEPS b/chromecast/browser/DEPS index 5306642..bd203a8 100644 --- a/chromecast/browser/DEPS +++ b/chromecast/browser/DEPS @@ -3,6 +3,7 @@ include_rules = [ # embedder and can include from all other chromecast/ directories. "+cc/base/switches.h", "+chromecast", + "+components/cdm/browser", "+components/crash", "+components/devtools_discovery", "+components/devtools_http_handler", diff --git a/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastBrowserHelper.java b/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastBrowserHelper.java index 937018d..7b56973 100644 --- a/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastBrowserHelper.java +++ b/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastBrowserHelper.java @@ -19,11 +19,8 @@ import org.chromium.content.app.ContentApplication; import org.chromium.content.browser.BrowserStartupController; import org.chromium.content.browser.DeviceUtils; import org.chromium.content.common.ContentSwitches; -import org.chromium.media.MediaDrmBridge; import org.chromium.net.NetworkChangeNotifier; -import java.util.UUID; - /** * Static, one-time initialization for the browser process. */ @@ -32,10 +29,6 @@ public class CastBrowserHelper { public static final String COMMAND_LINE_ARGS_KEY = "commandLineArgs"; - private static final String PLAYREADY_KEY_SYSTEM_NAME = "com.chromecast.playready"; - private static final UUID PLAYREADY_UUID = - UUID.fromString("9A04F079-9840-4286-AB92-E65BE0885F95"); - private static boolean sIsBrowserInitialized = false; /** @@ -80,7 +73,6 @@ public class CastBrowserHelper { // Cast shell always expects to receive notifications to track network state. NetworkChangeNotifier.registerToReceiveNotificationsAlways(); sIsBrowserInitialized = true; - MediaDrmBridge.addKeySystemUuidMapping(PLAYREADY_KEY_SYSTEM_NAME, PLAYREADY_UUID); return true; } catch (ProcessInitException e) { Log.e(TAG, "Unable to launch browser process.", e); diff --git a/chromecast/browser/cast_browser_main_parts.cc b/chromecast/browser/cast_browser_main_parts.cc index 45edf44..1c0ca15 100644 --- a/chromecast/browser/cast_browser_main_parts.cc +++ b/chromecast/browser/cast_browser_main_parts.cc @@ -29,6 +29,7 @@ #include "chromecast/browser/url_request_context_factory.h" #include "chromecast/common/chromecast_switches.h" #include "chromecast/common/platform_client_auth.h" +#include "chromecast/media/base/key_systems_common.h" #include "chromecast/net/connectivity_checker.h" #include "content/public/browser/browser_thread.h" #include "content/public/common/content_switches.h" @@ -36,8 +37,10 @@ #include "media/base/media_switches.h" #if defined(OS_ANDROID) +#include "chromecast/browser/media/cast_media_client_android.h" #include "chromecast/crash/android/crash_handler.h" #include "components/crash/browser/crash_dump_manager_android.h" +#include "media/base/android/media_client_android.h" #include "net/android/network_change_notifier_factory_android.h" #else #include "chromecast/browser/media/cast_browser_cdm_factory.h" @@ -259,11 +262,13 @@ void CastBrowserMainParts::PreMainMessageLoopRun() { cast_browser_process_->SetPrefService( PrefServiceHelper::CreatePrefService(pref_registry.get())); -#if !defined(OS_ANDROID) +#if defined(OS_ANDROID) + ::media::SetMediaClientAndroid(new media::CastMediaClientAndroid()); +#else const base::CommandLine* cmd_line = base::CommandLine::ForCurrentProcess(); if (cmd_line->HasSwitch(switches::kEnableCmaMediaPipeline)) - ::media::SetBrowserCdmFactory(new media::CastBrowserCdmFactory); -#endif // !defined(OS_ANDROID) + ::media::SetBrowserCdmFactory(new media::CastBrowserCdmFactory()); +#endif // defined(OS_ANDROID) cast_browser_process_->SetConnectivityChecker( make_scoped_refptr(new ConnectivityChecker( diff --git a/chromecast/browser/cast_content_browser_client.cc b/chromecast/browser/cast_content_browser_client.cc index 01430da..4a07649 100644 --- a/chromecast/browser/cast_content_browser_client.cc +++ b/chromecast/browser/cast_content_browser_client.cc @@ -44,9 +44,6 @@ #if defined(OS_ANDROID) #include "chromecast/browser/android/external_video_surface_container_impl.h" -#endif // defined(OS_ANDROID) - -#if defined(OS_ANDROID) #include "components/crash/browser/crash_dump_manager_android.h" #endif // defined(OS_ANDROID) diff --git a/chromecast/browser/media/cast_media_client_android.cc b/chromecast/browser/media/cast_media_client_android.cc new file mode 100644 index 0000000..696471e --- /dev/null +++ b/chromecast/browser/media/cast_media_client_android.cc @@ -0,0 +1,44 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chromecast/browser/media/cast_media_client_android.h" + +#include "chromecast/media/base/key_systems_common.h" + +namespace chromecast { +namespace media { + +CastMediaClientAndroid::CastMediaClientAndroid() { +} + +CastMediaClientAndroid::~CastMediaClientAndroid() { +} + +void CastMediaClientAndroid::AddKeySystemUUIDMappings(KeySystemUuidMap* map) { + // Note: MediaDrmBridge adds the Widevine UUID mapping automatically. +#if defined(PLAYREADY_CDM_AVAILABLE) + (*map)[kChromecastPlayreadyKeySystem] = playready_delegate_.GetUUID(); +#endif + + auto platform_mappings = GetPlatformKeySystemUUIDMappings(); + for (const auto& mapping : platform_mappings) + map->insert(mapping); +} + +::media::MediaDrmBridgeDelegate* +CastMediaClientAndroid::GetMediaDrmBridgeDelegate( + const ::media::UUID& scheme_uuid) { +#if defined(PLAYREADY_CDM_AVAILABLE) + if (scheme_uuid == playready_delegate_.GetUUID()) + return &playready_delegate_; +#endif + + if (scheme_uuid == widevine_delegate_.GetUUID()) + return &widevine_delegate_; + + return nullptr; +} + +} // namespace media +} // namespace chromecast diff --git a/chromecast/browser/media/cast_media_client_android.h b/chromecast/browser/media/cast_media_client_android.h new file mode 100644 index 0000000..a7aaa1d --- /dev/null +++ b/chromecast/browser/media/cast_media_client_android.h @@ -0,0 +1,41 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROMECAST_BROWSER_MEDIA_CAST_MEDIA_CLIENT_ANDROID_H_ +#define CHROMECAST_BROWSER_MEDIA_CAST_MEDIA_CLIENT_ANDROID_H_ + +#include <map> + +#include "base/macros.h" +#include "chromecast/media/cdm/playready_drm_delegate_android.h" +#include "components/cdm/browser/widevine_drm_delegate_android.h" +#include "media/base/android/media_client_android.h" + +namespace chromecast { +namespace media { + +class CastMediaClientAndroid : public ::media::MediaClientAndroid { + public: + CastMediaClientAndroid(); + ~CastMediaClientAndroid() override; + + private: + // ::media::MediaClientAndroid implementation: + void AddKeySystemUUIDMappings(KeySystemUuidMap* map) override; + ::media::MediaDrmBridgeDelegate* GetMediaDrmBridgeDelegate( + const ::media::UUID& scheme_uuid) override; + +#if defined(PLAYREADY_CDM_AVAILABLE) + PlayreadyDrmDelegateAndroid playready_delegate_; +#endif + + cdm::WidevineDrmDelegateAndroid widevine_delegate_; + + DISALLOW_COPY_AND_ASSIGN(CastMediaClientAndroid); +}; + +} // namespace media +} // namespace chromecast + +#endif // CHROMECAST_BROWSER_MEDIA_CAST_MEDIA_CLIENT_ANDROID_H_ diff --git a/chromecast/chromecast.gyp b/chromecast/chromecast.gyp index a9892ab..f882b8a 100644 --- a/chromecast/chromecast.gyp +++ b/chromecast/chromecast.gyp @@ -189,6 +189,7 @@ 'chromecast_locales.gyp:chromecast_locales_pak', 'chromecast_locales.gyp:chromecast_settings', 'media/media.gyp:media_base', + 'media/media.gyp:media_cdm', '../base/base.gyp:base', '../components/components.gyp:breakpad_host', '../components/components.gyp:cdm_renderer', @@ -239,6 +240,8 @@ 'browser/devtools/remote_debugging_server.h', 'browser/geolocation/cast_access_token_store.cc', 'browser/geolocation/cast_access_token_store.h', + 'browser/media/cast_media_client_android.cc', + 'browser/media/cast_media_client_android.h', 'browser/metrics/cast_metrics_prefs.cc', 'browser/metrics/cast_metrics_prefs.h', 'browser/metrics/cast_metrics_service_client.cc', @@ -319,6 +322,11 @@ '../ui/aura/aura.gyp:aura_test_support', ], }], + ['OS=="android"', { + 'dependencies': [ + '../components/components.gyp:cdm_browser', + ], + }], ], }, { diff --git a/chromecast/media/base/key_systems_common.h b/chromecast/media/base/key_systems_common.h index 4ab8ea7..1537afd 100644 --- a/chromecast/media/base/key_systems_common.h +++ b/chromecast/media/base/key_systems_common.h @@ -6,6 +6,11 @@ #define CHROMECAST_MEDIA_BASE_KEY_SYSTEMS_COMMON_H_ #include <string> +#include <utility> +#include <vector> + +#include "base/compiler_specific.h" +#include "media/base/android/media_client_android.h" namespace chromecast { namespace media { @@ -29,6 +34,13 @@ CastKeySystem GetKeySystemByName(const std::string& key_system_name); // TODO(gunsch): Remove when prefixed EME is removed. CastKeySystem GetPlatformKeySystemByName(const std::string& key_system_name); +// Translates a platform-specific key system string into a CastKeySystem. +// TODO(gunsch): Remove when prefixed EME is removed. +#if defined(OS_ANDROID) +std::vector<::media::MediaClientAndroid::KeySystemUuidMap::value_type> +GetPlatformKeySystemUUIDMappings(); +#endif + } // namespace media } // namespace chromecast diff --git a/chromecast/media/base/key_systems_common_simple.cc b/chromecast/media/base/key_systems_common_simple.cc index e6dbd02..671ce03 100644 --- a/chromecast/media/base/key_systems_common_simple.cc +++ b/chromecast/media/base/key_systems_common_simple.cc @@ -11,5 +11,13 @@ CastKeySystem GetPlatformKeySystemByName(const std::string& key_system_name) { return KEY_SYSTEM_NONE; } +#if defined(OS_ANDROID) +std::vector<::media::MediaClientAndroid::KeySystemUuidMap::value_type> +GetPlatformKeySystemUUIDMappings() { + return std::vector< + ::media::MediaClientAndroid::KeySystemUuidMap::value_type>(); +} +#endif + } // namespace media } // namespace chromecast diff --git a/chromecast/media/cdm/playready_drm_delegate_android.cc b/chromecast/media/cdm/playready_drm_delegate_android.cc new file mode 100644 index 0000000..135fc44 --- /dev/null +++ b/chromecast/media/cdm/playready_drm_delegate_android.cc @@ -0,0 +1,85 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chromecast/media/cdm/playready_drm_delegate_android.h" + +#include "base/logging.h" +#include "media/base/bit_reader.h" + +namespace chromecast { +namespace media { + +const uint8_t kPlayreadyUuid[16] = { + 0x9a, 0x04, 0xf0, 0x79, 0x98, 0x40, 0x42, 0x86, + 0xab, 0x92, 0xe6, 0x5b, 0xe0, 0x88, 0x5f, 0x95}; + +const uint8_t kPlayreadyCustomDataUuid[] = { + 0x2b, 0xf8, 0x66, 0x80, 0xc6, 0xe5, 0x4e, 0x24, + 0xbe, 0x23, 0x0f, 0x81, 0x5a, 0x60, 0x6e, 0xb2}; + +// ASCII "uuid" as an 4-byte integer +const uint32_t kBoxTypeUuid = 1970628964; + +PlayreadyDrmDelegateAndroid::PlayreadyDrmDelegateAndroid() { +} + +PlayreadyDrmDelegateAndroid::~PlayreadyDrmDelegateAndroid() { +} + +const ::media::UUID PlayreadyDrmDelegateAndroid::GetUUID() const { + return ::media::UUID(kPlayreadyUuid, + kPlayreadyUuid + arraysize(kPlayreadyUuid)); +} + +bool PlayreadyDrmDelegateAndroid::OnCreateSession( + const ::media::EmeInitDataType init_data_type, + const std::vector<uint8_t>& init_data, + std::vector<uint8_t>* /* init_data_out */, + std::vector<std::string>* optional_parameters_out) { + if (init_data_type == ::media::EmeInitDataType::CENC) { + ::media::BitReader reader(&init_data[0], init_data.size()); + while (reader.bits_available() > 64) { + uint32_t box_size; + uint32_t box_type; + reader.ReadBits(32, &box_size); + reader.ReadBits(32, &box_type); + int bytes_read = 8; + + if (box_type != kBoxTypeUuid) { + if (box_size < 8 + sizeof(kPlayreadyCustomDataUuid)) { + break; + } + // Box size includes the bytes already consumed + reader.SkipBits((box_size - bytes_read) * 8); + continue; + } + + // "uuid" was found, look for custom data format as per b/10246367 + reader.SkipBits(128); + bytes_read += 16; + if (!memcmp(&init_data[0] + reader.bits_read() / 8, + kPlayreadyCustomDataUuid, 16)) { + reader.SkipBits((box_size - bytes_read) * 8); + continue; + } + + int custom_data_size = box_size - bytes_read; + DCHECK(reader.bits_read() % 8 == 0); + int total_bytes_read = reader.bits_read() / 8; + + optional_parameters_out->clear(); + optional_parameters_out->push_back("PRCustomData"); + optional_parameters_out->push_back( + std::string(&init_data[0] + total_bytes_read, + &init_data[0] + total_bytes_read + custom_data_size)); + reader.SkipBits(custom_data_size * 8); + LOG(INFO) << "Including " << custom_data_size + << " bytes of custom PlayReady data"; + } + } + return true; +} + +} // namespace media +} // namespace chromecast diff --git a/chromecast/media/cdm/playready_drm_delegate_android.h b/chromecast/media/cdm/playready_drm_delegate_android.h new file mode 100644 index 0000000..3a934c45 --- /dev/null +++ b/chromecast/media/cdm/playready_drm_delegate_android.h @@ -0,0 +1,34 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROMECAST_MEDIA_CDM_PLAYREADY_DRM_DELEGATE_ANDROID_H_ +#define CHROMECAST_MEDIA_CDM_PLAYREADY_DRM_DELEGATE_ANDROID_H_ + +#include "base/macros.h" +#include "media/base/android/media_drm_bridge_delegate.h" + +namespace chromecast { +namespace media { + +class PlayreadyDrmDelegateAndroid : public ::media::MediaDrmBridgeDelegate { + public: + PlayreadyDrmDelegateAndroid(); + ~PlayreadyDrmDelegateAndroid() override; + + // ::media::MediaDrmBridgeDelegate implementation: + const ::media::UUID GetUUID() const override; + bool OnCreateSession( + const ::media::EmeInitDataType init_data_type, + const std::vector<uint8_t>& init_data, + std::vector<uint8_t>* init_data_out, + std::vector<std::string>* optional_parameters_out) override; + + private: + DISALLOW_COPY_AND_ASSIGN(PlayreadyDrmDelegateAndroid); +}; + +} // namespace media +} // namespace chromecast + +#endif // CHROMECAST_MEDIA_CDM_PLAYREADY_DRM_DELEGATE_ANDROID_H_ diff --git a/chromecast/media/media.gyp b/chromecast/media/media.gyp index 8b98ec9..3ca9eff 100644 --- a/chromecast/media/media.gyp +++ b/chromecast/media/media.gyp @@ -54,6 +54,14 @@ 'cdm/browser_cdm_cast.cc', 'cdm/browser_cdm_cast.h', ], + 'conditions': [ + ['use_playready==1', { + 'sources': [ + 'cdm/playready_drm_delegate_android.cc', + 'cdm/playready_drm_delegate_android.h', + ], + }], + ], }, { 'target_name': 'cma_base', |