1094332d3Sopenharmony_ci/* 2094332d3Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd. 3094332d3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4094332d3Sopenharmony_ci * you may not use this file except in compliance with the License. 5094332d3Sopenharmony_ci * You may obtain a copy of the License at 6094332d3Sopenharmony_ci * 7094332d3Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8094332d3Sopenharmony_ci * 9094332d3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10094332d3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11094332d3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12094332d3Sopenharmony_ci * See the License for the specific language governing permissions and 13094332d3Sopenharmony_ci * limitations under the License. 14094332d3Sopenharmony_ci */ 15094332d3Sopenharmony_ci 16094332d3Sopenharmony_ci#ifndef CAMERA_DEMO_TEST_H 17094332d3Sopenharmony_ci#define CAMERA_DEMO_TEST_H 18094332d3Sopenharmony_ci 19094332d3Sopenharmony_ci#include <list> 20094332d3Sopenharmony_ci#include <memory> 21094332d3Sopenharmony_ci#include <mutex> 22094332d3Sopenharmony_ci#include <string> 23094332d3Sopenharmony_ci#include <thread> 24094332d3Sopenharmony_ci#include <vector> 25094332d3Sopenharmony_ci#include <gtest/gtest.h> 26094332d3Sopenharmony_ci#include "display_format.h" 27094332d3Sopenharmony_ci#include "ibuffer.h" 28094332d3Sopenharmony_ci#include "ibuffer_pool.h" 29094332d3Sopenharmony_ci#include "surface.h" 30094332d3Sopenharmony_ci#include "ibuffer_consumer_listener.h" 31094332d3Sopenharmony_ci 32094332d3Sopenharmony_cinamespace OHOS::CameraUtest { 33094332d3Sopenharmony_ciusing namespace OHOS::Camera; 34094332d3Sopenharmony_ci 35094332d3Sopenharmony_ciclass BufferManagerTest : public testing::Test { 36094332d3Sopenharmony_cipublic: 37094332d3Sopenharmony_ci static void SetUpTestCase(void); 38094332d3Sopenharmony_ci static void TearDownTestCase(void); 39094332d3Sopenharmony_ci 40094332d3Sopenharmony_ci void SetUp(void); 41094332d3Sopenharmony_ci void TearDown(void); 42094332d3Sopenharmony_ci 43094332d3Sopenharmony_cipublic: 44094332d3Sopenharmony_ci class Stream { 45094332d3Sopenharmony_ci public: 46094332d3Sopenharmony_ci Stream() = default; 47094332d3Sopenharmony_ci ~Stream() = default; 48094332d3Sopenharmony_ci#ifdef CAMERA_BUILT_ON_OHOS_LITE 49094332d3Sopenharmony_ci bool Init(std::shared_ptr<OHOS::Surface>& producer); 50094332d3Sopenharmony_ci#else 51094332d3Sopenharmony_ci bool Init(OHOS::sptr<OHOS::IBufferProducer>& producer); 52094332d3Sopenharmony_ci#endif 53094332d3Sopenharmony_ci void StartStream(); 54094332d3Sopenharmony_ci void StopStream(); 55094332d3Sopenharmony_ci void EnqueueBufferNonBlock(); 56094332d3Sopenharmony_ci void DequeueBuffer(std::shared_ptr<IBuffer>& buffer); 57094332d3Sopenharmony_ci std::shared_ptr<IBufferPool> GetBufferPool() const; 58094332d3Sopenharmony_ci int64_t GetPoolId() const 59094332d3Sopenharmony_ci { 60094332d3Sopenharmony_ci return bufferPoolId_; 61094332d3Sopenharmony_ci } 62094332d3Sopenharmony_ci 63094332d3Sopenharmony_ci private: 64094332d3Sopenharmony_ci void StartInnerStream() const; 65094332d3Sopenharmony_ci void StartExternalStream(); 66094332d3Sopenharmony_ci 67094332d3Sopenharmony_ci private: 68094332d3Sopenharmony_ci std::mutex lock_; 69094332d3Sopenharmony_ci#ifdef CAMERA_BUILT_ON_OHOS_LITE 70094332d3Sopenharmony_ci std::shared_ptr<OHOS::Surface> producer_ = nullptr; 71094332d3Sopenharmony_ci#else 72094332d3Sopenharmony_ci OHOS::sptr<OHOS::Surface> producer_ = nullptr; 73094332d3Sopenharmony_ci#endif 74094332d3Sopenharmony_ci 75094332d3Sopenharmony_ci uint32_t width_ = 1920; 76094332d3Sopenharmony_ci uint32_t height_ = 1080; 77094332d3Sopenharmony_ci uint32_t queueSize_ = 7; 78094332d3Sopenharmony_ci uint64_t usage_ = CAMERA_USAGE_SW_WRITE_OFTEN | CAMERA_USAGE_SW_READ_OFTEN | CAMERA_USAGE_MEM_DMA; 79094332d3Sopenharmony_ci uint32_t format_ = CAMERA_FORMAT_YCBCR_420_SP; 80094332d3Sopenharmony_ci int64_t bufferPoolId_ = -1; 81094332d3Sopenharmony_ci 82094332d3Sopenharmony_ci std::shared_ptr<IBufferPool> bufferPool_ = nullptr; 83094332d3Sopenharmony_ci 84094332d3Sopenharmony_ci#ifdef CAMERA_BUILT_ON_OHOS_LITE 85094332d3Sopenharmony_ci std::vector<std::pair<OHOS::SurfaceBuffer*, std::shared_ptr<IBuffer>>> bufferVec_ = {}; 86094332d3Sopenharmony_ci#else 87094332d3Sopenharmony_ci std::vector<std::pair<OHOS::sptr<OHOS::SurfaceBuffer>, std::shared_ptr<IBuffer>>> bufferVec_ = {}; 88094332d3Sopenharmony_ci int32_t releaseFence_ = 0; 89094332d3Sopenharmony_ci OHOS::BufferRequestConfig requestConfig_ = {}; 90094332d3Sopenharmony_ci OHOS::BufferFlushConfig flushConfig_ = {}; 91094332d3Sopenharmony_ci#endif 92094332d3Sopenharmony_ci }; 93094332d3Sopenharmony_ci 94094332d3Sopenharmony_ci#ifndef CAMERA_BUILT_ON_OHOS_LITE 95094332d3Sopenharmony_ci class TestBufferConsumerListener : public IBufferConsumerListener { 96094332d3Sopenharmony_ci public: 97094332d3Sopenharmony_ci TestBufferConsumerListener() 98094332d3Sopenharmony_ci { 99094332d3Sopenharmony_ci } 100094332d3Sopenharmony_ci 101094332d3Sopenharmony_ci ~TestBufferConsumerListener() 102094332d3Sopenharmony_ci { 103094332d3Sopenharmony_ci } 104094332d3Sopenharmony_ci 105094332d3Sopenharmony_ci void OnBufferAvailable() 106094332d3Sopenharmony_ci { 107094332d3Sopenharmony_ci } 108094332d3Sopenharmony_ci }; 109094332d3Sopenharmony_ci#endif 110094332d3Sopenharmony_ci 111094332d3Sopenharmony_ci class Node { 112094332d3Sopenharmony_ci public: 113094332d3Sopenharmony_ci explicit Node(const std::string name) : name_(name) {} 114094332d3Sopenharmony_ci virtual ~Node() = default; 115094332d3Sopenharmony_ci 116094332d3Sopenharmony_ci virtual void Connect(std::shared_ptr<Node>& nextNode); 117094332d3Sopenharmony_ci virtual void Deliver(std::shared_ptr<IBuffer>& buffer); 118094332d3Sopenharmony_ci virtual void Receive(std::shared_ptr<IBuffer>& buffer); 119094332d3Sopenharmony_ci virtual void Process(std::shared_ptr<IBuffer>& buffer); 120094332d3Sopenharmony_ci virtual std::string GetName() const; 121094332d3Sopenharmony_ci 122094332d3Sopenharmony_ci private: 123094332d3Sopenharmony_ci std::string name_ = ""; 124094332d3Sopenharmony_ci std::shared_ptr<Node> nextNode_ = nullptr; 125094332d3Sopenharmony_ci 126094332d3Sopenharmony_ci private: 127094332d3Sopenharmony_ci Node() = default; 128094332d3Sopenharmony_ci }; 129094332d3Sopenharmony_ci 130094332d3Sopenharmony_ci class SinkNode : public Node { 131094332d3Sopenharmony_ci public: 132094332d3Sopenharmony_ci explicit SinkNode(const std::string& name) : Node(name) {} 133094332d3Sopenharmony_ci ~SinkNode() override {} 134094332d3Sopenharmony_ci void Deliver(std::shared_ptr<IBuffer>& buffer) override; 135094332d3Sopenharmony_ci void BindCallback(const std::function<void(std::shared_ptr<IBuffer>&)>& func); 136094332d3Sopenharmony_ci 137094332d3Sopenharmony_ci private: 138094332d3Sopenharmony_ci std::function<void(std::shared_ptr<IBuffer>&)> callback_ = nullptr; 139094332d3Sopenharmony_ci }; 140094332d3Sopenharmony_ci 141094332d3Sopenharmony_ci class SourceNode : public Node { 142094332d3Sopenharmony_ci public: 143094332d3Sopenharmony_ci explicit SourceNode(const std::string name) : Node(name) {} 144094332d3Sopenharmony_ci void Process(std::shared_ptr<IBuffer>& buffer) override; 145094332d3Sopenharmony_ci ~SourceNode() override {} 146094332d3Sopenharmony_ci private: 147094332d3Sopenharmony_ci int cacheSize_ = 3; 148094332d3Sopenharmony_ci std::list<std::shared_ptr<IBuffer>> cache_ = {}; 149094332d3Sopenharmony_ci }; 150094332d3Sopenharmony_ci 151094332d3Sopenharmony_ci class Pipeline { 152094332d3Sopenharmony_ci public: 153094332d3Sopenharmony_ci Pipeline() = default; 154094332d3Sopenharmony_ci ~Pipeline() = default; 155094332d3Sopenharmony_ci 156094332d3Sopenharmony_ci bool AddStream(const std::shared_ptr<Stream>& stream); 157094332d3Sopenharmony_ci void StartStream(); 158094332d3Sopenharmony_ci void StopStream(); 159094332d3Sopenharmony_ci 160094332d3Sopenharmony_ci private: 161094332d3Sopenharmony_ci void CollectBuffers(); 162094332d3Sopenharmony_ci void DeliverBuffer(); 163094332d3Sopenharmony_ci void DeliverBuffer(std::shared_ptr<IBuffer>& buffer); 164094332d3Sopenharmony_ci bool BuildPipeline(); 165094332d3Sopenharmony_ci 166094332d3Sopenharmony_ci private: 167094332d3Sopenharmony_ci bool running = true; 168094332d3Sopenharmony_ci std::mutex streamLock_; 169094332d3Sopenharmony_ci std::thread* collectThread_ = nullptr; 170094332d3Sopenharmony_ci std::shared_ptr<Node> sourceNode_ = nullptr; 171094332d3Sopenharmony_ci uint64_t frameNumber_ = 0; 172094332d3Sopenharmony_ci 173094332d3Sopenharmony_ci struct LocalStream { 174094332d3Sopenharmony_ci std::mutex deviceLock; 175094332d3Sopenharmony_ci std::shared_ptr<Stream> stream = nullptr; 176094332d3Sopenharmony_ci std::thread* deliverThread = nullptr; 177094332d3Sopenharmony_ci std::list<std::shared_ptr<IBuffer>> deviceBufferList = {}; 178094332d3Sopenharmony_ci }; 179094332d3Sopenharmony_ci std::shared_ptr<LocalStream> localStream_ = nullptr; 180094332d3Sopenharmony_ci }; 181094332d3Sopenharmony_ci}; 182094332d3Sopenharmony_ci} // namespace OHOS::CameraUtest 183094332d3Sopenharmony_ci#endif // CAMERA_DEMO_TEST_H 184