1248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh/* 2248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh * Copyright (C) 2017 The Android Open Source Project 3248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh * 4248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh * Licensed under the Apache License, Version 2.0 (the "License"); 5248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh * you may not use this file except in compliance with the License. 6248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh * You may obtain a copy of the License at 7248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh * 8248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh * http://www.apache.org/licenses/LICENSE-2.0 9248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh * 10248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh * Unless required by applicable law or agreed to in writing, software 11248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh * distributed under the License is distributed on an "AS IS" BASIS, 12248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh * See the License for the specific language governing permissions and 14248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh * limitations under the License. 15248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh */ 16248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 17248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh#define LOG_TAG "CamDev@1.0-impl" 18248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh#include <hardware/camera.h> 19248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh#include <hardware/gralloc1.h> 2012b364bf8aa87ddc43df7b590d1f1d9b6dc5b061Yin-Chia Yeh#include <hidlmemory/mapping.h> 214e7a3077309d33a21b08e9380573019cc7a8cffbSteven Moreland#include <log/log.h> 22248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh#include <utils/Trace.h> 23248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 241ee279df205218fb7372baf031fb93d2a0d6a821Yin-Chia Yeh#include <media/hardware/HardwareAPI.h> // For VideoNativeHandleMetadata 25248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh#include "CameraDevice_1_0.h" 26248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 27248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yehnamespace android { 28248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yehnamespace hardware { 29248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yehnamespace camera { 30248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yehnamespace device { 31248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yehnamespace V1_0 { 32248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yehnamespace implementation { 33248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 3479d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wuusing ::android::hardware::graphics::common::V1_0::BufferUsage; 35248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yehusing ::android::hardware::graphics::common::V1_0::PixelFormat; 36248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 37519c1675c3a489677354e8a3d2666bf1b41df6f0Yin-Chia YehHandleImporter CameraDevice::sHandleImporter; 38248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 39248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia YehStatus CameraDevice::getHidlStatus(const int& status) { 40248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh switch (status) { 41248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh case 0: return Status::OK; 42248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh case -ENOSYS: return Status::OPERATION_NOT_SUPPORTED; 43248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh case -EBUSY : return Status::CAMERA_IN_USE; 44248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh case -EUSERS: return Status::MAX_CAMERAS_IN_USE; 45248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh case -ENODEV: return Status::INTERNAL_ERROR; 46248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh case -EINVAL: return Status::ILLEGAL_ARGUMENT; 47248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh default: 48248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGE("%s: unknown HAL status code %d", __FUNCTION__, status); 49248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return Status::INTERNAL_ERROR; 50248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 51248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 52248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 53248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yehstatus_t CameraDevice::getStatusT(const Status& s) { 54248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh switch(s) { 55248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh case Status::OK: 56248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return OK; 57248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh case Status::ILLEGAL_ARGUMENT: 58248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return BAD_VALUE; 59248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh case Status::CAMERA_IN_USE: 60248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return -EBUSY; 61248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh case Status::MAX_CAMERAS_IN_USE: 62248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return -EUSERS; 63248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh case Status::METHOD_NOT_SUPPORTED: 64248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return UNKNOWN_TRANSACTION; 65248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh case Status::OPERATION_NOT_SUPPORTED: 66248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return INVALID_OPERATION; 67248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh case Status::CAMERA_DISCONNECTED: 68248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return DEAD_OBJECT; 69248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh case Status::INTERNAL_ERROR: 70248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return INVALID_OPERATION; 71248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 72248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGW("Unexpected HAL status code %d", s); 73248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return INVALID_OPERATION; 74248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 75248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 76248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia YehStatus CameraDevice::initStatus() const { 77248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh Mutex::Autolock _l(mLock); 78248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh Status status = Status::OK; 79248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (mInitFail) { 80248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh status = Status::INTERNAL_ERROR; 81248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } else if (mDisconnected) { 82248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh status = Status::CAMERA_DISCONNECTED; 83248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 84248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return status; 85248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 86248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 87248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia YehCameraDevice::CameraDevice( 88248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh sp<CameraModule> module, const std::string& cameraId, 89248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh const SortedVector<std::pair<std::string, std::string>>& cameraDeviceNames) : 90248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh mModule(module), 91248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh mCameraId(cameraId), 92248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh mDisconnected(false), 93248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh mCameraDeviceNames(cameraDeviceNames) { 94248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh mCameraIdInt = atoi(mCameraId.c_str()); 95248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh // Should not reach here as provider also validate ID 96248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (mCameraIdInt < 0 || mCameraIdInt >= module->getNumberOfCameras()) { 97248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGE("%s: Invalid camera id: %s", __FUNCTION__, mCameraId.c_str()); 98248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh mInitFail = true; 99248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 100248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 101248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh mDeviceVersion = mModule->getDeviceVersion(mCameraIdInt); 102248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (mDeviceVersion != CAMERA_DEVICE_API_VERSION_1_0 && !mModule->isOpenLegacyDefined()) { 103248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGI("%s: Camera id %s does not support HAL1.0", 104248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh __FUNCTION__, mCameraId.c_str()); 105248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh mInitFail = true; 106248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 10712b364bf8aa87ddc43df7b590d1f1d9b6dc5b061Yin-Chia Yeh 10812b364bf8aa87ddc43df7b590d1f1d9b6dc5b061Yin-Chia Yeh mAshmemAllocator = IAllocator::getService("ashmem"); 10912b364bf8aa87ddc43df7b590d1f1d9b6dc5b061Yin-Chia Yeh if (mAshmemAllocator == nullptr) { 11012b364bf8aa87ddc43df7b590d1f1d9b6dc5b061Yin-Chia Yeh ALOGI("%s: cannot get ashmemAllocator", __FUNCTION__); 11112b364bf8aa87ddc43df7b590d1f1d9b6dc5b061Yin-Chia Yeh mInitFail = true; 11212b364bf8aa87ddc43df7b590d1f1d9b6dc5b061Yin-Chia Yeh } 113248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 114248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 115248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia YehCameraDevice::~CameraDevice() { 116248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh Mutex::Autolock _l(mLock); 117248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (mDevice != nullptr) { 118248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGW("%s: camera %s is deleted while open", __FUNCTION__, mCameraId.c_str()); 119a8dcad048c1adb1870fca945bf85197470d5ed29Yahan Zhou closeLocked(); 120248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 121248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh mHalPreviewWindow.cleanUpCirculatingBuffers(); 122248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 123248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 124248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 125248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yehvoid CameraDevice::setConnectionStatus(bool connected) { 126248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh Mutex::Autolock _l(mLock); 127248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh mDisconnected = !connected; 128248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (mDevice == nullptr) { 129248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return; 130248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 131248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (!connected) { 132248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGW("%s: camera %s is disconneted. Closing", __FUNCTION__, mCameraId.c_str()); 133a8dcad048c1adb1870fca945bf85197470d5ed29Yahan Zhou closeLocked(); 134248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 135248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return; 136248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 137248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 138248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yehvoid CameraDevice::CameraPreviewWindow::cleanUpCirculatingBuffers() { 139248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh Mutex::Autolock _l(mLock); 140248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh for (auto pair : mCirculatingBuffers) { 141248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh sHandleImporter.freeBuffer(pair.second); 142248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 143248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh mCirculatingBuffers.clear(); 144248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh mBufferIdMap.clear(); 145248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 146248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 147248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yehint CameraDevice::sDequeueBuffer(struct preview_stream_ops* w, 148248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh buffer_handle_t** buffer, int *stride) { 149248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh CameraPreviewWindow* object = static_cast<CameraPreviewWindow*>(w); 150248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (object->mPreviewCallback == nullptr) { 151248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGE("%s: camera HAL calling preview ops while there is no preview window!", __FUNCTION__); 152248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return INVALID_OPERATION; 153248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 154248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 155248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (buffer == nullptr || stride == nullptr) { 156248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGE("%s: buffer (%p) and stride (%p) must not be null!", __FUNCTION__, buffer, stride); 157248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return BAD_VALUE; 158248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 159248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 160248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh Status s; 161248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh object->mPreviewCallback->dequeueBuffer( 162248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh [&](auto status, uint64_t bufferId, const auto& buf, uint32_t strd) { 163248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh s = status; 164248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (s == Status::OK) { 165248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh Mutex::Autolock _l(object->mLock); 166248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (object->mCirculatingBuffers.count(bufferId) == 0) { 167248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh buffer_handle_t importedBuf = buf.getNativeHandle(); 168248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh sHandleImporter.importBuffer(importedBuf); 169248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (importedBuf == nullptr) { 170248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGE("%s: preview buffer import failed!", __FUNCTION__); 171248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh s = Status::INTERNAL_ERROR; 172248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return; 173248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } else { 174248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh object->mCirculatingBuffers[bufferId] = importedBuf; 175248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh object->mBufferIdMap[&(object->mCirculatingBuffers[bufferId])] = bufferId; 176248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 177248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 178248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh *buffer = &(object->mCirculatingBuffers[bufferId]); 179248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh *stride = strd; 180248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 181248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh }); 182248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return getStatusT(s); 183248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 184248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 185248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yehint CameraDevice::sLockBuffer(struct preview_stream_ops*, buffer_handle_t*) { 186248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return 0; 187248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 188248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 189248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yehint CameraDevice::sEnqueueBuffer(struct preview_stream_ops* w, buffer_handle_t* buffer) { 190248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh CameraPreviewWindow* object = static_cast<CameraPreviewWindow*>(w); 191248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (object->mPreviewCallback == nullptr) { 192248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGE("%s: camera HAL calling preview ops while there is no preview window!", __FUNCTION__); 193248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return INVALID_OPERATION; 194248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 195248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh uint64_t bufferId = object->mBufferIdMap.at(buffer); 196248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return getStatusT(object->mPreviewCallback->enqueueBuffer(bufferId)); 197248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 198248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 199248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yehint CameraDevice::sCancelBuffer(struct preview_stream_ops* w, buffer_handle_t* buffer) { 200248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh CameraPreviewWindow* object = static_cast<CameraPreviewWindow*>(w); 201248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (object->mPreviewCallback == nullptr) { 202248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGE("%s: camera HAL calling preview ops while there is no preview window!", __FUNCTION__); 203248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return INVALID_OPERATION; 204248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 205248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh uint64_t bufferId = object->mBufferIdMap.at(buffer); 206248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return getStatusT(object->mPreviewCallback->cancelBuffer(bufferId)); 207248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 208248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 209248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yehint CameraDevice::sSetBufferCount(struct preview_stream_ops* w, int count) { 210248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh CameraPreviewWindow* object = static_cast<CameraPreviewWindow*>(w); 211248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (object->mPreviewCallback == nullptr) { 212248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGE("%s: camera HAL calling preview ops while there is no preview window!", __FUNCTION__); 213248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return INVALID_OPERATION; 214248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 215248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 216248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh object->cleanUpCirculatingBuffers(); 217248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return getStatusT(object->mPreviewCallback->setBufferCount(count)); 218248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 219248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 220248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yehint CameraDevice::sSetBuffersGeometry(struct preview_stream_ops* w, 221248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh int width, int height, int format) { 222248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh CameraPreviewWindow* object = static_cast<CameraPreviewWindow*>(w); 223248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (object->mPreviewCallback == nullptr) { 224248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGE("%s: camera HAL calling preview ops while there is no preview window!", __FUNCTION__); 225248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return INVALID_OPERATION; 226248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 227248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 228248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh object->cleanUpCirculatingBuffers(); 229248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return getStatusT( 230248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh object->mPreviewCallback->setBuffersGeometry(width, height, (PixelFormat) format)); 231248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 232248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 233248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yehint CameraDevice::sSetCrop(struct preview_stream_ops *w, 234248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh int left, int top, int right, int bottom) { 235248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh CameraPreviewWindow* object = static_cast<CameraPreviewWindow*>(w); 236248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (object->mPreviewCallback == nullptr) { 237248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGE("%s: camera HAL calling preview ops while there is no preview window!", __FUNCTION__); 238248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return INVALID_OPERATION; 239248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 240248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 241248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return getStatusT(object->mPreviewCallback->setCrop(left, top, right, bottom)); 242248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 243248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 244248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yehint CameraDevice::sSetTimestamp(struct preview_stream_ops *w, int64_t timestamp) { 245248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh CameraPreviewWindow* object = static_cast<CameraPreviewWindow*>(w); 246248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (object->mPreviewCallback == nullptr) { 247248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGE("%s: camera HAL calling preview ops while there is no preview window!", __FUNCTION__); 248248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return INVALID_OPERATION; 249248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 250248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 251248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return getStatusT(object->mPreviewCallback->setTimestamp(timestamp)); 252248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 253248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 254248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yehint CameraDevice::sSetUsage(struct preview_stream_ops* w, int usage) { 255248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh CameraPreviewWindow* object = static_cast<CameraPreviewWindow*>(w); 256248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (object->mPreviewCallback == nullptr) { 257248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGE("%s: camera HAL calling preview ops while there is no preview window!", __FUNCTION__); 258248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return INVALID_OPERATION; 259248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 260248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 261248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh object->cleanUpCirculatingBuffers(); 26279d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu return getStatusT(object->mPreviewCallback->setUsage((BufferUsage)usage)); 263248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 264248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 265248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yehint CameraDevice::sSetSwapInterval(struct preview_stream_ops *w, int interval) { 266248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh CameraPreviewWindow* object = static_cast<CameraPreviewWindow*>(w); 267248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (object->mPreviewCallback == nullptr) { 268248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGE("%s: camera HAL calling preview ops while there is no preview window!", __FUNCTION__); 269248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return INVALID_OPERATION; 270248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 271248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 272248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return getStatusT(object->mPreviewCallback->setSwapInterval(interval)); 273248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 274248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 275248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yehint CameraDevice::sGetMinUndequeuedBufferCount( 276248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh const struct preview_stream_ops *w, 277248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh int *count) { 278248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh const CameraPreviewWindow* object = static_cast<const CameraPreviewWindow*>(w); 279248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (object->mPreviewCallback == nullptr) { 280248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGE("%s: camera HAL calling preview ops while there is no preview window!", __FUNCTION__); 281248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return INVALID_OPERATION; 282248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 283248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (count == nullptr) { 284248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGE("%s: count is null!", __FUNCTION__); 285248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return BAD_VALUE; 286248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 287248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 288248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh Status s; 289248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh object->mPreviewCallback->getMinUndequeuedBufferCount( 290248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh [&](auto status, uint32_t cnt) { 291248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh s = status; 292248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (s == Status::OK) { 293248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh *count = cnt; 294248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 295248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh }); 296248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return getStatusT(s); 297248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 298248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 29912b364bf8aa87ddc43df7b590d1f1d9b6dc5b061Yin-Chia YehCameraDevice::CameraHeapMemory::CameraHeapMemory( 30012b364bf8aa87ddc43df7b590d1f1d9b6dc5b061Yin-Chia Yeh int fd, size_t buf_size, uint_t num_buffers) : 301248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh mBufSize(buf_size), 302248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh mNumBufs(num_buffers) { 30312b364bf8aa87ddc43df7b590d1f1d9b6dc5b061Yin-Chia Yeh mHidlHandle = native_handle_create(1,0); 30412b364bf8aa87ddc43df7b590d1f1d9b6dc5b061Yin-Chia Yeh mHidlHandle->data[0] = fcntl(fd, F_DUPFD_CLOEXEC, 0); 30512b364bf8aa87ddc43df7b590d1f1d9b6dc5b061Yin-Chia Yeh const size_t pagesize = getpagesize(); 30612b364bf8aa87ddc43df7b590d1f1d9b6dc5b061Yin-Chia Yeh size_t size = ((buf_size * num_buffers + pagesize-1) & ~(pagesize-1)); 30712b364bf8aa87ddc43df7b590d1f1d9b6dc5b061Yin-Chia Yeh mHidlHeap = hidl_memory("ashmem", mHidlHandle, size); 308248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh commonInitialization(); 309248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 310248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 31112b364bf8aa87ddc43df7b590d1f1d9b6dc5b061Yin-Chia YehCameraDevice::CameraHeapMemory::CameraHeapMemory( 31212b364bf8aa87ddc43df7b590d1f1d9b6dc5b061Yin-Chia Yeh sp<IAllocator> ashmemAllocator, 31312b364bf8aa87ddc43df7b590d1f1d9b6dc5b061Yin-Chia Yeh size_t buf_size, uint_t num_buffers) : 314248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh mBufSize(buf_size), 315248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh mNumBufs(num_buffers) { 31612b364bf8aa87ddc43df7b590d1f1d9b6dc5b061Yin-Chia Yeh const size_t pagesize = getpagesize(); 31712b364bf8aa87ddc43df7b590d1f1d9b6dc5b061Yin-Chia Yeh size_t size = ((buf_size * num_buffers + pagesize-1) & ~(pagesize-1)); 31812b364bf8aa87ddc43df7b590d1f1d9b6dc5b061Yin-Chia Yeh ashmemAllocator->allocate(size, 31912b364bf8aa87ddc43df7b590d1f1d9b6dc5b061Yin-Chia Yeh [&](bool success, const hidl_memory& mem) { 32012b364bf8aa87ddc43df7b590d1f1d9b6dc5b061Yin-Chia Yeh if (!success) { 32112b364bf8aa87ddc43df7b590d1f1d9b6dc5b061Yin-Chia Yeh ALOGE("%s: allocating ashmem of %zu bytes failed!", 32212b364bf8aa87ddc43df7b590d1f1d9b6dc5b061Yin-Chia Yeh __FUNCTION__, buf_size * num_buffers); 32312b364bf8aa87ddc43df7b590d1f1d9b6dc5b061Yin-Chia Yeh return; 32412b364bf8aa87ddc43df7b590d1f1d9b6dc5b061Yin-Chia Yeh } 32512b364bf8aa87ddc43df7b590d1f1d9b6dc5b061Yin-Chia Yeh mHidlHandle = native_handle_clone(mem.handle()); 32612b364bf8aa87ddc43df7b590d1f1d9b6dc5b061Yin-Chia Yeh mHidlHeap = hidl_memory("ashmem", mHidlHandle, size); 32712b364bf8aa87ddc43df7b590d1f1d9b6dc5b061Yin-Chia Yeh }); 32812b364bf8aa87ddc43df7b590d1f1d9b6dc5b061Yin-Chia Yeh 329248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh commonInitialization(); 330248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 331248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 332248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yehvoid CameraDevice::CameraHeapMemory::commonInitialization() { 33312b364bf8aa87ddc43df7b590d1f1d9b6dc5b061Yin-Chia Yeh mHidlHeapMemory = mapMemory(mHidlHeap); 33412b364bf8aa87ddc43df7b590d1f1d9b6dc5b061Yin-Chia Yeh if (mHidlHeapMemory == nullptr) { 33512b364bf8aa87ddc43df7b590d1f1d9b6dc5b061Yin-Chia Yeh ALOGE("%s: memory map failed!", __FUNCTION__); 33612b364bf8aa87ddc43df7b590d1f1d9b6dc5b061Yin-Chia Yeh native_handle_close(mHidlHandle); // close FD for the shared memory 33712b364bf8aa87ddc43df7b590d1f1d9b6dc5b061Yin-Chia Yeh native_handle_delete(mHidlHandle); 33812b364bf8aa87ddc43df7b590d1f1d9b6dc5b061Yin-Chia Yeh mHidlHeap = hidl_memory(); 33912b364bf8aa87ddc43df7b590d1f1d9b6dc5b061Yin-Chia Yeh mHidlHandle = nullptr; 34012b364bf8aa87ddc43df7b590d1f1d9b6dc5b061Yin-Chia Yeh return; 34112b364bf8aa87ddc43df7b590d1f1d9b6dc5b061Yin-Chia Yeh } 34212b364bf8aa87ddc43df7b590d1f1d9b6dc5b061Yin-Chia Yeh mHidlHeapMemData = mHidlHeapMemory->getPointer(); 34312b364bf8aa87ddc43df7b590d1f1d9b6dc5b061Yin-Chia Yeh handle.data = mHidlHeapMemData; 344248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh handle.size = mBufSize * mNumBufs; 345248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh handle.handle = this; 346248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh handle.release = sPutMemory; 347248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 348248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 349248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia YehCameraDevice::CameraHeapMemory::~CameraHeapMemory() { 35012b364bf8aa87ddc43df7b590d1f1d9b6dc5b061Yin-Chia Yeh if (mHidlHeapMemory != nullptr) { 35112b364bf8aa87ddc43df7b590d1f1d9b6dc5b061Yin-Chia Yeh mHidlHeapMemData = nullptr; 35212b364bf8aa87ddc43df7b590d1f1d9b6dc5b061Yin-Chia Yeh mHidlHeapMemory.clear(); // The destructor will trigger munmap 35312b364bf8aa87ddc43df7b590d1f1d9b6dc5b061Yin-Chia Yeh } 35412b364bf8aa87ddc43df7b590d1f1d9b6dc5b061Yin-Chia Yeh 35512b364bf8aa87ddc43df7b590d1f1d9b6dc5b061Yin-Chia Yeh if (mHidlHandle) { 35612b364bf8aa87ddc43df7b590d1f1d9b6dc5b061Yin-Chia Yeh native_handle_close(mHidlHandle); // close FD for the shared memory 35712b364bf8aa87ddc43df7b590d1f1d9b6dc5b061Yin-Chia Yeh native_handle_delete(mHidlHandle); 35812b364bf8aa87ddc43df7b590d1f1d9b6dc5b061Yin-Chia Yeh } 359248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 360248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 361248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh// shared memory methods 362248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yehcamera_memory_t* CameraDevice::sGetMemory(int fd, size_t buf_size, uint_t num_bufs, void *user) { 363248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGV("%s", __FUNCTION__); 364248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh CameraDevice* object = static_cast<CameraDevice*>(user); 365248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (object->mDeviceCallback == nullptr) { 366248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGE("%s: camera HAL request memory while camera is not opened!", __FUNCTION__); 367248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return nullptr; 368248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 369248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 370248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh CameraHeapMemory* mem; 371248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (fd < 0) { 37212b364bf8aa87ddc43df7b590d1f1d9b6dc5b061Yin-Chia Yeh mem = new CameraHeapMemory(object->mAshmemAllocator, buf_size, num_bufs); 373248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } else { 374248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh mem = new CameraHeapMemory(fd, buf_size, num_bufs); 375248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 376248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh mem->incStrong(mem); 37712b364bf8aa87ddc43df7b590d1f1d9b6dc5b061Yin-Chia Yeh hidl_handle hidlHandle = mem->mHidlHandle; 378248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh MemoryId id = object->mDeviceCallback->registerMemory(hidlHandle, buf_size, num_bufs); 379248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh mem->handle.mId = id; 380248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (object->mMemoryMap.count(id) != 0) { 381248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGE("%s: duplicate MemoryId %d returned by client!", __FUNCTION__, id); 382248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 383248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh object->mMemoryMap[id] = mem; 384248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh mem->handle.mDevice = object; 385248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return &mem->handle; 386248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 387248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 388248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yehvoid CameraDevice::sPutMemory(camera_memory_t *data) { 389248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (!data) 390248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return; 391248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 392248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh CameraHeapMemory* mem = static_cast<CameraHeapMemory *>(data->handle); 393248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh CameraDevice* device = mem->handle.mDevice; 394248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (device == nullptr) { 395248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGE("%s: camera HAL return memory for a null device!", __FUNCTION__); 396248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 397248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (device->mDeviceCallback == nullptr) { 398248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGE("%s: camera HAL return memory while camera is not opened!", __FUNCTION__); 399248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 400248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh device->mDeviceCallback->unregisterMemory(mem->handle.mId); 401248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh device->mMemoryMap.erase(mem->handle.mId); 402248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh mem->decStrong(mem); 403248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 404248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 405248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh// Callback forwarding methods 406248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yehvoid CameraDevice::sNotifyCb(int32_t msg_type, int32_t ext1, int32_t ext2, void *user) { 407248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGV("%s", __FUNCTION__); 408248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh CameraDevice* object = static_cast<CameraDevice*>(user); 409248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (object->mDeviceCallback != nullptr) { 410248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh object->mDeviceCallback->notifyCallback((NotifyCallbackMsg) msg_type, ext1, ext2); 411248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 412248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 413248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 414248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yehvoid CameraDevice::sDataCb(int32_t msg_type, const camera_memory_t *data, unsigned int index, 415248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh camera_frame_metadata_t *metadata, void *user) { 416248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGV("%s", __FUNCTION__); 417248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh CameraDevice* object = static_cast<CameraDevice*>(user); 418248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh sp<CameraHeapMemory> mem(static_cast<CameraHeapMemory*>(data->handle)); 419248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (index >= mem->mNumBufs) { 420248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGE("%s: invalid buffer index %d, max allowed is %d", __FUNCTION__, 421248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh index, mem->mNumBufs); 422248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return; 423248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 424248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (object->mDeviceCallback != nullptr) { 425248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh CameraFrameMetadata hidlMetadata; 426248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (metadata) { 427248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh hidlMetadata.faces.resize(metadata->number_of_faces); 428248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh for (size_t i = 0; i < hidlMetadata.faces.size(); i++) { 429248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh hidlMetadata.faces[i].score = metadata->faces[i].score; 430248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh hidlMetadata.faces[i].id = metadata->faces[i].id; 431248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh for (int k = 0; k < 4; k++) { 432248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh hidlMetadata.faces[i].rect[k] = metadata->faces[i].rect[k]; 433248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 434248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh for (int k = 0; k < 2; k++) { 435248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh hidlMetadata.faces[i].leftEye[k] = metadata->faces[i].left_eye[k]; 436248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 437248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh for (int k = 0; k < 2; k++) { 438248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh hidlMetadata.faces[i].rightEye[k] = metadata->faces[i].right_eye[k]; 439248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 440248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh for (int k = 0; k < 2; k++) { 441248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh hidlMetadata.faces[i].mouth[k] = metadata->faces[i].mouth[k]; 442248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 443248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 444248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 445248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh CameraHeapMemory* mem = static_cast<CameraHeapMemory *>(data->handle); 446248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh object->mDeviceCallback->dataCallback( 447248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh (DataCallbackMsg) msg_type, mem->handle.mId, index, hidlMetadata); 448248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 449248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 450248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 4511ba83a9a282afa086ac2431942a4814633438ffcYin-Chia Yehvoid CameraDevice::handleCallbackTimestamp( 4521ba83a9a282afa086ac2431942a4814633438ffcYin-Chia Yeh nsecs_t timestamp, int32_t msg_type, 4531ba83a9a282afa086ac2431942a4814633438ffcYin-Chia Yeh MemoryId memId , unsigned index, native_handle_t* handle) { 4541ba83a9a282afa086ac2431942a4814633438ffcYin-Chia Yeh uint32_t batchSize = 0; 4551ba83a9a282afa086ac2431942a4814633438ffcYin-Chia Yeh { 4561ba83a9a282afa086ac2431942a4814633438ffcYin-Chia Yeh Mutex::Autolock _l(mBatchLock); 4571ba83a9a282afa086ac2431942a4814633438ffcYin-Chia Yeh batchSize = mBatchSize; 4581ba83a9a282afa086ac2431942a4814633438ffcYin-Chia Yeh } 4591ba83a9a282afa086ac2431942a4814633438ffcYin-Chia Yeh 4601ba83a9a282afa086ac2431942a4814633438ffcYin-Chia Yeh if (batchSize == 0) { // non-batch mode 4611ba83a9a282afa086ac2431942a4814633438ffcYin-Chia Yeh mDeviceCallback->handleCallbackTimestamp( 4621ba83a9a282afa086ac2431942a4814633438ffcYin-Chia Yeh (DataCallbackMsg) msg_type, handle, memId, index, timestamp); 4631ba83a9a282afa086ac2431942a4814633438ffcYin-Chia Yeh } else { // batch mode 4641ba83a9a282afa086ac2431942a4814633438ffcYin-Chia Yeh Mutex::Autolock _l(mBatchLock); 4651ba83a9a282afa086ac2431942a4814633438ffcYin-Chia Yeh size_t inflightSize = mInflightBatch.size(); 4661ba83a9a282afa086ac2431942a4814633438ffcYin-Chia Yeh if (inflightSize == 0) { 4671ba83a9a282afa086ac2431942a4814633438ffcYin-Chia Yeh mBatchMsgType = msg_type; 4681ba83a9a282afa086ac2431942a4814633438ffcYin-Chia Yeh } else if (mBatchMsgType != msg_type) { 4691ba83a9a282afa086ac2431942a4814633438ffcYin-Chia Yeh ALOGE("%s: msg_type change (from %d to %d) is not supported!", 4701ba83a9a282afa086ac2431942a4814633438ffcYin-Chia Yeh __FUNCTION__, mBatchMsgType, msg_type); 4711ba83a9a282afa086ac2431942a4814633438ffcYin-Chia Yeh return; 4721ba83a9a282afa086ac2431942a4814633438ffcYin-Chia Yeh } 4731ba83a9a282afa086ac2431942a4814633438ffcYin-Chia Yeh mInflightBatch.push_back({handle, memId, index, timestamp}); 4741ba83a9a282afa086ac2431942a4814633438ffcYin-Chia Yeh 4751ba83a9a282afa086ac2431942a4814633438ffcYin-Chia Yeh // Send batched frames to camera framework 4761ba83a9a282afa086ac2431942a4814633438ffcYin-Chia Yeh if (mInflightBatch.size() >= batchSize) { 4771ba83a9a282afa086ac2431942a4814633438ffcYin-Chia Yeh mDeviceCallback->handleCallbackTimestampBatch( 4781ba83a9a282afa086ac2431942a4814633438ffcYin-Chia Yeh (DataCallbackMsg) mBatchMsgType, mInflightBatch); 4791ba83a9a282afa086ac2431942a4814633438ffcYin-Chia Yeh mInflightBatch.clear(); 4801ba83a9a282afa086ac2431942a4814633438ffcYin-Chia Yeh } 4811ba83a9a282afa086ac2431942a4814633438ffcYin-Chia Yeh } 4821ba83a9a282afa086ac2431942a4814633438ffcYin-Chia Yeh} 4831ba83a9a282afa086ac2431942a4814633438ffcYin-Chia Yeh 484248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yehvoid CameraDevice::sDataCbTimestamp(nsecs_t timestamp, int32_t msg_type, 485248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh const camera_memory_t *data, unsigned index, void *user) { 486248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGV("%s", __FUNCTION__); 487248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh CameraDevice* object = static_cast<CameraDevice*>(user); 488248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh // Start refcounting the heap object from here on. When the clients 489248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh // drop all references, it will be destroyed (as well as the enclosed 490248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh // MemoryHeapBase. 491248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh sp<CameraHeapMemory> mem(static_cast<CameraHeapMemory*>(data->handle)); 492248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (index >= mem->mNumBufs) { 493248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGE("%s: invalid buffer index %d, max allowed is %d", __FUNCTION__, 494248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh index, mem->mNumBufs); 495248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return; 496248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 497248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 498248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh native_handle_t* handle = nullptr; 499248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (object->mMetadataMode) { 500248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (mem->mBufSize == sizeof(VideoNativeHandleMetadata)) { 501248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh VideoNativeHandleMetadata* md = (VideoNativeHandleMetadata*) 50212b364bf8aa87ddc43df7b590d1f1d9b6dc5b061Yin-Chia Yeh ((uint8_t*) mem->mHidlHeapMemData + index * mem->mBufSize); 5031ee279df205218fb7372baf031fb93d2a0d6a821Yin-Chia Yeh if (md->eType == kMetadataBufferTypeNativeHandleSource) { 504248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh handle = md->pHandle; 505248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 506248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 507248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 508248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 509248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (object->mDeviceCallback != nullptr) { 510248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (handle == nullptr) { 511248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh object->mDeviceCallback->dataCallbackTimestamp( 512248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh (DataCallbackMsg) msg_type, mem->handle.mId, index, timestamp); 513248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } else { 5141ba83a9a282afa086ac2431942a4814633438ffcYin-Chia Yeh object->handleCallbackTimestamp(timestamp, msg_type, mem->handle.mId, index, handle); 515248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 516248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 517248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 518248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 519248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yehvoid CameraDevice::initHalPreviewWindow() 520248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh{ 521248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh mHalPreviewWindow.cancel_buffer = sCancelBuffer; 522248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh mHalPreviewWindow.lock_buffer = sLockBuffer; 523248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh mHalPreviewWindow.dequeue_buffer = sDequeueBuffer; 524248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh mHalPreviewWindow.enqueue_buffer = sEnqueueBuffer; 525248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh mHalPreviewWindow.set_buffer_count = sSetBufferCount; 526248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh mHalPreviewWindow.set_buffers_geometry = sSetBuffersGeometry; 527248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh mHalPreviewWindow.set_crop = sSetCrop; 528248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh mHalPreviewWindow.set_timestamp = sSetTimestamp; 529248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh mHalPreviewWindow.set_usage = sSetUsage; 530248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh mHalPreviewWindow.set_swap_interval = sSetSwapInterval; 531248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 532248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh mHalPreviewWindow.get_min_undequeued_buffer_count = 533248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh sGetMinUndequeuedBufferCount; 534248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 535248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 536248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh// Methods from ::android::hardware::camera::device::V1_0::ICameraDevice follow. 537248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia YehReturn<void> CameraDevice::getResourceCost(getResourceCost_cb _hidl_cb) { 538248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh Status status = initStatus(); 539248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh CameraResourceCost resCost; 540248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (status == Status::OK) { 541248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh int cost = 100; 542248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh std::vector<std::string> conflicting_devices; 543248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh struct camera_info info; 544248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 545248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh // If using post-2.4 module version, query the cost + conflicting devices from the HAL 546248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (mModule->getModuleApiVersion() >= CAMERA_MODULE_API_VERSION_2_4) { 547248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh int ret = mModule->getCameraInfo(mCameraIdInt, &info); 548248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (ret == OK) { 549248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh cost = info.resource_cost; 550248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh for (size_t i = 0; i < info.conflicting_devices_length; i++) { 551248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh std::string cameraId(info.conflicting_devices[i]); 552248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh for (const auto& pair : mCameraDeviceNames) { 553248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (cameraId == pair.first) { 554248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh conflicting_devices.push_back(pair.second); 555248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 556248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 557248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 558248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } else { 559248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh status = Status::INTERNAL_ERROR; 560248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 561248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 562248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 563248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (status == Status::OK) { 564248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh resCost.resourceCost = cost; 565248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh resCost.conflictingDevices.resize(conflicting_devices.size()); 566248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh for (size_t i = 0; i < conflicting_devices.size(); i++) { 567248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh resCost.conflictingDevices[i] = conflicting_devices[i]; 568248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGV("CamDevice %s is conflicting with camDevice %s", 569248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh mCameraId.c_str(), resCost.conflictingDevices[i].c_str()); 570248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 571248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 572248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 573248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh _hidl_cb(status, resCost); 574248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return Void(); 575248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 576248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 577248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia YehReturn<void> CameraDevice::getCameraInfo(getCameraInfo_cb _hidl_cb) { 578248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh Status status = initStatus(); 579248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh CameraInfo cameraInfo; 580248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (status == Status::OK) { 581248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh struct camera_info info; 582248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh int ret = mModule->getCameraInfo(mCameraIdInt, &info); 583248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (ret == OK) { 584248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh cameraInfo.facing = (CameraFacing) info.facing; 585248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh // Device 1.0 does not support external camera facing. 586248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh // The closest approximation would be front camera. 587248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (cameraInfo.facing == CameraFacing::EXTERNAL) { 588248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh cameraInfo.facing = CameraFacing::FRONT; 589248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 590248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh cameraInfo.orientation = info.orientation; 591248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } else { 592248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGE("%s: get camera info failed!", __FUNCTION__); 593248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh status = Status::INTERNAL_ERROR; 594248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 595248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 596248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh _hidl_cb(status, cameraInfo); 597248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return Void(); 598248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 599248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 600248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia YehReturn<Status> CameraDevice::setTorchMode(TorchMode mode) { 601248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (!mModule->isSetTorchModeSupported()) { 602248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return Status::METHOD_NOT_SUPPORTED; 603248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 604248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 605248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh Status status = initStatus(); 606248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (status == Status::OK) { 607248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh bool enable = (mode == TorchMode::ON) ? true : false; 608248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh status = getHidlStatus(mModule->setTorchMode(mCameraId.c_str(), enable)); 609248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 610248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return status; 611248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 612248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 613248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia YehReturn<Status> CameraDevice::dumpState(const hidl_handle& handle) { 614248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh Mutex::Autolock _l(mLock); 615248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (handle.getNativeHandle() == nullptr) { 616248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGE("%s: handle must not be null", __FUNCTION__); 617248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return Status::ILLEGAL_ARGUMENT; 618248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 619248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (handle->numFds != 1 || handle->numInts != 0) { 620248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGE("%s: handle must contain 1 FD and 0 integers! Got %d FDs and %d ints", 621248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh __FUNCTION__, handle->numFds, handle->numInts); 622248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return Status::ILLEGAL_ARGUMENT; 623248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 624248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh int fd = handle->data[0]; 625248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 626248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (mDevice != nullptr) { 627248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (mDevice->ops->dump) { // It's fine if the HAL doesn't implement dump() 628248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return getHidlStatus(mDevice->ops->dump(mDevice, fd)); 629248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 630248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 631248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return Status::OK; 632248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 633248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 634248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia YehReturn<Status> CameraDevice::open(const sp<ICameraDeviceCallback>& callback) { 635248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGI("Opening camera %s", mCameraId.c_str()); 636248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh Mutex::Autolock _l(mLock); 637248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 638248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh camera_info info; 639248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh status_t res = mModule->getCameraInfo(mCameraIdInt, &info); 640248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (res != OK) { 641248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGE("Could not get camera info: %s: %d", mCameraId.c_str(), res); 642248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return getHidlStatus(res); 643248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 644248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 645248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh int rc = OK; 646248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (mModule->getModuleApiVersion() >= CAMERA_MODULE_API_VERSION_2_3 && 647248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh info.device_version > CAMERA_DEVICE_API_VERSION_1_0) { 648248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh // Open higher version camera device as HAL1.0 device. 649248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh rc = mModule->openLegacy(mCameraId.c_str(), 650248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh CAMERA_DEVICE_API_VERSION_1_0, 651248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh (hw_device_t **)&mDevice); 652248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } else { 653248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh rc = mModule->open(mCameraId.c_str(), (hw_device_t **)&mDevice); 654248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 655248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (rc != OK) { 656248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh mDevice = nullptr; 657248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGE("Could not open camera %s: %d", mCameraId.c_str(), rc); 658248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return getHidlStatus(rc); 659248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 660248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 661248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh initHalPreviewWindow(); 662248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh mDeviceCallback = callback; 663248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 664248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (mDevice->ops->set_callbacks) { 665248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh mDevice->ops->set_callbacks(mDevice, 666248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh sNotifyCb, sDataCb, sDataCbTimestamp, sGetMemory, this); 667248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 668248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 669248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return getHidlStatus(rc); 670248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 671248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 672248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia YehReturn<Status> CameraDevice::setPreviewWindow(const sp<ICameraDevicePreviewCallback>& window) { 673248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGV("%s(%s)", __FUNCTION__, mCameraId.c_str()); 674248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh Mutex::Autolock _l(mLock); 675248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (!mDevice) { 676248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGE("%s called while camera is not opened", __FUNCTION__); 677248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return Status::OPERATION_NOT_SUPPORTED; 678248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 679248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 680248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh mHalPreviewWindow.mPreviewCallback = window; 681248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (mDevice->ops->set_preview_window) { 682248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return getHidlStatus(mDevice->ops->set_preview_window(mDevice, 683248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh (window == nullptr) ? nullptr : &mHalPreviewWindow)); 684248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 685248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return Status::INTERNAL_ERROR; // HAL should provide set_preview_window 686248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 687248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 688248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia YehReturn<void> CameraDevice::enableMsgType(uint32_t msgType) { 689248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGV("%s(%s)", __FUNCTION__, mCameraId.c_str()); 690248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh Mutex::Autolock _l(mLock); 691248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (!mDevice) { 692248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGE("%s called while camera is not opened", __FUNCTION__); 693248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return Void(); 694248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 695248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (mDevice->ops->enable_msg_type) { 696248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh mDevice->ops->enable_msg_type(mDevice, msgType); 697248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 698248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return Void(); 699248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 700248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 701248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia YehReturn<void> CameraDevice::disableMsgType(uint32_t msgType) { 702248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGV("%s(%s)", __FUNCTION__, mCameraId.c_str()); 703248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh Mutex::Autolock _l(mLock); 704248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (!mDevice) { 705248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGE("%s called while camera is not opened", __FUNCTION__); 706248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return Void(); 707248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 708248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (mDevice->ops->disable_msg_type) { 709248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh mDevice->ops->disable_msg_type(mDevice, msgType); 710248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 711248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return Void(); 712248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 713248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 714248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia YehReturn<bool> CameraDevice::msgTypeEnabled(uint32_t msgType) { 715248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGV("%s(%s)", __FUNCTION__, mCameraId.c_str()); 716248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh Mutex::Autolock _l(mLock); 717248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (!mDevice) { 718248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGE("%s called while camera is not opened", __FUNCTION__); 719248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return false; 720248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 721248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (mDevice->ops->msg_type_enabled) { 722248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return mDevice->ops->msg_type_enabled(mDevice, msgType); 723248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 724248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return false; 725248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 726248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 727248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia YehReturn<Status> CameraDevice::startPreview() { 728248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGV("%s(%s)", __FUNCTION__, mCameraId.c_str()); 729248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh Mutex::Autolock _l(mLock); 730248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (!mDevice) { 731248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGE("%s called while camera is not opened", __FUNCTION__); 732248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return Status::OPERATION_NOT_SUPPORTED; 733248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 734248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (mDevice->ops->start_preview) { 735248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return getHidlStatus(mDevice->ops->start_preview(mDevice)); 736248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 737248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return Status::INTERNAL_ERROR; // HAL should provide start_preview 738248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 739248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 740248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia YehReturn<void> CameraDevice::stopPreview() { 741248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGV("%s(%s)", __FUNCTION__, mCameraId.c_str()); 742248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh Mutex::Autolock _l(mLock); 743248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (!mDevice) { 744248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGE("%s called while camera is not opened", __FUNCTION__); 745248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return Void(); 746248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 747248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (mDevice->ops->stop_preview) { 748248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh mDevice->ops->stop_preview(mDevice); 749248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 750248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return Void(); 751248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 752248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 753248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia YehReturn<bool> CameraDevice::previewEnabled() { 754248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGV("%s(%s)", __FUNCTION__, mCameraId.c_str()); 755248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh Mutex::Autolock _l(mLock); 756248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (!mDevice) { 757248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGE("%s called while camera is not opened", __FUNCTION__); 758248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return false; 759248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 760248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (mDevice->ops->preview_enabled) { 761248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return mDevice->ops->preview_enabled(mDevice); 762248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 763248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return false; 764248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 765248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 766248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia YehReturn<Status> CameraDevice::storeMetaDataInBuffers(bool enable) { 767248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGV("%s(%s)", __FUNCTION__, mCameraId.c_str()); 768248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh Mutex::Autolock _l(mLock); 769248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (!mDevice) { 770248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGE("%s called while camera is not opened", __FUNCTION__); 771248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return Status::OPERATION_NOT_SUPPORTED; 772248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 773248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (mDevice->ops->store_meta_data_in_buffers) { 774248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh status_t s = mDevice->ops->store_meta_data_in_buffers(mDevice, enable); 775248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (s == OK && enable) { 776248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh mMetadataMode = true; 777248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 778248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return getHidlStatus(s); 779248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 780248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return enable ? Status::ILLEGAL_ARGUMENT : Status::OK; 781248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 782248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 783248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia YehReturn<Status> CameraDevice::startRecording() { 784248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGV("%s(%s)", __FUNCTION__, mCameraId.c_str()); 785248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh Mutex::Autolock _l(mLock); 786248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (!mDevice) { 787248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGE("%s called while camera is not opened", __FUNCTION__); 788248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return Status::OPERATION_NOT_SUPPORTED; 789248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 790248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (mDevice->ops->start_recording) { 791248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return getHidlStatus(mDevice->ops->start_recording(mDevice)); 792248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 793248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return Status::ILLEGAL_ARGUMENT; 794248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 795248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 796248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia YehReturn<void> CameraDevice::stopRecording() { 797248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGV("%s(%s)", __FUNCTION__, mCameraId.c_str()); 798248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh Mutex::Autolock _l(mLock); 799248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (!mDevice) { 800248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGE("%s called while camera is not opened", __FUNCTION__); 801248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return Void(); 802248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 803248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (mDevice->ops->stop_recording) { 804248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh mDevice->ops->stop_recording(mDevice); 805248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 806248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return Void(); 807248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 808248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 809248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia YehReturn<bool> CameraDevice::recordingEnabled() { 810248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGV("%s(%s)", __FUNCTION__, mCameraId.c_str()); 811248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh Mutex::Autolock _l(mLock); 812248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (!mDevice) { 813248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGE("%s called while camera is not opened", __FUNCTION__); 814248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return false; 815248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 816248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (mDevice->ops->recording_enabled) { 817248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return mDevice->ops->recording_enabled(mDevice); 818248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 819248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return false; 820248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 821248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 822248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yehvoid CameraDevice::releaseRecordingFrameLocked( 823248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh uint32_t memId, uint32_t bufferIndex, const native_handle_t* handle) { 824248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (!mDevice) { 825248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGE("%s called while camera is not opened", __FUNCTION__); 826248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return; 827248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 828248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (mDevice->ops->release_recording_frame) { 829248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh CameraHeapMemory* camMemory = mMemoryMap.at(memId); 830248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (bufferIndex >= camMemory->mNumBufs) { 831248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGE("%s: bufferIndex %d exceeds number of buffers %d", 832248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh __FUNCTION__, bufferIndex, camMemory->mNumBufs); 833248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return; 834248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 83512b364bf8aa87ddc43df7b590d1f1d9b6dc5b061Yin-Chia Yeh void *data = ((uint8_t *) camMemory->mHidlHeapMemData) + bufferIndex * camMemory->mBufSize; 836248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (handle) { 837248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh VideoNativeHandleMetadata* md = (VideoNativeHandleMetadata*) data; 8381ee279df205218fb7372baf031fb93d2a0d6a821Yin-Chia Yeh if (md->eType == kMetadataBufferTypeNativeHandleSource) { 839248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh // Input handle will be closed by HIDL transport later, so clone it 840248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh // HAL implementation is responsible to close/delete the clone 841248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh native_handle_t* clone = native_handle_clone(handle); 842248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (!clone) { 843248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGE("%s: failed to clone buffer %p", __FUNCTION__, handle); 844248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return; 845248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 846248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh md->pHandle = clone; 847248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } else { 848248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGE("%s:Malform VideoNativeHandleMetadata at memId %d, bufferId %d", 849248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh __FUNCTION__, memId, bufferIndex); 850248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return; 851248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 852248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 853248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh mDevice->ops->release_recording_frame(mDevice, data); 854248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 855248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 856248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 857248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia YehReturn<void> CameraDevice::releaseRecordingFrame(uint32_t memId, uint32_t bufferIndex) { 858248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGV("%s(%s)", __FUNCTION__, mCameraId.c_str()); 859248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh Mutex::Autolock _l(mLock); 860248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh releaseRecordingFrameLocked(memId, bufferIndex, nullptr); 861248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return Void(); 862248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 863248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 864248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia YehReturn<void> CameraDevice::releaseRecordingFrameHandle( 865248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh uint32_t memId, uint32_t bufferIndex, const hidl_handle& frame) { 866248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGV("%s(%s)", __FUNCTION__, mCameraId.c_str()); 867248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh Mutex::Autolock _l(mLock); 868248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh releaseRecordingFrameLocked( 869248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh memId, bufferIndex, frame.getNativeHandle()); 870248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return Void(); 871248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 872248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 8731ba83a9a282afa086ac2431942a4814633438ffcYin-Chia YehReturn<void> CameraDevice::releaseRecordingFrameHandleBatch( 8741ba83a9a282afa086ac2431942a4814633438ffcYin-Chia Yeh const hidl_vec<VideoFrameMessage>& msgs) { 8751ba83a9a282afa086ac2431942a4814633438ffcYin-Chia Yeh ALOGV("%s(%s)", __FUNCTION__, mCameraId.c_str()); 8761ba83a9a282afa086ac2431942a4814633438ffcYin-Chia Yeh Mutex::Autolock _l(mLock); 8771ba83a9a282afa086ac2431942a4814633438ffcYin-Chia Yeh for (auto& msg : msgs) { 8781ba83a9a282afa086ac2431942a4814633438ffcYin-Chia Yeh releaseRecordingFrameLocked( 8791ba83a9a282afa086ac2431942a4814633438ffcYin-Chia Yeh msg.data, msg.bufferIndex, msg.frameData.getNativeHandle()); 8801ba83a9a282afa086ac2431942a4814633438ffcYin-Chia Yeh } 8811ba83a9a282afa086ac2431942a4814633438ffcYin-Chia Yeh return Void(); 8821ba83a9a282afa086ac2431942a4814633438ffcYin-Chia Yeh} 8831ba83a9a282afa086ac2431942a4814633438ffcYin-Chia Yeh 884248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia YehReturn<Status> CameraDevice::autoFocus() { 885248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGV("%s(%s)", __FUNCTION__, mCameraId.c_str()); 886248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh Mutex::Autolock _l(mLock); 887248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (!mDevice) { 888248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGE("%s called while camera is not opened", __FUNCTION__); 889248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return Status::OPERATION_NOT_SUPPORTED; 890248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 891248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (mDevice->ops->auto_focus) { 892248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return getHidlStatus(mDevice->ops->auto_focus(mDevice)); 893248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 894248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return Status::ILLEGAL_ARGUMENT; 895248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 896248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 897248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia YehReturn<Status> CameraDevice::cancelAutoFocus() { 898248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGV("%s(%s)", __FUNCTION__, mCameraId.c_str()); 899248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh Mutex::Autolock _l(mLock); 900248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (!mDevice) { 901248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGE("%s called while camera is not opened", __FUNCTION__); 902248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return Status::OPERATION_NOT_SUPPORTED; 903248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 904248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (mDevice->ops->cancel_auto_focus) { 905248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return getHidlStatus(mDevice->ops->cancel_auto_focus(mDevice)); 906248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 907248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return Status::ILLEGAL_ARGUMENT; 908248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 909248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 910248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia YehReturn<Status> CameraDevice::takePicture() { 911248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGV("%s(%s)", __FUNCTION__, mCameraId.c_str()); 912248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh Mutex::Autolock _l(mLock); 913248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (!mDevice) { 914248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGE("%s called while camera is not opened", __FUNCTION__); 915248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return Status::OPERATION_NOT_SUPPORTED; 916248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 917248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (mDevice->ops->take_picture) { 918248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return getHidlStatus(mDevice->ops->take_picture(mDevice)); 919248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 920248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return Status::ILLEGAL_ARGUMENT; 921248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 922248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 923248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia YehReturn<Status> CameraDevice::cancelPicture() { 924248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGV("%s(%s)", __FUNCTION__, mCameraId.c_str()); 925248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh Mutex::Autolock _l(mLock); 926248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (!mDevice) { 927248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGE("%s called while camera is not opened", __FUNCTION__); 928248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return Status::OPERATION_NOT_SUPPORTED; 929248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 930248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (mDevice->ops->cancel_picture) { 931248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return getHidlStatus(mDevice->ops->cancel_picture(mDevice)); 932248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 933248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return Status::ILLEGAL_ARGUMENT; 934248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 935248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 936248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia YehReturn<Status> CameraDevice::setParameters(const hidl_string& params) { 937248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGV("%s(%s)", __FUNCTION__, mCameraId.c_str()); 938248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh Mutex::Autolock _l(mLock); 939248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (!mDevice) { 940248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGE("%s called while camera is not opened", __FUNCTION__); 941248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return Status::OPERATION_NOT_SUPPORTED; 942248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 943248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (mDevice->ops->set_parameters) { 944248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return getHidlStatus(mDevice->ops->set_parameters(mDevice, params.c_str())); 945248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 946248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return Status::ILLEGAL_ARGUMENT; 947248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 948248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 949248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia YehReturn<void> CameraDevice::getParameters(getParameters_cb _hidl_cb) { 950248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGV("%s(%s)", __FUNCTION__, mCameraId.c_str()); 951248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh Mutex::Autolock _l(mLock); 952248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh hidl_string outStr; 953248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (!mDevice) { 954248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGE("%s called while camera is not opened", __FUNCTION__); 955248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh _hidl_cb(outStr); 956248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return Void(); 957248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 958248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (mDevice->ops->get_parameters) { 959248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh char *temp = mDevice->ops->get_parameters(mDevice); 960248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh outStr = temp; 961248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (mDevice->ops->put_parameters) { 962248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh mDevice->ops->put_parameters(mDevice, temp); 963248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } else { 964248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh free(temp); 965248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 966248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 967248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh _hidl_cb(outStr); 968248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return Void(); 969248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 970248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 971248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia YehReturn<Status> CameraDevice::sendCommand(CommandType cmd, int32_t arg1, int32_t arg2) { 972248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGV("%s(%s)", __FUNCTION__, mCameraId.c_str()); 973248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh Mutex::Autolock _l(mLock); 974248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (!mDevice) { 975248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGE("%s called while camera is not opened", __FUNCTION__); 976248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return Status::OPERATION_NOT_SUPPORTED; 977248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 978248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (mDevice->ops->send_command) { 979248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return getHidlStatus(mDevice->ops->send_command(mDevice, (int32_t) cmd, arg1, arg2)); 980248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 981248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh return Status::ILLEGAL_ARGUMENT; 982248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 983248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 984248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia YehReturn<void> CameraDevice::close() { 985248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh Mutex::Autolock _l(mLock); 986a8dcad048c1adb1870fca945bf85197470d5ed29Yahan Zhou closeLocked(); 987a8dcad048c1adb1870fca945bf85197470d5ed29Yahan Zhou return Void(); 988a8dcad048c1adb1870fca945bf85197470d5ed29Yahan Zhou} 989a8dcad048c1adb1870fca945bf85197470d5ed29Yahan Zhou 990a8dcad048c1adb1870fca945bf85197470d5ed29Yahan Zhouvoid CameraDevice::closeLocked() { 991a8dcad048c1adb1870fca945bf85197470d5ed29Yahan Zhou ALOGI("Closing camera %s", mCameraId.c_str()); 992248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if(mDevice) { 993248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh int rc = mDevice->common.close(&mDevice->common); 994248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh if (rc != OK) { 995248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh ALOGE("Could not close camera %s: %d", mCameraId.c_str(), rc); 996248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 997248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh mDevice = nullptr; 998248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh } 999248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} 1000248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh 1001248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} // namespace implementation 1002248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} // namespace V1_0 1003248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} // namespace device 1004248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} // namespace camera 1005248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} // namespace hardware 1006248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh} // namespace android 1007