[M120 Migration][MM][CAPI] Fix the logic for media using capi player.
[platform/framework/web/chromium-efl.git] / media / mojo / services / gpu_mojo_media_client_win.cc
1 // Copyright 2021 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.
4
5 #include "media/mojo/services/gpu_mojo_media_client.h"
6
7 #include "base/task/sequenced_task_runner.h"
8 #include "base/task/single_thread_task_runner.h"
9 #include "base/task/thread_pool.h"
10 #include "gpu/command_buffer/service/shared_context_state.h"
11 #include "gpu/ipc/service/gpu_channel.h"
12 #include "gpu/ipc/service/gpu_channel_manager.h"
13 #include "media/base/audio_decoder.h"
14 #include "media/base/media_switches.h"
15 #include "media/base/offloading_audio_encoder.h"
16 #include "media/filters/win/media_foundation_audio_decoder.h"
17 #include "media/gpu/ipc/service/media_gpu_channel_manager.h"
18 #include "media/gpu/windows/d3d11_video_decoder.h"
19 #include "media/gpu/windows/mf_audio_encoder.h"
20 #include "ui/gl/direct_composition_support.h"
21
22 namespace media {
23
24 namespace {
25
26 D3D11VideoDecoder::GetD3D11DeviceCB GetD3D11DeviceCallback(
27     ComD3D11Device d3d11_device) {
28   return base::BindRepeating(
29       [](ComD3D11Device d3d11_device) { return d3d11_device; },
30       std::move(d3d11_device));
31 }
32
33 }  // namespace
34
35 std::unique_ptr<VideoDecoder> CreatePlatformVideoDecoder(
36     VideoDecoderTraits& traits) {
37   if (traits.gpu_workarounds->disable_d3d11_video_decoder) {
38     return nullptr;
39   }
40   // Report that HDR is enabled if any display has HDR enabled.
41   bool hdr_enabled = false;
42   auto dxgi_info = gl::GetDirectCompositionHDRMonitorDXGIInfo();
43   for (const auto& output_desc : dxgi_info->output_descs)
44     hdr_enabled |= output_desc->hdr_enabled;
45
46   ComD3D11Device d3d11_device;
47   if (traits.media_gpu_channel_manager) {
48     d3d11_device = traits.media_gpu_channel_manager->d3d11_device();
49   }
50
51   return D3D11VideoDecoder::Create(
52       traits.gpu_task_runner, traits.media_log->Clone(), traits.gpu_preferences,
53       *traits.gpu_workarounds, traits.get_command_buffer_stub_cb,
54       GetD3D11DeviceCallback(std::move(d3d11_device)),
55       traits.get_cached_configs_cb.Run(), hdr_enabled);
56 }
57
58 std::unique_ptr<AudioEncoder> CreatePlatformAudioEncoder(
59     scoped_refptr<base::SequencedTaskRunner> task_runner) {
60   auto encoding_runner = base::ThreadPool::CreateCOMSTATaskRunner({});
61   auto mf_encoder = std::make_unique<MFAudioEncoder>(encoding_runner);
62   return std::make_unique<OffloadingAudioEncoder>(std::move(mf_encoder),
63                                                   std::move(encoding_runner),
64                                                   std::move(task_runner));
65 }
66
67 absl::optional<SupportedVideoDecoderConfigs>
68 GetPlatformSupportedVideoDecoderConfigs(
69     base::WeakPtr<MediaGpuChannelManager> manager,
70     gpu::GpuDriverBugWorkarounds gpu_workarounds,
71     gpu::GpuPreferences gpu_preferences,
72     const gpu::GPUInfo& gpu_info,
73     base::OnceCallback<SupportedVideoDecoderConfigs()> get_vda_configs) {
74   // This method must be called on the GPU main thread.
75   SupportedVideoDecoderConfigs supported_configs;
76   if (gpu_preferences.disable_accelerated_video_decode)
77     return supported_configs;
78   if (!gpu_workarounds.disable_d3d11_video_decoder) {
79     if (!manager) {
80       return supported_configs;
81     }
82
83     auto d3d11_device = manager.get()->d3d11_device();
84     if (!d3d11_device) {
85       return supported_configs;
86     }
87     supported_configs = D3D11VideoDecoder::GetSupportedVideoDecoderConfigs(
88         gpu_preferences, gpu_workarounds,
89         GetD3D11DeviceCallback(std::move(d3d11_device)));
90   }
91   return supported_configs;
92 }
93
94 std::unique_ptr<AudioDecoder> CreatePlatformAudioDecoder(
95     scoped_refptr<base::SequencedTaskRunner> task_runner,
96     std::unique_ptr<MediaLog> media_log) {
97   return MediaFoundationAudioDecoder::Create();
98 }
99
100 VideoDecoderType GetPlatformDecoderImplementationType(
101     gpu::GpuDriverBugWorkarounds gpu_workarounds,
102     gpu::GpuPreferences gpu_preferences,
103     const gpu::GPUInfo& gpu_info) {
104   return VideoDecoderType::kD3D11;
105 }
106
107 // There is no CdmFactory on windows, so just stub it out.
108 class CdmFactory {};
109 std::unique_ptr<CdmFactory> CreatePlatformCdmFactory(
110     mojom::FrameInterfaceFactory* frame_interfaces) {
111   return nullptr;
112 }
113
114 }  // namespace media