Index: videooutbase.cpp
===================================================================
--- videooutbase.cpp	(revision 10012)
+++ videooutbase.cpp	(working copy)
@@ -184,7 +184,8 @@
     // Various state variables
     embedding(false),                   needrepaint(false),
     allowpreviewepg(true),              errored(false),
-    framesPlayed(0)
+    framesPlayed(0),
+    readsettings(false)
 {
     db_display_dim = QSize(gContext->GetNumSetting("DisplaySizeWidth",  0),
                            gContext->GetNumSetting("DisplaySizeHeight", 0));
@@ -198,6 +199,13 @@
     db_pip_location    = gContext->GetNumSetting("PIPLocation",        0);
     db_pip_size        = gContext->GetNumSetting("PIPSize",           26);
 
+    db_letterbox       = gContext->GetNumSetting("AspectOverride",     0);
+    db_deint_filtername= gContext->GetSetting("DeinterlaceFilter",
+                                              "linearblend");
+}
+
+void VideoOutput::ReadPictureSettings()
+{
     db_pict_attr[kPictureAttribute_Brightness] =
         gContext->GetNumSetting("PlaybackBrightness", 50);
     db_pict_attr[kPictureAttribute_Contrast] =
@@ -207,9 +215,7 @@
     db_pict_attr[kPictureAttribute_Hue] =
         gContext->GetNumSetting("PlaybackHue",         0);
 
-    db_letterbox       = gContext->GetNumSetting("AspectOverride",     0);
-    db_deint_filtername= gContext->GetSetting("DeinterlaceFilter",
-                                              "linearblend");
+    readsettings=true;
 }
 
 /**
@@ -960,8 +966,13 @@
     if (curVal < 0)
         return -1;
 
-    int newVal = curVal + (direction) ? +1 : -1;
+    int newVal = curVal;
 
+    if (direction)
+        newVal++;
+    else
+        newVal--;
+
     if (kPictureAttribute_Hue == attributeType)
         newVal = newVal % 100;
 
@@ -994,6 +1005,9 @@
 
 void VideoOutput::InitPictureAttributes(void)
 {
+    if (!readsettings)
+        ReadPictureSettings();
+
     QMap<int,int>::const_iterator it = db_pict_attr.begin();
     for (; it != db_pict_attr.end(); ++it)
         SetPictureAttribute(it.key(), *it);
Index: videoout_xv.h
===================================================================
--- videoout_xv.h	(revision 10012)
+++ videoout_xv.h	(working copy)
@@ -56,6 +56,8 @@
     bool Init(int width, int height, float aspect, WId winid,
               int winx, int winy, int winw, int winh, WId embedid = 0);
 
+    void ReadPictureSettings();
+
     bool SetDeinterlacingEnabled(bool);
     bool SetupDeinterlace(bool interlaced, const QString& ovrf="");
     bool ApproveDeintFilter(const QString& filtername) const;
Index: videoout_xv.cpp
===================================================================
--- videoout_xv.cpp	(revision 10012)
+++ videoout_xv.cpp	(working copy)
@@ -160,6 +160,20 @@
         delete xvmc_tex;
 }
 
+void VideoOutputXv::ReadPictureSettings()
+{
+    db_pict_attr[kPictureAttribute_Brightness] =
+        gContext->GetNumSetting("PlaybackBrightness", 50);
+    db_pict_attr[kPictureAttribute_Contrast] =
+        gContext->GetNumSetting("PlaybackContrast",   50);
+    db_pict_attr[kPictureAttribute_Colour] =
+        gContext->GetNumSetting("PlaybackColour",     50);
+    db_pict_attr[kPictureAttribute_Hue] =
+        gContext->GetNumSetting("PlaybackHue",        xv_hue_base );
+
+    readsettings=true;
+}
+
 // this is documented in videooutbase.cpp
 void VideoOutputXv::Zoom(int direction)
 {
@@ -3016,7 +3030,6 @@
 int VideoOutputXv::SetPictureAttribute(int attribute, int newValue)
 {
     QString  attrName = QString::null;
-    int      valAdj   = 0;
 
     if (kPictureAttribute_Brightness == attribute)
         attrName = "XV_BRIGHTNESS";
@@ -3025,10 +3038,7 @@
     else if (kPictureAttribute_Colour == attribute)
         attrName = "XV_SATURATION";
     else if (kPictureAttribute_Hue == attribute)
-    {
         attrName = "XV_HUE";
-        valAdj   = xv_hue_base;
-    }
 
     if (attrName.isEmpty())
         return -1;
@@ -3056,9 +3066,10 @@
         int port_max = attributes[i].max_value;
         int range    = port_max - port_min;
 
-        int tmpval2 = (newValue + valAdj) % 100;
+        int tmpval2 = newValue % 100;
         int tmpval3 = (int) roundf(range * 0.01f * tmpval2);
         int value   = min(tmpval3 + port_min, port_max);
+
         value_set = true;
 
         X11L;
Index: videooutbase.h
===================================================================
--- videooutbase.h	(revision 10012)
+++ videooutbase.h	(working copy)
@@ -164,6 +164,8 @@
                       WId winid, int winx, int winy, int winw, 
                       int winh, WId embedid = 0);
 
+    virtual void ReadPictureSettings();
+
     virtual bool SetDeinterlacingEnabled(bool);
     virtual bool SetupDeinterlace(bool i, const QString& ovrf="");
     virtual bool NeedsDoubleFramerate(void) const;
@@ -401,6 +403,7 @@
     bool    allowpreviewepg;
     bool    errored;
     long long framesPlayed;
+    bool    readsettings;
 };
 
 #endif
