blob: c57943483a1d7784fd4741979553b50de6012601 [file] [log] [blame]
tguilbert70d2a00a2017-04-25 00:30:441// Copyright 2017 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef MEDIA_BASE_RENDERER_FACTORY_SELECTOR_H_
6#define MEDIA_BASE_RENDERER_FACTORY_SELECTOR_H_
7
tguilbert16d9d7d2017-05-05 03:24:428#include "base/callback.h"
tguilbert70d2a00a2017-04-25 00:30:449#include "base/optional.h"
10#include "media/base/renderer_factory.h"
11
12namespace media {
13
14// RendererFactorySelector owns RendererFactory instances used within WMPI.
15// Its purpose is to aggregate the signals and centralize the logic behind
16// choosing which RendererFactory should be used when creating a new Renderer.
17class MEDIA_EXPORT RendererFactorySelector {
18 public:
tguilbert16d9d7d2017-05-05 03:24:4219 using QueryIsRemotingActiveCB = base::Callback<bool()>;
20
tguilbert70d2a00a2017-04-25 00:30:4421 enum FactoryType {
22 DEFAULT, // DefaultRendererFactory.
23 MOJO, // MojoRendererFactory.
24 MEDIA_PLAYER, // MediaPlayerRendererClientFactory.
tguilbert16d9d7d2017-05-05 03:24:4225 COURIER, // CourierRendererFactory.
26 FACTORY_TYPE_MAX = COURIER,
tguilbert70d2a00a2017-04-25 00:30:4427 };
28
29 RendererFactorySelector();
30 ~RendererFactorySelector();
31
32 // NOTE: There should be at most one factory per factory type.
33 void AddFactory(FactoryType type, std::unique_ptr<RendererFactory> factory);
34
35 // Sets the base factory to be returned, when there are no signals telling us
36 // to select any specific factory.
37 // NOTE: |type| can be different than FactoryType::DEFAULT. DEFAULT is used to
38 // identify the DefaultRendererFactory, not to indicate that a factory should
39 // be used by default.
40 void SetBaseFactoryType(FactoryType type);
41
tguilbert75e2bf62017-04-26 20:13:1242 // Updates |current_factory_| if necessary, and returns its value.
43 // NOTE: SetBaseFactoryType() must be called before calling this method.
tguilbert70d2a00a2017-04-25 00:30:4444 RendererFactory* GetCurrentFactory();
45
tguilbert75e2bf62017-04-26 20:13:1246#if defined(OS_ANDROID)
47 // Sets whether we should be using the MEDIA_PLAYER factory instead of the
48 // base factory.
49 void SetUseMediaPlayer(bool use_media_player);
50#endif
51
tguilbert16d9d7d2017-05-05 03:24:4252 // Sets the callback to query whether we are currently remoting, and if we
53 // should temporarily use the COURIER factory.
54 void SetQueryIsRemotingActiveCB(
55 QueryIsRemotingActiveCB query_is_remoting_active_cb);
tguilbert75e2bf62017-04-26 20:13:1256
tguilbert16d9d7d2017-05-05 03:24:4257 private:
tguilbert75e2bf62017-04-26 20:13:1258 bool use_media_player_ = false;
59
tguilbert16d9d7d2017-05-05 03:24:4260 QueryIsRemotingActiveCB query_is_remoting_active_cb_;
tguilbert75e2bf62017-04-26 20:13:1261
tguilbert70d2a00a2017-04-25 00:30:4462 base::Optional<FactoryType> base_factory_type_;
63 std::unique_ptr<RendererFactory> factories_[FACTORY_TYPE_MAX + 1];
64 DISALLOW_COPY_AND_ASSIGN(RendererFactorySelector);
65};
66
67} // namespace media
68
69#endif // MEDIA_BASE_RENDERER_FACTORY_H_