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_VIRTUALCAMERASESSIONCONTEXT_H 18*ec779b8eSAndroid Build Coastguard Worker #define ANDROID_COMPANION_VIRTUALCAMERA_VIRTUALCAMERASESSIONCONTEXT_H 19*ec779b8eSAndroid Build Coastguard Worker 20*ec779b8eSAndroid Build Coastguard Worker #include <map> 21*ec779b8eSAndroid Build Coastguard Worker #include <memory> 22*ec779b8eSAndroid Build Coastguard Worker #include <mutex> 23*ec779b8eSAndroid Build Coastguard Worker #include <set> 24*ec779b8eSAndroid Build Coastguard Worker 25*ec779b8eSAndroid Build Coastguard Worker #include "VirtualCameraStream.h" 26*ec779b8eSAndroid Build Coastguard Worker #include "aidl/android/hardware/camera/device/BufferCache.h" 27*ec779b8eSAndroid Build Coastguard Worker #include "aidl/android/hardware/camera/device/CaptureRequest.h" 28*ec779b8eSAndroid Build Coastguard Worker #include "aidl/android/hardware/camera/device/Stream.h" 29*ec779b8eSAndroid Build Coastguard Worker #include "aidl/android/hardware/camera/device/StreamConfiguration.h" 30*ec779b8eSAndroid Build Coastguard Worker 31*ec779b8eSAndroid Build Coastguard Worker namespace android { 32*ec779b8eSAndroid Build Coastguard Worker namespace companion { 33*ec779b8eSAndroid Build Coastguard Worker namespace virtualcamera { 34*ec779b8eSAndroid Build Coastguard Worker 35*ec779b8eSAndroid Build Coastguard Worker // Encapsulates set of streams belonging to the same camera session. 36*ec779b8eSAndroid Build Coastguard Worker class VirtualCameraSessionContext { 37*ec779b8eSAndroid Build Coastguard Worker public: 38*ec779b8eSAndroid Build Coastguard Worker // (Re)initialize the stream. 39*ec779b8eSAndroid Build Coastguard Worker // 40*ec779b8eSAndroid Build Coastguard Worker // Returns true if the stream is initialized for the first time. 41*ec779b8eSAndroid Build Coastguard Worker bool initializeStream( 42*ec779b8eSAndroid Build Coastguard Worker const ::aidl::android::hardware::camera::device::Stream& stream) 43*ec779b8eSAndroid Build Coastguard Worker EXCLUDES(mLock); 44*ec779b8eSAndroid Build Coastguard Worker 45*ec779b8eSAndroid Build Coastguard Worker // Close all streams and free all asociated buffers. 46*ec779b8eSAndroid Build Coastguard Worker void closeAllStreams() EXCLUDES(mLock); 47*ec779b8eSAndroid Build Coastguard Worker 48*ec779b8eSAndroid Build Coastguard Worker // Remove no longer needed buffers. 49*ec779b8eSAndroid Build Coastguard Worker void removeBufferCaches( 50*ec779b8eSAndroid Build Coastguard Worker const std::vector<::aidl::android::hardware::camera::device::BufferCache>& 51*ec779b8eSAndroid Build Coastguard Worker cachesToRemove) EXCLUDES(mLock); 52*ec779b8eSAndroid Build Coastguard Worker 53*ec779b8eSAndroid Build Coastguard Worker // Remove all streams not referenced by provided configuration. 54*ec779b8eSAndroid Build Coastguard Worker void removeStreamsNotInStreamConfiguration( 55*ec779b8eSAndroid Build Coastguard Worker const ::aidl::android::hardware::camera::device::StreamConfiguration& 56*ec779b8eSAndroid Build Coastguard Worker streamConfiguration) EXCLUDES(mLock); 57*ec779b8eSAndroid Build Coastguard Worker 58*ec779b8eSAndroid Build Coastguard Worker // Importored all not-yet imported buffers referenced by the capture request. 59*ec779b8eSAndroid Build Coastguard Worker bool importBuffersFromCaptureRequest( 60*ec779b8eSAndroid Build Coastguard Worker const ::aidl::android::hardware::camera::device::CaptureRequest& 61*ec779b8eSAndroid Build Coastguard Worker captureRequest) EXCLUDES(mLock); 62*ec779b8eSAndroid Build Coastguard Worker 63*ec779b8eSAndroid Build Coastguard Worker // Get stream configuration for provided stream id. 64*ec779b8eSAndroid Build Coastguard Worker // Returns nullopt in case there's no stream with provided stream id. 65*ec779b8eSAndroid Build Coastguard Worker std::optional<::aidl::android::hardware::camera::device::Stream> 66*ec779b8eSAndroid Build Coastguard Worker getStreamConfig(int streamId) const EXCLUDES(mLock); 67*ec779b8eSAndroid Build Coastguard Worker 68*ec779b8eSAndroid Build Coastguard Worker // Get hardware buffer for provided streamId & bufferId. 69*ec779b8eSAndroid Build Coastguard Worker // Returns nullptr in case there's no such buffer. 70*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<AHardwareBuffer> fetchHardwareBuffer(int streamId, 71*ec779b8eSAndroid Build Coastguard Worker int bufferId) const 72*ec779b8eSAndroid Build Coastguard Worker EXCLUDES(mLock); 73*ec779b8eSAndroid Build Coastguard Worker 74*ec779b8eSAndroid Build Coastguard Worker // Get EGL framebuffer for provided EGL display, streamId & buffer id. 75*ec779b8eSAndroid Build Coastguard Worker // 76*ec779b8eSAndroid Build Coastguard Worker // This will also lazily create EglFrameBuffer for the provided EGLDisplay 77*ec779b8eSAndroid Build Coastguard Worker // connection and will cache it (subsequent calls for same EGLDisplay and 78*ec779b8eSAndroid Build Coastguard Worker // buffer will return same instance of EglFrameBuffer). 79*ec779b8eSAndroid Build Coastguard Worker // 80*ec779b8eSAndroid Build Coastguard Worker // Returns nullptr in case there's no such buffer or it was not possible 81*ec779b8eSAndroid Build Coastguard Worker // to create EglFrameBuffer. 82*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<EglFrameBuffer> fetchOrCreateEglFramebuffer( 83*ec779b8eSAndroid Build Coastguard Worker const EGLDisplay eglDisplay, int streamId, int bufferId) EXCLUDES(mLock); 84*ec779b8eSAndroid Build Coastguard Worker 85*ec779b8eSAndroid Build Coastguard Worker // Returns set of all stream ids managed by this instance. 86*ec779b8eSAndroid Build Coastguard Worker std::set<int> getStreamIds() const EXCLUDES(mLock); 87*ec779b8eSAndroid Build Coastguard Worker 88*ec779b8eSAndroid Build Coastguard Worker private: 89*ec779b8eSAndroid Build Coastguard Worker mutable std::mutex mLock; 90*ec779b8eSAndroid Build Coastguard Worker // streamId -> VirtualCameraStream mapping. 91*ec779b8eSAndroid Build Coastguard Worker std::map<int, std::unique_ptr<VirtualCameraStream>> mStreams GUARDED_BY(mLock); 92*ec779b8eSAndroid Build Coastguard Worker }; 93*ec779b8eSAndroid Build Coastguard Worker 94*ec779b8eSAndroid Build Coastguard Worker } // namespace virtualcamera 95*ec779b8eSAndroid Build Coastguard Worker } // namespace companion 96*ec779b8eSAndroid Build Coastguard Worker } // namespace android 97*ec779b8eSAndroid Build Coastguard Worker 98*ec779b8eSAndroid Build Coastguard Worker #endif // ANDROID_COMPANION_VIRTUALCAMERA_VIRTUALCAMERASESSIONCONTEXT_H 99