| Index: chromecast/browser/media/cma_message_filter_host.cc
|
| diff --git a/chromecast/browser/media/cma_message_filter_host.cc b/chromecast/browser/media/cma_message_filter_host.cc
|
| index b97f9147a0553efb8ea3ee9d5dd5e9a737f25be1..38ce9206b3266a7d586af507e1164b033f754f2d 100644
|
| --- a/chromecast/browser/media/cma_message_filter_host.cc
|
| +++ b/chromecast/browser/media/cma_message_filter_host.cc
|
| @@ -15,14 +15,11 @@
|
| #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"
|
| @@ -53,86 +50,16 @@ uint64_t GetPipelineCmaId(int process_id, int media_id) {
|
| static_cast<uint64_t>(media_id);
|
| }
|
|
|
| -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;
|
| -}
|
| -
|
| -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));
|
| -
|
| - // Check there is no other entry with the same ID.
|
| - DCHECK(ret.second != false);
|
| -}
|
| -
|
| -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);
|
| -}
|
| -
|
| -void SetCdmOnCmaThread(int render_process_id, int media_id,
|
| - BrowserCdmCast* cdm) {
|
| - MediaPipelineHost* pipeline = GetMediaPipeline(render_process_id, media_id);
|
| - if (!pipeline) {
|
| - LOG(WARNING) << "MediaPipelineHost not alive: " << render_process_id << ","
|
| - << media_id;
|
| - return;
|
| - }
|
| -
|
| - pipeline->SetCdm(cdm);
|
| -}
|
| -
|
| -// BrowserCdm instance must be retrieved/accessed on the UI thread, then
|
| -// passed to MediaPipelineHost on CMA thread.
|
| -void SetCdmOnUiThread(
|
| - int render_process_id,
|
| - int render_frame_id,
|
| - int media_id,
|
| - int cdm_id) {
|
| - DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
|
| -
|
| - content::RenderProcessHost* host =
|
| - content::RenderProcessHost::FromID(render_process_id);
|
| - if (!host) {
|
| - LOG(ERROR) << "RenderProcessHost not alive for ID: " << render_process_id;
|
| - return;
|
| - }
|
| -
|
| - scoped_refptr<::media::MediaKeys> cdm = host->GetCdm(render_frame_id, cdm_id);
|
| - if (!cdm) {
|
| - LOG(WARNING) << "Could not find BrowserCdm (" << render_frame_id << ","
|
| - << cdm_id << ")";
|
| - return;
|
| - }
|
| -
|
| - BrowserCdmCast* browser_cdm_cast =
|
| - static_cast<BrowserCdmCastUi*>(cdm.get())->browser_cdm_cast();
|
| - MediaMessageLoop::GetTaskRunner()->PostTask(
|
| - FROM_HERE, base::Bind(&SetCdmOnCmaThread, render_process_id, media_id,
|
| - base::Unretained(browser_cdm_cast)));
|
| -}
|
| -
|
| } // namespace
|
|
|
| CmaMessageFilterHost::CmaMessageFilterHost(
|
| int render_process_id,
|
| - scoped_refptr<CmaMediaPipelineClient> client)
|
| + scoped_refptr<CmaMediaPipelineClient> client,
|
| + const 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 +108,8 @@ 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(&CmaMessageFilterHost::DestroyMediaPipeline, weak_this_,
|
| + process_id_, media_id, base::Passed(&media_pipeline)));
|
| }
|
| }
|
|
|
| @@ -214,9 +141,8 @@ 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(&CmaMessageFilterHost::SetMediaPipeline, weak_this_,
|
| + process_id_, media_id, media_pipeline_host.get()));
|
| task_runner_->PostTask(
|
| FROM_HERE,
|
| base::Bind(&MediaPipelineHost::Initialize,
|
| @@ -242,8 +168,8 @@ 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(&CmaMessageFilterHost::DestroyMediaPipeline, weak_this_,
|
| + process_id_, media_id, base::Passed(&media_pipeline)));
|
| }
|
|
|
| void CmaMessageFilterHost::SetCdm(int media_id,
|
| @@ -256,7 +182,7 @@ void CmaMessageFilterHost::SetCdm(int media_id,
|
|
|
| content::BrowserThread::PostTask(
|
| content::BrowserThread::UI, FROM_HERE,
|
| - base::Bind(&SetCdmOnUiThread,
|
| + base::Bind(&CmaMessageFilterHost::SetCdmOnUiThread, weak_this_,
|
| process_id_, render_frame_id, media_id, cdm_id));
|
| }
|
|
|
| @@ -530,5 +456,82 @@ void CmaMessageFilterHost::OnNaturalSizeChanged(
|
| Send(new CmaMsg_NaturalSizeChanged(media_id, track_id, size));
|
| }
|
|
|
| +// BrowserCdm instance must be retrieved/accessed on the UI thread, then
|
| +// passed to MediaPipelineHost on CMA thread.
|
| +void CmaMessageFilterHost::SetCdmOnUiThread(int render_process_id,
|
| + int render_frame_id,
|
| + int media_id,
|
| + int cdm_id) {
|
| + DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
|
| +
|
| + content::RenderProcessHost* host =
|
| + content::RenderProcessHost::FromID(render_process_id);
|
| + if (!host) {
|
| + LOG(ERROR) << "RenderProcessHost not alive for ID: " << render_process_id;
|
| + return;
|
| + }
|
| +
|
| + scoped_refptr<::media::MediaKeys> cdm = host->GetCdm(render_frame_id, cdm_id);
|
| + if (!cdm) {
|
| + LOG(WARNING) << "Could not find BrowserCdm (" << render_frame_id << ","
|
| + << cdm_id << ")";
|
| + return;
|
| + }
|
| +
|
| + BrowserCdmCast* browser_cdm_cast =
|
| + static_cast<BrowserCdmCastUi*>(cdm.get())->browser_cdm_cast();
|
| + task_runner_->PostTask(FROM_HERE,
|
| + base::Bind(&CmaMessageFilterHost::SetCdmOnCmaThread,
|
| + weak_this_, render_process_id, media_id,
|
| + base::Unretained(browser_cdm_cast)));
|
| +}
|
| +
|
| +void CmaMessageFilterHost::SetCdmOnCmaThread(int render_process_id,
|
| + int media_id,
|
| + BrowserCdmCast* cdm) {
|
| + DCHECK(task_runner_->BelongsToCurrentThread());
|
| + MediaPipelineHost* pipeline = GetMediaPipeline(render_process_id, media_id);
|
| + if (!pipeline) {
|
| + LOG(WARNING) << "MediaPipelineHost not alive: " << render_process_id << ","
|
| + << media_id;
|
| + return;
|
| + }
|
| +
|
| + pipeline->SetCdm(cdm);
|
| +}
|
| +
|
| +MediaPipelineHost* CmaMessageFilterHost::GetMediaPipeline(int process_id,
|
| + int media_id) {
|
| + DCHECK(task_runner_->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;
|
| +}
|
| +
|
| +void CmaMessageFilterHost::SetMediaPipeline(int process_id,
|
| + int media_id,
|
| + MediaPipelineHost* host) {
|
| + DCHECK(task_runner_->BelongsToCurrentThread());
|
| + std::pair<MediaPipelineCmaMap::iterator, bool> ret =
|
| + g_pipeline_map_cma.Get().insert(
|
| + std::make_pair(GetPipelineCmaId(process_id, media_id), host));
|
| +
|
| + // Check there is no other entry with the same ID.
|
| + DCHECK(ret.second != false);
|
| +}
|
| +
|
| +void CmaMessageFilterHost::DestroyMediaPipeline(
|
| + int process_id,
|
| + int media_id,
|
| + scoped_ptr<MediaPipelineHost> media_pipeline) {
|
| + DCHECK(task_runner_->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);
|
| +}
|
| +
|
| } // namespace media
|
| } // namespace chromecast
|
|
|