> Thank you very much for your answer. Your words make sense concerning the 
> calculation! 
> There were two different (independent) problems:
> 1 the underlined line returns 0 on Freescale's I.MX53 ARM cpu, the reason:    
> "fTimestampFrequency*tv.tv_usec" is too large for 32bit. As the datatype of 
> "timestampIncrement" is u_int32_t the calculation is performed with 32 bit 
> width. On a 64bit PC this seems not to be a problem because it calculates 
> automatically with 64bit. The fix for this is to use a u_int64_t

No, that shouldn't be necessary.  The following should overcome the problem:

        timestampIncrement += 
(u_int32_t)(fTimestampFrequency*(tv.tv_usec/1000000.0) + 0.5);

because the calculation will be done with floats, but then converted to a 
"u_int32_t" at the end - without any overflow.

(2.0*fTimestampFrequency*tv.tv_usec + 1000000.0)/2000000);


> 2  in the gettimeofday function in GroupSockHelper.cpp (line 700):
>     Theres a define for WinCE, but unfortunately the WinCE version oft 
> gettimeofday is not working properly, I assume that it wasn't tested?

I don't (and will never) use WinCE myself, so any contributions of 
WinCE-specific code - such as this - have come from other WinCErs.  I have to 
trust that it works.


> You can find alot occurences of this problem in WinCE world. The problem is 
> the "GetSystemTime()" call, which should fill the SYSTEMTIME struct, but it 
> does not, at least not the milliseconds field (which is always 0). The 
> solution I used:
>  
> int gettimeofday(struct timeval* tp, int* /*tz*/) {
> #if defined(_WIN32_WCE)
>   /* FILETIME of Jan 1 1970 00:00:00. */
>   static const unsigned __int64 epoch = 116444736000000000LL;
>   static Boolean isFirstCall = True;
>   static LONGLONG unixStartTime = 0;
>   static DWORD firstTickCount=0;
>  
>   if (isFirstCall) {
>  
>     FILETIME fileTime;
>  
>     GetSystemTimeAsFileTime(&fileTime);
>  
>     LARGE_INTEGER date;
>     date.HighPart = fileTime.dwHighDateTime;
>     date.LowPart = fileTime.dwLowDateTime;
>  
>     unixStartTime= (date.QuadPart - epoch) / 10000000L;
>  
>     firstTickCount = GetTickCount();
>  
>     tp->tv_sec=(long)unixStartTime;
>     tp->tv_usec= 0L;
>  
>     isFirstCall = False; // for next time
>  
>   } else {
>     // add elapsed seconds
>     tp->tv_sec= (long)unixStartTime + (GetTickCount()-firstTickCount)/1000;
>     tp->tv_usec=(GetTickCount()-firstTickCount)%1000 * 1000;
> }
>  
> #else

OK, I'll make both these changes in the next release of the software.

Ross Finlayson
Live Networks, Inc.
http://www.live555.com/

_______________________________________________
live-devel mailing list
[email protected]
http://lists.live555.com/mailman/listinfo/live-devel

Reply via email to