chromium/chromecast/browser/media/media_caps_impl.cc

// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chromecast/browser/media/media_caps_impl.h"

#include "base/logging.h"
#include "chromecast/public/media/decoder_config.h"
#include "mojo/public/cpp/bindings/remote.h"

namespace chromecast {
namespace media {

mojom::CodecProfileLevelPtr ConvertCodecProfileLevelToMojo(
    const CodecProfileLevel& codec_profile_level) {
  mojom::CodecProfileLevelPtr result = mojom::CodecProfileLevel::New();
  result->codec = codec_profile_level.codec;
  result->profile = codec_profile_level.profile;
  result->level = codec_profile_level.level;
  return result;
}

MediaCapsImpl::MediaCapsImpl() = default;
MediaCapsImpl::~MediaCapsImpl() = default;

void MediaCapsImpl::AddReceiver(
    mojo::PendingReceiver<mojom::MediaCaps> receiver) {
  receivers_.Add(this, std::move(receiver));
}

mojo::PendingRemote<mojom::MediaCaps> MediaCapsImpl::GetPendingRemote() {
  mojo::PendingRemote<mojom::MediaCaps> pending_remote;
  AddReceiver(pending_remote.InitWithNewPipeAndPassReceiver());
  return pending_remote;
}

void MediaCapsImpl::AddSupportedCodecProfileLevel(
    const CodecProfileLevel& codec_profile_level) {
  codec_profile_levels_.push_back(codec_profile_level);
  for (auto& observer : observers_) {
    mojom::CodecProfileLevelPtr mojo_codec_profile_level(
        ConvertCodecProfileLevelToMojo(codec_profile_level));
    observer->AddSupportedCodecProfileLevel(
        std::move(mojo_codec_profile_level));
  }
}

void MediaCapsImpl::AddObserver(
    mojo::PendingRemote<mojom::MediaCapsObserver> observer_remote) {
  mojo::Remote<mojom::MediaCapsObserver> observer(std::move(observer_remote));
  DVLOG(1) << __func__ << ": Sending " << codec_profile_levels_.size()
           << " supported codec profile levels to observer.";
  for (const auto& codec_profile_level : codec_profile_levels_) {
    observer->AddSupportedCodecProfileLevel(
        ConvertCodecProfileLevelToMojo(codec_profile_level));
  }
  observers_.Add(std::move(observer));
}

}  // namespace media
}  // namespace chromecast