Home | History | Annotate | Download | only in include
      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