blob: 2f707ff99ebf4dbd7a39c9419d50b43b7bc475d4 [file] [log] [blame]
Changyeon Joc7deb562019-07-23 10:40:04 -07001/*
2 * Copyright (C) 2019 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#ifndef ANDROID_AUTOMOTIVE_EVS_V1_1_HALCAMERA_H
18#define ANDROID_AUTOMOTIVE_EVS_V1_1_HALCAMERA_H
19
Changyeon Joce08ba82020-05-06 16:25:21 -070020#include "stats/CameraUsageStats.h"
Changyeon Joc7deb562019-07-23 10:40:04 -070021
Changyeon Jo03c97d02019-12-01 14:37:12 -080022#include <deque>
Changyeon Jo78457812020-04-22 14:18:38 -070023#include <list>
24#include <thread>
Changyeon Jo03c97d02019-12-01 14:37:12 -080025#include <unordered_map>
Changyeon Joc7deb562019-07-23 10:40:04 -070026
Changyeon Joce08ba82020-05-06 16:25:21 -070027#include <android/hardware/automotive/evs/1.1/types.h>
28#include <android/hardware/automotive/evs/1.1/IEvsCamera.h>
29#include <android/hardware/automotive/evs/1.1/IEvsCameraStream.h>
30#include <utils/Mutex.h>
31#include <utils/SystemClock.h>
Changyeon Joc7deb562019-07-23 10:40:04 -070032
33using namespace ::android::hardware::automotive::evs::V1_1;
Changyeon Jo03c97d02019-12-01 14:37:12 -080034using ::android::hardware::camera::device::V3_2::Stream;
Changyeon Joc7deb562019-07-23 10:40:04 -070035using ::android::hardware::Return;
36using ::android::hardware::hidl_handle;
37using ::android::hardware::automotive::evs::V1_0::EvsResult;
38using IEvsCamera_1_0 = ::android::hardware::automotive::evs::V1_0::IEvsCamera;
39using IEvsCamera_1_1 = ::android::hardware::automotive::evs::V1_1::IEvsCamera;
40using BufferDesc_1_0 = ::android::hardware::automotive::evs::V1_0::BufferDesc;
41using BufferDesc_1_1 = ::android::hardware::automotive::evs::V1_1::BufferDesc;
42using IEvsCameraStream_1_0 = ::android::hardware::automotive::evs::V1_0::IEvsCameraStream;
43using IEvsCameraStream_1_1 = ::android::hardware::automotive::evs::V1_1::IEvsCameraStream;
44
45namespace android {
46namespace automotive {
47namespace evs {
48namespace V1_1 {
49namespace implementation {
50
51
52class VirtualCamera; // From VirtualCamera.h
53
54
55// This class wraps the actual hardware IEvsCamera objects. There is a one to many
56// relationship between instances of this class and instances of the VirtualCamera class.
57// This class implements the IEvsCameraStream interface so that it can receive the video
58// stream from the hardware camera and distribute it to the associated VirtualCamera objects.
59class HalCamera : public IEvsCameraStream_1_1 {
60public:
Changyeon Jo6bbd9a12020-05-08 17:26:43 -070061 HalCamera(sp<IEvsCamera_1_1> hwCamera,
62 std::string deviceId = "",
63 int32_t recordId = 0,
64 Stream cfg = {})
Changyeon Job927b882019-11-21 10:16:33 -080065 : mHwCamera(hwCamera),
Changyeon Jo03c97d02019-12-01 14:37:12 -080066 mId(deviceId),
Changyeon Job4dcddc2020-03-10 20:19:13 -070067 mStreamConfig(cfg),
Changyeon Joce08ba82020-05-06 16:25:21 -070068 mTimeCreatedMs(android::uptimeMillis()),
Changyeon Jo6bbd9a12020-05-08 17:26:43 -070069 mUsageStats(new CameraUsageStats(recordId)) {
Changyeon Jo03c97d02019-12-01 14:37:12 -080070 mCurrentRequests = &mFrameRequests[0];
71 mNextRequests = &mFrameRequests[1];
72 }
Changyeon Joc7deb562019-07-23 10:40:04 -070073
Changyeon Jo6bbd9a12020-05-08 17:26:43 -070074 virtual ~HalCamera();
75
Changyeon Joc7deb562019-07-23 10:40:04 -070076 // Factory methods for client VirtualCameras
77 sp<VirtualCamera> makeVirtualCamera();
Changyeon Jo03c97d02019-12-01 14:37:12 -080078 bool ownVirtualCamera(sp<VirtualCamera> virtualCamera);
Changyeon Joc7deb562019-07-23 10:40:04 -070079 void disownVirtualCamera(sp<VirtualCamera> virtualCamera);
80
81 // Implementation details
82 sp<IEvsCamera_1_0> getHwCamera() { return mHwCamera; };
83 unsigned getClientCount() { return mClients.size(); };
Changyeon Jo03c97d02019-12-01 14:37:12 -080084 std::string getId() { return mId; }
85 Stream& getStreamConfig() { return mStreamConfig; }
Changyeon Joc7deb562019-07-23 10:40:04 -070086 bool changeFramesInFlight(int delta);
Changyeon Jo6e90a3b2020-03-29 07:50:53 -070087 bool changeFramesInFlight(const hardware::hidl_vec<BufferDesc_1_1>& buffers,
88 int* delta);
Changyeon Job1844d42020-12-08 18:36:00 -080089 void requestNewFrame(sp<VirtualCamera> virtualCamera,
Changyeon Jo03c97d02019-12-01 14:37:12 -080090 const int64_t timestamp);
Changyeon Joc7deb562019-07-23 10:40:04 -070091
92 Return<EvsResult> clientStreamStarting();
Changyeon Jod24fcb22020-06-09 13:40:31 -070093 void clientStreamEnding(const VirtualCamera* client);
Changyeon Joc7deb562019-07-23 10:40:04 -070094 Return<void> doneWithFrame(const BufferDesc_1_0& buffer);
95 Return<void> doneWithFrame(const BufferDesc_1_1& buffer);
Changyeon Jo330d1c22019-07-30 11:58:41 -070096 Return<EvsResult> setMaster(sp<VirtualCamera> virtualCamera);
Changyeon Jo2c819132019-08-17 21:35:54 -070097 Return<EvsResult> forceMaster(sp<VirtualCamera> virtualCamera);
Changyeon Jo330d1c22019-07-30 11:58:41 -070098 Return<EvsResult> unsetMaster(sp<VirtualCamera> virtualCamera);
99 Return<EvsResult> setParameter(sp<VirtualCamera> virtualCamera,
100 CameraParam id, int32_t& value);
101 Return<EvsResult> getParameter(CameraParam id, int32_t& value);
Changyeon Joc7deb562019-07-23 10:40:04 -0700102
Changyeon Joce08ba82020-05-06 16:25:21 -0700103 // Returns a snapshot of collected usage statistics
104 CameraUsageStatsRecord getStats() const;
105
106 // Returns active stream configuration
107 Stream getStreamConfiguration() const;
108
109 // Returns a string showing the current status
110 std::string toString(const char* indent = "") const;
111
112 // Returns a string showing current stream configuration
113 static std::string toString(Stream configuration, const char* indent = "");
Changyeon Jo298faca2020-04-02 12:44:44 -0700114
Changyeon Joaab96aa2019-10-12 05:24:15 -0700115 // Methods from ::android::hardware::automotive::evs::V1_0::IEvsCameraStream follow.
Changyeon Jofbf72792019-10-12 05:21:00 -0700116 Return<void> deliverFrame(const BufferDesc_1_0& buffer) override;
Changyeon Joaab96aa2019-10-12 05:24:15 -0700117
118 // Methods from ::android::hardware::automotive::evs::V1_1::IEvsCameraStream follow.
Changyeon Jo4ede4d62019-10-22 10:10:15 -0700119 Return<void> deliverFrame_1_1(const hardware::hidl_vec<BufferDesc_1_1>& buffer) override;
120 Return<void> notify(const EvsEventDesc& event) override;
Changyeon Joc7deb562019-07-23 10:40:04 -0700121
122private:
123 sp<IEvsCamera_1_1> mHwCamera;
124 std::list<wp<VirtualCamera>> mClients; // Weak pointers -> objects destruct if client dies
125
126 enum {
127 STOPPED,
128 RUNNING,
129 STOPPING,
130 } mStreamState = STOPPED;
131
132 struct FrameRecord {
133 uint32_t frameId;
134 uint32_t refCount;
135 FrameRecord(uint32_t id) : frameId(id), refCount(0) {};
136 };
137 std::vector<FrameRecord> mFrames;
Changyeon Jo330d1c22019-07-30 11:58:41 -0700138 wp<VirtualCamera> mMaster = nullptr;
Changyeon Jo03c97d02019-12-01 14:37:12 -0800139 std::string mId;
140 Stream mStreamConfig;
141
142 struct FrameRequest {
143 wp<VirtualCamera> client = nullptr;
144 int64_t timestamp = -1;
145 };
Changyeon Job927b882019-11-21 10:16:33 -0800146
147 // synchronization
Changyeon Jo298faca2020-04-02 12:44:44 -0700148 mutable std::mutex mFrameMutex;
Changyeon Jo03c97d02019-12-01 14:37:12 -0800149 std::deque<FrameRequest> mFrameRequests[2] GUARDED_BY(mFrameMutex);
150 std::deque<FrameRequest>* mCurrentRequests PT_GUARDED_BY(mFrameMutex);
151 std::deque<FrameRequest>* mNextRequests PT_GUARDED_BY(mFrameMutex);
Changyeon Jo298faca2020-04-02 12:44:44 -0700152
Changyeon Joce08ba82020-05-06 16:25:21 -0700153 // Time this object was created
154 int64_t mTimeCreatedMs;
155
156 // usage statistics to collect
157 android::sp<CameraUsageStats> mUsageStats;
Changyeon Joc7deb562019-07-23 10:40:04 -0700158};
159
160} // namespace implementation
161} // namespace V1_1
162} // namespace evs
163} // namespace automotive
164} // namespace android
165
166#endif // ANDROID_AUTOMOTIVE_EVS_V1_1_HALCAMERA_H