• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023-2023 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;
88 };
89 
90 class FilterCallback {
91 public:
92     virtual ~FilterCallback() = default;
93     virtual Status OnCallback(const std::shared_ptr<Filter>& filter, FilterCallBackCommand cmd, StreamType outType) = 0;
94 };
95 
96 class FilterLinkCallback {
97 public:
98     virtual ~FilterLinkCallback() = default;
99     virtual void OnLinkedResult(const sptr<AVBufferQueueProducer>& queue, std::shared_ptr<Meta>& meta) = 0;
100     virtual void OnUnlinkedResult(std::shared_ptr<Meta>& meta) = 0;
101     virtual void OnUpdatedResult(std::shared_ptr<Meta>& meta) = 0;
102 };
103 
104 class Filter {
105 public:
106     explicit Filter(std::string name, FilterType type, bool asyncMode = false);
107 
108     virtual ~Filter();
109 
110     virtual void Init(const std::shared_ptr<EventReceiver>& receiver, const std::shared_ptr<FilterCallback>& callback);
111 
112     virtual void LinkPipeLine(const std::string &groupId) final;
113 
114     virtual Status Prepare() final;
115 
116     virtual Status Start() final;
117 
118     virtual Status Pause() final;
119 
120     virtual Status PauseDragging() final;
121 
122     virtual Status PauseAudioAlign() final;
123 
124     virtual Status Resume() final;
125 
126     virtual Status ResumeDragging() final;
127 
128     virtual Status ResumeAudioAlign() final;
129 
130     virtual Status Stop() final;
131 
132     virtual Status Flush() final;
133 
134     virtual Status Release() final;
135 
136     virtual Status Preroll() final;
137 
138     virtual Status WaitPrerollDone(bool render) final;
139 
140     virtual void StartFilterTask() final;
141 
142     virtual void PauseFilterTask() final;
143 
144     virtual Status SetPlayRange(int64_t start, int64_t end) final;
145 
146     virtual Status ProcessInputBuffer(int sendArg = 0, int64_t delayUs = 0) final;
147 
148     virtual Status ProcessOutputBuffer(int sendArg = 0, int64_t delayUs = 0, bool byIdx = false, uint32_t idx = 0,
149         int64_t renderTime = -1) final;
150 
151     virtual Status WaitAllState(FilterState state) final;
152 
153     virtual Status DoInitAfterLink();
154 
155     virtual Status DoPrepare();
156 
157     virtual Status DoStart();
158 
159     virtual Status DoPause();
160 
161     virtual Status DoPauseDragging();
162 
163     virtual Status DoPauseAudioAlign();
164 
165     virtual Status DoResume();
166 
167     virtual Status DoResumeDragging();
168 
169     virtual Status DoResumeAudioAlign();
170 
171     virtual Status DoStop();
172 
173     virtual Status DoFlush();
174 
175     virtual Status DoRelease();
176 
177     virtual Status DoPreroll();
178 
179     virtual Status DoWaitPrerollDone(bool render);
180 
181     virtual Status DoSetPlayRange(int64_t start, int64_t end);
182 
183     virtual Status DoProcessInputBuffer(int recvArg, bool dropFrame);
184 
185     virtual Status DoProcessOutputBuffer(int recvArg, bool dropFrame, bool byIdx, uint32_t idx, int64_t renderTime);
186 
187     virtual void SetParameter(const std::shared_ptr<Meta>& meta);
188 
189     virtual void GetParameter(std::shared_ptr<Meta>& meta);
190 
191     virtual Status LinkNext(const std::shared_ptr<Filter>& nextFilter, StreamType outType);
192 
193     virtual Status UpdateNext(const std::shared_ptr<Filter>& nextFilter, StreamType outType);
194 
195     virtual Status UnLinkNext(const std::shared_ptr<Filter>& nextFilter, StreamType outType);
196 
197     FilterType GetFilterType();
198 
199     virtual Status OnLinked(StreamType inType, const std::shared_ptr<Meta>& meta,
200                             const std::shared_ptr<FilterLinkCallback>& callback);
201 
202     virtual Status OnUpdated(StreamType inType, const std::shared_ptr<Meta>& meta,
203                              const std::shared_ptr<FilterLinkCallback>& callback);
204 
205     virtual Status OnUnLinked(StreamType inType, const std::shared_ptr<FilterLinkCallback>& callback);
206 
207     virtual Status ClearAllNextFilters();
208 
SetMuted(bool isMuted)209     virtual Status SetMuted(bool isMuted)
210     {
211         (void)isMuted;
212         return Status::OK;
213     }
214 protected:
215     std::string name_;
216 
217     std::shared_ptr<Meta> meta_;
218 
219     FilterType filterType_;
220 
221     std::vector<StreamType> supportedInStreams_;
222     std::vector<StreamType> supportedOutStreams_;
223 
224     std::map<StreamType, std::vector<std::shared_ptr<Filter>>> nextFiltersMap_;
225 
226     std::shared_ptr<EventReceiver> receiver_;
227 
228     std::shared_ptr<FilterCallback> callback_;
229 
230     std::map<StreamType, std::vector<std::shared_ptr<FilterLinkCallback>>> linkCallbackMaps_;
231 
232     std::string groupId_;
233 
234 private:
235     void ChangeState(FilterState state);
236 
237     void SetErrCode(Status errCode);
238 
239     Status GetErrCode();
240 
241     Status PrepareDone();
242 
243     Status StartDone();
244 
245     Status PauseDone();
246 
247     Status ResumeDone();
248 
249     Status StopDone();
250 
251     Status ReleaseDone();
252 
253     OHOS::Media::Mutex stateMutex_{};
254 
255     OHOS::Media::ConditionVariable cond_{};
256 
257     FilterState curState_{FilterState::CREATED};
258 
259     Status errCode_ = Status::OK;
260 
261     int64_t jobIdx_ = 0;
262 
263     int64_t processIdx_ = 0;
264 
265     int64_t jobIdxBase_ = 0;
266 
267     std::unique_ptr<Task> filterTask_;
268 
269     bool isAsyncMode_;
270 };
271 } // namespace Pipeline
272 } // namespace Media
273 } // namespace OHOS
274 #endif
275