1*ec779b8eSAndroid Build Coastguard Worker /* 2*ec779b8eSAndroid Build Coastguard Worker * Copyright (C) 2024 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 #ifndef ANDROID_COMPANION_VIRTUALCAMERA_VIRTUALCAMERATESTINSTANCE_H 17*ec779b8eSAndroid Build Coastguard Worker #define ANDROID_COMPANION_VIRTUALCAMERA_VIRTUALCAMERATESTINSTANCE_H 18*ec779b8eSAndroid Build Coastguard Worker 19*ec779b8eSAndroid Build Coastguard Worker #include <atomic> 20*ec779b8eSAndroid Build Coastguard Worker #include <map> 21*ec779b8eSAndroid Build Coastguard Worker #include <memory> 22*ec779b8eSAndroid Build Coastguard Worker #include <thread> 23*ec779b8eSAndroid Build Coastguard Worker 24*ec779b8eSAndroid Build Coastguard Worker #include "aidl/android/companion/virtualcamera/BnVirtualCameraCallback.h" 25*ec779b8eSAndroid Build Coastguard Worker #include "android/native_window.h" 26*ec779b8eSAndroid Build Coastguard Worker #include "utils/Mutex.h" 27*ec779b8eSAndroid Build Coastguard Worker 28*ec779b8eSAndroid Build Coastguard Worker namespace android { 29*ec779b8eSAndroid Build Coastguard Worker namespace companion { 30*ec779b8eSAndroid Build Coastguard Worker namespace virtualcamera { 31*ec779b8eSAndroid Build Coastguard Worker 32*ec779b8eSAndroid Build Coastguard Worker // Wraps render loop run in a dedicated thread, rendering test pattern to 33*ec779b8eSAndroid Build Coastguard Worker // provided Surface (a.k.a. native window) at configured FPS. 34*ec779b8eSAndroid Build Coastguard Worker class TestPatternRenderer 35*ec779b8eSAndroid Build Coastguard Worker : public std::enable_shared_from_this<TestPatternRenderer> { 36*ec779b8eSAndroid Build Coastguard Worker public: 37*ec779b8eSAndroid Build Coastguard Worker TestPatternRenderer(std::shared_ptr<ANativeWindow> nativeWindow, int fps); 38*ec779b8eSAndroid Build Coastguard Worker 39*ec779b8eSAndroid Build Coastguard Worker // Start rendering. 40*ec779b8eSAndroid Build Coastguard Worker void start() EXCLUDES(mLock); 41*ec779b8eSAndroid Build Coastguard Worker 42*ec779b8eSAndroid Build Coastguard Worker // Stop rendering. 43*ec779b8eSAndroid Build Coastguard Worker // Call returns immediatelly, render thread might take some time (1 frame) 44*ec779b8eSAndroid Build Coastguard Worker // to finish rendering and terminate the thread. 45*ec779b8eSAndroid Build Coastguard Worker void stop() EXCLUDES(mLock); 46*ec779b8eSAndroid Build Coastguard Worker 47*ec779b8eSAndroid Build Coastguard Worker private: 48*ec779b8eSAndroid Build Coastguard Worker // Render thread entry point. 49*ec779b8eSAndroid Build Coastguard Worker void renderThreadLoop(std::shared_ptr<ANativeWindow> nativeWindow); 50*ec779b8eSAndroid Build Coastguard Worker 51*ec779b8eSAndroid Build Coastguard Worker const int mFps; 52*ec779b8eSAndroid Build Coastguard Worker 53*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<ANativeWindow> mNativeWindow; 54*ec779b8eSAndroid Build Coastguard Worker 55*ec779b8eSAndroid Build Coastguard Worker std::mutex mLock; 56*ec779b8eSAndroid Build Coastguard Worker std::atomic_bool mRunning; 57*ec779b8eSAndroid Build Coastguard Worker std::thread mThread GUARDED_BY(mLock); 58*ec779b8eSAndroid Build Coastguard Worker }; 59*ec779b8eSAndroid Build Coastguard Worker 60*ec779b8eSAndroid Build Coastguard Worker // VirtualCamera callback implementation for test camera. 61*ec779b8eSAndroid Build Coastguard Worker // 62*ec779b8eSAndroid Build Coastguard Worker // For every configure call, starts rendering of test pattern on provided surface. 63*ec779b8eSAndroid Build Coastguard Worker class VirtualCameraTestInstance 64*ec779b8eSAndroid Build Coastguard Worker : public aidl::android::companion::virtualcamera::BnVirtualCameraCallback { 65*ec779b8eSAndroid Build Coastguard Worker public: 66*ec779b8eSAndroid Build Coastguard Worker explicit VirtualCameraTestInstance(int fps = 30); 67*ec779b8eSAndroid Build Coastguard Worker 68*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus onStreamConfigured( 69*ec779b8eSAndroid Build Coastguard Worker int32_t streamId, const ::aidl::android::view::Surface& surface, 70*ec779b8eSAndroid Build Coastguard Worker int32_t width, int32_t height, 71*ec779b8eSAndroid Build Coastguard Worker ::aidl::android::companion::virtualcamera::Format pixelFormat) override 72*ec779b8eSAndroid Build Coastguard Worker EXCLUDES(mLock); 73*ec779b8eSAndroid Build Coastguard Worker 74*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus onProcessCaptureRequest(int32_t in_streamId, 75*ec779b8eSAndroid Build Coastguard Worker int32_t in_frameId) override; 76*ec779b8eSAndroid Build Coastguard Worker 77*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus onStreamClosed(int32_t streamId) override EXCLUDES(mLock); 78*ec779b8eSAndroid Build Coastguard Worker 79*ec779b8eSAndroid Build Coastguard Worker private: 80*ec779b8eSAndroid Build Coastguard Worker const int mFps; 81*ec779b8eSAndroid Build Coastguard Worker 82*ec779b8eSAndroid Build Coastguard Worker std::mutex mLock; 83*ec779b8eSAndroid Build Coastguard Worker // Map maintaining streamId -> TestPatternRenderer mapping for active 84*ec779b8eSAndroid Build Coastguard Worker // input streams. 85*ec779b8eSAndroid Build Coastguard Worker std::map<int, std::shared_ptr<TestPatternRenderer>> mInputRenderers 86*ec779b8eSAndroid Build Coastguard Worker GUARDED_BY(mLock); 87*ec779b8eSAndroid Build Coastguard Worker }; 88*ec779b8eSAndroid Build Coastguard Worker 89*ec779b8eSAndroid Build Coastguard Worker } // namespace virtualcamera 90*ec779b8eSAndroid Build Coastguard Worker } // namespace companion 91*ec779b8eSAndroid Build Coastguard Worker } // namespace android 92*ec779b8eSAndroid Build Coastguard Worker 93*ec779b8eSAndroid Build Coastguard Worker #endif // ANDROID_COMPANION_VIRTUALCAMERA_VIRTUALCAMERATESTINSTANCE_H 94