blob: c3d8fa5d371d46de46b38c832408365e75146b0a [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 {
RendererFactorySelector::RendererFactorySelector() = default;
RendererFactorySelector::~RendererFactorySelector() = default;
void RendererFactorySelector::AddBaseFactory(
RendererType type,
std::unique_ptr<RendererFactory> factory) {
DVLOG(1) << __func__ << ": type=" << static_cast<int>(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=" << static_cast<int>(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: "
<< static_cast<int>(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