blob: 016d2da137bfffdd9e1b78e73743862dad9752bd [file] [log] [blame]
// 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