1*ec779b8eSAndroid Build Coastguard Worker /* 2*ec779b8eSAndroid Build Coastguard Worker * Copyright (C) 2023 The Android Open Source Project 3*ec779b8eSAndroid Build Coastguard Worker * 4*ec779b8eSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*ec779b8eSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*ec779b8eSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*ec779b8eSAndroid Build Coastguard Worker * 8*ec779b8eSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*ec779b8eSAndroid Build Coastguard Worker * 10*ec779b8eSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*ec779b8eSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*ec779b8eSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*ec779b8eSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*ec779b8eSAndroid Build Coastguard Worker * limitations under the License. 15*ec779b8eSAndroid Build Coastguard Worker */ 16*ec779b8eSAndroid Build Coastguard Worker 17*ec779b8eSAndroid Build Coastguard Worker #ifndef ANDROID_COMPANION_VIRTUALCAMERA_VIRTUALCAMERASESSION_H 18*ec779b8eSAndroid Build Coastguard Worker #define ANDROID_COMPANION_VIRTUALCAMERA_VIRTUALCAMERASESSION_H 19*ec779b8eSAndroid Build Coastguard Worker 20*ec779b8eSAndroid Build Coastguard Worker #include <atomic> 21*ec779b8eSAndroid Build Coastguard Worker #include <memory> 22*ec779b8eSAndroid Build Coastguard Worker #include <set> 23*ec779b8eSAndroid Build Coastguard Worker 24*ec779b8eSAndroid Build Coastguard Worker #include "VirtualCameraRenderThread.h" 25*ec779b8eSAndroid Build Coastguard Worker #include "VirtualCameraSessionContext.h" 26*ec779b8eSAndroid Build Coastguard Worker #include "aidl/android/companion/virtualcamera/IVirtualCameraCallback.h" 27*ec779b8eSAndroid Build Coastguard Worker #include "aidl/android/hardware/camera/device/BnCameraDeviceSession.h" 28*ec779b8eSAndroid Build Coastguard Worker #include "aidl/android/hardware/camera/device/CameraMetadata.h" 29*ec779b8eSAndroid Build Coastguard Worker #include "aidl/android/hardware/camera/device/ICameraDeviceCallback.h" 30*ec779b8eSAndroid Build Coastguard Worker #include "utils/Mutex.h" 31*ec779b8eSAndroid Build Coastguard Worker 32*ec779b8eSAndroid Build Coastguard Worker namespace android { 33*ec779b8eSAndroid Build Coastguard Worker 34*ec779b8eSAndroid Build Coastguard Worker template <typename T, typename U> 35*ec779b8eSAndroid Build Coastguard Worker struct AidlMessageQueue; 36*ec779b8eSAndroid Build Coastguard Worker namespace companion { 37*ec779b8eSAndroid Build Coastguard Worker namespace virtualcamera { 38*ec779b8eSAndroid Build Coastguard Worker 39*ec779b8eSAndroid Build Coastguard Worker class VirtualCameraDevice; 40*ec779b8eSAndroid Build Coastguard Worker 41*ec779b8eSAndroid Build Coastguard Worker // Implementation of ICameraDeviceSession AIDL interface to allow camera 42*ec779b8eSAndroid Build Coastguard Worker // framework to read image data from open virtual camera device. This class 43*ec779b8eSAndroid Build Coastguard Worker // encapsulates possibly several image streams for the same session. 44*ec779b8eSAndroid Build Coastguard Worker class VirtualCameraSession 45*ec779b8eSAndroid Build Coastguard Worker : public ::aidl::android::hardware::camera::device::BnCameraDeviceSession { 46*ec779b8eSAndroid Build Coastguard Worker public: 47*ec779b8eSAndroid Build Coastguard Worker // Construct new virtual camera session. 48*ec779b8eSAndroid Build Coastguard Worker // When virtualCameraClientCallback is null, the input surface will be filled 49*ec779b8eSAndroid Build Coastguard Worker // with test pattern. 50*ec779b8eSAndroid Build Coastguard Worker VirtualCameraSession( 51*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<VirtualCameraDevice> mCameraDevice, 52*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr< 53*ec779b8eSAndroid Build Coastguard Worker ::aidl::android::hardware::camera::device::ICameraDeviceCallback> 54*ec779b8eSAndroid Build Coastguard Worker cameraDeviceCallback, 55*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr< 56*ec779b8eSAndroid Build Coastguard Worker ::aidl::android::companion::virtualcamera::IVirtualCameraCallback> 57*ec779b8eSAndroid Build Coastguard Worker virtualCameraClientCallback = nullptr); 58*ec779b8eSAndroid Build Coastguard Worker 59*ec779b8eSAndroid Build Coastguard Worker virtual ~VirtualCameraSession() override = default; 60*ec779b8eSAndroid Build Coastguard Worker 61*ec779b8eSAndroid Build Coastguard Worker ndk::ScopedAStatus close() override EXCLUDES(mLock); 62*ec779b8eSAndroid Build Coastguard Worker 63*ec779b8eSAndroid Build Coastguard Worker ndk::ScopedAStatus configureStreams( 64*ec779b8eSAndroid Build Coastguard Worker const ::aidl::android::hardware::camera::device::StreamConfiguration& 65*ec779b8eSAndroid Build Coastguard Worker in_requestedConfiguration, 66*ec779b8eSAndroid Build Coastguard Worker std::vector<::aidl::android::hardware::camera::device::HalStream>* 67*ec779b8eSAndroid Build Coastguard Worker _aidl_return) override EXCLUDES(mLock); 68*ec779b8eSAndroid Build Coastguard Worker 69*ec779b8eSAndroid Build Coastguard Worker ndk::ScopedAStatus constructDefaultRequestSettings( 70*ec779b8eSAndroid Build Coastguard Worker ::aidl::android::hardware::camera::device::RequestTemplate in_type, 71*ec779b8eSAndroid Build Coastguard Worker ::aidl::android::hardware::camera::device::CameraMetadata* _aidl_return) 72*ec779b8eSAndroid Build Coastguard Worker override; 73*ec779b8eSAndroid Build Coastguard Worker 74*ec779b8eSAndroid Build Coastguard Worker ndk::ScopedAStatus flush() override EXCLUDES(mLock); 75*ec779b8eSAndroid Build Coastguard Worker 76*ec779b8eSAndroid Build Coastguard Worker ndk::ScopedAStatus getCaptureRequestMetadataQueue( 77*ec779b8eSAndroid Build Coastguard Worker ::aidl::android::hardware::common::fmq::MQDescriptor< 78*ec779b8eSAndroid Build Coastguard Worker int8_t, ::aidl::android::hardware::common::fmq::SynchronizedReadWrite>* 79*ec779b8eSAndroid Build Coastguard Worker _aidl_return) override; 80*ec779b8eSAndroid Build Coastguard Worker 81*ec779b8eSAndroid Build Coastguard Worker ndk::ScopedAStatus getCaptureResultMetadataQueue( 82*ec779b8eSAndroid Build Coastguard Worker ::aidl::android::hardware::common::fmq::MQDescriptor< 83*ec779b8eSAndroid Build Coastguard Worker int8_t, ::aidl::android::hardware::common::fmq::SynchronizedReadWrite>* 84*ec779b8eSAndroid Build Coastguard Worker _aidl_return) override; 85*ec779b8eSAndroid Build Coastguard Worker 86*ec779b8eSAndroid Build Coastguard Worker ndk::ScopedAStatus isReconfigurationRequired( 87*ec779b8eSAndroid Build Coastguard Worker const ::aidl::android::hardware::camera::device::CameraMetadata& 88*ec779b8eSAndroid Build Coastguard Worker in_oldSessionParams, 89*ec779b8eSAndroid Build Coastguard Worker const ::aidl::android::hardware::camera::device::CameraMetadata& 90*ec779b8eSAndroid Build Coastguard Worker in_newSessionParams, 91*ec779b8eSAndroid Build Coastguard Worker bool* _aidl_return) override; 92*ec779b8eSAndroid Build Coastguard Worker 93*ec779b8eSAndroid Build Coastguard Worker ndk::ScopedAStatus processCaptureRequest( 94*ec779b8eSAndroid Build Coastguard Worker const std::vector<::aidl::android::hardware::camera::device::CaptureRequest>& 95*ec779b8eSAndroid Build Coastguard Worker in_requests, 96*ec779b8eSAndroid Build Coastguard Worker const std::vector<::aidl::android::hardware::camera::device::BufferCache>& 97*ec779b8eSAndroid Build Coastguard Worker in_cachesToRemove, 98*ec779b8eSAndroid Build Coastguard Worker int32_t* _aidl_return) override; 99*ec779b8eSAndroid Build Coastguard Worker 100*ec779b8eSAndroid Build Coastguard Worker ndk::ScopedAStatus signalStreamFlush(const std::vector<int32_t>& in_streamIds, 101*ec779b8eSAndroid Build Coastguard Worker int32_t in_streamConfigCounter) override; 102*ec779b8eSAndroid Build Coastguard Worker 103*ec779b8eSAndroid Build Coastguard Worker ndk::ScopedAStatus switchToOffline( 104*ec779b8eSAndroid Build Coastguard Worker const std::vector<int32_t>& in_streamsToKeep, 105*ec779b8eSAndroid Build Coastguard Worker ::aidl::android::hardware::camera::device::CameraOfflineSessionInfo* 106*ec779b8eSAndroid Build Coastguard Worker out_offlineSessionInfo, 107*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr< 108*ec779b8eSAndroid Build Coastguard Worker ::aidl::android::hardware::camera::device::ICameraOfflineSession>* 109*ec779b8eSAndroid Build Coastguard Worker _aidl_return) override; 110*ec779b8eSAndroid Build Coastguard Worker 111*ec779b8eSAndroid Build Coastguard Worker ndk::ScopedAStatus repeatingRequestEnd( 112*ec779b8eSAndroid Build Coastguard Worker int32_t in_frameNumber, const std::vector<int32_t>& in_streamIds) override; 113*ec779b8eSAndroid Build Coastguard Worker 114*ec779b8eSAndroid Build Coastguard Worker std::set<int> getStreamIds() const EXCLUDES(mLock); 115*ec779b8eSAndroid Build Coastguard Worker 116*ec779b8eSAndroid Build Coastguard Worker private: 117*ec779b8eSAndroid Build Coastguard Worker ndk::ScopedAStatus processCaptureRequest( 118*ec779b8eSAndroid Build Coastguard Worker const ::aidl::android::hardware::camera::device::CaptureRequest& request) 119*ec779b8eSAndroid Build Coastguard Worker EXCLUDES(mLock); 120*ec779b8eSAndroid Build Coastguard Worker 121*ec779b8eSAndroid Build Coastguard Worker std::weak_ptr<VirtualCameraDevice> mCameraDevice; 122*ec779b8eSAndroid Build Coastguard Worker 123*ec779b8eSAndroid Build Coastguard Worker mutable std::mutex mLock; 124*ec779b8eSAndroid Build Coastguard Worker 125*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<::aidl::android::hardware::camera::device::ICameraDeviceCallback> 126*ec779b8eSAndroid Build Coastguard Worker mCameraDeviceCallback GUARDED_BY(mLock); 127*ec779b8eSAndroid Build Coastguard Worker 128*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr< 129*ec779b8eSAndroid Build Coastguard Worker ::aidl::android::companion::virtualcamera::IVirtualCameraCallback> 130*ec779b8eSAndroid Build Coastguard Worker mVirtualCameraClientCallback; 131*ec779b8eSAndroid Build Coastguard Worker 132*ec779b8eSAndroid Build Coastguard Worker VirtualCameraSessionContext mSessionContext; 133*ec779b8eSAndroid Build Coastguard Worker 134*ec779b8eSAndroid Build Coastguard Worker using RequestMetadataQueue = AidlMessageQueue< 135*ec779b8eSAndroid Build Coastguard Worker int8_t, ::aidl::android::hardware::common::fmq::SynchronizedReadWrite>; 136*ec779b8eSAndroid Build Coastguard Worker std::unique_ptr<RequestMetadataQueue> mRequestMetadataQueue; 137*ec779b8eSAndroid Build Coastguard Worker 138*ec779b8eSAndroid Build Coastguard Worker using ResultMetadataQueue = AidlMessageQueue< 139*ec779b8eSAndroid Build Coastguard Worker int8_t, ::aidl::android::hardware::common::fmq::SynchronizedReadWrite>; 140*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<ResultMetadataQueue> mResultMetadataQueue; 141*ec779b8eSAndroid Build Coastguard Worker 142*ec779b8eSAndroid Build Coastguard Worker aidl::android::hardware::camera::device::CameraMetadata mCurrentRequestMetadata 143*ec779b8eSAndroid Build Coastguard Worker GUARDED_BY(mLock); 144*ec779b8eSAndroid Build Coastguard Worker 145*ec779b8eSAndroid Build Coastguard Worker std::unique_ptr<VirtualCameraRenderThread> mRenderThread GUARDED_BY(mLock); 146*ec779b8eSAndroid Build Coastguard Worker 147*ec779b8eSAndroid Build Coastguard Worker int mCurrentInputStreamId GUARDED_BY(mLock); 148*ec779b8eSAndroid Build Coastguard Worker }; 149*ec779b8eSAndroid Build Coastguard Worker 150*ec779b8eSAndroid Build Coastguard Worker } // namespace virtualcamera 151*ec779b8eSAndroid Build Coastguard Worker } // namespace companion 152*ec779b8eSAndroid Build Coastguard Worker } // namespace android 153*ec779b8eSAndroid Build Coastguard Worker 154*ec779b8eSAndroid Build Coastguard Worker #endif // ANDROID_SERVICES_VIRTUAL_CAMERA_VIRTUALCAMERASESSION_H 155