diff options
author | bobo1on1 <bobo1on1@svn> | 2010-09-13 20:33:30 +0000 |
---|---|---|
committer | bobo1on1 <bobo1on1@svn> | 2010-09-13 20:33:30 +0000 |
commit | 109c6a010c692791eaec0eb0e373daf269ba08d1 (patch) | |
tree | f2f8970715a0504504ed1a12a1177712c5783e8c | |
parent | ec59834901260196b974a51d74cc0b0f1e73b128 (diff) |
fixed: for 23.976 and 24 fps video, check if a 2:3 cadence would fit better
git-svn-id: https://xbmc.svn.sourceforge.net/svnroot/xbmc/trunk@33742 568bbfeb-2a22-0410-94d2-cc84cf5bfa90
-rw-r--r-- | xbmc/cores/VideoRenderers/BaseRenderer.cpp | 57 | ||||
-rw-r--r-- | xbmc/cores/VideoRenderers/BaseRenderer.h | 1 |
2 files changed, 39 insertions, 19 deletions
diff --git a/xbmc/cores/VideoRenderers/BaseRenderer.cpp b/xbmc/cores/VideoRenderers/BaseRenderer.cpp index 5e5addec64..0ad08e6c48 100644 --- a/xbmc/cores/VideoRenderers/BaseRenderer.cpp +++ b/xbmc/cores/VideoRenderers/BaseRenderer.cpp @@ -50,26 +50,15 @@ void CBaseRenderer::ChooseBestResolution(float fps) #if !defined(__APPLE__) if (g_guiSettings.GetBool("videoplayer.adjustrefreshrate")) { - // Find closest refresh rate - for (size_t i = (int)RES_CUSTOM; i < g_settings.m_ResInfo.size(); i++) + int weight; + m_resolution = FindClosestResolution(fps, 1.0, m_resolution, weight); + + if (MathUtils::round_int(fps) == 24 && weight >= 20) //not a very good match, try a 2:3 cadence instead { - RESOLUTION_INFO &curr = g_settings.m_ResInfo[m_resolution]; - RESOLUTION_INFO &info = g_settings.m_ResInfo[i]; - - if (info.iWidth != curr.iWidth - || info.iHeight != curr.iHeight - || info.iScreen != curr.iScreen) - continue; - - // we assume just a tad lower fps since this calculation will discard - // any refreshrate that is smaller by just the smallest amount - int c_weight = (int)(1000 * fmodf(curr.fRefreshRate, fps - 0.01f) / curr.fRefreshRate); - int i_weight = (int)(1000 * fmodf(info.fRefreshRate, fps - 0.01f) / info.fRefreshRate); - - // Closer the better, prefer higher refresh rate if the same - if ((i_weight < c_weight) - || (i_weight == c_weight && info.fRefreshRate > curr.fRefreshRate)) - m_resolution = (RESOLUTION)i; + CLog::Log(LOGDEBUG, "Resolution %s (%d) not a very good match for fps %.3f, trying 2:3 cadence", + g_settings.m_ResInfo[m_resolution].strMode.c_str(), m_resolution, fps); + + m_resolution = FindClosestResolution(fps, 2.0, m_resolution, weight); } CLog::Log(LOGNOTICE, "Display resolution ADJUST : %s (%d)", g_settings.m_ResInfo[m_resolution].strMode.c_str(), m_resolution); @@ -79,6 +68,36 @@ void CBaseRenderer::ChooseBestResolution(float fps) CLog::Log(LOGNOTICE, "Display resolution %s : %s (%d)", m_resolution == RES_DESKTOP ? "DESKTOP" : "USER", g_settings.m_ResInfo[m_resolution].strMode.c_str(), m_resolution); } +RESOLUTION CBaseRenderer::FindClosestResolution(float fps, float multiplier, RESOLUTION current, int& weight) +{ + // Find closest refresh rate + for (size_t i = (int)RES_CUSTOM; i < g_settings.m_ResInfo.size(); i++) + { + RESOLUTION_INFO &curr = g_settings.m_ResInfo[current]; + RESOLUTION_INFO &info = g_settings.m_ResInfo[i]; + + if (info.iWidth != curr.iWidth + || info.iHeight != curr.iHeight + || info.iScreen != curr.iScreen + || (multiplier > 1.0 && info.fRefreshRate < fps - 0.01f)) + continue; + + // we assume just a tad lower fps since this calculation will discard + // any refreshrate that is smaller by just the smallest amount + int c_weight = (int)(1000 * fmodf(curr.fRefreshRate * multiplier, fps - 0.01f) / (curr.fRefreshRate * multiplier)); + int i_weight = (int)(1000 * fmodf(info.fRefreshRate * multiplier, fps - 0.01f) / (info.fRefreshRate * multiplier)); + + // Closer the better, prefer higher refresh rate if the same + if ((i_weight < c_weight) + || (i_weight == c_weight && info.fRefreshRate > curr.fRefreshRate)) + current = (RESOLUTION)i; + } + + weight = (int)(1000 * fmodf(g_settings.m_ResInfo[current].fRefreshRate * multiplier, fps - 0.01f) / + (g_settings.m_ResInfo[current].fRefreshRate * multiplier)); + return current; +} + RESOLUTION CBaseRenderer::GetResolution() const { if (g_graphicsContext.IsFullScreenRoot() && (g_graphicsContext.IsFullScreenVideo() || g_graphicsContext.IsCalibrating())) diff --git a/xbmc/cores/VideoRenderers/BaseRenderer.h b/xbmc/cores/VideoRenderers/BaseRenderer.h index 8a581876f2..4542f55e60 100644 --- a/xbmc/cores/VideoRenderers/BaseRenderer.h +++ b/xbmc/cores/VideoRenderers/BaseRenderer.h @@ -63,6 +63,7 @@ public: protected: void ChooseBestResolution(float fps); + RESOLUTION FindClosestResolution(float fps, float multiplier, RESOLUTION current, int& weight); void CalcNormalDisplayRect(float offsetX, float offsetY, float screenWidth, float screenHeight, float inputFrameRatio, float zoomAmount); void CalculateFrameAspectRatio(unsigned int desired_width, unsigned int desired_height); void ManageDisplay(); |