1 /* ------------------------------------------------------------------ 2 * Copyright (C) 1998-2009 PacketVideo 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 13 * express or implied. 14 * See the License for the specific language governing permissions 15 * and limitations under the License. 16 * ------------------------------------------------------------------- 17 */ 18 /** 19 * @file pvmf_port_base_impl.h 20 */ 21 #ifndef PVMF_PORT_BASE_IMPL_H_INCLUDED 22 #define PVMF_PORT_BASE_IMPL_H_INCLUDED 23 24 #ifndef OSCL_BASE_H_INCLUDED 25 #include "oscl_base.h" 26 #endif 27 #ifndef OSCL_QUEUE_H_INCLUDED 28 #include "oscl_queue.h" 29 #endif 30 #ifndef PVLOGGER_H_INCLUDED 31 #include "pvlogger.h" 32 #endif 33 #ifndef PVMF_PORT_INTERFACE_H_INCLUDED 34 #include "pvmf_port_interface.h" 35 #endif 36 #ifndef OSCL_STRING_CONTAINERS_H_INCLUDED 37 #include "oscl_string_containers.h" 38 #endif 39 #ifndef PVMF_MEDIA_DATA_H_INCLUDED 40 #include "pvmf_media_data.h" 41 #endif 42 43 /** 44 * When this macro is defined to 1, statistics of this port will be tracked and can be 45 * retrieved for debugging and performance analysis. 46 */ 47 #define PVMF_PORT_BASE_IMPL_STATS (PVLOGGER_INST_LEVEL >= PVLOGMSG_INST_MLDBG) 48 49 /** Structure containing statistics of a port */ 50 struct PvmfPortBaseImplStats 51 { 52 uint32 iOutgoingMsgQueued; /**< Number of outgoing messages queued */ 53 uint32 iOutgoingMsgSent; /**< Number of outgoing messages sent */ 54 uint32 iOutgoingMsgDiscarded; /**< Number of outgoing messages discarded */ 55 uint32 iOutgoingQueueBusy; /**< Number of times outgoing message queue became busy */ 56 uint32 iConnectedPortBusy; /**< Number of times connected port became busy */ 57 uint32 iIncomingMsgRecv; /**< Number of incoming messages received */ 58 uint32 iIncomingMsgConsumed; /**< Number of incoming messages dequeued by the node */ 59 uint32 iIncomingQueueBusy; /**< Number of times incoming message queue became busy */ 60 }; 61 62 /** Queue structure */ 63 class PvmfPortBaseImplQueue 64 { 65 public: 66 void Construct(uint32 aCap, uint32 aReserve, uint32 aThresh); 67 PVMFStatus SetCapacity(uint32); 68 PVMFStatus SetReserve(uint32); 69 PVMFStatus SetThreshold(uint32); 70 71 Oscl_Queue<PVMFSharedMediaMsgPtr, OsclMemAllocator> iQ; 72 73 // Flow control 74 uint32 iCapacity; 75 uint32 iThresholdPercent; /**< Threshold for allowing new messages, in terms of percentage of capacity. */ 76 uint32 iThreshold; /**< Threshold size for allowing new messages */ 77 bool iBusy; 78 }; 79 /** Queue type */ 80 enum TPvmfPortBaseImplQueueType 81 { 82 EPVIncomingDataQueue 83 , EPVOutgoingDataQueue 84 }; 85 86 /** Default data queue capacity */ 87 const uint32 DEFAULT_DATA_QUEUE_CAPACITY = 10; 88 89 /** 90 * Threshold in terms of percentage of the total queue size at which a data queue 91 * will be ready to resume receiving data. After the reaching the maximum queue size 92 * the port would wait until enough queued messages are processed such that the queue 93 * size drops below this threshold before notifying the sender port / node to resume 94 * sending data. 95 */ 96 const uint32 DEFAULT_READY_TO_RECEIVE_THRESHOLD_PERCENT = 60; 97 98 /** 99 * Base implementation of PVMFPortInterface. This implementation provides an incoming 100 * and an outgoing queue for media messages, and depends on the PVMF Node that owns 101 * this port on processing these messages asynchronously. The node will be notified 102 * of the events occurred to this port, and the node implementation will need to 103 * handle these message as necessary in order for this base port implementation to 104 * function. This implementation does not perform capability exchange when two ports 105 * are establishing a connection. The final implementation of a port should derive 106 * from this class and the PvmiConfigAndCapability interface for full functionality 107 * with capability and data exchange. 108 */ 109 class PvmfPortBaseImpl : public PVMFPortInterface 110 { 111 public: 112 /** 113 * Default constructor. Data queue size and ready to receive threshold will be set to 114 * default values. 115 * 116 * @param aTag Port tag associated to this port 117 * @param aNode The node that owns this port. Port events will be reported to this node. 118 * @param name Optional port name. If a name is provided, then datapath logging will 119 * be activated on the port. 120 */ 121 OSCL_IMPORT_REF PvmfPortBaseImpl(int32 aPortTag, PVMFPortActivityHandler* aNode, const char*name = NULL); 122 123 /** 124 * Constructor specifying the data queue size and ready to receive threshold. 125 * 126 * @param aTag Port tag associated to this port 127 * @param aNode The node that owns this port. Port events will be reported to this node. 128 * @param aSize Data queue capacity. The data queue size will not grow beyond this capacity. 129 * @param aReserve Size of data queue for which memory is reserved. This must be 130 * less than or equal to the capacity. If this is less than capacity, memory will be 131 * allocated when the queue grows beyond the reserve size, but will stop growing at 132 * capacity. 133 * @param aThreshold Ready-to-receive threshold, in terms of percentage of the data queue capacity. 134 * This value should be between 0 - 100. 135 * @param name Optional port name. If a name is provided, then datapath logging will 136 * be activated on the port. 137 */ 138 OSCL_IMPORT_REF PvmfPortBaseImpl(int32 aTag 139 , PVMFPortActivityHandler* aNode 140 , uint32 aInputCapacity 141 , uint32 aInputReserve 142 , uint32 aInputThreshold 143 , uint32 aOutputCapacity 144 , uint32 aOutputReserve 145 , uint32 aOutputThreshold 146 , const char*name = NULL); 147 148 /** Destructor */ 149 OSCL_IMPORT_REF virtual ~PvmfPortBaseImpl(); 150 OSCL_IMPORT_REF virtual int32 GetPortTag() const;/*{ return iTag; }*/ 151 OSCL_IMPORT_REF virtual PVMFStatus Connect(PVMFPortInterface* aPort); 152 OSCL_IMPORT_REF virtual PVMFStatus Disconnect(); 153 OSCL_IMPORT_REF virtual PVMFStatus PeerConnect(PVMFPortInterface* aPort); 154 OSCL_IMPORT_REF virtual PVMFStatus PeerDisconnect() ; 155 OSCL_IMPORT_REF virtual PVMFStatus QueueOutgoingMsg(PVMFSharedMediaMsgPtr aMsg); 156 OSCL_IMPORT_REF virtual PVMFStatus Send(); 157 OSCL_IMPORT_REF virtual PVMFStatus Receive(PVMFSharedMediaMsgPtr aMsg); 158 OSCL_IMPORT_REF virtual PVMFStatus DequeueIncomingMsg(PVMFSharedMediaMsgPtr& aMsg); 159 OSCL_IMPORT_REF virtual PVMFStatus ReadyToReceive(); 160 OSCL_IMPORT_REF virtual PVMFStatus ClearMsgQueues(); 161 OSCL_IMPORT_REF virtual uint32 IncomingMsgQueueSize(); 162 OSCL_IMPORT_REF virtual uint32 OutgoingMsgQueueSize(); 163 OSCL_IMPORT_REF virtual bool IsOutgoingQueueBusy(); 164 OSCL_IMPORT_REF virtual bool IsConnectedPortBusy(); 165 OSCL_IMPORT_REF virtual void SuspendInput(); 166 OSCL_IMPORT_REF virtual void ResumeInput(); 167 168 /** 169 * Return capacity of data queues 170 * @return Capacity of data queues 171 */ 172 OSCL_IMPORT_REF uint32 GetCapacity(TPvmfPortBaseImplQueueType); 173 174 /** 175 * Returns ready-to-receive threshold 176 * @return Ready-to-receive threshold, in terms of percentage of the data queue capacity. 177 */ 178 OSCL_IMPORT_REF uint32 GetThreshold(TPvmfPortBaseImplQueueType); 179 180 /** 181 * Update capacity of the data queues. 182 * 183 * @param aCapacity New capacity of the data queues. 184 * @return Completion status. 185 */ 186 OSCL_IMPORT_REF PVMFStatus SetCapacity(TPvmfPortBaseImplQueueType, uint32 aCapacity); 187 /** 188 * Update reserve of the data queues. 189 * 190 * @param aCapacity New capacity of the data queues. 191 * @return Completion status. 192 */ 193 OSCL_IMPORT_REF PVMFStatus SetReserve(TPvmfPortBaseImplQueueType, uint32 aCapacity); 194 195 /** 196 * Update ready-to-receive threshold, in terms of percentage of the data queue capacity. 197 * 198 * @param aThreshold Ready to receive threshold. This value should be between 0 and 100. 199 * @return Completion status 200 */ 201 OSCL_IMPORT_REF PVMFStatus SetThreshold(TPvmfPortBaseImplQueueType, uint32 aThreshold); 202 203 /** 204 * Return statistics of this port. 205 * @param aStats Output parameter where port statistics will be repoted to. 206 * @return Completion status. 207 */ 208 OSCL_IMPORT_REF PVMFStatus GetStats(PvmfPortBaseImplStats& aStats); 209 210 /** 211 * Reports port activity to the activity handler (usually 212 * the node). 213 */ 214 OSCL_IMPORT_REF void PortActivity(PVMFPortActivityType aActivity); 215 216 /** 217 * Derived classes must override this if they 218 * implement the capability and config interface 219 */ 220 virtual void QueryInterface(const PVUuid&, OsclAny*&aPtr) 221 { 222 aPtr = NULL; 223 } 224 225 OSCL_IMPORT_REF void Construct(); 226 OSCL_IMPORT_REF virtual void EvaluateIncomingBusy(); 227 OSCL_IMPORT_REF virtual void EvaluateOutgoingBusy(); 228 OSCL_IMPORT_REF virtual bool isIncomingFull(); 229 OSCL_IMPORT_REF virtual bool isOutgoingFull(); 230 231 // Queues 232 PvmfPortBaseImplQueue iIncomingQueue; 233 PvmfPortBaseImplQueue iOutgoingQueue; 234 235 // Flow control 236 bool iConnectedPortBusy; 237 bool iInputSuspended; 238 239 protected: 240 // Port tag 241 int32 iTag; 242 243 // Logging and statistics 244 PVLogger* iLogger; 245 PvmfPortBaseImplStats iStats; 246 247 //For datapath logging. If a port name is provided, either in 248 //the constructor or by calling SetName, then datapath logging will 249 //be activated on the port. 250 OSCL_IMPORT_REF void SetName(const char*name); 251 OSCL_StackString<20> iPortName; 252 PVLogger* iDatapathLogger; 253 char* PortName() 254 { 255 return iPortName.get_str(); 256 } 257 void LogMediaMsgInfo(PVMFSharedMediaMsgPtr aMediaMsg, const char*, PvmfPortBaseImplQueue&); 258 public: 259 //a couple of functions for use by the nodes to log info about other internal 260 //data queues using the port datapath logger. 261 OSCL_IMPORT_REF void LogMediaMsgInfo(PVMFSharedMediaMsgPtr aMediaMsg, const char*, int32); 262 OSCL_IMPORT_REF void LogMediaDataInfo(PVMFSharedMediaDataPtr aMediaData, const char*, int32); 263 }; 264 265 #endif // PVMF_PORT_BASE_IMPL_H_INCLUDED 266