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