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