Ticket #189: mythtv_timestretch7c.patch
File mythtv_timestretch7c.patch, 9.0 KB (added by , 19 years ago) |
---|
-
libs/libmythtv/NuppelVideoPlayer.h
74 74 void SetAudioSampleRate(int rate) { audio_samplerate = rate; } 75 75 76 76 void SetAudioStretchFactor(float factor) { audio_stretchfactor = factor; } 77 float GetAudioStretchFactor() { return audio_stretchfactor; } 77 78 78 79 void Pause(bool waitvideo = true); 79 80 bool Play(float speed = 1.0, bool normal = true, … … 81 82 bool GetPause(void); 82 83 int GetFFRewSkip(void) { return ffrew_skip; } 83 84 bool AtNormalSpeed(void) { return next_normal_speed; } 85 float GetNextPlaySpeed() { return next_play_speed; } 84 86 85 87 bool FastForward(float seconds); 86 88 bool Rewind(float seconds); … … 212 214 213 215 long long CalcMaxFFTime(long long ff); 214 216 217 long long GetLiveTotalFrames(); 218 bool IsLiveAndNearEnd(long long framesRemaining); 219 215 220 bool IsErrored() { return errored; } 216 221 bool InitVideo(void); 217 222 VideoFrame* GetRawVideoFrame(long long frameNumber = -1); … … 389 394 int totalLength; 390 395 long long totalFrames; 391 396 397 long long liveTotalFrames; 392 398 OSD *osd; 393 399 394 400 bool using_null_videoout; -
libs/libmythtv/NuppelVideoPlayer.cpp
148 148 next_play_speed = 1.0; 149 149 next_normal_speed = true; 150 150 videobuf_retries = 0; 151 liveTotalFrames = -1; 151 152 152 153 using_null_videoout = disableaudio = false; 153 154 … … 309 312 decoder_lock.lock(); 310 313 next_play_speed = speed; 311 314 next_normal_speed = normal; 312 if (normal)313 audio_stretchfactor = speed;314 315 decoder_lock.unlock(); 315 316 316 317 return true; … … 911 912 stop = framesPlayed <= keyframedist; 912 913 } 913 914 if (stop) 914 Play( audio_stretchfactor, true, true);915 Play((ffrew_skip > 0)?1.0:audio_stretchfactor, true, true); 915 916 } 917 else if ((audio_stretchfactor>1.0) && (IsLiveAndNearEnd((int)(video_frame_rate*2)))) 918 { 919 Play(1.0, true, true); 920 } 916 921 917 922 return true; 918 923 } … … 2467 2544 } 2468 2545 #endif 2469 2546 2547 liveTotalFrames = -1; // force refetch of endframe, but only once for live only 2470 2548 if (normal_speed && audioOutput) 2471 2549 { 2472 audioOutput->SetStretchFactor(play_speed); 2550 audio_stretchfactor = play_speed; 2551 audioOutput->SetStretchFactor(audio_stretchfactor); 2473 2552 #ifdef USING_DIRECTX 2474 2553 audioOutput->Reset(); 2475 2554 #endif 2476 2555 } 2477 2556 2478 2557 //cout << "setting unpaused" << endl << endl; 2479 2558 paused = actuallypaused = false; … … 2531 2615 2532 2616 if (livetv || (watchingrecording && nvr_enc && nvr_enc->IsValidRecorder())) 2533 2617 { 2534 long long behind = nvr_enc->GetFramesWritten() - framesPlayed;2618 long long behind = GetLiveTotalFrames() - framesPlayed; 2535 2619 if (behind < maxtime) // if we're close, do nothing 2536 2620 ret = 0; 2537 2621 else if (behind - ff <= maxtime) … … 2555 2639 return ret; 2556 2640 } 2557 2641 2642 long long NuppelVideoPlayer::GetLiveTotalFrames() 2643 { 2644 liveTotalFrames = nvr_enc->GetFramesWritten(); 2645 //liveTotalFramesRecordedPos = GetDecoder()->GetFramesRead(); 2646 return liveTotalFrames; 2647 } 2648 2649 bool NuppelVideoPlayer::IsLiveAndNearEnd(long long nearEndFrameMargin) 2650 { 2651 bool rv = false; 2652 if (livetv || (watchingrecording && nvr_enc && nvr_enc->IsValidRecorder())) 2653 { 2654 // low DB access method 2655 long long liveTotalFramesRecordedPos = GetDecoder()->GetFramesRead(); 2656 long long estFramesToEnd = liveTotalFrames - liveTotalFramesRecordedPos; 2657 nearEndFrameMargin = (long long)(nearEndFrameMargin * audio_stretchfactor); 2658 if (estFramesToEnd < nearEndFrameMargin) 2659 { 2660 // last known pos is updated as it was exceeded 2661 GetLiveTotalFrames(); 2662 estFramesToEnd = liveTotalFrames - liveTotalFramesRecordedPos; 2663 } 2664 if (estFramesToEnd < nearEndFrameMargin) 2665 { 2666 rv = true; 2667 } 2668 #if 0 2669 int loopcount=0; 2670 long long rem; 2671 long long rem1=-1; 2672 long long framesRead = GetDecoder()->GetFramesRead(); 2673 long long localLiveTotalFrames=liveTotalFrames; 2674 long long localLiveTotalFramesRecordedPos = liveTotalFramesRecordedPos; 2675 if (localLiveTotalFrames < 0) 2676 loopcount++; 2677 do 2678 { 2679 if (localLiveTotalFrames < 0) 2680 { 2681 localLiveTotalFrames = GetLiveTotalFrames(); 2682 localLiveTotalFramesRecordedPos = liveTotalFramesRecordedPos; 2683 framesRead = GetDecoder()->GetFramesRead(); 2684 } 2685 rem = localLiveTotalFrames - framesRead + 2686 (long long)((framesRead-localLiveTotalFramesRecordedPos)/play_speed); 2687 if ((rem1>=0) && (rem > (rem1+3))) 2688 { 2689 // skipping so is getting near end 2690 rv = true; 2691 break; 2692 } 2693 rv = (rem < framesRemaining); 2694 if (!rv) 2695 break; 2696 localLiveTotalFrames = -1; // force refetch of endframe, but only once 2697 loopcount++; 2698 rem1 = rem; 2699 } while (loopcount<2); 2700 #endif 2701 #if 0 2702 VERBOSE(VB_PLAYBACK, QString("tot %1 fp %2 rem %3 ltfrp %4 lc %5") 2703 .arg(framesRead + (long long)((framesRead-localLiveTotalFramesRecordedPos)/play_speed)) 2704 .arg(framesRead) 2705 .arg(rem) 2706 .arg(localLiveTotalFramesRecordedPos) 2707 .arg(loopcount) 2708 ); 2709 #endif 2710 } 2711 return rv; 2712 } 2713 2558 2714 bool NuppelVideoPlayer::DoFastForward(void) 2559 2715 { 2560 2716 long long number = fftime - 1; … … 2597 2753 if ((livetv) || 2598 2754 (watchingrecording && nvr_enc && nvr_enc->IsValidRecorder())) 2599 2755 { 2600 if ( nvr_enc->GetFramesWritten() < (framesPlayed + frames))2756 if (GetLiveTotalFrames() < (framesPlayed + frames)) 2601 2757 return 1; 2602 2758 } 2603 2759 else if ((totalFrames) && (totalFrames < (framesPlayed + frames))) … … 3738 3894 (watchingrecording && nvr_enc && 3739 3895 nvr_enc->IsValidRecorder())) 3740 3896 { 3741 spos = 1000.0 * framesPlayed / nvr_enc->GetFramesWritten();3897 spos = 1000.0 * framesPlayed / GetLiveTotalFrames(); 3742 3898 } 3743 3899 else if (totalFrames) 3744 3900 { … … 3753 3909 if (!nvr_enc) 3754 3910 return 0; 3755 3911 3756 long long written = nvr_enc->GetFramesWritten();3912 long long written = GetLiveTotalFrames(); 3757 3913 long long played = framesPlayed; 3758 3914 3759 3915 if (played > written) … … 3776 3932 ((float)ringBuffer->GetFileSize() - ringBuffer->GetSmudgeSize()); 3777 3933 ret *= 1000.0; 3778 3934 3779 long long written = nvr_enc->GetFramesWritten();3935 long long written = GetLiveTotalFrames(); 3780 3936 long long played = framesPlayed; 3781 3937 3782 3938 if (played > written) … … 3843 3999 int playbackLen; 3844 4000 if (watchingrecording && nvr_enc && nvr_enc->IsValidRecorder()) 3845 4001 playbackLen = 3846 (int)(((float) nvr_enc->GetFramesWritten() / video_frame_rate));4002 (int)(((float)GetLiveTotalFrames() / video_frame_rate)); 3847 4003 else 3848 4004 playbackLen = totalLength; 3849 4005 -
libs/libmythtv/tv_play.cpp
1340 1340 } 1341 1341 1342 1342 if ((doing_ff_rew || speed_index) && 1343 activenvp ->AtNormalSpeed())1343 activenvp && activenvp->AtNormalSpeed()) 1344 1344 { 1345 1345 speed_index = 0; 1346 1346 doing_ff_rew = 0; 1347 1347 ff_rew_index = kInitFFRWSpeed; 1348 UpdatePosOSD(0.0, tr("Play"));1348 UpdatePosOSD(0.0, PlayMesg()); 1349 1349 } 1350 1350 1351 if (activenvp && (activenvp->GetNextPlaySpeed() != normal_speed) && 1352 activenvp->AtNormalSpeed()) 1353 { 1354 normal_speed = 1.0; // got changed in nvp due to close to end of file 1355 UpdatePosOSD(0.0, PlayMesg()); 1356 } 1357 1351 1358 if (++updatecheck >= 20) 1352 1359 { 1353 1360 OSDSet *oset; … … 2501 2508 { 2502 2509 case 2: speed = 3.0; mesg = QString(tr("Speed 3X")); break; 2503 2510 case 1: speed = 2.0; mesg = QString(tr("Speed 2X")); break; 2504 case 0: speed = 1.0; mesg = QString(tr("Play"));break;2511 case 0: speed = 1.0; mesg = PlayMesg(); break; 2505 2512 case -1: speed = 1.0 / 3; mesg = QString(tr("Speed 1/3X")); break; 2506 2513 case -2: speed = 1.0 / 8; mesg = QString(tr("Speed 1/8X")); break; 2507 2514 case -3: speed = 1.0 / 16; mesg = QString(tr("Speed 1/16X")); break; … … 2509 2516 default: speed_index = old_speed; return; break; 2510 2517 } 2511 2518 2512 if (!activenvp->Play( speed, (speed == 1.0)))2519 if (!activenvp->Play((speed_index==0)?normal_speed:speed, speed_index==0)) 2513 2520 { 2514 2521 speed_index = old_speed; 2515 2522 return;