1046205c058ab70be78163ebcacfdc344a7f8750aZhijun He/* 2046205c058ab70be78163ebcacfdc344a7f8750aZhijun He * Copyright (C) 2015 The Android Open Source Project 3046205c058ab70be78163ebcacfdc344a7f8750aZhijun He * 4046205c058ab70be78163ebcacfdc344a7f8750aZhijun He * Licensed under the Apache License, Version 2.0 (the "License"); 5046205c058ab70be78163ebcacfdc344a7f8750aZhijun He * you may not use this file except in compliance with the License. 6046205c058ab70be78163ebcacfdc344a7f8750aZhijun He * You may obtain a copy of the License at 7046205c058ab70be78163ebcacfdc344a7f8750aZhijun He * 8046205c058ab70be78163ebcacfdc344a7f8750aZhijun He * http://www.apache.org/licenses/LICENSE-2.0 9046205c058ab70be78163ebcacfdc344a7f8750aZhijun He * 10046205c058ab70be78163ebcacfdc344a7f8750aZhijun He * Unless required by applicable law or agreed to in writing, software 11046205c058ab70be78163ebcacfdc344a7f8750aZhijun He * distributed under the License is distributed on an "AS IS" BASIS, 12046205c058ab70be78163ebcacfdc344a7f8750aZhijun He * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13046205c058ab70be78163ebcacfdc344a7f8750aZhijun He * See the License for the specific language governing permissions and 14046205c058ab70be78163ebcacfdc344a7f8750aZhijun He * limitations under the License. 15046205c058ab70be78163ebcacfdc344a7f8750aZhijun He */ 16046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 17046205c058ab70be78163ebcacfdc344a7f8750aZhijun He//#define LOG_NDEBUG 0 18046205c058ab70be78163ebcacfdc344a7f8750aZhijun He#define LOG_TAG "Camera" 19046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 20d88dfe8607af019186a309674d9081a056ed3daaMark Salyzyn#include <errno.h> 21046205c058ab70be78163ebcacfdc344a7f8750aZhijun He#include <stdio.h> 22d88dfe8607af019186a309674d9081a056ed3daaMark Salyzyn#include <string.h> 23d88dfe8607af019186a309674d9081a056ed3daaMark Salyzyn#include <time.h> 24d88dfe8607af019186a309674d9081a056ed3daaMark Salyzyn 25d88dfe8607af019186a309674d9081a056ed3daaMark Salyzyn#include <cstdlib> 26d88dfe8607af019186a309674d9081a056ed3daaMark Salyzyn 27d88dfe8607af019186a309674d9081a056ed3daaMark Salyzyn#include <log/log.h> 28d88dfe8607af019186a309674d9081a056ed3daaMark Salyzyn#include <utils/Mutex.h> 29d88dfe8607af019186a309674d9081a056ed3daaMark Salyzyn 30d88dfe8607af019186a309674d9081a056ed3daaMark Salyzyn#define ATRACE_TAG (ATRACE_TAG_CAMERA | ATRACE_TAG_HAL) 31d88dfe8607af019186a309674d9081a056ed3daaMark Salyzyn#include <utils/Trace.h> 32d88dfe8607af019186a309674d9081a056ed3daaMark Salyzyn 33046205c058ab70be78163ebcacfdc344a7f8750aZhijun He#include <hardware/camera3.h> 34046205c058ab70be78163ebcacfdc344a7f8750aZhijun He#include <system/camera_metadata.h> 35046205c058ab70be78163ebcacfdc344a7f8750aZhijun He#include <system/graphics.h> 36d88dfe8607af019186a309674d9081a056ed3daaMark Salyzyn 37046205c058ab70be78163ebcacfdc344a7f8750aZhijun He#include "CameraHAL.h" 38046205c058ab70be78163ebcacfdc344a7f8750aZhijun He#include "Metadata.h" 39046205c058ab70be78163ebcacfdc344a7f8750aZhijun He#include "Stream.h" 40046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 41046205c058ab70be78163ebcacfdc344a7f8750aZhijun He#include "Camera.h" 42046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 43046205c058ab70be78163ebcacfdc344a7f8750aZhijun Henamespace usb_camera_hal { 44046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 45046205c058ab70be78163ebcacfdc344a7f8750aZhijun Heextern "C" { 46046205c058ab70be78163ebcacfdc344a7f8750aZhijun He// Shim passed to the framework to close an opened device. 47046205c058ab70be78163ebcacfdc344a7f8750aZhijun Hestatic int close_device(hw_device_t* dev) { 48046205c058ab70be78163ebcacfdc344a7f8750aZhijun He camera3_device_t* cam_dev = reinterpret_cast<camera3_device_t*>(dev); 49046205c058ab70be78163ebcacfdc344a7f8750aZhijun He Camera* cam = static_cast<Camera*>(cam_dev->priv); 50046205c058ab70be78163ebcacfdc344a7f8750aZhijun He return cam->close(); 51046205c058ab70be78163ebcacfdc344a7f8750aZhijun He} 52046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 53046205c058ab70be78163ebcacfdc344a7f8750aZhijun He// Get handle to camera from device priv data 54046205c058ab70be78163ebcacfdc344a7f8750aZhijun Hestatic Camera *camdev_to_camera(const camera3_device_t *dev) { 55046205c058ab70be78163ebcacfdc344a7f8750aZhijun He return reinterpret_cast<Camera*>(dev->priv); 56046205c058ab70be78163ebcacfdc344a7f8750aZhijun He} 57046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 58046205c058ab70be78163ebcacfdc344a7f8750aZhijun Hestatic int initialize(const camera3_device_t *dev, 59046205c058ab70be78163ebcacfdc344a7f8750aZhijun He const camera3_callback_ops_t *callback_ops) { 60046205c058ab70be78163ebcacfdc344a7f8750aZhijun He return camdev_to_camera(dev)->initialize(callback_ops); 61046205c058ab70be78163ebcacfdc344a7f8750aZhijun He} 62046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 63046205c058ab70be78163ebcacfdc344a7f8750aZhijun Hestatic int configure_streams(const camera3_device_t *dev, 64046205c058ab70be78163ebcacfdc344a7f8750aZhijun He camera3_stream_configuration_t *stream_list) { 65046205c058ab70be78163ebcacfdc344a7f8750aZhijun He return camdev_to_camera(dev)->configureStreams(stream_list); 66046205c058ab70be78163ebcacfdc344a7f8750aZhijun He} 67046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 68046205c058ab70be78163ebcacfdc344a7f8750aZhijun Hestatic const camera_metadata_t *construct_default_request_settings( 69046205c058ab70be78163ebcacfdc344a7f8750aZhijun He const camera3_device_t *dev, int type) { 70046205c058ab70be78163ebcacfdc344a7f8750aZhijun He return camdev_to_camera(dev)->constructDefaultRequestSettings(type); 71046205c058ab70be78163ebcacfdc344a7f8750aZhijun He} 72046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 73046205c058ab70be78163ebcacfdc344a7f8750aZhijun Hestatic int process_capture_request(const camera3_device_t *dev, 74046205c058ab70be78163ebcacfdc344a7f8750aZhijun He camera3_capture_request_t *request) { 75046205c058ab70be78163ebcacfdc344a7f8750aZhijun He return camdev_to_camera(dev)->processCaptureRequest(request); 76046205c058ab70be78163ebcacfdc344a7f8750aZhijun He} 77046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 78046205c058ab70be78163ebcacfdc344a7f8750aZhijun Hestatic void dump(const camera3_device_t *dev, int fd) { 79046205c058ab70be78163ebcacfdc344a7f8750aZhijun He camdev_to_camera(dev)->dump(fd); 80046205c058ab70be78163ebcacfdc344a7f8750aZhijun He} 81046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 82046205c058ab70be78163ebcacfdc344a7f8750aZhijun Hestatic int flush(const camera3_device_t *dev) { 83046205c058ab70be78163ebcacfdc344a7f8750aZhijun He return camdev_to_camera(dev)->flush(); 84046205c058ab70be78163ebcacfdc344a7f8750aZhijun He} 85046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 86046205c058ab70be78163ebcacfdc344a7f8750aZhijun He} // extern "C" 87046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 88046205c058ab70be78163ebcacfdc344a7f8750aZhijun Heconst camera3_device_ops_t Camera::sOps = { 89046205c058ab70be78163ebcacfdc344a7f8750aZhijun He .initialize = usb_camera_hal::initialize, 90046205c058ab70be78163ebcacfdc344a7f8750aZhijun He .configure_streams = usb_camera_hal::configure_streams, 91046205c058ab70be78163ebcacfdc344a7f8750aZhijun He .register_stream_buffers = NULL, 92046205c058ab70be78163ebcacfdc344a7f8750aZhijun He .construct_default_request_settings 93046205c058ab70be78163ebcacfdc344a7f8750aZhijun He = usb_camera_hal::construct_default_request_settings, 94046205c058ab70be78163ebcacfdc344a7f8750aZhijun He .process_capture_request = usb_camera_hal::process_capture_request, 95046205c058ab70be78163ebcacfdc344a7f8750aZhijun He .get_metadata_vendor_tag_ops = NULL, 96046205c058ab70be78163ebcacfdc344a7f8750aZhijun He .dump = usb_camera_hal::dump, 97046205c058ab70be78163ebcacfdc344a7f8750aZhijun He .flush = usb_camera_hal::flush, 98046205c058ab70be78163ebcacfdc344a7f8750aZhijun He .reserved = {0}, 99046205c058ab70be78163ebcacfdc344a7f8750aZhijun He}; 100046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 101046205c058ab70be78163ebcacfdc344a7f8750aZhijun HeCamera::Camera(int id) 102046205c058ab70be78163ebcacfdc344a7f8750aZhijun He : mId(id), 103046205c058ab70be78163ebcacfdc344a7f8750aZhijun He mStaticInfo(NULL), 104046205c058ab70be78163ebcacfdc344a7f8750aZhijun He mBusy(false), 105046205c058ab70be78163ebcacfdc344a7f8750aZhijun He mCallbackOps(NULL), 106046205c058ab70be78163ebcacfdc344a7f8750aZhijun He mSettings(NULL), 107046205c058ab70be78163ebcacfdc344a7f8750aZhijun He mIsInitialized(false) { 108046205c058ab70be78163ebcacfdc344a7f8750aZhijun He memset(&mTemplates, 0, sizeof(mTemplates)); 109046205c058ab70be78163ebcacfdc344a7f8750aZhijun He memset(&mDevice, 0, sizeof(mDevice)); 110046205c058ab70be78163ebcacfdc344a7f8750aZhijun He mDevice.common.tag = HARDWARE_DEVICE_TAG; 111046205c058ab70be78163ebcacfdc344a7f8750aZhijun He // TODO: Upgrade to HAL3.3 112046205c058ab70be78163ebcacfdc344a7f8750aZhijun He mDevice.common.version = CAMERA_DEVICE_API_VERSION_3_2; 113046205c058ab70be78163ebcacfdc344a7f8750aZhijun He mDevice.common.close = close_device; 114046205c058ab70be78163ebcacfdc344a7f8750aZhijun He mDevice.ops = const_cast<camera3_device_ops_t*>(&sOps); 115046205c058ab70be78163ebcacfdc344a7f8750aZhijun He mDevice.priv = this; 116046205c058ab70be78163ebcacfdc344a7f8750aZhijun He} 117046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 118046205c058ab70be78163ebcacfdc344a7f8750aZhijun HeCamera::~Camera() { 119046205c058ab70be78163ebcacfdc344a7f8750aZhijun He if (mStaticInfo != NULL) { 120046205c058ab70be78163ebcacfdc344a7f8750aZhijun He free_camera_metadata(mStaticInfo); 121046205c058ab70be78163ebcacfdc344a7f8750aZhijun He } 122046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 123046205c058ab70be78163ebcacfdc344a7f8750aZhijun He for (int i = 0; i < CAMERA3_TEMPLATE_COUNT; i++) { 124046205c058ab70be78163ebcacfdc344a7f8750aZhijun He free_camera_metadata(mTemplates[i]); 125046205c058ab70be78163ebcacfdc344a7f8750aZhijun He } 126046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 127046205c058ab70be78163ebcacfdc344a7f8750aZhijun He if (mSettings != NULL) { 128046205c058ab70be78163ebcacfdc344a7f8750aZhijun He free_camera_metadata(mSettings); 129046205c058ab70be78163ebcacfdc344a7f8750aZhijun He } 130046205c058ab70be78163ebcacfdc344a7f8750aZhijun He} 131046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 132046205c058ab70be78163ebcacfdc344a7f8750aZhijun Heint Camera::open(const hw_module_t *module, hw_device_t **device) { 133046205c058ab70be78163ebcacfdc344a7f8750aZhijun He ALOGI("%s:%d: Opening camera device", __func__, mId); 134046205c058ab70be78163ebcacfdc344a7f8750aZhijun He ATRACE_CALL(); 135046205c058ab70be78163ebcacfdc344a7f8750aZhijun He android::Mutex::Autolock al(mDeviceLock); 136046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 137046205c058ab70be78163ebcacfdc344a7f8750aZhijun He if (mBusy) { 138046205c058ab70be78163ebcacfdc344a7f8750aZhijun He ALOGE("%s:%d: Error! Camera device already opened", __func__, mId); 139046205c058ab70be78163ebcacfdc344a7f8750aZhijun He return -EBUSY; 140046205c058ab70be78163ebcacfdc344a7f8750aZhijun He } 141046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 142046205c058ab70be78163ebcacfdc344a7f8750aZhijun He mBusy = true; 143046205c058ab70be78163ebcacfdc344a7f8750aZhijun He mDevice.common.module = const_cast<hw_module_t*>(module); 144046205c058ab70be78163ebcacfdc344a7f8750aZhijun He *device = &mDevice.common; 145046205c058ab70be78163ebcacfdc344a7f8750aZhijun He return openDevice(); 146046205c058ab70be78163ebcacfdc344a7f8750aZhijun He} 147046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 148046205c058ab70be78163ebcacfdc344a7f8750aZhijun Heint Camera::getInfo(struct camera_info *info) { 149046205c058ab70be78163ebcacfdc344a7f8750aZhijun He android::Mutex::Autolock al(mStaticInfoLock); 150046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 151046205c058ab70be78163ebcacfdc344a7f8750aZhijun He // TODO: update to CAMERA_FACING_EXTERNAL once the HAL API changes are merged. 152046205c058ab70be78163ebcacfdc344a7f8750aZhijun He info->facing = CAMERA_FACING_FRONT; 153046205c058ab70be78163ebcacfdc344a7f8750aZhijun He info->orientation = 0; 154046205c058ab70be78163ebcacfdc344a7f8750aZhijun He info->device_version = mDevice.common.version; 155046205c058ab70be78163ebcacfdc344a7f8750aZhijun He if (mStaticInfo == NULL) { 156046205c058ab70be78163ebcacfdc344a7f8750aZhijun He initStaticInfo(); 157046205c058ab70be78163ebcacfdc344a7f8750aZhijun He } 158046205c058ab70be78163ebcacfdc344a7f8750aZhijun He info->static_camera_characteristics = mStaticInfo; 159046205c058ab70be78163ebcacfdc344a7f8750aZhijun He return 0; 160046205c058ab70be78163ebcacfdc344a7f8750aZhijun He} 161046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 162046205c058ab70be78163ebcacfdc344a7f8750aZhijun Hevoid Camera::updateInfo() { 163046205c058ab70be78163ebcacfdc344a7f8750aZhijun He android::Mutex::Autolock al(mStaticInfoLock); 164046205c058ab70be78163ebcacfdc344a7f8750aZhijun He initStaticInfo(); 165046205c058ab70be78163ebcacfdc344a7f8750aZhijun He} 166046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 167046205c058ab70be78163ebcacfdc344a7f8750aZhijun Heint Camera::close() { 168046205c058ab70be78163ebcacfdc344a7f8750aZhijun He ALOGI("%s:%d: Closing camera device", __func__, mId); 169046205c058ab70be78163ebcacfdc344a7f8750aZhijun He ATRACE_CALL(); 170046205c058ab70be78163ebcacfdc344a7f8750aZhijun He android::Mutex::Autolock al(mDeviceLock); 171046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 172046205c058ab70be78163ebcacfdc344a7f8750aZhijun He if (!mBusy) { 173046205c058ab70be78163ebcacfdc344a7f8750aZhijun He ALOGE("%s:%d: Error! Camera device not open", __func__, mId); 174046205c058ab70be78163ebcacfdc344a7f8750aZhijun He return -EINVAL; 175046205c058ab70be78163ebcacfdc344a7f8750aZhijun He } 176046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 177046205c058ab70be78163ebcacfdc344a7f8750aZhijun He mBusy = false; 178046205c058ab70be78163ebcacfdc344a7f8750aZhijun He mIsInitialized = false; 179046205c058ab70be78163ebcacfdc344a7f8750aZhijun He return closeDevice(); 180046205c058ab70be78163ebcacfdc344a7f8750aZhijun He} 181046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 182046205c058ab70be78163ebcacfdc344a7f8750aZhijun Heint Camera::initialize(const camera3_callback_ops_t *callback_ops) { 183046205c058ab70be78163ebcacfdc344a7f8750aZhijun He int res; 184046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 185046205c058ab70be78163ebcacfdc344a7f8750aZhijun He ALOGV("%s:%d: callback_ops=%p", __func__, mId, callback_ops); 186046205c058ab70be78163ebcacfdc344a7f8750aZhijun He ATRACE_CALL(); 187046205c058ab70be78163ebcacfdc344a7f8750aZhijun He android::Mutex::Autolock al(mDeviceLock); 188046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 189046205c058ab70be78163ebcacfdc344a7f8750aZhijun He mCallbackOps = callback_ops; 190046205c058ab70be78163ebcacfdc344a7f8750aZhijun He // per-device specific initialization 191046205c058ab70be78163ebcacfdc344a7f8750aZhijun He res = initDevice(); 192046205c058ab70be78163ebcacfdc344a7f8750aZhijun He if (res != 0) { 193046205c058ab70be78163ebcacfdc344a7f8750aZhijun He ALOGE("%s:%d: Failed to initialize device!", __func__, mId); 194046205c058ab70be78163ebcacfdc344a7f8750aZhijun He return res; 195046205c058ab70be78163ebcacfdc344a7f8750aZhijun He } 196046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 197046205c058ab70be78163ebcacfdc344a7f8750aZhijun He mIsInitialized = true; 198046205c058ab70be78163ebcacfdc344a7f8750aZhijun He return 0; 199046205c058ab70be78163ebcacfdc344a7f8750aZhijun He} 200046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 201046205c058ab70be78163ebcacfdc344a7f8750aZhijun Heint Camera::configureStreams(camera3_stream_configuration_t *stream_config) { 202046205c058ab70be78163ebcacfdc344a7f8750aZhijun He camera3_stream_t *astream; 203046205c058ab70be78163ebcacfdc344a7f8750aZhijun He android::Vector<Stream *> newStreams; 204046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 205046205c058ab70be78163ebcacfdc344a7f8750aZhijun He ALOGV("%s:%d: stream_config=%p", __func__, mId, stream_config); 206046205c058ab70be78163ebcacfdc344a7f8750aZhijun He ATRACE_CALL(); 207046205c058ab70be78163ebcacfdc344a7f8750aZhijun He android::Mutex::Autolock al(mDeviceLock); 208046205c058ab70be78163ebcacfdc344a7f8750aZhijun He if (!mIsInitialized) { 209046205c058ab70be78163ebcacfdc344a7f8750aZhijun He ALOGE("Device is not initialized yet"); 210046205c058ab70be78163ebcacfdc344a7f8750aZhijun He return -EINVAL; 211046205c058ab70be78163ebcacfdc344a7f8750aZhijun He } 212046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 213046205c058ab70be78163ebcacfdc344a7f8750aZhijun He if (stream_config == NULL) { 214046205c058ab70be78163ebcacfdc344a7f8750aZhijun He ALOGE("%s:%d: NULL stream configuration array", __func__, mId); 215046205c058ab70be78163ebcacfdc344a7f8750aZhijun He return -EINVAL; 216046205c058ab70be78163ebcacfdc344a7f8750aZhijun He } 217046205c058ab70be78163ebcacfdc344a7f8750aZhijun He if (stream_config->num_streams == 0) { 218046205c058ab70be78163ebcacfdc344a7f8750aZhijun He ALOGE("%s:%d: Empty stream configuration array", __func__, mId); 219046205c058ab70be78163ebcacfdc344a7f8750aZhijun He return -EINVAL; 220046205c058ab70be78163ebcacfdc344a7f8750aZhijun He } 221046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 222046205c058ab70be78163ebcacfdc344a7f8750aZhijun He ALOGV("%s:%d: Number of Streams: %d", __func__, mId, 223046205c058ab70be78163ebcacfdc344a7f8750aZhijun He stream_config->num_streams); 224046205c058ab70be78163ebcacfdc344a7f8750aZhijun He // Mark all current streams unused for now 225046205c058ab70be78163ebcacfdc344a7f8750aZhijun He for (size_t i = 0; i < mStreams.size(); i++) { 226046205c058ab70be78163ebcacfdc344a7f8750aZhijun He mStreams[i]->mReuse = false; 227046205c058ab70be78163ebcacfdc344a7f8750aZhijun He } 228046205c058ab70be78163ebcacfdc344a7f8750aZhijun He // Fill new stream array with reused streams and new streams 229046205c058ab70be78163ebcacfdc344a7f8750aZhijun He for (unsigned int i = 0; i < stream_config->num_streams; i++) { 230046205c058ab70be78163ebcacfdc344a7f8750aZhijun He astream = stream_config->streams[i]; 231046205c058ab70be78163ebcacfdc344a7f8750aZhijun He if (astream->max_buffers > 0) { 232046205c058ab70be78163ebcacfdc344a7f8750aZhijun He ALOGV("%s:%d: Reusing stream %d", __func__, mId, i); 233046205c058ab70be78163ebcacfdc344a7f8750aZhijun He newStreams.add(reuseStreamLocked(astream)); 234046205c058ab70be78163ebcacfdc344a7f8750aZhijun He } else { 235046205c058ab70be78163ebcacfdc344a7f8750aZhijun He ALOGV("%s:%d: Creating new stream %d", __func__, mId, i); 236046205c058ab70be78163ebcacfdc344a7f8750aZhijun He newStreams.add(new Stream(mId, astream)); 237046205c058ab70be78163ebcacfdc344a7f8750aZhijun He } 238046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 239046205c058ab70be78163ebcacfdc344a7f8750aZhijun He if (newStreams[i] == NULL) { 240046205c058ab70be78163ebcacfdc344a7f8750aZhijun He ALOGE("%s:%d: Error processing stream %d", __func__, mId, i); 241046205c058ab70be78163ebcacfdc344a7f8750aZhijun He goto err_out; 242046205c058ab70be78163ebcacfdc344a7f8750aZhijun He } 243046205c058ab70be78163ebcacfdc344a7f8750aZhijun He astream->priv = reinterpret_cast<void *>(newStreams[i]); 244046205c058ab70be78163ebcacfdc344a7f8750aZhijun He } 245046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 246046205c058ab70be78163ebcacfdc344a7f8750aZhijun He // Verify the set of streams in aggregate 247046205c058ab70be78163ebcacfdc344a7f8750aZhijun He if (!isValidStreamSetLocked(newStreams)) { 248046205c058ab70be78163ebcacfdc344a7f8750aZhijun He ALOGE("%s:%d: Invalid stream set", __func__, mId); 249046205c058ab70be78163ebcacfdc344a7f8750aZhijun He goto err_out; 250046205c058ab70be78163ebcacfdc344a7f8750aZhijun He } 251046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 252046205c058ab70be78163ebcacfdc344a7f8750aZhijun He // Set up all streams (calculate usage/max_buffers for each) 253046205c058ab70be78163ebcacfdc344a7f8750aZhijun He setupStreamsLocked(newStreams); 254046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 255046205c058ab70be78163ebcacfdc344a7f8750aZhijun He // Destroy all old streams and replace stream array with new one 256046205c058ab70be78163ebcacfdc344a7f8750aZhijun He destroyStreamsLocked(mStreams); 257046205c058ab70be78163ebcacfdc344a7f8750aZhijun He mStreams = newStreams; 258046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 259046205c058ab70be78163ebcacfdc344a7f8750aZhijun He // Clear out last seen settings metadata 260046205c058ab70be78163ebcacfdc344a7f8750aZhijun He updateSettingsLocked(NULL); 261046205c058ab70be78163ebcacfdc344a7f8750aZhijun He return 0; 262046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 263046205c058ab70be78163ebcacfdc344a7f8750aZhijun Heerr_out: 264046205c058ab70be78163ebcacfdc344a7f8750aZhijun He // Clean up temporary streams, preserve existing mStreams 265046205c058ab70be78163ebcacfdc344a7f8750aZhijun He destroyStreamsLocked(newStreams); 266046205c058ab70be78163ebcacfdc344a7f8750aZhijun He return -EINVAL; 267046205c058ab70be78163ebcacfdc344a7f8750aZhijun He} 268046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 269046205c058ab70be78163ebcacfdc344a7f8750aZhijun Hevoid Camera::destroyStreamsLocked(android::Vector<Stream *> &streams) { 270046205c058ab70be78163ebcacfdc344a7f8750aZhijun He for (size_t i = 0; i < streams.size(); i++) { 271046205c058ab70be78163ebcacfdc344a7f8750aZhijun He delete streams[i]; 272046205c058ab70be78163ebcacfdc344a7f8750aZhijun He } 273046205c058ab70be78163ebcacfdc344a7f8750aZhijun He streams.clear(); 274046205c058ab70be78163ebcacfdc344a7f8750aZhijun He} 275046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 276046205c058ab70be78163ebcacfdc344a7f8750aZhijun HeStream *Camera::reuseStreamLocked(camera3_stream_t *astream) { 277046205c058ab70be78163ebcacfdc344a7f8750aZhijun He Stream *priv = reinterpret_cast<Stream*>(astream->priv); 278046205c058ab70be78163ebcacfdc344a7f8750aZhijun He // Verify the re-used stream's parameters match 279046205c058ab70be78163ebcacfdc344a7f8750aZhijun He if (!priv->isValidReuseStream(mId, astream)) { 280046205c058ab70be78163ebcacfdc344a7f8750aZhijun He ALOGE("%s:%d: Mismatched parameter in reused stream", __func__, mId); 281046205c058ab70be78163ebcacfdc344a7f8750aZhijun He return NULL; 282046205c058ab70be78163ebcacfdc344a7f8750aZhijun He } 283046205c058ab70be78163ebcacfdc344a7f8750aZhijun He // Mark stream to be reused 284046205c058ab70be78163ebcacfdc344a7f8750aZhijun He priv->mReuse = true; 285046205c058ab70be78163ebcacfdc344a7f8750aZhijun He return priv; 286046205c058ab70be78163ebcacfdc344a7f8750aZhijun He} 287046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 288046205c058ab70be78163ebcacfdc344a7f8750aZhijun Hebool Camera::isValidStreamSetLocked(const android::Vector<Stream *> &streams) { 289046205c058ab70be78163ebcacfdc344a7f8750aZhijun He int inputs = 0; 290046205c058ab70be78163ebcacfdc344a7f8750aZhijun He int outputs = 0; 291046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 292046205c058ab70be78163ebcacfdc344a7f8750aZhijun He if (streams.isEmpty()) { 293046205c058ab70be78163ebcacfdc344a7f8750aZhijun He ALOGE("%s:%d: Zero count stream configuration streams", __func__, mId); 294046205c058ab70be78163ebcacfdc344a7f8750aZhijun He return false; 295046205c058ab70be78163ebcacfdc344a7f8750aZhijun He } 296046205c058ab70be78163ebcacfdc344a7f8750aZhijun He // Validate there is at most one input stream and at least one output stream 297046205c058ab70be78163ebcacfdc344a7f8750aZhijun He for (size_t i = 0; i < streams.size(); i++) { 298046205c058ab70be78163ebcacfdc344a7f8750aZhijun He // A stream may be both input and output (bidirectional) 299046205c058ab70be78163ebcacfdc344a7f8750aZhijun He if (streams[i]->isInputType()) 300046205c058ab70be78163ebcacfdc344a7f8750aZhijun He inputs++; 301046205c058ab70be78163ebcacfdc344a7f8750aZhijun He if (streams[i]->isOutputType()) 302046205c058ab70be78163ebcacfdc344a7f8750aZhijun He outputs++; 303046205c058ab70be78163ebcacfdc344a7f8750aZhijun He } 304046205c058ab70be78163ebcacfdc344a7f8750aZhijun He ALOGV("%s:%d: Configuring %d output streams and %d input streams", 305046205c058ab70be78163ebcacfdc344a7f8750aZhijun He __func__, mId, outputs, inputs); 306046205c058ab70be78163ebcacfdc344a7f8750aZhijun He if (outputs < 1) { 307046205c058ab70be78163ebcacfdc344a7f8750aZhijun He ALOGE("%s:%d: Stream config must have >= 1 output", __func__, mId); 308046205c058ab70be78163ebcacfdc344a7f8750aZhijun He return false; 309046205c058ab70be78163ebcacfdc344a7f8750aZhijun He } 310046205c058ab70be78163ebcacfdc344a7f8750aZhijun He if (inputs > 1) { 311046205c058ab70be78163ebcacfdc344a7f8750aZhijun He ALOGE("%s:%d: Stream config must have <= 1 input", __func__, mId); 312046205c058ab70be78163ebcacfdc344a7f8750aZhijun He return false; 313046205c058ab70be78163ebcacfdc344a7f8750aZhijun He } 314046205c058ab70be78163ebcacfdc344a7f8750aZhijun He // TODO: check for correct number of Bayer/YUV/JPEG/Encoder streams 315046205c058ab70be78163ebcacfdc344a7f8750aZhijun He return true; 316046205c058ab70be78163ebcacfdc344a7f8750aZhijun He} 317046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 318046205c058ab70be78163ebcacfdc344a7f8750aZhijun Hevoid Camera::setupStreamsLocked(android::Vector<Stream *> &streams) { 319046205c058ab70be78163ebcacfdc344a7f8750aZhijun He /* 320046205c058ab70be78163ebcacfdc344a7f8750aZhijun He * This is where the HAL has to decide internally how to handle all of the 321046205c058ab70be78163ebcacfdc344a7f8750aZhijun He * streams, and then produce usage and max_buffer values for each stream. 322046205c058ab70be78163ebcacfdc344a7f8750aZhijun He * Note, the stream vector has been checked before this point for ALL invalid 323046205c058ab70be78163ebcacfdc344a7f8750aZhijun He * conditions, so it must find a successful configuration for this stream 324046205c058ab70be78163ebcacfdc344a7f8750aZhijun He * array. The HAL may not return an error from this point. 325046205c058ab70be78163ebcacfdc344a7f8750aZhijun He * 326046205c058ab70be78163ebcacfdc344a7f8750aZhijun He * TODO: we just set all streams to be the same dummy values; 327046205c058ab70be78163ebcacfdc344a7f8750aZhijun He * real implementations will want to avoid USAGE_SW_{READ|WRITE}_OFTEN. 328046205c058ab70be78163ebcacfdc344a7f8750aZhijun He */ 329046205c058ab70be78163ebcacfdc344a7f8750aZhijun He for (size_t i = 0; i < streams.size(); i++) { 330046205c058ab70be78163ebcacfdc344a7f8750aZhijun He uint32_t usage = 0; 331046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 332046205c058ab70be78163ebcacfdc344a7f8750aZhijun He if (streams[i]->isOutputType()) 333046205c058ab70be78163ebcacfdc344a7f8750aZhijun He usage |= GRALLOC_USAGE_SW_WRITE_OFTEN | 334046205c058ab70be78163ebcacfdc344a7f8750aZhijun He GRALLOC_USAGE_HW_CAMERA_WRITE; 335046205c058ab70be78163ebcacfdc344a7f8750aZhijun He if (streams[i]->isInputType()) 336046205c058ab70be78163ebcacfdc344a7f8750aZhijun He usage |= GRALLOC_USAGE_SW_READ_OFTEN | 337046205c058ab70be78163ebcacfdc344a7f8750aZhijun He GRALLOC_USAGE_HW_CAMERA_READ; 338046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 339046205c058ab70be78163ebcacfdc344a7f8750aZhijun He streams[i]->setUsage(usage); 340046205c058ab70be78163ebcacfdc344a7f8750aZhijun He streams[i]->setMaxBuffers(1); 341046205c058ab70be78163ebcacfdc344a7f8750aZhijun He } 342046205c058ab70be78163ebcacfdc344a7f8750aZhijun He} 343046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 344046205c058ab70be78163ebcacfdc344a7f8750aZhijun Hebool Camera::isValidTemplateType(int type) { 345046205c058ab70be78163ebcacfdc344a7f8750aZhijun He return type >= 1 && type < CAMERA3_TEMPLATE_COUNT; 346046205c058ab70be78163ebcacfdc344a7f8750aZhijun He} 347046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 348046205c058ab70be78163ebcacfdc344a7f8750aZhijun Heconst camera_metadata_t* Camera::constructDefaultRequestSettings(int type) { 349046205c058ab70be78163ebcacfdc344a7f8750aZhijun He ALOGV("%s:%d: type=%d", __func__, mId, type); 350046205c058ab70be78163ebcacfdc344a7f8750aZhijun He android::Mutex::Autolock al(mDeviceLock); 351046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 352046205c058ab70be78163ebcacfdc344a7f8750aZhijun He if (!isValidTemplateType(type)) { 353046205c058ab70be78163ebcacfdc344a7f8750aZhijun He ALOGE("%s:%d: Invalid template request type: %d", __func__, mId, type); 354046205c058ab70be78163ebcacfdc344a7f8750aZhijun He return NULL; 355046205c058ab70be78163ebcacfdc344a7f8750aZhijun He } 356046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 357046205c058ab70be78163ebcacfdc344a7f8750aZhijun He // DO NOT try to initialize the device here, it will be guaranteed deadlock. 358046205c058ab70be78163ebcacfdc344a7f8750aZhijun He if (!mIsInitialized) { 359046205c058ab70be78163ebcacfdc344a7f8750aZhijun He ALOGE("Device is not initialized yet"); 360046205c058ab70be78163ebcacfdc344a7f8750aZhijun He return NULL; 361046205c058ab70be78163ebcacfdc344a7f8750aZhijun He } 362046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 363046205c058ab70be78163ebcacfdc344a7f8750aZhijun He return mTemplates[type]; 364046205c058ab70be78163ebcacfdc344a7f8750aZhijun He} 365046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 366046205c058ab70be78163ebcacfdc344a7f8750aZhijun He// This implementation is a copy-paste, probably we should override (or move) this to 367046205c058ab70be78163ebcacfdc344a7f8750aZhijun He// device specific class. 368046205c058ab70be78163ebcacfdc344a7f8750aZhijun Heint Camera::processCaptureRequest(camera3_capture_request_t *request) { 369046205c058ab70be78163ebcacfdc344a7f8750aZhijun He camera3_capture_result result; 370046205c058ab70be78163ebcacfdc344a7f8750aZhijun He ALOGV("%s:%d: request=%p", __func__, mId, request); 371046205c058ab70be78163ebcacfdc344a7f8750aZhijun He ATRACE_CALL(); 372046205c058ab70be78163ebcacfdc344a7f8750aZhijun He android::Mutex::Autolock al(mDeviceLock); 373046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 374046205c058ab70be78163ebcacfdc344a7f8750aZhijun He if (request == NULL) { 375046205c058ab70be78163ebcacfdc344a7f8750aZhijun He ALOGE("%s:%d: NULL request recieved", __func__, mId); 376046205c058ab70be78163ebcacfdc344a7f8750aZhijun He return -EINVAL; 377046205c058ab70be78163ebcacfdc344a7f8750aZhijun He } 378046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 379046205c058ab70be78163ebcacfdc344a7f8750aZhijun He ALOGV("%s:%d: Request Frame:%d Settings:%p", __func__, mId, 380046205c058ab70be78163ebcacfdc344a7f8750aZhijun He request->frame_number, request->settings); 381046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 382046205c058ab70be78163ebcacfdc344a7f8750aZhijun He // NULL indicates use last settings 383046205c058ab70be78163ebcacfdc344a7f8750aZhijun He if (request->settings == NULL) { 384046205c058ab70be78163ebcacfdc344a7f8750aZhijun He if (mSettings == NULL) { 385046205c058ab70be78163ebcacfdc344a7f8750aZhijun He ALOGE("%s:%d: NULL settings without previous set Frame:%d Req:%p", 386046205c058ab70be78163ebcacfdc344a7f8750aZhijun He __func__, mId, request->frame_number, request); 387046205c058ab70be78163ebcacfdc344a7f8750aZhijun He return -EINVAL; 388046205c058ab70be78163ebcacfdc344a7f8750aZhijun He } 389046205c058ab70be78163ebcacfdc344a7f8750aZhijun He } else { 390046205c058ab70be78163ebcacfdc344a7f8750aZhijun He updateSettingsLocked(request->settings); 391046205c058ab70be78163ebcacfdc344a7f8750aZhijun He } 392046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 393046205c058ab70be78163ebcacfdc344a7f8750aZhijun He if (request->input_buffer != NULL) { 394046205c058ab70be78163ebcacfdc344a7f8750aZhijun He ALOGV("%s:%d: Reprocessing input buffer is not supported yet", __func__, mId); 395046205c058ab70be78163ebcacfdc344a7f8750aZhijun He return -EINVAL; 396046205c058ab70be78163ebcacfdc344a7f8750aZhijun He } else { 397046205c058ab70be78163ebcacfdc344a7f8750aZhijun He ALOGV("%s:%d: Capturing new frame.", __func__, mId); 398046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 399046205c058ab70be78163ebcacfdc344a7f8750aZhijun He if (!isValidCaptureSettings(request->settings)) { 400046205c058ab70be78163ebcacfdc344a7f8750aZhijun He ALOGE("%s:%d: Invalid settings for capture request: %p", 401046205c058ab70be78163ebcacfdc344a7f8750aZhijun He __func__, mId, request->settings); 402046205c058ab70be78163ebcacfdc344a7f8750aZhijun He return -EINVAL; 403046205c058ab70be78163ebcacfdc344a7f8750aZhijun He } 404046205c058ab70be78163ebcacfdc344a7f8750aZhijun He } 405046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 406046205c058ab70be78163ebcacfdc344a7f8750aZhijun He if (request->num_output_buffers <= 0) { 407046205c058ab70be78163ebcacfdc344a7f8750aZhijun He ALOGE("%s:%d: Invalid number of output buffers: %d", __func__, mId, 408046205c058ab70be78163ebcacfdc344a7f8750aZhijun He request->num_output_buffers); 409046205c058ab70be78163ebcacfdc344a7f8750aZhijun He return -EINVAL; 410046205c058ab70be78163ebcacfdc344a7f8750aZhijun He } 411046205c058ab70be78163ebcacfdc344a7f8750aZhijun He result.num_output_buffers = request->num_output_buffers; 412046205c058ab70be78163ebcacfdc344a7f8750aZhijun He result.output_buffers = new camera3_stream_buffer_t[result.num_output_buffers]; 413046205c058ab70be78163ebcacfdc344a7f8750aZhijun He for (unsigned int i = 0; i < request->num_output_buffers; i++) { 414046205c058ab70be78163ebcacfdc344a7f8750aZhijun He int res = processCaptureBuffer(&request->output_buffers[i], 415046205c058ab70be78163ebcacfdc344a7f8750aZhijun He const_cast<camera3_stream_buffer_t*>(&result.output_buffers[i])); 416046205c058ab70be78163ebcacfdc344a7f8750aZhijun He if (res) { 417046205c058ab70be78163ebcacfdc344a7f8750aZhijun He delete [] result.output_buffers; 418046205c058ab70be78163ebcacfdc344a7f8750aZhijun He // TODO: this should probably be a total device failure; transient for now 419046205c058ab70be78163ebcacfdc344a7f8750aZhijun He return -EINVAL; 420046205c058ab70be78163ebcacfdc344a7f8750aZhijun He } 421046205c058ab70be78163ebcacfdc344a7f8750aZhijun He } 422046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 423046205c058ab70be78163ebcacfdc344a7f8750aZhijun He result.frame_number = request->frame_number; 424046205c058ab70be78163ebcacfdc344a7f8750aZhijun He // TODO: return actual captured/reprocessed settings 425046205c058ab70be78163ebcacfdc344a7f8750aZhijun He result.result = request->settings; 426046205c058ab70be78163ebcacfdc344a7f8750aZhijun He // TODO: asynchronously return results 427046205c058ab70be78163ebcacfdc344a7f8750aZhijun He notifyShutter(request->frame_number, 0); 428046205c058ab70be78163ebcacfdc344a7f8750aZhijun He mCallbackOps->process_capture_result(mCallbackOps, &result); 429046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 430046205c058ab70be78163ebcacfdc344a7f8750aZhijun He // Free up capture result related resources, HAL owns the capture result, and it 431046205c058ab70be78163ebcacfdc344a7f8750aZhijun He // is only valid during the process_capture_result call. 432046205c058ab70be78163ebcacfdc344a7f8750aZhijun He delete[] result.output_buffers; 433046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 434046205c058ab70be78163ebcacfdc344a7f8750aZhijun He return 0; 435046205c058ab70be78163ebcacfdc344a7f8750aZhijun He} 436046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 437046205c058ab70be78163ebcacfdc344a7f8750aZhijun Heint Camera::flush() { 438046205c058ab70be78163ebcacfdc344a7f8750aZhijun He int res; 439046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 440046205c058ab70be78163ebcacfdc344a7f8750aZhijun He ALOGV("%s:%d: flush device", __func__, mId); 441046205c058ab70be78163ebcacfdc344a7f8750aZhijun He // per-device specific flush 442046205c058ab70be78163ebcacfdc344a7f8750aZhijun He res = flushDevice(); 443046205c058ab70be78163ebcacfdc344a7f8750aZhijun He if (res != 0) { 444046205c058ab70be78163ebcacfdc344a7f8750aZhijun He ALOGE("%s:%d: Failed to flush device!", __func__, mId); 445046205c058ab70be78163ebcacfdc344a7f8750aZhijun He return res; 446046205c058ab70be78163ebcacfdc344a7f8750aZhijun He } 447046205c058ab70be78163ebcacfdc344a7f8750aZhijun He return 0; 448046205c058ab70be78163ebcacfdc344a7f8750aZhijun He} 449046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 450046205c058ab70be78163ebcacfdc344a7f8750aZhijun Hevoid Camera::updateSettingsLocked(const camera_metadata_t *new_settings) { 451046205c058ab70be78163ebcacfdc344a7f8750aZhijun He if (mSettings != NULL) { 452046205c058ab70be78163ebcacfdc344a7f8750aZhijun He free_camera_metadata(mSettings); 453046205c058ab70be78163ebcacfdc344a7f8750aZhijun He mSettings = NULL; 454046205c058ab70be78163ebcacfdc344a7f8750aZhijun He } 455046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 456046205c058ab70be78163ebcacfdc344a7f8750aZhijun He if (new_settings != NULL) 457046205c058ab70be78163ebcacfdc344a7f8750aZhijun He mSettings = clone_camera_metadata(new_settings); 458046205c058ab70be78163ebcacfdc344a7f8750aZhijun He} 459046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 460046205c058ab70be78163ebcacfdc344a7f8750aZhijun Hevoid Camera::notifyShutter(uint32_t frame_number, uint64_t timestamp) { 461046205c058ab70be78163ebcacfdc344a7f8750aZhijun He int res; 462046205c058ab70be78163ebcacfdc344a7f8750aZhijun He struct timespec ts; 463046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 464046205c058ab70be78163ebcacfdc344a7f8750aZhijun He // If timestamp is 0, get timestamp from right now instead 465046205c058ab70be78163ebcacfdc344a7f8750aZhijun He if (timestamp == 0) { 466046205c058ab70be78163ebcacfdc344a7f8750aZhijun He ALOGW("%s:%d: No timestamp provided, using CLOCK_BOOTTIME", 467046205c058ab70be78163ebcacfdc344a7f8750aZhijun He __func__, mId); 468046205c058ab70be78163ebcacfdc344a7f8750aZhijun He res = clock_gettime(CLOCK_BOOTTIME, &ts); 469046205c058ab70be78163ebcacfdc344a7f8750aZhijun He if (res == 0) { 470046205c058ab70be78163ebcacfdc344a7f8750aZhijun He timestamp = ts.tv_sec * 1000000000ULL + ts.tv_nsec; 471046205c058ab70be78163ebcacfdc344a7f8750aZhijun He } else { 472046205c058ab70be78163ebcacfdc344a7f8750aZhijun He ALOGE("%s:%d: No timestamp and failed to get CLOCK_BOOTTIME %s(%d)", 473046205c058ab70be78163ebcacfdc344a7f8750aZhijun He __func__, mId, strerror(errno), errno); 474046205c058ab70be78163ebcacfdc344a7f8750aZhijun He } 475046205c058ab70be78163ebcacfdc344a7f8750aZhijun He } 476046205c058ab70be78163ebcacfdc344a7f8750aZhijun He camera3_notify_msg_t m; 477046205c058ab70be78163ebcacfdc344a7f8750aZhijun He memset(&m, 0, sizeof(m)); 478046205c058ab70be78163ebcacfdc344a7f8750aZhijun He m.type = CAMERA3_MSG_SHUTTER; 479046205c058ab70be78163ebcacfdc344a7f8750aZhijun He m.message.shutter.frame_number = frame_number; 480046205c058ab70be78163ebcacfdc344a7f8750aZhijun He m.message.shutter.timestamp = timestamp; 481046205c058ab70be78163ebcacfdc344a7f8750aZhijun He mCallbackOps->notify(mCallbackOps, &m); 482046205c058ab70be78163ebcacfdc344a7f8750aZhijun He} 483046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 484046205c058ab70be78163ebcacfdc344a7f8750aZhijun Hevoid Camera::dump(int fd) { 485046205c058ab70be78163ebcacfdc344a7f8750aZhijun He ALOGV("%s:%d: Dumping to fd %d", __func__, mId, fd); 486046205c058ab70be78163ebcacfdc344a7f8750aZhijun He ATRACE_CALL(); 487046205c058ab70be78163ebcacfdc344a7f8750aZhijun He android::Mutex::Autolock al(mDeviceLock); 488046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 489046205c058ab70be78163ebcacfdc344a7f8750aZhijun He dprintf(fd, "Camera ID: %d (Busy: %d)\n", mId, mBusy); 490046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 491046205c058ab70be78163ebcacfdc344a7f8750aZhijun He // TODO: dump all settings 492046205c058ab70be78163ebcacfdc344a7f8750aZhijun He dprintf(fd, "Most Recent Settings: (%p)\n", mSettings); 493046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 4947a915effde8d99eec1995a5598b4094450f5719eGreg Kaiser dprintf(fd, "Number of streams: %zu\n", mStreams.size()); 495046205c058ab70be78163ebcacfdc344a7f8750aZhijun He for (size_t i = 0; i < mStreams.size(); i++) { 4967a915effde8d99eec1995a5598b4094450f5719eGreg Kaiser dprintf(fd, "Stream %zu/%zu:\n", i, mStreams.size()); 497046205c058ab70be78163ebcacfdc344a7f8750aZhijun He mStreams[i]->dump(fd); 498046205c058ab70be78163ebcacfdc344a7f8750aZhijun He } 499046205c058ab70be78163ebcacfdc344a7f8750aZhijun He} 500046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 501046205c058ab70be78163ebcacfdc344a7f8750aZhijun Heconst char* Camera::templateToString(int type) { 502046205c058ab70be78163ebcacfdc344a7f8750aZhijun He switch (type) { 503046205c058ab70be78163ebcacfdc344a7f8750aZhijun He case CAMERA3_TEMPLATE_PREVIEW: 504046205c058ab70be78163ebcacfdc344a7f8750aZhijun He return "CAMERA3_TEMPLATE_PREVIEW"; 505046205c058ab70be78163ebcacfdc344a7f8750aZhijun He case CAMERA3_TEMPLATE_STILL_CAPTURE: 506046205c058ab70be78163ebcacfdc344a7f8750aZhijun He return "CAMERA3_TEMPLATE_STILL_CAPTURE"; 507046205c058ab70be78163ebcacfdc344a7f8750aZhijun He case CAMERA3_TEMPLATE_VIDEO_RECORD: 508046205c058ab70be78163ebcacfdc344a7f8750aZhijun He return "CAMERA3_TEMPLATE_VIDEO_RECORD"; 509046205c058ab70be78163ebcacfdc344a7f8750aZhijun He case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT: 510046205c058ab70be78163ebcacfdc344a7f8750aZhijun He return "CAMERA3_TEMPLATE_VIDEO_SNAPSHOT"; 511046205c058ab70be78163ebcacfdc344a7f8750aZhijun He case CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG: 512046205c058ab70be78163ebcacfdc344a7f8750aZhijun He return "CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG"; 513046205c058ab70be78163ebcacfdc344a7f8750aZhijun He case CAMERA3_TEMPLATE_MANUAL: 514046205c058ab70be78163ebcacfdc344a7f8750aZhijun He return "CAMERA3_TEMPLATE_MANUAL"; 515046205c058ab70be78163ebcacfdc344a7f8750aZhijun He } 516046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 517046205c058ab70be78163ebcacfdc344a7f8750aZhijun He return "Invalid template type!"; 518046205c058ab70be78163ebcacfdc344a7f8750aZhijun He} 519046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 520046205c058ab70be78163ebcacfdc344a7f8750aZhijun Heint Camera::setTemplate(int type, camera_metadata_t *settings) { 521046205c058ab70be78163ebcacfdc344a7f8750aZhijun He android::Mutex::Autolock al(mDeviceLock); 522046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 523046205c058ab70be78163ebcacfdc344a7f8750aZhijun He if (!isValidTemplateType(type)) { 524046205c058ab70be78163ebcacfdc344a7f8750aZhijun He ALOGE("%s:%d: Invalid template request type: %d", __func__, mId, type); 525046205c058ab70be78163ebcacfdc344a7f8750aZhijun He return -EINVAL; 526046205c058ab70be78163ebcacfdc344a7f8750aZhijun He } 527046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 528046205c058ab70be78163ebcacfdc344a7f8750aZhijun He if (mTemplates[type] != NULL) { 529046205c058ab70be78163ebcacfdc344a7f8750aZhijun He ALOGE("%s:%d: Setting already constructed template type %s(%d)", 530046205c058ab70be78163ebcacfdc344a7f8750aZhijun He __func__, mId, templateToString(type), type); 531046205c058ab70be78163ebcacfdc344a7f8750aZhijun He return -EINVAL; 532046205c058ab70be78163ebcacfdc344a7f8750aZhijun He } 533046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 534046205c058ab70be78163ebcacfdc344a7f8750aZhijun He // Make a durable copy of the underlying metadata 535046205c058ab70be78163ebcacfdc344a7f8750aZhijun He mTemplates[type] = clone_camera_metadata(settings); 536046205c058ab70be78163ebcacfdc344a7f8750aZhijun He if (mTemplates[type] == NULL) { 537046205c058ab70be78163ebcacfdc344a7f8750aZhijun He ALOGE("%s:%d: Failed to clone metadata %p for template type %s(%d)", 538046205c058ab70be78163ebcacfdc344a7f8750aZhijun He __func__, mId, settings, templateToString(type), type); 539046205c058ab70be78163ebcacfdc344a7f8750aZhijun He return -EINVAL; 540046205c058ab70be78163ebcacfdc344a7f8750aZhijun He } 541046205c058ab70be78163ebcacfdc344a7f8750aZhijun He return 0; 542046205c058ab70be78163ebcacfdc344a7f8750aZhijun He} 543046205c058ab70be78163ebcacfdc344a7f8750aZhijun He 544046205c058ab70be78163ebcacfdc344a7f8750aZhijun He} // namespace usb_camera_hal 545