• 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 #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