• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
23 #include "foundation/error_code.h"
24 #include "utils/constants.h"
25 #include "utils/type_define.h"
26 #include "utils/utils.h"
27 #include "plugin/core/plugin_meta.h"
28 
29 namespace OHOS {
30 namespace Media {
31 namespace Pipeline {
32 class InfoTransfer;
33 
34 enum class WorkMode { PUSH, PULL };
35 
36 class Port {
37 public:
Port(InfoTransfer * ownerFilter,std::string portName)38     Port(InfoTransfer *ownerFilter, std::string portName)
39         : filter(ownerFilter), name(std::move(portName)) {}
40     virtual ~Port() = default;
41     const std::string& GetName();
42     const InfoTransfer* GetOwnerFilter() const;
43     virtual std::shared_ptr<Port> GetPeerPort();
GetWorkMode()44     WorkMode GetWorkMode()
45     {
46         return workMode;
47     }
48     virtual ErrorCode Connect(const std::shared_ptr<Port>& port) = 0;
49     virtual ErrorCode Disconnect() = 0;
50     virtual ErrorCode Activate(const std::vector<WorkMode>& modes, WorkMode& outMode) = 0;
51     virtual bool Negotiate(const std::shared_ptr<const Plugin::Capability>& upstreamCap,
52                            Plugin::Capability& negotiatedCap,
53                            const Plugin::TagMap& upstreamParams,
54                            Plugin::TagMap& downstreamParams) = 0;
55     virtual bool Configure(const std::shared_ptr<const Plugin::Meta> &upstreamMeta) = 0;
56     /**
57      * push data
58      * @param buffer pushed buffer
59      * @param offset means the offset from the start of the stream between Filter.Start and Filter.Stop. -1 means ignore
60      * this parameter.
61      */
62     virtual void PushData(AVBufferPtr buffer, int64_t offset) = 0;
63     virtual ErrorCode PullData(uint64_t offset, size_t size, AVBufferPtr& data) = 0;
64 
65 protected:
66     InfoTransfer* filter;
67     WorkMode workMode {WorkMode::PUSH};
68     const std::string name;
69 };
70 
71 class OutPort;
72 
73 class InPort : public Port {
74 public:
75     explicit InPort(InfoTransfer *filter, std::string name = PORT_NAME_DEFAULT)
Port(filter,std::move (name))76         : Port(filter, std::move(name)) {}
77     ~InPort() override = default;
78     ErrorCode Connect(const std::shared_ptr<Port>& port) override;
79     ErrorCode Disconnect() override;
80     ErrorCode Activate(const std::vector<WorkMode>& modes, WorkMode& outMode) override;
81     std::shared_ptr<Port> GetPeerPort() override;
82     bool Negotiate(const std::shared_ptr<const Plugin::Capability>& upstreamCap,
83                    Plugin::Capability& negotiatedCap,
84                    const Plugin::TagMap& upstreamParams,
85                    Plugin::TagMap& downstreamParams) override;
86     bool Configure(const std::shared_ptr<const Plugin::Meta>& upstreamMeta) override;
87     void PushData(AVBufferPtr buffer, int64_t offset) override;
88     ErrorCode PullData(uint64_t offset, size_t size, AVBufferPtr& data) override;
89 
90 private:
91     std::weak_ptr<Port> prevPort;
92 };
93 
94 class OutPort : public Port {
95 public:
96     explicit OutPort(InfoTransfer *filter, std::string name = PORT_NAME_DEFAULT)
Port(filter,std::move (name))97         : Port(filter, std::move(name)) {}
98     ~OutPort() override = default;
99     ErrorCode Connect(const std::shared_ptr<Port>& port) override;
100     ErrorCode Disconnect() override;
101     ErrorCode Activate(const std::vector<WorkMode>& modes, WorkMode& outMode) override;
102     std::shared_ptr<Port> GetPeerPort() override;
103     bool Negotiate(const std::shared_ptr<const Plugin::Capability>& upstreamCap,
104                    Plugin::Capability& negotiatedCap,
105                    const Plugin::TagMap& upstreamParams,
106                    Plugin::TagMap& downstreamParams) override;
107     bool Configure(const std::shared_ptr<const Plugin::Meta>& upstreamMeta) override;
108     void PushData(AVBufferPtr buffer, int64_t offset) override;
109     ErrorCode PullData(uint64_t offset, size_t size, AVBufferPtr& data) override;
110 
111 private:
112     bool InSamePipeline(const std::shared_ptr<Port>& port) const;
113 
114 private:
115     std::shared_ptr<Port> nextPort;
116 };
117 
118 class EmptyInPort : public InPort {
119 public:
GetInstance()120     static std::shared_ptr<InPort> GetInstance()
121     {
122         return port;
123     }
EmptyInPort()124     EmptyInPort() : InPort(nullptr, "emptyInPort") {}
125     ~EmptyInPort() override = default;
126     ErrorCode Connect(const std::shared_ptr<Port>& port) override;
127     ErrorCode Activate(const std::vector<WorkMode>& modes, WorkMode& outMode) override;
128     bool Negotiate(const std::shared_ptr<const Plugin::Capability>& upstreamCap,
129                    Plugin::Capability& negotiatedCap,
130                    const Plugin::TagMap& upstreamParams,
131                    Plugin::TagMap& downstreamParams) override;
132     bool Configure(const std::shared_ptr<const Plugin::Meta>& upstreamMeta) override;
133     void PushData(AVBufferPtr buffer, int64_t offset) override;
134     ErrorCode PullData(uint64_t offset, size_t size, AVBufferPtr& data) override;
135 
136 private:
137     static std::shared_ptr<InPort> port;
138 };
139 
140 class EmptyOutPort : public OutPort {
141 public:
GetInstance()142     static std::shared_ptr<OutPort> GetInstance()
143     {
144         return port;
145     }
EmptyOutPort()146     EmptyOutPort() : OutPort(nullptr, "emptyOutPort") {}
147     ~EmptyOutPort() override = default;
148     ErrorCode Connect(const std::shared_ptr<Port>& port) override;
149     ErrorCode Activate(const std::vector<WorkMode>& modes, WorkMode& outMode) override;
150     bool Negotiate(const std::shared_ptr<const Plugin::Capability>& upstreamCap,
151                    Plugin::Capability& negotiatedCap,
152                    const Plugin::TagMap& upstreamParams,
153                    Plugin::TagMap& downstreamParams) override;
154     bool Configure(const std::shared_ptr<const Plugin::Meta>& upstreamMeta) override;
155     void PushData(AVBufferPtr buffer, int64_t offset) override;
156     ErrorCode PullData(uint64_t offset, size_t size, AVBufferPtr& data) override;
157 
158 private:
159     static std::shared_ptr<OutPort> port;
160 };
161 } // namespace Pipeline
162 } // namespace Media
163 } // namespace OHOS
164 #endif // HISTREAMER_PIPELINE_CORE_PORT_H
165