1 /*
2  * Copyright (c) 2024 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 IE_PIPELINE_CORE_FILTER_BASE_H
17 #define IE_PIPELINE_CORE_FILTER_BASE_H
18 
19 #include <atomic>
20 
21 #include "filter.h"
22 #include "filter_type.h"
23 #include "image_effect_marco_define.h"
24 
25 #define GET_FILTER_NAME(T) #T
26 
27 namespace OHOS {
28 namespace Media {
29 namespace Effect {
30 class FilterBase : public Filter {
31 public:
32     IMAGE_EFFECT_EXPORT explicit FilterBase(std::string name);
33 
34     IMAGE_EFFECT_EXPORT ~FilterBase() override;
35 
36     IMAGE_EFFECT_EXPORT void Initialize(EventReceiver *receiver) override;
37 
38     IMAGE_EFFECT_EXPORT PInPort GetInPort(const std::string &name) override;
39 
40     IMAGE_EFFECT_EXPORT POutPort GetOutPort(const std::string &name) override;
41 
GetName()42     const std::string &GetName() override
43     {
44         return name_;
45     }
46 
GetWorkModes()47     std::vector<WorkMode> GetWorkModes() override
48     {
49         return { WorkMode::PUSH };
50     }
51 
52     void Negotiate(const std::string& inPort, const std::shared_ptr<Capability> &capability,
53         std::shared_ptr<EffectContext> &context) override;
54 
55     ErrorCode PushData(const std::string &inPort, const std::shared_ptr<EffectBuffer> &buffer,
56         std::shared_ptr<EffectContext> &context) override;
57 
58     ErrorCode PullData(const std::string &outPort, std::shared_ptr<EffectBuffer> &data) override;
59 
GetOwnerPipeline()60     const EventReceiver *GetOwnerPipeline() const override
61     {
62         return eventReceiver_;
63     }
64 
65     IMAGE_EFFECT_EXPORT ErrorCode Prepare() override;
66 
67     IMAGE_EFFECT_EXPORT ErrorCode Start() override;
68 
SetParameter(int32_t key,const Media::Plugin::Any & value)69     ErrorCode SetParameter(int32_t key, const Media::Plugin::Any &value) override
70     {
71         return ErrorCode::ERR_UNIMPLEMENTED;
72     }
73 
GetParameter(int32_t key,Media::Plugin::Any & value)74     ErrorCode GetParameter(int32_t key, Media::Plugin::Any &value) override
75     {
76         return ErrorCode::ERR_UNIMPLEMENTED;
77     }
78 
79     IMAGE_EFFECT_EXPORT void UnlinkPrevFilters() override;
80 
81     IMAGE_EFFECT_EXPORT std::vector<Filter *> GetNextFilters() override;
82 
83     IMAGE_EFFECT_EXPORT std::vector<Filter *> GetPreFilters() override;
84 
85     // Port调用此方法向Filter报告事件
86     IMAGE_EFFECT_EXPORT void OnEvent(const Event &event) override;
87 
88     template <typename T> static T FindPort(const std::vector<T> &ports, const std::string &name);
89 
90 protected:
91     IMAGE_EFFECT_EXPORT virtual void InitPorts();
92 
93     std::string NamePort(const std::string &mime);
94 
95     /**
96      * Get in-port from routeMap_ by outPortName.
97      *
98      * @param outPortName out-port name
99      * @return null if not exists
100      */
101     PInPort GetRouteInPort(const std::string &outPortName);
102 
103     /**
104      * Get out-port from routeMap_ by inPortName.
105      *
106      * @param inPortName in-port name
107      * @return null if not exists
108      */
109     POutPort GetRouteOutPort(const std::string &inPortName);
110 
111     std::string name_;
112 
113     std::atomic<FilterState> state_;
114 
115     EventReceiver *eventReceiver_;
116 
117     std::vector<PFilter> children_{};
118 
119     std::vector<PInPort> inPorts_{};
120 
121     std::vector<POutPort> outPorts_{};
122 
123     std::vector<PairPort> routeMap_{}; // inport -> outport
124 
125     std::map<std::string, uint32_t> portTypeCntMap_{};
126 
127     FilterType filterType_{ FilterType::NONE };
128 
129     std::shared_ptr<EffectBuffer> sinkBuffer_{ nullptr };
130 };
131 } // namespace Effect
132 } // namespace Media
133 } // namespace OHOS
134 #endif
135