Chromium Code Reviews| Index: chromecast/media/cma/pipeline/av_pipeline_impl.cc |
| diff --git a/chromecast/media/cma/pipeline/av_pipeline_impl.cc b/chromecast/media/cma/pipeline/av_pipeline_impl.cc |
| index 2e2da54facea855610ce4925b4979c3927d82fbb..a90881cca58d9863dcbdc63cfb83acafd675cced 100644 |
| --- a/chromecast/media/cma/pipeline/av_pipeline_impl.cc |
| +++ b/chromecast/media/cma/pipeline/av_pipeline_impl.cc |
| @@ -58,8 +58,11 @@ AvPipelineImpl::~AvPipelineImpl() { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| media_component_device_->SetClient(MediaComponentDevice::Client()); |
| - if (media_keys_ && media_keys_callback_id_ != kNoCallbackId) |
| - media_keys_->UnregisterPlayer(media_keys_callback_id_); |
| + { |
| + base::AutoLock lock(media_keys_lock_); |
| + if (media_keys_ && media_keys_callback_id_ != kNoCallbackId) |
| + media_keys_->UnregisterPlayer(media_keys_callback_id_); |
| + } |
| } |
| void AvPipelineImpl::TransitionToState(State state) { |
| @@ -183,15 +186,18 @@ void AvPipelineImpl::SetCdm(BrowserCdmCast* media_keys) { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| DCHECK(media_keys); |
| - if (media_keys_ && media_keys_callback_id_ != kNoCallbackId) |
| - media_keys_->UnregisterPlayer(media_keys_callback_id_); |
| - |
| - media_keys_ = media_keys; |
| - media_keys_callback_id_ = media_keys_->RegisterPlayer( |
| - ::media::BindToCurrentLoop( |
| - base::Bind(&AvPipelineImpl::OnCdmStateChanged, weak_this_)), |
| - ::media::BindToCurrentLoop( |
| - base::Bind(&AvPipelineImpl::OnCdmDestroyed, weak_this_))); |
| + { |
| + base::AutoLock lock(media_keys_lock_); |
| + if (media_keys_ && media_keys_callback_id_ != kNoCallbackId) |
| + media_keys_->UnregisterPlayer(media_keys_callback_id_); |
| + |
| + media_keys_ = media_keys; |
| + media_keys_callback_id_ = media_keys_->RegisterPlayer( |
| + ::media::BindToCurrentLoop( |
| + base::Bind(&AvPipelineImpl::OnCdmStateChanged, weak_this_)), |
| + // CDM destruction requires immediate update; don't change threads. |
|
lcwu1
2015/03/03 18:52:35
A more detailed explanation of why the unset_cb sh
gunsch
2015/03/03 23:04:19
Done.
|
| + base::Bind(&AvPipelineImpl::OnCdmDestroyed, weak_this_)); |
| + } |
| } |
| void AvPipelineImpl::OnEos() { |
| @@ -262,12 +268,15 @@ void AvPipelineImpl::ProcessPendingBuffer() { |
| // Verify that CDM has the key ID. |
| // Should not send the frame if the key ID is not available yet. |
| std::string key_id(pending_buffer_->decrypt_config()->key_id()); |
| - if (!media_keys_) { |
| - CMALOG(kLogControl) << "No CDM for frame: pts=" |
| - << pending_buffer_->timestamp().InMilliseconds(); |
| - return; |
| + { |
| + base::AutoLock lock(media_keys_lock_); |
| + if (!media_keys_) { |
| + CMALOG(kLogControl) << "No CDM for frame: pts=" |
| + << pending_buffer_->timestamp().InMilliseconds(); |
| + return; |
| + } |
| + decrypt_context = media_keys_->GetDecryptContext(key_id); |
| } |
| - decrypt_context = media_keys_->GetDecryptContext(key_id); |
| if (!decrypt_context.get()) { |
| CMALOG(kLogControl) << "frame(pts=" |
| << pending_buffer_->timestamp().InMilliseconds() |
| @@ -329,7 +338,10 @@ void AvPipelineImpl::OnCdmStateChanged() { |
| void AvPipelineImpl::OnCdmDestroyed() { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
|
lcwu1
2015/03/03 18:52:35
Now that this function can be called from the main
gunsch
2015/03/03 23:04:19
Done.
|
| - media_keys_ = NULL; |
| + { |
| + base::AutoLock lock(media_keys_lock_); |
| + media_keys_ = NULL; |
| + } |
| } |
| void AvPipelineImpl::OnFrameBuffered( |