1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
|
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/cast_streaming/renderer/resource_provider_impl.h"
#include "base/functional/bind.h"
#include "base/functional/callback_helpers.h"
#include "base/task/sequenced_task_runner.h"
#include "base/task/single_thread_task_runner.h"
#include "components/cast_streaming/common/public/cast_streaming_url.h"
#include "components/cast_streaming/common/public/features.h"
#include "components/cast_streaming/renderer/frame/frame_injecting_demuxer.h"
#include "media/base/demuxer.h"
namespace cast_streaming {
// static
std::unique_ptr<ResourceProvider> CreateResourceProvider() {
return std::make_unique<ResourceProviderImpl>();
}
ResourceProviderImpl::ResourceProviderImpl() : weak_factory_(this) {
per_frame_resources_ =
std::make_unique<PerRenderFrameResources>(base::BindOnce(
&ResourceProviderImpl::OnError, weak_factory_.GetWeakPtr()));
}
ResourceProviderImpl::~ResourceProviderImpl() = default;
void ResourceProviderImpl::BindRendererController(
mojo::PendingAssociatedReceiver<mojom::RendererController> receiver) {
if (per_frame_resources_) {
per_frame_resources_->renderer_controller_proxy().BindRendererController(
std::move(receiver));
}
}
void ResourceProviderImpl::BindDemuxerConnector(
mojo::PendingAssociatedReceiver<mojom::DemuxerConnector> receiver) {
if (per_frame_resources_) {
per_frame_resources_->demuxer_connector().BindReceiver(std::move(receiver));
}
}
void ResourceProviderImpl::OnError() {
per_frame_resources_.reset();
}
ResourceProvider::ReceiverBinder<mojom::RendererController>
ResourceProviderImpl::GetRendererControllerBinder() {
return base::BindRepeating(&ResourceProviderImpl::BindRendererController,
weak_factory_.GetWeakPtr());
}
ResourceProvider::ReceiverBinder<mojom::DemuxerConnector>
ResourceProviderImpl::GetDemuxerConnectorBinder() {
return base::BindRepeating(&ResourceProviderImpl::BindDemuxerConnector,
weak_factory_.GetWeakPtr());
}
std::unique_ptr<media::Demuxer> ResourceProviderImpl::MaybeGetDemuxerOverride(
const GURL& url,
scoped_refptr<base::SequencedTaskRunner> media_task_runner) {
// Do not create a FrameInjectingDemuxer if the Cast Streaming MessagePort
// was not set in the browser process. This will manifest as an unbound
// DemuxerConnector object in the renderer process.
// TODO(crbug.com/40131115): Simplify the instantiation conditions for the
// FrameInjectingDemuxer.
if (per_frame_resources_ && IsCastStreamingMediaSourceUrl(url) &&
per_frame_resources_->demuxer_connector().IsBound()) {
return std::make_unique<FrameInjectingDemuxer>(
&per_frame_resources_->demuxer_connector(),
std::move(media_task_runner));
}
return nullptr;
}
mojo::PendingReceiver<media::mojom::Renderer>
ResourceProviderImpl::GetRendererCommandReceiver() {
DCHECK(per_frame_resources_);
return per_frame_resources_->renderer_controller_proxy().GetReceiver();
}
ResourceProviderImpl::PerRenderFrameResources::PerRenderFrameResources(
base::OnceClosure on_error)
: renderer_controller_proxy_(std::move(on_error)) {}
ResourceProviderImpl::PerRenderFrameResources::~PerRenderFrameResources() =
default;
} // namespace cast_streaming
|