1 /*
2  * Copyright (c) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *     http://www.apache.org/licenses/LICENSE-2.0
7  * Unless required by applicable law or agreed to in writing, software
8  * distributed under the License is distributed on an "AS IS" BASIS,
9  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10  * See the License for the specific language governing permissions and
11  * limitations under the License.
12  */
13 
14 #ifndef NODE_BASE_H
15 #define NODE_BASE_H
16 
17 #include "buffer_manager.h"
18 #include "idevice_manager.h"
19 #include "inode.h"
20 #include <mutex>
21 
22 namespace OHOS::Camera {
23 
24 class PortBase : public IPort {
25 public:
PortBase(const std::string & name,const std::weak_ptr<INode> & n)26     PortBase(const std::string& name, const std::weak_ptr<INode>& n) : name_(name), owner_(n)
27     {
28     }
29     ~PortBase() override = default;
30     std::string GetName() const override;
31     RetCode SetFormat(const PortFormat& format) override;
32     RetCode GetFormat(PortFormat& format) const override;
33     int32_t GetStreamId() const override;
34     RetCode Connect(const std::shared_ptr<IPort>& peer) override;
35     RetCode DisConnect() override;
36     int32_t Direction() const override;
37     std::shared_ptr<INode> GetNode() const override;
38     std::shared_ptr<IPort> Peer() const override;
39     void DeliverBuffer(std::shared_ptr<IBuffer>& buffer) override;
40     void DeliverBuffers(std::vector<std::shared_ptr<IBuffer>>& buffers) override;
41     void DeliverBuffers(std::shared_ptr<FrameSpec> frameSpec) override;
42     void DeliverBuffers(std::vector<std::shared_ptr<FrameSpec>> mergeVec) override;
43 protected:
44     std::string name_;
45     std::shared_ptr<IPort> peer_ = nullptr;
46     std::weak_ptr<INode> owner_;
47 };
48 
49 class NodeBase : public INode, public std::enable_shared_from_this<NodeBase> {
50 public:
NodeBase(const std::string & name,const std::string & type,const std::string & cameraId)51     NodeBase(const std::string& name, const std::string& type, const std::string &cameraId)
52         : name_(name), type_(type), cameraId_(cameraId)
53     {
54     }
~NodeBase()55     ~NodeBase() override
56     {
57         CAMERA_LOGI("node dtor enter\n");
58         for (const auto& it : portVec_) {
59             it->DisConnect();
60         }
61         portVec_.clear();
62     }
63 
64     std::string GetName() const override;
65     std::string GetType() const override;
66     std::shared_ptr<IPort> GetPort(const std::string& name) override;
67     RetCode Init(const int32_t streamId) override;
68     RetCode Start(const int32_t streamId) override;
69     RetCode Flush(const int32_t streamId) override;
70     RetCode SetCallback() override;
71     RetCode Stop(const int32_t streamId) override;
72     RetCode Config(const int32_t streamId, const CaptureMeta& meta) override;
73     RetCode Capture(const int32_t streamId, const int32_t captureId) override;
74     RetCode CancelCapture(const int32_t streamId) override;
75     int32_t GetNumberOfInPorts() const override;
76     int32_t GetNumberOfOutPorts() const override;
77     std::vector<std::shared_ptr<IPort>> GetInPorts() const override;
78     std::vector<std::shared_ptr<IPort>> GetOutPorts() override;
79     std::shared_ptr<IPort> GetOutPortById(const int32_t id) override;
80     void SetCallBack(BufferCb c) override;
81     void DeliverBuffer(std::shared_ptr<IBuffer>& buffer) override;
82     void DeliverBuffers(std::vector<std::shared_ptr<IBuffer>>& buffers) override;
83 
84     virtual RetCode ProvideBuffers(std::shared_ptr<FrameSpec> frameSpec);
85     void DeliverBuffers(std::shared_ptr<FrameSpec> frameSpec) override;
86     void DeliverBuffers(std::vector<std::shared_ptr<FrameSpec>> mergeVec) override;
87 
88 protected:
89     std::string name_;
90     std::string type_;
91     std::string cameraId_;
92     std::vector<std::shared_ptr<IPort>> portVec_;
93     mutable std::mutex portLock_;
94 };
95 }
96 #endif
97 
98