blob: 310a9f89d3764dc53e5bcd3040def1e1138fc9f3 [file] [log] [blame]
/*
* 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 <log/log.h>
#include <algorithm>
#include <array>
#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<cuttlefish::VsockConnection> 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<void> VsockCameraDevice::getResourceCost(
ICameraDevice::getResourceCost_cb _hidl_cb) {
CameraResourceCost resCost;
resCost.resourceCost = 100;
_hidl_cb(Status::OK, resCost);
return Void();
}
Return<void> 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<Status> VsockCameraDevice::setTorchMode(TorchMode) {
return Status::OPERATION_NOT_SUPPORTED;
}
Return<void> VsockCameraDevice::open(const sp<ICameraDeviceCallback>& 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<cuttlefish::VsockFrameProvider>();
frame_provider_->start(connection_, metadata_.getPreferredWidth(),
metadata_.getPreferredHeight());
session_ = new VsockCameraDeviceSession(metadata_, frame_provider_, callback);
_hidl_cb(Status::OK, session_);
return Void();
}
Return<void> 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