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 "error_code.h" 24 #include "utils/constants.h" 25 #include "type_define.h" 26 #include "plugin/core/plugin_meta.h" 27 28 namespace OHOS { 29 namespace Media { 30 namespace Pipeline { 31 class InfoTransfer; 32 33 enum class WorkMode { PUSH, PULL }; 34 35 class Port { 36 public: Port(InfoTransfer * ownerFilter,std::string portName)37 Port(InfoTransfer *ownerFilter, std::string portName) 38 : filter(ownerFilter), name(std::move(portName)) {} 39 virtual ~Port() = default; 40 const std::string& GetName(); 41 const InfoTransfer* GetOwnerFilter() const; 42 virtual std::shared_ptr<Port> GetPeerPort(); GetWorkMode()43 WorkMode GetWorkMode() 44 { 45 return workMode; 46 } 47 virtual ErrorCode Connect(const std::shared_ptr<Port>& port) = 0; 48 virtual ErrorCode Disconnect() = 0; 49 virtual ErrorCode Activate(const std::vector<WorkMode>& modes, WorkMode& outMode) = 0; 50 virtual bool Negotiate(const std::shared_ptr<const Plugin::Capability>& upstreamCap, 51 Plugin::Capability& negotiatedCap, 52 const Plugin::TagMap& upstreamParams, 53 Plugin::TagMap& downstreamParams) = 0; 54 virtual bool Configure(const std::shared_ptr<const Plugin::Meta> &upstreamMeta, Plugin::TagMap &upstreamParams, 55 Plugin::TagMap &downstreamParams) = 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(const 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, Plugin::TagMap &upstreamParams, 87 Plugin::TagMap &downstreamParams) override; 88 void PushData(const AVBufferPtr& buffer, int64_t offset) override; 89 ErrorCode PullData(uint64_t offset, size_t size, AVBufferPtr& data) override; 90 91 private: 92 std::weak_ptr<Port> prevPort; 93 }; 94 95 class OutPort : public Port { 96 public: 97 explicit OutPort(InfoTransfer *filter, std::string name = PORT_NAME_DEFAULT) Port(filter,std::move (name))98 : Port(filter, std::move(name)) {} 99 ~OutPort() override = default; 100 ErrorCode Connect(const std::shared_ptr<Port>& port) override; 101 ErrorCode Disconnect() override; 102 ErrorCode Activate(const std::vector<WorkMode>& modes, WorkMode& outMode) override; 103 std::shared_ptr<Port> GetPeerPort() override; 104 bool Negotiate(const std::shared_ptr<const Plugin::Capability>& upstreamCap, 105 Plugin::Capability& negotiatedCap, 106 const Plugin::TagMap& upstreamParams, 107 Plugin::TagMap& downstreamParams) override; 108 bool Configure(const std::shared_ptr<const Plugin::Meta> &upstreamMeta, Plugin::TagMap &upstreamParams, 109 Plugin::TagMap &downstreamParams) override; 110 void PushData(const AVBufferPtr& buffer, int64_t offset) override; 111 ErrorCode PullData(uint64_t offset, size_t size, AVBufferPtr& data) override; 112 113 private: 114 bool InSamePipeline(const std::shared_ptr<Port>& port) const; 115 116 private: 117 std::shared_ptr<Port> nextPort; 118 }; 119 120 class EmptyInPort : public InPort { 121 public: GetInstance()122 static std::shared_ptr<InPort> GetInstance() 123 { 124 return port; 125 } EmptyInPort()126 EmptyInPort() : InPort(nullptr, "emptyInPort") {} 127 ~EmptyInPort() override = default; 128 ErrorCode Connect(const std::shared_ptr<Port>& another) override; 129 ErrorCode Activate(const std::vector<WorkMode>& modes, WorkMode& outMode) override; 130 bool Negotiate(const std::shared_ptr<const Plugin::Capability>& upstreamCap, 131 Plugin::Capability& negotiatedCap, 132 const Plugin::TagMap& upstreamParams, 133 Plugin::TagMap& downstreamParams) override; 134 bool Configure(const std::shared_ptr<const Plugin::Meta> &upstreamMeta, Plugin::TagMap &upstreamParams, 135 Plugin::TagMap &downstreamParams) override; 136 void PushData(const AVBufferPtr& buffer, int64_t offset) override; 137 ErrorCode PullData(uint64_t offset, size_t size, AVBufferPtr& data) override; 138 139 private: 140 static std::shared_ptr<InPort> port; 141 }; 142 143 class EmptyOutPort : public OutPort { 144 public: GetInstance()145 static std::shared_ptr<OutPort> GetInstance() 146 { 147 return port; 148 } EmptyOutPort()149 EmptyOutPort() : OutPort(nullptr, "emptyOutPort") {} 150 ~EmptyOutPort() override = default; 151 ErrorCode Connect(const std::shared_ptr<Port>& another) override; 152 ErrorCode Activate(const std::vector<WorkMode>& modes, WorkMode& outMode) override; 153 bool Negotiate(const std::shared_ptr<const Plugin::Capability>& upstreamCap, 154 Plugin::Capability& negotiatedCap, 155 const Plugin::TagMap& upstreamParams, 156 Plugin::TagMap& downstreamParams) override; 157 bool Configure(const std::shared_ptr<const Plugin::Meta> &upstreamMeta, Plugin::TagMap &upstreamParams, 158 Plugin::TagMap &downstreamParams) override; 159 void PushData(const AVBufferPtr& buffer, int64_t offset) override; 160 ErrorCode PullData(uint64_t offset, size_t size, AVBufferPtr& data) override; 161 162 private: 163 static std::shared_ptr<OutPort> port; 164 }; 165 } // namespace Pipeline 166 } // namespace Media 167 } // namespace OHOS 168 #endif // HISTREAMER_PIPELINE_CORE_PORT_H 169