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_PORT_H 17 #define HISTREAMER_PIPELINE_CORE_PORT_H 18 19 #include <memory> 20 #include <string> 21 #include <utility> 22 23 #include "foundation/error_code.h" 24 #include "utils/constants.h" 25 #include "utils/type_define.h" 26 #include "utils/utils.h" 27 #include "plugin/core/plugin_meta.h" 28 29 namespace OHOS { 30 namespace Media { 31 namespace Pipeline { 32 class InfoTransfer; 33 34 enum class WorkMode { PUSH, PULL }; 35 36 class Port { 37 public: Port(InfoTransfer * ownerFilter,std::string portName)38 Port(InfoTransfer *ownerFilter, std::string portName) 39 : filter(ownerFilter), name(std::move(portName)) {} 40 virtual ~Port() = default; 41 const std::string& GetName(); 42 const InfoTransfer* GetOwnerFilter() const; 43 virtual std::shared_ptr<Port> GetPeerPort(); GetWorkMode()44 WorkMode GetWorkMode() 45 { 46 return workMode; 47 } 48 virtual ErrorCode Connect(const std::shared_ptr<Port>& port) = 0; 49 virtual ErrorCode Disconnect() = 0; 50 virtual ErrorCode Activate(const std::vector<WorkMode>& modes, WorkMode& outMode) = 0; 51 virtual bool Negotiate(const std::shared_ptr<const Plugin::Capability>& upstreamCap, 52 Plugin::Capability& negotiatedCap, 53 const Plugin::TagMap& upstreamParams, 54 Plugin::TagMap& downstreamParams) = 0; 55 virtual bool Configure(const std::shared_ptr<const Plugin::Meta> &upstreamMeta) = 0; 56 /** 57 * push data 58 * @param buffer pushed buffer 59 * @param offset means the offset from the start of the stream between Filter.Start and Filter.Stop. -1 means ignore 60 * this parameter. 61 */ 62 virtual void PushData(AVBufferPtr buffer, int64_t offset) = 0; 63 virtual ErrorCode PullData(uint64_t offset, size_t size, AVBufferPtr& data) = 0; 64 65 protected: 66 InfoTransfer* filter; 67 WorkMode workMode {WorkMode::PUSH}; 68 const std::string name; 69 }; 70 71 class OutPort; 72 73 class InPort : public Port { 74 public: 75 explicit InPort(InfoTransfer *filter, std::string name = PORT_NAME_DEFAULT) Port(filter,std::move (name))76 : Port(filter, std::move(name)) {} 77 ~InPort() override = default; 78 ErrorCode Connect(const std::shared_ptr<Port>& port) override; 79 ErrorCode Disconnect() override; 80 ErrorCode Activate(const std::vector<WorkMode>& modes, WorkMode& outMode) override; 81 std::shared_ptr<Port> GetPeerPort() override; 82 bool Negotiate(const std::shared_ptr<const Plugin::Capability>& upstreamCap, 83 Plugin::Capability& negotiatedCap, 84 const Plugin::TagMap& upstreamParams, 85 Plugin::TagMap& downstreamParams) override; 86 bool Configure(const std::shared_ptr<const Plugin::Meta>& upstreamMeta) override; 87 void PushData(AVBufferPtr buffer, int64_t offset) override; 88 ErrorCode PullData(uint64_t offset, size_t size, AVBufferPtr& data) override; 89 90 private: 91 std::weak_ptr<Port> prevPort; 92 }; 93 94 class OutPort : public Port { 95 public: 96 explicit OutPort(InfoTransfer *filter, std::string name = PORT_NAME_DEFAULT) Port(filter,std::move (name))97 : Port(filter, std::move(name)) {} 98 ~OutPort() override = default; 99 ErrorCode Connect(const std::shared_ptr<Port>& port) override; 100 ErrorCode Disconnect() override; 101 ErrorCode Activate(const std::vector<WorkMode>& modes, WorkMode& outMode) override; 102 std::shared_ptr<Port> GetPeerPort() override; 103 bool Negotiate(const std::shared_ptr<const Plugin::Capability>& upstreamCap, 104 Plugin::Capability& negotiatedCap, 105 const Plugin::TagMap& upstreamParams, 106 Plugin::TagMap& downstreamParams) override; 107 bool Configure(const std::shared_ptr<const Plugin::Meta>& upstreamMeta) override; 108 void PushData(AVBufferPtr buffer, int64_t offset) override; 109 ErrorCode PullData(uint64_t offset, size_t size, AVBufferPtr& data) override; 110 111 private: 112 bool InSamePipeline(const std::shared_ptr<Port>& port) const; 113 114 private: 115 std::shared_ptr<Port> nextPort; 116 }; 117 118 class EmptyInPort : public InPort { 119 public: GetInstance()120 static std::shared_ptr<InPort> GetInstance() 121 { 122 return port; 123 } EmptyInPort()124 EmptyInPort() : InPort(nullptr, "emptyInPort") {} 125 ~EmptyInPort() override = default; 126 ErrorCode Connect(const std::shared_ptr<Port>& port) override; 127 ErrorCode Activate(const std::vector<WorkMode>& modes, WorkMode& outMode) override; 128 bool Negotiate(const std::shared_ptr<const Plugin::Capability>& upstreamCap, 129 Plugin::Capability& negotiatedCap, 130 const Plugin::TagMap& upstreamParams, 131 Plugin::TagMap& downstreamParams) override; 132 bool Configure(const std::shared_ptr<const Plugin::Meta>& upstreamMeta) override; 133 void PushData(AVBufferPtr buffer, int64_t offset) override; 134 ErrorCode PullData(uint64_t offset, size_t size, AVBufferPtr& data) override; 135 136 private: 137 static std::shared_ptr<InPort> port; 138 }; 139 140 class EmptyOutPort : public OutPort { 141 public: GetInstance()142 static std::shared_ptr<OutPort> GetInstance() 143 { 144 return port; 145 } EmptyOutPort()146 EmptyOutPort() : OutPort(nullptr, "emptyOutPort") {} 147 ~EmptyOutPort() override = default; 148 ErrorCode Connect(const std::shared_ptr<Port>& port) override; 149 ErrorCode Activate(const std::vector<WorkMode>& modes, WorkMode& outMode) override; 150 bool Negotiate(const std::shared_ptr<const Plugin::Capability>& upstreamCap, 151 Plugin::Capability& negotiatedCap, 152 const Plugin::TagMap& upstreamParams, 153 Plugin::TagMap& downstreamParams) override; 154 bool Configure(const std::shared_ptr<const Plugin::Meta>& upstreamMeta) override; 155 void PushData(AVBufferPtr buffer, int64_t offset) override; 156 ErrorCode PullData(uint64_t offset, size_t size, AVBufferPtr& data) override; 157 158 private: 159 static std::shared_ptr<OutPort> port; 160 }; 161 } // namespace Pipeline 162 } // namespace Media 163 } // namespace OHOS 164 #endif // HISTREAMER_PIPELINE_CORE_PORT_H 165