diff --git a/mythtv/libs/libmythtv/mythplayer.cpp b/mythtv/libs/libmythtv/mythplayer.cpp index 3db086f..cb10228 100644 --- a/mythtv/libs/libmythtv/mythplayer.cpp +++ b/mythtv/libs/libmythtv/mythplayer.cpp @@ -79,7 +79,7 @@ const double MythPlayer::kInaccuracyNone = 0; // By default, when seeking, snap to a keyframe if the keyframe's // distance from the target frame is less than 10% of the total seek // distance. -const double MythPlayer::kInaccuracyDefault = 0.1; +const double MythPlayer::kInaccuracyDefault = 0.2; // Allow greater inaccuracy (50%) in the cutlist editor (unless the // editor seek distance is set to 1 frame or 1 keyframe). @@ -202,7 +202,7 @@ MythPlayer::MythPlayer(PlayerFlags flags) decoder_lock(QMutex::Recursive), next_play_speed(1.0f), next_normal_speed(true), play_speed(1.0f), normal_speed(true), - frame_interval((int)(1000000.0f / 30)), m_frame_interval(0), + frame_interval((int)(1000000.0f / 25)), m_frame_interval(0), ffrew_skip(1),ffrew_adjust(0), // Audio and video synchronization stuff videosync(NULL), avsync_delay(0), @@ -673,9 +673,7 @@ FrameScanType MythPlayer::detectInterlace(FrameScanType newScan, // isn't, we have to guess. scan = kScan_Interlaced; // default to interlaced - if (720 == video_height) // ATSC 720p - scan = kScan_Progressive; - else if (fps > 45) // software deinterlacing + if (fps > 45) // software deinterlacing scan = kScan_Progressive; if (kScan_Detect != newScan) @@ -1774,6 +1772,8 @@ int MythPlayer::NextCaptionTrack(int mode) void MythPlayer::SetFrameInterval(FrameScanType scan, double frame_period) { frame_interval = (int)(1000000.0f * frame_period + 0.5f); + int frameDelay = m_double_framerate ? frame_interval / 2 : frame_interval; + if (!avsync_predictor_enabled) avsync_predictor = 0; avsync_predictor_enabled = false; @@ -1783,7 +1783,7 @@ void MythPlayer::SetFrameInterval(FrameScanType scan, double frame_period) if (play_speed < 1 || play_speed > 2 || refreshrate <= 0) return; - avsync_predictor_enabled = ((frame_interval-(frame_interval/200)) < + avsync_predictor_enabled = ((frameDelay-(frameDelay/200)) < refreshrate); } @@ -1902,7 +1902,7 @@ void MythPlayer::AVSync(VideoFrame *buffer, bool limit_delay) if (avsync_predictor_enabled) { - avsync_predictor += frame_interval; + avsync_predictor += frameDelay; if (avsync_predictor >= refreshrate) { int refreshperiodsinframe = avsync_predictor/refreshrate; @@ -2011,7 +2011,7 @@ void MythPlayer::AVSync(VideoFrame *buffer, bool limit_delay) videoOutput->Show(ps); } - repeat_delay = frame_interval * repeat_pict * 0.5; + repeat_delay = frameDelay * repeat_pict * 0.5; if (repeat_delay) LOG(VB_TIMESTAMP, LOG_INFO, LOC + @@ -2037,7 +2037,7 @@ void MythPlayer::AVSync(VideoFrame *buffer, bool limit_delay) { // If audio is way behind of video, adjust for it... // by cutting the frame rate in half for the length of this frame - avsync_adjustment = frame_interval; + avsync_adjustment = frameDelay; //frame_interval lastsync = true; LOG(VB_PLAYBACK, LOG_INFO, LOC + QString("Video is %1 frames ahead of audio,\n" @@ -2055,7 +2055,7 @@ void MythPlayer::AVSync(VideoFrame *buffer, bool limit_delay) "diverge %10") .arg(currentaudiotime) .arg(timecode) - .arg(frame_interval) + .arg(frameDelay) .arg(timecode - currentaudiotime - (int)(vsync_delay_clock*audio.GetStretchFactor()+500)/1000) .arg(avsync_avg) @@ -2074,14 +2074,14 @@ void MythPlayer::AVSync(VideoFrame *buffer, bool limit_delay) int delta = (int)((timecode - prevtc)/play_speed) - (frame_interval / 1000); // If timecode is off by a frame (dropped frame) wait to sync - if (delta > (int) frame_interval / 1200 && - delta < (int) frame_interval / 1000 * 3 && + if (delta > (int) frameDelay / 1200 && + delta < (int) frameDelay / 1000 * 3 && prevrp == 0) { // wait an extra frame interval LOG(VB_PLAYBACK | VB_TIMESTAMP, LOG_INFO, LOC + QString("A/V delay %1").arg(delta)); - avsync_adjustment += frame_interval; + avsync_adjustment += frameDelay; // If we're duplicating a frame, it may be because // the container frame rate doesn't match the // stream frame rate. In this case, we increment