home
products
contribute
download
documentation
forum
Home
Forums
New posts
Search forums
What's new
New posts
All posts
Latest activity
Members
Registered members
Current visitors
Donate
Log in
Register
What's new
Search
Search
Search titles only
By:
New posts
Search forums
Search titles only
By:
Menu
Log in
Register
Navigation
Install the app
Install
More options
Contact us
Close Menu
Forums
MediaPortal 1
Development
General Development (no feature request here!)
MediaPortal Audio renderer - better video playback quality
Contact us
RSS
JavaScript is disabled. For a better experience, please enable JavaScript in your browser before proceeding.
You are using an out of date browser. It may not display this or other websites correctly.
You should upgrade or use an
alternative browser
.
Reply to thread
Message
<blockquote data-quote="tourettes" data-source="post: 662714" data-attributes="member: 10858"><p>davidf, I'm currently testing following code. This gives (at least on first 1,5 hour DVD playback) good results on the HTPC. The main difference if that the 1 ms accuracy for the current system time has been improved by using the QPC for it as well. Do you think that the precission error could have been piling up in the non-QPC based code?</p><p></p><p>[code]</p><p>REFERENCE_TIME CSyncClock::GetPrivateTime()</p><p>{</p><p> CAutoLock cObjectLock(this);</p><p></p><p> UINT64 qpcNow = GetCurrentTimestamp();</p><p></p><p> //DWORD dwTime = timeGetTime();</p><p></p><p> UINT64 hwClock(0);</p><p> UINT64 hwQpc(0);</p><p></p><p> UINT64 hwClockEnd(0);</p><p> UINT64 hwQpcEnd(0);</p><p></p><p> HRESULT hr = m_pAudioRenderer->AudioClock(hwClock, hwQpc);</p><p></p><p> if (m_dStartTimeSystem == 0)</p><p> m_dStartTimeSystem = qpcNow; //dwTime;</p><p></p><p> if (m_dwPrevSystemTime == 0)</p><p> m_dwPrevSystemTime = qpcNow;</p><p></p><p> if (hr == S_OK)</p><p> {</p><p> if (m_dStartQpcHW == 0)</p><p> m_dStartQpcHW = hwQpc;</p><p></p><p> if (m_dStartTimeHW == 0)</p><p> m_dStartTimeHW = hwClock;</p><p></p><p> if (m_dStartTimeCorrected == 0)</p><p> m_dStartTimeCorrected = m_rtPrivateTime;</p><p></p><p> m_dDurationHW = (hwClock - m_dStartTimeHW);</p><p> m_dDurationSystem = (qpcNow/*dwTime*/ - m_dStartTimeSystem); </p><p> m_dDurationCorrected = (m_rtPrivateTime - m_dStartTimeCorrected);</p><p></p><p> //if (hwQpc < m_dPrevQpcHW)</p><p> //Log("%I64d", hwQpc - m_dPrevQpcHW);</p><p></p><p> if (m_dPrevTimeHW > hwClock)</p><p> {</p><p> m_dStartTimeHW = m_dPrevTimeHW = hwClock;</p><p> m_dStartQpcHW = m_dPrevQpcHW = hwQpc;</p><p> m_dStartTimeSystem = qpcNow;//dwTime;</p><p> m_dStartTimeCorrected = m_rtPrivateTime;</p><p> m_llDeltaError = 0;</p><p> overallCorrection = 0;</p><p> }</p><p> else</p><p> {</p><p> double clockDiff = hwClock - m_dStartTimeHW;</p><p> double qpcDiff = hwQpc - m_dStartQpcHW;</p><p></p><p> if (clockDiff > 0 && qpcDiff > 0)</p><p> m_dSystemClockMultiplier = clockDiff / qpcDiff;</p><p></p><p> if (m_dSystemClockMultiplier < 0.95 || m_dSystemClockMultiplier > 1.05)</p><p> m_dSystemClockMultiplier = 1.0;</p><p></p><p> m_dPrevTimeHW = hwClock;</p><p> m_dPrevQpcHW = hwQpc;</p><p> }</p><p> }</p><p> else</p><p> {</p><p> //Log("AudioClock() returned error (0x%08x)");</p><p> }</p><p></p><p> //REFERENCE_TIME delta = REFERENCE_TIME(dwTime) - REFERENCE_TIME(m_dwPrevSystemTime);</p><p> //REFERENCE_TIME deltaOrig = delta;</p><p> </p><p> INT64 delta = qpcNow - m_dwPrevSystemTime;</p><p> INT64 deltaOrig = delta;</p><p></p><p>// if (dwTime < m_dwPrevSystemTime)</p><p> {</p><p> //delta += REFERENCE_TIME(UINT_MAX) + 1;</p><p> }</p><p></p><p> m_dwPrevSystemTime = qpcNow;// dwTime;</p><p> delta = (REFERENCE_TIME)(delta * (UNITS / MILLISECONDS));</p><p> double dAdjustment;</p><p> if (m_bHWBasedRefClock)</p><p> {</p><p> dAdjustment = m_dAdjustment * m_dBias / m_dSystemClockMultiplier;</p><p> }</p><p> else</p><p> {</p><p> dAdjustment = m_dAdjustment * m_dBias;</p><p> }</p><p> double ddelta= ((double) delta) * dAdjustment;</p><p> delta = (REFERENCE_TIME) ddelta;</p><p> m_ddeltaError += ddelta - delta;</p><p> if (m_ddeltaError > 1.0)</p><p> {</p><p> delta += 10000;</p><p> m_ddeltaError -= 1.0;</p><p> overallCorrection += 1.0;</p><p> }</p><p> else if (m_ddeltaError < -1.0)</p><p> {</p><p> delta -= 10000;</p><p> m_ddeltaError += 1.0;</p><p> overallCorrection -= 1.0;</p><p> }</p><p> </p><p> //if (hwQpc - m_dStartQpcHW > 600000000)</p><p> {</p><p> //Log("mul: %.10f de: %8I64d de.orig: %8I64d de.err: %.10f bias: %.10f adj: %.10f hwQpc: %I64d hwClock: %I64d", </p><p> //m_dSystemClockMultiplier, delta / 10000, deltaOrig, m_ddeltaError, m_dBias, m_dAdjustment, hwQpc, hwClock);</p><p> }</p><p></p><p> m_rtPrivateTime = m_rtPrivateTime + delta / 10000;</p><p></p><p> //m_ddeltaError += (delta - (double)((INT64)delta / 10000) * 10000);</p><p></p><p> return m_rtPrivateTime;</p><p>}</p><p>[/code]</p><p></p><p></p><p>here's a sample of the logged data:</p><p></p><p>[code]02-10-2010 17:14:32.920 [ c50] mul: 1.0000591714 de: 50067 de.orig: 50064 de.err: 0.5450161928 bias: 1.0000000000 adj: 1.0000000000 hwQpc: 15412931319657 hwClock: 121402083</p><p>02-10-2010 17:14:32.925 [ c50] mul: 1.0000587848 de: 49917 de.orig: 49914 de.err: 0.4135349030 bias: 1.0000000000 adj: 1.0000000000 hwQpc: 15412931369493 hwClock: 121451875</p><p>02-10-2010 17:14:32.927 [ c50] mul: 1.0000594914 de: 20122 de.orig: 20120 de.err: 0.0784983570 bias: 1.0000000000 adj: 1.0000000000 hwQpc: 15412931389614 hwClock: 121472083</p><p>02-10-2010 17:14:32.929 [ c50] mul: 1.0000588067 de: 19884 de.orig: 19883 de.err: 0.6050553257 bias: 1.0000000000 adj: 1.0000000000 hwQpc: 15412931409488 hwClock: 121491875</p><p>02-10-2010 17:14:32.931 [ c50] mul: 1.0000583278 de: 20050 de.orig: 20049 de.err: 0.7496228749 bias: 1.0000000000 adj: 1.0000000000 hwQpc: 15412931429545 hwClock: 121511875</p><p>02-10-2010 17:14:32.933 [ c50] mul: 1.0000584828 de: 19985 de.orig: 19983 de.err: 0.3691143924 bias: 1.0000000000 adj: 1.0000000000 hwQpc: 15412931449525 hwClock: 121531875</p><p>02-10-2010 17:14:32.936 [ c50] mul: 1.0000599162 de: 30189 de.orig: 30187 de.err: 0.2678700024 bias: 1.0000000000 adj: 1.0000000000 hwQpc: 15412931479765 hwClock: 121562291</p><p>02-10-2010 17:14:32.938 [ c50] mul: 1.0000595445 de: 19862 de.orig: 19861 de.err: 0.3983151847 bias: 1.0000000000 adj: 1.0000000000 hwQpc: 15412931499601 hwClock: 121582083</p><p>02-10-2010 17:14:32.938 [ c50] mul: 1.0000596672 de: 1469 de.orig: 1468 de.err: 0.3122369414 bias: 1.0000000000 adj: 1.0000000000 hwQpc: 15412931501044 hwClock: 121583541</p><p>02-10-2010 17:14:32.938 [ c50] mul: 1.0000588440 de: 1357 de.orig: 1356 de.err: 0.2364152828 bias: 1.0000000000 adj: 1.0000000000 hwQpc: 15412931502394 hwClock: 121584791</p><p>02-10-2010 17:14:32.938 [ c50] mul: 1.0000599866 de: 1321 de.orig: 1320 de.err: 0.0599926887 bias: 1.0000000000 adj: 1.0000000000 hwQpc: 15412931503714 hwClock: 121586250</p><p>02-10-2010 17:14:32.938 [ c50] mul: 1.0000593526 de: 1329 de.orig: 1329 de.err: 0.8566284487 bias: 1.0000000000 adj: 1.0000000000 hwQpc: 15412931505041 hwClock: 121587500</p><p>02-10-2010 17:14:32.938 [ c50] mul: 1.0000587680 de: 1323 de.orig: 1322 de.err: 0.7698523877 bias: 1.0000000000 adj: 1.0000000000 hwQpc: 15412931506362 hwClock: 121588750</p><p>02-10-2010 17:14:32.938 [ c50] mul: 1.0000599436 de: 1315 de.orig: 1314 de.err: 0.4281588281 bias: 1.0000000000 adj: 1.0000000000 hwQpc: 15412931507677 hwClock: 121590208</p><p>02-10-2010 17:14:32.939 [ c50] mul: 1.0000599839 de: 1663 de.orig: 1662 de.err: 0.3599017607 bias: 1.0000000000 adj: 1.0000000000 hwQpc: 15412931509339 hwClock: 121591875</p><p>02-10-2010 17:14:32.945 [ 72c] mul: 1.0000599191 de: 64305 de.orig: 64302 de.err: 0.5587509619 bias: 1.0000000000 adj: 1.0000000000 hwQpc: 15412931573926 hwClock: 121656458</p><p>02-10-2010 17:14:32.945 [ c50] mul: 1.0000596389 de: 1768 de.orig: 1768 de.err: 0.9745344454 bias: 1.0000000000 adj: 1.0000000000 hwQpc: 15412931575418 hwClock: 121657916</p><p>02-10-2010 17:14:32.945 [ 64c] mul: 1.0000596630 de: 1249 de.orig: 1248 de.err: 0.5681672310 bias: 1.0000000000 adj: 1.0000000000 hwQpc: 15412931576665 hwClock: 121659166</p><p>02-10-2010 17:14:32.951 [ 64c] mul: 1.0000583305 de: 52811 de.orig: 52808 de.err: 0.7247242546 bias: 1.0000000000 adj: 1.0000000000 hwQpc: 15412931629741 hwClock: 121712083</p><p>02-10-2010 17:14:32.951 [ 448] mul: 1.0000596528 de: 1352 de.orig: 1351 de.err: 0.6344760293 bias: 1.0000000000 adj: 1.0000000000 hwQpc: 15412931630830 hwClock: 121713333</p><p>02-10-2010 17:14:32.951 [ 64c] mul: 1.0000597917 de: 1639 de.orig: 1638 de.err: 0.0225823438 bias: 1.0000000000 adj: 1.0000000000 hwQpc: 15412931632480 hwClock: 121715000</p><p>02-10-2010 17:14:32.951 [ 448] mul: 1.0000589122 de: 761 de.orig: 761 de.err: 0.3442753851 bias: 1.0000000000 adj: 1.0000000000 hwQpc: 15412931633212 hwClock: 121715625</p><p>02-10-2010 17:14:32.951 [ c50] mul: 1.0000587720 de: 1045 de.orig: 1045 de.err: 0.5115637202 bias: 1.0000000000 adj: 1.0000000000 hwQpc: 15412931634270 hwClock: 121716666</p><p>02-10-2010 17:14:32.953 [ 64c] mul: 1.0000597909 de: 16301 de.orig: 16300 de.err: 0.4305750448 bias: 1.0000000000 adj: 1.0000000000 hwQpc: 15412931650812 hwClock: 121733333</p><p>02-10-2010 17:14:32.956 [ c50] mul: 1.0000597604 de: 28991 de.orig: 28990 de.err: 0.9612073023 bias: 1.0000000000 adj: 1.0000000000 hwQpc: 15412931679564 hwClock: 121762083</p><p>[/code]</p><p></p><p></p><p>btw. should it be </p><p></p><p>[code]</p><p> if (m_bHWBasedRefClock)</p><p> {</p><p> dAdjustment = m_dAdjustment * m_dBias * m_dSystemClockMultiplier;</p><p> }</p><p>[/code]</p><p></p><p>OR</p><p></p><p>[code]</p><p> if (m_bHWBasedRefClock)</p><p> {</p><p> dAdjustment = m_dAdjustment * m_dBias / m_dSystemClockMultiplier;</p><p> }</p><p>[/code]</p></blockquote><p></p>
[QUOTE="tourettes, post: 662714, member: 10858"] davidf, I'm currently testing following code. This gives (at least on first 1,5 hour DVD playback) good results on the HTPC. The main difference if that the 1 ms accuracy for the current system time has been improved by using the QPC for it as well. Do you think that the precission error could have been piling up in the non-QPC based code? [code] REFERENCE_TIME CSyncClock::GetPrivateTime() { CAutoLock cObjectLock(this); UINT64 qpcNow = GetCurrentTimestamp(); //DWORD dwTime = timeGetTime(); UINT64 hwClock(0); UINT64 hwQpc(0); UINT64 hwClockEnd(0); UINT64 hwQpcEnd(0); HRESULT hr = m_pAudioRenderer->AudioClock(hwClock, hwQpc); if (m_dStartTimeSystem == 0) m_dStartTimeSystem = qpcNow; //dwTime; if (m_dwPrevSystemTime == 0) m_dwPrevSystemTime = qpcNow; if (hr == S_OK) { if (m_dStartQpcHW == 0) m_dStartQpcHW = hwQpc; if (m_dStartTimeHW == 0) m_dStartTimeHW = hwClock; if (m_dStartTimeCorrected == 0) m_dStartTimeCorrected = m_rtPrivateTime; m_dDurationHW = (hwClock - m_dStartTimeHW); m_dDurationSystem = (qpcNow/*dwTime*/ - m_dStartTimeSystem); m_dDurationCorrected = (m_rtPrivateTime - m_dStartTimeCorrected); //if (hwQpc < m_dPrevQpcHW) //Log("%I64d", hwQpc - m_dPrevQpcHW); if (m_dPrevTimeHW > hwClock) { m_dStartTimeHW = m_dPrevTimeHW = hwClock; m_dStartQpcHW = m_dPrevQpcHW = hwQpc; m_dStartTimeSystem = qpcNow;//dwTime; m_dStartTimeCorrected = m_rtPrivateTime; m_llDeltaError = 0; overallCorrection = 0; } else { double clockDiff = hwClock - m_dStartTimeHW; double qpcDiff = hwQpc - m_dStartQpcHW; if (clockDiff > 0 && qpcDiff > 0) m_dSystemClockMultiplier = clockDiff / qpcDiff; if (m_dSystemClockMultiplier < 0.95 || m_dSystemClockMultiplier > 1.05) m_dSystemClockMultiplier = 1.0; m_dPrevTimeHW = hwClock; m_dPrevQpcHW = hwQpc; } } else { //Log("AudioClock() returned error (0x%08x)"); } //REFERENCE_TIME delta = REFERENCE_TIME(dwTime) - REFERENCE_TIME(m_dwPrevSystemTime); //REFERENCE_TIME deltaOrig = delta; INT64 delta = qpcNow - m_dwPrevSystemTime; INT64 deltaOrig = delta; // if (dwTime < m_dwPrevSystemTime) { //delta += REFERENCE_TIME(UINT_MAX) + 1; } m_dwPrevSystemTime = qpcNow;// dwTime; delta = (REFERENCE_TIME)(delta * (UNITS / MILLISECONDS)); double dAdjustment; if (m_bHWBasedRefClock) { dAdjustment = m_dAdjustment * m_dBias / m_dSystemClockMultiplier; } else { dAdjustment = m_dAdjustment * m_dBias; } double ddelta= ((double) delta) * dAdjustment; delta = (REFERENCE_TIME) ddelta; m_ddeltaError += ddelta - delta; if (m_ddeltaError > 1.0) { delta += 10000; m_ddeltaError -= 1.0; overallCorrection += 1.0; } else if (m_ddeltaError < -1.0) { delta -= 10000; m_ddeltaError += 1.0; overallCorrection -= 1.0; } //if (hwQpc - m_dStartQpcHW > 600000000) { //Log("mul: %.10f de: %8I64d de.orig: %8I64d de.err: %.10f bias: %.10f adj: %.10f hwQpc: %I64d hwClock: %I64d", //m_dSystemClockMultiplier, delta / 10000, deltaOrig, m_ddeltaError, m_dBias, m_dAdjustment, hwQpc, hwClock); } m_rtPrivateTime = m_rtPrivateTime + delta / 10000; //m_ddeltaError += (delta - (double)((INT64)delta / 10000) * 10000); return m_rtPrivateTime; } [/code] here's a sample of the logged data: [code]02-10-2010 17:14:32.920 [ c50] mul: 1.0000591714 de: 50067 de.orig: 50064 de.err: 0.5450161928 bias: 1.0000000000 adj: 1.0000000000 hwQpc: 15412931319657 hwClock: 121402083 02-10-2010 17:14:32.925 [ c50] mul: 1.0000587848 de: 49917 de.orig: 49914 de.err: 0.4135349030 bias: 1.0000000000 adj: 1.0000000000 hwQpc: 15412931369493 hwClock: 121451875 02-10-2010 17:14:32.927 [ c50] mul: 1.0000594914 de: 20122 de.orig: 20120 de.err: 0.0784983570 bias: 1.0000000000 adj: 1.0000000000 hwQpc: 15412931389614 hwClock: 121472083 02-10-2010 17:14:32.929 [ c50] mul: 1.0000588067 de: 19884 de.orig: 19883 de.err: 0.6050553257 bias: 1.0000000000 adj: 1.0000000000 hwQpc: 15412931409488 hwClock: 121491875 02-10-2010 17:14:32.931 [ c50] mul: 1.0000583278 de: 20050 de.orig: 20049 de.err: 0.7496228749 bias: 1.0000000000 adj: 1.0000000000 hwQpc: 15412931429545 hwClock: 121511875 02-10-2010 17:14:32.933 [ c50] mul: 1.0000584828 de: 19985 de.orig: 19983 de.err: 0.3691143924 bias: 1.0000000000 adj: 1.0000000000 hwQpc: 15412931449525 hwClock: 121531875 02-10-2010 17:14:32.936 [ c50] mul: 1.0000599162 de: 30189 de.orig: 30187 de.err: 0.2678700024 bias: 1.0000000000 adj: 1.0000000000 hwQpc: 15412931479765 hwClock: 121562291 02-10-2010 17:14:32.938 [ c50] mul: 1.0000595445 de: 19862 de.orig: 19861 de.err: 0.3983151847 bias: 1.0000000000 adj: 1.0000000000 hwQpc: 15412931499601 hwClock: 121582083 02-10-2010 17:14:32.938 [ c50] mul: 1.0000596672 de: 1469 de.orig: 1468 de.err: 0.3122369414 bias: 1.0000000000 adj: 1.0000000000 hwQpc: 15412931501044 hwClock: 121583541 02-10-2010 17:14:32.938 [ c50] mul: 1.0000588440 de: 1357 de.orig: 1356 de.err: 0.2364152828 bias: 1.0000000000 adj: 1.0000000000 hwQpc: 15412931502394 hwClock: 121584791 02-10-2010 17:14:32.938 [ c50] mul: 1.0000599866 de: 1321 de.orig: 1320 de.err: 0.0599926887 bias: 1.0000000000 adj: 1.0000000000 hwQpc: 15412931503714 hwClock: 121586250 02-10-2010 17:14:32.938 [ c50] mul: 1.0000593526 de: 1329 de.orig: 1329 de.err: 0.8566284487 bias: 1.0000000000 adj: 1.0000000000 hwQpc: 15412931505041 hwClock: 121587500 02-10-2010 17:14:32.938 [ c50] mul: 1.0000587680 de: 1323 de.orig: 1322 de.err: 0.7698523877 bias: 1.0000000000 adj: 1.0000000000 hwQpc: 15412931506362 hwClock: 121588750 02-10-2010 17:14:32.938 [ c50] mul: 1.0000599436 de: 1315 de.orig: 1314 de.err: 0.4281588281 bias: 1.0000000000 adj: 1.0000000000 hwQpc: 15412931507677 hwClock: 121590208 02-10-2010 17:14:32.939 [ c50] mul: 1.0000599839 de: 1663 de.orig: 1662 de.err: 0.3599017607 bias: 1.0000000000 adj: 1.0000000000 hwQpc: 15412931509339 hwClock: 121591875 02-10-2010 17:14:32.945 [ 72c] mul: 1.0000599191 de: 64305 de.orig: 64302 de.err: 0.5587509619 bias: 1.0000000000 adj: 1.0000000000 hwQpc: 15412931573926 hwClock: 121656458 02-10-2010 17:14:32.945 [ c50] mul: 1.0000596389 de: 1768 de.orig: 1768 de.err: 0.9745344454 bias: 1.0000000000 adj: 1.0000000000 hwQpc: 15412931575418 hwClock: 121657916 02-10-2010 17:14:32.945 [ 64c] mul: 1.0000596630 de: 1249 de.orig: 1248 de.err: 0.5681672310 bias: 1.0000000000 adj: 1.0000000000 hwQpc: 15412931576665 hwClock: 121659166 02-10-2010 17:14:32.951 [ 64c] mul: 1.0000583305 de: 52811 de.orig: 52808 de.err: 0.7247242546 bias: 1.0000000000 adj: 1.0000000000 hwQpc: 15412931629741 hwClock: 121712083 02-10-2010 17:14:32.951 [ 448] mul: 1.0000596528 de: 1352 de.orig: 1351 de.err: 0.6344760293 bias: 1.0000000000 adj: 1.0000000000 hwQpc: 15412931630830 hwClock: 121713333 02-10-2010 17:14:32.951 [ 64c] mul: 1.0000597917 de: 1639 de.orig: 1638 de.err: 0.0225823438 bias: 1.0000000000 adj: 1.0000000000 hwQpc: 15412931632480 hwClock: 121715000 02-10-2010 17:14:32.951 [ 448] mul: 1.0000589122 de: 761 de.orig: 761 de.err: 0.3442753851 bias: 1.0000000000 adj: 1.0000000000 hwQpc: 15412931633212 hwClock: 121715625 02-10-2010 17:14:32.951 [ c50] mul: 1.0000587720 de: 1045 de.orig: 1045 de.err: 0.5115637202 bias: 1.0000000000 adj: 1.0000000000 hwQpc: 15412931634270 hwClock: 121716666 02-10-2010 17:14:32.953 [ 64c] mul: 1.0000597909 de: 16301 de.orig: 16300 de.err: 0.4305750448 bias: 1.0000000000 adj: 1.0000000000 hwQpc: 15412931650812 hwClock: 121733333 02-10-2010 17:14:32.956 [ c50] mul: 1.0000597604 de: 28991 de.orig: 28990 de.err: 0.9612073023 bias: 1.0000000000 adj: 1.0000000000 hwQpc: 15412931679564 hwClock: 121762083 [/code] btw. should it be [code] if (m_bHWBasedRefClock) { dAdjustment = m_dAdjustment * m_dBias * m_dSystemClockMultiplier; } [/code] OR [code] if (m_bHWBasedRefClock) { dAdjustment = m_dAdjustment * m_dBias / m_dSystemClockMultiplier; } [/code] [/QUOTE]
Insert quotes…
Verification
Post reply
Forums
MediaPortal 1
Development
General Development (no feature request here!)
MediaPortal Audio renderer - better video playback quality
Contact us
RSS
Top
Bottom