// 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 "media/gpu/ipc/service/media_gpu_channel_manager.h"

#include <memory>
#include <utility>

#include "gpu/ipc/service/gpu_channel.h"
#include "gpu/ipc/service/gpu_channel_manager.h"
#include "ipc/ipc_message_macros.h"
#include "ipc/param_traits_macros.h"
#include "media/gpu/ipc/service/gpu_video_decode_accelerator.h"
#include "media/gpu/ipc/service/media_gpu_channel.h"

namespace media {

MediaGpuChannelManager::MediaGpuChannelManager(
    gpu::GpuChannelManager* channel_manager)
    : channel_manager_(channel_manager) {}

MediaGpuChannelManager::~MediaGpuChannelManager() = default;

void MediaGpuChannelManager::AddChannel(
    int32_t client_id,
    const base::UnguessableToken& channel_token) {
  gpu::GpuChannel* gpu_channel = channel_manager_->LookupChannel(client_id);
  DCHECK(gpu_channel);
  auto media_gpu_channel =
      std::make_unique<MediaGpuChannel>(gpu_channel, overlay_factory_cb_);
  media_gpu_channels_[client_id] = std::move(media_gpu_channel);
  channel_to_token_[client_id] = channel_token;
  token_to_channel_[channel_token] = client_id;
}

void MediaGpuChannelManager::RemoveChannel(int32_t client_id) {
  media_gpu_channels_.erase(client_id);
  const auto it = channel_to_token_.find(client_id);
  if (it != channel_to_token_.end()) {
    token_to_channel_.erase(it->second);
    channel_to_token_.erase(it);
  }
}

void MediaGpuChannelManager::DestroyAllChannels() {
  media_gpu_channels_.clear();
  token_to_channel_.clear();
  channel_to_token_.clear();
}

gpu::GpuChannel* MediaGpuChannelManager::LookupChannel(
    const base::UnguessableToken& channel_token) {
  const auto it = token_to_channel_.find(channel_token);
  if (it == token_to_channel_.end())
    return nullptr;
  return channel_manager_->LookupChannel(it->second);
}

void MediaGpuChannelManager::SetOverlayFactory(
    AndroidOverlayMojoFactoryCB overlay_factory_cb) {
  overlay_factory_cb_ = std::move(overlay_factory_cb);
}

AndroidOverlayMojoFactoryCB MediaGpuChannelManager::GetOverlayFactory() {
  return overlay_factory_cb_;
}

}  // namespace media
