blob: 74df6484ea6df7f8172163cbaad27dcd4a6bd050 [file] [log] [blame]
// Copyright 2021 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/clients/win/media_foundation_renderer_client_factory.h"
#include "media/base/win/dcomp_texture_wrapper.h"
#include "media/base/win/mf_helpers.h"
#include "media/mojo/clients/mojo_media_log_service.h"
#include "media/mojo/clients/mojo_renderer.h"
#include "media/mojo/clients/mojo_renderer_factory.h"
#include "media/mojo/clients/win/media_foundation_renderer_client.h"
#include "media/mojo/mojom/renderer_extensions.mojom.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/self_owned_receiver.h"
namespace media {
MediaFoundationRendererClientFactory::MediaFoundationRendererClientFactory(
MediaLog* media_log,
GetDCOMPTextureWrapperCB get_dcomp_texture_cb,
std::unique_ptr<media::MojoRendererFactory> mojo_renderer_factory)
: media_log_(media_log),
get_dcomp_texture_cb_(std::move(get_dcomp_texture_cb)),
mojo_renderer_factory_(std::move(mojo_renderer_factory)) {
DVLOG_FUNC(1);
}
MediaFoundationRendererClientFactory::~MediaFoundationRendererClientFactory() {
DVLOG_FUNC(1);
}
std::unique_ptr<media::Renderer>
MediaFoundationRendererClientFactory::CreateRenderer(
const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
const scoped_refptr<base::TaskRunner>& /*worker_task_runner*/,
media::AudioRendererSink* /*audio_renderer_sink*/,
media::VideoRendererSink* video_renderer_sink,
media::RequestOverlayInfoCB /*request_overlay_info_cb*/,
const gfx::ColorSpace& /*target_color_space*/) {
DVLOG_FUNC(1);
// Use `mojo::MakeSelfOwnedReceiver` for MediaLog so logs may go through even
// after `this` is destructed. `Clone()` is necessary since the remote could
// live longer than `media_log_`.
mojo::PendingReceiver<mojom::MediaLog> media_log_pending_receiver;
auto media_log_pending_remote =
media_log_pending_receiver.InitWithNewPipeAndPassRemote();
mojo::MakeSelfOwnedReceiver(
std::make_unique<MojoMediaLogService>(media_log_->Clone()),
std::move(media_log_pending_receiver));
// Used to send messages from the MediaFoundationRendererClient (Renderer
// process), to the MediaFoundationRenderer (MF_CDM LPAC Utility process).
// The |renderer_extension_receiver| will be bound in MediaFoundationRenderer.
mojo::PendingRemote<media::mojom::MediaFoundationRendererExtension>
renderer_extension_remote;
auto renderer_extension_receiver =
renderer_extension_remote.InitWithNewPipeAndPassReceiver();
auto dcomp_texture = get_dcomp_texture_cb_.Run();
DCHECK(dcomp_texture);
std::unique_ptr<media::MojoRenderer> mojo_renderer =
mojo_renderer_factory_->CreateMediaFoundationRenderer(
std::move(media_log_pending_remote),
std::move(renderer_extension_receiver), media_task_runner,
video_renderer_sink);
// mojo_renderer's ownership is passed to MediaFoundationRendererClient.
return std::make_unique<MediaFoundationRendererClient>(
media_task_runner, media_log_->Clone(), std::move(mojo_renderer),
std::move(renderer_extension_remote), std::move(dcomp_texture),
video_renderer_sink);
}
media::MediaResource::Type
MediaFoundationRendererClientFactory::GetRequiredMediaResourceType() {
return media::MediaResource::Type::STREAM;
}
} // namespace media