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

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: tconverter_flp.h,v 1.2.36.3 2004/07/09 01:48:06 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. #ifndef _TCONVERTER_FLP_H_
  50. #define _TCONVERTER_FLP_H_
  51. /*****************************************************************************
  52.  *  Defines
  53.  */
  54. #define MAX_ULONG32_AS_DOUBLE (4294967295.0)
  55. #define RANGE_ULONG32_AS_DOUBLE (4294967296.0)
  56. /*****************************************************************************
  57.  *  Includes
  58.  */
  59. #include "hxtypes.h"
  60. #include "hxassert.h"
  61. /*****************************************************************************
  62.  *  CHXTimestampConverterFLP
  63.  */
  64. class CHXTimestampConverterFLP
  65. {
  66. public:
  67.     /* will use only one of conversion types */
  68.     enum ConversionType
  69.     {
  70. FACTORS,
  71. SAMPLES
  72.     };
  73.     typedef struct
  74.     {
  75. ULONG32 ulBaseHXA;
  76. ULONG32 ulBaseRTP;
  77.     } ConversionFactors;
  78.     void ReInit(double fHX2RTPFactor)
  79.     {
  80. m_ulHXAnchor = 0;
  81. m_ulRTPAnchor = 0;
  82. m_ulLastRTPTS = 0;
  83. m_ulLastHXTS = 0;
  84. m_llFatRTPTS = 0;
  85. m_llFatHXTS = 0;
  86. m_fAnchorDeltaInRTP = 0.0;
  87. m_fFactor = fHX2RTPFactor;
  88. m_ulHxaFactor = 0;
  89. m_ulRtpFactor = 0;
  90.     }
  91.     /*
  92.      * if CvtType == FACTORS, ulVal1 is HXA Factor, ulVal2 is RTP Factor
  93.      * if CvtType == SAMPLES, ulVal1 is Sample Rate
  94.      */
  95.     void ReInit(ConversionType cvtType,
  96. UINT32 ulVal1,
  97. UINT32 ulVal2 = 0)
  98.     {
  99. double fHX2RTPFactor;
  100. ULONG32 ulHxaFactor;
  101. ULONG32 ulRtpFactor;
  102. if (cvtType == FACTORS)
  103. {
  104.     ulHxaFactor = ulVal1;
  105.     ulRtpFactor = ulVal2;
  106. }
  107. else
  108. {
  109.     ulHxaFactor = 1000;     // SamplesPerSecond
  110.     ulRtpFactor = ulVal1;   // SamplesPerSecond
  111. }
  112. fHX2RTPFactor = ((double) ulRtpFactor) / ((double) ulHxaFactor);
  113. ReInit(fHX2RTPFactor);
  114. m_ulHxaFactor = ulHxaFactor;
  115. m_ulRtpFactor = ulRtpFactor;
  116.     }
  117.     void ReInit(ConversionFactors cvtFactors)
  118.     {
  119. ReInit(FACTORS, cvtFactors.ulBaseHXA, cvtFactors.ulBaseRTP);
  120.     }
  121.     /* default constructor */
  122.     CHXTimestampConverterFLP()
  123. : m_fFactor(1.0)
  124. , m_ulHXAnchor(0)
  125. , m_ulRTPAnchor(0)
  126. , m_ulLastRTPTS(0)
  127. , m_ulLastHXTS(0)
  128. , m_llFatRTPTS(0)
  129. , m_llFatHXTS(0)
  130. , m_fAnchorDeltaInRTP(0.0)
  131. , m_ulHxaFactor(1)
  132. , m_ulRtpFactor(1)
  133.     {
  134. ;  // nothing to do
  135.     }
  136.     
  137.     /*
  138.      * if CvtType == FACTORS, ulVal1 is HXA Factor, ulVal2 is RTP Factor
  139.      * if CvtType == SAMPLES, ulVal1 is Sample Rate
  140.      */
  141.     CHXTimestampConverterFLP(ConversionType cvtType,
  142.      UINT32 ulVal1, 
  143.      UINT32 ulVal2 = 0)
  144.     {
  145. ReInit(cvtType, ulVal1, ulVal2);
  146.     }
  147.     CHXTimestampConverterFLP(ConversionFactors convFactors)
  148.     {
  149. ReInit(FACTORS, convFactors.ulBaseHXA, convFactors.ulBaseRTP);
  150.     }
  151.     CHXTimestampConverterFLP(double fHXA2RTPFactor)
  152.     {
  153. ReInit(fHXA2RTPFactor);
  154.     }
  155.     /* assignment */
  156.     CHXTimestampConverterFLP& operator=(const CHXTimestampConverterFLP& lhs)
  157.     {
  158. m_fFactor  = lhs.m_fFactor;
  159. m_ulHXAnchor = lhs.m_ulHXAnchor;
  160. m_ulRTPAnchor = lhs.m_ulRTPAnchor;
  161. m_ulLastRTPTS = lhs.m_ulLastRTPTS;
  162. m_ulLastHXTS = lhs.m_ulLastHXTS;
  163. m_llFatRTPTS = lhs.m_llFatRTPTS;
  164. m_llFatHXTS = lhs.m_llFatHXTS;
  165. m_fAnchorDeltaInRTP = lhs.m_fAnchorDeltaInRTP;
  166. return *this;
  167.     }
  168.     
  169.     ULONG32 doubleToULONG32(double fVal)
  170.     {
  171. if (fVal >= 0.0)
  172. {
  173.     return ((ULONG32) (fVal + 0.5));
  174. }
  175. else
  176. {
  177.     return ((ULONG32) (fVal - 0.5));
  178. }
  179.     }
  180.     /*
  181.      * conversions
  182.      */
  183.     UINT32 hxa2rtp(UINT32 ulHxaTS)
  184.     {
  185. ULONG32 ulRTPTS;
  186. LONG32 lHXDelta = (LONG32) (ulHxaTS - m_ulLastHXTS);
  187. m_ulLastHXTS = ulHxaTS;
  188. m_llFatHXTS += lHXDelta;
  189. ulRTPTS = doubleToULONG32((INT64_TO_DOUBLE(m_llFatHXTS  - m_ulHXAnchor)) *
  190.   m_fFactor);
  191. ulRTPTS += m_ulRTPAnchor;
  192. return ulRTPTS;
  193.     }
  194.     UINT32 rtp2hxa(UINT32 ulRtpTS)
  195.     {
  196. ULONG32 ulHXTS;
  197. LONG32 lRTPDelta = (LONG32) (ulRtpTS - m_ulLastRTPTS);
  198. m_ulLastRTPTS = ulRtpTS;
  199. m_llFatRTPTS += lRTPDelta;
  200. ulHXTS = doubleToULONG32((INT64_TO_DOUBLE(m_llFatRTPTS - m_ulRTPAnchor)) /
  201.   m_fFactor);
  202. ulHXTS += m_ulHXAnchor;
  203. return ulHXTS;
  204.     }
  205.     UINT32 hxa2rtp_raw(UINT32 ulHxaTS)
  206.     {
  207. return ((ULONG32) (ulHxaTS * ((double) m_fFactor)) + 0.5);
  208.     }
  209.     UINT32 rtp2hxa_raw(UINT32 ulRtpTS)
  210.     {
  211. return ((ULONG32) (ulRtpTS / ((double) m_fFactor)) + 0.5);
  212.     }
  213.     
  214.     /*
  215.      * anchors
  216.      */
  217.     void setHXAnchor(UINT32 ulHXAnchor)
  218.     {
  219. m_ulHXAnchor = ulHXAnchor;
  220. m_ulRTPAnchor = doubleToULONG32(((double) m_ulHXAnchor) * m_fFactor +
  221. m_fAnchorDeltaInRTP);
  222.      
  223. m_ulLastHXTS = m_ulHXAnchor;
  224. m_ulLastRTPTS = m_ulRTPAnchor;
  225. m_llFatHXTS = m_ulLastHXTS;
  226. m_llFatRTPTS = m_ulLastRTPTS;
  227.     }
  228.     void setRTPAnchor(UINT32 ulRTPAnchor)
  229.     {
  230. m_ulRTPAnchor = ulRTPAnchor;
  231. m_ulHXAnchor = doubleToULONG32((((double) m_ulRTPAnchor) + m_fAnchorDeltaInRTP) / 
  232. m_fFactor);
  233. m_ulLastHXTS = m_ulHXAnchor;
  234. m_ulLastRTPTS = m_ulRTPAnchor;
  235. m_llFatHXTS = m_ulLastHXTS;
  236. m_llFatRTPTS = m_ulLastRTPTS;
  237.     }
  238.     void setAnchor(UINT32 ulHXAnchor, UINT32 ulRTPAnchor)
  239.     {
  240. m_ulHXAnchor = ulHXAnchor;
  241. m_ulRTPAnchor = ulRTPAnchor;
  242. m_ulLastHXTS = m_ulHXAnchor;
  243. m_ulLastRTPTS = m_ulRTPAnchor;
  244. m_llFatHXTS = m_ulLastHXTS;
  245. m_llFatRTPTS = m_ulLastRTPTS;
  246. m_fAnchorDeltaInRTP = ((double) m_ulRTPAnchor) - 
  247.       ((double) m_ulHXAnchor) * m_fFactor;
  248.     }
  249.     ULONG32 GetRTPAnchor(void)
  250.     {
  251. return m_ulRTPAnchor;
  252.     }
  253.     ULONG32 GetHXAnchor(void)
  254.     {
  255. return m_ulHXAnchor;
  256.     }
  257.     /*
  258.      * factors
  259.      */
  260.     ConversionFactors GetConversionFactors(void)
  261.     {
  262. ConversionFactors convFactors = {m_ulHxaFactor, m_ulRtpFactor};
  263. return convFactors;
  264.     }
  265.     double GetHX2RTPFactor(void)
  266.     {
  267. return m_fFactor;
  268.     }
  269. private:
  270.     double m_fFactor;
  271.     ULONG32 m_ulHXAnchor;
  272.     ULONG32 m_ulRTPAnchor;
  273.     double m_fAnchorDeltaInRTP;
  274.     ULONG32 m_ulLastRTPTS;
  275.     ULONG32 m_ulLastHXTS;
  276.     INT64 m_llFatRTPTS;
  277.     INT64 m_llFatHXTS;
  278.     ULONG32 m_ulHxaFactor;
  279.     ULONG32 m_ulRtpFactor;
  280. };
  281. #endif /* _TCONVERTER_FLP_H_ */