1 /* 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 CPP_EVS_MANAGER_1_1_HALCAMERA_H_ 18 #define CPP_EVS_MANAGER_1_1_HALCAMERA_H_ 19 20 #include "stats/CameraUsageStats.h" 21 22 #include <android/hardware/automotive/evs/1.1/IEvsCamera.h> 23 #include <android/hardware/automotive/evs/1.1/IEvsCameraStream.h> 24 #include <android/hardware/automotive/evs/1.1/types.h> 25 #include <utils/Mutex.h> 26 #include <utils/SystemClock.h> 27 28 #include <deque> 29 #include <list> 30 #include <thread> // NOLINT 31 #include <unordered_map> 32 33 namespace android::automotive::evs::V1_1::implementation { 34 35 class VirtualCamera; // From VirtualCamera.h 36 37 // This class wraps the actual hardware IEvsCamera objects. There is a one to many 38 // relationship between instances of this class and instances of the VirtualCamera class. 39 // This class implements the IEvsCameraStream interface so that it can receive the video 40 // stream from the hardware camera and distribute it to the associated VirtualCamera objects. 41 class HalCamera : public ::android::hardware::automotive::evs::V1_1::IEvsCameraStream { 42 public: 43 HalCamera(sp<hardware::automotive::evs::V1_1::IEvsCamera> hwCamera, std::string deviceId = "", 44 int32_t recordId = 0, hardware::camera::device::V3_2::Stream cfg = {}) : mHwCamera(hwCamera)45 mHwCamera(hwCamera), 46 mId(deviceId), 47 mStreamConfig(cfg), 48 mTimeCreatedMs(android::uptimeMillis()), 49 mUsageStats(new CameraUsageStats(recordId)) { 50 mCurrentRequests = &mFrameRequests[0]; 51 mNextRequests = &mFrameRequests[1]; 52 } 53 54 virtual ~HalCamera(); 55 56 // Factory methods for client VirtualCameras 57 sp<VirtualCamera> makeVirtualCamera(); 58 bool ownVirtualCamera(sp<VirtualCamera> virtualCamera); 59 void disownVirtualCamera(sp<VirtualCamera> virtualCamera); 60 void disownVirtualCamera(const VirtualCamera* virtualCamera); 61 62 // Implementation details getHwCamera()63 sp<hardware::automotive::evs::V1_0::IEvsCamera> getHwCamera() { return mHwCamera; } getClientCount()64 unsigned getClientCount() { return mClients.size(); } getId()65 std::string getId() { return mId; } getStreamConfig()66 hardware::camera::device::V3_2::Stream& getStreamConfig() { return mStreamConfig; } 67 bool changeFramesInFlight(int delta); 68 bool changeFramesInFlight( 69 const hardware::hidl_vec<hardware::automotive::evs::V1_1::BufferDesc>& buffers, 70 int* delta); 71 void requestNewFrame(sp<VirtualCamera> virtualCamera, const int64_t timestamp); 72 73 hardware::Return<hardware::automotive::evs::V1_0::EvsResult> clientStreamStarting(); 74 void clientStreamEnding(const VirtualCamera* client); 75 hardware::Return<void> doneWithFrame(const hardware::automotive::evs::V1_0::BufferDesc& buffer); 76 hardware::Return<void> doneWithFrame(const hardware::automotive::evs::V1_1::BufferDesc& buffer); 77 hardware::Return<hardware::automotive::evs::V1_0::EvsResult> setMaster( 78 sp<VirtualCamera> virtualCamera); 79 hardware::Return<hardware::automotive::evs::V1_0::EvsResult> forceMaster( 80 sp<VirtualCamera> virtualCamera); 81 hardware::Return<hardware::automotive::evs::V1_0::EvsResult> unsetMaster( 82 const VirtualCamera* virtualCamera); 83 hardware::Return<hardware::automotive::evs::V1_0::EvsResult> setParameter( 84 sp<VirtualCamera> virtualCamera, hardware::automotive::evs::V1_1::CameraParam id, 85 int32_t* value); 86 hardware::Return<hardware::automotive::evs::V1_0::EvsResult> getParameter( 87 hardware::automotive::evs::V1_1::CameraParam id, int32_t* value); 88 89 // Returns a snapshot of collected usage statistics 90 CameraUsageStatsRecord getStats() const; 91 92 // Returns active stream configuration 93 hardware::camera::device::V3_2::Stream getStreamConfiguration() const; 94 95 // Returns a string showing the current status 96 std::string toString(const char* indent = "") const; 97 98 // Returns a string showing current stream configuration 99 static std::string toString(hardware::camera::device::V3_2::Stream configuration, 100 const char* indent = ""); 101 102 // Methods from ::android::hardware::automotive::evs::V1_0::IEvsCameraStream follow. 103 hardware::Return<void> deliverFrame( 104 const hardware::automotive::evs::V1_0::BufferDesc& buffer) override; 105 106 // Methods from ::android::hardware::automotive::evs::V1_1::IEvsCameraStream follow. 107 hardware::Return<void> deliverFrame_1_1( 108 const hardware::hidl_vec<hardware::automotive::evs::V1_1::BufferDesc>& buffer) override; 109 hardware::Return<void> notify( 110 const hardware::automotive::evs::V1_1::EvsEventDesc& event) override; 111 112 private: 113 sp<hardware::automotive::evs::V1_1::IEvsCamera> mHwCamera; 114 std::list<wp<VirtualCamera>> mClients; // Weak pointers -> objects destruct if client dies 115 116 enum { 117 STOPPED, 118 RUNNING, 119 STOPPING, 120 } mStreamState GUARDED_BY(mFrameMutex) = STOPPED; 121 122 struct FrameRecord { 123 uint32_t frameId; 124 uint32_t refCount; FrameRecordFrameRecord125 explicit FrameRecord(uint32_t id) : frameId(id), refCount(0) {} 126 }; 127 128 std::vector<FrameRecord> mFrames; 129 wp<VirtualCamera> mPrimaryClient = nullptr; 130 std::string mId; 131 hardware::camera::device::V3_2::Stream mStreamConfig; 132 133 struct FrameRequest { 134 wp<VirtualCamera> client = nullptr; 135 int64_t timestamp = -1; 136 }; 137 138 void cancelCaptureRequestFromClientLocked(std::deque<FrameRequest>* requests, 139 const VirtualCamera* client) REQUIRES(mFrameMutex); 140 141 // synchronization 142 mutable std::mutex mFrameMutex; 143 std::deque<FrameRequest> mFrameRequests[2] GUARDED_BY(mFrameMutex); 144 std::deque<FrameRequest>* mCurrentRequests PT_GUARDED_BY(mFrameMutex); 145 std::deque<FrameRequest>* mNextRequests PT_GUARDED_BY(mFrameMutex); 146 147 // Time this object was created 148 int64_t mTimeCreatedMs; 149 150 // usage statistics to collect 151 android::sp<CameraUsageStats> mUsageStats; 152 }; 153 154 } // namespace android::automotive::evs::V1_1::implementation 155 156 #endif // CPP_EVS_MANAGER_1_1_HALCAMERA_H_ 157