Ticket #2434: 2434-v1.patch

File 2434-v1.patch, 6.2 KB (added by danielk, 14 years ago)

Patch for NVP pause problem

  • libs/libmythtv/NuppelVideoPlayer.cpp

     
    446446    return (actuallypaused &&
    447447            (ringBuffer == NULL || ringBuffer->isPaused()) &&
    448448            (audioOutput == NULL || audioOutput->GetPause()) &&
    449             GetVideoPause());
     449            IsVideoActuallyPaused());
    450450}
    451451
    452452void NuppelVideoPlayer::PauseVideo(bool wait)
    453453{
     454    QMutexLocker locker(&pauseUnpauseLock);
    454455    video_actually_paused = false;
    455456    pausevideo = true;
    456457
    457     if (wait && !video_actually_paused)
     458    for (uint i = 0; wait && !video_actually_paused; i++)
    458459    {
    459         while (!videoThreadPaused.wait(1000))
    460         {
    461             if (eof)
    462                 return;
     460        videoThreadPaused.wait(&pauseUnpauseLock, 250);
     461
     462        if (video_actually_paused || eof)
     463            break;
     464
     465        if ((i % 10) == 9)
    463466            VERBOSE(VB_IMPORTANT, "Waited too long for video out to pause");
    464         }
    465467    }
    466468}
    467469
    468 void NuppelVideoPlayer::UnpauseVideo(void)
     470void NuppelVideoPlayer::UnpauseVideo(bool wait)
    469471{
     472    QMutexLocker locker(&pauseUnpauseLock);
    470473    pausevideo = false;
     474
     475    for (uint i = 0; wait && video_actually_paused; i++)
     476    {
     477        videoThreadUnpaused.wait(&pauseUnpauseLock, 250);
     478
     479        if (!video_actually_paused || eof)
     480            break;
     481
     482        if ((i % 10) == 9)
     483            VERBOSE(VB_IMPORTANT, "Waited too long for video out to unpause");
     484    }
    471485}
    472486
     487void NuppelVideoPlayer::SetVideoActuallyPaused(bool val)
     488{
     489    QMutexLocker locker(&pauseUnpauseLock);
     490    video_actually_paused = val;
     491
     492    if (val)
     493        videoThreadPaused.wakeAll();
     494    else
     495        videoThreadUnpaused.wakeAll();
     496}
     497
    473498void NuppelVideoPlayer::SetPrebuffering(bool prebuffer)
    474499{
    475500    prebuffering_lock.lock();
     
    23012326        resetvideo = false;
    23022327    }
    23032328
    2304     video_actually_paused = true;
    2305     videoThreadPaused.wakeAll();
     2329    SetVideoActuallyPaused(true);
    23062330
    23072331    if (videoOutput->IsErrored())
    23082332    {
     
    24012425
    24022426void NuppelVideoPlayer::DisplayNormalFrame(void)
    24032427{
    2404     video_actually_paused = false;
     2428    SetVideoActuallyPaused(false);
    24052429    resetvideo = false;
    24062430
    24072431    if (!ringBuffer->InDVDMenuOrStillFrame() ||
     
    26872711        }
    26882712
    26892713        resetvideo = false;
    2690         video_actually_paused = pausevideo;
     2714        SetVideoActuallyPaused(pausevideo);
    26912715
    26922716        if (pausevideo)
    26932717        {
    2694             videoThreadPaused.wakeAll();
    26952718            videofiltersLock.lock();
    26962719            videoOutput->ProcessFrame(NULL, osd, videoFilters, pipplayer);
    26972720            videofiltersLock.unlock();
     
    33303353
    33313354            if (rewindtime >= 1)
    33323355            {
    3333                 PauseVideo();
    3334 
     3356                PauseVideo(true);
    33353357                DoRewind();
    3336 
    3337                 UnpauseVideo();
    3338                 while (GetVideoPause())
    3339                     usleep(1000);
     3358                UnpauseVideo(true);
    33403359            }
    33413360            rewindtime = 0;
    33423361        }
     
    33473366
    33483367            if (fftime >= 5)
    33493368            {
    3350                 PauseVideo();
     3369                PauseVideo(true);
    33513370
    33523371                if (fftime >= 5)
    33533372                    DoFastForward();
     
    33553374                if (eof)
    33563375                    continue;
    33573376
    3358                 UnpauseVideo();
    3359                 while (GetVideoPause())
    3360                     usleep(1000);
     3377                UnpauseVideo(true);
    33613378            }
    33623379
    33633380            fftime = 0;
     
    33653382
    33663383        if (need_change_dvd_track)
    33673384        {
    3368             PauseVideo();
    3369 
     3385            PauseVideo(true);
    33703386            DoChangeDVDTrack();
     3387            UnpauseVideo(true);
    33713388
    3372             UnpauseVideo();
    3373             while (GetVideoPause())
    3374                 usleep(1000);
    3375 
    33763389            need_change_dvd_track = 0;
    33773390        }
    33783391
    33793392        if (skipcommercials != 0 && ffrew_skip == 1)
    33803393        {
    3381             PauseVideo();
    3382 
     3394            PauseVideo(true);
    33833395            DoSkipCommercials(skipcommercials);
    3384             UnpauseVideo();
    3385             while (GetVideoPause())
    3386                 usleep(1000);
     3396            UnpauseVideo(true);
    33873397
    33883398            skipcommercials = 0;
    33893399            continue;
     
    34163426            }
    34173427            else
    34183428            {
    3419                 PauseVideo();
     3429                PauseVideo(true);
    34203430                JumpToFrame(deleteIter.key());
    3421                 UnpauseVideo();
    3422                 while (GetVideoPause())
    3423                     usleep(1000);
     3431                UnpauseVideo(true);
    34243432            }
    34253433        }
    34263434    }
     
    56725680                        .arg(commBreakIter.key() -
    56735681                        (int)(commrewindamount * video_frame_rate)));
    56745682
    5675                     PauseVideo();
     5683                    PauseVideo(true);
    56765684                    JumpToFrame(commBreakIter.key() -
    56775685                        (int)(commrewindamount * video_frame_rate));
    5678                     UnpauseVideo();
    5679                     while (GetVideoPause())
    5680                         usleep(1000);
     5686                    UnpauseVideo(true);
    56815687
    56825688                    GetFrame(1, true);
    56835689                }
  • libs/libmythtv/NuppelVideoPlayer.h

     
    414414
    415415    // Private pausing stuff
    416416    void PauseVideo(bool wait = true);
    417     void UnpauseVideo(void);
    418     bool GetVideoPause(void) const { return video_actually_paused; }
     417    void UnpauseVideo(bool wait = false);
     418    bool IsVideoActuallyPaused(void) const { return video_actually_paused; }
     419    void SetVideoActuallyPaused(bool val);
    419420
    420421    // Private decoder stuff
    421422    void  SetDecoder(DecoderBase *dec);
     
    520521    // State
    521522    QWaitCondition decoderThreadPaused;
    522523    QWaitCondition videoThreadPaused;
     524    QWaitCondition videoThreadUnpaused;
    523525    QMutex   vidExitLock;
     526    QMutex   pauseUnpauseLock;
    524527    bool     eof;             ///< At end of file/ringbuffer
    525528    bool     m_double_framerate;///< Output fps is double Video (input) rate
    526529    bool     m_can_double;    ///< VideoOutput capable of doubling frame rate