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
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
00125
00126 DisplayNormalFrame(false);
00127 dvd_stillframe_showing = false;
00128 return !IsErrored();
00129 }
00130
00131
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
00144 if (nbframes < 2)
00145 {
00146
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
00158 if (player_ctx->buffer->DVD()->IsInMenu() &&
00159 !player_ctx->buffer->DVD()->IsInStillFrame())
00160 {
00161
00162 if (!dvd_stillframe_showing)
00163 needNewPauseFrame = true;
00164 RefreshPauseFrame();
00165 dvd_stillframe_showing = true;
00166 DisplayLastFrame();
00167 return !IsErrored();
00168 }
00169
00170
00171 if (player_ctx->buffer->DVD()->IsInStillFrame())
00172 {
00173
00174 if (!dvd_stillframe_showing)
00175 needNewPauseFrame = true;
00176
00177
00178 if (!videoPaused)
00179 {
00180 PauseVideo();
00181 return !IsErrored();
00182 }
00183
00184
00185 StillFrameCheck();
00186
00187
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
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
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
00293
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
00507 if (buttonversion == ((uint)m_buttonVersion))
00508 {
00509 player_ctx->buffer->DVD()->ReleaseMenuButton();
00510 return;
00511 }
00512
00513
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 }