1 // Copyright 2014 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "media/mojo/services/test_mojo_media_client.h"
9 #include "base/functional/callback_helpers.h"
10 #include "base/run_loop.h"
11 #include "base/task/single_thread_task_runner.h"
12 #include "build/build_config.h"
13 #include "media/audio/audio_device_description.h"
14 #include "media/audio/audio_manager.h"
15 #include "media/audio/audio_thread_impl.h"
16 #include "media/audio/null_audio_sink.h"
17 #include "media/base/cdm_factory.h"
18 #include "media/base/media.h"
19 #include "media/base/media_log.h"
20 #include "media/base/null_video_sink.h"
21 #include "media/base/renderer_factory.h"
22 #include "media/cdm/default_cdm_factory.h"
23 #include "media/renderers/default_decoder_factory.h"
24 #include "media/renderers/renderer_impl_factory.h"
28 TestMojoMediaClient::TestMojoMediaClient() = default;
30 TestMojoMediaClient::~TestMojoMediaClient() {
34 audio_manager_->Shutdown();
35 audio_manager_.reset();
39 void TestMojoMediaClient::Initialize() {
40 InitializeMediaLibrary();
41 // TODO(dalecurtis): We should find a single owner per process for the audio
42 // manager or make it a lazy instance. It's not safe to call Get()/Create()
43 // across multiple threads...
44 AudioManager* audio_manager = AudioManager::Get();
46 audio_manager_ = media::AudioManager::CreateForTesting(
47 std::make_unique<AudioThreadImpl>());
48 // Flush the message loop to ensure that the audio manager is initialized.
49 base::RunLoop().RunUntilIdle();
53 std::unique_ptr<Renderer> TestMojoMediaClient::CreateRenderer(
54 mojom::FrameInterfaceFactory* frame_interfaces,
55 scoped_refptr<base::SingleThreadTaskRunner> task_runner,
57 const std::string& /* audio_device_id */) {
58 // If called the first time, do one time initialization.
59 if (!decoder_factory_) {
60 decoder_factory_ = std::make_unique<media::DefaultDecoderFactory>(nullptr);
63 media::MediaPlayerLoggingID player_id = media::GetNextMediaPlayerLoggingID();
65 if (!renderer_factory_) {
66 #if BUILDFLAG(IS_ANDROID)
67 renderer_factory_ = std::make_unique<RendererImplFactory>(
68 media_log, decoder_factory_.get(),
69 RendererImplFactory::GetGpuFactoriesCB(), player_id);
71 renderer_factory_ = std::make_unique<RendererImplFactory>(
72 media_log, decoder_factory_.get(),
73 RendererImplFactory::GetGpuFactoriesCB(), player_id, nullptr);
77 // We cannot share the NullAudioSink or NullVideoSink among different
78 // RendererImpls. Thus create one for each Renderer creation.
79 auto audio_sink = base::MakeRefCounted<NullAudioSink>(task_runner);
80 auto video_sink = std::make_unique<NullVideoSink>(
81 false, base::Seconds(1.0 / 60), NullVideoSink::NewFrameCB(), task_runner);
82 auto* video_sink_ptr = video_sink.get();
84 // Hold created sinks since RendererImplFactory only takes raw pointers to
85 // the sinks. We are not cleaning up them even after a created Renderer is
86 // destroyed. But this is fine since this class is only used for tests.
87 audio_sinks_.push_back(audio_sink);
88 video_sinks_.push_back(std::move(video_sink));
90 return renderer_factory_->CreateRenderer(
91 task_runner, task_runner, audio_sink.get(), video_sink_ptr,
92 base::NullCallback(), gfx::ColorSpace());
95 #if BUILDFLAG(ENABLE_CAST_RENDERER)
96 std::unique_ptr<Renderer> TestMojoMediaClient::CreateCastRenderer(
97 mojom::FrameInterfaceFactory* frame_interfaces,
98 scoped_refptr<base::SingleThreadTaskRunner> task_runner,
100 const base::UnguessableToken& /* overlay_plane_id */) {
101 return CreateRenderer(frame_interfaces, task_runner, media_log,
104 #endif // BUILDFLAG(ENABLE_CAST_RENDERER)
106 std::unique_ptr<CdmFactory> TestMojoMediaClient::CreateCdmFactory(
107 mojom::FrameInterfaceFactory* /* frame_interfaces */) {
108 DVLOG(1) << __func__;
109 return std::make_unique<DefaultCdmFactory>();