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

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: smpte.cpp,v 1.4.32.3 2004/07/09 01:48:16 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/stdio.h"
  51. #include "safestring.h"
  52. #include "hlxclib/stdlib.h"
  53. #include "hxstring.h"
  54. #include "smpte.h"
  55. #include "hxheap.h"
  56. #ifdef _DEBUG
  57. #undef HX_THIS_FILE
  58. static const char HX_THIS_FILE[] = __FILE__;
  59. #endif
  60. const UINT32 MSEC_PER_HOUR = (UINT32)60 * 60 * 1000;
  61. const UINT32 MSEC_PER_MIN  = (UINT32)60 * 1000;
  62. const UINT32 MSEC_PER_SEC  = 1000;
  63. SMPTETimeCode::SMPTETimeCode():
  64.     m_hour(0),
  65.     m_minute(0),
  66.     m_second(0),
  67.     m_frame(0),
  68.     m_mSecs(0),
  69.     m_dropFrame(DROP_FRAME),
  70.     m_framesPerSec(FPS_30)
  71. {
  72. }
  73. SMPTETimeCode::SMPTETimeCode(UINT32 mSec):
  74.     m_mSecs(mSec),
  75.     m_dropFrame(DROP_FRAME),
  76.     m_framesPerSec(FPS_30)
  77. {
  78.     fromMSec();
  79. }
  80. SMPTETimeCode::SMPTETimeCode(int hour, int minute, int second, int frame):
  81.     m_hour(hour),
  82.     m_minute(minute),
  83.     m_second(second),
  84.     m_frame(frame),
  85.     m_dropFrame(DROP_FRAME),
  86.     m_framesPerSec(FPS_30)
  87. {
  88.     toMSec();
  89. }
  90. SMPTETimeCode::SMPTETimeCode(const char* pTimeCodeStr):
  91.     m_dropFrame(DROP_FRAME),
  92.     m_framesPerSec(FPS_30)
  93. {
  94.     fromString(pTimeCodeStr);
  95. }
  96. SMPTETimeCode::SMPTETimeCode(const SMPTETimeCode& lhs)
  97. {
  98.     m_hour = lhs.m_hour;
  99.     m_minute = lhs.m_minute;
  100.     m_second = lhs.m_second;
  101.     m_frame = lhs.m_frame;
  102.     m_dropFrame = lhs.m_dropFrame;
  103.     m_framesPerSec = lhs.m_framesPerSec;
  104.     m_mSecs = lhs.m_mSecs;
  105. }
  106. SMPTETimeCode&
  107. SMPTETimeCode::operator=(const SMPTETimeCode& lhs)
  108. {
  109.     m_hour = lhs.m_hour;
  110.     m_minute = lhs.m_minute;
  111.     m_second = lhs.m_second;
  112.     m_frame = lhs.m_frame;
  113.     m_dropFrame = lhs.m_dropFrame;
  114.     m_framesPerSec = lhs.m_framesPerSec;
  115.     m_mSecs = lhs.m_mSecs;
  116.     return *this;
  117. }
  118. int
  119. SMPTETimeCode::compare(const SMPTETimeCode& lhs) const
  120. {
  121.     return HX_SAFEINT(m_mSecs - lhs.m_mSecs);
  122. }
  123. void
  124. SMPTETimeCode::toMSec()
  125. {
  126.     m_mSecs =   m_hour * MSEC_PER_HOUR
  127.                 + m_minute * MSEC_PER_MIN
  128. + m_second * MSEC_PER_SEC;
  129.     if(m_framesPerSec == FPS_30)
  130.     {
  131. if(m_frame > 29)
  132. {
  133.     m_frame = 0;
  134. }
  135. else
  136. {
  137.     if(m_dropFrame == DROP_FRAME)
  138.     {
  139. // each frame is 33.367 ms (29.97 Hz)
  140. m_mSecs += (int)(((double)m_frame * 33.367) + 0.5);
  141.     }
  142.     else
  143.     {
  144. // each frame is 33.333 ms
  145. m_mSecs += (int)(((double)m_frame * 33.333) + 0.5);
  146.     }
  147. }
  148.     }
  149.     else if(m_framesPerSec == FPS_25)
  150.     {
  151. // each frame is 40ms
  152. if(m_frame > 24)
  153. {
  154.     m_frame = 0;
  155. }
  156. else
  157. {
  158.     m_mSecs += m_frame * 40;
  159. }
  160.     }
  161. }
  162. void
  163. SMPTETimeCode::fromMSec()
  164. {
  165.     int fps = (m_framesPerSec == FPS_30) ? 30: 25;
  166.     UINT32 ttlFrames = (m_mSecs * fps) / 1000;
  167.     m_hour = HX_SAFEINT(ttlFrames / (fps * 60 * 60));
  168.     UINT32 hourRem = ttlFrames - (m_hour * fps * 60 * 60);
  169.     m_minute = HX_SAFEINT(hourRem / (fps * 60));
  170.     UINT32 minRem = hourRem - (m_minute * fps * 60);
  171.     m_second = HX_SAFEINT(minRem / fps);
  172.     UINT32 secRem = minRem - (m_second * fps);
  173.     m_frame = HX_SAFEINT(ttlFrames % fps);
  174. }
  175. const char*
  176. SMPTETimeCode::toString()
  177. {
  178.     char strBuf[12]; /* Flawfinder: ignore */
  179.     SafeSprintf(strBuf, sizeof(strBuf), "%02d:%02d:%02d",
  180.                 m_hour, m_minute, m_second);
  181.     if(m_frame > 0)
  182.         SafeSprintf(&strBuf[8], sizeof(strBuf)-8, ".%02d", m_frame);
  183.     m_asString = strBuf;
  184.     return m_asString;
  185. }
  186. void
  187. SMPTETimeCode::fromString(const char* pTimeCodeString)
  188. {
  189.     // format is [H]H:[M]M:[S]S[.FF]
  190.     m_hour = m_minute = m_second = m_frame = 0;
  191.     char* token = 0;
  192.     if(pTimeCodeString && strlen(pTimeCodeString) > 0)
  193.     {
  194. char *tmpStr = new char[strlen(pTimeCodeString)+1];
  195. strcpy(tmpStr, pTimeCodeString); /* Flawfinder: ignore */
  196. token = strtok(tmpStr, ":");
  197. if(token)
  198. {
  199.     m_hour = HX_SAFEINT(strtol(token, 0, 10));
  200.     token = strtok(NULL, ":");
  201.     if(token)
  202.     {
  203. m_minute = HX_SAFEINT(strtol(token, 0, 10));
  204. token = strtok(NULL, ".");
  205. if(token)
  206. {
  207.     m_second = HX_SAFEINT(strtol(token, 0, 10));
  208.     token = strtok(NULL, " ");
  209.     if(token)
  210.     {
  211. m_frame = HX_SAFEINT(strtol(token, 0, 10));
  212.     }
  213. }
  214.     }
  215. }
  216.     }
  217.     toMSec();
  218.     fromMSec(); // normalize just in case of a badly formatted string
  219. }
  220. SMPTETimeCode::operator UINT32()
  221. {
  222.     return m_mSecs;
  223. }
  224. SMPTETimeCode::operator const char*()
  225. {
  226.     toString();
  227.     return m_asString;
  228. }
  229. SMPTETimeCode&
  230. SMPTETimeCode::operator+=(const SMPTETimeCode& lhs)
  231. {
  232.     // no checking for overflow
  233.     m_mSecs += lhs.m_mSecs;
  234.     fromMSec();
  235.     return *this;
  236. SMPTETimeCode&
  237. SMPTETimeCode::operator-=(const SMPTETimeCode& lhs)
  238. {
  239.     // don't go negative on me...
  240.     if(m_mSecs > lhs.m_mSecs)
  241.     {
  242. m_mSecs -= lhs.m_mSecs;
  243.     }
  244.     else
  245.     {
  246. m_mSecs = 0;
  247.     }
  248.     fromMSec();
  249.     return *this;
  250. }
  251. SMPTETimeCode
  252. SMPTETimeCode::operator+(const SMPTETimeCode& lhs)
  253. {
  254.     SMPTETimeCode tCode = *this;
  255.     tCode += lhs;
  256.     return tCode;
  257. }
  258. SMPTETimeCode
  259. SMPTETimeCode::operator-(const SMPTETimeCode& lhs)
  260. {
  261.     SMPTETimeCode tCode = *this;
  262.     tCode -= lhs;
  263.     return tCode;
  264. }