blob: 2db38e5862d097d77ff8c0978a3fabbcf6372126 [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 "hal_adapter/camera_hal_test_adapter.h"
#include "cros-camera/future.h"
namespace cros {
CameraHalTestAdapter::CameraHalTestAdapter(
std::vector<camera_module_t*> camera_modules,
bool enable_front,
bool enable_back,
bool enable_external)
: CameraHalAdapter(camera_modules),
enable_front_(enable_front),
enable_back_(enable_back),
enable_external_(enable_external) {
VLOGF_ENTER();
LOGF(INFO) << "Filter options: enable_front=" << enable_front_
<< ", enable_back=" << enable_back_
<< ", enable_external=" << enable_external_;
}
void CameraHalTestAdapter::StartOnThread(base::Callback<void(bool)> callback) {
VLOGF_ENTER();
auto future = cros::Future<bool>::Create(nullptr);
CameraHalAdapter::StartOnThread(cros::GetFutureCallback(future));
if (!future.get()) {
callback.Run(false);
return;
}
for (int cam_id = 0; cam_id < CameraHalAdapter::GetNumberOfCameras();
cam_id++) {
camera_module_t* m;
int internal_id;
std::tie(m, internal_id) = CameraHalAdapter::GetInternalModuleAndId(cam_id);
camera_info_t info;
int ret = m->get_camera_info(internal_id, &info);
if (ret != 0) {
LOGF(ERROR) << "Failed to get info of camera " << cam_id;
callback.Run(false);
return;
}
if ((info.facing == CAMERA_FACING_BACK && enable_back_) ||
(info.facing == CAMERA_FACING_FRONT && enable_front_)) {
LOGF(INFO) << "Remap camera id " << cam_id << "->"
<< enable_camera_ids_.size();
enable_camera_ids_.push_back(cam_id);
} else {
LOG(INFO) << "Filter out camera " << internal_id << " facing "
<< info.facing << " of module " << m->common.name;
}
}
LOGF(INFO) << "Enable total " << enable_camera_ids_.size() << " cameras";
callback.Run(true);
}
int CameraHalTestAdapter::GetRemappedExternalCameraId(int external_camera_id) {
return external_camera_id - CameraHalAdapter::GetNumberOfCameras() +
GetNumberOfCameras();
}
int CameraHalTestAdapter::GetUnRemappedExternalCameraId(
int external_camera_id) {
return external_camera_id + CameraHalAdapter::GetNumberOfCameras() -
GetNumberOfCameras();
}
std::pair<camera_module_t*, int> CameraHalTestAdapter::GetInternalModuleAndId(
int camera_id) {
VLOGF_ENTER();
if (camera_id < 0) {
LOGF(ERROR) << "Invalid test camera id: " << camera_id;
return {};
}
if (camera_id >= enable_camera_ids_.size()) {
// external camera
return CameraHalAdapter::GetInternalModuleAndId(
GetUnRemappedExternalCameraId(camera_id));
}
return CameraHalAdapter::GetInternalModuleAndId(
enable_camera_ids_[camera_id]);
}
int32_t CameraHalTestAdapter::GetNumberOfCameras() {
VLOGF_ENTER();
return enable_camera_ids_.size();
}
void CameraHalTestAdapter::NotifyCameraDeviceStatusChange(
CameraModuleCallbacksDelegate* delegate,
int camera_id,
camera_device_status_t status) {
if (enable_external_) {
int new_external_id = GetRemappedExternalCameraId(camera_id);
LOGF(INFO) << "Remap external camera id " << camera_id << "->"
<< new_external_id;
CameraHalAdapter::NotifyCameraDeviceStatusChange(delegate, new_external_id,
status);
}
}
void CameraHalTestAdapter::NotifyTorchModeStatusChange(
CameraModuleCallbacksDelegate* delegate,
int camera_id,
torch_mode_status_t status) {
if (camera_id >= CameraHalAdapter::GetNumberOfCameras()) {
// external camera
if (enable_external_) {
CameraHalAdapter::NotifyTorchModeStatusChange(
delegate, GetRemappedExternalCameraId(camera_id), status);
}
} else {
auto it = std::find(enable_camera_ids_.begin(), enable_camera_ids_.end(),
camera_id);
if (it != enable_camera_ids_.end()) {
CameraHalAdapter::NotifyTorchModeStatusChange(
delegate, std::distance(enable_camera_ids_.begin(), it), status);
}
}
}
} // namespace cros