Index: libs/libmythtv/osdtypes.cpp
===================================================================
--- libs/libmythtv/osdtypes.cpp	(revision 6887)
+++ libs/libmythtv/osdtypes.cpp	(working copy)
@@ -884,8 +884,8 @@
 
     m_isvalid = true;
 
-    int imwidth = (img.width() / 2) * 2;
-    int imheight = (img.height() / 2) * 2;
+    int imwidth = (img.width() + 1) & ~1;
+    int imheight = (img.height() + 1) & ~1;
 
     m_yuv = new unsigned char[imwidth * imheight * 3 / 2];
     m_ybuffer = m_yuv;
@@ -894,8 +894,8 @@
 
     m_alpha = new unsigned char[imwidth * imheight];
 
     rgb32_to_yuv420p(m_ybuffer, m_ubuffer, m_vbuffer, m_alpha, img.bits(),
-                     imwidth, imheight, img.width());
+                     img.width(), img.height(), img.bytesPerLine() / 4);
 
     m_imagesize = QRect(0, 0, imwidth, imheight);
 }
Index: libs/libmythtv/yuv2rgb.cpp
===================================================================
--- libs/libmythtv/yuv2rgb.cpp	(revision 6887)
+++ libs/libmythtv/yuv2rgb.cpp	(working copy)
@@ -488,11 +510,11 @@
 #define A_II  3
 #endif
 
-    wrap = width;
+    wrap = (width + 1) & ~1;
     wrap4 = srcwidth * 4;
     p = src;
