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