blob: 5e3fcf2b79e328dc95d0310fc733892930e0c93b [file] [log] [blame]
Yin-Chia Yeh248ed702017-01-23 17:27:26 -08001/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#define LOG_TAG "CamDev@1.0-impl"
18#include <utils/Log.h>
19#include <hardware/camera.h>
20#include <hardware/gralloc1.h>
21#include <utils/Trace.h>
22
Eino-Ville Talvala2d80c0d2017-03-23 15:39:12 -070023#include <grallocusage/GrallocUsageConversion.h>
24
Yin-Chia Yeh248ed702017-01-23 17:27:26 -080025#include "CameraDevice_1_0.h"
26
27namespace android {
28namespace hardware {
29namespace camera {
30namespace device {
31namespace V1_0 {
32namespace implementation {
33
Yin-Chia Yeh248ed702017-01-23 17:27:26 -080034using ::android::hardware::graphics::common::V1_0::PixelFormat;
35
36HandleImporter& CameraDevice::sHandleImporter = HandleImporter::getInstance();
37
38Status CameraDevice::getHidlStatus(const int& status) {
39 switch (status) {
40 case 0: return Status::OK;
41 case -ENOSYS: return Status::OPERATION_NOT_SUPPORTED;
42 case -EBUSY : return Status::CAMERA_IN_USE;
43 case -EUSERS: return Status::MAX_CAMERAS_IN_USE;
44 case -ENODEV: return Status::INTERNAL_ERROR;
45 case -EINVAL: return Status::ILLEGAL_ARGUMENT;
46 default:
47 ALOGE("%s: unknown HAL status code %d", __FUNCTION__, status);
48 return Status::INTERNAL_ERROR;
49 }
50}
51
52status_t CameraDevice::getStatusT(const Status& s) {
53 switch(s) {
54 case Status::OK:
55 return OK;
56 case Status::ILLEGAL_ARGUMENT:
57 return BAD_VALUE;
58 case Status::CAMERA_IN_USE:
59 return -EBUSY;
60 case Status::MAX_CAMERAS_IN_USE:
61 return -EUSERS;
62 case Status::METHOD_NOT_SUPPORTED:
63 return UNKNOWN_TRANSACTION;
64 case Status::OPERATION_NOT_SUPPORTED:
65 return INVALID_OPERATION;
66 case Status::CAMERA_DISCONNECTED:
67 return DEAD_OBJECT;
68 case Status::INTERNAL_ERROR:
69 return INVALID_OPERATION;
70 }
71 ALOGW("Unexpected HAL status code %d", s);
72 return INVALID_OPERATION;
73}
74
75Status CameraDevice::initStatus() const {
76 Mutex::Autolock _l(mLock);
77 Status status = Status::OK;
78 if (mInitFail) {
79 status = Status::INTERNAL_ERROR;
80 } else if (mDisconnected) {
81 status = Status::CAMERA_DISCONNECTED;
82 }
83 return status;
84}
85
86CameraDevice::CameraDevice(
87 sp<CameraModule> module, const std::string& cameraId,
88 const SortedVector<std::pair<std::string, std::string>>& cameraDeviceNames) :
89 mModule(module),
90 mCameraId(cameraId),
91 mDisconnected(false),
92 mCameraDeviceNames(cameraDeviceNames) {
93 mCameraIdInt = atoi(mCameraId.c_str());
94 // Should not reach here as provider also validate ID
95 if (mCameraIdInt < 0 || mCameraIdInt >= module->getNumberOfCameras()) {
96 ALOGE("%s: Invalid camera id: %s", __FUNCTION__, mCameraId.c_str());
97 mInitFail = true;
98 }
99
100 mDeviceVersion = mModule->getDeviceVersion(mCameraIdInt);
101 if (mDeviceVersion != CAMERA_DEVICE_API_VERSION_1_0 && !mModule->isOpenLegacyDefined()) {
102 ALOGI("%s: Camera id %s does not support HAL1.0",
103 __FUNCTION__, mCameraId.c_str());
104 mInitFail = true;
105 }
106}
107
108CameraDevice::~CameraDevice() {
109 Mutex::Autolock _l(mLock);
110 if (mDevice != nullptr) {
111 ALOGW("%s: camera %s is deleted while open", __FUNCTION__, mCameraId.c_str());
112 close();
113 }
114 mHalPreviewWindow.cleanUpCirculatingBuffers();
115}
116
117
118void CameraDevice::setConnectionStatus(bool connected) {
119 Mutex::Autolock _l(mLock);
120 mDisconnected = !connected;
121 if (mDevice == nullptr) {
122 return;
123 }
124 if (!connected) {
125 ALOGW("%s: camera %s is disconneted. Closing", __FUNCTION__, mCameraId.c_str());
126 close();
127 }
128 return;
129}
130
131void CameraDevice::CameraPreviewWindow::cleanUpCirculatingBuffers() {
132 Mutex::Autolock _l(mLock);
133 for (auto pair : mCirculatingBuffers) {
134 sHandleImporter.freeBuffer(pair.second);
135 }
136 mCirculatingBuffers.clear();
137 mBufferIdMap.clear();
138}
139
140int CameraDevice::sDequeueBuffer(struct preview_stream_ops* w,
141 buffer_handle_t** buffer, int *stride) {
142 CameraPreviewWindow* object = static_cast<CameraPreviewWindow*>(w);
143 if (object->mPreviewCallback == nullptr) {
144 ALOGE("%s: camera HAL calling preview ops while there is no preview window!", __FUNCTION__);
145 return INVALID_OPERATION;
146 }
147
148 if (buffer == nullptr || stride == nullptr) {
149 ALOGE("%s: buffer (%p) and stride (%p) must not be null!", __FUNCTION__, buffer, stride);
150 return BAD_VALUE;
151 }
152
153 Status s;
154 object->mPreviewCallback->dequeueBuffer(
155 [&](auto status, uint64_t bufferId, const auto& buf, uint32_t strd) {
156 s = status;
157 if (s == Status::OK) {
158 Mutex::Autolock _l(object->mLock);
159 if (object->mCirculatingBuffers.count(bufferId) == 0) {
160 buffer_handle_t importedBuf = buf.getNativeHandle();
161 sHandleImporter.importBuffer(importedBuf);
162 if (importedBuf == nullptr) {
163 ALOGE("%s: preview buffer import failed!", __FUNCTION__);
164 s = Status::INTERNAL_ERROR;
165 return;
166 } else {
167 object->mCirculatingBuffers[bufferId] = importedBuf;
168 object->mBufferIdMap[&(object->mCirculatingBuffers[bufferId])] = bufferId;
169 }
170 }
171 *buffer = &(object->mCirculatingBuffers[bufferId]);
172 *stride = strd;
173 }
174 });
175 return getStatusT(s);
176}
177
178int CameraDevice::sLockBuffer(struct preview_stream_ops*, buffer_handle_t*) {
179 // TODO: make sure lock_buffer is indeed a no-op (and will always be)
180 return 0;
181}
182
183int CameraDevice::sEnqueueBuffer(struct preview_stream_ops* w, buffer_handle_t* buffer) {
184 CameraPreviewWindow* object = static_cast<CameraPreviewWindow*>(w);
185 if (object->mPreviewCallback == nullptr) {
186 ALOGE("%s: camera HAL calling preview ops while there is no preview window!", __FUNCTION__);
187 return INVALID_OPERATION;
188 }
189 uint64_t bufferId = object->mBufferIdMap.at(buffer);
190 return getStatusT(object->mPreviewCallback->enqueueBuffer(bufferId));
191}
192
193int CameraDevice::sCancelBuffer(struct preview_stream_ops* w, buffer_handle_t* buffer) {
194 CameraPreviewWindow* object = static_cast<CameraPreviewWindow*>(w);
195 if (object->mPreviewCallback == nullptr) {
196 ALOGE("%s: camera HAL calling preview ops while there is no preview window!", __FUNCTION__);
197 return INVALID_OPERATION;
198 }
199 uint64_t bufferId = object->mBufferIdMap.at(buffer);
200 return getStatusT(object->mPreviewCallback->cancelBuffer(bufferId));
201}
202
203int CameraDevice::sSetBufferCount(struct preview_stream_ops* w, int count) {
204 CameraPreviewWindow* object = static_cast<CameraPreviewWindow*>(w);
205 if (object->mPreviewCallback == nullptr) {
206 ALOGE("%s: camera HAL calling preview ops while there is no preview window!", __FUNCTION__);
207 return INVALID_OPERATION;
208 }
209
210 object->cleanUpCirculatingBuffers();
211 return getStatusT(object->mPreviewCallback->setBufferCount(count));
212}
213
214int CameraDevice::sSetBuffersGeometry(struct preview_stream_ops* w,
215 int width, int height, int format) {
216 CameraPreviewWindow* object = static_cast<CameraPreviewWindow*>(w);
217 if (object->mPreviewCallback == nullptr) {
218 ALOGE("%s: camera HAL calling preview ops while there is no preview window!", __FUNCTION__);
219 return INVALID_OPERATION;
220 }
221
222 object->cleanUpCirculatingBuffers();
223 return getStatusT(
224 object->mPreviewCallback->setBuffersGeometry(width, height, (PixelFormat) format));
225}
226
227int CameraDevice::sSetCrop(struct preview_stream_ops *w,
228 int left, int top, int right, int bottom) {
229 CameraPreviewWindow* object = static_cast<CameraPreviewWindow*>(w);
230 if (object->mPreviewCallback == nullptr) {
231 ALOGE("%s: camera HAL calling preview ops while there is no preview window!", __FUNCTION__);
232 return INVALID_OPERATION;
233 }
234
235 return getStatusT(object->mPreviewCallback->setCrop(left, top, right, bottom));
236}
237
238int CameraDevice::sSetTimestamp(struct preview_stream_ops *w, int64_t timestamp) {
239 CameraPreviewWindow* object = static_cast<CameraPreviewWindow*>(w);
240 if (object->mPreviewCallback == nullptr) {
241 ALOGE("%s: camera HAL calling preview ops while there is no preview window!", __FUNCTION__);
242 return INVALID_OPERATION;
243 }
244
245 return getStatusT(object->mPreviewCallback->setTimestamp(timestamp));
246}
247
248int CameraDevice::sSetUsage(struct preview_stream_ops* w, int usage) {
249 CameraPreviewWindow* object = static_cast<CameraPreviewWindow*>(w);
250 if (object->mPreviewCallback == nullptr) {
251 ALOGE("%s: camera HAL calling preview ops while there is no preview window!", __FUNCTION__);
252 return INVALID_OPERATION;
253 }
254
255 object->cleanUpCirculatingBuffers();
Eino-Ville Talvala2d80c0d2017-03-23 15:39:12 -0700256 ProducerUsageFlags producerUsage;
257 uint64_t consumerUsage;
258 ::android_convertGralloc0To1Usage(usage, &producerUsage, &consumerUsage);
259 return getStatusT(object->mPreviewCallback->setUsage(producerUsage));
Yin-Chia Yeh248ed702017-01-23 17:27:26 -0800260}
261
262int CameraDevice::sSetSwapInterval(struct preview_stream_ops *w, int interval) {
263 CameraPreviewWindow* object = static_cast<CameraPreviewWindow*>(w);
264 if (object->mPreviewCallback == nullptr) {
265 ALOGE("%s: camera HAL calling preview ops while there is no preview window!", __FUNCTION__);
266 return INVALID_OPERATION;
267 }
268
269 return getStatusT(object->mPreviewCallback->setSwapInterval(interval));
270}
271
272int CameraDevice::sGetMinUndequeuedBufferCount(
273 const struct preview_stream_ops *w,
274 int *count) {
275 const CameraPreviewWindow* object = static_cast<const CameraPreviewWindow*>(w);
276 if (object->mPreviewCallback == nullptr) {
277 ALOGE("%s: camera HAL calling preview ops while there is no preview window!", __FUNCTION__);
278 return INVALID_OPERATION;
279 }
280 if (count == nullptr) {
281 ALOGE("%s: count is null!", __FUNCTION__);
282 return BAD_VALUE;
283 }
284
285 Status s;
286 object->mPreviewCallback->getMinUndequeuedBufferCount(
287 [&](auto status, uint32_t cnt) {
288 s = status;
289 if (s == Status::OK) {
290 *count = cnt;
291 }
292 });
293 return getStatusT(s);
294}
295
296CameraDevice::CameraHeapMemory::CameraHeapMemory(int fd, size_t buf_size, uint_t num_buffers) :
297 mBufSize(buf_size),
298 mNumBufs(num_buffers) {
299 mHeap = new MemoryHeapBase(fd, buf_size * num_buffers);
300 commonInitialization();
301}
302
303CameraDevice::CameraHeapMemory::CameraHeapMemory(size_t buf_size, uint_t num_buffers) :
304 mBufSize(buf_size),
305 mNumBufs(num_buffers) {
306 mHeap = new MemoryHeapBase(buf_size * num_buffers);
307 commonInitialization();
308}
309
310void CameraDevice::CameraHeapMemory::commonInitialization() {
311 handle.data = mHeap->base();
312 handle.size = mBufSize * mNumBufs;
313 handle.handle = this;
314
315 mBuffers = new sp<MemoryBase>[mNumBufs];
316 for (uint_t i = 0; i < mNumBufs; i++) {
317 mBuffers[i] = new MemoryBase(mHeap, i * mBufSize, mBufSize);
318 }
319
320 handle.release = sPutMemory;
321}
322
323CameraDevice::CameraHeapMemory::~CameraHeapMemory() {
324 delete [] mBuffers;
325}
326
327// shared memory methods
328camera_memory_t* CameraDevice::sGetMemory(int fd, size_t buf_size, uint_t num_bufs, void *user) {
329 ALOGV("%s", __FUNCTION__);
330 CameraDevice* object = static_cast<CameraDevice*>(user);
331 if (object->mDeviceCallback == nullptr) {
332 ALOGE("%s: camera HAL request memory while camera is not opened!", __FUNCTION__);
333 return nullptr;
334 }
335
336 CameraHeapMemory* mem;
337 native_handle_t* handle = native_handle_create(1,0);
338
339 if (handle == nullptr) {
340 ALOGE("%s: native_handle_create failed!", __FUNCTION__);
341 return nullptr;
342 }
343
344 if (fd < 0) {
345 mem = new CameraHeapMemory(buf_size, num_bufs);
346 } else {
347 mem = new CameraHeapMemory(fd, buf_size, num_bufs);
348 }
349 handle->data[0] = mem->mHeap->getHeapID();
350 mem->incStrong(mem);
351
352 hidl_handle hidlHandle = handle;
353 MemoryId id = object->mDeviceCallback->registerMemory(hidlHandle, buf_size, num_bufs);
354 mem->handle.mId = id;
355 if (object->mMemoryMap.count(id) != 0) {
356 ALOGE("%s: duplicate MemoryId %d returned by client!", __FUNCTION__, id);
357 }
358 object->mMemoryMap[id] = mem;
359 mem->handle.mDevice = object;
360 native_handle_delete(handle);
361 return &mem->handle;
362}
363
364void CameraDevice::sPutMemory(camera_memory_t *data) {
365 if (!data)
366 return;
367
368 CameraHeapMemory* mem = static_cast<CameraHeapMemory *>(data->handle);
369 CameraDevice* device = mem->handle.mDevice;
370 if (device == nullptr) {
371 ALOGE("%s: camera HAL return memory for a null device!", __FUNCTION__);
372 }
373 if (device->mDeviceCallback == nullptr) {
374 ALOGE("%s: camera HAL return memory while camera is not opened!", __FUNCTION__);
375 }
376 device->mDeviceCallback->unregisterMemory(mem->handle.mId);
377 device->mMemoryMap.erase(mem->handle.mId);
378 mem->decStrong(mem);
379}
380
381// Callback forwarding methods
382void CameraDevice::sNotifyCb(int32_t msg_type, int32_t ext1, int32_t ext2, void *user) {
383 ALOGV("%s", __FUNCTION__);
384 CameraDevice* object = static_cast<CameraDevice*>(user);
385 if (object->mDeviceCallback != nullptr) {
386 object->mDeviceCallback->notifyCallback((NotifyCallbackMsg) msg_type, ext1, ext2);
387 }
388}
389
390void CameraDevice::sDataCb(int32_t msg_type, const camera_memory_t *data, unsigned int index,
391 camera_frame_metadata_t *metadata, void *user) {
392 ALOGV("%s", __FUNCTION__);
393 CameraDevice* object = static_cast<CameraDevice*>(user);
394 sp<CameraHeapMemory> mem(static_cast<CameraHeapMemory*>(data->handle));
395 if (index >= mem->mNumBufs) {
396 ALOGE("%s: invalid buffer index %d, max allowed is %d", __FUNCTION__,
397 index, mem->mNumBufs);
398 return;
399 }
400 if (object->mDeviceCallback != nullptr) {
401 CameraFrameMetadata hidlMetadata;
402 if (metadata) {
403 hidlMetadata.faces.resize(metadata->number_of_faces);
404 for (size_t i = 0; i < hidlMetadata.faces.size(); i++) {
405 hidlMetadata.faces[i].score = metadata->faces[i].score;
406 hidlMetadata.faces[i].id = metadata->faces[i].id;
407 for (int k = 0; k < 4; k++) {
408 hidlMetadata.faces[i].rect[k] = metadata->faces[i].rect[k];
409 }
410 for (int k = 0; k < 2; k++) {
411 hidlMetadata.faces[i].leftEye[k] = metadata->faces[i].left_eye[k];
412 }
413 for (int k = 0; k < 2; k++) {
414 hidlMetadata.faces[i].rightEye[k] = metadata->faces[i].right_eye[k];
415 }
416 for (int k = 0; k < 2; k++) {
417 hidlMetadata.faces[i].mouth[k] = metadata->faces[i].mouth[k];
418 }
419 }
420 }
421 CameraHeapMemory* mem = static_cast<CameraHeapMemory *>(data->handle);
422 object->mDeviceCallback->dataCallback(
423 (DataCallbackMsg) msg_type, mem->handle.mId, index, hidlMetadata);
424 }
425}
426
Yin-Chia Yeh1ba83a92017-03-21 17:47:02 -0700427void CameraDevice::handleCallbackTimestamp(
428 nsecs_t timestamp, int32_t msg_type,
429 MemoryId memId , unsigned index, native_handle_t* handle) {
430 uint32_t batchSize = 0;
431 {
432 Mutex::Autolock _l(mBatchLock);
433 batchSize = mBatchSize;
434 }
435
436 if (batchSize == 0) { // non-batch mode
437 mDeviceCallback->handleCallbackTimestamp(
438 (DataCallbackMsg) msg_type, handle, memId, index, timestamp);
439 } else { // batch mode
440 Mutex::Autolock _l(mBatchLock);
441 size_t inflightSize = mInflightBatch.size();
442 if (inflightSize == 0) {
443 mBatchMsgType = msg_type;
444 } else if (mBatchMsgType != msg_type) {
445 ALOGE("%s: msg_type change (from %d to %d) is not supported!",
446 __FUNCTION__, mBatchMsgType, msg_type);
447 return;
448 }
449 mInflightBatch.push_back({handle, memId, index, timestamp});
450
451 // Send batched frames to camera framework
452 if (mInflightBatch.size() >= batchSize) {
453 mDeviceCallback->handleCallbackTimestampBatch(
454 (DataCallbackMsg) mBatchMsgType, mInflightBatch);
455 mInflightBatch.clear();
456 }
457 }
458}
459
Yin-Chia Yeh248ed702017-01-23 17:27:26 -0800460void CameraDevice::sDataCbTimestamp(nsecs_t timestamp, int32_t msg_type,
461 const camera_memory_t *data, unsigned index, void *user) {
462 ALOGV("%s", __FUNCTION__);
463 CameraDevice* object = static_cast<CameraDevice*>(user);
464 // Start refcounting the heap object from here on. When the clients
465 // drop all references, it will be destroyed (as well as the enclosed
466 // MemoryHeapBase.
467 sp<CameraHeapMemory> mem(static_cast<CameraHeapMemory*>(data->handle));
468 if (index >= mem->mNumBufs) {
469 ALOGE("%s: invalid buffer index %d, max allowed is %d", __FUNCTION__,
470 index, mem->mNumBufs);
471 return;
472 }
473
474 native_handle_t* handle = nullptr;
475 if (object->mMetadataMode) {
476 if (mem->mBufSize == sizeof(VideoNativeHandleMetadata)) {
477 VideoNativeHandleMetadata* md = (VideoNativeHandleMetadata*)
478 mem->mBuffers[index]->pointer();
479 if (md->eType == VideoNativeHandleMetadata::kMetadataBufferTypeNativeHandleSource) {
480 handle = md->pHandle;
481 }
482 }
483 }
484
485 if (object->mDeviceCallback != nullptr) {
486 if (handle == nullptr) {
487 object->mDeviceCallback->dataCallbackTimestamp(
488 (DataCallbackMsg) msg_type, mem->handle.mId, index, timestamp);
489 } else {
Yin-Chia Yeh1ba83a92017-03-21 17:47:02 -0700490 object->handleCallbackTimestamp(timestamp, msg_type, mem->handle.mId, index, handle);
Yin-Chia Yeh248ed702017-01-23 17:27:26 -0800491 }
492 }
493}
494
495void CameraDevice::initHalPreviewWindow()
496{
497 mHalPreviewWindow.cancel_buffer = sCancelBuffer;
498 mHalPreviewWindow.lock_buffer = sLockBuffer;
499 mHalPreviewWindow.dequeue_buffer = sDequeueBuffer;
500 mHalPreviewWindow.enqueue_buffer = sEnqueueBuffer;
501 mHalPreviewWindow.set_buffer_count = sSetBufferCount;
502 mHalPreviewWindow.set_buffers_geometry = sSetBuffersGeometry;
503 mHalPreviewWindow.set_crop = sSetCrop;
504 mHalPreviewWindow.set_timestamp = sSetTimestamp;
505 mHalPreviewWindow.set_usage = sSetUsage;
506 mHalPreviewWindow.set_swap_interval = sSetSwapInterval;
507
508 mHalPreviewWindow.get_min_undequeued_buffer_count =
509 sGetMinUndequeuedBufferCount;
510}
511
512// Methods from ::android::hardware::camera::device::V1_0::ICameraDevice follow.
513Return<void> CameraDevice::getResourceCost(getResourceCost_cb _hidl_cb) {
514 Status status = initStatus();
515 CameraResourceCost resCost;
516 if (status == Status::OK) {
517 int cost = 100;
518 std::vector<std::string> conflicting_devices;
519 struct camera_info info;
520
521 // If using post-2.4 module version, query the cost + conflicting devices from the HAL
522 if (mModule->getModuleApiVersion() >= CAMERA_MODULE_API_VERSION_2_4) {
523 int ret = mModule->getCameraInfo(mCameraIdInt, &info);
524 if (ret == OK) {
525 cost = info.resource_cost;
526 for (size_t i = 0; i < info.conflicting_devices_length; i++) {
527 std::string cameraId(info.conflicting_devices[i]);
528 for (const auto& pair : mCameraDeviceNames) {
529 if (cameraId == pair.first) {
530 conflicting_devices.push_back(pair.second);
531 }
532 }
533 }
534 } else {
535 status = Status::INTERNAL_ERROR;
536 }
537 }
538
539 if (status == Status::OK) {
540 resCost.resourceCost = cost;
541 resCost.conflictingDevices.resize(conflicting_devices.size());
542 for (size_t i = 0; i < conflicting_devices.size(); i++) {
543 resCost.conflictingDevices[i] = conflicting_devices[i];
544 ALOGV("CamDevice %s is conflicting with camDevice %s",
545 mCameraId.c_str(), resCost.conflictingDevices[i].c_str());
546 }
547 }
548 }
549 _hidl_cb(status, resCost);
550 return Void();
551}
552
553Return<void> CameraDevice::getCameraInfo(getCameraInfo_cb _hidl_cb) {
554 Status status = initStatus();
555 CameraInfo cameraInfo;
556 if (status == Status::OK) {
557 struct camera_info info;
558 int ret = mModule->getCameraInfo(mCameraIdInt, &info);
559 if (ret == OK) {
560 cameraInfo.facing = (CameraFacing) info.facing;
561 // Device 1.0 does not support external camera facing.
562 // The closest approximation would be front camera.
563 // TODO: figure out should we override here or let
564 // camera service handle it.
565 if (cameraInfo.facing == CameraFacing::EXTERNAL) {
566 cameraInfo.facing = CameraFacing::FRONT;
567 }
568 cameraInfo.orientation = info.orientation;
569 } else {
570 ALOGE("%s: get camera info failed!", __FUNCTION__);
571 status = Status::INTERNAL_ERROR;
572 }
573 }
574 _hidl_cb(status, cameraInfo);
575 return Void();
576}
577
578Return<Status> CameraDevice::setTorchMode(TorchMode mode) {
579 if (!mModule->isSetTorchModeSupported()) {
580 return Status::METHOD_NOT_SUPPORTED;
581 }
582
583 Status status = initStatus();
584 if (status == Status::OK) {
585 bool enable = (mode == TorchMode::ON) ? true : false;
586 status = getHidlStatus(mModule->setTorchMode(mCameraId.c_str(), enable));
587 }
588 return status;
589}
590
591Return<Status> CameraDevice::dumpState(const hidl_handle& handle) {
592 Mutex::Autolock _l(mLock);
593 if (handle.getNativeHandle() == nullptr) {
594 ALOGE("%s: handle must not be null", __FUNCTION__);
595 return Status::ILLEGAL_ARGUMENT;
596 }
597 if (handle->numFds != 1 || handle->numInts != 0) {
598 ALOGE("%s: handle must contain 1 FD and 0 integers! Got %d FDs and %d ints",
599 __FUNCTION__, handle->numFds, handle->numInts);
600 return Status::ILLEGAL_ARGUMENT;
601 }
602 int fd = handle->data[0];
603
604 if (mDevice != nullptr) {
605 if (mDevice->ops->dump) { // It's fine if the HAL doesn't implement dump()
606 return getHidlStatus(mDevice->ops->dump(mDevice, fd));
607 }
608 }
609 return Status::OK;
610}
611
612Return<Status> CameraDevice::open(const sp<ICameraDeviceCallback>& callback) {
613 ALOGI("Opening camera %s", mCameraId.c_str());
614 Mutex::Autolock _l(mLock);
615
616 camera_info info;
617 status_t res = mModule->getCameraInfo(mCameraIdInt, &info);
618 if (res != OK) {
619 ALOGE("Could not get camera info: %s: %d", mCameraId.c_str(), res);
620 return getHidlStatus(res);
621 }
622
623 int rc = OK;
624 if (mModule->getModuleApiVersion() >= CAMERA_MODULE_API_VERSION_2_3 &&
625 info.device_version > CAMERA_DEVICE_API_VERSION_1_0) {
626 // Open higher version camera device as HAL1.0 device.
627 rc = mModule->openLegacy(mCameraId.c_str(),
628 CAMERA_DEVICE_API_VERSION_1_0,
629 (hw_device_t **)&mDevice);
630 } else {
631 rc = mModule->open(mCameraId.c_str(), (hw_device_t **)&mDevice);
632 }
633 if (rc != OK) {
634 mDevice = nullptr;
635 ALOGE("Could not open camera %s: %d", mCameraId.c_str(), rc);
636 return getHidlStatus(rc);
637 }
638
639 initHalPreviewWindow();
640 mDeviceCallback = callback;
641
642 if (mDevice->ops->set_callbacks) {
643 mDevice->ops->set_callbacks(mDevice,
644 sNotifyCb, sDataCb, sDataCbTimestamp, sGetMemory, this);
645 }
646
647 return getHidlStatus(rc);
648}
649
650Return<Status> CameraDevice::setPreviewWindow(const sp<ICameraDevicePreviewCallback>& window) {
651 ALOGV("%s(%s)", __FUNCTION__, mCameraId.c_str());
652 Mutex::Autolock _l(mLock);
653 if (!mDevice) {
654 ALOGE("%s called while camera is not opened", __FUNCTION__);
655 return Status::OPERATION_NOT_SUPPORTED;
656 }
657
658 mHalPreviewWindow.mPreviewCallback = window;
659 if (mDevice->ops->set_preview_window) {
660 return getHidlStatus(mDevice->ops->set_preview_window(mDevice,
661 (window == nullptr) ? nullptr : &mHalPreviewWindow));
662 }
663 return Status::INTERNAL_ERROR; // HAL should provide set_preview_window
664}
665
666Return<void> CameraDevice::enableMsgType(uint32_t msgType) {
667 ALOGV("%s(%s)", __FUNCTION__, mCameraId.c_str());
668 Mutex::Autolock _l(mLock);
669 if (!mDevice) {
670 ALOGE("%s called while camera is not opened", __FUNCTION__);
671 return Void();
672 }
673 if (mDevice->ops->enable_msg_type) {
674 mDevice->ops->enable_msg_type(mDevice, msgType);
675 }
676 return Void();
677}
678
679Return<void> CameraDevice::disableMsgType(uint32_t msgType) {
680 ALOGV("%s(%s)", __FUNCTION__, mCameraId.c_str());
681 Mutex::Autolock _l(mLock);
682 if (!mDevice) {
683 ALOGE("%s called while camera is not opened", __FUNCTION__);
684 return Void();
685 }
686 if (mDevice->ops->disable_msg_type) {
687 mDevice->ops->disable_msg_type(mDevice, msgType);
688 }
689 return Void();
690}
691
692Return<bool> CameraDevice::msgTypeEnabled(uint32_t msgType) {
693 ALOGV("%s(%s)", __FUNCTION__, mCameraId.c_str());
694 Mutex::Autolock _l(mLock);
695 if (!mDevice) {
696 ALOGE("%s called while camera is not opened", __FUNCTION__);
697 return false;
698 }
699 if (mDevice->ops->msg_type_enabled) {
700 return mDevice->ops->msg_type_enabled(mDevice, msgType);
701 }
702 return false;
703}
704
705Return<Status> CameraDevice::startPreview() {
706 ALOGV("%s(%s)", __FUNCTION__, mCameraId.c_str());
707 Mutex::Autolock _l(mLock);
708 if (!mDevice) {
709 ALOGE("%s called while camera is not opened", __FUNCTION__);
710 return Status::OPERATION_NOT_SUPPORTED;
711 }
712 if (mDevice->ops->start_preview) {
713 return getHidlStatus(mDevice->ops->start_preview(mDevice));
714 }
715 return Status::INTERNAL_ERROR; // HAL should provide start_preview
716}
717
718Return<void> CameraDevice::stopPreview() {
719 ALOGV("%s(%s)", __FUNCTION__, mCameraId.c_str());
720 Mutex::Autolock _l(mLock);
721 if (!mDevice) {
722 ALOGE("%s called while camera is not opened", __FUNCTION__);
723 return Void();
724 }
725 if (mDevice->ops->stop_preview) {
726 mDevice->ops->stop_preview(mDevice);
727 }
728 return Void();
729}
730
731Return<bool> CameraDevice::previewEnabled() {
732 ALOGV("%s(%s)", __FUNCTION__, mCameraId.c_str());
733 Mutex::Autolock _l(mLock);
734 if (!mDevice) {
735 ALOGE("%s called while camera is not opened", __FUNCTION__);
736 return false;
737 }
738 if (mDevice->ops->preview_enabled) {
739 return mDevice->ops->preview_enabled(mDevice);
740 }
741 return false;
742}
743
744Return<Status> CameraDevice::storeMetaDataInBuffers(bool enable) {
745 ALOGV("%s(%s)", __FUNCTION__, mCameraId.c_str());
746 Mutex::Autolock _l(mLock);
747 if (!mDevice) {
748 ALOGE("%s called while camera is not opened", __FUNCTION__);
749 return Status::OPERATION_NOT_SUPPORTED;
750 }
751 if (mDevice->ops->store_meta_data_in_buffers) {
752 status_t s = mDevice->ops->store_meta_data_in_buffers(mDevice, enable);
753 if (s == OK && enable) {
754 mMetadataMode = true;
755 }
756 return getHidlStatus(s);
757 }
758 return enable ? Status::ILLEGAL_ARGUMENT : Status::OK;
759}
760
761Return<Status> CameraDevice::startRecording() {
762 ALOGV("%s(%s)", __FUNCTION__, mCameraId.c_str());
763 Mutex::Autolock _l(mLock);
764 if (!mDevice) {
765 ALOGE("%s called while camera is not opened", __FUNCTION__);
766 return Status::OPERATION_NOT_SUPPORTED;
767 }
768 if (mDevice->ops->start_recording) {
769 return getHidlStatus(mDevice->ops->start_recording(mDevice));
770 }
771 return Status::ILLEGAL_ARGUMENT;
772}
773
774Return<void> CameraDevice::stopRecording() {
775 ALOGV("%s(%s)", __FUNCTION__, mCameraId.c_str());
776 Mutex::Autolock _l(mLock);
777 if (!mDevice) {
778 ALOGE("%s called while camera is not opened", __FUNCTION__);
779 return Void();
780 }
781 if (mDevice->ops->stop_recording) {
782 mDevice->ops->stop_recording(mDevice);
783 }
784 return Void();
785}
786
787Return<bool> CameraDevice::recordingEnabled() {
788 ALOGV("%s(%s)", __FUNCTION__, mCameraId.c_str());
789 Mutex::Autolock _l(mLock);
790 if (!mDevice) {
791 ALOGE("%s called while camera is not opened", __FUNCTION__);
792 return false;
793 }
794 if (mDevice->ops->recording_enabled) {
795 return mDevice->ops->recording_enabled(mDevice);
796 }
797 return false;
798}
799
800void CameraDevice::releaseRecordingFrameLocked(
801 uint32_t memId, uint32_t bufferIndex, const native_handle_t* handle) {
802 if (!mDevice) {
803 ALOGE("%s called while camera is not opened", __FUNCTION__);
804 return;
805 }
806 if (mDevice->ops->release_recording_frame) {
807 CameraHeapMemory* camMemory = mMemoryMap.at(memId);
808 sp<MemoryHeapBase> heap = camMemory->mHeap;
809 if (bufferIndex >= camMemory->mNumBufs) {
810 ALOGE("%s: bufferIndex %d exceeds number of buffers %d",
811 __FUNCTION__, bufferIndex, camMemory->mNumBufs);
812 return;
813 }
814 sp<IMemory> mem = camMemory->mBuffers[bufferIndex];
815 // TODO: simplify below logic once we verify offset is indeed idx * mBufSize
816 // and heap == heap2
817 ssize_t offset;
818 size_t size;
819 sp<IMemoryHeap> heap2 = mem->getMemory(&offset, &size);
820 if ((size_t)offset != bufferIndex * camMemory->mBufSize) {
821 ALOGI("%s: unexpected offset %zd (was expecting %zu)",
822 __FUNCTION__, offset, bufferIndex * camMemory->mBufSize);
823 }
824 if (heap != heap2) {
825 ALOGE("%s: heap mismatch!", __FUNCTION__);
826 return;
827 }
828 void *data = ((uint8_t *)heap->base()) + offset;
829 if (handle) {
830 VideoNativeHandleMetadata* md = (VideoNativeHandleMetadata*) data;
831 if (md->eType == VideoNativeHandleMetadata::kMetadataBufferTypeNativeHandleSource) {
832 // Input handle will be closed by HIDL transport later, so clone it
833 // HAL implementation is responsible to close/delete the clone
834 native_handle_t* clone = native_handle_clone(handle);
835 if (!clone) {
836 ALOGE("%s: failed to clone buffer %p", __FUNCTION__, handle);
837 return;
838 }
839 md->pHandle = clone;
840 } else {
841 ALOGE("%s:Malform VideoNativeHandleMetadata at memId %d, bufferId %d",
842 __FUNCTION__, memId, bufferIndex);
843 return;
844 }
845 }
846 mDevice->ops->release_recording_frame(mDevice, data);
847 }
848}
849
850Return<void> CameraDevice::releaseRecordingFrame(uint32_t memId, uint32_t bufferIndex) {
851 ALOGV("%s(%s)", __FUNCTION__, mCameraId.c_str());
852 Mutex::Autolock _l(mLock);
853 releaseRecordingFrameLocked(memId, bufferIndex, nullptr);
854 return Void();
855}
856
857Return<void> CameraDevice::releaseRecordingFrameHandle(
858 uint32_t memId, uint32_t bufferIndex, const hidl_handle& frame) {
859 ALOGV("%s(%s)", __FUNCTION__, mCameraId.c_str());
860 Mutex::Autolock _l(mLock);
861 releaseRecordingFrameLocked(
862 memId, bufferIndex, frame.getNativeHandle());
863 return Void();
864}
865
Yin-Chia Yeh1ba83a92017-03-21 17:47:02 -0700866Return<void> CameraDevice::releaseRecordingFrameHandleBatch(
867 const hidl_vec<VideoFrameMessage>& msgs) {
868 ALOGV("%s(%s)", __FUNCTION__, mCameraId.c_str());
869 Mutex::Autolock _l(mLock);
870 for (auto& msg : msgs) {
871 releaseRecordingFrameLocked(
872 msg.data, msg.bufferIndex, msg.frameData.getNativeHandle());
873 }
874 return Void();
875}
876
Yin-Chia Yeh248ed702017-01-23 17:27:26 -0800877Return<Status> CameraDevice::autoFocus() {
878 ALOGV("%s(%s)", __FUNCTION__, mCameraId.c_str());
879 Mutex::Autolock _l(mLock);
880 if (!mDevice) {
881 ALOGE("%s called while camera is not opened", __FUNCTION__);
882 return Status::OPERATION_NOT_SUPPORTED;
883 }
884 if (mDevice->ops->auto_focus) {
885 return getHidlStatus(mDevice->ops->auto_focus(mDevice));
886 }
887 return Status::ILLEGAL_ARGUMENT;
888}
889
890Return<Status> CameraDevice::cancelAutoFocus() {
891 ALOGV("%s(%s)", __FUNCTION__, mCameraId.c_str());
892 Mutex::Autolock _l(mLock);
893 if (!mDevice) {
894 ALOGE("%s called while camera is not opened", __FUNCTION__);
895 return Status::OPERATION_NOT_SUPPORTED;
896 }
897 if (mDevice->ops->cancel_auto_focus) {
898 return getHidlStatus(mDevice->ops->cancel_auto_focus(mDevice));
899 }
900 return Status::ILLEGAL_ARGUMENT;
901}
902
903Return<Status> CameraDevice::takePicture() {
904 ALOGV("%s(%s)", __FUNCTION__, mCameraId.c_str());
905 Mutex::Autolock _l(mLock);
906 if (!mDevice) {
907 ALOGE("%s called while camera is not opened", __FUNCTION__);
908 return Status::OPERATION_NOT_SUPPORTED;
909 }
910 if (mDevice->ops->take_picture) {
911 return getHidlStatus(mDevice->ops->take_picture(mDevice));
912 }
913 return Status::ILLEGAL_ARGUMENT;
914}
915
916Return<Status> CameraDevice::cancelPicture() {
917 ALOGV("%s(%s)", __FUNCTION__, mCameraId.c_str());
918 Mutex::Autolock _l(mLock);
919 if (!mDevice) {
920 ALOGE("%s called while camera is not opened", __FUNCTION__);
921 return Status::OPERATION_NOT_SUPPORTED;
922 }
923 if (mDevice->ops->cancel_picture) {
924 return getHidlStatus(mDevice->ops->cancel_picture(mDevice));
925 }
926 return Status::ILLEGAL_ARGUMENT;
927}
928
929Return<Status> CameraDevice::setParameters(const hidl_string& params) {
930 ALOGV("%s(%s)", __FUNCTION__, mCameraId.c_str());
931 Mutex::Autolock _l(mLock);
932 if (!mDevice) {
933 ALOGE("%s called while camera is not opened", __FUNCTION__);
934 return Status::OPERATION_NOT_SUPPORTED;
935 }
936 if (mDevice->ops->set_parameters) {
937 return getHidlStatus(mDevice->ops->set_parameters(mDevice, params.c_str()));
938 }
939 return Status::ILLEGAL_ARGUMENT;
940}
941
942Return<void> CameraDevice::getParameters(getParameters_cb _hidl_cb) {
943 ALOGV("%s(%s)", __FUNCTION__, mCameraId.c_str());
944 Mutex::Autolock _l(mLock);
945 hidl_string outStr;
946 if (!mDevice) {
947 ALOGE("%s called while camera is not opened", __FUNCTION__);
948 _hidl_cb(outStr);
949 return Void();
950 }
951 if (mDevice->ops->get_parameters) {
952 char *temp = mDevice->ops->get_parameters(mDevice);
953 outStr = temp;
954 if (mDevice->ops->put_parameters) {
955 mDevice->ops->put_parameters(mDevice, temp);
956 } else {
957 free(temp);
958 }
959 }
960 _hidl_cb(outStr);
961 return Void();
962}
963
964Return<Status> CameraDevice::sendCommand(CommandType cmd, int32_t arg1, int32_t arg2) {
965 ALOGV("%s(%s)", __FUNCTION__, mCameraId.c_str());
966 Mutex::Autolock _l(mLock);
967 if (!mDevice) {
968 ALOGE("%s called while camera is not opened", __FUNCTION__);
969 return Status::OPERATION_NOT_SUPPORTED;
970 }
971 if (mDevice->ops->send_command) {
972 return getHidlStatus(mDevice->ops->send_command(mDevice, (int32_t) cmd, arg1, arg2));
973 }
974 return Status::ILLEGAL_ARGUMENT;
975}
976
977Return<void> CameraDevice::close() {
978 ALOGI("Closing camera %s", mCameraId.c_str());
979 Mutex::Autolock _l(mLock);
980 if(mDevice) {
981 int rc = mDevice->common.close(&mDevice->common);
982 if (rc != OK) {
983 ALOGE("Could not close camera %s: %d", mCameraId.c_str(), rc);
984 }
985 mDevice = nullptr;
986 }
987 return Void();
988}
989
990} // namespace implementation
991} // namespace V1_0
992} // namespace device
993} // namespace camera
994} // namespace hardware
995} // namespace android