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