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); |
} |