diff options
author | alokp <alokp@chromium.org> | 2016-03-18 17:33:13 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-03-19 00:34:55 +0000 |
commit | dbe438f9875501d1a4ea64a97d44adcefc438456 (patch) | |
tree | 59aeaa8b86d4483253a6850cf3bc40719b0726e7 /chromecast | |
parent | b0e768eae38f683886600ba869e31054273ebeab (diff) | |
download | chromium_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.cc | 17 | ||||
-rw-r--r-- | chromecast/browser/cast_content_browser_client.h | 5 | ||||
-rw-r--r-- | chromecast/browser/media/cast_browser_cdm_factory.cc | 13 | ||||
-rw-r--r-- | chromecast/browser/media/cast_browser_cdm_factory.h | 11 | ||||
-rw-r--r-- | chromecast/browser/media/cma_message_filter_host.cc | 112 | ||||
-rw-r--r-- | chromecast/browser/media/cma_message_filter_host.h | 4 | ||||
-rw-r--r-- | chromecast/media/base/media_message_loop.h | 2 |
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(); |