| Index: content/browser/media/cdm/browser_cdm_manager.cc
|
| diff --git a/content/browser/media/cdm/browser_cdm_manager.cc b/content/browser/media/cdm/browser_cdm_manager.cc
|
| index 6ba327bdfb466c4980a2824a05b31ae20f398e6b..1b7f55225f580935b0518d242ed9cfd0f1ddd4f1 100644
|
| --- a/content/browser/media/cdm/browser_cdm_manager.cc
|
| +++ b/content/browser/media/cdm/browser_cdm_manager.cc
|
| @@ -7,6 +7,7 @@
|
| #include <string>
|
|
|
| #include "base/bind.h"
|
| +#include "base/bind_helpers.h"
|
| #include "base/lazy_instance.h"
|
| #include "base/memory/scoped_ptr.h"
|
| #include "base/task_runner.h"
|
| @@ -19,12 +20,14 @@
|
| #include "content/public/browser/render_process_host.h"
|
| #include "content/public/browser/render_process_host_observer.h"
|
| #include "content/public/browser/web_contents.h"
|
| -#include "media/base/browser_cdm_factory.h"
|
| +#include "media/base/cdm_config.h"
|
| +#include "media/base/cdm_factory.h"
|
| #include "media/base/cdm_promise.h"
|
| #include "media/base/limits.h"
|
|
|
| #if defined(OS_ANDROID)
|
| #include "content/public/common/renderer_preferences.h"
|
| +#include "media/base/android/android_cdm_factory.h"
|
| #endif
|
|
|
| namespace content {
|
| @@ -269,6 +272,20 @@ void BrowserCdmManager::RejectPromise(int render_frame_id,
|
| system_code, error_message));
|
| }
|
|
|
| +media::CdmFactory* BrowserCdmManager::GetCdmFactory() {
|
| + if (!cdm_factory_) {
|
| + // Create a new CdmFactory.
|
| + cdm_factory_ = GetContentClient()->browser()->CreateCdmFactory();
|
| +
|
| +#if defined(OS_ANDROID)
|
| + if (!cdm_factory_)
|
| + cdm_factory_.reset(new media::AndroidCdmFactory());
|
| +#endif
|
| + }
|
| +
|
| + return cdm_factory_.get();
|
| +}
|
| +
|
| void BrowserCdmManager::OnSessionMessage(int render_frame_id,
|
| int cdm_id,
|
| const std::string& session_id,
|
| @@ -327,20 +344,52 @@ void BrowserCdmManager::OnSessionExpirationUpdate(
|
| new_expiry_time));
|
| }
|
|
|
| +// Use a weak pointer here instead of |this| to avoid circular references.
|
| +#define BROWSER_CDM_MANAGER_CB(func, ...) \
|
| + base::Bind(&BrowserCdmManager::func, weak_ptr_factory_.GetWeakPtr(), \
|
| + render_frame_id, cdm_id, ##__VA_ARGS__)
|
| +
|
| void BrowserCdmManager::OnInitializeCdm(
|
| int render_frame_id,
|
| int cdm_id,
|
| uint32_t promise_id,
|
| const CdmHostMsg_InitializeCdm_Params& params) {
|
| + DCHECK(task_runner_->RunsTasksOnCurrentThread());
|
| + DCHECK(!GetCdm(render_frame_id, cdm_id));
|
| +
|
| + scoped_ptr<SimplePromise> promise(new SimplePromise(
|
| + weak_ptr_factory_.GetWeakPtr(), render_frame_id, cdm_id, promise_id));
|
| +
|
| if (params.key_system.size() > media::limits::kMaxKeySystemLength) {
|
| NOTREACHED() << "Invalid key system: " << params.key_system;
|
| - RejectPromise(render_frame_id, cdm_id, promise_id,
|
| - MediaKeys::INVALID_ACCESS_ERROR, 0, "Invalid key system.");
|
| + promise->reject(MediaKeys::INVALID_ACCESS_ERROR, 0, "Invalid key system.");
|
| return;
|
| }
|
|
|
| - AddCdm(render_frame_id, cdm_id, promise_id, params.key_system,
|
| - params.security_origin, params.use_hw_secure_codecs);
|
| + if (!GetCdmFactory()) {
|
| + NOTREACHED() << "CDM not supported.";
|
| + promise->reject(MediaKeys::INVALID_ACCESS_ERROR, 0, "CDM not supported.");
|
| + return;
|
| + }
|
| +
|
| + // The render process makes sure |allow_distinctive_identifier| and
|
| + // |allow_persistent_state| are true. See RenderCdmFactory::Create().
|
| + // TODO(xhwang): Pass |allow_distinctive_identifier| and
|
| + // |allow_persistent_state| from the render process.
|
| + media::CdmConfig cdm_config;
|
| + cdm_config.allow_distinctive_identifier = true;
|
| + cdm_config.allow_persistent_state = true;
|
| + cdm_config.use_hw_secure_codecs = params.use_hw_secure_codecs;
|
| +
|
| + GetCdmFactory()->Create(
|
| + params.key_system, params.security_origin, cdm_config,
|
| + BROWSER_CDM_MANAGER_CB(OnSessionMessage),
|
| + BROWSER_CDM_MANAGER_CB(OnSessionClosed),
|
| + BROWSER_CDM_MANAGER_CB(OnLegacySessionError),
|
| + BROWSER_CDM_MANAGER_CB(OnSessionKeysChange),
|
| + BROWSER_CDM_MANAGER_CB(OnSessionExpirationUpdate),
|
| + BROWSER_CDM_MANAGER_CB(OnCdmCreated, params.security_origin,
|
| + base::Passed(&promise)));
|
| }
|
|
|
| void BrowserCdmManager::OnSetServerCertificate(
|
| @@ -522,34 +571,16 @@ void BrowserCdmManager::OnDestroyCdm(int render_frame_id, int cdm_id) {
|
| RemoveCdm(GetId(render_frame_id, cdm_id));
|
| }
|
|
|
| -// Use a weak pointer here instead of |this| to avoid circular references.
|
| -#define BROWSER_CDM_MANAGER_CB(func) \
|
| - base::Bind(&BrowserCdmManager::func, weak_ptr_factory_.GetWeakPtr(), \
|
| - render_frame_id, cdm_id)
|
| -
|
| -void BrowserCdmManager::AddCdm(int render_frame_id,
|
| - int cdm_id,
|
| - uint32_t promise_id,
|
| - const std::string& key_system,
|
| - const GURL& security_origin,
|
| - bool use_hw_secure_codecs) {
|
| - DCHECK(task_runner_->RunsTasksOnCurrentThread());
|
| - DCHECK(!GetCdm(render_frame_id, cdm_id));
|
| -
|
| - scoped_ptr<SimplePromise> promise(new SimplePromise(
|
| - weak_ptr_factory_.GetWeakPtr(), render_frame_id, cdm_id, promise_id));
|
| -
|
| - scoped_refptr<MediaKeys> cdm(media::CreateBrowserCdm(
|
| - key_system, use_hw_secure_codecs,
|
| - BROWSER_CDM_MANAGER_CB(OnSessionMessage),
|
| - BROWSER_CDM_MANAGER_CB(OnSessionClosed),
|
| - BROWSER_CDM_MANAGER_CB(OnLegacySessionError),
|
| - BROWSER_CDM_MANAGER_CB(OnSessionKeysChange),
|
| - BROWSER_CDM_MANAGER_CB(OnSessionExpirationUpdate)));
|
| -
|
| +void BrowserCdmManager::OnCdmCreated(
|
| + int render_frame_id,
|
| + int cdm_id,
|
| + const GURL& security_origin,
|
| + scoped_ptr<media::SimpleCdmPromise> promise,
|
| + const scoped_refptr<media::MediaKeys>& cdm,
|
| + const std::string& error_message) {
|
| if (!cdm) {
|
| - DVLOG(1) << "failed to create CDM.";
|
| - promise->reject(MediaKeys::INVALID_STATE_ERROR, 0, "Failed to create CDM.");
|
| + DVLOG(1) << "Failed to create CDM: " << error_message;
|
| + promise->reject(MediaKeys::INVALID_STATE_ERROR, 0, error_message);
|
| return;
|
| }
|
|
|
|
|