blob: 3faa2e45c6940b433270def0652ac262ebd675df [file] [log] [blame]
// Copyright 2021 The Fuchsia 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 "src/camera/bin/virtual_camera/virtual_camera_agent.h"
#include <lib/syslog/cpp/macros.h>
#include "src/camera/lib/stream_utils/stream_constraints.h"
using fuchsia::camera::test::virtualcamera::VirtualCameraDevice_AddToDeviceWatcher_Result;
namespace camera {
VirtualCameraAgent::VirtualCameraAgent(sys::ComponentContext* component_context,
StreamStorage& stream_storage)
: component_context_(component_context),
stream_storage_(stream_storage),
hardware_device_binding_(this) {
device_watcher_tester_ =
component_context_->svc()->Connect<fuchsia::camera::test::DeviceWatcherTester>();
device_watcher_tester_.set_error_handler(
[](zx_status_t status) { FX_LOGS(WARNING) << "Lost connection to DeviceWatcherTester"; });
}
void VirtualCameraAgent::GetChannel(zx::channel channel) {
FX_LOGS(INFO) << "VirtualCameraAgent::GetChannel unimplemented";
}
void VirtualCameraAgent::GetChannel2(
fidl::InterfaceRequest<fuchsia::camera2::hal::Controller> server_end) {
auto hal_controller =
std::make_unique<VirtualCameraHalController>(stream_storage_, std::move(server_end));
hal_controllers_.insert(std::move(hal_controller));
}
void VirtualCameraAgent::GetDebugChannel(
fidl::InterfaceRequest<fuchsia::camera2::debug::Debug> server_end) {
ZX_ASSERT(false);
}
void VirtualCameraAgent::AddToDeviceWatcher(AddToDeviceWatcherCallback callback) {
if (hardware_device_binding_.is_bound()) {
FX_LOGS(WARNING) << "AddToDeviceWatcher already called.";
callback(VirtualCameraDevice_AddToDeviceWatcher_Result::WithErr(
fuchsia::camera::test::virtualcamera::Error::ALREADY_ADDED_TO_DEVICE_WATCHER));
return;
}
device_watcher_tester_->InjectDevice(hardware_device_binding_.NewBinding());
callback(VirtualCameraDevice_AddToDeviceWatcher_Result::WithResponse({}));
}
void VirtualCameraAgent::AddStreamConfig(
uint64_t index, fuchsia::camera::test::virtualcamera::StreamConfig config) {
StreamConstraints constraints(fuchsia::camera2::CameraStreamType::MONITORING);
constraints.AddImageFormat(config.width(), config.height(),
fuchsia::sysmem::PixelFormatType::NV12);
stream_storage_.SetStreamConfigAtIndex(index, constraints.ConvertToStreamConfig());
}
} // namespace camera