1 /* 2 * Copyright (c) 2021-2021 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_PIPELINE_CORE_H 17 #define HISTREAMER_PIPELINE_CORE_PIPELINE_CORE_H 18 19 #include <algorithm> 20 #include <atomic> 21 #include <functional> 22 #include <initializer_list> 23 #include <memory> 24 #include <string> 25 #include <vector> 26 #include <stack> 27 28 #include "filter_base.h" 29 #include "error_code.h" 30 #include "osal/thread/mutex.h" 31 #include "plugin/common/plugin_types.h" 32 #include "plugin/core/plugin_meta.h" 33 #include "pipeline.h" 34 35 namespace OHOS { 36 namespace Media { 37 namespace Pipeline { 38 class MetaBundle { 39 public: 40 MetaBundle() = default; 41 ~MetaBundle() = default; GetGlobalMeta()42 std::shared_ptr<const Plugin::Meta> GetGlobalMeta() 43 { 44 return globalMeta_; 45 } 46 47 std::shared_ptr<const Plugin::Meta> GeTrackMeta(int32_t trackId); 48 49 void UpdateGlobalMeta(const Plugin::Meta& meta); 50 51 void UpdateTrackMeta(const Plugin::Meta& meta); 52 53 private: 54 std::shared_ptr<Plugin::Meta> globalMeta_; 55 std::vector<std::shared_ptr<Plugin::Meta>> trackMeta_; 56 }; 57 58 class PipelineCore : public Pipeline { 59 public: 60 explicit PipelineCore(const std::string& name = "pipeline_core"); 61 62 ~PipelineCore() override = default; 63 64 const std::string& GetName() override; 65 66 const EventReceiver* GetOwnerPipeline() const override; 67 68 void Init(EventReceiver* receiver, FilterCallback* callback) override; 69 70 ErrorCode Prepare() override; 71 72 ErrorCode Start() override; 73 74 ErrorCode Pause() override; 75 76 ErrorCode Resume() override; 77 78 ErrorCode Stop() override; 79 80 void FlushStart() override; 81 82 void FlushEnd() override; 83 84 FilterState GetState(); 85 86 ErrorCode AddFilters(std::initializer_list<Filter*> filtersIn) override; 87 ErrorCode RemoveFilter(Filter* filter) override; 88 ErrorCode RemoveFilterChain(Filter* firstFilter) override; 89 ErrorCode LinkFilters(std::initializer_list<Filter*> filters) override; 90 ErrorCode LinkPorts(std::shared_ptr<OutPort> port1, std::shared_ptr<InPort> port2) override; 91 92 void OnEvent(const Event& event) override; 93 UnlinkPrevFilters()94 void UnlinkPrevFilters() override 95 { 96 } GetNextFilters()97 std::vector<Filter*> GetNextFilters() override 98 { 99 return {}; 100 } GetPreFilters()101 std::vector<Filter*> GetPreFilters() override 102 { 103 return {}; 104 } PushData(const std::string & inPort,const AVBufferPtr & buffer,int64_t offset)105 ErrorCode PushData(const std::string& inPort, const AVBufferPtr& buffer, int64_t offset) override 106 { 107 UNUSED_VARIABLE(inPort); 108 UNUSED_VARIABLE(buffer); 109 UNUSED_VARIABLE(offset); 110 return ErrorCode::ERROR_UNIMPLEMENTED; 111 } PullData(const std::string & outPort,uint64_t offset,size_t size,AVBufferPtr & data)112 ErrorCode PullData(const std::string& outPort, uint64_t offset, size_t size, AVBufferPtr& data) override 113 { 114 UNUSED_VARIABLE(outPort); 115 UNUSED_VARIABLE(offset); 116 UNUSED_VARIABLE(size); 117 UNUSED_VARIABLE(data); 118 return ErrorCode::ERROR_UNIMPLEMENTED; 119 } GetWorkModes()120 std::vector<WorkMode> GetWorkModes() override 121 { 122 return {WorkMode::PUSH}; 123 } 124 GetInPort(const std::string & name)125 PInPort GetInPort(const std::string& name) override 126 { 127 UNUSED_VARIABLE(name); 128 return nullptr; 129 } GetOutPort(const std::string & name)130 POutPort GetOutPort(const std::string& name) override 131 { 132 UNUSED_VARIABLE(name); 133 return nullptr; 134 } 135 SetParameter(int32_t key,const Plugin::Any & value)136 ErrorCode SetParameter(int32_t key, const Plugin::Any& value) override 137 { 138 UNUSED_VARIABLE(key); 139 UNUSED_VARIABLE(value); 140 return ErrorCode::ERROR_UNIMPLEMENTED; 141 } GetParameter(int32_t key,Plugin::Any & value)142 ErrorCode GetParameter(int32_t key, Plugin::Any& value) override 143 { 144 UNUSED_VARIABLE(key); 145 UNUSED_VARIABLE(value); 146 return ErrorCode::ERROR_UNIMPLEMENTED; 147 } 148 149 void SetSyncCenter(std::weak_ptr<IMediaSyncCenter> syncCenter) final; 150 151 void InitFilters(const std::vector<Filter*>& filters); 152 GetMetaBundle()153 std::shared_ptr<MetaBundle> GetMetaBundle() 154 { 155 return metaBundle_; 156 } 157 158 private: 159 void ReorderFilters(); 160 161 void NotifyEvent(const Event& event); 162 163 std::string name_; 164 size_t readyEventCnt_ {0}; 165 FilterState state_ {FilterState::CREATED}; 166 OSAL::Mutex mutex_ {}; 167 std::vector<Filter*> filters_ {}; 168 EventReceiver* eventReceiver_; 169 FilterCallback* filterCallback_; 170 std::shared_ptr<MetaBundle> metaBundle_; 171 std::vector<Filter*> filtersToRemove_ {}; 172 std::weak_ptr<IMediaSyncCenter> syncCenter_ {}; 173 }; 174 } // namespace Pipeline 175 } // namespace Media 176 } // namespace OHOS 177 #endif // HISTREAMER_PIPELINE_CORE_PIPELINE_CORE_H 178