MythTV  0.26-pre
mythdvdplayer.cpp
Go to the documentation of this file.
00001 #include "dvdringbuffer.h"
00002 #include "DetectLetterbox.h"
00003 #include "audiooutput.h"
00004 #include "myth_imgconvert.h"
00005 #include "avformatdecoderdvd.h"
00006 #include "mythdvdplayer.h"
00007 
00008 #define LOC      QString("DVDPlayer: ")
00009 
00010 MythDVDPlayer::MythDVDPlayer(PlayerFlags flags)
00011   : MythPlayer(flags), m_buttonVersion(0),
00012     dvd_stillframe_showing(false),
00013     m_initial_title(-1), m_initial_audio_track(-1),
00014     m_initial_subtitle_track(-1),
00015     m_stillFrameLength(0)
00016 {
00017 }
00018 
00019 void MythDVDPlayer::AutoDeint(VideoFrame *frame, bool allow_lock)
00020 {
00021     (void)frame;
00022     (void)allow_lock;
00023     SetScanType(kScan_Interlaced);
00024 }
00025 
00026 void MythDVDPlayer::ReleaseNextVideoFrame(VideoFrame *buffer,
00027                                           int64_t timecode, bool wrap)
00028 {
00029     MythPlayer::ReleaseNextVideoFrame(buffer, timecode,
00030                         !player_ctx->buffer->IsInDiscMenuOrStillFrame());
00031 }
00032 
00033 void MythDVDPlayer::DisableCaptions(uint mode, bool osd_msg)
00034 {
00035     if ((kDisplayAVSubtitle & mode) && player_ctx->buffer->IsDVD())
00036         player_ctx->buffer->DVD()->SetTrack(kTrackTypeSubtitle, -1);
00037     MythPlayer::DisableCaptions(mode, osd_msg);
00038 }
00039 
00040 void MythDVDPlayer::EnableCaptions(uint mode, bool osd_msg)
00041 {
00042     if ((kDisplayAVSubtitle & mode) && player_ctx->buffer->IsDVD())
00043         player_ctx->buffer->DVD()->SetTrack(kTrackTypeSubtitle,
00044                                             GetTrack(kTrackTypeSubtitle));
00045     MythPlayer::EnableCaptions(mode, osd_msg);
00046 }
00047 
00048 void MythDVDPlayer::DisplayPauseFrame(void)
00049 {
00050     if (player_ctx->buffer->IsDVD() &&
00051         player_ctx->buffer->DVD()->IsInStillFrame())
00052     {
00053         SetScanType(kScan_Progressive);
00054     }
00055     DisplayDVDButton();
00056     MythPlayer::DisplayPauseFrame();
00057 }
00058 
00059 void MythDVDPlayer::DecoderPauseCheck(void)
00060 {
00061     StillFrameCheck();
00062     MythPlayer::DecoderPauseCheck();
00063 }
00064 
00065 bool MythDVDPlayer::PrebufferEnoughFrames(int min_buffers)
00066 {
00067     return MythPlayer::PrebufferEnoughFrames(1);
00068 }
00069 
00070 bool MythDVDPlayer::DecoderGetFrameFFREW(void)
00071 {
00072     bool res = MythPlayer::DecoderGetFrameFFREW();
00073     if (decoder_change_lock.tryLock(1))
00074     {
00075         if (decoder)
00076             decoder->UpdateFramesPlayed();
00077         decoder_change_lock.unlock();
00078     }
00079     return res;
00080 }
00081 
00082 bool MythDVDPlayer::DecoderGetFrameREW(void)
00083 {
00084     MythPlayer::DecoderGetFrameREW();
00085     return (player_ctx->buffer->IsDVD() &&
00086             (player_ctx->buffer->DVD()->GetCurrentTime() < 2));
00087 }
00088 
00089 void MythDVDPlayer::PreProcessNormalFrame(void)
00090 {
00091     DisplayDVDButton();
00092 }
00093 
00094 bool MythDVDPlayer::VideoLoop(void)
00095 {
00096     if (!player_ctx->buffer->IsDVD())
00097     {
00098         SetErrored("RingBuffer is not a DVD.");
00099         return !IsErrored();
00100     }
00101 
00102     int nbframes = 0;
00103     if (videoOutput)
00104         nbframes = videoOutput->ValidVideoFrames();
00105 
00106 #if 0
00107     LOG(VB_PLAYBACK, LOG_DEBUG,
00108         LOC + QString("Validframes %1, FreeFrames %2, VideoPaused %3")
00109            .arg(nbframes).arg(videoOutput->FreeVideoFrames()).arg(videoPaused));
00110 #endif
00111 
00112     // completely drain the video buffers for certain situations
00113     bool release_all = player_ctx->buffer->DVD()->DVDWaitingForPlayer() &&
00114                       (nbframes > 0);
00115     bool release_one = (nbframes > 1) && videoPaused && !allpaused &&
00116                        (!videoOutput->EnoughFreeFrames() ||
00117                         player_ctx->buffer->DVD()->IsWaiting() ||
00118                         player_ctx->buffer->DVD()->IsInStillFrame());
00119     if (release_all || release_one)
00120     {
00121         if (nbframes < 5 && videoOutput)
00122             videoOutput->UpdatePauseFrame(disp_timecode);
00123 
00124         // if we go below the pre-buffering limit, the player will pause
00125         // so do this 'manually'
00126         DisplayNormalFrame(false);
00127         dvd_stillframe_showing = false;
00128         return !IsErrored();
00129     }
00130 
00131     // clear the mythtv imposed wait state
00132     if (player_ctx->buffer->DVD()->DVDWaitingForPlayer())
00133     {
00134         LOG(VB_PLAYBACK, LOG_INFO, LOC + "Clearing MythTV DVD wait state");
00135         bool inStillFrame = player_ctx->buffer->DVD()->IsInStillFrame();
00136         player_ctx->buffer->DVD()->SkipDVDWaitingForPlayer();
00137         ClearAfterSeek(true);
00138         if (!inStillFrame && videoPaused && !allpaused)
00139             UnpauseVideo();
00140         return !IsErrored();
00141     }
00142 
00143     // wait for the video buffers to drain
00144     if (nbframes < 2)
00145     {
00146         // clear the DVD wait state
00147         if (player_ctx->buffer->DVD()->IsWaiting())
00148         {
00149             LOG(VB_PLAYBACK, LOG_INFO, LOC + "Clearing DVD wait state");
00150             bool inStillFrame = player_ctx->buffer->DVD()->IsInStillFrame();
00151             player_ctx->buffer->DVD()->WaitSkip();
00152             if (!inStillFrame && videoPaused && !allpaused)
00153                 UnpauseVideo();
00154             return !IsErrored();
00155         }
00156 
00157         // we need a custom presentation method for still frame menus with audio
00158         if (player_ctx->buffer->DVD()->IsInMenu() &&
00159             !player_ctx->buffer->DVD()->IsInStillFrame())
00160         {
00161             // ensure we refresh the pause frame
00162             if (!dvd_stillframe_showing)
00163                 needNewPauseFrame = true;
00164             RefreshPauseFrame();
00165             dvd_stillframe_showing = true;
00166             DisplayLastFrame();
00167             return !IsErrored();
00168         }
00169 
00170         // the still frame is treated as a pause frame
00171         if (player_ctx->buffer->DVD()->IsInStillFrame())
00172         {
00173             // ensure we refresh the pause frame
00174             if (!dvd_stillframe_showing)
00175                 needNewPauseFrame = true;
00176 
00177             // we are in a still frame so pause video output
00178             if (!videoPaused)
00179             {
00180                 PauseVideo();
00181                 return !IsErrored();
00182             }
00183 
00184             // see if the pause frame has timed out
00185             StillFrameCheck();
00186 
00187             // flag if we have no frame
00188             if (nbframes == 0)
00189             {
00190                 LOG(VB_PLAYBACK, LOG_WARNING, LOC +
00191                         "In DVD Menu: No video frames in queue");
00192                 usleep(10000);
00193                 return !IsErrored();
00194             }
00195 
00196             dvd_stillframe_showing = true;
00197         }
00198         else
00199         {
00200             dvd_stillframe_showing = false;
00201         }
00202     }
00203 
00204     // unpause the still frame if more frames become available
00205     if (dvd_stillframe_showing && nbframes > 1)
00206     {
00207         UnpauseVideo();
00208         dvd_stillframe_showing = false;
00209         return !IsErrored();
00210     }
00211 
00212     return MythPlayer::VideoLoop();
00213 }
00214 
00215 void MythDVDPlayer::DisplayLastFrame(void)
00216 {
00217     // clear the buffering state
00218     SetBuffering(false);
00219 
00220     SetScanType(kScan_Progressive);
00221     DisplayDVDButton();
00222 
00223     osdLock.lock();
00224     videofiltersLock.lock();
00225     videoOutput->ProcessFrame(NULL, osd, videoFilters, pip_players,
00226                               kScan_Progressive);
00227     videofiltersLock.unlock();
00228     osdLock.unlock();
00229 
00230     AVSync(NULL, true);
00231 }
00232 
00233 bool MythDVDPlayer::FastForward(float seconds)
00234 {
00235     if (decoder)
00236         decoder->UpdateFramesPlayed();
00237     return MythPlayer::FastForward(seconds);
00238 }
00239 
00240 bool MythDVDPlayer::Rewind(float seconds)
00241 {
00242     if (decoder)
00243         decoder->UpdateFramesPlayed();
00244     return MythPlayer::Rewind(seconds);
00245 }
00246 
00247 bool MythDVDPlayer::JumpToFrame(uint64_t frame)
00248 {
00249     if (decoder)
00250         decoder->UpdateFramesPlayed();
00251     return MythPlayer::JumpToFrame(frame);
00252 }
00253 
00254 void MythDVDPlayer::EventStart(void)
00255 {
00256     if (player_ctx->buffer->DVD())
00257         player_ctx->buffer->DVD()->SetParent(this);
00258 
00259     player_ctx->LockPlayingInfo(__FILE__, __LINE__);
00260     if (player_ctx->playingInfo)
00261     {
00262         QString name;
00263         QString serialid;
00264         if (player_ctx->playingInfo->GetTitle().isEmpty() &&
00265             player_ctx->buffer->DVD() &&
00266             player_ctx->buffer->DVD()->GetNameAndSerialNum(name, serialid))
00267         {
00268             player_ctx->playingInfo->SetTitle(name);
00269         }
00270     }
00271     player_ctx->UnlockPlayingInfo(__FILE__, __LINE__);
00272 
00273     MythPlayer::EventStart();
00274 }
00275 
00276 void MythDVDPlayer::InitialSeek(void)
00277 {
00278     player_ctx->buffer->IgnoreWaitStates(true);
00279     if (m_initial_title > -1)
00280         player_ctx->buffer->DVD()->PlayTitleAndPart(m_initial_title, 1);
00281 
00282     if (m_initial_audio_track > -1)
00283         player_ctx->buffer->DVD()->SetTrack(kTrackTypeAudio,
00284                                             m_initial_audio_track);
00285     if (m_initial_subtitle_track > -1)
00286         player_ctx->buffer->DVD()->SetTrack(kTrackTypeSubtitle,
00287                                             m_initial_subtitle_track);
00288 
00289     if (bookmarkseek > 30)
00290     {
00291 
00292         // we need to trigger a dvd cell change to ensure the new title length
00293         // is set and the position map updated accordingly
00294         decodeOneFrame = true;
00295         int count = 0;
00296         while (count++ < 100 && decodeOneFrame)
00297             usleep(50000);
00298     }
00299     MythPlayer::InitialSeek();
00300     player_ctx->buffer->IgnoreWaitStates(false);
00301 }
00302 
00303 void MythDVDPlayer::ResetPlaying(bool resetframes)
00304 {
00305     MythPlayer::ResetPlaying(false);
00306 }
00307 
00308 void MythDVDPlayer::EventEnd(void)
00309 {
00310     if (player_ctx->buffer->DVD())
00311         player_ctx->buffer->DVD()->SetParent(NULL);
00312 }
00313 
00314 bool MythDVDPlayer::PrepareAudioSample(int64_t &timecode)
00315 {
00316     if (!player_ctx->buffer->IsInDiscMenuOrStillFrame())
00317         WrapTimecode(timecode, TC_AUDIO);
00318 
00319     if (player_ctx->buffer->IsDVD() &&
00320         player_ctx->buffer->DVD()->IsInStillFrame())
00321         return true;
00322     return false;
00323 }
00324 
00325 void MythDVDPlayer::SetBookmark(bool clear)
00326 {
00327     if (player_ctx->buffer->IsInDiscMenuOrStillFrame() || clear)
00328         SetDVDBookmark(0);
00329     else
00330         SetDVDBookmark(framesPlayed);
00331 }
00332 
00333 uint64_t MythDVDPlayer::GetBookmark(void)
00334 {
00335     if (gCoreContext->IsDatabaseIgnored() || !player_ctx->buffer->IsDVD())
00336         return 0;
00337 
00338     QStringList dvdbookmark = QStringList();
00339     QString name;
00340     QString serialid;
00341     long long frames = 0;
00342     player_ctx->LockPlayingInfo(__FILE__, __LINE__);
00343     if (player_ctx->playingInfo)
00344     {
00345         if (!player_ctx->buffer->DVD()->GetNameAndSerialNum(name, serialid))
00346         {
00347             player_ctx->UnlockPlayingInfo(__FILE__, __LINE__);
00348             return 0;
00349         }
00350         dvdbookmark = player_ctx->playingInfo->QueryDVDBookmark(serialid);
00351         if (!dvdbookmark.empty())
00352         {
00353             QStringList::Iterator it = dvdbookmark.begin();
00354             m_initial_title = (*it).toInt();
00355             frames = (long long)((*++it).toLongLong() & 0xffffffffLL);
00356             m_initial_audio_track    = (*++it).toInt();
00357             m_initial_subtitle_track = (*++it).toInt();
00358             LOG(VB_PLAYBACK, LOG_INFO, LOC +
00359                 QString("Get Bookmark: title %1 audiotrack %2 subtrack %3 "
00360                         "frame %4")
00361                 .arg(m_initial_title).arg(m_initial_audio_track)
00362                 .arg(m_initial_subtitle_track).arg(frames));
00363         }
00364     }
00365     player_ctx->UnlockPlayingInfo(__FILE__, __LINE__);
00366     return frames;;
00367 }
00368 
00369 void MythDVDPlayer::ChangeSpeed(void)
00370 {
00371     MythPlayer::ChangeSpeed();
00372     if (decoder)
00373         decoder->UpdateFramesPlayed();
00374     if (play_speed != normal_speed && player_ctx->buffer->IsDVD())
00375         player_ctx->buffer->DVD()->SetDVDSpeed(-1);
00376     else if (player_ctx->buffer->IsDVD())
00377         player_ctx->buffer->DVD()->SetDVDSpeed();
00378 }
00379 
00380 void MythDVDPlayer::AVSync(VideoFrame *frame, bool limit_delay)
00381 {
00382     MythPlayer::AVSync(frame, true);
00383 }
00384 
00385 long long MythDVDPlayer::CalcMaxFFTime(long long ff, bool setjump) const
00386 {
00387     if ((totalFrames > 0) && player_ctx->buffer->IsDVD() &&
00388         player_ctx->buffer->DVD()->TitleTimeLeft() < 5)
00389         return 0;
00390     return MythPlayer::CalcMaxFFTime(ff, setjump);
00391 }
00392 
00393 int64_t MythDVDPlayer::GetSecondsPlayed(void)
00394 {
00395     if (!player_ctx->buffer->IsDVD())
00396         return 0;
00397 
00398     return (m_stillFrameLength > 0) ?
00399                 (m_stillFrameTimer.elapsed() / 1000) :
00400                 (player_ctx->buffer->DVD()->GetCurrentTime());
00401 
00402 }
00403 
00404 int64_t MythDVDPlayer::GetTotalSeconds(void) const
00405 {
00406     return (m_stillFrameLength > 0) ? m_stillFrameLength: totalLength;
00407 }
00408 
00409 void MythDVDPlayer::SeekForScreenGrab(uint64_t &number, uint64_t frameNum,
00410                                       bool absolute)
00411 {
00412     if (!player_ctx->buffer->IsDVD())
00413         return;
00414     if (GoToMenu("menu"))
00415     {
00416         if (player_ctx->buffer->DVD()->IsInMenu() &&
00417             !player_ctx->buffer->DVD()->IsInStillFrame())
00418         {
00419             GoToDVDProgram(1);
00420         }
00421     }
00422     else if (player_ctx->buffer->DVD()->GetTotalTimeOfTitle() < 60)
00423     {
00424         GoToDVDProgram(1);
00425         number = frameNum;
00426         if (number >= totalFrames)
00427             number = totalFrames / 2;
00428     }
00429 }
00430 
00431 int MythDVDPlayer::SetTrack(uint type, int trackNo)
00432 {
00433     if (kTrackTypeAudio == type)
00434         player_ctx->buffer->DVD()->SetTrack(type, trackNo);
00435     return MythPlayer::SetTrack(type, trackNo);
00436 }
00437 
00438 int MythDVDPlayer::GetNumChapters(void)
00439 {
00440     if (!player_ctx->buffer->IsDVD())
00441         return 0;
00442     return player_ctx->buffer->DVD()->NumPartsInTitle();
00443 }
00444 
00445 int MythDVDPlayer::GetCurrentChapter(void)
00446 {
00447     if (!player_ctx->buffer->IsDVD())
00448         return 0;
00449     return player_ctx->buffer->DVD()->GetPart();
00450 }
00451 
00452 void MythDVDPlayer::GetChapterTimes(QList<long long> &times)
00453 {
00454     if (!player_ctx->buffer->IsDVD())
00455         return;
00456     player_ctx->buffer->DVD()->GetChapterTimes(times);
00457 }
00458 
00459 bool MythDVDPlayer::DoJumpChapter(int chapter)
00460 {
00461     if (!player_ctx->buffer->IsDVD())
00462         return false;
00463 
00464     int total   = GetNumChapters();
00465     int current = GetCurrentChapter();
00466 
00467     if (chapter < 0 || chapter > total)
00468     {
00469         if (chapter < 0)
00470         {
00471             chapter = current -1;
00472             if (chapter < 0) chapter = 0;
00473         }
00474         else if (chapter > total)
00475         {
00476             chapter = current + 1;
00477             if (chapter > total) chapter = total;
00478         }
00479     }
00480 
00481     bool success = player_ctx->buffer->DVD()->playTrack(chapter);
00482     if (success)
00483     {
00484         if (decoder)
00485         {
00486             decoder->UpdateFramesPlayed();
00487             if (player_ctx->buffer->DVD()->GetCellStart() == 0)
00488                 decoder->SeekReset(framesPlayed, 0, true, true);
00489         }
00490         ClearAfterSeek(!player_ctx->buffer->IsInDiscMenuOrStillFrame());
00491     }
00492 
00493     jumpchapter = 0;
00494     return success;
00495 }
00496 
00497 void MythDVDPlayer::DisplayDVDButton(void)
00498 {
00499     if (!osd || !player_ctx->buffer->IsDVD())
00500         return;
00501 
00502     uint buttonversion = 0;
00503     AVSubtitle *dvdSubtitle = player_ctx->buffer->DVD()->GetMenuSubtitle(buttonversion);
00504     bool numbuttons    = player_ctx->buffer->DVD()->NumMenuButtons();
00505 
00506     // nothing to do
00507     if (buttonversion == ((uint)m_buttonVersion))
00508     {
00509         player_ctx->buffer->DVD()->ReleaseMenuButton();
00510         return;
00511     }
00512 
00513     // clear any buttons
00514     if (!numbuttons || !dvdSubtitle || (buttonversion == 0))
00515     {
00516         SetCaptionsEnabled(false, false);
00517         osdLock.lock();
00518         if (osd)
00519             osd->ClearSubtitles();
00520         osdLock.unlock();
00521         m_buttonVersion = 0;
00522         player_ctx->buffer->DVD()->ReleaseMenuButton();
00523         return;
00524     }
00525 
00526     m_buttonVersion = buttonversion;
00527     QRect buttonPos = player_ctx->buffer->DVD()->GetButtonCoords();
00528     osdLock.lock();
00529     if (osd)
00530         osd->DisplayDVDButton(dvdSubtitle, buttonPos);
00531     osdLock.unlock();
00532     textDisplayMode = kDisplayDVDButton;
00533     player_ctx->buffer->DVD()->ReleaseMenuButton();
00534 }
00535 
00536 bool MythDVDPlayer::GoToMenu(QString str)
00537 {
00538     if (!player_ctx->buffer->IsDVD())
00539         return false;
00540     textDisplayMode = kDisplayNone;
00541     bool ret = player_ctx->buffer->DVD()->GoToMenu(str);
00542 
00543     if (!ret)
00544     {
00545         SetOSDMessage(QObject::tr("DVD Menu Not Available"), kOSDTimeout_Med);
00546         LOG(VB_GENERAL, LOG_ERR, "No DVD Menu available.");
00547         return false;
00548     }
00549 
00550     return true;
00551 }
00552 
00553 void MythDVDPlayer::GoToDVDProgram(bool direction)
00554 {
00555     if (!player_ctx->buffer->IsDVD())
00556         return;
00557     if (direction == 0)
00558         player_ctx->buffer->DVD()->GoToPreviousProgram();
00559     else
00560         player_ctx->buffer->DVD()->GoToNextProgram();
00561 }
00562 
00563 void MythDVDPlayer::SetDVDBookmark(uint64_t frame)
00564 {
00565     if (!player_ctx->buffer->IsDVD())
00566         return;
00567 
00568     uint64_t framenum = frame;
00569     QStringList fields;
00570     QString name;
00571     QString serialid;
00572     int title = 0;
00573     int part;
00574     int audiotrack = -1;
00575     int subtitletrack = -1;
00576     if (!player_ctx->buffer->DVD()->GetNameAndSerialNum(name, serialid))
00577     {
00578         LOG(VB_GENERAL, LOG_ERR, LOC +
00579             "DVD has no name and serial number. Cannot set bookmark.");
00580         return;
00581     }
00582 
00583     if (!player_ctx->buffer->IsInDiscMenuOrStillFrame() &&
00584         player_ctx->buffer->DVD()->
00585         GetTotalTimeOfTitle() > 120 && frame > 0)
00586     {
00587         audiotrack = GetTrack(kTrackTypeAudio);
00588         if (GetCaptionMode() == kDisplayAVSubtitle)
00589         {
00590             subtitletrack = player_ctx->buffer->DVD()->GetTrack(
00591                 kTrackTypeSubtitle);
00592         }
00593         player_ctx->buffer->DVD()->GetPartAndTitle(part, title);
00594     }
00595     else
00596         framenum = 0;
00597 
00598     player_ctx->LockPlayingInfo(__FILE__, __LINE__);
00599     if (player_ctx->playingInfo)
00600     {
00601         fields += serialid;
00602         fields += name;
00603         fields += QString("%1").arg(title);
00604         fields += QString("%1").arg(audiotrack);
00605         fields += QString("%1").arg(subtitletrack);
00606         fields += QString("%1").arg(framenum);
00607         player_ctx->playingInfo->SaveDVDBookmark(fields);
00608         LOG(VB_PLAYBACK, LOG_INFO, LOC +
00609             QString("Set Bookmark: title %1 audiotrack %2 subtrack %3 frame %4")
00610             .arg(title).arg(audiotrack).arg(subtitletrack).arg(framenum));
00611     }
00612     player_ctx->UnlockPlayingInfo(__FILE__, __LINE__);
00613 }
00614 
00615 int MythDVDPlayer::GetNumAngles(void) const
00616 {
00617     if (player_ctx->buffer->DVD() && player_ctx->buffer->DVD()->IsOpen())
00618         return player_ctx->buffer->DVD()->GetNumAngles();
00619     return 0;
00620 }
00621 
00622 int MythDVDPlayer::GetCurrentAngle(void) const
00623 {
00624     if (player_ctx->buffer->DVD() && player_ctx->buffer->DVD()->IsOpen())
00625         return player_ctx->buffer->DVD()->GetCurrentAngle();
00626     return -1; 
00627 }
00628 
00629 QString MythDVDPlayer::GetAngleName(int angle) const
00630 {
00631     if (angle >= 0 && angle < GetNumAngles())
00632     {
00633         QString name = QObject::tr("Angle %1").arg(angle+1);
00634         return name;
00635     }
00636     return QString();
00637 }
00638 
00639 bool MythDVDPlayer::SwitchAngle(int angle)
00640 {
00641     uint total = GetNumAngles();
00642     if (!total || angle == GetCurrentAngle())
00643         return false;
00644 
00645     if (angle >= (int)total)
00646         angle = 0;
00647 
00648     return player_ctx->buffer->DVD()->SwitchAngle(angle);
00649 }
00650 
00651 void MythDVDPlayer::ResetStillFrameTimer(void)
00652 {
00653     m_stillFrameTimerLock.lock();
00654     m_stillFrameTimer.restart();
00655     m_stillFrameTimerLock.unlock();
00656 }
00657 
00658 void MythDVDPlayer::SetStillFrameTimeout(int length)
00659 {
00660     m_stillFrameLength = length;
00661 }
00662 
00663 void MythDVDPlayer::StillFrameCheck(void)
00664 {
00665     if (player_ctx->buffer->IsDVD() &&
00666         player_ctx->buffer->DVD()->IsInStillFrame() &&
00667        (m_stillFrameLength > 0) && (m_stillFrameLength < 0xff))
00668     {
00669         m_stillFrameTimerLock.lock();
00670         int elapsedTime = m_stillFrameTimer.elapsed() / 1000;
00671         m_stillFrameTimerLock.unlock();
00672         if (elapsedTime >= m_stillFrameLength)
00673         {
00674             LOG(VB_PLAYBACK, LOG_INFO, LOC +
00675                 QString("Stillframe timeout after %1 seconds")
00676                     .arg(m_stillFrameLength));
00677             player_ctx->buffer->DVD()->SkipStillFrame();
00678             m_stillFrameLength = 0;
00679         }
00680     }
00681 }
00682 
00683 void MythDVDPlayer::CreateDecoder(char *testbuf, int testreadsize)
00684 {
00685     if (AvFormatDecoderDVD::CanHandle(testbuf, player_ctx->buffer->GetFilename(),
00686                                       testreadsize))
00687     {
00688         SetDecoder(new AvFormatDecoderDVD(this, *player_ctx->playingInfo,
00689                                           playerFlags));
00690     }
00691 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends