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

#include "media/mojo/services/test_mojo_media_client.h"

#include <memory>

#include "base/callback_helpers.h"
#include "base/run_loop.h"
#include "base/threading/thread_task_runner_handle.h"
#include "build/build_config.h"
#include "media/audio/audio_device_description.h"
#include "media/audio/audio_manager.h"
#include "media/audio/audio_output_stream_sink.h"
#include "media/audio/audio_thread_impl.h"
#include "media/base/cdm_factory.h"
#include "media/base/media.h"
#include "media/base/media_log.h"
#include "media/base/null_video_sink.h"
#include "media/base/renderer_factory.h"
#include "media/cdm/default_cdm_factory.h"
#include "media/renderers/default_decoder_factory.h"
#include "media/renderers/default_renderer_factory.h"

namespace media {

TestMojoMediaClient::TestMojoMediaClient() = default;

TestMojoMediaClient::~TestMojoMediaClient() {
  DVLOG(1) << __func__;

  if (audio_manager_) {
    audio_manager_->Shutdown();
    audio_manager_.reset();
  }
}

void TestMojoMediaClient::Initialize() {
  InitializeMediaLibrary();
  // TODO(dalecurtis): We should find a single owner per process for the audio
  // manager or make it a lazy instance.  It's not safe to call Get()/Create()
  // across multiple threads...
  AudioManager* audio_manager = AudioManager::Get();
  if (!audio_manager) {
    audio_manager_ = media::AudioManager::CreateForTesting(
        std::make_unique<AudioThreadImpl>());
    // Flush the message loop to ensure that the audio manager is initialized.
    base::RunLoop().RunUntilIdle();
  }
}

std::unique_ptr<Renderer> TestMojoMediaClient::CreateRenderer(
    mojom::FrameInterfaceFactory* frame_interfaces,
    scoped_refptr<base::SingleThreadTaskRunner> task_runner,
    MediaLog* media_log,
    const std::string& /* audio_device_id */) {
  // If called the first time, do one time initialization.
  if (!decoder_factory_) {
    decoder_factory_ = std::make_unique<media::DefaultDecoderFactory>(nullptr);
  }

  if (!renderer_factory_) {
#if defined(OS_ANDROID)
    renderer_factory_ = std::make_unique<DefaultRendererFactory>(
        media_log, decoder_factory_.get(),
        DefaultRendererFactory::GetGpuFactoriesCB());
#else
    renderer_factory_ = std::make_unique<DefaultRendererFactory>(
        media_log, decoder_factory_.get(),
        DefaultRendererFactory::GetGpuFactoriesCB(), nullptr);
#endif
  }

  // We cannot share AudioOutputStreamSink or NullVideoSink among different
  // RendererImpls. Thus create one for each Renderer creation.
  auto audio_sink = base::MakeRefCounted<AudioOutputStreamSink>();
  auto video_sink = std::make_unique<NullVideoSink>(
      false, base::Seconds(1.0 / 60), NullVideoSink::NewFrameCB(), task_runner);
  auto* video_sink_ptr = video_sink.get();

  // Hold created sinks since DefaultRendererFactory only takes raw pointers to
  // the sinks. We are not cleaning up them even after a created Renderer is
  // destroyed. But this is fine since this class is only used for tests.
  audio_sinks_.push_back(audio_sink);
  video_sinks_.push_back(std::move(video_sink));

  return renderer_factory_->CreateRenderer(
      task_runner, task_runner, audio_sink.get(), video_sink_ptr,
      base::NullCallback(), gfx::ColorSpace());
}

#if BUILDFLAG(ENABLE_CAST_RENDERER)
std::unique_ptr<Renderer> TestMojoMediaClient::CreateCastRenderer(
    mojom::FrameInterfaceFactory* frame_interfaces,
    scoped_refptr<base::SingleThreadTaskRunner> task_runner,
    MediaLog* media_log,
    const base::UnguessableToken& /* overlay_plane_id */) {
  return CreateRenderer(frame_interfaces, task_runner, media_log,
                        std::string());
}
#endif  // BUILDFLAG(ENABLE_CAST_RENDERER)

std::unique_ptr<CdmFactory> TestMojoMediaClient::CreateCdmFactory(
    mojom::FrameInterfaceFactory* /* frame_interfaces */) {
  DVLOG(1) << __func__;
  return std::make_unique<DefaultCdmFactory>();
}

}  // namespace media
