Chromium Code Reviews| Index: chromecast/media/cma/backend/media_pipeline_backend_manager.cc |
| diff --git a/chromecast/media/cma/backend/media_pipeline_backend_manager.cc b/chromecast/media/cma/backend/media_pipeline_backend_manager.cc |
| index 49227383e414f2b37af46db4d778c4db3cec5e49..2f3d06148dcd8118c9c512fa12e9f84c5c16d1dd 100644 |
| --- a/chromecast/media/cma/backend/media_pipeline_backend_manager.cc |
| +++ b/chromecast/media/cma/backend/media_pipeline_backend_manager.cc |
| @@ -15,8 +15,9 @@ namespace media { |
| MediaPipelineBackendManager::MediaPipelineBackendManager( |
| scoped_refptr<base::SingleThreadTaskRunner> media_task_runner) |
| - : media_task_runner_(std::move(media_task_runner)) { |
| -} |
| + : media_task_runner_(std::move(media_task_runner)), |
| + audio_decoder_count_(0), |
| + video_decoder_count_(0) {} |
| MediaPipelineBackendManager::~MediaPipelineBackendManager() { |
| } |
| @@ -38,17 +39,55 @@ MediaPipelineBackendManager::CreateMediaPipelineBackend( |
| base::WrapUnique( |
| media::CastMediaShlib::CreateMediaPipelineBackend(params)), |
| stream_type, GetVolumeMultiplier(stream_type), this)); |
| - media_pipeline_backends_.push_back(backend_ptr.get()); |
| + media_pipeline_backends_[backend_ptr.get()] = BackendInfo(); |
| return backend_ptr; |
| } |
| +bool MediaPipelineBackendManager::CanCreateAudioDecoder( |
|
alokp
2016/07/22 04:59:46
The function name is a bit weird. In addition to r
halliwell
2016/07/22 16:34:50
Agreed :) I moved the count into the wrapper (act
|
| + MediaPipelineBackend* backend) { |
| + DCHECK(media_task_runner_->BelongsToCurrentThread()); |
| + |
| + if (audio_decoder_count_ >= 2) { |
| + LOG(WARNING) << "Unable to create AudioDecoder: global limit exceeded"; |
| + return false; |
| + } |
| + |
| + auto itr = media_pipeline_backends_.find(backend); |
| + DCHECK(itr != media_pipeline_backends_.end()); |
| + itr->second.audio_decoder_count_++; |
| + audio_decoder_count_++; |
| + |
| + return true; |
| +} |
| + |
| +bool MediaPipelineBackendManager::CanCreateVideoDecoder( |
| + MediaPipelineBackend* backend) { |
| + DCHECK(media_task_runner_->BelongsToCurrentThread()); |
| + |
| + if (video_decoder_count_ >= 1) { |
| + LOG(WARNING) << "Unable to create VideoDecoder: global limit exceeded"; |
| + return false; |
| + } |
| + |
| + auto itr = media_pipeline_backends_.find(backend); |
| + DCHECK(itr != media_pipeline_backends_.end()); |
| + itr->second.video_decoder_count_++; |
| + video_decoder_count_++; |
| + |
| + return true; |
| +} |
| + |
| void MediaPipelineBackendManager::OnMediaPipelineBackendDestroyed( |
| - const MediaPipelineBackend* backend) { |
| + MediaPipelineBackend* backend) { |
| DCHECK(media_task_runner_->BelongsToCurrentThread()); |
| - media_pipeline_backends_.erase( |
| - std::remove(media_pipeline_backends_.begin(), |
| - media_pipeline_backends_.end(), backend), |
| - media_pipeline_backends_.end()); |
| + |
| + auto itr = media_pipeline_backends_.find(backend); |
| + DCHECK(itr != media_pipeline_backends_.end()); |
| + |
| + audio_decoder_count_ -= itr->second.audio_decoder_count_; |
| + video_decoder_count_ -= itr->second.video_decoder_count_; |
| + |
| + media_pipeline_backends_.erase(itr); |
| } |
| void MediaPipelineBackendManager::SetVolumeMultiplier(int stream_type, |
| @@ -61,7 +100,7 @@ void MediaPipelineBackendManager::SetVolumeMultiplier(int stream_type, |
| for (auto it = media_pipeline_backends_.begin(); |
| it != media_pipeline_backends_.end(); it++) { |
| MediaPipelineBackendWrapper* wrapper = |
| - static_cast<MediaPipelineBackendWrapper*>(*it); |
| + static_cast<MediaPipelineBackendWrapper*>(it->first); |
| if (wrapper->GetStreamType() == stream_type) |
| wrapper->SetStreamTypeVolume(volume); |
| } |