| /* |
| * Copyright (C) 2017 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #ifndef ANDROID_HARDWARE_CAMERA_DEVICE_V1_0_CAMERADEVICE_H |
| #define ANDROID_HARDWARE_CAMERA_DEVICE_V1_0_CAMERADEVICE_H |
| |
| #include <unordered_map> |
| #include "utils/Mutex.h" |
| #include "utils/SortedVector.h" |
| #include "CameraModule.h" |
| #include "HandleImporter.h" |
| |
| #include <android/hardware/camera/device/1.0/ICameraDevice.h> |
| #include <android/hidl/allocator/1.0/IAllocator.h> |
| #include <android/hidl/memory/1.0/IMemory.h> |
| #include <hidl/MQDescriptor.h> |
| #include <hidl/Status.h> |
| |
| namespace android { |
| namespace hardware { |
| namespace camera { |
| namespace device { |
| namespace V1_0 { |
| namespace implementation { |
| |
| using ::android::hardware::camera::common::V1_0::CameraResourceCost; |
| using ::android::hardware::camera::common::V1_0::Status; |
| using ::android::hardware::camera::common::V1_0::TorchMode; |
| using ::android::hardware::camera::common::V1_0::helper::CameraModule; |
| using ::android::hardware::camera::common::V1_0::helper::HandleImporter; |
| using ::android::hardware::camera::device::V1_0::CameraInfo; |
| using ::android::hardware::camera::device::V1_0::CommandType; |
| using ::android::hardware::camera::device::V1_0::ICameraDevice; |
| using ::android::hardware::camera::device::V1_0::ICameraDeviceCallback; |
| using ::android::hardware::camera::device::V1_0::ICameraDevicePreviewCallback; |
| using ::android::hardware::camera::device::V1_0::MemoryId; |
| using ::android::hidl::allocator::V1_0::IAllocator; |
| using ::android::hidl::base::V1_0::IBase; |
| using ::android::hidl::memory::V1_0::IMemory; |
| using ::android::hardware::hidl_array; |
| using ::android::hardware::hidl_memory; |
| using ::android::hardware::hidl_string; |
| using ::android::hardware::hidl_vec; |
| using ::android::hardware::Return; |
| using ::android::hardware::Void; |
| using ::android::sp; |
| |
| struct CameraDevice : public ICameraDevice { |
| |
| // Called by provider HAL. Provider HAL must ensure the uniqueness of |
| // CameraDevice object per cameraId, or there could be multiple CameraDevice |
| // trying to access the same physical camera. |
| // Also, provider will have to keep track of all CameraDevice objects in |
| // order to notify CameraDevice when the underlying camera is detached |
| CameraDevice(sp<CameraModule> module, |
| const std::string& cameraId, |
| const SortedVector<std::pair<std::string, std::string>>& cameraDeviceNames); |
| ~CameraDevice(); |
| |
| // Caller must use this method to check if CameraDevice ctor failed |
| bool isInitFailed() { return mInitFail; } |
| // Used by provider HAL to signal external camera disconnected |
| void setConnectionStatus(bool connected); |
| |
| // Methods from ::android::hardware::camera::device::V1_0::ICameraDevice follow. |
| Return<void> getResourceCost(getResourceCost_cb _hidl_cb) override; |
| Return<void> getCameraInfo(getCameraInfo_cb _hidl_cb) override; |
| Return<Status> setTorchMode(TorchMode mode) override; |
| Return<Status> dumpState(const hidl_handle& fd) override; |
| Return<Status> open(const sp<ICameraDeviceCallback>& callback) override; |
| Return<Status> setPreviewWindow(const sp<ICameraDevicePreviewCallback>& window) override; |
| Return<void> enableMsgType(uint32_t msgType) override; |
| Return<void> disableMsgType(uint32_t msgType) override; |
| Return<bool> msgTypeEnabled(uint32_t msgType) override; |
| Return<Status> startPreview() override; |
| Return<void> stopPreview() override; |
| Return<bool> previewEnabled() override; |
| Return<Status> storeMetaDataInBuffers(bool enable) override; |
| Return<Status> startRecording() override; |
| Return<void> stopRecording() override; |
| Return<bool> recordingEnabled() override; |
| Return<void> releaseRecordingFrame(uint32_t memId, uint32_t bufferIndex) override; |
| Return<void> releaseRecordingFrameHandle( |
| uint32_t memId, uint32_t bufferIndex, const hidl_handle& frame) override; |
| Return<void> releaseRecordingFrameHandleBatch( |
| const hidl_vec<VideoFrameMessage>&) override; |
| Return<Status> autoFocus() override; |
| Return<Status> cancelAutoFocus() override; |
| Return<Status> takePicture() override; |
| Return<Status> cancelPicture() override; |
| Return<Status> setParameters(const hidl_string& params) override; |
| Return<void> getParameters(getParameters_cb _hidl_cb) override; |
| Return<Status> sendCommand(CommandType cmd, int32_t arg1, int32_t arg2) override; |
| Return<void> close() override; |
| |
| private: |
| struct CameraMemory : public camera_memory_t { |
| MemoryId mId; |
| CameraDevice* mDevice; |
| }; |
| |
| class CameraHeapMemory : public RefBase { |
| public: |
| CameraHeapMemory(int fd, size_t buf_size, uint_t num_buffers = 1); |
| explicit CameraHeapMemory( |
| sp<IAllocator> ashmemAllocator, size_t buf_size, uint_t num_buffers = 1); |
| void commonInitialization(); |
| virtual ~CameraHeapMemory(); |
| |
| size_t mBufSize; |
| uint_t mNumBufs; |
| |
| // Shared memory related members |
| hidl_memory mHidlHeap; |
| native_handle_t* mHidlHandle; // contains one shared memory FD |
| void* mHidlHeapMemData; |
| sp<IMemory> mHidlHeapMemory; // munmap happens in ~IMemory() |
| |
| CameraMemory handle; |
| }; |
| sp<IAllocator> mAshmemAllocator; |
| |
| const sp<CameraModule> mModule; |
| const std::string mCameraId; |
| // const after ctor |
| int mCameraIdInt; |
| int mDeviceVersion; |
| |
| camera_device_t* mDevice = nullptr; |
| |
| void initHalPreviewWindow(); |
| struct CameraPreviewWindow : public preview_stream_ops { |
| // Called when we expect buffer will be re-allocated |
| void cleanUpCirculatingBuffers(); |
| |
| Mutex mLock; |
| sp<ICameraDevicePreviewCallback> mPreviewCallback = nullptr; |
| std::unordered_map<uint64_t, buffer_handle_t> mCirculatingBuffers; |
| std::unordered_map<buffer_handle_t*, uint64_t> mBufferIdMap; |
| } mHalPreviewWindow; |
| |
| // gating access to mDevice, mInitFail, mDisconnected |
| mutable Mutex mLock; |
| |
| bool mInitFail = false; |
| // Set by provider (when external camera is connected/disconnected) |
| bool mDisconnected; |
| |
| static HandleImporter sHandleImporter; |
| |
| const SortedVector<std::pair<std::string, std::string>>& mCameraDeviceNames; |
| |
| sp<ICameraDeviceCallback> mDeviceCallback = nullptr; |
| |
| mutable Mutex mMemoryMapLock; // gating access to mMemoryMap |
| // must not hold mLock after this lock is acquired |
| std::unordered_map<MemoryId, CameraHeapMemory*> mMemoryMap; |
| |
| bool mMetadataMode = false; |
| |
| mutable Mutex mBatchLock; |
| // Start of protection scope for mBatchLock |
| uint32_t mBatchSize = 0; // 0 for non-batch mode, set to other value to start batching |
| int32_t mBatchMsgType; // Maybe only allow DataCallbackMsg::VIDEO_FRAME? |
| std::vector<HandleTimestampMessage> mInflightBatch; |
| // End of protection scope for mBatchLock |
| |
| void handleCallbackTimestamp( |
| nsecs_t timestamp, int32_t msg_type, |
| MemoryId memId , unsigned index, native_handle_t* handle); |
| void releaseRecordingFrameLocked(uint32_t memId, uint32_t bufferIndex, const native_handle_t*); |
| |
| // shared memory methods |
| static camera_memory_t* sGetMemory(int fd, size_t buf_size, uint_t num_bufs, void *user); |
| static void sPutMemory(camera_memory_t *data); |
| |
| // Device callback forwarding methods |
| static void sNotifyCb(int32_t msg_type, int32_t ext1, int32_t ext2, void *user); |
| static void sDataCb(int32_t msg_type, const camera_memory_t *data, unsigned int index, |
| camera_frame_metadata_t *metadata, void *user); |
| static void sDataCbTimestamp(nsecs_t timestamp, int32_t msg_type, |
| const camera_memory_t *data, unsigned index, void *user); |
| |
| // Preview window callback forwarding methods |
| static int sDequeueBuffer(struct preview_stream_ops* w, |
| buffer_handle_t** buffer, int *stride); |
| |
| static int sLockBuffer(struct preview_stream_ops* w, buffer_handle_t* buffer); |
| |
| static int sEnqueueBuffer(struct preview_stream_ops* w, buffer_handle_t* buffer); |
| |
| static int sCancelBuffer(struct preview_stream_ops* w, buffer_handle_t* buffer); |
| |
| static int sSetBufferCount(struct preview_stream_ops* w, int count); |
| |
| static int sSetBuffersGeometry(struct preview_stream_ops* w, |
| int width, int height, int format); |
| |
| static int sSetCrop(struct preview_stream_ops *w, int left, int top, int right, int bottom); |
| |
| static int sSetTimestamp(struct preview_stream_ops *w, int64_t timestamp); |
| |
| static int sSetUsage(struct preview_stream_ops* w, int usage); |
| |
| static int sSetSwapInterval(struct preview_stream_ops *w, int interval); |
| |
| static int sGetMinUndequeuedBufferCount(const struct preview_stream_ops *w, int *count); |
| |
| // convert conventional HAL status to HIDL Status |
| static Status getHidlStatus(const int&); |
| static status_t getStatusT(const Status& s); |
| |
| Status initStatus() const; |
| void closeLocked(); |
| }; |
| |
| } // namespace implementation |
| } // namespace V1_0 |
| } // namespace device |
| } // namespace camera |
| } // namespace hardware |
| } // namespace android |
| |
| #endif // ANDROID_HARDWARE_CAMERA_DEVICE_V1_0_CAMERADEVICE_H |