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

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: coloracc.cpp,v 1.7.42.1 2004/07/09 01:59:48 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. #include "hxtypes.h"
  50. #ifdef _WINDOWS
  51. #ifdef _WIN16
  52. #include <stdlib.h>
  53. #endif
  54. #include <windows.h>
  55. #include <ctype.h>
  56. #endif
  57. #ifdef _MACINTOSH
  58. #include <ctype.h>
  59. #endif
  60. #include "hxresult.h"
  61. #include "hxassert.h"
  62. #include "debug.h"
  63. #include "hxcom.h"
  64. #include "hxbuffer.h"
  65. #include "hxprefs.h"
  66. #include "hxplugn.h"
  67. #include "hxerror.h"
  68. #include "hxengin.h"
  69. #include "dllacces.h"
  70. #include "dllpath.h"
  71. #include "hxheap.h"
  72. #ifdef _DEBUG
  73. #undef HX_THIS_FILE     
  74. static const char HX_THIS_FILE[] = __FILE__;
  75. #endif
  76. #include "coloracc.h"
  77. #include "hxdir.h"
  78. #define WRONG_HXCOLOR_VERSION 0
  79. ColorFuncAccess::ColorFuncAccess(IUnknown* pContext)
  80.     : m_pDllAccess(NULL)
  81.     , hStatus(HXR_OK)
  82.     , m_fpGetHXColorGUID(NULL)
  83.     , m_fpInitColorConverter(NULL)
  84.     , m_fpSetColorAdjustments(NULL)
  85.     , m_fpGetColorAdjustments(NULL)
  86.     , m_SuggestRGB8Palette(NULL)
  87.     , m_SetRGB8Palette(NULL)
  88.     , m_fpSetSharpnessAdjustments(NULL)
  89.     , m_fpGetSharpnessAdjustments(NULL)
  90.     , m_fpConvertRGBtoYUV(NULL)
  91.     , m_fpI420andYUVA(NULL)
  92.     , m_fpI420andI420toI420(NULL)
  93.     , m_fpConvertYUVtoRGB(NULL)
  94.     , m_fpEnhance(NULL)
  95.     , m_fpEnhanceUniform(NULL)
  96.     , m_fpConvertRGB24ToXRGB(NULL)
  97.     , m_fpScanAllCompatibleColorFormats(NULL)
  98.     , m_fpGetColorConverter(NULL)
  99.     , m_fpGetColorConverterx(NULL)
  100.     , m_bLightColorConverter(FALSE)
  101. #ifdef _WINDOWS
  102.     , m_fpInitColorConverter2(NULL)
  103.     , m_fpSetColorAdjustments2(NULL)
  104.     , m_fpGetColorConverter2(NULL)
  105.     , m_fpGetColorConverter2x(NULL)
  106.     , m_fpUpgradeColorConverter(NULL)
  107.     , m_pPlayer(NULL)
  108. #endif
  109. {
  110.     UINT32 uDLLNameLen = MAX_DLL_NAME_LEN;
  111.     m_pContext = pContext;
  112.     if (m_pContext)
  113.     {
  114.         m_pContext->AddRef();
  115.     }
  116.     // If the Codec directory is not currently specified, set it
  117. #ifndef _VXWORKS
  118.     if (!GetDLLAccessPath()->GetPath(DLLTYPE_CODEC))
  119.     {
  120.         SetCodecDir();
  121.     }
  122.     if (GetDLLAccessPath()->GetPath(DLLTYPE_CODEC))
  123.     {
  124. #endif // _VXWORKS
  125.         m_pDllAccess = new DLLAccess;
  126.         if (m_pDllAccess)
  127.         {
  128.             /*
  129.              *  Attempt to load the full version 1st
  130.              */
  131.             DLLAccess::CreateName("colorcvt", "colorcvt", m_pDllName, uDLLNameLen);
  132.             if (DLLAccess::DLL_OK != m_pDllAccess->open(m_pDllName, DLLTYPE_CODEC))
  133.             {
  134.                 /*
  135.                  *  Ok, the full version of hxcolor was
  136.                  *  missing. Perhaps we have the lite version?
  137.                  */
  138.                 uDLLNameLen = MAX_DLL_NAME_LEN;
  139.                 DLLAccess::CreateName("hxltcolor", "hxltcolor", m_pDllName, uDLLNameLen);
  140.                 if (DLLAccess::DLL_OK != m_pDllAccess->open(m_pDllName, DLLTYPE_CODEC))
  141.                 {
  142.                     hStatus = HXR_FAIL;
  143.                 }
  144.                 else
  145.                 {
  146.                     m_bLightColorConverter = TRUE;
  147.                 }
  148.             }
  149.         
  150.             if (hStatus == HXR_FAIL)
  151.             {
  152.                 delete m_pDllAccess;
  153.                 m_pDllAccess = NULL;
  154.                 PANIC(("Unable to load a color conversion library! n"));
  155.             }
  156.             else
  157.             {
  158.                 LoadConversionFunctions();
  159.             }
  160.         }
  161. #ifndef _VXWORKS
  162.     }
  163.     else
  164.     {
  165.         PANIC(("Unable to locate codec directory! Cannot load the"
  166.                "HXColor library!n"));
  167.     }
  168. #endif
  169. //    HX_RELEASE(pContext);
  170. }
  171. ColorFuncAccess::~ColorFuncAccess()
  172. {
  173.     if (m_pDllAccess)
  174.     {
  175.         m_pDllAccess->close();
  176.         delete m_pDllAccess;
  177.         m_pDllAccess = NULL;
  178.     }
  179. #ifdef _WINDOWS
  180.     HX_RELEASE(m_pPlayer);
  181. #endif
  182.     HX_RELEASE(m_pContext);
  183. }
  184. HX_RESULT
  185. ColorFuncAccess::GetHXColorGUID(UCHAR* pGUID)
  186. {
  187.     HX_RESULT ret = HXR_FAIL;
  188.     UCHAR guid[16];
  189.     if(m_fpGetHXColorGUID && pGUID)
  190.     {
  191.         ret = m_fpGetHXColorGUID(guid);
  192.         if(ret == HXR_OK)
  193.         {
  194.             memcpy(pGUID, guid, sizeof(GUID)); /* Flawfinder: ignore */
  195.         }
  196.     }
  197.     return ret;
  198. }
  199. void
  200. ColorFuncAccess::InitColorConverter()
  201. {
  202. #ifdef _WINDOWS
  203.     if (m_fpInitColorConverter2 && m_pContext)
  204.     {
  205.         m_fpInitColorConverter2(m_pContext);
  206.     }
  207.     else
  208. #endif
  209.         if (m_fpInitColorConverter)
  210.         {
  211.             m_fpInitColorConverter();
  212.         }
  213. }
  214. void
  215. ColorFuncAccess::SetColorAdjustments(float Brightness, float Contrast,
  216.                                      float Saturation, float Hue)
  217. {
  218. #ifdef _WINDOWS
  219.     if (m_fpSetColorAdjustments2 && m_pContext)
  220.     {
  221.         m_fpSetColorAdjustments2(m_pContext, Brightness, Contrast, Saturation, Hue);
  222.     }
  223.     else
  224. #endif
  225.         if (m_fpSetColorAdjustments)
  226.         {
  227.             m_fpSetColorAdjustments(Brightness, Contrast, Saturation, Hue);
  228.         }
  229. }
  230. void
  231. ColorFuncAccess::GetColorAdjustments(float *Brightness, float *Contrast,
  232.                                      float *Saturation, float *Hue)
  233. {
  234.     if (m_fpGetColorAdjustments)
  235.     {
  236.         m_fpGetColorAdjustments(Brightness, Contrast, Saturation, Hue);
  237.     }
  238. }
  239. int ColorFuncAccess::SuggestRGB8Palette (int nColors, UINT32 *lpRGBVals)
  240. {
  241.     return m_SuggestRGB8Palette? m_SuggestRGB8Palette(nColors, lpRGBVals): -1;
  242. }
  243. int ColorFuncAccess::SetRGB8Palette (int nColors, UINT32 *lpRGBVals, int *lpIndices)
  244. {
  245.     return m_SetRGB8Palette? m_SetRGB8Palette(nColors, lpRGBVals, lpIndices): -1;
  246. }
  247. void
  248. ColorFuncAccess::SetSharpnessAdjustments(float Sharpness, INT16 nExpand)
  249. {
  250.     if (m_fpSetSharpnessAdjustments)
  251.     {
  252.         m_fpSetSharpnessAdjustments(Sharpness,nExpand);
  253.     }
  254. }
  255. void
  256. ColorFuncAccess::GetSharpnessAdjustments(float *Sharpness, INT16 *nExpand)
  257. {
  258.     if (m_fpGetSharpnessAdjustments)
  259.     {
  260.         m_fpGetSharpnessAdjustments(Sharpness,nExpand);
  261.     }
  262. }
  263. void
  264. ColorFuncAccess::ConvertRGBtoYUV(UCHAR* pInput, UCHAR* pOutput, INT32 nWidth,
  265.                                  INT32 nHeight, BOOL bBGR)
  266. {
  267.     if (m_fpConvertRGBtoYUV)
  268.     {
  269.         m_fpConvertRGBtoYUV(pInput, pOutput, nWidth, nHeight, bBGR);
  270.     }
  271. }
  272. void
  273. ColorFuncAccess::ConvertYUVtoRGB(UCHAR* ySrc, UCHAR* uSrc, UCHAR* vSrc,
  274.                                  INT32 nPitchSrc, UCHAR* Dst, INT32 nWidth,
  275.                                  INT32 nHeight, INT32 nPitchDst, INT16 nFormat,
  276.                                  INT16 nExpand)
  277. {
  278.     if (m_fpConvertYUVtoRGB)
  279.     {
  280.         m_fpConvertYUVtoRGB(ySrc, uSrc, vSrc, nPitchSrc, Dst,
  281.                             nWidth, nHeight, nPitchDst, nFormat, nExpand);
  282.     }
  283. }
  284. void ColorFuncAccess::Enhance(UCHAR *yuv420in, INT32 inheight, INT32  inwidth, INT32 pitchSrc, float Sharpness)
  285. {
  286.     if (m_fpEnhance)
  287.     {
  288.         m_fpEnhance(yuv420in, inheight, inwidth, pitchSrc, Sharpness);
  289.     }
  290. }
  291. void ColorFuncAccess::EnhanceUniform(UCHAR *yuv420in, INT32 inheight, INT32  inwidth, INT32 pitchSrc, float Sharpness)
  292. {
  293.     if (m_fpEnhanceUniform)
  294.     {
  295.         m_fpEnhanceUniform(yuv420in, inheight, inwidth, pitchSrc, Sharpness);
  296.     }
  297. }
  298. void
  299. ColorFuncAccess::ConvertRGB24toXRGB( UCHAR* pSrc, UCHAR* pDest, ULONG32 srcSize, ULONG32 destSize, INT32 nWidth, INT32 nHeight)
  300. {
  301.     if (m_fpConvertRGB24ToXRGB)
  302.     {
  303.         m_fpConvertRGB24ToXRGB(pSrc,pDest,srcSize,destSize,nWidth,nHeight);
  304.     }
  305. }
  306. int ColorFuncAccess::I420andYUVA(
  307.     unsigned char *src1_ptr, int src1_pels,   int src1_lines,  int src1_pitch,
  308.     int src1_startx, int src1_starty,
  309.     unsigned char *src2_ptr, int src2_pels,   int src2_lines,  int src2_pitch,
  310.     int src2_startx, int src2_starty,
  311.     unsigned char *dest_ptr, int dest_pels,   int dest_lines,  int dest_pitch,
  312.     int dest_startx, int dest_starty,
  313.     int width,  int height,  int color_format)
  314. {
  315.     if( m_fpI420andYUVA )
  316.     {
  317.         return m_fpI420andYUVA( src1_ptr, src1_pels, src1_lines, src1_pitch,
  318.                                 src1_startx, src1_starty,
  319.                                 src2_ptr, src2_pels, src2_lines, src2_pitch,
  320.                                 src2_startx, src2_starty,
  321.                                 dest_ptr, dest_pels, dest_lines, dest_pitch,
  322.                                 dest_startx, dest_starty, width, height,
  323.                                 color_format);
  324.     }
  325.     return HXR_FAIL;
  326. }
  327. int ColorFuncAccess::I420andI420toI420(
  328.     unsigned char *src1_ptr, int src1_pels,   int src1_lines,  int src1_pitch,
  329.     int src1_startx, int src1_starty,
  330.     unsigned char *src2_ptr, int src2_pels,   int src2_lines,  int src2_pitch,
  331.     int src2_startx, int src2_starty,
  332.     unsigned char *dest_ptr, int dest_pels,   int dest_lines,  int dest_pitch,
  333.     int dest_startx, int dest_starty,
  334.     int width,  int height,  int alpha )
  335. {
  336.     if( m_fpI420andI420toI420 )
  337.     {
  338.         return m_fpI420andI420toI420( src1_ptr, src1_pels, src1_lines, src1_pitch,
  339.                                       src1_startx, src1_starty,
  340.                                       src2_ptr, src2_pels, src2_lines, src2_pitch,
  341.                                       src2_startx, src2_starty,
  342.                                       dest_ptr, dest_pels, dest_lines, dest_pitch,
  343.                                       dest_startx, dest_starty, width, height,
  344.                                       alpha);
  345.     }
  346.     return HXR_FAIL;
  347. }
  348. LPHXCOLORCONVERTER ColorFuncAccess::GetColorConverter (INT32 cidIn, INT32 cidOut)
  349. {
  350. #ifdef _WINDOWS
  351.     if (m_fpGetColorConverter2 && m_pContext)
  352.     {
  353.         LPHXCOLORCONVERTER colorConverter = m_fpGetColorConverter2(m_pContext, cidIn, cidOut);
  354.         if (!colorConverter)
  355.             m_fpUpgradeColorConverter(m_pContext,m_pPlayer, cidIn, cidOut);
  356.         else
  357.             return colorConverter;
  358.     }
  359.     else
  360. #endif
  361.         if (m_fpGetColorConverter)
  362.         {
  363.             return m_fpGetColorConverter(cidIn, cidOut);
  364.         }
  365.     return NULL;
  366. }
  367. LPHXCOLORCONVERTER2 ColorFuncAccess::GetColorConverter2 (INT32 cidIn, INT32 cidOut)
  368. {
  369. #ifdef _WINDOWS
  370.     if (m_fpGetColorConverter2x && m_pContext)
  371.     {
  372.         LPHXCOLORCONVERTER2 colorConverter = m_fpGetColorConverter2x(m_pContext, cidIn, cidOut);
  373.         if (!colorConverter)
  374.             m_fpUpgradeColorConverter(m_pContext,m_pPlayer, cidIn, cidOut);
  375.         else
  376.             return colorConverter;
  377.     }
  378.     else
  379. #endif
  380.         if (m_fpGetColorConverterx)
  381.         {
  382.             return m_fpGetColorConverterx(cidIn, cidOut);
  383.         }
  384.     return NULL;
  385. }
  386. BOOL ColorFuncAccess::ScanCompatibleColorFormats(INT32 cidIn, INT32 cidOutMask, void *pParam,
  387.                                                  BOOL (*pfnTryIt) (void *pParam, INT32 cidOut, LPHXCOLORCONVERTER pfnCC))
  388. {
  389.     if (m_fpScanCompatibleColorFormats)
  390.     {
  391.         return m_fpScanCompatibleColorFormats(cidIn, cidOutMask, pParam, pfnTryIt);
  392.     }
  393.     return FALSE;
  394. }
  395. BOOL ColorFuncAccess::ScanAllCompatibleColorFormats(INT32 cidIn, void *pParam,
  396.                                                     BOOL (*pfnTryIt) (void *pParam, INT32 cidOut, LPHXCOLORCONVERTER pfnCC))
  397. {
  398.     if (m_fpScanAllCompatibleColorFormats)
  399.     {
  400.         return m_fpScanAllCompatibleColorFormats(cidIn, pParam, pfnTryIt);
  401.     }
  402.     return FALSE;
  403. }
  404. void
  405. ColorFuncAccess::LoadConversionFunctions()
  406. {
  407.     if (m_pDllAccess)
  408.     {
  409.         m_fpGetHXColorGUID                = (FPGETHXCOLORGUID) m_pDllAccess->getSymbol("GetHXColorGUID");
  410.         m_fpInitColorConverter            = (FPINITCOLORCONVERTER) m_pDllAccess->getSymbol("InitColorConverter");
  411.         m_fpSetColorAdjustments           = (FPSETCOLORADJUSTMENTS)  m_pDllAccess->getSymbol("SetColorAdjustments");
  412.         m_fpGetColorAdjustments           = (FPGETCOLORADJUSTMENTS) m_pDllAccess->getSymbol("GetColorAdjustments");
  413.         m_SuggestRGB8Palette              = (FPSUGGESTRGB8PALETTE) m_pDllAccess->getSymbol("SuggestRGB8Palette");
  414.         m_SetRGB8Palette                  = (FPSETRGB8PALETTE) m_pDllAccess->getSymbol("SetRGB8Palette");
  415.         m_fpSetSharpnessAdjustments       = (FPSETSHARPNESSADJUSTMENTS) m_pDllAccess->getSymbol("SetSharpnessAdjustments");
  416.         m_fpGetSharpnessAdjustments       = (FPGETSHARPNESSADJUSTMENTS) m_pDllAccess->getSymbol("GetSharpnessAdjustments");
  417.         m_fpConvertRGBtoYUV               = (FPCONVERTRGBTOYUV) m_pDllAccess->getSymbol("ConvertRGBtoYUV");
  418.         m_fpConvertYUVtoRGB               = (FPCONVERTYUVTORGB) m_pDllAccess->getSymbol("ConvertYUVtoRGB");
  419.         m_fpEnhance                       = (FPENHANCE) m_pDllAccess->getSymbol("Enhance");
  420.         m_fpEnhanceUniform                = (FPENHANCEUNIFORM) m_pDllAccess->getSymbol("EnhanceUniform");
  421.         m_fpConvertRGB24ToXRGB            = (FPCONVERTRGB24TOXRGB) m_pDllAccess->getSymbol("ConvertRGB24toXRGB");
  422.         m_fpScanCompatibleColorFormats    = (FPSCANCOMPATIBLECOLORFORMATS) m_pDllAccess->getSymbol("ScanCompatibleColorFormats");
  423.         m_fpScanAllCompatibleColorFormats = (FPSCANALLCOMPATIBLECOLORFORMATS) m_pDllAccess->getSymbol("ScanAllCompatibleColorFormats");
  424.         m_fpGetColorConverter             = (FPGETCOLORCONVERTER) m_pDllAccess->getSymbol("GetColorConverter");
  425.         m_fpGetColorConverterx            = (FPGETCOLORCONVERTERx) m_pDllAccess->getSymbol("GetColorConverter2");
  426.         
  427.         m_fpI420andYUVA                   = (FPI420ANDYUVA) m_pDllAccess->getSymbol("I420andYUVA");
  428.         m_fpI420andI420toI420             = (FPI420ANDI420TOI420) m_pDllAccess->getSymbol("I420andI420toI420");
  429. #if _WINDOWS
  430. #if defined(XXXX_NEW_COLOR_CONVERTER)
  431.         m_fpInitColorConverter2 = (FPINITCOLORCONVERTER2)  m_pDllAccess->getSymbol("InitColorConverter");
  432.         m_fpGetColorConverter2  = (FPGETCOLORCONVERTER2) m_pDllAccess->getSymbol("GetColorConverter");
  433.         m_fpGetColorConverter2x = (FPGETCOLORCONVERTER2x) m_pDllAccess->getSymbol("GetColorConverter2x");
  434.         m_fpSetColorAdjustments2  = (FPSETCOLORADJUSTMENTS2) m_pDllAccess->getSymbol("SetColorAdjustments");
  435.         m_fpUpgradeColorConverter = (FPUPGRADECOLORCONVERTER) m_pDllAccess->getSymbol("UpgradeColorConverter");
  436. #endif
  437. #endif
  438.     }
  439.     if (!m_fpInitColorConverter  ||
  440.         !m_fpSetColorAdjustments ||
  441.         !m_fpSetSharpnessAdjustments ||
  442.         !m_fpEnhance ||
  443.         !m_fpEnhanceUniform ||
  444. #ifdef _WINDOWS 
  445.         !m_fpGetColorAdjustments ||
  446.         !m_fpGetSharpnessAdjustments ||
  447. #endif
  448.         //!m_fpConvertRGB24ToXRGB ||
  449.         !m_fpScanAllCompatibleColorFormats ||
  450.         !m_fpGetColorConverter
  451.         )
  452.     {
  453.         WrongHXColorVersion();
  454.     }
  455.     else
  456.     {
  457.         if (!m_bLightColorConverter && (
  458.                 !m_SuggestRGB8Palette    ||
  459.                 !m_SetRGB8Palette        ||
  460.                 !m_fpConvertRGBtoYUV     ||
  461.                 !m_fpConvertYUVtoRGB)
  462.             )
  463.         {
  464.             WrongHXColorVersion();
  465.         }
  466.     }
  467. }
  468. void ColorFuncAccess::WrongHXColorVersion()
  469. {
  470.     m_fpInitColorConverter  = NULL;
  471.     m_fpSetColorAdjustments = NULL;
  472.     m_fpGetColorAdjustments = NULL;
  473.     m_SuggestRGB8Palette    = NULL;
  474.     m_SetRGB8Palette        = NULL;
  475.     m_fpSetSharpnessAdjustments = NULL;
  476.     m_fpGetSharpnessAdjustments = NULL;
  477.     m_fpConvertRGBtoYUV = NULL;
  478.     m_fpConvertYUVtoRGB = NULL;
  479.     m_fpEnhance=NULL;
  480.     m_fpEnhanceUniform=NULL;
  481.     m_fpConvertRGB24ToXRGB = NULL;
  482.     m_fpScanCompatibleColorFormats = NULL;
  483.     m_fpScanAllCompatibleColorFormats = NULL;
  484.     m_fpGetColorConverter = NULL;
  485.     delete m_pDllAccess;
  486.     m_pDllAccess = NULL;
  487.     hStatus = HXR_FAIL;
  488.     HX_ASSERT(WRONG_HXCOLOR_VERSION);
  489. }
  490. HX_RESULT
  491. ColorFuncAccess::SetCodecDir()
  492. {
  493. #ifndef _VXWORKS
  494.     const char* pPath = NULL;
  495.     CHXString codecDir;
  496.     pPath = GetDLLAccessPath()->GetPath(DLLTYPE_PLUGIN);
  497.     HX_ASSERT(pPath && *pPath);
  498.     codecDir = pPath;
  499. #ifndef _MACINTOSH
  500.     if (strcmp((const char*)codecDir.Right(1), OS_SEPARATOR_STRING))
  501.     {
  502.         codecDir += OS_SEPARATOR_STRING;
  503.     }
  504.     codecDir += "Codecs";
  505. #endif
  506.     GetDLLAccessPath()->SetPath(DLLTYPE_CODEC, (const char*)codecDir);
  507. #endif // _VXWORKS
  508.     return HXR_OK;
  509. }
  510. #ifdef _WINDOWS
  511. void
  512. ColorFuncAccess::SetPlayer(IHXPlayer* pPlayer)
  513. {
  514.     if (m_pPlayer)
  515.     {
  516.         m_pPlayer->Release();
  517.     }
  518.     m_pPlayer = pPlayer;
  519.     if (m_pPlayer)
  520.     {
  521.         m_pPlayer->AddRef();
  522.     }
  523. }
  524. #endif
  525. BOOL ColorFuncAccess::CheckColorConverter (INT32 cidIn, INT32 cidOut)
  526. {
  527.     LPHXCOLORCONVERTER fpConvert = GetColorConverter(cidIn, cidOut);
  528.     return fpConvert != NULL;
  529. }
  530. BOOL ColorFuncAccess::CheckColorConverter2 (INT32 cidIn, INT32 cidOut)
  531. {
  532.     LPHXCOLORCONVERTER2 fpConvert = GetColorConverter2(cidIn, cidOut);
  533.     return fpConvert != NULL;
  534. }
  535. int ColorFuncAccess::ColorConvert(INT32 cidOut, unsigned char *dest_ptr,
  536.                                   int dest_width, int dest_height,
  537.                                   int dest_pitch, int dest_x, int dest_y,
  538.                                   int dest_dx, int dest_dy,
  539.                                   INT32 cidIn, unsigned char *src_ptr,
  540.                                   int src_width, int src_height,
  541.                                   int src_pitch, int src_x, int src_y,
  542.                                   int src_dx, int src_dy)
  543. {
  544.     int nRet = -1;
  545.     LPHXCOLORCONVERTER fpConvert = GetColorConverter (cidIn, cidOut);
  546.     if (fpConvert)
  547.     {
  548.         nRet = fpConvert(dest_ptr, dest_width, dest_height,
  549.                          dest_pitch, dest_x, dest_y,
  550.                          dest_dx, dest_dy,
  551.                          src_ptr, src_width, src_height,
  552.                          src_pitch, src_x, src_y,
  553.                          src_dx, src_dy);
  554.     }
  555.     return nRet;
  556. }
  557. int ColorFuncAccess::ColorConvert2(INT32 cidOut, unsigned char *dest_ptr,
  558.                                    int dest_width, int dest_height,
  559.                                    int dest_pitch, int dest_x, int dest_y,
  560.                                    int dest_dx, int dest_dy,
  561.                                    INT32 cidIn, unsigned char *pY,
  562.                                    unsigned char *pU, unsigned char *pV,
  563.                                    int src_width, int src_height,
  564.                                    int yPitch, int uPitch, int vPitch,
  565.                                    int src_x, int src_y,
  566.                                    int src_dx, int src_dy)
  567. {
  568.     int nRet = -1;
  569.     LPHXCOLORCONVERTER2 fpConvert = GetColorConverter2 (cidIn, cidOut);
  570.     if (fpConvert)
  571.     {
  572.         nRet = fpConvert(dest_ptr, dest_width, dest_height,
  573.                          dest_pitch, dest_x, dest_y,
  574.                          dest_dx, dest_dy,
  575.                          pY, pU, pV, src_width, src_height,
  576.                          yPitch, uPitch, vPitch,
  577.                          src_x, src_y,
  578.                          src_dx, src_dy);
  579.     }
  580.     return nRet;
  581. }