Index: configure
===================================================================
--- configure	(revision 12631)
+++ configure	(working copy)
@@ -127,6 +127,7 @@
   echo "  --disable-xvmc-opengl    disable nVidia XvMC OpenGL texture method"
   echo "  --xvmc-lib=LIB           XvMC library override (for crosscompiling)"
   #echo "  --disable-xvmc-vld       disable XvMC-VLD (VIA Epia MPEG accel.)"
+  echo "  --enable-opengl-video    enable opengl based video display "
   echo "  --enable-mac-accel       enable Mac OS X MPEG acceleration"
   echo "  --enable-opengl-vsync    enable OpenGL vsync method"
   echo "  --enable-directfb        enable DirectFB  (Linux non-X11 video)"
@@ -430,6 +431,7 @@
 xvmc_pro="no"
 xvmc_opengl="no"
 xvmc_lib=""
+opengl_video="no"
 dvdv="no"
 mac_corevideo="no"
 opengl_vsync="no"
@@ -1177,6 +1179,10 @@
   ;;
   --xvmc-lib=*) xvmc_lib="$optval"
   ;;
+  --enable-opengl-video) opengl_video="yes"
+  ;;
+  --disable-opengl-video) opengl_video="no"
+  ;;
   --enable-mac-accel) dvdv="yes"
   ;;
   --disable-mac-accel) dvdv="no"
@@ -2551,6 +2557,7 @@
 fi
 
 if ! has_library libGL ; then
+    opengl_video="no"
     xvmc_opengl="no"
     opengl_vsync="no"
 fi
@@ -2563,6 +2570,10 @@
     opengl="yes"
 fi
 
+if test x"$opengl_video" = x"yes" ; then
+    opengl="yes"
+fi
+
 if test x"$dvdv" = x"yes" ; then
     # Can only do Mac accel on Mac platform
     if test $targetos != Darwin; then
@@ -2739,6 +2750,7 @@
 if test "$VENDOR_XVMC_LIBS" != "" ; then
   echo "XvMC libs        $VENDOR_XVMC_LIBS"
 fi
+  echo "OpenGL video     $opengl_video"
   echo "Mac acceleration $dvdv"
   echo "OpenGL vsync     $opengl_vsync"
   echo "DirectFB         $direct_fb"
@@ -3496,6 +3508,10 @@
   fi
 fi
 
+if test x"$opengl_video" = x"yes"; then
+  CCONFIG="$CCONFIG using_opengl_video"
+fi
+
 if test x"$direct_fb" = x"yes" ; then
   CCONFIG="$CCONFIG using_directfb"
   echo "CONFIG_DIRECTFB_LIBS=$CONFIG_DIRECTFB_LIBS" >> $MYTH_CONFIG_MAK
Index: libs/libmythtv/NuppelVideoPlayer.cpp
===================================================================
--- libs/libmythtv/NuppelVideoPlayer.cpp	(revision 12631)
+++ libs/libmythtv/NuppelVideoPlayer.cpp	(working copy)
@@ -845,11 +845,6 @@
         return;
 
     bool interlaced = scan == kScan_Interlaced || kScan_Intr2ndField == scan;
-    if (interlaced)
-    {
-        m_scan = scan;
-        return;
-    }
 
     if (interlaced)
     {
Index: libs/libmythtv/libmythtv.pro
===================================================================
--- libs/libmythtv/libmythtv.pro	(revision 12631)
+++ libs/libmythtv/libmythtv.pro	(working copy)
@@ -302,6 +302,10 @@
     using_xvmc_opengl:DEFINES += USING_XVMC_OPENGL
     using_opengl_vsync:DEFINES += USING_OPENGL_VSYNC
 
+    using_opengl_video:DEFINES += USING_OPENGL_VIDEO
+    using_opengl_video:HEADERS += videoout_opengl.h util-opengl.h
+    using_opengl_video:SOURCES += videoout_opengl.cpp util-opengl.cpp
+
     # Misc. frontend
     HEADERS += guidegrid.h              infostructs.h
     HEADERS += progfind.h               ttfont.h
Index: libs/libmythtv/frame.h
===================================================================
--- libs/libmythtv/frame.h	(revision 12631)
+++ libs/libmythtv/frame.h	(working copy)
@@ -18,7 +18,8 @@
     FMT_IA44,
     FMT_AI44,
     FMT_ARGB32,
-    FMT_YUV422P
+    FMT_YUV422P,
+    FMT_ALPHA
 } VideoFrameType;
 
 typedef struct VideoFrame_
Index: libs/libmythtv/videooutbase.cpp
===================================================================
--- libs/libmythtv/videooutbase.cpp	(revision 12631)
+++ libs/libmythtv/videooutbase.cpp	(working copy)
@@ -28,6 +28,10 @@
 #include "videoout_quartz.h"
 #endif
 
