/* * Copyright (C) 2019 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 CPP_EVS_MANAGER_1_1_VIRTUALCAMERA_H_ #define CPP_EVS_MANAGER_1_1_VIRTUALCAMERA_H_ #include #include #include #include #include #include #include #include // NOLINT #include namespace android::automotive::evs::V1_1::implementation { class HalCamera; // From HalCamera.h // This class represents an EVS camera to the client application. As such it presents // the IEvsCamera interface, and also proxies the frame delivery to the client's // IEvsCameraStream object. class VirtualCamera : public hardware::automotive::evs::V1_1::IEvsCamera { public: explicit VirtualCamera(const std::vector>& halCameras); virtual ~VirtualCamera(); unsigned getAllowedBuffers() { return mFramesAllowed; } bool isStreaming() { return mStreamState == RUNNING; } bool getVersion() const { return static_cast(mStream_1_1 != nullptr); } std::vector> getHalCameras(); void setDescriptor(hardware::automotive::evs::V1_1::CameraDesc* desc) { mDesc = desc; } // Proxy to receive frames and forward them to the client's stream bool notify(const hardware::automotive::evs::V1_1::EvsEventDesc& event); bool deliverFrame(const hardware::automotive::evs::V1_1::BufferDesc& bufDesc); // Methods from hardware::automotive::evs::V1_0::IEvsCamera follow. hardware::Return getCameraInfo(getCameraInfo_cb _hidl_cb) override; hardware::Return setMaxFramesInFlight( uint32_t bufferCount) override; hardware::Return startVideoStream( const ::android::sp& stream) override; hardware::Return doneWithFrame( const hardware::automotive::evs::V1_0::BufferDesc& buffer) override; hardware::Return stopVideoStream() override; hardware::Return getExtendedInfo(uint32_t opaqueIdentifier) override; hardware::Return setExtendedInfo( uint32_t opaqueIdentifier, int32_t opaqueValue) override; // Methods from hardware::automotive::evs::V1_1::IEvsCamera follow. hardware::Return getCameraInfo_1_1(getCameraInfo_1_1_cb _hidl_cb) override; hardware::Return getPhysicalCameraInfo(const hardware::hidl_string& deviceId, getPhysicalCameraInfo_cb _hidl_cb) override; hardware::Return doneWithFrame_1_1( const hardware::hidl_vec& buffer) override; hardware::Return pauseVideoStream() override { return hardware::automotive::evs::V1_0::EvsResult::UNDERLYING_SERVICE_ERROR; } hardware::Return resumeVideoStream() override { return hardware::automotive::evs::V1_0::EvsResult::UNDERLYING_SERVICE_ERROR; } hardware::Return setMaster() override; hardware::Return forceMaster( const sp& display) override; hardware::Return unsetMaster() override; hardware::Return getParameterList(getParameterList_cb _hidl_cb) override; hardware::Return getIntParameterRange(hardware::automotive::evs::V1_1::CameraParam id, getIntParameterRange_cb _hidl_cb) override; hardware::Return setIntParameter(hardware::automotive::evs::V1_1::CameraParam id, int32_t value, setIntParameter_cb _hidl_cb) override; hardware::Return getIntParameter(hardware::automotive::evs::V1_1::CameraParam id, getIntParameter_cb _hidl_cb) override; hardware::Return setExtendedInfo_1_1( uint32_t opaqueIdentifier, const hardware::hidl_vec& opaqueValue) override; hardware::Return getExtendedInfo_1_1(uint32_t opaqueIdentifier, getExtendedInfo_1_1_cb _hidl_cb) override; hardware::Return importExternalBuffers( const hardware::hidl_vec& buffers, importExternalBuffers_cb _hidl_cb) override; // Dump current status to a given file descriptor std::string toString(const char* indent = "") const; private: void shutdown(); // The low level camera interface that backs this proxy std::unordered_map> mHalCamera; sp mStream; sp mStream_1_1; unsigned mFramesAllowed = 1; enum { STOPPED, RUNNING, STOPPING, } mStreamState; std::unordered_map> mFramesHeld; std::thread mCaptureThread; hardware::automotive::evs::V1_1::CameraDesc* mDesc; mutable std::mutex mFrameDeliveryMutex; std::condition_variable mFramesReadySignal; std::set mSourceCameras GUARDED_BY(mFrameDeliveryMutex); }; } // namespace android::automotive::evs::V1_1::implementation #endif // CPP_EVS_MANAGER_1_1_VIRTUALCAMERA_H_