Advertisement
Guest User

globalvideodelay

a guest
Feb 23rd, 2012
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 6.99 KB | None | 0 0
  1. diff --git a/xbmc/cores/VideoRenderers/RenderManager.cpp b/xbmc/cores/VideoRenderers/RenderManager.cpp
  2. index 7da5eab..fe2012d 100644
  3. --- a/xbmc/cores/VideoRenderers/RenderManager.cpp
  4. +++ b/xbmc/cores/VideoRenderers/RenderManager.cpp
  5. @@ -103,6 +103,7 @@ CXBMCRenderManager::CXBMCRenderManager()
  6.    m_presentmethod = PRESENT_METHOD_SINGLE;
  7.    m_bReconfigured = false;
  8.    m_hasCaptures = false;
  9. +  m_GlobalVideoDelay = 0.0f;
  10.  }
  11.  
  12.  CXBMCRenderManager::~CXBMCRenderManager()
  13. @@ -712,6 +713,13 @@ void CXBMCRenderManager::Recover()
  14.  #if defined(HAS_GL) && !defined(TARGET_DARWIN)
  15.    glFlush(); // attempt to have gpu done with pixmap and vdpau
  16.  #endif
  17. +
  18. +  // Update global video delay
  19. +  float refresh = g_graphicsContext.GetFPS();
  20. +  if (g_graphicsContext.GetVideoResolution() == RES_WINDOW)
  21. +    refresh = 0; // No idea about refresh rate when windowed, use the default global delay only
  22. +  m_GlobalVideoDelay = (double) g_advancedSettings.GetGlobalVideoDelay(refresh) * DVD_TIME_BASE;
  23. +  CLog::Log(LOGDEBUG, "CRenderManager::Recover - Global video delay set to %1.0f msec", m_GlobalVideoDelay * 1000.0f / DVD_TIME_BASE);
  24.  }
  25.  
  26.  void CXBMCRenderManager::UpdateResolution()
  27. diff --git a/xbmc/cores/VideoRenderers/RenderManager.h b/xbmc/cores/VideoRenderers/RenderManager.h
  28. index 961b19f..21d6507 100644
  29. --- a/xbmc/cores/VideoRenderers/RenderManager.h
  30. +++ b/xbmc/cores/VideoRenderers/RenderManager.h
  31. @@ -108,6 +108,7 @@ public:
  32.    float GetMaximumFPS();
  33.    inline bool Paused() { return m_bPauseDrawing; };
  34.    inline bool IsStarted() { return m_bIsStarted;}
  35. +  double GetVideoDelay() { return m_GlobalVideoDelay; }
  36.  
  37.    bool Supports(ERENDERFEATURE feature)
  38.    {
  39. @@ -216,6 +217,7 @@ protected:
  40.      PRESENT_METHOD_BOB,
  41.    };
  42.  
  43. +  double     m_GlobalVideoDelay;
  44.  
  45.    double     m_presenttime;
  46.    double     m_presentcorr;
  47. diff --git a/xbmc/cores/dvdplayer/DVDPlayer.cpp b/xbmc/cores/dvdplayer/DVDPlayer.cpp
  48. index a5bf08a..f0dde8a 100644
  49. --- a/xbmc/cores/dvdplayer/DVDPlayer.cpp
  50. +++ b/xbmc/cores/dvdplayer/DVDPlayer.cpp
  51. @@ -2433,7 +2433,7 @@ void CDVDPlayer::GetGeneralInfo(CStdString& strGeneralInfo)
  52.  {
  53.    if (!m_bStop)
  54.    {
  55. -    double dDelay = (double)m_dvdPlayerVideo.GetDelay() / DVD_TIME_BASE;
  56. +    double dDelay = ((double)m_dvdPlayerVideo.GetDelay() + g_renderManager.GetVideoDelay()) / DVD_TIME_BASE;
  57.  
  58.      double apts = m_dvdPlayerAudio.GetCurrentPts();
  59.      double vpts = m_dvdPlayerVideo.GetCurrentPts();
  60. diff --git a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp
  61. index 15e11d2..5b13868 100644
  62. --- a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp
  63. +++ b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp
  64. @@ -1111,8 +1111,8 @@ int CDVDPlayerVideo::OutputPicture(const DVDVideoPicture* src, double pts)
  65.      pts -= DVD_TIME_BASE * interval;
  66.    }
  67.  
  68. -  //User set delay
  69. -  pts += m_iVideoDelay;
  70. +  // Correct pts by user set delay and rendering delay
  71. +  pts += m_iVideoDelay + g_renderManager.GetVideoDelay();
  72.  
  73.    // calculate the time we need to delay this picture before displaying
  74.    double iSleepTime, iClockSleep, iFrameSleep, iPlayingClock, iCurrentClock, iFrameDuration;
  75. diff --git a/xbmc/settings/AdvancedSettings.cpp b/xbmc/settings/AdvancedSettings.cpp
  76. index d6d65cc..4628d94 100644
  77. --- a/xbmc/settings/AdvancedSettings.cpp
  78. +++ b/xbmc/settings/AdvancedSettings.cpp
  79. @@ -540,6 +540,47 @@ void CAdvancedSettings::ParseSettingsFile(const CStdString &file)
  80.      XMLUtils::GetBoolean(pElement,"forcedxvarenderer", m_DXVAForceProcessorRenderer);
  81.      //0 = disable fps detect, 1 = only detect on timestamps with uniform spacing, 2 detect on all timestamps
  82.      XMLUtils::GetInt(pElement, "fpsdetect", m_videoFpsDetect, 0, 2);
  83. +
  84. +    // Store global video delay settings
  85. +    m_videoDefaultDelay = 0;
  86. +    TiXmlElement* pGlobalVideoDelay = pElement->FirstChildElement("globaldelay");
  87. +    if (pGlobalVideoDelay)
  88. +    {
  89. +      TiXmlElement* pRefreshVideoDelay = pGlobalVideoDelay->FirstChildElement("refresh");
  90. +      while (pRefreshVideoDelay)
  91. +      {
  92. +        RefreshVideoDelay videodelay = {0};
  93. +
  94. +        float refresh;
  95. +        if (XMLUtils::GetFloat(pRefreshVideoDelay, "rate", refresh))
  96. +        {
  97. +          videodelay.refreshmin = refresh - 0.01f;
  98. +          videodelay.refreshmax = refresh + 0.01f;
  99. +        }
  100. +
  101. +        float refreshmin, refreshmax;
  102. +        if (XMLUtils::GetFloat(pRefreshVideoDelay, "min", refreshmin) &&
  103. +            XMLUtils::GetFloat(pRefreshVideoDelay, "max", refreshmax))
  104. +        {
  105. +          videodelay.refreshmin = refreshmin;
  106. +          videodelay.refreshmax = refreshmax;
  107. +        }
  108. +
  109. +        float delay;
  110. +        if (XMLUtils::GetFloat(pRefreshVideoDelay, "delay", delay, -600.0f, 600.0f))
  111. +          videodelay.delay = delay;
  112. +
  113. +        if (videodelay.refreshmin > 0.0f && videodelay.refreshmax >= videodelay.refreshmin)
  114. +          m_videoRefreshDelay.push_back(videodelay);
  115. +        else
  116. +          CLog::Log(LOGWARNING, "Ignoring malformed global video delay entry, min:%f max:%f", videodelay.refreshmin, videodelay.refreshmax);
  117. +
  118. +        pRefreshVideoDelay = pRefreshVideoDelay->NextSiblingElement("refresh");
  119. +      }
  120. +
  121. +      // Get default global video delay
  122. +      XMLUtils::GetFloat(pGlobalVideoDelay, "delay", m_videoDefaultDelay, -600.0f, 600.0f);
  123. +    }
  124.    }
  125.  
  126.    pElement = pRootElement->FirstChildElement("musiclibrary");
  127. @@ -1049,3 +1090,16 @@ void CAdvancedSettings::AddSettingsFile(const CStdString &filename)
  128.  {
  129.    m_settingsFiles.push_back(filename);
  130.  }
  131. +
  132. +float CAdvancedSettings::GetGlobalVideoDelay(float refreshrate)
  133. +{
  134. +  float delay = m_videoDefaultDelay / 1000.0f;
  135. +  for (int i = 0; i < (int) m_videoRefreshDelay.size(); i++)
  136. +  {
  137. +    RefreshVideoDelay& videodelay = m_videoRefreshDelay[i];
  138. +    if (refreshrate >= videodelay.refreshmin && refreshrate <= videodelay.refreshmax)
  139. +      delay = videodelay.delay / 1000.0f;
  140. +  }
  141. +
  142. +  return delay; // in seconds
  143. +}
  144. diff --git a/xbmc/settings/AdvancedSettings.h b/xbmc/settings/AdvancedSettings.h
  145. index 3585e0e..582a77b 100644
  146. --- a/xbmc/settings/AdvancedSettings.h
  147. +++ b/xbmc/settings/AdvancedSettings.h
  148. @@ -59,6 +59,15 @@ struct RefreshOverride
  149.    bool  fallback;
  150.  };
  151.  
  152. +
  153. +struct RefreshVideoDelay
  154. +{
  155. +  float refreshmin;
  156. +  float refreshmax;
  157. +
  158. +  float delay;
  159. +};
  160. +
  161.  typedef std::vector<TVShowRegexp> SETTINGS_TVSHOWLIST;
  162.  
  163.  class CAdvancedSettings
  164. @@ -125,6 +134,8 @@ class CAdvancedSettings
  165.      bool  m_videoAllowMpeg4VDPAU;
  166.      bool  m_videoAllowMpeg4VAAPI;
  167.      std::vector<RefreshOverride> m_videoAdjustRefreshOverrides;
  168. +    std::vector<RefreshVideoDelay> m_videoRefreshDelay;
  169. +    float m_videoDefaultDelay;
  170.      bool m_videoDisableBackgroundDeinterlace;
  171.      int  m_videoCaptureUseOcclusionQuery;
  172.      bool m_DXVACheckCompatibility;
  173. @@ -303,6 +314,8 @@ class CAdvancedSettings
  174.      bool m_enableMultimediaKeys;
  175.      std::vector<CStdString> m_settingsFiles;
  176.      void ParseSettingsFile(const CStdString &file);
  177. +
  178. +    float GetGlobalVideoDelay(float refreshrate);
  179.  };
  180.  
  181.  XBMC_GLOBAL(CAdvancedSettings,g_advancedSettings);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement