|
MythTV
0.26-pre
|
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> ×) 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 }
1.7.6.1