renderer_factory_selector.cc 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. // 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. #include "media/base/renderer_factory_selector.h"
  5. #include "base/logging.h"
  6. #include "build/build_config.h"
  7. namespace media {
  8. // WARNING: The returned names are used as part of UMA names. Do NOT change
  9. // existing return names.
  10. std::string GetRendererName(RendererType renderer_type) {
  11. switch (renderer_type) {
  12. case RendererType::kDefault:
  13. return "RendererImpl";
  14. case RendererType::kMojo:
  15. return "MojoRenderer";
  16. case RendererType::kMediaPlayer:
  17. return "MediaPlayerRenderer";
  18. case RendererType::kCourier:
  19. return "CourierRenderer";
  20. case RendererType::kFlinging:
  21. return "FlingingRenderer";
  22. case RendererType::kCast:
  23. return "CastRenderer";
  24. case RendererType::kMediaFoundation:
  25. return "MediaFoundationRenderer";
  26. case RendererType::kRemoting:
  27. return "RemotingRenderer"; // media::remoting::Receiver
  28. case RendererType::kCastStreaming:
  29. return "CastStreamingRenderer";
  30. case RendererType::kContentEmbedderDefined:
  31. return "EmbedderDefined";
  32. default:
  33. NOTREACHED();
  34. return "RendererType created through invalid static_cast";
  35. }
  36. }
  37. RendererFactorySelector::RendererFactorySelector() = default;
  38. RendererFactorySelector::~RendererFactorySelector() = default;
  39. void RendererFactorySelector::AddBaseFactory(
  40. RendererType type,
  41. std::unique_ptr<RendererFactory> factory) {
  42. DVLOG(1) << __func__ << ": type=" << GetRendererName(type);
  43. DCHECK(!base_renderer_type_) << "At most one base factory!";
  44. AddFactory(type, std::move(factory));
  45. SetBaseRendererType(type);
  46. }
  47. void RendererFactorySelector::AddConditionalFactory(
  48. RendererType type,
  49. std::unique_ptr<RendererFactory> factory,
  50. ConditionalFactoryCB callback) {
  51. DCHECK(factory);
  52. DCHECK(callback);
  53. DCHECK(!conditional_factories_.count(type))
  54. << "At most one conditional factory for a given type!";
  55. conditional_factories_.emplace(type, callback);
  56. AddFactory(type, std::move(factory));
  57. }
  58. void RendererFactorySelector::AddFactory(
  59. RendererType type,
  60. std::unique_ptr<RendererFactory> factory) {
  61. DCHECK(factory);
  62. DCHECK(!factories_.count(type));
  63. DVLOG(2) << __func__ << ": type=" << GetRendererName(type);
  64. factories_[type] = std::move(factory);
  65. }
  66. void RendererFactorySelector::SetBaseRendererType(RendererType type) {
  67. DCHECK(factories_.count(type));
  68. base_renderer_type_ = type;
  69. }
  70. RendererType RendererFactorySelector::GetCurrentRendererType() {
  71. for (const auto& entry : conditional_factories_) {
  72. if (entry.second.Run())
  73. return entry.first;
  74. }
  75. return base_renderer_type_.value();
  76. }
  77. RendererFactory* RendererFactorySelector::GetCurrentFactory() {
  78. RendererType current_renderer_type = GetCurrentRendererType();
  79. DVLOG(1) << __func__ << " Selecting factory type: "
  80. << GetRendererName(current_renderer_type);
  81. auto* current_factory = factories_[current_renderer_type].get();
  82. DCHECK(current_factory);
  83. return current_factory;
  84. }
  85. #if BUILDFLAG(IS_ANDROID)
  86. void RendererFactorySelector::StartRequestRemotePlayStateCB(
  87. RequestRemotePlayStateChangeCB callback_request) {
  88. DCHECK(!remote_play_state_change_cb_request_);
  89. remote_play_state_change_cb_request_ = std::move(callback_request);
  90. }
  91. void RendererFactorySelector::SetRemotePlayStateChangeCB(
  92. RemotePlayStateChangeCB callback) {
  93. DCHECK(remote_play_state_change_cb_request_);
  94. std::move(remote_play_state_change_cb_request_).Run(std::move(callback));
  95. }
  96. #endif
  97. } // namespace media