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 #define HST_LOG_TAG "FilterPort"
17
18 #include "port.h"
19 #include <algorithm>
20 #include "filter.h"
21 #include "foundation/log.h"
22
23 namespace OHOS {
24 namespace Media {
25 namespace Pipeline {
26 std::shared_ptr<InPort> EmptyInPort::port = std::make_shared<EmptyInPort>();
27 std::shared_ptr<OutPort> EmptyOutPort::port = std::make_shared<EmptyOutPort>();
28
GetName()29 const std::string& Port::GetName()
30 {
31 return name;
32 }
33
GetOwnerFilter() const34 const InfoTransfer* Port::GetOwnerFilter() const
35 {
36 return filter;
37 }
38
GetPeerPort()39 std::shared_ptr<Port> Port::GetPeerPort()
40 {
41 return nullptr;
42 }
43
Connect(const std::shared_ptr<Port> & port)44 ErrorCode InPort::Connect(const std::shared_ptr<Port>& port)
45 {
46 prevPort = port;
47 return ErrorCode::SUCCESS;
48 }
49
Disconnect()50 ErrorCode InPort::Disconnect()
51 {
52 prevPort.reset();
53 return ErrorCode::SUCCESS;
54 }
55
Activate(const std::vector<WorkMode> & modes,WorkMode & outMode)56 ErrorCode InPort::Activate(const std::vector<WorkMode>& modes, WorkMode& outMode)
57 {
58 if (auto ptr = prevPort.lock()) {
59 FAIL_RETURN(ptr->Activate(modes, workMode));
60 outMode = workMode;
61 return ErrorCode::SUCCESS;
62 }
63 MEDIA_LOG_E("[Filter %" PUBLIC_LOG "s] InPort %" PUBLIC_LOG "s Activate error: prevPort destructed",
64 filter->GetName().c_str(), name.c_str());
65 return ErrorCode::ERROR_INVALID_PARAMETER_VALUE;
66 }
67
GetPeerPort()68 std::shared_ptr<Port> InPort::GetPeerPort()
69 {
70 return prevPort.lock();
71 }
72
Negotiate(const std::shared_ptr<const Plugin::Capability> & upstreamCap,Plugin::Capability & negotiatedCap,const Plugin::TagMap & upstreamParams,Plugin::TagMap & downstreamParams)73 bool InPort::Negotiate(const std::shared_ptr<const Plugin::Capability>& upstreamCap,
74 Plugin::Capability& negotiatedCap,
75 const Plugin::TagMap& upstreamParams,
76 Plugin::TagMap& downstreamParams)
77 {
78 return filter && filter->Negotiate(name, upstreamCap, negotiatedCap, upstreamParams, downstreamParams);
79 }
80
Configure(const std::shared_ptr<const Plugin::Meta> & upstreamMeta)81 bool InPort::Configure(const std::shared_ptr<const Plugin::Meta>& upstreamMeta)
82 {
83 return filter && filter->Configure(name, upstreamMeta);
84 }
85
86
PushData(AVBufferPtr buffer,int64_t offset)87 void InPort::PushData(AVBufferPtr buffer, int64_t offset)
88 {
89 if (filter) {
90 filter->PushData(name, buffer, offset);
91 } else {
92 MEDIA_LOG_E("filter destructed");
93 }
94 }
95
PullData(uint64_t offset,size_t size,AVBufferPtr & data)96 ErrorCode InPort::PullData(uint64_t offset, size_t size, AVBufferPtr& data)
97 {
98 if (auto ptr = prevPort.lock()) {
99 return ptr->PullData(offset, size, data);
100 }
101 MEDIA_LOG_E("prevPort destructed");
102 return ErrorCode::ERROR_INVALID_PARAMETER_VALUE;
103 }
104
Connect(const std::shared_ptr<Port> & port)105 ErrorCode OutPort::Connect(const std::shared_ptr<Port>& port)
106 {
107 if (InSamePipeline(port)) {
108 nextPort = port;
109 return ErrorCode::SUCCESS;
110 }
111 MEDIA_LOG_E("Connect filters that are not in the same pipeline.");
112 return ErrorCode::ERROR_INVALID_PARAMETER_VALUE;
113 }
114
Disconnect()115 ErrorCode OutPort::Disconnect()
116 {
117 nextPort.reset();
118 return ErrorCode::SUCCESS;
119 }
120
InSamePipeline(const std::shared_ptr<Port> & port) const121 bool OutPort::InSamePipeline(const std::shared_ptr<Port>& port) const
122 {
123 auto filter1 = GetOwnerFilter();
124 FALSE_RETURN_V(filter1 != nullptr, false);
125 auto filter2 = port->GetOwnerFilter();
126 FALSE_RETURN_V(filter2 != nullptr, false);
127 auto pipeline1 = filter1->GetOwnerPipeline();
128 FALSE_RETURN_V(pipeline1 != nullptr, false);
129 auto pipeline2 = filter2->GetOwnerPipeline();
130 FALSE_RETURN_V(pipeline2 != nullptr, false);
131 return pipeline1 == pipeline2;
132 }
133
Activate(const std::vector<WorkMode> & modes,WorkMode & outMode)134 ErrorCode OutPort::Activate(const std::vector<WorkMode>& modes, WorkMode& outMode)
135 {
136 if (filter) {
137 auto supportedModes = filter->GetWorkModes();
138 for (auto mode : modes) {
139 auto found = std::find(supportedModes.cbegin(), supportedModes.cend(), mode);
140 if (found != supportedModes.cend()) {
141 outMode = mode;
142 workMode = mode;
143 return ErrorCode::SUCCESS; // 最先找到的兼容的mode,作为最后结果
144 }
145 }
146 } else {
147 MEDIA_LOG_E("no valid filter");
148 }
149 MEDIA_LOG_E("negotiate failed");
150 return ErrorCode::ERROR_UNKNOWN;
151 }
152
GetPeerPort()153 std::shared_ptr<Port> OutPort::GetPeerPort()
154 {
155 return nextPort;
156 }
157
Negotiate(const std::shared_ptr<const Plugin::Capability> & upstreamCap,Plugin::Capability & negotiatedCap,const Plugin::TagMap & upstreamParams,Plugin::TagMap & downstreamParams)158 bool OutPort::Negotiate(const std::shared_ptr<const Plugin::Capability>& upstreamCap,
159 Plugin::Capability& negotiatedCap,
160 const Plugin::TagMap& upstreamParams,
161 Plugin::TagMap& downstreamParams)
162 {
163 return nextPort->Negotiate(upstreamCap, negotiatedCap, upstreamParams, downstreamParams);
164 }
165
Configure(const std::shared_ptr<const Plugin::Meta> & upstreamMeta)166 bool OutPort::Configure(const std::shared_ptr<const Plugin::Meta> &upstreamMeta)
167 {
168 return nextPort->Configure(upstreamMeta);
169 }
170
PushData(AVBufferPtr buffer,int64_t offset)171 void OutPort::PushData(AVBufferPtr buffer, int64_t offset)
172 {
173 nextPort->PushData(buffer, offset);
174 }
175
PullData(uint64_t offset,size_t size,AVBufferPtr & data)176 ErrorCode OutPort::PullData(uint64_t offset, size_t size, AVBufferPtr& data)
177 {
178 if (filter) {
179 return filter->PullData(name, offset, size, data);
180 }
181 MEDIA_LOG_E("filter destructed");
182 return ErrorCode::ERROR_INVALID_PARAMETER_VALUE;
183 }
184
Connect(const std::shared_ptr<Port> & port)185 ErrorCode EmptyInPort::Connect(const std::shared_ptr<Port> &port)
186 {
187 UNUSED_VARIABLE(port);
188 MEDIA_LOG_E("Connect in EmptyInPort");
189 return ErrorCode::SUCCESS;
190 }
191
Activate(const std::vector<WorkMode> & modes,WorkMode & outMode)192 ErrorCode EmptyInPort::Activate(const std::vector<WorkMode>& modes, WorkMode& outMode)
193 {
194 UNUSED_VARIABLE(modes);
195 UNUSED_VARIABLE(outMode);
196 MEDIA_LOG_E("Activate in EmptyInPort");
197 return ErrorCode::SUCCESS;
198 }
199
Negotiate(const std::shared_ptr<const Plugin::Capability> & upstreamCap,Plugin::Capability & negotiatedCap,const Plugin::TagMap & upstreamParams,Plugin::TagMap & downstreamParams)200 bool EmptyInPort::Negotiate(const std::shared_ptr<const Plugin::Capability>& upstreamCap,
201 Plugin::Capability& negotiatedCap,
202 const Plugin::TagMap& upstreamParams,
203 Plugin::TagMap& downstreamParams)
204 {
205 UNUSED_VARIABLE(upstreamCap);
206 UNUSED_VARIABLE(negotiatedCap);
207 UNUSED_VARIABLE(upstreamParams);
208 UNUSED_VARIABLE(downstreamParams);
209 MEDIA_LOG_E("Negotiate in EmptyInPort");
210 return false;
211 }
212
Configure(const std::shared_ptr<const Plugin::Meta> & upstreamMeta)213 bool EmptyInPort::Configure(const std::shared_ptr<const Plugin::Meta>& upstreamMeta)
214 {
215 UNUSED_VARIABLE(upstreamMeta);
216 MEDIA_LOG_E("Configure in EmptyInPort");
217 return false;
218 }
219
PushData(AVBufferPtr buffer,int64_t offset)220 void EmptyInPort::PushData(AVBufferPtr buffer, int64_t offset)
221 {
222 UNUSED_VARIABLE(buffer);
223 UNUSED_VARIABLE(offset);
224 MEDIA_LOG_E("PushData in EmptyInPort");
225 }
PullData(uint64_t offset,size_t size,AVBufferPtr & data)226 ErrorCode EmptyInPort::PullData(uint64_t offset, size_t size, AVBufferPtr& data)
227 {
228 UNUSED_VARIABLE(offset);
229 UNUSED_VARIABLE(size);
230 UNUSED_VARIABLE(data);
231 MEDIA_LOG_E("PullData in EmptyInPort");
232 return ErrorCode::ERROR_UNIMPLEMENTED;
233 }
234
Connect(const std::shared_ptr<Port> & port)235 ErrorCode EmptyOutPort::Connect(const std::shared_ptr<Port> &port)
236 {
237 UNUSED_VARIABLE(port);
238 MEDIA_LOG_E("Connect in EmptyOutPort");
239 return ErrorCode::SUCCESS;
240 }
Activate(const std::vector<WorkMode> & modes,WorkMode & outMode)241 ErrorCode EmptyOutPort::Activate(const std::vector<WorkMode>& modes, WorkMode& outMode)
242 {
243 UNUSED_VARIABLE(modes);
244 UNUSED_VARIABLE(outMode);
245 MEDIA_LOG_E("Activate in EmptyOutPort");
246 return ErrorCode::SUCCESS;
247 }
Negotiate(const std::shared_ptr<const Plugin::Capability> & upstreamCap,Plugin::Capability & negotiatedCap,const Plugin::TagMap & upstreamParams,Plugin::TagMap & downstreamParams)248 bool EmptyOutPort::Negotiate(const std::shared_ptr<const Plugin::Capability>& upstreamCap,
249 Plugin::Capability& negotiatedCap,
250 const Plugin::TagMap& upstreamParams,
251 Plugin::TagMap& downstreamParams)
252 {
253 UNUSED_VARIABLE(upstreamCap);
254 UNUSED_VARIABLE(negotiatedCap);
255 UNUSED_VARIABLE(upstreamParams);
256 UNUSED_VARIABLE(downstreamParams);
257 MEDIA_LOG_E("Negotiate in EmptyOutPort");
258 return false;
259 }
260
Configure(const std::shared_ptr<const Plugin::Meta> & upstreamMeta)261 bool EmptyOutPort::Configure(const std::shared_ptr<const Plugin::Meta>& upstreamMeta)
262 {
263 UNUSED_VARIABLE(upstreamMeta);
264 MEDIA_LOG_E("Configure in EmptyOutPort");
265 return false;
266 }
267
PushData(AVBufferPtr buffer,int64_t offset)268 void EmptyOutPort::PushData(AVBufferPtr buffer, int64_t offset)
269 {
270 UNUSED_VARIABLE(buffer);
271 UNUSED_VARIABLE(offset);
272 MEDIA_LOG_E("PushData in EmptyOutPort");
273 }
PullData(uint64_t offset,size_t size,AVBufferPtr & data)274 ErrorCode EmptyOutPort::PullData(uint64_t offset, size_t size, AVBufferPtr& data)
275 {
276 UNUSED_VARIABLE(offset);
277 UNUSED_VARIABLE(size);
278 UNUSED_VARIABLE(data);
279 MEDIA_LOG_E("PullData in EmptyOutPort");
280 return ErrorCode::ERROR_UNIMPLEMENTED;
281 }
282 } // namespace Pipeline
283 } // namespace Media
284 } // namespace OHOS
285