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

Symbian

开发平台:

C/C++

  1. /****************************************************************************
  2. *  QuickTime Renderer for RealMedia Architecture.
  3. *
  4. */
  5. /****************************************************************************
  6.  *  Defines
  7.  */
  8. // #define ASYNC_RESIZE_OK
  9. // #define ENABLE_TRACE
  10. #define MP4_VIDEO_RENDERER_NAME "MPEG-4 Video"
  11. /****************************************************************************
  12.  *  Includes
  13.  */
  14. #include "hlxclib/stdio.h"
  15. #include "hlxclib/string.h"
  16. #include "mp4xrend.ver"
  17. #include "hxtypes.h"
  18. #include "hxwintyp.h"
  19. #include "hxresult.h"
  20. #include "hxcom.h"
  21. #include "hxevent.h"
  22. #include "hxcomm.h"
  23. #include "ihxpckts.h"
  24. #include "hxcore.h"
  25. #include "hxrendr.h"
  26. #include "hxhyper.h"
  27. #include "hxplugn.h"
  28. #include "hxasm.h"
  29. #include "hxupgrd.h"
  30. #include "hxengin.h"
  31. #include "hxprefs.h"
  32. #include "hxerror.h"
  33. #include "hxwin.h"
  34. #include "hxvsurf.h"
  35. #include "hxvctrl.h"
  36. #include "hxsite2.h"
  37. #include "hxthread.h"
  38. #include "hxmon.h"
  39. #include "hxformt.h"
  40. #include "mp4video.h"
  41. #include "mp4vdfmt.h"
  42. #include "dllpath.h"
  43. #include "hxheap.h"
  44. #ifndef WIDTHBYTES
  45. #define WIDTHBYTES(i) ((ULONG32)((i+31)&(~31))/8) /* ULONG aligned ! */
  46. #endif
  47. /************************************************************************
  48.  *  CMP4VideoRenderer class
  49.  */
  50. /************************************************************************
  51.  *  Constants
  52.  */
  53. const char* const CMP4VideoRenderer::zm_pDescription    = "RealNetworks MPEG-4 Video Renderer Plugin";
  54. const char* const CMP4VideoRenderer::zm_pStreamMimeTypes[] =
  55. {
  56.     "video/MP4V-ES",
  57.     "video/X-RN-MP4",
  58.     NULL
  59. };
  60. /************************************************************************
  61.  *  Constructor/Destructor
  62.  */
  63. CMP4VideoRenderer::CMP4VideoRenderer(void)
  64.     : m_pOutputAllocator(NULL)
  65. {
  66.     ;
  67. }
  68. CMP4VideoRenderer::~CMP4VideoRenderer()
  69. {
  70.     if (m_pActiveVideoPacket)
  71.     {
  72. m_pActiveVideoPacket->Clear();
  73. delete m_pActiveVideoPacket;
  74. m_pActiveVideoPacket = NULL;
  75.     }
  76.     HX_DELETE(m_pOutputAllocator);
  77. }
  78. HX_RESULT STDAPICALLTYPE CMP4VideoRenderer::HXCreateInstance(IUnknown** ppIUnknown)
  79. {
  80.     HX_RESULT retVal = HXR_OUTOFMEMORY;
  81.     *ppIUnknown = (IUnknown*)(IHXPlugin*) new CMP4VideoRenderer();
  82.     if (*ppIUnknown)
  83.     {
  84.         (*ppIUnknown)->AddRef();
  85.         retVal = HXR_OK;
  86.     }
  87.     return retVal;
  88. }
  89. HX_RESULT STDAPICALLTYPE CMP4VideoRenderer::CanUnload(void)
  90. {
  91.     return CanUnload2();
  92. }
  93. HX_RESULT STDAPICALLTYPE CMP4VideoRenderer::CanUnload2(void)
  94. {
  95.     return ((CHXBaseCountingObject::ObjectsActive() > 0) ? HXR_FAIL : HXR_OK);
  96. }
  97. /* ***** BEGIN LICENSE BLOCK ***** 
  98.  * Version: RCSL 1.0 and Exhibits. 
  99.  * REALNETWORKS CONFIDENTIAL--NOT FOR DISTRIBUTION IN SOURCE CODE FORM 
  100.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. 
  101.  * All Rights Reserved. 
  102.  * 
  103.  * The contents of this file, and the files included with this file, are 
  104.  * subject to the current version of the RealNetworks Community Source 
  105.  * License Version 1.0 (the "RCSL"), including Attachments A though H, 
  106.  * all available at http://www.helixcommunity.org/content/rcsl. 
  107.  * You may also obtain the license terms directly from RealNetworks. 
  108.  * You may not use this file except in compliance with the RCSL and 
  109.  * its Attachments. There are no redistribution rights for the source 
  110.  * code of this file. Please see the applicable RCSL for the rights, 
  111.  * obligations and limitations governing use of the contents of the file. 
  112.  * 
  113.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  114.  * developer of the Original Code and owns the copyrights in the portions 
  115.  * it created. 
  116.  * 
  117.  * This file, and the files included with this file, is distributed and made 
  118.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  119.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  120.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  121.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  122.  * 
  123.  * Technology Compatibility Kit Test Suite(s) Location: 
  124.  * https://rarvcode-tck.helixcommunity.org 
  125.  * 
  126.  * Contributor(s): 
  127.  * 
  128.  * ***** END LICENSE BLOCK ***** */ 
  129. /************************************************************************
  130.  *  Method:
  131.  *    IHXPlugin::GetPluginInfo
  132.  *  Purpose:
  133.  *    Returns the basic information about this plugin. Including:
  134.  *
  135.  *    bLoadMultiple whether or not this plugin DLL can be loaded
  136.  * multiple times. All File Formats must set
  137.  * this value to TRUE.
  138.  *    pDescription which is used in about UIs (can be NULL)
  139.  *    pCopyright which is used in about UIs (can be NULL)
  140.  *    pMoreInfoURL which is used in about UIs (can be NULL)
  141.  */
  142. STDMETHODIMP CMP4VideoRenderer::GetPluginInfo
  143. (
  144.    REF(BOOL)        /*OUT*/ bLoadMultiple,
  145.    REF(const char*) /*OUT*/ pDescription,
  146.    REF(const char*) /*OUT*/ pCopyright,
  147.    REF(const char*) /*OUT*/ pMoreInfoURL,
  148.    REF(ULONG32)     /*OUT*/ ulVersionNumber
  149. )
  150. {
  151.     HX_RESULT retVal;
  152.     retVal = CVideoRenderer::GetPluginInfo(bLoadMultiple,
  153.    pDescription,
  154.    pCopyright,
  155.    pMoreInfoURL,
  156.    ulVersionNumber);
  157.     if (SUCCEEDED(retVal))
  158.     {
  159. pDescription    = (const char*) zm_pDescription;
  160. ulVersionNumber = TARVER_ULONG32_VERSION;
  161.     }
  162.     
  163.     return retVal;
  164. }
  165. /************************************************************************
  166.  *  Method:
  167.  *    IHXRenderer::GetRendererInfo
  168.  *  Purpose:
  169.  *    If this object is a file format object this method returns
  170.  *    information vital to the instantiation of file format plugins.
  171.  *    If this object is not a file format object, it should return
  172.  *    HXR_UNEXPECTED.
  173.  */
  174. STDMETHODIMP CMP4VideoRenderer::GetRendererInfo
  175. (
  176.     REF(const char**) /*OUT*/ pStreamMimeTypes,
  177.     REF(UINT32)       /*OUT*/ unInitialGranularity
  178. )
  179. {
  180.     HX_RESULT retVal;
  181.     retVal = CVideoRenderer::GetRendererInfo(pStreamMimeTypes,
  182.      unInitialGranularity);
  183.     if (SUCCEEDED(retVal))
  184.     {
  185. pStreamMimeTypes = (const char**) zm_pStreamMimeTypes;
  186.     }
  187.     
  188.     return retVal;
  189. }
  190. /****************************************************************************
  191.  *  CreateFormatObject
  192.  */
  193. CVideoFormat* CMP4VideoRenderer::CreateFormatObject(IHXValues* pHeader)
  194. {
  195.     return new CMP4VideoFormat(m_pCommonClassFactory, this);
  196. }
  197. /****************************************************************************
  198.  *  GetRendererName
  199.  */
  200. const char* CMP4VideoRenderer::GetRendererName(void)
  201. {
  202.     return MP4_VIDEO_RENDERER_NAME;
  203. }
  204. /****************************************************************************
  205.  *  SetupBitmapDefaults
  206.  */
  207. void CMP4VideoRenderer::SetupBitmapDefaults(IHXValues* pHeader,
  208.      HXBitmapInfoHeader &bitmapInfoHeader)
  209. {
  210.     INT32 lWidth  = 0;
  211.     INT32 lHeight = 0;
  212.     if (pHeader)
  213.     {
  214.         UINT32 ulTmp  = 0;
  215.         if (SUCCEEDED(pHeader->GetPropertyULONG32("Width", ulTmp)))
  216.         {
  217.             lWidth = (INT32) ulTmp;
  218.         }
  219.         if (SUCCEEDED(pHeader->GetPropertyULONG32("Height", ulTmp)))
  220.         {
  221.             lHeight = (INT32) ulTmp;
  222.         }
  223.     }
  224.     // size calculation is taken from crvvideo
  225.     bitmapInfoHeader.biSize = sizeof (HXBitmapInfoHeader);
  226.     bitmapInfoHeader.biWidth  = lWidth;
  227.     bitmapInfoHeader.biHeight = lHeight;
  228.     bitmapInfoHeader.biPlanes = 1;
  229.     bitmapInfoHeader.biBitCount = MP4V_PIXEL_SIZE;
  230.     bitmapInfoHeader.biCompression = MP4V_PIXEL_FORMAT;
  231.     bitmapInfoHeader.biSizeImage = bitmapInfoHeader.biWidth * 
  232.      bitmapInfoHeader.biHeight * 
  233.      bitmapInfoHeader.biBitCount / 
  234.      8;
  235.     bitmapInfoHeader.biXPelsPerMeter = 0; 
  236.     bitmapInfoHeader.biYPelsPerMeter = 0;
  237.     bitmapInfoHeader.biClrUsed = 0;
  238.     bitmapInfoHeader.biClrImportant = 0;
  239.     bitmapInfoHeader.rcolor = 0;
  240.     bitmapInfoHeader.gcolor = 0;
  241.     bitmapInfoHeader.bcolor = 0;    
  242. }