TimeVal.cxx
上传用户:sy_wanhua
上传日期:2013-07-25
资源大小:3048k
文件大小:6k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1. /* ====================================================================
  2.  * The Vovida Software License, Version 1.0 
  3.  * 
  4.  * Copyright (c) 2000 Vovida Networks, Inc.  All rights reserved.
  5.  * 
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that the following conditions
  8.  * are met:
  9.  * 
  10.  * 1. Redistributions of source code must retain the above copyright
  11.  *    notice, this list of conditions and the following disclaimer.
  12.  * 
  13.  * 2. Redistributions in binary form must reproduce the above copyright
  14.  *    notice, this list of conditions and the following disclaimer in
  15.  *    the documentation and/or other materials provided with the
  16.  *    distribution.
  17.  * 
  18.  * 3. The names "VOCAL", "Vovida Open Communication Application Library",
  19.  *    and "Vovida Open Communication Application Library (VOCAL)" must
  20.  *    not be used to endorse or promote products derived from this
  21.  *    software without prior written permission. For written
  22.  *    permission, please contact vocal@vovida.org.
  23.  *
  24.  * 4. Products derived from this software may not be called "VOCAL", nor
  25.  *    may "VOCAL" appear in their name, without prior written
  26.  *    permission of Vovida Networks, Inc.
  27.  * 
  28.  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
  29.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  30.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND
  31.  * NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL VOVIDA
  32.  * NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES
  33.  * IN EXCESS OF $1,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL,
  34.  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  35.  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  36.  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  37.  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  38.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
  39.  * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
  40.  * DAMAGE.
  41.  * 
  42.  * ====================================================================
  43.  * 
  44.  * This software consists of voluntary contributions made by Vovida
  45.  * Networks, Inc. and many individuals on behalf of Vovida Networks,
  46.  * Inc.  For more information on Vovida Networks, Inc., please see
  47.  * <http://www.vovida.org/>.
  48.  *
  49.  */
  50. static const char* const TimeVal_cxx_Version =
  51.     "$Id: TimeVal.cxx,v 1.8 2001/06/27 01:43:45 bko Exp $";
  52. #include "TimeVal.hxx"
  53. #include <cassert>
  54. #ifdef WIN32
  55. #include "VTime.hxx"
  56. #endif
  57. using Vocal::TimeAndDate::TimeVal;
  58. using Vocal::TimeAndDate::milliseconds_t;
  59. TimeVal::TimeVal()
  60. {
  61.     clear();
  62. }
  63. TimeVal::TimeVal(milliseconds_t src)
  64. {
  65.     clear();
  66.     operator+=(src);
  67. }
  68. TimeVal::TimeVal(long sec, long usec)
  69. {
  70.     clear();
  71.     tv_sec = sec;
  72.     tv_usec = usec;
  73. }
  74.         
  75. TimeVal::TimeVal(const timeval & src)
  76. {
  77.     copy(src);
  78.     normalize();
  79. }
  80. TimeVal::~TimeVal()
  81. {
  82. }
  83. TimeVal &
  84. TimeVal::operator=(const timeval & src)
  85. {
  86.     if ( this != & src )
  87.     {
  88.         copy(src);
  89.         normalize();
  90.     }
  91.     return ( *this );
  92. }
  93. const TimeVal &
  94. TimeVal::now()
  95. {
  96.     int rc = gettimeofday(this, 0);
  97.     assert( rc == 0 );
  98.     return ( *this );
  99. }
  100. milliseconds_t
  101. TimeVal::milliseconds() const
  102. {
  103.     return ( (tv_sec * 1000) + (tv_usec / 1000) );
  104. }
  105. TimeVal
  106. TimeVal::operator+(const timeval & right) const
  107. {
  108.     TimeVal left(*this);
  109.     return ( left += right );
  110. }
  111. TimeVal
  112. TimeVal::operator+(milliseconds_t right) const
  113. {
  114.     TimeVal left(*this);
  115.     return ( left += right );
  116. }
  117. TimeVal &
  118. TimeVal::operator+=(const timeval & src)
  119. {
  120.     tv_sec += src.tv_sec;
  121.     tv_usec += src.tv_usec;
  122.     normalize();
  123.     return ( *this );
  124. }
  125. TimeVal &
  126. TimeVal::operator+=(milliseconds_t src)
  127. {
  128.     tv_sec += src / 1000;
  129.     tv_usec += (src % 1000) // Between [0..1000) milliseconds.
  130.                * 1000;      // Convert to microseconds.
  131.     normalize();
  132.     return ( *this );
  133. }
  134. TimeVal
  135. TimeVal::operator-(const timeval & right) const
  136. {
  137.     TimeVal left(*this);
  138.     return ( left -= right );
  139. }
  140. TimeVal
  141. TimeVal::operator-(milliseconds_t right) const
  142. {
  143.     TimeVal left(*this);
  144.     return ( left -= right );
  145. }
  146. TimeVal &
  147. TimeVal::operator-=(const timeval & src)
  148. {
  149.     tv_sec -= src.tv_sec;
  150.     tv_usec -= src.tv_usec;
  151.     normalize();
  152.     return ( *this );
  153. }
  154. TimeVal &
  155. TimeVal::operator-=(milliseconds_t src)
  156. {
  157.     tv_sec -= src / 1000;
  158.     tv_usec += (src % 1000) // Between [0..1000) milliseconds.
  159.                * 1000;      // Convert to microseconds.
  160.     normalize();
  161.     return ( *this );
  162. }
  163. bool
  164. TimeVal::operator==(const timeval & src) const
  165. {
  166.     // Create a normalize value for the timeval to simplify comparison.
  167.     //
  168.     TimeVal right(src);
  169.     return ( tv_sec == right.tv_sec
  170.              && tv_usec == right.tv_usec
  171.            );
  172. }
  173. bool
  174. TimeVal::operator<(const timeval & src) const
  175. {
  176.     // Create a normalize value for the timeval to simplify comparison.
  177.     //
  178.     TimeVal right(src);
  179.     if ( tv_sec < right.tv_sec )
  180.     {
  181.         return ( true );
  182.     }
  183.     else if ( (tv_sec == right.tv_sec) && (tv_usec < right.tv_usec) )
  184.     {
  185.         return ( true );
  186.     }
  187.     else
  188.     {
  189.         return ( false );
  190.     }
  191. }
  192. void
  193. TimeVal::clear()
  194. {
  195.     tv_sec = tv_usec = 0;
  196. }
  197. void
  198. TimeVal::copy(const timeval & src)
  199. {
  200.     tv_sec = src.tv_sec;
  201.     tv_usec = src.tv_usec;
  202. }
  203. void
  204. TimeVal::normalize()
  205. {
  206.     // The purpose of normalize is to ensure that the tv_usec field
  207.     // is in [0,100000).
  208.     //
  209.     if ( tv_usec < 0 )
  210.     {
  211.         long num_sec = ( -tv_usec / 1000000) + 1;
  212.         assert(num_sec > 0);
  213.         tv_sec -= num_sec;
  214.         tv_usec += num_sec * 1000000;
  215.         // The result of this operation may have tv_usec == 1000000.
  216.         //
  217.     }
  218.     if ( tv_usec >= 1000000 )
  219.     {
  220.         tv_sec += tv_usec / 1000000;
  221.         tv_usec %= 1000000;
  222.     }
  223. }
  224. ostream &
  225. TimeVal::writeTo(ostream & out) const
  226. {
  227.     return ( out << "{ " << tv_sec << ", " << tv_usec << " }" );
  228. }