blob: a50404ab96a3e7380b8401c748aefa49da75fb24 [file] [log] [blame]
// Copyright 2019 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 "services/video_capture/video_source_provider_impl.h"
#include "base/bind.h"
#include "services/video_capture/public/mojom/producer.mojom.h"
#include "services/video_capture/video_source_impl.h"
#include "services/video_capture/virtual_device_enabled_device_factory.h"
namespace video_capture {
VideoSourceProviderImpl::VideoSourceProviderImpl(DeviceFactory* device_factory)
: device_factory_(device_factory) {}
VideoSourceProviderImpl::~VideoSourceProviderImpl() = default;
void VideoSourceProviderImpl::SetServiceRef(
std::unique_ptr<service_manager::ServiceContextRef> service_ref) {
if (service_ref)
device_factory_->SetServiceRef(service_ref->Clone());
else
device_factory_->SetServiceRef(nullptr);
service_ref_ = std::move(service_ref);
}
void VideoSourceProviderImpl::GetSourceInfos(GetSourceInfosCallback callback) {
device_factory_->GetDeviceInfos(std::move(callback));
}
void VideoSourceProviderImpl::GetVideoSource(
const std::string& device_id,
mojom::VideoSourceRequest source_request) {
auto source_iter = sources_.find(device_id);
if (source_iter == sources_.end()) {
auto video_source = std::make_unique<VideoSourceImpl>(
device_factory_, device_id,
base::BindRepeating(
&VideoSourceProviderImpl::OnVideoSourceLastClientDisconnected,
base::Unretained(this), device_id));
source_iter =
sources_.insert(std::make_pair(device_id, std::move(video_source)))
.first;
}
source_iter->second->AddToBindingSet(std::move(source_request));
}
void VideoSourceProviderImpl::AddSharedMemoryVirtualDevice(
const media::VideoCaptureDeviceInfo& device_info,
mojom::ProducerPtr producer,
bool send_buffer_handles_to_producer_as_raw_file_descriptors,
mojom::SharedMemoryVirtualDeviceRequest virtual_device) {
device_factory_->AddSharedMemoryVirtualDevice(
device_info, std::move(producer),
send_buffer_handles_to_producer_as_raw_file_descriptors,
std::move(virtual_device));
}
void VideoSourceProviderImpl::AddTextureVirtualDevice(
const media::VideoCaptureDeviceInfo& device_info,
mojom::TextureVirtualDeviceRequest virtual_device) {
device_factory_->AddTextureVirtualDevice(device_info,
std::move(virtual_device));
}
void VideoSourceProviderImpl::RegisterVirtualDevicesChangedObserver(
mojom::DevicesChangedObserverPtr observer,
bool raise_event_if_virtual_devices_already_present) {
device_factory_->RegisterVirtualDevicesChangedObserver(
std::move(observer), raise_event_if_virtual_devices_already_present);
}
void VideoSourceProviderImpl::OnVideoSourceLastClientDisconnected(
const std::string& device_id) {
sources_.erase(device_id);
}
} // namespace video_capture