1*4d7e907cSAndroid Build Coastguard Worker /* 2*4d7e907cSAndroid Build Coastguard Worker * Copyright (C) 2019 The Android Open Source Project 3*4d7e907cSAndroid Build Coastguard Worker * 4*4d7e907cSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*4d7e907cSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*4d7e907cSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*4d7e907cSAndroid Build Coastguard Worker * 8*4d7e907cSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*4d7e907cSAndroid Build Coastguard Worker * 10*4d7e907cSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*4d7e907cSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*4d7e907cSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*4d7e907cSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*4d7e907cSAndroid Build Coastguard Worker * limitations under the License. 15*4d7e907cSAndroid Build Coastguard Worker */ 16*4d7e907cSAndroid Build Coastguard Worker 17*4d7e907cSAndroid Build Coastguard Worker #ifndef ANDROID_HARDWARE_AUTOMOTIVE_EVS_V1_1_EVSCAMERA_H 18*4d7e907cSAndroid Build Coastguard Worker #define ANDROID_HARDWARE_AUTOMOTIVE_EVS_V1_1_EVSCAMERA_H 19*4d7e907cSAndroid Build Coastguard Worker 20*4d7e907cSAndroid Build Coastguard Worker #include "ConfigManager.h" 21*4d7e907cSAndroid Build Coastguard Worker 22*4d7e907cSAndroid Build Coastguard Worker #include <android/hardware/automotive/evs/1.1/IEvsCamera.h> 23*4d7e907cSAndroid Build Coastguard Worker #include <android/hardware/automotive/evs/1.1/IEvsCameraStream.h> 24*4d7e907cSAndroid Build Coastguard Worker #include <android/hardware/automotive/evs/1.1/IEvsDisplay.h> 25*4d7e907cSAndroid Build Coastguard Worker #include <android/hardware/automotive/evs/1.1/types.h> 26*4d7e907cSAndroid Build Coastguard Worker #include <ui/GraphicBuffer.h> 27*4d7e907cSAndroid Build Coastguard Worker 28*4d7e907cSAndroid Build Coastguard Worker #include <thread> 29*4d7e907cSAndroid Build Coastguard Worker 30*4d7e907cSAndroid Build Coastguard Worker namespace android::hardware::automotive::evs::V1_1::implementation { 31*4d7e907cSAndroid Build Coastguard Worker 32*4d7e907cSAndroid Build Coastguard Worker // From EvsEnumerator.h 33*4d7e907cSAndroid Build Coastguard Worker class EvsEnumerator; 34*4d7e907cSAndroid Build Coastguard Worker 35*4d7e907cSAndroid Build Coastguard Worker class EvsCamera : public IEvsCamera { 36*4d7e907cSAndroid Build Coastguard Worker public: 37*4d7e907cSAndroid Build Coastguard Worker // Methods from ::android::hardware::automotive::evs::V1_0::IEvsCamera follow. 38*4d7e907cSAndroid Build Coastguard Worker Return<void> getCameraInfo(getCameraInfo_cb _hidl_cb) override; 39*4d7e907cSAndroid Build Coastguard Worker Return<V1_0::EvsResult> setMaxFramesInFlight(uint32_t bufferCount) override; 40*4d7e907cSAndroid Build Coastguard Worker Return<V1_0::EvsResult> startVideoStream(const sp<V1_0::IEvsCameraStream>& stream) override; 41*4d7e907cSAndroid Build Coastguard Worker Return<void> stopVideoStream() override; 42*4d7e907cSAndroid Build Coastguard Worker Return<void> doneWithFrame(const V1_0::BufferDesc& buffer) override; 43*4d7e907cSAndroid Build Coastguard Worker 44*4d7e907cSAndroid Build Coastguard Worker Return<int32_t> getExtendedInfo(uint32_t opaqueIdentifier) override; 45*4d7e907cSAndroid Build Coastguard Worker Return<V1_0::EvsResult> setExtendedInfo(uint32_t opaqueIdentifier, 46*4d7e907cSAndroid Build Coastguard Worker int32_t opaqueValue) override; 47*4d7e907cSAndroid Build Coastguard Worker 48*4d7e907cSAndroid Build Coastguard Worker // Methods from ::android::hardware::automotive::evs::V1_1::IEvsCamera follow. 49*4d7e907cSAndroid Build Coastguard Worker Return<void> getCameraInfo_1_1(getCameraInfo_1_1_cb _hidl_cb) override; 50*4d7e907cSAndroid Build Coastguard Worker Return<void> getPhysicalCameraInfo(const hidl_string& id, 51*4d7e907cSAndroid Build Coastguard Worker getPhysicalCameraInfo_cb _hidl_cb) override; 52*4d7e907cSAndroid Build Coastguard Worker Return<V1_0::EvsResult> pauseVideoStream() override; 53*4d7e907cSAndroid Build Coastguard Worker Return<V1_0::EvsResult> resumeVideoStream() override; 54*4d7e907cSAndroid Build Coastguard Worker Return<V1_0::EvsResult> doneWithFrame_1_1(const hidl_vec<BufferDesc>& buffer) override; 55*4d7e907cSAndroid Build Coastguard Worker Return<V1_0::EvsResult> setMaster() override; 56*4d7e907cSAndroid Build Coastguard Worker Return<V1_0::EvsResult> forceMaster(const sp<V1_0::IEvsDisplay>& display) override; 57*4d7e907cSAndroid Build Coastguard Worker Return<V1_0::EvsResult> unsetMaster() override; 58*4d7e907cSAndroid Build Coastguard Worker Return<void> getParameterList(getParameterList_cb _hidl_cb) override; 59*4d7e907cSAndroid Build Coastguard Worker Return<void> getIntParameterRange(CameraParam id, getIntParameterRange_cb _hidl_cb) override; 60*4d7e907cSAndroid Build Coastguard Worker Return<void> setIntParameter(CameraParam id, int32_t value, 61*4d7e907cSAndroid Build Coastguard Worker setIntParameter_cb _hidl_cb) override; 62*4d7e907cSAndroid Build Coastguard Worker Return<void> getIntParameter(CameraParam id, getIntParameter_cb _hidl_cb) override; 63*4d7e907cSAndroid Build Coastguard Worker Return<V1_0::EvsResult> setExtendedInfo_1_1(uint32_t opaqueIdentifier, 64*4d7e907cSAndroid Build Coastguard Worker const hidl_vec<uint8_t>& opaqueValue) override; 65*4d7e907cSAndroid Build Coastguard Worker Return<void> getExtendedInfo_1_1(uint32_t opaqueIdentifier, 66*4d7e907cSAndroid Build Coastguard Worker getExtendedInfo_1_1_cb _hidl_cb) override; 67*4d7e907cSAndroid Build Coastguard Worker Return<void> importExternalBuffers(const hidl_vec<BufferDesc>& buffers, 68*4d7e907cSAndroid Build Coastguard Worker importExternalBuffers_cb _hidl_cb) override; 69*4d7e907cSAndroid Build Coastguard Worker 70*4d7e907cSAndroid Build Coastguard Worker static sp<EvsCamera> Create(const char* deviceName); 71*4d7e907cSAndroid Build Coastguard Worker static sp<EvsCamera> Create(const char* deviceName, 72*4d7e907cSAndroid Build Coastguard Worker std::unique_ptr<ConfigManager::CameraInfo>& camInfo, 73*4d7e907cSAndroid Build Coastguard Worker const Stream* streamCfg = nullptr); 74*4d7e907cSAndroid Build Coastguard Worker EvsCamera(const EvsCamera&) = delete; 75*4d7e907cSAndroid Build Coastguard Worker EvsCamera& operator=(const EvsCamera&) = delete; 76*4d7e907cSAndroid Build Coastguard Worker 77*4d7e907cSAndroid Build Coastguard Worker virtual ~EvsCamera() override; 78*4d7e907cSAndroid Build Coastguard Worker void forceShutdown(); // This gets called if another caller "steals" ownership of the camera 79*4d7e907cSAndroid Build Coastguard Worker getDesc()80*4d7e907cSAndroid Build Coastguard Worker const CameraDesc& getDesc() { return mDescription; }; 81*4d7e907cSAndroid Build Coastguard Worker 82*4d7e907cSAndroid Build Coastguard Worker private: 83*4d7e907cSAndroid Build Coastguard Worker EvsCamera(const char* id, std::unique_ptr<ConfigManager::CameraInfo>& camInfo); 84*4d7e907cSAndroid Build Coastguard Worker // These three functions are expected to be called while mAccessLock is held 85*4d7e907cSAndroid Build Coastguard Worker // 86*4d7e907cSAndroid Build Coastguard Worker bool setAvailableFrames_Locked(unsigned bufferCount); 87*4d7e907cSAndroid Build Coastguard Worker unsigned increaseAvailableFrames_Locked(unsigned numToAdd); 88*4d7e907cSAndroid Build Coastguard Worker unsigned decreaseAvailableFrames_Locked(unsigned numToRemove); 89*4d7e907cSAndroid Build Coastguard Worker 90*4d7e907cSAndroid Build Coastguard Worker void generateFrames(); 91*4d7e907cSAndroid Build Coastguard Worker void fillTestFrame(const V1_0::BufferDesc& buff); 92*4d7e907cSAndroid Build Coastguard Worker void fillTestFrame(const BufferDesc& buff); 93*4d7e907cSAndroid Build Coastguard Worker void returnBufferLocked(const uint32_t bufferId, const buffer_handle_t memHandle); 94*4d7e907cSAndroid Build Coastguard Worker 95*4d7e907cSAndroid Build Coastguard Worker sp<EvsEnumerator> mEnumerator; // The enumerator object that created this camera 96*4d7e907cSAndroid Build Coastguard Worker 97*4d7e907cSAndroid Build Coastguard Worker CameraDesc mDescription = {}; // The properties of this camera 98*4d7e907cSAndroid Build Coastguard Worker 99*4d7e907cSAndroid Build Coastguard Worker std::thread mCaptureThread; // The thread we'll use to synthesize frames 100*4d7e907cSAndroid Build Coastguard Worker 101*4d7e907cSAndroid Build Coastguard Worker uint32_t mWidth = 0; // Horizontal pixel count in the buffers 102*4d7e907cSAndroid Build Coastguard Worker uint32_t mHeight = 0; // Vertical pixel count in the buffers 103*4d7e907cSAndroid Build Coastguard Worker uint32_t mFormat = 0; // Values from android_pixel_format_t 104*4d7e907cSAndroid Build Coastguard Worker uint64_t mUsage = 0; // Values from from Gralloc.h 105*4d7e907cSAndroid Build Coastguard Worker uint32_t mStride = 0; // Bytes per line in the buffers 106*4d7e907cSAndroid Build Coastguard Worker 107*4d7e907cSAndroid Build Coastguard Worker sp<IEvsCameraStream> mStream = nullptr; // The callback used to deliver each frame 108*4d7e907cSAndroid Build Coastguard Worker 109*4d7e907cSAndroid Build Coastguard Worker struct BufferRecord { 110*4d7e907cSAndroid Build Coastguard Worker buffer_handle_t handle; 111*4d7e907cSAndroid Build Coastguard Worker bool inUse; 112*4d7e907cSAndroid Build Coastguard Worker BufferRecordBufferRecord113*4d7e907cSAndroid Build Coastguard Worker explicit BufferRecord(buffer_handle_t h) : handle(h), inUse(false){}; 114*4d7e907cSAndroid Build Coastguard Worker }; 115*4d7e907cSAndroid Build Coastguard Worker 116*4d7e907cSAndroid Build Coastguard Worker std::vector<BufferRecord> mBuffers; // Graphics buffers to transfer images 117*4d7e907cSAndroid Build Coastguard Worker unsigned mFramesAllowed; // How many buffers are we currently using 118*4d7e907cSAndroid Build Coastguard Worker unsigned mFramesInUse; // How many buffers are currently outstanding 119*4d7e907cSAndroid Build Coastguard Worker 120*4d7e907cSAndroid Build Coastguard Worker enum StreamStateValues { 121*4d7e907cSAndroid Build Coastguard Worker STOPPED, 122*4d7e907cSAndroid Build Coastguard Worker RUNNING, 123*4d7e907cSAndroid Build Coastguard Worker STOPPING, 124*4d7e907cSAndroid Build Coastguard Worker DEAD, 125*4d7e907cSAndroid Build Coastguard Worker }; 126*4d7e907cSAndroid Build Coastguard Worker StreamStateValues mStreamState; 127*4d7e907cSAndroid Build Coastguard Worker 128*4d7e907cSAndroid Build Coastguard Worker // Synchronization necessary to deconflict mCaptureThread from the main service thread 129*4d7e907cSAndroid Build Coastguard Worker std::mutex mAccessLock; 130*4d7e907cSAndroid Build Coastguard Worker 131*4d7e907cSAndroid Build Coastguard Worker // Static camera module information 132*4d7e907cSAndroid Build Coastguard Worker std::unique_ptr<ConfigManager::CameraInfo>& mCameraInfo; 133*4d7e907cSAndroid Build Coastguard Worker 134*4d7e907cSAndroid Build Coastguard Worker // For the extended info 135*4d7e907cSAndroid Build Coastguard Worker std::unordered_map<uint32_t, hidl_vec<uint8_t>> mExtInfo; 136*4d7e907cSAndroid Build Coastguard Worker std::unordered_map<CameraParam, int32_t> mParams; 137*4d7e907cSAndroid Build Coastguard Worker }; 138*4d7e907cSAndroid Build Coastguard Worker 139*4d7e907cSAndroid Build Coastguard Worker } // namespace android::hardware::automotive::evs::V1_1::implementation 140*4d7e907cSAndroid Build Coastguard Worker 141*4d7e907cSAndroid Build Coastguard Worker #endif // ANDROID_HARDWARE_AUTOMOTIVE_EVS_V1_1_EVSCAMERA_H 142