/* * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #define LOG_TAG "VsockCameraDevice" //#define LOG_NDEBUG 0 #include #include #include #include "CameraMetadata.h" #include "android-base/macros.h" #include "include/convert.h" #include "vsock_camera_device_3_4.h" #include "vsock_camera_device_session_3_4.h" namespace android::hardware::camera::device::V3_4::implementation { VsockCameraDevice::VsockCameraDevice( const std::string& id, const Settings& settings, std::shared_ptr connection) : id_(id), metadata_(settings.width, settings.height, settings.frame_rate), connection_(connection), is_open_(false) { ALOGI("%s", __FUNCTION__); } VsockCameraDevice::~VsockCameraDevice() { ALOGI("%s", __FUNCTION__); } Return VsockCameraDevice::getResourceCost( ICameraDevice::getResourceCost_cb _hidl_cb) { CameraResourceCost resCost; resCost.resourceCost = 100; _hidl_cb(Status::OK, resCost); return Void(); } Return VsockCameraDevice::getCameraCharacteristics( ICameraDevice::getCameraCharacteristics_cb _hidl_cb) { V3_2::CameraMetadata hidl_vec; const camera_metadata_t* metadata_ptr = metadata_.getAndLock(); V3_2::implementation::convertToHidl(metadata_ptr, &hidl_vec); _hidl_cb(Status::OK, hidl_vec); metadata_.unlock(metadata_ptr); return Void(); } Return VsockCameraDevice::setTorchMode(TorchMode) { return Status::OPERATION_NOT_SUPPORTED; } Return VsockCameraDevice::open(const sp& callback, ICameraDevice::open_cb _hidl_cb) { if (callback == nullptr) { ALOGE("%s: cannot open camera %s. callback is null!", __FUNCTION__, id_.c_str()); _hidl_cb(Status::ILLEGAL_ARGUMENT, nullptr); return Void(); } bool was_open = is_open_.exchange(true); if (was_open) { ALOGE("%s: cannot open an already opened camera!", __FUNCTION__); _hidl_cb(Status::CAMERA_IN_USE, nullptr); return Void(); } ALOGI("%s: Initializing device for camera %s", __FUNCTION__, id_.c_str()); frame_provider_ = std::make_shared(); frame_provider_->start(connection_, metadata_.getPreferredWidth(), metadata_.getPreferredHeight()); session_ = new VsockCameraDeviceSession(metadata_, frame_provider_, callback); _hidl_cb(Status::OK, session_); return Void(); } Return VsockCameraDevice::dumpState( const ::android::hardware::hidl_handle& handle) { if (handle.getNativeHandle() == nullptr) { ALOGE("%s: handle must not be null", __FUNCTION__); return Void(); } if (handle->numFds != 1 || handle->numInts != 0) { ALOGE("%s: handle must contain 1 FD and 0 integers! Got %d FDs and %d ints", __FUNCTION__, handle->numFds, handle->numInts); return Void(); } int fd = handle->data[0]; dprintf(fd, "Camera:%s\n", id_.c_str()); return Void(); } } // namespace android::hardware::camera::device::V3_4::implementation