media_caps_impl.cc 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. // Copyright 2016 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 "chromecast/browser/media/media_caps_impl.h"
  5. #include "base/logging.h"
  6. #include "chromecast/browser/media/supported_codec_finder.h"
  7. #include "chromecast/media/base/media_caps.h"
  8. #include "chromecast/public/media/decoder_config.h"
  9. #include "mojo/public/cpp/bindings/remote.h"
  10. namespace chromecast {
  11. namespace media {
  12. mojom::CodecProfileLevelPtr ConvertCodecProfileLevelToMojo(
  13. const CodecProfileLevel& codec_profile_level) {
  14. mojom::CodecProfileLevelPtr result = mojom::CodecProfileLevel::New();
  15. result->codec = codec_profile_level.codec;
  16. result->profile = codec_profile_level.profile;
  17. result->level = codec_profile_level.level;
  18. return result;
  19. }
  20. MediaCapsImpl::MediaCapsImpl()
  21. : hdcp_version_(0),
  22. supported_eotfs_(0),
  23. dolby_vision_flags_(0),
  24. screen_width_mm_(0),
  25. screen_height_mm_(0),
  26. current_mode_supports_hdr_(false),
  27. current_mode_supports_dv_(false),
  28. screen_resolution_(0, 0) {}
  29. MediaCapsImpl::~MediaCapsImpl() = default;
  30. void MediaCapsImpl::Initialize() {
  31. media::SupportedCodecFinder supported_codec_finder;
  32. supported_codec_finder.FindSupportedCodecProfileLevels(this);
  33. }
  34. void MediaCapsImpl::AddReceiver(
  35. mojo::PendingReceiver<mojom::MediaCaps> receiver) {
  36. receivers_.Add(this, std::move(receiver));
  37. }
  38. mojo::PendingRemote<mojom::MediaCaps> MediaCapsImpl::GetPendingRemote() {
  39. mojo::PendingRemote<mojom::MediaCaps> pending_remote;
  40. AddReceiver(pending_remote.InitWithNewPipeAndPassReceiver());
  41. return pending_remote;
  42. }
  43. void MediaCapsImpl::ScreenResolutionChanged(uint32_t width, uint32_t height) {
  44. screen_resolution_ = gfx::Size(width, height);
  45. for (auto& observer : observers_)
  46. observer->ScreenResolutionChanged(width, height);
  47. }
  48. void MediaCapsImpl::ScreenInfoChanged(int32_t hdcp_version,
  49. int32_t supported_eotfs,
  50. int32_t dolby_vision_flags,
  51. int32_t screen_width_mm,
  52. int32_t screen_height_mm,
  53. bool current_mode_supports_hdr,
  54. bool current_mode_supports_dv) {
  55. hdcp_version_ = hdcp_version;
  56. supported_eotfs_ = supported_eotfs;
  57. dolby_vision_flags_ = dolby_vision_flags;
  58. screen_width_mm_ = screen_width_mm;
  59. screen_height_mm_ = screen_height_mm;
  60. current_mode_supports_hdr_ = current_mode_supports_hdr;
  61. current_mode_supports_dv_ = current_mode_supports_dv;
  62. for (auto& observer : observers_) {
  63. observer->ScreenInfoChanged(hdcp_version, supported_eotfs,
  64. dolby_vision_flags, screen_width_mm,
  65. screen_height_mm, current_mode_supports_hdr,
  66. current_mode_supports_dv);
  67. }
  68. }
  69. void MediaCapsImpl::AddSupportedCodecProfileLevel(
  70. const CodecProfileLevel& codec_profile_level) {
  71. codec_profile_levels_.push_back(codec_profile_level);
  72. for (auto& observer : observers_) {
  73. mojom::CodecProfileLevelPtr mojo_codec_profile_level(
  74. ConvertCodecProfileLevelToMojo(codec_profile_level));
  75. observer->AddSupportedCodecProfileLevel(
  76. std::move(mojo_codec_profile_level));
  77. }
  78. }
  79. void MediaCapsImpl::AddObserver(
  80. mojo::PendingRemote<mojom::MediaCapsObserver> observer_remote) {
  81. mojo::Remote<mojom::MediaCapsObserver> observer(std::move(observer_remote));
  82. observer->ScreenResolutionChanged(screen_resolution_.width(),
  83. screen_resolution_.height());
  84. observer->ScreenInfoChanged(hdcp_version_, supported_eotfs_,
  85. dolby_vision_flags_, screen_width_mm_,
  86. screen_height_mm_, current_mode_supports_hdr_,
  87. current_mode_supports_dv_);
  88. DVLOG(1) << __func__ << ": Sending " << codec_profile_levels_.size()
  89. << " supported codec profile levels to observer.";
  90. for (const auto& codec_profile_level : codec_profile_levels_) {
  91. observer->AddSupportedCodecProfileLevel(
  92. ConvertCodecProfileLevelToMojo(codec_profile_level));
  93. }
  94. observers_.Add(std::move(observer));
  95. }
  96. } // namespace media
  97. } // namespace chromecast