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

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: infmt.cpp,v 1.4.28.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. #include "hlxclib/string.h"
  51. #include "ciddefs.h"
  52. #include "infmt.h"
  53. static const int cidI420[]  = {CID_I420, CID_YV12, CID_YUY2, CID_UYVY};
  54. static const int cidYV12[]  = {CID_YV12, CID_I420, CID_YUY2, CID_UYVY};
  55. static const int cidYVU9[]  = {CID_YVU9, CID_YVU9, CID_YVU9, CID_YVU9};
  56. static const int cidYUY2[]  = {CID_YUY2, CID_UYVY, CID_YV12, CID_I420};
  57. static const int cidUYVY[]  = {CID_UYVY, CID_YUY2, CID_YV12, CID_I420}; 
  58. static const int cidXING[]  = {CID_YV12, CID_YUY2, CID_UYVY, CID_I420};
  59. CYUVInputFormatMngr::CYUVInputFormatMngr()
  60.  :  m_nNumFormats(0)
  61. {
  62.     memset(m_aFormats, 0, sizeof(m_aFormats));
  63.     m_nNumFormats = 6;
  64.     // Add defaults
  65.     m_aFormats[0].nInput = CID_I420;
  66.     SetDefaultOutputPriority(CID_I420);
  67.     m_aFormats[1].nInput = CID_YV12;
  68.     SetDefaultOutputPriority(CID_YV12);
  69.     // We have no color converts for this format
  70.     m_aFormats[2].nInput = CID_YVU9;
  71.     SetDefaultOutputPriority(CID_YVU9);
  72.     m_aFormats[3].nInput = CID_YUY2;
  73.     SetDefaultOutputPriority(CID_YUY2);
  74.     m_aFormats[4].nInput = CID_UYVY;
  75.     SetDefaultOutputPriority(CID_UYVY);
  76.     m_aFormats[5].nInput = CID_XING;
  77.     SetDefaultOutputPriority(CID_XING);
  78. }
  79. CYUVInputFormatMngr::~CYUVInputFormatMngr()
  80. {
  81. }
  82. BOOL CYUVInputFormatMngr::AddFormat(int nIn, int* pList, int nEntries)
  83. {
  84.     if (m_nNumFormats >= MAX_INPUT_FORMATS)
  85.         return FALSE;
  86.     m_aFormats[m_nNumFormats].nInput = nIn;
  87.     m_aFormats[m_nNumFormats].nNumOutPuts = 0;
  88.     
  89.     nEntries = min(nEntries, MAX_OUTPUT_FORMATS);
  90.     int nIndex = GetFormatIndex(nIn);
  91.     for (int i=0; i<nEntries; i++)
  92.         m_aFormats[nIndex].aOutputs[i] = pList[i];
  93.     m_aFormats[nIndex].nNumOutPuts = nEntries;
  94.     ++m_nNumFormats;
  95.     
  96.     return TRUE;
  97. }
  98. BOOL CYUVInputFormatMngr::IsFormatSupported(int nIn)
  99. {
  100.     int nIndex = GetFormatIndex(nIn);
  101.     if (nIndex >= 0 && m_aFormats[nIndex].nNumOutPuts)
  102.         return TRUE;
  103.     else
  104.         return FALSE;
  105. }
  106. int CYUVInputFormatMngr::GetOutputFormat(int nIn, int nOutputIndex)
  107. {
  108.     int nFormatIndex = GetFormatIndex(nIn);
  109.     if (nFormatIndex < 0 || nFormatIndex >= MAX_INPUT_FORMATS)
  110.         return -1;
  111.     if (nOutputIndex >= m_aFormats[nFormatIndex].nNumOutPuts)
  112.         return -1;
  113.     return m_aFormats[nFormatIndex].aOutputs[nOutputIndex];
  114. }
  115. void CYUVInputFormatMngr::SetOutputPriority(int nIn, int* pList, int nEntries)
  116. {
  117.     int nFormat = GetFormatIndex(nIn);
  118.     if (nFormat < 0)
  119.         return;
  120.     nEntries = min(nEntries, MAX_OUTPUT_FORMATS);
  121.     for (int i=0; i<nEntries; i++)
  122.         m_aFormats[nFormat].aOutputs[i] = pList[i];
  123.     m_aFormats[nFormat].nNumOutPuts = 
  124.      max(m_aFormats[nFormat].nNumOutPuts, nEntries);
  125. }
  126. int CYUVInputFormatMngr::GetFormatIndex(int nIn)
  127. {
  128.     int nRet = -1;
  129.     for (int i=0; i<m_nNumFormats; i++)
  130.     {
  131.         if (m_aFormats[i].nInput == nIn)
  132.         {
  133.             nRet = i;
  134.             break;
  135.         }
  136.     }
  137.     return nRet;
  138. }
  139. void CYUVInputFormatMngr::SetDefaultOutputPriority(int nIn)
  140. {
  141.     int nFormat = GetFormatIndex(nIn);
  142.     if (nFormat < 0)
  143.         return;
  144.     const int* pList = NULL;
  145.     int  nCount = 4;
  146.     switch (nIn)
  147.     {
  148.         case CID_I420: pList = cidI420; break;
  149.         case CID_YV12: pList = cidYV12; break;
  150.         case CID_YVU9: pList = cidYVU9; nCount = 1; break;
  151.         case CID_YUY2: pList = cidYUY2; break;
  152.         case CID_UYVY: pList = cidUYVY; break;
  153.         case CID_XING: pList = cidXING; nCount = 3; break;
  154.     }
  155.     m_aFormats[nFormat].nNumOutPuts = nCount;
  156.     for (int i=0; i<nCount; i++)
  157.         m_aFormats[nFormat].aOutputs[i] = pList[i];
  158. }