rvxvideo.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:9k
源码类别:

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. /****************************************************************************
  36.  *  Defines
  37.  */
  38. // #define ASYNC_RESIZE_OK
  39. // #define ENABLE_TRACE
  40. #define RVX_VIDEO_RENDERER_NAME "RealVideo"
  41. /****************************************************************************
  42.  *  Includes
  43.  */
  44. #include "hlxclib/stdio.h"
  45. #include "hlxclib/string.h"
  46. #include "rvxrend.ver"
  47. #include "hxtypes.h"
  48. #include "hxwintyp.h"
  49. #include "hxresult.h"
  50. #include "hxcom.h"
  51. #include "hxmime.h"
  52. #include "hxevent.h"
  53. #include "hxcomm.h"
  54. #include "ihxpckts.h"
  55. #include "hxcore.h"
  56. #include "hxrendr.h"
  57. #include "hxhyper.h"
  58. #include "hxplugn.h"
  59. #include "hxasm.h"
  60. #include "hxupgrd.h"
  61. #include "hxengin.h"
  62. #include "hxprefs.h"
  63. #include "hxerror.h"
  64. #include "hxwin.h"
  65. #include "hxvsurf.h"
  66. #include "hxvctrl.h"
  67. #include "hxsite2.h"
  68. #include "hxthread.h"
  69. #include "hxmon.h"
  70. #include "hxformt.h"
  71. #include "ihxfgbuf.h"
  72. #include "rvxvideo.h"
  73. #include "rvxvdfmt.h"
  74. #include "dllpath.h"
  75. #include "hxheap.h"
  76. #ifndef WIDTHBYTES
  77. #define WIDTHBYTES(i) ((ULONG32)((i+31)&(~31))/8) /* ULONG aligned ! */
  78. #endif
  79. /************************************************************************
  80.  *  CRVXVideoRenderer class
  81.  */
  82. /************************************************************************
  83.  *  Constants
  84.  */
  85. const char* const CRVXVideoRenderer::zm_pDescription = "RealNetworks RealVideo Renderer Plugin";
  86. const char* const CRVXVideoRenderer::zm_pStreamMimeTypes[] =
  87. {
  88.     REALVIDEO_MIME_TYPE,
  89.     REALVIDEO_MULTIRATE_MIME_TYPE,
  90.     NULL
  91. };
  92. /************************************************************************
  93.  *  Constructor/Destructor
  94.  */
  95. CRVXVideoRenderer::CRVXVideoRenderer(void)
  96.     : m_pOutputAllocator(NULL)
  97.     , m_ulPadWidthLeft(0)
  98.     , m_ulPadWidthRight(0)
  99.     , m_ulPadHeightTop(0)
  100.     , m_ulPadHeightBottom(0)
  101. {
  102.     ;
  103. }
  104. CRVXVideoRenderer::~CRVXVideoRenderer()
  105. {
  106.     if (m_pActiveVideoPacket)
  107.     {
  108. m_pActiveVideoPacket->Clear();
  109. delete m_pActiveVideoPacket;
  110. m_pActiveVideoPacket = NULL;
  111.     }
  112.     if (m_pOutputAllocator)
  113.     {
  114.         m_pOutputAllocator->Release();
  115.         m_pOutputAllocator = NULL;
  116.     }
  117. }
  118. HX_RESULT STDAPICALLTYPE CRVXVideoRenderer::HXCreateInstance(IUnknown** ppIUnknown)
  119. {
  120.     *ppIUnknown = (IUnknown*)(IHXPlugin*) new CRVXVideoRenderer();
  121.     if (*ppIUnknown)
  122.     {
  123. (*ppIUnknown)->AddRef();
  124. return HXR_OK;
  125.     }
  126.     return HXR_OUTOFMEMORY;
  127. }
  128. HX_RESULT STDAPICALLTYPE CRVXVideoRenderer::CanUnload(void)
  129. {
  130.     return CanUnload2();
  131. }
  132. HX_RESULT STDAPICALLTYPE CRVXVideoRenderer::CanUnload2(void)
  133. {
  134.     return ((CHXBaseCountingObject::ObjectsActive() > 0) ? HXR_FAIL : HXR_OK);
  135. }
  136. /************************************************************************
  137.  *  Method:
  138.  *    IHXPlugin::GetPluginInfo
  139.  *  Purpose:
  140.  *    Returns the basic information about this plugin. Including:
  141.  *
  142.  *    bLoadMultiple whether or not this plugin DLL can be loaded
  143.  * multiple times. All File Formats must set
  144.  * this value to TRUE.
  145.  *    pDescription which is used in about UIs (can be NULL)
  146.  *    pCopyright which is used in about UIs (can be NULL)
  147.  *    pMoreInfoURL which is used in about UIs (can be NULL)
  148.  */
  149. STDMETHODIMP CRVXVideoRenderer::GetPluginInfo
  150. (
  151.    REF(BOOL)        /*OUT*/ bLoadMultiple,
  152.    REF(const char*) /*OUT*/ pDescription,
  153.    REF(const char*) /*OUT*/ pCopyright,
  154.    REF(const char*) /*OUT*/ pMoreInfoURL,
  155.    REF(ULONG32)     /*OUT*/ ulVersionNumber
  156. )
  157. {
  158.     HX_RESULT retVal;
  159.     retVal = CVideoRenderer::GetPluginInfo(bLoadMultiple,
  160.    pDescription,
  161.    pCopyright,
  162.    pMoreInfoURL,
  163.    ulVersionNumber);
  164.     if (SUCCEEDED(retVal))
  165.     {
  166. pDescription    = zm_pDescription;
  167. ulVersionNumber = TARVER_ULONG32_VERSION;
  168.     }
  169.     
  170.     return retVal;
  171. }
  172. /************************************************************************
  173.  *  Method:
  174.  *    IHXRenderer::GetRendererInfo
  175.  *  Purpose:
  176.  *    If this object is a file format object this method returns
  177.  *    information vital to the instantiation of file format plugins.
  178.  *    If this object is not a file format object, it should return
  179.  *    HXR_UNEXPECTED.
  180.  */
  181. STDMETHODIMP CRVXVideoRenderer::GetRendererInfo
  182. (
  183.     REF(const char**) /*OUT*/ pStreamMimeTypes,
  184.     REF(UINT32)       /*OUT*/ unInitialGranularity
  185. )
  186. {
  187.     HX_RESULT retVal;
  188.     retVal = CVideoRenderer::GetRendererInfo(pStreamMimeTypes,
  189.      unInitialGranularity);
  190.     if (SUCCEEDED(retVal))
  191.     {
  192. pStreamMimeTypes = (const char**)zm_pStreamMimeTypes;
  193.     }
  194.     
  195.     return retVal;
  196. }
  197. /****************************************************************************
  198.  *  CreateFormatObject
  199.  */
  200. CVideoFormat* CRVXVideoRenderer::CreateFormatObject(IHXValues* pHeader)
  201. {
  202.     return new CRVXVideoFormat(m_pCommonClassFactory, this);
  203. }
  204. /****************************************************************************
  205.  *  GetRendererName
  206.  */
  207. const char* CRVXVideoRenderer::GetRendererName(void)
  208. {
  209.     return RVX_VIDEO_RENDERER_NAME;
  210. }
  211. /****************************************************************************
  212.  *  SetupBitmapDefaults
  213.  */
  214. void CRVXVideoRenderer::SetupBitmapDefaults(IHXValues* pHeader,
  215.      HXBitmapInfoHeader &bitmapInfoHeader)
  216. {
  217.     // size calculation is taken from crvvideo
  218.     bitmapInfoHeader.biSize = sizeof (HXBitmapInfoHeader);
  219.     bitmapInfoHeader.biWidth = 0; // 352; // unknown
  220.     bitmapInfoHeader.biHeight = 0; // 288; // unknown
  221.     bitmapInfoHeader.biPlanes = 1;
  222.     bitmapInfoHeader.biBitCount = RVXV_PIXEL_SIZE;
  223.     bitmapInfoHeader.biCompression = RVXV_PIXEL_FORMAT;
  224.     bitmapInfoHeader.biSizeImage = bitmapInfoHeader.biWidth * 
  225.      bitmapInfoHeader.biHeight * 
  226.      bitmapInfoHeader.biBitCount / 
  227.      8;
  228.     bitmapInfoHeader.biXPelsPerMeter = 0; 
  229.     bitmapInfoHeader.biYPelsPerMeter = 0;
  230.     bitmapInfoHeader.biClrUsed = 0;
  231.     bitmapInfoHeader.biClrImportant = 0;
  232.     bitmapInfoHeader.rcolor = 0;
  233.     bitmapInfoHeader.gcolor = 0;
  234.     bitmapInfoHeader.bcolor = 0;    
  235. }
  236. /****************************************************************************
  237.  *  AdjustVideoMapping
  238.  */
  239. void CRVXVideoRenderer::AdjustVideoMapping(HXxRect &destRect, 
  240.    HXxRect &sorcRect,
  241.    CMediaPacket*pActiveVideoPacket)
  242. {
  243.     sorcRect.left = m_ulPadWidthLeft;
  244.     sorcRect.top = m_ulPadHeightTop;
  245.     sorcRect.right -= m_ulPadWidthRight;
  246.     sorcRect.bottom -= m_ulPadHeightBottom;
  247. }
  248. /****************************************************************************
  249.  *  Method:
  250.  *    CRVXVideoRenderer::OnOptimizedVideo
  251.  *
  252.  */
  253. HX_RESULT CRVXVideoRenderer::OnOptimizedVideo(HX_RESULT status,
  254.       const HXBitmapInfoHeader& sourceBIH,
  255.       HXBitmapInfoHeader &targetBIH, 
  256.       ULONG32 &ulTargetBufCount)
  257. {
  258.     HX_RESULT retVal = HXR_FAIL;
  259. #ifdef _WIN32
  260.     SetDecodePriority(THREAD_PRIORITY_NORMAL);
  261. #endif // _WIN32
  262.     retVal = CVideoRenderer::OnOptimizedVideo(status,
  263.       sourceBIH,
  264.       targetBIH, 
  265.       ulTargetBufCount);
  266.     return retVal;
  267. }
  268. /****************************************************************************
  269.  *  Method:
  270.  *    CRVXVideoRenderer::OffOptimizedVideo
  271.  *
  272.  */
  273. void CRVXVideoRenderer::OffOptimizedVideo(void)
  274. {
  275. #ifdef _WIN32
  276.     SetDecodePriority(THREAD_PRIORITY_BELOW_NORMAL);
  277. #endif // _WIN32
  278.     return;
  279. }