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

流媒体/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 version[] =
  51.     "$Id: VTime.cxx,v 1.15 2001/06/27 22:56:20 bko Exp $";
  52. #include <cassert>
  53. #ifndef WIN32
  54. #include <unistd.h>
  55. #endif
  56. #include <stdio.h>
  57. #include <iostream>
  58. #include "VTime.hxx"
  59. #include "LockHelper.hxx"
  60. #include "VMutex.h"
  61. VMutex _mutex;
  62. void VTime::print()
  63. {
  64.     fprintf( stderr, "%u.%010u", seconds, fractional );
  65. }
  66. VTime operator+( const VTime& lhs , const unsigned int msec )
  67. {
  68.     VTime result ( 0, 0 );
  69.     u_int32_t delayFrac = ( msec % 1000 ) * 4294967;
  70.     result.seconds = lhs.seconds + ( msec / 1000 );
  71.     result.fractional = lhs.fractional + delayFrac;
  72.     if ( ( lhs.fractional > result.fractional ) &&
  73.             ( delayFrac > result.fractional ) )
  74.     {
  75.         result.seconds++;
  76.     }
  77.     return result;
  78. }
  79. VTime operator-( const VTime& lhs , const unsigned int msec )
  80. {
  81.     VTime result( 0, 0 );
  82.     u_int32_t delayFrac = ( msec % 1000 ) * 4294967;
  83.     if (lhs.seconds > (msec / 1000))
  84.     {
  85.         result.seconds = lhs.seconds - ( msec / 1000 );
  86.         result.fractional = lhs.fractional - delayFrac;
  87.         if ( delayFrac > lhs.fractional )
  88.         {
  89.             result.seconds--;
  90.         }
  91.     }
  92.     else
  93.     {
  94.         result.seconds = 0;
  95.         if ( delayFrac >= lhs.fractional )
  96.         {
  97.             result.fractional = 0;
  98.         }
  99.         else
  100.         {
  101.             result.fractional = lhs.fractional - delayFrac;
  102.         }
  103.     }
  104.     return result;
  105. }
  106. int operator-( const VTime& lhs , const VTime& rhs )
  107. {
  108.     // partialresult is ms difference
  109.     VTime result;
  110.     int msResult;
  111.     //assert (lhs.seconds >= rhs.seconds);
  112.     if ( lhs == rhs ) return 0;
  113.     //    if ( lhs < rhs ) return 0;
  114.     if ( lhs > rhs )
  115.     {
  116.         result.seconds = lhs.seconds - rhs.seconds;
  117.         if ( lhs.fractional >= rhs.fractional )
  118.         {
  119.             result.fractional = lhs.fractional - rhs.fractional;
  120.         }
  121.         else
  122.         {
  123.             result.seconds--;
  124.             result.fractional = rhs.fractional - lhs.fractional;
  125.         }
  126.         msResult = ( ( result.getSeconds() * 1000 ) +
  127.                      ( result.getFractional() / 4294967 ));
  128.     }
  129.     else
  130.     {
  131.         result.seconds = rhs.seconds - lhs.seconds;
  132.         if ( rhs.fractional >= lhs.fractional )
  133.         {
  134.             result.fractional = rhs.fractional - lhs.fractional;
  135.         }
  136.         else
  137.         {
  138.             result.seconds--;
  139.             result.fractional = lhs.fractional - rhs.fractional;
  140.         }
  141.         msResult = - ( ( ( result.getSeconds() * 1000 ) +
  142.                          ( result.getFractional() / 4294967 ) ) );
  143.     }
  144.     return msResult;
  145. }
  146. bool operator==( const VTime& rhs , const VTime& lhs )
  147. {
  148.     return ( rhs.seconds == lhs.seconds ) ?
  149.            ( rhs.fractional == lhs.fractional ) : ( rhs.seconds == lhs.seconds );
  150. }
  151. bool operator<( const VTime& rhs , const VTime& lhs )
  152. {
  153.     return ( rhs.seconds == lhs.seconds ) ?
  154.            ( rhs.fractional < lhs.fractional ) : ( rhs.seconds < lhs.seconds );
  155. }
  156. bool operator>( const VTime& rhs , const VTime& lhs )
  157. {
  158.     return ( rhs.seconds == lhs.seconds ) ?
  159.            (rhs.fractional > lhs.fractional ) : ( rhs.seconds > lhs.seconds );
  160. }
  161. VTime getVTime()
  162. {
  163.     struct timeval now;
  164.     int err = gettimeofday( &now, NULL );
  165.     assert( !err );
  166.     VTime result ( now.tv_sec, now.tv_usec * 4294 );
  167.     return result;
  168. }
  169. string
  170. VTime::strftime(const string& format)
  171. {
  172.     LockHelper helper(_mutex);
  173.     time_t now;
  174.     (void)time(&now);
  175.     char datebuf[256];
  176.     ::strftime(datebuf, 256, format.c_str(), localtime(&now));
  177.     return (datebuf);
  178. }
  179. #ifdef __vxworks
  180. /*********************************************************************
  181.  
  182.  subroutines for VxWorks
  183.  
  184. *********************************************************************/
  185. #include <netinet/in.h>
  186. #include <netinet/in_systm.h>
  187. /*
  188.  * this implementation of gettimeoftime() uses iptime()
  189.  * which is accurate to the nearest millisecond; microsecond
  190.  * accuracy is faked by multiplying the milliseconds by 1000
  191.  */
  192. int
  193. gettimeofday (struct timeval *tv, struct timezone *tz)
  194. {
  195.     unsigned long int msec;  // msec since 00:00 GMT
  196.     // iptime() returns msec since 00:00 GMT in reverse byte order
  197.     // call ntohl to swap it
  198.     msec = ntohl ( iptime() );
  199.     tv->tv_sec = ( msec / 1000 );
  200.     tv->tv_usec = ( msec % 1000 ) * 1000;
  201.     return 0;
  202. }
  203. #endif // __vxworks
  204. #ifdef WIN32
  205. int
  206. gettimeofday (struct timeval *tv, struct timezone *)
  207. {
  208.     FILETIME file_time;
  209.     GetSystemTimeAsFileTime (&file_time);
  210.     ULARGE_INTEGER _100ns = {file_time.dwLowDateTime,
  211.                            file_time.dwHighDateTime};
  212.     _100ns.QuadPart -= 0x19db1ded53e8000;
  213.     tv->tv_sec = long (_100ns.QuadPart / (10000 * 1000));
  214.     tv->tv_usec = (long) ((_100ns.LowPart % (DWORD) (10000 * 1000)) / 10);
  215.     return 0;
  216. }
  217. #endif // WIN32