• 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 "error_code.h"
24 #include "utils/constants.h"
25 #include "type_define.h"
26 #include "plugin/core/plugin_meta.h"
27 
28 namespace OHOS {
29 namespace Media {
30 namespace Pipeline {
31 class InfoTransfer;
32 
33 enum class WorkMode { PUSH, PULL };
34 
35 class Port {
36 public:
Port(InfoTransfer * ownerFilter,std::string portName)37     Port(InfoTransfer *ownerFilter, std::string portName)
38         : filter(ownerFilter), name(std::move(portName)) {}
39     virtual ~Port() = default;
40     const std::string& GetName();
41     const InfoTransfer* GetOwnerFilter() const;
42     virtual std::shared_ptr<Port> GetPeerPort();
GetWorkMode()43     WorkMode GetWorkMode()
44     {
45         return workMode;
46     }
47     virtual ErrorCode Connect(const std::shared_ptr<Port>& port) = 0;
48     virtual ErrorCode Disconnect() = 0;
49     virtual ErrorCode Activate(const std::vector<WorkMode>& modes, WorkMode& outMode) = 0;
50     virtual bool Negotiate(const std::shared_ptr<const Plugin::Capability>& upstreamCap,
51                            Plugin::Capability& negotiatedCap,
52                            const Plugin::TagMap& upstreamParams,
53                            Plugin::TagMap& downstreamParams) = 0;
54     virtual bool Configure(const std::shared_ptr<const Plugin::Meta> &upstreamMeta, Plugin::TagMap &upstreamParams,
55                            Plugin::TagMap &downstreamParams) = 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(const 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, Plugin::TagMap &upstreamParams,
87                    Plugin::TagMap &downstreamParams) override;
88     void PushData(const AVBufferPtr& buffer, int64_t offset) override;
89     ErrorCode PullData(uint64_t offset, size_t size, AVBufferPtr& data) override;
90 
91 private:
92     std::weak_ptr<Port> prevPort;
93 };
94 
95 class OutPort : public Port {
96 public:
97     explicit OutPort(InfoTransfer *filter, std::string name = PORT_NAME_DEFAULT)
Port(filter,std::move (name))98         : Port(filter, std::move(name)) {}
99     ~OutPort() override = default;
100     ErrorCode Connect(const std::shared_ptr<Port>& port) override;
101     ErrorCode Disconnect() override;
102     ErrorCode Activate(const std::vector<WorkMode>& modes, WorkMode& outMode) override;
103     std::shared_ptr<Port> GetPeerPort() override;
104     bool Negotiate(const std::shared_ptr<const Plugin::Capability>& upstreamCap,
105                    Plugin::Capability& negotiatedCap,
106                    const Plugin::TagMap& upstreamParams,
107                    Plugin::TagMap& downstreamParams) override;
108     bool Configure(const std::shared_ptr<const Plugin::Meta> &upstreamMeta, Plugin::TagMap &upstreamParams,
109                    Plugin::TagMap &downstreamParams) override;
110     void PushData(const AVBufferPtr& buffer, int64_t offset) override;
111     ErrorCode PullData(uint64_t offset, size_t size, AVBufferPtr& data) override;
112 
113 private:
114     bool InSamePipeline(const std::shared_ptr<Port>& port) const;
115 
116 private:
117     std::shared_ptr<Port> nextPort;
118 };
119 
120 class EmptyInPort : public InPort {
121 public:
GetInstance()122     static std::shared_ptr<InPort> GetInstance()
123     {
124         return port;
125     }
EmptyInPort()126     EmptyInPort() : InPort(nullptr, "emptyInPort") {}
127     ~EmptyInPort() override = default;
128     ErrorCode Connect(const std::shared_ptr<Port>& another) override;
129     ErrorCode Activate(const std::vector<WorkMode>& modes, WorkMode& outMode) override;
130     bool Negotiate(const std::shared_ptr<const Plugin::Capability>& upstreamCap,
131                    Plugin::Capability& negotiatedCap,
132                    const Plugin::TagMap& upstreamParams,
133                    Plugin::TagMap& downstreamParams) override;
134     bool Configure(const std::shared_ptr<const Plugin::Meta> &upstreamMeta, Plugin::TagMap &upstreamParams,
135                    Plugin::TagMap &downstreamParams) override;
136     void PushData(const AVBufferPtr& buffer, int64_t offset) override;
137     ErrorCode PullData(uint64_t offset, size_t size, AVBufferPtr& data) override;
138 
139 private:
140     static std::shared_ptr<InPort> port;
141 };
142 
143 class EmptyOutPort : public OutPort {
144 public:
GetInstance()145     static std::shared_ptr<OutPort> GetInstance()
146     {
147         return port;
148     }
EmptyOutPort()149     EmptyOutPort() : OutPort(nullptr, "emptyOutPort") {}
150     ~EmptyOutPort() override = default;
151     ErrorCode Connect(const std::shared_ptr<Port>& another) override;
152     ErrorCode Activate(const std::vector<WorkMode>& modes, WorkMode& outMode) override;
153     bool Negotiate(const std::shared_ptr<const Plugin::Capability>& upstreamCap,
154                    Plugin::Capability& negotiatedCap,
155                    const Plugin::TagMap& upstreamParams,
156                    Plugin::TagMap& downstreamParams) override;
157     bool Configure(const std::shared_ptr<const Plugin::Meta> &upstreamMeta, Plugin::TagMap &upstreamParams,
158                    Plugin::TagMap &downstreamParams) override;
159     void PushData(const AVBufferPtr& buffer, int64_t offset) override;
160     ErrorCode PullData(uint64_t offset, size_t size, AVBufferPtr& data) override;
161 
162 private:
163     static std::shared_ptr<OutPort> port;
164 };
165 } // namespace Pipeline
166 } // namespace Media
167 } // namespace OHOS
168 #endif // HISTREAMER_PIPELINE_CORE_PORT_H
169