• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023-2025 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_FILTER_BASE_H
17 #define HISTREAMER_PIPELINE_CORE_FILTER_BASE_H
18 #include <atomic>
19 #include <functional>
20 #include <list>
21 #include <memory>
22 #include "meta/meta.h"
23 #include "buffer/avbuffer_queue_producer.h"
24 #include "common/event.h"
25 #include "osal/task/mutex.h"
26 #include "osal/task/condition_variable.h"
27 #include "osal/task/task.h"
28 
29 namespace OHOS {
30 namespace Media {
31 namespace Pipeline {
32 
33 class Filter;
34 
35 enum class FilterType {
36     FILTERTYPE_SOURCE,
37     FILTERTYPE_DEMUXER,
38     FILTERTYPE_AENC,
39     FILTERTYPE_ADEC,
40     FILTERTYPE_VENC,
41     FILTERTYPE_VDEC,
42     FILTERTYPE_MUXER,
43     FILTERTYPE_VIDEODEC,
44     FILTERTYPE_ASINK,
45     FILTERTYPE_FSINK,
46     FILTERTYPE_SSINK,
47     AUDIO_CAPTURE,
48     AUDIO_DATA_SOURCE,
49     VIDEO_CAPTURE,
50     FILTERTYPE_VIDRESIZE,
51     TIMED_METADATA,
52     FILTERTYPE_MAX,
53 };
54 
55 enum class StreamType {
56     STREAMTYPE_PACKED,
57     STREAMTYPE_ENCODED_AUDIO,
58     STREAMTYPE_ENCODED_VIDEO,
59     STREAMTYPE_RAW_AUDIO,
60     STREAMTYPE_RAW_VIDEO,
61     STREAMTYPE_SUBTITLE,
62     STREAMTYPE_MAX,
63 };
64 
65 enum class FilterState {
66     CREATED,     // Filter created
67     INITIALIZED, // Init called
68     PREPARING,   // Prepare called
69     READY,       // Ready Event reported
70     RUNNING,     // Start called
71     PAUSED,      // Pause called
72     STOPPED,     // Stop called
73     RELEASED,    // Release called
74     ERROR,       // State fail
75 };
76 
77 enum class FilterCallBackCommand {
78     NEXT_FILTER_NEEDED,
79     NEXT_FILTER_REMOVED,
80     NEXT_FILTER_UPDATE,
81     FILTER_CALLBACK_COMMAND_MAX,
82 };
83 
84 class EventReceiver {
85 public:
86     virtual ~EventReceiver() = default;
87     virtual void OnEvent(const Event& event) = 0;
OnDfxEvent(const DfxEvent & event)88     virtual void OnDfxEvent(const DfxEvent& event)
89     {
90         (void)event;
91     }
NotifyRelease()92     virtual void NotifyRelease() {}
93 };
94 
95 class FilterCallback {
96 public:
97     virtual ~FilterCallback() = default;
98     virtual Status OnCallback(const std::shared_ptr<Filter>& filter, FilterCallBackCommand cmd, StreamType outType) = 0;
NotifyRelease()99     virtual void NotifyRelease() {}
100 };
101 
102 class FilterLinkCallback {
103 public:
104     virtual ~FilterLinkCallback() = default;
105     virtual void OnLinkedResult(const sptr<AVBufferQueueProducer>& queue, std::shared_ptr<Meta>& meta) = 0;
106     virtual void OnUnlinkedResult(std::shared_ptr<Meta>& meta) = 0;
107     virtual void OnUpdatedResult(std::shared_ptr<Meta>& meta) = 0;
108 };
109 
110 class Filter {
111 public:
112     explicit Filter(std::string name, FilterType type, bool asyncMode = false);
113 
114     virtual ~Filter();
115 
116     virtual void Init(const std::shared_ptr<EventReceiver>& receiver, const std::shared_ptr<FilterCallback>& callback);
117 
118     virtual void LinkPipeLine(const std::string &groupId, bool needTurbo = false) final;
119 
120     virtual Status Prepare() final;
121 
122     virtual Status Start() final;
123 
124     virtual Status Pause() final;
125 
126     virtual Status PauseDragging() final;
127 
128     virtual Status PauseAudioAlign() final;
129 
130     virtual Status Resume() final;
131 
132     virtual Status ResumeDragging() final;
133 
134     virtual Status ResumeAudioAlign() final;
135 
136     virtual Status Stop() final;
137 
138     virtual Status Flush() final;
139 
140     virtual Status Release() final;
141 
142     virtual Status Preroll() final;
143 
144     virtual Status WaitPrerollDone(bool render) final;
145 
146     virtual void StartFilterTask() final;
147 
148     virtual void PauseFilterTask() final;
149 
150     virtual Status SetPlayRange(int64_t start, int64_t end) final;
151 
152     virtual Status ProcessInputBuffer(int sendArg = 0, int64_t delayUs = 0) final;
153 
154     virtual Status ProcessOutputBuffer(int sendArg = 0, int64_t delayUs = 0, bool byIdx = false, uint32_t idx = 0,
155         int64_t renderTime = -1) final;
156 
157     virtual Status WaitAllState(FilterState state) final;
158 
159     virtual Status SetPerfRecEnabled(bool isPerfRecEnabled) final;
160 
161     virtual Status DoSetPerfRecEnabled(bool isPerfRecEnabled);
162 
163     virtual Status DoInitAfterLink();
164 
165     virtual Status DoPrepare();
166 
167     virtual Status DoStart();
168 
169     virtual Status DoPause();
170 
171     virtual Status DoPauseDragging();
172 
173     virtual Status DoPauseAudioAlign();
174 
175     virtual Status DoResume();
176 
177     virtual Status DoResumeDragging();
178 
179     virtual Status DoResumeAudioAlign();
180 
181     virtual Status DoStop();
182 
183     virtual Status DoFlush();
184 
185     virtual Status DoRelease();
186 
187     virtual Status DoPreroll();
188 
189     virtual Status DoWaitPrerollDone(bool render);
190 
191     virtual Status DoSetPlayRange(int64_t start, int64_t end);
192 
193     virtual Status DoProcessInputBuffer(int recvArg, bool dropFrame);
194 
195     virtual Status DoProcessOutputBuffer(int recvArg, bool dropFrame, bool byIdx, uint32_t idx, int64_t renderTime);
196 
197     virtual void SetParameter(const std::shared_ptr<Meta>& meta);
198 
199     virtual void GetParameter(std::shared_ptr<Meta>& meta);
200 
201     virtual Status LinkNext(const std::shared_ptr<Filter>& nextFilter, StreamType outType);
202 
203     virtual Status UpdateNext(const std::shared_ptr<Filter>& nextFilter, StreamType outType);
204 
205     virtual Status UnLinkNext(const std::shared_ptr<Filter>& nextFilter, StreamType outType);
206 
207     FilterType GetFilterType();
208 
209     virtual Status OnLinked(StreamType inType, const std::shared_ptr<Meta>& meta,
210                             const std::shared_ptr<FilterLinkCallback>& callback);
211 
212     virtual Status OnUpdated(StreamType inType, const std::shared_ptr<Meta>& meta,
213                              const std::shared_ptr<FilterLinkCallback>& callback);
214 
215     virtual Status OnUnLinked(StreamType inType, const std::shared_ptr<FilterLinkCallback>& callback);
216 
217     virtual Status ClearAllNextFilters();
218 
SetMuted(bool isMuted)219     virtual Status SetMuted(bool isMuted)
220     {
221         (void)isMuted;
222         return Status::OK;
223     }
224 protected:
225     std::string name_;
226 
227     std::shared_ptr<Meta> meta_;
228 
229     FilterType filterType_;
230 
231     std::vector<StreamType> supportedInStreams_;
232     std::vector<StreamType> supportedOutStreams_;
233 
234     std::map<StreamType, std::vector<std::shared_ptr<Filter>>> nextFiltersMap_;
235 
236     std::shared_ptr<EventReceiver> receiver_;
237 
238     std::shared_ptr<FilterCallback> callback_;
239 
240     std::map<StreamType, std::vector<std::shared_ptr<FilterLinkCallback>>> linkCallbackMaps_;
241 
242     std::string groupId_;
243 
244     bool isPerfRecEnabled_ { false };
245 
246 private:
247     void ChangeState(FilterState state);
248 
249     void SetErrCode(Status errCode);
250 
251     Status GetErrCode();
252 
253     Status PrepareDone();
254 
255     Status StartDone();
256 
257     Status PauseDone();
258 
259     Status ResumeDone();
260 
261     Status StopDone();
262 
263     Status ReleaseDone();
264 
265     OHOS::Media::Mutex stateMutex_{};
266 
267     OHOS::Media::ConditionVariable cond_{};
268 
269     FilterState curState_{FilterState::CREATED};
270 
271     Status errCode_ = Status::OK;
272 
273     int64_t jobIdx_ = 0;
274 
275     int64_t processIdx_ = 0;
276 
277     int64_t jobIdxBase_ = 0;
278 
279     std::unique_ptr<Task> filterTask_;
280 
281     bool isAsyncMode_;
282 };
283 } // namespace Pipeline
284 } // namespace Media
285 } // namespace OHOS
286 #endif
287