web_engine_media_renderer_factory.cc 4.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. // Copyright 2019 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "fuchsia_web/webengine/renderer/web_engine_media_renderer_factory.h"
  5. #include <fuchsia/media/cpp/fidl.h>
  6. #include <memory>
  7. #include <utility>
  8. #include "base/bind.h"
  9. #include "fuchsia_web/webengine/renderer/web_engine_audio_renderer.h"
  10. #include "media/base/decoder_factory.h"
  11. #include "media/renderers/renderer_impl.h"
  12. #include "media/renderers/video_renderer_impl.h"
  13. #include "media/video/gpu_memory_buffer_video_frame_pool.h"
  14. #include "media/video/gpu_video_accelerator_factories.h"
  15. WebEngineMediaRendererFactory::WebEngineMediaRendererFactory(
  16. media::MediaLog* media_log,
  17. media::DecoderFactory* decoder_factory,
  18. GetGpuFactoriesCB get_gpu_factories_cb,
  19. mojo::Remote<mojom::WebEngineMediaResourceProvider> media_resource_provider)
  20. : media_log_(media_log),
  21. decoder_factory_(decoder_factory),
  22. get_gpu_factories_cb_(std::move(get_gpu_factories_cb)),
  23. media_resource_provider_(std::move(media_resource_provider)) {
  24. DCHECK(decoder_factory_);
  25. }
  26. WebEngineMediaRendererFactory::~WebEngineMediaRendererFactory() = default;
  27. std::vector<std::unique_ptr<media::VideoDecoder>>
  28. WebEngineMediaRendererFactory::CreateVideoDecoders(
  29. const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
  30. media::RequestOverlayInfoCB request_overlay_info_cb,
  31. const gfx::ColorSpace& target_color_space,
  32. media::GpuVideoAcceleratorFactories* gpu_factories) {
  33. std::vector<std::unique_ptr<media::VideoDecoder>> video_decoders;
  34. decoder_factory_->CreateVideoDecoders(
  35. media_task_runner, gpu_factories, media_log_,
  36. std::move(request_overlay_info_cb), target_color_space, &video_decoders);
  37. return video_decoders;
  38. }
  39. std::unique_ptr<media::Renderer> WebEngineMediaRendererFactory::CreateRenderer(
  40. const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
  41. const scoped_refptr<base::TaskRunner>& worker_task_runner,
  42. media::AudioRendererSink* audio_renderer_sink,
  43. media::VideoRendererSink* video_renderer_sink,
  44. media::RequestOverlayInfoCB request_overlay_info_cb,
  45. const gfx::ColorSpace& target_color_space) {
  46. fidl::InterfaceHandle<fuchsia::media::AudioConsumer> audio_consumer_handle;
  47. media_resource_provider_->CreateAudioConsumer(
  48. audio_consumer_handle.NewRequest());
  49. auto audio_renderer = std::make_unique<WebEngineAudioRenderer>(
  50. media_log_, std::move(audio_consumer_handle));
  51. media::GpuVideoAcceleratorFactories* gpu_factories = nullptr;
  52. if (get_gpu_factories_cb_)
  53. gpu_factories = get_gpu_factories_cb_.Run();
  54. std::unique_ptr<media::GpuMemoryBufferVideoFramePool> gmb_pool;
  55. if (gpu_factories && gpu_factories->ShouldUseGpuMemoryBuffersForVideoFrames(
  56. /*for_media_stream=*/false)) {
  57. gmb_pool = std::make_unique<media::GpuMemoryBufferVideoFramePool>(
  58. media_task_runner, std::move(worker_task_runner), gpu_factories);
  59. }
  60. std::unique_ptr<media::VideoRenderer> video_renderer(
  61. new media::VideoRendererImpl(
  62. media_task_runner, video_renderer_sink,
  63. // Unretained is safe here, because the RendererFactory is guaranteed
  64. // to outlive the RendererImpl. The RendererImpl is destroyed when
  65. // WMPI destructor calls pipeline_controller_.Stop() ->
  66. // PipelineImpl::Stop() -> RendererWrapper::Stop ->
  67. // RendererWrapper::DestroyRenderer(). And the RendererFactory is
  68. // owned by WMPI and gets called after WMPI destructor finishes.
  69. base::BindRepeating(
  70. &WebEngineMediaRendererFactory::CreateVideoDecoders,
  71. base::Unretained(this), media_task_runner,
  72. std::move(request_overlay_info_cb), target_color_space,
  73. gpu_factories),
  74. /*drop_frames=*/true, media_log_, std::move(gmb_pool)));
  75. return std::make_unique<media::RendererImpl>(
  76. media_task_runner, std::move(audio_renderer), std::move(video_renderer));
  77. }