-    for(y=0;y<height;y+=2) {
-        for(x=0;x<width;x+=2) {
+    for(y=0;y+1<height;y+=2) {
+        for(x=0;x+1<width;x+=2) {
             r = p[R_II];
             g = p[G_II];
             b = p[B_II];
@@ -550,10 +572,135 @@
             lum += -wrap + 2;
             alpha += -wrap + 2;
         }
-        p += wrap4;
+        if (width & 1) {
+            r = p[R_II];
+            g = p[G_II];
+            b = p[B_II];
+            r1 = r;
+            g1 = g;
+            b1 = b;
+            lum[0] = (FIX(0.29900) * r + FIX(0.58700) * g +
+                      FIX(0.11400) * b + ONE_HALF) >> SCALEBITS;
+            alpha[0] = p[A_II];
+
+            lum[1] = 16;
+            alpha[1] = 0;
+
+            p += wrap4;
+            lum += wrap;
+            alpha += wrap;
+
+            r = p[R_II];
+            g = p[G_II];
+            b = p[B_II];
+            r1 += r;
+            g1 += g;
+            b1 += b;
+            lum[0] = (FIX(0.29900) * r + FIX(0.58700) * g +
+                      FIX(0.11400) * b + ONE_HALF) >> SCALEBITS;
+            alpha[0] = p[A_II];
+
+            lum[1] = 16;
+            alpha[1] = 0;
+
+            cr[0] = ((- FIX(0.16874) * r1 - FIX(0.33126) * g1 +
+                    FIX(0.50000) * b1 + 2 * ONE_HALF - 1) >> (SCALEBITS + 1)) +
+                    128;
+            cb[0] = ((FIX(0.50000) * r1 - FIX(0.41869) * g1 -
+                    FIX(0.08131) * b1 + 2 * ONE_HALF - 1) >> (SCALEBITS + 1)) +
+                    128;
+
+            cb++;
+            cr++;
+            p += -wrap4 + 4;
+            lum += -wrap + 2;
+            alpha += -wrap + 2;
+        }
+        p += wrap4 * 2 - width * 4;
         lum += wrap;
         alpha += wrap;
     }
+    if (height & 1) {
+        for(x=0;x+1<width;x+=2) {
+            r = p[R_II];
+            g = p[G_II];
+            b = p[B_II];
+            r1 = r;
+            g1 = g;
+            b1 = b;
+            lum[0] = (FIX(0.29900) * r + FIX(0.58700) * g +
+                      FIX(0.11400) * b + ONE_HALF) >> SCALEBITS;
+            alpha[0] = p[A_II];
+
+            r = p[R_II+4];
+            g = p[G_II+4];
+            b = p[B_II+4];
+            r1 += r;
+            g1 += g;
+            b1 += b;
+            lum[1] = (FIX(0.29900) * r + FIX(0.58700) * g +
+                      FIX(0.11400) * b + ONE_HALF) >> SCALEBITS;
+            alpha[1] = p[A_II+4];
+
+            lum += wrap;
+            alpha += wrap;
+
+            lum[0] = 16;
+            alpha[0] = 0;
+
+            lum[1] = 16;
+            alpha[1] = 0;
+
+            cr[0] = ((- FIX(0.16874) * r1 - FIX(0.33126) * g1 +
+                    FIX(0.50000) * b1 + 2 * ONE_HALF - 1) >> (SCALEBITS + 1)) +
+                    128;
+            cb[0] = ((FIX(0.50000) * r1 - FIX(0.41869) * g1 -
+                    FIX(0.08131) * b1 + 2 * ONE_HALF - 1) >> (SCALEBITS + 1)) +
+                    128;
+
+            cb++;
+            cr++;
+            p += 2 * 4;
+            lum += -wrap + 2;
+            alpha += -wrap + 2;
+        }
+        if (width & 1) {
+            r = p[R_II];
+            g = p[G_II];
+            b = p[B_II];
+            r1 = r;
+            g1 = g;
+            b1 = b;
+            lum[0] = (FIX(0.29900) * r + FIX(0.58700) * g +
+                      FIX(0.11400) * b + ONE_HALF) >> SCALEBITS;
+            alpha[0] = p[A_II];
+
+            lum[1] = 16;
+            alpha[1] = 0;
+
+            lum += wrap;
+            alpha += wrap;
+
+            lum[0] = 16;
+            alpha[0] = 0;
+
+            lum[1] = 16;
+            alpha[1] = 0;
+
+            cr[0] = ((- FIX(0.16874) * r1 - FIX(0.33126) * g1 +
+                    FIX(0.50000) * b1 + ONE_HALF - 1) >> SCALEBITS) +
+                    128;
+            cb[0] = ((FIX(0.50000) * r1 - FIX(0.41869) * g1 -
+                    FIX(0.08131) * b1 + ONE_HALF - 1) >> SCALEBITS) +
+                    128;
+
+            cb++;
+            cr++;
+            p += 4;
+            lum += -wrap + 2;
+            alpha += -wrap + 2;
+       }
+    }
 }
 
 #ifdef HAVE_ALTIVEC
Index: libs/libmythtv/osd.cpp
===================================================================
--- libs/libmythtv/osd.cpp	(revision 6887)
+++ libs/libmythtv/osd.cpp	(working copy)
@@ -1814,8 +1814,8 @@
         if (*i && (*i)->Displaying())
         {
             QString name = (*i)->GetName();
-            if (name != "cc_page" && name != "menu" && name != other && 
-                (!oset || !oset->CanShowWith(name)))
+            if (name != "cc_page" && name != "menu" && name != "subtitles" &&
+                name != other && (!oset || !oset->CanShowWith(name)))
             {
                 (*i)->Hide();
                 result = true;
Index: libs/libavcodec/dvbsubdec.c
===================================================================
--- libs/libavcodec/dvbsubdec.c	(revision 6887)
+++ libs/libavcodec/dvbsubdec.c	(working copy)
@@ -1310,10 +1310,8 @@
 
     sub->num_rects = ctx->display_list_size;
     
-    if (sub->num_rects == 0)
-        return 0;
-    
-    sub->rects = av_mallocz(sizeof(AVSubtitleRect) * sub->num_rects);
+    if (sub->num_rects > 0)
+        sub->rects = av_mallocz(sizeof(AVSubtitleRect) * sub->num_rects);
 
     i = 0;
 
Index: libs/libmythtv/NuppelVideoPlayer.cpp
===================================================================
--- libs/libmythtv/NuppelVideoPlayer.cpp  (revision 6887)
+++ libs/libmythtv/NuppelVideoPlayer.cpp  (working copy)
@@ -4192,7 +4253,7 @@
                 {
                     for (int x = 0; x < rect->w; ++x) 
                     {
-                        const uint8_t color = rect->bitmap[y*rect->w + x];
+                        const uint8_t color = rect->bitmap[y*rect->linesize + x];
                         const uint32_t pixel = rect->rgba_palette[color];
                         qImage.setPixel(x, y, pixel);
                     }
