> 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