From 97de420c168b0650f90c4a05a6e1614cf6684a51 Mon Sep 17 00:00:00 2001 From: xhwang Date: Tue, 25 Nov 2014 00:44:01 -0800 Subject: Handle SetCdm() in media::Renderer. Changes include: - Pass CdmContext in SetCdm(). - Move SetCdm() handling code from EncryptedMediaPlayerSupport to RendererImpl. - Pass in SetDecryptorReadyCB at initialization time instead of construction time for several classes: VRI/ARI/DecoderStream/DecoderSelector. - Prefixed EME uses the same path to SetCdm(). BUG=401264 TEST=All existing tests pass. Review URL: https://codereview.chromium.org/748863002 Cr-Commit-Position: refs/heads/master@{#305605} --- media/base/pipeline.cc | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'media/base/pipeline.cc') diff --git a/media/base/pipeline.cc b/media/base/pipeline.cc index 7534688..79a50fd 100644 --- a/media/base/pipeline.cc +++ b/media/base/pipeline.cc @@ -44,6 +44,7 @@ Pipeline::Pipeline( renderer_ended_(false), text_renderer_ended_(false), demuxer_(NULL), + pending_cdm_context_(nullptr), weak_factory_(this) { media_log_->AddEvent(media_log_->CreatePipelineStateChangedEvent(kCreated)); media_log_->AddEvent( @@ -191,6 +192,13 @@ PipelineStatistics Pipeline::GetStatistics() const { return statistics_; } +void Pipeline::SetCdm(CdmContext* cdm_context, + const CdmAttachedCB& cdm_attached_cb) { + task_runner_->PostTask( + FROM_HERE, base::Bind(&Pipeline::SetCdmTask, weak_factory_.GetWeakPtr(), + cdm_context, cdm_attached_cb)); +} + void Pipeline::SetErrorForTesting(PipelineStatus status) { OnError(status); } @@ -496,6 +504,12 @@ void Pipeline::StartTask() { base::Bind(&Pipeline::OnTextRendererEnded, weak_factory_.GetWeakPtr())); } + // Set CDM early to avoid unnecessary delay in Renderer::Initialize(). + if (pending_cdm_context_) { + renderer_->SetCdm(pending_cdm_context_, base::Bind(&IgnoreCdmAttached)); + pending_cdm_context_ = nullptr; + } + StateTransitionTask(PIPELINE_OK); } @@ -602,6 +616,17 @@ void Pipeline::SeekTask(TimeDelta time, const PipelineStatusCB& seek_cb) { base::Bind(&Pipeline::OnStateTransition, weak_factory_.GetWeakPtr())); } +void Pipeline::SetCdmTask(CdmContext* cdm_context, + const CdmAttachedCB& cdm_attached_cb) { + if (!renderer_) { + pending_cdm_context_ = cdm_context; + cdm_attached_cb.Run(true); + return; + } + + renderer_->SetCdm(cdm_context, cdm_attached_cb); +} + void Pipeline::OnRendererEnded() { DCHECK(task_runner_->BelongsToCurrentThread()); media_log_->AddEvent(media_log_->CreateEvent(MediaLogEvent::ENDED)); -- cgit v1.1