Source: abstractqosdescription.h


Annotated List
Files
Globals
Hierarchy
Index
// ##########################################################################
// ####                                                                  ####
// ####                    Master Thesis Implementation                  ####
// ####  Management of Layered Variable Bitrate Multimedia Streams over  ####
// ####                  DiffServ with A Priori Knowledge                ####
// ####                                                                  ####
// #### ================================================================ ####
// ####                                                                  ####
// ####                                                                  ####
// #### Abstract QoS Description Inlines                                 ####
// ####                                                                  ####
// #### Version 1.00  --  October 10, 2000                               ####
// ####                                                                  ####
// #### Copyright (C) 2000 Thomas Dreibholz                              ####
// #### University of Bonn, Department of Computer Science IV            ####
// #### EMail: Dreibholz@bigfoot.com                                     ####
// #### WWW:   http://www.bigfoot.com/~dreibholz/diplom/index.html       ####
// ####                                                                  ####
// ##########################################################################


#ifndef ABSTRACTQOSDESCRIPTION_H
#define ABSTRACTQOSDESCRIPTION_H


#include "system.h"
#include "frameratescalabilityinterface.h"
#include "abstractlayerdescription.h"
#include "rtppacket.h"
#include "resourceutilizationpoint.h"


namespace Coral {


/**
  * This class contains a stream's QoS requirements.
  *
  * @short   Abstract QoS Description.
  * @author  Thomas Dreibholz (Dreibholz@bigfoot.com)
  * @version 1.0
*/
class AbstractQoSDescription : virtual public FrameRateScalabilityInterface
{
   // ====== Constructor/Destructor =========================================
   public:
   /**
     * Constructor.
     */
   AbstractQoSDescription();

   /**
     * Destructor.
     */
   virtual ~AbstractQoSDescription();


   // ====== Initialization/update ==========================================
   /**
     * Initialize description.
     *
     * @param frameRate Frame rate.
     */
   inline void initDescription(const double frameRate);

   /**
     * Update description.
     *
     * @param pktHeaderSize Packet header size.
     * @param pktMaxSize Maximum packet size.
     */
   virtual void updateDescription(const cardinal pktHeaderSize,
                                  const cardinal pktMaxSize) = 0;


   // ====== Frame rate methods =============================================
   /**
     * Get frame rate.
     *
     * @return Frame rate.
     */
   inline double getFrameRate() const;

   /**
     * Set frame rate.
     *
     * @param frameRate Frame rate.
     * @return Frame rate set.
     */
   inline double setFrameRate(const double frameRate);

   /**
     * Get next higher frame rate.
     *
     * @return Frame rate.
     */
   inline double getNextFrameRate() const;

   /**
     * Get next lower frame rate.
     *
     * @return Frame rate.
     */
   inline double getPrevFrameRate() const;

   /**
     * Get frame rate scale factor:
     * (frameRate - MinFrameRate) / (MaxFrameRate - MinFrameRate).
     *
     * @return Frame rate scale factor (out of [0,1]).
     */
   inline double getFrameRateScaleFactor() const;


   // ====== Total bandwidth methods ========================================
   /**
     * Get minimum required total bandwidth.
     *
     * @return Minimum total bandwidth.
     */
   cardinal getMinBandwidth() const;

   /**
     * Get maximum required total bandwidth.
     *
     * @return Maximum total bandwidth.
     */
   cardinal getMaxBandwidth() const;


   // ====== Position =======================================================
   /**
     * Get position.
     *
     * @return Position.
     */
   inline card64 getPosition() const;

   /**
     * Set position.
     *
     * @param position Position.
     */
   inline void setPosition(const card64 position);


   // ====== Abstract layer methods =========================================
   /**
     * Get number of layers.
     *
     * @return Number of layers.
     */
   virtual cardinal getLayers() const = 0;

   /**
     * Get layer.
     *
     * @param layer Layer number.
     * @return Layer.
     */
   virtual AbstractLayerDescription* getLayer(const cardinal layer) const = 0;


   // ====== Get/set resources, calculate utilization for bandwidths ========
   /**
     * Get resources.
     *
     * @param rup ResourceUtilizationPoint reference to store resources.
     * @return Utilization.
     */
   double getResources(ResourceUtilizationPoint& rup) const;

   /**
     * Set resources.
     *
     * @param rup ResourceUtilizationPoint reference containing resources.
     * @return Utilization.
     */
   double setResources(const ResourceUtilizationPoint& rup);

   /**
     * Set resources with buffer delay optimization.
     *
     * @param rup ResourceUtilizationPoint reference containing resources.
     * @return Utilization.
     */
   double setResourcesOptimized(ResourceUtilizationPoint& rup);

   /**
     * Calculate utilization for given frame rate and layers bandwidths.
     *
     * @param frameRate Frame rate.
     * @param layers Number of layers.
     * @param bandwidth Bandwidth array with entry for each layer.
     * @return Utilization.
     */
   virtual double calculateUtilizationForLayerBandwidths(
                     const double    frameRate,
                     const cardinal  layers,
                     const cardinal* bandwidth) const;


