aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbobo1on1 <bobo1on1@svn>2010-09-13 20:33:30 +0000
committerbobo1on1 <bobo1on1@svn>2010-09-13 20:33:30 +0000
commit109c6a010c692791eaec0eb0e373daf269ba08d1 (patch)
treef2f8970715a0504504ed1a12a1177712c5783e8c
parentec59834901260196b974a51d74cc0b0f1e73b128 (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.cpp57
-rw-r--r--xbmc/cores/VideoRenderers/BaseRenderer.h1
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();