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

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 _HXVSURF_H_
  36. #define _HXVSURF_H_
  37. /*
  38.  * Forward declarations of some interfaces defined or used here-in.
  39.  */
  40. typedef _INTERFACE  IHXBuffer IHXBuffer;
  41. typedef _INTERFACE  IHXValues IHXValues;
  42. /****************************************************************************
  43.  *
  44.  *  Video Surface Data Structures and Constants
  45.  */
  46. typedef struct _HXBitmapInfoHeader
  47. {
  48.     UINT32  biSize;
  49.     INT32   biWidth;
  50.     INT32   biHeight;
  51.     UINT16  biPlanes;
  52.     UINT16  biBitCount;
  53.     UINT32  biCompression;
  54.     UINT32  biSizeImage;
  55.     INT32   biXPelsPerMeter;
  56.     INT32   biYPelsPerMeter;
  57.     UINT32  biClrUsed;
  58.     UINT32  biClrImportant;
  59.     UINT32  rcolor;
  60.     UINT32  gcolor;
  61.     UINT32  bcolor;
  62. } HXBitmapInfoHeader;
  63. /*
  64.  * HXBitmapInfo structure.
  65.  */
  66. typedef struct _HXBitmapInfo
  67. {
  68.     struct
  69.     {
  70.         UINT32  biSize;         /* use OFFSETOF(dwBitMask) here     */
  71.         INT32   biWidth;        /* image width (in pixels)          */
  72.         INT32   biHeight;       /* image height                     */
  73.         UINT16  biPlanes;       /* # of bitplanes; always use 1     */
  74.         UINT16  biBitCount;     /* average # bits/pixel             */
  75.         UINT32  biCompression;  /* one of the RMA_... FOURCC codes  */
  76.         UINT32  biSizeImage;    /* = width * height * bitCount / 8  */
  77.         INT32   biXPelsPerMeter;/* always 0                         */
  78.         INT32   biYPelsPerMeter;/* always 0                         */
  79.         UINT32  biClrUsed;      /* !0, if 8-bit RGB; 0, otherwise   */
  80.         UINT32  biClrImportant; /* !0, if 8-bit RGB; 0, otherwise   */
  81.     } bmiHeader;
  82.     union
  83.     {
  84.         UINT32  dwBitMask[3];   /* color masks (for BI_BITFIELDS)   */
  85.         UINT32  dwPalette[256]; /* palette (for 8-bit RGB image)    */
  86.     } un;
  87. } HXBitmapInfo;
  88. typedef UINT32  HX_COMPRESSION_TYPE;
  89. /*
  90.  * Structure for source inputs used in IHXVideoSurface2::ColorConvert
  91.  */
  92. typedef struct _tagSourceInputStruct
  93. {
  94.     UCHAR*  *aSrcInput;
  95.     INT32   *aSrcPitch;
  96.     INT32   nNumInputs;
  97. } SourceInputStruct;
  98. /*
  99.  * Structure for alpha blending in IHXVideoSurface2
  100.  */
  101. typedef struct _tagAlphaStruct
  102. {
  103.     UCHAR*      pBuffer;        /* buffer for source image data     */
  104.     UINT32      ulFourCC;       /* fourcc of pBuffer                */
  105.     INT32       lPitch;         /* pitch of pBuffer                 */
  106.     UINT32      ulImageWidth;   /* source image width               */
  107.     UINT32      ulImageHeight;  /* source image height              */
  108.     HXxRect     rcImageRect;    /* subrect of src image requested   */ 
  109. } AlphaStruct;
  110. /*
  111.  * Structure for IHXVideoSurface2::GetVideoMem
  112.  */
  113. typedef struct _tagVideoMemStruct
  114. {
  115.     UCHAR*          pVidMem;    /* pointer to video memory          */
  116.     INT32           lPitch;     /* pitch of pVidMem                 */
  117.     HXBitmapInfoHeader  bmi;   /* desciption of pVidMem            */
  118.     AlphaStruct*    pAlphaList; /* alpha blending list              */
  119.     UINT32          ulCount;    /* alpha blending list length       */
  120. } VideoMemStruct;
  121. /*
  122.  * Windows DIB formats & MKFOURCC() macro:
  123.  */
  124. #ifndef BI_RGB
  125. #define BI_RGB          0L      /* RGB-8, 16, 24, or 32             */
  126. #define BI_RLE8         1L      /* 8-bit RLE compressed image       */
  127. #define BI_RLE4         2L      /* 4-bit RLE compressed image       */
  128. #define BI_BITFIELDS    3L      /* RGB 555, 565, etc.               */
  129. #endif
  130. #ifndef MKFOURCC
  131. #define MKFOURCC(c0,c1,c2,c3)   
  132.         ((UINT32)(BYTE)(c0) | ((UINT32)(BYTE)(c1) << 8) |   
  133.         ((UINT32)(BYTE)(c2) << 16) | ((UINT32)(BYTE)(c3) << 24))
  134. #endif
  135. /*
  136.  * RMA image formats:
  137.  */
  138. #define HX_RGB         BI_RGB  /* Windows-compatible RGB formats:  */
  139. #define HX_RLE8        BI_RLE8
  140. #define HX_RLE4        BI_RLE4
  141. #define HX_BITFIELDS   BI_BITFIELDS
  142. #define HX_I420        MKFOURCC('I','4','2','0') /* planar YCrCb   */
  143. #define HX_YV12        MKFOURCC('Y','V','1','2') /* planar YVU420  */
  144. #define HX_YUY2        MKFOURCC('Y','U','Y','2') /* packed YUV422  */
  145. #define HX_UYVY        MKFOURCC('U','Y','V','Y') /* packed YUV422  */
  146. #define HX_YVU9        MKFOURCC('Y','V','U','9') /* Intel YVU9     */
  147. #define HX_ARGB        MKFOURCC('A','R','G','B') /* ARGB32         */
  148. #define HX_DVPF        MKFOURCC('D','V','P','F') /* dvpf           */
  149. /*
  150.  * Non-standard FOURCC formats (these are just few aliases to what can be
  151.  * represented by the standard formats, and they are left for backward
  152.  * compatibility only).
  153.  */
  154. #define HXCOLOR_RGB3_ID     MKFOURCC('3','B','G','R') /* RGB-32 ??      */
  155. #define HXCOLOR_RGB24_ID    MKFOURCC('B','G','R',' ') /* top-down RGB-24*/
  156. #define HXCOLOR_RGB565_ID   MKFOURCC('6','B','G','R') /* RGB-16 565     */
  157. #define HXCOLOR_RGB555_ID   MKFOURCC('5','B','G','R') /* RGB-16 555     */
  158. #define HXCOLOR_8BIT_ID     MKFOURCC('T','I','B','8') /* RGB-8 w. pal-e */
  159. #define HXCOLOR_YUV420_ID   MKFOURCC('2','V','U','Y') /* planar YCrCb   */
  160. #define HXCOLOR_YUVA_ID     MKFOURCC('Y','U','V','A') /* planar YCrCb   */
  161. #define HXCOLOR_YUV411_ID   MKFOURCC('1','V','U','Y') /* ???            */
  162. #define HXCOLOR_YUVRAW_ID   MKFOURCC('R','V','U','Y') /* ???            */
  163. /*
  164.  * Flags for IHXVideoSurface2
  165.  */
  166. /* Flags for GetVideoMemory */
  167. #define HX_WAIT_FOREVER    0       /* Do not return until a buffer is available */
  168. #define HX_WAIT_NEVER      1       /* Return an error if no buffer is available */
  169. /* Flags for Present */
  170. #define HX_MODE_TIMED      0       /* Synchronize the frame to IHXRenderTimeLine */
  171. #define HX_MODE_IMMEDIATE  1       /* Display the frame ASAP */
  172. #define HX_MODE_REFRESH    (1<<1)  /* Refresh the current frame */
  173. /****************************************************************************
  174.  *
  175.  *  Interface:
  176.  *
  177.  *  IHXVideoSurface
  178.  *
  179.  *  Purpose:
  180.  *
  181.  *  Interface for IHXVideoSurface objects.
  182.  *
  183.  *  IID_IHXVideoSurface:
  184.  *
  185.  *  {00002200-0901-11d1-8B06-00A024406D59}
  186.  *
  187.  */
  188. DEFINE_GUID(IID_IHXVideoSurface, 0x00002200, 0x901, 0x11d1, 0x8b,
  189.     0x6, 0x0, 0xa0, 0x24, 0x40, 0x6d, 0x59);
  190. #undef  INTERFACE
  191. #define INTERFACE   IHXVideoSurface
  192. DECLARE_INTERFACE_(IHXVideoSurface, IUnknown)
  193. {
  194.     /*
  195.      * IUnknown methods
  196.      */
  197.     STDMETHOD(QueryInterface)   (THIS_
  198.                 REFIID riid,
  199.                 void** ppvObj) PURE;
  200.     STDMETHOD_(ULONG32,AddRef)  (THIS) PURE;
  201.     STDMETHOD_(ULONG32,Release) (THIS) PURE;
  202.     /*
  203.      * IHXVideoSurface methods usually called by renderers to
  204.      * Draw on the surface
  205.      */
  206.     STDMETHOD(Blt)      (THIS_
  207.                 UCHAR*          /*IN*/  pImageBits,
  208.                 HXBitmapInfoHeader*    /*IN*/  pBitmapInfo,
  209.                 REF(HXxRect)        /*IN*/  rDestRect,
  210.                 REF(HXxRect)        /*IN*/  rSrcRect) PURE;
  211.     /************************************************************************
  212.      *  Method:
  213.      *      IHXVideoSurface::BeginOptimizedBlt
  214.      *  Purpose:
  215.      *      Called by renderer to commit to a bitmap format for all future
  216.      *      OptimizedBlt calls.
  217.      */
  218.     STDMETHOD(BeginOptimizedBlt)(THIS_
  219.                 HXBitmapInfoHeader*    /*IN*/  pBitmapInfo) PURE;
  220.     /************************************************************************
  221.      *  Method:
  222.      *      IHXVideoSurface::OptimizedBlt
  223.      *  Purpose:
  224.      *      Called by renderer to draw to the video surface, in the format
  225.      *      previously specified by calling BeginOptimizedBlt.
  226.      */
  227.     STDMETHOD(OptimizedBlt) (THIS_
  228.                 UCHAR*          /*IN*/  pImageBits,
  229.                 REF(HXxRect)        /*IN*/  rDestRect,
  230.                 REF(HXxRect)        /*IN*/  rSrcRect) PURE;
  231.     /************************************************************************
  232.      *  Method:
  233.      *      IHXVideoSurface::EndOptimizedBlt
  234.      *  Purpose:
  235.      *      Called by renderer allow the video surface to cleanup after all
  236.      *      OptimizedBlt calls have been made.
  237.      */
  238.     STDMETHOD(EndOptimizedBlt)  (THIS) PURE;
  239.     /************************************************************************
  240.      *  Method:
  241.      *      IHXVideoSurface::GetOptimizedFormat
  242.      *  Purpose:
  243.      *      Called by the client to find out what compression type the
  244.      *      renderer committed to when it called BeginOptimizedBlt.
  245.      */
  246.     STDMETHOD(GetOptimizedFormat)(THIS_
  247.                 REF(HX_COMPRESSION_TYPE) /*OUT*/ ulType) PURE;
  248.     /************************************************************************
  249.      *  Method:
  250.      *      IHXVideoSurface::GetPreferredFormat
  251.      *  Purpose:
  252.      *      Called by renderer to find out what compression type the video
  253.      *      surface would prefer to be given in BeginOptimizedBlt.
  254.      */
  255.     STDMETHOD(GetPreferredFormat)(THIS_
  256.                 REF(HX_COMPRESSION_TYPE) /*OUT*/ ulType) PURE;
  257. };
  258. /****************************************************************************
  259.  *
  260.  *  Interface:
  261.  *
  262.  *  IHXVideoHook
  263.  *
  264.  *  Purpose:
  265.  *
  266.  *  Interface for IHXVideoHook objects.
  267.  *
  268.  *  IID_IHXVideoHook:
  269.  *
  270.  *  {00002202-0901-11d1-8B06-00A024406D59}
  271.  *
  272.  */
  273. DEFINE_GUID(IID_IHXVideoHook, 0x00002202, 0x901, 0x11d1, 0x8b,
  274.     0x6, 0x0, 0xa0, 0x24, 0x40, 0x6d, 0x59);
  275. #undef INTERFACE
  276. #define INTERFACE   IHXVideoHook
  277. DECLARE_INTERFACE_(IHXVideoHook, IUnknown)
  278. {
  279.     /*
  280.      * IUnknown methods
  281.      */
  282.     STDMETHOD(QueryInterface) (THIS_
  283.  REFIID riid,
  284.  void** ppvObj) PURE;
  285.     STDMETHOD_(ULONG32,AddRef) (THIS) PURE;
  286.     STDMETHOD_(ULONG32,Release) (THIS) PURE;
  287.     /***
  288.      * IHXVideoHook::OnVideoFrame
  289.      ***
  290.      * This method will be called from the drawing thread, with the current
  291.      * frame, right before the frame is blitted to the screen. All 3rd party
  292.      * calculations that occur here are delaying the timely delivery of the 
  293.      * frame to the screen. They should be as optimized as possible.  pInFrame
  294.      * is the input frame buffer pOutFrame should be set to contain the output
  295.      * data on return, and destRect is provided so that the 3rd party can make
  296.      * sense of mouse events, but cannot be changed and does not have any
  297.      * direct bearing on image size.  srcRect is provided for inspection only
  298.      * for compatibility with the possible future addition of unfixed size
  299.      * input frames.  The client is responcible for maintaining and freeing
  300.      * the memory which they return in pOutFrame.  Simply setting pOutFrame to
  301.      * pInFrame is acceptable for in-place modifications as a result since it
  302.      * will still only be freed the requisite one time.
  303.      ***/
  304.     STDMETHOD(OnVideoFrame) (THIS_
  305.  UCHAR* /* In */ pInFrame,
  306.                                  ULONG32 /* In */ ulTimeStamp,
  307.  REF(HXxRect) /* In */ srcRect,
  308.  REF(HXxRect) /* In */ destRect,
  309.  REF(UCHAR*) /* Out */ pOutFrame) PURE;
  310.     /***
  311.      * IHXVideoHook::HandleHookEvent
  312.      ***
  313.      * This method provides a quick pass through by which events received by 
  314.      * the IHXVideoHookSink, such as mouse clicks, can be handed on to 
  315.      * registered IHXVideoHook objects.  Hook objects can use or ignore this
  316.      * information but setting the handled member of the passed HXxEvent is 
  317.      * not allowed.
  318.      ***/
  319.     
  320.     STDMETHOD(HandleHookEvent) (THIS_
  321.  HXxEvent* pEvent) PURE;
  322.     /***
  323.      * IHXVideoHook::GetProperties
  324.      ***
  325.      * This method provides a way for holders of an IHXVideoHook object to 
  326.      * query it for descriptive information.  Suggested property bindings are:
  327.      *  "Description" - CString describing plugin functionality.
  328.      *    "Copyright" - CString copyright notice.
  329.      *     "MoreInfo" - CString URL for obtaining more info.
  330.      *     "Version" - ULONG32 version number.
  331.      *  "InputFormat" - IHXBuffer containing input HXBitmapInfoHeader
  332.      *                  flattened as UCHAR array.
  333.      * "OutputFormat" - IHXBuffer containing output HXBitmapInfoHeader 
  334.      *                  flattened as UCHAR array.
  335.      * Others can obviously be included for specific hook-hook 
  336.      * communications, and more may also be required.
  337.      ***/
  338.     
  339.     STDMETHOD(GetProperties) (THIS_
  340.  REF(IHXValues*)   /* Out */ properties) PURE;
  341.     /***
  342.      * IHXVideoHook::HookAddedNotification
  343.      ***
  344.      * This method is called by the IHXVideoHookSink for all of its 
  345.      * registered hooks whenever it registers another.  This allows 
  346.      * registered hooks to redo their checking of the other hooks whenever
  347.      * new ones enter the loop.
  348.      ***/
  349.     STDMETHOD(HookAddedNotification) (THIS_
  350.  IHXVideoHook* pNewHook) PURE;
  351. };
  352. /****************************************************************************
  353.  *
  354.  *  Interface:
  355.  *
  356.  *  IHXVideoHookSink
  357.  *
  358.  *  Purpose:
  359.  *
  360.  *  Interface for IHXVideoHookSink objects.
  361.  *
  362.  *  IID_IHXVideoHookSink:
  363.  *
  364.  *  {00002201-0901-11d1-8B06-00A024406D59}
  365.  *
  366.  */
  367. DEFINE_GUID(IID_IHXVideoHookSink, 0x00002201, 0x901, 0x11d1, 0x8b,
  368.     0x6, 0x0, 0xa0, 0x24, 0x40, 0x6d, 0x59);
  369. #undef INTERFACE
  370. #define INTERFACE   IHXVideoHookSink
  371. DECLARE_INTERFACE_(IHXVideoHookSink, IUnknown)
  372. {
  373.     /*
  374.      * IUnknown methods
  375.      */
  376.     STDMETHOD(QueryInterface) (THIS_
  377.  REFIID riid,
  378.  void** ppvObj) PURE;
  379.     STDMETHOD_(ULONG32,AddRef) (THIS) PURE;
  380.     STDMETHOD_(ULONG32,Release) (THIS) PURE;
  381.     /***
  382.      * IHXVideoHookSink::AddVideoHook
  383.      ***
  384.      * This method is called by an IHXVideoHook object which wishes to 
  385.      * connect to the receiving IHXVideoHookSink object to obtain video 
  386.      * frames immediately prior to blitting.  pHook is the object requesting 
  387.      * registry, and pOptions is an IHXValues object containing optional
  388.      * special flags affecting behavior. pFrameFormat should point to a
  389.      * pre-allocated HXBitmapInfoHeader struct which on exit is filled in
  390.      * with the bitmap format in which frame data will be supplied to 
  391.      * OnVideoFrame() and to which it will be expected to conform on exit of
  392.      * OnVideoFrame().  If this format is inappropriate for input or output
  393.      * formats, then after registration the IHXVideoHook object should use
  394.      * the IHXVideoHookSink object's  SetInputFormat() and/or
  395.      * SetOutputFormat() methods to arrive at a mutually acceptable exchange
  396.      * format, or to determine that none is available and take appropriate
  397.      * action.
  398.      ***
  399.      * pOptions:
  400.      * "ReceivesEvents" - 0:No, !0:Yes
  401.      * "ReceivesHookAdded" - 0:No, !0:Yes
  402.      * "ReceivesFrames" - 0:No, !0:Yes
  403.      * "TakesAnySize" - 0:No, !0:Yes
  404.      ***/
  405.     STDMETHOD(AddVideoHook) (THIS_
  406.      IHXVideoHook*     /* In */    pHook,
  407.      IHXValues*     /* I/O */   pOptions,
  408.      HXBitmapInfoHeader*   /* Out */   pFrameFormat) PURE;
  409.     /***
  410.      * IHXVideoHookSink::ForceSurfaceUpdate
  411.      ***
  412.      * This method provides a mechanism by which event-driven IHXVideoHook 
  413.      * objects can request that they be given a new image if the mouse is
  414.      * clicked (for example).  The entire frame is "damaged" so that 
  415.      * everything will be redrawn.
  416.      ***/
  417.     STDMETHOD(ForceSurfaceUpdate) (THIS) PURE;
  418.     /***
  419.      * IHXVideoHookSink::SetInputFormat
  420.      * IHXVideoHookSink::SetOutputFormat
  421.      ***
  422.      * These methods provide a way for the IHXVideoHookSink to negotiate 
  423.      * with its registered IHXVideoHook objects about what image formats 
  424.      * they require or return respectively.  pHook is the hook object
  425.      * which is requesting a change in format, pRequested points to an 
  426.      * HXBitmapInfoHeader describing the format which the hook wants (either
  427.      * to receive or return).
  428.      * This method returns HXR_FAIL and does not change formats, unless
  429.      * pRequested matches an acceptable format exactly, that format is
  430.      * registered for future frame transactions, and HXR_OK is returned.
  431.      * Should be called immediately after registration.
  432.      ***/
  433.     STDMETHOD(SetInputFormat) (THIS_
  434.  IHXVideoHook* pHook,
  435.  HXBitmapInfoHeader* pRequested) PURE;
  436.     STDMETHOD(SetOutputFormat) (THIS_
  437.  IHXVideoHook* pHook,
  438.  HXBitmapInfoHeader* pRequested) PURE;
  439.     /***
  440.      * IHXVideoHookSink::GetVideoHookCount
  441.      ***
  442.      * This method returns the number of IHXVideoHook objects registered 
  443.      * with this IHXVideoHookSink.  This value is only useful in the short 
  444.      * term as order and count may change for IHXVideoHook objects without
  445.      * notice.  Do not use it to store access to a given hook.
  446.      ***/
  447.     STDMETHOD_(UINT16,GetVideoHookCount) (THIS) PURE;
  448.     /***
  449.      * IHXVideoHookSink::GetVideoHook
  450.      ***
  451.      * This method provides access to registered IHXVideoHook objects by 
  452.      * index with valid indecies ranging from 0 to n-1 inclusive, where n
  453.      * is the value returned by GetVideoHookCount(), provided no sources
  454.      * have been added or removed since it was last called.
  455.      ***/
  456.     STDMETHOD(GetVideoHook) (THIS_
  457.  UINT16  nIndex,
  458.  REF(IUnknown*) pUnknown) PURE;
  459. };
  460. // $Private:
  461. /****************************************************************************
  462.  *
  463.  *  Interface:
  464.  *
  465.  *  IHXRenderTimeLine
  466.  *
  467.  *  Purpose:
  468.  *
  469.  *  Provide IHXVideoSurface2 a time line for scheduling its video frames
  470.  *
  471.  *  IID_IHXRenderTimeLine:
  472.  *
  473.  *  {00002204-0901-11d1-8B06-00A024406D59}
  474.  *
  475.  */
  476. DEFINE_GUID(IID_IHXRenderTimeLine, 0x00002204, 0x901, 0x11d1, 0x8b,
  477.     0x6, 0x0, 0xa0, 0x24, 0x40, 0x6d, 0x59);
  478.  
  479. #undef  INTERFACE
  480. #define INTERFACE   IHXRenderTimeLine
  481. DECLARE_INTERFACE_(IHXRenderTimeLine, IUnknown)
  482. {
  483.     /*
  484.      * IUnknown methods
  485.      */
  486.     STDMETHOD(QueryInterface)   (THIS_
  487.                 REFIID riid,
  488.                 void** ppvObj) PURE;
  489.  
  490.     STDMETHOD_(ULONG32,AddRef)  (THIS) PURE;
  491.  
  492.     STDMETHOD_(ULONG32,Release) (THIS) PURE;
  493.  
  494.  
  495.     /************************************************************************
  496.      *  Method:
  497.      *      IHXRenderTimeLine::GetTimeLineValue
  498.      *  Purpose:
  499.      *      Get the current presentation time
  500.      *
  501.      *  Notes:
  502.      *      returns HXR_TIMELINE_SUSPENDED when the time line is suspended
  503.      */
  504.     STDMETHOD (GetTimeLineValue) (THIS_ /*OUT*/ REF(UINT32) ulTime) PURE;
  505. };
  506. /****************************************************************************
  507.  *
  508.  *  Interface:
  509.  *
  510.  *  IHXVideoSurface2
  511.  *
  512.  *  Purpose:
  513.  *
  514.  *  Provides hardware video buffers to render plugins
  515.  *
  516.  *  IID_IHXVideoSurface2:
  517.  *
  518.  *  {00002203-0901-11d1-8B06-00A024406D59}
  519.  *
  520.  */
  521. DEFINE_GUID(IID_IHXVideoSurface2, 0x00002203, 0x901, 0x11d1, 0x8b,
  522.     0x6, 0x0, 0xa0, 0x24, 0x40, 0x6d, 0x59);
  523.  
  524. #undef  INTERFACE
  525. #define INTERFACE   IHXVideoSurface2
  526. DECLARE_INTERFACE_(IHXVideoSurface2, IUnknown)
  527. {
  528.     /*
  529.      * IUnknown methods
  530.      */
  531.     STDMETHOD(QueryInterface)   (THIS_
  532.                 REFIID riid,
  533.                 void** ppvObj) PURE;
  534.  
  535.     STDMETHOD_(ULONG32,AddRef)  (THIS) PURE;
  536.  
  537.     STDMETHOD_(ULONG32,Release) (THIS) PURE;
  538.  
  539.  
  540.     /************************************************************************
  541.      *  Method:
  542.      *      IHXVideoSurface2::SetProperties
  543.      *  Purpose:
  544.      *      Request ulNumBuffers hardware buffers of the format described
  545.      *      in bmi.  ulNumBuffers will contain the number of buffers actually
  546.      *      allocated.
  547.      *      pClock is the renderer's clock used for scheduling the video
  548.      *      frames received in the Present call.  A NULL clock causes Present
  549.      *      to ignore the timestamp and display synchronously.
  550.      */
  551.     STDMETHOD (SetProperties) (THIS_ /*IN/OUT*/ HXBitmapInfoHeader* bmi,
  552.                                      /*IN/OUT*/ REF(UINT32) ulNumBuffers,
  553.                                      /*IN*/     IHXRenderTimeLine* pClock) PURE;
  554.     /************************************************************************
  555.      *  Method:
  556.      *      IHXVideoSurface2::GetVideoMem
  557.      *  Purpose:
  558.      *      Requests the next available hardware video buffer.
  559.      *      If the presentation contains alpha blending, the blended regions
  560.      *      of the will be requested via VideoMemStruct.pAlphaList.  Fill
  561.      *      each AlphaStruct with the subrect of the video frame specified
  562.      *      by AlphaStruct.rcImageRect.  IHXVideoSurface2 will then alpha
  563.      *      blend the video with the presentation.
  564.      *     
  565.      *      This call blocks until a video buffer is available.  bmi 
  566.      *      describes the buffer returned.
  567.      *
  568.      *  Notes:
  569.      *      The buffer format can change with each call so bmi must be
  570.      *      checked everytime.
  571.      */
  572.     STDMETHOD (GetVideoMem) (THIS_ VideoMemStruct* /*IN/OUT*/ pVidMem,
  573.                                    UINT32 ulFlags) PURE;
  574.     /************************************************************************
  575.      *  Method:
  576.      *      IHXVideoSurface2::ReleaseVideoMem
  577.      *  Purpose:
  578.      *      Called on a buffer returned from GetVideoMem to discard the
  579.      *      buffer without displaying it.
  580.      */
  581.     STDMETHOD (ReleaseVideoMem) (THIS_ VideoMemStruct* pVidMem) PURE;
  582.     /************************************************************************
  583.      *  Method:
  584.      *      IHXVideoSurface2::Present
  585.      *  Purpose:
  586.      *      Called by renderer to put a video image on the screen at absoulte
  587.      *      time lTime.  prDestRect and prSrcRect are relative coordinates.
  588.      *      prSrcRect with all zeros defaults to the entire surface dimensions
  589.      *      and prDestRect with all zeros defaults to the entire client widnow.
  590.      *
  591.      *  Notes:
  592.      *      This is an asynchronous method.
  593.      */
  594.     STDMETHOD (Present) (THIS_
  595.                          VideoMemStruct* pVidMem,
  596.                          INT32 lTime,
  597.                          UINT32 ulFlags,
  598.                          HXxRect *prDestRect,
  599.                          HXxRect *prSrcRect) PURE;
  600.     /************************************************************************
  601.      *  Method:
  602.      *      IHXVideoSurface2::ColorConvert
  603.      *  Purpose:
  604.      *      Called by renderer to transform one video format to another.
  605.      *      It is optimized for writing to hardware memory.
  606.      */
  607.     STDMETHOD (ColorConvert) (THIS_
  608.                               INT32 fourCCIn, 
  609.                               HXxSize *pSrcSize,
  610.                               HXxRect *prSrcRect,
  611.                               SourceInputStruct *pInput,
  612.                               INT32 fourCCOut,
  613.                               UCHAR *pDestBuffer, 
  614.                               HXxSize *pDestSize, 
  615.                               HXxRect *prDestRect, 
  616.                               int nDestPitch) PURE;
  617.     
  618.     /************************************************************************
  619.      *  Method:
  620.      *      IHXVideoSurface2::Flush
  621.      *  Purpose:
  622.      *      Cancel any pending Present calls.
  623.      */
  624.     STDMETHOD_(void, Flush)(THIS) PURE;
  625.     /************************************************************************
  626.      *  Method:
  627.      *      IHXVideoSurface2::PresentIfReady
  628.      *  Purpose:
  629.      *      Optional method called by renderer to check the status of the
  630.      *      next Present. If will display the next image if it is time.  This
  631.      *      method assists the scheduler that is not getting its time slices
  632.      *      due to OS latency, non-cooperative multi-tasking, or any other
  633.      *      reason.
  634.      */
  635.     STDMETHOD (PresentIfReady) (THIS) PURE;
  636. };
  637. // $EndPrivate.
  638. // $Private:
  639. /****************************************************************************
  640.  *
  641.  *  Interface:
  642.  *
  643.  *  IHXSubRectVideoSurface
  644.  *
  645.  *  Purpose:
  646.  *
  647.  *  Interface for IHXSubRectVideoSurface objects.
  648.  *
  649.  *  IID_IHXSubRectVideoSurface:
  650.  *
  651.  *  {00002205-0901-11d1-8B06-00A024406D59}
  652.  *
  653.  */
  654. DEFINE_GUID(IID_IHXSubRectVideoSurface, 0x00002205, 0x901, 0x11d1, 0x8b,
  655.     0x6, 0x0, 0xa0, 0x24, 0x40, 0x6d, 0x59);
  656. #undef  INTERFACE
  657. #define INTERFACE   IHXSubRectVideoSurface
  658. DECLARE_INTERFACE_(IHXSubRectVideoSurface, IHXVideoSurface)
  659. {
  660.     STDMETHOD(BltSubRects)( THIS_
  661.                             UCHAR*               /*IN*/  pImageBits,
  662.                             HXBitmapInfoHeader* /*IN*/  pBitmapInfo,
  663.                             HXxBoxRegion*          /*IN*/  pDestRects,
  664.                             HXxBoxRegion*          /*IN*/  pSrcRects,
  665.                             float                        fScaleFactorX,
  666.                             float                        fScaleFactorY
  667.                             ) PURE;
  668. };
  669. // $EndPrivate.
  670. #endif /* _HXVSURF_H_ */