Merge pull request #3447 from Karlson2k/win32_fix_relative_paths
[vuplus_xbmc] / xbmc / video / dialogs / GUIDialogVideoSettings.cpp
1 /*
2  *      Copyright (C) 2005-2013 Team XBMC
3  *      http://xbmc.org
4  *
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)
8  *  any later version.
9  *
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.
14  *
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/>.
18  *
19  */
20
21 #include "system.h"
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"
30 #endif
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"
38
39 using namespace std;
40 using namespace PVR;
41
42 CGUIDialogVideoSettings::CGUIDialogVideoSettings(void)
43     : CGUIDialogSettings(WINDOW_DIALOG_VIDEO_OSD_SETTINGS, "VideoOSDSettings.xml")
44 {
45 }
46
47 CGUIDialogVideoSettings::~CGUIDialogVideoSettings(void)
48 {
49 }
50
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
59 // separator 9
60 #define VIDEO_SETTINGS_MAKE_DEFAULT       10
61
62 #define VIDEO_SETTINGS_CALIBRATION        11
63 #define VIDEO_SETTINGS_SOFTEN             13
64 #define VIDEO_SETTINGS_SCALINGMETHOD      18
65
66 #define VIDEO_SETTING_VDPAU_NOISE         19
67 #define VIDEO_SETTING_VDPAU_SHARPNESS     20
68
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
73
74 #define VIDEO_SETTINGS_STEREOSCOPICMODE   25
75 #define VIDEO_SETTINGS_STEREOSCOPICINVERT 26
76
77 void CGUIDialogVideoSettings::CreateSettings()
78 {
79   m_usePopupSliders = g_SkinInfo->HasSkinFile("DialogSlider.xml");
80   // clear out any old settings
81   m_settings.clear();
82   // create our settings
83   {
84     vector<pair<int, int> > entries;
85
86     if (g_renderManager.Supports(VS_DEINTERLACEMODE_OFF))
87       entries.push_back(make_pair(VS_DEINTERLACEMODE_OFF    , 16039));
88
89     if (g_renderManager.Supports(VS_DEINTERLACEMODE_AUTO))
90       entries.push_back(make_pair(VS_DEINTERLACEMODE_AUTO   , 16040));
91
92     if (g_renderManager.Supports(VS_DEINTERLACEMODE_FORCE))
93       entries.push_back(make_pair(VS_DEINTERLACEMODE_FORCE  , 16041));
94
95     if (entries.size())
96       AddSpin(VIDEO_SETTINGS_DEINTERLACEMODE, 16037, (int*)&CMediaSettings::Get().GetCurrentVideoSettings().m_DeinterlaceMode, entries);
97   }
98   {
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));
119
120     /* remove unsupported methods */
121     for(vector<pair<int, int> >::iterator it = entries.begin(); it != entries.end();)
122     {
123       if(g_renderManager.Supports((EINTERLACEMETHOD)it->first))
124         it++;
125       else
126         it = entries.erase(it);
127     }
128
129     if (entries.size() > 1)
130     {
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);
134     }
135   }
136   {
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));
154
155     /* remove unsupported methods */
156     for(vector<pair<int, int> >::iterator it = entries.begin(); it != entries.end();)
157     {
158       if(g_renderManager.Supports((ESCALINGMETHOD)it->first))
159         it++;
160       else
161         it = entries.erase(it);
162     }
163
164     AddSpin(VIDEO_SETTINGS_SCALINGMETHOD, 16300, (int*)&CMediaSettings::Get().GetCurrentVideoSettings().m_ScalingMethod, entries);
165   }
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))
169   {
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);
172   }
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);
181
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);
195 #endif
196
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);
203
204   AddSeparator(8);
205   AddButton(VIDEO_SETTINGS_MAKE_DEFAULT, 12376);
206   AddButton(VIDEO_SETTINGS_CALIBRATION, 214);
207 }
208
209 void CGUIDialogVideoSettings::OnSettingChanged(SettingInfo &setting)
210 {
211   // check and update anything that needs it
212 #ifdef HAS_VIDEO_PLAYBACK
213   if (setting.id == VIDEO_SETTINGS_CROP)
214   {
215     // AutoCrop changes will get picked up automatically by dvdplayer
216   }
217   else if (setting.id == VIDEO_SETTINGS_VIEW_MODE)
218   {
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);
224   }
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)
228   {
229     CMediaSettings::Get().GetCurrentVideoSettings().m_ViewMode = ViewModeCustom;
230     g_renderManager.SetViewMode(ViewModeCustom);
231     UpdateSetting(VIDEO_SETTINGS_VIEW_MODE);
232   }
233   else
234 #endif
235   if (setting.id == VIDEO_SETTINGS_CALIBRATION)
236   {
237     // launch calibration window
238     if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE  &&
239         g_passwordManager.CheckSettingLevelLock(CSettings::Get().GetSetting("videoscreen.guicalibration")->GetLevel()))
240       return;
241     g_windowManager.ActivateWindow(WINDOW_SCREEN_CALIBRATION);
242   }
243   else if (setting.id == VIDEO_SETTINGS_MAKE_DEFAULT)
244   {
245     if (CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE &&
246         !g_passwordManager.CheckSettingLevelLock(::SettingLevelExpert))
247       return;
248
249     // prompt user if they are sure
250     if (CGUIDialogYesNo::ShowAndGetInput(12376, 750, 0, 12377))
251     { // reset the settings
252       CVideoDatabase db;
253       db.Open();
254       db.EraseVideoSettings();
255       db.Close();
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();
260     }
261   }
262   else if (setting.id == VIDEO_SETTINGS_DEINTERLACEMODE)
263   {
264     EnableSettings(VIDEO_SETTINGS_INTERLACEMETHOD, CMediaSettings::Get().GetCurrentVideoSettings().m_DeinterlaceMode != VS_DEINTERLACEMODE_OFF);
265   }
266
267   if (g_PVRManager.IsPlayingRadio() || g_PVRManager.IsPlayingTV())
268     g_PVRManager.TriggerSaveChannelSettings();
269 }
270
271 CStdString CGUIDialogVideoSettings::FormatInteger(float value, float minimum)
272 {
273   return StringUtils::Format("%i", MathUtils::round_int(value));
274 }
275
276 CStdString CGUIDialogVideoSettings::FormatFloat(float value, float minimum)
277 {
278   return StringUtils::Format("%2.2f", value);
279 }
280