   // ====== Resource/Utilization calculation ===============================
   /**
     * Get precomputed resource utilization list. This method tries to use
     * a precomputed list instead of calculating all points like
     * calculateResourceUtilizationList().
     *
     * @param rup ResourceUtilizationPoint array capable of storing maxPoints entries.
     * @param bwThreshold Bandwidth threshold.
     * @param utThreshold Utilization threshold.
     * @param maxPoints Maximum number of ResourceUtilizationPoint to generate.
     *
     * @see calculateResourceUtilizationList
     */
   virtual cardinal getPrecomputedResourceUtilizationList(
                       ResourceUtilizationPoint* rup,
                       const cardinal            bwThreshold,
                       const double              utThreshold,
                       const cardinal            maxPoints) const = 0;

   /**
     * Calculate resource utilization list. To use a precomputed list, call
     * getPrecomputedResourceUtilizationList().
     *
     * @param rup ResourceUtilizationPoint array capable of storing maxPoints entries.
     * @param bwThreshold Bandwidth threshold.
     * @param utThreshold Utilization threshold.
     * @param maxPoints Maximum number of ResourceUtilizationPoint to generate.
     *
     * @see getPrecomputedResourceUtilizationList
     */
   virtual cardinal calculateResourceUtilizationList(
                       ResourceUtilizationPoint* rup,
                       const cardinal            bwThreshold,
                       const double              utThreshold,
                       const cardinal            maxPoints) const;

   /**
     * Calculate maximum utilization for given bandwidth. This is the
     * single-point version of calculateMaxUtilizationForBandwidthArray().
     *
     * @param totalBandwidth Total bandwidth.
     * @param rup ResourceUtilizationPoint reference to store result.
     * @return Utilization.
     *
     * @see calculateMaxUtilizationForBandwidthArray
     */
   inline double calculateMaxUtilizationForBandwidth(
                    const cardinal            totalBandwidth,
                    ResourceUtilizationPoint& rup) const;

   /**
     * Calculate maximum utilizations for given bandwidth array.
     *
     * @param totalBandwidthArray Total bandwidth array.
     * @param rupArray ResourceUtilizationPoint array to store results.
     * @param points Number of points in arrays.
     */
   virtual void calculateMaxUtilizationForBandwidthArray(
                   const cardinal*           totalBandwidthArray,
                   ResourceUtilizationPoint* rupArray,
                   const cardinal            points) const;


   // ====== Wanted quality settings ========================================
   /**
     * Get wanted utilization.
     *
     * @return Wanted utilization.
     */
   inline double getWantedUtilization() const;

   /**
     * Set wanted utilization.
     *
     * @param utilization Wanted utilization.
     */
   inline void setWantedUtilization(const double utilization);

   /**
     * Get minimum wanted bandwidth.
     *
     * @return Minimum wanted bandwidth.
     */
   cardinal getMinWantedBandwidth() const;

   /**
     * Get maximum wanted bandwidth.
     *
     * @return Maximum wanted bandwidth.
     */
   cardinal getMaxWantedBandwidth() const;

   /**
     * Set minimum wanted bandwidth.
     *
     * @param wanted bandwidth Minimum wanted bandwidth.
     */
   void setMinWantedBandwidth(const cardinal bandwidth);

   /**
     * Set maximum wanted bandwidth.
     *
     * @param wanted bandwidth Maximum wanted bandwidth.
     */
   void setMaxWantedBandwidth(const cardinal bandwidth);

   /**
     * Get stream priority.
     *
     * @return Stream priority.
     */
   inline int8 getStreamPriority() const;

   /**
     * Set stream priority.
     *
     * @param priority Stream priority.
     * @return User priority rate set.
     */
   inline void setStreamPriority(const int8 priority);


   // ====== Protected data =================================================
   protected:
   double   WantedUtilization;
   cardinal MinWantedBandwidth;
   cardinal MaxWantedBandwidth;
   double   FrameRate;
   card64   Position;
   cardinal PktHeaderSize;
   cardinal PktMaxSize;
   int8     StreamPriority;


   // ====== Private data ===================================================
   private:
   void doResourceUtilizationIteration(
           ResourceUtilizationPoint* rup,
           const cardinal            bwThreshold,
           const double              utThreshold,
           double*                   utilizationCache,
           cardinal*                 bandwidthCache,
           const cardinal            maxPoints,
           const cardinal            maxCachePoints,
           const cardinal            start,
           const cardinal            end,
           const cardinal            startBandwidth,
           const cardinal            endBandwidth,
           const cardinal            level,
           const cardinal            maxLevel,
           cardinal&                 count) const;

   void calculateBandwidthInfo(const cardinal layer,
                               BandwidthInfo& bandwidthInfo) const;
};


/**
  * Output operator.
  */
ostream& operator<<(ostream& os, const AbstractQoSDescription& aqd);


}


#include "abstractqosdescription.icc"


#endif

Generated by: viper@odin on Mon Oct 16 11:49:26 2000, using kdoc 2.0a36.