Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git a/xbmc/cores/VideoRenderers/RenderManager.cpp b/xbmc/cores/VideoRenderers/RenderManager.cpp
- index 7da5eab..fe2012d 100644
- --- a/xbmc/cores/VideoRenderers/RenderManager.cpp
- +++ b/xbmc/cores/VideoRenderers/RenderManager.cpp
- @@ -103,6 +103,7 @@ CXBMCRenderManager::CXBMCRenderManager()
- m_presentmethod = PRESENT_METHOD_SINGLE;
- m_bReconfigured = false;
- m_hasCaptures = false;
- + m_GlobalVideoDelay = 0.0f;
- }
- CXBMCRenderManager::~CXBMCRenderManager()
- @@ -712,6 +713,13 @@ void CXBMCRenderManager::Recover()
- #if defined(HAS_GL) && !defined(TARGET_DARWIN)
- glFlush(); // attempt to have gpu done with pixmap and vdpau
- #endif
- +
- + // Update global video delay
- + float refresh = g_graphicsContext.GetFPS();
- + if (g_graphicsContext.GetVideoResolution() == RES_WINDOW)
- + refresh = 0; // No idea about refresh rate when windowed, use the default global delay only
- + m_GlobalVideoDelay = (double) g_advancedSettings.GetGlobalVideoDelay(refresh) * DVD_TIME_BASE;
- + CLog::Log(LOGDEBUG, "CRenderManager::Recover - Global video delay set to %1.0f msec", m_GlobalVideoDelay * 1000.0f / DVD_TIME_BASE);
- }
- void CXBMCRenderManager::UpdateResolution()
- diff --git a/xbmc/cores/VideoRenderers/RenderManager.h b/xbmc/cores/VideoRenderers/RenderManager.h
- index 961b19f..21d6507 100644
- --- a/xbmc/cores/VideoRenderers/RenderManager.h
- +++ b/xbmc/cores/VideoRenderers/RenderManager.h
- @@ -108,6 +108,7 @@ public:
- float GetMaximumFPS();
- inline bool Paused() { return m_bPauseDrawing; };
- inline bool IsStarted() { return m_bIsStarted;}
- + double GetVideoDelay() { return m_GlobalVideoDelay; }
- bool Supports(ERENDERFEATURE feature)
- {
- @@ -216,6 +217,7 @@ protected:
- PRESENT_METHOD_BOB,
- };
- + double m_GlobalVideoDelay;
- double m_presenttime;
- double m_presentcorr;
- diff --git a/xbmc/cores/dvdplayer/DVDPlayer.cpp b/xbmc/cores/dvdplayer/DVDPlayer.cpp
- index a5bf08a..f0dde8a 100644
- --- a/xbmc/cores/dvdplayer/DVDPlayer.cpp
- +++ b/xbmc/cores/dvdplayer/DVDPlayer.cpp
- @@ -2433,7 +2433,7 @@ void CDVDPlayer::GetGeneralInfo(CStdString& strGeneralInfo)
- {
- if (!m_bStop)
- {
- - double dDelay = (double)m_dvdPlayerVideo.GetDelay() / DVD_TIME_BASE;
- + double dDelay = ((double)m_dvdPlayerVideo.GetDelay() + g_renderManager.GetVideoDelay()) / DVD_TIME_BASE;
- double apts = m_dvdPlayerAudio.GetCurrentPts();
- double vpts = m_dvdPlayerVideo.GetCurrentPts();
- diff --git a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp
- index 15e11d2..5b13868 100644
- --- a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp
- +++ b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp
- @@ -1111,8 +1111,8 @@ int CDVDPlayerVideo::OutputPicture(const DVDVideoPicture* src, double pts)
- pts -= DVD_TIME_BASE * interval;
- }
- - //User set delay
- - pts += m_iVideoDelay;
- + // Correct pts by user set delay and rendering delay
- + pts += m_iVideoDelay + g_renderManager.GetVideoDelay();
- // calculate the time we need to delay this picture before displaying
- double iSleepTime, iClockSleep, iFrameSleep, iPlayingClock, iCurrentClock, iFrameDuration;
- diff --git a/xbmc/settings/AdvancedSettings.cpp b/xbmc/settings/AdvancedSettings.cpp
- index d6d65cc..4628d94 100644
- --- a/xbmc/settings/AdvancedSettings.cpp
- +++ b/xbmc/settings/AdvancedSettings.cpp
- @@ -540,6 +540,47 @@ void CAdvancedSettings::ParseSettingsFile(const CStdString &file)
- XMLUtils::GetBoolean(pElement,"forcedxvarenderer", m_DXVAForceProcessorRenderer);
- //0 = disable fps detect, 1 = only detect on timestamps with uniform spacing, 2 detect on all timestamps
- XMLUtils::GetInt(pElement, "fpsdetect", m_videoFpsDetect, 0, 2);
- +
- + // Store global video delay settings
- + m_videoDefaultDelay = 0;
- + TiXmlElement* pGlobalVideoDelay = pElement->FirstChildElement("globaldelay");
- + if (pGlobalVideoDelay)
- + {
- + TiXmlElement* pRefreshVideoDelay = pGlobalVideoDelay->FirstChildElement("refresh");
- + while (pRefreshVideoDelay)
- + {
- + RefreshVideoDelay videodelay = {0};
- +
- + float refresh;
- + if (XMLUtils::GetFloat(pRefreshVideoDelay, "rate", refresh))
- + {
- + videodelay.refreshmin = refresh - 0.01f;
- + videodelay.refreshmax = refresh + 0.01f;
- + }
- +
- + float refreshmin, refreshmax;
- + if (XMLUtils::GetFloat(pRefreshVideoDelay, "min", refreshmin) &&
- + XMLUtils::GetFloat(pRefreshVideoDelay, "max", refreshmax))
- + {
- + videodelay.refreshmin = refreshmin;
- + videodelay.refreshmax = refreshmax;
- + }
- +
- + float delay;
- + if (XMLUtils::GetFloat(pRefreshVideoDelay, "delay", delay, -600.0f, 600.0f))
- + videodelay.delay = delay;
- +
- + if (videodelay.refreshmin > 0.0f && videodelay.refreshmax >= videodelay.refreshmin)
- + m_videoRefreshDelay.push_back(videodelay);
- + else
- + CLog::Log(LOGWARNING, "Ignoring malformed global video delay entry, min:%f max:%f", videodelay.refreshmin, videodelay.refreshmax);
- +
- + pRefreshVideoDelay = pRefreshVideoDelay->NextSiblingElement("refresh");
- + }
- +
- + // Get default global video delay
- + XMLUtils::GetFloat(pGlobalVideoDelay, "delay", m_videoDefaultDelay, -600.0f, 600.0f);
- + }
- }
- pElement = pRootElement->FirstChildElement("musiclibrary");
- @@ -1049,3 +1090,16 @@ void CAdvancedSettings::AddSettingsFile(const CStdString &filename)
- {
- m_settingsFiles.push_back(filename);
- }
- +
- +float CAdvancedSettings::GetGlobalVideoDelay(float refreshrate)
- +{
- + float delay = m_videoDefaultDelay / 1000.0f;
- + for (int i = 0; i < (int) m_videoRefreshDelay.size(); i++)
- + {
- + RefreshVideoDelay& videodelay = m_videoRefreshDelay[i];
- + if (refreshrate >= videodelay.refreshmin && refreshrate <= videodelay.refreshmax)
- + delay = videodelay.delay / 1000.0f;
- + }
- +
- + return delay; // in seconds
- +}
- diff --git a/xbmc/settings/AdvancedSettings.h b/xbmc/settings/AdvancedSettings.h
- index 3585e0e..582a77b 100644
- --- a/xbmc/settings/AdvancedSettings.h
- +++ b/xbmc/settings/AdvancedSettings.h
- @@ -59,6 +59,15 @@ struct RefreshOverride
- bool fallback;
- };
- +
- +struct RefreshVideoDelay
- +{
- + float refreshmin;
- + float refreshmax;
- +
- + float delay;
- +};
- +
- typedef std::vector<TVShowRegexp> SETTINGS_TVSHOWLIST;
- class CAdvancedSettings
- @@ -125,6 +134,8 @@ class CAdvancedSettings
- bool m_videoAllowMpeg4VDPAU;
- bool m_videoAllowMpeg4VAAPI;
- std::vector<RefreshOverride> m_videoAdjustRefreshOverrides;
- + std::vector<RefreshVideoDelay> m_videoRefreshDelay;
- + float m_videoDefaultDelay;
- bool m_videoDisableBackgroundDeinterlace;
- int m_videoCaptureUseOcclusionQuery;
- bool m_DXVACheckCompatibility;
- @@ -303,6 +314,8 @@ class CAdvancedSettings
- bool m_enableMultimediaKeys;
- std::vector<CStdString> m_settingsFiles;
- void ParseSettingsFile(const CStdString &file);
- +
- + float GetGlobalVideoDelay(float refreshrate);
- };
- XBMC_GLOBAL(CAdvancedSettings,g_advancedSettings);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement