bool PlayerContext::CreatePlayer(TV *tv, QWidget *widget, TVState desiredState, bool embed, const QRect &embedbounds, bool muted) { if (HasPlayer()) { LOG(VB_GENERAL, LOG_ERR, LOC + "Attempting to setup a player, but it already exists."); return false; } uint playerflags = kDecodeAllowEXT; // allow VDA etc for normal playback playerflags |= muted ? kAudioMuted : kNoFlags; playerflags |= useNullVideo ? kVideoIsNull : kNoFlags; playerflags |= nohardwaredecoders ? kNoFlags : kDecodeAllowGPU; MythPlayer *player = NULL; if (kState_WatchingBD == desiredState) player = new MythBDPlayer((PlayerFlags)playerflags); else if (kState_WatchingDVD == desiredState) player = new MythDVDPlayer((PlayerFlags)playerflags); else player = new MythPlayer((PlayerFlags)playerflags); QString passthru_device = gCoreContext->GetNumSetting("PassThruDeviceOverride", false) ? gCoreContext->GetSetting("PassThruOutputDevice") : QString::null; player->SetPlayerInfo(tv, widget, this); AudioPlayer *audio = player->GetAudio(); audio->SetAudioInfo(gCoreContext->GetSetting("AudioOutputDevice"), passthru_device, gCoreContext->GetNumSetting("AudioSampleRate", 44100)); audio->SetStretchFactor(ts_normal); player->SetLength(playingLen); player->SetVideoFilters((useNullVideo) ? "onefield" : ""); if (!IsAudioNeeded()) audio->SetNoAudio(); else { QString subfn = buffer->GetSubtitleFilename(); if (!subfn.isEmpty() && player->GetSubReader()) player->GetSubReader()->LoadExternalSubtitles(subfn); } if (embed && !embedbounds.isNull()) player->EmbedInWidget(embedbounds); bool isWatchingRecording = (desiredState == kState_WatchingRecording); player->SetWatchingRecording(isWatchingRecording); SetPlayer(player); if (pipState == kPIPOff || pipState == kPBPLeft) { if (audio->HasAudioOut()) { QString errMsg = audio->ReinitAudio(); } } else if (pipState == kPBPRight) player->SetMuted(true); return StartPlaying(-1); }
void Test(void) { PIPMap dummy; if (novideosync) // TODO LOG(VB_GENERAL, LOG_INFO, "Will attempt to disable sync-to-vblank."); RingBuffer *rb = RingBuffer::Create(file, false, true, 2000); MythPlayer *mp = new MythPlayer(kAudioMuted); mp->GetAudio()->SetAudioInfo("NULL", "NULL", 0, 0); mp->GetAudio()->SetNoAudio(); ctx = new PlayerContext("VideoPerformanceTest"); ctx->SetRingBuffer(rb); ctx->SetPlayer(mp); ctx->SetPlayingInfo(new ProgramInfo(file)); mp->SetPlayerInfo(NULL, GetMythMainWindow(), true, ctx); FrameScanType scan = deinterlace ? kScan_Interlaced : kScan_Progressive; if (!mp->StartPlaying()) { LOG(VB_GENERAL, LOG_ERR, "Failed to start playback."); return; } VideoOutput *vo = mp->GetVideoOutput(); if (!vo) { LOG(VB_GENERAL, LOG_ERR, "No video output."); return; } LOG(VB_GENERAL, LOG_INFO, "-----------------------------------"); LOG(VB_GENERAL, LOG_INFO, QString("Starting video performance test for '%1'.") .arg(file)); LOG(VB_GENERAL, LOG_INFO, QString("Test will run for %1 seconds.") .arg(secondstorun)); if (decodeonly) LOG(VB_GENERAL, LOG_INFO, "Decoding frames only - skipping display."); LOG(VB_GENERAL, LOG_INFO, QString("Deinterlacing %1") .arg(deinterlace ? "enabled" : "disabled")); Jitterometer *jitter = new Jitterometer("Performance: ", mp->GetFrameRate()); int ms = secondstorun * 1000; QTime start = QTime::currentTime(); while (1) { int duration = start.msecsTo(QTime::currentTime()); if (duration < 0 || duration > ms) { LOG(VB_GENERAL, LOG_INFO, "Complete."); break; } if (mp->IsErrored()) { LOG(VB_GENERAL, LOG_ERR, "Playback error."); break; } if (mp->GetEof()) { LOG(VB_GENERAL, LOG_INFO, "End of file."); break; } if (!mp->PrebufferEnoughFrames()) continue; mp->SetBuffering(false); vo->StartDisplayingFrame(); VideoFrame *frame = vo->GetLastShownFrame(); mp->CheckAspectRatio(frame); if (!decodeonly) { vo->ProcessFrame(frame, NULL, NULL, dummy, scan); vo->PrepareFrame(frame, scan, NULL); vo->Show(scan); } vo->DoneDisplayingFrame(frame); jitter->RecordCycleTime(); } LOG(VB_GENERAL, LOG_INFO, "-----------------------------------"); }
bool PlayerContext::CreatePlayer(TV *tv, QWidget *widget, TVState desiredState, WId embedwinid, const QRect *embedbounds, bool muted) { int exact_seeking = gCoreContext->GetNumSetting("ExactSeeking", 0); if (HasPlayer()) { VERBOSE(VB_IMPORTANT, LOC_ERR + "Attempting to setup a player, but it already exists."); return false; } MythPlayer *player = NULL; if (kState_WatchingBD == desiredState) player = new MythBDPlayer(muted); else if (kState_WatchingDVD == desiredState) player = new MythDVDPlayer(muted); else player = new MythPlayer(muted); if (nohardwaredecoders) player->DisableHardwareDecoders(); QString passthru_device = gCoreContext->GetNumSetting( "PassThruDeviceOverride", false) ? gCoreContext->GetSetting("PassThruOutputDevice") : QString::null; player->SetPlayerInfo(tv, widget, exact_seeking, this); AudioPlayer *audio = player->GetAudio(); audio->SetAudioInfo(gCoreContext->GetSetting("AudioOutputDevice"), passthru_device, gCoreContext->GetNumSetting("AudioSampleRate", 44100)); audio->SetStretchFactor(ts_normal); player->SetLength(playingLen); if (useNullVideo) player->SetNullVideo(); player->SetVideoFilters((useNullVideo) ? "onefield" : ""); if (!IsAudioNeeded()) audio->SetNoAudio(); else { QString subfn = buffer->GetSubtitleFilename(); if (!subfn.isEmpty() && player->GetSubReader()) player->GetSubReader()->LoadExternalSubtitles(subfn); } if ((embedwinid > 0) && embedbounds) { player->EmbedInWidget( embedbounds->x(), embedbounds->y(), embedbounds->width(), embedbounds->height(), embedwinid); } bool isWatchingRecording = (desiredState == kState_WatchingRecording); player->SetWatchingRecording(isWatchingRecording); SetPlayer(player); if (pipState == kPIPOff || pipState == kPBPLeft) { if (audio->HasAudioOut()) { QString errMsg = audio->ReinitAudio(); } } else if (pipState == kPBPRight) player->SetMuted(true); return StartPlaying(-1); }