hxsm.h
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:10k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. #ifndef _HXSM_H_
  36. #define _HXSM_H_
  37. #include "hxtypes.h"
  38. #include "hxcom.h"
  39. #include "hxsmbw.h"
  40. #include "hxslist.h"
  41. class CHXSimpleList;
  42. class ASMRuleBook;
  43. struct IHXSourceBandwidthInfo;
  44. struct IHXErrorMessages;
  45. class ASMStreamInfo;
  46. class ASMSourceInfo;
  47. class HXSM;
  48. struct IHXValues;
  49. #define NUM_REPORTS_NEEDED_TO_UPSHIFT 4
  50. #define BW_DETECTION_DATA_POINTS 1024
  51. #define TCP_BANDWIDTH_WINDOW 20000
  52. class ASMSourceInfo : public IHXBandwidthManagerInput
  53. {
  54. public:
  55.     UINT32 m_ulLastReportTime;
  56.     UINT32 m_ulIncomingBandwidth;
  57.     UINT32 m_ulRateBeforeDeAccel;
  58.     INT32 m_lTimeDiffBase;  //this must be signed !!!
  59.     UINT32 m_ulBytesBehind;
  60.     INT32 m_lLastBehindTime;
  61.     UINT32 m_ulLastSetDelivery;
  62.     UINT32 m_ulSubscribedBw;
  63.     UINT32 m_ulMaxSubscribedBw;
  64.     UINT32 m_ulMasterOffer;
  65.     HX_BITFIELD m_bBehind : 1;
  66.     HX_BITFIELD m_bLossBehind : 1;
  67.     HX_BITFIELD m_bSlightlyBehind : 1;
  68.     HX_BITFIELD m_bTimeStampDelivery : 1;
  69.     HX_BITFIELD m_bPendingChill : 1;
  70.     HX_BITFIELD m_bInvalidUpReport : 1;
  71.     HX_BITFIELD m_bPerfectPlay : 1;
  72.     HX_BITFIELD m_bIsDone : 1;
  73.     HX_BITFIELD m_bMayBeAccelerated : 1;
  74.     HX_BITFIELD m_bTryToUpShift : 1;
  75.     HX_BITFIELD m_bAdjustBandwidth : 1;
  76.     UINT32 m_ulLowestBandwidthBeforeTimeStamp;
  77.     /*
  78.      * The following are switches used in load testing only to control
  79.      * whether or not any fall forward or fall back rate negotiation
  80.      * goes on. There is a master switch, m_bDisableBothAccelDecel,
  81.      * in the HXSM class that effects both of these swiches, globaly,
  82.      * for ALL sources regardless of URL option switches.
  83.      * 
  84.      * Option switches are: "DoAccel", "DoDecel"
  85.      *
  86.      * NOTE: DoAccel and DoDecel control both Accelleration/Deceleration
  87.      *       and upshifting and downshifting of SureStream sources.
  88.      */
  89.     HX_BITFIELD m_bSourceAccelAllowed : 1;
  90.     HX_BITFIELD m_bSourceDecelAllowed : 1;
  91. private:
  92.     HX_BITFIELD m_bSlidingBwWindowReady : 1;
  93. public:
  94.     ASMRuleBook*    m_pMasterRuleBook;
  95.     ASMStreamInfo** m_pStreams;
  96.     CHXSimpleList   m_SubscriptionChanges;
  97.     UINT32  GetBandwidthSince(UINT32 ulTime, UINT32 ulNow);
  98.     UINT32  GetBandwidth();
  99.     TRANSPORT_TYPE m_TransportType;
  100.     ASMSourceInfo(HXSource* pSource, HXSM* pHXASM);
  101.     ~ASMSourceInfo();
  102.     void Done();
  103.     STDMETHOD (QueryInterface ) (THIS_ REFIID ID, void** ppInterfaceObj);
  104.     STDMETHOD_(UINT32, AddRef ) (THIS);
  105.     STDMETHOD_(UINT32, Release) (THIS);
  106.     /*
  107.      * IHXBandwidthManagerInput methods
  108.      */
  109.     STDMETHOD(ReportDataPacket) (THIS_
  110. UINT32 ulTimeStamp,
  111. UINT32 ulArrivedTimeStamp,
  112. UINT32 ulSize);
  113.     STDMETHOD(ReportUpshiftInfo) (THIS_
  114. UINT32 ulTimeStamp,
  115. UINT32 ulSize);
  116.     STDMETHOD(ReportLatency) (THIS_
  117. UINT32 ulServerTime,
  118. UINT32 ulClientTime);
  119.     STDMETHOD(SetCongestionFactor) (THIS_
  120. UINT32 ulFactor);
  121.     STDMETHOD(SetTransportType) (THIS_
  122. TRANSPORT_TYPE type);
  123.     HXSource* m_pSource;
  124.     IHXSourceBandwidthInfo* m_pSBI;
  125.     /* If the source has enough data, it may tell the bandwidth
  126.      * manager to cut down on accelerated buffering.
  127.      */
  128.     void    ChangeAccelerationStatus (BOOL      bMayBeAccelerated,
  129.  BOOL    bUseAccelerationFactor,
  130.  UINT32    ulAccelerationFactor);
  131. private:
  132.     UINT32 THRESHOLD;
  133.     INT32 m_lOuterThreshold;
  134.     INT32 CalcBackup(UINT32, UINT32);
  135.     INT32 m_lRefCount;
  136.     typedef struct _BwDetectionData
  137.     {
  138. UINT32     m_ulSize;
  139. UINT32     m_ulTimeStamp;
  140. UINT32     m_ulATime;
  141.     } BwDetectionData;
  142.     
  143.     /* For Bandwidth Detection */
  144.     BwDetectionData* m_pBwDetectionData;
  145.     UINT32 m_ulBwDetectionDataLen;
  146.     UINT32 m_ulSlidingWindowLocation;
  147.     UINT32 m_ulBwDetectionDataCount;
  148.     HXSM* m_pHXASM;
  149. private:
  150.     BOOL AllocBWDetectionData(UINT32 ulReqSize);
  151. };
  152. class ASMStreamInfo
  153. {
  154. public:
  155.     BOOL m_bTimeStampDelivery;
  156.     void NotifyTimeStampDelivery();
  157.     void NotifyLimitBandwidth(UINT32 ulBandwidth);
  158.     void NotifyNewBandwidth();
  159.     void SetLastBandwidth(UINT32 ulOffer);
  160.     ASMStreamInfo();
  161.     ~ASMStreamInfo();
  162.     ASMSourceInfo* m_pASMSourceInfo;
  163.     IHXStreamBandwidthNegotiator* m_pNegotiator;
  164.     IHXStreamBandwidthBias* m_pBias;
  165.     IHXAtomicRuleGather* m_pRuleGather;
  166.     UINT32 m_ulFixedBandwidth;
  167.     UINT32 m_ulLastBandwidth;
  168.     float* m_pThreshold;
  169.     UINT32 m_ulNumThresholds;
  170.     UINT32 m_ulThresholdPosition;
  171.     UINT32 m_ulResistanceToLower;
  172.     UINT32 m_ulOffer;
  173.     UINT32 m_ulMasterRuleBookSetOffer;
  174.     UINT32 m_ulMaxEffectiveThreshold;
  175.     UINT32                              m_ulStreamNumber;
  176. };
  177. class HXSM : public IHXBandwidthManager
  178. {
  179. public:
  180.     HXSM();
  181.     ~HXSM();
  182.     STDMETHOD (QueryInterface ) (THIS_ REFIID ID, void** ppInterfaceObj);
  183.     STDMETHOD_(UINT32, AddRef ) (THIS);
  184.     STDMETHOD_(UINT32, Release) (THIS);
  185.     /*
  186.      * IHXBandwidthManager methods
  187.      */
  188.     STDMETHOD(RegisterSource) (THIS_
  189. HXSource* pSource,
  190. IUnknown* pUnknown);
  191.     STDMETHOD(RegisterSourcesDone) (THIS);
  192.     STDMETHOD_(BOOL, NotEnoughBandwidth)(THIS);
  193.     STDMETHOD(UnRegisterSource) (THIS_
  194. HXSource* pSource);
  195.     /* If the source has enough data, it may tell the bandwidth
  196.      * manager to cut down on accelerated buffering.
  197.      */
  198.     STDMETHOD(ChangeAccelerationStatus) (THIS_
  199. HXSource* pSource,
  200. BOOL    bMayBeAccelerated,
  201. BOOL    bUseAccelerationFactor,
  202. UINT32    ulAccelerationFactor);
  203.     void UpShiftInfo(UINT32 ulTimeStamp, UINT32 ulSize);
  204.     /* Called by HXPlayer at end of each presentation */
  205.     STDMETHOD(PresentationDone) (THIS);
  206.     STDMETHOD(ChangeBW) (THIS_ 
  207. UINT32 newBW, HXSource* pSource);
  208.     typedef enum { HX_NONE, CONGESTION, INIT, INIT_REDIST, REDIST, REDO_ACCEL, CHILL_BUFFERING } RState;
  209.     RState m_State;
  210. private:
  211.     INT32 m_lRefCount;
  212.     IHXValues* m_pSubscriptionVariables;
  213.     CHXSimpleList* m_pASMSourceInfo;
  214.     CHXSimpleList* m_pASMStreamInfo;
  215.     UINT32 m_ulOriginalHighestBandwidthAvail;
  216.     UINT32 m_ulHighestBandwidthAvail;
  217.     UINT32 m_ulPeakUsedBandwidth;
  218.     UINT32 m_ulUpShiftTimes[5];
  219.     UINT32 m_ulUpShiftSizes[5];
  220.     UINT32 m_ulUpShiftRingPos;
  221.     UINT32 m_ulUpShiftBandwidthAvail;
  222.     UINT32 m_ulNumSources;
  223.     UINT32 m_ulMaxAccelBitRate;
  224.     UINT32 m_ulResistanceBitRate;
  225.     UINT32 m_ulOriginalResistanceBitRate;
  226.     INT32 m_ulNumReportsSinceUpShift;
  227.     UINT32 m_ulLastStableBandwidth;
  228.     UINT32 m_ulUpShiftTestPointScaleFactor;
  229.     UINT32 m_ulOfferToRecalc;
  230.     UINT32 m_ulNextPacketWindow;
  231.     INT32 m_lPacketCounter;
  232.     UINT32 m_ulUpShiftPastResistanceCount;
  233.     INT16 m_lLoss : 16;
  234.     HX_BITFIELD m_bInitialHighBwAvail : 1;
  235.     HX_BITFIELD m_bPipeFull : 1;
  236.     HX_BITFIELD m_bUpShiftInfoReady : 1;
  237.     HX_BITFIELD m_bDidOfferUpShiftToRecalc : 1;
  238.     HX_BITFIELD         m_bEnableSDB : 1;
  239.     /****************************************************************
  240.      * The following are switches used in load testing only to control
  241.      *  whether or not any fall forward or fall back rate negotiation
  242.      *  goes on. The acceleration or deceleration can be controled with
  243.      *  the m_bDoAccel and m_bDoDecel switches.  All rate changes can
  244.      *  be turned off with the m_bDisableBothAccelDecel switch which
  245.      *  overrides any values in the m_bDoAccel and m_bDoDecel switches.
  246.      *  if the m_bDisableBothAccelDecel switch is FALSE(0) then it has
  247.      *  no effect.
  248.      * 
  249.      * Preference Keys are:
  250.      *                       DoAccel, DoDecel, LoadTest,
  251.      *                       DisableBothAccelDecel
  252.      *****************************************************************/
  253.     BOOL    m_bLoadTest;
  254.     BOOL    m_bDoAccel;
  255.     BOOL    m_bDoDecel;
  256.     BOOL    m_bDisableBothAccelDecel;
  257.     HXFLOAT m_fAccelerationFactor;
  258. #ifndef GOLD
  259.     IHXErrorMessages* m_pEM;
  260. #endif
  261.     void Recalc();
  262.     void RecalcAccel();
  263.  
  264.     friend class ASMSourceInfo;
  265. };
  266. #endif  /* ifndef _HXSM_H_ */