Index: mythtv/libs/libmythtv/NuppelVideoPlayer.cpp =================================================================== --- mythtv/libs/libmythtv/NuppelVideoPlayer.cpp (revision 22730) +++ mythtv/libs/libmythtv/NuppelVideoPlayer.cpp (working copy) @@ -1074,13 +1074,17 @@ m_scan_locked = (scan != kScan_Detect); - if (scan == m_scan) + if (scan == m_scan) { + bool interlaced = m_deint_possible && is_interlaced(scan); + videosync->SetFrameInterval(frame_interval, interlaced); return; + } bool interlaced = is_interlaced(scan); if (interlaced && !m_deint_possible) { m_scan = scan; + videosync->SetFrameInterval(frame_interval, false); return; } @@ -1114,11 +1118,8 @@ if (kScan_Progressive == scan) { m_double_process = false; - if (m_double_framerate) - { - m_double_framerate = false; - videosync->SetFrameInterval(frame_interval, false); - } + m_double_framerate = false; + videosync->SetFrameInterval(frame_interval, false); videoOutput->SetDeinterlacingEnabled(false); VERBOSE(VB_PLAYBACK, "Disabled deinterlacing"); } Index: mythtv/libs/libmythtv/vsync.cpp =================================================================== --- mythtv/libs/libmythtv/vsync.cpp (revision 22730) +++ mythtv/libs/libmythtv/vsync.cpp (working copy) @@ -197,25 +197,15 @@ { struct timeval now; gettimeofday(&now, NULL); - //cout << "CalcDelay: next: " << timeval_str(m_nexttrigger) << " now " - // << timeval_str(now) << endl; int ret_val = (m_nexttrigger.tv_sec - now.tv_sec) * 1000000 + (m_nexttrigger.tv_usec - now.tv_usec); - //cout << "delay " << ret_val << endl; - - if (ret_val > m_frame_interval * 2) - { - if (m_interlaced) - ret_val = m_frame_interval; // same as / 2 * 2. - else - ret_val = m_frame_interval * 2; - - // set nexttrigger to our new target time + // We don't want to allow too much underflow. If + // the trigger time is too far in the past, reset it now. + if (ret_val < -m_frame_interval / 2) { m_nexttrigger.tv_sec = now.tv_sec; m_nexttrigger.tv_usec = now.tv_usec; - OffsetTimeval(m_nexttrigger, ret_val); } return ret_val;