Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(437)

Unified Diff: content/browser/media/cdm/browser_cdm_manager.cc

Issue 1408793009: media: Remove BrowserCdmFactory inferface. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add comment for DEPS change. Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/browser/media/cdm/browser_cdm_manager.h ('k') | content/public/browser/DEPS » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;
}
« no previous file with comments | « content/browser/media/cdm/browser_cdm_manager.h ('k') | content/public/browser/DEPS » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698