17ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray/*
27ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray * Copyright (C) 2012 The Android Open Source Project
37ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray *
47ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray * Licensed under the Apache License, Version 2.0 (the "License");
57ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray * you may not use this file except in compliance with the License.
67ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray * You may obtain a copy of the License at
77ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray *
87ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray *      http://www.apache.org/licenses/LICENSE-2.0
97ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray *
107ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray * Unless required by applicable law or agreed to in writing, software
117ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray * distributed under the License is distributed on an "AS IS" BASIS,
127ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray * See the License for the specific language governing permissions and
147ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray * limitations under the License.
157ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray */
167ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray
177ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray#include <cstdlib>
1869f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray#include <stdio.h>
19a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray#include <hardware/camera3.h>
20083315c85baf28098637684d2307ee8d4df337c6Alex Ray#include <sync/sync.h>
21bfcbd95a1f1aa41f665da5ce78cd7a0098c58f69Alex Ray#include <system/camera_metadata.h>
22b0be1039c136f85778dffaf761af3d09907e21aaAlex Ray#include <system/graphics.h>
23555676430e4682514681e95fdc2891a8a09bfe03Alex Ray#include <utils/Mutex.h>
24a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray#include "CameraHAL.h"
25b0be1039c136f85778dffaf761af3d09907e21aaAlex Ray#include "Metadata.h"
26bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray#include "Stream.h"
277ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray
28ed6b8a771038acdb08a6c55abfe563d75acb63faAlex Ray//#define LOG_NDEBUG 0
297ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray#define LOG_TAG "Camera"
307ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray#include <cutils/log.h>
317ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray
32ed6b8a771038acdb08a6c55abfe563d75acb63faAlex Ray#define ATRACE_TAG (ATRACE_TAG_CAMERA | ATRACE_TAG_HAL)
33ea80382be17ab288622506475b8f15d9d8ebee80Alex Ray#include <utils/Trace.h>
34ed6b8a771038acdb08a6c55abfe563d75acb63faAlex Ray
357ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray#include "Camera.h"
367ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray
37083315c85baf28098637684d2307ee8d4df337c6Alex Ray#define CAMERA_SYNC_TIMEOUT 5000 // in msecs
38083315c85baf28098637684d2307ee8d4df337c6Alex Ray
397ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Raynamespace default_camera_hal {
407ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray
417ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Rayextern "C" {
427ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray// Shim passed to the framework to close an opened device.
437ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Raystatic int close_device(hw_device_t* dev)
447ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray{
45a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray    camera3_device_t* cam_dev = reinterpret_cast<camera3_device_t*>(dev);
467ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray    Camera* cam = static_cast<Camera*>(cam_dev->priv);
477ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray    return cam->close();
487ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray}
497ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray} // extern "C"
507ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray
51a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex RayCamera::Camera(int id)
52a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray  : mId(id),
53b0be1039c136f85778dffaf761af3d09907e21aaAlex Ray    mStaticInfo(NULL),
54a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray    mBusy(false),
55bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    mCallbackOps(NULL),
56bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    mStreams(NULL),
57bfcbd95a1f1aa41f665da5ce78cd7a0098c58f69Alex Ray    mNumStreams(0),
58bfcbd95a1f1aa41f665da5ce78cd7a0098c58f69Alex Ray    mSettings(NULL)
597ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray{
6061f7a0c1c1aa481d798116e5a218df04630886e6Alex Ray    memset(&mTemplates, 0, sizeof(mTemplates));
61a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray    memset(&mDevice, 0, sizeof(mDevice));
627ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray    mDevice.common.tag    = HARDWARE_DEVICE_TAG;
63b0be1039c136f85778dffaf761af3d09907e21aaAlex Ray    mDevice.common.version = CAMERA_DEVICE_API_VERSION_3_0;
647ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray    mDevice.common.close  = close_device;
65a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray    mDevice.ops           = const_cast<camera3_device_ops_t*>(&sOps);
667ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray    mDevice.priv          = this;
677ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray}
687ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray
697ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex RayCamera::~Camera()
707ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray{
7161f7a0c1c1aa481d798116e5a218df04630886e6Alex Ray    if (mStaticInfo != NULL) {
7261f7a0c1c1aa481d798116e5a218df04630886e6Alex Ray        free_camera_metadata(mStaticInfo);
7361f7a0c1c1aa481d798116e5a218df04630886e6Alex Ray    }
747ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray}
757ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray
76a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Rayint Camera::open(const hw_module_t *module, hw_device_t **device)
777ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray{
78a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray    ALOGI("%s:%d: Opening camera device", __func__, mId);
79ea80382be17ab288622506475b8f15d9d8ebee80Alex Ray    ATRACE_CALL();
80555676430e4682514681e95fdc2891a8a09bfe03Alex Ray    android::Mutex::Autolock al(mDeviceLock);
81555676430e4682514681e95fdc2891a8a09bfe03Alex Ray
827ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray    if (mBusy) {
83a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray        ALOGE("%s:%d: Error! Camera device already opened", __func__, mId);
847ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray        return -EBUSY;
857ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray    }
867ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray
877ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray    // TODO: open camera dev nodes, etc
887ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray    mBusy = true;
89a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray    mDevice.common.module = const_cast<hw_module_t*>(module);
90a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray    *device = &mDevice.common;
917ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray    return 0;
927ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray}
937ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray
94b0be1039c136f85778dffaf761af3d09907e21aaAlex Rayint Camera::getInfo(struct camera_info *info)
95b0be1039c136f85778dffaf761af3d09907e21aaAlex Ray{
96555676430e4682514681e95fdc2891a8a09bfe03Alex Ray    android::Mutex::Autolock al(mStaticInfoLock);
97555676430e4682514681e95fdc2891a8a09bfe03Alex Ray
98b0be1039c136f85778dffaf761af3d09907e21aaAlex Ray    info->facing = CAMERA_FACING_FRONT;
99b0be1039c136f85778dffaf761af3d09907e21aaAlex Ray    info->orientation = 0;
100b0be1039c136f85778dffaf761af3d09907e21aaAlex Ray    info->device_version = mDevice.common.version;
101b0be1039c136f85778dffaf761af3d09907e21aaAlex Ray    if (mStaticInfo == NULL) {
1020f82f5a73a9ea6462706c807dc1a5a2cf2333ea1Alex Ray        mStaticInfo = initStaticInfo();
103b0be1039c136f85778dffaf761af3d09907e21aaAlex Ray    }
104b0be1039c136f85778dffaf761af3d09907e21aaAlex Ray    info->static_camera_characteristics = mStaticInfo;
1050f82f5a73a9ea6462706c807dc1a5a2cf2333ea1Alex Ray    return 0;
106b0be1039c136f85778dffaf761af3d09907e21aaAlex Ray}
107b0be1039c136f85778dffaf761af3d09907e21aaAlex Ray
1087ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Rayint Camera::close()
1097ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray{
110a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray    ALOGI("%s:%d: Closing camera device", __func__, mId);
111ea80382be17ab288622506475b8f15d9d8ebee80Alex Ray    ATRACE_CALL();
112555676430e4682514681e95fdc2891a8a09bfe03Alex Ray    android::Mutex::Autolock al(mDeviceLock);
113555676430e4682514681e95fdc2891a8a09bfe03Alex Ray
1147ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray    if (!mBusy) {
115a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray        ALOGE("%s:%d: Error! Camera device not open", __func__, mId);
1167ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray        return -EINVAL;
1177ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray    }
1187ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray
1197ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray    // TODO: close camera dev nodes, etc
1207ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray    mBusy = false;
1217ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray    return 0;
1227ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray}
1237ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray
124a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Rayint Camera::initialize(const camera3_callback_ops_t *callback_ops)
1257ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray{
12661f7a0c1c1aa481d798116e5a218df04630886e6Alex Ray    int res;
12761f7a0c1c1aa481d798116e5a218df04630886e6Alex Ray
128a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray    ALOGV("%s:%d: callback_ops=%p", __func__, mId, callback_ops);
129a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray    mCallbackOps = callback_ops;
13061f7a0c1c1aa481d798116e5a218df04630886e6Alex Ray    // per-device specific initialization
13161f7a0c1c1aa481d798116e5a218df04630886e6Alex Ray    res = initDevice();
13261f7a0c1c1aa481d798116e5a218df04630886e6Alex Ray    if (res != 0) {
13361f7a0c1c1aa481d798116e5a218df04630886e6Alex Ray        ALOGE("%s:%d: Failed to initialize device!", __func__, mId);
13461f7a0c1c1aa481d798116e5a218df04630886e6Alex Ray        return res;
13589a82661e07c49eaab07013be5ea03b84ea2715aAlex Ray    }
136a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray    return 0;
137a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray}
1387ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray
139bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Rayint Camera::configureStreams(camera3_stream_configuration_t *stream_config)
140a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray{
141bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    camera3_stream_t *astream;
142bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    Stream **newStreams = NULL;
143bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray
144bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    ALOGV("%s:%d: stream_config=%p", __func__, mId, stream_config);
145555676430e4682514681e95fdc2891a8a09bfe03Alex Ray    ATRACE_CALL();
146555676430e4682514681e95fdc2891a8a09bfe03Alex Ray    android::Mutex::Autolock al(mDeviceLock);
147bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray
148bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    if (stream_config == NULL) {
149bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray        ALOGE("%s:%d: NULL stream configuration array", __func__, mId);
150bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray        return -EINVAL;
151bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    }
152bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    if (stream_config->num_streams == 0) {
153bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray        ALOGE("%s:%d: Empty stream configuration array", __func__, mId);
154bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray        return -EINVAL;
155bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    }
156bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray
157bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    // Create new stream array
158bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    newStreams = new Stream*[stream_config->num_streams];
159bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    ALOGV("%s:%d: Number of Streams: %d", __func__, mId,
160bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray            stream_config->num_streams);
161bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray
162bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    // Mark all current streams unused for now
163bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    for (int i = 0; i < mNumStreams; i++)
164bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray        mStreams[i]->mReuse = false;
165bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    // Fill new stream array with reused streams and new streams
166c6bf2f291ddca5e8807268f89733e9f6637b4303Alex Ray    for (unsigned int i = 0; i < stream_config->num_streams; i++) {
167bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray        astream = stream_config->streams[i];
1682b286dab84b2a0524c1deed67fea92200e598c6eAlex Ray        if (astream->max_buffers > 0) {
1692b286dab84b2a0524c1deed67fea92200e598c6eAlex Ray            ALOGV("%s:%d: Reusing stream %d", __func__, mId, i);
170bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray            newStreams[i] = reuseStream(astream);
1712b286dab84b2a0524c1deed67fea92200e598c6eAlex Ray        } else {
1722b286dab84b2a0524c1deed67fea92200e598c6eAlex Ray            ALOGV("%s:%d: Creating new stream %d", __func__, mId, i);
173bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray            newStreams[i] = new Stream(mId, astream);
1742b286dab84b2a0524c1deed67fea92200e598c6eAlex Ray        }
175bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray
176bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray        if (newStreams[i] == NULL) {
177bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray            ALOGE("%s:%d: Error processing stream %d", __func__, mId, i);
178bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray            goto err_out;
179bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray        }
180bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray        astream->priv = newStreams[i];
181bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    }
182bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray
183bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    // Verify the set of streams in aggregate
184bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    if (!isValidStreamSet(newStreams, stream_config->num_streams)) {
185bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray        ALOGE("%s:%d: Invalid stream set", __func__, mId);
186bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray        goto err_out;
187bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    }
188bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray
189bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    // Set up all streams (calculate usage/max_buffers for each)
190bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    setupStreams(newStreams, stream_config->num_streams);
191bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray
192bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    // Destroy all old streams and replace stream array with new one
193bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    destroyStreams(mStreams, mNumStreams);
194bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    mStreams = newStreams;
195bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    mNumStreams = stream_config->num_streams;
196bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray
197bfcbd95a1f1aa41f665da5ce78cd7a0098c58f69Alex Ray    // Clear out last seen settings metadata
198bfcbd95a1f1aa41f665da5ce78cd7a0098c58f69Alex Ray    setSettings(NULL);
199a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray    return 0;
200bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray
201bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Rayerr_out:
202bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    // Clean up temporary streams, preserve existing mStreams/mNumStreams
203bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    destroyStreams(newStreams, stream_config->num_streams);
204bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    return -EINVAL;
205bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray}
206bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray
207bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Rayvoid Camera::destroyStreams(Stream **streams, int count)
208bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray{
209bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    if (streams == NULL)
210bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray        return;
211bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    for (int i = 0; i < count; i++) {
212bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray        // Only destroy streams that weren't reused
213bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray        if (streams[i] != NULL && !streams[i]->mReuse)
214bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray            delete streams[i];
215bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    }
216bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    delete [] streams;
217bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray}
218bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray
219bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex RayStream *Camera::reuseStream(camera3_stream_t *astream)
220bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray{
221bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    Stream *priv = reinterpret_cast<Stream*>(astream->priv);
222bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    // Verify the re-used stream's parameters match
223bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    if (!priv->isValidReuseStream(mId, astream)) {
224bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray        ALOGE("%s:%d: Mismatched parameter in reused stream", __func__, mId);
225bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray        return NULL;
226bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    }
227bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    // Mark stream to be reused
228bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    priv->mReuse = true;
229bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    return priv;
230bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray}
231bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray
232bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Raybool Camera::isValidStreamSet(Stream **streams, int count)
233bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray{
234bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    int inputs = 0;
235bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    int outputs = 0;
236bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray
237bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    if (streams == NULL) {
238bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray        ALOGE("%s:%d: NULL stream configuration streams", __func__, mId);
239bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray        return false;
240bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    }
241bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    if (count == 0) {
242bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray        ALOGE("%s:%d: Zero count stream configuration streams", __func__, mId);
243bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray        return false;
244bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    }
245bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    // Validate there is at most one input stream and at least one output stream
246bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    for (int i = 0; i < count; i++) {
247bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray        // A stream may be both input and output (bidirectional)
248bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray        if (streams[i]->isInputType())
249bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray            inputs++;
250bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray        if (streams[i]->isOutputType())
251bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray            outputs++;
252bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    }
253768216ee2c90ecbbc73121b528e60c82ff668eb5Alex Ray    ALOGV("%s:%d: Configuring %d output streams and %d input streams",
254768216ee2c90ecbbc73121b528e60c82ff668eb5Alex Ray            __func__, mId, outputs, inputs);
255bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    if (outputs < 1) {
256bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray        ALOGE("%s:%d: Stream config must have >= 1 output", __func__, mId);
257bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray        return false;
258bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    }
259bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    if (inputs > 1) {
260bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray        ALOGE("%s:%d: Stream config must have <= 1 input", __func__, mId);
261bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray        return false;
262bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    }
263bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    // TODO: check for correct number of Bayer/YUV/JPEG/Encoder streams
264bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    return true;
265bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray}
266bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray
267bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Rayvoid Camera::setupStreams(Stream **streams, int count)
268bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray{
269bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    /*
270bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray     * This is where the HAL has to decide internally how to handle all of the
271bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray     * streams, and then produce usage and max_buffer values for each stream.
272bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray     * Note, the stream array has been checked before this point for ALL invalid
273bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray     * conditions, so it must find a successful configuration for this stream
274bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray     * array.  The HAL may not return an error from this point.
275bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray     *
276bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray     * In this demo HAL, we just set all streams to be the same dummy values;
277bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray     * real implementations will want to avoid USAGE_SW_{READ|WRITE}_OFTEN.
278bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray     */
279bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    for (int i = 0; i < count; i++) {
280bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray        uint32_t usage = 0;
281bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray
282bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray        if (streams[i]->isOutputType())
283bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray            usage |= GRALLOC_USAGE_SW_WRITE_OFTEN |
284bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray                     GRALLOC_USAGE_HW_CAMERA_WRITE;
285bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray        if (streams[i]->isInputType())
286bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray            usage |= GRALLOC_USAGE_SW_READ_OFTEN |
287bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray                     GRALLOC_USAGE_HW_CAMERA_READ;
288bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray
289bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray        streams[i]->setUsage(usage);
290bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray        streams[i]->setMaxBuffers(1);
291bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    }
292a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray}
2937ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray
294a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Rayint Camera::registerStreamBuffers(const camera3_stream_buffer_set_t *buf_set)
295a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray{
296a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray    ALOGV("%s:%d: buffer_set=%p", __func__, mId, buf_set);
2978a8f86bbe6cd0d62c81b7f0f7414b74e1aa20f37Alex Ray    if (buf_set == NULL) {
2988a8f86bbe6cd0d62c81b7f0f7414b74e1aa20f37Alex Ray        ALOGE("%s:%d: NULL buffer set", __func__, mId);
2998a8f86bbe6cd0d62c81b7f0f7414b74e1aa20f37Alex Ray        return -EINVAL;
3008a8f86bbe6cd0d62c81b7f0f7414b74e1aa20f37Alex Ray    }
3018a8f86bbe6cd0d62c81b7f0f7414b74e1aa20f37Alex Ray    if (buf_set->stream == NULL) {
3028a8f86bbe6cd0d62c81b7f0f7414b74e1aa20f37Alex Ray        ALOGE("%s:%d: NULL stream handle", __func__, mId);
3038a8f86bbe6cd0d62c81b7f0f7414b74e1aa20f37Alex Ray        return -EINVAL;
3048a8f86bbe6cd0d62c81b7f0f7414b74e1aa20f37Alex Ray    }
3058a8f86bbe6cd0d62c81b7f0f7414b74e1aa20f37Alex Ray    Stream *stream = reinterpret_cast<Stream*>(buf_set->stream->priv);
3068a8f86bbe6cd0d62c81b7f0f7414b74e1aa20f37Alex Ray    return stream->registerBuffers(buf_set);
3077ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray}
3087ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray
30961f7a0c1c1aa481d798116e5a218df04630886e6Alex Raybool Camera::isValidTemplateType(int type)
31061f7a0c1c1aa481d798116e5a218df04630886e6Alex Ray{
31161f7a0c1c1aa481d798116e5a218df04630886e6Alex Ray    return type < 1 || type >= CAMERA3_TEMPLATE_COUNT;
31261f7a0c1c1aa481d798116e5a218df04630886e6Alex Ray}
31361f7a0c1c1aa481d798116e5a218df04630886e6Alex Ray
314a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Rayconst camera_metadata_t* Camera::constructDefaultRequestSettings(int type)
3157ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray{
316a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray    ALOGV("%s:%d: type=%d", __func__, mId, type);
31789a82661e07c49eaab07013be5ea03b84ea2715aAlex Ray
31861f7a0c1c1aa481d798116e5a218df04630886e6Alex Ray    if (!isValidTemplateType(type)) {
31989a82661e07c49eaab07013be5ea03b84ea2715aAlex Ray        ALOGE("%s:%d: Invalid template request type: %d", __func__, mId, type);
32089a82661e07c49eaab07013be5ea03b84ea2715aAlex Ray        return NULL;
32189a82661e07c49eaab07013be5ea03b84ea2715aAlex Ray    }
32261f7a0c1c1aa481d798116e5a218df04630886e6Alex Ray    return mTemplates[type];
323a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray}
324a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray
325a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Rayint Camera::processCaptureRequest(camera3_capture_request_t *request)
326a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray{
327083315c85baf28098637684d2307ee8d4df337c6Alex Ray    camera3_capture_result result;
328083315c85baf28098637684d2307ee8d4df337c6Alex Ray
329a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray    ALOGV("%s:%d: request=%p", __func__, mId, request);
330ea80382be17ab288622506475b8f15d9d8ebee80Alex Ray    ATRACE_CALL();
331a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray
332a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray    if (request == NULL) {
333a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray        ALOGE("%s:%d: NULL request recieved", __func__, mId);
334a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray        return -EINVAL;
3357ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray    }
3367ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray
337bfcbd95a1f1aa41f665da5ce78cd7a0098c58f69Alex Ray    ALOGV("%s:%d: Request Frame:%d Settings:%p", __func__, mId,
338bfcbd95a1f1aa41f665da5ce78cd7a0098c58f69Alex Ray            request->frame_number, request->settings);
339bfcbd95a1f1aa41f665da5ce78cd7a0098c58f69Alex Ray
340bfcbd95a1f1aa41f665da5ce78cd7a0098c58f69Alex Ray    // NULL indicates use last settings
341bfcbd95a1f1aa41f665da5ce78cd7a0098c58f69Alex Ray    if (request->settings == NULL) {
342bfcbd95a1f1aa41f665da5ce78cd7a0098c58f69Alex Ray        if (mSettings == NULL) {
343bfcbd95a1f1aa41f665da5ce78cd7a0098c58f69Alex Ray            ALOGE("%s:%d: NULL settings without previous set Frame:%d Req:%p",
344bfcbd95a1f1aa41f665da5ce78cd7a0098c58f69Alex Ray                    __func__, mId, request->frame_number, request);
345bfcbd95a1f1aa41f665da5ce78cd7a0098c58f69Alex Ray            return -EINVAL;
346bfcbd95a1f1aa41f665da5ce78cd7a0098c58f69Alex Ray        }
347bfcbd95a1f1aa41f665da5ce78cd7a0098c58f69Alex Ray    } else {
348bfcbd95a1f1aa41f665da5ce78cd7a0098c58f69Alex Ray        setSettings(request->settings);
349bfcbd95a1f1aa41f665da5ce78cd7a0098c58f69Alex Ray    }
350bfcbd95a1f1aa41f665da5ce78cd7a0098c58f69Alex Ray
35111bbeefaf9ba410916ec03a5c6869fe4eb67d672Alex Ray    if (request->input_buffer != NULL) {
35211bbeefaf9ba410916ec03a5c6869fe4eb67d672Alex Ray        ALOGV("%s:%d: Reprocessing input buffer %p", __func__, mId,
35311bbeefaf9ba410916ec03a5c6869fe4eb67d672Alex Ray                request->input_buffer);
35411bbeefaf9ba410916ec03a5c6869fe4eb67d672Alex Ray
35511bbeefaf9ba410916ec03a5c6869fe4eb67d672Alex Ray        if (!isValidReprocessSettings(request->settings)) {
35611bbeefaf9ba410916ec03a5c6869fe4eb67d672Alex Ray            ALOGE("%s:%d: Invalid settings for reprocess request: %p",
35711bbeefaf9ba410916ec03a5c6869fe4eb67d672Alex Ray                    __func__, mId, request->settings);
35811bbeefaf9ba410916ec03a5c6869fe4eb67d672Alex Ray            return -EINVAL;
35911bbeefaf9ba410916ec03a5c6869fe4eb67d672Alex Ray        }
36011bbeefaf9ba410916ec03a5c6869fe4eb67d672Alex Ray    } else {
36111bbeefaf9ba410916ec03a5c6869fe4eb67d672Alex Ray        ALOGV("%s:%d: Capturing new frame.", __func__, mId);
36211bbeefaf9ba410916ec03a5c6869fe4eb67d672Alex Ray
36311bbeefaf9ba410916ec03a5c6869fe4eb67d672Alex Ray        if (!isValidCaptureSettings(request->settings)) {
36411bbeefaf9ba410916ec03a5c6869fe4eb67d672Alex Ray            ALOGE("%s:%d: Invalid settings for capture request: %p",
36511bbeefaf9ba410916ec03a5c6869fe4eb67d672Alex Ray                    __func__, mId, request->settings);
36611bbeefaf9ba410916ec03a5c6869fe4eb67d672Alex Ray            return -EINVAL;
36711bbeefaf9ba410916ec03a5c6869fe4eb67d672Alex Ray        }
36811bbeefaf9ba410916ec03a5c6869fe4eb67d672Alex Ray    }
36911bbeefaf9ba410916ec03a5c6869fe4eb67d672Alex Ray
370083315c85baf28098637684d2307ee8d4df337c6Alex Ray    if (request->num_output_buffers <= 0) {
371083315c85baf28098637684d2307ee8d4df337c6Alex Ray        ALOGE("%s:%d: Invalid number of output buffers: %d", __func__, mId,
372083315c85baf28098637684d2307ee8d4df337c6Alex Ray                request->num_output_buffers);
373083315c85baf28098637684d2307ee8d4df337c6Alex Ray        return -EINVAL;
374083315c85baf28098637684d2307ee8d4df337c6Alex Ray    }
375083315c85baf28098637684d2307ee8d4df337c6Alex Ray    result.num_output_buffers = request->num_output_buffers;
376083315c85baf28098637684d2307ee8d4df337c6Alex Ray    result.output_buffers = new camera3_stream_buffer_t[result.num_output_buffers];
377083315c85baf28098637684d2307ee8d4df337c6Alex Ray    for (unsigned int i = 0; i < request->num_output_buffers; i++) {
378083315c85baf28098637684d2307ee8d4df337c6Alex Ray        int res = processCaptureBuffer(&request->output_buffers[i],
379083315c85baf28098637684d2307ee8d4df337c6Alex Ray                const_cast<camera3_stream_buffer_t*>(&result.output_buffers[i]));
380083315c85baf28098637684d2307ee8d4df337c6Alex Ray        if (res)
381083315c85baf28098637684d2307ee8d4df337c6Alex Ray            goto err_out;
382083315c85baf28098637684d2307ee8d4df337c6Alex Ray    }
383083315c85baf28098637684d2307ee8d4df337c6Alex Ray
384083315c85baf28098637684d2307ee8d4df337c6Alex Ray    result.frame_number = request->frame_number;
385083315c85baf28098637684d2307ee8d4df337c6Alex Ray    // TODO: return actual captured/reprocessed settings
386083315c85baf28098637684d2307ee8d4df337c6Alex Ray    result.result = request->settings;
387083315c85baf28098637684d2307ee8d4df337c6Alex Ray    // TODO: asynchronously return results
388764e442baf0b53284a986b7ed91578fdab42142fAlex Ray    notifyShutter(request->frame_number, 0);
389083315c85baf28098637684d2307ee8d4df337c6Alex Ray    mCallbackOps->process_capture_result(mCallbackOps, &result);
390083315c85baf28098637684d2307ee8d4df337c6Alex Ray
391a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray    return 0;
392083315c85baf28098637684d2307ee8d4df337c6Alex Ray
393083315c85baf28098637684d2307ee8d4df337c6Alex Rayerr_out:
394083315c85baf28098637684d2307ee8d4df337c6Alex Ray    delete [] result.output_buffers;
395083315c85baf28098637684d2307ee8d4df337c6Alex Ray    // TODO: this should probably be a total device failure; transient for now
396083315c85baf28098637684d2307ee8d4df337c6Alex Ray    return -EINVAL;
397a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray}
398a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray
399bfcbd95a1f1aa41f665da5ce78cd7a0098c58f69Alex Rayvoid Camera::setSettings(const camera_metadata_t *new_settings)
400bfcbd95a1f1aa41f665da5ce78cd7a0098c58f69Alex Ray{
401bfcbd95a1f1aa41f665da5ce78cd7a0098c58f69Alex Ray    if (mSettings != NULL) {
402bfcbd95a1f1aa41f665da5ce78cd7a0098c58f69Alex Ray        free_camera_metadata(mSettings);
403bfcbd95a1f1aa41f665da5ce78cd7a0098c58f69Alex Ray        mSettings = NULL;
404bfcbd95a1f1aa41f665da5ce78cd7a0098c58f69Alex Ray    }
405bfcbd95a1f1aa41f665da5ce78cd7a0098c58f69Alex Ray
406bfcbd95a1f1aa41f665da5ce78cd7a0098c58f69Alex Ray    if (new_settings != NULL)
407bfcbd95a1f1aa41f665da5ce78cd7a0098c58f69Alex Ray        mSettings = clone_camera_metadata(new_settings);
408bfcbd95a1f1aa41f665da5ce78cd7a0098c58f69Alex Ray}
409bfcbd95a1f1aa41f665da5ce78cd7a0098c58f69Alex Ray
410c6bf2f291ddca5e8807268f89733e9f6637b4303Alex Raybool Camera::isValidReprocessSettings(const camera_metadata_t* /*settings*/)
41111bbeefaf9ba410916ec03a5c6869fe4eb67d672Alex Ray{
41211bbeefaf9ba410916ec03a5c6869fe4eb67d672Alex Ray    // TODO: reject settings that cannot be reprocessed
41311bbeefaf9ba410916ec03a5c6869fe4eb67d672Alex Ray    // input buffers unimplemented, use this to reject reprocessing requests
41411bbeefaf9ba410916ec03a5c6869fe4eb67d672Alex Ray    ALOGE("%s:%d: Input buffer reprocessing not implemented", __func__, mId);
41511bbeefaf9ba410916ec03a5c6869fe4eb67d672Alex Ray    return false;
41611bbeefaf9ba410916ec03a5c6869fe4eb67d672Alex Ray}
41711bbeefaf9ba410916ec03a5c6869fe4eb67d672Alex Ray
418083315c85baf28098637684d2307ee8d4df337c6Alex Rayint Camera::processCaptureBuffer(const camera3_stream_buffer_t *in,
419083315c85baf28098637684d2307ee8d4df337c6Alex Ray        camera3_stream_buffer_t *out)
420083315c85baf28098637684d2307ee8d4df337c6Alex Ray{
42177ecfd76d79ba3e864ee8cea331e6fac41a1ea45Alex Ray    if (in->acquire_fence != -1) {
42277ecfd76d79ba3e864ee8cea331e6fac41a1ea45Alex Ray        int res = sync_wait(in->acquire_fence, CAMERA_SYNC_TIMEOUT);
42377ecfd76d79ba3e864ee8cea331e6fac41a1ea45Alex Ray        if (res == -ETIME) {
42477ecfd76d79ba3e864ee8cea331e6fac41a1ea45Alex Ray            ALOGE("%s:%d: Timeout waiting on buffer acquire fence",
42577ecfd76d79ba3e864ee8cea331e6fac41a1ea45Alex Ray                    __func__, mId);
42677ecfd76d79ba3e864ee8cea331e6fac41a1ea45Alex Ray            return res;
42777ecfd76d79ba3e864ee8cea331e6fac41a1ea45Alex Ray        } else if (res) {
42877ecfd76d79ba3e864ee8cea331e6fac41a1ea45Alex Ray            ALOGE("%s:%d: Error waiting on buffer acquire fence: %s(%d)",
42977ecfd76d79ba3e864ee8cea331e6fac41a1ea45Alex Ray                    __func__, mId, strerror(-res), res);
43077ecfd76d79ba3e864ee8cea331e6fac41a1ea45Alex Ray            return res;
43177ecfd76d79ba3e864ee8cea331e6fac41a1ea45Alex Ray        }
432083315c85baf28098637684d2307ee8d4df337c6Alex Ray    }
433083315c85baf28098637684d2307ee8d4df337c6Alex Ray
434083315c85baf28098637684d2307ee8d4df337c6Alex Ray    out->stream = in->stream;
435083315c85baf28098637684d2307ee8d4df337c6Alex Ray    out->buffer = in->buffer;
436083315c85baf28098637684d2307ee8d4df337c6Alex Ray    out->status = CAMERA3_BUFFER_STATUS_OK;
437083315c85baf28098637684d2307ee8d4df337c6Alex Ray    // TODO: use driver-backed release fences
438083315c85baf28098637684d2307ee8d4df337c6Alex Ray    out->acquire_fence = -1;
439083315c85baf28098637684d2307ee8d4df337c6Alex Ray    out->release_fence = -1;
440083315c85baf28098637684d2307ee8d4df337c6Alex Ray
441083315c85baf28098637684d2307ee8d4df337c6Alex Ray    // TODO: lock and software-paint buffer
442083315c85baf28098637684d2307ee8d4df337c6Alex Ray    return 0;
443083315c85baf28098637684d2307ee8d4df337c6Alex Ray}
444083315c85baf28098637684d2307ee8d4df337c6Alex Ray
445764e442baf0b53284a986b7ed91578fdab42142fAlex Rayvoid Camera::notifyShutter(uint32_t frame_number, uint64_t timestamp)
446764e442baf0b53284a986b7ed91578fdab42142fAlex Ray{
447764e442baf0b53284a986b7ed91578fdab42142fAlex Ray    int res;
448764e442baf0b53284a986b7ed91578fdab42142fAlex Ray    struct timespec ts;
449764e442baf0b53284a986b7ed91578fdab42142fAlex Ray
450764e442baf0b53284a986b7ed91578fdab42142fAlex Ray    // If timestamp is 0, get timestamp from right now instead
451764e442baf0b53284a986b7ed91578fdab42142fAlex Ray    if (timestamp == 0) {
452764e442baf0b53284a986b7ed91578fdab42142fAlex Ray        ALOGW("%s:%d: No timestamp provided, using CLOCK_BOOTTIME",
453764e442baf0b53284a986b7ed91578fdab42142fAlex Ray                __func__, mId);
454764e442baf0b53284a986b7ed91578fdab42142fAlex Ray        res = clock_gettime(CLOCK_BOOTTIME, &ts);
455764e442baf0b53284a986b7ed91578fdab42142fAlex Ray        if (res == 0) {
456764e442baf0b53284a986b7ed91578fdab42142fAlex Ray            timestamp = ts.tv_sec * 1000000000ULL + ts.tv_nsec;
457764e442baf0b53284a986b7ed91578fdab42142fAlex Ray        } else {
458764e442baf0b53284a986b7ed91578fdab42142fAlex Ray            ALOGE("%s:%d: No timestamp and failed to get CLOCK_BOOTTIME %s(%d)",
459764e442baf0b53284a986b7ed91578fdab42142fAlex Ray                    __func__, mId, strerror(errno), errno);
460764e442baf0b53284a986b7ed91578fdab42142fAlex Ray        }
461764e442baf0b53284a986b7ed91578fdab42142fAlex Ray    }
462764e442baf0b53284a986b7ed91578fdab42142fAlex Ray    camera3_notify_msg_t m;
463764e442baf0b53284a986b7ed91578fdab42142fAlex Ray    memset(&m, 0, sizeof(m));
464764e442baf0b53284a986b7ed91578fdab42142fAlex Ray    m.type = CAMERA3_MSG_SHUTTER;
465764e442baf0b53284a986b7ed91578fdab42142fAlex Ray    m.message.shutter.frame_number = frame_number;
466764e442baf0b53284a986b7ed91578fdab42142fAlex Ray    m.message.shutter.timestamp = timestamp;
467764e442baf0b53284a986b7ed91578fdab42142fAlex Ray    mCallbackOps->notify(mCallbackOps, &m);
468764e442baf0b53284a986b7ed91578fdab42142fAlex Ray}
469764e442baf0b53284a986b7ed91578fdab42142fAlex Ray
470a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Rayvoid Camera::dump(int fd)
471a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray{
472af3a4617b4dd3c231ac94f20e6d171c4bcb42b20Alex Ray    ALOGV("%s:%d: Dumping to fd %d", __func__, mId, fd);
473555676430e4682514681e95fdc2891a8a09bfe03Alex Ray    ATRACE_CALL();
474555676430e4682514681e95fdc2891a8a09bfe03Alex Ray    android::Mutex::Autolock al(mDeviceLock);
47569f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray
4760d1c2a49d675945a34baca364d68c396f03cc3e8Elliott Hughes    dprintf(fd, "Camera ID: %d (Busy: %d)\n", mId, mBusy);
47769f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray
47869f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray    // TODO: dump all settings
4790d1c2a49d675945a34baca364d68c396f03cc3e8Elliott Hughes    dprintf(fd, "Most Recent Settings: (%p)\n", mSettings);
48069f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray
4810d1c2a49d675945a34baca364d68c396f03cc3e8Elliott Hughes    dprintf(fd, "Number of streams: %d\n", mNumStreams);
48269f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray    for (int i = 0; i < mNumStreams; i++) {
4830d1c2a49d675945a34baca364d68c396f03cc3e8Elliott Hughes        dprintf(fd, "Stream %d/%d:\n", i, mNumStreams);
48469f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray        mStreams[i]->dump(fd);
48569f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray    }
486a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray}
487a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray
48862735086edb279ca4c967d66e69f3788e6902b0aAlex Rayconst char* Camera::templateToString(int type)
48962735086edb279ca4c967d66e69f3788e6902b0aAlex Ray{
49062735086edb279ca4c967d66e69f3788e6902b0aAlex Ray    switch (type) {
49162735086edb279ca4c967d66e69f3788e6902b0aAlex Ray    case CAMERA3_TEMPLATE_PREVIEW:
49262735086edb279ca4c967d66e69f3788e6902b0aAlex Ray        return "CAMERA3_TEMPLATE_PREVIEW";
49362735086edb279ca4c967d66e69f3788e6902b0aAlex Ray    case CAMERA3_TEMPLATE_STILL_CAPTURE:
49462735086edb279ca4c967d66e69f3788e6902b0aAlex Ray        return "CAMERA3_TEMPLATE_STILL_CAPTURE";
49562735086edb279ca4c967d66e69f3788e6902b0aAlex Ray    case CAMERA3_TEMPLATE_VIDEO_RECORD:
49662735086edb279ca4c967d66e69f3788e6902b0aAlex Ray        return "CAMERA3_TEMPLATE_VIDEO_RECORD";
49762735086edb279ca4c967d66e69f3788e6902b0aAlex Ray    case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT:
49862735086edb279ca4c967d66e69f3788e6902b0aAlex Ray        return "CAMERA3_TEMPLATE_VIDEO_SNAPSHOT";
49962735086edb279ca4c967d66e69f3788e6902b0aAlex Ray    case CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG:
50062735086edb279ca4c967d66e69f3788e6902b0aAlex Ray        return "CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG";
50162735086edb279ca4c967d66e69f3788e6902b0aAlex Ray    }
50262735086edb279ca4c967d66e69f3788e6902b0aAlex Ray    // TODO: support vendor templates
50362735086edb279ca4c967d66e69f3788e6902b0aAlex Ray    return "Invalid template type!";
50462735086edb279ca4c967d66e69f3788e6902b0aAlex Ray}
50562735086edb279ca4c967d66e69f3788e6902b0aAlex Ray
50662735086edb279ca4c967d66e69f3788e6902b0aAlex Rayint Camera::setTemplate(int type, camera_metadata_t *settings)
50761f7a0c1c1aa481d798116e5a218df04630886e6Alex Ray{
508555676430e4682514681e95fdc2891a8a09bfe03Alex Ray    android::Mutex::Autolock al(mDeviceLock);
509555676430e4682514681e95fdc2891a8a09bfe03Alex Ray
51061f7a0c1c1aa481d798116e5a218df04630886e6Alex Ray    if (!isValidTemplateType(type)) {
51161f7a0c1c1aa481d798116e5a218df04630886e6Alex Ray        ALOGE("%s:%d: Invalid template request type: %d", __func__, mId, type);
51262735086edb279ca4c967d66e69f3788e6902b0aAlex Ray        return -EINVAL;
51361f7a0c1c1aa481d798116e5a218df04630886e6Alex Ray    }
514555676430e4682514681e95fdc2891a8a09bfe03Alex Ray
51561f7a0c1c1aa481d798116e5a218df04630886e6Alex Ray    if (mTemplates[type] != NULL) {
51662735086edb279ca4c967d66e69f3788e6902b0aAlex Ray        ALOGE("%s:%d: Setting already constructed template type %s(%d)",
51762735086edb279ca4c967d66e69f3788e6902b0aAlex Ray                __func__, mId, templateToString(type), type);
51862735086edb279ca4c967d66e69f3788e6902b0aAlex Ray        return -EINVAL;
51961f7a0c1c1aa481d798116e5a218df04630886e6Alex Ray    }
520555676430e4682514681e95fdc2891a8a09bfe03Alex Ray
52162735086edb279ca4c967d66e69f3788e6902b0aAlex Ray    // Make a durable copy of the underlying metadata
52261f7a0c1c1aa481d798116e5a218df04630886e6Alex Ray    mTemplates[type] = clone_camera_metadata(settings);
52362735086edb279ca4c967d66e69f3788e6902b0aAlex Ray    if (mTemplates[type] == NULL) {
52462735086edb279ca4c967d66e69f3788e6902b0aAlex Ray        ALOGE("%s:%d: Failed to clone metadata %p for template type %s(%d)",
52562735086edb279ca4c967d66e69f3788e6902b0aAlex Ray                __func__, mId, settings, templateToString(type), type);
52662735086edb279ca4c967d66e69f3788e6902b0aAlex Ray        return -EINVAL;
52762735086edb279ca4c967d66e69f3788e6902b0aAlex Ray    }
52862735086edb279ca4c967d66e69f3788e6902b0aAlex Ray    return 0;
52961f7a0c1c1aa481d798116e5a218df04630886e6Alex Ray}
53061f7a0c1c1aa481d798116e5a218df04630886e6Alex Ray
531a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Rayextern "C" {
532a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray// Get handle to camera from device priv data
533a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Raystatic Camera *camdev_to_camera(const camera3_device_t *dev)
534a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray{
535a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray    return reinterpret_cast<Camera*>(dev->priv);
536a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray}
537a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray
538a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Raystatic int initialize(const camera3_device_t *dev,
539a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray        const camera3_callback_ops_t *callback_ops)
540a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray{
541a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray    return camdev_to_camera(dev)->initialize(callback_ops);
542a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray}
543a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray
544a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Raystatic int configure_streams(const camera3_device_t *dev,
545a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray        camera3_stream_configuration_t *stream_list)
546a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray{
547a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray    return camdev_to_camera(dev)->configureStreams(stream_list);
548a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray}
549a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray
550a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Raystatic int register_stream_buffers(const camera3_device_t *dev,
551a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray        const camera3_stream_buffer_set_t *buffer_set)
552a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray{
553a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray    return camdev_to_camera(dev)->registerStreamBuffers(buffer_set);
554a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray}
555a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray
556a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Raystatic const camera_metadata_t *construct_default_request_settings(
557a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray        const camera3_device_t *dev, int type)
558a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray{
559a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray    return camdev_to_camera(dev)->constructDefaultRequestSettings(type);
5607ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray}
5617ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray
562a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Raystatic int process_capture_request(const camera3_device_t *dev,
563a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray        camera3_capture_request_t *request)
564a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray{
565a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray    return camdev_to_camera(dev)->processCaptureRequest(request);
566a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray}
567a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray
568a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Raystatic void dump(const camera3_device_t *dev, int fd)
569a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray{
570a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray    camdev_to_camera(dev)->dump(fd);
571a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray}
572a82f456c387cb6ff6c5aab7c930a7a61c36ed8baSasha Levitskiy
573a82f456c387cb6ff6c5aab7c930a7a61c36ed8baSasha Levitskiystatic int flush(const camera3_device_t*)
574a82f456c387cb6ff6c5aab7c930a7a61c36ed8baSasha Levitskiy{
575a82f456c387cb6ff6c5aab7c930a7a61c36ed8baSasha Levitskiy    ALOGE("%s: unimplemented.", __func__);
576a82f456c387cb6ff6c5aab7c930a7a61c36ed8baSasha Levitskiy    return -1;
577a82f456c387cb6ff6c5aab7c930a7a61c36ed8baSasha Levitskiy}
578a82f456c387cb6ff6c5aab7c930a7a61c36ed8baSasha Levitskiy
579a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray} // extern "C"
580a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray
581a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Rayconst camera3_device_ops_t Camera::sOps = {
582a82f456c387cb6ff6c5aab7c930a7a61c36ed8baSasha Levitskiy    .initialize = default_camera_hal::initialize,
583a82f456c387cb6ff6c5aab7c930a7a61c36ed8baSasha Levitskiy    .configure_streams = default_camera_hal::configure_streams,
584a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray    .register_stream_buffers = default_camera_hal::register_stream_buffers,
585a82f456c387cb6ff6c5aab7c930a7a61c36ed8baSasha Levitskiy    .construct_default_request_settings
586a82f456c387cb6ff6c5aab7c930a7a61c36ed8baSasha Levitskiy        = default_camera_hal::construct_default_request_settings,
587a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray    .process_capture_request = default_camera_hal::process_capture_request,
58861cf9eb920206408a2a9c01cc7a5c5b68107069cRuben Brunk    .get_metadata_vendor_tag_ops = NULL,
589a82f456c387cb6ff6c5aab7c930a7a61c36ed8baSasha Levitskiy    .dump = default_camera_hal::dump,
590a82f456c387cb6ff6c5aab7c930a7a61c36ed8baSasha Levitskiy    .flush = default_camera_hal::flush,
591a82f456c387cb6ff6c5aab7c930a7a61c36ed8baSasha Levitskiy    .reserved = {0},
592a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray};
593a0ed4bead4d7a9b9031f7cefe0ef49a951443461Alex Ray
5947ee0b7aac252dd2758e9344c12cf5f72415c5aceAlex Ray} // namespace default_camera_hal
595