| // Copyright 2017 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "media/base/renderer_factory_selector.h" |
| |
| #include "base/logging.h" |
| |
| namespace media { |
| |
| // WARNING: The returned names are used as part of UMA names. Do NOT change |
| // existing return names. |
| std::string GetRendererName(RendererType renderer_type) { |
| switch (renderer_type) { |
| case RendererType::kDefault: |
| return "RendererImpl"; |
| case RendererType::kMojo: |
| return "MojoRenderer"; |
| case RendererType::kMediaPlayer: |
| return "MediaPlayerRenderer"; |
| case RendererType::kCourier: |
| return "CourierRenderer"; |
| case RendererType::kFlinging: |
| return "FlingingRenderer"; |
| case RendererType::kCast: |
| return "CastRenderer"; |
| case RendererType::kMediaFoundation: |
| return "MediaFoundationRenderer"; |
| case RendererType::kFuchsia: |
| return "FuchsiaRenderer"; // RendererImpl by FuchsiaRendererFactory. |
| case RendererType::kRemoting: |
| return "RemotingRenderer"; // media::remoting::Receiver |
| case RendererType::kCastStreaming: |
| return "CastStreamingRenderer"; |
| default: |
| NOTREACHED(); |
| return "RendererType created through invalid static_cast"; |
| } |
| } |
| |
| RendererFactorySelector::RendererFactorySelector() = default; |
| |
| RendererFactorySelector::~RendererFactorySelector() = default; |
| |
| void RendererFactorySelector::AddBaseFactory( |
| RendererType type, |
| std::unique_ptr<RendererFactory> factory) { |
| DVLOG(1) << __func__ << ": type=" << GetRendererName(type); |
| DCHECK(!base_renderer_type_) << "At most one base factory!"; |
| |
| AddFactory(type, std::move(factory)); |
| SetBaseRendererType(type); |
| } |
| |
| void RendererFactorySelector::AddConditionalFactory( |
| RendererType type, |
| std::unique_ptr<RendererFactory> factory, |
| ConditionalFactoryCB callback) { |
| DCHECK(factory); |
| DCHECK(callback); |
| DCHECK(!conditional_factories_.count(type)) |
| << "At most one conditional factory for a given type!"; |
| |
| conditional_factories_.emplace(type, callback); |
| AddFactory(type, std::move(factory)); |
| } |
| |
| void RendererFactorySelector::AddFactory( |
| RendererType type, |
| std::unique_ptr<RendererFactory> factory) { |
| DCHECK(factory); |
| DCHECK(!factories_.count(type)); |
| DVLOG(2) << __func__ << ": type=" << GetRendererName(type); |
| factories_[type] = std::move(factory); |
| } |
| |
| void RendererFactorySelector::SetBaseRendererType(RendererType type) { |
| DCHECK(factories_.count(type)); |
| base_renderer_type_ = type; |
| } |
| |
| RendererType RendererFactorySelector::GetCurrentRendererType() { |
| for (const auto& entry : conditional_factories_) { |
| if (entry.second.Run()) |
| return entry.first; |
| } |
| |
| return base_renderer_type_.value(); |
| } |
| |
| RendererFactory* RendererFactorySelector::GetCurrentFactory() { |
| RendererType current_renderer_type = GetCurrentRendererType(); |
| |
| DVLOG(1) << __func__ << " Selecting factory type: " |
| << GetRendererName(current_renderer_type); |
| auto* current_factory = factories_[current_renderer_type].get(); |
| DCHECK(current_factory); |
| |
| return current_factory; |
| } |
| |
| #if defined(OS_ANDROID) |
| void RendererFactorySelector::StartRequestRemotePlayStateCB( |
| RequestRemotePlayStateChangeCB callback_request) { |
| DCHECK(!remote_play_state_change_cb_request_); |
| remote_play_state_change_cb_request_ = std::move(callback_request); |
| } |
| |
| void RendererFactorySelector::SetRemotePlayStateChangeCB( |
| RemotePlayStateChangeCB callback) { |
| DCHECK(remote_play_state_change_cb_request_); |
| std::move(remote_play_state_change_cb_request_).Run(std::move(callback)); |
| } |
| #endif |
| |
| } // namespace media |