+#ifdef USING_OPENGL_VIDEO
+#include "videoout_opengl.h"
+#endif
+
 #include "videoout_null.h"
 
 #include "dithertable.h"
@@ -49,6 +53,11 @@
 {
     (void)type;
 
+#ifdef USING_OPENGL_VIDEO
+    if (gContext->GetNumSetting("UseOpenglVideo", false))
+        return new VideoOutputOpengl();
+#endif
+
 #ifdef USING_IVTV
     if (type == kVideoOutput_IVTV)
         return new VideoOutputIvtv();
@@ -379,7 +388,9 @@
 bool VideoOutput::NeedsDoubleFramerate() const
 {
     // Bob deinterlace requires doubling framerate
-    return (m_deintfiltername == "bobdeint" && m_deinterlacing);
+    return ((m_deintfiltername.contains("bobdeint") ||
+             m_deintfiltername.contains("progressive"))
+             && m_deinterlacing);
 }
 
 /**
Index: libs/libmythtv/videooutbase.h
===================================================================
--- libs/libmythtv/videooutbase.h	(revision 12631)
+++ libs/libmythtv/videooutbase.h	(working copy)
@@ -342,7 +342,7 @@
                      int keepprebuffer);
 
     virtual void ShowPip(VideoFrame *frame, NuppelVideoPlayer *pipplayer);
-    int DisplayOSD(VideoFrame *frame, OSD *osd, int stride = -1, int revision = -1);
+    virtual int DisplayOSD(VideoFrame *frame, OSD *osd, int stride = -1, int revision = -1);
 
     virtual void SetPictureAttributeDBValue(int attributeType, int newValue);
     virtual QRect GetVisibleOSDBounds(float&, float&) const;
@@ -355,7 +355,7 @@
 
     void ResizeVideo(VideoFrame *frame);
     void DoVideoResize(const QSize &inDim, const QSize &outDim);
-    void ShutdownVideoResize(void);
+    virtual void ShutdownVideoResize(void);
 
     void SetVideoAspectRatio(float aspect);
 
Index: libs/libmythtv/videodisplayprofile.cpp
===================================================================
--- libs/libmythtv/videodisplayprofile.cpp	(revision 12631)
+++ libs/libmythtv/videodisplayprofile.cpp	(working copy)
@@ -588,7 +588,20 @@
         return QObject::tr("Bob (2x framerate)");
     else if ("onefield" == short_name)
         return QObject::tr("One field");
-
+    else if ("opengllinearblend" == short_name)
+        return QObject::tr("Opengl Linear blend");
+    else if ("openglkerneldeint" == short_name)
+        return QObject::tr("Opengl Kernel");
+    else if ("openglbobdeint" == short_name)
+        return QObject::tr("Opengl Bob (2x framerate)");
+    else if ("openglonefield" == short_name)
+        return QObject::tr("Opengl One field");
+    else if ("openglprogressivelinearblend" == short_name)
+        return QObject::tr("Opengl Progressive (Linear blend)");
+    else if ("openglprogressiveonefield" == short_name)
+        return QObject::tr("Opengl Progressive (One Field)");
+    else if ("openglprogressivekerneldeint" == short_name)
+        return QObject::tr("Opengl Progressive (Kernel)");
     return "";
 }
 
@@ -931,6 +944,7 @@
 "xv-blit"
 "xvmc-blit"
 "xvmc-opengl"
+"opengl"
 "directfb"
 "directx"
 "quartz-blit"
@@ -966,6 +980,18 @@
     safe_custom += "directx";
     safe_custom += "quartz-blit";
     safe_custom += "xv-blit";
+#ifdef USING_OPENGL_VIDEO
+    safe_custom += "opengl";
+    safe_deint["opengl"] += "bobdeint";
+    safe_deint["opengl"] += "openglbobdeint";
+    safe_deint["opengl"] += "openglprogressivelinearblend";
+    safe_deint["opengl"] += "openglprogressiveonefield";
+    safe_deint["opengl"] += "openglprogressivekerneldeint";
+    safe_deint["opengl"] += "opengllinearblend";
+    safe_deint["opengl"] += "openglkerneldeint";
+    safe_deint["opengl"] += "openglonefield";
+    safe_osd["opengl"] += "opengl";
+#endif
 
     safe_list_t::const_iterator it;
     for (it = safe_custom.begin(); it != safe_custom.end(); ++it)
@@ -1012,6 +1038,9 @@
         safe_renderer[*it2] += "directx";
         safe_renderer[*it2] += "quartz-blit";
         safe_renderer[*it2] += "xv-blit";
+#ifdef USING_OPENGL_VIDEO
+        safe_renderer[*it2] += "opengl";
+#endif
     }
 
     safe_renderer["xvmc"]     += "xvmc-blit";
