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