2 * Copyright (C) 2005-2013 Team XBMC
5 * This Program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2, or (at your option)
10 * This Program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with XBMC; see the file COPYING. If not, see
17 * <http://www.gnu.org/licenses/>.
22 #include "GUIDialogVideoSettings.h"
23 #include "guilib/GUIWindowManager.h"
24 #include "GUIPassword.h"
25 #include "utils/MathUtils.h"
26 #include "utils/StringUtils.h"
27 #ifdef HAS_VIDEO_PLAYBACK
28 #include "cores/VideoRenderers/RenderManager.h"
29 #include "cores/VideoRenderers/RenderFlags.h"
31 #include "video/VideoDatabase.h"
32 #include "dialogs/GUIDialogYesNo.h"
33 #include "profiles/ProfilesManager.h"
34 #include "settings/Settings.h"
35 #include "settings/MediaSettings.h"
36 #include "addons/Skin.h"
37 #include "pvr/PVRManager.h"
42 CGUIDialogVideoSettings::CGUIDialogVideoSettings(void)
43 : CGUIDialogSettings(WINDOW_DIALOG_VIDEO_OSD_SETTINGS, "VideoOSDSettings.xml")
47 CGUIDialogVideoSettings::~CGUIDialogVideoSettings(void)
51 #define VIDEO_SETTINGS_CROP 1
52 #define VIDEO_SETTINGS_VIEW_MODE 2
53 #define VIDEO_SETTINGS_ZOOM 3
54 #define VIDEO_SETTINGS_PIXEL_RATIO 4
55 #define VIDEO_SETTINGS_BRIGHTNESS 5
56 #define VIDEO_SETTINGS_CONTRAST 6
57 #define VIDEO_SETTINGS_GAMMA 7
58 #define VIDEO_SETTINGS_INTERLACEMETHOD 8
60 #define VIDEO_SETTINGS_MAKE_DEFAULT 10
62 #define VIDEO_SETTINGS_CALIBRATION 11
63 #define VIDEO_SETTINGS_SOFTEN 13
64 #define VIDEO_SETTINGS_SCALINGMETHOD 18
66 #define VIDEO_SETTING_VDPAU_NOISE 19
67 #define VIDEO_SETTING_VDPAU_SHARPNESS 20
69 #define VIDEO_SETTINGS_NONLIN_STRETCH 21
70 #define VIDEO_SETTINGS_POSTPROCESS 22
71 #define VIDEO_SETTINGS_VERTICAL_SHIFT 23
72 #define VIDEO_SETTINGS_DEINTERLACEMODE 24
74 #define VIDEO_SETTINGS_STEREOSCOPICMODE 25
75 #define VIDEO_SETTINGS_STEREOSCOPICINVERT 26
77 void CGUIDialogVideoSettings::CreateSettings()
79 m_usePopupSliders = g_SkinInfo->HasSkinFile("DialogSlider.xml");
80 // clear out any old settings
82 // create our settings
84 vector<pair<int, int> > entries;
86 if (g_renderManager.Supports(VS_DEINTERLACEMODE_OFF))
87 entries.push_back(make_pair(VS_DEINTERLACEMODE_OFF , 16039));
89 if (g_renderManager.Supports(VS_DEINTERLACEMODE_AUTO))
90 entries.push_back(make_pair(VS_DEINTERLACEMODE_AUTO , 16040));
92 if (g_renderManager.Supports(VS_DEINTERLACEMODE_FORCE))
93 entries.push_back(make_pair(VS_DEINTERLACEMODE_FORCE , 16041));
96 AddSpin(VIDEO_SETTINGS_DEINTERLACEMODE, 16037, (int*)&CMediaSettings::Get().GetCurrentVideoSettings().m_DeinterlaceMode, entries);
99 vector<pair<int, int> > entries;
100 entries.push_back(make_pair(VS_INTERLACEMETHOD_AUTO , 16019));
101 entries.push_back(make_pair(VS_INTERLACEMETHOD_RENDER_BLEND , 20131));
102 entries.push_back(make_pair(VS_INTERLACEMETHOD_RENDER_WEAVE_INVERTED, 20130));
103 entries.push_back(make_pair(VS_INTERLACEMETHOD_RENDER_WEAVE , 20129));
104 entries.push_back(make_pair(VS_INTERLACEMETHOD_RENDER_BOB_INVERTED , 16022));
105 entries.push_back(make_pair(VS_INTERLACEMETHOD_RENDER_BOB , 16021));
106 entries.push_back(make_pair(VS_INTERLACEMETHOD_DEINTERLACE , 16020));
107 entries.push_back(make_pair(VS_INTERLACEMETHOD_DEINTERLACE_HALF , 16036));
108 entries.push_back(make_pair(VS_INTERLACEMETHOD_SW_BLEND , 16324));
109 entries.push_back(make_pair(VS_INTERLACEMETHOD_INVERSE_TELECINE , 16314));
110 entries.push_back(make_pair(VS_INTERLACEMETHOD_VDPAU_TEMPORAL_SPATIAL , 16311));
111 entries.push_back(make_pair(VS_INTERLACEMETHOD_VDPAU_TEMPORAL , 16310));
112 entries.push_back(make_pair(VS_INTERLACEMETHOD_VDPAU_BOB , 16325));
113 entries.push_back(make_pair(VS_INTERLACEMETHOD_VDPAU_TEMPORAL_SPATIAL_HALF, 16318));
114 entries.push_back(make_pair(VS_INTERLACEMETHOD_VDPAU_TEMPORAL_HALF , 16317));
115 entries.push_back(make_pair(VS_INTERLACEMETHOD_VDPAU_INVERSE_TELECINE , 16314));
116 entries.push_back(make_pair(VS_INTERLACEMETHOD_DXVA_BOB , 16320));
117 entries.push_back(make_pair(VS_INTERLACEMETHOD_DXVA_BEST , 16321));
118 entries.push_back(make_pair(VS_INTERLACEMETHOD_AUTO_ION , 16325));
120 /* remove unsupported methods */
121 for(vector<pair<int, int> >::iterator it = entries.begin(); it != entries.end();)
123 if(g_renderManager.Supports((EINTERLACEMETHOD)it->first))
126 it = entries.erase(it);
129 if (entries.size() > 1)
131 AddSpin(VIDEO_SETTINGS_INTERLACEMETHOD, 16038, (int*)&CMediaSettings::Get().GetCurrentVideoSettings().m_InterlaceMethod, entries);
132 if (CMediaSettings::Get().GetCurrentVideoSettings().m_DeinterlaceMode == VS_DEINTERLACEMODE_OFF)
133 EnableSettings(VIDEO_SETTINGS_INTERLACEMETHOD, false);
137 vector<pair<int, int> > entries;
138 entries.push_back(make_pair(VS_SCALINGMETHOD_NEAREST , 16301));
139 entries.push_back(make_pair(VS_SCALINGMETHOD_LINEAR , 16302));
140 entries.push_back(make_pair(VS_SCALINGMETHOD_CUBIC , 16303));
141 entries.push_back(make_pair(VS_SCALINGMETHOD_LANCZOS2 , 16304));
142 entries.push_back(make_pair(VS_SCALINGMETHOD_SPLINE36_FAST , 16323));
143 entries.push_back(make_pair(VS_SCALINGMETHOD_LANCZOS3_FAST , 16315));
144 entries.push_back(make_pair(VS_SCALINGMETHOD_SPLINE36 , 16322));
145 entries.push_back(make_pair(VS_SCALINGMETHOD_LANCZOS3 , 16305));
146 entries.push_back(make_pair(VS_SCALINGMETHOD_SINC8 , 16306));
147 // entries.push_back(make_pair(VS_SCALINGMETHOD_NEDI , ?????));
148 entries.push_back(make_pair(VS_SCALINGMETHOD_BICUBIC_SOFTWARE , 16307));
149 entries.push_back(make_pair(VS_SCALINGMETHOD_LANCZOS_SOFTWARE , 16308));
150 entries.push_back(make_pair(VS_SCALINGMETHOD_SINC_SOFTWARE , 16309));
151 entries.push_back(make_pair(VS_SCALINGMETHOD_VDPAU_HARDWARE , 13120));
152 entries.push_back(make_pair(VS_SCALINGMETHOD_DXVA_HARDWARE , 16319));
153 entries.push_back(make_pair(VS_SCALINGMETHOD_AUTO , 16316));
155 /* remove unsupported methods */
156 for(vector<pair<int, int> >::iterator it = entries.begin(); it != entries.end();)
158 if(g_renderManager.Supports((ESCALINGMETHOD)it->first))
161 it = entries.erase(it);
164 AddSpin(VIDEO_SETTINGS_SCALINGMETHOD, 16300, (int*)&CMediaSettings::Get().GetCurrentVideoSettings().m_ScalingMethod, entries);
166 if (g_renderManager.Supports(RENDERFEATURE_CROP))
167 AddBool(VIDEO_SETTINGS_CROP, 644, &CMediaSettings::Get().GetCurrentVideoSettings().m_Crop);
168 if (g_renderManager.Supports(RENDERFEATURE_STRETCH) || g_renderManager.Supports(RENDERFEATURE_PIXEL_RATIO))
170 const int entries[] = {630, 631, 632, 633, 634, 635, 636 };
171 AddSpin(VIDEO_SETTINGS_VIEW_MODE, 629, &CMediaSettings::Get().GetCurrentVideoSettings().m_ViewMode, 7, entries);
173 if (g_renderManager.Supports(RENDERFEATURE_ZOOM))
174 AddSlider(VIDEO_SETTINGS_ZOOM, 216, &CMediaSettings::Get().GetCurrentVideoSettings().m_CustomZoomAmount, 0.5f, 0.01f, 2.0f, FormatFloat);
175 if (g_renderManager.Supports(RENDERFEATURE_VERTICAL_SHIFT))
176 AddSlider(VIDEO_SETTINGS_VERTICAL_SHIFT, 225, &CMediaSettings::Get().GetCurrentVideoSettings().m_CustomVerticalShift, -2.0f, 0.01f, 2.0f, FormatFloat);
177 if (g_renderManager.Supports(RENDERFEATURE_PIXEL_RATIO))
178 AddSlider(VIDEO_SETTINGS_PIXEL_RATIO, 217, &CMediaSettings::Get().GetCurrentVideoSettings().m_CustomPixelRatio, 0.5f, 0.01f, 2.0f, FormatFloat);
179 if (g_renderManager.Supports(RENDERFEATURE_POSTPROCESS))
180 AddBool(VIDEO_SETTINGS_POSTPROCESS, 16400, &CMediaSettings::Get().GetCurrentVideoSettings().m_PostProcess);
182 #ifdef HAS_VIDEO_PLAYBACK
183 if (g_renderManager.Supports(RENDERFEATURE_BRIGHTNESS))
184 AddSlider(VIDEO_SETTINGS_BRIGHTNESS, 464, &CMediaSettings::Get().GetCurrentVideoSettings().m_Brightness, 0, 1, 100, FormatInteger);
185 if (g_renderManager.Supports(RENDERFEATURE_CONTRAST))
186 AddSlider(VIDEO_SETTINGS_CONTRAST, 465, &CMediaSettings::Get().GetCurrentVideoSettings().m_Contrast, 0, 1, 100, FormatInteger);
187 if (g_renderManager.Supports(RENDERFEATURE_GAMMA))
188 AddSlider(VIDEO_SETTINGS_GAMMA, 466, &CMediaSettings::Get().GetCurrentVideoSettings().m_Gamma, 0, 1, 100, FormatInteger);
189 if (g_renderManager.Supports(RENDERFEATURE_NOISE))
190 AddSlider(VIDEO_SETTING_VDPAU_NOISE, 16312, &CMediaSettings::Get().GetCurrentVideoSettings().m_NoiseReduction, 0.0f, 0.01f, 1.0f, FormatFloat);
191 if (g_renderManager.Supports(RENDERFEATURE_SHARPNESS))
192 AddSlider(VIDEO_SETTING_VDPAU_SHARPNESS, 16313, &CMediaSettings::Get().GetCurrentVideoSettings().m_Sharpness, -1.0f, 0.02f, 1.0f, FormatFloat);
193 if (g_renderManager.Supports(RENDERFEATURE_NONLINSTRETCH))
194 AddBool(VIDEO_SETTINGS_NONLIN_STRETCH, 659, &CMediaSettings::Get().GetCurrentVideoSettings().m_CustomNonLinStretch);
197 vector<pair<int, int> > stereomode;
198 stereomode.push_back(make_pair(RENDER_STEREO_MODE_OFF , 16316));
199 stereomode.push_back(make_pair(RENDER_STEREO_MODE_SPLIT_HORIZONTAL, 36503));
200 stereomode.push_back(make_pair(RENDER_STEREO_MODE_SPLIT_VERTICAL , 36504));
201 AddSpin(VIDEO_SETTINGS_STEREOSCOPICMODE , 36535, &CMediaSettings::Get().GetCurrentVideoSettings().m_StereoMode, stereomode);
202 AddBool(VIDEO_SETTINGS_STEREOSCOPICINVERT, 36536, &CMediaSettings::Get().GetCurrentVideoSettings().m_StereoInvert);
205 AddButton(VIDEO_SETTINGS_MAKE_DEFAULT, 12376);
206 AddButton(VIDEO_SETTINGS_CALIBRATION, 214);
209 void CGUIDialogVideoSettings::OnSettingChanged(SettingInfo &setting)
211 // check and update anything that needs it
212 #ifdef HAS_VIDEO_PLAYBACK
213 if (setting.id == VIDEO_SETTINGS_CROP)
215 // AutoCrop changes will get picked up automatically by dvdplayer
217 else if (setting.id == VIDEO_SETTINGS_VIEW_MODE)
219 g_renderManager.SetViewMode(CMediaSettings::Get().GetCurrentVideoSettings().m_ViewMode);
220 UpdateSetting(VIDEO_SETTINGS_ZOOM);
221 UpdateSetting(VIDEO_SETTINGS_PIXEL_RATIO);
222 UpdateSetting(VIDEO_SETTINGS_NONLIN_STRETCH);
223 UpdateSetting(VIDEO_SETTINGS_VERTICAL_SHIFT);
225 else if (setting.id == VIDEO_SETTINGS_ZOOM || setting.id == VIDEO_SETTINGS_PIXEL_RATIO
226 || setting.id == VIDEO_SETTINGS_NONLIN_STRETCH
227 || setting.id == VIDEO_SETTINGS_VERTICAL_SHIFT)
229 CMediaSettings::Get().GetCurrentVideoSettings().m_ViewMode = ViewModeCustom;
230 g_renderManager.SetViewMode(ViewModeCustom);
231 UpdateSetting(VIDEO_SETTINGS_VIEW_MODE);
235 if (setting.id == VIDEO_SETTINGS_CALIBRATION)
237 // launch calibration window
238 if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE &&
239 g_passwordManager.CheckSettingLevelLock(CSettings::Get().GetSetting("videoscreen.guicalibration")->GetLevel()))
241 g_windowManager.ActivateWindow(WINDOW_SCREEN_CALIBRATION);
243 else if (setting.id == VIDEO_SETTINGS_MAKE_DEFAULT)
245 if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE &&
246 !g_passwordManager.CheckSettingLevelLock(::SettingLevelExpert))
249 // prompt user if they are sure
250 if (CGUIDialogYesNo::ShowAndGetInput(12376, 750, 0, 12377))
251 { // reset the settings
254 db.EraseVideoSettings();
256 CMediaSettings::Get().GetDefaultVideoSettings() = CMediaSettings::Get().GetCurrentVideoSettings();
257 CMediaSettings::Get().GetDefaultVideoSettings().m_SubtitleStream = -1;
258 CMediaSettings::Get().GetDefaultVideoSettings().m_AudioStream = -1;
259 CSettings::Get().Save();
262 else if (setting.id == VIDEO_SETTINGS_DEINTERLACEMODE)
264 EnableSettings(VIDEO_SETTINGS_INTERLACEMETHOD, CMediaSettings::Get().GetCurrentVideoSettings().m_DeinterlaceMode != VS_DEINTERLACEMODE_OFF);
267 if (g_PVRManager.IsPlayingRadio() || g_PVRManager.IsPlayingTV())
268 g_PVRManager.TriggerSaveChannelSettings();
271 CStdString CGUIDialogVideoSettings::FormatInteger(float value, float minimum)
273 return StringUtils::Format("%i", MathUtils::round_int(value));
276 CStdString CGUIDialogVideoSettings::FormatFloat(float value, float minimum)
278 return StringUtils::Format("%2.2f", value);