1 /*
2  * Copyright (c) 2021-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  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef HISTREAMER_PIPELINE_CORE_PORT_H
17 #define HISTREAMER_PIPELINE_CORE_PORT_H
18 
19 #include <memory>
20 #include <string>
21 #include <utility>
22 #include "foundation/cpp_ext/type_traits_ext.h"
23 #include "foundation/utils/constants.h"
24 #include "pipeline/core/error_code.h"
25 #include "pipeline/core/type_define.h"
26 
27 namespace OHOS {
28 namespace Media {
29 namespace Pipeline {
30 class InfoTransfer;
31 enum class PortType { IN, OUT };
32 
33 struct PortDesc {
34     std::string name;
35     bool isPcm;
36 };
37 
38 struct PortInfo {
39     PortType type;
40     std::vector<PortDesc> ports;
41 };
42 enum class WorkMode { PUSH, PULL };
43 
44 class Port {
45 public:
Port(InfoTransfer * ownerFilter,std::string portName)46     Port(InfoTransfer *ownerFilter, std::string portName)
47         : filter(ownerFilter), name(std::move(portName)) {}
48     virtual ~Port() = default;
49     const std::string& GetName();
50     const InfoTransfer* GetOwnerFilter() const;
51     virtual std::shared_ptr<Port> GetPeerPort();
GetWorkMode()52     WorkMode GetWorkMode()
53     {
54         return workMode;
55     }
56     virtual ErrorCode Connect(const std::shared_ptr<Port>& port) = 0;
57     virtual ErrorCode Disconnect() = 0;
58     virtual ErrorCode Activate(const std::vector<WorkMode>& modes, WorkMode& outMode) = 0;
59     virtual bool Negotiate(const std::shared_ptr<const Plugin::Capability>& upstreamCap,
60                            Plugin::Capability& negotiatedCap,
61                            const Plugin::Meta& upstreamParams,
62                            Plugin::Meta& downstreamParams) = 0;
63     virtual bool Configure(const std::shared_ptr<const Plugin::Meta>& upstreamMeta, Plugin::Meta& upstreamParams,
64                            Plugin::Meta& downstreamParams) = 0;
65     /**
66      * push data
67      * @param buffer pushed buffer
68      * @param offset means the offset from the start of the stream between Filter.Start and Filter.Stop. -1 means ignore
69      * this parameter.
70      */
71     virtual void PushData(const AVBufferPtr& buffer, int64_t offset) = 0;
72     virtual ErrorCode PullData(uint64_t offset, size_t size, AVBufferPtr& data) = 0;
73 
74 protected:
75     InfoTransfer* filter;
76     WorkMode workMode {WorkMode::PUSH};
77     const std::string name;
78 };
79 
80 class OutPort;
81 
82 class InPort : public Port {
83 public:
84     explicit InPort(InfoTransfer *filter, std::string name = PORT_NAME_DEFAULT)
85         : Port(filter, std::move(name)) {}
86     ~InPort() override = default;
87     ErrorCode Connect(const std::shared_ptr<Port>& port) override;
88     ErrorCode Disconnect() override;
89     ErrorCode Activate(const std::vector<WorkMode>& modes, WorkMode& outMode) override;
90     std::shared_ptr<Port> GetPeerPort() override;
91     bool Negotiate(const std::shared_ptr<const Plugin::Capability>& upstreamCap,
92                    Plugin::Capability& negotiatedCap,
93                    const Plugin::Meta& upstreamParams,
94                    Plugin::Meta& downstreamParams) override;
95     bool Configure(const std::shared_ptr<const Plugin::Meta>& upstreamMeta, Plugin::Meta& upstreamParams,
96                    Plugin::Meta& downstreamParams) override;
97     void PushData(const AVBufferPtr& buffer, int64_t offset) override;
98     ErrorCode PullData(uint64_t offset, size_t size, AVBufferPtr& data) override;
99 
100 private:
101     std::weak_ptr<Port> prevPort;
102 };
103 
104 class OutPort : public Port {
105 public:
106     explicit OutPort(InfoTransfer *filter, std::string name = PORT_NAME_DEFAULT)
107         : Port(filter, std::move(name)) {}
108     ~OutPort() override = default;
109     ErrorCode Connect(const std::shared_ptr<Port>& port) override;
110     ErrorCode Disconnect() override;
111     ErrorCode Activate(const std::vector<WorkMode>& modes, WorkMode& outMode) override;
112     std::shared_ptr<Port> GetPeerPort() override;
113     bool Negotiate(const std::shared_ptr<const Plugin::Capability>& upstreamCap,
114                    Plugin::Capability& negotiatedCap,
115                    const Plugin::Meta& upstreamParams,
116                    Plugin::Meta& downstreamParams) override;
117     bool Configure(const std::shared_ptr<const Plugin::Meta>& upstreamMeta, Plugin::Meta& upstreamParams,
118                    Plugin::Meta& downstreamParams) override;
119     void PushData(const AVBufferPtr& buffer, int64_t offset) override;
120     ErrorCode PullData(uint64_t offset, size_t size, AVBufferPtr& data) override;
121 
122 private:
123     bool InSamePipeline(const std::shared_ptr<Port>& port) const;
124 
125 private:
126     std::shared_ptr<Port> nextPort;
127 };
128 
129 class EmptyInPort : public InPort {
130 public:
GetInstance()131     static std::shared_ptr<InPort> GetInstance()
132     {
133         return port;
134     }
EmptyInPort()135     EmptyInPort() : InPort(nullptr, "emptyInPort") {}
136     ~EmptyInPort() override = default;
137     ErrorCode Connect(const std::shared_ptr<Port>& another) override;
138     ErrorCode Activate(const std::vector<WorkMode>& modes, WorkMode& outMode) override;
139     bool Negotiate(const std::shared_ptr<const Plugin::Capability>& upstreamCap,
140                    Plugin::Capability& negotiatedCap,
141                    const Plugin::Meta& upstreamParams,
142                    Plugin::Meta& downstreamParams) override;
143     bool Configure(const std::shared_ptr<const Plugin::Meta>& upstreamMeta, Plugin::Meta& upstreamParams,
144                    Plugin::Meta& downstreamParams) override;
145     void PushData(const AVBufferPtr& buffer, int64_t offset) override;
146     ErrorCode PullData(uint64_t offset, size_t size, AVBufferPtr& data) override;
147 
148 private:
149     static std::shared_ptr<InPort> port;
150 };
151 
152 class EmptyOutPort : public OutPort {
153 public:
GetInstance()154     static std::shared_ptr<OutPort> GetInstance()
155     {
156         return port;
157     }
EmptyOutPort()158     EmptyOutPort() : OutPort(nullptr, "emptyOutPort") {}
159     ~EmptyOutPort() override = default;
160     ErrorCode Connect(const std::shared_ptr<Port>& another) override;
161     ErrorCode Activate(const std::vector<WorkMode>& modes, WorkMode& outMode) override;
162     bool Negotiate(const std::shared_ptr<const Plugin::Capability>& upstreamCap,
163                    Plugin::Capability& negotiatedCap,
164                    const Plugin::Meta& upstreamParams,
165                    Plugin::Meta& downstreamParams) override;
166     bool Configure(const std::shared_ptr<const Plugin::Meta>& upstreamMeta, Plugin::Meta& upstreamParams,
167                    Plugin::Meta& downstreamParams) override;
168     void PushData(const AVBufferPtr& buffer, int64_t offset) override;
169     ErrorCode PullData(uint64_t offset, size_t size, AVBufferPtr& data) override;
170 
171 private:
172     static std::shared_ptr<OutPort> port;
173 };
174 } // namespace Pipeline
175 } // namespace Media
176 } // namespace OHOS
177 #endif // HISTREAMER_PIPELINE_CORE_PORT_H
178