Ticket #7759: t7759_repeat_pict_v1_part1.diff
File t7759_repeat_pict_v1_part1.diff, 4.3 KB (added by , 14 years ago) |
---|
-
libs/libmythtv/NuppelVideoPlayer.h
804 804 bool decode_extra_audio; 805 805 float m_stored_audio_stretchfactor; 806 806 bool audio_paused; 807 int repeat_delay; 807 808 808 809 // Audio warping stuff 809 810 bool usevideotimebase; … … 815 816 816 817 // Time Code stuff 817 818 int prevtc; ///< 32 bit timecode if last VideoFrame shown 819 int prevrp; ///< repeat_pict of last frame 818 820 int tc_avcheck_framecounter; 819 821 long long tc_wrap[TCTYPESMAX]; 820 822 long long tc_lastval[TCTYPESMAX]; -
libs/libmythtv/NuppelVideoPlayer.cpp
253 253 lastsync(false), m_playing_slower(false), 254 254 m_stored_audio_stretchfactor(1.0), 255 255 audio_paused(false), 256 repeat_delay(0), 256 257 // Audio warping stuff 257 258 usevideotimebase(false), 258 259 warpfactor(1.0f), warpfactor_avg(1.0f), 259 260 warplbuff(NULL), warprbuff(NULL), 260 261 warpbuffsize(0), 261 262 // Time Code stuff 262 prevtc(0), 263 prevtc(0), prevrp(0), 263 264 tc_avcheck_framecounter(0), tc_diff_estimate(0), 264 265 savedAudioTimecodeOffset(0), 265 266 // LiveTVChain stuff … … 2388 2389 2389 2390 avsync_adjustment = 0; 2390 2391 2392 repeat_delay = 0; 2393 2391 2394 if (usevideotimebase) 2392 2395 { 2393 2396 warpfactor_avg = gContext->GetNumSetting("WarpFactor", 0); … … 2505 2508 2506 2509 VERBOSE(VB_PLAYBACK|VB_TIMESTAMP, QString("AVSync waitforframe %1 %2") 2507 2510 .arg(avsync_adjustment).arg(m_double_framerate)); 2508 videosync->WaitForFrame(avsync_adjustment );2511 videosync->WaitForFrame(avsync_adjustment + repeat_delay); 2509 2512 VERBOSE(VB_PLAYBACK|VB_TIMESTAMP, "AVSync show"); 2510 2513 if (!resetvideo) 2511 2514 videoOutput->Show(ps); … … 2557 2560 videoOutput->Show(ps); 2558 2561 } 2559 2562 } 2563 2564 repeat_delay = frame_interval * buffer->repeat_pict * 0.5; 2565 2566 if (repeat_delay) 2567 VERBOSE(VB_TIMESTAMP, QString("A/V repeat_pict, adding %1 repeat " 2568 "delay").arg(repeat_delay)); 2560 2569 } 2561 2570 else 2562 2571 { … … 2615 2624 2616 2625 // If the timecode is off by a frame (dropped frame) wait to sync 2617 2626 if (delta > (int) frame_interval / 1200 && 2618 delta < (int) frame_interval / 1000 * 3) 2627 delta < (int) frame_interval / 1000 * 3 && 2628 prevrp == 0) 2619 2629 { 2620 2630 //cerr << "+ "; 2621 2631 videosync->AdvanceTrigger(); 2622 2632 if (m_double_framerate) 2623 2633 videosync->AdvanceTrigger(); 2624 2634 } 2635 prevrp = buffer->repeat_pict; 2625 2636 2626 2637 avsync_delay = (buffer->timecode - currentaudiotime) * 1000;//usec 2627 2638 // prevents major jitter when pts resets during dvd title -
libs/libmythtv/vsync.cpp
187 187 /** \fn VideoSync::CalcDelay() 188 188 * \brief Calculates the delay to the next frame. 189 189 * 190 * Regardless of the timing method, if delay is greater than twofull190 * Regardless of the timing method, if delay is greater than four full 191 191 * frames (could be greater than 20 or greater than 200), we don't want 192 192 * to freeze while waiting for a huge delay. Instead, contine playing 193 193 * video at half speed and continue to read new audio and video frames … … 205 205 206 206 //cout << "delay " << ret_val << endl; 207 207 208 if (ret_val > m_frame_interval * 2)208 if (ret_val > m_frame_interval * 4) 209 209 { 210 210 if (m_interlaced) 211 ret_val = m_frame_interval; // same as / 2 * 2.211 ret_val = (m_frame_interval / 2) * 4; 212 212 else 213 ret_val = m_frame_interval * 2;213 ret_val = m_frame_interval * 4; 214 214 215 215 // set nexttrigger to our new target time 216 216 m_nexttrigger.tv_sec = now.tv_sec;