summaryrefslogtreecommitdiffstats
path: root/chromecast
diff options
context:
space:
mode:
authoralokp <alokp@chromium.org>2016-03-18 17:33:13 -0700
committerCommit bot <commit-bot@chromium.org>2016-03-19 00:34:55 +0000
commitdbe438f9875501d1a4ea64a97d44adcefc438456 (patch)
tree59aeaa8b86d4483253a6850cf3bc40719b0726e7 /chromecast
parentb0e768eae38f683886600ba869e31054273ebeab (diff)
downloadchromium_src-dbe438f9875501d1a4ea64a97d44adcefc438456.zip
chromium_src-dbe438f9875501d1a4ea64a97d44adcefc438456.tar.gz
chromium_src-dbe438f9875501d1a4ea64a97d44adcefc438456.tar.bz2
[chromecast] Start deprecating MediaMessageLoop.
Converted CastBrowserCdmFactory and CmaMessageFilterHost by passing the media task runner in constructor. BUG=594234 Review URL: https://codereview.chromium.org/1814263002 Cr-Commit-Position: refs/heads/master@{#382141}
Diffstat (limited to 'chromecast')
-rw-r--r--chromecast/browser/cast_content_browser_client.cc17
-rw-r--r--chromecast/browser/cast_content_browser_client.h5
-rw-r--r--chromecast/browser/media/cast_browser_cdm_factory.cc13
-rw-r--r--chromecast/browser/media/cast_browser_cdm_factory.h11
-rw-r--r--chromecast/browser/media/cma_message_filter_host.cc112
-rw-r--r--chromecast/browser/media/cma_message_filter_host.h4
-rw-r--r--chromecast/media/base/media_message_loop.h2
7 files changed, 99 insertions, 65 deletions
diff --git a/chromecast/browser/cast_content_browser_client.cc b/chromecast/browser/cast_content_browser_client.cc
index 8827e85..66e08f5 100644
--- a/chromecast/browser/cast_content_browser_client.cc
+++ b/chromecast/browser/cast_content_browser_client.cc
@@ -117,8 +117,8 @@ CastContentBrowserClient::GetCmaMediaPipelineClient() {
void CastContentBrowserClient::ProcessExiting() {
// Finalize CastMediaShlib on media thread to ensure it's not accessed
// after Finalize.
- media::MediaMessageLoop::GetTaskRunner()->PostTask(
- FROM_HERE, base::Bind(&media::CastMediaShlib::Finalize));
+ GetMediaTaskRunner()->PostTask(FROM_HERE,
+ base::Bind(&media::CastMediaShlib::Finalize));
}
void CastContentBrowserClient::SetMetricsClientId(
@@ -145,8 +145,8 @@ void CastContentBrowserClient::RenderProcessWillLaunch(
content::RenderProcessHost* host) {
#if !defined(OS_ANDROID)
scoped_refptr<media::CmaMessageFilterHost> cma_message_filter(
- new media::CmaMessageFilterHost(host->GetID(),
- GetCmaMediaPipelineClient()));
+ new media::CmaMessageFilterHost(
+ host->GetID(), GetCmaMediaPipelineClient(), GetMediaTaskRunner()));
host->AddFilter(cma_message_filter.get());
#endif // !defined(OS_ANDROID)
@@ -161,6 +161,12 @@ void CastContentBrowserClient::RenderProcessWillLaunch(
base::Unretained(this), host->GetID()));
}
+scoped_refptr<base::SingleThreadTaskRunner>
+CastContentBrowserClient::GetMediaTaskRunner() {
+ // TODO(alokp): Obtain task runner from a local thread or mojo media app.
+ return media::MediaMessageLoop::GetTaskRunner();
+}
+
#if !defined(OS_ANDROID)
scoped_refptr<media::CmaMediaPipelineClient>
CastContentBrowserClient::CreateCmaMediaPipelineClient() {
@@ -422,7 +428,8 @@ void CastContentBrowserClient::GetAdditionalMappedFilesForChildProcess(
scoped_ptr<::media::CdmFactory> CastContentBrowserClient::CreateCdmFactory() {
if (base::CommandLine::ForCurrentProcess()->HasSwitch(
switches::kEnableCmaMediaPipeline)) {
- return make_scoped_ptr(new media::CastBrowserCdmFactory());
+ return make_scoped_ptr(
+ new media::CastBrowserCdmFactory(GetMediaTaskRunner()));
}
return nullptr;
diff --git a/chromecast/browser/cast_content_browser_client.h b/chromecast/browser/cast_content_browser_client.h
index 74ead6a..de03fb2 100644
--- a/chromecast/browser/cast_content_browser_client.h
+++ b/chromecast/browser/cast_content_browser_client.h
@@ -159,6 +159,11 @@ class CastContentBrowserClient : public content::ContentBrowserClient {
protected:
CastContentBrowserClient();
+ // Returns the task runner that must be used for media IO.
+ // TODO(alokp): We might need to make it public as we convert more callsites
+ // using MediaMessageLoop directly.
+ scoped_refptr<base::SingleThreadTaskRunner> GetMediaTaskRunner();
+
#if !defined(OS_ANDROID)
virtual scoped_refptr<media::CmaMediaPipelineClient>
CreateCmaMediaPipelineClient();
diff --git a/chromecast/browser/media/cast_browser_cdm_factory.cc b/chromecast/browser/media/cast_browser_cdm_factory.cc
index c657a69..c04ef522 100644
--- a/chromecast/browser/media/cast_browser_cdm_factory.cc
+++ b/chromecast/browser/media/cast_browser_cdm_factory.cc
@@ -7,7 +7,6 @@
#include "base/bind.h"
#include "base/location.h"
#include "base/single_thread_task_runner.h"
-#include "chromecast/media/base/media_message_loop.h"
#include "chromecast/media/cdm/browser_cdm_cast.h"
#include "media/base/bind_to_current_loop.h"
#include "media/base/cdm_config.h"
@@ -16,6 +15,13 @@
namespace chromecast {
namespace media {
+CastBrowserCdmFactory::CastBrowserCdmFactory(
+ scoped_refptr<base::SingleThreadTaskRunner> task_runner)
+ : task_runner_(task_runner) {
+ DCHECK(task_runner_);
+}
+CastBrowserCdmFactory::~CastBrowserCdmFactory() {}
+
void CastBrowserCdmFactory::Create(
const std::string& key_system,
const GURL& security_origin,
@@ -48,7 +54,7 @@ void CastBrowserCdmFactory::Create(
return;
}
- MediaMessageLoop::GetTaskRunner()->PostTask(
+ task_runner_->PostTask(
FROM_HERE,
base::Bind(&BrowserCdmCast::Initialize,
base::Unretained(browser_cdm.get()),
@@ -58,8 +64,7 @@ void CastBrowserCdmFactory::Create(
::media::BindToCurrentLoop(session_keys_change_cb),
::media::BindToCurrentLoop(session_expiration_update_cb)));
- bound_cdm_created_cb.Run(
- new BrowserCdmCastUi(browser_cdm, MediaMessageLoop::GetTaskRunner()), "");
+ bound_cdm_created_cb.Run(new BrowserCdmCastUi(browser_cdm, task_runner_), "");
}
scoped_refptr<BrowserCdmCast> CastBrowserCdmFactory::CreatePlatformBrowserCdm(
diff --git a/chromecast/browser/media/cast_browser_cdm_factory.h b/chromecast/browser/media/cast_browser_cdm_factory.h
index 80e0ba0..70fd9a4 100644
--- a/chromecast/browser/media/cast_browser_cdm_factory.h
+++ b/chromecast/browser/media/cast_browser_cdm_factory.h
@@ -10,6 +10,10 @@
#include "media/base/cdm_factory.h"
#include "media/base/media_keys.h"
+namespace base {
+class SingleThreadTaskRunner;
+} // namespace base
+
namespace chromecast {
namespace media {
@@ -17,8 +21,10 @@ class BrowserCdmCast;
class CastBrowserCdmFactory : public ::media::CdmFactory {
public:
- CastBrowserCdmFactory() {}
- ~CastBrowserCdmFactory() override {};
+ // CDM factory will use |task_runner| to initialize the CDM.
+ explicit CastBrowserCdmFactory(
+ scoped_refptr<base::SingleThreadTaskRunner> task_runner);
+ ~CastBrowserCdmFactory() override;
// ::media::CdmFactory implementation:
void Create(
@@ -37,6 +43,7 @@ class CastBrowserCdmFactory : public ::media::CdmFactory {
const CastKeySystem& cast_key_system);
private:
+ scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
DISALLOW_COPY_AND_ASSIGN(CastBrowserCdmFactory);
};
diff --git a/chromecast/browser/media/cma_message_filter_host.cc b/chromecast/browser/media/cma_message_filter_host.cc
index b97f914..e520e249 100644
--- a/chromecast/browser/media/cma_message_filter_host.cc
+++ b/chromecast/browser/media/cma_message_filter_host.cc
@@ -12,17 +12,15 @@
#include "base/memory/scoped_ptr.h"
#include "base/memory/shared_memory.h"
#include "base/sync_socket.h"
+#include "base/threading/thread_checker.h"
#include "chromecast/browser/media/cma_media_pipeline_client.h"
#include "chromecast/browser/media/media_pipeline_host.h"
#include "chromecast/common/media/cma_messages.h"
-#include "chromecast/media/base/media_message_loop.h"
#include "chromecast/media/cdm/browser_cdm_cast.h"
#include "chromecast/media/cma/pipeline/av_pipeline_client.h"
#include "chromecast/media/cma/pipeline/media_pipeline_client.h"
#include "chromecast/media/cma/pipeline/video_pipeline_client.h"
-#include "chromecast/public/cast_media_shlib.h"
#include "chromecast/public/graphics_types.h"
-#include "chromecast/public/video_plane.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/render_process_host.h"
#include "media/base/bind_to_current_loop.h"
@@ -40,57 +38,62 @@ namespace {
const size_t kMaxSharedMem = 8 * 1024 * 1024;
-typedef std::map<uint64_t, MediaPipelineHost*> MediaPipelineCmaMap;
-
// Map of MediaPipelineHost instances that is accessed only from the CMA thread.
// The existence of a MediaPipelineHost* in this map implies that the instance
// is still valid.
-base::LazyInstance<MediaPipelineCmaMap> g_pipeline_map_cma =
- LAZY_INSTANCE_INITIALIZER;
+class MediaPipelineCmaMap {
+ public:
+ MediaPipelineCmaMap() { thread_checker_.DetachFromThread(); }
+
+ MediaPipelineHost* GetMediaPipeline(int process_id, int media_id) {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ uint64_t pipeline_id = GetPipelineId(process_id, media_id);
+ auto it = id_pipeline_map_.find(pipeline_id);
+ return it != id_pipeline_map_.end() ? it->second : nullptr;
+ }
-uint64_t GetPipelineCmaId(int process_id, int media_id) {
- return (static_cast<uint64_t>(process_id) << 32) +
- static_cast<uint64_t>(media_id);
-}
+ void SetMediaPipeline(int process_id, int media_id, MediaPipelineHost* host) {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ uint64_t pipeline_id = GetPipelineId(process_id, media_id);
+ auto ret = id_pipeline_map_.insert(std::make_pair(pipeline_id, host));
-MediaPipelineHost* GetMediaPipeline(int process_id, int media_id) {
- DCHECK(MediaMessageLoop::GetTaskRunner()->BelongsToCurrentThread());
- MediaPipelineCmaMap::iterator it =
- g_pipeline_map_cma.Get().find(GetPipelineCmaId(process_id, media_id));
- if (it == g_pipeline_map_cma.Get().end())
- return nullptr;
- return it->second;
-}
+ // Check there is no other entry with the same ID.
+ DCHECK(ret.second != false);
+ }
-void SetMediaPipeline(int process_id, int media_id, MediaPipelineHost* host) {
- DCHECK(MediaMessageLoop::GetTaskRunner()->BelongsToCurrentThread());
- std::pair<MediaPipelineCmaMap::iterator, bool> ret =
- g_pipeline_map_cma.Get().insert(
- std::make_pair(GetPipelineCmaId(process_id, media_id), host));
+ void DestroyMediaPipeline(int process_id,
+ int media_id,
+ scoped_ptr<MediaPipelineHost> media_pipeline) {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ uint64_t pipeline_id = GetPipelineId(process_id, media_id);
+ auto it = id_pipeline_map_.find(pipeline_id);
+ if (it != id_pipeline_map_.end())
+ id_pipeline_map_.erase(it);
+ }
- // Check there is no other entry with the same ID.
- DCHECK(ret.second != false);
-}
+ private:
+ uint64_t GetPipelineId(int process_id, int media_id) {
+ return (static_cast<uint64_t>(process_id) << 32) +
+ static_cast<uint64_t>(media_id);
+ }
-void DestroyMediaPipeline(int process_id,
- int media_id,
- scoped_ptr<MediaPipelineHost> media_pipeline) {
- DCHECK(MediaMessageLoop::GetTaskRunner()->BelongsToCurrentThread());
- MediaPipelineCmaMap::iterator it =
- g_pipeline_map_cma.Get().find(GetPipelineCmaId(process_id, media_id));
- if (it != g_pipeline_map_cma.Get().end())
- g_pipeline_map_cma.Get().erase(it);
-}
+ base::ThreadChecker thread_checker_;
+ std::map<uint64_t, MediaPipelineHost*> id_pipeline_map_;
+};
-void SetCdmOnCmaThread(int render_process_id, int media_id,
+base::LazyInstance<MediaPipelineCmaMap> g_pipeline_map =
+ LAZY_INSTANCE_INITIALIZER;
+
+void SetCdmOnCmaThread(int render_process_id,
+ int media_id,
BrowserCdmCast* cdm) {
- MediaPipelineHost* pipeline = GetMediaPipeline(render_process_id, media_id);
+ MediaPipelineHost* pipeline =
+ g_pipeline_map.Get().GetMediaPipeline(render_process_id, media_id);
if (!pipeline) {
LOG(WARNING) << "MediaPipelineHost not alive: " << render_process_id << ","
<< media_id;
return;
}
-
pipeline->SetCdm(cdm);
}
@@ -100,7 +103,8 @@ void SetCdmOnUiThread(
int render_process_id,
int render_frame_id,
int media_id,
- int cdm_id) {
+ int cdm_id,
+ scoped_refptr<base::SingleThreadTaskRunner> cma_task_runner) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
content::RenderProcessHost* host =
@@ -119,7 +123,7 @@ void SetCdmOnUiThread(
BrowserCdmCast* browser_cdm_cast =
static_cast<BrowserCdmCastUi*>(cdm.get())->browser_cdm_cast();
- MediaMessageLoop::GetTaskRunner()->PostTask(
+ cma_task_runner->PostTask(
FROM_HERE, base::Bind(&SetCdmOnCmaThread, render_process_id, media_id,
base::Unretained(browser_cdm_cast)));
}
@@ -128,11 +132,12 @@ void SetCdmOnUiThread(
CmaMessageFilterHost::CmaMessageFilterHost(
int render_process_id,
- scoped_refptr<CmaMediaPipelineClient> client)
+ scoped_refptr<CmaMediaPipelineClient> client,
+ scoped_refptr<base::SingleThreadTaskRunner> task_runner)
: content::BrowserMessageFilter(CastMediaMsgStart),
process_id_(render_process_id),
client_(client),
- task_runner_(MediaMessageLoop::GetTaskRunner()),
+ task_runner_(task_runner),
weak_factory_(this) {
weak_this_ = weak_factory_.GetWeakPtr();
}
@@ -181,8 +186,9 @@ void CmaMessageFilterHost::DeleteEntries() {
media_pipelines_.erase(it++);
task_runner_->PostTask(
FROM_HERE,
- base::Bind(&DestroyMediaPipeline, process_id_, media_id,
- base::Passed(&media_pipeline)));
+ base::Bind(&MediaPipelineCmaMap::DestroyMediaPipeline,
+ base::Unretained(g_pipeline_map.Pointer()), process_id_,
+ media_id, base::Passed(&media_pipeline)));
}
}
@@ -214,9 +220,9 @@ void CmaMessageFilterHost::CreateMedia(int media_id, LoadType load_type) {
&CmaMediaPipelineClient::OnMediaPipelineBackendDestroyed, client_);
task_runner_->PostTask(
- FROM_HERE,
- base::Bind(&SetMediaPipeline,
- process_id_, media_id, media_pipeline_host.get()));
+ FROM_HERE, base::Bind(&MediaPipelineCmaMap::SetMediaPipeline,
+ base::Unretained(g_pipeline_map.Pointer()),
+ process_id_, media_id, media_pipeline_host.get()));
task_runner_->PostTask(
FROM_HERE,
base::Bind(&MediaPipelineHost::Initialize,
@@ -242,8 +248,9 @@ void CmaMessageFilterHost::DestroyMedia(int media_id) {
media_pipelines_.erase(it);
task_runner_->PostTask(
FROM_HERE,
- base::Bind(&DestroyMediaPipeline, process_id_, media_id,
- base::Passed(&media_pipeline)));
+ base::Bind(&MediaPipelineCmaMap::DestroyMediaPipeline,
+ base::Unretained(g_pipeline_map.Pointer()), process_id_,
+ media_id, base::Passed(&media_pipeline)));
}
void CmaMessageFilterHost::SetCdm(int media_id,
@@ -256,11 +263,10 @@ void CmaMessageFilterHost::SetCdm(int media_id,
content::BrowserThread::PostTask(
content::BrowserThread::UI, FROM_HERE,
- base::Bind(&SetCdmOnUiThread,
- process_id_, render_frame_id, media_id, cdm_id));
+ base::Bind(&SetCdmOnUiThread, process_id_, render_frame_id, media_id,
+ cdm_id, task_runner_));
}
-
void CmaMessageFilterHost::CreateAvPipe(
int media_id, TrackId track_id, size_t shared_mem_size) {
DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
diff --git a/chromecast/browser/media/cma_message_filter_host.h b/chromecast/browser/media/cma_message_filter_host.h
index 0a19fc2..c2b6457 100644
--- a/chromecast/browser/media/cma_message_filter_host.h
+++ b/chromecast/browser/media/cma_message_filter_host.h
@@ -38,6 +38,7 @@ class VideoDecoderConfig;
namespace chromecast {
namespace media {
+class BrowserCdmCast;
class MediaPipelineBackend;
struct MediaPipelineDeviceParams;
class MediaPipelineHost;
@@ -51,7 +52,8 @@ class CmaMessageFilterHost
const MediaPipelineDeviceParams&)> CreateBackendCB;
CmaMessageFilterHost(int render_process_id,
- scoped_refptr<CmaMediaPipelineClient> client);
+ scoped_refptr<CmaMediaPipelineClient> client,
+ scoped_refptr<base::SingleThreadTaskRunner> task_runner);
// content::BrowserMessageFilter implementation:
void OnChannelClosing() override;
diff --git a/chromecast/media/base/media_message_loop.h b/chromecast/media/base/media_message_loop.h
index c52e4df..4f4631b 100644
--- a/chromecast/media/base/media_message_loop.h
+++ b/chromecast/media/base/media_message_loop.h
@@ -17,6 +17,8 @@ class Thread;
namespace chromecast {
namespace media {
+// DEPRECATED: This is being deprecated.
+// Get the media task runner from CastContentBrowserClient::GetMediaTaskRunner.
class MediaMessageLoop {
public:
static scoped_refptr<base::SingleThreadTaskRunner> GetTaskRunner();