summaryrefslogtreecommitdiffstats
path: root/chromecast
diff options
context:
space:
mode:
authorgunsch <gunsch@chromium.org>2015-04-29 20:58:45 -0700
committerCommit bot <commit-bot@chromium.org>2015-04-30 03:59:13 +0000
commit2288c539cc227ec262be28c4b684ff38527f7768 (patch)
tree12cf88619fe8fbc979a2f0aa1f0722ff2741a500 /chromecast
parentd92456f94d7d2563f3b1bd46e6b77d9c9eadd633 (diff)
downloadchromium_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/DEPS1
-rw-r--r--chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastBrowserHelper.java8
-rw-r--r--chromecast/browser/cast_browser_main_parts.cc11
-rw-r--r--chromecast/browser/cast_content_browser_client.cc3
-rw-r--r--chromecast/browser/media/cast_media_client_android.cc44
-rw-r--r--chromecast/browser/media/cast_media_client_android.h41
-rw-r--r--chromecast/chromecast.gyp8
-rw-r--r--chromecast/media/base/key_systems_common.h12
-rw-r--r--chromecast/media/base/key_systems_common_simple.cc8
-rw-r--r--chromecast/media/cdm/playready_drm_delegate_android.cc85
-rw-r--r--chromecast/media/cdm/playready_drm_delegate_android.h34
-rw-r--r--chromecast/media/media.gyp8
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',