blob: dc583e086efbe98591429696443247f46d563d09 [file] [log] [blame]
// Copyright 2018 The Chromium OS 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_perception/video_capture_service_client_impl.h"
#include <utility>
#include <base/single_thread_task_runner.h>
namespace mri {
void VideoCaptureServiceClientImpl::SetMojoConnector(
MojoConnector* mojo_connector) {
mojo_connector_ = mojo_connector;
}
bool VideoCaptureServiceClientImpl::Connect() {
if (mojo_connector_ == nullptr) {
LOG(ERROR) << "Mojo connector is nullptr.";
return false;
}
mojo_connector_->ConnectToVideoCaptureService();
return true;
}
void VideoCaptureServiceClientImpl::GetDevices(
const GetDevicesCallback& callback) {
mojo_connector_->GetDevices(callback);
}
void VideoCaptureServiceClientImpl::SetActiveDevice(
const std::string& device_id, const SetActiveDeviceCallback& callback) {
mojo_connector_->SetActiveDevice(device_id, callback);
}
void VideoCaptureServiceClientImpl::StartVideoCapture(
const CaptureFormat& capture_format) {
requested_frame_width_ = capture_format.frame_width;
requested_frame_height_ = capture_format.frame_height;
mojo_connector_->StartVideoCapture(
capture_format, std::bind(&VideoCaptureServiceClientImpl::OnNewFrameData,
this, std::placeholders::_1,
std::placeholders::_2, std::placeholders::_3));
}
void VideoCaptureServiceClientImpl::StopVideoCapture() {
mojo_connector_->StopVideoCapture();
}
void VideoCaptureServiceClientImpl::OnNewFrameData(
uint64_t timestamp_in_microseconds, const uint8_t* data, int data_size) {
if (frame_handler_ == nullptr) {
LOG(ERROR) << "Frame handler is null but receiving frames.";
return;
}
frame_handler_(timestamp_in_microseconds, data, data_size,
requested_frame_width_, requested_frame_height_);
}
void VideoCaptureServiceClientImpl::CreateVirtualDevice(
const VideoDevice& video_device, const VirtualDeviceCallback& callback) {
std::unique_ptr<ProducerImpl> producer_impl(new ProducerImpl());
mojo_connector_->CreateVirtualDevice(
video_device, producer_impl.get(), callback);
std::lock_guard<std::mutex> lock(device_id_to_producer_map_lock_);
device_id_to_producer_map_.insert(
std::make_pair(video_device.id, std::move(producer_impl)));
}
void VideoCaptureServiceClientImpl::PushFrameToVirtualDevice(
const std::string& device_id, uint64_t timestamp_in_microseconds,
std::unique_ptr<const uint8_t[]> data, int data_size,
PixelFormat pixel_format, int frame_width, int frame_height) {
std::lock_guard<std::mutex> lock(device_id_to_producer_map_lock_);
std::map<std::string, std::unique_ptr<ProducerImpl>>::iterator it =
device_id_to_producer_map_.find(device_id);
if (it == device_id_to_producer_map_.end()) {
LOG(ERROR) << "Device id not found in producer map.";
return;
}
mojo_connector_->PushFrameToVirtualDevice(
(it->second).get(),
base::TimeDelta::FromMicroseconds(timestamp_in_microseconds),
std::move(data), data_size, pixel_format, frame_width, frame_height);
}
void VideoCaptureServiceClientImpl::CloseVirtualDevice(
const std::string& device_id) {
std::lock_guard<std::mutex> lock(device_id_to_producer_map_lock_);
// Erasing the producer object will close the virtual device.
device_id_to_producer_map_.erase(device_id);
}
} // namespace mri