vidrend.h
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:28k
源码类别:

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: vidrend.h,v 1.14.4.1 2004/07/09 01:54:58 hubbe Exp $
  3.  * 
  4.  * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
  5.  * 
  6.  * The contents of this file, and the files included with this file,
  7.  * are subject to the current version of the RealNetworks Public
  8.  * Source License (the "RPSL") available at
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed
  10.  * the file under the current version of the RealNetworks Community
  11.  * Source License (the "RCSL") available at
  12.  * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
  13.  * will apply. You may also obtain the license terms directly from
  14.  * RealNetworks.  You may not use this file except in compliance with
  15.  * the RPSL or, if you have a valid RCSL with RealNetworks applicable
  16.  * to this file, the RCSL.  Please see the applicable RPSL or RCSL for
  17.  * the rights, obligations and limitations governing use of the
  18.  * contents of the file.
  19.  * 
  20.  * Alternatively, the contents of this file may be used under the
  21.  * terms of the GNU General Public License Version 2 or later (the
  22.  * "GPL") in which case the provisions of the GPL are applicable
  23.  * instead of those above. If you wish to allow use of your version of
  24.  * this file only under the terms of the GPL, and not to allow others
  25.  * to use your version of this file under the terms of either the RPSL
  26.  * or RCSL, indicate your decision by deleting the provisions above
  27.  * and replace them with the notice and other provisions required by
  28.  * the GPL. If you do not delete the provisions above, a recipient may
  29.  * use your version of this file under the terms of any one of the
  30.  * RPSL, the RCSL or the GPL.
  31.  * 
  32.  * This file is part of the Helix DNA Technology. RealNetworks is the
  33.  * developer of the Original Code and owns the copyrights in the
  34.  * portions it created.
  35.  * 
  36.  * This file, and the files included with this file, is distributed
  37.  * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
  38.  * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
  39.  * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
  40.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
  41.  * ENJOYMENT OR NON-INFRINGEMENT.
  42.  * 
  43.  * Technology Compatibility Kit Test Suite(s) Location:
  44.  *    http://www.helixcommunity.org/content/tck
  45.  * 
  46.  * Contributor(s):
  47.  * 
  48.  * ***** END LICENSE BLOCK ***** */
  49. #ifndef _VIDREND_H_
  50. #define _VIDREND_H_
  51. /****************************************************************************
  52.  *  Includes
  53.  */
  54. #include "vidrendf.h"
  55. #include "hxplugn.h"
  56. #include "hxrendr.h"
  57. #include "hxwin.h"
  58. #include "hxsite2.h"
  59. #include "hxasm.h"
  60. #include "hxmon.h"
  61. #include "hxpcmkr.h"
  62. #include "hxcore.h"
  63. #include "hxprefs.h"
  64. #include "hxtick.h"
  65. #include "cringbuf.h"
  66. #include "vidstats.h"
  67. /****************************************************************************
  68.  *  CVideoRenderer
  69.  */
  70. class CVideoRenderer : public IHXPlugin, 
  71.        public IHXRenderer, 
  72.        public IHXSiteUser,
  73.        public IHXInterruptSafe,
  74.        public IHXCallback,
  75.        public IHXStatistics,
  76.        public IHXRenderTimeLine,
  77.        public IHXPaceMakerResponse,
  78. #ifdef HELIX_FEATURE_VIDREND_UNTIMED_DECODE
  79.        public IHXUntimedRenderer,
  80. #endif /* HELIX_FEATURE_VIDREND_UNTIMED_DECODE */
  81.        public IHXUpdateProperties
  82. {
  83. private:
  84.     class CSetSizeCB : public IHXCallback
  85.     {
  86.     public:
  87. CSetSizeCB(IHXSite* pSite)
  88.     : m_lRefCount(0)
  89.     , m_pSite(pSite)
  90. {
  91.     HX_ASSERT(m_pSite);
  92.     m_pSite->AddRef();
  93.     m_szViewFrame.cx = 0;
  94.     m_szViewFrame.cy = 0;
  95. }
  96. ~CSetSizeCB()
  97. {
  98.     HX_RELEASE(m_pSite);
  99. }
  100. STDMETHOD(QueryInterface) (THIS_
  101.  REFIID riid,
  102.  void** ppvObj);
  103. STDMETHOD_(ULONG32,AddRef) (THIS);
  104. STDMETHOD_(ULONG32,Release) (THIS);
  105. STDMETHOD(Func) (THIS);
  106. void SetSize(HXxSize szViewFrame)
  107. {
  108.     m_szViewFrame = szViewFrame;
  109. }
  110.     private:
  111. LONG32     m_lRefCount;
  112. IHXSite*   m_pSite;
  113. HXxSize     m_szViewFrame;
  114.     };
  115.     typedef enum 
  116.     { 
  117. Stopped, 
  118. Buffering, 
  119. PlayStarting,
  120. Playing, 
  121. Paused, 
  122. Seeking
  123.     } PlayState;
  124.     static const char* const  zm_pDescription;
  125.     static const char* const zm_pCopyright;
  126.     static const char* const  zm_pMoreInfoURL;
  127.     static const char* const zm_pStreamMimeTypes[];
  128.     LONG32 m_lRefCount;
  129.     HXMutex* m_pMutex;
  130.     HXMutex* m_pBltMutex;
  131.     HXMutex* m_pVSMutex;
  132.     IHXScheduler* m_pScheduler;
  133.     IHXOptimizedScheduler* m_pOptimizedScheduler;
  134.     IHXPaceMaker* m_pDecoderPump;
  135.     IHXPaceMaker* m_pBltrPump;
  136.     ULONG32 m_ulDecoderPacemakerId;
  137.     ULONG32 m_ulBltrPacemakerId;
  138.     LONG32 m_lDecodePriority;
  139.     CVideoFormat* m_pDecoderVideoFormat;
  140.     CVideoFormat* m_pBltrVideoFormat;
  141. #if defined(HELIX_FEATURE_STATS)
  142.     CVideoStatistics* m_pVideoStats;
  143. #else
  144.     void*                               m_pVideoStats;
  145. #endif /* HELIX_FEATURE_STATS */
  146.     ULONG32 m_lTimeLineOffset;
  147.     ULONG32 m_ulStreamBaseTime;
  148.     ULONG32 m_ulBaseTime;
  149.     ULONG32 m_ulTimeNormalizationOffset;
  150.     BOOL m_bIsScheduledCB;
  151.     ULONG32 m_ulLateFrameTol;
  152.     ULONG32 m_ulEarlyFrameTol;
  153.     ULONG32 m_ulMaxOptimizedVideoLead;
  154.     ULONG32 m_ulNoFramesPollingInterval;
  155.     ULONG32 m_ulMaxSleepTime;
  156.     ULONG32 m_ulBltPacketQueueSize;
  157.     BOOL m_bSchedulerStartRequested;
  158.     BOOL m_bPendingCallback;
  159.     CallbackHandle m_hPendingHandle;
  160.     ULONG32 m_ulCallbackCounter;
  161.     BOOL m_bSiteAttached;
  162.     BOOL m_bDecoderRunning;
  163.     PlayState m_PlayState; 
  164.     ULONG32 m_ulBytesToBuffer;
  165.     ULONG32 m_ulAvgBitRate;
  166.     ULONG32 m_ulPreroll;
  167.     ULONG32 m_ulBufferingStartTime;
  168.     ULONG32 m_ulBufferingStopTime;
  169.     ULONG32 m_ulBufferingTimeOut;
  170.     BOOL m_bBufferingOccured;
  171.     BOOL m_bBufferingNeeded;
  172.     BOOL m_bFirstFrame;
  173.     BOOL m_bBaseTimeSet;
  174.     BOOL m_bFirstSurfaceUpdate;
  175.     BOOL m_bPendingRedraw;
  176.     BOOL m_bVS1UpdateInProgress;
  177.     HXBitmapInfoHeader m_BitmapInfoHeader;
  178.     HXBitmapInfoHeader* m_pVSurf2InputBIH;
  179.     CRingBuffer* m_pBltPacketQueue;
  180. protected:
  181.     BOOL m_bBitmapSet;
  182. private:
  183.     BOOL m_bFrameSizeInitialized;
  184.     BOOL m_bWinSizeFixed;
  185.     BOOL m_bOptimizedBlt;
  186.     BOOL m_bOSGranuleBoost;
  187.     BOOL m_bOSGranuleBoostVS2;
  188.     BOOL m_bTryVideoSurface2;
  189.     BOOL m_bUseVideoSurface2;
  190.     BOOL m_bVideoSurface2Transition;
  191.     BOOL m_bVideoSurface1Requested;
  192.     BOOL m_bVideoSurfaceInitialized;
  193.     BOOL m_bVideoSurfaceReinitRequested;
  194.     BOOL m_bVS2BufferUnavailableOnLastBlt;
  195.     BOOL m_bPresentInProgress;
  196.     ULONG32 m_ulHWBufCount;
  197.     ULONG32 m_ulConfigHWBufCount;
  198.     ULONG32 m_ulSyncInterval;
  199.     ULONG32 m_ulSyncSmoothingDepth;
  200.     ULONG32 m_ulSyncGoalSmoothingDepth;
  201.     ULONG32 m_ulSpeedupGoalSmoothingDepth;
  202.     ULONG32 m_ulBadSeqSampleCount;
  203.     ULONG32 m_ulGoodSeqSampleCount;
  204.     ULONG32 m_ulMaxBadSeqSamples;
  205.     double m_fTrendSyncDelta;
  206.     
  207.     HXxSize m_SetWinSize;
  208.     HXxSize m_LastSetSize;
  209.     HXxRect* m_pClipRect;
  210.     HXxRect m_rViewRect;
  211.     CSetSizeCB* m_pResizeCB;
  212.     void Render(BOOL bMarker, BYTE* pData, ULONG32 ulSize, BOOL bLate);
  213.     
  214.     HX_RESULT CheckStreamVersions (IHXValues* pHeader);
  215.     BOOL _ResizeViewFrame(HXxSize szViewFrame,
  216.   BOOL bMutex,
  217.   BOOL bForceSyncResize,
  218.   BOOL bDefaultResize);
  219.     HX_RESULT UpdateDisplay(HXxEvent* pEvent, 
  220.     BOOL bSystemEvent = FALSE,
  221.     BOOL bIsVisible = TRUE);
  222. protected:    
  223.     HX_RESULT UpdateVideoSurface(IHXVideoSurface* pVideoSurface,
  224.  CMediaPacket* pVideoPacket,
  225.  HXxRect &destRect,
  226.  HXxRect &sorcRect,
  227.  BOOL bOptimizedBlt);
  228.     HX_RESULT UpdateVideoSurface2(IHXVideoSurface* pVideoSurface,
  229.   HXxRect &destRect,
  230.   HXxRect &sorcRect,
  231.   BOOL bRefresh,
  232.   BOOL bSystemEvent);
  233. private:    
  234.     HX_RESULT FlushVideoSurface2(IHXSite* pSite);
  235.     inline HX_RESULT SwitchToVideoSurface1(void);
  236.     inline HX_RESULT SwitchToVideoSurface2(void);
  237.     BOOL ForceRefresh(void);
  238.     void ForceDisplayUpdate(BOOL bInternalSurfaceUpdateOnly = FALSE,
  239.     BOOL bHasVisibleSurface = TRUE);
  240.     inline HX_RESULT ForceDisplayUpdateOnSite(IHXSite* pSite, 
  241.       BOOL bInternalSurfaceUpdateOnly,
  242.       BOOL bHasVisibleSurface);
  243.     void PresentFrame(void);
  244.     HX_RESULT InitVideoSurface1(BOOL bUsedVideoSurface2,
  245. IHXVideoSurface* pVideoSurface = NULL);
  246.     HX_RESULT InitVideoSurface2(ULONG32 ulWidth, ULONG32 ulHeight);
  247.     HX_RESULT StartSchedulers(void);
  248.     inline BOOL ShouldKickStartScheduler();
  249.     HX_RESULT ScheduleCallback(UINT32 ulRelativeTime, 
  250.        BOOL bIsScheduled = FALSE,
  251.        UINT32 ulBaseTime = 0);
  252.     void SchedulerCallback(BOOL bIsScheduled,
  253.    BOOL bResched = TRUE,
  254.    BOOL bIsVS2Call = FALSE,
  255.    BOOL bProcessUndisplayableFramesOnly = FALSE);
  256.     
  257.     inline CallbackHandle ScheduleRelativeCallback(UINT32 ulRelativeTime,
  258.    IHXCallback* pCallback);
  259.     inline CallbackHandle ScheduleAbsoluteCallback(HXTimeval &hxTime,
  260.    IHXCallback* pCallback);
  261.     void RemoveCallback(CallbackHandle &hCallback);
  262.     HX_RESULT BeginOptimizedBlt(HXBitmapInfoHeader* pBitmapInfo);
  263.     void EndOptimizedBlt(void);
  264.     inline void RequestBuffering(void);
  265.     inline void RequestBufferingEnd(void);
  266.     HX_RESULT BeginBuffering(void);
  267.     HX_RESULT EndBuffering(void);
  268.     inline BOOL IsBufferingComplete(IHXPacket* pPacket = NULL);
  269.     void ReleasePacket(CMediaPacket* pPacket,
  270.        BOOL bForceKill = FALSE);
  271.     void ClearBltPacketQueue(void);
  272.     BOOL IsDecoderRunning(void)     { return m_bDecoderRunning; }
  273.     HX_RESULT OnDecoderStart(void);
  274.     HX_RESULT OnDecoderEnd(void);
  275.     BOOL OnDecode(void);
  276.     void DisplayMutex_Lock(void)
  277.     {
  278. m_pBltMutex->Lock();
  279. m_pVSMutex->Lock();
  280.     }
  281.     void DisplayMutex_Unlock(void)
  282.     {
  283. m_pVSMutex->Unlock();
  284. m_pBltMutex->Unlock();
  285.     }
  286. protected:
  287.     CVideoFormat* m_pVideoFormat;
  288. public:
  289.     /*
  290.      * Costructor
  291.      */
  292.     CVideoRenderer(void);
  293.     /*
  294.      * Destructor
  295.      */
  296.     virtual ~CVideoRenderer();
  297.     /*
  298.      * IUnknown methods
  299.      */
  300.     STDMETHOD(QueryInterface) (THIS_
  301. REFIID riid,
  302. void** ppvObj);
  303.     STDMETHOD_(ULONG32,AddRef) (THIS);
  304.     STDMETHOD_(ULONG32,Release) (THIS);
  305.     /*
  306.      * IHXPlugin methods
  307.      */
  308.     /************************************************************************
  309.      * Method:
  310.      *     IHXPlugin::GetPluginInfo
  311.      * Purpose:
  312.      *     Returns the basic information about this plugin. Including:
  313.      *
  314.      *     bLoadMultiple whether or not this plugin DLL can be loaded
  315.      * multiple times. All File Formats must set
  316.      * this value to TRUE.
  317.      *     pDescription which is used in about UIs (can be NULL)
  318.      *     pCopyright which is used in about UIs (can be NULL)
  319.      *     pMoreInfoURL which is used in about UIs (can be NULL)
  320.      */
  321.     STDMETHOD(GetPluginInfo) (THIS_
  322. REF(BOOL)  /*OUT*/ bLoadMultiple,
  323. REF(const char*) /*OUT*/ pDescription,
  324. REF(const char*) /*OUT*/ pCopyright,
  325. REF(const char*) /*OUT*/ pMoreInfoURL,
  326. REF(ULONG32)  /*OUT*/ ulVersionNumber
  327. );
  328.     /************************************************************************
  329.      * Method:
  330.      *     IHXPlugin::InitPlugin
  331.      * Purpose:
  332.      *     Initializes the plugin for use. This interface must always be
  333.      *     called before any other method is called. This is primarily needed 
  334.      *     so that the plugin can have access to the context for creation of
  335.      *     IHXBuffers and IMalloc.
  336.      */
  337.     STDMETHOD(InitPlugin)   (THIS_
  338.     IUnknown*   /*IN*/  pContext);
  339.     
  340.     /*
  341.      * IHXRenderer methods
  342.      */
  343.     /************************************************************************
  344.      * Method:
  345.      *     IHXRenderer::GetRendererInfo
  346.      * Purpose:
  347.      *     Returns information vital to the instantiation of rendering 
  348.      *     plugins.
  349.      */
  350.     STDMETHOD(GetRendererInfo) (THIS_
  351. REF(const char**) /*OUT*/ pStreamMimeTypes,
  352. REF(UINT32)      /*OUT*/ unInitialGranularity
  353. );
  354.     /////////////////////////////////////////////////////////////////////////
  355.     // Method:
  356.     //     IHXRenderer::StartStream
  357.     // Purpose:
  358.     //     Called by client engine to inform the renderer of the stream it
  359.     //     will be rendering. The stream interface can provide access to
  360.     //     its source or player. This method also provides access to the 
  361.     //     primary client controller interface.
  362.     //
  363.     STDMETHOD (StartStream) (THIS_
  364. IHXStream*     pStream,
  365. IHXPlayer*     pPlayer);
  366.     /////////////////////////////////////////////////////////////////////////
  367.     // Method:
  368.     //     IHXRenderer::EndStream
  369.     // Purpose:
  370.     //     Called by client engine to inform the renderer that the stream
  371.     //     is was rendering is closed.
  372.     //
  373.     STDMETHOD (EndStream) (THIS);
  374.     /////////////////////////////////////////////////////////////////////////
  375.     // Method:
  376.     // IHXRenderer::OnHeader
  377.     // Purpose:
  378.     // Called by client engine when a header for this renderer is 
  379.     // available. The header will arrive before any packets.
  380.     //
  381.     STDMETHOD (OnHeader) (THIS_
  382. IHXValues*     pHeader);
  383.     /////////////////////////////////////////////////////////////////////////
  384.     // Method:
  385.     //     IHXRenderer::OnPacket
  386.     // Purpose:
  387.     //     Called by client engine when a packet for this renderer is 
  388.     //     due.
  389.     //
  390.     STDMETHOD (OnPacket) (THIS_
  391. IHXPacket*     pPacket,
  392. LONG32     lTimeOffset);
  393.     /////////////////////////////////////////////////////////////////////////
  394.     // Method:
  395.     //     IHXRenderer::OnTimeSync
  396.     // Purpose:
  397.     //     Called by client engine to inform the renderer of the current
  398.     //     time relative to the streams synchronized time-line. The 
  399.     //     renderer should use this time value to update its display or
  400.     //     render it's stream data accordingly.
  401.     //
  402.     STDMETHOD (OnTimeSync) (THIS_
  403. ULONG32     ulTime);
  404.     /////////////////////////////////////////////////////////////////////////
  405.     //  Method:
  406.     //     IHXRenderer::OnPreSeek
  407.     //  Purpose:
  408.     //     Called by client engine to inform the renderer that a seek is
  409.     //     about to occur. The render is informed the last time for the 
  410.     //     stream's time line before the seek, as well as the first new
  411.     //     time for the stream's time line after the seek will be completed.
  412.     //
  413.     STDMETHOD (OnPreSeek) (THIS_
  414. ULONG32     ulOldTime,
  415. ULONG32     ulNewTime);
  416.     /////////////////////////////////////////////////////////////////////////
  417.     // Method:
  418.     //     IHXRenderer::OnPostSeek
  419.     // Purpose:
  420.     //     Called by client engine to inform the renderer that a seek has
  421.     //     just occured. The render is informed the last time for the 
  422.     //     stream's time line before the seek, as well as the first new
  423.     //     time for the stream's time line after the seek.
  424.     //
  425.     STDMETHOD (OnPostSeek) (THIS_
  426. ULONG32     ulOldTime,
  427. ULONG32     ulNewTime);
  428.     /////////////////////////////////////////////////////////////////////////
  429.     // Method:
  430.     //     IHXRenderer::OnPause
  431.     // Purpose:
  432.     //     Called by client engine to inform the renderer that a pause has
  433.     //     just occured. The render is informed the last time for the 
  434.     //     stream's time line before the pause.
  435.     //
  436.     STDMETHOD (OnPause) (THIS_
  437. ULONG32     ulTime);
  438.     /////////////////////////////////////////////////////////////////////////
  439.     // Method:
  440.     // IHXRenderer::OnBegin
  441.     // Purpose:
  442.     // Called by client engine to inform the renderer that a begin or
  443.     // resume has just occured. The render is informed the first time 
  444.     // for the stream's time line after the resume.
  445.     //
  446.     STDMETHOD (OnBegin) (THIS_
  447. ULONG32     ulTime);
  448.     /////////////////////////////////////////////////////////////////////////
  449.     // Method:
  450.     // IHXRenderer::OnBuffering
  451.     // Purpose:
  452.     // Called by client engine to inform the renderer that buffering
  453.     // of data is occuring. The render is informed of the reason for
  454.     // the buffering (start-up of stream, seek has occured, network
  455.     // congestion, etc.), as well as percentage complete of the 
  456.     // buffering process.
  457.     //
  458.     STDMETHOD (OnBuffering) (THIS_
  459. ULONG32     ulFlags,
  460. UINT16     unPercentComplete);
  461.     /////////////////////////////////////////////////////////////////////////
  462.     // Method:
  463.     // IHXRenderer::GetDisplayType
  464.     // Purpose:
  465.     // Called by client engine to ask the renderer for it's preferred
  466.     // display type. When layout information is not present, the 
  467.     // renderer will be asked for it's prefered display type. Depending
  468.     // on the display type a buffer of additional information may be 
  469.     // needed. This buffer could contain information about preferred
  470.     // window size.
  471.     //
  472.     STDMETHOD (GetDisplayType) (THIS_
  473. REF(HX_DISPLAY_TYPE) ulFlags,
  474. REF(IHXBuffer*) pBuffer);
  475.     /************************************************************************
  476.      * Method:
  477.      *     IHXRenderer::OnEndofPackets
  478.      * Purpose:
  479.      *     Called by client engine to inform the renderer that all the
  480.      *     packets have been delivered. However, if the user seeks before
  481.      *     EndStream() is called, renderer may start getting packets again
  482.      *     and the client engine will eventually call this function again.
  483.      */
  484.     STDMETHOD(OnEndofPackets) (THIS);
  485.     /*
  486.      * IHXSiteUser methods called by the "context" to 
  487.      * associate users with the site.
  488.      */
  489.     STDMETHOD(AttachSite) (THIS_
  490. IHXSite* /*IN*/ pSite);
  491.     STDMETHOD(DetachSite) (THIS);
  492.     STDMETHOD_(BOOL,NeedsWindowedSites) (THIS);
  493.     STDMETHOD_(BOOL, IsInterruptSafe) (THIS) { return TRUE; }
  494.     /*
  495.      * IHXSiteUser methods called to inform user of an event.
  496.      */
  497.     STDMETHOD(HandleEvent) (THIS_
  498. HXxEvent* /*IN*/ pEvent);
  499.     /*
  500.      * IHXCallback method - backbone of renderer scheduling
  501.      */
  502.     /************************************************************************
  503.      * Method:
  504.      *     IHXCallback::Func
  505.      * Purpose:
  506.      *     This is the function that will be called when a callback is
  507.      *     to be executed.
  508.      */
  509.     STDMETHOD(Func) (THIS);
  510.     /*
  511.      * IHXStatistics methods
  512.      */
  513.     STDMETHOD(InitializeStatistics) (THIS_ UINT32 ulRegistryID);
  514.     STDMETHOD(UpdateStatistics)     (THIS);
  515.     /*
  516.      * IHXUntimedRenderer methods
  517.      */
  518. #ifdef HELIX_FEATURE_VIDREND_UNTIMED_DECODE
  519.     STDMETHOD_(BOOL,IsUntimedRendering)(THIS);
  520.     STDMETHOD_(HX_RESULT,SetUntimedRendering)(THIS_ BOOL);
  521. #endif /* HELIX_FEATURE_VIDREND_UNTIMED_DECODE */
  522.     /************************************************************************
  523.      * Method:
  524.      *     IHXUpdateProperties::UpdatePacketTimeOffset
  525.      * Purpose:
  526.      *     Call this method to update the timestamp offset of cached packets
  527.      */
  528.     STDMETHOD(UpdatePacketTimeOffset) (THIS_ INT32 lTimeOffset);
  529.     /************************************************************************
  530.      * Method:
  531.      *     IHXUpdateProperties::UpdatePlayTimes
  532.      * Purpose:
  533.      *     Call this method to update the playtime attributes
  534.      */
  535.     STDMETHOD(UpdatePlayTimes)       (THIS_
  536.        IHXValues* pProps);
  537.     /************************************************************************
  538.      *  Method:
  539.      *      IHXRenderTimeLine::GetTimeLineValue
  540.      *  Purpose:
  541.      *      Get the current presentation time
  542.      *
  543.      *  Notes:
  544.      *      returns HXR_TIMELINE_SUSPENDED when the time line is suspended
  545.      */
  546.     STDMETHOD (GetTimeLineValue) (THIS_ /*OUT*/ REF(UINT32) ulTime);
  547.     /*
  548.      * IHXPaceMakerResponse
  549.      */
  550.     STDMETHOD(OnPaceStart) (THIS_
  551. ULONG32 ulId);
  552.     STDMETHOD(OnPaceEnd) (THIS_
  553. ULONG32 ulId);
  554.     STDMETHOD(OnPace) (THIS_
  555. ULONG32 ulId);
  556.     /************************************************************************
  557.      * Public CVideoRenderer functions
  558.      */
  559.     virtual BOOL ResizeViewFrame(HXxSize szViewFrame, BOOL bMutex = TRUE);
  560.     
  561.     void BltIfNeeded(void) 
  562.     {
  563. if (m_bUseVideoSurface2)
  564. {
  565.     if (m_PlayState == Playing)
  566.     {
  567. if (m_bOSGranuleBoostVS2)
  568. {
  569.     ForceDisplayUpdate(TRUE);
  570. }
  571.     }
  572.     else
  573.     {
  574. SchedulerCallback(FALSE,    // not scheduled 
  575.   FALSE,    // do not resched    
  576.   TRUE,     // is VS2 call
  577.   TRUE);    // process non-displayable frames only
  578. if (m_pBltrPump)
  579. {
  580.     m_pBltrPump->Signal();
  581. }
  582.     }
  583. }
  584. else if (m_hPendingHandle != ((CallbackHandle) NULL))
  585. {
  586.             if ((!m_bVS1UpdateInProgress) &&
  587.                 (m_bOSGranuleBoost || (m_PlayState != Playing)))
  588.     {
  589. SchedulerCallback(m_bIsScheduledCB, FALSE);
  590.     }
  591. }
  592.     }
  593.     LONG32 ComputeTimeAhead(ULONG32 ulTime, 
  594.     ULONG32 ulTolerance, 
  595.     ULONG32* p_ulBaseTime = NULL)
  596.     {
  597. LONG32 lTimeAhead = ulTime;
  598. ULONG32 ulTimeNow = 0;
  599. if (m_PlayState == Playing)
  600. {
  601.     ulTimeNow = HX_GET_BETTERTICKCOUNT();
  602.     /***
  603.     lTimeAhead = ((LONG32) (ulTime - m_ulBaseTime + ulTolerance)) -
  604.   ((LONG32) (ulTimeNow - m_ulStreamBaseTime));
  605.     ***/
  606.     lTimeAhead = (LONG32) (ulTime + ulTolerance - 
  607.    ulTimeNow + m_ulTimeNormalizationOffset);
  608. }
  609. else
  610. {
  611.     lTimeAhead = (LONG32) (ulTime - m_ulBaseTime - m_lTimeLineOffset);
  612. }
  613. if (p_ulBaseTime)
  614. {
  615.     *p_ulBaseTime = ulTimeNow;
  616. }
  617. #ifdef HELIX_FEATURE_VIDREND_UNTIMED_DECODE
  618. // In untimed mode, we have to present a false timeline so anybody calling this thinks
  619. //  we are running just a bit ahead of real time. The way we do this is relating the
  620. //  reference packet time (ulTime) to the current packet time, rather than against real
  621. //  time.
  622. if( m_bUntimedRendering )
  623. {
  624.     return ulTime - (INT32)m_ulActiveVideoTime;
  625. }
  626. #endif /* HELIX_FEATURE_VIDREND_UNTIMED_DECODE */
  627. return lTimeAhead;
  628.     }
  629.     LONG32 DiffTime(ULONG32 t1, ULONG32 t2)  { return ((LONG32) (t1 - t2)); }
  630.     IUnknown* GetContext(void)
  631.     {
  632. return m_pContext;
  633.     }
  634.     IHXPreferences* GetPreferences(void)
  635.     {
  636. return m_pPreferences;
  637.     }
  638.     const HXBitmapInfoHeader* GetCurrentBitmapInfo(void)
  639.     {
  640. return &m_BitmapInfoHeader;
  641.     }
  642.     IHXSite* GetAttachedSite(void)
  643.     {
  644. return m_pMISUSSite;
  645.     }
  646.     void ReleaseFramePacket(CMediaPacket *pPacket);
  647.     HX_RESULT LocalizeActiveVideoPacket(void);
  648.     inline BOOL IsActive(void)    { return (m_PlayState == Playing); }
  649.     inline BOOL IsSeeking(void)    { return (m_PlayState == Seeking); }
  650.     HX_RESULT SetDecodePriority(LONG32 lPriority);
  651. #if defined(HELIX_FEATURE_STATS)
  652.     /************************************************************************
  653.      * Public Statistics Methods
  654.      */
  655.     void ReportLostFrame(ULONG32 ulCount = 1)
  656.     {
  657. m_pVideoStats->ReportLostFrame(ulCount);
  658.     }
  659.     void ReportDroppedFrame(ULONG32 ulCount = 1)  
  660.     {
  661. m_pVideoStats->ReportDroppedFrame(ulCount);
  662.     }
  663.     HX_RESULT ReportStat(VideoStatEntryID eEntryID, const char* pVal)
  664.     {
  665. return m_pVideoStats->ReportStat(eEntryID, pVal);
  666.     }
  667.     
  668.     HX_RESULT ReportStat(VideoStatEntryID eEntryID, INT32 lVal)
  669.     {
  670. return m_pVideoStats->ReportStat(eEntryID, lVal);
  671.     }
  672. #else // HELIX_FEATURE_STATS
  673.     /************************************************************************
  674.      * Public Statistics Methods
  675.      */
  676.     void ReportLostFrame(ULONG32 ulCount = 1)
  677.     {
  678. return;
  679.     }
  680.     void ReportDroppedFrame(ULONG32 ulCount = 1)  
  681.     {
  682. return;
  683.     }
  684.     HX_RESULT ReportStat(VideoStatEntryID eEntryID, const char* pVal)
  685.     {
  686. return HXR_OK;
  687.     }
  688.     
  689.     HX_RESULT ReportStat(VideoStatEntryID eEntryID, INT32 lVal)
  690.     {
  691. return HXR_OK;
  692.     }
  693. #endif // HELIX_FEATURE_STATS
  694. protected:
  695.     /*
  696.      * Renderer's customizable fuctions - can be called any time
  697.      */
  698.     /*
  699.      * Fixed Renderer Configuration - must be callable at any time
  700.      */
  701.     virtual const char* GetUpgradeMimeType(void);
  702.     virtual const char* GetRendererName(void);
  703.     virtual const char* GetCodecName(void);
  704.     virtual const char* GetCodecFourCC(void);
  705.     /*
  706.      * Renderer Configuration - must be callable any time
  707.      *                           after reception of the header
  708.      */
  709.     virtual void GetStreamVersion(ULONG32 &ulThisMajorVersion, 
  710.   ULONG32 &ulThisMinorVersion);
  711.     virtual void GetContentVersion(ULONG32 &ulThisMajorVersion, 
  712.    ULONG32 &ulThisMinorVersion);
  713.     virtual ULONG32 GetLateFrameTolerance(void);
  714.     virtual ULONG32 GetEarlyFrameTolerance(void);
  715.     virtual ULONG32 GetMaxOptimizedVideoLead(void);
  716.     virtual ULONG32 GetBltPacketQueueSize(void);
  717.     virtual ULONG32 GetSyncGoalSmoothingDepth(void);
  718.     virtual ULONG32 GetSpeedupGoalSmoothingDepth(void);
  719.     virtual ULONG32 GetNoFramesPollingInterval(void);
  720.     virtual ULONG32 GetMaxSleepTime(void);
  721.     virtual ULONG32 GetMaxBadSeqSamples(void);
  722.     virtual LONG32 GetDecodePriority(void);
  723.     virtual CVideoFormat* CreateFormatObject(IHXValues* pHeader);
  724.     
  725.     /*
  726.      * Renderer Setup - must be callable after the renderer attaches the site
  727.      */
  728.     virtual void SetupBitmapDefaults(IHXValues* pHeader,
  729.      HXBitmapInfoHeader &bitmapInfoHeader);
  730.     virtual void FormatAndSetViewFrame(HXxRect* pClipRect,
  731.        HXBitmapInfoHeader &bitmapInfoHeader,
  732.        HXxRect &rViewRect,
  733.        BOOL bMutex = TRUE);
  734.     /*
  735.      * Renderer Execution - must be callable anytime
  736.      */
  737.     virtual HX_RESULT OnOptimizedVideo(HX_RESULT status,
  738.        const HXBitmapInfoHeader& sourceBIH,
  739.        HXBitmapInfoHeader &targetBIH, 
  740.        ULONG32 &ulTargetBufCount);
  741.     virtual void OffOptimizedVideo(void);
  742.     virtual HX_RESULT TransferOptimizedVideo(IHXVideoSurface2* pVideoSurface2,
  743.                                              VideoMemStruct* pVideoMemoryInfo,
  744.                                              CMediaPacket* pVideoPacket,
  745.                                              const HXBitmapInfoHeader& sorcBIH,
  746.                                              HXxRect &destRect,
  747.                                              HXxRect &sorcRect);
  748.     virtual void AdjustVideoMapping(HXxRect &destRect, 
  749.     HXxRect &sorcRect,
  750.     CMediaPacket*pActiveVideoPacket);
  751.     virtual HX_RESULT InitExtraStats(void);
  752.     /*
  753.      * Base Renderer Setup - must be called if the base renderer overrides
  754.      &       the report of the related values to the core
  755.      */
  756.     void SetSyncInterval(ULONG32 ulSyncInterval);
  757.     /*
  758.      * Renderer's member variables sharable with the derived renderer
  759.      */
  760.     IUnknown* m_pContext;
  761.     IHXStream* m_pStream;
  762.     IHXValues* m_pHeader;
  763.     
  764.     IHXBackChannel* m_pBackChannel;
  765.     IHXMultiInstanceSiteUserSupplier* m_pMISUS;
  766.     IHXSite* m_pMISUSSite;
  767.     IHXCommonClassFactory* m_pCommonClassFactory;
  768.     IHXPreferences* m_pPreferences;
  769.     IHXRegistry* m_pRegistry;
  770.     ULONG32 m_ulRegistryID;
  771.     CMediaPacket* m_pActiveVideoPacket;
  772.     ULONG32 m_ulActiveVideoTime;
  773. #ifdef HELIX_FEATURE_VIDREND_UNTIMED_DECODE
  774.     BOOL m_bUntimedRendering;
  775. #endif /* HELIX_FEATURE_VIDREND_UNTIMED_DECODE */
  776.     BOOL m_bActiveVideoPacketLocalized;
  777. };
  778. #endif // _VIDREND_H_