liyujie
2025-08-28 867b8b7b729282c7e14e200ca277435329ebe747
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
/*
 * 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